ZGlmZiAtLWdpdCBhL1Vib290L2Jvb3QvY29tbW9uL3NyYy91Ym9vdC9hcmNoL2FybS9saWIvTWFrZWZpbGUgYi9VYm9vdC9ib290L2NvbW1vbi9zcmMvdWJvb3QvYXJjaC9hcm0vbGliL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNTYyNWE2Li4wMDAwMDAwCi0tLSBhL1Vib290L2Jvb3QvY29tbW9uL3NyYy91Ym9vdC9hcmNoL2FybS9saWIvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jCi0jIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA2Ci0jIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCi0jCi0jIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCi0jIHByb2plY3QuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKLSMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCi0jIE1BIDAyMTExLTEzMDcgVVNBCi0jCi0KLWluY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5tawotCi1MSUIJPSAkKG9iailsaWIkKEFSQ0gpLm8KLUxJQkdDQwk9ICQob2JqKWxpYmdjYy5vCi0KLWlmbmRlZiBDT05GSUdfU1BMX0JVSUxECi1HTFNPQkpTCSs9IF9hc2hsZGkzLm8KLUdMU09CSlMJKz0gX2FzaHJkaTMubwotR0xTT0JKUwkrPSBfZGl2c2kzLm8KLUdMU09CSlMJKz0gX2xzaHJkaTMubwotR0xTT0JKUwkrPSBfbW9kc2kzLm8KLUdMU09CSlMJKz0gX3VkaXZzaTMubwotR0xTT0JKUwkrPSBfdW1vZHNpMy5vCi0KLUdMQ09CSlMJKz0gZGl2MC5vCi0KLUNPQkpTLXkJKz0gYm9hcmQubwotCi1DT0JKUy15CSs9IGJvb3RtLm8KLUNPQkpTLXkJKz0gY2FjaGUubwotQ09CSlMteQkrPSBjYWNoZS1jcDE1Lm8KLUNPQkpTLSQoQ09ORklHX1NZU19MMl9QTDMxMCkgKz0gY2FjaGUtcGwzMTAubwotQ09CSlMteQkrPSBpbnRlcnJ1cHRzLm8KLUNPQkpTLXkJKz0gcmVzZXQubwotU09CSlMtJChDT05GSUdfVVNFX0FSQ0hfTUVNU0VUKSArPSBtZW1zZXQubwotU09CSlMtJChDT05GSUdfVVNFX0FSQ0hfTUVNQ1BZKSArPSBtZW1jcHkubwotZW5kaWYKLSN4Zi5saUAyMDIzLjA0LjE0IG1vZGlmeSBmb3IgWlhXLTI1IHN0YXJ0Ci1MWU5RX0NPTkZJR19WRVJTSU9OID0gIlQxMDYtVy1WMi4wMS4wMS4wMlA1NlUwNi5BUC4xNS4wNV9DQVAuMTUuMDUiCi1DRkxBR1MgKz0gLURMWU5RX1ZFUlNJT049XCIkKExZTlFfQ09ORklHX1ZFUlNJT04pXCIKLUxZTlFfQ09ORklHX0NPTU1JVElEID0gImMzM2IxNzdjOGI4NjFlZTk1N2I2YzhiMGRlYTAwMzI3OGEzNjcxZDYiCi1DRkxBR1MgKz0gLURMWU5RX0NPTU1JVElEPVwiJChMWU5RX0NPTkZJR19DT01NSVRJRClcIgotI3hmLmxpQDIwMjMuMDQuMTQgbW9kaWZ5IGZvciBaWFctMjUgZW5kCi1TUkNTCTo9ICQoR0xTT0JKUzoubz0uUykgJChHTENPQkpTOi5vPS5jKSBcCi0JICAgJChTT0JKUy15Oi5vPS5TKSAkKENPQkpTLXk6Lm89LmMpCi1PQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTLXkpICQoQ09CSlMteSkpCi1MR09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoR0xTT0JKUykpIFwKLQkgICAkKGFkZHByZWZpeCAkKG9iaiksJChHTENPQkpTKSkKLQotIyBBbHdheXMgYnVpbGQgbGliYXJtLm8KLVRBUkdFVFMJOj0gJChMSUIpCi0KLSMgQnVpbGQgcHJpdmF0ZSBsaWJnY2Mgb25seSB3aGVuIGFza2VkIGZvcgotaWZkZWYgVVNFX1BSSVZBVEVfTElCR0NDCi1UQVJHRVRTCSs9ICQoTElCR0NDKQotZW5kaWYKLQotIyBGb3IgRUFCSSBjb25mb3JtYW50IHRvb2wgY2hhaW5zLCBwcm92aWRlIGVhYmlfY29tcGF0KCkKLWlmbmVxICgsJChmaW5kc3RyaW5nIC1tYWJpPWFhcGNzLWxpbnV4LCQoUExBVEZPUk1fQ1BQRkxBR1MpKSkKLVRBUkdFVFMJKz0gJChvYmopZWFiaV9jb21wYXQubwotZW5kaWYKLQotYWxsOgkkKFRBUkdFVFMpCi0KLSQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCi0JJChjYWxsIGNtZF9saW5rX29fdGFyZ2V0LCAkKE9CSlMpKQotCi0kKExJQkdDQyk6ICQob2JqKS5kZXBlbmQgJChMR09CSlMpCi0JJChjYWxsIGNtZF9saW5rX29fdGFyZ2V0LCAkKExHT0JKUykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0Ci1pbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKLQotc2luY2x1ZGUgJChvYmopLmRlcGVuZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9VYm9vdC9ib290L2NvbW1vbi9zcmMvdWJvb3QvZG93bmxvYWRlci9jbWRfY29tcGF0X3dyaXRlLmMgYi9VYm9vdC9ib290L2NvbW1vbi9zcmMvdWJvb3QvZG93bmxvYWRlci9jbWRfY29tcGF0X3dyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkNWUzMzkuLjAwMDAwMDAKLS0tIGEvVWJvb3QvYm9vdC9jb21tb24vc3JjL3Vib290L2Rvd25sb2FkZXIvY21kX2NvbXBhdF93cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYsIFpJWEMgQ29ycG9yYXRpb24uCi0gKgotICogRmlsZSBOYW1lOmNtZF9jb21wYXRfd3JpdGUuYwotICogRmlsZSBNYXJrOgotICogRGVzY3JpcHRpb246Ci0gKiBPdGhlcnM6Ci0gKiBWZXJzaW9uOiAgICAgICAxLjAKLSAqIEF1dGhvcjogICAgICAgIHphbmd4aWFvZmVuZwotICogRGF0ZTogICAgICAgICAgMjAxMy0zLTEzCi0gKiBIaXN0b3J5IDE6Ci0gKiAgICAgRGF0ZToKLSAqICAgICBWZXJzaW9uOgotICogICAgIEF1dGhvcjoKLSAqICAgICBNb2RpZmljYXRpb246Ci0gKiBIaXN0b3J5IDI6Ci0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBmaWxlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxjb21tb24uaD4KLSNpbmNsdWRlIDxjb21tYW5kLmg+Ci0jaW5jbHVkZSA8bmV0Lmg+Ci0jaW5jbHVkZSA8amZmczIvbG9hZF9rZXJuZWwuaD4KLSNpbmNsdWRlICJkb3dubG9hZGVyX2NvbmZpZy5oIgotI2luY2x1ZGUgImRvd25sb2FkZXJfbmFuZC5oIgotI2luY2x1ZGUgImRvd25sb2FkZXJfc2VyaWFsLmgiCi0jaW5jbHVkZSAiZXJybm8uaCIKLSNpbmNsdWRlIDxib290X21vZGUuaD4KLSNpbmNsdWRlICJwdWJfZmxhZ3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoJCQkJCQkJR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1UX0lNR19TSVpFIGltZ19zaXplW0lNR19OVU1dID0ge3sidWJvb3QiLDAsMH0seyJpbWFnZWZzIiwwLDB9LHsicm9vdGZzIiwwLDB9LHsiY2Fwcm9vdGZzIiwwLDB9LHsib2VtIiwwLDB9fTsKLWludCBmbGFnc19wYXJ0aXRvbl93cml0ZSA9IDA7Ci0KLWV4dGVybiBpbnQgZ19pZnR5cGU7Ci1leHRlcm4gcGFydGl0aW9uX3RhYmxlX3QgKiBnX3BhcnRpdGlvbl90YWJsZV9kbDsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbjpkb19jb21wYXRfd3JpdGUKLSAqIERlc2NyaXB0aW9uOgotICogUGFyYW1ldGVyczoKLSAqCSBJbnB1dDoKLSAqCi0gKgkgT3V0cHV0OgotICoKLSAqIFJldHVybnM6Ci0gKgotICoKLSAqIE90aGVyczoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSBpbnQgZG9fY29tcGF0X3dyaXRlKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKLXsKLSAgICBwYXJ0aXRpb25fZW50cnlfdCAqcGFydCA9IE5VTEw7Ci0gICAgY2hhciAqcGFyID0gTlVMTDsKLSAgICBjaGFyIGFja1s2NF09ezB9OwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwotCXVuc2lnbmVkIGludCBzaXplID0gMDsKLQl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgaSA9IDA7Ci0JZmxhZ3NfcGFydGl0b25fd3JpdGUgPSAxOwotCQotCWlmKGFyZ2M8NCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbWRfdXNhZ2UoY21kdHApOwotICAgIH0KLQotCXBhciA9IGFyZ3ZbMV07Ci0gICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClzaW1wbGVfc3RydG91bCAoYXJndlsyXSwgTlVMTCwgMTYpOwotCXNpemUgPSAodW5zaWduZWQgaW50KXNpbXBsZV9zdHJ0b3VsIChhcmd2WzNdLCBOVUxMLCAxNik7Ci0JcGFydCA9IGRvd25sb2FkZXJfZ2V0X3BhcnRfZGwocGFyKTsKLQlpZihwYXJ0ID09IE5VTEwpCi0JewotCQlzcHJpbnRmKGFjaywiRkFJTCBJTlZBTElEIFBBUlRJVElPTiBUWVBFIik7Ci0gICAgICAgIGRvd25sb2FkZXJfc2VyaWFsX3dyaXRlKGFjaywgc3RybGVuKGFjaykrMSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0KLQkvKnJlY29yZCBpbWFnZSBzaXplKi8KLQlmb3IoaT0wOyBpPElNR19OVU07IGkrKykKLQl7Ci0JCWlmKG1lbWNtcCgoY2hhciAqKWltZ19zaXplW2ldLm5hbWUgLCBwYXIsIHN0cmxlbihpbWdfc2l6ZVtpXS5uYW1lKSkgPT0gMCl7Ci0JCQlpZighbWVtY21wKHBhciwib2VtZGF0YSIsNykpCi0JCQkJYnJlYWs7Ci0JCQlpZihzdHJsZW4oaW1nX3NpemVbaV0ubmFtZSkgPT0gc3RybGVuKHBhcikpCi0JCQl7Ci0JCQkJaW1nX3NpemVbaV0uc2l6ZV9hID0gc2l6ZTsKLQkJCQlwcmludGYoInBhcnRpdGlvbiBpcyAlcyxzaXplX2EgaXMgMHgleC5cbiIscGFyLHNpemUpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWltZ19zaXplW2ldLnNpemVfYiA9IHNpemU7Ci0JCQkJcHJpbnRmKCJwYXJ0aXRpb24gaXMgJXMsc2l6ZV9iIGlzIDB4JXguXG4iLHBhcixzaXplKTsKLQkJCX0KLQkJfQotCX0gIAotCQotI2lmIGRlZmluZWQgKENPTkZJR19aWDI5NzUyMFYzRV9WRUhJQ0xFX0RDKSB8fCBkZWZpbmVkIChDT05GSUdfWlgyOTc1MjBWM0VfVkVISUNMRV9EQ19SRUYpCi0JaWYoZ19ub3JfZmxhZyA9PSAxKQotCXsKLSAgICAgICAgaWYobWVtY21wKHBhciwiemxvYWRlciIsNykgPT0gMCkKLQkJewotCQkJZ19pZnR5cGUgPSBJRl9UWVBFX05PUjsKLQkJCW5hbmRfaW5pdCgpOwotCQkJcmV0ID0gZG9fbm9yX3dyaXRlKHBhcnQsIHBhciwgb2Zmc2V0LHNpemUpOwkKLQkJCS8qx9C7u7P1yry7r3NwaV9uYW5kKi8KLQkJCWdfaWZ0eXBlID0gSUZfVFlQRV9TUElfTkFORDsKLQkJCW5hbmRfaW5pdCgpOwotCQkJZG93bmxvYWRlcl9uYW5kX2VyYXNlKHBhcnQscGFydC0+cGFydF9zaXplKTsKLQkJCW1lbWNweSgoY2hhciAqKShET1dOTE9BREVSX0JVRkZFUl9CQVNFKzB4ODAwMCksZ19wYXJ0aXRpb25fdGFibGVfZGwsNDA5Nik7Ci0JICAgICAgICByZXQgPSBkb3dubG9hZGVyX25hbmRfd3JpdGUocGFydCwgMCwgMHg5MDAwLCh1bnNpZ25lZCBjaGFyICopRE9XTkxPQURFUl9CVUZGRVJfQkFTRSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotI2VuZGlmCi0KLQlpZigocmVhZF9ib290X2ZsYXNodHlwZSgpID09IElGX1RZUEVfTk9SKSAKLQkJJiYgKHN0cmNtcCgoY29uc3QgY2hhciAqKXBhcnQtPnBhcnRfdHlwZSwibmFuZCIpID09IDApKQotCXsKLSAgICAgICAgcmV0ID0gZG9fbm9yX3dyaXRlKHBhcnQsIHBhciwgb2Zmc2V0LHNpemUpOwotCQlyZXR1cm4gcmV0OwotCX0KLSAgICAKLQlpZihzdHJjbXAoKGNvbnN0IGNoYXIgKilwYXJ0LT5wYXJ0X3R5cGUsIm5hbmQiKSA9PSAwKQotCXsKLQkgICAgcmV0ID0gZG9fbmFuZF93cml0ZShwYXJ0LCBwYXIsIG9mZnNldCwgc2l6ZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcCgoY29uc3QgY2hhciAqKXBhcnQtPnBhcnRfdHlwZSwiZnMiKSA9PSAwKQotCXsKLQkgICAgcmV0ID0gZG9feWFmZnNfd3JpdGUocGFydCwgcGFyLCBvZmZzZXQsIHNpemUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQllbHNlIGlmIChzdHJjbXAoKGNvbnN0IGNoYXIgKilwYXJ0LT5wYXJ0X3R5cGUsImRkciIpID09IDApCi0JewotCSAgICByZXQgPSBkb19yYW1fd3JpdGUob2Zmc2V0LCBzaXplKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKChjb25zdCBjaGFyICopcGFydC0+cGFydF90eXBlLCJyYXciKSA9PSAwKQotCXsKLQkgICAgcmV0ID0gZG9fcmF3X3dyaXRlKG9mZnNldCwgc2l6ZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWVsc2UKLQl7Ci0JICAgIHNwcmludGYoYWNrLCJGQUlMIElOVkFMSUQgUEFSVElUSU9OIFRZUEUiKTsKLSAgICAgICAgZG93bmxvYWRlcl9zZXJpYWxfd3JpdGUoYWNrLCBzdHJsZW4oYWNrKSsxKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLX0KLVVfQk9PVF9DTUQoCi0JY29tcGF0X3dyaXRlLCBDT05GSUdfU1lTX01BWEFSR1MsIDAsIGRvX2NvbXBhdF93cml0ZSwKLQkiZG93bmxvYWQ6IGNvbXBhdF93cml0ZSBbcGFydGl0aW9uXVtvZmZzZXRdW3NpemVdIiwKLQkiIgotKTsKLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9VYm9vdC9ib290L2NvbW1vbi9zcmMvdWJvb3QvaW5jbHVkZS9wYXJ0aXRpb25fdGFibGUuaCBiL1Vib290L2Jvb3QvY29tbW9uL3NyYy91Ym9vdC9pbmNsdWRlL3BhcnRpdGlvbl90YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDZhNjRjLi4wMDAwMDAwCi0tLSBhL1Vib290L2Jvb3QvY29tbW9uL3NyYy91Ym9vdC9pbmNsdWRlL3BhcnRpdGlvbl90YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qICAKLSAqIChDKSBDb3B5cmlnaHQgMjAxNiwgWklYQyBDb3Jwb3JhdGlvbi4KLSAqCi0gKiAgIHBhcnRpdGlvbnMuaAotICovCi0jaWZuZGVmIF9QQVJUSVRJT05fVEFCTEVfSF8KLSNkZWZpbmUgX1BBUlRJVElPTl9UQUJMRV9IXwotCi0KLQotLyoKLSAgICArLS0tLS0tLS0tLS0tLS0rCi0gICAgfCAgICAgbWFnaWMgICAgfCAgICB1aW50MzJfdAotICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgdmVyc2lvbiAgIHwgICAgdWludDMyX3QgICAgICAgICAxICAgICAgfCAgICB6LWxvYWQgICAgfAotICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgIGVudHJ5IG51bXMgIHwgICAgdWludDMyX3QgICAgICAgICAyICAgICAgfCAgICB1LWJvb3QgICAgfAotICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgIGNyYyAgICAgIHwgICAgdWludDMyX3QgICAgICAgICAzICAgICAgfCAgICAgICBtMCAgICAgfAotICAgICs9PT09PT09PT09PT09PSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgbmFtZVsxXSAgIHwgICAgICAgICAgICAgICAgICAgICA0ICAgICAgfCAgICAgbnZfciAgICAgfAotICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgb2Zmc2V0ICAgIHwgICAgICAgICAgICAgICAgICAgICA1ICAgICAgfCAgICAgbnZfdyAgICAgfAotICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgIHNpemUgICAgIHwgICAgICAgICAgICAgICAgICAgICA2ICAgICAgfCAgICAgIHBzICAgICAgfAotICAgICs9PT09PT09PT09PT09PSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICA3ICAgICAgfCAgICAgIHBoeSAgICAgfAotICAgICs9PT09PT09PT09PT09PSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKyAgICAgICAgCi0gICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIDggICAgICB8ICAgICAgenNwICAgICB8Ci0gICAgKz09PT09PT09PT09PT09KyAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgICAgICB8ICAgICBjZHJvbSAgICB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgfCAgICAgICBmcyAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSovCi0KLSNkZWZpbmUgVklSVFVBTF9QQVJUX05VTSAgICAgICAgMgotI2RlZmluZSBBUk1fUFNfSU1BR0UgICAgICAgICAgICAiY3B1cHMiCi0jZGVmaW5lIEFSTV9aU1BfSU1BR0UgICAgICAgICAgICJjcHVwaHkiCi0jZGVmaW5lIEFSTV9QSFlfSU1BR0UgICAgICAgICAgICJwcm9jLXBoeSIKLSNkZWZpbmUgQVJNX1pTUF9BTVRfSU1BR0UgICAgICAgImNwdXpzcGFtdCIgICAgLy9bWmhvdVhpbl0gQWRkIGZvciBBTVQuCi0jZGVmaW5lIEFSTV9BUFBfSU1BR0UgICAgICAgICAgICJjcHVhcCIvLyJwcm9jLWFwcCIgRlBHQQotI2RlZmluZSBBUk1fQ0FQX0lNQUdFICAgICAgICAgICAiY3B1Y2FwIgotCi0jZGVmaW5lIEFSTV9SQU1ESVNLX0lNQUdFICAgICAgICJyYW1kaXNrIiAKLSNkZWZpbmUgQVJNX1VTRVJEQVRBX0lNQUdFICAgICAgInVzZXJkYXRhIgotI2RlZmluZSBBUk1fUkVDT1ZFUllfVVNFUkRBVEFfSU1BR0UgICAgICAicmVjb3ZlcnkiCi0jZGVmaW5lIEFSTV9VQk9PVF9JTUFHRSAgICAgICAgICJ1Ym9vdCIKLS8vI2lmZGVmIENPTkZJR19aWDI5NzUyMFYzRV9NRExfQUIKLSNpZiBkZWZpbmVkKENPTkZJR19aWDI5NzUyMFYzRV9NRExfQUIpIHx8IGRlZmluZWQoQ09ORklHX1pYMjk3NTIwVjNFX1ZFSElDTEVfREMpIHx8IGRlZmluZWQoQ09ORklHX1pYMjk3NTIwVjNFX1ZFSElDTEVfRENfUkVGKQotI2RlZmluZSBBUk1fUk9PVEZTX0lNQUdFICAgICAgInJvb3RmcyIKLSNkZWZpbmUgQVJNX1JPT1RGUzJfSU1BR0UgICAgICAicm9vdGZzMiIKLSNlbmRpZgotCi0jZGVmaW5lIEFSTV9GT1RBX0JBQ0tVUF9JTUFHRSAgICJmb3RhYmFja3VwIgotI2RlZmluZSBBUk1fRk9UQV9GTEFHX0lNQUdFICAgICAiZm90YWZsYWciCi0jZGVmaW5lIEFSTV9GT1RBX1VQREFURV9JTUFHRSAgICJmb3RhdXBkYXRlIgotI2RlZmluZSBBUk1fRk9UQV9SRUNPVkVSWV9JTUFHRSAicmVjb3Zlcnkta2VybmVsIgotCi0jZGVmaW5lIEFSTV9OVlJXX1BBUlRJVElPTiAgICAgICJudnJ3IgotI2RlZmluZSBBUk1fQU1UX0ZMQUdfT0ZGU0VUICAgICAweDAKLQotLypudnJ3t9bH+GRydl9udnJ3IMbwyry12Na3ILrzw+a21NOmcGVyaXBoZXJhbCgzSykgxvDKvLXY1rejrCovCi0jZGVmaW5lIERSVl9OVlJXX0FERFJFU1MJKDB4MDAwMTIwMDApIC8vdjMgMHgzMjQwMCAsdjIgMHg2ODQwMAotI2RlZmluZSBBUk1fRFJWX1BFUklQSEVSQUxfT0ZGU0VUIChEUlZfTlZSV19BRERSRVNTKzI1NiszKjEwMjQrMyoxMDI0KzQqMTAyNCkgLypkcnZfbnZyd7fWx/hPRkZTRVQgMHgyOTAwKi8KLQotCi0jZGVmaW5lIEFSTV9GT1RBX0ZMQUcgICAgICAgICAgICJGT1RBLVVQREFURSIKLSNkZWZpbmUgQVJNX0xPQ0FMX1VQREFURV9GTEFHICAgIkxPQ0FMVVBEQVRFIgotI2RlZmluZSBBUk1fUkVDT1ZFUllfRkxBRyAgIAkiRk9UQS1SRUNPVkVSWSIKLSNkZWZpbmUgQVJNX0ZPVEFfQ09QWV9QU19GTEFHICAgIkZPVEEtUFMiICAgICAgLyqx7cq+0OjSqru51K1wc7Dmsb4qLwotI2RlZmluZSBBUk1fRk9UQV9GTEFHX0xFTiAgICAgICAzMgotCi0jZGVmaW5lIEFSTV9GT1RBX1VQREFURV9TVUNDRVNTX1NUUklORyAiTE9DQUwtVVAtU1VDQ0VTUyIKLSNkZWZpbmUgQVJNX0ZPVEFfVVBEQVRFX0ZBSUxFRF9TVFJJTkcgIkxPQ0FMLVVQLUZBSUwiCi0KLSNkZWZpbmUgQVJNX0dNQUNfSU5JVF9GTEFHICAgICAgIkdNQUMiCi0jZGVmaW5lIEFSTV9HTUFDX0lOSVRfRkxBR19MRU4gICAgICAgIDUKLSNkZWZpbmUgQVJNX0dNQUNfSU5JVF9PVkVSVElNRV9MRU4gICAgNAotCi0KLSNkZWZpbmUgQVJNX1JFQ09WRVJZX1JFU1RBUlRfT0ZGU0VUICAgMHg0MDAwMAotI2RlZmluZSBBUk1fUkVDT1ZFUllfUkVTVEFSVF9GTEFHICAgICAicmVjb3ZlcnkgcmVzZXQiIAotI2RlZmluZSBBUk1fTE9DQUxVUF9SRVNVTFRfT0ZGU0VUICAgICAweDgwMDAwCi0jZGVmaW5lIFNaXzEyOEsJCQkJMHgwMDAyMDAwMAotI2RlZmluZSBTWl8yNTZLCQkJCTB4MDAwNDAwMDAKLSNkZWZpbmUgU1pfNTEySwkJCQkweDAwMDgwMDAwCi0jZGVmaW5lIFNaXzFNCQkJCTB4MDAxMDAwMDAKLQotI2RlZmluZSBQQVJUX1RZUEVfTkFORCAgICAgICJiaW4iCi0jZGVmaW5lIFBBUlRfVFlQRV9aRlRMICAgICAgIm52IgotI2RlZmluZSBQQVJUX1RZUEVfRERSICAgICAgICJkZHIiCi0jZGVmaW5lIFBBUlRfVFlQRV9SQVcgICAgICAgInJhdyIKLSNkZWZpbmUgUEFSVF9UWVBFX0ZTICAgICAgICAiZnMiCi0KLSNkZWZpbmUgUEFSVDFfTkFNRSAgICAgICAgICAiemxvYWRlciIKLSNkZWZpbmUgUEFSVDFfT0ZGU0VUICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFBBUlQxX1NJWkUgICAgICAgICAgU1pfMTI4SwotI2RlZmluZSBQQVJUMV9UWVBFICAgICAgICAgIFBBUlRfVFlQRV9OQU5ECi0KLSNkZWZpbmUgUEFSVDJfTkFNRSAgICAgICAgICAidWJvb3QiCi0jZGVmaW5lIFBBUlQyX09GRlNFVCAgICAgICAgKFBBUlQxX09GRlNFVCArIFBBUlQxX1NJWkUpCi0jZGVmaW5lIFBBUlQyX1NJWkUgICAgICAgICAgKFNaXzFNICsgU1pfNTEySykKLSNkZWZpbmUgUEFSVDJfVFlQRSAgICAgICAgICBQQVJUX1RZUEVfTkFORAotCi0jZGVmaW5lIFBBUlQzX05BTUUgICAgICAgICAgInByb2MtbHAiCi0jZGVmaW5lIFBBUlQzX09GRlNFVCAgICAgICAgKFBBUlQyX09GRlNFVCArIFBBUlQyX1NJWkUpCi0jZGVmaW5lIFBBUlQzX1NJWkUgICAgICAgICAgKFNaXzEyOEsgKyBTWl8yNTZLKQotI2RlZmluZSBQQVJUM19UWVBFICAgICAgICAgIFBBUlRfVFlQRV9OQU5ECi0KLSNkZWZpbmUgUEFSVDRfTkFNRSAgICAgICAgICAibnZyIgotI2RlZmluZSBQQVJUNF9PRkZTRVQgICAgICAgIChQQVJUM19PRkZTRVQgKyBQQVJUM19TSVpFKQotI2RlZmluZSBQQVJUNF9TSVpFICAgICAgICAgIChTWl8xTSAqIDIpCi0jZGVmaW5lIFBBUlQ0X1RZUEUgICAgICAgICAgUEFSVF9UWVBFX1pGVEwKLQotI2RlZmluZSBQQVJUNV9OQU1FICAgICAgICAgICJudnJ3IgotI2RlZmluZSBQQVJUNV9PRkZTRVQgICAgICAgIChQQVJUNF9PRkZTRVQgKyBQQVJUNF9TSVpFKQotI2RlZmluZSBQQVJUNV9TSVpFICAgICAgICAgIChTWl8xTSAqIDgpCi0jZGVmaW5lIFBBUlQ1X1RZUEUgICAgICAgICAgUEFSVF9UWVBFX1pGVEwKLQotI2RlZmluZSBQQVJUNl9OQU1FICAgICAgICAgICJwcm9jLXBzIgotI2RlZmluZSBQQVJUNl9PRkZTRVQgICAgICAgIChQQVJUNV9PRkZTRVQgKyBQQVJUNV9TSVpFKQotI2RlZmluZSBQQVJUNl9TSVpFICAgICAgICAgIChTWl8xTSAqIDE5KQotI2RlZmluZSBQQVJUNl9UWVBFICAgICAgICAgIFBBUlRfVFlQRV9OQU5ECi0KLSNkZWZpbmUgUEFSVDdfTkFNRSAgICAgICAgICAicHJvYy1waHkiCi0jZGVmaW5lIFBBUlQ3X09GRlNFVCAgICAgICAgKFBBUlQ2X09GRlNFVCArIFBBUlQ2X1NJWkUpCi0jZGVmaW5lIFBBUlQ3X1NJWkUgICAgICAgICAgKFNaXzFNICogMTkpCi0jZGVmaW5lIFBBUlQ3X1RZUEUgICAgICAgICAgUEFSVF9UWVBFX05BTkQKLQotI2RlZmluZSBQQVJUOF9OQU1FICAgICAgICAgICJwcm9jLXpzcCIKLSNkZWZpbmUgUEFSVDhfT0ZGU0VUICAgICAgICAoUEFSVDdfT0ZGU0VUICsgUEFSVDdfU0laRSkKLSNkZWZpbmUgUEFSVDhfU0laRSAgICAgICAgICAoU1pfMU0gKiAxKQotI2RlZmluZSBQQVJUOF9UWVBFICAgICAgICAgIFBBUlRfVFlQRV9OQU5ECi0KLSNkZWZpbmUgUEFSVDlfTkFNRSAgICAgICAgICAicHJvYy1hcHAiCi0jZGVmaW5lIFBBUlQ5X09GRlNFVCAgICAgICAgKFBBUlQ4X09GRlNFVCArIFBBUlQ4X1NJWkUpCi0jZGVmaW5lIFBBUlQ5X1NJWkUgICAgICAgICAgKFNaXzFNICogMTApCi0jZGVmaW5lIFBBUlQ5X1RZUEUgICAgICAgICAgUEFSVF9UWVBFX05BTkQKLQotI2RlZmluZSBQQVJUMTBfTkFNRSAgICAgICAgICAicmFtZGlzayIKLSNkZWZpbmUgUEFSVDEwX09GRlNFVCAgICAgICAgKFBBUlQ5X09GRlNFVCArIFBBUlQ5X1NJWkUpCi0jZGVmaW5lIFBBUlQxMF9TSVpFICAgICAgICAgIChTWl8xTSAqIDgpCi0jZGVmaW5lIFBBUlQxMF9UWVBFICAgICAgICAgIFBBUlRfVFlQRV9OQU5ECi0KLSNkZWZpbmUgUEFSVDExX05BTUUgICAgICAgICAgImNkcm9tIgotI2RlZmluZSBQQVJUMTFfT0ZGU0VUICAgICAgICAoUEFSVDEwX09GRlNFVCArIFBBUlQxMF9TSVpFKQotI2RlZmluZSBQQVJUMTFfU0laRSAgICAgICAgICAoU1pfMU0gKiA4MCkKLSNkZWZpbmUgUEFSVDExX1RZUEUgICAgICAgICAgUEFSVF9UWVBFX05BTkQKLQotI2RlZmluZSBQQVJUMTJfTkFNRSAgICAgICAgICAiZnMtZmZ4IgotI2RlZmluZSBQQVJUMTJfT0ZGU0VUICAgICAgICAoUEFSVDExX09GRlNFVCArIFBBUlQxMV9TSVpFKQotI2RlZmluZSBQQVJUMTJfU0laRSAgICAgICAgICAoU1pfMU0gKiA4KQotI2RlZmluZSBQQVJUMTJfVFlQRSAgICAgICAgICBQQVJUX1RZUEVfRlMKLQotI2RlZmluZSBQQVJUMTNfTkFNRSAgICAgICAgICAidXNlcmRhdGEiCi0jZGVmaW5lIFBBUlQxM19PRkZTRVQgICAgICAgIChQQVJUMTJfT0ZGU0VUICsgUEFSVDEyX1NJWkUpCi0jZGVmaW5lIFBBUlQxM19TSVpFICAgICAgICAgIChTWl8xTSAqIDQwKQotI2RlZmluZSBQQVJUMTNfVFlQRSAgICAgICAgICBQQVJUX1RZUEVfRlMKLQotI2RlZmluZSBQQVJUMTRfTkFNRSAgICAgICAgICAiZGRyIgotI2RlZmluZSBQQVJUMTRfT0ZGU0VUICAgICAgICAweDAKLSNkZWZpbmUgUEFSVDE0X1NJWkUgICAgICAgICAgMHhmZmZmZmZmZgotI2RlZmluZSBQQVJUMTRfVFlQRSAgICAgICAgICBQQVJUX1RZUEVfRERSCi0KLSNkZWZpbmUgUEFSVDE1X05BTUUgICAgICAgICAgInJhdyIKLSNkZWZpbmUgUEFSVDE1X09GRlNFVCAgICAgICAgMHgwCi0jZGVmaW5lIFBBUlQxNV9TSVpFICAgICAgICAgIChTWl8xTSAqIDI1NikKLSNkZWZpbmUgUEFSVDE1X1RZUEUgICAgICAgICAgUEFSVF9UWVBFX1JBVwotCi0jZGVmaW5lICBQQVJUX0VORCAgICAwLDAsMAotI2RlZmluZSAgUEFSVDEgICAgICAgUEFSVDFfTkFNRSwgUEFSVDFfVFlQRSwgUEFSVDFfT0ZGU0VULCBQQVJUMV9TSVpFCi0jZGVmaW5lICBQQVJUMiAgICAgICBQQVJUMl9OQU1FLCBQQVJUMl9UWVBFLCBQQVJUMl9PRkZTRVQsIFBBUlQyX1NJWkUKLSNkZWZpbmUgIFBBUlQzICAgICAgIFBBUlQzX05BTUUsIFBBUlQzX1RZUEUsIFBBUlQzX09GRlNFVCwgUEFSVDNfU0laRQotI2RlZmluZSAgUEFSVDQgICAgICAgUEFSVDRfTkFNRSwgUEFSVDRfVFlQRSwgUEFSVDRfT0ZGU0VULCBQQVJUNF9TSVpFCi0jZGVmaW5lICBQQVJUNSAgICAgICBQQVJUNV9OQU1FLCBQQVJUNV9UWVBFLCBQQVJUNV9PRkZTRVQsIFBBUlQ1X1NJWkUKLSNkZWZpbmUgIFBBUlQ2ICAgICAgIFBBUlQ2X05BTUUsIFBBUlQ2X1RZUEUsIFBBUlQ2X09GRlNFVCwgUEFSVDZfU0laRQotI2RlZmluZSAgUEFSVDcgICAgICAgUEFSVDdfTkFNRSwgUEFSVDdfVFlQRSwgUEFSVDdfT0ZGU0VULCBQQVJUN19TSVpFCi0jZGVmaW5lICBQQVJUOCAgICAgICBQQVJUOF9OQU1FLCBQQVJUOF9UWVBFLCBQQVJUOF9PRkZTRVQsIFBBUlQ4X1NJWkUgIAotI2RlZmluZSAgUEFSVDkgICAgICAgUEFSVDlfTkFNRSwgUEFSVDlfVFlQRSwgUEFSVDlfT0ZGU0VULCBQQVJUOV9TSVpFIAotI2RlZmluZSAgUEFSVDEwICAgICAgUEFSVDEwX05BTUUsIFBBUlQxMF9UWVBFLCBQQVJUMTBfT0ZGU0VULCBQQVJUMTBfU0laRQotI2RlZmluZSAgUEFSVDExICAgICAgUEFSVDExX05BTUUsIFBBUlQxMV9UWVBFLCBQQVJUMTFfT0ZGU0VULCBQQVJUMTFfU0laRQotI2RlZmluZSAgUEFSVDEyICAgICAgUEFSVDEyX05BTUUsIFBBUlQxMl9UWVBFLCBQQVJUMTJfT0ZGU0VULCBQQVJUMTJfU0laRQotI2RlZmluZSAgUEFSVDEzICAgICAgUEFSVDEzX05BTUUsIFBBUlQxM19UWVBFLCBQQVJUMTNfT0ZGU0VULCBQQVJUMTNfU0laRQotI2RlZmluZSAgUEFSVDE0ICAgICAgUEFSVDE0X05BTUUsIFBBUlQxNF9UWVBFLCBQQVJUMTRfT0ZGU0VULCBQQVJUMTRfU0laRQotI2RlZmluZSAgUEFSVDE1ICAgICAgUEFSVDE1X05BTUUsIFBBUlQxNV9UWVBFLCBQQVJUMTVfT0ZGU0VULCBQQVJUMTVfU0laRQotI2RlZmluZSAgUEFSVDE2ICAgICAgUEFSVF9FTkQKLSNkZWZpbmUgIFBBUlQxNyAgICAgIFBBUlRfRU5ECi0jZGVmaW5lICBQQVJUMTggICAgICBQQVJUX0VORAotI2RlZmluZSAgUEFSVDE5ICAgICAgUEFSVF9FTkQKLSNkZWZpbmUgIFBBUlQyMCAgICAgIFBBUlRfRU5ECi0jZGVmaW5lICBQQVJUMjEgICAgICBQQVJUX0VORAotI2RlZmluZSAgUEFSVDIyICAgICAgUEFSVF9FTkQKLSNkZWZpbmUgIFBBUlQyMyAgICAgIFBBUlRfRU5ECi0jZGVmaW5lICBQQVJUMjQgICAgICBQQVJUX0VORAotI2RlZmluZSAgUEFSVDI1ICAgICAgUEFSVF9FTkQKLSNkZWZpbmUgIFBBUlQyNiAgICAgIFBBUlRfRU5ECi0jZGVmaW5lICBQQVJUMjcgICAgICBQQVJUX0VORAotI2RlZmluZSAgUEFSVDI4ICAgICAgUEFSVF9FTkQKLSNkZWZpbmUgIFBBUlQyOSAgICAgIFBBUlRfRU5ECi0jZGVmaW5lICBQQVJUMzAgICAgICBQQVJUX0VORAotCi0KLQotI2RlZmluZSBNQVhfRU5UUllTICAgICAgICAgICAgICAgICAgMzAgICAgICAgICAgICAgICAgICAgICAKLSNkZWZpbmUgUEFSVElUSU9OX0VOVFJZUyAgICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgIC8qIMq1vMrKudPDtcS31sf4uPbK/SAqLwotI2RlZmluZSBQQVJUSVRJT05fTUFHSUMgICAgICAgICAgICAgMHgzMTU5NDg3NiAgICAgICAgICAgICAgLyogzayyvSBaLUxPQUQgKi8KLSNkZWZpbmUgUEFSVElUSU9OX1BMQVJUTkFOTUUgICAgICAgICJXRjc1MjAiCi0jZGVmaW5lIFBBUlRJVElPTl9WRVJTSU9OICAgICAgICAgICAweDAwMjAxMzA0ICAgICAgICAgICAgICAvKiAgKi8KLSNkZWZpbmUgUEFSVElUSU9OX0NSQyAgICAgICAgICAgICAgIDB4MTIzNDU2NzgKLSNkZWZpbmUgUEFSVElUSU9OX1NJWkUgICAgICAgICAgICAgIDBYMTAwMCAgICAgICAgICAgICAgICAgIC8qILfWx/ix7bXEtPPQoSAqLwotCi0jZGVmaW5lIElNR19OVU0gIDUKLQotdHlwZWRlZiBzdHJ1Y3QgcGFydGl0aW9uX2VudHJ5IHsKLSAgICB1bnNpZ25lZCBjaGFyCXBhcnRfbmFtZVsxNl07IAotICAgIHVuc2lnbmVkIGNoYXIgICBwYXJ0X3R5cGVbMTZdOwotICAgIHVuc2lnbmVkIGludCAgICBwYXJ0X29mZnNldDsgCi0gICAgdW5zaWduZWQgaW50ICAgIHBhcnRfc2l6ZTsgICAgICAgICAgICAKLX1wYXJ0aXRpb25fZW50cnlfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgcGFydGl0aW9uX3RhYmxlIHsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgbWFnaWM7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgIHBsYXRmb3JtX25hbWVbMTZdOwotICAgIHVuc2lnbmVkIGludCAgICAgICB2ZXJzaW9uOyAgICAgICAgICAgICAvKiC31sf4sOaxviAqLwotICAgIHVuc2lnbmVkIGludCAgICAgICBlbnRyeXM7ICAgICAgICAgICAgICAvKiDX3LXEt9bH+Lj2yv0gKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgICAgY3JjOwotICAgIHBhcnRpdGlvbl9lbnRyeV90ICB0YWJsZVtNQVhfRU5UUllTXTsgICAKLX1wYXJ0aXRpb25fdGFibGVfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaW1hZ2VfYmluX2hlYWRlciB7Ci0gICAgdW5zaWduZWQgY2hhciBmaWxlbmFtZVs2NF07ICAgICAgIC8vIM7EvP7D+yx0b3RhbCAxMjgKLSAgICB1bnNpZ25lZCBjaGFyIHBhcnRpdG9ubmFtZVsxNl07ICAgLy8gt9bH+MP7Ci0gICAgdW5zaWduZWQgY2hhciBwYXJ0aXRvbnR5cGVbMTZdOyAgIC8vILfWx/jA4NDNCi0gICAgdW5zaWduZWQgaW50IGZpbGVsZW5ndGg7ICAgICAgICAvLyDOxLz+s6S2yAotICAgIHVuc2lnbmVkIGludCBwYXJ0aXRvbm9mZnNldDsgICAgLy8g1Nq31sf41tC1xLXY1rcKLSAgICB1bnNpZ25lZCBpbnQgZmlsZWFkZHI7ICAgICAgICAgIC8vzsS8/tTaus+zyc7EvP7W0LXEzrvWwwotICAgIHVuc2lnbmVkIGNoYXIgYnRVc2VbMjBdOyAgIAotfWltYWdlX2Jpbl9oZWFkZXJfdDsKLXR5cGVkZWYgc3RydWN0IG1hc3Rlcl9oZWFkZXIKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGJ0RmlsZUlkWzE2XTsgICAgICAgICAgLy8gtuBCaW66z9K7zsS8/rHqyrYsdG90YWwgMjA4Ynl0ZXMKLSAgICB1bnNpZ25lZCBjaGFyIGJ0VmVyc2lvbkluWzMyXTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ0VmVyc2lvbk91dFszMl07Ci0gICAgdW5zaWduZWQgaW50IGR3RmlsZU51bWJlcjsKLSAgICB1bnNpZ25lZCBpbnQgZHdEZXZpY2VUeXBlOwotICAgIHVuc2lnbmVkIGludCBkd05WOwotCi0gICAgdW5zaWduZWQgaW50IGR3RmlsZUxlbmd0aFRvdGFsOyAgICAvLyDOxLz+19yzpLbICi0gICAgdW5zaWduZWQgaW50IGR3Q2hlY2tTdW07ICAgICAgICAgICAvLyDQo9HpCi0gICAgdW5zaWduZWQgaW50IGR3SW1hZ2VPZmZzZXQ7ICAgICAgICAvLyC+tc/xyv2+3dTatuBCaW66z9K7zsS8/tbQxqvSxgotICAgIHVuc2lnbmVkIGludCBkd1RMb2FkZXJBZGQ7ICAgICAgICAgLy8gVExvYWRlctTatuBCaW66z9K7zsS8/tbQtcTGq9LGCi0gICAgdW5zaWduZWQgaW50IGR3VExvYWRlckxlbmd0aDsgICAgICAvLyBUTG9hZGVys6S2yAotICAgIHVuc2lnbmVkIGludCBkd1RCb290QWRkOyAgICAgICAgICAgLy8gVEJvb3TU2rbgQmluus/Su87EvP7W0LXExqvSxgotICAgIHVuc2lnbmVkIGludCBkd1RCb290TGVuZ3RoOyAgICAgICAgLy8gVEJvb3SzpLbICi0gICAgdW5zaWduZWQgaW50IGR3UGFydGl0b25BZGQ7ICAgICAgICAvLyBQYXJ0aXRvbtTatuBCaW66z9K7zsS8/tbQtcTGq9LGCi0gICAgdW5zaWduZWQgaW50IGR3UGFydGl0aW9uTGVuZ3RoIDsgICAvLyBQYXJ0aXRpb26zpLbICi0gICAgdW5zaWduZWQgY2hhciBidFVzZVs4MF07Ci0KLQlpbWFnZV9iaW5faGVhZGVyX3QgaW1hZ2VbNTBdOyAKLX0gbWFzdGVyX2hlYWRlcl90OwotCi0jZGVmaW5lIEZMQUdTX1BBUlRJVElPTl9FUlJPUiAgICAgICAgICAoMHgxMTExKSAvKrfWx/jS7LOjKi8KLQotI2lmIDAKLSNpZiBkZWZpbmVkKENPTkZJR19aWDI5NzUyMFYzRV9NRExfQUIpIHx8IGRlZmluZWQoQ09ORklHX1pYMjk3NTIwVjNFX1ZFSElDTEVfREMpCi0vKgotZmxhZ3MgcGFydGl0aW9uCi0KLSovCi0vKsurz7XNs8Dg0M0qLwotI2RlZmluZSBGTEFHU19CT09UX0ZPVEFfT0ZGU0VUICAgICAgKDBYMFVMKQotI2RlZmluZSBGTEFHU19CT09UX0ZPVEFfU0laRSAgICAgICAgKDBYODAwMDBVTCkKLSNkZWZpbmUgRkxBR1NfQk9PVF9FTlZfT0ZGU0VUICAgICAgIChGTEFHU19CT09UX0ZPVEFfT0ZGU0VUICsgRkxBR1NfQk9PVF9GT1RBX1NJWkUpCi0jZGVmaW5lIEZMQUdTX0JPT1RfRU5WX1NJWkUgICAgICAgICAoMFg4MDAwMFVMKQotI2RlZmluZSBGTEFHU19CQUNLVVBfT0ZGU0VUICAgICAgICAgKEZMQUdTX0JPT1RfRU5WX09GRlNFVCArIEZMQUdTX0JPT1RfRU5WX1NJWkUpCi0KLSNkZWZpbmUgRkxBR1NfTUFHSUMgICAgICAgICAgICAgICAgICAoMFg0NjRDNDE0N1VMKQotCi0jZGVmaW5lIERVQUxTWVNURU1fU1RBVFVTX0JPT1RBQkxFICAgICAoMFhCMEFCKSAvKr/JxvS2ryovCi0jZGVmaW5lIERVQUxTWVNURU1fU1RBVFVTX1NVQ0NFU1NGVUwgICAoMFg1Q0NGKSAvKsTcs8m5psb0tq8qLwotI2RlZmluZSBEVUFMU1lTVEVNX1NUQVRVU19VTkJPT1RBQkxFICAgKDBYQkFCRSkgLyqyu7/JxvS2ryovCi0jZGVmaW5lIEZMQUdTX1BBUlRJVElPTl9FUlJPUiAgICAgICAgICAoMHgxMTExKSAvKrfWx/jS7LOjKi8KLQotCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgLypib290YWJsZS9zdWNjZXNzZnVsL3VuYm9vdGFibGUqLwotCWludCB0cnlfY250OwotfVRfRHVhbFN5c3RlbV9TdGF0dXM7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIERVQUxfU1lTVEVNICA9IDBYODc1QSwgIC8qtdrSu7j2z7XNsyovCi0JRFVBTF9TWVNURU0yID0gMFg5ODZCLCAgLyq12rb+uPbPtc2zKi8KLX1UX0JPT1RfVEFSR0VUOwotCi0vKsurz7XNs8Dg0M0qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgRFVBTFNZU1RFTV9SRUNPVkVSWSA9IDBYNzU3NSwgICAgLypub3JtYWwtcmVjb3ZlcnnLq8+1zbMqLwotCURVQUxTWVNURU1fQUEgICAgICAgPSAwWEFBQUEsICAgIC8qQUHLq8+1zbMqLwotCURVQUxTWVNURU1fQUIgICAgICAgPSAwWEFCQUIgICAgIC8qQULLq8+1zbMqLwotfVRfQk9PVF9EVUFMU1lTVEVNX1RZUEU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgbWFnaWM7ICAgICAgIC8qyv2+3dPQ0KfQ1MSnyvXX1iovCi0JVF9CT09UX1RBUkdFVCAgICAgICAgYm9vdF90bzsgICAgIC8qtbHHsMb0tq/Ptc2zserWviovCi0JdWludDMyX3QgICAgICAgICAgICAgZm90YV9zdGF0dXM7IC8qZm90Yde0zKwqLwotCVRfRHVhbFN5c3RlbV9TdGF0dXMgIHN5c3RlbTsgICAgICAvKrXa0ru49s+1zbPXtMysKi8KLQlUX0R1YWxTeXN0ZW1fU3RhdHVzICBzeXN0ZW0yOyAgICAgLyq12rb+uPbPtc2z17TMrCovCi19VF9CT09UX0ZPVEFfRkxBRzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgbWFnaWM7ICAgICAgICAvKsr9vt3T0NCn0NTEp8r119YqLwotCVRfQk9PVF9EVUFMU1lTVEVNX1RZUEUgICBkdWFsc3lzX3R5cGU7IC8qy6vPtc2zwODQzSovCi0JY2hhciBzeXN0ZW1fYm9vdF9lbnZbMTI4XTsKLQljaGFyIHN5c3RlbTJfYm9vdF9lbnZbMTI4XTsKLX1UX0JPT1RfRU5WOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIFRfQk9PVF9GT1RBX0ZMQUcgICAgICBib290X2ZsYWc7Ci0JVF9CT09UX0VOViAgICAgICAgICAgIGJvb3RfZW52OwotfVRfRk9UQV9GTEFHX0lORk87Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQ1JFQVRfUEFSVElUSU9OX1RBQkxFCi1wYXJ0aXRpb25fdGFibGVfdCBnX3BhcnRpdG9uX3RhYmxlID0gCi0gICAgewotICAgICAgICBQQVJUSVRJT05fTUFHSUMsIFwKLSAgICAgICAgUEFSVElUSU9OX1BMQVJUTkFOTUUsXAotICAgICAgICBQQVJUSVRJT05fVkVSU0lPTixcCi0gICAgICAgIFBBUlRJVElPTl9FTlRSWVMsIFwKLSAgICAgICAgUEFSVElUSU9OX0NSQyxcCi0gICAgICAgIHsgICB7IFBBUlQxIH0sXAotICAgICAgICAgICAgeyBQQVJUMiB9LFwKLSAgICAgICAgICAgIHsgUEFSVDMgfSxcCi0gICAgICAgICAgICB7IFBBUlQ0IH0sXAotICAgICAgICAgICAgeyBQQVJUNSB9LFwKLSAgICAgICAgICAgIHsgUEFSVDYgfSxcCi0gICAgICAgICAgICB7IFBBUlQ3IH0sXAotICAgICAgICAgICAgeyBQQVJUOCB9LFwKLSAgICAgICAgICAgIHsgUEFSVDkgfSxcCi0gICAgICAgICAgICB7IFBBUlQxMCB9LFwKLSAgICAgICAgICAgIHsgUEFSVDExIH0sXAotICAgICAgICAgICAgeyBQQVJUMTIgfSxcCi0gICAgICAgICAgICB7IFBBUlQxMyB9LFwKLSAgICAgICAgICAgIHsgUEFSVDE0IH0sXAotICAgICAgICAgICAgeyBQQVJUMTUgfSxcCi0gICAgICAgICAgICB7IFBBUlQxNiB9LFwKLSAgICAgICAgICAgIHsgUEFSVDE3IH0sXAotICAgICAgICAgICAgeyBQQVJUMTggfSxcCi0gICAgICAgICAgICB7IFBBUlQxOSB9LFwKLSAgICAgICAgICAgIHsgUEFSVDIwIH0sXAotICAgICAgICAgICAgeyBQQVJUMjEgfSxcCi0gICAgICAgICAgICB7IFBBUlQyMiB9LFwKLSAgICAgICAgICAgIHsgUEFSVDIzIH0sXAotICAgICAgICAgICAgeyBQQVJUMjQgfSxcCi0gICAgICAgICAgICB7IFBBUlQyNSB9LFwKLSAgICAgICAgICAgIHsgUEFSVDI2IH0sXAotICAgICAgICAgICAgeyBQQVJUMjcgfSxcCi0gICAgICAgICAgICB7IFBBUlQyOCB9LFwKLSAgICAgICAgICAgIHsgUEFSVDI5IH0sXAotICAgICAgICAgICAgeyBQQVJUMzAgfX0KLSAgICB9OwotI2VuZGlmCi0KLSNpZm5kZWYgQ1JFQVRfUEFSVElUSU9OX1RBQkxFCi1pbnQgcmVhZF9wYXJ0aXRpb25fYW5kX2NoZWNrKCB2b2lkICk7Ci1wYXJ0aXRpb25fZW50cnlfdCAqZmluZF9wYXJ0aXRpb25fcGFyYSggdWNoYXIgKiBuYW1lICk7Ci12b2lkIGFkZF9wYXJ0aXRpb25fdG9fYm9vdGFyZ3Modm9pZCk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9QQVJUSVRJT05fVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL2RyaXZlci9pbmMvbWlzYy9kcnZzX3ZvaWNlcHJvY2Vzcy5oIGIvVWJvb3QvY3AvcHMvZHJpdmVyL2luYy9taXNjL2RydnNfdm9pY2Vwcm9jZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3Y2M4NGQuLjAwMDAwMDAKLS0tIGEvVWJvb3QvY3AvcHMvZHJpdmVyL2luYy9taXNjL2RydnNfdm9pY2Vwcm9jZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFpURSBDb3Jwb3JhdGlvbi4NCi0gKg0KLSAqIEZpbGUgTmFtZTogICAgRHJ2c192b2ljZXByb2Nlc3MuaA0KLSAqIEZpbGUgTWFyazoNCi0gKiBEZXNjcmlwdGlvbjogIFByb3ZpZGUgdGhlIGludGVyZmFjZSBvZiB1c2luZyB2cA0KLSAqIE90aGVyczoNCi0gKiBWZXJzaW9uOiAgICAgICBWMC41DQotICogQXV0aG9yOiAgICAgICAgbHZ3ZW5odWENCi0gKiBEYXRlOiAgICAgICAgICAyMDEyLTA2LTEzDQotICogSGlzdG9yeSAxOg0KLSAqICAgICBEYXRlOg0KLSAqICAgICBWZXJzaW9uOg0KLSAqICAgICBBdXRob3I6DQotICogICAgIE1vZGlmaWNhdGlvbjoNCi0gKiBIaXN0b3J5IDI6DQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZuZGVmIF9EUlZTX1ZQX0gNCi0jZGVmaW5lIF9EUlZTX1ZQX0gNCi0NCi0jaW5jbHVkZSAiZHJ2c19pMnMuaCINCi0jaW5jbHVkZSAiZHJ2c190ZG0uaCINCi0jaW5jbHVkZSAiZHJ2c192b2x0ZS5oIg0KLSNpbmNsdWRlICJkcnZzX3JwbXNnLmgiDQotI2luY2x1ZGUgIk52UGFyYW1fZHJ2LmgiDQotDQotI2RlZmluZSBWT0lDRV9UT05FX01JWEVSX0ZVTkNUSU9ODQotLy8jZGVmaW5lIFRFU1RfV0hJVEVfTk9JU0UNCi10eXBlZGVmIGVudW0NCi17DQotICAgIFZQX0kyU19JRExFID0gMCwNCi0gICAgVlBfSTJTX09QRU4sDQotICAgIFZQX0kyU19JTlVTRSwNCi0gICAgVlBfTE9PUF9PTg0KLX0gVF9WcF9JMnNTdGF0dXM7DQotDQotLyogIFZvaWNlIHByb2Nlc3MgY2hhbm5lbCBzZWxlY3Rpb24uICovDQotdHlwZWRlZiBlbnVtDQotew0KLSAgICBWUF9QQVRIX0hBTkRTRVQgICAgPSAwLA0KLSAgICBWUF9QQVRIX1NQRUFLRVIsDQotICAgIFZQX1BBVEhfSEVBRFNFVCwNCi0gICAgVlBfUEFUSF9CTFVFVE9PVEgsDQotICAgIFZQX1BBVEhfQkxVRVRPT1RIX05PX05SLA0KLSAgICBWUF9QQVRIX0hTQU5EU1BLLA0KLQ0KLSAgICBWUF9QQVRIX09GRiA9IDI1NSwNCi0NCi0gICAgTUFYX1ZQX1BBVEggPSBWUF9QQVRIX09GRg0KLX0gVF9aRHJ2X1ZwUGF0aDsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotICAgIFZQX1ZPTF8wICAgID0gMCwNCi0gICAgVlBfVk9MXzEsDQotICAgIFZQX1ZPTF8yLA0KLSAgICBWUF9WT0xfMywNCi0gICAgVlBfVk9MXzQsDQotICAgIFZQX1ZPTF81LA0KLSAgICBWUF9WT0xfNiwNCi0gICAgVlBfVk9MXzcsDQotICAgIFZQX1ZPTF84LA0KLSAgICBWUF9WT0xfOSwNCi0gICAgVlBfVk9MXzEwLA0KLSAgICBWUF9WT0xfMTEsDQotDQotICAgIE1BWF9WUF9WT0wNCi19IFRfWkRydl9WcFZvbDsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotICAgIFZQX0ZTXzgwMDAgID0gMCwgICAgICAgICAgICAgIC8vLzwgOGsgc2FtcGxpbmcgcmF0ZQ0KLSAgICBWUF9GU18xMTAyNSA9IDEsICAgICAgICAgICAgICAvLy88IDExLjAyNWsgc2FtcGxpbmcgcmF0ZQ0KLSAgICBWUF9GU18xMjAwMCA9IDIsICAgICAgICAgICAgICAvLy88IDEyayBzYW1wbGluZyByYXRlDQotICAgIFZQX0ZTXzE2MDAwID0gMywgICAgICAgICAgICAgIC8vLzwgMTZrIHNhbXBsaW5nIHJhdGUNCi0gICAgVlBfRlNfMjIwNTAgPSA0LCAgICAgICAgICAgICAgLy8vPCAyMi4wNTBrIHNhbXBsaW5nIHJhdGUNCi0gICAgVlBfRlNfMjQwMDAgPSA1LCAgICAgICAgICAgICAgLy8vPCAyNGsgc2FtcGxpbmcgcmF0ZQ0KLSAgICBWUF9GU18zMjAwMCA9IDYsICAgICAgICAgICAgICAvLy88IDMyayBzYW1wbGluZyByYXRlDQotICAgIFZQX0ZTXzQ0MTAwID0gNywgICAgICAgICAgICAgIC8vLzwgNDQuMWsgc2FtcGxpbmcgcmF0ZQ0KLSAgICBWUF9GU180ODAwMCA9IDgsICAgICAgICAgICAgICAvLy88IDQ4ayBzYW1wbGluZyByYXRlDQotICAgIE1BWF9WUF9GUyA9IDkgICAgICAgICAgICAgIC8vLzwgTWF4IHNhbXBsaW5nIHJhdGUgY291bnQNCi0NCi19IFRfWkRydl9WcEZzOw0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0gICAgVlBfRFRNRl9LRVlfMCAgICA9IDAsDQotICAgIFZQX0RUTUZfS0VZXzEsDQotICAgIFZQX0RUTUZfS0VZXzIsDQotICAgIFZQX0RUTUZfS0VZXzMsDQotICAgIFZQX0RUTUZfS0VZXzQsDQotICAgIFZQX0RUTUZfS0VZXzUsDQotICAgIFZQX0RUTUZfS0VZXzYsDQotICAgIFZQX0RUTUZfS0VZXzcsDQotICAgIFZQX0RUTUZfS0VZXzgsDQotICAgIFZQX0RUTUZfS0VZXzksDQotICAgIFZQX0RUTUZfS0VZXzEwLCAgICAvKiAgKiAgKi8NCi0gICAgVlBfRFRNRl9LRVlfMTEsICAgIC8qICAjICovDQotDQotICAgIE1BWF9WUF9EVE1GX0tFWQ0KLX0gVF9aRHJ2X1ZwRHRtZktleTsNCi0NCi0NCi0vL3R5cGVkZWYgICBUX1pEcnZWb2x0ZV9DZmcgIFRfWkRydlZwX0NmZw0KLXR5cGVkZWYgc3RydWN0DQotew0KLQljaGFyKiBwUHJlc2V0Ung7DQotCXVuc2lnbmVkIGxvbmcgUHJlc2V0TGVuZ3RoUng7DQotCWNoYXIqIHBQcmVzZXRUeDsNCi0JdW5zaWduZWQgbG9uZyBQcmVzZXRMZW5ndGhUeDsNCi19IHpEcnZWcF9OeHBQYXJhbXNUb29sOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLQljaGFyKiBwUHJlc2V0Ung7DQotCXVuc2lnbmVkIGxvbmcgUHJlc2V0TGVuZ3RoUng7DQotCWNoYXIqIHBQcmVzZXRUeDsNCi0JdW5zaWduZWQgbG9uZyBQcmVzZXRMZW5ndGhUeDsNCi19IHpEcnZWcF9QYXJhbXNUb29sOw0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0gICAgVlBfVk9JQ0VfU09VUkNFICwNCi0gICAgVlBfQVVESU9fU09VUkNFICwNCi0gICAgVlBfRk1fU09VUkNFICwNCi0gICAgVlBfRVhURVJOX0FVRElPLA0KLSAgICBWUF9TT1VSQ0VfTUFYDQotfSBUX1pEcnZWcF9Tb3VyY2VUeXBlOw0KLQ0KLS8qIDAgbG93cG93ZXI7MSBzbXM7MiBjYWxsIHN0YW5kYXJkOzMgYWxhcm0gYmVlcDsqLw0KLXR5cGVkZWYgZW51bQ0KLXsNCi0gICAgVlBfTE9XUE9XRVJfVE9ORSAsDQotICAgIFZQX1NNU19UT05FICwNCi0gICAgVlBfQ0FMTFNURF9UT05FICwNCi0gICAgVlBfQUxBUk1fVE9ORSwNCi0gICAgVlBfQ0FMTF9USU1FX1RPTkUsDQotICAgIFZQXzBfS0VZX1RPTkUsDQotICAgIFZQXzFfS0VZX1RPTkUsDQotICAgIFZQXzJfS0VZX1RPTkUsDQotICAgIFZQXzNfS0VZX1RPTkUsDQotICAgIFZQXzRfS0VZX1RPTkUsDQotICAgIFZQXzVfS0VZX1RPTkUsDQotICAgIFZQXzZfS0VZX1RPTkUsDQotICAgIFZQXzdfS0VZX1RPTkUsDQotICAgIFZQXzhfS0VZX1RPTkUsDQotICAgIFZQXzlfS0VZX1RPTkUsDQotICAgIFZQX0hBU0hfS0VZX1RPTkUsCSAgICAvLyMNCi0gICAgVlBfQVNURVJSSVhfS0VZX1RPTkUsCSAgICAvLyoNCi0gICAgVlBfUkVTRVJWRUQxX1RPTkUsDQotICAgIFZQX1JFU0VSVkVEMl9UT05FLA0KLSAgICBWUF9SRVNFUlZFRDNfVE9ORSwNCi0gICAgVlBfUkVTRVJWRUQ0X1RPTkUsDQotICAgIFZQX1JFU0VSVkVENV9UT05FLA0KLSAgICBWUF9SRVNFUlZFRDZfVE9ORSwNCi0gICAgVlBfVE9ORV9NQVgNCi19IFRfWkRydlZwX1RvbmVOdW07DQotdHlwZWRlZiBzdHJ1Y3QgX1RfSGFsTWl4ZXJUb25lSW5mbw0KLXsNCi0JQk9PTCBTdGFydE1peGVyOy8qbWl4ZXIgZmxhZyBUUlVFICBzdGFydCwgRkFMU0Ugc3RvcDsqLw0KLQlCT09MIGRhdGFJc1diOy8qIFRSVUUgIHdiLCBGQUxTRSBuYiwgZm9yIHZvaWNlIG1peGVyOyovDQotCVVJTlQzMiBjdXJfdG9uZV9mY291bnQ7Lyp0b25lIGRhdGEgYWxyZWFkeSBwcm9jZXNzZWQgY291bnQqLw0KLQlVSU5UMzIgdG9uZV90b3RhbF9zaXplOy8qdG9uZSBkYXRhIHRvdGFsIHNpemUsdW5pdCAyYnl0ZSovDQotCVVJTlQzMiBpbnRlcl9taXhlcl9mY291bnQ7LyppbnRlciAsdG9uZV9zaXplL2RhdGFfbWl4ZXJfb25jZXNpemUqLw0KLQlVSU5UMzIgcmVtX21peGVyX2NvdW50Oy8qcmVtYWluZGVyICwgIHRvbmVfc2l6ZSVkYXRhX21peGVyX29uY2VzaXplKi8NCi0JVUlOVDE2ICpwdGRhdGFfbWl4ZXI7LyogdG9uZSBkYXRhIGFycmF5IHBvaW50ZXIgKi8NCi0JVUlOVDMyIGRhdGFfbWl4ZXJfb25jZXNpemU7Lyp0aGUgc2l6ZSBvZiBhIGRhdGEgcHJvY2Vzc2luZywgdW5pdCAyYnl0ZSovDQotfSBUX0hhbE1peGVyVG9uZUluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3QgX1RfSGFsQXVkaW9Mb29wVGVzdEluZm8NCi17DQotCUJPT0wgc3RhcnRMb29wVGVzdDsvKmF1ZG8gbG9vcCB0ZXN0IGZsYWcgVFJVRSAgc3RhcnQsIEZBTFNFIHN0b3A7Ki8NCi0JVUlOVDMyIGZzOy8qdG9uZSBkYXRhIHJlYWwgZnJlcXVlbmNlKi8NCi0JVUlOVDMyIHNhbXBGczsvKnRvbmUgZGF0YSBzYW1wbGUgZnJlcXVlbmNlKi8NCi0JVUlOVDggKnB0ZGF0YTsvKiBhdWRvIGxvb3AgdGVzdCBkYXRhIGFycmF5IHBvaW50ZXIgKi8NCi0JVUlOVDMyIHRvdGFsU2l6ZTsvKnRvbmUgZGF0YSB0b3RhbCBzaXplLHVuaXQgMmJ5dGUqLw0KLQlUX1pEcnZfVnBWb2wgb3V0cGF0aHZvbFs0XTsNCi0NCi19IFRfSGFsQXVkaW9Mb29wVGVzdEluZm87DQotdHlwZWRlZiBzdHJ1Y3QgX1RfSGFsQXVkaW9Mb29wVGVzdFByYQ0KLXsNCi0JVUlOVDggKnNyYzsvKnRvbmUgZGF0YSBmcmVxdWVuY2UqLw0KLQlVSU5UOCAqZGVzdDsvKnRvbmUgZGF0YSBzYW1wbGUgZnJlcXVlbmNlKi8NCi0JVUlOVDMyIHNhbXBmczsNCi0NCi19IFRfSGFsQXVkaW9Mb29wVGVzdFByYTsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotICAgIEVDQUxMX1NUX0lOSVQgPSAwLA0KLQlFQ0FMTF9TVF9PUEVOLC8vMQkJCQkNCi0JRUNBTExfU1RfU1RBUlQsLy8yCQkJDQotICAgIEVDQUxMX1NUX0lETEUsLy8zCQ0KLSAgICBFQ0FMTF9TVF9SWF9JRExFLC8vNAkNCi0gICAgRUNBTExfU1RfVFhfSURMRSwvLzUJDQotICAgIEVDQUxMX1NUX0lOVVNFLC8vNgkNCi0gICAgRUNBTExfU1RfUlhfSU5VU0UsLy83CQ0KLSAgICBFQ0FMTF9TVF9UWF9JTlVTRSwvLzgJICAgICANCi0JRUNBTExfU1RfU1RPUCwvLzkJDQotCUVDQUxMX1NUX0NMT1NFLC8vMTAJCQ0KLSAgICBFQ0FMTF9TVF9NQVgNCi19IFRfRWNhbGxfU3RhdGU7DQotDQotIA0KLXR5cGVkZWYgc3RydWN0DQotew0KLQlUX0RydkVjYWxsX09wdAlvcHQ7DQotCVpPU1NfVElNRVJfSUQgdGltZXJJZCA7DQotCVpPU1NfU0VNQVBIT1JFX0lEIHdyU2VtYXBob3JlOyANCi0JWk9TU19TRU1BUEhPUkVfSUQgcmRTZW1hcGhvcmU7DQotCVRfRWNhbGxfU3RhdGUgZWNhbGxTdGE7DQotICAgIFRfRWNhbGxfU3RhdGUgZWNhbGxSeFN0YTsvL3R3byBzdGF0ZSxpZGxlL2ludXNlDQotCVRfRWNhbGxfU3RhdGUgZWNhbGxUeFN0YTsvL3R3byBzdGF0ZSxpZGxlL2ludXNlCQ0KLQl1bnNpZ25lZCBjaGFyKiByeERhdGFCdWY7DQotCXVuc2lnbmVkIGNoYXIqIHR4RGF0YUJ1ZjsNCi0JaW50IGRhdGFCdWZTaXplOw0KLQ0KLX0gVF9IYWxfRWNhbGxEYXRhOyANCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0JLy91c2UgZm9yIHZwIGRhdGEgcHJvY2Vzcw0KLQlVSU5UOCogcFZwVGVtcFJ4SW5CdWZmZXI7ICAgLy9wVnBSeEluQnVmZmVyDQotCVVJTlQ4KiBwVnBUZW1wVHhJbkJ1ZmZlcjsgICAvL3BWcFR4SW5CdWZmZXINCi0JVUlOVDgqIHBWcFRlbXBSeE91dFB1dEJ1ZmZlcjsvL3BWcFJ4T3V0UHV0QnVmZmVyDQotCVVJTlQ4KiBwVnBUZW1wVHhPdXRQdXRCdWZmZXI7Ly9wVnBUeE91dFB1dEJ1ZmZlcg0KLQ0KLQlUX1pEcnZJMlNfQ2ZnICpwVnBJMnNDZmc7IC8vaTJzIGNmZw0KLQ0KLQlUX1pEcnZWcF9DZmcgdnBDZmdQYXJhbTsgLy9zX2NmZ1BhcmFtDQotDQotCVRfWkRydkkyc19QYXJhbXMgaTJzV3JpdGVQYXJhbTsgLy9zX1ZwSTJzV3JpdGVQYXJhbQ0KLQlUX1pEcnZJMnNfUGFyYW1zIGkyc1JlYWRQYXJhbTsgLy9zX3ZwSTJzUmVhZFBhcmFtDQotDQotCVVJTlQzMiBmcmFtZUNvdW50OyAvL3NfdnBGcmFtZUNvdW50DQotCVVJTlQzMiB0b3RhbEZyYW1lQnVmU2l6ZTsgLy9zX3ZwVG90YWxGcmFtZUJ1ZlNpemUNCi0JVUlOVDMyIGluT3V0QnVmVXNlU2l6ZTsgLy9zX2luT3V0QnVmVXNlU2l6ZQ0KLQlVSU5UMzIgcnhTYXZlTGVuOyAvL3NfcnhTYXZlTGVuDQotCVVJTlQzMiB0eFNhdmVMZW47IC8vc190eFNhdmVMZW4NCi0JVUlOVDMyIHNhdmVMZW47IC8vc2F2ZV9sZW4NCi0NCi0JVUlOVDggcGNtU2xvdE51bTsgLy9zX3ZwUGNtU2xvdE51bQ0KLQlVSU5UOCBwY21XYlNlY0RhdGFQb3NpdGlvbjsgLy9zX3ZwUGNtV2JTZWNEYXRhUG9zaXRpb24NCi0NCi0JVUlOVDggdm9sdGVWcFdyaXRlU3RvcEZsYWc7Ly9zX3ZvbHRlVnBXcml0ZVN0b3BGbGFnDQotCVVJTlQ4IHZvbHRlVnBSZWFkU3RvcEZsYWc7Ly9zX3ZvbHRlVnBSZWFkU3RvcEZsYWcNCi0JVUlOVDggdm9sdGVWcENmZ0VuRmxhZzsgLy8gc192b2x0ZVZwQ2ZnRW5GbGFnDQotCUJPT0wgZmlyc3RXcml0ZURhdGFGbGFnOy8vc19maXJzdFdyaXRlRGF0YUZsYWcNCi0JQk9PTCBmaXJzdFJlYWREYXRhRmxhZzsvL3NfZmlyc3RSZWFkRGF0YUZsYWcNCi0JQk9PTCBpMnNJc1JzdEZsYWc7Ly9zX2kyc0lzUnN0RmxhZw0KLX0gVF96RHJ2VnBfU3BlZWNoU3RhdGU7IC8vIFRfekRydlZwX1NwZWVjaFN0YXRlDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotCVVJTlQ4IHZvbHRlSXNXYjsgLy8xIGdfdm9sdGVJc1diIA0KLQlVSU5UOCBpc1VzZVNsaWNDb2RlYzsgLy8yIGdfaXNVc2VTbGljQ29kZWMgDQotCVVJTlQ4IGdfaXNVc2VUZG07IC8vMw0KLS8vZm9yIHZvaWNlIGRhdGEgcHJvY2Vzcw0KLQlVSU5UOCB2b2ljZUluR3NtVGRNb2RlOyAvLzQgZ192b2ljZUluR3NtVGRNb2RlIA0KLQlVSU5UOCB2b2ljZUluVm9sdGVNb2RlOyAvLzUgZ192b2ljZUluVm9sdGVNb2RlIA0KLQ0KLQlCT09MIGlubmVySTJzSXNNYXN0ZXI7Ly82IGFybSBpMnMyICAgZ19pbm5lckkyc0lzTWFzdGVyIA0KLQlCT09MIGlubmVySTJzSXNJMnNNb2RlOyAvLzcgZ19pbm5lckkyc0lzSTJzTW9kZSANCi0JQk9PTCB2cExvb3BSdW5pbmc7IC8vOCBnX3ZwTG9vcFJ1bmluZyANCi0JQk9PTCBtdXRlRW47IC8vOSBnX3ZwTXV0ZUVuIA0KLQkvL0JPT0wgbnhwSXNOb3JtYWw7IC8vMTAgZ192cE54cElzTm9ybWFsICANCi0JQk9PTCB2UHJvY0lzTm9ybWFsOyAvLzExIHZvaWNlIHByb2Nlc3NpbmcgaXMgbm9ybWFsIGZsYWcgDQotCVRfVnBfSTJzU3RhdHVzIHZwSTJzU3RhdHVzOyAvLzEyIFZwSTJzU3RhdHVzIA0KLQ0KLQlUX1pEcnZfVnBQYXRoICB2cFBhdGg7Ly8xMyBWUF9QQVRIX0hFQURTRVQ7Ly9WUF9QQVRIX1NQRUFLRVI7IC8vVlBfUEFUSF9IQU5EU0VUOyBnX3ZwUGF0aA0KLQlUX1pEcnZfVnBQYXRoICB2cExvb3BQYXRoOyAvLzE0IGdfdnBMb29wUGF0aCANCi0JVF9aRHJ2X1ZwVm9sIHZwVm9sOyAvLzE1IGdfdnBWb2wNCi0JVF9aRHJ2Vm9pY2VfTU9ERSB2b2ljZU1vZGU7IC8vMTYgZ192cFZvaWNlTW9kZQ0KLQlTSU5UOCB2cEluaXRHYWluOyAvLzE3IHNfdnBJbml0R2Fpbg0KLQlUX0F1ZGlvX052RmxhZwlhdWRpb19jdHJsRmxhZzsvLzE4IFVTRSAzMmJ5dGUNCi0NCi0gICAgVUlOVDggZHRtZkRpclNlbDsvLzE5DQotICAgIFVJTlQzMiBzYW1wbGVfcmF0ZTsvLzIwDQotICAgIFVJTlQ4IHVzZUR0bWZMb29wOy8vMjENCi0gICAgU0lOVDMyIG11dGVDb3VudDsvLzIyIG11dGVfY291bnQNCi0gICAgQk9PTCB2cExvb3BCa1J1bm5pbmc7Ly8yMyANCi0JQk9PTCByeE11dGVFbjsgLy8yNA0KLQlCT09MIGZpcnN0UmVnWkNBVEZsYWc7IC8vMjUNCi0JVF9IYWxfRWNhbGxEYXRhCWVjYWxsRGF0YTsvLzI2DQotICAgIFVJTlQ4IHZvaWNlX252X3VwZGF0ZTsvLzI3DQotfSBUX3pEcnZWb2ljZV9HYlZhcjsgLy9UX3pEcnZWb2ljZV9HYlZhcg0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLQkvL3VzZSBmb3Igc3RvcmUgbWVtb3J5IGFkZHJlc3MNCi0JVUlOVDgqIHBWcFJ4SW5CdWZmZXI7ICAvL3NfcFZwUnhJbkJ1ZmZlcg0KLQlVSU5UOCogcFZwVHhJbkJ1ZmZlcjsgLy9zX3BWcFR4SW5CdWZmZXINCi0JVUlOVDgqIHBWcFJ4T3V0UHV0QnVmZmVyOyAvL3NfcFZwUnhPdXRQdXRCdWZmZXINCi0JVUlOVDgqIHBWcFR4T3V0UHV0QnVmZmVyOyAvL3NfcFZwVHhPdXRQdXRCdWZmZXINCi0NCi0JVUlOVDMyIGluT3V0QnVmU2l6ZTsgLy9zX2luT3V0QnVmU2l6ZQ0KLQ0KLQlUX1pEcnZJMlNfQ2ZnICpwVnBJbm5lckkyc0NmZzsgIC8vc19wVnBJbm5lckkyc0NmZw0KLQlUX1pEcnZJMlNfQ2ZnICpwVnBFeHRJMnNDZmc7ICAgLy9zX3BWcEV4dEkyc0NmZw0KLQlUX1pEcnZJMlNfQ2ZnICpwVnBFeHRJMnNXYkNmZzsgLy9zX3BWcEV4dEkyc1diQ2ZnDQotCVRfWkRydlRkbV9DZmcgKnNfcFZwVGRtQ2ZnOw0KLQlUX1pEcnZUZG1fQ2ZnICpzX3BWcFRkbVdiQ2ZnOw0KLQlUX1pEcnZUZG1fQ2ZnICpwVnBUZG1DZmc7DQotDQotCVRfWkRydlJwTXNnX01zZyBwTXNnOw0KLQlTSU5UMzIgcE1zZ0J1ZlsyXTsNCi0JLy9TSU5UMzIgbXV0ZUNvdW50Oy8vbXV0ZV9jb3VudA0KLQ0KLQlaT1NTX1RIUkVBRF9JRCB2cFRocmVhZCA7IC8vc19WcFRocmVhZA0KLQlaT1NTX1RIUkVBRF9JRCByY3ZEdG1mVGhyZWFkIDsgLy9zX3JjdkR0bWZUaHJlYWQNCi0JWk9TU19TRU1BUEhPUkVfSUQgdnBTZW1hcGhvcmU7IC8vc19WcFNlbWFwaG9yZQ0KLQlaT1NTX1NFTUFQSE9SRV9JRCB2cFRocmVhZFF1aXRTZW1hOw0KLQ0KLQlaT1NTX1RIUkVBRF9JRCB2cExvb3BUaHJlYWQ7IC8vc19WcExvb3BUaHJlYWQNCi0JWk9TU19TRU1BUEhPUkVfSUQgdnBMb29wU2VtYXBob3JlOyAvL3NfVnBMb29wU2VtYXBob3JlDQotDQotCVRfekRydlZwX1NwZWVjaFN0YXRlICp2cFN0YXRlOw0KLS8vCVRfekRydlZvaWNlX0diVmFyIHdyYXBWcEdiVmFyOw0KLX0gVF96RHJ2VnBfU3RhdGU7IC8vVF96RHJ2VnBfU3RhdGUNCi0NCi1TSU5UMzIgekRydlZwX1NldFBhdGgoVF9aRHJ2X1ZwUGF0aCBwYXRoKTsNCi1TSU5UMzIgekRydlZwX1NldFZvbChUX1pEcnZfVnBWb2wgdm9sdW1lKTsNCi1TSU5UMzIgekRydlZwX1NldEdhaW4oU0lOVDMyIHZnYWluLCBVSU5UMzIgY2hhbm5lbCk7DQotLyogMCBsb3dwb3dlcjsxIHNtczsyIGNhbGwgc3RhbmRhcmQ7MyBhbGFybSBiZWVwOyovDQotU0lOVDMyIHpEcnZWcF9Ub25lTWl4ZXJTdGFydChUX1pEcnZWcF9Ub25lTnVtIHRvbmVOdW0pOw0KLVNJTlQzMiB6RHJ2VnBfU2V0TXV0ZShVSU5UMzIgZW5hYmxlLCBVSU5UMzIgY2hhbm5lbCk7DQotU0lOVDMyIHpEcnZWcF9SY2RPbk9mZihVSU5UMzIgb24pOw0KLVNJTlQzMiB6RHJ2VnBfRHRtZlRvbmUoVUlOVDMyIE51bSk7DQotU0lOVDMyIHpEcnZWcF9Mb29wKFRfWkRydl9WcFBhdGggcGF0aCk7DQotU0lOVDMyIHpEcnZWcF9SaW5nU3RhcnQoVk9JRCk7DQotU0lOVDMyIHpEcnZWcF9SaW5nU3RvcChWT0lEKTsNCi1WT0lEIHpEcnZWcF9TZXRVc2VTbGljRmxhZyhCT09MIHVzZVNsaWMpOw0KLVNJTlQzMiB6RHJ2VnBfTnhwU2V0UGFyYW0oekRydlZwX054cFBhcmFtc1Rvb2wgKk54cFBhcmFtc1Rvb2wpOw0KLVNJTlQzMiB6RHJ2VnBfTnhwR2V0UGFyYW0oekRydlZwX054cFBhcmFtc1Rvb2wgKk54cFBhcmFtc1Rvb2wpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0Rm1QYXRoKFRfWkRydl9WcFBhdGggcGF0aCwgQk9PTCBlbmFibGUpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0UGFyYW0oekRydlZwX1BhcmFtc1Rvb2wgKnBhcmFtc1Rvb2wpOw0KLVNJTlQzMiB6RHJ2VnBfR2V0UGFyYW0oekRydlZwX1BhcmFtc1Rvb2wgKnBhcmFtc1Rvb2wpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0TnZQYXJhbSh6RHJ2VnBfUGFyYW1zVG9vbCAqcGFyYW1zVG9vbCk7DQotU0lOVDMyIHpEcnZWcF9HZXROdlBhcmFtKHpEcnZWcF9QYXJhbXNUb29sICpwYXJhbXNUb29sKTsNCi0NCi0JDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS9hdWRpb19jb25maWcvYXVkaW9SZWZfY2ZnLmMgYi9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL2F1ZGlvX2NvbmZpZy9hdWRpb1JlZl9jZmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzQ4OWQ1Mi4uMDAwMDAwMAotLS0gYS9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL2F1ZGlvX2NvbmZpZy9hdWRpb1JlZl9jZmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcsIFpURSBDb3Jwb3JhdGlvbi4NCi0gKg0KLSAqIEZpbGUgTmFtZTphdWRpb1JlZl9jZmcuYw0KLSAqIEZpbGUgTWFyazoNCi0gKiBEZXNjcmlwdGlvbjogTG9vcCB2b2ljZSBkYXRhIGZyb20gdGVhayB0byBhcm0uDQotICAgICAgICAgICAgICAgICAgICBTZXR0aW5nczogYXJtIGlpczItPnRvcCBpaXMxKGNvbm5lY3QgdG8gYXApLCBhcm0gaWlzMSBsb29wIHRvIHRlYWsgYWZlLg0KLQ0KLSAqIE90aGVyczoNCi0gKiBWZXJzaW9uOg0KLSAqIEF1dGhvcjogICAgICAgIHh4cQ0KLSAqIERhdGU6ICAgICAgICAgIDIwMTQtMDMtMTANCi0gKiBIaXN0b3J5IDE6DQotICogICAgIERhdGU6DQotICogICAgIFZlcnNpb246DQotICogICAgIEF1dGhvcjoNCi0gKiAgICAgTW9kaWZpY2F0aW9uOg0KLSAqIEhpc3RvcnkgMjoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgZmlsZXMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+DQotI2luY2x1ZGUgImRydnNfZ2VuZXJhbC5oIg0KLSNpbmNsdWRlICJkcnZzX2kycy5oIg0KLSNpbmNsdWRlICJkcnZzX3ZvaWNlcHJvY2Vzcy5oIg0KLSNpbmNsdWRlICJkcnZzX3ZvaWNlX2NvbmZpZy5oIg0KLSNpbmNsdWRlICJkcnZzX2kyYy5oIg0KLSNpbmNsdWRlICJOdlBhcmFtX2Rydi5oIg0KLSNpbmNsdWRlICJkcnZzX2NvZGVjLmgiDQotI2luY2x1ZGUgImF1ZF9kcnYuaCIgICAgICAgICAgIC8qIGhlYWRlciBmaWxlIGZvciB0aGlzIGZpbGUgKi8NCi0jaW5jbHVkZSAiaGFsX3BjbWRhdGEuaCINCi0vLyNpbmNsdWRlICJtYXRoLmgiDQotI2luY2x1ZGUgImRydnNfcmVmX2NmZy5oIg0KLSNpbmNsdWRlICJkcnZzX3RkbS5oIg0KLQ0KLSNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgTWFjcm9zDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vL0RlZmluZXMgZm9yIHNldHRpbmdzDQotI2RlZmluZSBBVURfSTJTX1N3aXRjaF9JbnRlcmZhY2Vfb2ZmIDANCi0jZGVmaW5lIEFVRF9JMlNfU3dpdGNoX01NU19tb2RlICAgICAgMQ0KLSNkZWZpbmUgQVVEX0kyU19Td2l0Y2hfTU1TX0ZCX21vZGUgIDINCi0jZGVmaW5lIEFVRF9JMlNfU3dpdGNoX2V4dGVybmFsX21vZGUgMw0KLSNkZWZpbmUgQVVEX0kyU19Td2l0Y2hfREFJX21vZGUgICAgICA0DQotDQotI2RlZmluZSBBVURfSTJTX0NTRUxfVFhDTEtTRUxfRlJPTV9GcmFjdGlvbmFsX2RldmlkZXJfMF9NQVNURVIgMA0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX1RYQ0xLU0VMX0ZST01fQ0xLMF9XQTBfU0xBVkUgMg0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX1RYQ0xLU0VMX0ZST01fQ0xLMV9XQTFfU0xBVkUgMQ0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX1RYQ0xLU0VMX0ZST01fRnJhY3Rpb25hbF9kZXZpZGVyXzFfTUFTVEVSIDMNCi0jZGVmaW5lIEFVRF9JMlNfQ1NFTF9UWENMS1NFTF9CaXRtYXNrIDB4RkZGQw0KLQ0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX0NMSzBTRUxfRnJhY3Rpb25hbF9kZXZpZGVyXzAgMA0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX0NMSzBTRUxfRnJhY3Rpb25hbF9kZXZpZGVyXzEgMTw8Mg0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX0NMSzBTRUxfZXh0ZXJuYWwgMjw8Mg0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX0NMSzBTRUxfQml0bWFzayAweEZGRjMNCi0NCi0jZGVmaW5lIEFVRF9JMlNfQ1NFTF9SWENMS1NFTF9GUk9NX0ZyYWN0aW9uYWxfZGV2aWRlcl8xX01BU1RFUiAwDQotI2RlZmluZSBBVURfSTJTX0NTRUxfUlhDTEtTRUxfRlJPTV9DTEswX1dBMF9TTEFWRSAxPDw0DQotI2RlZmluZSBBVURfSTJTX0NTRUxfUlhDTEtTRUxfRlJPTV9DTEsxX1dBMV9TTEFWRSAyPDw0DQotI2RlZmluZSBBVURfSTJTX0NTRUxfUlhDTEtTRUxfRlJPTV9GcmFjdGlvbmFsX2RldmlkZXJfMF9NQVNURVIgMzw8NA0KLSNkZWZpbmUgQVVEX0kyU19DU0VMX1JYQ0xLU0VMX0JpdG1hc2sgMHhGRkNGDQotDQotI2RlZmluZSBBVURfSTJTX0NTRUxfQ0xLMVNFTF9GcmFjdGlvbmFsX2RldmlkZXJfMCAwDQotI2RlZmluZSBBVURfSTJTX0NTRUxfQ0xLMVNFTF9GcmFjdGlvbmFsX2RldmlkZXJfMSAxPDw2DQotI2RlZmluZSBBVURfSTJTX0NTRUxfQ0xLMVNFTF9leHRlcm5hbCAyPDw2DQotI2RlZmluZSBBVURfSTJTX0NTRUxfQ0xLMVNFTF9CaXRtYXNrIDB4RkYzRg0KLQ0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1dJRFRIXzE2IDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9XSURUSF8xOCA0PDw1DQotI2RlZmluZSBBVURfSTJTX0NPTkZfV0lEVEhfMjAgNTw8NQ0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1dJRFRIXzI0IDY8PDUNCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9XSURUSF8zMiA3PDw1DQotDQotI2RlZmluZSBBVURfSTJTX0NPTkZfRURHRV9GQUxMSU5HICAgICAgICAgMA0KLSNkZWZpbmUgQVVEX0kyU19DT05GX0VER0VfUklTSU5HICAgICAgICAgIDENCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9FREdFX0JpdG1hc2sgICAgICAgICAxDQotI2RlZmluZSBBVURfSTJTX0NPTkZfREVMX05PX0RFTEFZICAgICAgICAgMA0KLSNkZWZpbmUgQVVEX0kyU19DT05GX0RFTF8xX2JpdF9ERUxBWSAgICAgIDE8PDENCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9QT0xfV0FfSElHSF9JU19SSUdIVCAwDQotI2RlZmluZSBBVURfSTJTX0NPTkZfUE9MX1dBX0hJR0hfSVNfTEVGVCAgMTw8Mg0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1BFUklPRF82NCAgICAgICAgICAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9QRVJJT0RfNDggICAgICAgICAgICAxPDwzDQotI2RlZmluZSBBVURfSTJTX0NPTkZfUEVSSU9EXzMyICAgICAgICAgICAgMjw8Mw0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1dJRFRIXzE2ICAgICAgICAgICAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9XSURUSF8xOCAgICAgICAgICAgICA0PDw1DQotI2RlZmluZSBBVURfSTJTX0NPTkZfV0lEVEhfMjAgICAgICAgICAgICAgNTw8NQ0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1dJRFRIXzI0ICAgICAgICAgICAgIDY8PDUNCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9XSURUSF8zMiAgICAgICAgICAgICA3PDw1DQotI2RlZmluZSBBVURfSTJTX0NPTkZfQUxJR05fTEVGVCAgICAgICAgICAgMA0KLSNkZWZpbmUgQVVEX0kyU19DT05GX0FMSUdOX1JJR0hUICAgICAgICAgIDE8PDgNCi0NCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9SWF9DTEsxX09VVF9JU19MT1cgICAwDQotI2RlZmluZSBBVURfSTJTX0NPTkZfUlhfQ0xLMV9PVVRfSVNfSElHSCAgMTw8MTMNCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9SWF9DTEsxX0NPTlRfU1RPUFMgICAwDQotI2RlZmluZSBBVURfSTJTX0NPTkZfUlhfQ0xLMV9DT05UX1JVTk5JTkcgMTw8MTQNCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9SWF9XQTFfTEVOXzFfQ1lDTEUgICAwDQotI2RlZmluZSBBVURfSTJTX0NPTkZfUlhfV0ExX0xFTl8yX0NZQ0xFICAgMTw8MTUNCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9SWF9XQXhfTEVOX0JpdG1hc2sgICAxPDwxNQ0KLQ0KLQ0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1RYX01VVEVfTF9BQ1RJVkUgICAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9UWF9NVVRFX0xfTVVURUQgICAgICAxPDwxMQ0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1RYX01VVEVfUl9BQ1RJVkUgICAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9UWF9NVVRFX1JfTVVURUQgICAgICAxPDwxMg0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1RYX0NMSzBfT1VUX0lTX0xPVyAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9UWF9DTEswX09VVF9JU19ISUdIICAxPDwxMw0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1RYX0NMSzBfQ09OVF9TVE9QUyAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9UWF9DTEswX0NPTlRfUlVOTklORyAxPDwxNA0KLSNkZWZpbmUgQVVEX0kyU19DT05GX1RYX1dBMF9MRU5fMV9DWUNMRSAgIDANCi0jZGVmaW5lIEFVRF9JMlNfQ09ORl9UWF9XQTBfTEVOXzJfQ1lDTEUgICAxPDwxNQ0KLSNkZWZpbmUgQVVEX0kyU19OVU1fRlJFRl9NT0RVTEVfQ0xPQ0sgICAgIDANCi0jZGVmaW5lIEFVRF9JMlNfTlVNX0ZSRUZfMTA0TUh6ICAgICAgICAgICAxPDwxMg0KLQ0KLSNkZWZpbmUgQVVEX0kyU19UUkFOU0ZFUl9NT0RFX1NURVJFTyAgICAwPDw5DQotI2RlZmluZSBBVURfSTJTX1RSQU5TRkVSX01PREVfUklHSFQgICAgICAgICAyPDw5DQotI2RlZmluZSBBVURfSTJTX1RSQU5TRkVSX01PREVfTEVGVCAgICAgICAzPDw5DQotDQotI2RlZmluZSBBVURfSTJTX0hXX01PREVfQlVSU1QgICAgICAgICAgMA0KLSNkZWZpbmUgQVVEX0kyU19IV19NT0RFX05PUk1BTCAgICAgICAxDQotDQotI2RlZmluZSBBVURfSTJTX0NIQU5ORUxfTU9ERV9NT05PICAgICAgICAgICAgIDAgIC8vIE1vbm8NCi0jZGVmaW5lIEFVRF9JMlNfQ0hBTk5FTF9NT0RFX0RVQUxNT05PTCAgIDEgLy8gIGxlZnQgY2hhbm5lbCBpcyB0YWtlbiBmcm9tIEkyUzEgaW50ZXJmYWNlIGFuZCBjb3BpZWQgdG8gYm90aCBMICYgUg0KLSNkZWZpbmUgQVVEX0kyU19DSEFOTkVMX01PREVfRFVBTE1PTk9SICAgMiAvLyAgUmlnaHQgY2hhbm5lbCBpcyB0YWtlbiBmcm9tIEkyUzEgaW50ZXJmYWNlIGFuZCBjb3BpZWQgdG8gYm90aCBMICYgUg0KLQ0KLS8vI2RlZmluZSBBUk1fSTJTX0xPT1BfQ0ZHCSooKHZvbGF0aWxlIFVJTlQzMiAqKSgweDAwMTQwMDAwKzB4NjApKQ0KLSNkZWZpbmUgQVJNX0kyU19MT09QX0NGRwkqKCh2b2xhdGlsZSBVSU5UMzIgKikoU09DX1NZU19SRUdfQkFTRSsweDYwKSkNCi0NCi0vLyNkZWZpbmUgQVVESU9fVVNFX0ZJWEVEX0FERFJFU1MNCi0NCi0jZGVmaW5lIFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSAweDMwMDAwICAvLyAweDYwMDAwDQotI2RlZmluZSBWUF9JTk9VVF9OT0JBS19CVUZTSVpFICA2NDANCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLQlVSU5UMTYgSTJTX21vZGVfZW51bTsNCi0JVUlOVDE2IGNzZWw7DQotCVVJTlQxNiBkZW4wOw0KLQlVSU5UMTYgZGVuMTsNCi0JVUlOVDE2IG51bTA7DQotCVVJTlQxNiBudW0xOw0KLQlVSU5UMTYgcnhjb25mOw0KLQlVSU5UMTYgdHhjb25mOw0KLQlVSU5UMTYgaHdtb2RlOw0KLQlVSU5UMTYgY2hhbm5lbF9tb2RlOw0KLQlhdWRfSTJTX3NhbXBsZXJhdGVfZW51bSBzYW1wbGU7DQotfSBhdWRfZHNwX2RhaV9jb25maWd1cmF0aW9uX3R5cGU7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotCURPVUJMRSBmcmVxVmFsdWU7DQotCURPVUJMRSBmcmVxQW1wOw0KLQ0KLX0gekRydlZwX0ZyZXFmZnQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmZGVmIF9DT05GSUdfRENfVVNFX0NPREVDLy9kdWFsX2NvcmUgdmVyc2lvbg0KLVVJTlQzMiBhdWRpb0dwaW9Db2RlY0VuSGFuZGxlID0gMDsNCi1VSU5UMzIgYXVkaW9HcGlvUmVzZXRIYW5kbGUgPSAwOw0KLVVJTlQzMiBhdWRpb0dwaW9DbGtIYW5kbGUgPSAwOw0KLVVJTlQzMiBhdWRpb0dwaW83NkhhbmRsZSA9IDA7DQotVUlOVDMyIGF1ZGlvR3Bpbzc3SGFuZGxlID0gMDsNCi0jZW5kaWYNCi0NCi0jaWYgZGVmaW5lZChfVVNFX1JFRl9BVURJT19PTl83NTIwVjNfTURMKSB8fCBkZWZpbmVkKF9VU0VfUkVGX0FVRElPX09OXzc1MjBWM19GV1ApDQotI2RlZmluZSBBT05fV0lGSV9CVF9DTEtfQ0ZHMiAgICAgICAqKCh2b2xhdGlsZSBVSU5UMzIgKikoMHgwMDEzYjAwMCArIDB4OTQpKQ0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBBVURJT19VU0VfRklYRURfQUREUkVTUw0KLVRfWkRydl9WcEluT3V0QnVmZmVyIHZwSW5PdXRCdWZmZXIgPQ0KLXsNCi0JKFVJTlQ4ICopKFpYX0REUl9DQU1FUkFWT0lDRV9CQVNFKSwNCi0JKFVJTlQ4ICopKFpYX0REUl9DQU1FUkFWT0lDRV9CQVNFICsgMHg2MDAwMCksDQotCShVSU5UOCAqKShaWF9ERFJfQ0FNRVJBVk9JQ0VfQkFTRSArIDB4QzAwMDApLA0KLQkoVUlOVDggKikoWlhfRERSX0NBTUVSQVZPSUNFX0JBU0UgKyAweDEyMDAwMCkNCi19Ow0KLSNlbHNlDQotVF9aRHJ2X1ZwSW5PdXRCdWZmZXIgdnBJbk91dEJ1ZmZlciA9DQotew0KLQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMDQotfTsNCi0jZW5kaWYNCi0NCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfT3BlbihUX1pEcnZWcF9Tb3VyY2VUeXBlIHNyY3R5cGUpOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19DbG9zZShWT0lEKTsNCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfRW5hYmxlKFZPSUQpOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19EaXNhYmxlKFZPSUQpOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19TZXRGcyhUX1pEcnZfVnBGcyBmcyk7DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldElucHV0UGF0aChUX1pEcnZfVnBQYXRoIHBhdGgsIEJPT0wgZW5hYmxlKTsNCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0UGF0aChUX1pEcnZfVnBQYXRoIHBhdGgsIEJPT0wgZW5hYmxlKTsNCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0TXV0ZShUX1pEcnZfVnBQYXRoIHBhdGgsIEJPT0wgbXV0ZSk7DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldEZtUGF0aChUX1pEcnZfVnBQYXRoIHBhdGgsIEJPT0wgZW5hYmxlKTsNCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0TG9vcGJhY2soQk9PTCBlbmFibGUpOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19TZXRJbnB1dFZvbChUX1pEcnZfVnBWb2wgdm9sKTsNCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0Vm9sKFRfWkRydl9WcFZvbCB2b2wpOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19TZXRVc2VQcm90b2NvbChUX1pEcnZDb2RlY19Vc2VQcm90b2NvbCB1c2VQcm90b2NvbCk7DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0dldE1peGVyVG9uZUluZm8oVF9aRHJ2VnBfVG9uZU51bSB0b25lTnVtLCBUX0hhbE1peGVyVG9uZUluZm8gKm1peGVyVG9uZUluZm8pOw0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19HZXRBdWRpb0xvb3BJbmZvKFRfSGFsQXVkaW9Mb29wVGVzdEluZm8gKmF1ZGlvSW5mbyk7DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0dldEF1ZGlvTG9vcFJlc3VsdChUX0hhbEF1ZGlvTG9vcFRlc3RQcmEgKmF1ZGlvUHJhKTsNCi0vL1NJTlQzMiB6RHJ2TmFuZF9SZWFkKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiB0byk7Ly94aXUNCi1VSU5UMzIgek9zc19Odkl0ZW1SZWFkKFVJTlQzMiBOdkl0ZW1JRCwgVUlOVDggKk52SXRlbURhdGEsIFVJTlQzMiBOdkl0ZW1MZW4pOw0KLVNJTlQzMiB6RHJ2Q29kZWNfU2V0T3V0X0hwZihUX1pEcnZDb2RlY19IYW5kbGUgaGFuZGxlLCBUX1pEcnZDb2RlY19BdWRpb1NhbXBsZSBmcywgQk9PTCBvbm9mZik7Ly94aXUNCi1TSU5UMzIgY2FsX2ZyZXFfZmZ0KCBTSU5UMTYgKmRhdGEsekRydlZwX0ZyZXFmZnQgKmZyZXFmZnQsVUlOVDE2IG4sVUlOVDMyIGZzKTsvL3hpdQ0KLVNJTlQzMiB6RHJ2Q29kZWNfUmVhZChVSU5UMTYgcmVnUGFnZSxVSU5UMTYgcmVnQWRkcmVzcyxVSU5UMTYgKnJlZ1ZhbHVlKTsvL3hpdQ0KLVNJTlQzMiB6RHJ2Q29kZWNfV3JpdGUoVUlOVDE2IHJlZ1BhZ2UsVUlOVDE2IHJlZ0FkZHJlc3MsVUlOVDE2IHJlZ1ZhbHVlLFVJTlQxNiByZWdNYXNrKTsvL3hpdQ0KLVNJTlQzMiB6RHJ2Q29kZWNfRHVtcFJlZyhWT0lEKTsvL3hpdQ0KLVNJTlQzMiB2cF9TZXRJbm5lckkyc01vZGUoQk9PTCBpMnNtb2RlKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZBdWRpb19Jbml0aWF0ZShWT0lEKTsNCi1leHRlcm4gVk9JRCB2cF9TZXRUb3BJMnNDb25maWcoVk9JRCk7DQotZXh0ZXJuIFZPSUQgdnBfU2V0VG9wVGRtQ29uZmlnKFZPSUQpOw0KLWV4dGVybiBWT0lEIHZwX1NldFRvcENvbmZpZyhWT0lEKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZJMlNfSW5pdChWT0lEKTsNCi1leHRlcm4gVk9JRCB1ZGVsYXkoVUlOVDMyICB1cyk7DQotDQotI2lmZGVmIF9VU0VfRUFSUElFQ0VfRlVOQ01PVURMRQ0KLWV4dGVybiBTSU5UMzIgekRydkVhcnBfSW5pdGlhdGUoVk9JRCk7DQotI2VuZGlmDQotc3RhdGljIFRfSGFsVnBDZmdfT3B0IHNfdnBDZmdPYmpPcHQgPQ0KLXsNCi0JTlVMTCwNCi0JTlVMTCwNCi0JTlVMTCwNCi0JaGFsQXVkaW9Db25maWdfT3BlbiwNCi0JaGFsQXVkaW9Db25maWdfQ2xvc2UsDQotCWhhbEF1ZGlvQ29uZmlnX0VuYWJsZSwNCi0JaGFsQXVkaW9Db25maWdfRGlzYWJsZSwNCi0JaGFsQXVkaW9Db25maWdfU2V0RnMsDQotCWhhbEF1ZGlvQ29uZmlnX1NldElucHV0UGF0aCwNCi0JaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0UGF0aCwNCi0JaGFsQXVkaW9Db25maWdfU2V0TXV0ZSwNCi0JaGFsQXVkaW9Db25maWdfU2V0Rm1QYXRoLA0KLQloYWxBdWRpb0NvbmZpZ19TZXRMb29wYmFjaywNCi0JaGFsQXVkaW9Db25maWdfU2V0SW5wdXRWb2wsDQotCWhhbEF1ZGlvQ29uZmlnX1NldE91dHB1dFZvbCwNCi0JaGFsQXVkaW9Db25maWdfU2V0VXNlUHJvdG9jb2wsDQotCWhhbEF1ZGlvQ29uZmlnX0dldE1peGVyVG9uZUluZm8sDQotLy8JaGFsQXVkaW9Db25maWdfR2V0QXVkaW9Mb29wSW5mbywNCi0vLwloYWxBdWRpb0NvbmZpZ19HZXRBdWRpb0xvb3BSZXN1bHQsDQotfTsNCi0NCi1zdGF0aWMgYXVkX2RzcF9kYWlfY29uZmlndXJhdGlvbl90eXBlIHNfZHNwUGNtTWFzdGVyQ2ZnID0NCi17DQotCS8qIGF1ZF9JMlN4X21vZGUxIG1hc3RlciBtb2RlKi8NCi0JYXVkX0kyU3hfbW9kZTEsICAgICAgICAgLyogbW9kZSBhbGxvd2VkIG9yIG5vdCBvbiBwbGF0Zm9ybSAqLw0KLQlBVURfSTJTX0NTRUxfVFhDTEtTRUxfRlJPTV9GcmFjdGlvbmFsX2RldmlkZXJfMF9NQVNURVIgfCBBVURfSTJTX0NTRUxfQ0xLMFNFTF9GcmFjdGlvbmFsX2RldmlkZXJfMCB8IFwNCi0JQVVEX0kyU19DU0VMX1JYQ0xLU0VMX0ZST01fRnJhY3Rpb25hbF9kZXZpZGVyXzBfTUFTVEVSIHwgQVVEX0kyU19DU0VMX0NMSzFTRUxfRnJhY3Rpb25hbF9kZXZpZGVyXzAsIC8qIGNzZWwgKi8NCi0JMHgwY2IyLCAvKiBkZW4wICovDQotCTB4MGNiMiwgLyogZGVuMSAqLw0KLQkweDAwMTEgfCBBVURfSTJTX05VTV9GUkVGXzEwNE1IeiwgLyogbnVtMCAqLw0KLQkweDAwMTEgfCBBVURfSTJTX05VTV9GUkVGXzEwNE1IeiwgLyogbnVtMSAqLw0KLQlBVURfSTJTX0NPTkZfUlhfQ0xLMV9PVVRfSVNfTE9XIHwgQVVEX0kyU19DT05GX1JYX0NMSzFfQ09OVF9TVE9QUyB8IEFVRF9JMlNfQ09ORl9SWF9XQTFfTEVOXzFfQ1lDTEUsIC8qIHJ4Y29uZiAqLw0KLQlBVURfSTJTX0NPTkZfVFhfQ0xLMF9PVVRfSVNfTE9XIHwgQVVEX0kyU19DT05GX1RYX0NMSzBfQ09OVF9TVE9QUyB8IEFVRF9JMlNfQ09ORl9UWF9XQTBfTEVOXzFfQ1lDTEUsIC8qIHR4Y29uZiAqLw0KLQlBVURfSTJTX0hXX01PREVfQlVSU1QsDQotCUFVRF9JMlNfQ0hBTk5FTF9NT0RFX01PTk8sDQotCWF1ZF9JMlNfc2FtcGxlcmF0ZV8wODAwMA0KLX07DQotc3RhdGljIGF1ZF9kc3BfZGFpX2NvbmZpZ3VyYXRpb25fdHlwZSBzX2RzcFBjbVNsYXZlQ2ZnID0NCi17DQotCS8qIGF1ZF9JMlN4X21vZGUyICovDQotCWF1ZF9JMlN4X21vZGUyLCAgICAgICAgIC8qIG1vZGUgYWxsb3dlZCBvciBub3Qgb24gcGxhdGZvcm0gKi8NCi0JQVVEX0kyU19DU0VMX1RYQ0xLU0VMX0ZST01fQ0xLMF9XQTBfU0xBVkUgfCBBVURfSTJTX0NTRUxfQ0xLMFNFTF9leHRlcm5hbCB8IFwNCi0JQVVEX0kyU19DU0VMX1JYQ0xLU0VMX0ZST01fQ0xLMF9XQTBfU0xBVkUgfCBBVURfSTJTX0NTRUxfQ0xLMVNFTF9leHRlcm5hbCwgLyogY3NlbCAqLw0KLQkweDA2NTksIC8qIGRlbjAgKi8NCi0JMHgwNjU5LCAvKiBkZW4xICovDQotCTB4MDAxMCB8IEFVRF9JMlNfTlVNX0ZSRUZfMTA0TUh6LCAvKiBudW0wICovDQotCTB4MDAxMCB8IEFVRF9JMlNfTlVNX0ZSRUZfMTA0TUh6LCAvKiBudW0xICovDQotCUFVRF9JMlNfQ09ORl9SWF9DTEsxX09VVF9JU19MT1cgfCBBVURfSTJTX0NPTkZfUlhfQ0xLMV9DT05UX1NUT1BTIHwgQVVEX0kyU19DT05GX1JYX1dBMV9MRU5fMV9DWUNMRSwgLyogcnhjb25mICovDQotCUFVRF9JMlNfQ09ORl9UWF9DTEswX09VVF9JU19MT1cgfCBBVURfSTJTX0NPTkZfVFhfQ0xLMF9DT05UX1NUT1BTIHwgQVVEX0kyU19DT05GX1RYX1dBMF9MRU5fMV9DWUNMRSwgLyogdHhjb25mICovDQotCUFVRF9JMlNfSFdfTU9ERV9CVVJTVCwNCi0JQVVEX0kyU19DSEFOTkVMX01PREVfTU9OTywNCi0JYXVkX0kyU19zYW1wbGVyYXRlXzA4MDAwDQotfTsNCi1zdGF0aWMgYXVkX2RzcF9kYWlfY29uZmlndXJhdGlvbl90eXBlIHNfZHNwSTJzTWFzdGVyQ2ZnID0NCi17DQotCS8qIGF1ZF9JMlN4X21vZGUzIDE2IGJpdCA4IGtIeiBNYXN0ZXIsIE5vcm1hbCBNb2RlLCBNb25vICovDQotCWF1ZF9JMlN4X21vZGUzLCAgICAgICAgIC8qIG1vZGUgYWxsb3dlZCBvciBub3Qgb24gcGxhdGZvcm0gKi8NCi0JQVVEX0kyU19DU0VMX1RYQ0xLU0VMX0ZST01fRnJhY3Rpb25hbF9kZXZpZGVyXzBfTUFTVEVSIHwgQVVEX0kyU19DU0VMX0NMSzBTRUxfRnJhY3Rpb25hbF9kZXZpZGVyXzAgfCBcDQotCUFVRF9JMlNfQ1NFTF9SWENMS1NFTF9GUk9NX0ZyYWN0aW9uYWxfZGV2aWRlcl8wX01BU1RFUiB8IEFVRF9JMlNfQ1NFTF9DTEsxU0VMX0ZyYWN0aW9uYWxfZGV2aWRlcl8xLCAvKiBjc2VsICovDQotCTB4MDY1OSwgLyogZGVuMCAqLw0KLQkweDA2NTksIC8qIGRlbjEgKi8NCi0JMHgwMDEwIHwgQVVEX0kyU19OVU1fRlJFRl8xMDRNSHosIC8qIG51bTAgKi8NCi0JMHgwMDEwIHwgQVVEX0kyU19OVU1fRlJFRl8xMDRNSHosIC8qIG51bTEgKi8NCi0JQVVEX0kyU19DT05GX0VER0VfUklTSU5HIHwgQVVEX0kyU19DT05GX0RFTF8xX2JpdF9ERUxBWSB8IEFVRF9JMlNfQ09ORl9QT0xfV0FfSElHSF9JU19SSUdIVCBcDQotCXwgQVVEX0kyU19DT05GX1BFUklPRF8zMiB8IEFVRF9JMlNfQ09ORl9XSURUSF8xNiB8IEFVRF9JMlNfQ09ORl9BTElHTl9MRUZULCAvKiByeGNvbmYgKi8NCi0JQVVEX0kyU19DT05GX0VER0VfRkFMTElORyB8IEFVRF9JMlNfQ09ORl9ERUxfMV9iaXRfREVMQVkgfCBBVURfSTJTX0NPTkZfUE9MX1dBX0hJR0hfSVNfUklHSFQgXA0KLQl8IEFVRF9JMlNfQ09ORl9QRVJJT0RfMzIgfCBBVURfSTJTX0NPTkZfV0lEVEhfMTYgfCBBVURfSTJTX0NPTkZfQUxJR05fTEVGVCBcDQotCXwgQVVEX0kyU19UUkFOU0ZFUl9NT0RFX1JJR0hUIHwgQVVEX0kyU19DT05GX1RYX01VVEVfTF9NVVRFRCB8IEFVRF9JMlNfQ09ORl9UWF9NVVRFX1JfQUNUSVZFLC8qIHR4Y29uZiAqLw0KLQlBVURfSTJTX0hXX01PREVfTk9STUFMLA0KLQlBVURfSTJTX0NIQU5ORUxfTU9ERV9EVUFMTU9OT1IsDQotCWF1ZF9JMlNfc2FtcGxlcmF0ZV8wODAwMA0KLX07DQotc3RhdGljIGF1ZF9kc3BfZGFpX2NvbmZpZ3VyYXRpb25fdHlwZSBzX2RzcEkyc1NsYXZlQ2ZnID0NCi17DQotCS8qIGF1ZF9JMlN4X21vZGU0IDE2IGJpdCA4IGtIeiBTbGF2ZSwgTm9ybWFsIE1vZGUsIE1vbm8gKi8NCi0JYXVkX0kyU3hfbW9kZTQsICAgICAgICAgLyogbW9kZSBhbGxvd2VkIG9yIG5vdCBvbiBwbGF0Zm9ybSAqLw0KLQlBVURfSTJTX0NTRUxfVFhDTEtTRUxfRlJPTV9DTEswX1dBMF9TTEFWRSB8IEFVRF9JMlNfQ1NFTF9DTEswU0VMX2V4dGVybmFsIHwNCi0JQVVEX0kyU19DU0VMX1JYQ0xLU0VMX0ZST01fQ0xLMF9XQTBfU0xBVkUgfCBBVURfSTJTX0NTRUxfQ0xLMVNFTF9leHRlcm5hbCwgLyogY3NlbCAqLw0KLQkweDAwMDIsIC8qIGRlbjAgKi8NCi0JMHgwMDAyLCAvKiBkZW4xICovDQotCTB4MDAwMSwgLyogbnVtMCAqLw0KLQkweDAwMDEsIC8qIG51bTEgKi8NCi0JQVVEX0kyU19DT05GX0VER0VfUklTSU5HIHwgQVVEX0kyU19DT05GX0RFTF8xX2JpdF9ERUxBWSB8IEFVRF9JMlNfQ09ORl9QT0xfV0FfSElHSF9JU19SSUdIVA0KLQl8IEFVRF9JMlNfQ09ORl9QRVJJT0RfMzIgfCBBVURfSTJTX0NPTkZfV0lEVEhfMTYgfCBBVURfSTJTX0NPTkZfQUxJR05fTEVGVCwgLyogcnhjb25mICovDQotCUFVRF9JMlNfQ09ORl9FREdFX0ZBTExJTkcgfCBBVURfSTJTX0NPTkZfREVMXzFfYml0X0RFTEFZIHwgQVVEX0kyU19DT05GX1BPTF9XQV9ISUdIX0lTX1JJR0hUDQotCXwgQVVEX0kyU19DT05GX1BFUklPRF8zMiB8IEFVRF9JMlNfQ09ORl9XSURUSF8xNiB8IEFVRF9JMlNfQ09ORl9BTElHTl9MRUZUDQotCXwgQVVEX0kyU19UUkFOU0ZFUl9NT0RFX1JJR0hUIHwgQVVEX0kyU19DT05GX1RYX01VVEVfTF9NVVRFRCB8IEFVRF9JMlNfQ09ORl9UWF9NVVRFX1JfQUNUSVZFLC8qIHR4Y29uZiAqLw0KLQlBVURfSTJTX0hXX01PREVfTk9STUFMLA0KLQlBVURfSTJTX0NIQU5ORUxfTU9ERV9EVUFMTU9OT1IsDQotCWF1ZF9JMlNfc2FtcGxlcmF0ZV8wODAwMA0KLX07DQotDQotDQotZXh0ZXJuIFRfWkRydkkyU19DZmcgc192cElubmVySTJzQ2ZnIDsvL0kyUyBNQVNURVINCi0NCi0NCi1leHRlcm4gVF9aRHJ2STJTX0NmZyBzX3ZwRXh0STJzTmJDZmcgIDsvL1RFU1QgRk9SIGkycw0KLQ0KLWV4dGVybiBUX1pEcnZJMlNfQ2ZnIHNfdnBFeHRJMnNXYkNmZyAgOy8vVEVTVCBGT1IgaTJzDQotZXh0ZXJuIFRfWkRydkkyU19DZmcgc192cEV4dEkyc05iQ2ZnX3NsaWMgIDsvL1RFU1QgRk9SIGkycw0KLWV4dGVybiBUX1pEcnZJMlNfQ2ZnIHNfdnBFeHRJMnNXYkNmZ19zbGljICA7Ly9URVNUIEZPUiBpMnMNCi0NCi0vL2V4dGVybiBUX1pEcnZJMlNfQ2ZnIHNfdnBBdWRpb0kyc0NmZyAgOy8vVEVTVCBGT1IgaTJzDQotLy9leHRlcm4gVF9aRHJ2STJTX0NmZyBzX3ZwRm1JMnNDZmcgIDsvL1RFU1QgRk9SIGkycw0KLWV4dGVybiBUX1pEcnZUZG1fQ2ZnIHNfdnBUZG1OYkNmZyAgOy8vVEVTVCBGT1IgdGRtDQotZXh0ZXJuIFRfWkRydlRkbV9DZmcgc192cFRkbVdiQ2ZnIDsvL1RFU1QgRk9SIHRkbQ0KLWV4dGVybiBUX1pEcnZUZG1fQ2ZnIHNfdnBUZG1XYkNmZ19jb2RlYyA7Ly9URVNUIEZPUiBjb2RlYyB0ZG0NCi0NCi0NCi1zdGF0aWMgVF9aRHJ2Q29kZWNfSGFuZGxlIGdDb2RlY0hhbmRsZSA9IDA7Ly94aXUNCi0NCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi1zdGF0aWMgVF9aRHJ2Q29kZWNfSW5EZXZpY2Ugc19pbkRldiA9IEFVRElPX0lOUFVUX0hBTkRTRVQ7DQotc3RhdGljIFRfWkRydkNvZGVjX091dERldmljZSBzX291dERldiA9IEFVRElPX09VVFBVVF9SRUNFSVZFUjsNCi1CT09MIGNvZGVjSW5pdEZsYWcgPSBGQUxTRTsNCi1zdGF0aWMgQk9PTCBzX2lzQ2xhc3NrT3BlbmVkID0gRkFMU0U7DQotI2VuZGlmDQotDQotc3RhdGljIEJPT0wgc19pc0ZtT3BlbmVkID0gRkFMU0U7DQotc3RhdGljIFRfWkRydkNvZGVjX1VzZVByb3RvY29sIHNfdXNlUHJvdG9jYWw7DQotc3RhdGljIFRfWkRydkNvZGVjX1NvdXJjZVR5cGUgY29kZWNTcmNUeXBlID0gVk9JQ0VfU09VUkNFOw0KLXN0YXRpYyBUX1pEcnZDb2RlY19BdWRpb1NhbXBsZSBTYW1wbGVfRnMgPSBBVURJT19TQU1QTEVfOEs7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotZXh0ZXJuIFNJTlQzMiB6RHJ2VnBfU2V0RXh0QXVkaW9DZmcoVF9aRHJ2STJTX0NmZyAqcEkyc05iQ2ZnLFRfWkRydkkyU19DZmcgKnBJMnNXYkNmZywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfWkRydlRkbV9DZmcgKnBUZG1OYkNmZyxUX1pEcnZUZG1fQ2ZnICpwVGRtV2JDZmcpOw0KLWV4dGVybiBTSU5UMzIgekRydlZwX1NldEV4dEkyc0NmZyhUX1pEcnZJMlNfQ2ZnICpwSTJzTmJDZmcsIFRfWkRydkkyU19DZmcgKnBJMnNXYkNmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VnBfU2V0SW5uZXJJMnNDZmcoVF9aRHJ2STJTX0NmZyAqcEkyc0NmZyk7DQotZXh0ZXJuIFZPSUQgekRydlZwQ2ZnX1NldE9wZXJhdGlvbnMoVF9IYWxWcENmZ19PcHQqIFZwQ2ZnX09ialB0cik7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2QXVkX0RzcENmZ0kyc01vZGUoVk9JRCAqcEkyc0NmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2QXVkX0RzcENmZ1BjbU1vZGUoVk9JRCAqcFBjbUNmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2Q29kZWNfU2V0UHJvdChUX1pEcnZDb2RlY19IYW5kbGUgaGFuZGxlLCBUX1pEcnZDb2RlY19Vc2VQcm90b2NvbCB1c2VQcm90b2NhbCk7DQotLy9leHRlcm4gVk9JRCB6Q3RybV9Jbml0QXVkaW9BdChWT0lEKTsNCi1leHRlcm4gVUlOVDMyIHpDYXRBZ3RfQXVkaW9fUmVnKFVJTlQzMiB0eXBlLCBVSU5UMzIgc2l6ZSwgVUlOVDMyIGFkZHIpOw0KLWV4dGVybiBTSU5UMzIgekRydlZwX0dldFZvaWNlU3RhdGUoVk9JRCAqcFZvaWNlU3RhdGUpOw0KLWV4dGVybiBTSU5UMzIgekRydkF1ZGlvX1NldEkyc0NmZyhUX1pEcnZJMlNfQ2ZnICpwSTJzQ2ZnKTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlZmluaXRpb25zDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgX0NPTkZJR19EQ19VU0VfQ09ERUMvL2R1YWxfY29yZSB2ZXJzaW9uDQotU0lOVDMyIHZwX1NldElubmVySTJzTW9kZShCT09MIGkyc21vZGUpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLSNpZiBkZWZpbmVkIF9VU0VfUkVGX0FVRElPX09OXzc1MTANCi0JVUlOVDMyIEFtclJlZ0JpdCA9IDA7DQotCUFtclJlZ0JpdCA9IEFSTV9JMlNfTE9PUF9TRVQ7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9TZXRJbm5lckkyc01vZGUgc3RhcnQgIEFSTV9JMlNfTE9PUF9TRVQ9JXhcbiIsIEFSTV9JMlNfTE9PUF9TRVQpOw0KLQ0KLQkvLyBpbnRlciBsb29wDQotCUFtclJlZ0JpdCAmPSAweGZmZjhmZmY4Ow0KLQlpZiAoaTJzbW9kZSA9PSBUUlVFKQ0KLQl7DQotDQotCQlBbXJSZWdCaXQgfD0gMHgwMDA1MDAwMjsgLy8gIHRlYWsgYWZlLS1hcm0gaTJzMg0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1NldElubmVySTJzTW9kZSBpMnMgbW9kZSB0ZWFrIGFmZSBBbXJSZWdCaXQ9JXhcbiIsIEFtclJlZ0JpdCk7DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQlBbXJSZWdCaXQgfD0gMHgwMDAzMDAwMjsgLy8gIHRlYWsgaTJzMS0tYXJtIGkyczINCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9TZXRJbm5lckkyc01vZGUgcGNtIG1vZGUgIHRlYWsgaTJzMSBBbXJSZWdCaXQ9JXhcbiIsIEFtclJlZ0JpdCk7DQotDQotCX0NCi0JQVJNX0kyU19MT09QX1NFVCA9IEFtclJlZ0JpdDsNCi0jZWxpZiBkZWZpbmVkIF9VU0VfUkVGX0FVRElPX09OXzc1MjBWMw0KLQlVSU5UMzIgQW1yUmVnQml0ID0gMDsNCi0JQW1yUmVnQml0ID0gQVJNX0kyU19MT09QX0NGRzsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1NldElubmVySTJzTW9kZSBzdGFydCAgQVJNX0kyU19MT09QX0NGRz0leFxuIiwgQVJNX0kyU19MT09QX0NGRyk7DQotDQotCS8vIGludGVyIGxvb3ANCi0JQW1yUmVnQml0ICY9IDB4ZmZmZmZlMDc7DQotDQotCWlmIChpMnNtb2RlID09IFRSVUUpDQotCXsNCi0NCi0JCUFtclJlZ0JpdCB8PSAweDAwMDAwMGE4OyAvLyAgdGVhayBhZmUgaTJzDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfU2V0SW5uZXJJMnNNb2RlIGkycyBtb2RlIHRlYWsgYWZlIEFtclJlZ0JpdD0leFxuIiwgQW1yUmVnQml0KTsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCUFtclJlZ0JpdCB8PSAweDAwMDAwMDk4OyAvLyAgdGVhayBpMnMxIHBjbQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1NldElubmVySTJzTW9kZSBwY20gbW9kZSAgdGVhayBpMnMxIEFtclJlZ0JpdD0leFxuIiwgQW1yUmVnQml0KTsNCi0NCi0JfQ0KLQ0KLQlBUk1fSTJTX0xPT1BfQ0ZHID0gQW1yUmVnQml0Ow0KLQ0KLQ0KLSNlbmRpZg0KLQ0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi12b2lkIGhhbFJjdkFuZEVhcnBTd2l0Y2goVF9aRHJ2X1ZwUGF0aCBwYXRoKQ0KLXsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW83NkhhbmRsZSwgR1BJTzc2X0dQSU83Nik7DQotCXpEcnZHcGlvX1NldERpcmVjdGlvbihhdWRpb0dwaW83NkhhbmRsZSwgR1BJT19PVVQpOw0KLQlpZiAoVlBfUEFUSF9IQU5EU0VUID09IHBhdGgpDQotCXsNCi0JCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpbzc2SGFuZGxlLCBHUElPX0xPVyk7DQotCX0NCi0JZWxzZSBpZiAoVlBfUEFUSF9IRUFEU0VUID09IHBhdGgpDQotCXsNCi0JCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpbzc2SGFuZGxlLCBHUElPX0hJR0gpOw0KLQl9DQotCWVsc2UgaWYgKFZQX1BBVEhfU1BFQUtFUiA9PSBwYXRoKQ0KLQl7DQotCQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW83NkhhbmRsZSwgR1BJT19MT1cpOw0KLQl9DQotI2VuZGlmDQotfQ0KLQ0KLXZvaWQgaGFsU3BrUGFTd2l0Y2goVF9aRHJ2X1ZwUGF0aCBwYXRoKQ0KLXsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JU0lOVDMyIGkgPSAwOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpbzc3SGFuZGxlLCBHUElPNzdfR1BJTzc3KTsNCi0JekRydkdwaW9fU2V0RGlyZWN0aW9uKGF1ZGlvR3Bpbzc3SGFuZGxlLCBHUElPX09VVCk7DQotDQotCWlmIChWUF9QQVRIX1NQRUFLRVIgPT0gcGF0aCkNCi0Jew0KLQkJaWYgKHNfaXNDbGFzc2tPcGVuZWQgPT0gRkFMU0UpDQotCQl7DQotCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykNCi0JCQl7DQotCQkJCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpbzc3SGFuZGxlLCBHUElPX0hJR0gpOw0KLQkJCQl1ZGVsYXkoMSk7DQotDQotCQkJCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpbzc3SGFuZGxlLCBHUElPX0xPVyk7DQotCQkJCXVkZWxheSgxKTsNCi0JCQl9DQotCQkJekRydkdwaW9fU2V0T3V0cHV0VmFsdWUoYXVkaW9HcGlvNzdIYW5kbGUsIEdQSU9fSElHSCk7DQotCQkJc19pc0NsYXNza09wZW5lZCA9IFRSVUU7DQotCQl9DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW83N0hhbmRsZSwgR1BJT19MT1cpOw0KLQkJdWRlbGF5KDUwMCk7DQotCQlzX2lzQ2xhc3NrT3BlbmVkID0gRkFMU0U7DQotCX0NCi0jZW5kaWYNCi0NCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiB6RHJ2Q29kZWNfSW5pdGlhdGUNCi0gKiBEZXNjcmlwdGlvbjogb3BlbiBjb2RlYywgc2V0IHBhcmFtZXRlcnMuDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Og0KLSAqDQotICogICBPdXRwdXQ6DQotICoNCi0gKiBSZXR1cm5zOg0KLSAqICAgMCBpZiBzdWNjZXNzLCBub3QgMCBpZiBmYWlsDQotICoNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydkNvZGVjX0luaXRpYXRlKFZPSUQpDQotew0KLSAgICAvL1VJTlQzMiBhcm1SZWdCaXQgPSAwOy8veGl1DQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotDQotI2lmIGRlZmluZWQgX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX1BIT05FDQotDQotCWF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJjb2RlY19wYV9lbiIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEFVRElPX0NPREVDX0VOX0dQSU9fRlVOQ19TRUwpOw0KLQl6RHJ2R3Bpb19TZXREaXJlY3Rpb24oYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgR1BJT19PVVQpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9Db2RlY0VuSGFuZGxlLCBHUElPX0hJR0gpOyAvL0dQSU9fTE9XDQotCXpPc3NfU2xlZXAoNSk7DQotDQotCWF1ZGlvR3Bpb1Jlc2V0SGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVzZXQiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW9SZXNldEhhbmRsZSwgQVVESU9fQ09ERUNfUkVTRVRfR1BJT19GVU5DX1NFTCk7DQotCXpEcnZHcGlvX1NldERpcmVjdGlvbihhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19PVVQpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19MT1cpOw0KLQl6T3NzX1NsZWVwKDUpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19ISUdIKTsNCi0Jek9zc19TbGVlcCg1KTsNCi0NCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVmY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBBVURJT19DT0RFQ19DTEtfR1BJT19GVU5DX1NFTCk7Ly8yNk1IWiBHUElPMTVfQ0xLX09VVDANCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfc2V0Q29kZWNDbGsgMjZNIVxuIik7DQotI2VsaWYgZGVmaW5lZCBfVVNFX1JFRl9BVURJT19PTl83NTIwVjNfRldQDQotCWF1ZGlvR3Bpb1Jlc2V0SGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVzZXQiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW9SZXNldEhhbmRsZSwgQVVESU9fQ09ERUNfUkVTRVRfR1BJT19GVU5DX1NFTCk7DQotCXpEcnZHcGlvX1NldERpcmVjdGlvbihhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19PVVQpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19MT1cpOw0KLQl6T3NzX1NsZWVwKDUpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19ISUdIKTsNCi0Jek9zc19TbGVlcCg1KTsNCi0NCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVmY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBBVURJT19DT0RFQ19DTEtfR1BJT19GVU5DX1NFTCk7Ly8yNk1IWiBHUElPMTVfQ0xLX09VVDINCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIltGV1BdekRydkkyU19zZXRDb2RlY0NsayAyNk0hXG4iKTsNCi0jZWxpZiBkZWZpbmVkIF9VU0VfUkVGX0FVRElPX09OXzc1MjBWM19NREwNCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVmY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBBVURJT19DT0RFQ19DTEtfR1BJT19GVU5DX1NFTCk7Ly8yNk1IWiBHUElPMTdfQ0xLX09VVDINCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfc2V0Q29kZWNDbGsgMjZNIVxuIik7DQotDQotI2VsaWYgZGVmaW5lZCBfVVNFX1JFRl9BVURJT19PTl83NTIwVjINCi0NCi0JYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImNvZGVjX2VuIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgQVVESU9fQ09ERUNfRU5fR1BJT19GVU5DX1NFTCk7DQotCXpEcnZHcGlvX1NldERpcmVjdGlvbihhdWRpb0dwaW9Db2RlY0VuSGFuZGxlLCBHUElPX09VVCk7DQotCXpPc3NfU2xlZXAoNSk7DQotCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEdQSU9fSElHSCk7DQotDQotCWF1ZGlvR3Bpb1Jlc2V0SGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVzZXQiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW9SZXNldEhhbmRsZSwgQVVESU9fQ09ERUNfUkVTRVRfR1BJT19GVU5DX1NFTCk7DQotCXpEcnZHcGlvX1NldERpcmVjdGlvbihhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19PVVQpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19MT1cpOw0KLQl6T3NzX1NsZWVwKDUpOw0KLQl6RHJ2R3Bpb19TZXRPdXRwdXRWYWx1ZShhdWRpb0dwaW9SZXNldEhhbmRsZSwgR1BJT19ISUdIKTsNCi0Jek9zc19TbGVlcCg1KTsNCi0NCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVmY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBBVURJT19DT0RFQ19DTEtfR1BJT19GVU5DX1NFTCk7Ly8yNk1IWg0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19zZXRDb2RlY0NsayAyNk0hXG4iKTsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUNfRUFSUElFQ0VfREVURUNUDQotLy9tcDNfc3cNCi0JYXVkaW9HcGlvNzZIYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJtcDNfc3ciKTsNCi0JaGFsUmN2QW5kRWFycFN3aXRjaChWUF9QQVRIX0hBTkRTRVQpOw0KLS8vY2xhc3MgayBlbg0KLQlhdWRpb0dwaW83N0hhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImF1ZGlvX3BhX2VuIik7DQotCWhhbFNwa1BhU3dpdGNoKFZQX1BBVEhfSEFORFNFVCk7DQotDQotI2VuZGlmDQotDQotI2VuZGlmDQotDQotCWNvZGVjSW5pdEZsYWcgPSBUUlVFOw0KLSNlbmRpZg0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLSNlbmRpZg0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246IHpEcnZWb2ljZUNvbmZpZ19Jbml0DQotICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWF0ZSB2b2ljZSBwcm9jZXNzDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Ok5vbmUNCi0gKiAgIE91dHB1dDpOb25lDQotICoNCi0gKiBSZXR1cm5zOiBzdWNjZXNzIG9yIGVycm9yIGNvZGUNCi0gKg0KLSAqDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4JU0lOVDMyIHpEcnZWb2x0ZV9Mb29wU3RhcnQoVk9JRCk7DQotDQotU0lOVDMyIHpEcnZWb2ljZUNvbmZpZ19Jbml0KFZPSUQpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQlUX0F1ZGlvX052RmxhZyBhdWRpb252ZmxhZyA9IHswfTsNCi0JYXVkX2RzcF9kYWlfY29uZmlndXJhdGlvbl90eXBlICpwX2RzcFBjbUNmZwk9IE5VTEw7DQotCWF1ZF9kc3BfZGFpX2NvbmZpZ3VyYXRpb25fdHlwZSAqcF9kc3BJMnNDZmcgPSBOVUxMOw0KLQ0KLSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHpEcnZWb2ljZUNvbmZpZ19Jbml0IGF1ZGlvIG52IGFkZHI9MHgleCFcbiIsIE9TX0ZMQVNIX1ZPSUNFX0RSVl9SV19OT05GQUNfQkFTRV9BRERSKTsNCi0NCi0JLy9yZXQgPSB6RHJ2TmFuZF9SZWFkKE9TX0ZMQVNIX1ZPSUNFX0RSVl9SV19OT05GQUNfQkFTRV9BRERSLCAgc2l6ZW9mKGF1ZGlvbnZmbGFnKSwgKChVSU5UOCAqKSgmYXVkaW9udmZsYWcpKSk7DQotCXJldCA9IHpPc3NfTnZJdGVtUmVhZChPU19GTEFTSF9WT0lDRV9EUlZfUldfTk9ORkFDX0JBU0VfQUREUiwgKChVSU5UOCAqKSgmYXVkaW9udmZsYWcpKSwgIHNpemVvZihhdWRpb252ZmxhZykpOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHpEcnZWb2ljZUNvbmZpZ19Jbml0IHpPc3NfTnZJdGVtUmVhZCBpc1ZwUGFyYW1Jbk52PSVkLGlzVXNlU2xpY0NvZGVjPSVkIVxuIiwgYXVkaW9udmZsYWcuaXNWcFBhcmFtSW5OdiwgYXVkaW9udmZsYWcuaXNVc2VTbGljQ29kZWMpOw0KLQkvL2hhbF9UZXN0VG9wSTJzQ29uZmlnKCk7DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgcmVhZCB0aGUgYXVkaW9udmZsYWcgZmFpbGVkIVxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCWlmIChhdWRpb252ZmxhZy5pc1ZwQ29uZmlnSW5pdE9uID09IDEpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgekRydlZvaWNlQ29uZmlnX0luaXQgc3RhcnQhXG4iKTsNCi0NCi0JCXpEcnZWcENmZ19TZXRPcGVyYXRpb25zKCZzX3ZwQ2ZnT2JqT3B0KTsNCi0NCi0JCWlmIChzX3ZwSW5uZXJJMnNDZmcuYk1hc3RlciA9PSBUUlVFKQ0KLQkJew0KLQkJCXBfZHNwUGNtQ2ZnID0gJnNfZHNwUGNtU2xhdmVDZmc7DQotCQkJcF9kc3BJMnNDZmcgPSAmc19kc3BJMnNTbGF2ZUNmZzsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiYXJtIElubmVySTJzIE1hc3RlciwgZHNwIEkyUyBTbGF2ZSAhXG4iKTsNCi0NCi0JCX0NCi0JCWVsc2UgaWYgKHNfdnBJbm5lckkyc0NmZy5iTWFzdGVyID09IEZBTFNFKQ0KLQkJew0KLQkJCXBfZHNwUGNtQ2ZnID0gJnNfZHNwUGNtTWFzdGVyQ2ZnOw0KLQkJCXBfZHNwSTJzQ2ZnID0gJnNfZHNwSTJzTWFzdGVyQ2ZnOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJhcm0gSW5uZXJJMnMgU2xhdmUsIGRzcCBJMlMgTWFzdGVyIVxuIik7DQotDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBzX3ZwSW5uZXJJMnNDZmcgYk1hc3RlciB2YWwgZXJyIVxuIik7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0NCi0JCX0NCi0jaWYgUFNfUkFUX0dTTQ0KLQkJcmV0ID0gekRydkF1ZF9Ec3BDZmdJMnNNb2RlKHBfZHNwSTJzQ2ZnKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZBdWRfRHNwQ2ZnSTJzTW9kZSAgZmFpbCwgcmV0PSVkIVxuIiwgcmV0KTsNCi0NCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQ0KLQkJcmV0ID0gekRydkF1ZF9Ec3BDZmdQY21Nb2RlKHBfZHNwUGNtQ2ZnKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZBdWRfRHNwQ2ZnUGNtTW9kZSAgZmFpbCwgcmV0PSVkIVxuIiwgcmV0KTsNCi0NCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiB6RHJ2Vm9pY2VDb25maWdfSW5pdCBzX3ZwSW5uZXJJMnNDZmc9JXAsc192cEV4dEkyc05iQ2ZnIGFkZHI9MHglcCxzX3ZwRXh0STJzV2JDZmcgYWRkcj0weCVwIVxuIiwgJnNfdnBJbm5lckkyc0NmZywgJnNfdnBFeHRJMnNOYkNmZywgJnNfdnBFeHRJMnNXYkNmZyk7DQotI2VuZGlmDQotCQl6RHJ2VnBfU2V0SW5uZXJJMnNDZmcoJnNfdnBJbm5lckkyc0NmZyk7DQotCQkvKmtsb2N3b3JrIDMgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkJLyppZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9Ki8NCi0JCWlmIChhdWRpb252ZmxhZy5pc1VzZVNsaWNDb2RlYyA9PSAxKQ0KLQkJew0KLQkJCXpEcnZWcF9TZXRFeHRBdWRpb0NmZygmc192cEV4dEkyc05iQ2ZnX3NsaWMsICZzX3ZwRXh0STJzV2JDZmdfc2xpYywgJnNfdnBUZG1OYkNmZywgJnNfdnBUZG1XYkNmZyk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlZwX1NldEV4dEF1ZGlvQ2ZnKCZzX3ZwRXh0STJzTmJDZmcsJnNfdnBFeHRJMnNXYkNmZywmc192cFRkbU5iQ2ZnLCZzX3ZwVGRtV2JDZmdfY29kZWMpOw0KLQkJCS8vekRydlZwX1NldEV4dEF1ZGlvQ2ZnKCZzX3ZwRXh0STJzTmJDZmcsJnNfdnBFeHRJMnNXYkNmZywmc192cFRkbU5iQ2ZnLCZzX3ZwVGRtV2JDZmcpOw0KLQkJfQ0KLQkJLyprbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JCS8qaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfSovDQotCQlpZiAoYXVkaW9udmZsYWcuaXNDbG9zZVZwQnVmZmVyQmFrICE9IDEpDQotCQl7DQotI2lmbmRlZiBBVURJT19VU0VfRklYRURfQUREUkVTUw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBPcGVuIFZwSW5vdXREYXRhIGJhY2t1cCEgXG4iKTsNCi0vKg0KLQkJCXZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIgPSAoVUlOVDgqKXpPc3NfTWFsbG9jKFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSk7DQotCQkJdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhJbkJ1ZmZlciA9IChVSU5UOCopek9zc19NYWxsb2MoVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFKTsNCi0JCQl2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlciA9IChVSU5UOCopek9zc19NYWxsb2MoVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFKTsNCi0JCQl2cEluT3V0QnVmZmVyLnBfdm9pY2VUeE91dFB1dEJ1ZmZlciA9IChVSU5UOCopek9zc19NYWxsb2MoVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFKTsNCi0JCQlpZiAoKHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIgPT0gTlVMTCkgfHwgKHZwSW5PdXRCdWZmZXIucF92b2ljZVR4SW5CdWZmZXIgPT0gTlVMTCkgfHwgXA0KLQkJCSAgICAgICAgKHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4T3V0UHV0QnVmZmVyID09IE5VTEwpIHx8ICh2cEluT3V0QnVmZmVyLnBfdm9pY2VUeE91dFB1dEJ1ZmZlciA9PSBOVUxMKSkNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBtYWxsb2MgYXVkaW8gYnVmZmVyIGZhaWwgISBcbiIpOw0KLQkJCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJCX0NCi0qLw0KLQ0KLQkJCXZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIgPSAoVUlOVDgqKXZtYWxsb2MoVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFKTsNCi0JCQl2cEluT3V0QnVmZmVyLnBfdm9pY2VUeEluQnVmZmVyID0gKFVJTlQ4Kil2bWFsbG9jKFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSk7DQotI2lmZGVmIF9VU0VfVlBfT1VUUFVUX1JYT1VUX0RBVEENCi0JCQl2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlciA9IChVSU5UOCopdm1hbGxvYyhWUF9JTk9VVF9CQUtfQlVGRkVSX1NJWkUpOw0KLSNlbHNlDQotCQkJdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhPdXRQdXRCdWZmZXIgPSAoVUlOVDgqKXZtYWxsb2MoVlBfSU5PVVRfTk9CQUtfQlVGU0laRSk7DQotI2VuZGlmDQotCQkJdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIgPSAoVUlOVDgqKXZtYWxsb2MoVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFKTsNCi0JCQlpZiAoKHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIgPT0gTlVMTCkgfHwgKHZwSW5PdXRCdWZmZXIucF92b2ljZVR4SW5CdWZmZXIgPT0gTlVMTCkgfHwgXA0KLQkJCSAgICAgICAgKHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4T3V0UHV0QnVmZmVyID09IE5VTEwpIHx8ICh2cEluT3V0QnVmZmVyLnBfdm9pY2VUeE91dFB1dEJ1ZmZlciA9PSBOVUxMKSkNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBtYWxsb2MgYXVkaW8gYnVmZmVyIGZhaWwgISBcbiIpOw0KLQkJCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJCX0NCi0JCQkJCQkNCi0jZW5kaWYNCi0JCQl6RHJ2VnBfU2V0SW5PdXRCdWZmZXJBZGRTaXplKCZ2cEluT3V0QnVmZmVyLCBWUF9JTk9VVF9CQUtfQlVGRkVSX1NJWkUpOw0KLSAgICAgICAgICAgICAgICAgICAgICNpZiAwDQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotCQkJfQ0KLQkJCSNlbmRpZg0KLQ0KLSNpZiAwDQotICAgICAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTAsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFJYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotCQkJcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTIsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFRYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotCQkJcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTMsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBUWE9VVCByZWdpc3RlciB6Q2F0QWd0X0F1ZGlvX1JlZyBlcnJcbiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0jaWZkZWYgX1VTRV9WUF9PVVRQVVRfUlhPVVRfREFUQQ0KLQkJCXJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDExLCBWUF9JTk9VVF9CQUtfQlVGRkVSX1NJWkUsIChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBSWE9VVCByZWdpc3RlciB6Q2F0QWd0X0F1ZGlvX1JlZyBlcnJcbiIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0jZWxzZQ0KLQkJCXJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDExLFZQX0lOT1VUX05PQkFLX0JVRlNJWkUsKFVJTlQzMil2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFJYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSNlbmRpZg0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBDbG9zZSBWcElub3V0RGF0YSBiYWNrdXAhIFxuIik7DQotI2lmbmRlZiBBVURJT19VU0VfRklYRURfQUREUkVTUw0KLQkJCXZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIgPSAoVUlOVDgqKXpPc3NfTWFsbG9jKFZQX0lOT1VUX05PQkFLX0JVRlNJWkUpOw0KLQkJCXZwSW5PdXRCdWZmZXIucF92b2ljZVR4SW5CdWZmZXIgPSAoVUlOVDgqKXpPc3NfTWFsbG9jKFZQX0lOT1VUX05PQkFLX0JVRlNJWkUpOw0KLQkJCXZwSW5PdXRCdWZmZXIucF92b2ljZVJ4T3V0UHV0QnVmZmVyID0gKFVJTlQ4Kil6T3NzX01hbGxvYyhWUF9JTk9VVF9OT0JBS19CVUZTSVpFKTsNCi0JCQl2cEluT3V0QnVmZmVyLnBfdm9pY2VUeE91dFB1dEJ1ZmZlciA9IChVSU5UOCopek9zc19NYWxsb2MoVlBfSU5PVVRfTk9CQUtfQlVGU0laRSk7DQotCQkJaWYgKCh2cEluT3V0QnVmZmVyLnBfdm9pY2VSeEluQnVmZmVyID09IE5VTEwpIHx8ICh2cEluT3V0QnVmZmVyLnBfdm9pY2VUeEluQnVmZmVyID09IE5VTEwpIHx8IFwNCi0JCQkgICAgICAgICh2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlciA9PSBOVUxMKSB8fCAodnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIgPT0gTlVMTCkpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZvaWNlQ29uZmlnX0luaXQgbWFsbG9jIGF1ZGlvIGJ1ZmZlciBmYWlsICEgXG4iKTsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotI2VuZGlmDQotCQkJekRydlZwX1NldEluT3V0QnVmZmVyQWRkU2l6ZSgmdnBJbk91dEJ1ZmZlciwgVlBfSU5PVVRfTk9CQUtfQlVGU0laRSk7DQotCQkJI2lmIDANCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotCQkJI2VuZGlmDQotCQl9DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidm9pY2VSeEluQnVmZmVyPTB4JXBcbiIsIHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIpOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZvaWNlVHhJbkJ1ZmZlcj0weCVwXG4iLCB2cEluT3V0QnVmZmVyLnBfdm9pY2VUeEluQnVmZmVyKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZVJ4T3V0QnVmZmVyPTB4JXBcbiIsIHZwSW5PdXRCdWZmZXIucF92b2ljZVJ4T3V0UHV0QnVmZmVyKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZVR4T3V0QnVmZmVyPTB4JXBcbiIsIHZwSW5PdXRCdWZmZXIucF92b2ljZVR4T3V0UHV0QnVmZmVyKTsNCi0NCi0JCS8vbm9ybWFsIHZlcnNpb24gbmVlZCBlbmFibGUNCi0JCXJldCA9IHpEcnZWcF9Jbml0KCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgekRydlZvaWNlQ29uZmlnX0luaXQgekRydlZwX0luaXQgZXJyIVxuIik7DQotDQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0NCi0JCXpEcnZWcF9TZXRJbml0R2Fpbig3NSk7DQotLyoNCi0JCXJldCArPSB6RHJ2QXVkaW9fSW5pdGlhdGUoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Jbml0IGVycm9yOiB6RHJ2QXVkaW9fSW5pdGlhdGUgZmFpbGVkIHJldD0lZCBcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JCXJldCA9IHpEcnZBdWRpb19TZXRJMnNDZmcoJnNfdnBBdWRpb0kyc0NmZyk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9CQkNCi0NCi0JCXpEcnZDb2RlY19Jbml0aWF0ZSgpOw0KLSovDQotI2lmZGVmIF9VU0VfRUFSUElFQ0VfRlVOQ01PVURMRQ0KLQkJcmV0ID0gekRydkVhcnBfSW5pdGlhdGUoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Jbml0IGVycm9yOiB6RHJ2RWFycF9Jbml0aWF0ZSBmYWlsZWQgcmV0PSVkIFxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLSNlbmRpZg0KLQ0KLQkJLy90ZXN0bnhwX2luaXQoKTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgekRydlZvaWNlQ29uZmlnX0luaXQgc3RhcnQgIEVORCFcbiIpOw0KLQkJLy96RHJ2Vm9sdGVfTG9vcFN0YXJ0KCk7DQotCQkvL3pEcnZWcF9Mb29wU3RhcnQoVlBfUEFUSF9TUEVBS0VSKTsNCi0JCQ0KLSNpZiAxDQotICAgICAgICBpZiAoYXVkaW9udmZsYWcuaXNDbG9zZVZwQnVmZmVyQmFrICE9IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTAsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFJYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTIsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFRYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTMsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBUWE9VVCByZWdpc3RlciB6Q2F0QWd0X0F1ZGlvX1JlZyBlcnJcbiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0jaWZkZWYgX1VTRV9WUF9PVVRQVVRfUlhPVVRfREFUQQ0KLSAgICAgICAgICAgIHJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDExLCBWUF9JTk9VVF9CQUtfQlVGRkVSX1NJWkUsIChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfSW5pdCBSWE9VVCByZWdpc3RlciB6Q2F0QWd0X0F1ZGlvX1JlZyBlcnJcbiIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0jZWxzZQ0KLSAgICAgICAgICAgIHJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDExLFZQX0lOT1VUX05PQkFLX0JVRlNJWkUsKFVJTlQzMil2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2ljZUNvbmZpZ19Jbml0IFJYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSNlbmRpZg0KLSAgICAgICAgfQ0KLQ0KLQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBudiBjbG9zZSB6RHJ2Vm9pY2VDb25maWdJbml0ICAhXG4iKTsNCi0JCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0JfQ0KLQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiB6RHJ2QXVkaW9Db25maWdfSW5pdA0KLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIHRvIEluaXRpYWxpemluZyBhdWRpbyByZWxhdGVkIGNvbmZpZ3VyYXRpb24NCi0gKiBQYXJhbWV0ZXJzOg0KLSAqICAgSW5wdXQ6Tm9uZQ0KLSAqICAgT3V0cHV0Ok5vbmUNCi0gKg0KLSAqIFJldHVybnM6IHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQ0KLSAqDQotICoNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZiAwDQotU0lOVDMyIHpEcnZBdWRpb0NvbmZpZ19Jbml0KFZPSUQpDQotew0KLQlTSU5UMzIJcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2QXVkaW9Db25maWdfSW5pdCBcbiIpOw0KLQl6RHJ2VnBDZmdfU2V0T3BlcmF0aW9ucygmc192cENmZ09iak9wdCk7DQotDQotCXJldCA9IHpEcnZJMlNfSW5pdCgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19fSW5pdCBlcnJvci5cbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQl2cF9TZXRUb3BDb25maWcoKTsNCi0NCi0JLy92cF9TZXRUb3BJMnNDb25maWcoKTsNCi0NCi0JekRydkNvZGVjX0luaXRpYXRlKCk7DQotCXJldCA9IHpEcnZBdWRpb19Jbml0aWF0ZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgZXJyb3I6IHpEcnZBdWRpb19Jbml0aWF0ZSBmYWlsZWQgcmV0PSVkIFxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JcmV0ID0gekRydkF1ZGlvX1NldEkyc0NmZygmc192cEF1ZGlvSTJzQ2ZnKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLQ0KLQ0KLS8vb3V0cHV0IDI2TUhaDQotU0lOVDMyIHpEcnZJMlNfc2V0Q29kZWNDbGsoVk9JRCkNCi17DQotICAgIC8vVUlOVDMyIEFtclJlZ0JpdCA9IDA7DQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX1BIT05FKXx8IGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX0ZXUCkNCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiY29kZWNfcmVmY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBBVURJT19DT0RFQ19DTEtfR1BJT19GVU5DX1NFTCk7Ly8yNk1IWiBHUElPMTVfQ0xLX09VVDANCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfc2V0Q29kZWNDbGsgMjZNIVxuIik7DQotI2VuZGlmDQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogaGFsQXVkaW9Db25maWdfT3BlbkJlZ2luDQotICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byAgdm9pY2UgY29uZmlnIGluIHRoZSBiZWdpbm5pbmcgdm9pY2Ugb3Blbg0KLSAqIFBhcmFtZXRlcnM6DQotICogICBJbnB1dDpOb25lDQotICogICBPdXRwdXQ6Tm9uZQ0KLSAqDQotICogUmV0dXJuczogc3VjY2VzcyBvciBlcnJvciBjb2RlDQotICoNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX09wZW4oVF9aRHJ2VnBfU291cmNlVHlwZSBzcmN0eXBlKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JVF96RHJ2Vm9pY2VfR2JWYXIgKnBfdm9pY2VWYXIgPSBOVUxMOw0KLQlVSU5UMzIgYXJtUmVnQml0ID0gMDsNCi0JVF9aRHJ2STJTX0NmZyAqcF92cEV4dEkyc0NmZyA9IE5VTEw7DQotCXNfdXNlUHJvdG9jYWwuYXVkSTJTQ2hhbm5lbCA9IEFVRElPX0kyUzA7DQotDQotCWlmIChzcmN0eXBlID09IFZQX1ZPSUNFX1NPVVJDRSkNCi0Jew0KLQkJY29kZWNTcmNUeXBlID0gVk9JQ0VfU09VUkNFOw0KLQkJLy9leHQgaTJzIE5CIGFuZCBXQiwgYWx3YXlzIHRoZSBzYW1lIGNmZw0KLQkJcF92cEV4dEkyc0NmZyA9ICZzX3ZwRXh0STJzTmJDZmc7DQotCX0NCi0JZWxzZSBpZiAoc3JjdHlwZSA9PSBWUF9BVURJT19TT1VSQ0UpDQotCXsNCi0JCWNvZGVjU3JjVHlwZSA9IEFVRElPX1NPVVJDRTsNCi0JCXBfdnBFeHRJMnNDZmcgPSAmc192cEF1ZGlvSTJzQ2ZnOw0KLQl9DQotCWVsc2UgaWYgKHNyY3R5cGUgPT0gVlBfRk1fU09VUkNFKQ0KLQl7DQotCQljb2RlY1NyY1R5cGUgPSBFWFRFUk5fQVVESU87DQotCQlwX3ZwRXh0STJzQ2ZnID0gJnNfdnBGbUkyc0NmZzsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgaGFsQXVkaW9Db25maWdfT3BlbiBzcmN0eXBlPSVkIG5vdCBzdXBwb3J0ICAhXG4iLCBzcmN0eXBlKTsNCi0JCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0JfQ0KLQ0KLQlpZiAoc3JjdHlwZSA9PSBWUF9WT0lDRV9TT1VSQ0UpDQotCXsNCi0JCWlmIChzX3ZwSW5uZXJJMnNDZmcudENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkNCi0JCXsNCi0JCQl2cF9TZXRJbm5lckkyc01vZGUoVFJVRSk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdnBfU2V0SW5uZXJJMnNNb2RlKEZBTFNFKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvL2V4dCBpMnMgTkIgYW5kIFdCLCBhbHdheXMgdGhlIHNhbWUgY2ZnDQotCWlmIChwX3ZwRXh0STJzQ2ZnLT5iTWFzdGVyID09IFRSVUUpDQotCXsNCi0JCXNfdXNlUHJvdG9jYWwubWFzdGVyU2xhdmUgPSBJMlNfU0xBVkVfTU9ERTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgaGFsQXVkaW9Db25maWdfT3BlbiBjZmcgY29kZWMgSTJTX1NMQVZFX01PREUhXG4iKTsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXNfdXNlUHJvdG9jYWwubWFzdGVyU2xhdmUgPSBJMlNfTUFTVEVSX01PREU7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGhhbEF1ZGlvQ29uZmlnX09wZW4gY2ZnIGNvZGVjIEkyU19NQVNURVJfTU9ERSFcbiIpOw0KLQl9DQotDQotCWlmIChwX3ZwRXh0STJzQ2ZnLT50Q2xrTW9kZSA9PSBJMlNfVElNRV9NT0RFKQ0KLQl7DQotCQlzX3VzZVByb3RvY2FsLmJ1c01vZGUgPSBDT0RFQ19CVVNfSTJTOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBoYWxBdWRpb0NvbmZpZ19PcGVuIGNmZyBjb2RlYyBDT0RFQ19CVVNfSTJzIVxuIik7DQotCX0NCi0JZWxzZSBpZiAocF92cEV4dEkyc0NmZy0+dENsa01vZGUgPT0gUENNX1RJTUVfTU9ERSkNCi0Jew0KLQkJc191c2VQcm90b2NhbC5idXNNb2RlID0gQ09ERUNfQlVTX0RTUDsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgaGFsQXVkaW9Db25maWdfT3BlbiBjZmcgY29kZWMgQ09ERUNfQlVTX0RTUCFcbiIpOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBoYWxBdWRpb0NvbmZpZ19PcGVuIHRDbGtNb2RlPSVkIG5vdCBzdXBwb3J0IVxuIiwgcF92cEV4dEkyc0NmZy0+dENsa01vZGUpOw0KLQl9DQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX01ETCkgfHwgZGVmaW5lZChfVVNFX1JFRl9BVURJT19PTl83NTIwVjNfRldQKQ0KLQ0KLQlhcm1SZWdCaXQgPSBBT05fV0lGSV9CVF9DTEtfQ0ZHMjsNCi0JYXJtUmVnQml0ICY9IDB4ZmZmZmZmZmU7DQotCWFybVJlZ0JpdCB8PSAweDE7DQotCUFPTl9XSUZJX0JUX0NMS19DRkcyID0gYXJtUmVnQml0Ow0KLSNlbmRpZg0KLQkvLyBvcGVuIDI2bWh6IENMSyAgZm9yIGNvZGVjDQotCXJldCA9IHpEcnZJMlNfc2V0Q29kZWNDbGsoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImNvZGVjIHNldCByZWZjbGsgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQl9DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjb2RlYyBzZXQgcmVmY2xrICAhXG4iKTsNCi0NCi0JcmV0ID0gekRydkNvZGVjX09wZW4oJmdDb2RlY0hhbmRsZSwgY29kZWNTcmNUeXBlKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZDb2RlY19PcGVuIGVyciByZXQ9MHgleCAhXG4iLCByZXQpOw0KLQkJLy96RHJ2Q29kZWNfQ2xvc2UoJmdDb2RlY0hhbmRsZSk7DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotDQotI2lmICFkZWZpbmVkKF9VU0VfUkVGX0FVRElPX09OXzc1MjBWMikgfHwgIWRlZmluZWQoX0NPTkZJR19VU0VfQ09ERUNfRUFSUElFQ0VfREVURUNUKSAgDQotCXJldCA9IHpEcnZDb2RlY19SZXNldChnQ29kZWNIYW5kbGUpOyAgICAgLy8gazMxNSBub3QgdXNlDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfUmVzZXQgZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJekRydkNvZGVjX0Nsb3NlKCZnQ29kZWNIYW5kbGUpOw0KLQkJZ290byBlcnJfZXhpdDsNCi0JfQ0KLSNlbmRpZg0KLQ0KLQl6T3NzX1NsZWVwKDEpOw0KLQ0KLQlyZXQgPSB6RHJ2VnBfR2V0Vm9pY2VTdGF0ZSgmcF92b2ljZVZhcik7DQotCWlmICgocmV0ICE9IERSVl9TVUNDRVNTKSB8fCAocF92b2ljZVZhciA9PSBOVUxMKSkNCi0Jew0KLQkJekRydkNvZGVjX0Nsb3NlKCZnQ29kZWNIYW5kbGUpOw0KLQkJZ290byBlcnJfZXhpdDsNCi0JfQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfT3BlbiAgcF92b2ljZVZhciA9IDB4JXghXG4iLCBwX3ZvaWNlVmFyKTsNCi0JcF92b2ljZVZhci0+bXV0ZUVuID0gRkFMU0U7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19PcGVuICBjbGVhciBtdXRlIGZsYWcgIVxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsJDQotZXJyX2V4aXQ6DQotCSNpZiBkZWZpbmVkKF9VU0VfUkVGX0FVRElPX09OXzc1MjBWM19NREwpIHx8IGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX0ZXUCkNCi0JCWFybVJlZ0JpdCA9IEFPTl9XSUZJX0JUX0NMS19DRkcyOw0KLQkJYXJtUmVnQml0ICY9IDB4ZmZmZmZmZmU7DQotCQlhcm1SZWdCaXQgfD0gMHgwOw0KLQkJQU9OX1dJRklfQlRfQ0xLX0NGRzIgPSBhcm1SZWdCaXQ7DQotCSNlbmRpZg0KLSNlbmRpZg0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiB6RHJ2Vm9pY2VDb25maWdfQ2xvc2UNCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvICB2b2ljZSBjb25maWcgQ2xvc2UuDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Ok5vbmUNCi0gKiAgIE91dHB1dDpOb25lDQotICoNCi0gKiBSZXR1cm5zOiBzdWNjZXNzIG9yIGVycm9yIGNvZGUNCi0gKg0KLSAqDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfQ2xvc2UoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotCVRfekRydlZvaWNlX0diVmFyICpwX3ZvaWNlVmFyID0gTlVMTDsNCi0NCi0JVUlOVDMyIGFybVJlZ0JpdCA9IDA7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19DbG9zZSBzdGFydCFcbiIpOw0KLSNpZiAhZGVmaW5lZChfVVNFX1JFRl9BVURJT19PTl83NTIwVjIpIHx8ICFkZWZpbmVkKF9DT05GSUdfVVNFX0NPREVDX0VBUlBJRUNFX0RFVEVDVCkNCi0JcmV0ID0gekRydkNvZGVjX1Jlc2V0KGdDb2RlY0hhbmRsZSk7ICAvLyBrMzE1IG5vdCB1c2UNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0Nsb3NlIHpEcnZDb2RlY19SZXNldCBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCX0NCi0jZW5kaWYNCi0NCi0JcmV0ICs9IHpEcnZDb2RlY19DbG9zZSgmZ0NvZGVjSGFuZGxlKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0Nsb3NlIHpEcnZDb2RlY19DbG9zZSBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCX0NCi0NCi0JcmV0ID0gekRydlZwX0dldFZvaWNlU3RhdGUoJnBfdm9pY2VWYXIpOw0KLQlpZiAoKHJldCAhPSBEUlZfU1VDQ0VTUykgfHwgKHBfdm9pY2VWYXIgPT0gTlVMTCkpDQotCXsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JaWYgKHBfdm9pY2VWYXItPm11dGVFbiA9PSBUUlVFKQ0KLQl7DQotCQlwX3ZvaWNlVmFyLT5tdXRlRW4gPSBGQUxTRTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19DbG9zZSAgY2xlYXIgbXV0ZSBmbGFnICFcbiIpOw0KLQl9DQotDQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYyKSAmJiBkZWZpbmVkKF9DT05GSUdfVVNFX0NPREVDX0VBUlBJRUNFX0RFVEVDVCkNCi0JaGFsUmN2QW5kRWFycFN3aXRjaChWUF9QQVRIX0hBTkRTRVQpOw0KLQloYWxTcGtQYVN3aXRjaChWUF9QQVRIX0hBTkRTRVQpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfQ2xvc2Ugc19pc0NsYXNza09wZW5lZD0weCV4ICFcbiIsIHNfaXNDbGFzc2tPcGVuZWQpOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBfVVNFX1JFRl9BVURJT19PTl83NTIwVjNfUEhPTkUNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW9Db2RlY0VuSGFuZGxlLCBBVURJT19DT0RFQ19FTl9HUElPX0ZVTkNfU0VMKTsNCi0JekRydkdwaW9fU2V0RGlyZWN0aW9uKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEdQSU9fT1VUKTsNCi0JekRydkdwaW9fU2V0T3V0cHV0VmFsdWUoYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgR1BJT19ISUdIKTsgLy9HUElPX0xPVw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY29kZWMgU2V0T3V0UGF0aCByZWNlaXZlciBQQSBjbG9zZSBcbiIpOw0KLSNlbmRpZg0KLSNpZiBkZWZpbmVkKF9VU0VfUkVGX0FVRElPX09OXzc1MjBWM19NREwpIHx8IGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX0ZXUCkNCi0NCi0JYXJtUmVnQml0ID0gQU9OX1dJRklfQlRfQ0xLX0NGRzI7DQotCWFybVJlZ0JpdCAmPSAweGZmZmZmZmZlOw0KLQlhcm1SZWdCaXQgfD0gMHgwOw0KLQlBT05fV0lGSV9CVF9DTEtfQ0ZHMiA9IGFybVJlZ0JpdDsNCi0NCi0jZW5kaWYNCi0NCi0JZ0NvZGVjSGFuZGxlID0gMDsNCi0NCi0jZW5kaWYNCi0NCi0JcmV0dXJuIHJldDsNCi0NCi19DQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldE91dHB1dFBhdGgoVF9aRHJ2X1ZwUGF0aCBwYXRoLCBCT09MIGVuYWJsZSkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotCS8vVF9aRHJ2Q29kZWNfT3V0RGV2aWNlIG91dGRldiA9IEFVRElPX09VVFBVVF9IRUFEU0VUOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0UGF0aCBwYXRoPSVkICFcbiIsIHBhdGgpOw0KLQ0KLQ0KLQlpZiAocGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpDQotCXsNCi0JCXNfb3V0RGV2ID0gQVVESU9fT1VUUFVUX1JFQ0VJVkVSOw0KLQl9DQotCWVsc2UgaWYgKHBhdGggPT0gVlBfUEFUSF9TUEVBS0VSKQ0KLQl7DQotCQlzX291dERldiA9IEFVRElPX09VVFBVVF9TUEVBS0VSOw0KLQl9DQotCWVsc2UgaWYgKHBhdGggPT0gVlBfUEFUSF9IRUFEU0VUKQ0KLQl7DQotCQlzX291dERldiA9IEFVRElPX09VVFBVVF9IRUFEU0VUOw0KLQl9DQotCWVsc2UgaWYgKHBhdGggPT0gVlBfUEFUSF9IU0FORFNQSykNCi0Jew0KLQkJc19vdXREZXYgPSBBVURJT19PVVRQVVRfSEVBRFNFVF9TUEVBS0VSOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldE91dHB1dFBhdGggdGhlIHBhdGggbm90IHN1cHBvcnQgcGF0aD0lZCAhXG4iLCBwYXRoKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0NCi0JcmV0ID0gekRydkNvZGVjX1NldE91dFBhdGgoZ0NvZGVjSGFuZGxlLCBzX291dERldiwgZW5hYmxlKTsNCi0JaWYgKHJldCAhPSAgRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfU2V0T3V0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYyKSAmJiBkZWZpbmVkKF9DT05GSUdfVVNFX0NPREVDX0VBUlBJRUNFX0RFVEVDVCkNCi0JaWYgKGVuYWJsZSA9PSBUUlVFKQ0KLQl7DQotCQloYWxSY3ZBbmRFYXJwU3dpdGNoKHBhdGgpOw0KLQkJaGFsU3BrUGFTd2l0Y2gocGF0aCk7DQotCX0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX1VTRV9SRUZfQVVESU9fT05fNzUyMFYzX1BIT05FDQotCWlmICgocGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpICYmIChlbmFibGUgPT0gVFJVRSkpDQotCXsNCi0JCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgQVVESU9fQ09ERUNfRU5fR1BJT19GVU5DX1NFTCk7DQotCQl6RHJ2R3Bpb19TZXREaXJlY3Rpb24oYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgR1BJT19PVVQpOw0KLQkJekRydkdwaW9fU2V0T3V0cHV0VmFsdWUoYXVkaW9HcGlvQ29kZWNFbkhhbmRsZSwgR1BJT19MT1cpOyAvL0dQSU9fTE9XDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY29kZWMgU2V0T3V0UGF0aCByZWNlaXZlciBQQSBvcGVuIFxuIik7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEFVRElPX0NPREVDX0VOX0dQSU9fRlVOQ19TRUwpOw0KLQkJekRydkdwaW9fU2V0RGlyZWN0aW9uKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEdQSU9fT1VUKTsNCi0JCXpEcnZHcGlvX1NldE91dHB1dFZhbHVlKGF1ZGlvR3Bpb0NvZGVjRW5IYW5kbGUsIEdQSU9fSElHSCk7IC8vR1BJT19ISUdIDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY29kZWMgU2V0T3V0UGF0aCByZWNlaXZlciBQQSBjbG9zZSBcbiIpOw0KLQl9DQotI2VuZGlmDQotDQotI2VuZGlmDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogekRydlZvaWNlQ29uZmlnX0VuYWJsZQ0KLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gRW5hYmxlIHZvaWNlIGNvbmZpZw0KLSAqIFBhcmFtZXRlcnM6DQotICogICBJbnB1dDpOb25lDQotICogICBPdXRwdXQ6Tm9uZQ0KLSAqDQotICogUmV0dXJuczogc3VjY2VzcyBvciBlcnJvciBjb2RlDQotICoNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0VuYWJsZShWT0lEKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0NCi0JcmV0ID0gekRydkNvZGVjX0F1ZGlvRW5hYmxlKGdDb2RlY0hhbmRsZSk7DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19FbmFibGUgekRydkNvZGVjX0F1ZGlvRW5hYmxlIGVycm9yIHJldD0leCFcbiIsIHJldCk7DQotCQl6RHJ2Q29kZWNfQ2xvc2UoJmdDb2RlY0hhbmRsZSk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotCXJldHVybiByZXQ7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246IHpEcnZWb2ljZUNvbmZpZ19EaXNhYmxlDQotICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBEaXNhYmxlIHZvaWNlIGNvbmZpZw0KLSAqIFBhcmFtZXRlcnM6DQotICogICBJbnB1dDpOb25lDQotICogICBPdXRwdXQ6Tm9uZQ0KLSAqDQotICogUmV0dXJuczogc3VjY2VzcyBvciBlcnJvciBjb2RlDQotICoNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0Rpc2FibGUoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotCXJldCA9IHpEcnZDb2RlY19BdWRpb0Rpc2FibGUoZ0NvZGVjSGFuZGxlKTsNCi0NCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0Rpc2FibGUgekRydkNvZGVjX0F1ZGlvRGlzYWJsZSBlcnJvciByZXQ9JXghXG4iLCByZXQpOw0KLQl9DQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYyKSAmJiBkZWZpbmVkKF9DT05GSUdfVVNFX0NPREVDX0VBUlBJRUNFX0RFVEVDVCkNCi0NCi0JcmV0ID0gekRydkNvZGVjX1NldEluUGF0aChnQ29kZWNIYW5kbGUsIHNfaW5EZXYsIEZBTFNFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0Rpc2FibGUgekRydkNvZGVjX1NldEluUGF0aCBlcnJvciByZXQ9JXghXG4iLCByZXQpOw0KLQl9DQotCXJldCArPSB6RHJ2Q29kZWNfU2V0T3V0UGF0aChnQ29kZWNIYW5kbGUsIHNfb3V0RGV2LCBGQUxTRSk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19EaXNhYmxlIHpEcnZDb2RlY19TZXRPdXRQYXRoIGVycm9yIHJldD0leCFcbiIsIHJldCk7DQotCX0NCi0jZW5kaWYNCi0NCi0jZW5kaWYNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogekRydlZvaWNlQ29uZmlnX1NldEZzDQotICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byAgU2V0IEZzLg0KLSAqIFBhcmFtZXRlcnM6DQotICogICBJbnB1dDpOb25lDQotICogICBPdXRwdXQ6Tm9uZQ0KLSAqDQotICogUmV0dXJuczogc3VjY2VzcyBvciBlcnJvciBjb2RlDQotICoNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldEZzKFRfWkRydl9WcEZzIGZzKQ0KLXsNCi0NCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldEZzIGZzPSVkICFcbiIsIGZzKTsNCi0JaWYgKGZzID09IFZQX0ZTXzgwMDApDQotCXsNCi0JCVNhbXBsZV9GcyA9IEFVRElPX1NBTVBMRV84SzsNCi0JfQ0KLQllbHNlIGlmIChmcyA9PSBWUF9GU18xNjAwMCkNCi0Jew0KLQkJU2FtcGxlX0ZzID0gQVVESU9fU0FNUExFXzE2SzsNCi0JfQ0KLQllbHNlIGlmIChmcyA9PSBWUF9GU18zMjAwMCkNCi0Jew0KLQkJU2FtcGxlX0ZzID0gQVVESU9fU0FNUExFXzMySzsNCi0JfQ0KLQllbHNlIGlmIChmcyA9PSBWUF9GU180NDEwMCkNCi0Jew0KLQkJU2FtcGxlX0ZzID0gQVVESU9fU0FNUExFXzQ0XzFLOw0KLQl9DQotCWVsc2UgaWYgKGZzID09IFZQX0ZTXzQ4MDAwKQ0KLQl7DQotCQlTYW1wbGVfRnMgPSBBVURJT19TQU1QTEVfNDhLOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldEZzIHRoZSBmcyBub3Qgc3VwcG9ydCAgIVxuIik7DQotCQl6RHJ2Q29kZWNfQ2xvc2UoJmdDb2RlY0hhbmRsZSk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldCA9IHpEcnZDb2RlY19TZXRDbG9jayhnQ29kZWNIYW5kbGUsIFNhbXBsZV9Gcyk7DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfU2V0Q2xvY2sgZXJyIHJldD0weCV4ICFcbiIsIHJldCk7DQotCQl6RHJ2Q29kZWNfQ2xvc2UoJmdDb2RlY0hhbmRsZSk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCWlmIChjb2RlY1NyY1R5cGUgPT0gQVVESU9fU09VUkNFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0RnMgekRydkNvZGVjX1NldE91dF9IcGYgZnM9JWQgIVxuIiwgZnMpOw0KLQkJcmV0ID0gekRydkNvZGVjX1NldE91dF9IcGYoZ0NvZGVjSGFuZGxlLCBTYW1wbGVfRnMsIDEpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkNvZGVjX1NldE91dF9IcGYgZXJyIHJldD0weCV4ICFcbiIsIHJldCk7DQotCQkJekRydkNvZGVjX0Nsb3NlKCZnQ29kZWNIYW5kbGUpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCX0NCi0NCi0JLy9yZXQgKz0gekRydkNvZGVjX1NldFByb3RvY2FsIChnQ29kZWNIYW5kbGUsIEFVRElPX0kyUzEsIEkyU19TTEFWRV9NT0RFKTsNCi0JaWYgKGNvZGVjU3JjVHlwZSA9PSBWT0lDRV9TT1VSQ0UpDQotCXsNCi0JCXJldCA9IHpEcnZDb2RlY19TZXRQcm90KGdDb2RlY0hhbmRsZSwgc191c2VQcm90b2NhbCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfU2V0UHJvdG9jYWwgZXJyIHJldD0weCV4ICFcbiIsIHJldCk7DQotCQkJekRydkNvZGVjX0Nsb3NlKCZnQ29kZWNIYW5kbGUpOw0KLQkJCXJldHVybiByZXQ7DQotCQl9DQotCX0NCi0NCi0jZW5kaWYNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldElucHV0UGF0aChUX1pEcnZfVnBQYXRoIHBhdGgsIEJPT0wgZW5hYmxlKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JLy9UX1pEcnZDb2RlY19JbkRldmljZSBpbmRldiA9IEFVRElPX0lOUFVUX0hFQURTRVQ7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19TZXRJbnB1dFBhdGggcGF0aD0lZCAhXG4iLCBwYXRoKTsNCi0NCi0JaWYgKHBhdGggPT0gVlBfUEFUSF9IQU5EU0VUKQ0KLQl7DQotCQlzX2luRGV2ID0gQVVESU9fSU5QVVRfSEFORFNFVDsNCi0JfQ0KLQllbHNlIGlmIChwYXRoID09IFZQX1BBVEhfU1BFQUtFUikNCi0Jew0KLQkJc19pbkRldiA9IEFVRElPX0lOUFVUX1NQRUFLRVI7DQotCX0NCi0JZWxzZSBpZiAocGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpDQotCXsNCi0JCXNfaW5EZXYgPSBBVURJT19JTlBVVF9IRUFEU0VUOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldElucHV0UGF0aCB0aGUgcGF0aCBub3Qgc3VwcG9ydCBwYXRoPSVkICFcbiIsIHBhdGgpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlyZXQgPSB6RHJ2Q29kZWNfU2V0SW5QYXRoKGdDb2RlY0hhbmRsZSwgc19pbkRldiwgZW5hYmxlKTsNCi0NCi0jaWYgIWRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYyKSB8fCAhZGVmaW5lZChfQ09ORklHX1VTRV9DT0RFQ19FQVJQSUVDRV9ERVRFQ1QpDQotCWlmIChlbmFibGUgPT0gVFJVRSkNCi0Jew0KLQkJcmV0ICs9IHpEcnZDb2RlY19TZXRNaWNCaWFzKGdDb2RlY0hhbmRsZSwgTUlDQklBU19PVVRfMl81Vik7ICAgIC8vIGszMTUgbm90IHVzZQ0KLQl9DQotDQotI2VuZGlmDQotDQotCWlmIChyZXQgIT0gIERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkNvZGVjX1NldEluUGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2lmIDANCi0JcmV0ID0gekRydkNvZGVjX1NldF9JbnBhdGhfRGlnX1ZvbChnQ29kZWNIYW5kbGUsIENPREVDX0lOUEFUSF9ESUdfR0FJTl9QTFVTXzE1REIpOw0KLQlpZiAocmV0ICE9ICBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZDb2RlY19TZXRfSW5wYXRoX0RpZ19Wb2wgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQ0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLSNlbmRpZg0KLQ0KLSNlbmRpZg0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19TZXRNdXRlKFRfWkRydl9WcFBhdGggcGF0aCwgQk9PTCBtdXRlKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JcmV0ID0gekRydkNvZGVjX1NldE91dHBhdGhNdXRlKGdDb2RlY0hhbmRsZSwgbXV0ZSk7DQotCWlmIChyZXQgIT0JRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19TZXRNdXRlIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JfQ0KLSNlbmRpZg0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0Rm1QYXRoKFRfWkRydl9WcFBhdGggcGF0aCwgQk9PTCBlbmFibGUpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSNpZmRlZiBfQ09ORklHX1VTRV9DT0RFQw0KLSAgICAvL1RfWkRydkNvZGVjX1NvdXJjZVR5cGUgY29kZWNTcmNUeXBlID0gRVhURVJOX0FVRElPOy8veGl1DQotCVRfWkRydkNvZGVjX0luRGV2aWNlIGluZGV2Ow0KLQlUX1pEcnZDb2RlY19PdXREZXZpY2Ugb3V0ZGV2IDsNCi0NCi0JaWYgKHBhdGggPT0gVlBfUEFUSF9IRUFEU0VUKQ0KLQl7DQotCQlpbmRldiA9IEFVRElPX0lOUFVUX0ZNX0FOQVRPQU5BOw0KLQkJb3V0ZGV2ID0gQVVESU9fT1VUUFVUX0ZNX0FOQVRPQU5BX0hFQURTRVQ7DQotCQkvL3NldCBjb2RlYyAgdnNwa2VyIGxkbyBlbg0KLQ0KLQl9DQotCWVsc2UgaWYgKHBhdGggPT0gVlBfUEFUSF9TUEVBS0VSKQ0KLQl7DQotCQlpbmRldiA9IEFVRElPX0lOUFVUX0ZNX0FOQVRPQU5BOw0KLQkJb3V0ZGV2ID0gQVVESU9fT1VUUFVUX0ZNX0FOQVRPQU5BX1NQRUFLRVI7DQotCQkvL3NldCBjb2RlYyAgdnNwa2VyIGxkbyBlbg0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldEZtUGF0aCB0aGUgaW5wdXQgcGF0aCBub3Qgc3VwcG9ydCBwYXRoPSVkICFcbiIsIHBhdGgpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGhhbEF1ZGlvQ29uZmlnX1NldEZtUGF0aCAgIVxuIik7DQotCWlmIChlbmFibGUgPT0gVFJVRSkNCi0Jew0KLQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldEZtUGF0aCBlbmFibGUgcGF0aD0lZCxlbmFibGU9JWQhXG4iLCBwYXRoLCBlbmFibGUpOw0KLQkJaWYgKHNfaXNGbU9wZW5lZCA9PSBGQUxTRSkNCi0JCXsNCi0JCQlyZXQgPSBoYWxBdWRpb0NvbmZpZ19PcGVuKFZQX0ZNX1NPVVJDRSk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfT3BlbiBlcnIgcmV0PTB4JXggIVxuIiwgcmV0KTsNCi0JCQkJLy8gekRydkNvZGVjX0Nsb3NlKCZnQ29kZWNIYW5kbGUpOw0KLQ0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCX0NCi0jaWYgMA0KLQkJCXJldCArPSB6RHJ2Q29kZWNfUmVzZXQoZ0NvZGVjSGFuZGxlKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZDb2RlY19SZXNldCBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQkJCXpEcnZDb2RlY19DbG9zZSgmZ0NvZGVjSGFuZGxlKTsNCi0NCi0JCQkJcmV0dXJuIHJldDsNCi0JCQl9DQotI2VuZGlmDQotCQl9DQotCQkNCi0jaWYgZGVmaW5lZChfVVNFX1JFRl9BVURJT19PTl83NTIwVjIpICYmIGRlZmluZWQoX0NPTkZJR19VU0VfQ09ERUNfRUFSUElFQ0VfREVURUNUKQ0KLQkJaGFsUmN2QW5kRWFycFN3aXRjaChwYXRoKTsNCi0JCWhhbFNwa1BhU3dpdGNoKHBhdGgpOw0KLSNlbmRpZg0KLQkJcmV0ID0gekRydkNvZGVjX1NldEluUGF0aChnQ29kZWNIYW5kbGUsIGluZGV2LCBlbmFibGUpOw0KLQ0KLQkJaWYgKHJldCAhPQlEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0Rm1QYXRoIGlucHV0IHBhdGggZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQkJCXpEcnZDb2RlY19DbG9zZSgmZ0NvZGVjSGFuZGxlKTsNCi0NCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJcmV0ID0gekRydkNvZGVjX1NldE91dFBhdGgoZ0NvZGVjSGFuZGxlLCBvdXRkZXYsIGVuYWJsZSk7DQotCQlpZiAocmV0ICE9CURSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19TZXRGbVBhdGggb3V0cHV0IHBhdGggZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQkJCXpEcnZDb2RlY19DbG9zZSgmZ0NvZGVjSGFuZGxlKTsNCi0NCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQl9DQotCWVsc2UgaWYgKHNfaXNGbU9wZW5lZCA9PSBUUlVFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0Rm1QYXRoIGRpc2FibGUgIVxuIik7DQotI2lmIGRlZmluZWQoX1VTRV9SRUZfQVVESU9fT05fNzUyMFYyKSAmJiBkZWZpbmVkKF9DT05GSUdfVVNFX0NPREVDX0VBUlBJRUNFX0RFVEVDVCkNCi0JCXJldCA9IHpEcnZDb2RlY19TZXRJblBhdGgoZ0NvZGVjSGFuZGxlLCBpbmRldiwgZW5hYmxlKTsNCi0NCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0Rpc2FibGUgekRydkNvZGVjX1NldEluUGF0aCBlcnJvciByZXQ9JXghXG4iLCByZXQpOw0KLQkJfQ0KLQkJcmV0ID0gekRydkNvZGVjX1NldE91dFBhdGgoZ0NvZGVjSGFuZGxlLCBvdXRkZXYsIGVuYWJsZSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19EaXNhYmxlIHpEcnZDb2RlY19TZXRPdXRQYXRoIGVycm9yIHJldD0leCFcbiIsIHJldCk7DQotCQl9DQotI2VuZGlmDQotDQotCQlyZXQgPSBoYWxBdWRpb0NvbmZpZ19DbG9zZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfQ2xvc2UgekRydkNvZGVjX0Nsb3NlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQlzX2lzRm1PcGVuZWQgPSBlbmFibGU7DQotDQotI2VuZGlmDQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1NldExvb3BiYWNrKEJPT0wgZW5hYmxlKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JcmV0ID0gekRydkNvZGVjX1NldExvb3BCYWNrKGdDb2RlY0hhbmRsZSwgZW5hYmxlKTsNCi0JaWYgKHJldCAhPSAgRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19TZXRMb29wYmFjayBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotICAgIHJldCA9IERSVl9TVUNDRVNTOy8veGl1IHdhcm5pbmc6dW51c2VkIHJldA0KLSAgICByZXR1cm4gcmV0Oy8veGl1DQotfQ0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19TZXRJbnB1dFZvbChUX1pEcnZfVnBWb2wgdm9sKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX1NldElucHV0Vm9sIHZvbD0lZCAhXG4iLCB2b2wpOw0KLQ0KLQlyZXQgPSB6RHJ2Q29kZWNfU2V0X0lucGF0aF9EaWdfVm9sKGdDb2RlY0hhbmRsZSwgdm9sKTsNCi0NCi0JaWYgKHJldCAhPSAgRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfU2V0X0lucGF0aF9EaWdfVm9sIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0NCi0jZW5kaWYNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0NCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0Vm9sKFRfWkRydl9WcFZvbCB2b2wpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSNpZmRlZiBfQ09ORklHX1VTRV9DT0RFQw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0Vm9sIHZvbD0lZCAhXG4iLCB2b2wpOw0KLQ0KLQlyZXQgPSB6RHJ2Q29kZWNfU2V0X091dHBhdGhfRGlnX1ZvbChnQ29kZWNIYW5kbGUsIHZvbCk7DQotDQotCWlmIChyZXQgIT0gIERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfU2V0T3V0cHV0Vm9sIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0jZW5kaWYNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLQ0KLX0NCi0NCi1TSU5UMzIgaGFsQXVkaW9Db25maWdfU2V0VXNlUHJvdG9jb2woVF9aRHJ2Q29kZWNfVXNlUHJvdG9jb2wgdXNlUHJvdG9jb2wpDQotew0KLSAgICBTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSNpZmRlZiBfQ09ORklHX1VTRV9DT0RFQw0KLQl1c2VQcm90b2NvbC5hdWRJMlNDaGFubmVsID0gQVVESU9fSTJTMDsNCi0gICAgc191c2VQcm90b2NhbCA9IHVzZVByb3RvY29sOw0KLQ0KLQlpZiAoY29kZWNTcmNUeXBlICE9IFZPSUNFX1NPVVJDRSkNCi0Jew0KLQkJcmV0ID0gekRydkNvZGVjX1NldFByb3QoZ0NvZGVjSGFuZGxlLCBzX3VzZVByb3RvY2FsKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZDb2RlY19TZXRQcm90IGVyciByZXQ9MHgleCAhXG4iLCByZXQpOw0KLQkJCXpEcnZDb2RlY19DbG9zZSgmZ0NvZGVjSGFuZGxlKTsNCi0JCQlyZXR1cm4gcmV0Ow0KLQkJfQ0KLQl9DQotI2VuZGlmDQotDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiBoYWxBdWRpb0NvbmZpZ19HZXRNaXhlclRvbmVJbmZvKFRfWkRydlZwX1RvbmVOdW0gdG9uZU51bSwgVF9IYWxNaXhlclRvbmVJbmZvICp0b25lSW5mbykNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVRfekRydlZvaWNlX0diVmFyICpwX3ZvaWNlVmFyID0gTlVMTDsNCi0JcmV0ID0gekRydlZwX0dldFZvaWNlU3RhdGUoJnBfdm9pY2VWYXIpOw0KLQ0KLQlpZiAocF92b2ljZVZhciA9PSBOVUxMKSAvKmtsb2N3b3JrIDMgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgKHJldCE9RFJWX1NVQ0NFU1MpKi8NCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlpZiAoKHBfdm9pY2VWYXItPnZvaWNlSW5Wb2x0ZU1vZGUgPT0gMSkgJiYgKHBfdm9pY2VWYXItPnZvbHRlSXNXYiA9PSAxKSkNCi0Jew0KLQ0KLQkJdG9uZUluZm8tPmRhdGFJc1diID0gVFJVRTsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXRvbmVJbmZvLT5kYXRhSXNXYiA9IEZBTFNFOw0KLQ0KLQl9DQotCWlmICh0b25lSW5mby0+ZGF0YUlzV2IgPT0gVFJVRSkNCi0Jew0KLQkJaWYgKDAgPT0gdG9uZU51bSkNCi0JCXsNCi0JCQl0b25lSW5mby0+cHRkYXRhX21peGVyID0gKFVJTlQxNiAqKWxvd1Bvd2VyUGNtXzE2azsNCi0JCQkvL21peGVyVG9uZUluZm8udG9uZV90b3RhbF9zaXplPXNpemVvZihsb3dQb3dlclBjbSkvc2l6ZW9mKGNoYXIpOw0KLQkJCXRvbmVJbmZvLT50b25lX3RvdGFsX3NpemUgPSBzaXplb2YobG93UG93ZXJQY21fMTZrKSAvIHNpemVvZihVSU5UMTYpOw0KLQ0KLQkJfQ0KLQkJZWxzZSBpZiAoMSA9PSB0b25lTnVtKQ0KLQkJew0KLQkJCXRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIgPSAoVUlOVDE2ICopc21zUGNtXzE2azsNCi0JCQl0b25lSW5mby0+dG9uZV90b3RhbF9zaXplID0gc2l6ZW9mKHNtc1BjbV8xNmspIC8gc2l6ZW9mKFVJTlQxNik7DQotCQl9DQotCQllbHNlIGlmICgyID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKiljYWxsU3RhbmRhcmRQY21fMTZrOw0KLQkJCXRvbmVJbmZvLT50b25lX3RvdGFsX3NpemUgPSBzaXplb2YoY2FsbFN0YW5kYXJkUGNtXzE2aykgLyBzaXplb2YoVUlOVDE2KTsNCi0JCX0NCi0JCWVsc2UgaWYgKDMgPT0gdG9uZU51bSkNCi0JCXsNCi0JCQl0b25lSW5mby0+cHRkYXRhX21peGVyID0gKFVJTlQxNiAqKWFsYXJtQmVlcFBjbV8xNms7DQotCQkJdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSA9IHNpemVvZihhbGFybUJlZXBQY21fMTZrKSAvIHNpemVvZihVSU5UMTYpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoNCA9PSB0b25lTnVtKQ0KLQkJew0KLQkJCXRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIgPSAoVUlOVDE2ICopY2FsbFRpbWVQY21fMTZrOw0KLQkJCXRvbmVJbmZvLT50b25lX3RvdGFsX3NpemUgPSBzaXplb2YoY2FsbFRpbWVQY21fMTZrKSAvIHNpemVvZihVSU5UMTYpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVG9uZU1peGVyU3RhcnQgcGFyYSBpcyBlcnJvciEiKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0dldE1peGVyVG9uZUluZm8gdG9uZUluZm8tPnB0ZGF0YV9taXhlcj0lcCxMKHRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIpPSVkIVxuIiwgdG9uZUluZm8tPnB0ZGF0YV9taXhlciwgc2l6ZW9mKHRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIpKTsNCi0NCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCWlmICgwID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKilsb3dQb3dlclBjbTsNCi0JCQkvL21peGVyVG9uZUluZm8udG9uZV90b3RhbF9zaXplPXNpemVvZihsb3dQb3dlclBjbSkvc2l6ZW9mKGNoYXIpOw0KLQkJCXRvbmVJbmZvLT50b25lX3RvdGFsX3NpemUgPSBzaXplb2YobG93UG93ZXJQY20pIC8gc2l6ZW9mKFVJTlQxNik7DQotDQotCQl9DQotCQllbHNlIGlmICgxID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKilzbXNQY207DQotCQkJdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSA9IHNpemVvZihzbXNQY20pIC8gc2l6ZW9mKFVJTlQxNik7DQotCQl9DQotCQllbHNlIGlmICgyID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKiljYWxsU3RhbmRhcmRQY207DQotCQkJdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSA9IHNpemVvZihjYWxsU3RhbmRhcmRQY20pIC8gc2l6ZW9mKFVJTlQxNik7DQotCQl9DQotCQllbHNlIGlmICgzID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKilhbGFybUJlZXBQY207DQotCQkJdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSA9IHNpemVvZihhbGFybUJlZXBQY20pIC8gc2l6ZW9mKFVJTlQxNik7DQotCQl9DQotCQllbHNlIGlmICg0ID09IHRvbmVOdW0pDQotCQl7DQotCQkJdG9uZUluZm8tPnB0ZGF0YV9taXhlciA9IChVSU5UMTYgKiljYWxsVGltZVBjbTsNCi0JCQl0b25lSW5mby0+dG9uZV90b3RhbF9zaXplID0gc2l6ZW9mKGNhbGxUaW1lUGNtKSAvIHNpemVvZihVSU5UMTYpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVG9uZU1peGVyU3RhcnQgcGFyYSBpcyBlcnJvciEiKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImhhbEF1ZGlvQ29uZmlnX0dldE1peGVyVG9uZUluZm8gdG9uZUluZm8tPnB0ZGF0YV9taXhlcj0lcCxMKHRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIpPSVkIVxuIiwgdG9uZUluZm8tPnB0ZGF0YV9taXhlciwgc2l6ZW9mKHRvbmVJbmZvLT5wdGRhdGFfbWl4ZXIpKTsNCi0JfQ0KLQ0KLQ0KLQl0b25lSW5mby0+aW50ZXJfbWl4ZXJfZmNvdW50ID0gdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSAvIHRvbmVJbmZvLT5kYXRhX21peGVyX29uY2VzaXplOw0KLQl0b25lSW5mby0+cmVtX21peGVyX2NvdW50ID0gdG9uZUluZm8tPnRvbmVfdG90YWxfc2l6ZSAlIHRvbmVJbmZvLT5kYXRhX21peGVyX29uY2VzaXplOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLQ0KLSNpZiAwDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0dldEF1ZGlvTG9vcEluZm8oVF9IYWxBdWRpb0xvb3BUZXN0SW5mbyAqYXVkaW9JbmZvKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JYXVkaW9JbmZvLT5mcyA9IDIwMDA7DQotCWF1ZGlvSW5mby0+c2FtcEZzID0gODAwMDsNCi0JYXVkaW9JbmZvLT5wdGRhdGEgPSAoVUlOVDggKilidWZmZXIyazgwMDA7IC8vYnVmZmVyMWsvL3hpdQ0KLQlhdWRpb0luZm8tPnRvdGFsU2l6ZSA9IDIyNTA7DQotCWF1ZGlvSW5mby0+b3V0cGF0aHZvbFswXSA9IFZQX1ZPTF84Ow0KLQlhdWRpb0luZm8tPm91dHBhdGh2b2xbMV0gPSBWUF9WT0xfOTsgLy9vcmcgOiBWUF9WT0xfOA0KLQlhdWRpb0luZm8tPm91dHBhdGh2b2xbMl0gPSBWUF9WT0xfMTE7DQotCWF1ZGlvSW5mby0+b3V0cGF0aHZvbFszXSA9IFZQX1ZPTF8xMTsNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0dldEF1ZGlvTG9vcFJlc3VsdChUX0hhbEF1ZGlvTG9vcFRlc3RQcmEgKmF1ZGlvUHJhKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfRVJST1IsIGkgPSAwOw0KLQlVSU5UOCB0ZXN0Q291bnQgPSAwLCB0ZXN0U3VjZXNzQ291bnQgPSAwOw0KLQl6RHJ2VnBfRnJlcWZmdCB0ZW1wID0gezB9Ow0KLQlET1VCTEUgZnJlcVsyMF0gPSB7MH07DQotCURPVUJMRSBmcmVxQW1wWzIwXSA9IHswfTsNCi0JRE9VQkxFIHRvbmVSZWFsRnJlcSA9IDIwMDA7DQotCXRlc3RDb3VudCA9IDIwOw0KLSNpZmRlZiBfQ09ORklHX1VTRV9DT0RFQw0KLQl6RHJ2Q29kZWNfU2V0X0lucGF0aF9BbmFfVm9sKGdDb2RlY0hhbmRsZSwgMCk7DQotCXpEcnZDb2RlY19TZXRfSW5wYXRoX0RpZ19Wb2woZ0NvZGVjSGFuZGxlLCBWUF9WT0xfMyk7DQotI2VuZGlmDQotCXdoaWxlICh0ZXN0Q291bnQgPiAwKQ0KLQl7DQotCQkvL3RvZG8NCi0NCi0JCXpPc3NfTWVtY3B5KGF1ZGlvUHJhLT5kZXN0LCBhdWRpb1ByYS0+c3JjLCAyMDQ4KTsgLy8yMDQ4Ynl0ZQ0KLQ0KLQkJY2FsX2ZyZXFfZmZ0KChTSU5UMTYgKilhdWRpb1ByYS0+ZGVzdCwmdGVtcCwxMDI0LGF1ZGlvUHJhLT5zYW1wZnMpOy8vMTAyNCBwb2ludCBmZnQvL3hpdQ0KLQ0KLQkJZnJlcVt0ZXN0Q291bnQgLSAxXSA9IHRlbXAuZnJlcVZhbHVlOw0KLQkJZnJlcUFtcFt0ZXN0Q291bnQgLSAxXSA9IHRlbXAuZnJlcUFtcDsNCi0JCWlmICgoKGZhYnMoZnJlcVt0ZXN0Q291bnQgLSAxXSAtIHRvbmVSZWFsRnJlcSkpIDwgNTApICYmIChmcmVxQW1wW3Rlc3RDb3VudCAtIDFdID4gMzAwKSkNCi0JCXsNCi0JCQl0ZXN0U3VjZXNzQ291bnQrKzsNCi0JCQlpZiAodGVzdFN1Y2Vzc0NvdW50ID49IDUpDQotCQkJew0KLQkJCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ0ZXN0U3VjZXNzQ291bnQ9JWQhXG4iLCB0ZXN0U3VjZXNzQ291bnQpOw0KLQkJCQlyZXQgPSBEUlZfU1VDQ0VTUzsNCi0JCQkJdGVzdENvdW50LS07DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCXRlc3RDb3VudC0tOw0KLQkJek9zc19TbGVlcCgxMDApOw0KLQl9DQotDQotDQotCWZvciAoaSA9IDE5OyBpID49IHRlc3RDb3VudDsgaS0tKQ0KLQl7DQotCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggZnJlcVslZF09JWYgZnJlcUFtcCA9JWYhXG4iLCBpLCBmcmVxW2ldLCBmcmVxQW1wW2ldKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggZnJlcVslZF09JWYgZnJlcUFtcCA9JWYhXG4iLCBpLCBmcmVxW2ldLCBmcmVxQW1wW2ldKTsNCi0NCi0JfQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX0NPTkZJR19EQ19VU0VfQ09ERUMvL2R1YWxfY29yZSB2ZXJzaW9uDQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1JlYWRSZWcoVUlOVDE2IHJlZ1BhZ2UsIFVJTlQxNiByZWdBZGRyZXNzLCBVSU5UMTYgKnJlZ1ZhbHVlKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX0NPTkZJR19VU0VfQ09ERUMNCi0JcmV0ID0gekRydkNvZGVjX1JlYWQocmVnUGFnZSwgcmVnQWRkcmVzcywgcmVnVmFsdWUpOw0KLQlpZiAocmV0ICE9CURSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaGFsQXVkaW9Db25maWdfUmVhZFJlZyBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCX0NCi0jZW5kaWYNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX1dyaXRlUmVnKFVJTlQxNiByZWdQYWdlLCBVSU5UMTYgcmVnQWRkcmVzcywgVUlOVDE2IHJlZ1ZhbHVlLCBVSU5UMTYgcmVnTWFzaykNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotCXJldCA9IHpEcnZDb2RlY19Xcml0ZShyZWdQYWdlLCByZWdBZGRyZXNzLCByZWdWYWx1ZSwgcmVnTWFzayk7DQotCWlmIChyZXQgIT0JRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJoYWxBdWRpb0NvbmZpZ19Xcml0ZVJlZyBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCX0NCi0jZW5kaWYNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIGhhbEF1ZGlvQ29uZmlnX0R1bXBSZWcoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmIF9DT05GSUdfVVNFX0NPREVDDQotCXJldCA9IHpEcnZDb2RlY19EdW1wUmVnKCk7DQotCWlmIChyZXQgIT0JRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Q29kZWNfRHVtcFJlZyBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCX0NCi0jZW5kaWYNCi0JcmV0dXJuIHJldDsNCi19DQotI2VuZGlmDQotDQpkaWZmIC0tZ2l0IGEvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS9hdWRpb19saWIvYW1yL2xpYi9hcm12Ny1hL0dDQy9hbXIuYSBiL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvYXVkaW9fbGliL2Ftci9saWIvYXJtdjctYS9HQ0MvYW1yLmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMzk5YzEuLjAwMDAwMDAKLS0tIGEvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS9hdWRpb19saWIvYW1yL2xpYi9hcm12Ny1hL0dDQy9hbXIuYQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvYXVkaW9pbnRmL2hhbF9hdWRleHRpbnRmLmMgYi9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL2F1ZGlvaW50Zi9oYWxfYXVkZXh0aW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZmY3MzY0Li4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvYXVkaW9pbnRmL2hhbF9hdWRleHRpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChDKSAyMDA3LCBaVEUgQ29ycG9yYXRpb24uDQotICoNCi0gKiBGaWxlIE5hbWU6aGFsX2V4dGludGYuYw0KLSAqIEZpbGUgTWFyazoNCi0gKiBEZXNjcmlwdGlvbjogTG9vcCB2b2ljZSBkYXRhIGZyb20gdGVhayB0byBhcm0uDQotICAgICAgICAgICAgICAgICAgICBTZXR0aW5nczogYXJtIGlpczEtPnRvcCBpaXMxKGNvbm5lY3QgdG8gYXApLCBhcm0gaWlzMiBsb29wIHRvIHRlYWsgYWZlLg0KLQ0KLSAqIE90aGVyczoNCi0gKiBWZXJzaW9uOg0KLSAqIEF1dGhvcjogICAgICAgIHh1eGlucWlhbmcNCi0gKiBEYXRlOiAgICAgICAgICAyMDE1LTgtMjkNCi0gKiBIaXN0b3J5IDE6DQotICogICAgIERhdGU6DQotICogICAgIFZlcnNpb246DQotICogICAgIEF1dGhvcjoNCi0gKiAgICAgTW9kaWZpY2F0aW9uOg0KLSAqIEhpc3RvcnkgMjoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgZmlsZXMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8vI2luY2x1ZGUgImRydl9wdWIuaCINCi0jaW5jbHVkZSAiZHJ2c19pMnMuaCINCi0jaW5jbHVkZSAib3NzX2FwaS5oIg0KLSNpbmNsdWRlICJkcnZzX3JhbWxvZy5oIg0KLS8vI2luY2x1ZGUgImRydnNfdm9sdGUuaCINCi0jaW5jbHVkZSAiZHJ2c192b2ljZXByb2Nlc3MuaCINCi0jaW5jbHVkZSAiaGFsX3ZvaWNlcHJvY2Vzcy5oIg0KLSNpbmNsdWRlICJkcnZzX3ZvaWNlX2NvbmZpZy5oIg0KLS8vI2luY2x1ZGUgInZvaWNlX2FwaS5oIg0KLSNpbmNsdWRlICJoYWxfdm9pY2UuaCINCi0vLyNpbmNsdWRlICJoYWxfcGNtbWl4ZXIuaCINCi0jaWZkZWYgX1VTRV9OWFBfQVVEDQotI2luY2x1ZGUgImhhbF9ueHAuaCINCi0jZW5kaWYNCi0jaW5jbHVkZSAiaGFsX2F1ZGlvaW50Zi5oIg0KLSNpbmNsdWRlICJkcnZzX2F1ZGlvbWFuYWdlci5oIg0KLS8vI2luY2x1ZGUgIm1hdGguaCINCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBNYWNyb3MNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qIGVhY2ggdGltZSByZWNlaXZlIDMyMCBCWVRFUyovDQotI2RlZmluZSBNSVhFUl9EQVRBX1NISUZUX0JJVFMgMg0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsIFR5cGVzDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0JRE9VQkxFIGZyZXFWYWx1ZTsNCi0JRE9VQkxFIGZyZXFBbXA7DQotDQotfQ0KLXpEcnZWcF9GcmVxZmZ0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsIENvbnN0YW50cw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIGNhbF9mcmVxX2ZmdChTSU5UMTYgKmRhdGEsIHpEcnZWcF9GcmVxZmZ0ICpmcmVxZmZ0LCBVSU5UMTYgbiwgVUlOVDMyIGZzKTsNCi1TSU5UMzIgaGFsVnBDZmdfR2V0TWl4ZXJUb25lSW5mbyhUX1pEcnZWcF9Ub25lTnVtIHRvbmVOdW0sIFRfSGFsTWl4ZXJUb25lSW5mbyAqdG9uZUluZm8pOyAvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi1TSU5UMzIgaGFsVnBDZmdfU2V0T3V0cHV0TXV0ZShCT09MIG9ub2ZmKTsvL3hpdSBnYWkgY2h1DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgQ29uc3RhbnRzDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBWYXJpYWJsZXMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfSGFsTWl4ZXJUb25lSW5mbyBtaXhlclRvbmVJbmZvID0NCi17DQotCUZBTFNFLA0KLQlGQUxTRSwNCi0JMCwNCi0JMCwNCi0JMCwNCi0JMCwNCi0JTlVMTCwNCi0JMC8veGl1DQotfTsNCi0NCi0NCi0NCi1leHRlcm4gVF9IYWxWcENmZ19PcHQqICBnSGFsVnBDZmdfT2JqUHRyIDsNCi1leHRlcm4gVF96RHJ2Vm9pY2VfR2JWYXIgZ192b2ljZVZhcjsNCi0NCi0vL2R0bWa87LLiDQotZXh0ZXJuIFRfRHJ2RHRtZl9EZXRlY3RfT3B0IGdEcnZEdG1mX0RldGVjdF9PYmo7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotZXh0ZXJuIFNJTlQzMiB6RHJ2VnBfTG9vcFN0YXJ0KFRfWkRydl9WcFBhdGggcGF0aCk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VnBfTG9vcFN0b3AoVk9JRCk7Ly94aXUgZ2FpIGNodSB0aWFuIGppYSB2b2lkDQotI2lmZGVmIF9VU0VfQVVERVhUX0NPREVDX1BBVEhfSU5URg0KLVNJTlQzMiBoYWxWcENmZ19TZXRJbnB1dE11dGUoQk9PTCBvbm9mZik7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotI2VuZGlmDQotU0lOVDMyIGhhbFZwQ2ZnX0dldEF1ZGlvTG9vcEluZm8oVF9IYWxBdWRpb0xvb3BUZXN0SW5mbyAqYXVkaW9JbmZvKTsvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi1TSU5UMzIgaGFsVnBDZmdfU2V0T3V0cHV0Vm9sKFRfWkRydl9WcFZvbCB2b2wpOy8veGl1IGdhaSBjaHUgc2hlbmcgbWluZw0KLVNJTlQzMiBoYWxWcENmZ19HZXRBdWRpb0xvb3BSZXN1bHQoVF9IYWxBdWRpb0xvb3BUZXN0UHJhICphdWRpb1ByYSk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotDQotDQotU0lOVDMyIHpEcnZWcF9HZXRUeFZvbChWT0lEKTsNCi1TSU5UMzIgekRydlZwX1NldFR4Vm9sKFRfWkRydl9WcFZvbCB2b2x1bWUpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0UnhNdXRlKFVJTlQzMiBlbmFibGUsIFVJTlQzMiBjaGFubmVsKTsNCi1TSU5UMzIgekRydlZwX0dldFJ4TXV0ZShVSU5UMzIgKmVuYWJsZSwgVUlOVDMyIGNoYW5uZWwpOw0KLWV4dGVybiBTSU5UMzIgekRydlZwX1NvZnRfRHRtZl9Mb29wKFRfWkRydl9WcFBhdGggcGF0aCk7DQotDQotLy/J6NbD1ri2qGxldmVsvLax8NL0wb92b2x1bWW1xNT20ubWtWdhaW4NCi1TSU5UMzIgekRydlZwX1NldFZvbF9HYWluKGludCBnYWluKTsNCi1TSU5UMzIgekRydlZwX0dldFZvbF9HYWluKFZPSUQpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0Vm9sX0dhaW5fV3JhcChpbnQgZ2Fpbik7DQotU0lOVDMyIHpEcnZWcF9HZXRWb2xfR2Fpbl9XcmFwKFZPSUQpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0VHhWb2xfR2FpbihpbnQgZ2Fpbik7DQotU0lOVDMyIHpEcnZWcF9HZXRUeFZvbF9HYWluKFZPSUQpOw0KLVNJTlQzMiB6RHJ2VnBfU2V0VHhWb2xfR2Fpbl9XcmFwKGludCBnYWluKTsNCi1TSU5UMzIgekRydlZwX0dldFR4Vm9sX0dhaW5fV3JhcChWT0lEKTsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlZmluaXRpb25zDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydl9BdWRpb19QcmludGYoVk9JRCAqcEZvcm1hdCwgLi4uKQ0KLXsNCi0JY2hhciBzdHJbMjU2XSA9IHswfTsNCi0JdmFfbGlzdCB0QXJnOw0KLQl2YV9zdGFydCh0QXJnLCBwRm9ybWF0KTsNCi0JdnNwcmludGYoc3RyLCBwRm9ybWF0LCB0QXJnKTsNCi0JdmFfZW5kKHRBcmcpOw0KLQlyZXR1cm4gekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgc3RyKTsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9HZXRWb2xfV3JhcChWT0lEKQ0KLXsNCi0JcmV0dXJuIGdfdm9pY2VWYXIudnBWb2w7DQotfQ0KLVNJTlQzMiB6RHJ2VnBfU2V0Vm9sX1dyYXAoaW50IHZvbHVtZSkNCi17DQotCXJldHVybiB6RHJ2VnBfU2V0Vm9sKHZvbHVtZSk7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0Vm9sX0dhaW5fV3JhcChpbnQgZ2FpbikNCi17DQotCXJldHVybiB6RHJ2VnBfU2V0Vm9sX0dhaW4oZ2Fpbik7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0Vm9sX0dhaW5fV3JhcChWT0lEKQ0KLXsNCi0JcmV0dXJuIHpEcnZWcF9HZXRWb2xfR2FpbigpOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX1NldFR4Vm9sX0dhaW5fV3JhcChpbnQgZ2FpbikNCi17DQotCXJldHVybiB6RHJ2VnBfU2V0VHhWb2xfR2FpbihnYWluKTsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9HZXRUeFZvbF9HYWluX1dyYXAoVk9JRCkNCi17DQotCXJldHVybiB6RHJ2VnBfR2V0VHhWb2xfR2FpbigpOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldFR4Vm9sX1dyYXAoVk9JRCkNCi17DQotCXJldHVybiB6RHJ2VnBfR2V0VHhWb2woKTsNCi19DQotU0lOVDMyIHpEcnZWcF9TZXRUeFZvbF9XcmFwKGludCB2b2x1bWUpDQotew0KLQlyZXR1cm4gekRydlZwX1NldFR4Vm9sKHZvbHVtZSk7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0UGF0aF9XcmFwKFZPSUQpDQotew0KLQlyZXR1cm4gZ192b2ljZVZhci52cFBhdGg7DQotfQ0KLVNJTlQzMiB6RHJ2VnBfU2V0UGF0aF9XcmFwKGludCBwYXRoKQ0KLXsNCi0JcmV0dXJuIHpEcnZWcF9TZXRQYXRoKHBhdGgpOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX1NldE11dGVfV3JhcChCT09MIGVuYWJsZSkNCi17DQotCXJldHVybiB6RHJ2VnBfU2V0TXV0ZShlbmFibGUsIFZPSUNFX1VQTElOSyk7DQotfQ0KLQ0KLUJPT0wgekRydlZwX0dldE11dGVfV3JhcChWT0lEKQ0KLXsNCi0JcmV0dXJuIGdfdm9pY2VWYXIubXV0ZUVuOw0KLX0NCi1TSU5UMzIgekRydlZwX1NldFJ4TXV0ZV9XcmFwKGludCBlbmFibGUpDQotew0KLQlyZXR1cm4gekRydlZwX1NldFJ4TXV0ZShlbmFibGUsIFZPSUNFX0RPV05MSU5LKTsNCi19DQotDQotaW50IHpEcnZWcF9HZXRSeE11dGVfV3JhcChWT0lEKQ0KLXsNCi0JcmV0dXJuIGdfdm9pY2VWYXIucnhNdXRlRW47DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0VG9uZV9XcmFwKFRfWkRydlZwX1RvbmVOdW0gdG9uZU51bSkNCi17DQotCXJldHVybiB6RHJ2VnBfVG9uZU1peGVyU3RhcnQodG9uZU51bSk7DQotfQ0KLVNJTlQzMiB6RHJ2VnBfU2V0VnBMb29wX1dyYXAoaW50IHBhdGgpDQotew0KLQlyZXR1cm4gekRydlZwX0xvb3AocGF0aCk7DQotfQ0KLVNJTlQzMiB6RHJ2VnBfR2V0VnBMb29wX1dyYXAoVk9JRCkNCi17DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlczp2cExvb3BCa1J1bm5pbmc9JWQuXG4iLCBfX2Z1bmNfXywgZ192b2ljZVZhci52cExvb3BCa1J1bm5pbmcpOw0KLSAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICAiJXM6dnBMb29wQmtSdW5uaW5nPSVkLlxuIiwgX19mdW5jX18sIGdfdm9pY2VWYXIudnBMb29wQmtSdW5uaW5nKTsNCi0JcmV0dXJuIGdfdm9pY2VWYXIudnBMb29wQmtSdW5uaW5nOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldFNsaWNGbGFnKFZPSUQpDQotew0KLQ0KLQlyZXR1cm4gZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYzsNCi0NCi19DQotU0lOVDMyIHpEcnZWcF9TZXRFY2hvRGVsYXlfV3JhcChpbnQgdmFsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX1NldEVjaG9EZWxheSh2YWwpOw0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldEVjaG9EZWxheV9XcmFwKHZvaWQpDQotew0KLQ0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQlyZXQgPSBWb2ljZVByb2NfR2V0RWNob0RlbGF5KCk7DQotCXJldHVybiByZXQ7DQotDQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0VHhOc01vZGVfV3JhcChpbnQgdmFsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX1NldFR4TnNNb2RlKHZhbCk7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0VHhOc01vZGVfV3JhcCh2b2lkKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX0dldFR4TnNNb2RlKCk7DQotCXJldHVybiByZXQ7DQotDQotfQ0KLVNJTlQzMiB6RHJ2VnBfU2V0UnhOc01vZGVfV3JhcChpbnQgdmFsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX1NldFJ4TnNNb2RlKHZhbCk7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0UnhOc01vZGVfV3JhcCh2b2lkKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX0dldFJ4TnNNb2RlKCk7DQotCXJldHVybiByZXQ7DQotDQotfQ0KLQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0TW9kdWxlU3RhdGVfV3JhcChpbnQgKm1vZCwgaW50IGNvdW50KQ0KLQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JcmV0ID0gVm9pY2VQcm9jX1NldE1vZHVsZVN0YXRlKG1vZCwgY291bnQpOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLQ0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldE1vZHVsZVN0YXRlX1dyYXAoaW50ICptb2QsIGludCBjb3VudCkNCi0NCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXJldCA9IFZvaWNlUHJvY19HZXRNb2R1bGVTdGF0ZShtb2QsIGNvdW50KTsNCi0JcmV0dXJuIHJldDsNCi19DQotDQotDQotDQotU0lOVDMyIHpEcnZWcF9TZXRQYXRoKFRfWkRydl9WcFBhdGggcGF0aCkNCi17DQotDQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBiZWdpbiBwYXRoPSVkLHZwSTJzU3RhdHVzPSVkLHZQcm9jSXNOb3JtYWw9JWQhIiwgcGF0aCwgZ192b2ljZVZhci52cEkyc1N0YXR1cywgZ192b2ljZVZhci52UHJvY0lzTm9ybWFsKTsNCi0JaWYgKHBhdGggPj0gTUFYX1ZQX1BBVEgpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBwYXRoIG5vdCBzdXBwb3J0IVxyXG4iKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfSTJTX0lETEUpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzIGlkbGUgc2V0IHBhdGggcmV0dXJuIVxyXG4iKTsNCi0JCWdfdm9pY2VWYXIudnBQYXRoID0gcGF0aDsNCi0JCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9MT09QX09OKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFBhdGggdnBfbG9vcF9vbiByZXR1cm4gIVxyXG4iKTsNCi0JCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0JfQ0KLQ0KLQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBwYXRoPSVkLHZQcm9jSXNOb3JtYWw9JWQhIiwgcGF0aCwgZ192b2ljZVZhci52UHJvY0lzTm9ybWFsKTsNCi0JaWYgKGdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9PSBUUlVFKQ0KLQl7DQotI2lmZGVmIF9VU0VfTlhQX0FVRA0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRWb2wgTlhQIHNldCBwYXRoIVxyXG4iKTsNCi0JCXJldCA9IFZwX054cEdldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCBwYXRoKTsNCi0JCWlmIChyZXQgPT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJcmV0ID0gVnBfTnhwU2V0UGFyYW0ocGF0aCwgZ192b2ljZVZhci52cFZvbCwgRkFMU0UpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFBhdGggVnBfTnhwU2V0UGFyYW0gZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFBhdGggVnBfTnhwR2V0UGFyYW0gZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQNCi0JCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIndlYnJ0YyAgc2V0IHBhdGghXHJcbiIpOw0KLQ0KLQkJcmV0ID0gV2VicnRjX0dldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCAgcGF0aCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBXZWJydGNfR2V0UGFyYW0gZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotDQotCQl9DQotCQlyZXQgPSBXZWJydGNfU2V0UGFyYW0oZ192b2ljZVZhci52b2ljZU1vZGUsICBwYXRoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRQYXRoIFdlYnJ0Y19TZXRQYXJhbSBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0NCi0JCX0NCi0NCi0jZW5kaWYNCi0JfQ0KLQ0KLQ0KLQlpZiAoKHBhdGggPT0gVlBfUEFUSF9IQU5EU0VUKSB8fCAocGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpIHx8IChwYXRoID09IFZQX1BBVEhfU1BFQUtFUikpDQotCXsNCi0JCXJldCA9IGhhbFZwQ2ZnX1NldElucHV0UGF0aChwYXRoLCBUUlVFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRQYXRoIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JCXJldCA9IGhhbFZwQ2ZnX1NldE91dHB1dFBhdGgocGF0aCwgVFJVRSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBoYWxWcENmZ19TZXRPdXRwdXRQYXRoIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQ0KLQl9DQotDQotCWdfdm9pY2VWYXIudnBQYXRoID0gcGF0aDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldFBhdGgoVF9aRHJ2X1ZwUGF0aCAqcGF0aCkNCi17DQotDQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCSpwYXRoID0gZ192b2ljZVZhci52cFBhdGg7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGF0aCBiZWdpbiAqcGF0aD0lZCx2cEkyc1N0YXR1cz0lZCx2UHJvY0lzTm9ybWFsPSVkISIsICpwYXRoLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzLCBnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwpOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLQ0KLSNpZmRlZiBfVVNFX0FVREVYVF9DT0RFQ19QQVRIX0lOVEYNCi0NCi1TSU5UMzIgekRydlZwX1NldFJ4UGF0aChUX1pEcnZfQ29kZWNPdXRwdXRQYXRoIHBhdGgsIEJPT0wgaXNlbmFibGUpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFJ4UGF0aCBpcz0lZCIsIHBhdGgpOw0KLQlpZiAocGF0aCA+PSBNQVhfQ09ERUNfT1VUUFVUX1BBVEgpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UnhQYXRoIHBhdGggbm90IHN1cHBvcnQhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQlUX1pEcnZfVnBQYXRoIHRlbXBwYXRoOw0KLQlzd2l0Y2ggKHBhdGgpDQotCXsNCi0JY2FzZSBDT0RFQ19PVVRQVVRfUkVDRUlWRVI6DQotCQl0ZW1wcGF0aCA9IFZQX1BBVEhfSEFORFNFVDsNCi0JCWJyZWFrOw0KLQljYXNlICBDT0RFQ19PVVRQVVRfU1BFQUtFUjoNCi0JCXRlbXBwYXRoID0gVlBfUEFUSF9TUEVBS0VSOw0KLQkJYnJlYWs7DQotCWNhc2UgQ09ERUNfT1VUUFVUX0hFQURTRVQ6DQotCQl0ZW1wcGF0aCA9IFZQX1BBVEhfSEVBRFNFVDsNCi0JCWJyZWFrOw0KLQljYXNlIENPREVDX09VVFBVVF9IU0FORFNQSzoNCi0JCXRlbXBwYXRoID0gVlBfUEFUSF9IU0FORFNQSzsNCi0JCWJyZWFrOw0KLQljYXNlIENPREVDX09VVFBVVF9CTFVFVE9PVEg6DQotCQl0ZW1wcGF0aCA9IFZQX1BBVEhfQkxVRVRPT1RIOw0KLQkJYnJlYWs7DQotCWRlZmF1bHQ6DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQ0KLQl9DQotCXJldCA9IGhhbFZwQ2ZnX1NldE91dHB1dFBhdGgodGVtcHBhdGgsIGlzZW5hYmxlKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRSeFBhdGggIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX1NldFR4UGF0aChUX1pEcnZfQ29kZWNJbnB1dFBhdGggcGF0aCwgQk9PTCBpc2VuYWJsZSkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0VHhQYXRoIGlzPSVkIiwgcGF0aCk7DQotCWlmIChwYXRoID49IE1BWF9DT0RFQ19JTlBVVF9QQVRIKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFR4UGF0aCBwYXRoIG5vdCBzdXBwb3J0IVxyXG4iKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0JVF9aRHJ2X1ZwUGF0aCB0ZW1wcGF0aDsNCi0Jc3dpdGNoIChwYXRoKQ0KLQl7DQotCWNhc2UgQ09ERUNfSU5QVVRfTUlDUEhPTkU6DQotCQl0ZW1wcGF0aCA9IFZQX1BBVEhfSEFORFNFVDsNCi0JCWJyZWFrOw0KLQljYXNlICBDT0RFQ19JTlBVVF9IRUFEU0VUOg0KLQkJdGVtcHBhdGggPSBWUF9QQVRIX0hFQURTRVQ7DQotCQlicmVhazsNCi0JY2FzZSBDT0RFQ19JTlBVVF9IQU5EU0ZSRUU6DQotCQl0ZW1wcGF0aCA9IFZQX1BBVEhfU1BFQUtFUjsNCi0JCWJyZWFrOw0KLQljYXNlIENPREVDX0lOUFVUX0JMVUVUT09USDoNCi0JCXRlbXBwYXRoID0gVlBfUEFUSF9CTFVFVE9PVEg7DQotCQlicmVhazsNCi0JZGVmYXVsdDoNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0JcmV0ID0gaGFsVnBDZmdfU2V0SW5wdXRQYXRoKHRlbXBwYXRoLCBpc2VuYWJsZSk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0VHhQYXRoICBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotI2VuZGlmDQotDQotU0lOVDMyIHpEcnZWcF9TZXRWb2xfR2FpbihpbnQgZ2FpbikNCi17DQotICAgIFNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotI2lmZGVmICBfVVNFX1dFQlJUQ19BVUQNCi0JcmV0ID0gV2VicnRjX1NldFJ4Vm9sX0dhaW4oZ2Fpbik7DQotI2VuZGlmDQotICAgIA0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldFZvbF9HYWluKFZPSUQpDQotew0KLSNpZmRlZiAgX1VTRV9XRUJSVENfQVVEDQotCXJldHVybiBXZWJydGNfR2V0UnhWb2xfR2FpbigpOw0KLSNlbHNlDQotCXJldHVybiAwOw0KLSNlbmRpZg0KLX0NCi0NCi1TSU5UMzIgekRydlZwX1NldFR4Vm9sX0dhaW4oaW50IGdhaW4pDQotew0KLSAgICBTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSNpZmRlZiAgX1VTRV9XRUJSVENfQVVEICAgIA0KLQlyZXQgPSBXZWJydGNfU2V0VHhWb2xfR2FpbihnYWluKTsNCi0jZW5kaWYNCi0gICAgDQotICAgIHJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0VHhWb2xfR2FpbihWT0lEKQ0KLXsNCi0jaWZkZWYgIF9VU0VfV0VCUlRDX0FVRA0KLSAgICAgICAgcmV0dXJuIFdlYnJ0Y19HZXRUeFZvbF9HYWluKCk7DQotI2Vsc2UNCi0gICAgICAgIHJldHVybiAwOw0KLSNlbmRpZg0KLX0NCi0NCi1TSU5UMzIgekRydlZwX1NldFZvbChUX1pEcnZfVnBWb2wgdm9sdW1lKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRWb2wgYmVnaW4gdm9sdW1lPSVkLGdfdm9pY2VWYXIudnBJMnNTdGF0dXM9JWQhIiwgdm9sdW1lLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzKTsNCi0JaWYgKHZvbHVtZSA+PSBNQVhfVlBfVk9MKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFZvbCB2b2x1bWUgbm90IHN1cHBvcnQhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9JMlNfSURMRSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRQYXRoIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgaWRsZSBzZXQgdm9sdW1lIHJldHVybiFcclxuIik7DQotCQlnX3ZvaWNlVmFyLnZwVm9sID0gdm9sdW1lOw0KLQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQl9DQotDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0xPT1BfT04pDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0Vm9sIHZwX2xvb3Bfb24gcmV0dXJuICFcclxuIik7DQotCQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotCX0NCi0JaWYgKHZvbHVtZSA+PSBWUF9WT0xfNikNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRWb2wgdm9sdW1lID49dm9sXzYsc2V0IHZvbDUgdm9sdW1lPSVkISIsdm9sdW1lKTsNCi0JCXZvbHVtZSA9IFZQX1ZPTF81Ow0KLQl9DQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRWb2wgdm9sdW1lPSVkLHJldD0lZCEiLCB2b2x1bWUsIHJldCk7DQotDQotCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkgLyprbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlKi8NCi0Jew0KLSNpZmRlZiBfVVNFX05YUF9BVUQNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0Vm9sIE5YUCBzZXQgdm9sdW1lIVxyXG4iKTsNCi0JCXJldCA9IFZwX054cEdldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCBnX3ZvaWNlVmFyLnZwUGF0aCk7DQotCQlyZXQgKz0gVnBfTnhwU2V0UGFyYW0oZ192b2ljZVZhci52cFBhdGgsIHZvbHVtZSwgRkFMU0UpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFZvbCBWcF9OeHBTZXRQYXJhbSBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0jZWxpZiBkZWZpbmVkIF9VU0VfV0VCUlRDX0FVRA0KLQkJLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFZvbCB3ZXRydGMgdm9sPSVkIVxyXG4iLCB2b2x1bWUpOw0KLQ0KLQkJLy9yZXQgPVdlYnJ0Y19TZXRSeFZvbCh2b2x1bWUpOw0KLQkJcmV0ID0gV2VicnRjX1NldFZvbChnX3ZvaWNlVmFyLnZvaWNlTW9kZSwgZ192b2ljZVZhci52cFBhdGgsIHZvbHVtZSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0Vm9sIFdlYnJ0Y19TZXRSeFZvbCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0jZW5kaWYNCi0NCi0JfQ0KLQ0KLQlnX3ZvaWNlVmFyLnZwVm9sID0gdm9sdW1lOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0Vm9sKGludCAqdm9sdW1lKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JDQotDQotCSp2b2x1bWUgPSBnX3ZvaWNlVmFyLnZwVm9sOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0dldFZvbCAgKnZvbHVtZT0lZCxnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzPSVkISIsICp2b2x1bWUsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMpOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0VHhWb2woVk9JRCkNCi17DQotI2lmZGVmICBfVVNFX1dFQlJUQ19BVUQNCi0NCi0JcmV0dXJuIFdlYnJ0Y19HZXRUeFZvbCgpOw0KLSNlbHNlDQotCXJldHVybiAwOw0KLSNlbmRpZg0KLX0NCi1TSU5UMzIgekRydlZwX1NldFR4Vm9sKFRfWkRydl9WcFZvbCB2b2x1bWUpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLSNpZmRlZiAgX1VTRV9XRUJSVENfQVVEDQotCXJldCA9IFdlYnJ0Y19TZXRUeFZvbCh2b2x1bWUpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFR4Vm9sIFdlYnJ0Y19TZXRUeFZvbCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9FY2FsbFNldE11dGUoVUlOVDMyIGVuYWJsZSkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXN0YXRpYyBVSU5UMzIgcHJlX2VuYWJsZSA9IDA7DQotDQotDQotCWlmIChlbmFibGUgPT0gMSkNCi0Jew0KLQkJZ192b2ljZVZhci5tdXRlRW4gPSBUUlVFOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJZ192b2ljZVZhci5tdXRlRW4gPSBGQUxTRTsNCi0JfQ0KLQ0KLQlpZihwcmVfZW5hYmxlICE9IGdfdm9pY2VWYXIubXV0ZUVuKXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfRWNhbGxTZXRNdXRlIG11dGUgY2hhbmdlICBnX3ZvaWNlVmFyLm11dGVFbj0lZCAhXG4iLGdfdm9pY2VWYXIubXV0ZUVuKTsNCi0JCXByZV9lbmFibGUgPSBnX3ZvaWNlVmFyLm11dGVFbjsJCQ0KLQl9DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotDQotU0lOVDMyIHpEcnZWcF9TZXRNdXRlKFVJTlQzMiBlbmFibGUsIFVJTlQzMiBjaGFubmVsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWYgMA0KLQlUX1pEcnZWb2ljZV9NdXRlSW5mbyBtdXRlaW5mbzsNCi0JbXV0ZWluZm8uZW5hYmxlID0gZW5hYmxlOw0KLQltdXRlaW5mby5jaGFubmVsID0gY2hhbm5lbDsNCi0JcmV0ID0gdm9pY2VfU2V0TXV0ZSgmbXV0ZWluZm8pOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE11dGUgZW5hYmxlPSVkLGNoYW5uZWw9JWQscmV0PSVkISIsIGVuYWJsZSwgY2hhbm5lbCwgcmV0KTsNCi0jZW5kaWYNCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfSTJTX0lETEUpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0TXV0ZSBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzIGlkbGUgbm90IHN1cHBvcnQgc2V0IG11dGUgIVxyXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfTE9PUF9PTikNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRNdXRlIHZwX2xvb3Bfb24gcmV0dXJuICFcclxuIik7DQotCQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotCX0NCi0NCi0JaWYgKGVuYWJsZSA9PSAxKQ0KLQl7DQotCQlnX3ZvaWNlVmFyLm11dGVFbiA9IFRSVUU7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE11dGUgIHNldCBnX3ZvaWNlVmFyLm11dGVFbiBUUlVFICFcbiIpOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJZ192b2ljZVZhci5tdXRlRW4gPSBGQUxTRTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0TXV0ZSAgc2V0IGdfdm9pY2VWYXIubXV0ZUVuIEZBU0xFICFcbiIpOw0KLQl9DQotDQotCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkNCi0Jew0KLSNpZmRlZiBfVVNFX05YUF9BVUQNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0TXV0ZSBOWFAgc2V0IG11dGUhXHJcbiIpOw0KLQkJcmV0ID0gVnBfTnhwR2V0UGFyYW0oZ192b2ljZVZhci52b2ljZU1vZGUsIGdfdm9pY2VWYXIudnBQYXRoKTsNCi0JCXJldCArPSBWcF9OeHBTZXRQYXJhbShnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgRkFMU0UpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE11dGUgbnhwIHNldCBtdXRlICBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQkJaWYgKGVuYWJsZSA9PSAxKQ0KLQkJCXsNCi0JCQkJZ192b2ljZVZhci5tdXRlRW4gPSBGQUxTRTsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRNdXRlICBOWFAgc2V0IG11dGUgZmFpbCxzZXQgZ192b2ljZVZhci5tdXRlRW4gRkFMU0UgIVxuIik7DQotDQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCWdfdm9pY2VWYXIubXV0ZUVuID0gVFJVRTsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRNdXRlICBOWFAgc2V0IG11dGUgZmFpbCxzZXQgZ192b2ljZVZhci5tdXRlRW4gVFJVRSAhXG4iKTsNCi0NCi0JCQl9DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0jZWxpZiBkZWZpbmVkIF9VU0VfV0VCUlRDX0FVRA0KLQ0KLQkJcmV0ID0gV2VicnRjX1NldE11dGUoZW5hYmxlKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0NCi0jZW5kaWYNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfR2V0TXV0ZShVSU5UMzIgKmVuYWJsZSwgVUlOVDMyIGNoYW5uZWwpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQ0KLQkqZW5hYmxlID0gZ192b2ljZVZhci5tdXRlRW47DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfR2V0TXV0ZSAgR2V0IGdfdm9pY2VWYXIubXV0ZUVuPSVkICFcbiIsZ192b2ljZVZhci5tdXRlRW4pOw0KLQ0KLQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0UnhNdXRlKFVJTlQzMiBlbmFibGUsIFVJTlQzMiBjaGFubmVsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWYgMA0KLQlUX1pEcnZWb2ljZV9NdXRlSW5mbyBtdXRlaW5mbzsNCi0JbXV0ZWluZm8uZW5hYmxlID0gZW5hYmxlOw0KLQltdXRlaW5mby5jaGFubmVsID0gY2hhbm5lbDsNCi0JcmV0ID0gdm9pY2VfU2V0TXV0ZSgmbXV0ZWluZm8pOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE11dGUgZW5hYmxlPSVkLGNoYW5uZWw9JWQscmV0PSVkISIsIGVuYWJsZSwgY2hhbm5lbCwgcmV0KTsNCi0jZW5kaWYNCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfSTJTX0lETEUpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UnhNdXRlIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgaWRsZSBub3Qgc3VwcG9ydCBzZXQgbXV0ZSAhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9MT09QX09OKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFJ4TXV0ZSB2cF9sb29wX29uIHJldHVybiAhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQl9DQotDQotCWlmIChlbmFibGUgPT0gMSkNCi0Jew0KLQkJZ192b2ljZVZhci5yeE11dGVFbiA9IFRSVUU7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFJ4TXV0ZSAgc2V0IGdfdm9pY2VWYXIucnhNdXRlRW4gVFJVRSAhXG4iKTsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCWdfdm9pY2VWYXIucnhNdXRlRW4gPSBGQUxTRTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UnhNdXRlICBzZXQgZ192b2ljZVZhci5yeE11dGVFbiBGQVNMRSAhXG4iKTsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID09IFRSVUUpDQotCXsNCi0jaWZkZWYgX1VTRV9OWFBfQVVEDQotDQotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQNCi0NCi0JCXJldCA9IFdlYnJ0Y19TZXRSeE11dGUoZW5hYmxlKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJaWYgKGVuYWJsZSA9PSAxKQ0KLQkJCXsNCi0JCQkJZ192b2ljZVZhci5yeE11dGVFbiA9IEZBTFNFOw0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldFJ4TXV0ZSAgc2V0IHJ4TXV0ZUVuIGZhaWwsc2V0IGdfdm9pY2VWYXIubXV0ZUVuIEZBTFNFICFcbiIpOw0KLQ0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlnX3ZvaWNlVmFyLnJ4TXV0ZUVuID0gVFJVRTsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRSeE11dGUgICBzZXQgcnhNdXRlRW4gZmFpbCxzZXQgZ192b2ljZVZhci5tdXRlRW4gVFJVRSAhXG4iKTsNCi0NCi0JCQl9DQotCQkJcmV0dXJuIERSVl9FUlJPUjsJCQ0KLQkJfQ0KLQ0KLSNlbmRpZg0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotU0lOVDMyIHpEcnZWcF9HZXRSeE11dGUoVUlOVDMyICplbmFibGUsIFVJTlQzMiBjaGFubmVsKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0NCi0JKmVuYWJsZSA9IGdfdm9pY2VWYXIucnhNdXRlRW47DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfR2V0UnhNdXRlICBHZXQgZ192b2ljZVZhci5yeE11dGVFbj0lZCAhXG4iLGdfdm9pY2VWYXIucnhNdXRlRW4pOw0KLQ0KLQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLQ0KLSNpZiAwDQotLy9kdG1mvOyy4i272Lu3suLK1NPDDQotVF9EcnZEdG1mX0RldGVjdF9PcHQgZHRtZl9sb29wdGVzdDsNCi12b2lkIGRydl9kdG1mcnhsb29wX3JlcG9ydChjaGFyICpkdG1mX3N0cmluZywgdW5zaWduZWQgY2hhciBzdHJpbmdfbGVuKQ0KLXsNCi0gICAgLy9wcmludGsoImRydl9kdG1mcnhfcmVwb3J0LCBkdG1mX3N0cmluZz0lYywgc3RyaW5nX2xlbj0lZFxuIiwgKmR0bWZfc3RyaW5nLCBzdHJpbmdfbGVuKTsNCi0gICAgek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAiZHJ2X2R0bWZyeGxvb3BfcmVwb3J0LCBkdG1mX3N0cmluZz0lYywgc3RyaW5nX2xlbj0lZFxuIiwgKmR0bWZfc3RyaW5nLCBzdHJpbmdfbGVuKTsNCi19DQotdm9pZCBkcnZfZHRtZnR4bG9vcF9yZXBvcnQoY2hhciAqZHRtZl9zdHJpbmcsIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbikNCi17DQotICAgIC8vcHJpbnRrKCJkcnZfZHRtZnR4X3JlcG9ydCwgZHRtZl9zdHJpbmc9JWMsIHN0cmluZ19sZW49JWRcbiIsICpkdG1mX3N0cmluZywgc3RyaW5nX2xlbik7DQotICAgIHpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgImRydl9kdG1mdHhsb29wX3JlcG9ydCwgZHRtZl9zdHJpbmc9JWMsIHN0cmluZ19sZW49JWRcbiIsICpkdG1mX3N0cmluZywgc3RyaW5nX2xlbik7DQotfQ0KLSNlbmRpZg0KLVNJTlQzMiB6RHJ2VnBfU29mdF9EdG1mX0xvb3AoVF9aRHJ2X1ZwUGF0aCBwYXRoKQ0KLXsNCi0gICAgek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAiekRydlZwX1NvZnRfRHRtZl9Mb29wIGVudGVyXG4iKTsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICANCi0gICAgaWYoKHBhdGggPT0gVlBfUEFUSF9IQU5EU0VUKSB8fCAocGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpIHx8IChwYXRoID09IFZQX1BBVEhfU1BFQUtFUikpDQotICAgIHsNCi0gICAgICAgIHpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgInpEcnZWcF9Tb2Z0X0R0bWZfTG9vcCBnX3ZvaWNlVmFyLnVzZUR0bWZMb29wID0gJWRcbiIsIGdfdm9pY2VWYXIudXNlRHRtZkxvb3ApOw0KLSNpZiAwICANCi0gICAgICAgIC8vZHRtZrzssuItu9i7t7LiytTTww0KLSAgICAgICAgZHRtZl9sb29wdGVzdC5kcnZfZHRtZnJ4X3JlcG9ydF9jYiA9IGRydl9kdG1mcnhsb29wX3JlcG9ydDsNCi0gICAgICAgIGR0bWZfbG9vcHRlc3QuZHJ2X2R0bWZ0eF9yZXBvcnRfY2IgPSBkcnZfZHRtZnR4bG9vcF9yZXBvcnQ7DQotICAgICAgICB6RHJ2RHRtZl9EZXRlY3RfUmVnQ2FsbGJhY2tzKGR0bWZfbG9vcHRlc3QpOw0KLSNlbmRpZiAgICAgICAgDQotICAgICAgICAvL2R0bWa87LLiLbvYu7fG9LavDQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IHpEcnZWcF9EdG1mU29mdHdhcmVTdGFydCBlbnRlclxuIik7DQotICAgICAgICByZXQgPSB6RHJ2VnBfRHRtZlNvZnR3YXJlU3RhcnQoMSwgODAwMCk7DQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IHpEcnZWcF9EdG1mU29mdHdhcmVTdGFydCBlbmQsIHJldD0lZFxuIiwgcmV0KTsgIA0KLSAgICAgICAgaWYocmV0ID09IDApDQotICAgICAgICAgICAgZ192b2ljZVZhci51c2VEdG1mTG9vcCA9IDE7DQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IHpEcnZWcF9EdG1mU29mdHdhcmVTdGFydCBlbmQsIHJldD0lZCx1c2VEdG1mTG9vcD0lZFxuIiwgcmV0LGdfdm9pY2VWYXIudXNlRHRtZkxvb3ApOyAgDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeSB6RHJ2VnBfRHRtZlNvZnR3YXJlU3RhcnQgZW5kLCByZXQ9JWQsdXNlRHRtZkxvb3A9JWRcbiIsIHJldCxnX3ZvaWNlVmFyLnVzZUR0bWZMb29wKTsgDQotICAgIH0NCi0gICAgZWxzZSBpZihwYXRoID09IFZQX1BBVEhfT0ZGKQ0KLSAgICB7DQotICAgICAgICAvL2R0bWa87LLiLbvYu7e52LHVDQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ6RHJ2VnBfU29mdF9EdG1mX0xvb3AgZ192b2ljZVZhci51c2VEdG1mTG9vcCA9ICVkXG4iLCBnX3ZvaWNlVmFyLnVzZUR0bWZMb29wKTsNCi0gICAgICAgIHJldCA9IHpEcnZWcF9EdG1mU29mdHdhcmVTdG9wKCk7DQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IHpEcnZWcF9EdG1mU29mdHdhcmVTdG9wIGVuZCwgcmV0PSVkXG4iLCByZXQpOyAgDQotICAgICAgICBpZihyZXQgPT0gMCkNCi0gICAgICAgICAgICBnX3ZvaWNlVmFyLnVzZUR0bWZMb29wID0gMDsNCi0gICAgICAgIHpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgInZwX0xvb3BQcm9jZXNzVGhyZWFkRW50cnkgekRydlZwX0R0bWZTb2Z0d2FyZVN0b3AgZW5kLCByZXQ9JWQsdXNlRHRtZkxvb3A9JWRcbiIsIHJldCxnX3ZvaWNlVmFyLnVzZUR0bWZMb29wKTsgIA0KLQkJDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeSB6RHJ2VnBfRHRtZlNvZnR3YXJlU3RvcCBlbmQsIHJldD0lZCx1c2VEdG1mTG9vcD0lZFxuIiwgcmV0LGdfdm9pY2VWYXIudXNlRHRtZkxvb3ApOyANCi0gICAgfQ0KLSAgICBlbHNlIA0KLSAgICB7DQotICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ6RHJ2VnBfU29mdF9EdG1mX0xvb3AgcGF0aCBpcyBlcnJvciFcbiIpOw0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Tb2Z0X0R0bWZfTG9vcCBwYXRoIGlzIGVycm9yLHVzZUR0bWZMb29wPSVkIVxuIixnX3ZvaWNlVmFyLnVzZUR0bWZMb29wKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVVBQT1JURUQ7DQotICAgIH0NCi0gICAgDQotICAgIHJldCA9IHpEcnZWcF9Mb29wKHBhdGgpOw0KLSAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ6RHJ2VnBfU29mdF9EdG1mX0xvb3AgbGVhdmUgcmV0PSVkXG4iLHJldCk7DQotDQotICAgIHJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfTG9vcChUX1pEcnZfVnBQYXRoIHBhdGgpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcCBiZWdpbiBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzPSVkLHBhdGg9JWQiLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzLCBwYXRoKTsNCi0NCi0JaWYgKHBhdGggPT0gVlBfUEFUSF9PRkYpDQotCXsNCi0JCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0xPT1BfT04pDQotCQl7DQotCQkJcmV0ID0gekRydlZwX0xvb3BTdG9wKCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQkJfQ0KLQl9DQotCWVsc2UgaWYgKChwYXRoID09IFZQX1BBVEhfSEFORFNFVCkgfHwgKHBhdGggPT0gVlBfUEFUSF9IRUFEU0VUKSB8fCAocGF0aCA9PSBWUF9QQVRIX1NQRUFLRVIpKQ0KLQl7DQotCQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9MT09QX09OKQ0KLQkJew0KLQkJCXJldCA9IGhhbFZwQ2ZnX1NldElucHV0UGF0aChwYXRoLCBUUlVFKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyB2b2ljZV9TZXRQYWh0SW4gaGFsVnBDZmdfU2V0SW5wdXRQYXRoIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotCQkJcmV0ID0gaGFsVnBDZmdfU2V0T3V0cHV0UGF0aChwYXRoLCBUUlVFKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyB2b2ljZV9TZXRQYWh0T3V0IGhhbFZwQ2ZnX1NldE91dHB1dFBhdGggZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQkJCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJCX0NCi0JCQlnX3ZvaWNlVmFyLnZwTG9vcFBhdGggPSBwYXRoOw0KLQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldCA9IHpEcnZWcF9Mb29wU3RhcnQocGF0aCk7DQotCQl9DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfU1VQUE9SVEVEOw0KLQl9DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcCBlbmQgZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCxyZXQ9JWQiLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzLCByZXQpOw0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0vL2FkZGVkIGJ5IHpoYW5nbGl4aWENCi1TSU5UMzIgekRydlZwX054cFNldFBhcmFtKHpEcnZWcF9OeHBQYXJhbXNUb29sICpOeHBQYXJhbXNUb29sKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX1VTRV9OWFBfQVVEDQotLy8jaWZkZWYgX09TX1RPUw0KLQkvKiBpZigoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsIT1UUlVFKSkNCi0NCi0JICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOwkqLw0KLQ0KLQlCT09MICBpc0xvb3AgPSBmYWxzZTsNCi0JLy9VSU5UMTYgb2Zmc2V0PTB4MTk7DQotCS8vVUlOVDE2IHZvbHVtZWluZGV4ID0gMDsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF96RHJ2VnBfU2V0UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgoTnhwUGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChOeHBQYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlBhcmFtIGlzIE5VTEwhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQkvKiBpZihnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JRExFKQ0KLQkgew0KLQkgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLQkgfSovDQotDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0xPT1BfT04pDQotCXsNCi0JCWlzTG9vcCA9IFRSVUU7DQotCQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotCX0NCi0JLy9yZXQgPSBWcF9OeHBPcGVuKCk7DQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInJldD0lZCB2cCBWcF9OeHBPcGVuIixyZXQpOw0KLQkvL2dfdm9pY2VWYXIudnBQYXRoID0gVlBfUEFUSF9IQU5EU0VUOw0KLQkvL2dfdm9pY2VWYXIudnBWb2wgPSBWUF9WT0xfMzsNCi0NCi0JLyprbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBVTlJFQUNILkdFTiBkZWxldGUgaWYuLi5lbHNlLi4uKi8NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlZwX054cFNldFBhcmFtVG9vbCFcclxuIik7DQotCS8vdm9sdW1laW5kZXggPSogKE54cFBhcmFtc1Rvb2wtPnBQcmVzZXRSeCtvZmZzZXQpOw0KLQlyZXQgPSBWcF9OeHBTZXRQYXJhbVRvb2woZ192b2ljZVZhci52cFBhdGgsICBnX3ZvaWNlVmFyLnZwVm9sLCAgTnhwUGFyYW1zVG9vbCwgaXNMb29wLCBnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUpOw0KLQ0KLSNlbmRpZg0KLQlyZXR1cm4gcmV0Ow0KLX0NCi1TSU5UMzIgekRydlZwX054cEdldFBhcmFtKHpEcnZWcF9OeHBQYXJhbXNUb29sICpOeHBQYXJhbXNUb29sKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX1VTRV9OWFBfQVVEDQotLy8jaWZkZWYgX09TX1RPUw0KLQ0KLQkvKmlmKChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwhPVRSVUUpKQ0KLQ0KLQkgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07CSovDQotCUJPT0wgICBpc0xvb3AgPSBmYWxzZTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF96RHJ2VnBfR2V0UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgoTnhwUGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChOeHBQYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQkvKiBpZihnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JRExFKQ0KLQkgew0KLQkgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLQkgfSovDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0xPT1BfT04pDQotCXsNCi0JCWlzTG9vcCA9IFRSVUU7DQotCQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotCX0NCi0NCi0JLy9yZXQgPSBWcF9OeHBPcGVuKCk7DQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInJldD0lZCB2cCBWcF9OeHBPcGVuIixyZXQpOw0KLQkvL2dfdm9pY2VWYXIudnBQYXRoID0gVlBfUEFUSF9IQU5EU0VUOw0KLQkvLyBnX3ZvaWNlVmFyLnZwVm9sID0gVlBfVk9MXzM7DQotDQotCS8qa2xvY3dvcmsgMyBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggVU5SRUFDSC5HRU4gIGRlbGV0ZSBpZi4uLmVsc2UuLi4qLw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVnBfTnhwR2V0UGFyYW1Ub29sIVxyXG4iKTsNCi0JcmV0ID0gVnBfTnhwR2V0UGFyYW1Ub29sKGdfdm9pY2VWYXIudnBQYXRoLCAgZ192b2ljZVZhci52cFZvbCwgIE54cFBhcmFtc1Rvb2wsIGlzTG9vcCwgZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlKTsNCi0NCi0jZW5kaWYNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotLy9lbmQgYWRkZWQgYnkgemhhbmdsaXhpYQ0KLQ0KLQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0UGFyYW0oekRydlZwX1BhcmFtc1Rvb2wgKnBhcmFtc1Rvb2wpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLSNpZmRlZiBfVVNFX1dFQlJUQ19BVUQNCi0NCi0NCi0JQk9PTCAgaXNMb29wID0gZmFsc2U7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgocGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChwYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlBhcmFtIGlzIE5VTEwhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9MT09QX09OKQ0KLQl7DQotCQlpc0xvb3AgPSBUUlVFOw0KLQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQl9DQotDQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWcF9TZXRQYXJhbVRvb2whXHJcbiIpOw0KLQ0KLQlyZXQgPSBXZWJydGNfU2V0UGFyYW1Ub29sKGdfdm9pY2VWYXIudnBQYXRoLCAgZ192b2ljZVZhci52cFZvbCwgIHBhcmFtc1Rvb2wsIGlzTG9vcCwgZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlKTsNCi0jZW5kaWYNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9HZXRQYXJhbSh6RHJ2VnBfUGFyYW1zVG9vbCAqcGFyYW1zVG9vbCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRA0KLQ0KLQlCT09MICAgaXNMb29wID0gZmFsc2U7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfR2V0UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgocGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChwYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyA9PSBWUF9MT09QX09OKQ0KLQl7DQotCQlpc0xvb3AgPSBUUlVFOw0KLQkJcmV0dXJuIERSVl9TVUNDRVNTOw0KLQl9DQotDQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWcF9HZXRQYXJhbVRvb2whXHJcbiIpOw0KLQlyZXQgPSBXZWJydGNfR2V0UGFyYW1Ub29sKGdfdm9pY2VWYXIudnBQYXRoLCAgZ192b2ljZVZhci52cFZvbCwgIHBhcmFtc1Rvb2wsIGlzTG9vcCwgZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlKTsNCi0NCi0jZW5kaWYNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9TZXROdlBhcmFtKHpEcnZWcF9QYXJhbXNUb29sICpwYXJhbXNUb29sKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0jaWZkZWYgX1VTRV9XRUJSVENfQVVEDQotDQotDQotCUJPT0wgIGlzTG9vcCA9IGZhbHNlOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE52UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgocGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChwYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlBhcmFtIGlzIE5VTEwhXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVnBfU2V0TnZQYXJhbVRvb2whXHJcbiIpOw0KLQlyZXQgPSBXZWJydGNfU2V0TnZQYXJhbVRvb2woZ192b2ljZVZhci52cFBhdGgsICBnX3ZvaWNlVmFyLnZwVm9sLCAgcGFyYW1zVG9vbCwgaXNMb29wLCBnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUpOw0KLSNlbmRpZg0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0dldE52UGFyYW0oekRydlZwX1BhcmFtc1Rvb2wgKnBhcmFtc1Rvb2wpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLSNpZmRlZiBfVVNFX1dFQlJUQ19BVUQNCi0NCi0JQk9PTCAgIGlzTG9vcCA9IGZhbHNlOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0dldE52UGFyYW0gYmVnaW4gcGF0aD0lZCx2b2x1bWU9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCWlmICgocGFyYW1zVG9vbC0+cFByZXNldFJ4ID09IE5VTEwpIHx8IChwYXJhbXNUb29sLT5QcmVzZXRMZW5ndGhSeCA8PSAwKSkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVnBfR2V0TnZQYXJhbVRvb2whXHJcbiIpOw0KLQlyZXQgPSBXZWJydGNfR2V0TnZQYXJhbVRvb2woZ192b2ljZVZhci52cFBhdGgsICBnX3ZvaWNlVmFyLnZwVm9sLCAgcGFyYW1zVG9vbCwgaXNMb29wLCBnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUpOw0KLQ0KLSNlbmRpZg0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0jaWZkZWYgVk9JQ0VfVE9ORV9NSVhFUl9GVU5DVElPTg0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246IHpEcnZWcF9Ub25lTWl4ZXJTdGFydA0KLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RhcnQgbWl4ZXIgdG9uZS4NCi0gKiBQYXJhbWV0ZXJzOg0KLSAqICAgSW5wdXQ6Tm9uZQ0KLSAqICAgT3V0cHV0Ok5vbmUNCi0gKg0KLSAqIFJldHVybnM6IHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQ0KLSAqDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi1TSU5UMzIgekRydlZwX1RvbmVNaXhlclN0YXJ0KFRfWkRydlZwX1RvbmVOdW0gdG9uZU51bSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JcmV0ID0gekRydkF1ZGlvTV9HZXRSZXNvdXJjZShBVURJT19NQU5BR0VSX1JFU09VUkNFX1RPTkVfSU5fU1BFRUNIKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiB6RHJ2VnBfVG9uZU1peGVyU3RhcnQgZmFpbCB0byBnZXQgdG9uZSByZXNvdXJjZVxuIik7DQotCQlyZXR1cm4gcmV0Ow0KLQl9DQotCW1peGVyVG9uZUluZm8uY3VyX3RvbmVfZmNvdW50ID0gMDsNCi0JbWl4ZXJUb25lSW5mby5TdGFydE1peGVyID0gVFJVRTsNCi0NCi0JaWYgKChnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUgPT0gMSkgJiYgKGdfdm9pY2VWYXIudm9sdGVJc1diID09IDEpKQ0KLQl7DQotCQltaXhlclRvbmVJbmZvLmRhdGFfbWl4ZXJfb25jZXNpemUgPSAzMjA7DQotCQltaXhlclRvbmVJbmZvLmRhdGFJc1diID0gVFJVRTsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCW1peGVyVG9uZUluZm8uZGF0YV9taXhlcl9vbmNlc2l6ZSA9IDE2MDsNCi0JCW1peGVyVG9uZUluZm8uZGF0YUlzV2IgPSBGQUxTRTsNCi0NCi0JfQ0KLQlyZXQgPSBoYWxWcENmZ19HZXRNaXhlclRvbmVJbmZvKHRvbmVOdW0sICZtaXhlclRvbmVJbmZvKTsNCi0JLyoNCi0NCi0JICAgIGlmKDAgPT0gdG9uZU51bSkNCi0JICAgIHsNCi0JICAgICAgICBtaXhlclRvbmVJbmZvLnB0ZGF0YV9taXhlcj0oVUlOVDE2ICopbG93UG93ZXJQY207DQotCSAgICAgICAgLy9taXhlclRvbmVJbmZvLnRvbmVfdG90YWxfc2l6ZT1zaXplb2YobG93UG93ZXJQY20pL3NpemVvZihjaGFyKTsNCi0JICAgICAgICBtaXhlclRvbmVJbmZvLnRvbmVfdG90YWxfc2l6ZT1zaXplb2YobG93UG93ZXJQY20pL3NpemVvZihVSU5UMTYpOw0KLQ0KLQkgICAgfQ0KLQkgICAgew0KLQkgICAgICAgIG1peGVyVG9uZUluZm8ucHRkYXRhX21peGVyPShVSU5UMTYgKilzbXNQY207DQotCSAgICAgICAgbWl4ZXJUb25lSW5mby50b25lX3RvdGFsX3NpemU9c2l6ZW9mKHNtc1BjbSkvc2l6ZW9mKFVJTlQxNik7DQotCSAgICB9DQotCSAgICBlbHNlIGlmKDIgPT0gdG9uZU51bSkNCi0JICAgIHsNCi0JICAgICAgICBtaXhlclRvbmVJbmZvLnB0ZGF0YV9taXhlcj0oVUlOVDE2ICopY2FsbFN0YW5kYXJkUGNtOw0KLQkgICAgICAgIG1peGVyVG9uZUluZm8udG9uZV90b3RhbF9zaXplPXNpemVvZihjYWxsU3RhbmRhcmRQY20pL3NpemVvZihVSU5UMTYpOw0KLQkgICAgfQ0KLQkgICAgZWxzZSBpZigzID09IHRvbmVOdW0pDQotCSAgICB7DQotCSAgICAgICAgbWl4ZXJUb25lSW5mby5wdGRhdGFfbWl4ZXI9KFVJTlQxNiAqKWFsYXJtQmVlcFBjbTsNCi0JICAgICAgICBtaXhlclRvbmVJbmZvLnRvbmVfdG90YWxfc2l6ZT1zaXplb2YoYWxhcm1CZWVwUGNtKS9zaXplb2YoVUlOVDE2KTsNCi0JICAgIH0NCi0JICAgIGVsc2UgaWYoNCA9PSB0b25lTnVtKQ0KLQkgICAgew0KLQkgICAgICAgIG1peGVyVG9uZUluZm8ucHRkYXRhX21peGVyPShVSU5UMTYgKiljYWxsVGltZVBjbTsNCi0JICAgICAgICBtaXhlclRvbmVJbmZvLnRvbmVfdG90YWxfc2l6ZT1zaXplb2YoY2FsbFRpbWVQY20pL3NpemVvZihVSU5UMTYpOw0KLQkgICAgfQ0KLQkgICAgZWxzZQ0KLQkgICAgew0KLQkgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVG9uZU1peGVyU3RhcnQgcGFyYSBpcyBlcnJvciEiKTsNCi0JICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLQkgICAgfQ0KLQ0KLQkgICAgbWl4ZXJUb25lSW5mby5pbnRlcl9taXhlcl9mY291bnQ9bWl4ZXJUb25lSW5mby50b25lX3RvdGFsX3NpemUvVk9JQ0VfTUlYRVJfREFUQV9TSVpFOw0KLQkgICAgbWl4ZXJUb25lSW5mby5yZW1fbWl4ZXJfY291bnQ9bWl4ZXJUb25lSW5mby50b25lX3RvdGFsX3NpemUlVk9JQ0VfTUlYRVJfREFUQV9TSVpFOw0KLQkqLw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1RvbmVNaXhlclN0YXJ0IHRvbmVOdW09JWQscmV0PSVkISIsIHRvbmVOdW0sIHJldCk7DQotDQotCXJldHVybiByZXQ7DQotfQ0KLVNJTlQzMiB2b2ljZV9Ub25lTWl4ZXJTdG9wKFZPSUQpICAgLyphZGQgZm9yIDc1MDIgT25saW5lIFJlY29yZCovDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCW1peGVyVG9uZUluZm8uU3RhcnRNaXhlciA9IEZBTFNFOw0KLQltaXhlclRvbmVJbmZvLmN1cl90b25lX2Zjb3VudCA9IDA7DQotCW1peGVyVG9uZUluZm8ucmVtX21peGVyX2NvdW50ID0gMDsNCi0JbWl4ZXJUb25lSW5mby5pbnRlcl9taXhlcl9mY291bnQgPSAwOw0KLQkvL3B0ZGF0YV9taXhlcj10b25lQXJyYXk7DQotCXpEcnZBdWRpb01fRnJlZVJlc291cmNlKEFVRElPX01BTkFHRVJfUkVTT1VSQ0VfVE9ORV9JTl9TUEVFQ0gpOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidm9pY2VfVG9uZU1peGVyU3RvcCAhIik7DQotDQotCXJldHVybiByZXQ7DQotDQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfVG9uZU1peGVyU3RvcChWT0lEKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlyZXQgPSB2b2ljZV9Ub25lTWl4ZXJTdG9wKCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVG9uZU1peGVyU3RvcCByZXQhIiwgcmV0KTsNCi0JcmV0dXJuIHJldDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogdm9pY2VfTWl4ZXJEYXRhDQotICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBtaXhlciB0b25lIGRhdGEuDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Ok5vbmUNCi0gKiAgIE91dHB1dDpOb25lDQotICoNCi0gKiBSZXR1cm5zOiBzdWNjZXNzIG9yIGVycm9yIGNvZGUNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotDQotDQotDQotaW50IHZvaWNlX01peGVyRGF0YShTSU5UMTYqIGlucHV0MSwgU0lOVDE2KiBpbnB1dDIsIFNJTlQzMiBtaXhfY291bnQsIFNJTlQxNiogb3V0cHV0KQ0KLS8vc3RhdGljIGludCB2b2ljZV9NaXhlckRhdGEoU0lOVDE2KiBpbnB1dDEsIFNJTlQxNiogaW5wdXQyLCBTSU5UMzIgbWl4X2NvdW50LCBTSU5UMTYqIG91dHB1dCkNCi17DQotCWRvdWJsZSBmID0gMTsNCi0JU0lOVDMyIGkgPSAwOw0KLQ0KLQlTSU5UMzIgY29uc3QgU0lOVDE2X01BWCA9IChTSU5UMzIpKHBvdygyLjAsIDE1KSAtIDEpOw0KLQlTSU5UMzIgY29uc3QgU0lOVDE2X01JTiA9IChTSU5UMzIpKC1wb3coMi4wLCAxNSkpOw0KLQ0KLQkvL3ByaW50ZigiU0lOVDE2X01BWDogJWRcbiIsIFNJTlQxNl9NQVgpOw0KLQkvL3ByaW50ZigiU0lOVDE2X01JTjogJWRcbiIsIFNJTlQxNl9NSU4pOw0KLQ0KLQlpZiAoaW5wdXQxID09IE5VTEwgfHwgaW5wdXQyID09IE5VTEwgfHwgb3V0cHV0ID09IE5VTEwgfHwgbWl4X2NvdW50IDwgMCkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlmb3IgKGkgPSAwOyBpIDwgbWl4X2NvdW50OyBpKyspDQotCXsNCi0JCVNJTlQzMiB0ZW1wID0gMDsNCi0NCi0JCXRlbXAgPSAqKGlucHV0MSArIGkpICsgKihpbnB1dDIgKyBpKTsNCi0NCi0JCXRlbXAgPSAoU0lOVDMyKSh0ZW1wICogZik7DQotCQlpZiAodGVtcCA+IFNJTlQxNl9NQVgpDQotCQl7DQotCQkJZiA9IChkb3VibGUpU0lOVDE2X01BWCAvIChkb3VibGUpKHRlbXApOw0KLQkJCXRlbXAgPSBTSU5UMTZfTUFYOw0KLQkJCS8vcHJpbnRmKCJNQVgrK1xuIik7DQotCQkJLy9wcmludGYoICIlZCA9ICVkICsgJWQgXG4iLCB0ZW1wLCAqKGlucHV0MStpKSwgKihpbnB1dDIraSkpOw0KLQkJfQ0KLQkJaWYgKHRlbXAgPCBTSU5UMTZfTUlOKQ0KLQkJew0KLQkJCWYgPSAoZG91YmxlKVNJTlQxNl9NSU4gLyAoZG91YmxlKSh0ZW1wKTsNCi0JCQl0ZW1wID0gU0lOVDE2X01JTjsNCi0JCQkvL3ByaW50ZigiTUlOLS1cbiIsIGYpOw0KLQkJCS8vcHJpbnRmKCAiJWQgPSAlZCArICVkIFxuIiwgdGVtcCwgKihpbnB1dDEraSksICooaW5wdXQyK2kpKTsNCi0JCX0NCi0JCWlmIChmIDwgMS4wKQ0KLQkJew0KLQkJCWYgKz0gKChkb3VibGUpMSAtIGYpIC8gKGRvdWJsZSkzMjsNCi0JCX0NCi0NCi0JCSoob3V0cHV0ICsgaSkgPSB0ZW1wOw0KLQl9DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogdm9pY2VfVG9uZU1peGVyRGF0YQ0KLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGVhbCB3aXRoIG1peGVyICBkYXRhLg0KLSAqIFBhcmFtZXRlcnM6DQotICogICBJbnB1dDpOb25lDQotICogICBPdXRwdXQ6Tm9uZQ0KLSAqDQotICogUmV0dXJuczogc3VjY2VzcyBvciBlcnJvciBjb2RlDQotICoNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLS8vVUlOVDMyIHRvbmVfc2l6ZT1zaXplb2YodG9uZUFycmF5KS9zaXplb2YoVUlOVDE2KTsNCi0NCi0NCi0NCi0NCi0NCi0vL2N1cl90b25lX2Zjb3VudCs9MTsNCi0NCi0NCi0NCi0NCi0vL21peGVyVG9uZUluZm8uU3RhcnRNaXhlcj0gRkFMU0U7DQotDQotDQotDQotDQotU0lOVDMyIHZvaWNlX1RvbmVNaXhlckRhdGEoVUlOVDggKnB2ZGF0YSwgVUlOVDMyIHNpemUsIFVJTlQ4ICpwbWl4ZGF0YSkNCi17DQotCVNJTlQzMiByZXQgPSAwOw0KLQlVSU5UMzIgc2l6ZTE2ID0gc2l6ZSAvIHNpemVvZihTSU5UMTYpOw0KLQ0KLQkvL3ByaW50ZigibWl4ZXJUb25lSW5mby5jdXJfdG9uZV9mY291bnQgPSAlZFxuIiwgbWl4ZXJUb25lSW5mby5jdXJfdG9uZV9mY291bnQpOw0KLQ0KLQlpZiAobWl4ZXJUb25lSW5mby5jdXJfdG9uZV9mY291bnQgPCBtaXhlclRvbmVJbmZvLmludGVyX21peGVyX2Zjb3VudCkNCi0Jew0KLQkJcmV0ID0gdm9pY2VfTWl4ZXJEYXRhKChTSU5UMTYqKXB2ZGF0YSwgKFNJTlQxNiopbWl4ZXJUb25lSW5mby5wdGRhdGFfbWl4ZXIsIHNpemUxNiwgKFNJTlQxNiopcG1peGRhdGEpOw0KLQkJaWYgKHJldCAhPSAwKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZV9NaXhlckRhdGEgZmFpbGVkIik7DQotCQkJcmV0dXJuIHJldDsNCi0JCX0NCi0JCW1peGVyVG9uZUluZm8ucHRkYXRhX21peGVyICs9IHNpemUxNjsNCi0JCW1peGVyVG9uZUluZm8uY3VyX3RvbmVfZmNvdW50ICs9IDE7DQotDQotCX0NCi0JZWxzZSBpZiAobWl4ZXJUb25lSW5mby5jdXJfdG9uZV9mY291bnQgPT0gbWl4ZXJUb25lSW5mby5pbnRlcl9taXhlcl9mY291bnQpDQotCXsNCi0JCWlmIChtaXhlclRvbmVJbmZvLnJlbV9taXhlcl9jb3VudCA+IDApDQotCQl7DQotCQkJVUlOVDMyIG1zaXplID0gbWl4ZXJUb25lSW5mby5yZW1fbWl4ZXJfY291bnQ7DQotCQkJcmV0ID0gdm9pY2VfTWl4ZXJEYXRhKChTSU5UMTYqKXB2ZGF0YSwgKFNJTlQxNiopbWl4ZXJUb25lSW5mby5wdGRhdGFfbWl4ZXIsIG1zaXplLCAoU0lOVDE2KilwbWl4ZGF0YSk7DQotCQkJaWYgKHJldCAhPSAwKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZvaWNlX01peGVyRGF0YSBmYWlsZWQiKTsNCi0JCQkJcmV0dXJuIHJldDsNCi0JCQl9DQotCQkJek9zc19NZW1jcHkocG1peGRhdGEgKyBtc2l6ZSwgcHZkYXRhICsgbXNpemUsIHNpemUxNiAtIG1zaXplKTsNCi0JCX0NCi0NCi0JCS8vcHJpbnRmKCJ2b2ljZV9Ub25lTWl4ZXJTdG9wXG4iKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZV9Ub25lTWl4ZXJTdG9wIik7DQotCQl2b2ljZV9Ub25lTWl4ZXJTdG9wKCk7DQotCX0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0NCi0NCi0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX1VTRV9BVURFWFRfQ09ERUNfUEFUSF9JTlRGDQotU0lOVDMyIHpEcnZWcF9TZXRGbVBhdGgoVF9aRHJ2X1ZwUGF0aCBwYXRoLCBCT09MIGVuYWJsZSkNCi17DQotDQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0Rm1QYXRoIGJlZ2luIHBhdGg9JWQsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZCEiLCBwYXRoLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRGbVBhdGggYmVnaW4gZW5hYmxlPSVkISIsIGVuYWJsZSk7DQotCWlmIChwYXRoID49IE1BWF9WUF9QQVRIKQ0KLQl7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmIChlbmFibGUpDQotCXsNCi0NCi0JCXJldCA9IHpEcnZBdWRpb01fR2V0UmVzb3VyY2UoQVVESU9fTUFOQUdFUl9SRVNPVVJDRV9GTSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgekRydlZwX1NldEZtUGF0aCBmYWlsIHRvIGdldCBmbSByZXNvdXJjZVxuIik7DQotCQkJcmV0dXJuIHJldDsNCi0JCX0NCi0NCi0JCXJldCA9IGhhbFZwQ2ZnX1NldEZtUGF0aChwYXRoLCBUUlVFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRGbVBhdGggIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCQl6RHJ2QXVkaW9NX0ZyZWVSZXNvdXJjZShBVURJT19NQU5BR0VSX1JFU09VUkNFX0ZNKTsNCi0JCX0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXJldCA9IGhhbFZwQ2ZnX1NldEZtUGF0aChwYXRoLCBGQUxTRSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQ0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0Rm1QYXRoICBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydkF1ZGlvTV9GcmVlUmVzb3VyY2UoQVVESU9fTUFOQUdFUl9SRVNPVVJDRV9GTSk7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9TZXRJbnB1dE11dGUoQk9PTCBvbm9mZikNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JcmV0ID0gaGFsVnBDZmdfU2V0SW5wdXRNdXRlKG9ub2ZmKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRJbnB1dE11dGUgIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi0NCi19DQotDQotU0lOVDMyIHpEcnZWcF9TZXRPdXRwdXRNdXRlKEJPT0wgb25vZmYpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXJldCA9IGhhbFZwQ2ZnX1NldE91dHB1dE11dGUob25vZmYpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldE91dHB1dE11dGUgIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi0NCi19DQotI2VuZGlmDQotDQotVk9JRCB6RHJ2RHRtZl9EZXRlY3RfUmVnQ2FsbGJhY2tzKFRfRHJ2RHRtZl9EZXRlY3RfT3B0IGR0bWZPYmopDQotew0KLSAgICBnRHJ2RHRtZl9EZXRlY3RfT2JqID0gZHRtZk9iajsNCi19DQotDQotI2lmIDANCi1zdGF0aWMgWk9TU19USFJFQURfSUQgc19hdWRpb1BiTG9vcFRocmVhZCA9IE5VTEw7DQotc3RhdGljIFpPU1NfVEhSRUFEX0lEIHNfYXVkaW9DYUxvb3BUaHJlYWQgID0gTlVMTDsNCi1zdGF0aWMgWk9TU19TRU1BUEhPUkVfSUQgc19jYXB1dGVyRG9uZVNlbWFwaG9yZSA9IE5VTEw7DQotDQotc3RhdGljIFRfWkRydkkyU19JZCBJMlNfSUQgPSBJMlNfMTsNCi1CT09MIHJlYWRSdW5pbmcgPSBGQUxTRTsNCi1CT09MIHdyaXRlUnVuaW5nID0gRkFMU0U7DQotDQotVUlOVDggKnBBdWRpb1BiYnVmZmVyID0gTlVMTDsNCi1VSU5UOCAqcEF1ZGlvQ2FidWZmZXIgPSBOVUxMOw0KLXN0YXRpYyBVSU5UMzIgcGJDb3VudCA9IDA7DQotY29uc3QgVUlOVDMyIGNhQ291bnQgPSAyMjUwOw0KLXN0YXRpYyBWT0lEIGF1ZGlvUGJMb29wVGhyZWFkKFNJTlQzMiBVTkRFRikvL3hpdSBnYWkgY2h1DQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCVNJTlQzMiBjb3VudCA9IDA7DQotCVVJTlQ4ICpidWZwdHIgPSBwQXVkaW9QYmJ1ZmZlcjsNCi0JVUlOVDMyIGF1ZF9sZW4gPSAzMjA7DQotCVVJTlQ4ICphdWRfYnVmID0gTlVMTDsNCi0JVUlOVDMyIGxlbmd0aCA9IDA7DQotCVRfWkRydkkyc19QYXJhbXMgcGFyYW1ldGVyID0gezB9Ow0KLQlUX1pEcnZJMlNfQ2ZnIHBsYXlJMnNDZmc7DQotDQotCWxlbmd0aCA9IChwYkNvdW50IC8gYXVkX2xlbikgKiBhdWRfbGVuOw0KLQlwYXJhbWV0ZXIuY2hhbm5lbCA9IEFVRElPX01PTk9fQ0hBTk5FTDsNCi0JcGFyYW1ldGVyLmJ1ZmZlcnNpemUgPSBhdWRfbGVuOy8vMTAyNDAgIGZvciBmaWxlLDExMjsgIDExMiBqdXN0ICBmb3IgZGF0YQ0KLQlwYXJhbWV0ZXIucF9jYiA9IE5VTEw7DQotDQotCXBsYXlJMnNDZmcuYk1hc3RlciA9IFRSVUU7DQotCXBsYXlJMnNDZmcuc2FtcGxlX3JhdGUgPSA4MDAwOw0KLQlwbGF5STJzQ2ZnLnREYXRhRm10ID0gSTJTX0RBVEFfMTZCSVQ7Ly9JMlNfREFUQV8xNkJJVDsNCi0JcGxheUkyc0NmZy50VHNXaWR0aCA9IEkyU19UU18xNkNZQ0xFOy8vSTJTX1RTXzE2Q1lDTEU7DQotCXBsYXlJMnNDZmcudFRyYWNrRm10ID0gTEVGVF9UUkFDSzsvL1JJR0hUX1RSQUNLOy8vTEVGVF9UUkFDSw0KLQlwbGF5STJzQ2ZnLnRUZXN0TW9kZSA9IEkyU19OT1JNQUxfTU9ERTsNCi0JcGxheUkyc0NmZy50VGltaW5nVHlwZSA9IFRJTUlOR19JMlNfTU9OT19MRUZUOw0KLQlwbGF5STJzQ2ZnLnRQY21Gc3luYyA9IFBDTV9TSE9SVF9GU1lOQzsNCi0JcGxheUkyc0NmZy50VGRtRXh0Q3ljbGUgPSBURE1fTk9fRVhUUkFfQ1lDTEU7DQotCXBsYXlJMnNDZmcudENsa01vZGUgPSBJMlNfVElNRV9NT0RFOw0KLQ0KLQ0KLQlwbGF5STJzQ2ZnLnRUcmFuc01vZGUgPSBEQVRBX0FMSUdOX1NURF9JMlM7DQotCXBsYXlJMnNDZmcudFRhbnNtaXRfZWRnZSA9IFRSQU5TX05FR0FUSVZFX1BPU0lUSVZFOy8vZm9yIGkycyBtb2RlOw0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1N0YXJ0KEkyU19JRCwgJnBhcmFtZXRlciwgJnBsYXlJMnNDZmcpOw0KLQ0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQlyZXR1cm47DQotCX0NCi0Jd2hpbGUgKDEpDQotCXsNCi0JCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVudGVyIGF1ZGlvUGJMb29wVGhyZWFkIHdoaWxlIGJlZm9yZVxuIik7DQotCQl3aGlsZSAod3JpdGVSdW5pbmcgPT0gVFJVRSkNCi0JCXsNCi0JCQkvLyB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZW50ZXIgYXVkaW9QYkxvb3BUaHJlYWQgd2hpbGUgYWZ0ZXJcbiIpOw0KLQ0KLQkJCXJldCArPSB6RHJ2STJTX0dldEJ1ZihJMlNfSUQsICZhdWRfYnVmLCAmYXVkX2xlbik7DQotCQkJek9zc19NZW1jcHkoYXVkX2J1ZiwgYnVmcHRyLCBhdWRfbGVuKTsNCi0NCi0JCQlyZXQgKz0gekRydkkyU19Xcml0ZShJMlNfSUQsIGF1ZF9idWYsIGF1ZF9sZW4pOw0KLQkJCWJ1ZnB0ciArPSBhdWRfbGVuOw0KLQkJCWNvdW50ICs9IGF1ZF9sZW47DQotCQkJaWYgKGNvdW50ID49IGxlbmd0aCkNCi0JCQl7DQotCQkJCWJ1ZnB0ciA9IHBBdWRpb1BiYnVmZmVyOw0KLQkJCQljb3VudCA9IDA7DQotCQkJfQ0KLQ0KLQkJfQ0KLQkJLy96T3NzX1NsZWVwKDIwKTsNCi0JfQ0KLX0NCi1CT09MIHRlc3RBdWRpb1N0YXJ0ID0gRkFMU0U7DQotLy9zdGF0aWMgQk9PTCBzX211dGV4X0ZpcnN0VXNlID0gRkFMU0U7Ly94aXUgZ2FpIGNodQ0KLS8vc3RhdGljIFpPU1NfTVVURVhfSUQgc19hdXRvQXVkaW9UZXN0TXV0ZXhJRCA9IE5VTEw7Ly94aXUgZ2FpIGNodQ0KLXN0YXRpYyBWT0lEIGF1ZGlvQ2FMb29wVGhyZWFkKFNJTlQzMiBVTkRFRikvL3hpdSBnYWkgY2h1IGdhaSBiaWFuIGhhbiBzaGVuZyBtaW5nDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVRfWkRydkkyU19DZmcgcGxheUkyc0NmZyA9IHswfTsNCi0JVF9aRHJ2STJzX1BhcmFtcyBwYXJhbXMgPSB7MH07DQotCUJPT0wgZmlyc3RGdWxsID0gRkFMU0U7DQotCVVJTlQ4ICpyZWFkX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiByZWFkX2xlbiA9IDMyMDsNCi0JVUlOVDMyIGNvdW50ID0gMDsNCi0JVUlOVDggKlJ4QnVmZmVyID0gcEF1ZGlvQ2FidWZmZXI7DQotCVVJTlQzMiBsZW5ndGggPSAwOw0KLQlsZW5ndGggPSAoY2FDb3VudCAvIHJlYWRfbGVuKSAqIHJlYWRfbGVuOw0KLQlwYXJhbXMuY2hhbm5lbCA9IEFVRElPX01PTk9fQ0hBTk5FTDsNCi0JcGFyYW1zLmJ1ZmZlcnNpemUgPSAzMjA7DQotCXBhcmFtcy5wX2NiID0gTlVMTDsNCi0NCi0JcGxheUkyc0NmZy5iTWFzdGVyID0gVFJVRTsNCi0JcGxheUkyc0NmZy5zYW1wbGVfcmF0ZSA9IDgwMDA7DQotCXBsYXlJMnNDZmcudERhdGFGbXQgPSBJMlNfREFUQV8xNkJJVDsvL0kyU19EQVRBXzE2QklUOw0KLQlwbGF5STJzQ2ZnLnRUc1dpZHRoID0gSTJTX1RTXzE2Q1lDTEU7Ly9JMlNfVFNfMTZDWUNMRTsNCi0JcGxheUkyc0NmZy50VHJhY2tGbXQgPSBMRUZUX1RSQUNLOy8vUklHSFRfVFJBQ0s7Ly9MRUZUX1RSQUNLDQotCXBsYXlJMnNDZmcudFRlc3RNb2RlID0gSTJTX05PUk1BTF9NT0RFOw0KLQlwbGF5STJzQ2ZnLnRDbGtNb2RlID0gSTJTX1RJTUVfTU9ERTsNCi0NCi0JcGxheUkyc0NmZy50VGltaW5nVHlwZSA9IFRJTUlOR19JMlNfTU9OT19MRUZUOw0KLQlwbGF5STJzQ2ZnLnRQY21Gc3luYyA9IFBDTV9TSE9SVF9GU1lOQzsNCi0JcGxheUkyc0NmZy50VGRtRXh0Q3ljbGUgPSBURE1fTk9fRVhUUkFfQ1lDTEU7DQotDQotCXBsYXlJMnNDZmcudFRyYW5zTW9kZSA9IERBVEFfQUxJR05fU1REX0kyUzsNCi0JcGxheUkyc0NmZy50VGFuc21pdF9lZGdlID0gVFJBTlNfTkVHQVRJVkVfUE9TSVRJVkU7Ly9mb3IgaTJzIG1vZGU7DQotDQotCXJldCArPSB6RHJ2STJTX1JlYWRfU3RhcnQoSTJTX0lELCAmcGFyYW1zLCAmcGxheUkyc0NmZyk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXJldHVybjsNCi0JfQ0KLQl3aGlsZSAoMSkNCi0Jew0KLQ0KLQkJd2hpbGUgKHJlYWRSdW5pbmcgPT0gVFJVRSkNCi0JCXsNCi0NCi0JCQlyZXQgPSB6RHJ2STJTX1JlYWQoSTJTX0lELCAmcmVhZF9idWYsICZyZWFkX2xlbik7DQotCQkJLy96T3NzX0dldE11dGV4KHNfYXV0b0F1ZGlvVGVzdE11dGV4SUQsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0NCi0JCQl6T3NzX01lbWNweShSeEJ1ZmZlciwgcmVhZF9idWYsIHJlYWRfbGVuKTsNCi0NCi0JCQlSeEJ1ZmZlciArPSByZWFkX2xlbjsNCi0JCQljb3VudCArPSByZWFkX2xlbjsNCi0JCQkvL3pPc3NfUHV0TXV0ZXgoc19hdXRvQXVkaW9UZXN0TXV0ZXhJRCk7DQotDQotCQkJcmV0ID0gekRydkkyU19GcmVlQnVmKEkyU19JRCwgcmVhZF9idWYpOw0KLQkJCWlmIChjb3VudCA+PSBsZW5ndGgpDQotCQkJew0KLQkJCQlpZiAoZmlyc3RGdWxsID09IEZBTFNFKQ0KLQkJCQl7DQotCQkJCQlpZiAoWk9TU19TVUNDRVNTICE9IHpPc3NfUHV0U2VtYXBob3JlKHNfY2FwdXRlckRvbmVTZW1hcGhvcmUpKQ0KLQkJCQkJew0KLQkJCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJhdWRpb0NhTG9vcFRocmVhZCBwdXQgc2VtYSBlcnJvci5cbiIpOw0KLQkJCQkJCWNvbnRpbnVlOw0KLQkJCQkJfQ0KLQkJCQkJZmlyc3RGdWxsID0gVFJVRTsNCi0JCQkJfQ0KLQkJCQljb3VudCA9IDA7DQotCQkJCS8vcmVjb3JkRmlsZUZsYWcgPSAwOw0KLQkJCQlSeEJ1ZmZlciA9IHBBdWRpb0NhYnVmZmVyOw0KLQkJCX0NCi0JCX0NCi0JCS8vek9zc19TbGVlcCgyMCk7DQotDQotCX0NCi19DQotDQotDQotU0lOVDMyIHpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aChUX1pEcnZfVnBQYXRoIHBhdGgpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVNJTlQzMiBhdWRpb0xvb3BSZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9IYWxBdWRpb0xvb3BUZXN0SW5mbyBpbmZvID0gezB9Ow0KLQlUX1pEcnZfVnBWb2wgb3V0cGF0aHZvbFs0XTsNCi0NCi0JVF9aRHJ2X1ZwRnMgY29kZWNmczsNCi0JVUlOVDMyIHNhbXBmcyA9IDA7DQotCVVJTlQ4ICpwYnVmZmVyID0gTlVMTDsNCi0JVF9IYWxBdWRpb0xvb3BUZXN0UHJhIGF1ZGlvUHJhID0gezB9Ow0KLQlpZiAodGVzdEF1ZGlvU3RhcnQgPT0gVFJVRSkgcmV0dXJuIERSVl9FUlJfQlVTWTsNCi0JdGVzdEF1ZGlvU3RhcnQgPSBUUlVFOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1Rlc3RBdWRpb0xvb3BQYXRoICBvcGVuIVxuIik7DQotCXJlYWRSdW5pbmcgPSBGQUxTRTsNCi0Jd3JpdGVSdW5pbmcgPSBGQUxTRTsNCi0JLyppZiAoRkFMU0UgPT0gc19tdXRleF9GaXJzdFVzZSkNCi0Jew0KLQkgICAgc19hdXRvQXVkaW9UZXN0TXV0ZXhJRCA9IHpPc3NfQ3JlYXRlTXV0ZXgoImF1dG9BdWRpb1Rlc3RNdXRleCIsICBaT1NTX0lOSEVSSVQpOyAgIC8vY3JlYXRlIG11dGV4DQotCSAgICBzX211dGV4X0ZpcnN0VXNlPVRSVUU7DQotCX0qLw0KLQ0KLQlyZXQgPSBoYWxWcENmZ19HZXRBdWRpb0xvb3BJbmZvKCZpbmZvKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCBoYWxWcENmZ19HZXRBdWRpb0xvb3BJbmZvIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXRlc3RBdWRpb1N0YXJ0ID0gRkFMU0U7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXBBdWRpb1BiYnVmZmVyID0gaW5mby5wdGRhdGE7DQotCXBiQ291bnQgPSBpbmZvLnRvdGFsU2l6ZTsNCi0Jc2FtcGZzID0gaW5mby5zYW1wRnM7DQotCW91dHBhdGh2b2xbMF0gPSBpbmZvLm91dHBhdGh2b2xbMF07DQotCW91dHBhdGh2b2xbMV0gPSBpbmZvLm91dHBhdGh2b2xbMV07DQotCW91dHBhdGh2b2xbMl0gPSBpbmZvLm91dHBhdGh2b2xbMl07DQotCW91dHBhdGh2b2xbM10gPSBpbmZvLm91dHBhdGh2b2xbM107DQotDQotCXpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgInNhbXBmcz0lZCFcbiIsIHNhbXBmcyk7DQotDQotCWlmIChzYW1wZnMgPT0gODAwMCkNCi0Jew0KLQkJY29kZWNmcyA9IFZQX0ZTXzgwMDA7DQotCX0NCi0JZWxzZSBpZiAoc2FtcGZzID09IDE2MDAwKQ0KLQl7DQotCQljb2RlY2ZzID0gVlBfRlNfMTYwMDA7DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQl0ZXN0QXVkaW9TdGFydCA9IEZBTFNFOw0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NVUFBPUlRFRDsNCi0JfQ0KLQ0KLQkvL3RlbXAgPSBjYWxfZnJlcV9mZnQoIHBBdWRpb1BiYnVmZmVyLDEwMjQsMTYwMDApOw0KLQkvL3pPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwidGVtcD0lZiFcbiIsdGVtcCk7DQotDQotDQotCXJldCA9IGhhbFZwQ2ZnX09wZW4oVlBfVk9JQ0VfU09VUkNFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCBoYWxWcENmZ19PcGVuIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXRlc3RBdWRpb1N0YXJ0ID0gRkFMU0U7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX1NldEZzKGNvZGVjZnMpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1Rlc3RBdWRpb0xvb3BQYXRoIGhhbFZwQ2ZnX1NldEZzIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCWhhbFZwQ2ZnX0Nsb3NlKCk7DQotCQl0ZXN0QXVkaW9TdGFydCA9IEZBTFNFOw0KLQ0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0NCi0JfQ0KLQ0KLQlyZXQgPSBoYWxWcENmZ19TZXRJbnB1dFBhdGgocGF0aCwgVFJVRSk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQloYWxWcENmZ19DbG9zZSgpOw0KLQkJdGVzdEF1ZGlvU3RhcnQgPSBGQUxTRTsNCi0NCi0JCXJldHVybiBEUlZfRVJST1I7DQotDQotCX0NCi0NCi0JcmV0ID0gaGFsVnBDZmdfU2V0T3V0cHV0UGF0aChwYXRoLCBUUlVFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggaGFsVnBDZmdfU2V0T3V0cHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQloYWxWcENmZ19DbG9zZSgpOw0KLQkJdGVzdEF1ZGlvU3RhcnQgPSBGQUxTRTsNCi0NCi0JCXJldHVybiBEUlZfRVJST1I7DQotDQotCX0NCi0JaWYgKHBhdGggPT0gVlBfUEFUSF9TUEVBS0VSKQ0KLQl7DQotCQlyZXQgPSBoYWxWcENmZ19TZXRPdXRwdXRWb2wob3V0cGF0aHZvbFswXSk7DQotDQotCX0NCi0JZWxzZSBpZiAocGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpDQotCXsNCi0JCXJldCA9IGhhbFZwQ2ZnX1NldE91dHB1dFZvbChvdXRwYXRodm9sWzFdKTsNCi0JfQ0KLQllbHNlIGlmIChwYXRoID09IFZQX1BBVEhfSEVBRFNFVCkNCi0Jew0KLQkJcmV0ID0gaGFsVnBDZmdfU2V0T3V0cHV0Vm9sKG91dHBhdGh2b2xbMl0pOw0KLQl9DQotCWVsc2UNCi0Jew0KLQkJcmV0ID0gaGFsVnBDZmdfU2V0T3V0cHV0Vm9sKG91dHBhdGh2b2xbM10pOw0KLQl9DQotDQotCXJldCA9IHpEcnZJMlNfT3BlbihJMlNfSUQsIFRSQU5TX0RNQV9NT0RFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJek9zc19QcmludGYoMSwgMSwgInpEcnZJMlNfT3BlbiBmYWlsIHJldD0leFxuIiwgcmV0KTsNCi0JCWhhbFZwQ2ZnX0Nsb3NlKCk7DQotCQl0ZXN0QXVkaW9TdGFydCA9IEZBTFNFOw0KLQ0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlwQXVkaW9DYWJ1ZmZlciA9IChVSU5UOCopek9zc19NYWxsb2MoY2FDb3VudCk7DQotCXBidWZmZXIgPSAoVUlOVDgqKXpPc3NfTWFsbG9jKGNhQ291bnQpOw0KLQ0KLQlyZXQgPSBoYWxWcENmZ19FbmFibGUoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCBoYWxWcENmZ19FbmFibGUgZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJaGFsVnBDZmdfQ2xvc2UoKTsNCi0JCXpEcnZJMlNfQ2xvc2UoSTJTXzEpOw0KLQkJdGVzdEF1ZGlvU3RhcnQgPSBGQUxTRTsNCi0NCi0JCXJldHVybiBEUlZfRVJST1I7DQotDQotCX0NCi0NCi0Jc19jYXB1dGVyRG9uZVNlbWFwaG9yZSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJDYXB1dGVyRG9uZVNlbWFwaG9yZSIsIDApOw0KLQlzX2F1ZGlvUGJMb29wVGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoImF1ZGlvUGJMb29wVGhyZWFkIiwgYXVkaW9QYkxvb3BUaHJlYWQsIDAsIDEwMjQgKiAyLCAyMCwgMSwgMSk7DQotCWlmIChzX2F1ZGlvUGJMb29wVGhyZWFkID09IE5VTEwpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdCBhdWRpb1BiTG9vcFRocmVhZCBmYWlsXG4iKTsNCi0JfQ0KLQ0KLQ0KLQlzX2F1ZGlvQ2FMb29wVGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoImF1ZGlvQ2FMb29wVGhyZWFkIiwgYXVkaW9DYUxvb3BUaHJlYWQsIDAsIDEwMjQgKiAyLCAyMCwgMSwgMSk7DQotDQotCWlmIChzX2F1ZGlvQ2FMb29wVGhyZWFkID09IE5VTEwpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdCBhdWRpb0NhTG9vcFRocmVhZCBmYWlsXG4iKTsNCi0JfQ0KLQ0KLQlyZWFkUnVuaW5nID0gVFJVRTsNCi0Jd3JpdGVSdW5pbmcgPSBUUlVFOw0KLQ0KLQl6T3NzX0dldFNlbWFwaG9yZShzX2NhcHV0ZXJEb25lU2VtYXBob3JlLCBaT1NTX1dBSVRfRk9SRVZFUik7DQotDQotCS8vek9zc19HZXRNdXRleChzX2F1dG9BdWRpb1Rlc3RNdXRleElELCBaT1NTX1dBSVRfRk9SRVZFUik7DQotCWF1ZGlvUHJhLnNyYyA9IHBBdWRpb0NhYnVmZmVyOw0KLQlhdWRpb1ByYS5kZXN0ID0gcGJ1ZmZlcjsNCi0JYXVkaW9QcmEuc2FtcGZzID0gc2FtcGZzOw0KLQlhdWRpb0xvb3BSZXQgPSBoYWxWcENmZ19HZXRBdWRpb0xvb3BSZXN1bHQoJmF1ZGlvUHJhKTsNCi0JLy96T3NzX1B1dE11dGV4KHNfYXV0b0F1ZGlvVGVzdE11dGV4SUQpOw0KLQ0KLQ0KLQlyZWFkUnVuaW5nID0gRkFMU0U7DQotCXdyaXRlUnVuaW5nID0gRkFMU0U7DQotCXJldCA9IHpEcnZJMlNfUmVhZF9TdG9wKEkyU19JRCk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggekRydkkyU19SZWFkX1N0b3AgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQ0KLQl9DQotCXJldCArPSB6RHJ2STJTX1dyaXRlX1N0b3AoSTJTX0lEKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCB6RHJ2STJTX1dyaXRlX1N0b3AgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQ0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX0Nsb3NlKCk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVGVzdEF1ZGlvTG9vcFBhdGggaGFsVnBDZmdfQ2xvc2UgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQ0KLQl9DQotDQotCXpPc3NfRGVsZXRlVGhyZWFkKHNfYXVkaW9QYkxvb3BUaHJlYWQpOw0KLQlzX2F1ZGlvUGJMb29wVGhyZWFkID0gTlVMTDsNCi0NCi0Jek9zc19EZWxldGVUaHJlYWQoc19hdWRpb0NhTG9vcFRocmVhZCk7DQotCXNfYXVkaW9DYUxvb3BUaHJlYWQgPSBOVUxMOw0KLQ0KLQl6T3NzX0RlbGV0ZVNlbWFwaG9yZShzX2NhcHV0ZXJEb25lU2VtYXBob3JlKTsNCi0Jc19jYXB1dGVyRG9uZVNlbWFwaG9yZSA9IE5VTEw7DQotDQotCXJldCA9IHpEcnZJMlNfQ2xvc2UoSTJTXzEpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1Rlc3RBdWRpb0xvb3BQYXRoIGVycm9yOiB6RHJ2STJTX0Nsb3NlIEkyUzEgIHJldD0lZCIsIHJldCk7DQotCX0NCi0NCi0Jek9zc19GcmVlKHBBdWRpb0NhYnVmZmVyKTsNCi0JcEF1ZGlvQ2FidWZmZXIgPSBOVUxMOw0KLQ0KLQl6T3NzX0ZyZWUocGJ1ZmZlcik7DQotCXBidWZmZXIgPSBOVUxMOw0KLQ0KLQkvL2Nsb3NlIHByb2Nlc3MNCi0NCi0JdGVzdEF1ZGlvU3RhcnQgPSBGQUxTRTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCBlbmQhXG4iKTsNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9UZXN0QXVkaW9Mb29wUGF0aCBhdWRpb0xvb3BSZXQ9JWQiLCBhdWRpb0xvb3BSZXQpOw0KLQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJhdWRpb0xvb3BSZXQ9JWQhXG4iLCBhdWRpb0xvb3BSZXQpOw0KLQ0KLQlyZXR1cm4gYXVkaW9Mb29wUmV0Ow0KLQ0KLX0NCi1zdGF0aWMgdm9pZCBmZnQoU0lOVDE2ICpkYXRhLCBET1VCTEUgKngsIERPVUJMRSAqeSwgVUlOVDE2IG4sIFNJTlQxNiBzaWduKQ0KLXsNCi0JVUlOVDE2IGksIGosIGssIGwsIG0sIG4xLCBuMjsNCi0JRE9VQkxFIGMsIGMxLCBlLCBzLCBzMSwgdCwgdHIsIHRpOw0KLQkvL0NhbGN1bGF0ZSBpID0gbG9nMk4NCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykNCi0Jew0KLQkJeFtpXSA9IGRhdGFbaV07DQotCQkvL3pPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwiY2FsX2ZyZXFfZmZ0IHhbJWRdPSVmLGRhdGE9JWQhXG4iLGkseFtpXSxkYXRhW2ldKTsNCi0NCi0JfQ0KLQlmb3IgKGogPSAxLCBpID0gMTsgaSA8IDIwOyBpKyspDQotCXsNCi0JCW0gPSBpOw0KLQkJaiA9IDIgKiBqOw0KLQkJaWYgKGogPT0gbikNCi0JCQlicmVhazsNCi0JfQ0KLQ0KLQkvL7zGy+O1+9DOzby1xMrkyOvPwrHqo6jC6867tbm2waOpDQotCW4xID0gbiAtIDE7DQotCWZvciAoaiA9IDAsIGkgPSAwOyBpIDwgbjE7IGkrKykNCi0Jew0KLQkJaWYgKGkgPCBqKQ0KLQkJew0KLQkJCXRyID0geFtqXTsNCi0JCQl0aSA9IHlbal07DQotCQkJeFtqXSA9IHhbaV07DQotCQkJeVtqXSA9IHlbaV07DQotCQkJeFtpXSA9IHRyOw0KLQkJCXlbaV0gPSB0aTsNCi0JCX0NCi0JCWsgPSBuIC8gMjsNCi0JCXdoaWxlIChrIDwgKGogKyAxKSkNCi0JCXsNCi0JCQlqID0gaiAtIGs7DQotCQkJayA9IGsgLyAyOw0KLQkJfQ0KLQkJaiA9IGogKyBrOw0KLQl9DQotCS8vvMbL48O/0ru8trXEyuSz9qOsbM6qxLPSu7y2o6xpzqrNrNK7vLa1xLK7zazIuqOsyrnTw82s0rvE2rTmo6i8tM671MvL46OpDQotCW4xID0gMTsNCi0JZm9yIChsID0gMTsgbCA8PSBtOyBsKyspDQotCXsNCi0JCW4xID0gMiAqIG4xOw0KLQkJbjIgPSBuMSAvIDI7DQotCQllID0gMy4xNDE1OTI2IC8gbjI7DQotCQljID0gMS4wOw0KLQkJcyA9IDAuMDsNCi0JCWMxID0gY29zKGUpOw0KLQkJczEgPSAtc2lnbiAqIHNpbihlKTsNCi0JCWZvciAoaiA9IDA7IGogPCBuMjsgaisrKQ0KLQkJew0KLQkJCWZvciAoaSA9IGo7IGkgPCBuOyBpICs9IG4xKQ0KLQkJCXsNCi0JCQkJayA9IGkgKyBuMjsNCi0JCQkJdHIgPSBjICogeFtrXSAtIHMgKiB5W2tdOw0KLQkJCQl0aSA9IGMgKiB5W2tdICsgcyAqIHhba107DQotCQkJCXhba10gPSB4W2ldIC0gdHI7DQotCQkJCXlba10gPSB5W2ldIC0gdGk7DQotCQkJCXhbaV0gPSB4W2ldICsgdHI7DQotCQkJCXlbaV0gPSB5W2ldICsgdGk7DQotCQkJfQ0KLQkJCXQgPSBjOw0KLQkJCWMgPSBjICogYzEgLSBzICogczE7DQotCQkJcyA9IHQgKiBzMSArIHMgKiBjMTsNCi0JCX0NCi0JfQ0KLQkvL8jnufvKx8fzSUZGVKOs1Nmz/dLUTg0KLQlpZiAoc2lnbiA9PSAtMSkNCi0Jew0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykNCi0JCXsNCi0JCQl4W2ldIC89IG47DQotCQkJeVtpXSAvPSBuOw0KLQkJfQ0KLQl9DQotfQ0KLXN0YXRpYyB2b2lkIG1heF9mZnQoRE9VQkxFICphLCBVSU5UMTYgbiwgVUlOVDE2ICpoKQ0KLXsNCi0JVUlOVDE2IGkgPSAwOw0KLQkqaCA9IDU7DQotCWZvciAoaSA9IDU7IGkgPCBuOyBpKyspDQotCXsNCi0JCWlmIChhW2ldID4gYVsqaF0pDQotCQkJKmggPSBpOw0KLQl9DQotDQotfQ0KLQ0KLXN0YXRpYyB2b2lkIGFic19mZnQoRE9VQkxFICp4LCBET1VCTEUgKnksIFVJTlQxNiBuLCBET1VCTEUgKnopDQotew0KLQlVSU5UMTYgaSA9IDA7DQotDQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspDQotCXsNCi0JCXpbaV0gPSBzcXJ0KHhbaV0gKiB4W2ldICsgeVtpXSAqIHlbaV0pOw0KLQl9DQotDQotDQotDQotfQ0KLVNJTlQzMiBjYWxfZnJlcV9mZnQoU0lOVDE2ICpkYXRhLCB6RHJ2VnBfRnJlcWZmdCAqZnJlcWZmdCwgVUlOVDE2IG4sIFVJTlQzMiBmcykNCi17DQotCVVJTlQxNiBoID0gMDsNCi0JRE9VQkxFICp4LCAqeGksICp4dmFsdWU7DQotCWlmIChkYXRhID09IE5VTEwgfHwgZnJlcWZmdCA9PSBOVUxMIHx8IG4gPCAwIHx8IGZzIDwgMCkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQl4ID0gKERPVUJMRSopY2FsbG9jKG4sIHNpemVvZihET1VCTEUpKTsNCi0JeGkgPSAoRE9VQkxFKiljYWxsb2Mobiwgc2l6ZW9mKERPVUJMRSkpOw0KLQl4dmFsdWUgPSAoRE9VQkxFKiljYWxsb2Mobiwgc2l6ZW9mKERPVUJMRSkpOw0KLQ0KLQlmZnQoZGF0YSwgeCwgeGksIG4sIDEpOw0KLQkvKmZvcihpPTA7aTwxMDI0O2krKykNCi0Jew0KLQkJek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCJjYWxfZnJlcV9mZnQgeFslZF09JWYseGlbJWRdPSVmIVxuIixpLHhbaV0saSx4aVtpXSk7DQotCX0qLw0KLQ0KLQlhYnNfZmZ0KHgsIHhpLCBuIC8gMiwgeHZhbHVlKTsNCi0JbWF4X2ZmdCh4dmFsdWUsIG4gLyAyLCAmaCk7DQotCS8vek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCJoPSVkIVxuIixoKTsNCi0JZnJlcWZmdC0+ZnJlcVZhbHVlID0gKGggLSAxKSAqIGZzIC8gKChuKSAqIDEuMCk7DQotCWZyZXFmZnQtPmZyZXFBbXAgPSB4dmFsdWVbaF0gLyAobiAvIDIpOw0KLQkvLypmcmVxVmFsdWUgPSAoaC0xKSpmcy8oKG4pKjEuMCk7DQotCS8vek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCJuPSVkIVxuIixuKTsNCi0JLy8gZnJlcSA9IGZyZXFmZnQtPmZyZXFWYWx1ZTsNCi0JLy96T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsImZzPSVkIVxuIixmcyk7DQotCS8vek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCJmcmVxPSVmIVxuIixmcmVxKTsNCi0JLy96T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsImZyZXFmZnQtPmZyZXFBbXA9JWYhXG4iLGZyZXFmZnQtPmZyZXFBbXApOw0KLQ0KLQ0KLQlmcmVlKHgpOw0KLQlmcmVlKHhpKTsNCi0JZnJlZSh4dmFsdWUpOw0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotDQotfQ0KLQ0KLSNlbmRpZg0KLQ0KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvYXVkaW9pbnRmL3ZvaWNlX3Byb2NpbnRmLmMgYi9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL2F1ZGlvaW50Zi92b2ljZV9wcm9jaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZjBlODAzLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvYXVkaW9pbnRmL3ZvaWNlX3Byb2NpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMTcgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuCi0qCi0gKgotICogIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLSAqICB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLSAqICB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0gKiAgaW4gdGhlIGZpbGUgUEFURU5UUy4gIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotICogIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgZmlsZXMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiZHJ2c19nZW5lcmFsLmgiCi0jaW5jbHVkZSAiZHJ2c19yYW1sb2cuaCIKLSNpbmNsdWRlIDxvc3NfY2xpYi5oPgotI2luY2x1ZGUgPG9zc19rZXJuZWwuaD4KLSNpbmNsdWRlICJOdlBhcmFtX2Rydi5oIgotI2luY2x1ZGUgIlJXTnZDb25maWcuaCIKLSNpZmRlZiBfVVNFX05YUF9BVUQKLSNpbmNsdWRlICJoYWxfbnhwLmgiCi0jZW5kaWYKLSNpZmRlZiBfVVNFX1dFQlJUQ19BVUQKLSNpbmNsdWRlICJ3ZWJydGNfaW50Zi5oIgotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsIE1hY3JvcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIENvbnN0YW50cwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIFZhcmlhYmxlcwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLWV4dGVybiBUX3pEcnZWb2ljZV9HYlZhciBnX3ZvaWNlVmFyOwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TSU5UMzIgVm9pY2VQcm9jX0luaXROdlBhcmFtKFZPSUQpCi17Ci0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOwotCi0JcmV0ID0gek9zc19Odkl0ZW1SZWFkKE9TX0ZMQVNIX1ZPSUNFX0RSVl9SV19OT05GQUNfQkFTRV9BRERSLCAoKFVJTlQ4ICopKCZnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnKSksICBzaXplb2YoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZykpOwotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWb2ljZVByb2NfSW5pdE52UGFyYW0gdm9pY2UgIGZsYWcgYmFzZUFkZD0weCV4LCByZXQgPSVkICxpc1ZwUGFyYW1Jbk52PSAlZCBcbiIsIChPU19GTEFTSF9WT0lDRV9EUlZfUldfTk9ORkFDX0JBU0VfQUREUiksIFwKLQkgICAgICAgICAgICAgICAgICByZXQsIGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNWcFBhcmFtSW5Odik7Ci0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVm9pY2VQcm9jX0luaXROdlBhcmFtIHZvaWNlZmxhZyBpc1ZwUGFyYW1Jbk52PSVkLGlzVXNlU2xpY0NvZGVjPSVkLGlzVXNlVm9pY2VQcm9jPSVkLGlzVXNlQ29kZWNEc3A9JWQsaXNVc2VOdldyaXRlPSVkIFxuIiwgXAotCSAgICAgICAgICAgICAgICAgIGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNWcFBhcmFtSW5OdiwgZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVNsaWNDb2RlYywgZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVZvaWNlUHJvYywgXAotCSAgICAgICAgICAgICAgICAgIGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VDb2RlY0RzcCwgZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZU52V3JpdGUpOwotCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlZvaWNlUHJvY19Jbml0TnZQYXJhbSB0aGUgZ19hdWRpb052UGFyYW0gc2l6ZT0lZCxhdWRpb19jdHJsRmxhZyBzaXplPSVkIFxuIiwgc2l6ZW9mKGdfdm9pY2VWYXIpLCBzaXplb2YoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZykpOwotCi0KLQlnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjID0gZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVNsaWNDb2RlYzsKLQlnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPSBnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlVGRtOwotCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBWb2ljZVByb2NfSW5pdE52UGFyYW0gaXNVc2VWb2ljZVByb2M9JWQsaXNVc2VTbGljQ29kZWM9JWQsaXNVc2VUZG09JWQhXG4iLCBnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlVm9pY2VQcm9jLCBnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjLCBnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlVGRtKTsKLQlpZiAoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVZvaWNlUHJvYyA9PSAxKQotCXsKLSNpZmRlZiBfVVNFX05YUF9BVUQKLQotCXJldCA9IFZwX054cEluaXROdlBhcmFtKCk7Ci0KLQl0ZXN0bnhwX2luaXQoKTsKLSNlbGlmIGRlZmluZWQgX1VTRV9XRUJSVENfQVVECi0JcmV0ID0gV2VicnRjX0luaXRQYXJhbSgpOwotI2VuZGlmCi0JfQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi0KLVNJTlQzMiBWb2ljZVByb2NfT3BlbihVSU5UMzIgZnMpCi17Ci0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVm9pY2VQcm9jX09wZW4gaXNVc2VWb2ljZVByb2M9JWQgXG4iLCBnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlVm9pY2VQcm9jKTsKLQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsKLQlpZiAoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVZvaWNlUHJvYyAhPSAxKQotCXsKLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NVUFBPUlRFRDsKLQl9Ci0jaWZkZWYgX1VTRV9OWFBfQVVECi0JcmV0ID0gVnBfTnhwT3Blbihmcyk7Ci0jZWxpZiBkZWZpbmVkIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19PcGVuKGZzKTsKLQotI2VuZGlmCi0KLQotCi0KLQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWb2ljZVByb2NfT3BlbiBlbmQgIVxyXG4iKTsKLQotCi0JcmV0dXJuIHJldDsKLX0KLQotCi0KLVNJTlQzMiBWb2ljZVByb2NfQ2xvc2UoVk9JRCkKLXsKLQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsKLSNpZmRlZiBfVVNFX05YUF9BVUQKLQlyZXQgPSBWcF9OeHBDbG9zZSgpOwotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQKLQlyZXQgPSBXZWJydGNfQ2xvc2UoKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci1TSU5UMzIgVm9pY2VQcm9jX0dldFBhcmFtKFRfWkRydlZvaWNlX01PREUgdm9pY2VNb2RlLCBUX1pEcnZfVnBQYXRoIHBhdGgpCi17Ci0KLQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsKLSNpZmRlZiBfVVNFX05YUF9BVUQKLQlyZXQgPSBWcF9OeHBHZXRQYXJhbSh2b2ljZU1vZGUsIHBhdGgpOwotCi0jZWxpZiBkZWZpbmVkIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19HZXRQYXJhbSh2b2ljZU1vZGUscGF0aCk7Ci0KLSNlbmRpZgotCi0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVm9pY2VQcm9jX0dldFBhcmFtIGVuZCFcclxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1TSU5UMzIgVm9pY2VQcm9jX1NldFBhcmFtKFRfWkRydlZvaWNlX01PREUgdm9pY2VNb2RlLCBUX1pEcnZfVnBQYXRoIHBhdGgsIFRfWkRydl9WcFZvbCB2b2x1bWUsIEJPT0wgaXNMb29wKQotewotCi0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7Ci0jaWZkZWYgX1VTRV9OWFBfQVVECi0JcmV0ID0gVnBfTnhwU2V0UGFyYW0ocGF0aCwgdm9sdW1lLCBpc0xvb3ApOwotCi0jZWxpZiBkZWZpbmVkIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19TZXRQYXJhbSh2b2ljZU1vZGUsIHBhdGgpOwotI2VuZGlmCi0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVm9pY2VQcm9jX1NldENvbmZpZyBlbmQhXHJcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotI2lmIDAKLVNJTlQzMiBWb2ljZVByb2NfU2V0R2FpbihTSU5UMzIgdmdhaW4sIFVJTlQzMiBjaGFubmVsKQotewotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7Ci0KLSNpZmRlZiBfVVNFX05YUF9BVUQKLQotCXJldCA9IFZwX054cFNldEdhaW4odmdhaW4sIGNoYW5uZWwsIGdfdm9pY2VWYXIudnBQYXRoKTsKLQotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQKLQotI2VuZGlmCi0KLQlyZXR1cm4gcmV0OwotCi0KLX0KLSNlbmRpZgotCi1TSU5UMzIgVm9pY2VQcm9jX1J4UHJvY2VzcyhVSU5UOCAqKnBpbkJ1ZmZlciwgVUlOVDggKipwb3V0QnVmZmVyLCBVSU5UMTYgc2FtcGxlTnVtcykKLXsKLQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsKLQotCi0KLSNpZmRlZiBfVVNFX05YUF9BVUQKLQlyZXQgPSBWcF9OeHBSeFByb2Nlc3MocGluQnVmZmVyLCBwb3V0QnVmZmVyLCBzYW1wbGVOdW1zKTsKLQotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQKLQlyZXQgPSBXZWJydGNfUnhQcm9jZXNzKHBpbkJ1ZmZlciwgcG91dEJ1ZmZlciwgc2FtcGxlTnVtcyk7Ci0jZW5kaWYKLQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1TSU5UMzIgVm9pY2VQcm9jX1R4UHJvY2VzcyhVSU5UOCAqKnBpbkJ1ZmZlcl9NQUlOLCBVSU5UOCAqKnBpbkJ1ZmZlcl9BVVgsIFVJTlQ4ICoqcG91dEJ1ZmZlciwgVUlOVDE2IHNhbXBsZU51bXMpCi17Ci0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOwotCi0jaWZkZWYgX1VTRV9OWFBfQVVECi0JcmV0ID0gVnBfTnhwVHhQcm9jZXNzKHBpbkJ1ZmZlcl9NQUlOLCBOVUxMLCBwb3V0QnVmZmVyLCBzYW1wbGVOdW1zKTsKLQotI2VsaWYgZGVmaW5lZCBfVVNFX1dFQlJUQ19BVUQKLQlyZXQgPSBXZWJydGNfVHhQcm9jZXNzKHBpbkJ1ZmZlcl9NQUlOLCBOVUxMLCBwb3V0QnVmZmVyLCBzYW1wbGVOdW1zKTsKLQotI2VuZGlmCi0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotI2lmIDAKLVNJTlQzMiBWb2ljZVByb2NfR2V0UGFyYW0odm9pZCAqYXBJbnN0LCBUX1pEcnZWb2ljZV9NT0RFIHZvaWNlTW9kZSwgVF9aRHJ2X1ZwUGF0aCBwYXRoKQotewotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWb2ljZVByb2NfR2V0UGFyYW0gIHZvaWNlTW9kZT0lZCxwYXRoPSVkIFxuIiwgdm9pY2VNb2RlLCBwYXRoKTsKLQotCi0JcmV0dXJuIERSVl9TVUNDRVNTOwotCi19Ci0KLVNJTlQzMiBWb2ljZVByb2NfU2V0UGFyYW0odm9pZCAqYXBJbnN0LCBUX1pEcnZfVnBQYXRoIHBhdGgsIFRfWkRydl9WcFZvbCB2b2x1bWUsIEJPT0wgaXNMb29wKQotewotCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlZvaWNlUHJvY19TZXRQYXJhbSAgc3RhcnQhXG4iKTsKLQotCXJldHVybiBEUlZfU1VDQ0VTUzsKLX0KLQotU0lOVDMyIFZvaWNlUHJvY19TZXRQYXJhbVRvb2wodm9pZCAqYXBJbnN0LCBUX1pEcnZfVnBQYXRoIHBhdGgsIFRfWkRydl9WcFZvbCB2b2x1bWUpCi17Ci0JcmV0dXJuIERSVl9TVUNDRVNTOwotfQotCi1TSU5UMzIgVm9pY2VQcm9jX0dldFBhcmFtVG9vbCh2b2lkICphcEluc3QsIFRfWkRydl9WcFBhdGggcGF0aCwgVF9aRHJ2X1ZwVm9sIHZvbHVtZSkKLXsKLQlyZXR1cm4gRFJWX1NVQ0NFU1M7Ci19Ci0KLVNJTlQzMiBWb2ljZVByb2NfU2V0R2Fpbih2b2lkICphcEluc3QsIFNJTlQzMiBnYWluLCBVSU5UMzIgY2hhbm5lbCwgVF9aRHJ2X1ZwUGF0aCBwYXRoKQotewotCi0JcmV0dXJuIERSVl9TVUNDRVNTOwotfQotI2VuZGlmCi1TSU5UMzIgVm9pY2VQcm9jX1NldEVjaG9EZWxheShpbnQgdmFsKQotewotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7Ci0jaWZkZWYgX1VTRV9XRUJSVENfQVVECi0JcmV0ID0gV2VicnRjX1NldEVjaG9EZWxheSh2YWwpOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQotU0lOVDMyIFZvaWNlUHJvY19HZXRFY2hvRGVsYXkodm9pZCkKLXsKLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOwotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19HZXRFY2hvRGVsYXkoKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLVNJTlQzMiBWb2ljZVByb2NfU2V0VHhOc01vZGUoaW50IHZhbCkKLXsKLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOwotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19TZXRUeE5zTW9kZSh2YWwpOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQotU0lOVDMyIFZvaWNlUHJvY19HZXRUeE5zTW9kZSh2b2lkKQotewotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7Ci0jaWZkZWYgX1VTRV9XRUJSVENfQVVECi0JcmV0ID0gV2VicnRjX0dldFR4TnNNb2RlKCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotCi19Ci1TSU5UMzIgVm9pY2VQcm9jX1NldFJ4TnNNb2RlKGludCB2YWwpCi17Ci0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsKLSNpZmRlZiBfVVNFX1dFQlJUQ19BVUQKLQlyZXQgPSBXZWJydGNfU2V0UnhOc01vZGUodmFsKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLVNJTlQzMiBWb2ljZVByb2NfR2V0UnhOc01vZGUodm9pZCkKLXsKLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOwotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19HZXRSeE5zTW9kZSgpOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLQotfQotCi0KLVNJTlQzMiBWb2ljZVByb2NfU2V0TW9kdWxlU3RhdGUoaW50ICptb2QsIGludCBjb3VudCkKLXsKLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOwotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19TZXRNb3VkbGVTdGF0ZShtb2QsIGNvdW50KTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLVNJTlQzMiBWb2ljZVByb2NfR2V0TW9kdWxlU3RhdGUoaW50ICptb2QsIGludCBjb3VudCkKLXsKLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOwotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRAotCXJldCA9IFdlYnJ0Y19HZXRNb3VkbGVTdGF0ZShtb2QsIGNvdW50KTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS9pMnMvaGFsX2kycy5jIGIvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS9pMnMvaGFsX2kycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ODNhOTJhLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvaTJzL2hhbF9pMnMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MzEgKzAsMCBAQAotLyoqDQotICogQGZpbGUgaGFsX2kycy5jDQotICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIFNhbmVjaGlwcyBpMnMgIEZ1bmN0aW9uDQotICoNCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQotICogQGF1dGhvciBBdXRob3I6IFhpbnFpYW5nIFh1IDx4dS54aW5xaWFuZ0BzYW5lY2hpcHMuY29tLmNuPg0KLSAqDQotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCi0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcw0KLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLg0KLSAqDQotICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgaGVhZGVyIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmZGVmIF9PU19PU0UNCi0jaW5jbHVkZSAib3V0Zm10LmgiDQotI2luY2x1ZGUgIm9zZS5oIg0KLSNpbmNsdWRlICJjcHUuaCINCi0jaW5jbHVkZSAiZGRhX3BjaS5oIg0KLSNpbmNsdWRlICJkZGFfdXRpbHMuaCINCi0jaW5jbHVkZSAiZGRhX2Vyci5oIg0KLSNpbmNsdWRlICJkZGFfZHJtLmgiDQotI2luY2x1ZGUgImRkYV9zdHJpbmdzLmgiDQotI2luY2x1ZGUgImRldmljZS5zaWciDQotI2luY2x1ZGUgImlucHV0ZGV2LnNpZyINCi0jaW5jbHVkZSAicmFtbG9nLmgiDQotI2luY2x1ZGUgIm9zZV9zeW1zLmgiDQotI2VuZGlmDQotDQotI2luY2x1ZGUgImRydnNfZ2VuZXJhbC5oIg0KLSNpbmNsdWRlICJkcnZzX2kycy5oIg0KLSNpbmNsdWRlICJkcnZzX3Bvdy5oIg0KLS8vI2luY2x1ZGUgImRtYV9jZmcuaCINCi0vLyNpbmNsdWRlICJkcnZzX2RtYS5oIg0KLSNpbmNsdWRlICJUaHJlYWRQcmlvcml0eS5oIg0KLSNpbmNsdWRlICJkcnZzX2NoaXBfY2ZnLmgiDQotI2luY2x1ZGUgImRydnNfc3lzLmgiDQotI2luY2x1ZGUgImRydnNfdm9pY2Vwcm9jZXNzLmgiDQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+DQotLy8jaW5jbHVkZSA8Y3lnL2hhbC90b3NfY2FjaGUuaD4NCi0vKg0KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+DQotI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPg0KLSNpbmNsdWRlIDxtYWNoL2Nsay5oPg0KLSNpbmNsdWRlIDxtYWNoL2dwaW9fZGVmLmg+DQotI2luY2x1ZGUgPG1hY2gvZ3Bpb19jZmcuaD4NCi0jaW5jbHVkZSA8bWFjaC9ncGlvLW5hbWVzLmg+DQotI2luY2x1ZGUgPG1hY2gvYm9hcmQuaD4NCi0jaW5jbHVkZSA8bWFjaC9jbGsuaD4NCi0qLw0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+DQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4NCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPg0KLSNpbmNsdWRlIDxtYWNoL2RtYS5oPg0KLSNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+DQotI2luY2x1ZGUgPGFzbS9pby5oPg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2RlZmluZSBJMlNfRFJJVkVSX05BTUUgICAgICAgICAgICAgImkycyINCi0jZGVmaW5lIEkyU19EUklWRVJfVkVSU0lPTiAgICAgICAgICAxDQotI2RlZmluZSBJMlNfVkVSU0lPTiAgICAgCQkJCTB4MDEwMgkvKkkyUyBWZXJzaW9uKi8NCi0NCi0jZGVmaW5lIE1BTExPQ19JMlNfRE1BX0FSRUENCi0NCi0jZGVmaW5lIFRPUF9JMlMwX1BJTl9DT05ORUNUDQotDQotI2RlZmluZSBBUk1fSTJTX0xPT1BfQ0ZHCSooKHZvbGF0aWxlIFVJTlQzMiAqKShTT0NfU1lTX1JFR19CQVNFKzB4NjApKQ0KLQ0KLS8qIHByb2Nlc3MgY29udHJvbCByZWdpc3RlciAqLw0KLSNkZWZpbmUgSTJTX1RYX09QRU4gICAgIAkJCQkoMHgxPDwwKQkvKlRYIGVuYWJsZSovDQotI2RlZmluZSBJMlNfUlhfT1BFTiAgICAgCQkJCSgweDE8PDEpCS8qUlggZW5hYmxlKi8NCi0jZGVmaW5lIEkyU19FTgkJCQkJCQkoMHgxPDwyKQ0KLQ0KLS8qIFRpbWluZyBjb250cm9sIHJlZ2lzdGVyICovDQotI2RlZmluZSBJMlNfTUFTVEVSX0VOICAgICAgICAgICAgICAgICAgICgweDE8PDApDQotI2RlZmluZSBJMlNfVEVTVF9NT0RFICAgICAgICAgICAgICAgICAgCSgweDE8PDEpCQkvKnRlc3QgTW9kZSovDQotI2RlZmluZSBJMlNfQ0xLX0VER0VfU0VMICAgICAgICAgICAgICAgICgweDE8PDIpCQkvKkkyUyBlZGdlIHNlbGVjdCovDQotI2RlZmluZSBJMlNfVElNSU5HX1NFTCAgICAgICAgICAgICAgICAgICgweDE8PDMpCQkvKlBDTSBNb2RlIG9yIEkyUyBNb2RlKi8NCi0jZGVmaW5lIEkyU19MT05HX0ZTWU5DICAgICAgICAgICAgICAgIAkoMHgxPDw0KSAgLyoxIGxvbmcsIDAgc2hvcnQqLw0KLSNkZWZpbmUgSTJTX0VYVFJBX0NZQ0xFICAgICAgICAgICAgICAgIAkoMHgxPDw1KSAgLyoxIGhhdmUgZXh0cmEgY3ljbGUsIDAgbm8gZXh0cmEqLw0KLSNkZWZpbmUgSTJTX0FMSUdOX01PREUoeCkJCQkJKCgoeCkmMHgzKTw8NikgLypiMDAgc3RkLCBiMDEgbXNiLGIxMCBsc2IsYjExIG5vcm1hbCovDQotDQotI2RlZmluZSBJMlNfQ0hOX05VTSh4KQkJCQkJKCgoeCkmMHg3KTw8OCkgIC8qaDB+MyxoNyB0b3RhbGx5IDF+OCBjaG4gcGVyIGZyYW1lKi8NCi0jZGVmaW5lIEkyU19MQU5FX05VTSh4KSAgICAgICAgICAgICAgICAJKCgoeCkmMHgzKTw8MTEpICAvKmgwfjIsaDMgIDF+NCBsYW5lIHVzZWQgdG8gdHJhbnNmZXIgZGF0YSovDQotDQotI2RlZmluZSBJMlNfVFNfQ0ZHKHgpICAgICAgICAgICAgICAgIAkoKCh4KSYweDcpPDwxMykgIC8qIGkycyB0aW1pbmcgb3IgdGRtIGNmZyovDQotI2RlZmluZSBJMlNfVFNfV0lEVEgoeCkgICAgICAgICAgICAgICAgCSgoKHgpJjB4MWYpPDwxNikgIC8qIGgwfjUgaWxsZWFnYWwsaGZ+MWYgMTZ+MzIgcGVyIHRpbWUgc2xvdCovDQotI2RlZmluZSBJMlNfREFUQV9TSVpFKHgpICAgICAgICAgICAgICAgIAkoKCh4KSYweDFmKTw8MjEpICAvKiBoMH41IGlsbGVhZ2FsLGhmfjFmIGRhdGEgc2l6ZSAxNn4zMiovDQotI2RlZmluZSBJMlNfRk1UX0VSUgkJCQkJCSgweDE8PDMxKSAgLyogMSBjZmcgaWxsZWFnYWwsMCBjZmcgY29ycmVjdCovDQotDQotLyogZmlmbyBjb250cm9sIHJlZ2lzdGVyICovDQotI2RlZmluZSBJMlNfVFhfRklGT19SU1QgICAgICAgICAgICAgICAgICgweDE8PDApDQotI2RlZmluZSBJMlNfUlhfRklGT19SU1QgICAgICAgICAgICAgICAgICgweDE8PDEpDQotI2RlZmluZSBJMlNfVFhfRE1BX0VOICAgICAgICAgICAgICAgICAgICgweDE8PDQpDQotI2RlZmluZSBJMlNfUlhfRE1BX0VOMCAgICAgICAgICAgICAgICAgICgweDE8PDUpDQotI2RlZmluZSBJMlNfUlhfRE1BX0VOMSAgICAgICAgICAgICAgICAgICgweDE8PDYpDQotI2RlZmluZSBJMlNfVEZUSCh4KSAgICAgICAgICAgICAgICAgICAgICgoKHgpJjB4MWYpPDw4KQkvKiBpbnRlcnJ1cHQgZ2VuZXJhdGUgc2V0dGluZyAqLw0KLSNkZWZpbmUgSTJTX1JGVEgoeCkgICAgICAgICAgICAgICAgICAgICAoKCh4KSYweDFmKTw8MTYpLyogaW50ZXJydXB0IGdlbmVyYXRlIHNldHRpbmcgKi8NCi0NCi0vKiBmaWZvIHN0YXR1cyByZWdpc3RlciAqLw0KLSNkZWZpbmUgSTJTX1RYX0JFWU9ORF9USFJFUwkJCQkoMHgxPDwwKQ0KLSNkZWZpbmUgSTJTX1JYX0JFWU9ORF9USFJFUwkJCQkoMHgxPDwxKQ0KLQ0KLSNkZWZpbmUgSTJTX1RYX0ZJRk9fRU1QVFkJCQkJKDB4MTw8NCkNCi0jZGVmaW5lIEkyU19SWF9GSUZPX0ZVTEwJCQkJKDB4MTw8NSkNCi0NCi0jZGVmaW5lICBJMlNfVFhGX0hXX0ZMQUcJCQkJKDB4MTw8OCkNCi0jZGVmaW5lIEkyU19UWF9GSUZPX0NOVFIoeCkJCQkJKCgoeCkmKDB4M2Y8PDkpKT4+OSkNCi0jZGVmaW5lIEkyU19SWEZfSFdfRkxBRwkJCQkJKDB4MTw8MTYpDQotI2RlZmluZSBJMlNfUlhfRklGT19DTlRSKHgpCQkJCSgoKHgpJigweDNmPDwxNykpPj4xNykNCi0NCi0vKiBjbG9jayBkaXYgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIEkyU19ESVYoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoeCkmMHg3Zik8PDApDQotDQotLyogaW50ZXJydXB0IHN0YXR1cyAqLw0KLSNkZWZpbmUgSTJTX1RYX1RSSUdfSU5UICAgICAgICAgICAgICAgICAoMHgxPDwwKQ0KLSNkZWZpbmUgSTJTX1JYX1RSSUdfSU5UICAgICAgICAgICAgICAgICAoMHgxPDwxKQ0KLSNkZWZpbmUgSTJTX1RYX1VOREVSX0lOVCAgICAgICAgICAgICAgICAoMHgxPDwyKQkvKiB0eCBlcnJvciBzdGF0dXMgKi8NCi0jZGVmaW5lIEkyU19SWF9PVkVSX0lOVCAgICAgICAgICAgICAgICAgKDB4MTw8MykJLyogcnggZXJyb3Igc3RhdHVzICovDQotDQotLyogaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLw0KLSNkZWZpbmUgSTJTX1RYX1RSSUdfSU5UX0VOICAgICAgICAgICAgICAoMHgxPDwwKQ0KLSNkZWZpbmUgSTJTX1JYX1RSSUdfSU5UX0VOICAgICAgICAgICAgICAoMHgxPDwxKQ0KLSNkZWZpbmUgSTJTX1RYX1VOREVSX0lOVF9FTiAgICAgICAgICAgICAoMHgxPDwyKQ0KLSNkZWZpbmUgSTJTX1JYX09WRVJfSU5UX0VOICAgICAgICAgICAgICAoMHgxPDwzKQ0KLQ0KLS8qIGZyYW1lIGNvdW50ZXIgKi8NCi0jZGVmaW5lIEkyU19GUkFNRV9DTlRSKHgpCQkJCSgoeCkmMHgzZmZmZmZmZikNCi0jZGVmaW5lIEkyU19GUkFNRV9DTlRSX0VOCQkJCSgweDE8PDMwKQ0KLSNkZWZpbmUgSTJTX0ZSQU1FX0NOVFJfUlNUCQkJCSgweDE8PDMxKQ0KLQ0KLS8qIGRlZmF1bHQgcngvdHggdHJpZ2dlciB0aHJlYWRob2xkICovDQotI2RlZmluZSBJMlNfUlhGTF9WQUwgICAgICAgICAgICAgICAgICAgICgweDEwKQ0KLSNkZWZpbmUgSTJTX1RYRkxfVkFMICAgICAgICAgICAgICAgICAgICAoMHgxMCkNCi0NCi0jZGVmaW5lIEkyU19FTkFCTEVfREVMQVlfVElNRQkJCSgxMCkgICAgICAvKiB1cyAqLw0KLQ0KLSNkZWZpbmUgSTJTX09VVF9CVUZfTlVNCQkJCQkzDQotI2RlZmluZSBJMlNfVVBMSU5LX1NFTV9OVU0gICAgICAgICAgCTMNCi0jZGVmaW5lIEkyU19ET1dOTElOS19TRU1fTlVNICAgICAgICAJMA0KLSNkZWZpbmUgSTJTX01BWF9SWF9CVUZfU0laRSAgICAgICAgIAkyMDQ4DQotI2RlZmluZSBJMlNfTUFYX1RYX0JVRl9TSVpFICAgICAgICAgCTgxOTINCi0jZGVmaW5lIEkyU19NQVhfQVVESU9fUExBWV9NRU1fU0laRQkJODE5Mg0KLSNkZWZpbmUgSTJTX01BWF9BVURJT19SRUNPUkRfTUVNX1NJWkUJMjA0OA0KLSNkZWZpbmUgSTJTX01BWF9WT0lDRV9HU01fTUVNX1NJWkUJCTMyMA0KLSNkZWZpbmUgSTJTX01BWF9WT0lDRV9MVEVfTUVNX1NJWkUJCTY0MA0KLSNkZWZpbmUgUkFNX0FERFJfRk9SX0kyUzEJCQkJRE1BX1JBTV9GT1JfSTJTX0FERFJfQkFTRQ0KLSNkZWZpbmUgUkFNX0FERFJfRk9SX0kyUzIJCQkJKERNQV9SQU1fRk9SX0kyU19BRERSX0JBU0UgKyAzMDcyMCkNCi0NCi0jZGVmaW5lIEkyU19TRU1fV0FJVF9USU1FCQkJCTI1MDANCi0NCi0jZGVmaW5lIEkyU19RVUVVRV9TSVpFCQkJCQkoSTJTX09VVF9CVUZfTlVNICsgMSkNCi0jZGVmaW5lIEkyU19XQUlUX1RJTUUJCQkJCTEwMA0KLSNkZWZpbmUgSTJTX0lOVENUUkxfVEVTVF9NT0RFICAgIAkJVFJVRQ0KLQ0KLS8vI2RlZmluZSBJMlMwX0NSTV9DTEtTRUwgICAgIAkJCShaWF9MU1BfQ1JQTV9CQVNFKzB4MTQpDQotLy8jZGVmaW5lIEkyUzFfQ1JNX0NMS1NFTCAgICAgCQkJKFpYX0xTUF9DUlBNX0JBU0UrMHgxQykNCi0NCi0jZGVmaW5lIEkyUzBfQ1JNX0NMS1NFTAkJKExTUF9DUk1fUkVHX0JBU0UrMHgxNCkNCi0jZGVmaW5lIEkyUzFfQ1JNX0NMS1NFTAkJKExTUF9DUk1fUkVHX0JBU0UrMHgxQykNCi0jaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMg0KLSNkZWZpbmUgSTJTMF9DTEtESVYgICAgICAgKigodm9sYXRpbGUgVUlOVDMyICopKExTUF9DUk1fUkVHX0JBU0UrMHgxOCkpDQotI2RlZmluZSBJMlMxX0NMS0RJViAgICAgICAqKCh2b2xhdGlsZSBVSU5UMzIgKikoTFNQX0NSTV9SRUdfQkFTRSsweDIwKSkNCi0jZWxpZiBkZWZpbmVkIF9VU0VfQVVESU9fT05fNzUyMFYzDQotI2RlZmluZSBJMlMwX0NMS0RJVl8xICAgICAgIChMU1BfQ1JNX1JFR19CQVNFKzB4NTgpDQotI2RlZmluZSBJMlMwX0NMS0RJVl8yICAgICAgIChMU1BfQ1JNX1JFR19CQVNFKzB4NUMpDQotDQotI2RlZmluZSBJMlMxX0NMS0RJVl8xICAgICAgIChMU1BfQ1JNX1JFR19CQVNFKzB4NjApDQotI2RlZmluZSBJMlMxX0NMS0RJVl8yICAgICAgIChMU1BfQ1JNX1JFR19CQVNFKzB4NjQpDQotI2VuZGlmDQotDQotLyogbHNwIGkyczAgd29yayBjbGsgZGl2ICovDQotI2RlZmluZQkgSTJTMF9GUkFfRElWICAgICAgMHgwMDAwMDAwOA0KLSNkZWZpbmUJIEkyUzBfRlJBX0JBU0UgICAgIDB4MDAwMDA4MDgNCi0jZGVmaW5lCSBJMlMwX0lOVEVHRVJfTlVNICAweDAwMDAxMDA4DQotI2RlZmluZSAgSTJTMF9DTEtfU0VMX0RJViAgMHgwMDAwMTgwMQ0KLSNkZWZpbmUJIEkyUzBfUFdSRE4gICAgICAgIDB4MDAwMDE5MDENCi0jZGVmaW5lCSBJMlMwX0NMS19ESVYgICAgICAweDAwMDAxYzA0DQotDQotLyogbHNwIGkyczEgd29yayBjbGsgZGl2ICovDQotI2RlZmluZQkgSTJTMV9GUkFfRElWICAgICAgMHgxMDAwMDAwOA0KLSNkZWZpbmUJIEkyUzFfRlJBX0JBU0UgICAgIDB4MTAwMDA4MDgNCi0jZGVmaW5lCSBJMlMxX0lOVEVHRVJfTlVNICAweDEwMDAxMDA4DQotI2RlZmluZSAgSTJTMV9DTEtfU0VMX0RJViAgMHgxMDAwMTgwMQ0KLSNkZWZpbmUJIEkyUzFfUFdSRE4gICAgICAgIDB4MTAwMDE5MDENCi0jZGVmaW5lCSBJMlMxX0NMS19ESVYgICAgICAweDEwMDAxYzA0DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBlbnVtIHsNCi0gICAgQlVGRkVSX05VTEwsDQotICAgIEJVRkZFUl9XUklURSwNCi0gICAgQlVGRkVSX0ZVTEwsDQotICAgIEJVRkZFUl9SRUFELA0KLQ0KLSAgICBNQVhfQlVGRkVSX1NUQVRVUw0KLX0gVF9JMnNfQnVmZmVyU3RhdHVzOw0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgIENMS184MDAwLA0KLSAgICBDTEtfMTEwMjUsDQotICAgIENMS18xMjAwMCwNCi0gICAgQ0xLXzE2MDAwLA0KLSAgICBDTEtfMjIwNTAsDQotICAgIENMS18yNDAwMCwNCi0gICAgQ0xLXzMyMDAwLA0KLSAgICBDTEtfNDQxMDAsDQotICAgIENMS180ODAwMCwNCi0gICAgQ0xLXzY0MDAwLA0KLSAgICBDTEtfOTYwMDAsDQotDQotICAgIE1BWF9DTEsNCi19IFRfSTJzX0Nsa0NvbnN0Ow0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgIFRTXzE2Q1lDTEUsDQotICAgIFRTXzE3Q1lDTEUsDQotICAgIFRTXzE4Q1lDTEUsDQotICAgIFRTXzE5Q1lDTEUsDQotICAgIFRTXzIwQ1lDTEUsDQotICAgIFRTXzIxQ1lDTEUsDQotICAgIFRTXzIyQ1lDTEUsDQotICAgIFRTXzIzQ1lDTEUsDQotICAgIFRTXzI0Q1lDTEUsDQotICAgIFRTXzI1Q1lDTEUsDQotICAgIFRTXzI2Q1lDTEUsDQotICAgIFRTXzI3Q1lDTEUsDQotICAgIFRTXzI4Q1lDTEUsDQotICAgIFRTXzI5Q1lDTEUsDQotICAgIFRTXzMwQ1lDTEUsDQotICAgIFRTXzMxQ1lDTEUsDQotICAgIFRTXzMyQ1lDTEUsDQotDQotICAgIE1BWF9UU19XSURUSA0KLX0gVF9JMnNfdFRzV2lkdGhDb25zdDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotCXZvbGF0aWxlIFVJTlQzMiAgaTJzVmVyc2lvbjsNCi0Jdm9sYXRpbGUgVUlOVDMyICBwcm9jZXNzQ3RybDsNCi0Jdm9sYXRpbGUgVUlOVDMyICB0aW1pbmdDdHJsOw0KLQl2b2xhdGlsZSBVSU5UMzIgIGZpZm9DdHJsOw0KLQl2b2xhdGlsZSBVSU5UMzIgIGZpZm9TdGF0dXM7DQotCXZvbGF0aWxlIFVJTlQzMiAgaW50RW47DQotCXZvbGF0aWxlIFVJTlQzMiAgaW50U3RhdHVzOw0KLQl2b2xhdGlsZSBVSU5UMzIgIGRhdGE7DQotCXZvbGF0aWxlIFVJTlQzMiAgZnJhbWVDbnRyOw0KLQl2b2xhdGlsZSBVSU5UMzIgIGRhdGEyOw0KLQ0KLX0gVF9JMnNfUmVnOw0KLQ0KLQ0KLS8qKg0KLSAqIEBicmllZiBkZXNjcmliZSB0aGUgaTJzIGRldmljZSBpbmZvDQotICogQHBhcmFtIHJlZ3MJCXJlZ2lzdGVyIHBvaW50ZXINCi0gKiBAcGFyYW0gaW50bGluZQlpbnRlcnJ1cHQgbGluZQ0KLSAqIEBwYXJhbSBpbnRwcmlvIAlpbnRlcnJ1cHQgcHJpb3JpdHkNCi0gKiBAcGFyYW0gdmVjdG9yCUludGVycnVwdCB2ZWN0b3INCi0gKiBAcGFyYW0gZW9pRnVuYwlpbnRlcnJ1cHQgaGFuZGxlcg0KLSAqIEBwYXJhbSBlb2lBcmcgCWludGVycnVwdCBoYW5kbGVyIGFyZ3VtZW50cw0KLSAqIEBwYXJhbSBwaWQJCXRoZSBpZCBvZiB0aGUgcHJvY2Vzcw0KLSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0JVF9JMnNfUmVnICAgICAgICAgICpyZWdzOw0KLQlVSU5UMzIgICAgICAgICAgICAgaW50bGluZTsNCi0JVUlOVDMyICAgICAgICAgICAgIGludHByaW87DQotCU9TVkVDVE9SICAgICAgICAgICB2ZWN0b3I7DQotI2lmZGVmIF9PU19PU0UNCi0JRGRhRW5kT2ZJbnQgICAgICAgICplb2lGdW5jOw0KLQlEZGFGdW5jSGFuZGxlICAgICAgZW9pQXJnOw0KLSNlbmRpZg0KLQlQUk9DRVNTICAgICAgICAgICAgcGlkOw0KLX0gVF9JMnNfRGV2aWNlOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0JVF9JMnNfRGV2aWNlICAgICAgICAgICAgICAgICpwdERldjsNCi0JVF9aRHJ2STJTX0NmZyAgICAgICAgICAgICAgIHRDZmc7DQotCVRfSTJzX1N0YXR1cyAgICAgICAgICAgICAgICBpMnNTdGF0dXM7DQotCVVJTlQxNiAgICAgICAgICAgICAgICAgICAgICB1aURtYVJ4Q2hhbjsNCi0JVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIHVpRG1hVHhDaGFuOw0KLS8vCXpEcnZEbWFfQ2FsbGJhY2tGdW5jICAgICAgICBmRG1hQ2JSeDsNCi0vLwl6RHJ2RG1hX0NhbGxiYWNrRnVuYyAgICAgICAgZkRtYUNiVHg7DQotCVNJTlQzMgkJCQkJCURtYVJ4SUQ7DQotCVNJTlQzMgkJCQkJCURtYVR4SUQ7DQotCVRfWkRydkkyc19UcmFuc01vZGUgICAgICAgICBpMnNUcmFuc01vZGU7DQotCVpPU1NfTVVURVhfSUQJCQkJcnhNdXRleDsNCi0JWk9TU19NVVRFWF9JRAkJCQl0eE11dGV4Ow0KLX0gVF9JMnNfSW5zdGFuY2U7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQlVSU5UOCAqYnVmOw0KLQlUX0kyc19CdWZmZXJTdGF0dXMgaTJzQnVmU3RhdHVzOw0KLX0gVF9JMnNfQnVmSW5mbzsNCi0NCi10eXBlZGVmIFNJTlQzMigqVF9JMnNfVHhGdW5jKShUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiB1aUxlbik7DQotDQotdHlwZWRlZiBzdHJ1Y3QgX1RfSTJzX1F1ZXVlTm9kZSB7DQotCVVJTlQxNiAqcEJ1ZjsNCi0JVUlOVDMyIGxlbjsNCi19IFRfSTJzX1F1ZXVlTm9kZTsNCi0NCi10eXBlZGVmICBzdHJ1Y3QgX1RfSTJzX1F1ZXVlIHsNCi0JVUlOVDggcmVhZEluZGV4Ow0KLQlVSU5UOCB3cml0ZUluZGV4Ow0KLQlUX0kyc19RdWV1ZU5vZGUgKmRhdGE7DQotfSBUX0kyc19RdWV1ZTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgdGhlIGRhdGEgc3RyZWFtIG9mIHRyYW5zaW5nDQotICogQHBhcmFtIHR4QnVmZmVyQXJyYXkJCXR4IGJ1ZiBhcnJheQ0KLSAqIEBwYXJhbSB0eFF1ZXVlCQkJc2l6ZSBvZiBvbmUgYnVmLHVzZSBpbiB0eA0KLSAqIEBwYXJhbSB0eExlbiAJCQlzaXplIG9mIG9uZSBidWYsdXNlIGluIHR4DQotICogQHBhcmFtIHR4U2VtCQkJCWZvciB0aGUgYnVmIG1hbmFnZW1lbnQNCi0gKiBAcGFyYW0gVHJhbnNpbmcJCQl1c2UgdG8gY2hlY2sgaWYgZGF0YXMgaXMgdHJhbnNpbmcNCi0gKiBAcGFyYW0gcGF1c2VGbGFnIAkJcGF1c2UgZmxhZw0KLSAqIEBwYXJhbSB0eFRyYW5zbWl0CQlmb3IgdGhlIGJ1ZiBtYW5hZ2VtZW50DQotICogQHBhcmFtIGNoYW5uZWwJCQlhdWRpbyBjaGFubmVsDQotICogQHBhcmFtIHBfY2IJCQkJYXVkaW8gcGxheWJhY2sgY2FsbGJhY2sgZnVuY3Rpb24NCi0gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotCVRfSTJzX0J1ZkluZm8gICAgICAgICAqdHhCdWZmZXJBcnJheTsNCi0JVF9JMnNfUXVldWUgICAgICAgICAgIHR4UXVldWU7DQotCVVJTlQzMiAgICAgICAgICAgICAgICB0eExlbjsNCi0JWk9TU19TRU1BUEhPUkVfSUQgICAgIHR4U2VtOw0KLQlCT09MICAgICAgICAgICAgICAgICAgVHJhbnNpbmc7DQotCUJPT0wgICAgICAgICAgICAgICAgICBwYXVzZUZsYWc7DQotCVRfSTJzX1R4RnVuYyAgICAgICAgICB0eFRyYW5zbWl0Ow0KLQlUX1pEcnZBdWRpb19DaGFubmVsICAgY2hhbm5lbDsNCi0JVF9aRHJ2STJTX0FVRF9QTEFZX0NCIHBfY2I7DQotCVVJTlQ4ICAgICAgICAgICAgICAgICB0eFJkSWR4Ow0KLQlVSU5UOCAgICAgICAgICAgICAgICAgdHhXcklkeDsNCi19IFRfSTJzX1R4U3RyZWFtOw0KLQ0KLQ0KLS8qKg0KLSAqIEBicmllZiB0aGUgZGF0YSBzdHJlYW0gb2YgcmVjZWl2aW5nDQotICogQHBhcmFtIHR4QnVmZmVyQXJyYXkJCXJ4IGJ1ZiBhcnJheQ0KLSAqIEBwYXJhbSBjdXJyZW50UnhCdWYJCWN1cnJlbnQgcnggYnVmDQotICogQHBhcmFtIHJ4UXVldWUJCQlxdWV1ZSBmb3IgcngNCi0gKiBAcGFyYW0gcnhMZW4gCQkJc2l6ZSBvZiBvbmUgYnVmLHVzZSBpbiByeA0KLSAqIEBwYXJhbSByeElkeAkJCQlpZHggb2YgbmV4dCByeCBidWYNCi0gKiBAcGFyYW0gcnhTZW0JCQkJZm9yIHRoZSBidWYgbWFuYWdlbWVudA0KLSAqIEBwYXJhbSByeFRyYW5zbWl0IAkJdHJhbnMgZnVuY3Rpb24NCi0gKiBAcGFyYW0gY2hhbm5lbAkJCWF1ZGlvIGNoYW5uZWwNCi0gKiBAcGFyYW0gcF9jYgkJCQlhdWRpbyBwbGF5YmFjayBjYWxsYmFjayBmdW5jdGlvbg0KLSAqDQotICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQlUX0kyc19CdWZJbmZvICAgICAgICAgKnJ4QnVmZmVyQXJyYXk7DQotCVRfSTJzX0J1ZkluZm8gICAgICAgICAqY3VycmVudFJ4QnVmOw0KLQlUX0kyc19RdWV1ZSAgICAgICAgICAgcnhRdWV1ZTsNCi0JVUlOVDMyICAgICAgICAgICAgICAgIHJ4TGVuOw0KLQlVSU5UOCAgICAgICAgICAgICAgICAgcnhSZElkeDsNCi0JVUlOVDggICAgICAgICAgICAgICAgIHJ4V3JJZHg7DQotCVpPU1NfU0VNQVBIT1JFX0lEICAgICByeFNlbTsNCi0JVF9JMnNfVHhGdW5jICAgICAgICAgIHJ4VHJhbnNtaXQ7DQotCVRfWkRydkF1ZGlvX0NoYW5uZWwgICBjaGFubmVsOw0KLQlUX1pEcnZJMlNfQVVEX1BMQVlfQ0IgcF9jYjsNCi19IFRfSTJzX1J4U3RyZWFtOw0KLQ0KLSNpZiBkZWZpbmVkIF9VU0VfQVVESU9fT05fNzUyMFYyDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQlVSU5UMzIgICBJTlRFR0VSTlVNOw0KLQlVSU5UMzIgICBGUkFDQURETlVNOw0KLQlVSU5UMzIgICBGUkFDQkFTRTsNCi0JVUlOVDMyICAgQ0xLU0VMRElWOw0KLQlVSU5UMzIgICBQV1JETjsNCi0JVF9JMnNfUmVmQ2xrRm9ySTJzICAgcmVmY2xrOw0KLQlVSU5UMzIgICBjbGtSYXRpbzsNCi19DQotVF9JMnNfQ2xrRGl2Ow0KLSNlbGlmIGRlZmluZWQgX1VTRV9BVURJT19PTl83NTIwVjMNCi10eXBlZGVmIHN0cnVjdCB7DQotCVVJTlQzMiAgIEZSQUNESVYxOw0KLQlVSU5UMzIgICBGUkFDRElWMjsNCi0JVF9JMnNfQ2xrQ29uc3QgaTJzQ2xvY2tTZXQ7DQotCVRfSTJzX3RUc1dpZHRoQ29uc3QgaTJzVHNXaWR0aFNldDsNCi0JVF9JMnNfUmVmQ2xrRm9ySTJzICAgcmVmY2xrOw0KLX0gVF9JMnNfQ2xrRGl2Ow0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgaTJzX0dldFBjbURpdihUX1pEcnZJMlNfQ2ZnICpwdENmZywgVF9JMnNfQ2xrRGl2ICpwRGl2KTsNCi1zdGF0aWMgU0lOVDMyIGkyc19HZXRJMnNEaXYoVF9aRHJ2STJTX0NmZyAqcHRDZmcsIFRfSTJzX0Nsa0RpdiAqcERpdik7DQotU0lOVDMyIGkyc19TZXRQZGl2KFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKTsNCi0NCi1zdGF0aWMgU0lOVDMyIGkyc19RdWV1ZUluaXQoVF9JMnNfUXVldWUgKmkyc1F1ZXVlKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19RdWV1ZVB1dChUX0kyc19RdWV1ZSAqaTJzUXVldWUsIFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19RdWV1ZUdldChUX0kyc19RdWV1ZSAqaTJzUXVldWUsIFRfSTJzX1F1ZXVlTm9kZSAqKnF1ZXVlTm9kZSk7DQotc3RhdGljIFNJTlQzMiBpMnNfUXVldWVEZXN0b3J5KFRfSTJzX1F1ZXVlICppMnNRdWV1ZSk7DQotDQotc3RhdGljIFNJTlQzMiBpMnNfU2V0dXBUeEJ1ZihUX1pEcnZJMlNfSWQgdElkKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19TZXR1cFJ4QnVmKFRfWkRydkkyU19JZCB0SWQpOw0KLXN0YXRpYyBTSU5UMzIgaTJzX1Jlc2V0KFRfWkRydkkyU19JZCB0SWQpOw0KLQ0KLXN0YXRpYyBWT0lEIGkyc19JbnRJc3IoVF9aRHJ2STJTX0lkIHRJZCk7DQotc3RhdGljIFZPSUQgaTJzX0ludFR4V3JpdGVGaWZvKFRfWkRydkkyU19JZCB0SWQsIFVJTlQzMiBjaGFubGFibGUpOw0KLXN0YXRpYyBWT0lEIGkyc19JbnRSeFdyaXRlQnVmKFRfWkRydkkyU19JZCB0SWQpOw0KLXN0YXRpYyBWT0lEIGkyc19JbnRUeENoYW5nZUJ1ZihUX1pEcnZJMlNfSWQgdElkKTsNCi1zdGF0aWMgVk9JRCBpMnNfSW50UnhDaGFuZ2VCdWYoVF9aRHJ2STJTX0lkIHRJZCk7DQotDQotc3RhdGljIFNJTlQzMiBpMnNfVHhDaGVja1N0YXRlKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19SeENoZWNrU3RhdGUoVF9aRHJ2STJTX0lkIHRJZCwgVF9aRHJ2STJTX0NmZyAqcHRDZmcpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgaTJzX1R4Q29tSW5pdChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMpOw0KLXN0YXRpYyBTSU5UMzIgaTJzX1J4Q29tSW5pdChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMpOw0KLQ0KLXN0YXRpYyBWT0lEIGlzcl9pMnMxKFZPSUQpOw0KLXN0YXRpYyBWT0lEIGlzcl9pMnMyKFZPSUQpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgaTJzX0ludFJ4SW5pdChUX1pEcnZJMlNfSWQgdElkKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19JbnRUeEluaXQoVF9aRHJ2STJTX0lkIHRJZCk7DQotc3RhdGljIFNJTlQzMiBpMnNfRG1hUnhJbml0KFRfWkRydkkyU19JZCB0SWQpOw0KLXN0YXRpYyBTSU5UMzIgaTJzX0RtYVR4SW5pdChUX1pEcnZJMlNfSWQgdElkKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19EbWFUeChUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiB1aUxlbik7DQotc3RhdGljIFNJTlQzMglpMnNfRG1hUngoVF9aRHJ2STJTX0lkIHRJZCwgVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UsIFVJTlQ4IGlkeCk7DQotDQotc3RhdGljIFNJTlQzMiBpMnNfQ2xlYW5UeFJlc291cmNlKFRfWkRydkkyU19JZCB0SWQpOw0KLXN0YXRpYyBTSU5UMzIgaTJzX0NsZWFuUnhSZXNvdXJjZShUX1pEcnZJMlNfSWQgdElkKTsNCi0NCi1zdGF0aWMgU0lOVDMyIGkyc19JbnRUeChUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiB1aUxlbik7DQotDQotc3RhdGljIFZPSUQgaTJzX0luaXRJbnQoVk9JRCk7DQotc3RhdGljIFNJTlQzMiBpMnNfU2V0Q2xrKFRfWkRydkkyU19JZCB0SWQsIFRfSTJzX0Nsa0RpdiAqcERpdik7DQotc3RhdGljIFNJTlQzMiBpMnNfQ2xvc2VDbGsoVF9aRHJ2STJTX0lkIGkyc0lkKTsNCi1zdGF0aWMgU0lOVDMyIGkyc19TZXRDbGtEaXYoVUlOVDMyIGRpdkZ1bmMsIFVJTlQzMiBkaXYpOw0KLQ0KLSNpZmRlZiBfVVNFX1BTTQ0KLWV4dGVybiBTSU5UMzIgekRydlBvd19TZXREZXZBY3RpdmUoVF9aRHJ2UG93X0lkbGVGbGFnIGRldklkKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZQb3dfU2V0RGV2SWRsZShUX1pEcnZQb3dfSWRsZUZsYWcgZGV2SWQpOw0KLSNlbmRpZg0KLQ0KLVNJTlQzMiBpMnNfR2V0STJzVGltaW5nQ2ZnKFRfWkRydkkyU19UaW1pbmdUeXBlIHRtVHlwZSwgVF9aRHJ2STJTX1RpbWluZ0NmZyAqcFRtQ2ZnKTsNCi1TSU5UMzIgaTJzX1NldFRpbWluZyhUX0kyc19SZWcgKnB0UmVnLCBUX1pEcnZJMlNfQ2ZnICpwdENmZyk7DQotc3RhdGljIFZPSUQgaTJzX0Nsa0luaXQoVk9JRCk7DQotc3RhdGljIFZPSUQgaTJzX0Nsa0RlaW5pdChUX1pEcnZJMlNfSWQgdElkKTsNCi0NCi1leHRlcm4gVk9JRCBWcF9DaGFuZ0J1ZkxlbihWT0lEKTsNCi0jaWZkZWYgX1VTRV9WUF9JMlNfU1lOQw0KLWV4dGVybiBWT0lEIFZwX0kyUzFSZWFkQ2hhbmdlQnVmTGVuKFZPSUQpOw0KLWV4dGVybiBWT0lEIFZwX0kyUzFXcml0ZUNoYW5nZUJ1ZkxlbihWT0lEKTsNCi1leHRlcm4gVk9JRCBWcF9JMlMyUmVhZENoYW5nZUJ1ZkxlbihWT0lEKTsNCi1leHRlcm4gVk9JRCBWcF9JMlMyV3JpdGVDaGFuZ2VCdWZMZW4oVk9JRCk7DQotI2VuZGlmDQotU0lOVDMyIGkyc19yeHNlbV9jb3VudF9Jbml0KFRfWkRydkkyU19JZCB0SWQpOw0KLVNJTlQzMiBpMnNfdHhzZW1fY291bnRfSW5pdChUX1pEcnZJMlNfSWQgdElkKTsNCi12b2lkIGJzcF91ZGVsYXkoVTMyIHVzKTsvL3hpdQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNpZmRlZiBNQUxMT0NfSTJTX0RNQV9BUkVBDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLS8vICAgIFVJTlQzMiAgIHR4dG90YWxidWZmc2l6ZTsNCi0vLyAgICBVSU5UMzIgICByeHRvdGFsYnVmZnNpemU7DQotLy8JVUlOVDMyICAgdHhzaW5nbGVidWZmc2l6ZTsNCi0vLyAgICBVSU5UMzIgICByeHNpbmdsZWJ1ZmZzaXplOw0KLS8vCWRtYV9hZGRyX3QgZG1hX3R4X3BoeWFkZHJbSTJTX09VVF9CVUZfTlVNXTsNCi0vLwl2b2lkKiBkbWFfdHhfdmlyYWRkcjsNCi0vLwlkbWFfYWRkcl90IGRtYV9yeF9waHlhZGRyW0kyU19PVVRfQlVGX05VTV07DQotLy8Jdm9pZCogZG1hX3J4X3ZpcmFkZHI7DQotLy8JVF9aRHJ2RG1hX0NoYW5uZWxEZWYgcnhEbWFDaGFuRGVmOw0KLS8vCVRfWkRydkRtYV9DaGFubmVsRGVmIHR4RG1hQ2hhbkRlZjsNCi0JVUlOVDMyICAgdG90YWxidWZmc2l6ZTsNCi0JVUlOVDMyICAgc2luZ2xlYnVmZnNpemU7DQotCWRtYV9hZGRyX3QgZG1hX3BoeWFkZHI7DQotCXZvaWQqIGRtYV92aXJhZGRyOw0KLS8vCVRfWkRydkRtYV9DaGFubmVsRGVmIGRtYUNoYW5EZWY7DQotCXN0cnVjdCBkbWFfY2hhbiAqY2g7DQotCWludCBjaGFubmVsOw0KLX0NCi1UX0kyc19EbWFJbmZvOw0KLQ0KLXN0YXRpYyBUX0kyc19EbWFJbmZvIGkyc0RtYVN0YXRlW01BWF9JMlNfSURdWzJdID0gezB9Ow0KLQ0KLSNlbmRpZg0KLQ0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaTJzX2RldmljZV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7DQotDQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaTJzX2RldmljZSA9IHsNCi0JLm5hbWUgPSAidjMtaTJzIiwNCi0JLmlkCT0gLTEsDQotCS5kZXYgPSB7DQotCQkuZG1hX21hc2sJCT0gJmkyc19kZXZpY2VfZG1hX21hc2ssDQotCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLA0KLQkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLA0KLQl9LA0KLX07DQotDQotDQotc3RhdGljIFRfSTJzX0luc3RhbmNlIHNfaTJzSW5zdGFuY2VbTUFYX0kyU19JRF0gID0gew0KLQkwLA0KLX07DQotc3RhdGljIFRfSTJzX1R4U3RyZWFtIHNfaTJzVHhTdHJlYW1bTUFYX0kyU19JRF0gPSB7DQotCU5VTEwsDQotfTsNCi1zdGF0aWMgVF9JMnNfUnhTdHJlYW0gc19pMnNSeFN0cmVhbVtNQVhfSTJTX0lEXSA9IHsNCi0JTlVMTCwNCi19Ow0KLXN0YXRpYyBjb25zdCBVSU5UMTYgKnNfdHhCdWZbTUFYX0kyU19JRF0gPSB7DQotCU5VTEwsDQotfTsNCi1zdGF0aWMgVUlOVDE2ICpzX3J4QnVmW01BWF9JMlNfSURdID0gew0KLQlOVUxMLA0KLX07DQotc3RhdGljIFVJTlQzMiBzX3R4TGVuW01BWF9JMlNfSURdID0gew0KLQkwDQotfTsNCi1zdGF0aWMgVUlOVDMyIHNfcnhMZW5bTUFYX0kyU19JRF0gPSB7DQotCTANCi19Ow0KLXN0YXRpYyBVSU5UOCAqc190eEJ1ZkFycmF5W01BWF9JMlNfSURdW0kyU19PVVRfQlVGX05VTV0gPSB7DQotCU5VTEwsDQotfTsNCi1zdGF0aWMgVUlOVDggKnNfcnhCdWZBcnJheVtNQVhfSTJTX0lEXVtJMlNfT1VUX0JVRl9OVU1dID0gew0KLQlOVUxMLA0KLX07DQotI2lmIGRlZmluZWQgX1VTRV9BVURJT19PTl83NTIwVjINCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdQY20xU2xvdENsa0RpdltSRUZfQ0xLX01BWF1bTUFYX0NMS11bTUFYX1BDTV9NT0RFXSA9IHsNCi0Jew0KLQkJe3syNSwgMTk5LCAyNTUsIDAsIDAsIDAsIDN9LCB7MjMsIDIwMywgMjU1LCAxLCAwLCAwLCAzfX0sDQotCQl7ezE4LCAyMTYsIDI1NSwgMCwgMCwgMCwgM30sIHsxNywgMTc0LCAyNTUsIDAsIDAsIDAsIDN9fSwNCi0JCXt7MTYsIDIxOCwgMjU1LCAxLCAwLCAwLCAzfSwgezE1LCAyMjAsIDI1NSwgMSwgMCwgMCwgM319LA0KLQkJe3sxMiwgMTAwLCAyNTUsIDEsIDAsIDAsIDN9LCB7MTEsIDIyOSwgMjU1LCAxLCAwLCAwLCAzfX0sDQotCQl7ezksIDEwOCwgMjU1LCAwLCAwLCAwLCAzfSwgezgsIDg3LCAyNTUsIDEsIDAsIDAsIDN9fSwNCi0JCXt7OCwgMjM2LCAyNTUsIDAsIDAsIDAsIDN9LCB7NywgMjM4LCAyNTUsIDEsIDAsIDAsIDN9fSwNCi0JCXt7NiwgMTc3LCAyNTUsIDAsIDAsIDAsIDN9LCB7NSwgMjQyLCAyNTUsIDEsIDAsIDAsIDN9fSwNCi0JCXt7NCwgNTQsIDI1NSwgMSwgMCwgMCwgM30sIHs0LCAxNzEsIDI1NSwgMCwgMCwgMCwgM319LA0KLQkJe3s0LCAxMTgsIDI1NSwgMCwgMCwgMCwgM30sIHszLCAyNDYsIDI1NSwgMSwgMCwgMCwgM319LA0KLQkJe3szLCA4OSwgMjU1LCAwLCAwLCAwLCAzfSwgezIsIDI0OCwgMjU1LCAxLCAwLCAwLCAzfX0sDQotCQl7ezIsIDU5LCAyNTUsIDAsIDAsIDAsIDN9LCB7MSwgMjUxLCAyNTUsIDEsIDAsIDAsIDN9fQ0KLQl9DQotfTsNCi0NCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdQY20yU2xvdENsa0RpdltSRUZfQ0xLX01BWF1bTUFYX0NMS11bTUFYX1BDTV9NT0RFXSA9IHsNCi0Jew0KLQkJe3sxMiwgMTAwLCAyNTUsIDEsIDAsIDAsIDN9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fQ0KLQl9DQotfTsNCi0NCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdQY200U2xvdENsa0RpdltSRUZfQ0xLX01BWF1bTUFYX0NMS11bTUFYX1BDTV9NT0RFXSA9IHsNCi0Jew0KLQkJe3s2LCAxNzcsIDI1NSwgMCwgMCwgMCwgM30sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19DQotCX0NCi19Ow0KLQ0KLXN0YXRpYyBUX0kyc19DbGtEaXYgZ1BjbThTbG90Q2xrRGl2W1JFRl9DTEtfTUFYXVtNQVhfQ0xLXVtNQVhfUENNX01PREVdID0gew0KLQl7DQotCQl7ezMsIDg5LCAyNTUsIDAsIDAsIDAsIDN9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fQ0KLQl9DQotfTsNCi0NCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdQY20xNlNsb3RDbGtEaXZbUkVGX0NMS19NQVhdW01BWF9DTEtdW01BWF9QQ01fTU9ERV0gPSB7DQotCXsNCi0JCXt7MywgODksIDI1NSwgMCwgMCwgMCwgM30sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19LA0KLQkJe3swLCAwLCAwLCAwLCAwLCAwLCAwfSwgezAsIDAsIDAsIDAsIDAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIHswLCAwLCAwLCAwLCAwLCAwLCAwfX0sDQotCQl7ezAsIDAsIDAsIDAsIDAsIDAsIDB9LCB7MCwgMCwgMCwgMCwgMCwgMCwgMH19DQotCX0NCi19Ow0KLQ0KLXN0YXRpYyBUX0kyc19DbGtEaXYgZ0kyc0Nsa0RpdltSRUZfQ0xLX01BWF1bTUFYX0NMS11bTUFYX1RTX1dJRFRIXSA9IHsNCi0Jew0KLQkJe3syNSwgMTk5LCAyNTUsIDAsIDAsIDAsIDF9LCB7MjMsIDIwMywgMjU1LCAxLCAwLCAwLCAxfSwgezIyLCAzNSwgMjU1LCAxLCAwLCAwLCAxfSwgezIxLCAxOTUsIDI1NSwgMCwgMCwgMCwgMX0sIHsyMCwgMTU5LCAyNTUsIDAsIDAsIDAsIDF9LCB7MTksIDE3NiwgMjU1LCAwLCAwLCAwLCAxfSwgezE4LCAyMzgsIDI1NSwgMCwgMCwgMCwgMX0sIHsxNywgODMsIDI1NSwgMSwgMCwgMCwgMX0sIHsxNiwgMjE4LCAyNTUsIDEsIDAsIDAsIDF9LCB7MTYsIDEyOCwgMjU1LCAwLCAwLCAwLCAxfSwgezE1LCA2NCwgMjU1LCAxLCAwLCAwLCAxfSwgezE1LCAyNCwgMjU1LCAwLCAwLCAwLCAxfSwgezE0LCA1LCAyNTUsIDEsIDAsIDAsIDF9LCB7MTQsIDQsIDI1NSwgMCwgMCwgMCwgMX0sIHsxMywgMjEsIDI1NSwgMSwgMCwgMCwgMX0sIHsxMywgNTMsIDI1NSwgMCwgMCwgMCwgMX0sIHsxMiwgMTAwLCAyNTUsIDEsIDAsIDAsIDF9fSwNCi0JCXt7MTgsIDIxNiwgMjU1LCAwLCAwLCAwLCAxfSwgezE3LCAxNzQsIDI1NSwgMCwgMCwgMCwgMX0sIHsxNiwgMTkyLCAyNTUsIDAsIDAsIDAsIDF9LCB7MTUsIDgsIDI1NSwgMSwgMCwgMCwgMX0sIHsxNCwgMTIyLCAyNTUsIDEsIDAsIDAsIDF9LCB7MTQsIDE5LCAyNTUsIDAsIDAsIDAsIDF9LCB7MTMsIDIwNCwgMjU1LCAwLCAwLCAwLCAxfSwgezEyLCAxNjIsIDI1NSwgMSwgMCwgMCwgMX0sIHsxMiwgMTQ0LCAyNTUsIDAsIDAsIDAsIDF9LCB7MTEsIDE0OSwgMjU1LCAxLCAwLCAwLCAxfSwgezExLCAxNzIsIDI1NSwgMCwgMCwgMCwgMX0sIHsxMCwgMjEzLCAyNTUsIDEsIDAsIDAsIDF9LCB7MTAsIDE0LCAyNTUsIDEsIDAsIDAsIDF9LCB7MTAsIDg0LCAyNTUsIDAsIDAsIDAsIDF9LCB7OSwgMTY2LCAyNTUsIDEsIDAsIDAsIDF9LCB7OSwgNSwgMjU1LCAxLCAwLCAwLCAxfSwgezksIDEwOCwgMjU1LCAwLCAwLCAwLCAxfX0sDQotCQl7ezE2LCAyMTgsIDI1NSwgMSwgMCwgMCwgMX0sIHsxNSwgMjIwLCAyNTUsIDEsIDAsIDAsIDF9LCB7MTUsIDI0LCAyNTUsIDAsIDAsIDAsIDF9LCB7MTQsIDEzMCwgMjU1LCAwLCAwLCAwLCAxfSwgezEzLCAyMSwgMjU1LCAxLCAwLCAwLCAxfSwgezEyLCAyMDIsIDI1NSwgMSwgMCwgMCwgMX0sIHsxMiwgMTU4LCAyNTUsIDAsIDAsIDAsIDF9LCB7MTEsIDE0MCwgMjU1LCAxLCAwLCAwLCAxfSwgezExLCAxNDUsIDI1NSwgMCwgMCwgMCwgMX0sIHsxMCwgMTcwLCAyNTUsIDEsIDAsIDAsIDF9LCB7MTAsIDIxMywgMjU1LCAwLCAwLCAwLCAxfSwgezEwLCAxNiwgMjU1LCAwLCAwLCAwLCAxfSwgezksIDg4LCAyNTUsIDEsIDAsIDAsIDF9LCB7OSwgMTczLCAyNTUsIDAsIDAsIDAsIDF9LCB7OSwgMTQsIDI1NSwgMCwgMCwgMCwgMX0sIHs4LCAxMjEsIDI1NSwgMSwgMCwgMCwgMX0sIHs4LCAyMzYsIDI1NSwgMCwgMCwgMCwgMX19LA0KLQkJe3sxMiwgMTAwLCAyNTUsIDEsIDAsIDAsIDF9LCB7MTEsIDIyOSwgMjU1LCAxLCAwLCAwLCAxfSwgezExLCAxNDUsIDI1NSwgMCwgMCwgMCwgMX0sIHsxMCwgOTcsIDI1NSwgMSwgMCwgMCwgMX0sIHsxMCwgODAsIDI1NSwgMCwgMCwgMCwgMX0sIHs5LCA4OCwgMjU1LCAxLCAwLCAwLCAxfSwgezksIDExOSwgMjU1LCAwLCAwLCAwLCAxfSwgezgsIDE2OSwgMjU1LCAxLCAwLCAwLCAxfSwgezgsIDIzNiwgMjU1LCAwLCAwLCAwLCAxfSwgezgsIDY0LCAyNTUsIDAsIDAsIDAsIDF9LCB7NywgMTU5LCAyNTUsIDEsIDAsIDAsIDF9LCB7NywgMTIsIDI1NSwgMSwgMCwgMCwgMX0sIHs3LCAxMzAsIDI1NSwgMCwgMCwgMCwgMX0sIHs3LCAyLCAyNTUsIDAsIDAsIDAsIDF9LCB7NiwgMTM4LCAyNTUsIDEsIDAsIDAsIDF9LCB7NiwgMjcsIDI1NSwgMSwgMCwgMCwgMX0sIHs2LCAxNzcsIDI1NSwgMCwgMCwgMCwgMX19LA0KLQkJe3s5LCAxMDgsIDI1NSwgMCwgMCwgMCwgMX0sIHs4LCA4NywgMjU1LCAxLCAwLCAwLCAxfSwgezgsIDk2LCAyNTUsIDAsIDAsIDAsIDF9LCB7NywgMTMxLCAyNTUsIDEsIDAsIDAsIDF9LCB7NywgMTg5LCAyNTUsIDAsIDAsIDAsIDF9LCB7NywgMTAsIDI1NSwgMCwgMCwgMCwgMX0sIHs2LCAxMDIsIDI1NSwgMSwgMCwgMCwgMX0sIHs2LCAyMDgsIDI1NSwgMCwgMCwgMCwgMX0sIHs2LCA3MiwgMjU1LCAwLCAwLCAwLCAxfSwgezUsIDIwMiwgMjU1LCAxLCAwLCAwLCAxfSwgezUsIDg2LCAyNTUsIDEsIDAsIDAsIDF9LCB7NSwgMjM0LCAyNTUsIDAsIDAsIDAsIDF9LCB7NSwgMTM1LCAyNTUsIDAsIDAsIDAsIDF9LCB7NSwgNDIsIDI1NSwgMCwgMCwgMCwgMX0sIHs0LCAyMTEsIDI1NSwgMSwgMCwgMCwgMX0sIHs0LCAxMzAsIDI1NSwgMSwgMCwgMCwgMX0sIHs0LCA1NCwgMjU1LCAxLCAwLCAwLCAxfX0sDQotCQl7ezgsIDIzNiwgMjU1LCAwLCAwLCAwLCAxfSwgezcsIDIzOCwgMjU1LCAxLCAwLCAwLCAxfSwgezcsIDEyLCAyNTUsIDEsIDAsIDAsIDF9LCB7NywgNjUsIDI1NSwgMCwgMCwgMCwgMX0sIHs2LCAxMzgsIDI1NSwgMSwgMCwgMCwgMX0sIHs2LCAyMjksIDI1NSwgMCwgMCwgMCwgMX0sIHs2LCA3OSwgMjU1LCAwLCAwLCAwLCAxfSwgezUsIDE5OCwgMjU1LCAxLCAwLCAwLCAxfSwgezUsIDczLCAyNTUsIDEsIDAsIDAsIDF9LCB7NSwgMjEzLCAyNTUsIDAsIDAsIDAsIDF9LCB7NSwgMTA2LCAyNTUsIDAsIDAsIDAsIDF9LCB7NSwgOCwgMjU1LCAwLCAwLCAwLCAxfSwgezQsIDE3MiwgMjU1LCAxLCAwLCAwLCAxfSwgezQsIDg2LCAyNTUsIDEsIDAsIDAsIDF9LCB7NCwgNywgMjU1LCAxLCAwLCAwLCAxfSwgezQsIDE4OCwgMjU1LCAwLCAwLCAwLCAxfSwgezQsIDExOCwgMjU1LCAwLCAwLCAwLCAxfX0sDQotCQl7ezYsIDE3NywgMjU1LCAwLCAwLCAwLCAxfSwgezUsIDI0MiwgMjU1LCAxLCAwLCAwLCAxfSwgezUsIDczLCAyNTUsIDEsIDAsIDAsIDF9LCB7NSwgMTc2LCAyNTUsIDAsIDAsIDAsIDF9LCB7NSwgNDAsIDI1NSwgMCwgMCwgMCwgMX0sIHs0LCAxNzIsIDI1NSwgMSwgMCwgMCwgMX0sIHs0LCA1OSwgMjU1LCAxLCAwLCAwLCAxfSwgezQsIDIxMiwgMjU1LCAwLCAwLCAwLCAxfSwgezQsIDExOCwgMjU1LCAwLCAwLCAwLCAxfSwgezQsIDMyLCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMjA3LCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgMTMzLCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgNjUsIDI1NSwgMSwgMCwgMCwgMX0sIHszLCAxLCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgMTk3LCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMTQxLCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgODksIDI1NSwgMCwgMCwgMCwgMX19LA0KLQkJe3s0LCA1NCwgMjU1LCAxLCAwLCAwLCAxfSwgezQsIDE3MSwgMjU1LCAwLCAwLCAwLCAxfSwgezQsIDQ4LCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMTkzLCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgOTQsIDI1NSwgMSwgMCwgMCwgMX0sIHszLCA1LCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgMTc4LCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMTA0LCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMzYsIDI1NSwgMCwgMCwgMCwgMX0sIHsyLCAyMjgsIDI1NSwgMSwgMCwgMCwgMX0sIHsyLCAxNzEsIDI1NSwgMSwgMCwgMCwgMX0sIHsyLCAxMTcsIDI1NSwgMSwgMCwgMCwgMX0sIHsyLCA2NywgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDIxLCAyNTUsIDEsIDAsIDAsIDF9LCB7MiwgMjMzLCAyNTUsIDAsIDAsIDAsIDF9LCB7MiwgMTkyLCAyNTUsIDAsIDAsIDAsIDF9LCB7MiwgMTU1LCAyNTUsIDAsIDAsIDAsIDF9fSwNCi0JCXt7NCwgMTE4LCAyNTUsIDAsIDAsIDAsIDF9LCB7MywgMjQ2LCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgMTMzLCAyNTUsIDEsIDAsIDAsIDF9LCB7MywgMzIsIDI1NSwgMSwgMCwgMCwgMX0sIHszLCAxOTcsIDI1NSwgMCwgMCwgMCwgMX0sIHszLCAxMTQsIDI1NSwgMCwgMCwgMCwgMX0sIHszLCA0MCwgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDIyNiwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDE2NCwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDEwNiwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDUzLCAyNTUsIDEsIDAsIDAsIDF9LCB7MiwgNCwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDIxMywgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDE3MSwgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDEzMSwgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDk0LCAyNTUsIDAsIDAsIDAsIDF9LCB7MiwgNTksIDI1NSwgMCwgMCwgMCwgMX19LA0KLQkJe3szLCA4OSwgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDI0OCwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDE2NCwgMjU1LCAxLCAwLCAwLCAxfSwgezIsIDg4LCAyNTUsIDEsIDAsIDAsIDF9LCB7MiwgMjAsIDI1NSwgMSwgMCwgMCwgMX0sIHsyLCAyMTMsIDI1NSwgMCwgMCwgMCwgMX0sIHsyLCAxNTcsIDI1NSwgMCwgMCwgMCwgMX0sIHsyLCAxMDYsIDI1NSwgMCwgMCwgMCwgMX0sIHsyLCA1OSwgMjU1LCAwLCAwLCAwLCAxfSwgezIsIDE2LCAyNTUsIDAsIDAsIDAsIDF9LCB7MSwgMjMxLCAyNTUsIDEsIDAsIDAsIDF9LCB7MSwgMTk0LCAyNTUsIDEsIDAsIDAsIDF9LCB7MSwgMTYwLCAyNTUsIDEsIDAsIDAsIDF9LCB7MSwgMTI4LCAyNTUsIDEsIDAsIDAsIDF9LCB7MSwgOTgsIDI1NSwgMSwgMCwgMCwgMX0sIHsxLCA3MCwgMjU1LCAxLCAwLCAwLCAxfSwgezEsIDQ0LCAyNTUsIDEsIDAsIDAsIDF9fSwNCi0JCXt7MiwgNTksIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAyNTEsIDI1NSwgMSwgMCwgMCwgMX0sIHsxLCAxOTQsIDI1NSwgMSwgMCwgMCwgMX0sIHsxLCAxNDQsIDI1NSwgMSwgMCwgMCwgMX0sIHsxLCA5OCwgMjU1LCAxLCAwLCAwLCAxfSwgezEsIDU3LCAyNTUsIDEsIDAsIDAsIDF9LCB7MSwgMjAsIDI1NSwgMSwgMCwgMCwgMX0sIHsxLCAyNDEsIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAyMDksIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAxODEsIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAxNTQsIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAxMjksIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAxMDcsIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCA4NSwgMjU1LCAwLCAwLCAwLCAxfSwgezEsIDY2LCAyNTUsIDAsIDAsIDAsIDF9LCB7MSwgNDcsIDI1NSwgMCwgMCwgMCwgMX0sIHsxLCAzMCwgMjU1LCAwLCAwLCAwLCAxfX0NCi0JfQ0KLX07DQotI2VsaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMw0KLXN0YXRpYyBUX0kyc19DbGtEaXYgZ1BjbTFTbG90Q2xrRGl2W1JFRl9DTEtfTUFYXVtNQVhfQ0xLXVtNQVhfUENNX01PREVdID0gew0KLQl7DQotCQl7ezI1LCAxOTksIDB9LCB7MjMsIDIwMywgMH19LA0KLQkJe3syNSwgMTk5LCAwfSwgezIzLCAyMDMsIDB9fSwNCi0JCXt7MjUsIDE5OSwgMH0sIHsyMywgMjAzLCAwfX0sDQotCQl7ezI1LCAxOTksIDB9LCB7MjMsIDIwMywgMH19LA0KLQkJe3syNSwgMTk5LCAwfSwgezIzLCAyMDMsIDB9fSwNCi0JCXt7MjUsIDE5OSwgMH0sIHsyMywgMjAzLCAwfX0sDQotCQl7ezI1LCAxOTksIDB9LCB7MjMsIDIwMywgMH19LA0KLQkJe3syNSwgMTk5LCAwfSwgezIzLCAyMDMsIDB9fSwNCi0JCXt7MjUsIDE5OSwgMH0sIHsyMywgMjAzLCAwfX0sDQotCQl7ezI1LCAxOTksIDB9LCB7MjMsIDIwMywgMH19LA0KLQkJe3syNSwgMTk5LCAwfSwgezIzLCAyMDMsIDB9fQ0KLQl9LA0KLQl7DQotCQl7ezI1LCAxOTksIDF9LCB7MjMsIDIwMywgMX19LA0KLQkJe3syNSwgMTk5LCAxfSwgezIzLCAyMDMsIDF9fSwNCi0JCXt7MjUsIDE5OSwgMX0sIHsyMywgMjAzLCAxfX0sDQotCQl7ezI1LCAxOTksIDF9LCB7MjMsIDIwMywgMX19LA0KLQkJe3syNSwgMTk5LCAxfSwgezIzLCAyMDMsIDF9fSwNCi0JCXt7MjUsIDE5OSwgMX0sIHsyMywgMjAzLCAxfX0sDQotCQl7ezI1LCAxOTksIDF9LCB7MjMsIDIwMywgMX19LA0KLQkJe3syNSwgMTk5LCAxfSwgezIzLCAyMDMsIDF9fSwNCi0JCXt7MjUsIDE5OSwgMX0sIHsyMywgMjAzLCAxfX0sDQotCQl7ezI1LCAxOTksIDF9LCB7MjMsIDIwMywgMX19LA0KLQkJe3syNSwgMTk5LCAxfSwgezIzLCAyMDMsIDF9fQ0KLQl9LA0KLQl7DQotCQl7ezI1LCAxOTksIDJ9LCB7MjMsIDIwMywgMn19LA0KLQkJe3syNSwgMTk5LCAyfSwgezIzLCAyMDMsIDJ9fSwNCi0JCXt7MjUsIDE5OSwgMn0sIHsyMywgMjAzLCAyfX0sDQotCQl7ezI1LCAxOTksIDJ9LCB7MjMsIDIwMywgMn19LA0KLQkJe3syNSwgMTk5LCAyfSwgezIzLCAyMDMsIDJ9fSwNCi0JCXt7MjUsIDE5OSwgMn0sIHsyMywgMjAzLCAyfX0sDQotCQl7ezI1LCAxOTksIDJ9LCB7MjMsIDIwMywgMn19LA0KLQkJe3syNSwgMTk5LCAyfSwgezIzLCAyMDMsIDJ9fSwNCi0JCXt7MjUsIDE5OSwgMn0sIHsyMywgMjAzLCAyfX0sDQotCQl7ezI1LCAxOTksIDJ9LCB7MjMsIDIwMywgMn19LA0KLQkJe3syNSwgMTk5LCAyfSwgezIzLCAyMDMsIDJ9fQ0KLQl9LA0KLQ0KLX07DQotDQotc3RhdGljIFRfSTJzX0Nsa0RpdiBnUGNtMlNsb3RDbGtEaXZbUkVGX0NMS19NQVhdW01BWF9DTEtdW01BWF9QQ01fTU9ERV0gPSB7DQotCXsNCi0JCXt7MTIsIDEwMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19DQotCX0sDQotCXsNCi0JCXt7MTIsIDEwMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19DQotCX0sDQotCXsNCi0JCXt7MTIsIDEwMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19DQotCX0NCi19Ow0KLQ0KLXN0YXRpYyBUX0kyc19DbGtEaXYgZ1BjbTRTbG90Q2xrRGl2W1JFRl9DTEtfTUFYXVtNQVhfQ0xLXVtNQVhfUENNX01PREVdID0gew0KLQl7DQotCQl7ezEyLCAxMDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fQ0KLQl9LA0KLQl7DQotCQl7ezEyLCAxMDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fQ0KLQl9LA0KLQl7DQotCQl7ezEyLCAxMDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fQ0KLQl9DQotfTsNCi0NCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdQY204U2xvdENsa0RpdltSRUZfQ0xLX01BWF1bTUFYX0NMS11bTUFYX1BDTV9NT0RFXSA9IHsNCi0Jew0KLQkJe3sxMiwgMTAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0NCi0JfSwNCi0Jew0KLQkJe3sxMiwgMTAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0NCi0JfSwNCi0Jew0KLQkJe3sxMiwgMTAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0NCi0JfQ0KLX07DQotDQotc3RhdGljIFRfSTJzX0Nsa0RpdiBnUGNtMTZTbG90Q2xrRGl2W1JFRl9DTEtfTUFYXVtNQVhfQ0xLXVtNQVhfUENNX01PREVdID0gew0KLQl7DQotCQl7ezEyLCAxMDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fSwNCi0JCXt7MCwgMCwgMH0sIHswLCAwLCAwfX0sDQotCQl7ezAsIDAsIDB9LCB7MCwgMCwgMH19LA0KLQkJe3swLCAwLCAwfSwgezAsIDAsIDB9fQ0KLQl9LA0KLQl7DQotCQl7ezEyLCAxMDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fSwNCi0JCXt7MCwgMCwgMX0sIHswLCAwLCAxfX0sDQotCQl7ezAsIDAsIDF9LCB7MCwgMCwgMX19LA0KLQkJe3swLCAwLCAxfSwgezAsIDAsIDF9fQ0KLQl9LA0KLQl7DQotCQl7ezEyLCAxMDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fSwNCi0JCXt7MCwgMCwgMn0sIHswLCAwLCAyfX0sDQotCQl7ezAsIDAsIDJ9LCB7MCwgMCwgMn19LA0KLQkJe3swLCAwLCAyfSwgezAsIDAsIDJ9fQ0KLQl9DQotfTsNCi0NCi1zdGF0aWMgVF9JMnNfQ2xrRGl2IGdJMnNDbGtEaXZbUkVGX0NMS19NQVhdW01BWF9DTEtdW01BWF9UU19XSURUSF0gPSB7DQotCXsNCi0JCXt7MHgwMDIwMDAxOSwgMHgwMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIFJFRl9DTEsyNk19LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE3Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE4Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE5Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzIwQ1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzIxQ1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzIyQ1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzIzQ1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzI0Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzgwMDAsIFRTXzMyQ1lDTEUsIDB9fSwNCi0JCXt7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTdDWUNMRSwgMH0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE4Q1lDTEUsIDB9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xOUNZQ0xFLCAwfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMjBDWUNMRSwgMH0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzIxQ1lDTEUsIDB9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18yMkNZQ0xFLCAwfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMjNDWUNMRSwgMH0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzI0Q1lDTEUsIDB9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMH0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMH0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMTAyNSwgVFNfMzJDWUNMRSwgMH19LA0KLQkJe3sweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xN0NZQ0xFLCAwfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMThDWUNMRSwgMH0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE5Q1lDTEUsIDB9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18yMENZQ0xFLCAwfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMjFDWUNMRSwgMH0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzIyQ1lDTEUsIDB9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18yM0NZQ0xFLCAwfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMjRDWUNMRSwgMH0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18zMkNZQ0xFLCAwfX0sDQotCQl7ezB4MDA0MDAwMTksIDB4MDAwMTksIENMS18xNjAwMCwgVFNfMTZDWUNMRSwgUkVGX0NMSzI2TX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE3Q1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xOENZQ0xFLCAwfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTlDWUNMRSwgMH0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzIwQ1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18yMUNZQ0xFLCAwfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMjJDWUNMRSwgMH0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzIzQ1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18yNENZQ0xFLCAwfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTYwMDAsIFRTXzMyQ1lDTEUsIDB9fSwNCi0JCXt7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzIyMDUwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTdDWUNMRSwgMH0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE4Q1lDTEUsIDB9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xOUNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMjBDWUNMRSwgMH0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzIxQ1lDTEUsIDB9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18yMkNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMjNDWUNMRSwgMH0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzI0Q1lDTEUsIDB9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18yMjA1MCwgVFNfMzJDWUNMRSwgMH19LA0KLQkJe3sweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMjQwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xN0NZQ0xFLCAwfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMThDWUNMRSwgMH0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE5Q1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18yMENZQ0xFLCAwfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMjFDWUNMRSwgMH0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzIyQ1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18yM0NZQ0xFLCAwfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMjRDWUNMRSwgMH0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzI0MDAwLCBUU18zMkNZQ0xFLCAwfX0sDQotCQl7ezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18zMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE3Q1lDTEUsIDB9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xOENZQ0xFLCAwfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTlDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzIwQ1lDTEUsIDB9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18yMUNZQ0xFLCAwfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMjJDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzIzQ1lDTEUsIDB9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18yNENZQ0xFLCAwfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMzIwMDAsIFRTXzMyQ1lDTEUsIDB9fSwNCi0JCXt7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzQ0MTAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTdDWUNMRSwgMH0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE4Q1lDTEUsIDB9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xOUNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMjBDWUNMRSwgMH0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzIxQ1lDTEUsIDB9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18yMkNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMjNDWUNMRSwgMH0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzI0Q1lDTEUsIDB9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDZlNDA0MmQsIDB4MTAwMDQsIENMS180NDEwMCwgVFNfMzJDWUNMRSwgMH19LA0KLQkJe3sweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfNDgwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xN0NZQ0xFLCAwfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMThDWUNMRSwgMH0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE5Q1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18yMENZQ0xFLCAwfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMjFDWUNMRSwgMH0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzIyQ1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18yM0NZQ0xFLCAwfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMjRDWUNMRSwgMH0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzQ4MDAwLCBUU18zMkNZQ0xFLCAwfX0sDQotCQl7ezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS182NDAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE3Q1lDTEUsIDB9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xOENZQ0xFLCAwfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTlDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzIwQ1lDTEUsIDB9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18yMUNZQ0xFLCAwfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMjJDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzIzQ1lDTEUsIDB9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18yNENZQ0xFLCAwfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAyMDAwMDU5LCAweDEwMDAzLCBDTEtfNjQwMDAsIFRTXzMyQ1lDTEUsIDB9fSwNCi0JCXt7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzk2MDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTdDWUNMRSwgMH0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE4Q1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xOUNZQ0xFLCAwfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMjBDWUNMRSwgMH0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzIxQ1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18yMkNZQ0xFLCAwfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMjNDWUNMRSwgMH0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzI0Q1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMH0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDB9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAwfSwgezB4MDMwMDAwNTksIDB4MTAwMDIsIENMS185NjAwMCwgVFNfMzJDWUNMRSwgMH19DQotCX0sDQotCXsNCi0JCXt7MHgwMDIwMDAxOSwgMHgxMDAzMiwgQ0xLXzgwMDAsIFRTXzE2Q1lDTEUsIFJFRl9DTEsxMDRNfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAyMDAwMTksIDB4MTAwMzIsIENMS184MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS184MDAwLCBUU18zMkNZQ0xFLCAxfX0sDQotCQl7ezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTEwMjUsIFRTXzMyQ1lDTEUsIDF9fSwNCi0JCXt7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMzJDWUNMRSwgMX19LA0KLQkJe3sweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTYwMDAsIFRTXzE2Q1lDTEUsIFJFRl9DTEsxMDRNfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xNjAwMCwgVFNfMzJDWUNMRSwgMX19LA0KLQkJe3sweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMjIwNTAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzIyMDUwLCBUU18zMkNZQ0xFLCAxfX0sDQotCQl7ezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18yNDAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMjQwMDAsIFRTXzMyQ1lDTEUsIDF9fSwNCi0JCXt7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzMyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18zMjAwMCwgVFNfMzJDWUNMRSwgMX19LA0KLQkJe3sweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfNDQxMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwNmU0MDQyZCwgMHgxMDAwNCwgQ0xLXzQ0MTAwLCBUU18zMkNZQ0xFLCAxfX0sDQotCQl7ezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS180ODAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfNDgwMDAsIFRTXzMyQ1lDTEUsIDF9fSwNCi0JCXt7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzY0MDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDIwMDAwNTksIDB4MTAwMDMsIENMS182NDAwMCwgVFNfMzJDWUNMRSwgMX19LA0KLQkJe3sweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfOTYwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAxfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMX0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDF9LCB7MHgwMzAwMDA1OSwgMHgxMDAwMiwgQ0xLXzk2MDAwLCBUU18zMkNZQ0xFLCAxfX0NCi0JfSwNCi0Jew0KLQkJe3sweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgUkVGX0NMSzEyMk04OH0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMjAwMDE5LCAweDEwMDMyLCBDTEtfODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfODAwMCwgVFNfMzJDWUNMRSwgMn19LA0KLQkJe3sweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDE3NiwgMHgxMDAyNCwgQ0xLXzExMDI1LCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAxNzYsIDB4MTAwMjQsIENMS18xMTAyNSwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMTc2LCAweDEwMDI0LCBDTEtfMTEwMjUsIFRTXzE2Q1lDTEUsIDJ9LCB7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzExMDI1LCBUU18zMkNZQ0xFLCAyfX0sDQotCQl7ezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwMzAwMDI5LCAweDEwMDIxLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDMwMDAyOSwgMHgxMDAyMSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDAzMDAwMjksIDB4MTAwMjEsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfMTIwMDAsIFRTXzMyQ1lDTEUsIDJ9fSwNCi0JCXt7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzE2MDAwLCBUU18xNkNZQ0xFLCBSRUZfQ0xLMTIyTTg4fSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA0MDAwMTksIDB4MTAwMTksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNDAwMDE5LCAweDEwMDE5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDQwMDAxOSwgMHgxMDAxOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS18xNjAwMCwgVFNfMzJDWUNMRSwgMn19LA0KLQkJe3sweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfMjIwNTAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMWI5MDBiYiwgMHgxMDAxMiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDFiOTAwYmIsIDB4MTAwMTIsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxYjkwMGJiLCAweDEwMDEyLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzIyMDUwLCBUU18zMkNZQ0xFLCAyfX0sDQotCQl7ezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS18yNDAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwNjAwMDU5LCAweDEwMDEwLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDYwMDA1OSwgMHgxMDAxMCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA2MDAwNTksIDB4MTAwMTAsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfMjQwMDAsIFRTXzMyQ1lDTEUsIDJ9fSwNCi0JCXt7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzMyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDA4MDAwNTksIDB4MTAwMGMsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwODAwMDU5LCAweDEwMDBjLCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMDgwMDA1OSwgMHgxMDAwYywgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS18zMjAwMCwgVFNfMzJDWUNMRSwgMn19LA0KLQkJe3sweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfNDQxMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMzcyMDBiYiwgMHgxMDAwOSwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDM3MjAwYmIsIDB4MTAwMDksIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAzNzIwMGJiLCAweDEwMDA5LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzQ0MTAwLCBUU18zMkNZQ0xFLCAyfX0sDQotCQl7ezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS180ODAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAwYzAwMDU5LCAweDEwMDA4LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMGMwMDA1OSwgMHgxMDAwOCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDBjMDAwNTksIDB4MTAwMDgsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfNDgwMDAsIFRTXzMyQ1lDTEUsIDJ9fSwNCi0JCXt7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzY0MDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDEwMDAwNTksIDB4MTAwMDYsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxMDAwMDU5LCAweDEwMDA2LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTAwMDA1OSwgMHgxMDAwNiwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4ZmZmZjAwMDAsIDB4MTAwNzgsIENMS182NDAwMCwgVFNfMzJDWUNMRSwgMn19LA0KLQkJe3sweGZmZmYwMDAwLCAweDEwMDc4LCBDTEtfOTYwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHgwMTgwMDA1OSwgMHgxMDAwNCwgQ0xLXzEyMDAwLCBUU18xNkNZQ0xFLCAyfSwgezB4MDE4MDAwNTksIDB4MTAwMDQsIENMS18xMjAwMCwgVFNfMTZDWUNMRSwgMn0sIHsweDAxODAwMDU5LCAweDEwMDA0LCBDTEtfMTIwMDAsIFRTXzE2Q1lDTEUsIDJ9LCB7MHhmZmZmMDAwMCwgMHgxMDA3OCwgQ0xLXzk2MDAwLCBUU18zMkNZQ0xFLCAyfX0NCi0JfQ0KLX07DQotI2VuZGlmDQotDQotDQotDQotc3RhdGljIFRfWkRydkkyU19UaW1pbmdDZmcgZ0kyU19UaW1pbmdDZmdbXSA9IHsNCi0Je1RJTUlOR19JMlNfTU9OT19SSUdIVCwgSTJTX1RJTUVfTU9ERSwgMCwgMCwgMX0sDQotCXtUSU1JTkdfSTJTX01PTk9fTEVGVCwgSTJTX1RJTUVfTU9ERSwgMCwgMCwgMn0sDQotCXtUSU1JTkdfSTJTX1NUXzJDSE5fMUxBTkUsIEkyU19USU1FX01PREUsIDEsIDAsIDN9LA0KLQl7VElNSU5HX0kyU19TVF80Q0hOXzJMQU5FLCBJMlNfVElNRV9NT0RFLCAzLCAxLCAzfSwNCi0Je1RJTUlOR19JMlNfU1RfNkNITl8zTEFORSwgSTJTX1RJTUVfTU9ERSwgNSwgMiwgM30sDQotCXtUSU1JTkdfSTJTX1NUXzhDSE5fNExBTkUsIEkyU19USU1FX01PREUsIDcsIDMsIDN9LA0KLQl7VElNSU5HX1RETV8xQ0hOXzFMQU5FXzFUUywgUENNX1RJTUVfTU9ERSwgMCwgMCwgMH0sDQotCXtUSU1JTkdfVERNXzJDSE5fMUxBTkVfMlRTLCBQQ01fVElNRV9NT0RFLCAxLCAwLCAxfQ0KLX07DQotDQotc3RhdGljIFVJTlQzMiBnX2kyc0Nsa0RpdlJlZ3NbMl0gPSB7DQotCUxTUF9DUk1fUkVHX0JBU0UgKyAweDE4LA0KLQlMU1BfQ1JNX1JFR19CQVNFICsgMHgyMCwNCi19Ow0KLQ0KLXN0YXRpYyBCT09MIHNfYkkyc0luaXRJbnQgPSBGQUxTRTsNCi1zdGF0aWMgQk9PTCBzX2JJMnNDbGtJbml0ID0gRkFMU0U7DQotDQotc3RhdGljIFVJTlQzMiBhdWRpb0dwaW9Xc0hhbmRsZSA9IDA7DQotc3RhdGljIFVJTlQzMiBhdWRpb0dwaW9DbGtIYW5kbGUgPSAwOw0KLXN0YXRpYyBVSU5UMzIgYXVkaW9HcGlvRGluSGFuZGxlID0gMDsNCi1zdGF0aWMgVUlOVDMyIGF1ZGlvR3Bpb0RvdXRIYW5kbGUgPSAwOw0KLQ0KLS8qDQotc3RhdGljIFRfWkRydkRtYV9DaGFubmVsRGVmIHNfaTJzMVR4X0RtYUNobERlZls2XSA9IHswfTsNCi1zdGF0aWMgVF9aRHJ2RG1hX0NoYW5uZWxEZWYgc19pMnMyVHhfRG1hQ2hsRGVmWzZdID0gezB9Ow0KLXN0YXRpYyBUX1pEcnZEbWFfQ2hhbm5lbERlZiBzX2kyczFSeF9EbWFDaGxEZWZbNl0gPSB7MH07DQotc3RhdGljIFRfWkRydkRtYV9DaGFubmVsRGVmIHNfaTJzMlJ4X0RtYUNobERlZls2XSA9IHswfTsNCi0qLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLS8qIGFkZCBieSBsdndlbmh1YSBmb3IgaTJzIHN5bmMgKi8NCi1TSU5UMzIgZ0kyc0RtYVJlYWRJbnRUaW1lW01BWF9JMlNfSURdID0gezB9Ow0KLVNJTlQzMiBnSTJzRG1hV3JpdGVJbnRUaW1lW01BWF9JMlNfSURdID0gezB9Ow0KLVNJTlQzMiBnSTJzVGltZXMgPSAwOw0KLVNJTlQzMiBnSTJzQ250Q2hhbmdlVHhbTUFYX0kyU19JRF0gPSB7MH07DQotU0lOVDMyIGdJMnNDbnRDaGFuZ2VSeFtNQVhfSTJTX0lEXSA9IHswfTsNCi0vL1NJTlQzMiBnSTJzVGltZURpZmYgPSAzMDAwOw0KLQ0KLVVJTlQzMiBpMnN3cml0ZV90aWQgPSAwOw0KLVVJTlQzMiBpMnN3cml0ZV9wYnVmID0gMDsNCi1VSU5UMzIgaTJzd3JpdGVfdWlsZW4gPSAwOw0KLQ0KLVVJTlQzMiBmcmVlYnVmZmVyYWRkID0gMDsNCi1VSU5UMzIgZnJlZWJ1ZmZlcnRpZCA9IDA7DQotZXh0ZXJuIFRfekRydlZvaWNlX0diVmFyIGdfdm9pY2VWYXI7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICBJbmxpbmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqDQotKiBAYnJpZWYJY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5Lg0KLSoNCi0qIEBwYXJhbQlpMnNRdWV1ZQkJcXVldWUgcG9pbnRlcg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotX19pbmxpbmUgQk9PTCBpMnNfSXNRdWV1ZUVtcHR5KFRfSTJzX1F1ZXVlICppMnNRdWV1ZSkNCi17DQotCWlmIChOVUxMID09IGkyc1F1ZXVlKSB7IC8va2xvY3dvcmsgMyBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5g0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXJldHVybiAoaTJzUXVldWUtPndyaXRlSW5kZXggPT0gaTJzUXVldWUtPnJlYWRJbmRleCk7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWNoZWNrIGlmIHRoZSBxdWV1ZSBpcyBmdWxsLg0KLSoNCi0qIEBwYXJhbQlpMnNRdWV1ZQkJcXVldWUgcG9pbnRlcg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotX19pbmxpbmUgQk9PTCBpMnNfSXNRdWV1ZUZ1bGwoVF9JMnNfUXVldWUgKmkyc1F1ZXVlKQ0KLXsNCi0JaWYgKE5VTEwgPT0gaTJzUXVldWUpIHsJLy9rbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcmV0dXJuICgoaTJzUXVldWUtPndyaXRlSW5kZXggKyAxKSAlIEkyU19RVUVVRV9TSVpFID09IGkyc1F1ZXVlLT5yZWFkSW5kZXgpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgIExvY2FsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioNCi0qIEBicmllZgl1c2UgdG8gbWFuYWdlIHR4IGJ1ZmZlciBzdGF0dXMgLHVwZGF0ZSBvbmUgYnVmZmVyIHN0YXR1cy4NCi0qDQotKiBAcGFyYW0JdElkIAkJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEBwYXJhbQlidWZBZGRyIAlidWZmZXIgcG9pbnRlcg0KLSogQHBhcmFtCWJ1ZmZlclN0YXR1cyAJYnVmZmVyIHN0YXR1cw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfVXBkYXRlVHhCdWZmZXJTdGF0dXMoVF9aRHJ2STJTX0lkIHRJZCwgVUlOVDE2ICpidWZBZGRyLCBUX0kyc19CdWZmZXJTdGF0dXMgYnVmZmVyU3RhdHVzKQ0KLXsNCi0JVF9JMnNfVHhTdHJlYW0gKmkyc1N0cmVhbSA9ICZzX2kyc1R4U3RyZWFtW3RJZF07DQotCVVJTlQ4IGJ1ZkluZGV4ID0gMDsNCi0NCi0JaWYgKE5VTEwgPT0gYnVmQWRkcikgeyAvL2tsb2N3b3JrIDMgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQlpZiAoaTJzU3RyZWFtLT50eEJ1ZmZlckFycmF5ID09IE5VTEwpIHsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JZm9yICg7IGJ1ZkluZGV4IDwgSTJTX09VVF9CVUZfTlVNOyBidWZJbmRleCsrKSB7DQotCQlpZiAoaTJzU3RyZWFtLT50eEJ1ZmZlckFycmF5W2J1ZkluZGV4XS5idWYgPT0gKFVJTlQ4ICopYnVmQWRkcikgew0KLQkJCWkyc1N0cmVhbS0+dHhCdWZmZXJBcnJheVtidWZJbmRleF0uaTJzQnVmU3RhdHVzID0gYnVmZmVyU3RhdHVzOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQl9DQotDQotCWlmIChidWZJbmRleCA9PSBJMlNfT1VUX0JVRl9OVU0pIHsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZgl1c2UgdG8gbWFuYWdlIHJ4IGJ1ZmZlciBzdGF0dXMgLHVwZGF0ZSBvbmUgYnVmZmVyIHN0YXR1cy4NCi0qDQotKiBAcGFyYW0JdElkIAkJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEBwYXJhbQlidWZBZGRyIAlidWZmZXIgcG9pbnRlcg0KLSogQHBhcmFtCWJ1ZmZlclN0YXR1cwlidWZmZXIgc3RhdHVzDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19VcGRhdGVSeEJ1ZmZlclN0YXR1cyhUX1pEcnZJMlNfSWQgdElkLCBVSU5UMTYgKmJ1ZkFkZHIsIFRfSTJzX0J1ZmZlclN0YXR1cyBidWZmZXJTdGF0dXMpDQotew0KLQlUX0kyc19SeFN0cmVhbSAqaTJzU3RyZWFtID0gJnNfaTJzUnhTdHJlYW1bdElkXTsNCi0JVUlOVDggYnVmSW5kZXggPSAwOw0KLQ0KLQlpZiAoTlVMTCA9PSBidWZBZGRyKSB7IC8va2xvY3dvcmsgMyBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5g0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotCWlmIChpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXkgPT0gTlVMTCkgew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlmb3IgKDsgYnVmSW5kZXggPCBJMlNfT1VUX0JVRl9OVU07IGJ1ZkluZGV4KyspIHsNCi0JCWlmIChpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLmJ1ZiA9PSAoVUlOVDggKilidWZBZGRyKSB7DQotCQkJaTJzU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2J1ZkluZGV4XS5pMnNCdWZTdGF0dXMgPSBidWZmZXJTdGF0dXM7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JaWYgKGJ1ZkluZGV4ID09IEkyU19PVVRfQlVGX05VTSkgew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCXVzZSB0byBtYW5hZ2UgVHggYnVmZmVyIHN0YXR1cyAsdXBkYXRlIG9uZSBidWZmZXIgc3RhdHVzLiBpZiBvbmUgYnVmIHN0YXR1cyBpcyBvbmUsY2hhbmdlIHRvIG5ldyBzdGF0dXMuDQotKg0KLSogQHBhcmFtCXRJZCAJCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0Jb2xkU3RhdHVzIAlidWZmZXIgc3RhdHVzDQotKiBAcGFyYW0JbmV3U3RhdHVzCWJ1ZmZlciBzdGF0dXMNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBTSU5UMzIgaTJzX0NoYW5nZVR4QnVmZmVyU3RhdHVzKFRfWkRydkkyU19JZCB0SWQsIFRfSTJzX0J1ZmZlclN0YXR1cyBvbGRTdGF0dXMsIFRfSTJzX0J1ZmZlclN0YXR1cyBuZXdTdGF0dXMpDQotew0KLQlUX0kyc19UeFN0cmVhbSAqaTJzU3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0JVUlOVDggYnVmSW5kZXggPSAwOw0KLQ0KLQlmb3IgKDsgYnVmSW5kZXggPCBJMlNfT1VUX0JVRl9OVU07IGJ1ZkluZGV4KyspIHsNCi0JCWlmIChpMnNTdHJlYW0tPnR4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLmkyc0J1ZlN0YXR1cyA9PSBvbGRTdGF0dXMpIHsNCi0JCQlpMnNTdHJlYW0tPnR4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLmkyc0J1ZlN0YXR1cyA9IG5ld1N0YXR1czsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQlpZiAoYnVmSW5kZXggPT0gSTJTX09VVF9CVUZfTlVNKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gaW5pdCB0aGUgYnVmZmVyIHF1ZXVlLg0KLSoNCi0qIEBwYXJhbQlpMnNRdWV1ZSAJCXF1ZXVlIHBvaW50ZXINCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBTSU5UMzIgaTJzX1F1ZXVlSW5pdChUX0kyc19RdWV1ZSAqaTJzUXVldWUpDQotew0KLQlTSU5UMzIgcmV0ID0gMDsNCi0NCi0JaWYgKE5VTEwgPT0gaTJzUXVldWUpIHsgLy9rbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaTJzUXVldWUtPmRhdGEgPSAoVF9JMnNfUXVldWVOb2RlICopek9zc19NYWxsb2Moc2l6ZW9mKFRfSTJzX1F1ZXVlTm9kZSkgKiBJMlNfUVVFVUVfU0laRSk7DQotCWlmIChOVUxMID09IGkyc1F1ZXVlLT5kYXRhKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9NRU1fQUxMT0M7DQotCX0NCi0NCi0JZm9yIChyZXQgPSAwOyByZXQgPCBJMlNfUVVFVUVfU0laRTsgcmV0KyspIHsNCi0JCWkyc1F1ZXVlLT5kYXRhW3JldF0ucEJ1ZiA9IE5VTEw7DQotCQlpMnNRdWV1ZS0+ZGF0YVtyZXRdLmxlbiA9IDA7DQotCX0NCi0NCi0JaTJzUXVldWUtPnJlYWRJbmRleCA9IDA7DQotCWkyc1F1ZXVlLT53cml0ZUluZGV4ID0gMDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpbnNlcnQgdGhlIHF1ZXVlIHRvIHF1ZXVlIHRhaWwuDQotKg0KLSogQHBhcmFtCSpwQnVmCQlidWZmZXIgcG9pbnRlcg0KLSogQHBhcmFtCXVpTGVuCQlidWZmZXIgbGVuZ3RoDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19RdWV1ZVB1dChUX0kyc19RdWV1ZSAqaTJzUXVldWUsIFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKQ0KLXsNCi0JQk9PTCBpc0Z1bGwgPSBGQUxTRTsNCi0NCi0JaWYgKE5VTEwgPT0gaTJzUXVldWUgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4pIHsgLy9rbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaXNGdWxsID0gaTJzX0lzUXVldWVGdWxsKGkyc1F1ZXVlKTsNCi0JaWYgKFRSVUUgPT0gaXNGdWxsKSB7IC8va2xvY3dvcmsgMyBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5g0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCWlmIChpMnNRdWV1ZS0+ZGF0YSA9PSBOVUxMKSB7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCWkyc1F1ZXVlLT5kYXRhW2kyc1F1ZXVlLT53cml0ZUluZGV4XS5wQnVmID0gcEJ1ZjsNCi0JaTJzUXVldWUtPmRhdGFbaTJzUXVldWUtPndyaXRlSW5kZXhdLmxlbiA9IHVpTGVuOw0KLQlpMnNRdWV1ZS0+d3JpdGVJbmRleCA9IChpMnNRdWV1ZS0+d3JpdGVJbmRleCArIDEpICUgSTJTX1FVRVVFX1NJWkU7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJRmV0Y2ggdGhlIHF1ZXVlIG5vZGUgZnJvbSBxdWV1ZSBoZWFkIC4NCi0qDQotKiBAcGFyYW0JaTJzUXVldWUJCXF1ZXVlIHBvaW50ZXINCi0qIEBwYXJhbQkqKnF1ZXVlTm9kZQkJcXVldWUgbm9kZSAgcG9pbnRlcg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfUXVldWVHZXQoVF9JMnNfUXVldWUgKmkyc1F1ZXVlLCBUX0kyc19RdWV1ZU5vZGUgKipxdWV1ZU5vZGUpDQotew0KLQlCT09MIGlzRW1wdHkgPSBGQUxTRTsNCi0NCi0JaWYgKE5VTEwgPT0gaTJzUXVldWUgfHwgTlVMTCA9PSBxdWV1ZU5vZGUpIHsgLy9rbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaXNFbXB0eSA9IGkyc19Jc1F1ZXVlRW1wdHkoaTJzUXVldWUpOw0KLQ0KLQlpZiAoVFJVRSA9PSBpc0VtcHR5KSB7DQotCQkqcXVldWVOb2RlID0gTlVMTDsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0gZWxzZSB7DQotCQkqcXVldWVOb2RlID0gJmkyc1F1ZXVlLT5kYXRhW2kyc1F1ZXVlLT5yZWFkSW5kZXhdOw0KLQkJaTJzUXVldWUtPnJlYWRJbmRleCA9IChpMnNRdWV1ZS0+cmVhZEluZGV4ICsgMSkgJSBJMlNfUVVFVUVfU0laRTsNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWRlc3Ryb3kgdGhlIHF1ZXVlLg0KLSoNCi0qIEBwYXJhbQlpMnNRdWV1ZQkJcXVldWUgcG9pbnRlcg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfUXVldWVEZXN0b3J5KFRfSTJzX1F1ZXVlICppMnNRdWV1ZSkNCi17DQotCWlmIChOVUxMID09IGkyc1F1ZXVlKSB7IC8va2xvY3dvcmsgMyBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5g0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmIChpMnNRdWV1ZS0+ZGF0YSAhPSBOVUxMKSB7DQotCQl6T3NzX0ZyZWUoaTJzUXVldWUtPmRhdGEpOw0KLQl9DQotDQotCWkyc1F1ZXVlLT5kYXRhID0gTlVMTDsNCi0JaTJzUXVldWUtPnJlYWRJbmRleCA9IDA7DQotCWkyc1F1ZXVlLT53cml0ZUluZGV4ID0gMDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglHZXQgcGNtIGRpdmlzaW9uIGNvZWZmLg0KLSoNCi0qIEBwYXJhbQlwdENmZwkJY29uZmlnIHBhcmFtZXRlcg0KLSogQHBhcmFtCXBEaXYJCXBjbSBkaXZpc2lvbiBjb2VmZg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfR2V0UGNtRGl2KFRfWkRydkkyU19DZmcgKnB0Q2ZnLCBUX0kyc19DbGtEaXYgKnBEaXYpDQotew0KLQlUX0kyc19DbGtDb25zdCBpMnNDbG9ja1NldCA9IE1BWF9DTEs7DQotDQotCWlmIChOVUxMID09IHBEaXYgfHwgTlVMTCA9PSBwdENmZyB8fCBwdENmZy0+cmVmY2xrID49IFJFRl9DTEtfTUFYIHx8IHB0Q2ZnLT50UGNtTW9kZSA+PSBNQVhfUENNX01PREUpIHsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0Jc3dpdGNoIChwdENmZy0+c2FtcGxlX3JhdGUpIHsNCi0JY2FzZSA4MDAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfODAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDExMDI1Og0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfMTEwMjU7DQotCQlicmVhazsNCi0JY2FzZSAxMjAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzEyMDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgMTYwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS18xNjAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDIyMDUwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfMjIwNTA7DQotCQlicmVhazsNCi0JY2FzZSAyNDAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzI0MDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgMzIwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS18zMjAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDQ0MTAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfNDQxMDA7DQotCQlicmVhazsNCi0JY2FzZSA0ODAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzQ4MDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgNjQwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS182NDAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDk2MDAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfOTYwMDA7DQotCQlicmVhazsNCi0JZGVmYXVsdDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzQ0MTAwOw0KLQkJYnJlYWs7DQotCX0NCi0NCi0JaWYgKHB0Q2ZnLT50UGNtU2xvdE51bSA9PSBQQ01fMVRJTUVfU0xPVCkgew0KLQkJKnBEaXYgPSBnUGNtMVNsb3RDbGtEaXZbcHRDZmctPnJlZmNsa11baTJzQ2xvY2tTZXRdW3B0Q2ZnLT50UGNtTW9kZV07DQotCX0gZWxzZSBpZiAocHRDZmctPnRQY21TbG90TnVtID09IFBDTV8yVElNRV9TTE9UKSB7DQotCQkqcERpdiA9IGdQY20yU2xvdENsa0RpdltwdENmZy0+cmVmY2xrXVtpMnNDbG9ja1NldF1bcHRDZmctPnRQY21Nb2RlXTsNCi0JfSBlbHNlIGlmIChwdENmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzRUSU1FX1NMT1QpIHsNCi0JCSpwRGl2ID0gZ1BjbTRTbG90Q2xrRGl2W3B0Q2ZnLT5yZWZjbGtdW2kyc0Nsb2NrU2V0XVtwdENmZy0+dFBjbU1vZGVdOw0KLQl9IGVsc2UgaWYgKHB0Q2ZnLT50UGNtU2xvdE51bSA9PSBQQ01fOFRJTUVfU0xPVCkgew0KLQkJKnBEaXYgPSBnUGNtOFNsb3RDbGtEaXZbcHRDZmctPnJlZmNsa11baTJzQ2xvY2tTZXRdW3B0Q2ZnLT50UGNtTW9kZV07Ow0KLQl9IGVsc2UgaWYgKHB0Q2ZnLT50UGNtU2xvdE51bSA9PSBQQ01fMTZUSU1FX1NMT1QpIHsNCi0JCSpwRGl2ID0gZ1BjbTE2U2xvdENsa0RpdltwdENmZy0+cmVmY2xrXVtpMnNDbG9ja1NldF1bcHRDZmctPnRQY21Nb2RlXTsNCi0JfSBlbHNlIHsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglHZXQgaTJzIGRpdmlzaW9uIGNvZWZmLg0KLSoNCi0qIEBwYXJhbQlwdENmZwkJY29uZmlnIHBhcmFtZXRlcg0KLSogQHBhcmFtCXBEaXYJCXBjbSBkaXZpc2lvbiBjb2VmZg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfR2V0STJzRGl2KFRfWkRydkkyU19DZmcgKnB0Q2ZnLCBUX0kyc19DbGtEaXYgKnBEaXYpDQotew0KLQlUX0kyc19DbGtDb25zdCBpMnNDbG9ja1NldCA9IE1BWF9DTEs7DQotCVRfSTJzX3RUc1dpZHRoQ29uc3QgaTJzVHNXaWR0aFNldCA9IE1BWF9UU19XSURUSDsNCi0NCi0JaWYgKE5VTEwgPT0gcERpdiB8fCBOVUxMID09IHB0Q2ZnIHx8IHB0Q2ZnLT5yZWZjbGsgPj0gUkVGX0NMS19NQVgpIHsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0Jc3dpdGNoIChwdENmZy0+c2FtcGxlX3JhdGUpIHsNCi0JY2FzZSA4MDAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfODAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDExMDI1Og0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfMTEwMjU7DQotCQlicmVhazsNCi0JY2FzZSAxMjAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzEyMDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgMTYwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS18xNjAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDIyMDUwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfMjIwNTA7DQotCQlicmVhazsNCi0JY2FzZSAyNDAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzI0MDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgMzIwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS18zMjAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDQ0MTAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfNDQxMDA7DQotCQlicmVhazsNCi0JY2FzZSA0ODAwMDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzQ4MDAwOw0KLQkJYnJlYWs7DQotCWNhc2UgNjQwMDA6DQotCQlpMnNDbG9ja1NldCA9IENMS182NDAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDk2MDAwOg0KLQkJaTJzQ2xvY2tTZXQgPSBDTEtfOTYwMDA7DQotCQlicmVhazsNCi0JZGVmYXVsdDoNCi0JCWkyc0Nsb2NrU2V0ID0gQ0xLXzQ0MTAwOw0KLQkJYnJlYWs7DQotCX0NCi0NCi0Jc3dpdGNoIChwdENmZy0+dFRzV2lkdGgpIHsNCi0JY2FzZSBJMlNfVFNfMTZDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18xNkNZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzE3Q1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMTdDWUNMRTsNCi0JCWJyZWFrOw0KLQljYXNlIEkyU19UU18xOENZQ0xFOg0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzE4Q1lDTEU7DQotCQlicmVhazsNCi0JY2FzZSBJMlNfVFNfMTlDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18xOUNZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzIwQ1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMjBDWUNMRTsNCi0JCWJyZWFrOw0KLQljYXNlIEkyU19UU18yMUNZQ0xFOg0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzIxQ1lDTEU7DQotCQlicmVhazsNCi0JY2FzZSBJMlNfVFNfMjJDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18yMkNZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzIzQ1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMjNDWUNMRTsNCi0JCWJyZWFrOw0KLQljYXNlIEkyU19UU18yNENZQ0xFOg0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzI0Q1lDTEU7DQotCQlicmVhazsNCi0JY2FzZSBJMlNfVFNfMjVDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18yNUNZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzI2Q1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMjZDWUNMRTsNCi0JCWJyZWFrOw0KLQljYXNlIEkyU19UU18yN0NZQ0xFOg0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzI3Q1lDTEU7DQotCQlicmVhazsNCi0JY2FzZSBJMlNfVFNfMjhDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18yOENZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzI5Q1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMjlDWUNMRTsNCi0JCWJyZWFrOw0KLQljYXNlIEkyU19UU18zMENZQ0xFOg0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzMwQ1lDTEU7DQotCQlicmVhazsNCi0JY2FzZSBJMlNfVFNfMzFDWUNMRToNCi0JCWkyc1RzV2lkdGhTZXQgPSBUU18zMUNZQ0xFOw0KLQkJYnJlYWs7DQotCWNhc2UgSTJTX1RTXzMyQ1lDTEU6DQotCQlpMnNUc1dpZHRoU2V0ID0gVFNfMzJDWUNMRTsNCi0JCWJyZWFrOw0KLQlkZWZhdWx0Og0KLQkJaTJzVHNXaWR0aFNldCA9IFRTXzE2Q1lDTEU7DQotCQlicmVhazsNCi0JfQ0KLQ0KLQkqcERpdiA9IGdJMnNDbGtEaXZbcHRDZmctPnJlZmNsa11baTJzQ2xvY2tTZXRdW2kyc1RzV2lkdGhTZXRdOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCXRoaXMgZnVuY3Rpb24gaXMgdXNlIHRvIGNsb3NlIGkycyBkaXZpZGUgZnJlcXVlbmN5Lg0KLSoNCi0qIEBwYXJhbQl0SWQJCWkycyBzZWxlY3QgdGhlIGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfQ2xvc2VDbGsoVF9aRHJ2STJTX0lkIGkyc0lkKQ0KLXsNCi0JaWYgKGkyc0lkID09IEkyU18xKQ0KLQkJaTJzX1NldENsa0RpdihJMlMwX1BXUkROLCAxKTsNCi0JZWxzZSBpZiAoaTJzSWQgPT0gSTJTXzIpDQotCQlpMnNfU2V0Q2xrRGl2KEkyUzFfUFdSRE4sIDEpOw0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCXRoaXMgZnVuY3Rpb24gaXMgdXNlIHRvIGluaXQgaTJzIGNsb2NrLg0KLSoNCi0qIEBwYXJhbQlWT0lEDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi0NCi1zdGF0aWMgVk9JRCBpMnNfQ2xrSW5pdChWT0lEKQ0KLXsNCi0NCi0JdW5zaWduZWQgaW50IHZhbDsNCi0JaWYgKHNfYkkyc0Nsa0luaXQpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyAhPSAxKSB7DQotCQl2YWwgPSByZWFkbChJMlMwX0NSTV9DTEtTRUwpOw0KLQkJdmFsICY9IH4oMyA8PCA4KTsNCi0JCXdyaXRlbCh2YWwsIEkyUzBfQ1JNX0NMS1NFTCk7DQotDQotCQl2YWwgPSByZWFkbChJMlMwX0NSTV9DTEtTRUwpOw0KLQkJdmFsIHw9ICgzIDw8IDgpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMF9DUk1fQ0xLU0VMKTsNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCk7DQotCQl2YWwgJj0gfigzIDw8IDgpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMV9DUk1fQ0xLU0VMKTsNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCk7DQotCQl2YWwgfD0gKDMgPDwgOCk7DQotCQl3cml0ZWwodmFsLCBJMlMxX0NSTV9DTEtTRUwpOw0KLQkJek9zc19TbGVlcCgxKTsNCi0JfQ0KLQ0KLQl2YWwgPSByZWFkbChJMlMwX0NSTV9DTEtTRUwpOw0KLQl2YWwgfD0gKCgzIDw8IDApIHwgKDMgPDwgMTApKTsNCi0Jd3JpdGVsKHZhbCwgSTJTMF9DUk1fQ0xLU0VMKTsNCi0NCi0JdmFsID0gcmVhZGwoSTJTMV9DUk1fQ0xLU0VMKTsNCi0JdmFsIHw9ICgoMyA8PCAwKSB8ICgzIDw8IDEwKSk7DQotCXdyaXRlbCh2YWwsIEkyUzFfQ1JNX0NMS1NFTCk7DQotDQotCXNfYkkyc0Nsa0luaXQgPSBUUlVFOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX0Nsa0luaXQgZW5kIHNfYkkyc0Nsa0luaXQ9JWRcclxuIiwgc19iSTJzQ2xrSW5pdCk7DQotDQotfQ0KLSNpZiAxDQotLyoqDQotKiBAYnJpZWYJdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gZGlzYWJsZSBpMnMgY2xvY2suDQotKg0KLSogQHBhcmFtCXRJZAkgICBpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFZPSUQgaTJzX0Nsa0RlaW5pdChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19DbGtEZWluaXQgJWQiLCB0SWQpOw0KLQl1bnNpZ25lZCBpbnQgdmFsOw0KLQlpZiAodElkID09IEkyU18xKSB7DQotI2lmbmRlZiBDT05GSUdfU05EX1NPQ19FUzgzMTINCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzBfQ1JNX0NMS1NFTCk7DQotCQl2YWwgJj0gfigoMyA8PCAwKSB8ICgzIDw8IDEwKSk7DQotCQl3cml0ZWwodmFsLCBJMlMwX0NSTV9DTEtTRUwpOw0KLQ0KLQkJdmFsID0gcmVhZGwoSTJTMF9DUk1fQ0xLU0VMKTsNCi0JCXZhbCAmPSB+KDMgPDwgOCk7DQotCQl3cml0ZWwodmFsLCBJMlMwX0NSTV9DTEtTRUwpOw0KLQ0KLQkJdmFsID0gcmVhZGwoSTJTMF9DUk1fQ0xLU0VMKTsNCi0JCXZhbCB8PSAoMyA8PCA4KTsNCi0JCXdyaXRlbCh2YWwsIEkyUzBfQ1JNX0NMS1NFTCk7DQotI2VuZGlmDQotDQotCX0gZWxzZSB7DQotCQl2YWwgPSByZWFkbChJMlMxX0NSTV9DTEtTRUwpOw0KLQkJdmFsICY9IH4oKDMgPDwgMCkgfCAoMyA8PCAxMCkpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMV9DUk1fQ0xLU0VMKTsNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCk7DQotCQl2YWwgJj0gfigzIDw8IDgpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMV9DUk1fQ0xLU0VMKTsNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCk7DQotCQl2YWwgfD0gKDMgPDwgOCk7DQotCQl3cml0ZWwodmFsLCBJMlMxX0NSTV9DTEtTRUwpOw0KLQl9DQotDQotCXNfYkkyc0Nsa0luaXQgPSBGQUxTRTsNCi0NCi19DQotDQotLyoqDQotKiBAYnJpZWYJdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gZGlzYWJsZSBpMnMgY2xvY2suDQotKg0KLSogQHBhcmFtCXRJZAkgICBpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHBhcmFtCXBEaXYgICBwb2ludGVyIHRvIFRfSTJzX0Nsa0Rpdg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfU2V0Q2xrKFRfWkRydkkyU19JZCB0SWQsIFRfSTJzX0Nsa0RpdiAqcERpdikNCi17DQotDQotCVVJTlQzMiAgQW1yUmVnQml0X0Nsa1NlbDsNCi0JdW5zaWduZWQgaW50IHZhbDsNCi0NCi0jaWZkZWYgX1VTRV9BVURJT19PTl83NTIwVjINCi0JVUlOVDMyICBBbXJSZWdCaXRfQ2xrRGl2Ow0KLSNlbmRpZg0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwRGl2KSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmICh0SWQgPT0gSTJTXzEpIHsNCi0jaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQ0KLQkJdmFsID0gcmVhZGwoSTJTMF9DUk1fQ0xLU0VMKTsNCi0JCXZhbCAmPSAweEZGRkZGRkVGOw0KLQkJaWYgKHBEaXYtPnJlZmNsayA9PSBSRUZfQ0xLMjZNKSB7DQotCQkJdmFsIHw9IDB4MDAwMDAwMDA7DQotCQl9IGVsc2UgeyAvKnNlbCAxMDRNIG9yIDI2TSBjbGsgZm9yIGkycyByZWYgY2xrKi8NCi0JCQl2YWwgfD0gMHgwMDAwMDAxMDsNCi0JCX0NCi0JCXdyaXRlbCh2YWwsIEkyUzBfQ1JNX0NMS1NFTCk7DQotDQotCQlBbXJSZWdCaXRfQ2xrRGl2ID0gSTJTMF9DTEtESVY7DQotCQlBbXJSZWdCaXRfQ2xrRGl2ICY9IDB4MEZGRkZGRkY7DQotCQlBbXJSZWdCaXRfQ2xrRGl2IHw9IChwRGl2LT5jbGtSYXRpbykgPDwgMjg7DQotCQlJMlMwX0NMS0RJViA9IEFtclJlZ0JpdF9DbGtEaXY7DQotDQotCQlpMnNfU2V0Q2xrRGl2KEkyUzBfSU5URUdFUl9OVU0sIHBEaXYtPklOVEVHRVJOVU0pOw0KLQkJaTJzX1NldENsa0RpdihJMlMwX0ZSQV9ESVYsIHBEaXYtPkZSQUNBREROVU0pOw0KLQkJaTJzX1NldENsa0RpdihJMlMwX0ZSQV9CQVNFLCBwRGl2LT5GUkFDQkFTRSk7DQotCQlpMnNfU2V0Q2xrRGl2KEkyUzBfQ0xLX1NFTF9ESVYsIHBEaXYtPkNMS1NFTERJVik7DQotCQlpMnNfU2V0Q2xrRGl2KEkyUzBfUFdSRE4sIHBEaXYtPlBXUkROKTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJpMnNfU2V0Q2xrIHRJZD0lZCxwRGl2PSV4ISBcclxuIiwgdElkLCBwRGl2KTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJpMnNfU2V0Q2xrIHRJZD0lZCxJMlMwX0NSTSA9JXghIFxyXG4iLCB0SWQsIEkyUzBfQ1JNX0NMS1NFTCk7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX1NldENsayB0SWQ9JWQsSTJTMF9ESVYgPSV4ISBcclxuIiwgdElkLCBJMlMwX0NMS0RJVik7DQotI2VsaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMw0KLQ0KLQkJdmFsID0gcmVhZGwoSTJTMF9DUk1fQ0xLU0VMKTsNCi0JCWlmICgocERpdi0+cmVmY2xrID09IFJFRl9DTEsxMjJNODgpICYmIChwRGl2LT5pMnNDbG9ja1NldCA9PSBDTEtfODAwMCkpIHsNCi0JCQl2YWwgfD0gKDMgPDwgMTYpOw0KLQkJfSBlbHNlIHsNCi0JCQl2YWwgfD0gKDEgPDwgMTYpOw0KLQkJfQ0KLQkJaWYgKHBEaXYtPnJlZmNsayA9PSBSRUZfQ0xLMjZNKSB7DQotCQkJdmFsIHw9ICgwIDw8IDQpOw0KLQkJfSBlbHNlIGlmIChwRGl2LT5yZWZjbGsgPT0gUkVGX0NMSzEyMk04OCkgew0KLQkJCXZhbCB8PSAoMSA8PCA0KTsNCi0JCX0gZWxzZSBpZiAocERpdi0+cmVmY2xrID09IFJFRl9DTEsxMDRNKSB7DQotCQkJdmFsIHw9ICgyIDw8IDQpOw0KLQkJfQ0KLQkJd3JpdGVsKHZhbCwgSTJTMF9DUk1fQ0xLU0VMKTsNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzBfQ0xLRElWXzIpOw0KLQkJdmFsICY9ICh+KDB4MSA8PCAxNikpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMF9DTEtESVZfMik7DQotDQotCQl2YWwgPSBwRGl2LT5GUkFDRElWMTsNCi0JCXdyaXRlbCh2YWwsIEkyUzBfQ0xLRElWXzEpOw0KLQkJdmFsID0gcERpdi0+RlJBQ0RJVjI7DQotCQl2YWwgfD0gKDB4MSA8PCAxNik7DQotCQl3cml0ZWwodmFsLCBJMlMwX0NMS0RJVl8yKTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJbWEtdaTJzX1NldENsayBpMnMwIERJVigweCV4LCAweCV4LCAweCV4KUxTUCgweCV4LCAweCV4LCAweCV4KSFcclxuIiwgXA0KLQkJICAgICAgICAgICAgICAgICAgcERpdi0+cmVmY2xrLCBwRGl2LT5pMnNDbG9ja1NldCwgcERpdi0+aTJzVHNXaWR0aFNldCwgcmVhZGwoSTJTMF9DUk1fQ0xLU0VMKSwgcmVhZGwoSTJTMF9DTEtESVZfMSksIHJlYWRsKEkyUzBfQ0xLRElWXzIpKTsNCi0jZW5kaWYNCi0JfSBlbHNlIHsgLy9rbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uR0VOICAodElkID09IEkyU18yKQ0KLSNpZiBkZWZpbmVkIF9VU0VfQVVESU9fT05fNzUyMFYyDQotDQotCQl2YWwgPSByZWFkbChJMlMxX0NSTV9DTEtTRUwpOw0KLQkJdmFsICY9IDB4RkZGRkZGRUY7DQotCQlpZiAocERpdi0+cmVmY2xrID09IFJFRl9DTEsyNk0pIHsNCi0JCQl2YWwgfD0gMHgwMDAwMDAwMDsNCi0JCX0gZWxzZSB7IC8qc2VsIDEwNE0gb3IgMjZNIGNsayBmb3IgaTJzIHJlZiBjbGsqLw0KLQkJCXZhbCB8PSAweDAwMDAwMDEwOw0KLQkJfQ0KLQkJd3JpdGVsKHZhbCwgSTJTMV9DUk1fQ0xLU0VMKTsNCi0NCi0JCUFtclJlZ0JpdF9DbGtEaXYgPSBJMlMxX0NMS0RJVjsNCi0JCUFtclJlZ0JpdF9DbGtEaXYgJj0gMHgwRkZGRkZGRjsNCi0JCUFtclJlZ0JpdF9DbGtEaXYgfD0gKHBEaXYtPmNsa1JhdGlvKSA8PCAyODsNCi0JCUkyUzFfQ0xLRElWID0gQW1yUmVnQml0X0Nsa0RpdjsNCi0NCi0JCWkyc19TZXRDbGtEaXYoSTJTMV9JTlRFR0VSX05VTSwgcERpdi0+SU5URUdFUk5VTSk7DQotCQlpMnNfU2V0Q2xrRGl2KEkyUzFfRlJBX0RJViwgcERpdi0+RlJBQ0FERE5VTSk7DQotCQlpMnNfU2V0Q2xrRGl2KEkyUzFfRlJBX0JBU0UsIHBEaXYtPkZSQUNCQVNFKTsNCi0JCWkyc19TZXRDbGtEaXYoSTJTMV9DTEtfU0VMX0RJViwgcERpdi0+Q0xLU0VMRElWKTsNCi0JCWkyc19TZXRDbGtEaXYoSTJTMV9QV1JETiwgcERpdi0+UFdSRE4pOw0KLSNlbGlmIGRlZmluZWQgX1VTRV9BVURJT19PTl83NTIwVjMNCi0NCi0JCXZhbCA9IHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCk7DQotCQlpZiAoKHBEaXYtPnJlZmNsayA9PSBSRUZfQ0xLMTIyTTg4KSAmJiAocERpdi0+aTJzQ2xvY2tTZXQgPT0gQ0xLXzgwMDApKSB7DQotCQkJdmFsIHw9ICgzIDw8IDE2KTsNCi0JCX0gZWxzZSB7DQotCQkJdmFsIHw9ICgxIDw8IDE2KTsNCi0JCX0NCi0JCWlmIChwRGl2LT5yZWZjbGsgPT0gUkVGX0NMSzI2TSkgew0KLQkJCXZhbCB8PSAoMCA8PCA0KTsNCi0JCX0gZWxzZSBpZiAocERpdi0+cmVmY2xrID09IFJFRl9DTEsxMjJNODgpIHsNCi0JCQl2YWwgfD0gKDEgPDwgNCk7DQotCQl9IGVsc2UgaWYgKHBEaXYtPnJlZmNsayA9PSBSRUZfQ0xLMTA0TSkgew0KLQkJCXZhbCB8PSAoMiA8PCA0KTsNCi0JCX0NCi0JCXdyaXRlbCh2YWwsIEkyUzFfQ1JNX0NMS1NFTCk7DQotDQotCQl2YWwgPSByZWFkbChJMlMxX0NMS0RJVl8yKTsNCi0JCXZhbCAmPSAofigweDEgPDwgMTYpKTsNCi0JCXdyaXRlbCh2YWwsIEkyUzFfQ0xLRElWXzIpOw0KLQ0KLQkJdmFsID0gcERpdi0+RlJBQ0RJVjE7DQotCQl3cml0ZWwodmFsLCBJMlMxX0NMS0RJVl8xKTsNCi0JCXZhbCA9IHBEaXYtPkZSQUNESVYyOw0KLQkJdmFsIHw9ICgweDEgPDwgMTYpOw0KLQkJd3JpdGVsKHZhbCwgSTJTMV9DTEtESVZfMik7DQotDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiW1hLXWkyc19TZXRDbGsgaTJzMSBESVYoMHgleCwgMHgleCwgMHgleClMU1AoMHgleCwgMHgleCwgMHgleCkhXHJcbiIsIFwNCi0JCSAgICAgICAgICAgICAgICAgIHBEaXYtPnJlZmNsaywgcERpdi0+aTJzQ2xvY2tTZXQsIHBEaXYtPmkyc1RzV2lkdGhTZXQsIHJlYWRsKEkyUzFfQ1JNX0NMS1NFTCksIHJlYWRsKEkyUzFfQ0xLRElWXzEpLCByZWFkbChJMlMxX0NMS0RJVl8yKSk7DQotDQotI2VuZGlmDQotDQotCX0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0jZW5kaWYNCi0vKioNCi0qIEBicmllZgl0aGlzIGZ1bmN0aW9uIGlzIHVzZSB0byByZXNldCBhbGwgZGV2aWNlLGNvbnRhaW4gaTJzIGZpZm8gYW5kIGRtYS4NCi0qDQotKiBAcGFyYW0JdElkCSAgIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19SZXNldChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCB8fCBOVUxMID09IHNfaTJzSW5zdGFuY2VbdElkXS5wdERldikgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VOICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlwdFJlZyA9IHNfaTJzSW5zdGFuY2VbdElkXS5wdERldi0+cmVnczsNCi0NCi0JLyogZGlzYWJsZSBpMnM7IGRpc2FibGUgcngvdHg7IGFzIHNsYXZlOiBjbG9jayBmcm9tIGV4dGVybmFsICovDQotCXB0UmVnLT50aW1pbmdDdHJsID0gMHgwOw0KLQ0KLQkvKiBkaXNhYmxlIGRtYSAqLw0KLQlwdFJlZy0+Zmlmb0N0cmwgJj0gfihJMlNfVFhfRE1BX0VOIHwgSTJTX1JYX0RNQV9FTjApOw0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQkvKiByZXNldCB0eC9yeCBmaWZvICovDQotCXB0UmVnLT5maWZvQ3RybCA9IEkyU19UWF9GSUZPX1JTVCB8IEkyU19SWF9GSUZPX1JTVDsNCi0jZW5kaWYNCi0JLyogY2xlYXIgaW50ZXJydXB0ICovDQotCXB0UmVnLT5pbnRTdGF0dXMgPSAweGZmZmY7DQotDQotCS8qIGRpc2FibGUgaW50ZXJydXB0ICovDQotCXB0UmVnLT5pbnRFbiA9IDB4MDsNCi0NCi0JLyogZGlzYWJsZSBpMnM7IGRpc2FibGUgcngvdHg7ICovDQotCXB0UmVnLT5wcm9jZXNzQ3RybCA9IDB4MDsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19SZXNldCBpZD0lZCIsIHRJZCk7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotDQotLyoqDQotKiBAYnJpZWYJdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gc2V0dXAgdGhlIHR4IGJ1ZmZlci4NCi0qDQotKiBAcGFyYW0JdElkCSAgIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19TZXR1cFR4QnVmKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlTSU5UMzIgaW5kZXggPSAwOw0KLQlUX0kyc19UeFN0cmVhbSAqaTJzU3RyZW0gPSAmc19pMnNUeFN0cmVhbVt0SWRdOw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsgLy9rbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLkdFTiAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaTJzU3RyZW0tPnR4QnVmZmVyQXJyYXkgPSAoVF9JMnNfQnVmSW5mbyAqKXpPc3NfTWFsbG9jKEkyU19PVVRfQlVGX05VTSAqIHNpemVvZihUX0kyc19CdWZJbmZvKSk7DQotCWlmIChOVUxMID09IGkyc1N0cmVtLT50eEJ1ZmZlckFycmF5KSB7DQotCQlyZXR1cm4gRFJWX0VSUl9NRU1fQUxMT0M7DQotCX0NCi0NCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSTJTX09VVF9CVUZfTlVNOyBpbmRleCsrKSB7DQotCQlpMnNTdHJlbS0+dHhCdWZmZXJBcnJheVtpbmRleF0uYnVmID0gc190eEJ1ZkFycmF5W3RJZF1baW5kZXhdOw0KLQkJaTJzU3RyZW0tPnR4QnVmZmVyQXJyYXlbaW5kZXhdLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9OVUxMOw0KLQkJLy96T3NzX01lbXNldChpMnNTdHJlbS0+dHhCdWZmZXJBcnJheVtpbmRleF0uYnVmLCAwLCBJMlNfTUFYX1RYX0JVRl9TSVpFKTsNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCXRoaXMgZnVuY3Rpb24gaXMgdXNlIHRvIHNldHVwIHRoZSByeCBidWZmZXIuDQotKg0KLSogQHBhcmFtCXRJZAkgICBpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfU2V0dXBSeEJ1ZihUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JU0lOVDMyIGluZGV4ID0gMDsNCi0JVF9JMnNfUnhTdHJlYW0gKmkyc1N0cmVtID0gJnNfaTJzUnhTdHJlYW1bdElkXTsNCi0NCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApIDsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaTJzU3RyZW0tPnJ4QnVmZmVyQXJyYXkgPSAoVF9JMnNfQnVmSW5mbyAqKXpPc3NfTWFsbG9jKEkyU19PVVRfQlVGX05VTSAqIHNpemVvZihUX0kyc19CdWZJbmZvKSk7DQotCWlmIChOVUxMID09IGkyc1N0cmVtLT5yeEJ1ZmZlckFycmF5KSB7DQotCQlyZXR1cm4gRFJWX0VSUl9NRU1fQUxMT0M7DQotCX0NCi0NCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSTJTX09VVF9CVUZfTlVNOyBpbmRleCsrKSB7DQotCQlpMnNTdHJlbS0+cnhCdWZmZXJBcnJheVtpbmRleF0uYnVmID0gc19yeEJ1ZkFycmF5W3RJZF1baW5kZXhdOw0KLQkJaTJzU3RyZW0tPnJ4QnVmZmVyQXJyYXlbaW5kZXhdLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9OVUxMOw0KLQkJLy96T3NzX01lbXNldChpMnNTdHJlbS0+cnhCdWZmZXJBcnJheVtpbmRleF0uYnVmLCAwLCBJMlNfTUFYX1JYX0JVRl9TSVpFKTsNCi0JfQ0KLQ0KLQlpMnNTdHJlbS0+Y3VycmVudFJ4QnVmID0gTlVMTDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZgljb25maWcgaTJzLg0KLSoNCi0qIEBwYXJhbQl0SWQJICAgCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0JcHRDZmcJICAgcG9pbnRlciB0byBpMnMgY29uZmlnIHBhcmFtDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19Db25maWd1cmUoVF9aRHJ2STJTX0lkIHRJZCwgVF9aRHJ2STJTX0NmZyAqcHRDZmcpDQotew0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCVRfSTJzX1JlZyAqcHRSZWcgPSBOVUxMOw0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCB8fCBOVUxMID09IHB0Q2ZnKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0NCi0JcmV0ID0gaTJzX1NldFRpbWluZyhwdFJlZywgcHRDZmcpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX0NvbmZpZ3VyZSAgaTJzX1NldFRpbWluZyByZXQ9MHgleCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCWlmIChwdENmZy0+Yk1hc3Rlcikgew0KLQkJcmV0ID0gaTJzX1NldFBkaXYodElkLCBwdENmZyk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKSB7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19Db25maWd1cmUgIGkyc19TZXRQZGl2ZXJyIHJldD0weCV4IiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJcHRSZWctPnRpbWluZ0N0cmwgfD0gSTJTX01BU1RFUl9FTjsgICAvKiBhcyBtYXN0ZXIgKi8NCi0JfSBlbHNlIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH5JMlNfTUFTVEVSX0VOOyAgLyogYXMgc2xhdmUgKi8NCi0JfQ0KLQ0KLQkvKnRyYW5zbWl0IGRhdGEgYXQgbmVnYXRpdmUgZWRnZSBvciBhdCBwb3NpdGl2ZSBlZGdlKi8NCi0JaWYgKHB0Q2ZnLT50VGFuc21pdF9lZGdlID09IFRSQU5TX1BPU0lUSVZFX05FR0FUSVZFKSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCB8PSBJMlNfQ0xLX0VER0VfU0VMOyAgIC8qdHJhbnNtaXQgZGF0YSBhdCBuZWdhdGl2ZSBlZGdlLHNvIHJlY2lldmUgZGF0YSBhdCBwb3NpdGl2ZSBlZGdlKi8NCi0JfSBlbHNlIGlmIChwdENmZy0+dFRhbnNtaXRfZWRnZSA9PSBUUkFOU19ORUdBVElWRV9QT1NJVElWRSkgew0KLQkJcHRSZWctPnRpbWluZ0N0cmwgJj0gfkkyU19DTEtfRURHRV9TRUw7DQotCX0NCi0JLyp0ZXN0IG1vZGUqLw0KLQlpZiAocHRDZmctPnRUZXN0TW9kZSA9PSBJMlNfTk9STUFMX01PREUpIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH5JMlNfVEVTVF9NT0RFOw0KLQl9IGVsc2UgaWYgKHB0Q2ZnLT50VGVzdE1vZGUgPT0gSTJTX0xPT1BCQUNLX01PREUpIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9IEkyU19URVNUX01PREU7DQotCX0NCi0NCi0JLypkYXRhIGFsaWduIG1vZGUqLw0KLQlpZiAocHRDZmctPnRUcmFuc01vZGUgPCBNQVhfREFUQV9BTElHTl9NT0RFKSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCAmPSB+IEkyU19BTElHTl9NT0RFKDMpOyAgLypjbGVhciAwKi8NCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9ICBJMlNfQUxJR05fTU9ERShwdENmZy0+dFRyYW5zTW9kZSk7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmIChNQVhfSTJTX0RBVEFfRk1UIDw9IHB0Q2ZnLT50RGF0YUZtdCkgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0gZWxzZSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCAmPSB+IEkyU19EQVRBX1NJWkUoMHgxZik7DQotCQlwdFJlZy0+dGltaW5nQ3RybCB8PSBJMlNfREFUQV9TSVpFKHB0Q2ZnLT50RGF0YUZtdCk7DQotCX0NCi0NCi0JaWYgKE1BWF9JMlNfVFNfV0lEVEggPD0gcHRDZmctPnRUc1dpZHRoKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfSBlbHNlIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH4gSTJTX1RTX1dJRFRIKDB4MWYpOw0KLQkJcHRSZWctPnRpbWluZ0N0cmwgfD0gSTJTX1RTX1dJRFRIKHB0Q2ZnLT50VHNXaWR0aCk7ICAvKkkyU19UU19XSURUSCovDQotCX0NCi0NCi0JaWYgKHB0Q2ZnLT50UGNtRnN5bmMgPT0gUENNX1NIT1JUX0ZTWU5DKSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCAmPSB+STJTX0xPTkdfRlNZTkM7DQotCQlwdENmZy0+dFBjbUZzeW5MZW4gPSBQQ01fRlNZTkNfTEVOR1RIXzFDTEs7DQotCX0gZWxzZSBpZiAocHRDZmctPnRQY21Gc3luYyA9PSAgUENNX0xPTkdfRlNZTkMpIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9IEkyU19MT05HX0ZTWU5DOw0KLQkJcHRDZmctPnRQY21Gc3luTGVuID0gTUFYX1BDTV9GU1lOQzsgLypubyBtZWFuaW5nLGZvciBjb21wYXRpYmxlCTs3NTIwIDF0cyovDQotCX0gZWxzZSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAocHRDZmctPnRUZG1FeHRDeWNsZSA9PSBURE1fTk9fRVhUUkFfQ1lDTEUpIHsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH5JMlNfRVhUUkFfQ1lDTEU7DQotDQotCX0gZWxzZSBpZiAocHRDZmctPnRUZG1FeHRDeWNsZSA9PSBURE1fVEVBS19FWFRSQV9DWUNMRSkgew0KLQkJcHRSZWctPnRpbWluZ0N0cmwgfD0gSTJTX0VYVFJBX0NZQ0xFOw0KLQl9IGVsc2UgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19Db25maWd1cmUgIHN1Y2Nlc3MiKTsNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZgljbGVhbiBUeCBSZXNvdXJjZS4NCi0qDQotKiBAcGFyYW0JdElkCQlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfQ2xlYW5UeFJlc291cmNlKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXJldCA9IGkyc19RdWV1ZURlc3RvcnkoJnNfaTJzVHhTdHJlYW1bdElkXS50eFF1ZXVlKTsNCi0JaWYgKHNfaTJzVHhTdHJlYW1bdElkXS50eEJ1ZmZlckFycmF5ICE9IE5VTEwpIHsNCi0JCXpPc3NfRnJlZShzX2kyc1R4U3RyZWFtW3RJZF0udHhCdWZmZXJBcnJheSk7DQotCQlzX2kyc1R4U3RyZWFtW3RJZF0udHhCdWZmZXJBcnJheSA9IE5VTEw7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJY2xlYW4gUnggUmVzb3VyY2UuDQotKg0KLSogQHBhcmFtCXRJZAkJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBTSU5UMzIgaTJzX0NsZWFuUnhSZXNvdXJjZShUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQlyZXQgPSBpMnNfUXVldWVEZXN0b3J5KCZzX2kyc1J4U3RyZWFtW3RJZF0ucnhRdWV1ZSk7DQotCWlmIChzX2kyc1J4U3RyZWFtW3RJZF0ucnhCdWZmZXJBcnJheSAhPSBOVUxMKSB7DQotCQl6T3NzX0ZyZWUoc19pMnNSeFN0cmVhbVt0SWRdLnJ4QnVmZmVyQXJyYXkpOw0KLQkJc19pMnNSeFN0cmVhbVt0SWRdLnJ4QnVmZmVyQXJyYXkgPSBOVUxMOw0KLQl9DQotDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCVR4IENoZWNrIGkycyBwYXJhbWV0ZXIgY29uZmlnLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHBhcmFtCXB0Q2ZnCXBvaW50ZXIgdG8gaTJzIGNvbmZpZw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotDQotc3RhdGljIFNJTlQzMiBpMnNfVHhDaGVja1N0YXRlKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCB8fCBOVUxMID09IHB0Q2ZnKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfT1BFTikgJiYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfUkVDT1JEX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX09QRU5FRDsNCi0JfQ0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19SRUNPUkRfSU5VU0UpIHsNCi0JCXB0SW5zdGFuY2UtPnRDZmcgPSAqcHRDZmc7DQotCQlyZXQgPSBpMnNfQ29uZmlndXJlKHRJZCwgcHRDZmcpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJpMnNfVHhDaGVja1N0YXRlIGkyc19Db25maWd1cmUgZXJyIHJldD0weCV4IiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJaWYgKChwdENmZy0+Yk1hc3RlciAhPSBwdEluc3RhbmNlLT50Q2ZnLmJNYXN0ZXIpIHx8IChwdENmZy0+c2FtcGxlX3JhdGUgIT0gcHRJbnN0YW5jZS0+dENmZy5zYW1wbGVfcmF0ZSkgfHwgKHB0Q2ZnLT50Q2xrTW9kZSAhPSBwdEluc3RhbmNlLT50Q2ZnLnRDbGtNb2RlKSB8fA0KLQkJICAgIChwdENmZy0+dFRhbnNtaXRfZWRnZSAhPSBwdEluc3RhbmNlLT50Q2ZnLnRUYW5zbWl0X2VkZ2UpIHx8IChwdENmZy0+dFRlc3RNb2RlICE9IHB0SW5zdGFuY2UtPnRDZmcudFRlc3RNb2RlKSB8fCAocHRDZmctPnRUcmFuc01vZGUgIT0gcHRJbnN0YW5jZS0+dENmZy50VHJhbnNNb2RlKSkgew0KLQkJCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQl9DQotDQotCQlpZiAocHRDZmctPnRDbGtNb2RlID09IEkyU19USU1FX01PREUpIHsNCi0JCQlpZiAoKHB0Q2ZnLT50RGF0YUZtdCAhPSBwdEluc3RhbmNlLT50Q2ZnLnREYXRhRm10KSB8fCAocHRDZmctPnRUc1dpZHRoICE9IHB0SW5zdGFuY2UtPnRDZmcudFRzV2lkdGgpIHx8DQotCQkJICAgIChwdENmZy0+dFRyYWNrRm10ICE9IHB0SW5zdGFuY2UtPnRDZmcudFRyYWNrRm10KSkgew0KLQkJCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChwdENmZy0+dENsa01vZGUgPT0gUENNX1RJTUVfTU9ERSkgew0KLQkJCWlmICgocHRDZmcgLT50UGNtRmlyc3RCaXQgIT0gcHRJbnN0YW5jZSAtPnRDZmcudFBjbUZpcnN0Qml0KSB8fCAocHRDZmcgLT50UGNtRnN5bkxlbiAhPSBwdEluc3RhbmNlIC0+dENmZy50UGNtRnN5bkxlbikgfHwNCi0JCQkgICAgKHB0Q2ZnIC0+dFBjbU1vZGUgIT0gcHRJbnN0YW5jZSAtPnRDZmcudFBjbU1vZGUpIHx8IChwdENmZyAtPnRQY21TbG90TnVtICE9IHB0SW5zdGFuY2UgLT50Q2ZnLnRQY21TbG90TnVtKSkgew0KLQkJCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCVJ4IENoZWNrIGkycyBwYXJhbWV0ZXIgY29uZmlnLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHBhcmFtCXB0Q2ZnCXBvaW50ZXIgdG8gaTJzIGNvbmZpZw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotDQotc3RhdGljIFNJTlQzMiBpMnNfUnhDaGVja1N0YXRlKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCB8fCBOVUxMID09IHB0Q2ZnKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YNCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQkvKiBjbGVhciBpbnRlcnJ1cHQuIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgb3IgaTJzIGF0IGZpcnN0ICovDQotCWlmICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19PUEVOKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX09QRU5FRDsNCi0JfQ0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSB7DQotCQlwdEluc3RhbmNlLT50Q2ZnID0gKnB0Q2ZnOw0KLQkJcmV0ID0gaTJzX0NvbmZpZ3VyZSh0SWQsIHB0Q2ZnKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX1J4Q2hlY2tTdGF0ZSAgZmFpbGVkIHJldCBpcyAlZCBcclxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQl9IGVsc2Ugew0KLQkJaWYgKChwdENmZy0+Yk1hc3RlciAhPSBwdEluc3RhbmNlLT50Q2ZnLmJNYXN0ZXIpIHx8IChwdENmZy0+c2FtcGxlX3JhdGUgIT0gcHRJbnN0YW5jZS0+dENmZy5zYW1wbGVfcmF0ZSkgfHwNCi0JCSAgICAocHRDZmctPnRDbGtNb2RlICE9IHB0SW5zdGFuY2UtPnRDZmcudENsa01vZGUpIHx8IChwdENmZy0+dFRhbnNtaXRfZWRnZSAhPSBwdEluc3RhbmNlLT50Q2ZnLnRUYW5zbWl0X2VkZ2UpIHx8DQotCQkgICAgKHB0Q2ZnLT50VGVzdE1vZGUgIT0gcHRJbnN0YW5jZS0+dENmZy50VGVzdE1vZGUpIHx8IChwdENmZy0+dFRyYW5zTW9kZSAhPSBwdEluc3RhbmNlLT50Q2ZnLnRUcmFuc01vZGUpKSB7DQotCQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JCX0NCi0NCi0JCWlmIChwdENmZy0+dENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkgew0KLQkJCWlmICgocHRDZmctPnREYXRhRm10ICE9IHB0SW5zdGFuY2UtPnRDZmcudERhdGFGbXQpIHx8IChwdENmZy0+dFRzV2lkdGggIT0gcHRJbnN0YW5jZS0+dENmZy50VHNXaWR0aCkgfHwNCi0JCQkgICAgKHB0Q2ZnLT50VHJhY2tGbXQgIT0gcHRJbnN0YW5jZS0+dENmZy50VHJhY2tGbXQpKSB7DQotCQkJCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKHB0Q2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSB7DQotCQkJaWYgKChwdENmZyAtPnRQY21GaXJzdEJpdCAhPSBwdEluc3RhbmNlIC0+dENmZy50UGNtRmlyc3RCaXQpIHx8IChwdENmZyAtPnRQY21Gc3luTGVuICE9IHB0SW5zdGFuY2UgLT50Q2ZnLnRQY21Gc3luTGVuKSB8fA0KLQkJCSAgICAocHRDZmcgLT50UGNtTW9kZSAhPSBwdEluc3RhbmNlIC0+dENmZy50UGNtTW9kZSkgfHwgKHB0Q2ZnIC0+dFBjbVNsb3ROdW0gIT0gcHRJbnN0YW5jZSAtPnRDZmcudFBjbVNsb3ROdW0pKSB7DQotCQkJCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJSW5pdGlhbCB0aGUgdHggY29tbW9uIHBhcmFtZXRlci4NCi0qDQotKiBAcGFyYW0JdElkCSAJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEBwYXJhbQlwYXJhbXMJcG9pbnRlciB0byBpMnMgcGFyYW1zDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19UeENvbUluaXQoVF9aRHJ2STJTX0lkIHRJZCwgVF9aRHJ2STJzX1BhcmFtcyAqcGFyYW1zKQ0KLXsNCi0JVF9JMnNfVHhTdHJlYW0gKnR4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlVSU5UMzIgcmVnX3ZhbDsNCi0NCi0JaWYgKChNQVhfSTJTX0lEIDw9IHRJZCkgfHwgKE5VTEwgPT0gcGFyYW1zKSkgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0JdHhTdHJlYW0tPlRyYW5zaW5nID0gRkFMU0U7DQotCXR4U3RyZWFtLT5wYXVzZUZsYWcgPSBGQUxTRTsNCi0JdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSBOVUxMOw0KLQl0eFN0cmVhbS0+Y2hhbm5lbCA9IHBhcmFtcy0+Y2hhbm5lbDsNCi0JdHhTdHJlYW0tPnR4TGVuID0gcGFyYW1zLT5idWZmZXJzaXplOw0KLQl0eFN0cmVhbS0+cF9jYiA9IHBhcmFtcy0+cF9jYjsNCi0NCi0JdHhTdHJlYW0tPnR4UmRJZHggPSAwOw0KLQl0eFN0cmVhbS0+dHhXcklkeCA9IDA7DQotDQotCXNfdHhCdWZBcnJheVt0SWRdWzBdID0gKFVJTlQ4ICopKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5kbWFfdmlyYWRkcik7DQotCXNfdHhCdWZBcnJheVt0SWRdWzFdID0gc190eEJ1ZkFycmF5W3RJZF1bMF0gKyB0eFN0cmVhbS0+dHhMZW47DQotCXNfdHhCdWZBcnJheVt0SWRdWzJdID0gc190eEJ1ZkFycmF5W3RJZF1bMV0gKyB0eFN0cmVhbS0+dHhMZW47DQotDQotI2lmZGVmIF9VU0VfQVVESU9fT05fNzUyMFYyDQotCXB0UmVnLT5maWZvQ3RybCB8PSBJMlNfVFhfRklGT19SU1Q7DQotI2VuZGlmDQotCS8vcHRSZWctPmZpZm9DdHJsIHw9IEkyU19URlRIKDMwKTsgICAgLypETUEgTU9ERSBpcyBhbHNvIG5lY2Vzc3J5Ki8NCi0JcmVnX3ZhbCA9IHB0UmVnLT5maWZvQ3RybDsNCi0JcmVnX3ZhbCAmPSAweGZmZmZlMGZmOw0KLQlyZWdfdmFsIHw9IEkyU19URlRIKDE1KTsNCi0JcHRSZWctPmZpZm9DdHJsID0gcmVnX3ZhbDsNCi0NCi0JLy9wdFJlZy0+Zmlmb0N0cmwgfD0gSTJTX1RGVEgoMTYpOyAgICAvKkRNQSBNT0RFIGlzIGFsc28gbmVjZXNzcnkqLw0KLQ0KLQlyZXQgPSBpMnNfU2V0dXBUeEJ1Zih0SWQpOw0KLQlyZXQgKz0gaTJzX1F1ZXVlSW5pdCgmKHR4U3RyZWFtLT50eFF1ZXVlKSk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCWkyc19DbGVhblR4UmVzb3VyY2UodElkKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaTJzX3R4c2VtX2NvdW50X0luaXQodElkKTsNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglJbml0aWFsIHRoZSByeCBjb21tb24gcGFyYW1ldGVyLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHBhcmFtCXBhcmFtcwlwb2ludGVyIHRvIGkycyBwYXJhbXMNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLQ0KLXN0YXRpYyBTSU5UMzIgaTJzX1J4Q29tSW5pdChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMpDQotew0KLQlUX0kyc19SeFN0cmVhbSAqcnhTdHJlYW0gPSAmc19pMnNSeFN0cmVhbVt0SWRdOw0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCVRfSTJzX1JlZyAqcHRSZWcgPSBOVUxMOw0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVVJTlQzMiByZWdfdmFsOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwYXJhbXMpIHsgLy9rbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5g0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXJ4U3RyZWFtLT5yeExlbiA9IHBhcmFtcy0+YnVmZmVyc2l6ZTsNCi0NCi0Jc19yeEJ1ZkFycmF5W3RJZF1bMF0gPSAoVUlOVDggKikoaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmRtYV92aXJhZGRyKTsNCi0Jc19yeEJ1ZkFycmF5W3RJZF1bMV0gPSBzX3J4QnVmQXJyYXlbdElkXVswXSArIHJ4U3RyZWFtLT5yeExlbjsNCi0Jc19yeEJ1ZkFycmF5W3RJZF1bMl0gPSBzX3J4QnVmQXJyYXlbdElkXVsxXSArIHJ4U3RyZWFtLT5yeExlbjsNCi0NCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0NCi0JcmVnX3ZhbCA9IHB0UmVnLT5maWZvQ3RybDsNCi0JcmVnX3ZhbCAmPSAweGZmZTBmZmZmOw0KLQlyZWdfdmFsIHw9IEkyU19SRlRIKDcpOw0KLQlwdFJlZy0+Zmlmb0N0cmwgPSByZWdfdmFsOw0KLQ0KLQlyZXQgPSBpMnNfU2V0dXBSeEJ1Zih0SWQpOw0KLQlyZXQgKz0gaTJzX1F1ZXVlSW5pdCgmKHJ4U3RyZWFtLT5yeFF1ZXVlKSk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCWkyc19DbGVhblJ4UmVzb3VyY2UodElkKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaTJzX3J4c2VtX2NvdW50X0luaXQodElkKTsNCi0JLy9yeFN0cmVhbS0+cnhJZHggPSAwOw0KLQlyeFN0cmVhbS0+cnhSZElkeCA9IDA7DQotCXJ4U3RyZWFtLT5yeFdySWR4ID0gMDsNCi0NCi0vLwlyeFN0cmVhbS0+cnhCdWZmZXJBcnJheVtyeFN0cmVhbS0+cnhJZHhdLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9XUklURTsNCi0vLwlyeFN0cmVhbS0+Y3VycmVudFJ4QnVmID0gJnJ4U3RyZWFtLT5yeEJ1ZmZlckFycmF5W3J4U3RyZWFtLT5yeElkeF07DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJSW5pdGlhbCB0aGUgdHggaW50ZXJydXB0IGNvbW1vbiBwYXJhbWV0ZXIuDQotKg0KLSogQHBhcmFtCXRJZAkgCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19JbnRUeEluaXQoVF9aRHJ2STJTX0lkIHRJZCkNCi17DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JVF9JMnNfVHhTdHJlYW0gKnR4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCkgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0JdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSBpMnNfSW50VHg7DQotCXB0UmVnLT5pbnRFbiAmPSB+KEkyU19UWF9UUklHX0lOVF9FTiB8IEkyU19UWF9VTkRFUl9JTlRfRU4pOyAgLyogZGlzYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0JcHRSZWctPmludFN0YXR1cyB8PSAoSTJTX1RYX1RSSUdfSU5UIHwgSTJTX1RYX1VOREVSX0lOVCk7ICAgIC8qIGNsZWFyIGludGVycnVwdC4gbXVzdCBkaXNhYmxlIGludGVycnVwdCBvciBpMnMgYXQgZmlyc3QgKi8NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglJbml0aWFsIHRoZSByeCBpbnRlcnJ1cHQgY29tbW9uIHBhcmFtZXRlci4NCi0qDQotKiBAcGFyYW0JdElkCSAJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBTSU5UMzIgaTJzX0ludFJ4SW5pdChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0jaWYgMA0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCVRfSTJzX1J4U3RyZWFtICpyeFN0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotCVRfSTJzX1JlZyAqcHRSZWcgPSBOVUxMOw0KLQ0KLQl6RHJ2X0FTU0VSVCh0SWQgPCBNQVhfSTJTX0lEKTsNCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotDQotCXB0UmVnLT5pbnRTdGF0dXMgfD0gKEkyU19SWF9UUklHX0lOVCB8IEkyU19SWF9PVkVSX0lOVCk7ICAgICAgICAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLQlwdFJlZy0+aW50RW4gJj0gfihJMlNfUlhfVFJJR19JTlRfRU4gfCBJMlNfUlhfT1ZFUl9JTlRfRU4pOyAgICAgICAgLyogZGlzYWJsZSByeCBpbnRlcnJ1cHQgKi8NCi0NCi0Jc19yeEJ1Zlt0SWRdID0gKFVJTlQxNiAqKXJ4U3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZjsNCi0Jc19yeExlblt0SWRdID0gcnhTdHJlYW0tPnJ4TGVuIC8gc2l6ZW9mKFVJTlQxNik7DQotDQotCXJ4U3RyZWFtLT5yeElkeCsrOw0KLQkvKiBlbmFibGUgcnggaW50ZXJydXB0ICovDQotCXB0UmVnLT5pbnRFbiB8PSBJMlNfUlhfVFJJR19JTlRfRU47ICAgICAgIC8qIGVuYWJsZSByeCBpbnRlcnJ1cHQgKi8NCi0NCi0JaWYgKEkyU19JTlRDVFJMX1RFU1RfTU9ERSA9PSBUUlVFKSB7DQotCQlwdFJlZy0+aW50RW4gfD0gSTJTX1JYX09WRVJfSU5UX0VOOyAvKiBlbmFibGUgcnggb3ZlciBpbnRlcnJ1cHQgKi8NCi0JfQ0KLSNlbmRpZg0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWludGVycnVwdCBoYW5kbGUgd2hpbGUgaW4gaW50IG1vZGUuDQotKg0KLSogQHBhcmFtCXRJZAkgCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi0NCi1zdGF0aWMgVk9JRCBpMnNfSW50SXNyKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JVF9JMnNfVHhTdHJlYW0gKmkyc1R4U3RyZWFtID0gTlVMTDsNCi0JLy9jb25zdCBVSU5UMzIgdWlJbnRTdGF0dXMgPSAwOw0KLQlVSU5UMzIgY2hhbm5MYWJsZSA9IDA7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCkgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGFzc2VydA0KLQkJLy96RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybjsNCi0JfQ0KLQlwdFJlZyA9IHNfaTJzSW5zdGFuY2VbdElkXS5wdERldi0+cmVnczsNCi0JaTJzVHhTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVt0SWRdOw0KLQljb25zdCBVSU5UMzIgdWlJbnRTdGF0dXMgPSBwdFJlZy0+aW50U3RhdHVzOw0KLQ0KLQlpZiAoSTJTX0lOVENUUkxfVEVTVF9NT0RFKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5HRU4NCi0JCWlmICh1aUludFN0YXR1cyAmIEkyU19UWF9VTkRFUl9JTlQpIHsgICAgICAgLyogdHggZXJyICovDQotCQkJcHRSZWctPmludFN0YXR1cyB8PSBJMlNfVFhfVU5ERVJfSU5UOyAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLQkJfQ0KLQkJaWYgKHVpSW50U3RhdHVzICYgSTJTX1JYX09WRVJfSU5UKSB7ICAgICAgICAgLyogcnggZXJyICovDQotCQkJcHRSZWctPmludFN0YXR1cyB8PSBJMlNfUlhfT1ZFUl9JTlQ7ICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0JCX0NCi0JfQ0KLQ0KLQlpZiAodWlJbnRTdGF0dXMgJiBJMlNfVFhfVFJJR19JTlQpIHsgICAgICAgIC8qIHBsYXlpbmcgKi8NCi0JCXB0UmVnLT5pbnRFbiAmPSB+STJTX1RYX1RSSUdfSU5UX0VOOyAgLyogZGlzYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0JCXB0UmVnLT5pbnRTdGF0dXMgfD0gSTJTX1RYX1RSSUdfSU5UOyAgICAvKiBjbGVhciBpbnRlcnJ1cHQuIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgb3IgaTJzIGF0IGZpcnN0ICovDQotCQljaGFubkxhYmxlID0gKGkyc1R4U3RyZWFtLT5jaGFubmVsID09IEFVRElPX0RVQUxfQ0hBTk5FTCkgPyAyIDogMTsNCi0JCWkyc19JbnRUeFdyaXRlRmlmbyh0SWQsIGNoYW5uTGFibGUpOw0KLQkJaWYgKDAgPT0gc190eExlblt0SWRdKSB7DQotCQkJaTJzX0ludFR4Q2hhbmdlQnVmKHRJZCk7DQotCQkJcmV0dXJuOyAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG5vIGRhdGEgdHJhbnMsdGhlbiByZXR1cm4gYW5kIG5vdCBlbmFibGUgdGhlIGludGVycnVwdCxzbyB0aGUgaW50ZXJydXB0IHdpbGwgbm90IGdlbmVyYXRlKi8NCi0JCX0NCi0JCXB0UmVnLT5pbnRFbiB8PSBJMlNfVFhfVFJJR19JTlRfRU4gOyAvKiBlbmFibGUgdHggaW50ZXJydXB0ICovDQotCQlpZiAoSTJTX0lOVENUUkxfVEVTVF9NT0RFKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5HRU4NCi0JCQlwdFJlZy0+aW50RW4gfD0gSTJTX1RYX1VOREVSX0lOVF9FTjsgLyogZW5hYmxlIHR4IGludGVycnVwdCAqLw0KLQkJfQ0KLQl9DQotDQotCWlmICh1aUludFN0YXR1cyAmIEkyU19SWF9UUklHX0lOVCkgeyAgICAgICAgICAgICAgLyogcmVjb3JkaW5nICovDQotCQlwdFJlZy0+aW50RW4gJj0gfkkyU19SWF9UUklHX0lOVF9FTjsgICAgICAgIC8qIGRpc2FibGUgcnggaW50ZXJydXB0ICovDQotCQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9UUklHX0lOVDsgICAgICAgICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotCQlpMnNfSW50UnhXcml0ZUJ1Zih0SWQpOw0KLQ0KLQkJaWYgKDAgPT0gc19yeExlblt0SWRdKSB7DQotCQkJaTJzX0ludFJ4Q2hhbmdlQnVmKHRJZCk7DQotCQl9DQotCQlwdFJlZy0+aW50RW4gfD0gSTJTX1JYX1RSSUdfSU5UX0VOOyAgICAgICAgLyogZW5hYmxlIHJ4IGludGVycnVwdCAqLw0KLQkJaWYgKEkyU19JTlRDVFJMX1RFU1RfTU9ERSkgeyAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VODQotCQkJcHRSZWctPmludEVuIHw9IEkyU19SWF9PVkVSX0lOVF9FTjsgLyogZW5hYmxlIHR4IGludGVycnVwdCAqLw0KLQkJfQ0KLQl9DQotDQotCWlmICh1aUludFN0YXR1cyAmIEkyU19UWF9VTkRFUl9JTlQpIHsgICAgICAgLyogdHggZXJyICovDQotCQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19UWF9VTkRFUl9JTlQ7ICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotI2lmZGVmIF9VU0VfQVVESU9fT05fNzUyMFYyDQotCQlwdFJlZy0+Zmlmb0N0cmwgfD0gSTJTX1RYX0ZJRk9fUlNUOyAgICAgICAgICAvKiByZXNldCB0eCBmaWZvICovDQotI2VuZGlmDQotCX0NCi0NCi0JaWYgKHVpSW50U3RhdHVzICYgSTJTX1JYX09WRVJfSU5UKSB7ICAgICAgICAgLyogcnggZXJyICovDQotCQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9PVkVSX0lOVDsgICAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SWF9GSUZPX1JTVDsgICAgICAgICAgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0jZW5kaWYNCi0JfQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglUeCBXcml0ZSBmaWZvIHdoaWxlIGluIGludCBtb2RlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHBhcmFtCWNoYW5sYWIJIAljaGFubGFiDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgVk9JRCBpMnNfSW50VHhXcml0ZUZpZm8oVF9aRHJ2STJTX0lkIHRJZCwgVUlOVDMyIGNoYW5sYWIpDQotew0KLQlVSU5UMzIgdWlIZGxlZExlbiA9IEkyU19UWEZMX1ZBTDsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCVVJTlQzMiBjaGFubGFibGUgPSAwOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsgLy9rbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGRlbGV0ZSBhc3NlcnQNCi0JCS8vCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuOy8qIHdoaWxlIG5vIGRhdGEgdHJhbnMsdGhlbiByZXR1cm4gYW5kIG5vdCBlbmFibGUgdGhlIGludGVycnVwdCxzbyB0aGUgaW50ZXJydXB0IHdpbGwgbm90IGdlbmVyYXRlKi8NCi0JfQ0KLQlwdFJlZyA9IHNfaTJzSW5zdGFuY2VbdElkXS5wdERldi0+cmVnczsNCi0JY2hhbmxhYmxlID0gMjsNCi0NCi0JaWYgKHNfdHhMZW5bdElkXSA+IEkyU19UWEZMX1ZBTCAqIGNoYW5sYWJsZSkgew0KLQkJc190eExlblt0SWRdIC09IHVpSGRsZWRMZW4gKiBjaGFubGFibGU7DQotCQl3aGlsZSAoMCA8IHVpSGRsZWRMZW4pIHsNCi0JCQlwdFJlZy0+ZGF0YSA9ICooc190eEJ1Zlt0SWRdICsgKGNoYW5sYWJsZSAtIDEpKSB8ICpzX3R4QnVmW3RJZF0gPDwgMTY7DQotCQkJc190eEJ1Zlt0SWRdICs9IGNoYW5sYWJsZTsNCi0JCQl1aUhkbGVkTGVuLS07DQotCQl9DQotCX0gZWxzZSB7DQotCQl3aGlsZSAoMCA8IHNfdHhMZW5bdElkXSkgew0KLQkJCXB0UmVnLT5kYXRhID0gKihzX3R4QnVmW3RJZF0gKyAoY2hhbmxhYmxlIC0gMSkpIHwgKnNfdHhCdWZbdElkXSA8PCAxNjsNCi0JCQlzX3R4QnVmW3RJZF0gKz0gY2hhbmxhYmxlOw0KLQkJCXNfdHhMZW5bdElkXSAtPSBjaGFubGFibGU7DQotCQl9DQotCX0NCi19DQotDQotLyoqDQotKiBAYnJpZWYJUnggV3JpdGUgQnVmZmVyIHdoaWxlIGluIGludCBtb2RlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFZPSUQgaTJzX0ludFJ4V3JpdGVCdWYoVF9aRHJ2STJTX0lkIHRJZCkNCi17DQotCVRfSTJzX1JlZyAqcHRSZWcgPSBOVUxMOw0KLQlVSU5UMzIgdWlSeGxlZExlbiA9IEkyU19SWEZMX1ZBTDsNCi0JVUlOVDMyIGRhdGEgPSAwOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsgLy9rbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGRlbGV0ZSBhc3NlcnQNCi0JCS8vCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuOw0KLQl9DQotCXB0UmVnID0gc19pMnNJbnN0YW5jZVt0SWRdLnB0RGV2LT5yZWdzOw0KLQ0KLQlpZiAoc19yeExlblt0SWRdID4gdWlSeGxlZExlbiAqIDIpIHsNCi0JCXNfcnhMZW5bdElkXSAtPSB1aVJ4bGVkTGVuICogMjsNCi0JCXdoaWxlICgwIDwgdWlSeGxlZExlbikgew0KLQkJCWRhdGEgPSBwdFJlZy0+ZGF0YTsNCi0JCQkqKHNfcnhCdWZbdElkXSArIDEpID0gZGF0YSAmIDB4ZmZmZjsNCi0JCQkqc19yeEJ1Zlt0SWRdID0gKGRhdGEgPj4gMTYpICYgMHhmZmZmOw0KLQkJCXNfcnhCdWZbdElkXSArPSAyOw0KLQkJCXVpUnhsZWRMZW4tLTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXdoaWxlICgwIDwgc19yeExlblt0SWRdKSB7DQotCQkJZGF0YSA9IHB0UmVnLT5kYXRhOw0KLQkJCSooc19yeEJ1Zlt0SWRdICsgMSkgPSBkYXRhICYgMHhmZmZmOw0KLQkJCSpzX3J4QnVmW3RJZF0gPSAoZGF0YSA+PiAxNikgJiAweGZmZmY7DQotCQkJc19yeEJ1Zlt0SWRdICs9IDI7DQotCQkJc19yeExlblt0SWRdIC09IDI7DQotCQl9DQotCX0NCi19DQotDQotLyoqDQotKiBAYnJpZWYJUnggd3JpdGUgQnVmZmVyIHdoaWxlIGluIGludCBtb2RlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFZPSUQgaTJzX0ludFR4Q2hhbmdlQnVmKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19UeFN0cmVhbSAqaTJzVHhTdHJlYW0gPSBOVUxMOw0KLQlUX0kyc19RdWV1ZU5vZGUgKnF1ZXVlTm9kZSA9IE5VTEw7DQotCVVJTlQzMiBzZW1fY250ID0gMDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsgLy9rbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGRlbGV0ZSBhc3NlcnQNCi0JCS8vCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuOw0KLQl9DQotCWkyc1R4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0NCi0JaWYgKERSVl9TVUNDRVNTID09IGkyc19DaGFuZ2VUeEJ1ZmZlclN0YXR1cyh0SWQsIEJVRkZFUl9SRUFELCBCVUZGRVJfTlVMTCkpIHsgLypjaGFuZ2UgdGhlIEJVRiBzdGF0ZSBmcm9tIFJFQUQgdG8gRlVMTCBhZnRlciB0aGUgZGF0YSBvZiB0aGUgYnVmIGlzIHJlYWQgb3Zlcix0aGVuIHJlbGVhc2UgdGhlIHNlbSovDQotCQl6T3NzX1B1dFNlbWFwaG9yZShpMnNUeFN0cmVhbS0+dHhTZW0pOw0KLQl9DQotDQotCWlmICghKGkyc19Jc1F1ZXVlRW1wdHkoJmkyc1R4U3RyZWFtLT50eFF1ZXVlKSkpIHsNCi0JCWlmIChpMnNUeFN0cmVhbS0+cGF1c2VGbGFnID09IEZBTFNFKSB7DQotCQkJcmV0ID0gaTJzX1F1ZXVlR2V0KCZpMnNUeFN0cmVhbS0+dHhRdWV1ZSwgJnF1ZXVlTm9kZSk7DQotCQkJaWYgKHF1ZXVlTm9kZSAhPSBOVUxMKSB7DQotCQkJCXJldCArPSBpMnNfVXBkYXRlVHhCdWZmZXJTdGF0dXModElkLCBxdWV1ZU5vZGUtPnBCdWYsIEJVRkZFUl9SRUFEKTsNCi0JCQl9DQotCQkJLy8JCXJldCArPSBpMnNUeFN0cmVhbS0+dHhUcmFuc21pdCh0SWQsIHF1ZXVlTm9kZS0+cEJ1ZiwgcXVldWVOb2RlLT5sZW4pOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQlpMnNUeFN0cmVhbS0+VHJhbnNpbmcgPSBUUlVFOw0KLQkJfSBlbHNlIHsNCi0JCQlpMnNUeFN0cmVhbS0+VHJhbnNpbmcgPSBGQUxTRTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0gZWxzZSB7DQotCQlpMnNUeFN0cmVhbS0+VHJhbnNpbmcgPSBGQUxTRTsNCi0JCXNlbV9jbnQgPSB6T3NzX0dldFNlbWFwaG9yZUNvdW50KGkyc1R4U3RyZWFtLT50eFNlbSk7DQotCQlpZiAoc2VtX2NudCA9PSBJMlNfT1VUX0JVRl9OVU0pIHsNCi0JCQlpZiAoaTJzVHhTdHJlYW0tPnBfY2IgIT0gTlVMTCkgew0KLQkJCQlpMnNUeFN0cmVhbS0+cF9jYigpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglSeCBjaGFuZ2UgQnVmZmVyIHdoaWxlIGluIGludCBtb2RlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIAlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFZPSUQgaTJzX0ludFJ4Q2hhbmdlQnVmKFRfWkRydkkyU19JZCB0SWQpDQotew0KLSNpZiAwDQotCVRfSTJzX1J4U3RyZWFtICppMnNSeFN0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotDQotCXpEcnZfQVNTRVJUKHRJZCA8IE1BWF9JMlNfSUQpOw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQlpZiAoaTJzUnhTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaTJzUnhTdHJlYW0tPnJ4SWR4XS5pMnNCdWZTdGF0dXMgPT0gQlVGRkVSX05VTEwpIHsNCi0JCWkyc19RdWV1ZVB1dCgmKGkyc1J4U3RyZWFtLT5yeFF1ZXVlKSwgKFVJTlQxNiAqKWkyc1J4U3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZiwgKGkyc1J4U3RyZWFtLT5yeExlbiAvIHNpemVvZihVSU5UMTYpKSk7ICAgLyrJz7TOytW1vbXEyv2+3SovDQotCQlpMnNfVXBkYXRlUnhCdWZmZXJTdGF0dXModElkLCAoVUlOVDE2KilpMnNSeFN0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsIEJVRkZFUl9GVUxMKTsNCi0JCXpPc3NfUHV0U2VtYXBob3JlKGkyc1J4U3RyZWFtLT5yeFNlbSk7DQotCQlpMnNSeFN0cmVhbS0+cnhCdWZmZXJBcnJheVtpMnNSeFN0cmVhbS0+cnhJZHhdLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9XUklURTsNCi0JCWkyc1J4U3RyZWFtLT5jdXJyZW50UnhCdWYgPSAmaTJzUnhTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaTJzUnhTdHJlYW0tPnJ4SWR4XTsNCi0JCXNfcnhCdWZbdElkXSA9IChVSU5UMTYgKilpMnNSeFN0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWY7DQotCQlzX3J4TGVuW3RJZF0gPSBpMnNSeFN0cmVhbS0+cnhMZW4gLyBzaXplb2YoVUlOVDE2KTsNCi0JCWkyc1J4U3RyZWFtLT5yeElkeCA9IChpMnNSeFN0cmVhbS0+cnhJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsgICAgICAgICAvKiB1c2UgdGhlIGJ1ZiBpbiB0dXJuKi8NCi0JfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgLyppZiB0aGUgbmV4dCBidWYgaXMgYmluZyB1c2Vko3R0aGVuIHJld3JpdGUgdGhlIGJ1ZiovDQotCQlzX3J4QnVmW3RJZF0gPSAoVUlOVDE2ICopaTJzUnhTdHJlYW0tPmN1cnJlbnRSeEJ1Zi0+YnVmOw0KLQkJc19yeExlblt0SWRdID0gaTJzUnhTdHJlYW0tPnJ4TGVuIC8gc2l6ZW9mKFVJTlQxNik7DQotCX0NCi0jZW5kaWYNCi19DQotDQotLyoqDQotKiBAYnJpZWYJaTJzMSBpc3IuDQotKg0KLSogQHBhcmFtCVZPSUQNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGlzcl9pMnMxKFZPSUQpDQotew0KLQlpMnNfSW50SXNyKEkyU18xKTsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJaTJzMiBpc3IuDQotKg0KLSogQHBhcmFtCVZPSUQNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGlzcl9pMnMyKFZPSUQpDQotew0KLQlpMnNfSW50SXNyKEkyU18yKTsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJaTJzIGludGVycnVwdCBlbmFibGUuDQotKg0KLSogQHBhcmFtCXRpZAkJaTJzIHNlbGVjdA0KLSogQHBhcmFtCXBCdWYJYnVmZmVyIHBvaW50ZXINCi0qIEBwYXJhbQl1aUxlbglidWZmZXIgbGVuZ3RoDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19JbnRUeChUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiB1aUxlbikNCi17DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gTlVMTDsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotDQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgSTJTX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKSB7DQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCWlmICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotCX0NCi0NCi0Jc190eEJ1Zlt0SWRdID0gcEJ1ZjsNCi0Jc190eExlblt0SWRdID0gdWlMZW47DQotDQotCXB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotDQotCXB0UmVnLT5maWZvQ3RybCB8PSBJMlNfVEZUSCgxNik7ICAgIC8qRE1BIE1PREUgaXMgYWxzbyBuZWNlc3NyeSovDQotCS8qIGNsZWFyIHR4IGludGVycnVwdCAqLw0KLQlwdFJlZy0+aW50U3RhdHVzIHw9IChJMlNfVFhfVFJJR19JTlQgfCBJMlNfVFhfVU5ERVJfSU5UKTsgICAgLyogY2xlYXIgaW50ZXJydXB0LiBtdXN0IGRpc2FibGUgaW50ZXJydXB0IG9yIGkycyBhdCBmaXJzdCAqLw0KLQlwdFJlZy0+aW50RW4gfD0gSTJTX1RYX1RSSUdfSU5UX0VOOyAgICAgICAgLyogZW5hYmxlIHR4IGludGVycnVwdCAqLw0KLQlpZiAoSTJTX0lOVENUUkxfVEVTVF9NT0RFKSB7IC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5HRU4NCi0JCXB0UmVnLT5pbnRFbiB8PSAgSTJTX1RYX1VOREVSX0lOVF9FTjsgLyogZW5hYmxlIHR4IHVuZGVyIGludGVycnVwdCAqLw0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJRG1hIHR4IGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbiB3aGlsZSBwbGF5aW5nLg0KLSoNCi0qIEBwYXJhbQl0aWQJCQlpMnMgc2VsZWN0DQotKiBAcGFyYW0JdEludFN0YXR1cwlwb2ludGVyIHRvIFRfWkRydkRtYV9JbnRTdGF0dXMNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGkyc19EbWFUeEludENiKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQ0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JLy9jb25zdCBVSU5UMzIgdWlJbnRTdGF0dXMgPSAwOw0KLQlVSU5UOCBidWZJbmRleCA9IDA7DQotCVRfSTJzX1R4U3RyZWFtICppMnNUeFN0cmVhbSA9IE5VTEw7DQotDQotCWlmICh0SWQgPj0gTUFYX0kyU19JRCkgeyAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGFzc2VydCovDQotCQkvLwl6RHJ2X0FTU0VSVCgwKSA7DQotCQlyZXR1cm47DQotCX0NCi0JcHRSZWcgPSBzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYtPnJlZ3M7DQotCWNvbnN0IFVJTlQzMiB1aUludFN0YXR1cyAgPSBwdFJlZy0+aW50U3RhdHVzOw0KLQ0KLQlpMnNUeFN0cmVhbSA9ICZzX2kyc1R4U3RyZWFtW3RJZF07DQotCWZvciAoOyBidWZJbmRleCA8IEkyU19PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykgew0KLQkJaWYgKGkyc1R4U3RyZWFtLT50eEJ1ZmZlckFycmF5W2J1ZkluZGV4XS5pMnNCdWZTdGF0dXMgPT0gQlVGRkVSX0ZVTEwpIHsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQ0KLQlpZiAoYnVmSW5kZXggPT0gSTJTX09VVF9CVUZfTlVNKQ0KLQkJekRydkkyU19Xcml0ZV9TdG9wKHRJZCk7DQotDQotCWkyc19VcGRhdGVUeEJ1ZmZlclN0YXR1cyh0SWQsIChVSU5UMTYgKikoaTJzVHhTdHJlYW0tPnR4QnVmZmVyQXJyYXlbaTJzVHhTdHJlYW0tPnR4UmRJZHhdLmJ1ZiksIEJVRkZFUl9OVUxMKTsgICAgICAgLyrJz7LjzfkqcEJ1ZtC0zerK/b7duvOjrLjEseRCVUbXtMyszqpGVUxMKi8NCi0JaTJzVHhTdHJlYW0tPnR4UmRJZHggPSAoaTJzVHhTdHJlYW0tPnR4UmRJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0Jek9zc19QdXRTZW1hcGhvcmUoaTJzVHhTdHJlYW0tPnR4U2VtKTsNCi0NCi0vLwlpMnNfSW50VHhDaGFuZ2VCdWYodElkKTsNCi0JaWYgKHVpSW50U3RhdHVzICYgSTJTX1RYX1VOREVSX0lOVCkgeyAgICAgICAvKiB0eCBlcnIgKi8NCi0JCXB0UmVnLT5pbnRTdGF0dXMgfD0gSTJTX1RYX1VOREVSX0lOVDsgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0JfQ0KLQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglEbWEgcnggaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWxlIHBsYXlpbmcuDQotKg0KLSogQHBhcmFtCXRpZAkJCWkycyBzZWxlY3QNCi0qIEBwYXJhbQlwdEluc3RhbmNlCXBvaW50ZXIgdG8gVF9JMnNfSW5zdGFuY2UNCi0qIEBwYXJhbQl0SW50U3RhdHVzCXBvaW50ZXIgdG8gVF9aRHJ2RG1hX0ludFN0YXR1cw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFZPSUQgaTJzX0RtYVJ4SW50Q2IoVF9aRHJ2STJTX0lkIHRJZCkNCi17DQotCVRfSTJzX1J4U3RyZWFtICppMnNTdHJlYW0gPSBOVUxMOw0KLQlVSU5UOCByeEluZGV4ID0gMDsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCS8vY29uc3QgVUlOVDMyIHVpSW50U3RhdHVzID0gMDsNCi0NCi0JaWYgKHRJZCA+PSBNQVhfSTJTX0lEKSB7CS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgYXNzZXJ0Ki8NCi0JCS8vCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuOw0KLQl9DQotDQotCWkyc1N0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotCXB0UmVnID0gc19pMnNJbnN0YW5jZVt0SWRdLnB0RGV2LT5yZWdzOw0KLQljb25zdCBVSU5UMzIgdWlJbnRTdGF0dXMgPSBwdFJlZy0+aW50U3RhdHVzOw0KLSNpZiAwDQotCWlmIChpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaTJzU3RyZWFtLT5yeElkeF0uaTJzQnVmU3RhdHVzID09IEJVRkZFUl9OVUxMKSB7DQotCQlpMnNfUXVldWVQdXQoJmkyc1N0cmVhbS0+cnhRdWV1ZSwgKFVJTlQxNiAqKWkyc1N0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsIChpMnNTdHJlYW0tPnJ4TGVuIC8gc2l6ZW9mKFVJTlQxNikpKTsgICAvKnB1dCB0aGUgZnVsbCBidWYgdG8gdGhlIHF1ZXVlKi8NCi0JCWkyc19VcGRhdGVSeEJ1ZmZlclN0YXR1cyh0SWQsIChVSU5UMTYqKWkyc1N0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsIEJVRkZFUl9GVUxMKTsNCi0JCXpPc3NfUHV0U2VtYXBob3JlKGkyc1N0cmVhbS0+cnhTZW0pOyAgICAgICAgICAvKmlmIHRoZSBuZXh0IGJ1ZiBzdGF0dXMgaXMgbnVsbCx0aGVuIHJlbGVhc2UgdGhlIHNlbSBzbyB0aGUgdXBsYXllciBjYW4gZ2V0IHRoZSBidWYgdG8gcmVhZCovDQotCQkvL2kyc19EbWFSeCh0SWQsIHB0SW5zdGFuY2UsIGkyc1N0cmVhbS0+cnhJZHgpOw0KLQl9IGVsc2Ugew0KLQkJLyrI57n7vsnK/b7dyc+y49X91Nq/vbG0o6zQwszuwvq1xGJ1ZtbY0MLM7tC0Ki8NCi0JCWZvciAocnhJbmRleCA9IDA7IHJ4SW5kZXggPCBJMlNfT1VUX0JVRl9OVU07IHJ4SW5kZXgrKykgeyAgICAgICAgICAgICAgICAgICAgLyppZiB0aGUgbmV4dCBidWYgaXMgYmluZyB1c2Vko3R0aGVuIHJld3JpdGUgdGhlIGJ1ZioqLw0KLQkJCWlmIChpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbcnhJbmRleF0uaTJzQnVmU3RhdHVzID09IEJVRkZFUl9XUklURSkgeyAgICAgIC8qaXQgaXMgbmVjZXNzYXJ5IHRvIGZpbmQgdGhlIGluZGV4Ki8NCi0JCQkJaWYgKHVpSW50U3RhdHVzICYgSTJTX1JYX09WRVJfSU5UKSB7ICAgICAgICAgLyogcnggZXJyICovDQotCQkJCQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9PVkVSX0lOVDsgICAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQkJCQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SWF9GSUZPX1JTVDsgICAgICAgICAgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0jZW5kaWYNCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJaWYgKHJ4SW5kZXggPT0gMikgew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQlpMnNTdHJlYW0tPnJ4SWR4ID0gcnhJbmRleDsNCi0JCS8vaTJzX0RtYVJ4KHRJZCwgcHRJbnN0YW5jZSwgcnhJbmRleCk7DQotCX0NCi0NCi0NCi0JaWYgKHVpSW50U3RhdHVzICYgSTJTX1JYX09WRVJfSU5UKSB7ICAgICAgICAgLyogcnggZXJyICovDQotCQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9PVkVSX0lOVDsgICAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SWF9GSUZPX1JTVDsgICAgICAgICAgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0jZW5kaWYNCi0NCi0JfQ0KLSNlbmRpZg0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMxIHJ4IGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbi4NCi0qDQotKiBAcGFyYW0JdEludFN0YXR1cwlwb2ludGVyIHRvIFRfWkRydkRtYV9JbnRTdGF0dXMNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGRtYWNiX2kyczFfcngodm9pZCAqZGF0YSkNCi17DQotCS8vaTJzX0RtYVJ4SW50Q2IoSTJTXzEpOw0KLQlVSU5UMzIgc2VtX2NudCA9IDA7DQotCVRfSTJzX1J4U3RyZWFtICppMnNTdHJlYW0gPSAmc19pMnNSeFN0cmVhbVtJMlNfMV07DQotCS8qDQotCQlVSU5UOCBidWZJbmRleCA9IDA7DQotDQotCQlmb3IoOyBidWZJbmRleCA8IEkyU19PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykgew0KLQkJCWlmKGkyc1N0cmVhbS0+cnhCdWZmZXJBcnJheVtidWZJbmRleF0uaTJzQnVmU3RhdHVzID09IEJVRkZFUl9GVUxMKSB7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChidWZJbmRleCA9PSBJMlNfT1VUX0JVRl9OVU0pDQotCQkJekRydkkyU19SZWFkX1N0b3AoSTJTXzEpOw0KLQkqLw0KLQ0KLSAgICBpZihpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXkgPT0gTlVMTCl7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgDQotCWkyc19VcGRhdGVSeEJ1ZmZlclN0YXR1cyhJMlNfMSwgKFVJTlQxNiAqKShpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaTJzU3RyZWFtLT5yeFdySWR4XS5idWYpLCBCVUZGRVJfRlVMTCk7DQotCWkyc1N0cmVhbS0+cnhXcklkeCA9IChpMnNTdHJlYW0tPnJ4V3JJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0NCi0Jc2VtX2NudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQoaTJzU3RyZWFtLT5yeFNlbSk7DQotCWlmIChzZW1fY250IDwgSTJTX09VVF9CVUZfTlVNKSB7DQotCQl6T3NzX1B1dFNlbWFwaG9yZShpMnNTdHJlYW0tPnJ4U2VtKTsNCi0JfSBlbHNlIHsNCi0JCWkyc1N0cmVhbS0+cnhSZElkeCA9IChpMnNTdHJlYW0tPnJ4UmRJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0JfQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMyIHJ4IGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbi4NCi0qDQotKiBAcGFyYW0JdEludFN0YXR1cwlwb2ludGVyIHRvIFRfWkRydkRtYV9JbnRTdGF0dXMNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGRtYWNiX2kyczJfcngodm9pZCAqZGF0YSkNCi17DQotCS8vaTJzX0RtYVJ4SW50Q2IoSTJTXzIpOw0KLQlVSU5UMzIgc2VtX2NudCA9IDA7DQotCVRfSTJzX1J4U3RyZWFtICppMnNTdHJlYW0gPSAmc19pMnNSeFN0cmVhbVtJMlNfMl07DQotCS8qDQotCQlVSU5UOCBidWZJbmRleCA9IDA7DQotDQotCQlmb3IoOyBidWZJbmRleCA8IEkyU19PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykgew0KLQkJCWlmKGkyc1N0cmVhbS0+cnhCdWZmZXJBcnJheVtidWZJbmRleF0uaTJzQnVmU3RhdHVzID09IEJVRkZFUl9GVUxMKSB7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChidWZJbmRleCA9PSBJMlNfT1VUX0JVRl9OVU0pDQotCQkJekRydkkyU19SZWFkX1N0b3AoSTJTXzIpOw0KLQkqLw0KLQ0KLSAgICBpZihpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXkgPT0gTlVMTCl7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgDQotCWkyc19VcGRhdGVSeEJ1ZmZlclN0YXR1cyhJMlNfMiwgKFVJTlQxNiAqKShpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaTJzU3RyZWFtLT5yeFdySWR4XS5idWYpLCBCVUZGRVJfRlVMTCk7DQotCWkyc1N0cmVhbS0+cnhXcklkeCA9IChpMnNTdHJlYW0tPnJ4V3JJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0Jc2VtX2NudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQoaTJzU3RyZWFtLT5yeFNlbSk7DQotCWlmIChzZW1fY250IDwgSTJTX09VVF9CVUZfTlVNKSB7DQotCQl6T3NzX1B1dFNlbWFwaG9yZShpMnNTdHJlYW0tPnJ4U2VtKTsNCi0JfSBlbHNlIHsNCi0JCWkyc1N0cmVhbS0+cnhSZElkeCA9IChpMnNTdHJlYW0tPnJ4UmRJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0JfQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMxIHR4IGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbi4NCi0qDQotKiBAcGFyYW0JdGlkCQkJaTJzIHNlbGVjdA0KLSogQHBhcmFtCXB0SW5zdGFuY2UJcG9pbnRlciB0byBUX0kyc19JbnN0YW5jZQ0KLSogQHBhcmFtCXRJbnRTdGF0dXMJcG9pbnRlciB0byBUX1pEcnZEbWFfSW50U3RhdHVzDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgVk9JRCBkbWFjYl9pMnMxX3R4KHZvaWQgKmRhdGEpDQotew0KLQkvL2kyc19EbWFUeEludENiKEkyU18xKTsNCi0JVUlOVDMyIHNlbV9jbnQgPSAwOw0KLQlUX0kyc19UeFN0cmVhbSAqaTJzVHhTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVtJMlNfMV07DQotCS8qDQotCQlVSU5UOCBidWZJbmRleCA9IDA7DQotDQotCQlmb3IoOyBidWZJbmRleCA8IEkyU19PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykgew0KLQkJCWlmKGkyc1R4U3RyZWFtLT50eEJ1ZmZlckFycmF5W2J1ZkluZGV4XS5pMnNCdWZTdGF0dXMgPT0gQlVGRkVSX05VTEwpIHsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKGJ1ZkluZGV4ID09IEkyU19PVVRfQlVGX05VTSkNCi0JCQl6RHJ2STJTX1dyaXRlX1N0b3AoSTJTXzEpOw0KLQkqLw0KLQ0KLSAgICBpZihpMnNUeFN0cmVhbS0+dHhCdWZmZXJBcnJheSA9PSBOVUxMKXsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICANCi0JaTJzX1VwZGF0ZVR4QnVmZmVyU3RhdHVzKEkyU18xLCAoVUlOVDE2ICopKGkyc1R4U3RyZWFtLT50eEJ1ZmZlckFycmF5W2kyc1R4U3RyZWFtLT50eFJkSWR4XS5idWYpLCBCVUZGRVJfTlVMTCk7ICAgICAgIC8qyc+y4835KnBCdWbQtM3qyv2+3brzo6y4xLHkQlVG17TMrM6qRlVMTCovDQotCWkyc1R4U3RyZWFtLT50eFJkSWR4ID0gKGkyc1R4U3RyZWFtLT50eFJkSWR4ICsgMSkgJSBJMlNfT1VUX0JVRl9OVU07DQotCXNlbV9jbnQgPSB6T3NzX0dldFNlbWFwaG9yZUNvdW50KGkyc1R4U3RyZWFtLT50eFNlbSk7DQotCWlmIChzZW1fY250IDwgSTJTX09VVF9CVUZfTlVNKSB7DQotCQl6T3NzX1B1dFNlbWFwaG9yZShpMnNUeFN0cmVhbS0+dHhTZW0pOw0KLQl9IGVsc2Ugew0KLQkJaTJzVHhTdHJlYW0tPnR4V3JJZHggPSAoaTJzVHhTdHJlYW0tPnR4V3JJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0JfQ0KLQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMyIHR4IGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbi4NCi0qDQotKiBAcGFyYW0JdGlkCQkJaTJzIHNlbGVjdA0KLSogQHBhcmFtCXB0SW5zdGFuY2UJcG9pbnRlciB0byBUX0kyc19JbnN0YW5jZQ0KLSogQHBhcmFtCXRJbnRTdGF0dXMJcG9pbnRlciB0byBUX1pEcnZEbWFfSW50U3RhdHVzDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgVk9JRCBkbWFjYl9pMnMyX3R4KHZvaWQgKmRhdGEpDQotew0KLQkvL2kyc19EbWFUeEludENiKEkyU18yKTsNCi0JVUlOVDMyIHNlbV9jbnQgPSAwOw0KLQlUX0kyc19UeFN0cmVhbSAqaTJzVHhTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVtJMlNfMl07DQotCS8qDQotCQlVSU5UOCBidWZJbmRleCA9IDA7DQotDQotCQlmb3IoOyBidWZJbmRleCA8IEkyU19PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykgew0KLQkJCWlmKGkyc1R4U3RyZWFtLT50eEJ1ZmZlckFycmF5W2J1ZkluZGV4XS5pMnNCdWZTdGF0dXMgPT0gQlVGRkVSX05VTEwpIHsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKGJ1ZkluZGV4ID09IEkyU19PVVRfQlVGX05VTSkNCi0JCQl6RHJ2STJTX1dyaXRlX1N0b3AoSTJTXzIpOw0KLQkqLw0KLQ0KLSAgICBpZihpMnNUeFN0cmVhbS0+dHhCdWZmZXJBcnJheSA9PSBOVUxMKXsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICANCi0JaTJzX1VwZGF0ZVR4QnVmZmVyU3RhdHVzKEkyU18yLCAoVUlOVDE2ICopKGkyc1R4U3RyZWFtLT50eEJ1ZmZlckFycmF5W2kyc1R4U3RyZWFtLT50eFJkSWR4XS5idWYpLCBCVUZGRVJfTlVMTCk7ICAgICAgIC8qyc+y4835KnBCdWbQtM3qyv2+3brzo6y4xLHkQlVG17TMrM6qRlVMTCovDQotCWkyc1R4U3RyZWFtLT50eFJkSWR4ID0gKGkyc1R4U3RyZWFtLT50eFJkSWR4ICsgMSkgJSBJMlNfT1VUX0JVRl9OVU07DQotCXNlbV9jbnQgPSB6T3NzX0dldFNlbWFwaG9yZUNvdW50KGkyc1R4U3RyZWFtLT50eFNlbSk7DQotCWlmIChzZW1fY250IDwgSTJTX09VVF9CVUZfTlVNKSB7DQotCQl6T3NzX1B1dFNlbWFwaG9yZShpMnNUeFN0cmVhbS0+dHhTZW0pOw0KLQl9IGVsc2Ugew0KLQkJaTJzVHhTdHJlYW0tPnR4V3JJZHggPSAoaTJzVHhTdHJlYW0tPnR4V3JJZHggKyAxKSAlIEkyU19PVVRfQlVGX05VTTsNCi0JfQ0KLX0NCi0NCi0jaWYgMA0KLS8qKg0KLSogQGJyaWVmCWNvbmZpZyBhbmQgc3RhcnQgaTJzIGRtYSByeCAuDQotKg0KLSogQHBhcmFtCXRpZAkJCWkycyBzZWxlY3QNCi0qIEBwYXJhbQlwdEluc3RhbmNlCXBvaW50ZXIgdG8gVF9JMnNfSW5zdGFuY2UNCi0qIEBwYXJhbQlpZHgJcG9pbnRlciBpZHgNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBTSU5UMzIgaTJzX0RtYVJ4KFRfWkRydkkyU19JZCB0SWQsIFRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlLCBVSU5UOCBpZHgpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVRfSTJzX1J4U3RyZWFtICppMnNTdHJlYW0gPSAmc19pMnNSeFN0cmVhbVt0SWRdOw0KLQlUX1pEcnZEbWFfQ2hhbm5lbERlZiB0Q2hhbkRlZiA9IHswfTsNCi0NCi0JekRydl9BU1NFUlQoKHRJZCA8IE1BWF9JMlNfSUQpICYmIChwdEluc3RhbmNlICE9IE5VTEwpICYmIChpZHggPCBJMlNfT1VUX0JVRl9OVU0pKTsNCi0JaWYgKChNQVhfSTJTX0lEIDw9IHRJZCkgfHwgKE5VTEwgPT0gcHRJbnN0YW5jZSkgfHwgKGlkeCA+PSBJMlNfT1VUX0JVRl9OVU0pKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWkyc1N0cmVhbS0+cnhCdWZmZXJBcnJheVtpZHhdLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9XUklURSA7DQotCWkyc1N0cmVhbS0+Y3VycmVudFJ4QnVmID0gJmkyc1N0cmVhbS0+cnhCdWZmZXJBcnJheVtpZHhdOw0KLQ0KLQlpZiAodElkID09IEkyU18xKSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnJ4RG1hQ2hhbkRlZi5TcmNBZGRyID0gWlgyOTc1MjBWM19JMlMwX1BIWVMgKyAweDFjOw0KLQl9IGVsc2UgaWYgKHRJZCA9PSBJMlNfMikgew0KLQkJaTJzRG1hU3RhdGVbdElkXS5yeERtYUNoYW5EZWYuU3JjQWRkciA9IFpYMjk3NTIwVjNfSTJTMV9QSFlTICsgMHgxYzsNCi0JfQ0KLS8vCXRDaGFuRGVmLkRlc3RBZGRyID0gTU9ERU1fVkFfMl9QQSgoVUlOVDMyKWkyc1N0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYpOw0KLQlpMnNEbWFTdGF0ZVt0SWRdLnJ4RG1hQ2hhbkRlZi5EZXN0QWRkciA9IGkyc0RtYVN0YXRlW3RJZF0uZG1hX3J4X3BoeWFkZHJbMF0gKyBpZHggKiAoaTJzRG1hU3RhdGVbdElkXS5yeHNpbmdsZWJ1ZmZzaXplKTsNCi0JaWYgKGdJMnNDbnRDaGFuZ2VSeFt0SWRdID49IC04MCkgew0KLQkJaTJzRG1hU3RhdGVbdElkXS5yeERtYUNoYW5EZWYuQ291bnQgPSAoKFVJTlQxNilpMnNTdHJlYW0tPnJ4TGVuKSArIGdJMnNDbnRDaGFuZ2VSeFt0SWRdICogMjsgLy8qc2l6ZW9mKFVJTlQzMik7Ly91aUxlbipzaXplb2YoVUlOVDE2KQ0KLQkJZ0kyc0NudENoYW5nZVJ4W3RJZF0gPSAwOy8vYWRkIGJ5IGx2d2VuaHVhIGZvciBpMnMgc3luYyAgMjAxMy4xMi43DQotCX0gZWxzZSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnJ4RG1hQ2hhbkRlZi5Db3VudCA9ICgoVUlOVDE2KWkyc1N0cmVhbS0+cnhMZW4pIC0gODAgKiAyOyAvLypzaXplb2YoVUlOVDMyKTsvL3VpTGVuKnNpemVvZihVSU5UMTYpDQotCQlnSTJzQ250Q2hhbmdlUnhbdElkXSA9IGdJMnNDbnRDaGFuZ2VSeFt0SWRdICsgODA7IC8vYWRkIGJ5IGx2d2VuaHVhIGZvciBpMnMgc3luYyAgMjAxMy4xMi43DQotCX0NCi0NCi0NCi0JLyptb2RpZmllZCBieSBtaWFvbGluIDIwMTMwODAxKi8NCi0JcmV0ID0gekRydkRtYV9Db25maWdDaGFubmVsKHB0SW5zdGFuY2UtPkRtYVJ4SUQsIGkyc0RtYVN0YXRlW3RJZF0ucnhEbWFDaGFuRGVmKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydkRtYV9EZUFsbG9jQ2hhbm5lbChwdEluc3RhbmNlLT5EbWFSeElEKTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0jaWZkZWYgTUFMTE9DX0kyU19ETUFfQVJFQQ0KLQkvL1RPU19EQ0FDSEVfSU5WQUxJREFURV9SQU5HRSgoVUlOVDMyKWkyc1N0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsKFVJTlQxNilpMnNTdHJlYW0tPnJ4TGVuKTsNCi0JZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmkyc19kZXZpY2UuZGV2LCBpMnNEbWFTdGF0ZVt0SWRdLnJ4RG1hQ2hhbkRlZi5EZXN0QWRkciwgaTJzRG1hU3RhdGVbdElkXS5yeERtYUNoYW5EZWYuQ291bnQsIERNQV9GUk9NX0RFVklDRSk7DQotI2VuZGlmDQotDQotCXJldHVybiByZXQ7DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSogQGJyaWVmCWRtYSByeCBpbml0Lg0KLSoNCi0qIEBwYXJhbQl0aWQJCQlpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfRG1hUnhJbml0KFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19SeFN0cmVhbSAqaTJzU3RyZWFtID0gTlVMTDsNCi0NCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkKSB7IC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWkyc1N0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQ0KLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOw0KLQlkbWFfY2FwX21hc2tfdCBtYXNrOw0KLQ0KLQlkbWFfY2FwX3plcm8obWFzayk7DQotCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMsIG1hc2spOw0KLQ0KLQlkbWFfY2hhbm5lbF9kZWYgdGVtcFszXTsNCi0JaW50IAlpOw0KLQltZW1zZXQodGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsNCi0JaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmNoYW5uZWwgPSAodElkID09IEkyU18xKSA/IChETUFfQ0hfSTJTMF9SWDApIDogKERNQV9DSF9JMlMxX1JYMCk7DQotCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgengyOV9kbWFfZmlsdGVyX2ZuLCAodm9pZCopKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaGFubmVsKSk7DQotDQotICAgIGlmKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaCA9PSBOVUxMKXsNCi0gICAgICAgIGZvcihpID0gMDsgaSA8PSA1OyBpKyspew0KLSAgICAgICAgICAgIHpPc3NfU2xlZXAoMSk7DQotICAgICAgICAgICAgaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmNoID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCB6eDI5X2RtYV9maWx0ZXJfZm4sICh2b2lkKikoaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmNoYW5uZWwpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZihpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uY2ggIT0gTlVMTCl7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKGkgPT0gNSl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJpMnNfRG1hUnhJbml0IGVycm9yLCBpMnNEbWFTdGF0ZVslZF1bJWRdLmNoIGlzIE5VTExcbiIsIHRJZCwgSTJTX1JYKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0JZm9yIChpID0gMDsgaSA8IEkyU19PVVRfQlVGX05VTTsgaSsrKSB7DQotCQl0ZW1wW2ldLmRlc3RfYWRkciAJPSBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3BoeWFkZHIgICsgKGkyc1N0cmVhbS0+cnhMZW4pICogaTsNCi0JCXRlbXBbaV0uc3JjX2FkZHIJPSAodElkID09IEkyU18xKSA/IChaWDI5X0kyUzBfUEhZUyArIDB4MWMpIDogKFpYMjlfSTJTMV9QSFlTICsgMHgxYyk7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnRyYW5fbW9kZSA9IFRSQU5fUEVSSV9UT19NRU07DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9sZW4gCT0gRE1BX0JVUlNUX0xFTl84Ow0KLQkJdGVtcFtpXS5jb3VudAkJPSBpMnNTdHJlYW0tPnJ4TGVuOw0KLQkJLy8JCXRlbXBbaV0uY2FsbGJhY2sJPSAoZG1hX2NhbGxiYWNrX2Z1bmMpZG1hX2NiOw0KLQkJLyoNCi0JCQl0ZW1wW2ldLmRtYV9jb250cm9sLnRyYW5fbW9kZSAJCT0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sNCi0JCQkJCQkJCQkJCQkJPyBUUkFOX01FTV9UT19QRVJJIDogVFJBTl9QRVJJX1RPX01FTSk7DQotCQkJdGVtcFtpXS5kbWFfY29udHJvbC5zcmNfYnVyc3RfbGVuIAk9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLDQotCQkJCQkJCQkJCQkJCT8gRE1BX0JVUlNUX0xFTl8xNiA6IERNQV9CVVJTVF9MRU5fOCk7DQotCQkqLw0KLQkJdGVtcFtpXS5kbWFfY29udHJvbC5zcmNfYnVyc3Rfc2l6ZSAJPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuZGVzdF9idXJzdF9zaXplID0gRE1BX0JVUlNUX1NJWkVfMzJCSVQ7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLmRlc3RfYnVyc3RfbGVuIAk9IERNQV9CVVJTVF9MRU5fODsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuaXJxX21vZGUgCQk9IERNQV9BTExfSVJRX0VOQUJMRTsNCi0JCXRlbXBbaV0ubGlua19hZGRyIAkJPSAxOw0KLQl9DQotDQotCXRlbXBbSTJTX09VVF9CVUZfTlVNIC0gMV0ubGlua19hZGRyIAk9IDA7DQotDQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmNoLCAoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcqKSZ0ZW1wKTsNCi0NCi0JZGVzYyA9IGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljKA0KLQkgICAgICAgICAgIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaCwNCi0JICAgICAgICAgICBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3BoeWFkZHIsIGkyc1N0cmVhbS0+cnhMZW4gKiAzLA0KLQkgICAgICAgICAgIGkyc1N0cmVhbS0+cnhMZW4sDQotCSAgICAgICAgICAgRE1BX0RFVl9UT19NRU0sDQotCSAgICAgICAgICAgTlVMTCk7DQotDQotCWRlc2MtPmNhbGxiYWNrID0gKHRJZCA9PSBJMlNfMSkgPyAoKGRtYV9hc3luY190eF9jYWxsYmFjaylkbWFjYl9pMnMxX3J4KSA6ICgoZG1hX2FzeW5jX3R4X2NhbGxiYWNrKWRtYWNiX2kyczJfcngpOw0KLQlkZXNjLT5jYWxsYmFja19wYXJhbSA9IE5VTEw7DQotDQotCWRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7DQotDQotCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaCk7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJZG1hIHR4IGluaXQuDQotKg0KLSogQHBhcmFtCXRpZAkJCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19EbWFUeEluaXQoVF9aRHJ2STJTX0lkIHRJZCkNCi17DQotCVRfSTJzX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCVRfSTJzX1R4U3RyZWFtICp0eFN0cmVhbSA9IE5VTEw7DQotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYyA9IE5VTEw7DQotCWRtYV9jYXBfbWFza190IG1hc2s7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCkgeyAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmKi8NCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQl0eFN0cmVhbSA9ICZzX2kyc1R4U3RyZWFtW3RJZF07DQotCWRtYV9jYXBfemVybyhtYXNrKTsNCi0JZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgbWFzayk7DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlkbWFfY2hhbm5lbF9kZWYgdGVtcFszXTsNCi0JaW50IAlpOw0KLQltZW1zZXQodGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsNCi0JaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmNoYW5uZWwgPSAodElkID09IEkyU18xKSA/IChETUFfQ0hfSTJTMF9UWCkgOiAoRE1BX0NIX0kyUzFfVFgpOw0KLQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uY2ggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHp4MjlfZG1hX2ZpbHRlcl9mbiwgKHZvaWQqKShpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uY2hhbm5lbCkpOw0KLQ0KLSAgICBpZihpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uY2ggPT0gTlVMTCl7DQotICAgICAgICBmb3IoaSA9IDA7IGkgPD0gNTsgaSsrKXsNCi0gICAgICAgICAgICB6T3NzX1NsZWVwKDEpOw0KLSAgICAgICAgICAgIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5jaCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgengyOV9kbWFfZmlsdGVyX2ZuLCAodm9pZCopKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5jaGFubmVsKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYoaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmNoICE9IE5VTEwpew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihpID09IDUpew0KLSAgICAgICAgICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX0RtYVR4SW5pdCBlcnJvciwgaTJzRG1hU3RhdGVbJWRdWyVkXS5jaCBpcyBOVUxMXG4iLCB0SWQsIEkyU19UWCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotCWZvciAoaSA9IDA7IGkgPCBJMlNfT1VUX0JVRl9OVU07IGkrKykgew0KLQkJdGVtcFtpXS5zcmNfYWRkciAJPSBpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uZG1hX3BoeWFkZHIgKyAodHhTdHJlYW0tPnR4TGVuKSAqIGk7DQotCQl0ZW1wW2ldLmRlc3RfYWRkcgk9ICh0SWQgPT0gSTJTXzEpID8gKFpYMjlfSTJTMF9QSFlTICsgMHgxYykgOiAoWlgyOV9JMlMxX1BIWVMgKyAweDFjKTsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wudHJhbl9tb2RlID0gVFJBTl9NRU1fVE9fUEVSSTsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuc3JjX2J1cnN0X2xlbiAJPSBETUFfQlVSU1RfTEVOXzE2Ow0KLQkJdGVtcFtpXS5jb3VudAkJPSB0eFN0cmVhbS0+dHhMZW47DQotCQkvLwkJdGVtcFtpXS5jYWxsYmFjawk9IChkbWFfY2FsbGJhY2tfZnVuYylkbWFfY2I7DQotCQkvKg0KLQkJCXRlbXBbaV0uZG1hX2NvbnRyb2wudHJhbl9tb2RlIAkJPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSw0KLQkJCQkJCQkJCQkJCQk/IFRSQU5fTUVNX1RPX1BFUkkgOiBUUkFOX1BFUklfVE9fTUVNKTsNCi0JCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9sZW4gCT0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sNCi0JCQkJCQkJCQkJCQkJPyBETUFfQlVSU1RfTEVOXzE2IDogRE1BX0JVUlNUX0xFTl84KTsNCi0JCSovDQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9zaXplIAk9IERNQV9CVVJTVF9TSVpFXzMyQklUOw0KLQkJdGVtcFtpXS5kbWFfY29udHJvbC5kZXN0X2J1cnN0X3NpemUgPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuZGVzdF9idXJzdF9sZW4gCT0gRE1BX0JVUlNUX0xFTl8xNjsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuaXJxX21vZGUgCQk9IERNQV9BTExfSVJRX0VOQUJMRTsNCi0JCXRlbXBbaV0ubGlua19hZGRyIAkJPSAxOw0KLQl9DQotDQotCXRlbXBbSTJTX09VVF9CVUZfTlVNIC0gMV0ubGlua19hZGRyIAk9IDA7DQotDQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmNoLCAoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcqKSZ0ZW1wKTsNCi0NCi0JZGVzYyA9IGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5jaC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljKA0KLQkgICAgICAgICAgIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5jaCwNCi0JICAgICAgICAgICBpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uZG1hX3BoeWFkZHIsIHR4U3RyZWFtLT50eExlbiAqIDMsDQotCSAgICAgICAgICAgdHhTdHJlYW0tPnR4TGVuLA0KLQkgICAgICAgICAgIERNQV9NRU1fVE9fREVWLA0KLQkgICAgICAgICAgIE5VTEwpOw0KLQ0KLQlkZXNjLT5jYWxsYmFjayA9ICh0SWQgPT0gSTJTXzEpID8gKChkbWFfYXN5bmNfdHhfY2FsbGJhY2spZG1hY2JfaTJzMV90eCkgOiAoKGRtYV9hc3luY190eF9jYWxsYmFjaylkbWFjYl9pMnMyX3R4KTsNCi0JZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBOVUxMOw0KLQ0KLQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLSNpZiAwDQotLyoqDQotKiBAYnJpZWYJY29uZmlnIGFuZCBzdGFydCBpMnMgZG1hIHR4IC4NCi0qDQotKiBAcGFyYW0JdGlkCQkJaTJzIHNlbGVjdA0KLSogQHBhcmFtCXBCdWYJcG9pbnRlciB0byAgaTJzIGJ1ZmZlcg0KLSogQHBhcmFtCXVpTGVuCXBvaW50ZXIgaWR4DQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1zdGF0aWMgU0lOVDMyIGkyc19EbWFUeChUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiB1aUxlbikNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JLy9TSU5UMzIgY2hhbm5lbF9pZD0wOw0KLQlUX0kyc19JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlUX0kyc19UeFN0cmVhbSAgKnR4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0vLyAgICBUX1pEcnZEbWFfQ2hhbm5lbERlZiB0Q2hhbkRlZiA9IHswfTsNCi0NCi0JekRydl9BU1NFUlQoKHRJZCA8IE1BWF9JMlNfSUQpICYmIChwQnVmICE9IE5VTEwpICYmICh1aUxlbiAhPSAwKSAmJiAodWlMZW4gPD0gSTJTX01BWF9UWF9CVUZfU0laRSkpOw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgSTJTX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmIChwQnVmID09IHNfdHhCdWZBcnJheVt0SWRdWzBdKSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnR4RG1hQ2hhbkRlZi5TcmNBZGRyID0gaTJzRG1hU3RhdGVbdElkXS5kbWFfdHhfcGh5YWRkclswXTsNCi0JfSBlbHNlIGlmIChwQnVmID09IHNfdHhCdWZBcnJheVt0SWRdWzFdKSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnR4RG1hQ2hhbkRlZi5TcmNBZGRyID0gaTJzRG1hU3RhdGVbdElkXS5kbWFfdHhfcGh5YWRkclsxXTsNCi0JfSBlbHNlIGlmIChwQnVmID09IHNfdHhCdWZBcnJheVt0SWRdWzJdKSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnR4RG1hQ2hhbkRlZi5TcmNBZGRyID0gaTJzRG1hU3RhdGVbdElkXS5kbWFfdHhfcGh5YWRkclsyXTsNCi0JfQ0KLQ0KLQlpZiAodElkID09IEkyU18xKSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnR4RG1hQ2hhbkRlZi5EZXN0QWRkciA9IFpYMjk3NTIwVjNfSTJTMF9QSFlTICsgMHgxYzsNCi0JfSBlbHNlIGlmICh0SWQgPT0gSTJTXzIpIHsNCi0JCWkyc0RtYVN0YXRlW3RJZF0udHhEbWFDaGFuRGVmLkRlc3RBZGRyID0gWlgyOTc1MjBWM19JMlMxX1BIWVMgKyAweDFjOw0KLQl9DQotDQotCWlmIChnSTJzQ250Q2hhbmdlVHhbdElkXSA+PSAtODApIHsNCi0JCWkyc0RtYVN0YXRlW3RJZF0udHhEbWFDaGFuRGVmLkNvdW50ID0gdWlMZW4gKiBzaXplb2YoVUlOVDE2KSArIGdJMnNDbnRDaGFuZ2VUeFt0SWRdICogMjsgLy+0q8rktcTX1r3atPPQoQ0KLQkJZ0kyc0NudENoYW5nZVR4W3RJZF0gPSAwOy8vYWRkIGJ5IGx2d2VuaHVhIGZvciBpMnMgc3luYyAgMjAxMy4xMi43DQotCX0gZWxzZSB7DQotCQlpMnNEbWFTdGF0ZVt0SWRdLnR4RG1hQ2hhbkRlZi5Db3VudCA9IHVpTGVuICogc2l6ZW9mKFVJTlQxNikgLSA4MCAqIDI7IC8vKnNpemVvZihVSU5UMzIpOy8vdWlMZW4qc2l6ZW9mKFVJTlQxNikNCi0JCWdJMnNDbnRDaGFuZ2VUeFt0SWRdID0gZ0kyc0NudENoYW5nZVR4W3RJZF0gKyA4MDsgLy9hZGQgYnkgbHZ3ZW5odWEgZm9yIGkycyBzeW5jICAyMDEzLjEyLjcNCi0JfQ0KLQ0KLQlyZXQgPSB6RHJ2RG1hX0NvbmZpZ0NoYW5uZWwocHRJbnN0YW5jZS0+RG1hVHhJRCwgaTJzRG1hU3RhdGVbdElkXS50eERtYUNoYW5EZWYpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKSB7DQotCQl6RHJ2RG1hX0RlQWxsb2NDaGFubmVsKHB0SW5zdGFuY2UtPkRtYVR4SUQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQkvL3JldD16RHJ2RG1hX1N0YXJ0Q2hhbm5lbChjaGFubmVsX2lkLCBOVUxMLCBUUlVFKTsNCi0JcmV0ID0gekRydkRtYV9TdGFydENoYW5uZWwocHRJbnN0YW5jZS0+RG1hVHhJRCwgcHRJbnN0YW5jZS0+ZkRtYUNiVHgsIEZBTFNFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydkRtYV9EZUFsbG9jQ2hhbm5lbChwdEluc3RhbmNlLT5EbWFUeElEKTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0jZW5kaWYNCi0NCi0vKioNCi0qIEBicmllZglpbml0IHRoZSBpMnMgaW50ZXJydXB0IC4NCi0qDQotKiBAcGFyYW0JVk9JRAkJCWkycyBzZWxlY3QNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLXN0YXRpYyBWT0lEIGkyc19Jbml0SW50KFZPSUQpDQotew0KLQlzdGF0aWMgVF9JMnNfRGV2aWNlIHNfSTJzRGV2W01BWF9JMlNfSURdOw0KLQ0KLQlpZiAoc19iSTJzSW5pdEludCkgew0KLQkJcmV0dXJuOw0KLQl9DQotCW1lbXNldCgmc19JMnNEZXYsIDAsIHNpemVvZihzX0kyc0RldikpOw0KLQlzX0kyc0RldltJMlNfMV0uaW50bGluZSA9IEkyUzBfSU5UOw0KLQlzX0kyc0RldltJMlNfMV0uaW50cHJpbyA9IDE1Ow0KLQlzX0kyc0RldltJMlNfMV0ucmVncyA9IChUX0kyc19SZWcqKUkyUzBfUkVHX0JBU0U7DQotCXNfaTJzSW5zdGFuY2VbSTJTXzFdLnB0RGV2ID0gJnNfSTJzRGV2W0kyU18xXTsNCi0NCi0Jc19JMnNEZXZbSTJTXzJdLmludGxpbmUgPSBJMlMxX0lOVDsNCi0Jc19JMnNEZXZbSTJTXzJdLmludHByaW8gPSAxNTsNCi0Jc19JMnNEZXZbSTJTXzJdLnJlZ3MgPSAoVF9JMnNfUmVnKilJMlMxX1JFR19CQVNFOw0KLQlzX2kyc0luc3RhbmNlW0kyU18yXS5wdERldiA9ICZzX0kyc0RldltJMlNfMl07DQotDQotDQotCXNfaTJzSW5zdGFuY2VbSTJTXzFdLnR4TXV0ZXggPSB6T3NzX0NyZWF0ZU11dGV4KCJpMnMxVHhNdXRleCIsIDEpOw0KLQl6T3NzX0FTU0VSVChzX2kyc0luc3RhbmNlW0kyU18xXS50eE11dGV4ICE9IFpPU1NfTlVMTCk7DQotDQotCXNfaTJzSW5zdGFuY2VbSTJTXzFdLnJ4TXV0ZXggPSB6T3NzX0NyZWF0ZU11dGV4KCJpMnMxUnhNdXRleCIsIDEpOw0KLQl6T3NzX0FTU0VSVChzX2kyc0luc3RhbmNlW0kyU18xXS5yeE11dGV4ICE9IFpPU1NfTlVMTCk7DQotDQotCXNfaTJzSW5zdGFuY2VbSTJTXzJdLnR4TXV0ZXggPSB6T3NzX0NyZWF0ZU11dGV4KCJpMnMyVHhNdXRleCIsIDEpOw0KLQl6T3NzX0FTU0VSVChzX2kyc0luc3RhbmNlW0kyU18yXS50eE11dGV4ICE9IFpPU1NfTlVMTCk7DQotDQotCXNfaTJzSW5zdGFuY2VbSTJTXzJdLnJ4TXV0ZXggPSB6T3NzX0NyZWF0ZU11dGV4KCJpMnMyUnhNdXRleCIsIDEpOw0KLQl6T3NzX0FTU0VSVChzX2kyc0luc3RhbmNlW0kyU18yXS5yeE11dGV4ICE9IFpPU1NfTlVMTCk7DQotCXNfYkkyc0luaXRJbnQgPSBUUlVFOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiaTJzX0luaXRJbnQgXHJcbiIpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKGkyc19Jbml0SW50KEkyUzBfUkVHX0JBU0UpID0gJXhcbiIsIEkyUzBfUkVHX0JBU0UpOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglzZXQgY2xvY2sgZGl2aXNpb24gY29lZmYuDQotKg0KLSogQHBhcmFtCWRpdkZ1bmMJIHRoZSB2YWx1ZSB3aXRoIHRoZSBkaXZGdW5jDQotKiBAcGFyYW0JZGl2CSAJIGRpdiB2YWx1ZQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotc3RhdGljIFNJTlQzMiBpMnNfU2V0Q2xrRGl2KFVJTlQzMiBkaXZGdW5jLCBVSU5UMzIgZGl2KQ0KLXsNCi0JVUlOVDMyIGJpdFdpZHRoID0gZGl2RnVuYyAmIDB4ZmY7DQotCVVJTlQzMiBtYXhEaXYgPSAoMHgxIDw8IGJpdFdpZHRoKSAtIDE7DQotCVVJTlQzMiBiaXRJbmRleCA9IChkaXZGdW5jID4+IDgpICYgMHhmZjsNCi0JVUlOVDMyIGJpdE1hc2sgPSAwOw0KLQlVSU5UMzIgZGV2TnVtID0gMDsNCi0JVUlOVDMyIHJlZ0Jhc2UgPSAwOw0KLQlVSU5UMzIgdG1wID0gMDsNCi0NCi0JaWYgKGRpdiA+IG1heERpdikNCi0JCWRpdiA9IG1heERpdjsNCi0NCi0JaWYgKGJpdEluZGV4ID09IDI4KSB7IC8q1fvK/bfWxrXG99a71qez1sW8yv231sa1Ki8NCi0JCWRpdiAmPSAweGZlOw0KLQkJZGl2Kys7DQotCX0NCi0NCi0JYml0TWFzayA9ICgoMHgxIDw8IGJpdFdpZHRoKSAtIDEpIDw8IGJpdEluZGV4Ow0KLQlkZXZOdW0gPSAoZGl2RnVuYyA+PiAyOCkgJiAweGY7DQotCXJlZ0Jhc2UgPSBnX2kyc0Nsa0RpdlJlZ3NbZGV2TnVtXTsNCi0JdG1wID0gcmVnMzIocmVnQmFzZSk7DQotCXRtcCAmPSB+Yml0TWFzazsNCi0JdG1wIHw9IGRpdiA8PCBiaXRJbmRleDsNCi0JcmVnMzIocmVnQmFzZSkgPSB0bXA7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqDQotKiBAYnJpZWYJaTJzIGluaXQuDQotKg0KLSogQHBhcmFtCVZPSUQNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX0luaXQoVk9JRCkNCi17DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX19Jbml0IFxuIik7DQotDQotCXNfaTJzUnhTdHJlYW1bSTJTXzFdLnJ4U2VtID0gek9zc19DcmVhdGVTZW1hcGhvcmUoImlpczFfcnhfc2VtIiwgMCk7DQotCWlmIChOVUxMID09IHNfaTJzUnhTdHJlYW1bSTJTXzFdLnJ4U2VtKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIGlpczFfcnhfc2VtIGVyciBcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlzX2kyc1J4U3RyZWFtW0kyU18yXS5yeFNlbSAgPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiaWlzMl9yeF9zZW0iLCAwKTsNCi0JaWYgKE5VTEwgPT0gc19pMnNSeFN0cmVhbVtJMlNfMl0ucnhTZW0pIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgaWlzMl9yeF9zZW0gZXJyIFxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXNfaTJzVHhTdHJlYW1bSTJTXzFdLnR4U2VtID0gek9zc19DcmVhdGVTZW1hcGhvcmUoImlpczFfdHhfc2VtIiwgMCk7DQotCWlmIChOVUxMID09IHNfaTJzVHhTdHJlYW1bSTJTXzFdLnR4U2VtKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIGlpczFfdHhfc2VtIGVyciBcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlzX2kyc1R4U3RyZWFtW0kyU18yXS50eFNlbSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJpaXMyX3R4X3NlbSIsIDApOw0KLQlpZiAoTlVMTCA9PSBzX2kyc1R4U3RyZWFtW0kyU18yXS50eFNlbSkgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImNyZWF0ZSBpaXMyX3R4X3NlbSBlcnIgXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMgcmVzZW0gY291bnQgaW5pdC4NCi0qDQotKiBAcGFyYW0JdElkCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgaTJzX3J4c2VtX2NvdW50X0luaXQoVF9aRHJ2STJTX0lkIHRJZCkNCi17DQotCVVJTlQzMiBpID0gMDsNCi0JVUlOVDMyIHNlbUNvdW50ID0gMDsNCi0JU0lOVDMyIENvdW50ID0gMDsNCi0NCi0JVF9JMnNfUnhTdHJlYW0gKnJ4U3RyZWFtID0gJnNfaTJzUnhTdHJlYW1bdElkXTsNCi0Jc2VtQ291bnQgPSB6T3NzX0dldFNlbWFwaG9yZUNvdW50KHJ4U3RyZWFtLT5yeFNlbSk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJpMnMlZCByeFN0cmVhbS0+cnhTZW0gY291bnQ9JWQgXHJcbiIsIHRJZCwgc2VtQ291bnQpOw0KLQ0KLQlDb3VudCA9IHNlbUNvdW50Ow0KLQlpZiAoQ291bnQgPiAwKSB7DQotCQlmb3IgKGkgPSAwOyBpIDwgQ291bnQ7IGkrKykgew0KLQkJCXpPc3NfR2V0U2VtYXBob3JlKHJ4U3RyZWFtLT5yeFNlbSwgWk9TU19OT19XQUlUKTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWkycyB0eHNlbSBjb3VudCBpbml0Lg0KLSoNCi0qIEBwYXJhbQl0SWQJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiBpMnNfdHhzZW1fY291bnRfSW5pdChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVUlOVDMyIGkgPSAwOw0KLQlVSU5UMzIgc2VtQ291bnQgPSAwOw0KLQlTSU5UMzIgQ291bnQgPSAwOw0KLQ0KLQlUX0kyc19UeFN0cmVhbSAqdHhTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVt0SWRdOw0KLQ0KLQlzZW1Db3VudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQodHhTdHJlYW0tPnR4U2VtKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkycyVkIHR4U3RyZWFtLT50eFNlbSBjb3VudD0lZCBcclxuIiwgdElkLCBzZW1Db3VudCk7DQotDQotCUNvdW50ID0gSTJTX1VQTElOS19TRU1fTlVNIC0gc2VtQ291bnQ7DQotCWlmIChDb3VudCA+IDApIHsNCi0JCWZvciAoaSA9IDA7IGkgPCBDb3VudDsgaSsrKSB7DQotCQkJek9zc19QdXRTZW1hcGhvcmUodHhTdHJlYW0tPnR4U2VtKTsNCi0JCX0NCi0JfSBlbHNlIGlmIChDb3VudCA8IDApIHsNCi0JCUNvdW50ID0gMCAtIENvdW50Ow0KLQkJZm9yIChpID0gMDsgaSA8IENvdW50OyBpKyspIHsNCi0JCQl6T3NzX0dldFNlbWFwaG9yZSh0eFN0cmVhbS0+dHhTZW0sIFpPU1NfTk9fV0FJVCk7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglTZXQgaTJzIGNsb2NrIGNvZWZmLg0KLSoNCi0qIEBwYXJhbQl0SWQJCXNlbGVjdCB0aGUgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0JcHRDZmcJCXBjbSBkaXZpc2lvbiBjb2VmZg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIGkyc19TZXRQZGl2KFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlUX0kyc19DbGtEaXYgZGl2ID0gezB9Ow0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwdENmZykgew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlzd2l0Y2ggKHB0Q2ZnLT50Q2xrTW9kZSkgew0KLQljYXNlIEkyU19USU1FX01PREU6DQotCQlyZXQgPSBpMnNfR2V0STJzRGl2KHB0Q2ZnLCAmZGl2KTsNCi0JCWJyZWFrOw0KLQljYXNlIFBDTV9USU1FX01PREU6DQotCQlyZXQgPSBpMnNfR2V0UGNtRGl2KHB0Q2ZnLCAmZGl2KTsNCi0JCWJyZWFrOw0KLQlkZWZhdWx0Og0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGkyc19TZXRQZGl2IGVyciByZXQ9MHgleCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldCA9IGkyc19TZXRDbGsodElkLCAmZGl2KTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBpMnNfU2V0UGRpdiBpMnNfU2V0Q2xrIGVyciByZXQ9MHgleCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gY2xvc2UgaTJzIGRpdmlkZSBmcmVxdWVuY3kuDQotKg0KLSogQHBhcmFtCXRtVHlwZQkJcG9pbnRlciB0byBUX1pEcnZJMlNfVGltaW5nVHlwZQ0KLSogQHBhcmFtCXBUbUNmZwkJcG9pbnRlciB0byBUX1pEcnZJMlNfVGltaW5nQ2ZnDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgaTJzX0dldEkyc1RpbWluZ0NmZyhUX1pEcnZJMlNfVGltaW5nVHlwZSB0bVR5cGUsIFRfWkRydkkyU19UaW1pbmdDZmcgKnBUbUNmZykNCi17DQotCVVJTlQ4IGkgPSAwOw0KLQlVSU5UOCBhcnJheVNpemUgPSBzaXplb2YoZ0kyU19UaW1pbmdDZmcpIC8gc2l6ZW9mKGdJMlNfVGltaW5nQ2ZnWzBdKTsNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19HZXRJMnNUaW1pbmdDZmcgICBhcnJheVNpemU9MHgleCx0bVR5cGUgPSAweCV4XG4iLCBhcnJheVNpemUsIHRtVHlwZSk7DQotDQotCWZvciAoaSA9IDA7IGkgPCBhcnJheVNpemU7IGkrKykgew0KLQkJaWYgKGdJMlNfVGltaW5nQ2ZnW2ldLnRUaW1pbmdUcCA9PSB0bVR5cGUpIHsNCi0JCQkqcFRtQ2ZnID0gZ0kyU19UaW1pbmdDZmdbaV07DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZgl0aGlzIGZ1bmN0aW9uIGlzIHNldCBpMnMgdGltaW5nLg0KLSoNCi0qIEBwYXJhbQlwdFJlZwkgICBwb2ludGVyIHRvIFRfSTJzX1JlZw0KLSogQHBhcmFtCXB0Q2ZnCSAgIHBvaW50ZXIgdG8gVF9aRHJ2STJTX0NmZw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIGkyc19TZXRUaW1pbmcoVF9JMnNfUmVnICpwdFJlZywgVF9aRHJ2STJTX0NmZyAqcHRDZmcpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVRfWkRydkkyU19UaW1pbmdDZmcgdG1DZmcgPSB7MH07DQotDQotCWkyc19HZXRJMnNUaW1pbmdDZmcocHRDZmctPnRUaW1pbmdUeXBlLCAmdG1DZmcpOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0NCi0JaWYgKHRtQ2ZnLnRUaW1pbmdTZWwgPT0gSTJTX1RJTUVfTU9ERSkgew0KLQkJcHRDZmctPnRDbGtNb2RlID0gSTJTX1RJTUVfTU9ERTsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH4gSTJTX1RJTUlOR19TRUw7DQotCX0gZWxzZSBpZiAodG1DZmcudFRpbWluZ1NlbCA9PSBQQ01fVElNRV9NT0RFKSB7DQotCQlwdENmZy0+dENsa01vZGUgPSBQQ01fVElNRV9NT0RFOw0KLQkJcHRSZWctPnRpbWluZ0N0cmwgfD0gSTJTX1RJTUlOR19TRUw7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmICh0bUNmZy50Q2huTnVtIDwgOCkgew0KLQkJcHRSZWctPnRpbWluZ0N0cmwgJj0gfiBJMlNfQ0hOX05VTSg3KTsNCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9IEkyU19DSE5fTlVNKHRtQ2ZnLnRDaG5OdW0pOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAodG1DZmcudExhbmVOdW0gPCA0KSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCAmPSB+IEkyU19MQU5FX05VTSg3KTsNCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9IEkyU19MQU5FX05VTSh0bUNmZy50TGFuZU51bSk7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWlmICgodG1DZmcudFRpbWluZ1NlbCA9PSBQQ01fVElNRV9NT0RFKSAmJiAodG1DZmcudFRzQ2ZnIDwgOCkpIHsNCi0JCXB0Q2ZnLT50UGNtU2xvdE51bSA9IHRtQ2ZnLnRUc0NmZzsNCi0JCXB0UmVnLT50aW1pbmdDdHJsICY9IH4gSTJTX1RTX0NGRyg3KTsNCi0JCXB0UmVnLT50aW1pbmdDdHJsIHw9ICBJMlNfVFNfQ0ZHKHRtQ2ZnLnRUc0NmZyk7DQotCX0gZWxzZSBpZiAoKHRtQ2ZnLnRUaW1pbmdTZWwgPT0gSTJTX1RJTUVfTU9ERSkgJiYgKHRtQ2ZnLnRUc0NmZyA8IDQpKSB7DQotCQlwdFJlZy0+dGltaW5nQ3RybCAmPSB+IEkyU19UU19DRkcoNyk7DQotCQlwdFJlZy0+dGltaW5nQ3RybCB8PSBJMlNfVFNfQ0ZHKHRtQ2ZnLnRUc0NmZyk7DQotCQlpZiAodG1DZmcudFRzQ2ZnID09IDEpIHsNCi0JCQlwdENmZy0+dFRyYWNrRm10ID0gUklHSFRfVFJBQ0s7DQotCQl9IGVsc2UgaWYgKHRtQ2ZnLnRUc0NmZyA9PSAyKSB7DQotCQkJcHRDZmctPnRUcmFja0ZtdCA9IExFRlRfVFJBQ0s7DQotCQl9IGVsc2UgaWYgKHRtQ2ZnLnRUc0NmZyA9PSAzKSB7DQotCQkJcHRDZmctPnRUcmFja0ZtdCA9IERPVUJMRV9UUkFDSzsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImkyc19TZXRUaW1pbmcgIHN1Y2Nlc3MiKTsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglvcGVuIGkycyBkZXZpY2UuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGV0ZSBzdHJ1Y3QNCi0qIEBwYXJhbQlpMnNUcmFuc01vZGUJIFRfWkRydkkyc19UcmFuc01vZGUNCi0qDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgekRydkkyU19PcGVuKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyc19UcmFuc01vZGUgaTJzVHJhbnNNb2RlKQ0KLXsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19EZXZpY2UgKnB0RGV2ID0gTlVMTDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlTSU5UMzIgcmV0dXJuVmFsdWUgPSAwOw0KLSNpZmRlZiBNQUxMT0NfSTJTX0RNQV9BUkVBDQotCVVJTlQzMiBidWZTaXplOw0KLQlVSU5UMzIgdHhCdWZTaXplOw0KLQlVSU5UMzIgcnhCdWZTaXplOw0KLSNlbmRpZg0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgaTJzVHJhbnNNb2RlID49IE1BWF9UUkFOU19GVU5DKSB7IC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlpZiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzID09IEkyU19PUEVOIHx8IHB0SW5zdGFuY2UtPmkyc1N0YXR1cyA9PSBJMlNfUExBWV9JTlVTRSB8fCBwdEluc3RhbmNlLT5pMnNTdGF0dXMgPT0gSTJTX1JFQ09SRF9JTlVTRSB8fCBwdEluc3RhbmNlLT5pMnNTdGF0dXMgPT0gSTJTX0JPVEhfSU5VU0UpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJob3dhcmQgekRydkkyU19PcGVuIGVyciBpMnNTdGF0dXM9JWQgXG4iLCBwdEluc3RhbmNlLT5pMnNTdGF0dXMpOw0KLQkJcmV0dXJuIERSVl9FUlJfQlVTWTsNCi0JfQ0KLQ0KLQlpMnNfSW5pdEludCgpOw0KLQlpMnNfQ2xrSW5pdCgpOw0KLQ0KLQlwdERldiA9IHB0SW5zdGFuY2UtPnB0RGV2Ow0KLQlwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPSBpMnNUcmFuc01vZGU7DQotDQotCWkyc19SZXNldCh0SWQpOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JLyppZihyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0qLw0KLQ0KLQkvKiB2YWx1ZSBvZiBjb250cm9sIHJlZ2lzdGVyIGlzIDAgYWZ0ZXIgcmVzZXRlZCAqLw0KLQlwdEluc3RhbmNlLT50Q2ZnLmJNYXN0ZXIgID0gRkFMU0U7DQotCXB0SW5zdGFuY2UtPnRDZmcudERhdGFGbXQgPSBNQVhfSTJTX0RBVEFfRk1UOw0KLQlpZiAocHRJbnN0YW5jZS0+aTJzVHJhbnNNb2RlID09IFRSQU5TX0lOVF9NT0RFKSB7DQotCQlpZiAoSTJTXzEgPT0gdElkKSB7DQotCQkJcmV0dXJuVmFsdWUgPSB6RHJ2SW50X0luc3RhbGxJc3IocHREZXYtPmludGxpbmUsIChWT0lEICopaXNyX2kyczEsICJpaXMxIiwgSU5UX0hJR0hMRVZFTCk7DQotCQl9IGVsc2UgeyAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VOICAoSTJTXzI9PXRJZCkqLw0KLQkJCXJldHVyblZhbHVlID0gekRydkludF9JbnN0YWxsSXNyKHB0RGV2LT5pbnRsaW5lLCAoVk9JRCAqKWlzcl9pMnMyLCAiaWlzMiIsIElOVF9ISUdITEVWRUwpOw0KLQkJfQ0KLQ0KLQkJaWYgKHJldHVyblZhbHVlIDwgMCkgew0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCQlwdERldi0+cGlkID0gKFBST0NFU1MpcmV0dXJuVmFsdWU7DQotCX0NCi0NCi0jaWZkZWYgTUFMTE9DX0kyU19ETUFfQVJFQQ0KLQlpZiAoKGdfdm9pY2VWYXIudm9pY2VNb2RlID09IFZPSUNFX0dTTV9NT0RFKSB8fCAoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfTFRFX01PREUpIHx8IFwNCi0JICAgIChnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9PSBWT0lDRV9XQ0RNQV9NT0RFKSB8fCAoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfVERfTU9ERSkpIHsNCi0JCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS50b3RhbGJ1ZmZzaXplID0gSTJTX01BWF9WT0lDRV9MVEVfTUVNX1NJWkUgKiAzOw0KLQkJaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLnRvdGFsYnVmZnNpemUgPSBJMlNfTUFYX1ZPSUNFX0xURV9NRU1fU0laRSAqIDM7DQotCQl0eEJ1ZlNpemUgPSBJMlNfTUFYX1ZPSUNFX0xURV9NRU1fU0laRTsNCi0JCXJ4QnVmU2l6ZSA9IEkyU19NQVhfVk9JQ0VfTFRFX01FTV9TSVpFOw0KLQkJaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLnNpbmdsZWJ1ZmZzaXplID0gSTJTX01BWF9WT0lDRV9MVEVfTUVNX1NJWkU7DQotCQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uc2luZ2xlYnVmZnNpemUgPSBJMlNfTUFYX1ZPSUNFX0xURV9NRU1fU0laRTsNCi0JfSBlbHNlIHsNCi0JCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS50b3RhbGJ1ZmZzaXplID0gSTJTX01BWF9BVURJT19QTEFZX01FTV9TSVpFICogMzsNCi0JCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS50b3RhbGJ1ZmZzaXplID0gSTJTX01BWF9BVURJT19SRUNPUkRfTUVNX1NJWkUgKiAzOw0KLQkJdHhCdWZTaXplID0gSTJTX01BWF9BVURJT19QTEFZX01FTV9TSVpFOw0KLQkJcnhCdWZTaXplID0gSTJTX01BWF9BVURJT19SRUNPUkRfTUVNX1NJWkU7DQotCQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uc2luZ2xlYnVmZnNpemUgPSBJMlNfTUFYX0FVRElPX1BMQVlfTUVNX1NJWkU7DQotCQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uc2luZ2xlYnVmZnNpemUgPSBJMlNfTUFYX0FVRElPX1JFQ09SRF9NRU1fU0laRTsNCi0JfQ0KLQ0KLQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uZG1hX3ZpcmFkZHIgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKCZpMnNfZGV2aWNlLmRldiwgaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLnRvdGFsYnVmZnNpemUsDQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmRtYV9waHlhZGRyKSwgR0ZQX0tFUk5FTCk7DQotDQotCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5kbWFfdmlyYWRkciA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoJmkyc19kZXZpY2UuZGV2LCBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0udG90YWxidWZmc2l6ZSwNCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3BoeWFkZHIpLCBHRlBfS0VSTkVMKTsNCi0NCi0JaWYgKChOVUxMID09IGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5kbWFfdmlyYWRkcikgfHwgKE5VTEwgPT0gaTJzRG1hU3RhdGVbdElkXVtJMlNfUlhdLmRtYV92aXJhZGRyKSkgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIltYS11CVUZfTlVNIE1hbGxvYyBGYWlsZWQhICVwLCVwLCV4LCV4XG4iLCBpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uZG1hX3ZpcmFkZHIsIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5kbWFfdmlyYWRkciwgXA0KLQkJICAgICAgICAgICAgICAgICAgaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmRtYV9waHlhZGRyLCBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3BoeWFkZHIpOw0KLQkJcmV0dXJuIERSVl9FUlJfTUVNX0FMTE9DOw0KLQl9IGVsc2Ugew0KLQkJLyoJCXNfdHhCdWZBcnJheVt0SWRdWzBdID0gKFVJTlQ4ICopKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5kbWFfdmlyYWRkcik7DQotCQkJCXNfdHhCdWZBcnJheVt0SWRdWzFdID0gc190eEJ1ZkFycmF5W3RJZF1bMF0gKyB0eEJ1ZlNpemU7DQotCQkJCXNfdHhCdWZBcnJheVt0SWRdWzJdID0gc190eEJ1ZkFycmF5W3RJZF1bMV0gKyB0eEJ1ZlNpemU7DQotCQkJCXNfcnhCdWZBcnJheVt0SWRdWzBdID0gKFVJTlQ4ICopKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5kbWFfdmlyYWRkcik7DQotCQkJCXNfcnhCdWZBcnJheVt0SWRdWzFdID0gc19yeEJ1ZkFycmF5W3RJZF1bMF0gKyByeEJ1ZlNpemU7DQotCQkJCXNfcnhCdWZBcnJheVt0SWRdWzJdID0gc19yeEJ1ZkFycmF5W3RJZF1bMV0gKyByeEJ1ZlNpemU7DQotDQotCQkJCWkyc0RtYVN0YXRlW3RJZF0uZG1hX3R4X3BoeWFkZHJbMV0gPSBpMnNEbWFTdGF0ZVt0SWRdLmRtYV90eF9waHlhZGRyWzBdICsgdHhCdWZTaXplOw0KLQkJCQlpMnNEbWFTdGF0ZVt0SWRdLmRtYV90eF9waHlhZGRyWzJdID0gaTJzRG1hU3RhdGVbdElkXS5kbWFfdHhfcGh5YWRkclsxXSArIHR4QnVmU2l6ZTsNCi0JCQkJaTJzRG1hU3RhdGVbdElkXS5kbWFfcnhfcGh5YWRkclsxXSA9IGkyc0RtYVN0YXRlW3RJZF0uZG1hX3J4X3BoeWFkZHJbMF0gKyByeEJ1ZlNpemU7DQotCQkJCWkyc0RtYVN0YXRlW3RJZF0uZG1hX3J4X3BoeWFkZHJbMl0gPSBpMnNEbWFTdGF0ZVt0SWRdLmRtYV9yeF9waHlhZGRyWzFdICsgcnhCdWZTaXplOw0KLQkJKi8NCi0JfQ0KLSNlbmRpZg0KLQ0KLQlwdEluc3RhbmNlLT5pMnNTdGF0dXMgPSBJMlNfT1BFTjsNCi0jaWZkZWYgX1VTRV9QU00NCi0JekRydlBvd19TZXREZXZBY3RpdmUoKFVJTlQzMikgSURMRV9GTEFHX0kyUyk7DQotI2VuZGlmDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJcmVzZXQgaTJzIGRldmljZS4NCi0qDQotKiBAcGFyYW0JdElkCSBpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSoNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX1Jlc2V0KFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXJldCA9IGkyc19SZXNldCh0SWQpOw0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0NCi0vKioNCi0qIEBicmllZgljbG9zZSBpMnMgZGV2aWNlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxldGUgc3RydWN0DQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgekRydkkyU19DbG9zZShUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCkgeyAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmKi8NCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0NCi0JaWYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfT1BFTikgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfQ2xvc2UgSTJTJWQsIGkyc1N0YXR1cz0lZCAhPSBJMlNfT1BFTiIsIHRJZCwgc19pMnNJbnN0YW5jZVt0SWRdLmkyc1N0YXR1cyk7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfT1BFTkVEOw0KLQl9DQotDQotCWlmIChwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPT0gVFJBTlNfSU5UX01PREUpDQotCQkvKiByZXNldCB0eC9yeCBmaWZvIHRvIGVuc3VyZSB0aGVyZSdyZSBubyBkYXRhIG9mIGxhc3QgdHJhbnNmZXIgaW4gZmlmbyAqLw0KLQkJLyogc2V0IHRoZSBGSUZPIGludCB0aHJlc2hvbGQgKi8NCi0Jew0KLQkJekRydkludF9Vbmluc3RhbGxJc3IocHRJbnN0YW5jZS0+cHREZXYtPmludGxpbmUpOw0KLQkJLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGRlbGV0ZSBpZiovDQotCX0NCi0NCi0jaWZkZWYgTUFMTE9DX0kyU19ETUFfQVJFQQ0KLQlpZiAoaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmRtYV92aXJhZGRyICE9IE5VTEwpIHsNCi0JCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmaTJzX2RldmljZS5kZXYsIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS50b3RhbGJ1ZmZzaXplLA0KLQkJICAgICAgICAgICAgICAgICAgICAgIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5kbWFfdmlyYWRkciwgaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmRtYV9waHlhZGRyKTsNCi0JCWkyc0RtYVN0YXRlW3RJZF1bSTJTX1RYXS5kbWFfdmlyYWRkciA9IE5VTEw7DQotCX0NCi0JaWYgKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5kbWFfdmlyYWRkciAhPSBOVUxMKSB7DQotCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJmkyc19kZXZpY2UuZGV2LCBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0udG90YWxidWZmc2l6ZSwNCi0JCSAgICAgICAgICAgICAgICAgICAgICBpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3ZpcmFkZHIsIGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5kbWFfcGh5YWRkcik7DQotCQlpMnNEbWFTdGF0ZVt0SWRdW0kyU19SWF0uZG1hX3ZpcmFkZHIgPSBOVUxMOw0KLQl9DQotI2VuZGlmDQotDQotI2lmZGVmIENPTkZJR19TTkRfU09DX0VTODMxMg0KLQlpZiAodElkID09IEkyU18yKSB7DQotCQlpMnNfUmVzZXQodElkKTsNCi0JCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkJLyppZihyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19DbG9zZSBpMnNfUmVzZXQgZmFpbGVkISEhXG4iKTsNCi0JCX0qLw0KLQl9DQotI2Vsc2UNCi0JaTJzX1Jlc2V0KHRJZCk7DQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkvKmlmKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfQ2xvc2UgaTJzX1Jlc2V0IGZhaWxlZCEhIVxuIik7DQotCX0qLw0KLQ0KLSNlbmRpZg0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQlpMnNfQ2xvc2VDbGsodElkKTsNCi0jZW5kaWYNCi0NCi0JaTJzX0Nsa0RlaW5pdCh0SWQpOw0KLQ0KLQlwdEluc3RhbmNlLT5pMnNTdGF0dXMgPSBJMlNfSURMRTsNCi0NCi0jaWZkZWYgX1VTRV9QU00NCi0JaWYgKChzX2kyc0luc3RhbmNlW0kyU18xXS5pMnNTdGF0dXMgPT0gSTJTX0lETEUpICYmIChzX2kyc0luc3RhbmNlW0kyU18yXS5pMnNTdGF0dXMgPT0gSTJTX0lETEUpKSB7DQotCQl6RHJ2UG93X1NldERldklkbGUoKFVJTlQzMilJRExFX0ZMQUdfSTJTKTsNCi0JfQ0KLSNlbmRpZg0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19DbG9zZSBJMlMlZCwgaTJzU3RhdHVzPSVkIiwgdElkLCBzX2kyc0luc3RhbmNlW3RJZF0uaTJzU3RhdHVzKTsNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotI2lmIDANCi0vKioNCi0qIEBicmllZglzdGFydCB0byB0cmFucyBkYXRhLHVzZSBpbiBwbGF5aW5nLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxldGUgc3RydWN0DQotKiBAcGFyYW0JcGFyYW1zCSBUX1pEcnZJMnNfUGFyYW1zDQotKiBAcGFyYW0JcHRDZmcJIGNvbmZpZyBwYXJhbQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfVm91c2JfU3RhcnQoVF9aRHJ2STJTX0lkIHRJZCwgVF9aRHJ2STJzX1BhcmFtcyAqcGFyYW1zLCBUX1pEcnZJMlNfQ2ZnICpwdENmZykNCi17DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JVF9JMnNfVHhTdHJlYW0gKmkyc1R4cmVhbSA9ICZzX2kyc1R4U3RyZWFtW3RJZF07DQotCVVJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCS8vU0lOVDMyIHdhaXRUaW1lID0gMDsvL3hpdQ0KLQ0KLQl6RHJ2X0FTU0VSVCgodElkIDwgTUFYX0kyU19JRCkgJiYgKHB0Q2ZnICE9IE5VTEwpICYmIChwYXJhbXMgIT0gTlVMTCkpOw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwdENmZyB8fCBOVUxMID09IHBhcmFtcykgew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19PUEVOKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfT1BFTkVEOw0KLQl9DQotDQotCXB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotCXJldCA9IGkyc19UeENvbUluaXQodElkLCBwYXJhbXMpOw0KLQlyZXQgKz0gaTJzX1J4Q29tSW5pdCh0SWQsIHBhcmFtcyk7DQotDQotCWlmIChwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPT0gVFJBTlNfSU5UX01PREUpIHsNCi0JCXJldCArPSBpMnNfSW50VHhJbml0KHRJZCk7DQotCQlyZXQgKz0gaTJzX0ludFJ4SW5pdCh0SWQpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCWkyc19DbGVhblR4UmVzb3VyY2UodElkKTsNCi0JCQlpMnNfQ2xlYW5SeFJlc291cmNlKHRJZCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JfSBlbHNlIGlmIChwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPT0gVFJBTlNfRE1BX01PREUpIHsNCi0JCS8vCWkyc1R4cmVhbS0+dHhUcmFuc21pdCA9IGkyc19EbWFUeDsNCi0JCXJldCArPSBpMnNfRG1hVHhJbml0KHRJZCk7DQotCQlyZXQgKz0gaTJzX0RtYVJ4SW5pdCh0SWQpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCWkyc19DbGVhblR4UmVzb3VyY2UodElkKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQkJcHRSZWctPmZpZm9DdHJsID0gSTJTX1RYX0ZJRk9fUlNUIHwgSTJTX1JYX0ZJRk9fUlNUOw0KLSNlbmRpZg0KLQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SRlRIKDMwKSB8IEkyU19URlRIKDMwKTsNCi0JCXB0UmVnLT5maWZvQ3RybCB8PSAoSTJTX1RYX0RNQV9FTiB8IEkyU19SWF9ETUFfRU4wKTsgICAgICAgICAgICAgLyogZW5hYmxlIGRtYSB0cmFuc2ZlciAqLw0KLQl9DQotDQotCXB0UmVnLT5wcm9jZXNzQ3RybCB8PSAoSTJTX0VOIHwgSTJTX1RYX09QRU4gfCBJMlNfUlhfT1BFTik7ICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBpMnM7IGVuYWJsZSB0eCBvbmx5ICovDQotCXB0SW5zdGFuY2UtPmkyc1N0YXR1cyA9ICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzKSA9PSBJMlNfUkVDT1JEX0lOVVNFKSA/ICBJMlNfQk9USF9JTlVTRSA6IEkyU19QTEFZX0lOVVNFOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSogQGJyaWVmCWkycyB3cml0ZSBwcmVwYXJlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxldGUgc3RydWN0DQotKiBAcGFyYW0JcHRDZmcJIGNvbmZpZyBwYXJhbQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfV3JpdGVfUHJlcGFyZShUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMlNfQ2ZnICpwdENmZykNCi17DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gTlVMTDsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkIHx8IE5VTEwgPT0gcHRDZmcpIHsgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5iovDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1ByZXBhcmUhIFxyXG4iKTsNCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0JcmV0ID0gaTJzX1R4Q2hlY2tTdGF0ZSh0SWQsIHB0Q2ZnKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfV3JpdGVfUHJlcGFyZTogIGkyc19UeENoZWNrU3RhdGUgZXJyIHJldD0lZFxyXG4iLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlwdFJlZy0+cHJvY2Vzc0N0cmwgfD0gSTJTX0VOOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfV3JpdGVfUHJlcGFyZShpMnMoJWQpIHRpbWluZyBjdHJsKSA9ICV4IiwgdElkLCAoc19pMnNJbnN0YW5jZVt0SWRdLnB0RGV2KS0+cmVncy0+dGltaW5nQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydkkyU19Xcml0ZV9QcmVwYXJlKGkycyglZCkgZmlmbyBjdHJsKSA9ICV4IiwgdElkLCAoc19pMnNJbnN0YW5jZVt0SWRdLnB0RGV2KS0+cmVncy0+Zmlmb0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfV3JpdGVfUHJlcGFyZShpMnMoJWQpIGZyYW1lIGN0cmwpID0gJXgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5mcmFtZUNudHIpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfV3JpdGVfUHJlcGFyZShpMnMoJWQpIGZpZm9zdGF0dXMpID0gJXgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5maWZvU3RhdHVzKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2STJTX1dyaXRlX1ByZXBhcmUoaTJzKCVkKSBwcm9jZXNzIGN0cmwpID0gJXgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5wcm9jZXNzQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1ByZXBhcmUoaTJzKCVkKSByZWcgaW50RW4pID0gJXgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5pbnRFbik7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1ByZXBhcmUoaTJzKCVkKSByZWcgaW50U3RhdHVzKSA9ICV4XG4iLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5pbnRTdGF0dXMpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19Xcml0ZV9QcmVwYXJlKGkycyglZCkgcmVnIGRhdGEpID0gJXhcbiIsIHRJZCwgKHNfaTJzSW5zdGFuY2VbdElkXS5wdERldiktPnJlZ3MtPmRhdGEpOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWkycyB3cml0ZSBzdGFydCBEby4NCi0qDQotKiBAcGFyYW0JdElkCSBpMnMgc2VsZXRlIHN0cnVjdA0KLSogQHBhcmFtCXBhcmFtcwkgVF9aRHJ2STJzX1BhcmFtcw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfV3JpdGVfU3RhcnRfRG8oVF9aRHJ2STJTX0lkIHRJZCwgVF9aRHJ2STJzX1BhcmFtcyAqcGFyYW1zKQ0KLXsNCi0NCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19UeFN0cmVhbSAqdHhTdHJlYW0gPSBOVUxMOw0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlTSU5UMzIgd2FpdFRpbWUgPSAwOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwYXJhbXMpIHsgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5iovDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCXR4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfV3JpdGVfU3RhcnRfRG8gXHJcbiIpOw0KLQlwdFJlZyA9IHB0SW5zdGFuY2UtPnB0RGV2LT5yZWdzOw0KLQl0eFN0cmVhbS0+Y2hhbm5lbCA9IHBhcmFtcy0+Y2hhbm5lbDsNCi0NCi0JcmV0ICs9IGkyc19UeENvbUluaXQodElkLCBwYXJhbXMpOw0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzVHJhbnNNb2RlID09IFRSQU5TX0lOVF9NT0RFKSB7DQotCQl0eFN0cmVhbS0+dHhUcmFuc21pdCA9IGkyc19JbnRUeDsgICAgICAgICAgICAgIC8qaW5pdCB0aGUgdHJhbnN0ZXIgZnVuY3Rpb24gLGl0IHdpbGwgYmUgY2FsbGVkIGluIFdyaXRlKCkgZnVuY3Rpb24qLw0KLQkJcmV0ICs9IGkyc19JbnRUeEluaXQodElkKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCQlpMnNfQ2xlYW5UeFJlc291cmNlKHRJZCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JfSBlbHNlIGlmIChwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPT0gVFJBTlNfRE1BX01PREUpIHsNCi0JCS8vdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSBpMnNfRG1hVHg7DQotCQlyZXQgKz0gaTJzX0RtYVR4SW5pdCh0SWQpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCWkyc19DbGVhblR4UmVzb3VyY2UodElkKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19UWF9ETUFfRU47ICAgICAgICAgICAgLyogZW5hYmxlIGRtYSB0cmFuc2ZlciAqLw0KLQl9DQotDQotCXB0UmVnLT5wcm9jZXNzQ3RybCB8PSBJMlNfVFhfT1BFTjsNCi0NCi0JaWYgKHB0SW5zdGFuY2UtPnRDZmcuYk1hc3RlciA9PSBUUlVFKSB7ICAgICAgICAgICAgICAgIC8qIHdhaXQgKi8NCi0JCXsNCi0JCQlic3BfdWRlbGF5KEkyU19FTkFCTEVfREVMQVlfVElNRSk7DQotCQkJd2FpdFRpbWUgKz0gSTJTX0VOQUJMRV9ERUxBWV9USU1FOw0KLQkJCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkJfQ0KLQl9DQotDQotCXB0SW5zdGFuY2UtPmkyc1N0YXR1cyA9ICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzKSA9PSBJMlNfUkVDT1JEX0lOVVNFKSA/IEkyU19CT1RIX0lOVVNFIDogSTJTX1BMQVlfSU5VU0U7DQotDQotCWdJMnNEbWFXcml0ZUludFRpbWVbdElkXSA9IDA7DQotCWdJMnNDbnRDaGFuZ2VUeFt0SWRdID0gMDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMgd3JpdGUgc3RhcnQgLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxldGUgc3RydWN0DQotKiBAcGFyYW0JcGFyYW1zCSBwb2ludGVyIHRvIHN0cnVjdCBUX1pEcnZJMnNfUGFyYW1zDQotKiBAcGFyYW0JcHRDZmcJIHBvaW50ZXIgdG8gc3RydWN0IFRfWkRydkkyU19DZmcNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX1dyaXRlX1N0YXJ0KFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyc19QYXJhbXMgKnBhcmFtcywgVF9aRHJ2STJTX0NmZyAqcHRDZmcpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1N0YXJ0XHJcbiIpOw0KLQ0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1ByZXBhcmUodElkLCBwdENmZyk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1N0YXJ0ICB6RHJ2STJTX1dyaXRlX1ByZXBhcmUgZXJyb3IgcmV0PSVkIFxyXG4iLCByZXQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1N0YXJ0X0RvKHRJZCwgcGFyYW1zKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfV3JpdGVfU3RhcnQgIHpEcnZJMlNfV3JpdGVfU3RhcnRfRG8gZXJyb3IgcmV0PSVkIFxyXG4iLCByZXQpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCWkycyByZWFkIHByZXBhcmUuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGV0ZSBzdHJ1Y3QNCi0qIEBwYXJhbQlwdENmZwkgcG9pbnRlciB0byBjb25maWcgcGFyYW0NCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX1JlYWRfUHJlcGFyZShUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMlNfQ2ZnICpwdENmZykNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gTlVMTDsNCi0NCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkIHx8IE5VTEwgPT0gcHRDZmcpIHsgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5iovDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfUHJlcGFyZSBcclxuIik7DQotCXB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotDQotCXJldCA9IGkyc19SeENoZWNrU3RhdGUodElkLCBwdENmZyk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfUHJlcGFyZTogIGkyc19SeENoZWNrU3RhdGUgZXJyIHJldD0lZFxyXG4iLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlwdFJlZy0+cHJvY2Vzc0N0cmwgfD0gSTJTX0VOOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfUmVhZF9QcmVwYXJlKGkycyglZCkgdGltaW5nIGN0cmwpID0gMHglOHgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT50aW1pbmdDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2STJTX1JlYWRfUHJlcGFyZShpMnMoJWQpIGZpZm8gY3RybCkgPSAweCU4eCIsIHRJZCwgKHNfaTJzSW5zdGFuY2VbdElkXS5wdERldiktPnJlZ3MtPmZpZm9DdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2STJTX1JlYWRfUHJlcGFyZShpMnMoJWQpIGZyYW1lIGN0cmwpID0gMHglOHgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5mcmFtZUNudHIpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfUmVhZF9QcmVwYXJlKGkycyglZCkgZmlmb3N0YXR1cykgPSAweCU4eCIsIHRJZCwgKHNfaTJzSW5zdGFuY2VbdElkXS5wdERldiktPnJlZ3MtPmZpZm9TdGF0dXMpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZJMlNfUmVhZF9QcmVwYXJlKGkycyglZCkgcHJvY2VzcyBjdHJsKSA9IDB4JTh4IiwgdElkLCAoc19pMnNJbnN0YW5jZVt0SWRdLnB0RGV2KS0+cmVncy0+cHJvY2Vzc0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19SZWFkX1ByZXBhcmUoaTJzKCVkKSByZWcgaW50RW4pID0gMHglOHgiLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5pbnRFbik7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfUHJlcGFyZShpMnMoJWQpIHJlZyBpbnRTdGF0dXMpID0gMHglOHhcbiIsIHRJZCwgKHNfaTJzSW5zdGFuY2VbdElkXS5wdERldiktPnJlZ3MtPmludFN0YXR1cyk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfUHJlcGFyZShpMnMoJWQpIHJlZyBkYXRhKSA9IDB4JTh4XG4iLCB0SWQsIChzX2kyc0luc3RhbmNlW3RJZF0ucHREZXYpLT5yZWdzLT5kYXRhKTsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMgcmVhZCBzdGFydCBkby4NCi0qDQotKiBAcGFyYW0JdElkCSBpMnMgc2VsZXRlIHN0cnVjdA0KLSogQHBhcmFtCXBhcmFtcwkgcG9pbnRlciB0byBUX1pEcnZJMnNfUGFyYW1zDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgekRydkkyU19SZWFkX1N0YXJ0X0RvKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyc19QYXJhbXMgKnBhcmFtcykNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9JMnNfUmVnICpwdFJlZyA9IE5VTEw7DQotCVNJTlQzMiB3YWl0VGltZSA9IDA7DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gTlVMTDsNCi0NCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkIHx8IE5VTEwgPT0gcGFyYW1zKSB7IC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19SZWFkX1N0YXJ0X0RvIFxyXG4iKTsNCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0NCi0JcmV0ICs9IGkyc19SeENvbUluaXQodElkLCBwYXJhbXMpOw0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzVHJhbnNNb2RlID09IFRSQU5TX0lOVF9NT0RFKSB7DQotCQlyZXQgKz0gaTJzX0ludFJ4SW5pdCh0SWQpOyAgICAgICAgICAgICAgICAgIC8qd2lsbCBlbmFibGUgdGhlIFJYIGludGVycnVwdCovDQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKSB7DQotCQkJaTJzX0NsZWFuUnhSZXNvdXJjZSh0SWQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCX0gZWxzZSBpZiAocHRJbnN0YW5jZS0+aTJzVHJhbnNNb2RlID09IFRSQU5TX0RNQV9NT0RFKSB7DQotCQlyZXQgKz0gaTJzX0RtYVJ4SW5pdCh0SWQpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCWkyc19DbGVhblJ4UmVzb3VyY2UodElkKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SWF9ETUFfRU4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5hYmxlIGRtYSB0cmFuc2ZlciAqLw0KLQl9DQotDQotCXB0UmVnLT5wcm9jZXNzQ3RybCB8PSBJMlNfUlhfT1BFTjsNCi0JaWYgKHB0SW5zdGFuY2UtPnRDZmcuYk1hc3RlciA9PSBUUlVFKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB3YWl0ICovDQotCQlic3BfdWRlbGF5KEkyU19FTkFCTEVfREVMQVlfVElNRSk7DQotCQl3YWl0VGltZSArPSBJMlNfRU5BQkxFX0RFTEFZX1RJTUU7DQotCQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JfQ0KLQ0KLQlwdEluc3RhbmNlLT5pMnNTdGF0dXMgPSAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cykgPT0gSTJTX1BMQVlfSU5VU0UpID8gSTJTX0JPVEhfSU5VU0UgOiBJMlNfUkVDT1JEX0lOVVNFOw0KLQ0KLQlnSTJzVGltZXMgPSAwOw0KLQlnSTJzRG1hUmVhZEludFRpbWVbdElkXSA9IDA7DQotCWdJMnNDbnRDaGFuZ2VSeFt0SWRdID0gMDsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMgcmVhZCBzdGFydC4NCi0qDQotKiBAcGFyYW0JdElkCSBpMnMgc2VsZXRlIHN0cnVjdA0KLSogQHBhcmFtCXBhcmFtcwkgcG9pbnRlciB0byBUX1pEcnZJMnNfUGFyYW1zDQotKiBAcGFyYW0JcHRDZmcJIHBvaW50ZXIgdG8gVF9aRHJ2STJTX0NmZw0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfUmVhZF9TdGFydChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19SZWFkX1N0YXJ0IFxyXG4iKTsNCi0NCi0JcmV0ID0gekRydkkyU19SZWFkX1ByZXBhcmUodElkLCBwdENmZyk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfU3RhcnQgIHpEcnZJMlNfUmVhZF9QcmVwYXJlIGVycm9yIHJldD0lZCBcclxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JcmV0ID0gekRydkkyU19SZWFkX1N0YXJ0X0RvKHRJZCwgcGFyYW1zKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfUmVhZF9TdGFydCAgekRydkkyU19SZWFkX1N0YXJ0X0RvIGVycm9yIHJldD0lZCBcclxuIiwgcmV0KTsNCi0JCXJldHVybiByZXQ7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglpMnMgdHJhbnMgZGF0YSB0byBmaWZvIGZyb20gcmFtIHdoaWxlIHBsYXlpbmcuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGV0ZSBzdHJ1Y3QNCi0qIEBwYXJhbQlwQnVmCSBvbmUgYnVmZmVyIGlzIGhvdyBtYW55IGJ5dGVzDQotKiBAcGFyYW0JdWlMZW4JIGJ1ZmZlciBsZW5ndGgNCi0qDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1TSU5UMzIgekRydkkyU19Xcml0ZShUX1pEcnZJMlNfSWQgdElkLCBjb25zdCBVSU5UOCAqcEJ1ZiwgVUlOVDMyIHVpTGVuKQ0KLXsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVVJTlQxNiBidWZMZW4gPSAwIDsNCi0JVF9JMnNfUXVldWVOb2RlICpxdWV1ZU5vZGUgPSBOVUxMOw0KLQlVSU5UMTYgKmJ1ZiA9IE5VTEw7DQotCVRfSTJzX1R4U3RyZWFtICppMnNTdHJlYW0gPSBOVUxMOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgSTJTX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKSB7DQotCQlpMnN3cml0ZV90aWQgPSB0SWQ7DQotCQlpMnN3cml0ZV9wYnVmID0gKFVJTlQzMilwQnVmOy8veGl1DQotCQlpMnN3cml0ZV91aWxlbiA9IHVpTGVuOw0KLQl9DQotDQotCWkyc1N0cmVhbSA9ICZzX2kyc1R4U3RyZWFtW3RJZF07DQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgSTJTX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19Xcml0ZSBpbnZhbGlkIHBhcmEgdElkPSVkLHBCdWY9MHglcCx1aUxlbj0lZCBcbiIsIHRJZCwgcEJ1ZiwgdWlMZW4pOw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlpZiAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfUExBWV9JTlVTRSkgJiYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfQk9USF9JTlVTRSkpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlIGkyc1N0YXR1cyBub3Qgc3VwcG9ydCA9JWQgXG4iLCBwdEluc3RhbmNlLT5pMnNTdGF0dXMpOw0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotCX0NCi0NCi0Jek9zc19HZXRNdXRleChwdEluc3RhbmNlLT50eE11dGV4LCBaT1NTX1dBSVRfRk9SRVZFUik7DQotCXJldCA9IGkyc19VcGRhdGVUeEJ1ZmZlclN0YXR1cyh0SWQsIChVSU5UMTYgKilwQnVmLCBCVUZGRVJfRlVMTCk7ICAgICAgLyrJz7LjzfkqcEJ1ZtC0zerK/b7duvOjrLjEseRCVUbXtMyszqpGVUxMKi8NCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfV3JpdGUgaTJzX1VwZGF0ZVR4QnVmZmVyU3RhdHVzIGVyciByZXQ9JWQgXG4iLCByZXQpOw0KLQkJcmV0ID0gIERSVl9FUlJPUjsNCi0JCWdvdG8gZXhpdDsNCi0JfQ0KLQlpMnNTdHJlYW0tPnR4V3JJZHggPSAoaTJzU3RyZWFtLT50eFdySWR4ICsgMSkgJSBJMlNfT1VUX0JVRl9OVU07DQotDQotCWlmICgoc19pMnNUeFN0cmVhbVt0SWRdLnBhdXNlRmxhZyA9PSBGQUxTRSkgJiYgKHNfaTJzVHhTdHJlYW1bdElkXS5UcmFuc2luZyA9PSBGQUxTRSkpIHsNCi0JCWkyc1N0cmVhbS0+VHJhbnNpbmcgPSBUUlVFOw0KLQkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoaTJzRG1hU3RhdGVbdElkXVtJMlNfVFhdLmNoKTsNCi0JCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYgKi8NCi0JfQ0KLQ0KLWV4aXQ6DQotCXpPc3NfUHV0TXV0ZXgocHRJbnN0YW5jZS0+dHhNdXRleCk7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCVRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWFkIGRhdGEgYnkgaTJzLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0JcEJ1Zgkgb25lIGJ1ZmZlciBpcyBob3cgbWFueSBieXRlcw0KLSogQHBhcmFtCXVpTGVuCSBidWZmZXIgbGVuZ3RoDQotKg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfUmVhZChUX1pEcnZJMlNfSWQgdElkLCBVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9JMnNfUXVldWVOb2RlICpxdWV1ZU5vZGUgPSBOVUxMOw0KLQlUX0kyc19SeFN0cmVhbSAqaTJzU3RyZWFtID0gTlVMTDsNCi0NCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5iovDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCB8fCBOVUxMID09IHBCdWYgfHwgTlVMTCA9PSB1aUxlbikgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfUmVhZCBpbnZhbGlkIHBhcmEgdElkPSVkLHBCdWY9MHglcCx1aUxlbj0lcCBcbiIsIHRJZCwgcEJ1ZiwgdWlMZW4pOw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotCWkyc1N0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlpZiAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfUkVDT1JEX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSkgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfUmVhZCBpMnNTdGF0dXMgbm90IHN1cHBvcnQgPSVkIFxuIiwgcHRJbnN0YW5jZS0+aTJzU3RhdHVzKTsNCi0JCXJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLQl9DQotDQotCWlmIChaT1NTX1NVQ0NFU1MgIT0gek9zc19HZXRTZW1hcGhvcmUoc19pMnNSeFN0cmVhbVt0SWRdLnJ4U2VtLCBaT1NTX1dBSVRfRk9SRVZFUikpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWQgek9zc19HZXRTZW1hcGhvcmUgZXJyb3IiKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0Jek9zc19HZXRNdXRleChwdEluc3RhbmNlLT5yeE11dGV4LCBaT1NTX1dBSVRfRk9SRVZFUik7DQotDQotCSpwQnVmID0gaTJzU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2kyc1N0cmVhbS0+cnhSZElkeF0uYnVmOw0KLQkqdWlMZW4gPSBpMnNTdHJlYW0tPnJ4TGVuOw0KLQlpMnNfVXBkYXRlUnhCdWZmZXJTdGF0dXModElkLCAoVUlOVDE2ICopaTJzU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2kyc1N0cmVhbS0+cnhSZElkeF0uYnVmLCBCVUZGRVJfUkVBRCk7DQotDQotI2lmIDANCi0JcmV0ID0gaTJzX1F1ZXVlR2V0KCYoc19pMnNSeFN0cmVhbVt0SWRdLnJ4UXVldWUpLCAmcXVldWVOb2RlKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfUmVhZCBpMnNfUXVldWVHZXQgZXJyb3IiKTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXhpdDsNCi0JfQ0KLQ0KLQlpZiAoTlVMTCAhPSBxdWV1ZU5vZGUpIHsNCi0JCSpwQnVmID0gKFVJTlQ4ICopcXVldWVOb2RlLT5wQnVmOw0KLQkJKnVpTGVuID0gcXVldWVOb2RlLT5sZW4gKiBzaXplb2YoVUlOVDE2KTsNCi0JCXJldCA9IGkyc19VcGRhdGVSeEJ1ZmZlclN0YXR1cyh0SWQsIHF1ZXVlTm9kZS0+cEJ1ZiwgQlVGRkVSX1JFQUQpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWQgaTJzX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzIGVycm9yIik7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXhpdDsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWQgcXVldWVOb2RlPT1OVUxMIGVycm9yIik7DQotCQlyZXQgPSBEUlZfRVJST1I7DQotCQlnb3RvIGV4aXQ7DQotCX0NCi0jZW5kaWYNCi1leGl0Og0KLQl6T3NzX1B1dE11dGV4KHB0SW5zdGFuY2UtPnJ4TXV0ZXgpOw0KLQlyZXR1cm4gcmV0Ow0KLQ0KLX0NCi0NCi0vKioNCi0qIEBicmllZiAJaTJzIHdyaXRlIHN0b3AgLHVzZSB0byBzdG9wIHBsYXlpbmcgb3IgcmVjb3JkaW5nLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfV3JpdGVfU3RvcChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlVSU5UMzIgcmVnVmFsID0gMCwgY291bnQgPSA5Ow0KLQlUX0kyc19UeFN0cmVhbSAqdHhTdHJlYW0gPSBOVUxMOw0KLQ0KLQlpZiAoTUFYX0kyU19JRCA8PSB0SWQpIHsgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggILDRYXNzZXJ00sa1vWlmwO/D5iovDQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JdHhTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVt0SWRdOw0KLQlwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0NCi0JaWYgKChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX1BMQVlfSU5VU0UpICYmIChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX0JPVEhfSU5VU0UpKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfU1RBUlRFRDsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyA9PSAxKSB7DQotCQl3aGlsZSAoY291bnQtLSkgew0KLQkJCXJlZ1ZhbCA9IHB0UmVnLT5maWZvU3RhdHVzOw0KLQkJCWlmICgoKHJlZ1ZhbCA+PiA4KSAmIDB4N2YpID09IDB4MjApDQotCQkJCWJyZWFrOw0KLQkJCXpPc3NfU2xlZXAoMSk7DQotCQl9DQotCX0NCi0NCi0JcHRSZWctPnByb2Nlc3NDdHJsICY9IH5JMlNfVFhfT1BFTjsgICAgICAgICAgICAgICAgLypkaXNhYmxlIHR4IG9ubHkgKi8NCi0JaWYgKHB0SW5zdGFuY2UtPmkyc1RyYW5zTW9kZSA9PSBUUkFOU19ETUFfTU9ERSkgew0KLQkJcHRSZWctPmZpZm9DdHJsICY9IH5JMlNfVFhfRE1BX0VOOw0KLQkJZG1hX3JlbGVhc2VfY2hhbm5lbChpMnNEbWFTdGF0ZVt0SWRdW0kyU19UWF0uY2gpOw0KLQl9DQotI2lmZGVmIF9VU0VfQVVESU9fT05fNzUyMFYyDQotCS8qIHJlc2V0IHR4IGZpZm8gKi8NCi0JcHRSZWctPmZpZm9DdHJsIHw9IEkyU19UWF9GSUZPX1JTVDsNCi0jZW5kaWYNCi0JcHRSZWctPmludFN0YXR1cyB8PSBJMlNfVFhfVFJJR19JTlQ7DQotCXB0UmVnLT5pbnRFbiAmPSB+STJTX1RYX1RSSUdfSU5UX0VOOyAgICAgICAvKiBkaXNhYmxlIHR4IGludGVycnVwdCAqLw0KLQ0KLQl6T3NzX0dldE11dGV4KHB0SW5zdGFuY2UtPnR4TXV0ZXgsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0NCi0JaTJzX0NsZWFuVHhSZXNvdXJjZSh0SWQpOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JLyppZihyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JfSovDQotCXpPc3NfUHV0TXV0ZXgocHRJbnN0YW5jZS0+dHhNdXRleCk7DQotDQotCXR4U3RyZWFtLT50eFRyYW5zbWl0ID0gTlVMTDsNCi0JdHhTdHJlYW0tPmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCXR4U3RyZWFtLT50eExlbiA9IDA7DQotCXR4U3RyZWFtLT5wX2NiID0gTlVMTDsNCi0NCi0JaWYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfQk9USF9JTlVTRSkgew0KLQkJcHRJbnN0YW5jZS0+aTJzU3RhdHVzID0gSTJTX09QRU47DQotCX0gZWxzZSB7DQotCQlwdEluc3RhbmNlLT5pMnNTdGF0dXMgPSBJMlNfUkVDT1JEX0lOVVNFOw0KLQl9DQotDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmIGkycyByZWFkIHN0b3AgLHVzZSB0byBzdG9wIHBsYXlpbmcgb3IgcmVjb3JkaW5nLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKg0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotU0lOVDMyIHpEcnZJMlNfUmVhZF9TdG9wKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCVRfSTJzX1JlZyAqcHRSZWcgPSBOVUxMOw0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmIChNQVhfSTJTX0lEIDw9IHRJZCkgeyAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmKi8NCi0JCXpEcnZfQVNTRVJUKDApOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQlwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0JaWYgKChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX1JFQ09SRF9JTlVTRSkgJiYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfQk9USF9JTlVTRSkpIHsNCi0JCXJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLQl9DQotDQotCXB0UmVnLT5wcm9jZXNzQ3RybCAmPSB+STJTX1JYX09QRU47ICAgICAgICAgICAgICAgIC8qZGlzYWJsZSB0eCBvbmx5ICovDQotDQotCWlmIChwdEluc3RhbmNlLT5pMnNUcmFuc01vZGUgPT0gVFJBTlNfRE1BX01PREUpIHsNCi0JCXB0UmVnLT5maWZvQ3RybCAmPSB+STJTX1JYX0RNQV9FTjA7DQotCQlkbWFfcmVsZWFzZV9jaGFubmVsKGkyc0RtYVN0YXRlW3RJZF1bSTJTX1JYXS5jaCk7DQotCX0NCi0jaWZkZWYgX1VTRV9BVURJT19PTl83NTIwVjINCi0JcHRSZWctPmZpZm9DdHJsIHw9IEkyU19SWF9GSUZPX1JTVDsgICAgLyogcmVzZXQgdHgvcnggZmlmbyAqLw0KLSNlbmRpZg0KLQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9UUklHX0lOVDsNCi0JcHRSZWctPmludEVuICY9IH5JMlNfUlhfVFJJR19JTlRfRU47ICAgICAgIC8qIGRpc2FibGUgdHggaW50ZXJydXB0ICovDQotDQotCXpPc3NfR2V0TXV0ZXgocHRJbnN0YW5jZS0+cnhNdXRleCwgWk9TU19XQUlUX0ZPUkVWRVIpOw0KLQ0KLQlyZXQgPSBpMnNfQ2xlYW5SeFJlc291cmNlKHRJZCk7DQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkvKg0KLQlpZihyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JfSovDQotCXpPc3NfUHV0TXV0ZXgocHRJbnN0YW5jZS0+cnhNdXRleCk7DQotDQotCWlmIChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX0JPVEhfSU5VU0UpIHsNCi0JCXB0SW5zdGFuY2UtPmkyc1N0YXR1cyA9IEkyU19PUEVOOw0KLQl9IGVsc2Ugew0KLQkJcHRJbnN0YW5jZS0+aTJzU3RhdHVzID0gSTJTX1BMQVlfSU5VU0U7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotLyoqDQotKiBAYnJpZWYgIAlpMnMgZ2V0IGJ1ZmZlciAsZ2V0IGJ1ZmZlciB0byB3cml0ZSBwbGF5aW5nIGRhdGEuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEBwYXJhbQlwQnVmCSBwbGF5aW5nIGRhdGEgYnVmZmVyDQotKiBAcGFyYW0JdWlMZW4JIGJ1ZmZlciBsZW5ndGgNCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX0dldEJ1ZihUX1pEcnZJMlNfSWQgdElkLCBVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQlVSU5UOCB0eEluZGV4ID0gMDsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19UeFN0cmVhbSAqaTJzU3RyZWFtID0gTlVMTDsNCi0NCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgsNFhc3NlcnTSxrW9aWbA78PmKi8NCi0JaWYgKChOVUxMID09IHBCdWYpIHx8IChOVUxMID09IHVpTGVuKSB8fCAodElkID49IE1BWF9JMlNfSUQpKSB7DQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaTJzU3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotDQotCWlmICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotCX0NCi0NCi0JaWYgKFpPU1NfU1VDQ0VTUyAhPSB6T3NzX0dldFNlbWFwaG9yZShpMnNTdHJlYW0tPnR4U2VtLCBJMlNfU0VNX1dBSVRfVElNRSkpIHsgIC8qY2hhbmdlZCBieSBkYW5ncGVpeGlhWzIwMTAuOS4yMF0qLw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfR2V0QnVmIHpPc3NfR2V0U2VtYXBob3JlIGVyciFcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQl6T3NzX0dldE11dGV4KHB0SW5zdGFuY2UtPnR4TXV0ZXgsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0JaWYgKGkyc1N0cmVhbS0+dHhCdWZmZXJBcnJheSA9PSBOVUxMKSB7DQotCQlyZXQgPSBEUlZfRVJST1I7LyogIL3ivvZQU7X3wctTVE9QuvNMVEW8zND40LTK/b7dt8POyr/V1rjV68vAu/ogKi8NCi0JCWdvdG8gZXhpdDsNCi0JfQ0KLQ0KLQl0eEluZGV4ID0gaTJzU3RyZWFtLT50eFdySWR4Ow0KLQ0KLQkqcEJ1ZiA9IGkyc1N0cmVhbS0+dHhCdWZmZXJBcnJheVt0eEluZGV4XS5idWY7DQotCSp1aUxlbiA9IGkyc1N0cmVhbS0+dHhMZW47DQotCWkyc1N0cmVhbS0+dHhCdWZmZXJBcnJheVt0eEluZGV4XS5pMnNCdWZTdGF0dXMgPSBCVUZGRVJfV1JJVEU7DQotDQotZXhpdDoNCi0Jek9zc19QdXRNdXRleChwdEluc3RhbmNlLT50eE11dGV4KTsNCi0JcmV0dXJuIHJldDsNCi19DQotDQotI2lmIDANCi0vKioNCi0qIEBicmllZiAJaTJzIGJvdGggc3RvcCAsZ2lmIGNvcHlpbmcgcmVjb3JkIGRhdGEgZW5kLCBmcmVlIGJ1ZmZlciB0byBjb250aW51ZSByZWNvcmQuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX0JvdGhfU3RvcChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQlUX0kyc19SZWcgKnB0UmVnID0gTlVMTDsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2X0FTU0VSVCh0SWQgPCBNQVhfSTJTX0lEKTsNCi0JaWYgKE1BWF9JMlNfSUQgPD0gdElkKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlwdFJlZyA9IHB0SW5zdGFuY2UtPnB0RGV2LT5yZWdzOw0KLQlpZiAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfUkVDT1JEX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotCX0NCi0JcHRSZWctPnByb2Nlc3NDdHJsICY9IH4oSTJTX1RYX09QRU4gfCBJMlNfUlhfT1BFTik7ICAgICAgICAgICAgICAgICAvKmRpc2FibGUgSTJTICxUeCAsUlggKi8NCi0JaWYgKHB0SW5zdGFuY2UtPmkyc1RyYW5zTW9kZSA9PSBUUkFOU19ETUFfTU9ERSkgew0KLQkJcHRSZWctPmZpZm9DdHJsICY9IH4oSTJTX1JYX0RNQV9FTjAgfCBJMlNfVFhfRE1BX0VOKTsNCi0JfQ0KLSNpZmRlZiBfVVNFX0FVRElPX09OXzc1MjBWMg0KLQlwdFJlZy0+Zmlmb0N0cmwgfD0gSTJTX1JYX0ZJRk9fUlNUIHwgSTJTX1RYX0ZJRk9fUlNUOyAgLyogcmVzZXQgdHgvcnggZmlmbyAqLw0KLSNlbmRpZg0KLQlwdFJlZy0+aW50U3RhdHVzIHw9IEkyU19SWF9UUklHX0lOVCB8IEkyU19UWF9UUklHX0lOVDsNCi0JcHRSZWctPmludEVuICY9IH4oSTJTX1JYX1RSSUdfSU5UX0VOIHwgSTJTX1RYX1RSSUdfSU5UX0VOKTsgICAgICAvKiBkaXNhYmxlIHR4IGludGVycnVwdCAqLw0KLQlwdFJlZy0+cHJvY2Vzc0N0cmwgJj0gfkkyU19FTjsgICAgICAgICAgICAgICAgLypkaXNhYmxlIEkyUyAsVHggLFJYICovDQotDQotCXJldCA9IGkyc19DbGVhblJ4UmVzb3VyY2UodElkKTsNCi0JcmV0ICs9IGkyc19DbGVhblR4UmVzb3VyY2UodElkKTsNCi0NCi0JcHRJbnN0YW5jZS0+aTJzU3RhdHVzID0gSTJTX09QRU47DQotDQotCXJldHVybiByZXQ7DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSogQGJyaWVmIAlpMnMgZnJlZSBidWZmZXIgLGdldCBidWZmZXIgdG8gd3JpdGUgcGxheWluZyBkYXRhLg0KLSoNCi0qIEBwYXJhbQl0SWQgIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0JcEJ1ZgkgZGF0YSBidWZmZXINCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX0ZyZWVCdWYoVF9aRHJ2STJTX0lkIHRJZCwgVUlOVDggKnBCdWYpDQotew0KLQlTSU5UMzIgaSA9IDA7DQotCVRfSTJzX0luc3RhbmNlICpwdEluc3RhbmNlID0gTlVMTDsNCi0JVF9JMnNfUnhTdHJlYW0gKmkyc1N0cmVhbSA9IE5VTEw7DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JaWYgKChVSU5UOCAqKU5VTEwgPT0gcEJ1ZiB8fCB0SWQgPj0gTUFYX0kyU19JRCkgeyAvL3hpdQ0KLQkJZnJlZWJ1ZmZlcmFkZCA9IChVSU5UMzIpcEJ1ZjsvL3hpdQ0KLQkJZnJlZWJ1ZmZlcnRpZCA9IHRJZDsNCi0JfQ0KLQ0KLQlpZiAoTlVMTCA9PSBwQnVmIHx8IHRJZCA+PSBNQVhfSTJTX0lEKSB7IC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICCw0WFzc2VydNLGtb1pZsDvw+YqLw0KLQkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCWkyc1N0cmVhbSA9ICZzX2kyc1J4U3RyZWFtW3RJZF07DQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQ0KLQlpZiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19SRUNPUkRfSU5VU0UgJiYgcHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSB7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfU1RBUlRFRDsNCi0JfQ0KLQ0KLQ0KLQl6T3NzX0dldE11dGV4KHB0SW5zdGFuY2UtPnJ4TXV0ZXgsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0JaTJzX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzKHRJZCwgKFVJTlQxNiAqKWkyc1N0cmVhbS0+cnhCdWZmZXJBcnJheVtpMnNTdHJlYW0tPnJ4UmRJZHhdLmJ1ZiwgQlVGRkVSX05VTEwpOw0KLQlpMnNTdHJlYW0tPnJ4UmRJZHggPSAoaTJzU3RyZWFtLT5yeFJkSWR4ICsgMSkgJSBJMlNfT1VUX0JVRl9OVU0gOw0KLQ0KLSNpZiAwDQotCWlmIChpMnNTdHJlYW0tPnJ4QnVmZmVyQXJyYXkgPT0gTlVMTCkgew0KLQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJZ290byBleGl0Ow0KLQl9DQotCXdoaWxlIChpIDwgSTJTX09VVF9CVUZfTlVNKSB7DQotCQlpZiAoaTJzU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2ldLmJ1ZiA9PSBwQnVmKSB7DQotCQkJaTJzU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2ldLmkyc0J1ZlN0YXR1cyA9IEJVRkZFUl9OVUxMOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJaSsrOw0KLQl9DQotDQotCWlmIChpID09IEkyU19PVVRfQlVGX05VTSkgew0KLQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJZ290byBleGl0Ow0KLQl9DQotI2VuZGlmDQotZXhpdDoNCi0Jek9zc19QdXRNdXRleChwdEluc3RhbmNlLT5yeE11dGV4KTsNCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotI2lmIDANCi0vKioNCi0qIEBicmllZglpMnMgZnJlZSBidWZmZXIgLGdldCBidWZmZXIgdG8gd3JpdGUgcGxheWluZyBkYXRhLg0KLSoNCi0qIEBwYXJhbQl0SWQgIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcGFyYW0JcEJ1ZgkgZGF0YSBidWZmZXINCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVNJTlQzMiB6RHJ2STJTX0dldFJlbWFpbmVkKFRfWkRydkkyU19JZCB0SWQsIFVJTlQzMiAqbGVuKQ0KLXsNCi0JVF9JMnNfUXVldWUgKmkyc1F1ZXVlID0gJihzX2kyc1R4U3RyZWFtW3RJZF0udHhRdWV1ZSk7DQotCVVJTlQ4IGluZGV4ID0gMDsNCi0JVUlOVDMyIHVpTGVuID0gMDsNCi0JVF9JMnNfSW5zdGFuY2UgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQ0KLQl6RHJ2X0FTU0VSVCgobGVuICE9IE5VTEwpICYmICh0SWQgPCBNQVhfSTJTX0lEKSk7DQotCWlmICgoTlVMTCA9PSBsZW4pIHx8ICh0SWQgPj0gTUFYX0kyU19JRCkpIHsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0JcHRJbnN0YW5jZSA9ICZzX2kyc0luc3RhbmNlW3RJZF07DQotCWlmICgocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19QTEFZX0lOVVNFKSAmJiAocHRJbnN0YW5jZS0+aTJzU3RhdHVzICE9IEkyU19CT1RIX0lOVVNFKSkgew0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotCX0NCi0NCi0JaW5kZXggPSBpMnNRdWV1ZS0+cmVhZEluZGV4Ow0KLQl3aGlsZSAoaW5kZXggIT0gaTJzUXVldWUtPndyaXRlSW5kZXgpIHsNCi0JCXVpTGVuICs9IGkyc1F1ZXVlLT5kYXRhW2luZGV4XS5sZW47DQotCQlpbmRleCA9IChpbmRleCArIDEpICUgSTJTX1FVRVVFX1NJWkU7DQotCX0NCi0NCi0JKmxlbiA9IHVpTGVuICogc2l6ZW9mKFVJTlQxNik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJcGF1c2Ugd2hpbGUgcGxheWluZy4NCi0qDQotKiBAcGFyYW0JdElkCSBpMnMgc2VsZWN0IGkyczAgb3IgaTJzMQ0KLSogQHJldHVybgkwLURSVl9TVUNDRVNTLCBvdGhlci1lcnJvcg0KLSovDQotVk9JRCB6RHJ2STJTX1BhdXNlKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCXpEcnZfQVNTRVJUKHRJZCA8IE1BWF9JMlNfSUQpOw0KLQlpZiAodElkID49IE1BWF9JMlNfSUQpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQlwdEluc3RhbmNlID0gJnNfaTJzSW5zdGFuY2VbdElkXTsNCi0JaWYgKChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX1BMQVlfSU5VU0UpICYmIChwdEluc3RhbmNlLT5pMnNTdGF0dXMgIT0gSTJTX0JPVEhfSU5VU0UpKSB7DQotCQlyZXR1cm47DQotCX0NCi0NCi0Jc19pMnNUeFN0cmVhbVt0SWRdLnBhdXNlRmxhZyA9IFRSVUU7DQotfQ0KLQ0KLS8qKg0KLSogQGJyaWVmCXJlc3VtZSBwbGF5aW5nIGlmIHBhdXNlLg0KLSoNCi0qIEBwYXJhbQl0SWQJIGkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1WT0lEIHpEcnZJMlNfUmVzdW1lKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19JbnN0YW5jZSAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCVRfSTJzX1R4U3RyZWFtICppMnNTdHJlYW0gPSAmc19pMnNUeFN0cmVhbVt0SWRdOw0KLQlUX0kyc19RdWV1ZU5vZGUgKnF1ZXVlTm9kZSA9IE5VTEw7DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JekRydl9BU1NFUlQodElkIDwgTUFYX0kyU19JRCk7DQotCWlmICh0SWQgPj0gTUFYX0kyU19JRCkgew0KLQkJcmV0dXJuOw0KLQl9DQotDQotCXB0SW5zdGFuY2UgPSAmc19pMnNJbnN0YW5jZVt0SWRdOw0KLQlpZiAoKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfUExBWV9JTlVTRSkgJiYgKHB0SW5zdGFuY2UtPmkyc1N0YXR1cyAhPSBJMlNfQk9USF9JTlVTRSkpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQlyZXQgPSBpMnNfUXVldWVHZXQoJihpMnNTdHJlYW0tPnR4UXVldWUpLCAmcXVldWVOb2RlKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykgew0KLQkJcmV0dXJuOw0KLQl9DQotDQotCWlmIChxdWV1ZU5vZGUgIT0gTlVMTCkgew0KLQkJaTJzU3RyZWFtLT5UcmFuc2luZyA9IFRSVUU7DQotCQlpMnNfVXBkYXRlVHhCdWZmZXJTdGF0dXModElkLCBxdWV1ZU5vZGUtPnBCdWYsIEJVRkZFUl9SRUFEKTsNCi0JCXJldCA9IGkyc1N0cmVhbS0+dHhUcmFuc21pdCh0SWQsIHF1ZXVlTm9kZS0+cEJ1ZiwgcXVldWVOb2RlLT5sZW4pOw0KLQl9DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQlpMnNTdHJlYW0tPnBhdXNlRmxhZyA9IEZBTFNFOw0KLQ0KLQlyZXR1cm47DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKg0KLSogQGJyaWVmCVJlbGVhc2UgdGhlIHJ4IHNlbWFwaG9yZSBiZWZvcmUgc3RvcC4NCi0qDQotKiBAcGFyYW0JdElkCQkJaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVZPSUQgekRydkkyc19SeFJsc1NlbWFCZWZvcmVTdG9wKFRfWkRydkkyU19JZCB0SWQpDQotew0KLQlUX0kyc19SeFN0cmVhbSAqaTJzUnhTdHJlYW0gPSAmc19pMnNSeFN0cmVhbVt0SWRdOw0KLQl6T3NzX1B1dFNlbWFwaG9yZShpMnNSeFN0cmVhbS0+cnhTZW0pOw0KLX0NCi0NCi0vKioNCi0qIEBicmllZglSZWxlYXNlIHRoZSB0eCBzZW1hcGhvcmUgYmVmb3JlIHN0b3AuDQotKg0KLSogQHBhcmFtCXRJZAkJCWkycyBzZWxlY3QgaTJzMCBvciBpMnMxDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1WT0lEIHpEcnZJMnNfVHhSbHNTZW1hQmVmb3JlU3RvcChUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JVF9JMnNfVHhTdHJlYW0gKmkyc1R4U3RyZWFtID0gJnNfaTJzVHhTdHJlYW1bdElkXTsNCi0Jek9zc19QdXRTZW1hcGhvcmUoaTJzVHhTdHJlYW0tPnR4U2VtKTsNCi19DQotDQotLyoqDQotKiBAYnJpZWYJc2V0IHRvcCBpMnMgY29uZmlnLg0KLSoNCi0qIEBwYXJhbQlWT0lEDQotKiBAcmV0dXJuCTAtRFJWX1NVQ0NFU1MsIG90aGVyLWVycm9yDQotKi8NCi1WT0lEIHZwX1NldFRvcEkyc0NvbmZpZyhWT0lEKQ0KLXsNCi0jaWYgMA0KLQlVSU5UMzIgQW1yUmVnQml0ID0gMDsNCi0JaW50IHJldDsNCi0jaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMg0KLSNpZmRlZiBUT1BfSTJTMF9QSU5fQ09OTkVDVA0KLQkvKmkyczAgcGluIGNmZyovDQotCWF1ZGlvR3Bpb1dzSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMF93cyIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpb1dzSGFuZGxlLCBHUElPMzhfSTJTMF9XUyk7DQotCWF1ZGlvR3Bpb0Nsa0hhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczBfY2xrIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvQ2xrSGFuZGxlLCBHUElPMzlfSTJTMF9DTEspOw0KLQlhdWRpb0dwaW9EaW5IYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJpMnMwX2RpbiIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpb0RpbkhhbmRsZSwgR1BJTzQwX0kyUzBfRElOKTsNCi0JYXVkaW9HcGlvRG91dEhhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczBfZG91dCIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvR3Bpb0RvdXRIYW5kbGUsIEdQSU80MV9JMlMwX0RPVVQpOw0KLSNlbHNlDQotCS8qaTJzMSBwaW4gY2ZnKi8NCi0JYXVkaW9HcGlvV3NIYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJpMnMxX3dzIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvV3NIYW5kbGUsIEdQSU80Ml9JMlMxX1dTKTsNCi0JYXVkaW9HcGlvQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMV9jbGsiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb0dwaW9DbGtIYW5kbGUsIEdQSU80M19JMlMxX0NMSyk7DQotCWF1ZGlvR3Bpb0RpbkhhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczFfZGluIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvRGluSGFuZGxlLCBHUElPNDRfSTJTMV9ESU4pOw0KLQlhdWRpb0dwaW9Eb3V0SGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMV9kb3V0Iik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9HcGlvRG91dEhhbmRsZSwgR1BJTzQ1X0kyUzFfRE9VVCk7DQotI2VuZGlmDQotI2VsaWYgZGVmaW5lZCBfVVNFX0FVRElPX09OXzc1MjBWMw0KLQlyZXQgPSBncGlvX3JlcXVlc3QoUElOX0kyUzBfV1MsICJpMnMwX3dzIik7DQotCWlmIChyZXQgPCAwKQ0KLQkJQlVHKCk7DQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fSTJTMF9DTEssICJpMnMwX2NsayIpOw0KLQlpZiAocmV0IDwgMCkNCi0JCUJVRygpOw0KLQlyZXQgPSBncGlvX3JlcXVlc3QoUElOX0kyUzBfRElOLCAiaTJzMF9kaW4iKTsNCi0JaWYgKHJldCA8IDApDQotCQlCVUcoKTsNCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KFBJTl9JMlMwX0RPVVQsICJpMnMwX2RvdXQiKTsNCi0JaWYgKHJldCA8IDApDQotCQlCVUcoKTsNCi0JengyOV9ncGlvX2NvbmZpZyhQSU5fSTJTMF9XUywgRlVOX0kyUzBfV1MpOw0KLQl6eDI5X2dwaW9fY29uZmlnKFBJTl9JMlMwX0NMSywgRlVOX0kyUzBfQ0xLKTsNCi0JengyOV9ncGlvX2NvbmZpZyhQSU5fSTJTMF9ESU4sIEZVTl9JMlMwX0RJTik7DQotCXp4MjlfZ3Bpb19jb25maWcoUElOX0kyUzBfRE9VVCwgRlVOX0kyUzBfRE9VVCk7DQotDQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fSTJTMV9XUywgImkyczFfd3MiKTsNCi0JaWYgKHJldCA8IDApDQotCQlCVUcoKTsNCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KFBJTl9JMlMxX0NMSywgImkyczFfY2xrIik7DQotCWlmIChyZXQgPCAwKQ0KLQkJQlVHKCk7DQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fSTJTMV9ESU4sICJpMnMxX2RpbiIpOw0KLQlpZiAocmV0IDwgMCkNCi0JCUJVRygpOw0KLQlyZXQgPSBncGlvX3JlcXVlc3QoUElOX0kyUzFfRE9VVCwgImkyczFfZG91dCIpOw0KLQlpZiAocmV0IDwgMCkNCi0JCUJVRygpOw0KLQl6eDI5X2dwaW9fY29uZmlnKFBJTl9JMlMxX1dTLCBGVU5fSTJTMV9XUyk7DQotCXp4MjlfZ3Bpb19jb25maWcoUElOX0kyUzFfQ0xLLCBGVU5fSTJTMV9DTEspOw0KLQl6eDI5X2dwaW9fY29uZmlnKFBJTl9JMlMxX0RJTiwgRlVOX0kyUzFfRElOKTsNCi0JengyOV9ncGlvX2NvbmZpZyhQSU5fSTJTMV9ET1VULCBGVU5fSTJTMV9ET1VUKTsNCi0jZW5kaWYNCi0NCi0JLyogdG9wIGkyczEobm8gaTJzMiljZmcgKi8NCi0JQW1yUmVnQml0ID0gQVJNX0kyU19MT09QX0NGRzsNCi0jaWZkZWYgVE9QX0kyUzBfUElOX0NPTk5FQ1QNCi0JLyppMnMwIHBpbiBjZmcqLw0KLQlBbXJSZWdCaXQgJj0gMHhmZmZmZmZmODsNCi0JQW1yUmVnQml0IHw9IDB4MDAwMDAwMDE7IC8qIGludGVyIGFybV9pMnMxLS10b3AgaTJzMSAqLw0KLSNlbHNlDQotCS8qaTJzMSBwaW4gY2ZnKi8NCi0JQW1yUmVnQml0ICY9IDB4ZmZmOGZmZmY7DQotCUFtclJlZ0JpdCB8PSAweDAwMDEwMDAwOyAvKiBpbnRlciBhcm1faTJzMS0tdG9wIGkyczIgKi8NCi0jZW5kaWYNCi0JLyogaW50ZXIgbG9vcCAqLw0KLQlBbXJSZWdCaXQgJj0gMHhmZmZmZmUwNzsNCi0JQW1yUmVnQml0IHw9IDB4MDAwMDAwYTg7IC8qIDB4MDAwMDAwYTggbG9vcCBkc3AgYWZlKGxvb3AgaTJzMSktLWFybSBpMnMyKGxvb3AgaTJzMikgMHgwMDAwMDE1MCBsb29wIGRzcCBhcm0obG9vcCBpMnMxKS0tYWZlIGkyczIobG9vcCBpMnMyKSovDQotDQotCUFSTV9JMlNfTE9PUF9DRkcgPSBBbXJSZWdCaXQ7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9TZXRUb3BJMnNDb25maWcgQVJNX0kyU19MT09QX0NGRz0weCV4XG4iLCBBUk1fSTJTX0xPT1BfQ0ZHKTsNCi0jZW5kaWYNCi19DQotDQotLyoqDQotKiBAYnJpZWYJZ2V0IGkycyBzdGF0dXMuDQotKg0KLSogQHBhcmFtCXRJZAkgaTJzIHNlbGVjdCBpMnMwIG9yIGkyczENCi0qIEByZXR1cm4JMC1EUlZfU1VDQ0VTUywgb3RoZXItZXJyb3INCi0qLw0KLVRfSTJzX1N0YXR1cyB6RHJ2STJzX0dldEkyc1N0YXR1cyhUX1pEcnZJMlNfSWQgdElkKQ0KLXsNCi0JcmV0dXJuIChzX2kyc0luc3RhbmNlW3RJZF0uaTJzU3RhdHVzKTsNCi19DQotc3RhdGljIGludCBfX2luaXQgaTJzX2luaXQodm9pZCkNCi17DQotLy8JcHJpbnRrKCJpMnNfaW5pdCByZWdpc3RlclxuIik7DQotCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmkyc19kZXZpY2UpOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBfX2V4aXQgaTJzX2V4aXQodm9pZCkNCi17DQotLy8JcHJpbnRrKCJpMnNfZXhpdCB1bnJlZ2lzdGVyXG4iKTsNCi0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmkyc19kZXZpY2UpOw0KLX0NCi0NCi1tb2R1bGVfaW5pdChpMnNfaW5pdCk7DQotbW9kdWxlX2V4aXQoaTJzX2V4aXQpOw0KLQ0KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvaW5jbHVkZS9oYWxfdm9pY2Vwcm9jZXNzLmggYi9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL2luY2x1ZGUvaGFsX3ZvaWNlcHJvY2Vzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNzEyOTdkLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvaW5jbHVkZS9oYWxfdm9pY2Vwcm9jZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIENvcHlyaWdodCAyMDA3IGJ5ICBaVEUgQ29ycG9yYXRpb24uDQotICoNCi0gKiBGaWxlTmFtZTo6ICAgIGhhbF92b2ljZXByb2Nlc3MuaA0KLSAqIEZpbGUgTWFyazoNCi0qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBpbnRlcmZhY2UgZm9yIHRvdWNoIHNjcmVlbiBkcml2ZXINCi0qIE90aGVyczoNCi0qIFZlcnNpb246ICAJDQotKiBBdXRob3I6ICAJeHV4aW5xaWFuZw0KLSogRGF0ZTogIAkyMDE1LTA4LTI5DQotDQotKiBIaXN0b3J5IDE6DQotKiAgICAgRGF0ZToNCi0qICAgICBWZXJzaW9uOg0KLSogICAgIEF1dGhvcjoNCi0qICAgICBNb2RpZmljYXRpb246DQotKiBIaXN0b3J5IDI6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZuZGVmIF9IQUxfVk9JQ0VQUk9DRVNTX0gNCi0jZGVmaW5lIF9IQUxfVk9JQ0VQUk9DRVNTX0gNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWYgMA0KLSNkZWZpbmUgVk9JQ0VfVE9ORV9NSVhFUl9GVU5DVElPTiANCi0vLyNkZWZpbmUgVEVTVF9XSElURV9OT0lTRQ0KLQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBDb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBWYXJpYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIGVudW0NCi17DQotICAgIFZQX0kyU19JRExFID0gMCwNCi0gICAgVlBfSTJTX09QRU4sDQotICAgIFZQX0kyU19JTlVTRSwNCi0gICAgVlBfTE9PUF9PTg0KLX0NCi1UX1ZwX0kyc1N0YXR1czsNCi0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLSNlbmRpZiAvKl9IQUxfVk9JQ0VQUk9DRVNTX0gqLw0KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvdGRtL2hhbF90ZG0uYyBiL1Vib290L2NwL3BzL2RyaXZlci9zcmMvY2hpcHNldHMvc3JjL2F1ZGlvX2Jhc2UvdGRtL2hhbF90ZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIyYWVhNC4uMDAwMDAwMAotLS0gYS9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL3RkbS9oYWxfdGRtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogQ29weXJpZ2h0IChDKSAyMDE2LCBaVEUgQ29ycG9yYXRpb24uDQotKg0KLSogRmlsZSBOYW1lOiAgICBoYWxfdGRtLmMNCi0qIEZpbGUgTWFyazoNCi0qIERlc2NyaXB0aW9uOiAgdGRtIHJlYWxpemF0aW9uLg0KLSogT3RoZXJzOg0KLSogVmVyc2lvbjogIHYxLjANCi0qIEF1dGhvcjogICBkYWl4dW5rYW5nDQotKiBEYXRlOiAgICAgIDIwMTgtMDItMjYNCi0qDQotDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgX09TX09TRQ0KLSNpbmNsdWRlICJvdXRmbXQuaCINCi0jaW5jbHVkZSAib3NlLmgiDQotI2luY2x1ZGUgImNwdS5oIg0KLSNpbmNsdWRlICJkZGFfcGNpLmgiDQotI2luY2x1ZGUgImRkYV91dGlscy5oIg0KLSNpbmNsdWRlICJkZGFfZXJyLmgiDQotI2luY2x1ZGUgImRkYV9kcm0uaCINCi0jaW5jbHVkZSAiZGRhX3N0cmluZ3MuaCINCi0jaW5jbHVkZSAiZGV2aWNlLnNpZyINCi0jaW5jbHVkZSAiaW5wdXRkZXYuc2lnIg0KLSNpbmNsdWRlICJyYW1sb2cuaCINCi0jaW5jbHVkZSAib3NlX3N5bXMuaCINCi0jZW5kaWYNCi0NCi0jaW5jbHVkZSAiZHJ2c19nZW5lcmFsLmgiDQotI2luY2x1ZGUgImRydnNfdGRtLmgiDQotI2luY2x1ZGUgImRydnNfcG93LmgiDQotLy8jaW5jbHVkZSAiZG1hX2NmZy5oIg0KLS8vI2luY2x1ZGUgImRydnNfZG1hLmgiDQotI2luY2x1ZGUgIlRocmVhZFByaW9yaXR5LmgiDQotI2luY2x1ZGUgImRydnNfY2hpcF9jZmcuaCINCi0jaW5jbHVkZSAiZHJ2c19zeXMuaCINCi0jaW5jbHVkZSAiZHJ2c192b2ljZXByb2Nlc3MuaCINCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4NCi0vLyNpbmNsdWRlIDxjeWcvaGFsL3Rvc19jYWNoZS5oPg0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+DQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KLSNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4NCi0jaW5jbHVkZSA8bWFjaC9ib2FyZC5oPg0KLSNpbmNsdWRlIDxtYWNoL2RtYS5oPg0KLSNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+DQotI2luY2x1ZGUgPGFzbS9pby5oPg0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qdmVyc2lvbiBhbmQgdGhlIGRyaXZlciBuYW1lKi8NCi0jZGVmaW5lIFRETV9EUklWRVJfTkFNRSAgICAgICAgICAgICAidGRtIg0KLSNkZWZpbmUgVERNX0RSSVZFUl9WRVJTSU9OICAgICAgICAgIDENCi0NCi0vLyNkZWZpbmUgQVJNX1RETV9MT09QX1NFVAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoWlhfU09DX1NZU19CQVNFICsgMHg2MCkpDQotDQotLyogdmVyc2lvbiByZWdpc3RlciAqLw0KLSNkZWZpbmUgVERNX1ZFUlNJT04gICAgIAkJCQkweDAxMDQJLypURE0gVmVyc2lvbiBWMS40Ki8NCi0NCi0vKiBUaW1pbmcgY29udHJvbCByZWdpc3RlciAqLw0KLQ0KLSNkZWZpbmUgVERNX0ZTX1BPUyAgICAgICAgICAgICAgICAgICAoMHgxPDwwKSAgLypURE0gRlNZTkMgcG9zaXRpdmUgZWRnZSBzZWxlY3QqLw0KLSNkZWZpbmUgVERNX1RYX1BPUyAgICAgICAgICAgICAgICAgICAoMHgxPDwxKSAgLypURE0gVFggcG9zaXRpdmUgZWRnZSBzZWxlY3QqLw0KLSNkZWZpbmUgVERNX1JYX1BPUyAgICAgICAgICAgICAgICAgICAoMHgxPDwyKSAgLypURE0gUlggcG9zaXRpdmUgZWRnZSBzZWxlY3QqLw0KLSNkZWZpbmUgVERNX1RTX1dJRFRIKHgpICAgICAgICAgICAgICAoKCh4KSYweDMpPDw1KSAgLyogVERNIHRpbWVzbG90IHdpZHRoLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMC0tLTggY2xrL3Nsb3QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxLS0tMTYgY2xrL3Nsb3QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLS0tMzIgY2xrL3Nsb3QgICovDQotI2RlZmluZSBURE1fVFNfTlVNKHgpICAgICAgICAgICAgICAgICgoKHgpJjB4N0YpPDw3KSAgLypURE0gdGltZXNsb3QgTlVNKCsxKSBvZiBvbmUgZnJhbWUqLw0KLSNkZWZpbmUgVERNX0ZTX1dJRFRIKHgpICAgICAgICAgICAgICAoKCh4KSYweDFGKTw8MTQpICAvKlRETSBGU1lOQyB3aWR0aCBOVU0oKzEpKi8NCi0jZGVmaW5lIFRETV9GU19BQ1RJVkUoeCkgICAgICAgICAgICAgKCgoeCkmMHgxKTw8MTkpICAgICAgICAgLypURE0gRlNZTkMgYWN0aXZlIGxvdyovDQotI2RlZmluZSBURE1fTFNCX0ZJUlNUKHgpICAgICAgICAgICAgICgoKHgpJjB4MSk8PDIwKSAgICAgICAgIC8qVERNIExTQiBmaXJzdCovDQotI2RlZmluZSBURE1fTUFTVEVSX0VOICAgICAgICAgICAgICAgICgweDE8PDIxKSAgICAgICAgIC8qVERNIG1hc3RlciBtb2RlKi8NCi0jZGVmaW5lIFRETV9URVNUX01PREUgICAgICAgICAgICAgICAgKDB4MTw8MjIpCQkgICAvKnRlc3QgTW9kZSovDQotDQotLyogT2Zmc2V0IHJlZ2lzdGVyICovDQotI2RlZmluZSBURE1fVFhfT0ZGU0VUKHgpICAgICAgICAgICAgICgoKHgpJjB4RkZGKTw8MCkgIC8qVERNIGJpdCBvZmZzZXQgbnVtYmVyIG9mIFRYIERBVEEqLw0KLSNkZWZpbmUgVERNX1JYX09GRlNFVCh4KSAgICAgICAgICAgICAoKCh4KSYweEZGRik8PDE2KSAvKlRETSBiaXQgb2Zmc2V0IG51bWJlciBvZiBSWCBEQVRBKi8NCi0NCi0NCi0vKiBUWCBmaWZvIGNvbnRyb2wgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIFRETV9UWF9GSUZPX1JTVCAgICAgICAgICAgICAgICgweDE8PDApICAgLypyZXNldCB0eCBmaWZvICovDQotI2RlZmluZSBURE1fVFhfRE1BX0VOICAgICAgICAgICAgICAgICAoMHgxPDwxKSAgIC8qVHJhbnNtaXQgRE1BIGVuYWJsZSovDQotI2RlZmluZSBURE1fVFhfRklGT19USFJFU0hPTEQoeCkgICAgICAoKCh4KSYweGYpPDwyKQkvKlRyYW5zbWl0IEZJRk8gaW50ZXJydXB0L0RNQSB0cmlnZ2VyIHRocmVzaG9sZCovDQotDQotLyogUlggZmlmbyBjb250cm9sIHJlZ2lzdGVyICovDQotI2RlZmluZSBURE1fUlhfRklGT19SU1QgICAgICAgICAgICAgICAoMHgxPDwwKSAgIC8qcmVzZXQgcnggZmlmbyAqLw0KLSNkZWZpbmUgVERNX1JYX0RNQV9FTiAgICAgICAgICAgICAgICAgKDB4MTw8MSkgICAvKlJlY2VpdmUgRE1BIGVuYWJsZSovDQotI2RlZmluZSBURE1fUlhfRklGT19USFJFU0hPTEQoeCkgICAgICAoKCh4KSYweGYpPDwyKQkvKlJlY2VpdmUgRklGTyBpbnRlcnJ1cHQvRE1BIHRyaWdnZXIgdGhyZXNob2xkKi8NCi0NCi0vKiB0eCBmaWZvIHN0YXR1cyByZWdpc3RlciAqLw0KLSNkZWZpbmUgVERNX1RYX0ZJRk9fVEhSRVNIT0xEX0lOVCAgICAgKDB4MTw8MCkgLypUWCBGSUZPIHJlYWNoIHRocmVzaG9sZCovDQotI2RlZmluZSBURE1fVFhfRklGT19FTVBUWSAgICAgICAgICAgICAoMHgxPDwyKSAvKlRYIEZJRk8gZW1wdHkqLw0KLSNkZWZpbmUgVERNX1RYX0ZJRk9fQ05UUiAgICAgICAgICAgDQotDQotLyogcnggZmlmbyBzdGF0dXMgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIFRETV9SWF9GSUZPX1RIUkVTSE9MRF9JTlQgICAgICgweDE8PDApIC8qUlggRklGTyByZWFjaCB0aHJlc2hvbGQqLw0KLSNkZWZpbmUgVERNX1JYX0ZJRk9fRlVMTCAgICAgICAgICAgICAoMHgxPDwyKSAvKlJYIEZJRk8gZnVsbCovDQotI2RlZmluZSBURE1fUlhfRklGT19DTlRSICAgICAgICAgICANCi0NCi0vKiBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyICovDQotI2RlZmluZSBURE1fSU5UX0VOX1RYX1RIUkVTSE9MRCAgICAgICAoMHgxPDwwKSAvKlRYIEZJRk8gdGhyZXNob2xkIGludGVycnVwIGVuYWJsZSovDQotI2RlZmluZSBURE1fSU5UX0VOX1JYX1RIUkVTSE9MRCAgICAgICAoMHgxPDwxKSAvKlJYIEZJRk8gdGhyZXNob2xkIGludGVycnVwIGVuYWJsZSovDQotI2RlZmluZSBURE1fSU5UX0VOX1RYX1VOREVSUlVOICAgICAgICAoMHgxPDwyKSAvKlRyYW5zbWl0IHVuZGVyZmxvdyBpbnRlcnJ1cCBlbmFibGUqLw0KLSNkZWZpbmUgVERNX0lOVF9FTl9SWF9PVkVSUlVOICAgICAgICAgKDB4MTw8MykgLypyZWNlaXZlIG92ZXJmbG93IGludGVycnVwIGVuYWJsZSovDQotI2RlZmluZSBURE1fSU5UX0VOX1JEX0NOVCAgICAgICAgICAgICAoMHgxPDw0KSAvKnJlYWQgY291bnRlciB0aHJlc2hvbGQgaW50ZXJydXAgZW5hYmxlKi8NCi0jZGVmaW5lIFRETV9JTlRfRU5fV1JfQ05UICAgICAgICAgICAgICgweDE8PDUpIC8qd3JpdGUgY291bnRlciB0aHJlc2hvbGQgaW50ZXJydXAgZW5hYmxlKi8NCi0jZGVmaW5lIFRETV9JTlRfRU5fU1lOQ19GQUlMICAgICAgICAgICgweDE8PDYpIC8qRlMgc3luYyBmYWlsIGludGVycnVwIGVuYWJsZSovDQotDQotLyogaW50ZXJydXB0IHN0YXR1cyAqLw0KLSNkZWZpbmUgVERNX0lOVF9UWF9USFJFU0hPTEQgICAgICAgICAgKDB4MTw8MCkgDQotI2RlZmluZSBURE1fSU5UX1JYX1RIUkVTSE9MRCAgICAgICAgICAoMHgxPDwxKSANCi0jZGVmaW5lIFRETV9JTlRfVFhfVU5ERVJSVU4gICAgICAgICAgICgweDE8PDIpIA0KLSNkZWZpbmUgVERNX0lOVF9SWF9PVkVSUlVOICAgICAgICAgICAgKDB4MTw8MykgDQotI2RlZmluZSBURE1fSU5UX1JEX0NOVCAgICAgICAgICAgICAgICAoMHgxPDw0KSANCi0jZGVmaW5lIFRETV9JTlRfV1JfQ05UICAgICAgICAgICAgICAgICgweDE8PDUpIA0KLSNkZWZpbmUgVERNX0lOVF9TWU5DX0ZBSUwgICAgICAgICAgICAgKDB4MTw8NikgDQotDQotLyogZnJhbWUgY291bnRlciAqLw0KLSNkZWZpbmUgVERNX0ZSQU1FX0NOVFIoeCkgICAgICAgICAgICAgICgoeCkmMHgzZmZmZmZmZikNCi0jZGVmaW5lIFRETV9GUkFNRV9DTlRSX0VOICAgICAgICAgICAgICAoMHgxPDwzMCkNCi0jZGVmaW5lIFRETV9GUkFNRV9DTlRSX1JTVCAgICAgICAgICAgICAoMHgxPDwzMSkNCi0NCi0vKiB3cml0ZSBjb250cm9sIGNvdW50ZXIgKi8NCi0jZGVmaW5lIFRETV9XUl9DTlRSX1RIUkVTSE9MRCh4KSAgICAgICAoKHgpJjB4M2ZmZmZmZmYpDQotI2RlZmluZSBURE1fV1JfQ05UUl9FTiAgICAgICAgICAgICAgICAgKDB4MTw8MzApDQotI2RlZmluZSBURE1fV1JfQ05UUl9SU1QgICAgICAgICAgICAgICAgKDB4MTw8MzEpDQotDQotLyogd3JpdGUgY291bnRlciAqLw0KLSNkZWZpbmUgVERNX1dSX0NOVFIoeCkgICAgICAgICAgICAgICAgICgoeCkmMHgzZmZmZmZmZikNCi0NCi0vKiB3cml0ZSBjb3VudGVyMiAqLw0KLSNkZWZpbmUgVERNX1dSX0NOVFIyKHgpICAgICAgICAgICAgICAgICgoeCkmMHgzZmZmZmZmZikNCi0jZGVmaW5lIFRETV9XUl9DTlRSMl9FTiAgICAgICAgICAgICAgICAoMHgxPDwzMCkNCi0jZGVmaW5lIFRETV9XUl9DTlRSMl9SU1QgICAgICAgICAgICAgICAoMHgxPDwzMSkNCi0NCi0vKiByZWFkIGNvbnRyb2wgY291bnRlciAqLw0KLSNkZWZpbmUgVERNX1JEX0NOVFJfVEhSRVNIT0xEKHgpICAgICAgICgoeCkmMHgzZmZmZmZmZikNCi0jZGVmaW5lIFRETV9SRF9DTlRSX0VOICAgICAgICAgICAgICAgICAoMHgxPDwzMCkNCi0jZGVmaW5lIFRETV9SRF9DTlRSX1JTVCAgICAgICAgICAgICAgICAoMHgxPDwzMSkNCi0NCi0vKiByZWFkIGNvdW50ZXIgKi8NCi0jZGVmaW5lIFRETV9SRF9DTlRSKHgpICAgICAgICAgICAgICAgICAoKHgpJjB4M2ZmZmZmZmYpDQotDQotLyogcmVhZCBjb3VudGVyMiAqLw0KLSNkZWZpbmUgVERNX1JEX0NOVFIyKHgpICAgICAgICAgICAgICAgICgoeCkmMHgzZmZmZmZmZikNCi0jZGVmaW5lIFRETV9SRF9DTlRSMl9FTiAgICAgICAgICAgICAgICAoMHgxPDwzMCkNCi0jZGVmaW5lIFRETV9SRF9DTlRSMl9SU1QgICAgICAgICAgICAgICAoMHgxPDwzMSkNCi0NCi0vKiBUaW1lc2xvdCBtYXNrIDAgKi8NCi0jZGVmaW5lIFRTX01BS1MwX1RTMSAgICAgICAgICAgICAgICAgICAoMHgxPDwwKSAgLyp0aW1lIHNsb3QgMSBlbmFibGUqLw0KLQ0KLS8qIFRpbWVzbG90IG1hc2sgMSAqLw0KLSNkZWZpbmUgVFNfTUFLUzBfVFMyICAgICAgICAgICAgICAgICAgICgweDE8PDIpfCgweDE8PDApICAvKnRpbWUgc2xvdCAxLzMgZW5hYmxlKi8NCi0NCi0vKiBwcm9jZXNzIGNvbnRyb2wgcmVnaXN0ZXIgKi8NCi0jZGVmaW5lIFRETV9UWF9PUEVOICAgICAJCQkJKDB4MTw8MCkJLypUWCBlbmFibGUqLw0KLSNkZWZpbmUgVERNX1JYX09QRU4gICAgIAkJCQkoMHgxPDwxKQkvKlJYIGVuYWJsZSovDQotI2RlZmluZSBURE1fRU4JCQkJCQkJKDB4MTw8MikNCi0NCi0vKiBkZWZhdWx0IHJ4L3R4IHRyaWdnZXIgdGhyZWFkaG9sZCAqLw0KLSNkZWZpbmUgVERNX1JYRkxfVkFMICAgICAgICAgICAgICAgICAgICAoMHg4KQ0KLSNkZWZpbmUgVERNX1RYRkxfVkFMICAgICAgICAgICAgICAgICAgICAoMHg4KQ0KLQ0KLSNkZWZpbmUgVERNX0VOQUJMRV9ERUxBWV9USU1FICAgICAgICgxMCkgICAgICAvKiB1cyAqLyAgLy8xMA0KLQ0KLSNkZWZpbmUgVERNX09VVF9CVUZfTlVNICAgICAgICAgICAgIDMNCi0jZGVmaW5lIFRETV9VUExJTktfU0VNX05VTSAgICAgICAgICAzDQotI2RlZmluZSBURE1fRE9XTkxJTktfU0VNX05VTSAgICAgICAgMA0KLSNkZWZpbmUgVERNX01BWF9WT0lDRV9HU01fTUVNX1NJWkUJMzIwDQotI2RlZmluZSBURE1fTUFYX1ZPSUNFX0xURV9NRU1fU0laRQk2NDANCi0jZGVmaW5lIFRETV9NQVhfUlhfQlVGX1NJWkUgICAgICAgICAyMDQ4ICAgICAgICAgICAgLyoya0J5dGVzKi8NCi0jZGVmaW5lIFRETV9NQVhfVFhfQlVGX1NJWkUgICAgICAgICA4MTkyICAgICAgICAgICAvKjhrQnl0ZXMqLw0KLQ0KLSNkZWZpbmUgVERNX1NFTV9XQUlUX1RJTUUgICAgICAgICAgIDI1MDANCi0NCi0jZGVmaW5lIFRETV9RVUVVRV9TSVpFICAgICAgICAgICAgICAoVERNX09VVF9CVUZfTlVNICsgMSkNCi0jZGVmaW5lIFRETV9XQUlUX1RJTUUgICAgICAgICAgICAgICAxMDANCi0jZGVmaW5lIFRETV9JTlRDVFJMX1RFU1RfTU9ERSAgICBUUlVFDQotDQotI2lmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYzKQ0KLQ0KLSNkZWZpbmUgVERNX0NSTV9DTEtTRUwgICAgICAgTFNQX0NSTV9SRUdfQkFTRSsweDUwDQotDQotI2RlZmluZSBURE1fQ0xLRElWMSAgICAgICBMU1BfQ1JNX1JFR19CQVNFKzB4NjgNCi0NCi0jZGVmaW5lIFRETV9DTEtESVYyICAgICAgIExTUF9DUk1fUkVHX0JBU0UrMHg2Yw0KLSNlbGlmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYyKQ0KLSNkZWZpbmUgVERNX0NMS0RJViAgICAgICAoKHZvbGF0aWxlIFVJTlQzMiAqKShMU1BfQ1JNX1JFR19CQVNFKzB4NTQpKQ0KLSNkZWZpbmUgVERNX0ZSQV9ESVYgICAgICAweDAwMDAwMDA4ICAgIC8qIGJpdCAwLTcgaXMgZnJhIGRpdiAqLw0KLSNkZWZpbmUgVERNX0ZSQV9CQVNFICAgICAweDAwMDAwODA4ICAgIC8qIGJpdCA4LTE1IGlzIGZyYSBiYXNlICovDQotI2RlZmluZSBURE1fSU5URUdFUl9OVU0gIDB4MDAwMDEwMDggICAgLyogYml0IDE2LTIzIGlzIGludGVnZXIgbnVtICovDQotI2RlZmluZSBURE1fQ0xLX1NFTF9ESVYgIDB4MDAwMDE4MDEgICAgLyogYml0IDI0IGlzIGZyYSBjbGsgc2VsICovDQotI2RlZmluZSBURE1fUFdSRE4gICAgICAgIDB4MDAwMDE5MDEgICAgLyogYml0IDI1IGlzIHB3ciBkbiAqLw0KLSNlbmRpZg0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBlbnVtDQotew0KLSAgICBURE1fUkVGX0NMSzI2TSwNCi0gICAgVERNX1JFRl9DTEsxMDRNLA0KLQ0KLSAgICBURE1fUkVGX0NMS19NQVgNCi19IFRfVGRtX1JlZkNsa0ZvclRkbTsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotICAgIEJVRkZFUl9OVUxMLA0KLSAgICBCVUZGRVJfV1JJVEUsDQotICAgIEJVRkZFUl9GVUxMLA0KLSAgICBCVUZGRVJfUkVBRCwNCi0NCi0gICAgTUFYX0JVRkZFUl9TVEFUVVMNCi19IFRfVGRtX0J1ZmZlclN0YXR1czsNCi0NCi10eXBlZGVmIGVudW0NCi17DQotICAgIFRETV9JRExFLA0KLSAgICBURE1fT1BFTiwNCi0gICAgVERNX1BMQVlfSU5VU0UsDQotICAgIFRETV9SRUNPUkRfSU5VU0UsDQotICAgIFRETV9CT1RIX0lOVVNFLA0KLQ0KLSAgICBNQVhfVERNX1NUQVRVUw0KLX0gVF9UZG1fU3RhdHVzOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICB2b2xhdGlsZSBVSU5UMzIgIHRkbVZlcnNpb247DQotICAgIHZvbGF0aWxlIFVJTlQzMiAgdGltaW5nQ3RybDsNCi0gICAgdm9sYXRpbGUgVUlOVDMyICBvZmZzZXQ7DQotICAgIHZvbGF0aWxlIFVJTlQzMiAgdHhGaWZvQ3RybDsNCi0gICAgdm9sYXRpbGUgVUlOVDMyICByeEZpZm9DdHJsOw0KLSAgICB2b2xhdGlsZSBVSU5UMzIgIHR4Rmlmb1N0YXR1czsNCi0gICAgdm9sYXRpbGUgVUlOVDMyICByeEZpZm9TdGF0dXM7CQ0KLSAgICB2b2xhdGlsZSBVSU5UMzIgIGludEVuOw0KLSAgICB2b2xhdGlsZSBVSU5UMzIgIGludFN0YXR1czsNCi0gICAgdm9sYXRpbGUgVUlOVDMyICBkYXRhOw0KLSAgICB2b2xhdGlsZSBVSU5UMzIgIGZyYW1lQ250cjsNCi0Jdm9sYXRpbGUgVUlOVDMyICB3cml0ZUNudEN0cmw7DQotCXZvbGF0aWxlIFVJTlQzMiAgd3JpdGVDbnRyOw0KLQl2b2xhdGlsZSBVSU5UMzIgIHdyaXRlQ250cjI7DQotCXZvbGF0aWxlIFVJTlQzMiAgcmVhZENudEN0cmw7CQ0KLQl2b2xhdGlsZSBVSU5UMzIgIHJlYWRDbnRyOw0KLQl2b2xhdGlsZSBVSU5UMzIgIHJlYWRDbnRyMjsNCi0Jdm9sYXRpbGUgVUlOVDMyICB0c01hc2swOw0KLQl2b2xhdGlsZSBVSU5UMzIgIHRzTWFzazE7DQotCXZvbGF0aWxlIFVJTlQzMiAgdHNNYXNrMjsNCi0Jdm9sYXRpbGUgVUlOVDMyICB0c01hc2szOw0KLQl2b2xhdGlsZSBVSU5UMzIgIHByb2Nlc3NDdHJsOw0KLQ0KLX0gVF9UZG1fUmVnOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBUX1RkbV9SZWcgICAgICAgICAgKnJlZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIHBvaW50ZXIgKi8NCi0gICAgVUlOVDMyICAgICAgICAgICAgIGludGxpbmU7ICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcnJ1cHQgbGluZSAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgICAgaW50cHJpbzsgICAgICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IHByaW9yaXR5ICovDQotICAgIE9TVkVDVE9SICAgICAgICAgICB2ZWN0b3I7ICAgICAgICAgICAgICAgICAgIC8qIEludGVycnVwdCB2ZWN0b3IgKi8NCi0jaWZkZWYgX09TX09TRQ0KLSAgICBEZGFFbmRPZkludCAgICAgICAgKmVvaUZ1bmM7ICAgICAgICAgICAgICAgLyogaW50ZXJydXB0IGhhbmRsZXIgKi8NCi0gICAgRGRhRnVuY0hhbmRsZSAgICAgIGVvaUFyZzsgICAgICAgICAgICAgICAgIC8qIGludGVycnVwdCBoYW5kbGVyIGFyZ3VtZW50cyAqLw0KLSNlbmRpZg0KLSAgICBQUk9DRVNTICAgICAgICAgICAgcGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgaWQgb2YgdGhlIHByb2Nlc3MgKi8NCi19IFRfVGRtX0RldmljZTsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVF9UZG1fRGV2aWNlICAgICAgICAgICAgICAgICAqcHREZXY7DQotICAgIFRfWkRydlRkbV9DZmcgICAgICAgICAgICAgICAgdENmZzsNCi0gICAgVF9UZG1fU3RhdHVzICAgICAgICAgICAgICAgICB0ZG1TdGF0dXM7DQotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgdWlEbWFSeENoYW47DQotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgdWlEbWFUeENoYW47DQotLy8JekRydkRtYV9DYWxsYmFja0Z1bmMgICAgICAgIGZEbWFDYlJ4Ow0KLS8vCXpEcnZEbWFfQ2FsbGJhY2tGdW5jICAgICAgICBmRG1hQ2JUeDsNCi0gICAgU0lOVDMyCQkJCQkJIERtYVJ4SUQ7CQ0KLSAgICBTSU5UMzIJCQkJCQkgRG1hVHhJRDsJDQotICAgIFRfWkRydkkyc19UcmFuc01vZGUgICAgICAgICAgdGRtVHJhbnNNb2RlOyAgICAgICAgDQotfSBUX1RkbV9JbnN0YW5jZTsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVUlOVDggICAgICAgICAgICAgICpidWY7DQotICAgIFRfVGRtX0J1ZmZlclN0YXR1cyB0ZG1CdWZTdGF0dXM7DQotfSBUX1RkbV9CdWZJbmZvOw0KLQ0KLXR5cGVkZWYgU0lOVDMyKCpUX1RkbV9UeEZ1bmMpKGNvbnN0IFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKTsNCi0NCi10eXBlZGVmIHN0cnVjdCBfVF9UZG1fUXVldWVOb2RlDQotew0KLSAgICBVSU5UMTYgKnBCdWY7DQotICAgIFVJTlQzMiBsZW47DQotfSBUX1RkbV9RdWV1ZU5vZGU7DQotDQotdHlwZWRlZiAgc3RydWN0IF9UX1RkbV9RdWV1ZQ0KLXsNCi0gICAgVUlOVDggcmVhZEluZGV4Ow0KLSAgICBVSU5UOCB3cml0ZUluZGV4Ow0KLSAgICBUX1RkbV9RdWV1ZU5vZGUgKmRhdGE7DQotfSBUX1RkbV9RdWV1ZTsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVF9UZG1fQnVmSW5mbyAgICAgICAgICp0eEJ1ZmZlckFycmF5OyAgIC8qIHR4IGJ1ZiBhcnJheSAqLw0KLSAgICBUX1RkbV9RdWV1ZSAgICAgICAgICAgdHhRdWV1ZTsgICAgICAgICAgLyogcXVldWUgZm9yIHR4ICovDQotICAgIFVJTlQzMiAgICAgICAgICAgICAgICB0eExlbjsgICAgICAgICAgICAvKiBzaXplIG9mIG9uZSBidWYsdXNlIGluIHR4ICovDQotICAgIFpPU1NfU0VNQVBIT1JFX0lEICAgICB0eFNlbTsgICAgICAgICAgICAvKiBmb3IgdGhlIGJ1ZiBtYW5hZ2VtZW50ICovDQotICAgIEJPT0wgICAgICAgICAgICAgICAgICBUcmFuc2luZzsgICAgICAgICAvKiB1c2UgdG8gY2hlY2sgaWYgZGF0YXMgaXMgdHJhbnNpbmcgKi8NCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgIHBhdXNlRmxhZzsgICAgICAgIC8qICBwYXVzZSBmbGFnICovDQotICAgIFRfVGRtX1R4RnVuYyAgICAgICAgICB0eFRyYW5zbWl0OyAgICAgICAvKiB0cmFucyBmdW5jdGlvbiAqLw0KLSAgICBUX1pEcnZBdWRpb19DaGFubmVsICAgY2hhbm5lbDsNCi0gICAgVF9aRHJ2VGRtX0FVRF9QTEFZX0NCIHBfY2I7DQotCVVJTlQ4ICAgICAgICAgICAgICAgICB0eFJkSWR4Ow0KLQlVSU5UOCAgICAgICAgICAgICAgICAgdHhXcklkeDsNCi19IFRfVGRtX1R4U3RyZWFtOyAgICAgICAgICAgLyp0aGUgZGF0YSBzdHJlYW0gb2YgdHJhbnNpbmcqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBUX1RkbV9CdWZJbmZvICAgICAgICAgKnJ4QnVmZmVyQXJyYXk7ICAgIC8qIHJ4IGJ1ZiBhcnJheSAqLw0KLSAgICBUX1RkbV9CdWZJbmZvICAgICAgICAgKmN1cnJlbnRSeEJ1ZjsgICAgIC8qIGN1cnJlbnQgcnggYnVmICovDQotICAgIFRfVGRtX1F1ZXVlICAgICAgICAgICByeFF1ZXVlOyAgICAgICAgICAgLyogcXVldWUgZm9yIHJ4ICovDQotICAgIFVJTlQzMiAgICAgICAgICAgICAgICByeExlbjsgICAgICAgICAgICAgLyogc2l6ZSBvZiBvbmUgYnVmLHVzZSBpbiByeCAqLw0KLQlVSU5UOCAgICAgICAgICAgICAgICAgcnhSZElkeDsgDQotCVVJTlQ4ICAgICAgICAgICAgICAgICByeFdySWR4OyANCi0gICAgWk9TU19TRU1BUEhPUkVfSUQgICAgIHJ4U2VtOyAgICAgICAgICAgICAvKiBmb3IgdGhlIGJ1ZiBtYW5hZ2VtZW50ICovDQotICAgIFRfVGRtX1R4RnVuYyAgICAgICAgICByeFRyYW5zbWl0OyAgICAgICAgLyogdHJhbnMgZnVuY3Rpb24gKi8NCi0gICAgVF9aRHJ2QXVkaW9fQ2hhbm5lbCAgIGNoYW5uZWw7DQotICAgIFRfWkRydlRkbV9BVURfUExBWV9DQiBwX2NiOw0KLX0gVF9UZG1fUnhTdHJlYW07DQotDQotI2lmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYyKQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBVSU5UMzIgICBJTlRFR0VSTlVNOw0KLSAgICBVSU5UMzIgICBGUkFDQURETlVNOw0KLSAgICBVSU5UMzIgICBGUkFDQkFTRTsNCi0gICAgVUlOVDMyICAgQ0xLU0VMRElWOw0KLSAgICBVSU5UMzIgICBQV1JETjsNCi0gICAgVF9UZG1fUmVmQ2xrRm9yVGRtICAgcmVmY2xrOw0KLSAgICBVSU5UMzIgICBjbGtSYXRpbzsNCi19VF9UZG1fQ2xrRGl2Ow0KLSNlbGlmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYzKQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0JVUlOVDMyICAgRlJBQ0RJVjE7DQotCVVJTlQzMiAgIEZSQUNESVYyOw0KLQkvL1RfVGRtX1JlZkNsa0ZvclRkbSAgIHJlZmNsazsNCi19VF9UZG1fQ2xrRGl2Ow0KLSNlbmRpZg0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLS8vICAgIFVJTlQzMiAgIHR4dG90YWxidWZmc2l6ZTsNCi0vLyAgICBVSU5UMzIgICByeHRvdGFsYnVmZnNpemU7DQotLy8JVUlOVDMyICAgdHhzaW5nbGVidWZmc2l6ZTsNCi0vLyAgICBVSU5UMzIgICByeHNpbmdsZWJ1ZmZzaXplOw0KLS8vCWRtYV9hZGRyX3QgZG1hX3R4X3BoeWFkZHJbVERNX09VVF9CVUZfTlVNXTsNCi0vLwl2b2lkKiBkbWFfdHhfdmlyYWRkcjsNCi0vLwlkbWFfYWRkcl90IGRtYV9yeF9waHlhZGRyW1RETV9PVVRfQlVGX05VTV07DQotLy8Jdm9pZCogZG1hX3J4X3ZpcmFkZHI7DQotLy8JVF9aRHJ2RG1hX0NoYW5uZWxEZWYgcnhEbWFDaGFuRGVmOw0KLS8vCVRfWkRydkRtYV9DaGFubmVsRGVmIHR4RG1hQ2hhbkRlZjsNCi0gICAgVUlOVDMyICAgdG90YWxidWZmc2l6ZTsNCi0JVUlOVDMyICAgc2luZ2xlYnVmZnNpemU7DQotCWRtYV9hZGRyX3QgZG1hX3BoeWFkZHI7DQotCXZvaWQqIGRtYV92aXJhZGRyOw0KLS8vCVRfWkRydkRtYV9DaGFubmVsRGVmIGRtYUNoYW5EZWY7DQotCXN0cnVjdCBkbWFfY2hhbiAqY2g7DQotCWludCBjaGFubmVsOw0KLX0NCi1UX1RkbV9EbWFJbmZvOw0KLQ0KLXR5cGVkZWYgZW51bSB7DQotICAgIFRETV9UWCA9IDAsDQotICAgIFRETV9SWCA9IDENCi19IFRfWkRydlRETV9UcmFuc0RpcmVjdGlvbjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCAgVmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLXN0YXRpYyBUX1RkbV9EbWFJbmZvIHRkbURtYVN0YXRlWzJdID0gezB9OyANCi0NCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRkbV9kZXZpY2VfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOw0KLQ0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRkbV9kZXZpY2UgPSB7DQotCS5uYW1lID0gInYzLXRkbSIsDQotCS5pZAk9IC0xLA0KLQkuZGV2ID0gew0KLQkJLmRtYV9tYXNrCQk9ICZ0ZG1fZGV2aWNlX2RtYV9tYXNrLA0KLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gRE1BX0JJVF9NQVNLKDMyKSwNCi0JCS5wbGF0Zm9ybV9kYXRhID0gTlVMTCwNCi0JIH0sDQotfTsNCi0NCi1zdGF0aWMgVF9UZG1fSW5zdGFuY2UgIHNfdGRtSW5zdGFuY2U7DQotc3RhdGljIFRfVGRtX1R4U3RyZWFtICBzX3RkbVR4U3RyZWFtOw0KLXN0YXRpYyBUX1RkbV9SeFN0cmVhbSAgc190ZG1SeFN0cmVhbTsNCi1zdGF0aWMgY29uc3QgVUlOVDE2ICp0ZG1fdHhCdWYgPSBOVUxMOyAvKiB1c2UgZm9yIHBsYXlpbmcgKGludCBtb2RlKSAqLw0KLXN0YXRpYyBVSU5UMTYgICAgICAgKnRkbV9yeEJ1ZiA9IE5VTEw7IC8qIHVzZSBmb3IgcmVjb3JkaW5nIChpbnQgbW9kZSkgKi8NCi1zdGF0aWMgVUlOVDMyICAgICAgIHRkbV90eExlbjsgICAgICAgIC8qIHVzZSBmb3IgcGxheWluZyAoaW50IG1vZGUpICovDQotc3RhdGljIFVJTlQzMiAgICAgICB0ZG1fcnhMZW47ICAgICAgICAvKiB1c2UgZm9yIHJlY29yZGluZyAoaW50IG1vZGUpICovDQotc3RhdGljIFVJTlQ4ICAgICAgICAqdGRtX3R4QnVmQXJyYXlbVERNX09VVF9CVUZfTlVNXSA9DQotew0KLSAgICBOVUxMLA0KLX07DQotc3RhdGljIFVJTlQ4ICAgICAgICAqdGRtX3J4QnVmQXJyYXlbVERNX09VVF9CVUZfTlVNXSA9DQotew0KLSAgICBOVUxMLA0KLX07DQotLy8gMjZNLS0+OC4xOTJNICAgezEsNDQsMjU1LDEsMCwwLDF9DQotLy8gMjZNLS0+NC4wOTZNICAgezMsODksMjU1LDAsMCwwLDF9DQotLy8gMjZNLS0+Mi4wNDhNICAgezYsMTc3LDI1NSwwLDAsMCwxfQ0KLS8vIDI2TS0tPjEuMDI0TSAgIHsxMiwxMDAsMjU1LDEsMCwwLDF9DQotLy8gMjZNLS0+NTEyayAgICAgezI1LDE5OSwyNTUsMCwwLDAsMX0NCi0vLyAyNk0tLT4yNTZrICAgICB7NTAsMTQzLDI1NSwxLDAsMCwxfQ0KLS8vIDI2TS0tPjEyOGsgICAgIHsxMDEsMzIsMjU1LDEsMCwwLDF9DQotLy8gMjZNLS0+NjRrICAgICAgezIwMyw2NCwyNTUsMCwwLDAsMX0NCi0jaWYgZGVmaW5lZCAoX1VTRV9BVURJT19PTl83NTIwVjMpDQotc3RhdGljIFRfVGRtX0Nsa0RpdiBnVGRtQ2xrRGl2W1RETV9NQVhfQ0xLXVtNQVhfVERNX1NMT1ROVU1dW01BWF9URE1fVFNfV0lEVEhdID0NCi17DQotCXsNCi0JCXt7MHg4MDAwMSwgMHhjYn0sezB4MTAwMDA5LDB4NjV9LHsweDIwMDAxOSwgMHgzMn19LA0KLQkJe3sweDEwMDAwOSwweDY1fSx7MHgyMDAwMTksMHgzMn0sezB4NDAwMDE5LCAweDE5fX0sDQotCQl7ezB4MTgwMDExLDB4NDN9LHsweDMwMDAyOSwweDIxfSx7MHg2MDAwNTksIDB4MTB9fSwNCi0JCXt7MHgyMDAwMTksMHgzMn0sezB4NDAwMDE5LDB4MTl9LHsweDgwMDA1OSwgMHhjfX0sDQotCQl7ezB4ODAwMDUsIDB4Mjh9LHsweDEwMDAwNSwweDE0fSx7MHgyMDAwMDUsIDB4YX19LA0KLQ0KLQkJe3sweDMwMDAyOSwweDIxfSx7MHg2MDAwNTksMHgxMH0sezB4YzAwMDU5LCAweDh9fSwNCi0JCXt7MHgzODAwMDEsMHgxZH0sezB4NzAwMDM5LDB4ZX0sIHsweGUwMDAzOSwgMHg3fX0sDQotCQl7ezB4NDAwMDE5LDB4MTl9LHsweDgwMDA1OSwweGN9LCB7MHgxMDAwMDU5LDB4Nn19LA0KLQkJe3sweDQ4MDAyOSwweDE2fSx7MHg5MDAwMjksMHhifSwgezB4MTIwMDBiOSwweDV9fSwNCi0JCXt7MHgxMDAwMDUsMHgxNH0sezB4MjAwMDA1LDB4YX0sIHsweDQwMDAwNSwgMHg1fX0sDQotDQotCQl7ezB4ODAwMDU5LCAweGN9LHsweDEwMDAwNTksMHg2fSx7MHgyMDAwMDU5LDB4M319LA0KLQkJe3sweDEwMDAwNTksMHg2fSx7MHgyMDAwMDU5LDB4M30sezB4NDAwMDI1OSwweDF9fSwNCi0JCXt7MHgyMDAwMDU5LDB4M30sezB4NDAwMDI1OSwweDF9LHsweDgwMDA2NTksMHgwfX0NCi0JfSwNCi0Jew0KLQkJe3sweDEwMDAwOSwgMHg2NX0sezB4MjAwMDE5LDB4MzJ9LHsweDQwMDAxOSwgMHgxOX19LA0KLQkJe3sweDIwMDAxOSwweDMyfSx7MHg0MDAwMTksMHgxOX0sezB4ODAwMDU5LCAweGN9fSwNCi0JCXt7MHgzMDAwMjksMHgyMX0sezB4NjAwMDU5LDB4MTB9LHsweGMwMDA1OSwgMHg4fX0sDQotCQl7ezB4NDAwMDE5LDB4MTl9LHsweDgwMDA1OSwweGN9LHsweDEwMDAwNTksIDB4Nn19LA0KLQkJe3sweDEwMDAwNSwgMHgxNH0sezB4MjAwMDA1LDB4YX0sezB4NDAwMDA1LCAweDV9fSwNCi0NCi0JCXt7MHg2MDAwNTksMHgxMH0sezB4YzAwMDU5LDB4OH0sezB4MTgwMDA1OSwgMHg0fX0sDQotCQl7ezB4NzAwMDM5LDB4ZX0sezB4ZTAwMDM5LDB4N30sIHsweDFjMDAxMTksIDB4M319LA0KLQkJe3sweDgwMDA1OSwweGN9LHsweDEwMDAwNTksMHg2fSwgezB4MjAwMDA1OSwweDN9fSwNCi0JCXt7MHg5MDAwMjksMHhifSx7MHgxMjAwMGI5LDB4NX0sIHsweDI0MDAxZDksMHgyfX0sDQotCQl7ezB4MjAwMDA1LDB4YX0sezB4NDAwMDA1LDB4NX0sIHsweDgwMDA0NSwgMHgyfX0sDQotDQotCQl7ezB4MTAwMDA1OSwgMHg2fSx7MHgyMDAwMDU5LDB4M30sezB4NDAwMDI1OSwweDF9fSwNCi0JCXt7MHgyMDAwMDU5LDB4M30sezB4NDAwMDI1OSwweDF9LHsweDgwMDA2NTksMHgwfX0sDQotCQl7ezB4NDAwMDI1OSwweDF9LHsweDgwMDA2NTksMHgwfSx7MHgxMDAwMDY1OSwweDB9fQ0KLQl9DQotfTsNCi0jZWxpZiBkZWZpbmVkIChfVVNFX0FVRElPX09OXzc1MjBWMikNCi1zdGF0aWMgVF9UZG1fQ2xrRGl2IGdUZG1DbGtEaXZbVERNX01BWF9DTEtdW01BWF9URE1fU0xPVE5VTV1bTUFYX1RETV9UU19XSURUSF09DQotew0KLQl7DQotCQl7ezIwMyw2NCwyNTUsMCwwLDAsMX0sezEwMSwzMiwyNTUsMSwwLDAsMX0sezUwLDE0MywyNTUsMSwwLDAsMX19LA0KLQkgICAge3sxMDEsMzIsMjU1LDEsMCwwLDF9LHs1MCwxNDMsMjU1LDEsMCwwLDF9LHsyNSwxOTksMjU1LDAsMCwwLDF9fSwNCi0JICAgIHt7MCwwLDAsMCwwLDAsMH0sezAsMCwwLDAsMCwwLDB9LHswLDAsMCwwLDAsMCwwfX0sDQotCSAgICB7ezUwLDE0MywyNTUsMSwwLDAsMX0sezI1LDE5OSwyNTUsMCwwLDAsMX0sezEyLDEwMCwyNTUsMSwwLDAsMX19LA0KLQkgICAge3swLDAsMCwwLDAsMCwwfSx7MCwwLDAsMCwwLDAsMH0sezAsMCwwLDAsMCwwLDB9fSwNCi0JICAgIHt7MCwwLDAsMCwwLDAsMH0sezAsMCwwLDAsMCwwLDB9LHswLDAsMCwwLDAsMCwwfX0sDQotCSAgICB7ezAsMCwwLDAsMCwwLDB9LHswLDAsMCwwLDAsMCwwfSx7MCwwLDAsMCwwLDAsMH19LA0KLQkgICAge3syNSwxOTksMjU1LDAsMCwwLDF9LHsxMiwxMDAsMjU1LDEsMCwwLDF9LHs2LDE3NywyNTUsMCwwLDAsMX19LA0KLQkgICAge3swLDAsMCwwLDAsMCwwfSx7MCwwLDAsMCwwLDAsMH0sezAsMCwwLDAsMCwwLDB9fSwNCi0JICAgIHt7MCwwLDAsMCwwLDAsMH0sezAsMCwwLDAsMCwwLDB9LHswLDAsMCwwLDAsMCwwfX0sDQotCSAgICB7ezEyLDEwMCwyNTUsMSwwLDAsMX0sezYsMTc3LDI1NSwwLDAsMCwxfSx7Myw4OSwyNTUsMCwwLDAsMX19LA0KLQkgICAge3s2LDE3NywyNTUsMCwwLDAsMX0sezMsODksMjU1LDAsMCwwLDF9LHsxLDQ0LDI1NSwxLDAsMCwxfX0sDQotCSAgICB7ezMsODksMjU1LDAsMCwwLDF9LHsxLDQ0LDI1NSwxLDAsMCwxfSx7MCwwLDAsMCwwLDAsMH19DQotCX0sDQotCXsNCi0NCi0JfQ0KLX07DQotI2VuZGlmDQotDQotc3RhdGljIFVJTlQzMiBhdWRpb1RkbVdzSGFuZGxlID0gMDsNCi1zdGF0aWMgVUlOVDMyIGF1ZGlvVGRtQ2xrSGFuZGxlID0gMDsNCi1zdGF0aWMgVUlOVDMyIGF1ZGlvVGRtRGluSGFuZGxlID0gMDsNCi1zdGF0aWMgVUlOVDMyIGF1ZGlvVGRtRG91dEhhbmRsZSA9IDA7DQotDQotU0lOVDMyIGdUZG1DbnRDaGFuZ2VUeCA9IDA7DQotU0lOVDMyIGdUZG1DbnRDaGFuZ2VSeCA9IDA7DQotDQotc3RhdGljIFVJTlQzMiBnX3RkbUNsa0RpdlJlZ3MgPSBMU1BfQ1JNX1JFR19CQVNFKzB4NTQ7DQotc3RhdGljIEJPT0wgc19iVGRtQ2xrSW5pdCA9IEZBTFNFOw0KLQ0KLVVJTlQzMiB0ZG13cml0ZV9wYnVmPTA7DQotVUlOVDMyIHRkbXdyaXRlX3VpbGVuPTA7DQotDQotc3RhdGljIEJPT0wgc19iVGRtSW5pdEludCA9IEZBTFNFOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fR2V0VGRtRGl2KFRfWkRydlRkbV9DZmcgKnB0Q2ZnLCBUX1RkbV9DbGtEaXYgKnBEaXYpOw0KLXN0YXRpYyBTSU5UMzIgdGRtX1NldFBkaXYoVF9aRHJ2VGRtX0NmZyAqcHRDZmcpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgdGRtX1F1ZXVlSW5pdChUX1RkbV9RdWV1ZSAqdGRtUXVldWUpOw0KLXN0YXRpYyBTSU5UMzIgdGRtX1F1ZXVlUHV0KFRfVGRtX1F1ZXVlICp0ZG1RdWV1ZSwgVUlOVDE2ICpwQnVmLCBVSU5UMzIgdWlMZW4pOw0KLXN0YXRpYyBTSU5UMzIgdGRtX1F1ZXVlR2V0KFRfVGRtX1F1ZXVlICp0ZG1RdWV1ZSwgVF9UZG1fUXVldWVOb2RlICoqcXVldWVOb2RlKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9RdWV1ZURlc3RvcnkoVF9UZG1fUXVldWUgKnRkbVF1ZXVlKTsNCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9TZXR1cFR4QnVmKCk7DQotc3RhdGljIFNJTlQzMiB0ZG1fU2V0dXBSeEJ1ZigpOw0KLXN0YXRpYyBTSU5UMzIgdGRtX1Jlc2V0KCk7DQotDQotc3RhdGljIFZPSUQgdGRtX0ludElzcigpOw0KLXN0YXRpYyBWT0lEIHRkbV9JbnRUeFdyaXRlRmlmbyhVSU5UMzIgY2hhbmxhYmxlKTsNCi1zdGF0aWMgVk9JRCB0ZG1fSW50UnhXcml0ZUJ1ZigpOw0KLXN0YXRpYyBWT0lEIHRkbV9JbnRUeENoYW5nZUJ1ZigpOw0KLXN0YXRpYyBWT0lEIHRkbV9JbnRSeENoYW5nZUJ1ZigpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgdGRtX1R4Q2hlY2tTdGF0ZShUX1pEcnZUZG1fQ2ZnICpwdENmZyk7DQotc3RhdGljIFNJTlQzMiB0ZG1fUnhDaGVja1N0YXRlKFRfWkRydlRkbV9DZmcgKnB0Q2ZnKTsNCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9UeENvbUluaXQoVF9aRHJ2VGRtX1BhcmFtcyAqcGFyYW1zKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9SeENvbUluaXQoVF9aRHJ2VGRtX1BhcmFtcyAqcGFyYW1zKTsNCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9JbnRSeEluaXQoKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9JbnRUeEluaXQoKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9EbWFSeEluaXQoKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9EbWFUeEluaXQoKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9EbWFUeChjb25zdCBVSU5UMTYgKnBCdWYsIFVJTlQzMiAgdWlMZW4pOw0KLXN0YXRpYyBTSU5UMzIgdGRtX0RtYVJ4KFRfVGRtX0luc3RhbmNlICpwdEluc3RhbmNlLCBVSU5UOCBpZHgpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgdGRtX0NsZWFuVHhSZXNvdXJjZSgpOw0KLXN0YXRpYyBTSU5UMzIgdGRtX0NsZWFuUnhSZXNvdXJjZSgpOw0KLQ0KLXN0YXRpYyBTSU5UMzIgdGRtX0ludFR4KGNvbnN0IFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKTsNCi0NCi1zdGF0aWMgVk9JRCB0ZG1fSW5pdEludChWT0lEKTsNCi1zdGF0aWMgU0lOVDMyIHRkbV9TZXRDbGsoVF9UZG1fQ2xrRGl2ICpwRGl2KTsNCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9DbG9zZUNsaygpOw0KLXN0YXRpYyBTSU5UMzIgdGRtX1NldENsa0RpdihVSU5UMzIgZGl2RnVuYywgVUlOVDMyIGRpdik7DQotDQotI2lmZGVmIF9VU0VfUFNNDQotZXh0ZXJuIFNJTlQzMiB6RHJ2UG93X1NldERldkFjdGl2ZShUX1pEcnZQb3dfSWRsZUZsYWcgZGV2SWQpOw0KLWV4dGVybiBTSU5UMzIgekRydlBvd19TZXREZXZJZGxlKFRfWkRydlBvd19JZGxlRmxhZyBkZXZJZCk7DQotI2VuZGlmDQotDQotU0lOVDMyIHRkbV9TZXRUaW1pbmcoVF9UZG1fUmVnICAgKnB0UmVnLCBUX1pEcnZUZG1fQ2ZnICpwdENmZyk7DQotc3RhdGljIFZPSUQgdGRtX0Nsa0luaXQoKTsNCi1zdGF0aWMgVk9JRCB0ZG1fQ2xrRGVpbml0KCk7DQotc3RhdGljIFZPSUQgaXNyX3RkbShWT0lEKTsNCi1TSU5UMzIgdGRtX3J4c2VtX2NvdW50X0luaXQoKTsNCi1TSU5UMzIgdGRtX3R4c2VtX2NvdW50X0luaXQoKTsNCi0NCi0NCi1leHRlcm4gVF96RHJ2Vm9pY2VfR2JWYXIgZ192b2ljZVZhcjsgDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fSXNRdWV1ZUVtcHR5DQotKiBEZXNjcmlwdGlvbjogY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5DQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICAgIHRkbVF1ZXVlIDpxdWV1ZSBwb2ludGVyDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICAgIE5vbmUNCi0qDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNIDogTlVMTCBwb2ludGVyDQotKg0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotX19pbmxpbmUgQk9PTCB0ZG1fSXNRdWV1ZUVtcHR5KFRfVGRtX1F1ZXVlICp0ZG1RdWV1ZSkNCi17DQotICAgIGlmIChOVUxMID09IHRkbVF1ZXVlKSAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgYXNzZXJ00sa1vWlmwO8qLw0KLSAgICB7DQotICAgICAgICB6RHJ2X0FTU0VSVCgwKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0gICAgcmV0dXJuICh0ZG1RdWV1ZS0+d3JpdGVJbmRleCA9PSB0ZG1RdWV1ZS0+cmVhZEluZGV4KTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX0lzUXVldWVGdWxsDQotKiBEZXNjcmlwdGlvbjogY2hlY2sgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgdGRtUXVldWUgOiBxdWV1ZSBwb2ludGVyDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgIE5vbmUNCi0qDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNIDogTlVMTCBwb2ludGVyDQotKg0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotX19pbmxpbmUgQk9PTCB0ZG1fSXNRdWV1ZUZ1bGwoVF9UZG1fUXVldWUgKnRkbVF1ZXVlKQ0KLXsNCi0gICAgaWYgKE5VTEwgPT0gdGRtUXVldWUpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gKCh0ZG1RdWV1ZS0+d3JpdGVJbmRleCArIDEpICUgVERNX1FVRVVFX1NJWkUgPT0gdGRtUXVldWUtPnJlYWRJbmRleCk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9VcGRhdGVUeEJ1ZmZlclN0YXR1cw0KLSogRGVzY3JpcHRpb246IHVzZSB0byBtYW5hZ2UgYnVmZmVyIHN0YXR1cyAsdXBkYXRlIG9uZSBidWZmZXIgc3RhdHVzDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICAgYnVmQWRkciA6IGJ1ZmZlciBwb2ludGVyDQotKiAgICAgICAgICAgIGJ1ZmZlclN0YXR1cyA6IGJ1ZmZlciBzdGF0dXMNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgICAgTm9uZQ0KLSoNCi0qIFJldHVybnM6IERSVl9TVUNDRVNTOiBvcGVyYXRlIHN1Y2Nlc3MNCi0qICAgICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06cGFyYW0gZXJyb3INCi0qDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9VcGRhdGVUeEJ1ZmZlclN0YXR1cyhVSU5UMTYgKiBidWZBZGRyICwgVF9UZG1fQnVmZmVyU3RhdHVzIGJ1ZmZlclN0YXR1cykNCi17DQotICAgIFRfVGRtX1R4U3RyZWFtICp0ZG1TdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgVUlOVDggYnVmSW5kZXggPSAwOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBidWZBZGRyKSAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgYXNzZXJ00sa1vWlmwO8qLw0KLSAgICB7DQotICAgICAgICB6RHJ2X0FTU0VSVCgwKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0gICAgaWYodGRtU3RyZWFtLT50eEJ1ZmZlckFycmF5ID09IE5VTEwpIHsNCi0gICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX1VwZGF0ZVR4QnVmZmVyU3RhdHVzIHRkbVN0cmVhbS0+dHhCdWZmZXJBcnJheSBOVUxMIHJldHVybiAiKTsJDQotCSAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBmb3IgKDsgYnVmSW5kZXggPCBURE1fT1VUX0JVRl9OVU07IGJ1ZkluZGV4KyspDQotICAgIHsNCi0gICAgICAgIGlmICh0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLmJ1ZiA9PSAoVUlOVDggKilidWZBZGRyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRkbVN0cmVhbS0+dHhCdWZmZXJBcnJheVtidWZJbmRleF0udGRtQnVmU3RhdHVzID0gYnVmZmVyU3RhdHVzOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmIChidWZJbmRleCA9PSBURE1fT1VUX0JVRl9OVU0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fVXBkYXRlQnVmZmVyU3RhdHVzDQotKiBEZXNjcmlwdGlvbjogdXNlIHRvIG1hbmFnZSBidWZmZXIgc3RhdHVzICx1cGRhdGUgb25lIGJ1ZmZlciBzdGF0dXMNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgICBidWZBZGRyIDogYnVmZmVyIHBvaW50ZXINCi0qICAgICAgICAgICAgYnVmZmVyU3RhdHVzIDogYnVmZmVyIHN0YXR1cw0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgICBOb25lDQotKg0KLSogUmV0dXJuczogRFJWX1NVQ0NFU1M6IG9wZXJhdGUgc3VjY2Vzcw0KLSogICAgICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTpwYXJhbSBlcnJvcg0KLSoNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzKFVJTlQxNiAqIGJ1ZkFkZHIgLCBUX1RkbV9CdWZmZXJTdGF0dXMgYnVmZmVyU3RhdHVzKQ0KLXsNCi0gICAgVF9UZG1fUnhTdHJlYW0gKnRkbVN0cmVhbSA9ICZzX3RkbVJ4U3RyZWFtOw0KLSAgICBVSU5UOCBidWZJbmRleCA9IDAgOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBidWZBZGRyKSAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgYXNzZXJ00sa1vWlmwO8qLw0KLSAgICB7DQotICAgICAgICB6RHJ2X0FTU0VSVCgwKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0gICAgaWYodGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5ID09IE5VTEwpIHsNCi0gICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzIHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheSBOVUxMIHJldHVybiAiKTsJDQotCSAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLSAgICBmb3IgKDsgYnVmSW5kZXggPCBURE1fT1VUX0JVRl9OVU07IGJ1ZkluZGV4KyspDQotICAgIHsNCi0gICAgICAgIGlmICh0ZG1TdHJlYW0tPnJ4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLmJ1ZiA9PSAoVUlOVDggKilidWZBZGRyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVtidWZJbmRleF0udGRtQnVmU3RhdHVzID0gYnVmZmVyU3RhdHVzOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmIChidWZJbmRleCA9PSBURE1fT1VUX0JVRl9OVU0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fQ2hhbmdlVHhCdWZmZXJTdGF0dXMNCi0qIERlc2NyaXB0aW9uOiB1c2UgdG8gbWFuYWdlIGJ1ZmZlciBzdGF0dXMgLHVwZGF0ZSBvbmUgYnVmZmVyIHN0YXR1cy4gaWYgb25lIGJ1ZiBzdGF0dXMgaXMgb25lICxjaGFuZ2UgdG8gbmV3IHN0YXR1cw0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgIG9sZFN0YXR1cyA6IGJ1ZmZlciBzdGF0dXMNCi0qICAgICAgICAgICAgYnVmZmVyU3RhdHVzIDogYnVmZmVyIHN0YXR1cw0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgICBOb25lDQotKg0KLSogUmV0dXJuczogRFJWX1NVQ0NFU1M6IG9wZXJhdGUgc3VjY2Vzcw0KLSogICAgICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTpwYXJhbSBlcnJvcg0KLSoNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0NoYW5nZVR4QnVmZmVyU3RhdHVzKFRfVGRtX0J1ZmZlclN0YXR1cyBvbGRTdGF0dXMgLCBUX1RkbV9CdWZmZXJTdGF0dXMgbmV3U3RhdHVzKQ0KLXsNCi0gICAgVF9UZG1fVHhTdHJlYW0gKnRkbVN0cmVhbSA9ICZzX3RkbVR4U3RyZWFtOw0KLSAgICBVSU5UOCBidWZJbmRleCA9IDA7DQotDQotICAgIGZvciAoOyBidWZJbmRleCA8IFRETV9PVVRfQlVGX05VTTsgYnVmSW5kZXgrKykNCi0gICAgew0KLSAgICAgICAgaWYgKHRkbVN0cmVhbS0+dHhCdWZmZXJBcnJheVtidWZJbmRleF0udGRtQnVmU3RhdHVzID09IG9sZFN0YXR1cykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXlbYnVmSW5kZXhdLnRkbUJ1ZlN0YXR1cyA9IG5ld1N0YXR1czsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAoYnVmSW5kZXggPT0gVERNX09VVF9CVUZfTlVNKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX1F1ZXVlSW5pdA0KLSogRGVzY3JpcHRpb246IHRoaXMgZnVuY3Rpb24gaXMgdXNlIHRvIGluaXQgdGhlIGJ1ZmZlciBxdWV1ZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgdGRtUXVldWUgOnF1ZXVlIHBvaW50ZXINCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNIDogbnVsbCBwb2ludGVyDQotKiAgICAgICAgICAgICAgICAgRFJWX0VSUl9NRU1fQUxMT0MgOiBhbGxvYyBmYWlsDQotKg0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fUXVldWVJbml0KFRfVGRtX1F1ZXVlICp0ZG1RdWV1ZSkNCi17DQotICAgIFNJTlQzMiByZXQgPSAwOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSB0ZG1RdWV1ZSkgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIHRkbVF1ZXVlLT5kYXRhID0gKFRfVGRtX1F1ZXVlTm9kZSAqKXpPc3NfTWFsbG9jKHNpemVvZihUX1RkbV9RdWV1ZU5vZGUpICogVERNX1FVRVVFX1NJWkUpOw0KLSAgICBpZiAoTlVMTCA9PSB0ZG1RdWV1ZS0+ZGF0YSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTUVNX0FMTE9DOw0KLSAgICB9DQotDQotICAgIGZvciAocmV0ID0gMDsgcmV0IDwgVERNX1FVRVVFX1NJWkU7IHJldCsrKQ0KLSAgICB7DQotICAgICAgICB0ZG1RdWV1ZS0+ZGF0YVtyZXRdLnBCdWYgPSBOVUxMOw0KLSAgICAgICAgdGRtUXVldWUtPmRhdGFbcmV0XS5sZW4gPSAwOw0KLSAgICB9DQotDQotICAgIHRkbVF1ZXVlLT5yZWFkSW5kZXggPSB0ZG1RdWV1ZS0+d3JpdGVJbmRleCA9IDA7DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX1F1ZXVlUHV0DQotKiBEZXNjcmlwdGlvbjq9q7u6s+XWuNXrsuXI67bTzrINCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRkbVF1ZXVlOiBxdWV1ZSBwb2ludGVyDQotKiAgICAgICAgICAgKnBCdWYgOiBidWZmZXIgcG9pbnRlcg0KLSogICAgICAgICAgIHVpTGVuIDogYnVmZmVyIGxlbmd0aA0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9RdWV1ZVB1dChUX1RkbV9RdWV1ZSAqdGRtUXVldWUsIFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKQ0KLXsNCi0gICAgQk9PTCBpc0Z1bGwgPSBGQUxTRTsNCi0NCi0gICAgaWYgKE5VTEwgPT0gdGRtUXVldWUgfHwgTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4pIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICBpc0Z1bGwgPSB0ZG1fSXNRdWV1ZUZ1bGwodGRtUXVldWUpOw0KLQ0KLSAgICBpZiAoVFJVRSA9PSBpc0Z1bGwpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICB0ZG1RdWV1ZS0+ZGF0YVt0ZG1RdWV1ZS0+d3JpdGVJbmRleF0ucEJ1ZiA9IHBCdWY7DQotICAgIHRkbVF1ZXVlLT5kYXRhW3RkbVF1ZXVlLT53cml0ZUluZGV4XS5sZW4gPSB1aUxlbjsNCi0gICAgdGRtUXVldWUtPndyaXRlSW5kZXggPSAodGRtUXVldWUtPndyaXRlSW5kZXggKyAxKSAlIFRETV9RVUVVRV9TSVpFOw0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9RdWV1ZUdldA0KLSogRGVzY3JpcHRpb246tNO208rXyKENCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRkbVF1ZXVlOiBxdWV1ZSBwb2ludGVyDQotKiAgICAgICAgICAgKnF1ZXVlTm9kZSA6IHF1ZXVlIG5vZGUgIHBvaW50ZXINCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fUXVldWVHZXQoVF9UZG1fUXVldWUgKnRkbVF1ZXVlLCBUX1RkbV9RdWV1ZU5vZGUgKipxdWV1ZU5vZGUpDQotew0KLSAgICBCT09MIGlzRW1wdHkgPSBGQUxTRTsNCi0NCi0gICAgaWYgKE5VTEwgPT0gdGRtUXVldWUgfHwgTlVMTCA9PSBxdWV1ZU5vZGUpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQ0KLSAgICBpc0VtcHR5ID0gdGRtX0lzUXVldWVFbXB0eSh0ZG1RdWV1ZSk7DQotDQotICAgIGlmIChUUlVFID09IGlzRW1wdHkpDQotICAgIHsNCi0gICAgICAgICpxdWV1ZU5vZGUgPSBOVUxMOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgKnF1ZXVlTm9kZSA9ICZ0ZG1RdWV1ZS0+ZGF0YVt0ZG1RdWV1ZS0+cmVhZEluZGV4XTsNCi0gICAgICAgIHRkbVF1ZXVlLT5yZWFkSW5kZXggPSAodGRtUXVldWUtPnJlYWRJbmRleCArIDEpICUgVERNX1FVRVVFX1NJWkU7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fUXVldWVEZXN0b3J5DQotKiBEZXNjcmlwdGlvbjogZGVzdG9yeSB0aGUgcXVldWUNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRkbVF1ZXVlOiBxdWV1ZSBwb2ludGVyDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTogZXJyb3IgcGFyYW0NCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX1F1ZXVlRGVzdG9yeShUX1RkbV9RdWV1ZSAqdGRtUXVldWUpDQotew0KLSAgICBpZiAoTlVMTCA9PSB0ZG1RdWV1ZSkgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIGlmICh0ZG1RdWV1ZS0+ZGF0YSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICB6T3NzX0ZyZWUodGRtUXVldWUtPmRhdGEpOw0KLSAgICB9DQotDQotICAgIHRkbVF1ZXVlLT5kYXRhID0gTlVMTDsNCi0gICAgdGRtUXVldWUtPnJlYWRJbmRleCA9IDA7DQotCXRkbVF1ZXVlLT53cml0ZUluZGV4ID0gMDsNCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9HZXRUZG1EaXYoVF9aRHJ2VGRtX0NmZyAqcHRDZmcsIFRfVGRtX0Nsa0RpdiAqcERpdikNCi17DQotICAgIFRfWkRydlRkbV9TbG90TnVtIHRkbVNsb3ROdW0gPSBNQVhfVERNX1NMT1ROVU07DQotICAgIFRfWkRydlRkbV9Uc1dpZHRoIHRkbVRzV2lkdGggPSBNQVhfVERNX1RTX1dJRFRIOw0KLQlUX1pEcnZUZG1fQ2xrIHRkbUNsb2NrU2V0ID0gVERNX01BWF9DTEs7DQotDQotICAgIGlmIChOVUxMID09IHBEaXZ8fE5VTEwgPT0gcHRDZmcgfHwgcHRDZmctPnRTbG90TnVtPj1NQVhfVERNX1NMT1ROVU18fCBwdENmZy0+dFRzV2lkdGggPj0gTUFYX1RETV9UU19XSURUSCApDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0Jc3dpdGNoKHB0Q2ZnLT5zYW1wbGVfcmF0ZSkgew0KLQljYXNlIDgwMDA6DQotCQl0ZG1DbG9ja1NldCA9IFRETV9DTEtfODAwMDsNCi0JCWJyZWFrOw0KLQljYXNlIDE2MDAwOg0KLQkJdGRtQ2xvY2tTZXQgPSBURE1fQ0xLXzE2MDAwOw0KLQkJYnJlYWs7DQotCWRlZmF1bHQ6DQotCQl0ZG1DbG9ja1NldCA9IFRETV9DTEtfODAwMDsNCi0JCWJyZWFrOw0KLQl9DQotDQotCXRkbVNsb3ROdW0gPSBwdENmZy0+dFNsb3ROdW07DQotCXRkbVRzV2lkdGggPSBwdENmZy0+dFRzV2lkdGg7DQotCQ0KLSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX0dldFRkbURpdiBnVGRtQ2xrRGl2WyVkXVslZF1bJWRdXG4iLHRkbUNsb2NrU2V0LHRkbVNsb3ROdW0sdGRtVHNXaWR0aCk7DQotICAgICpwRGl2ID0gZ1RkbUNsa0Rpdlt0ZG1DbG9ja1NldF1bdGRtU2xvdE51bV1bdGRtVHNXaWR0aF07DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotc3RhdGljIFNJTlQzMiB0ZG1fU2V0UGRpdihUX1pEcnZUZG1fQ2ZnICpwdENmZykNCi17DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgVF9UZG1fQ2xrRGl2IGRpdiA9IHswfTsNCi0NCi0gICAgaWYgKE5VTEwgPT0gcHRDZmcpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0gICAgcmV0ID0gdGRtX0dldFRkbURpdihwdENmZywgJmRpdik7DQotDQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgdGRtX1NldFBkaXYgZXJyIHJldD0weCV4IixyZXQpOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICByZXQgPSB0ZG1fU2V0Q2xrKCZkaXYpOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JLyoNCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiB0ZG1fU2V0UGRpdiB0ZG1fU2V0Q2xrIGVyciByZXQ9MHgleCIscmV0KTsNCi0NCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0qLw0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246ICB0ZG1fQ2xvc2VDbGsNCi0gKiBEZXNjcmlwdGlvbjogdGhpcyBmdW5jdGlvbiBpcyB1c2UgdG8gY2xvc2UgdGRtIGRpdmlkZSBmcmVxdWVuY3kNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0Nsb3NlQ2xrKCkNCi17DQotI2lmIGRlZmluZWQgKF9DSElQX1pYMjk3NTIwVjIpDQotICAgIHRkbV9TZXRDbGtEaXYoVERNX1BXUkROLCAxKTsNCi0jZW5kaWYNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9TZXRDbGtEaXYoVUlOVDMyIGRpdkZ1bmMsIFVJTlQzMiBkaXYpDQotew0KLSAgICBVSU5UMzIgYml0V2lkdGggPSBkaXZGdW5jICYgMHhmZjsNCi0gICAgVUlOVDMyIG1heERpdiA9ICgweDE8PGJpdFdpZHRoKS0xOw0KLSAgICBVSU5UMzIgYml0SW5kZXggPSAoZGl2RnVuYz4+OCkgJiAweGZmOw0KLSAgICBVSU5UMzIgYml0TWFzayAgPSAwOw0KLSAgICBVSU5UMzIgcmVnQmFzZSA9IDA7DQotICAgIFVJTlQzMiB0bXA9IDA7DQotDQotICAgIGlmKGRpdiA+IG1heERpdikNCi0gICAgICAgIGRpdiA9IG1heERpdjsNCi0NCi0gICAgaWYoYml0SW5kZXggPT0gMjgpICAvKtX7yv231sa1xvfWu9ans9bFvMr9t9bGtSovDQotICAgIHsNCi0gICAgICAgIGRpdiAmPTB4ZmU7DQotICAgICAgICBkaXYrKzsNCi0gICAgfQ0KLQ0KLSAgICBiaXRNYXNrICA9ICgoMHgxPDxiaXRXaWR0aCktMSk8PGJpdEluZGV4Ow0KLSAgICByZWdCYXNlID0gZ190ZG1DbGtEaXZSZWdzOw0KLSAgICB0bXA9IHJlZzMyKHJlZ0Jhc2UpOw0KLSAgICB0bXAgJj0gfmJpdE1hc2s7DQotICAgIHRtcCB8PSBkaXY8PGJpdEluZGV4Ow0KLSAgICByZWczMihyZWdCYXNlKSA9IHRtcDsNCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1zdGF0aWMgVk9JRCB0ZG1fQ2xrSW5pdChWT0lEKQ0KLXsNCi0JdW5zaWduZWQgaW50IHZhbDsNCi0NCi0gICAgaWYgKHNfYlRkbUNsa0luaXQpDQotICAgICAgICByZXR1cm47DQotDQotDQotICAgIGlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotICAgIHsNCi0JCXZhbCA9IHJlYWRsKFRETV9DUk1fQ0xLU0VMKTsNCi0JCXZhbCAmPSB+KDMgPDwgOCk7DQotCQl3cml0ZWwodmFsLCBURE1fQ1JNX0NMS1NFTCk7DQotCQkNCi0JCXZhbCA9IHJlYWRsKFRETV9DUk1fQ0xLU0VMKTsNCi0JCXZhbCB8PSAoMyA8PCA4KTsNCi0JCXdyaXRlbCh2YWwsIFRETV9DUk1fQ0xLU0VMKTsNCi0NCi0JCXpPc3NfU2xlZXAoMSk7DQotICAgIH0NCi0NCi0JdmFsID0gcmVhZGwoVERNX0NSTV9DTEtTRUwpOw0KLQl2YWwgfD0gKCgzIDw8IDApIHwgKDMgPDwgMTApKTsNCi0Jd3JpdGVsKHZhbCwgVERNX0NSTV9DTEtTRUwpOw0KLQ0KLSAgICBzX2JUZG1DbGtJbml0ID0gVFJVRTsNCi19DQotDQotc3RhdGljIFZPSUQgdGRtX0Nsa0RlaW5pdCgpDQotew0KLQl1bnNpZ25lZCBpbnQgdmFsOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX0Nsa0RlaW5pdCIpOw0KLQ0KLSAgICBpZiAoIXNfYlRkbUNsa0luaXQpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLQ0KLQl2YWwgPSByZWFkbChURE1fQ1JNX0NMS1NFTCk7DQotCXZhbCAmPSB+KCgzIDw8IDApIHwgKDMgPDwgMTApKTsNCi0Jd3JpdGVsKHZhbCwgVERNX0NSTV9DTEtTRUwpOw0KLQkNCi0JdmFsID0gcmVhZGwoVERNX0NSTV9DTEtTRUwpOw0KLQl2YWwgJj0gfigzIDw8IDgpOw0KLQl3cml0ZWwodmFsLCBURE1fQ1JNX0NMS1NFTCk7DQotCQ0KLQl2YWwgPSByZWFkbChURE1fQ1JNX0NMS1NFTCk7DQotCXZhbCB8PSAoMyA8PCA4KTsNCi0Jd3JpdGVsKHZhbCwgVERNX0NSTV9DTEtTRUwpOw0KLQ0KLSAgICBzX2JUZG1DbGtJbml0ID0gRkFMU0U7DQotfQ0KLQ0KLXN0YXRpYyBTSU5UMzIgdGRtX1NldENsayhUX1RkbV9DbGtEaXYgKnBEaXYpDQotew0KLSAgIHVuc2lnbmVkIGludCB2YWwgPSAwOw0KLSAgICB1bnNpZ25lZCBpbnQgZGl2MSA9IDAsZGl2MiA9IDA7DQotICAgIGlmIChOVUxMID09IHBEaXYpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0JDQotI2lmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYzKQ0KLQ0KLQkvL1RETV9DTEtESVYyICY9ICh+KDB4MSA8PCAxNikpOw0KLQkvL1RETV9DTEtESVYxID0gcERpdi0+RlJBQ0RJVjE7DQotCS8vVERNX0NMS0RJVjIgPSBwRGl2LT5GUkFDRElWMjsNCi0JLy9URE1fQ0xLRElWMiB8PSAoMHgxIDw8IDE2KTsNCi0JdmFsID0gcmVhZGwoVERNX0NMS0RJVjIpOw0KLQl2YWwgJj0gfigweDEgPDwgMTYpOw0KLQl3cml0ZWwodmFsLCBURE1fQ0xLRElWMik7DQotDQotCXdyaXRlbChwRGl2LT5GUkFDRElWMSwgVERNX0NMS0RJVjEpOw0KLQl3cml0ZWwoIHBEaXYtPkZSQUNESVYyLCBURE1fQ0xLRElWMik7DQotDQotCXZhbCA9IHJlYWRsKFRETV9DTEtESVYyKTsNCi0JdmFsIHw9ICgweDEgPDwgMTYpOw0KLQl3cml0ZWwodmFsLCBURE1fQ0xLRElWMik7DQotCQ0KLQlkaXYxID0gcmVhZGwoVERNX0NMS0RJVjEpOw0KLQlkaXYyID0gcmVhZGwoVERNX0NMS0RJVjIpOw0KLQkNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9TZXRDbGssVERNX0NMS0RJVjE9MHgleCwgVERNX0NMS0RJVjI9MHgleFxuIixkaXYxLGRpdjIpOw0KLQ0KLSNlbGlmIGRlZmluZWQgKF9VU0VfQVVESU9fT05fNzUyMFYyKQ0KLQ0KLSAgICB0ZG1fU2V0Q2xrRGl2KFRETV9JTlRFR0VSX05VTSwgcERpdi0+SU5URUdFUk5VTSk7DQotICAgIHRkbV9TZXRDbGtEaXYoVERNX0ZSQV9ESVYsIHBEaXYtPkZSQUNBREROVU0pOw0KLSAgICB0ZG1fU2V0Q2xrRGl2KFRETV9GUkFfQkFTRSwgcERpdi0+RlJBQ0JBU0UpOw0KLSAgICB0ZG1fU2V0Q2xrRGl2KFRETV9DTEtfU0VMX0RJViwgcERpdi0+Q0xLU0VMRElWKTsNCi0gICAgdGRtX1NldENsa0RpdihURE1fUFdSRE4sIHBEaXYtPlBXUkROKTsNCi0gICAgDQotI2VuZGlmDQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogIHRkbV9SZXNldA0KLSAqIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHVzZSB0byByZXNldCBhbGwgZGV2aWNlLGNvbnRhaW4gdGRtIGZpZm8gYW5kIGRtYQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTogZXJyb3IgcGFyYW0NCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fUmVzZXQoKQ0KLXsNCi0gICAgVF9UZG1fUmVnICAqcHRSZWcgPSBOVUxMOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBzX3RkbUluc3RhbmNlLnB0RGV2KSAJLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAJekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHB0UmVnID0gc190ZG1JbnN0YW5jZS5wdERldi0+cmVnczsNCi0NCi0gICAgcHRSZWctPnRpbWluZ0N0cmwgPSAweDA7DQotDQotICAgIC8qIGRpc2FibGUgZG1hICovDQotICAgIHB0UmVnLT50eEZpZm9DdHJsICY9IH5URE1fVFhfRE1BX0VOOw0KLSAgICBwdFJlZy0+cnhGaWZvQ3RybCAmPSB+VERNX1JYX0RNQV9FTjsNCi0NCi0gICAgLyogcmVzZXQgdHgvcnggZmlmbyAqLw0KLSAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fVFhfRklGT19SU1Q7DQotICAgIHB0UmVnLT5yeEZpZm9DdHJsIHw9IFRETV9SWF9GSUZPX1JTVDsNCi0NCi0gICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotICAgIHB0UmVnLT5pbnRTdGF0dXMgPSAweGZmZmY7DQotDQotICAgIC8qIGRpc2FibGUgaW50ZXJydXB0ICovDQotICAgIHB0UmVnLT5pbnRFbiA9IDB4MDsNCi0NCi0gICAgLyogZGlzYWJsZSB0ZG07IGRpc2FibGUgcngvdHg7ICovDQotICAgIHB0UmVnLT5wcm9jZXNzQ3RybCA9IDB4MDsNCi0NCi0gICAgLyogcmVzZXQgb2Zmc2V0ICovDQotICAgIHB0UmVnLT5vZmZzZXQgPSAwOyAgDQotDQotICAgIC8qIHJlc2V0IHRzTWFzayAqLw0KLSAgICBwdFJlZy0+dHNNYXNrMCA9IDA7DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX1NldHVwQnVmDQotKiBEZXNjcmlwdGlvbjogaW5pdCBidWZmZXINCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRkbVN0cmVtOiB0ZG0gc3RyZWFtIHN0cnVjdA0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX1NldHVwVHhCdWYoKQ0KLXsNCi0gICAgU0lOVDMyIGluZGV4ID0gMDsNCi0gICAgVF9UZG1fVHhTdHJlYW0gKnRkbVN0cmVhbSA9ICZzX3RkbVR4U3RyZWFtOw0KLQ0KLSAgICB0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXkgPSAoVF9UZG1fQnVmSW5mbyAqKXpPc3NfTWFsbG9jKFRETV9PVVRfQlVGX05VTSAqIHNpemVvZihUX1RkbV9CdWZJbmZvKSk7DQotICAgIGlmIChOVUxMID09IHRkbVN0cmVhbS0+dHhCdWZmZXJBcnJheSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTUVNX0FMTE9DOw0KLSAgICB9DQotDQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IFRETV9PVVRfQlVGX05VTTsgaW5kZXgrKykNCi0gICAgew0KLSAgICAgICAgdGRtU3RyZWFtLT50eEJ1ZmZlckFycmF5W2luZGV4XS5idWYgPSB0ZG1fdHhCdWZBcnJheVtpbmRleF07DQotICAgICAgICB0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXlbaW5kZXhdLnRkbUJ1ZlN0YXR1cyA9IEJVRkZFUl9OVUxMOw0KLSAgICAgICAvLyB6T3NzX01lbXNldCh0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXlbaW5kZXhdLmJ1ZiwgMCwgVERNX01BWF9UWF9CVUZfU0laRSk7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fU2V0dXBCdWYNCi0qIERlc2NyaXB0aW9uOiBpbml0IGJ1ZmZlcg0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgdGRtU3RyZW06IHRkbSBzdHJlYW0gc3RydWN0DQotKiAgIE91dHB1dDoNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9TZXR1cFJ4QnVmKCkNCi17DQotICAgIFNJTlQzMiBpbmRleCA9IDA7DQotICAgIFRfVGRtX1J4U3RyZWFtICp0ZG1TdHJlYW0gPSAmc190ZG1SeFN0cmVhbTsNCi0NCi0gICAgdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5ID0gKFRfVGRtX0J1ZkluZm8gKil6T3NzX01hbGxvYyhURE1fT1VUX0JVRl9OVU0gKiBzaXplb2YoVF9UZG1fQnVmSW5mbykpOw0KLSAgICBpZiAoTlVMTCA9PSB0ZG1TdHJlYW0tPnJ4QnVmZmVyQXJyYXkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX01FTV9BTExPQzsNCi0gICAgfQ0KLQ0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBURE1fT1VUX0JVRl9OVU07IGluZGV4KyspDQotICAgIHsNCi0gICAgICAgIHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVtpbmRleF0uYnVmID0gdGRtX3J4QnVmQXJyYXlbaW5kZXhdOw0KLSAgICAgICAgdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2luZGV4XS50ZG1CdWZTdGF0dXMgPSBCVUZGRVJfTlVMTCA7DQotICAgICAgIC8vIHpPc3NfTWVtc2V0KHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVtpbmRleF0uYnVmLCAwLCBURE1fTUFYX1JYX0JVRl9TSVpFKTsNCi0gICAgfQ0KLQkNCi0gICAgdGRtU3RyZWFtLT5jdXJyZW50UnhCdWYgPSBOVUxMOw0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9Db25maWd1cmUNCi0qIERlc2NyaXB0aW9uOiBjb25maWcgdGRtDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwdENmZyA6IHRkbSBjb25maWcgcGFyYW0NCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSoNCi0qIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgdGRtX2Nsa0NvbmZpZ3VyZShUX1pEcnZUZG1fQ2ZnICpwdENmZykNCi17DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0gICAgaWYgKE5VTEwgPT0gcHRDZmcpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAocHRDZmctPmJNYXN0ZXIpDQotICAgIHsNCi0gICAgICAgIHJldCA9IHRkbV9TZXRQZGl2KHB0Q2ZnKTsNCi0gICAgICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgICAgICB7DQotICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9Db25maWd1cmUgIHRkbV9TZXRQZGl2ZXJyIHJldD0weCV4IixyZXQpOw0KLSAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0NCi1zdGF0aWMgU0lOVDMyIHRkbV9Db25maWd1cmUoVF9aRHJ2VGRtX0NmZyAqcHRDZmcpDQotew0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLSAgICBUX1RkbV9SZWcgICAgKnB0UmVnID0gTlVMTDsNCi0NCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBwdENmZykgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGRlbGV0ZSBpZiovDQotICAgIC8qaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9Db25maWd1cmUgIHRkbV9TZXRUaW1pbmcgcmV0PTB4JXgiLHJldCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9Ki8NCi0NCi0gICAgaWYgKHB0Q2ZnLT5iTWFzdGVyKQ0KLSAgICB7DQotICAgICAgICByZXQgPSB0ZG1fU2V0UGRpdihwdENmZyk7DQotICAgICAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ0ZG1fQ29uZmlndXJlICB0ZG1fU2V0UGRpdmVyciByZXQ9MHgleCIscmV0KTsNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmx8PSBURE1fTUFTVEVSX0VOOyAgIC8qIGFzIG1hc3RlciAqLyAgLy90ZXN0IGZvciBzZXR0aW5nIG1hc3RlciBtb2RlIGJlZm9yZSBncGkwL3RkbQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgJj0gflRETV9NQVNURVJfRU47ICAvKiBhcyBzbGF2ZSAqLw0KLSAgICB9DQotDQotICAgIC8qdHJhbnNtaXQgZGF0YSBhdCBuZWdhdGl2ZSBlZGdlIG9yIGF0IHBvc2l0aXZlIGVkZ2UqLw0KLSAgICBpZiAocHRDZmctPmZzQ2xrU2VsID09IFRETV9GU19DTEtfTkVHKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCAmPSB+VERNX0ZTX1BPUzsgICANCi0gICAgfQ0KLSAgICBlbHNlIGlmIChwdENmZy0+ZnNDbGtTZWwgPT0gVERNX0ZTX0NMS19QT1MpDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsIHw9IFRETV9GU19QT1M7ICAvKnRyYW5zbWl0IGF0IHJpc2luZyBlZGdlKi8NCi0gICAgfQ0KLSAgICBpZiAocHRDZmctPnR4Q2xrU2VsID09IFRETV9UWF9DTEtfTkVHKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCAmPSB+VERNX1RYX1BPUzsgICANCi0gICAgfQ0KLSAgICBlbHNlIGlmIChwdENmZy0+dHhDbGtTZWwgPT0gVERNX1RYX0NMS19QT1MpDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsIHw9IFRETV9UWF9QT1M7ICAgIC8qdHJhbnNtaXQgYXQgcmlzaW5nIGVkZ2UqLw0KLSAgICB9DQotICAgIGlmIChwdENmZy0+cnhDbGtTZWwgPT0gVERNX1JYX0NMS19ORUcpDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsICY9IH5URE1fUlhfUE9TOyAgIC8qcmVjZWl2ZSBhdCBmYWxsaW5nIGVkZ2UqLw0KLSAgICB9DQotICAgIGVsc2UgaWYgKHB0Q2ZnLT5yeENsa1NlbCA9PSBURE1fUlhfQ0xLX1BPUykNCi0gICAgew0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgfD0gVERNX1JYX1BPUzsNCi0gICAgfQ0KLQ0KLSAgICAvKiB0aW1lc2xvdCB3aWR0aCAqLw0KLSAgICBpZiAoTUFYX1RETV9UU19XSURUSCA8PSBwdENmZy0+dFRzV2lkdGgpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsICY9IH4gCVRETV9UU19XSURUSCgweDMpOw0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgfD0gVERNX1RTX1dJRFRIKHB0Q2ZnLT50VHNXaWR0aCk7LypURE1fVFNfV0lEVEgqLw0KLSAgICB9DQotDQotICAgIC8qIHRpbWVzbG90IG51bWJlciAqLw0KLSAgICBpZiAoTUFYX1RETV9TTE9UTlVNIDw9IHB0Q2ZnLT50U2xvdE51bSkgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgJj0gfiBURE1fVFNfTlVNKDB4N2YpOw0KLSAgICAgICAgaWYocHRDZmctPnRTbG90TnVtIDw9IFRETV8xMF9TTE9UKQ0KLSAgICAgICAgICAgIHB0UmVnLT50aW1pbmdDdHJsIHw9IFRETV9UU19OVU0ocHRDZmctPnRTbG90TnVtKTsvKlRETV9UU19OVU0qLw0KLSAgICAgICAgZWxzZSBpZihwdENmZy0+dFNsb3ROdW0gPT0gVERNXzE2X1NMT1QpDQotICAgICAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgfD0gVERNX1RTX05VTSgweGYpOy8qVERNX1RTX05VTSovDQotICAgICAgICBlbHNlIGlmKHB0Q2ZnLT50U2xvdE51bSA9PSBURE1fMzJfU0xPVCkNCi0gICAgICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCB8PSBURE1fVFNfTlVNKDB4MWYpOy8qVERNX1RTX05VTSovDQotICAgICAgICBlbHNlIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIIChwdENmZy0+dFNsb3ROdW0gPT0gVERNXzY0X1NMT1QpKi8NCi0gICAgICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCB8PSBURE1fVFNfTlVNKDB4M2YpOy8qVERNX1RTX05VTSovDQotICAgIH0NCi0NCi0gICAgLyogZnN5bmMgd2lkdGggKi8NCi0gICAgaWYgKE1BWF9GU19XSURUSCA8PSBwdENmZy0+dEZzV2lkdGgpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsICY9IH4gVERNX0ZTX1dJRFRIKDB4MUYpOw0KLSAgICAgICAgcHRSZWctPnRpbWluZ0N0cmwgfD0gVERNX0ZTX1dJRFRIKHB0Q2ZnLT50RnNXaWR0aCk7LypURE1fVFNfTlVNKi8NCi0gICAgfQ0KLQ0KLSAgICAvKiBmc3luYyBhY3RpdmUgKi8NCi0gICAgaWYgKE1BWF9GU19BQ1RJVkUgPD0gcHRDZmctPnRGc0FjdGl2ZSkgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8gDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsIHw9IFRETV9GU19BQ1RJVkUocHRDZmctPnRGc0FjdGl2ZSk7LypURE1fVFNfTlVNKi8NCi0gICAgfQ0KLQkNCi0gICAgLyogTFNCIGZpcnN0ICovDQotICAgIGlmIChNQVhfRklSU1RCSVQgPD0gcHRDZmctPnRUZG1Gc3RCaXQpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50aW1pbmdDdHJsIHw9IFRETV9MU0JfRklSU1QocHRDZmctPnRUZG1Gc3RCaXQpOyAvKlRETV9UU19OVU0qLw0KLSAgICB9DQotCQ0KLSAgICAvKnRlc3QgbW9kZSovDQotICAgIGlmKHB0Q2ZnLT50VGVzdE1vZGUgPT0gVERNX05PUk1BTF9NT0RFKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCAmPSB+IFRETV9URVNUX01PREU7DQotICAgIH0NCi0gICAgZWxzZSBpZihwdENmZy0+dFRlc3RNb2RlID09IFRETV9MT09QQkFDS19NT0RFKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+dGltaW5nQ3RybCB8PSBURE1fVEVTVF9NT0RFOw0KLSAgICB9DQotDQotCS8qIG9mZnNldCAqLw0KLSAgICBwdFJlZy0+b2Zmc2V0ID0gMDsgICAvL3Jlc2V0IG9mZnNldA0KLQlwdFJlZy0+b2Zmc2V0IHw9IFRETV9SWF9PRkZTRVQocHRDZmctPnRSeE9mZnNldCk7DQotCXB0UmVnLT5vZmZzZXQgfD0gVERNX1RYX09GRlNFVChwdENmZy0+dFR4T2Zmc2V0KTsNCi0gICAgDQotCQ0KLSAgICAvKnRpbWUgc2xvdCBtYXNrKi8NCi0gICAgcHRSZWctPnRzTWFzazAgPSAwOyAgIC8vcmVzZXQgdHNNYXNrDQotICAgIGlmKHB0Q2ZnLT50VHNFbmFibGUgPT0gVERNXzFUU19FTkFCTEUpDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50c01hc2swIHw9IFRTX01BS1MwX1RTMTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKHB0Q2ZnLT50VHNFbmFibGUgPT0gVERNXzJUU19FTkFCTEUpDQotICAgIHsNCi0gICAgICAgcHRSZWctPnRzTWFzazAgfD0gVFNfTUFLUzBfVFMyOw0KLSAgICB9DQotDQotICAgIC8qZW5hYmxlIGZyYW1lIGNvdW50ZXIgKi8NCi0gICAgcHRSZWctPmZyYW1lQ250ciB8PSBURE1fRlJBTUVfQ05UUl9FTjsNCi0gICAgDQotICAgIC8qZW5hYmxlIHdyaXRlIGNvdW50ZXIgKi8NCi0gICAgcHRSZWctPndyaXRlQ250Q3RybCB8PSBURE1fV1JfQ05UUl9FTjsNCi0gICAgcHRSZWctPndyaXRlQ250cjIgfD0gVERNX1dSX0NOVFIyX0VOOw0KLQ0KLSAgICAvKmVuYWJsZSByZWFkIGNvdW50ZXIgKi8NCi0gICAgcHRSZWctPnJlYWRDbnRDdHJsIHw9IFRETV9SRF9DTlRSX0VOOw0KLSAgICBwdFJlZy0+cmVhZENudHIyIHw9IFRETV9SRF9DTlRSMl9FTjsNCi0gICAgICAgICAgICANCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9Db25maWd1cmUgc3VjY2VzcyIpOw0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9DbGVhblJlc291cmNlDQotKiBEZXNjcmlwdGlvbjogY2xlYW4gcmVzb3VyY2UNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIE5PTkUNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5PTkUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotKg0KLSogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0NsZWFuVHhSZXNvdXJjZSgpDQotew0KLSAgICBTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotICAgIHJldCA9IHRkbV9RdWV1ZURlc3RvcnkoJnNfdGRtVHhTdHJlYW0udHhRdWV1ZSk7DQotICAgIGlmIChzX3RkbVR4U3RyZWFtLnR4QnVmZmVyQXJyYXkgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgek9zc19GcmVlKHNfdGRtVHhTdHJlYW0udHhCdWZmZXJBcnJheSk7DQotICAgICAgICBzX3RkbVR4U3RyZWFtLnR4QnVmZmVyQXJyYXkgPSBOVUxMOw0KLSAgICB9DQotDQotICAgIHJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9DbGVhblJ4UmVzb3VyY2UNCi0qIERlc2NyaXB0aW9uOiBjbGVhbiByZXNvdXJjZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgTk9ORQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0qDQotKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fQ2xlYW5SeFJlc291cmNlKCkNCi17DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0gICAgcmV0ID0gdGRtX1F1ZXVlRGVzdG9yeSgmc190ZG1SeFN0cmVhbS5yeFF1ZXVlKTsNCi0gICAgaWYgKHNfdGRtUnhTdHJlYW0ucnhCdWZmZXJBcnJheSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICB6T3NzX0ZyZWUoc190ZG1SeFN0cmVhbS5yeEJ1ZmZlckFycmF5KTsNCi0gICAgICAgIHNfdGRtUnhTdHJlYW0ucnhCdWZmZXJBcnJheSA9IE5VTEw7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIHJldDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRJc3INCi0qIERlc2NyaXB0aW9uOiBpbnRlcnJ1cHQgaGFuZGxlIHdoaWxlIGluIGludCBtb2RlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwdEluc3RhbmNlIDogdGRtIGluc3RhbmNlDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX1R4Q2hlY2tTdGF0ZShUX1pEcnZUZG1fQ2ZnICpwdENmZykNCi17DQotICAgIFNJTlQzMiAgICAgICAgICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotDQotICAgIGlmIChOVUxMID09IHB0Q2ZnKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotCQ0KLSAgICBpZiAoKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fT1BFTikmJihwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1JFQ09SRF9JTlVTRSkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9PUEVORUQ7DQotICAgIH0NCi0JDQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1JFQ09SRF9JTlVTRSkNCi0gICAgew0KLSAgICAgICAgcHRJbnN0YW5jZS0+dENmZyA9ICpwdENmZzsNCi0gICAgICAgIHJldCA9IHRkbV9Db25maWd1cmUocHRDZmcpOw0KLSAgICAgICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX1R4Q2hlY2tTdGF0ZSB0ZG1fQ29uZmlndXJlIGVyciByZXQ9MHgleCIscmV0KTsNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgaWYgKChwdENmZy0+Yk1hc3RlciE9IHB0SW5zdGFuY2UtPnRDZmcuYk1hc3Rlcil8fA0KLSAgICAgICAgICAgIChwdENmZy0+dFRlc3RNb2RlICE9IHB0SW5zdGFuY2UtPnRDZmcudFRlc3RNb2RlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fSW50SXNyDQotKiBEZXNjcmlwdGlvbjogaW50ZXJydXB0IGhhbmRsZSB3aGlsZSBpbiBpbnQgbW9kZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcHRJbnN0YW5jZSA6IHRkbSBpbnN0YW5jZQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9SeENoZWNrU3RhdGUoVF9aRHJ2VGRtX0NmZyAqcHRDZmcpDQotew0KLSAgICBTSU5UMzIgICAgICAgICAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBwdENmZykgLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIC8qIGNsZWFyIGludGVycnVwdC4gbXVzdCBkaXNhYmxlIGludGVycnVwdCBvciB0ZG0gYXQgZmlyc3QgKi8NCi0NCi0gICAgaWYgKChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX09QRU4pJiYocHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9QTEFZX0lOVVNFKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTk9UX09QRU5FRDsNCi0gICAgfQ0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9QTEFZX0lOVVNFKQ0KLSAgICB7DQotICAgICAgICBwdEluc3RhbmNlLT50Q2ZnID0gKnB0Q2ZnOw0KLSAgICAgICAgcmV0ID0gdGRtX0NvbmZpZ3VyZShwdENmZyk7DQotICAgICAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ0ZG1fUnhDaGVja1N0YXRlICBmYWlsZWQgcmV0IGlzICVkL3IvbiIscmV0KTsNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgaWYoKHB0Q2ZnLT5iTWFzdGVyIT0gcHRJbnN0YW5jZS0+dENmZy5iTWFzdGVyKXx8DQotICAgICAgICAgICAocHRDZmctPnRUZXN0TW9kZSAhPSBwdEluc3RhbmNlLT50Q2ZnLnRUZXN0TW9kZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fSW50SXNyDQotKiBEZXNjcmlwdGlvbjogaW50ZXJydXB0IGhhbmRsZSB3aGlsZSBpbiBpbnQgbW9kZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcHRJbnN0YW5jZSA6IHRkbSBpbnN0YW5jZQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9UeENvbUluaXQoVF9aRHJ2VGRtX1BhcmFtcyAqcGFyYW1zKQ0KLXsNCi0gICAgVF9UZG1fVHhTdHJlYW0gICp0eFN0cmVhbSA9ICZzX3RkbVR4U3RyZWFtOw0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgVF9UZG1fUmVnICAgICAgICpwdFJlZyA9IE5VTEw7DQotICAgIFNJTlQzMiAgICAgICAgICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0gICAgaWYgKE5VTEwgPT0gcGFyYW1zKSAvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgYXNzZXJ00sa1vWlmwO8qLw0KLSAgICB7DQotICAgICAgICB6RHJ2X0FTU0VSVCgwKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0gICAgcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0gICAgdHhTdHJlYW0tPlRyYW5zaW5nID0gRkFMU0U7DQotICAgIHR4U3RyZWFtLT5wYXVzZUZsYWcgPSBGQUxTRTsNCi0gICAgdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSBOVUxMOw0KLSAgICB0eFN0cmVhbS0+Y2hhbm5lbCA9IHBhcmFtcy0+Y2hhbm5lbDsNCi0gICAgdHhTdHJlYW0tPnR4TGVuID0gcGFyYW1zLT5idWZmZXJzaXplOw0KLSAgICB0eFN0cmVhbS0+cF9jYiA9IHBhcmFtcy0+cF9jYjsNCi0NCi0JdHhTdHJlYW0tPnR4UmRJZHggPSAwOw0KLQl0eFN0cmVhbS0+dHhXcklkeCA9IDA7DQotDQotCXRkbV90eEJ1ZkFycmF5WzBdID0gKFVJTlQ4ICopKHRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3ZpcmFkZHIpOw0KLQl0ZG1fdHhCdWZBcnJheVsxXSA9IHRkbV90eEJ1ZkFycmF5WzBdICsgdHhTdHJlYW0tPnR4TGVuOw0KLQl0ZG1fdHhCdWZBcnJheVsyXSA9IHRkbV90eEJ1ZkFycmF5WzFdICsgdHhTdHJlYW0tPnR4TGVuOw0KLSAgICANCi0gICAgLyogcmVzZXQgdHggZmlmbyB0byBlbnN1cmUgdGhlcmUncmUgbm8gZGF0YSBvZiBsYXN0IHRyYW5zZmVyIGluIGZpZm8gKi8NCi0gICAgcHRSZWctPnR4Rmlmb0N0cmwgfD0gVERNX1RYX0ZJRk9fUlNUOw0KLSAgICAvKiA4IGJpdHMgYXZhaWxhYmxlIGZvciBUWCBGSUZPIHdvdWxkIGdlbmVyYXRlIERNQSBUWCBpbnRlcnJ1cHQqLw0KLSAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fVFhfRklGT19USFJFU0hPTEQoNyk7ICANCi0NCi0gICAgcmV0ID0gdGRtX1NldHVwVHhCdWYoKTsNCi0gICAgcmV0ICs9IHRkbV9RdWV1ZUluaXQoJih0eFN0cmVhbS0+dHhRdWV1ZSkpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB0ZG1fQ2xlYW5UeFJlc291cmNlKCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotICAgIHRkbV90eHNlbV9jb3VudF9Jbml0KCk7DQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRJc3INCi0qIERlc2NyaXB0aW9uOiBpbnRlcnJ1cHQgaGFuZGxlIHdoaWxlIGluIGludCBtb2RlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwdEluc3RhbmNlIDogdGRtIGluc3RhbmNlDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX1J4Q29tSW5pdChUX1pEcnZUZG1fUGFyYW1zICpwYXJhbXMpDQotew0KLSAgICBUX1RkbV9SeFN0cmVhbSAgKnJ4U3RyZWFtID0gJnNfdGRtUnhTdHJlYW07DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBUX1RkbV9SZWcgICAgICAgKnB0UmVnID0gTlVMTDsNCi0gICAgU0lOVDMyICAgICAgICAgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBwYXJhbXMpIC8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBhc3NlcnTSxrW9aWbA7yovDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQlyeFN0cmVhbS0+cnhMZW4gPSBwYXJhbXMtPmJ1ZmZlcnNpemU7DQotDQotCXRkbV9yeEJ1ZkFycmF5WzBdID0gKFVJTlQ4ICopKHRkbURtYVN0YXRlW1RETV9SWF0uZG1hX3ZpcmFkZHIpOw0KLQl0ZG1fcnhCdWZBcnJheVsxXSA9IHRkbV9yeEJ1ZkFycmF5WzBdICsgcnhTdHJlYW0tPnJ4TGVuOw0KLQl0ZG1fcnhCdWZBcnJheVsyXSA9IHRkbV9yeEJ1ZkFycmF5WzFdICsgcnhTdHJlYW0tPnJ4TGVuOw0KLSAgICBwdFJlZyA9IHB0SW5zdGFuY2UtPnB0RGV2LT5yZWdzOw0KLSAgICANCi0gICAgLyogcmVzZXQgcnggZmlmbyB0byBlbnN1cmUgdGhlcmUncmUgbm8gZGF0YSBvZiBsYXN0IHRyYW5zZmVyIGluIGZpZm8gKi8NCi0gICAgcHRSZWctPnJ4Rmlmb0N0cmwgfD0gVERNX1JYX0ZJRk9fUlNUOyAgICAgICAgIA0KLSAgICAvKiA4IGJpdHMgYXZhaWxhYmxlIGZvciBSWCBGSUZPIHdvdWxkIGdlbmVyYXRlIERNQSBSWCBpbnRlcnJ1cHQqLw0KLSAgICBwdFJlZy0+cnhGaWZvQ3RybCB8PSBURE1fUlhfRklGT19USFJFU0hPTEQoNyk7IA0KLQ0KLSAgICByZXQgPSB0ZG1fU2V0dXBSeEJ1ZigpOw0KLSAgICByZXQgKz0gdGRtX1F1ZXVlSW5pdCgmKHJ4U3RyZWFtLT5yeFF1ZXVlKSk7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHRkbV9DbGVhblJ4UmVzb3VyY2UoKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0JDQotICAgIHRkbV9yeHNlbV9jb3VudF9Jbml0KCk7DQotICAgIHJ4U3RyZWFtLT5yeExlbiA9IHBhcmFtcy0+YnVmZmVyc2l6ZTsNCi0vLyAgICByeFN0cmVhbS0+cnhJZHggPSAwOw0KLQ0KLQlyeFN0cmVhbS0+cnhSZElkeCA9IDA7DQotCXJ4U3RyZWFtLT5yeFdySWR4ID0gMDsNCi0vLyAgICByeFN0cmVhbS0+cnhCdWZmZXJBcnJheVtyeFN0cmVhbS0+cnhJZHhdLnRkbUJ1ZlN0YXR1cyA9IEJVRkZFUl9XUklURTsNCi0vLyAgICByeFN0cmVhbS0+Y3VycmVudFJ4QnVmID0gJnJ4U3RyZWFtLT5yeEJ1ZmZlckFycmF5W3J4U3RyZWFtLT5yeElkeF07DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRJc3INCi0qIERlc2NyaXB0aW9uOiBpbnRlcnJ1cHQgaGFuZGxlIHdoaWxlIGluIGludCBtb2RlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgTm9uZQ0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fSW50VHhJbml0KCkNCi17DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBUX1RkbV9UeFN0cmVhbSAgKnR4U3RyZWFtID0gJnNfdGRtVHhTdHJlYW07DQotICAgIFRfVGRtX0RldmljZSAgICAqcHREZXYgPSBOVUxMOw0KLSAgICBUX1RkbV9SZWcgICAgICAgKnB0UmVnID0gTlVMTDsNCi0NCi0gICAgcHREZXYgPSBwdEluc3RhbmNlLT5wdERldjsNCi0gICAgcHRSZWcgPSBwdERldi0+cmVnczsNCi0gICAgdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSB0ZG1fSW50VHg7DQotICAgIHB0UmVnLT5pbnRFbiAmPSB+KFRETV9JTlRfRU5fVFhfVEhSRVNIT0xEIHwgVERNX0lOVF9FTl9UWF9VTkRFUlJVTik7ICAvKiBkaXNhYmxlIHR4IGludGVycnVwdCAqLw0KLSAgICBwdFJlZy0+aW50U3RhdHVzIHw9IChURE1fSU5UX1RYX1RIUkVTSE9MRCB8IFRETV9JTlRfVFhfVU5ERVJSVU4pOyAgICAvKiBjbGVhciBpbnRlcnJ1cHQuIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgb3IgdGRtIGF0IGZpcnN0ICovDQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRJc3INCi0qIERlc2NyaXB0aW9uOiBpbnRlcnJ1cHQgaGFuZGxlIHdoaWxlIGluIGludCBtb2RlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwdEluc3RhbmNlIDogdGRtIGluc3RhbmNlDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0ludFJ4SW5pdCgpDQotew0KLSNpZiAwDQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBUX1RkbV9SeFN0cmVhbSAgKnJ4U3RyZWFtID0gJnNfdGRtUnhTdHJlYW07DQotICAgIFRfVGRtX0RldmljZSAgICAqcHREZXYgPSBOVUxMOw0KLSAgICBUX1RkbV9SZWcgICAgICAgKnB0UmVnID0gTlVMTDsNCi0NCi0gICAgcHREZXYgPSBwdEluc3RhbmNlLT5wdERldjsNCi0gICAgcHRSZWcgPSBwdERldi0+cmVnczsNCi0NCi0gICAgcHRSZWctPmludFN0YXR1cyB8PSAoVERNX0lOVF9SWF9USFJFU0hPTEQgfCBURE1fSU5UX1JYX09WRVJSVU4pOyAgICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotICAgIHB0UmVnLT5pbnRFbiAmPSB+KFRETV9JTlRfRU5fUlhfVEhSRVNIT0xEIHwgVERNX0lOVF9FTl9SWF9PVkVSUlVOKTsgICAvKiBkaXNhYmxlIHJ4IGludGVycnVwdCAqLw0KLQ0KLSAgICB0ZG1fcnhCdWYgPSAoVUlOVDE2ICopcnhTdHJlYW0tPmN1cnJlbnRSeEJ1Zi0+YnVmOw0KLSAgICB0ZG1fcnhMZW4gPSByeFN0cmVhbS0+cnhMZW4vIHNpemVvZihVSU5UMTYpOw0KLQ0KLSAgICByeFN0cmVhbS0+cnhJZHgrKzsNCi0gICAgcHRSZWctPmludEVuIHw9IFRETV9JTlRfRU5fUlhfVEhSRVNIT0xEOyAgICAgICAvKiBlbmFibGUgcnggaW50ZXJydXB0ICovDQotDQotICAgIGlmKFRETV9JTlRDVFJMX1RFU1RfTU9ERSA9PSBUUlVFKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+aW50RW4gfD0gIFRETV9JTlRfRU5fUlhfT1ZFUlJVTjsgLyogZW5hYmxlIHJ4IG92ZXIgaW50ZXJydXB0ICovDQotICAgIH0NCi0jZW5kaWYNCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX0ludElzcg0KLSogRGVzY3JpcHRpb246IGludGVycnVwdCBoYW5kbGUgd2hpbGUgaW4gaW50IG1vZGUNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgVk9JRCB0ZG1fSW50SXNyKCkNCi17DQotICAgIFRfVGRtX1JlZyAgICAqcHRSZWcgPSBzX3RkbUluc3RhbmNlLnB0RGV2LT5yZWdzOw0KLSAgICBUX1RkbV9UeFN0cmVhbSAqdGRtVHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgY29uc3QgVUlOVDMyICAgICB1aUludFN0YXR1cyA9IHB0UmVnLT5pbnRTdGF0dXM7DQotICAgIFVJTlQzMiBjaGFubkxhYmxlID0gMDsNCi0NCi0gICAgaWYoVERNX0lOVENUUkxfVEVTVF9NT0RFKSAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VODQotICAgIHsNCi0gICAgICAgIGlmICh1aUludFN0YXR1cyAmIFRETV9JTlRfVFhfVU5ERVJSVU4pICAgICAgICAgLyogdHggZXJyICovDQotICAgICAgICB7DQotICAgICAgICAgICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1RYX1VOREVSUlVOOyAgIC8qIGNsZWFyIGludGVycnVwdCAqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHVpSW50U3RhdHVzICYgVERNX0lOVF9SWF9PVkVSUlVOKSAgICAgICAgICAgLyogcnggZXJyICovDQotICAgICAgICB7DQotICAgICAgICAgICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1JYX09WRVJSVU47ICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0gICAgaWYgKHVpSW50U3RhdHVzICYgVERNX0lOVF9UWF9USFJFU0hPTEQpICAgICAgICAgIC8qIHBsYXlpbmcgKi8NCi0gICAgew0KLSAgICAgICAgcHRSZWctPmludEVuICY9IH5URE1fSU5UX0VOX1RYX1RIUkVTSE9MRDsgIC8qIGRpc2FibGUgdHggaW50ZXJydXB0ICovDQotICAgICAgICBwdFJlZy0+aW50U3RhdHVzIHw9IFRETV9JTlRfVFhfVEhSRVNIT0xEOyAgICAvKiBjbGVhciBpbnRlcnJ1cHQuIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgb3IgdGRtIGF0IGZpcnN0ICovDQotDQotICAgICAgICBjaGFubkxhYmxlID0gKHRkbVR4U3RyZWFtLT5jaGFubmVsID09IEFVRElPX0RVQUxfQ0hBTk5FTCkgPyAyIDogMTsNCi0gICAgICAgIHRkbV9JbnRUeFdyaXRlRmlmbyhjaGFubkxhYmxlKTsNCi0gICAgICAgIGlmICgwID09IHRkbV90eExlbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0ZG1fSW50VHhDaGFuZ2VCdWYoKTsNCi0gICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgLyogd2hpbGUgbm8gZGF0YSB0cmFucyx0aGVuIHJldHVybiBhbmQgbm90IGVuYWJsZSB0aGUgaW50ZXJydXB0LHNvIHRoZSBpbnRlcnJ1cHQgd2lsbCBub3QgZ2VuZXJhdGUqLw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHRSZWctPmludEVuIHw9IFRETV9JTlRfRU5fVFhfVEhSRVNIT0xEOyAvKiBlbmFibGUgdHggaW50ZXJydXB0ICovDQotICAgICAgICBpZihURE1fSU5UQ1RSTF9URVNUX01PREUpIC8va2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5HRU4NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdFJlZy0+aW50RW4gfD0gIFRETV9JTlRfRU5fVFhfVU5ERVJSVU47IC8qIGVuYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0gICAgaWYgKHVpSW50U3RhdHVzICYgVERNX0lOVF9SWF9USFJFU0hPTEQpICAgICAgICAgICAgICAgIC8qIHJlY29yZGluZyAqLw0KLSAgICB7DQotICAgICAgICBwdFJlZy0+aW50RW4gJj0gflRETV9JTlRfRU5fUlhfVEhSRVNIT0xEOyAgICAgICAgLyogZGlzYWJsZSByeCBpbnRlcnJ1cHQgKi8NCi0gICAgICAgIHB0UmVnLT5pbnRTdGF0dXMgfD0gVERNX0lOVF9SWF9USFJFU0hPTEQ7ICAgICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0NCi0gICAgICAgIHRkbV9JbnRSeFdyaXRlQnVmKCk7DQotDQotICAgICAgICBpZiAoMCA9PSB0ZG1fcnhMZW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgdGRtX0ludFJ4Q2hhbmdlQnVmKCk7DQotICAgICAgICB9DQotICAgICAgICBwdFJlZy0+aW50RW4gfD0gVERNX0lOVF9FTl9SWF9USFJFU0hPTEQgOyAgICAgICAgLyogZW5hYmxlIHJ4IGludGVycnVwdCAqLw0KLSAgICAgICAgaWYoVERNX0lOVENUUkxfVEVTVF9NT0RFKSAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VODQotICAgICAgICB7DQotICAgICAgICAgICAgcHRSZWctPmludEVuIHw9ICBURE1fSU5UX0VOX1JYX09WRVJSVU47IC8qIGVuYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAodWlJbnRTdGF0dXMgJiBURE1fSU5UX1RYX1VOREVSUlVOKSAgICAgICAgIC8qIHR4IGVyciAqLw0KLSAgICB7DQotICAgICAgICBwdFJlZy0+aW50U3RhdHVzIHw9IFRETV9JTlRfVFhfVU5ERVJSVU47ICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotICAgICAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fVFhfRklGT19SU1Q7ICAgICAgICAgIC8qIHJlc2V0IHR4IGZpZm8gKi8NCi0gICAgfQ0KLQ0KLSAgICBpZiAodWlJbnRTdGF0dXMgJiBURE1fSU5UX1JYX09WRVJSVU4pICAgICAgICAgICAvKiByeCBlcnIgKi8NCi0gICAgew0KLSAgICAgICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1JYX09WRVJSVU47ICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0gICAgICAgIHB0UmVnLT5yeEZpZm9DdHJsIHw9IFRETV9SWF9GSUZPX1JTVDsgICAgICAgICAgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0gICAgfQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fSW50VHhEYXRhVHJhbnMNCi0qIERlc2NyaXB0aW9uOiBjb25maWcgaW50ZXJydXB0IGhhbmRsZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgVk9JRCB0ZG1fSW50VHhXcml0ZUZpZm8oVUlOVDMyIGNoYW5sYWIpDQotew0KLSAgICBVSU5UMzIgICAgIHVpSGRsZWRMZW4gPSBURE1fVFhGTF9WQUw7DQotICAgIFRfVGRtX1JlZyAgKnB0UmVnID0gc190ZG1JbnN0YW5jZS5wdERldi0+cmVnczsNCi0gICAgVUlOVDMyIGNoYW5sYWJsZSA9IDE7DQotICAgIA0KLSAgICBjaGFubGFibGUgPSAyOw0KLQ0KLSAgICBpZiAodGRtX3R4TGVuID4gVERNX1RYRkxfVkFMKmNoYW5sYWJsZSkNCi0gICAgew0KLSAgICAgICAgdGRtX3R4TGVuIC09IHVpSGRsZWRMZW4qY2hhbmxhYmxlOw0KLSAgICAgICAgd2hpbGUgKDAgPCB1aUhkbGVkTGVuKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB0UmVnLT5kYXRhID0gKih0ZG1fdHhCdWYrKGNoYW5sYWJsZS0xKSkgfCAgKnRkbV90eEJ1Zjw8MTY7DQotICAgICAgICAgICAgdGRtX3R4QnVmICs9IGNoYW5sYWJsZTsNCi0gICAgICAgICAgICB1aUhkbGVkTGVuLS07DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICB3aGlsZSAoMCA8IHRkbV90eExlbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdFJlZy0+ZGF0YSA9ICoodGRtX3R4QnVmKyhjaGFubGFibGUtMSkpIHwgICp0ZG1fdHhCdWY8PDE2Ow0KLSAgICAgICAgICAgIHRkbV90eEJ1ZiArPSBjaGFubGFibGU7DQotICAgICAgICAgICAgdGRtX3R4TGVuIC09IGNoYW5sYWJsZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fSW50VHhEYXRhVHJhbnMNCi0qIERlc2NyaXB0aW9uOiBjb25maWcgaW50ZXJydXB0IGhhbmRsZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgVk9JRCB0ZG1fSW50UnhXcml0ZUJ1ZigpDQotew0KLSAgICBUX1RkbV9SZWcgICAqcHRSZWcgPSBzX3RkbUluc3RhbmNlLnB0RGV2LT5yZWdzOw0KLSAgICBVSU5UMzIgICAgICB1aVJ4bGVkTGVuID0gVERNX1JYRkxfVkFMOw0KLSAgICBVSU5UMzIgICAgICBkYXRhID0gMDsNCi0NCi0gICAgaWYgKHRkbV9yeExlbiA+IHVpUnhsZWRMZW4qMikNCi0gICAgew0KLSAgICAgICAgdGRtX3J4TGVuIC09IHVpUnhsZWRMZW4qMjsNCi0gICAgICAgIHdoaWxlICgwIDwgdWlSeGxlZExlbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBkYXRhID0gcHRSZWctPmRhdGE7DQotDQotICAgICAgICAgICAgKih0ZG1fcnhCdWYgKyAxKSA9IGRhdGEgJiAweGZmZmY7DQotICAgICAgICAgICAgKnRkbV9yeEJ1ZiA9IChkYXRhPj4xNikgJiAweGZmZmY7DQotICAgICAgICAgICAgdGRtX3J4QnVmICs9IDI7DQotICAgICAgICAgICAgdWlSeGxlZExlbi0tOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgd2hpbGUgKDAgPCB0ZG1fcnhMZW4pDQotICAgICAgICB7DQotICAgICAgICAgICAgZGF0YSA9IHB0UmVnLT5kYXRhOw0KLQ0KLSAgICAgICAgICAgICoodGRtX3J4QnVmICsgMSkgPSBkYXRhICYgMHhmZmZmOw0KLSAgICAgICAgICAgICp0ZG1fcnhCdWYgPSAoZGF0YT4+MTYpICYgMHhmZmZmOw0KLSAgICAgICAgICAgIHRkbV9yeEJ1ZiArPSAyOw0KLSAgICAgICAgICAgIHRkbV9yeExlbiAtPSAyOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRUeEJ1ZkNoYW5nZQ0KLSogRGVzY3JpcHRpb246IGNvbmZpZyBpbnRlcnJ1cHQgaGFuZGxlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBWT0lEIHRkbV9JbnRUeENoYW5nZUJ1ZigpDQotew0KLSAgICBUX1RkbV9UeFN0cmVhbSAqdGRtVHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgVF9UZG1fUXVldWVOb2RlICpxdWV1ZU5vZGUgPSBOVUxMOw0KLSAgICBVSU5UMzIgc2VtX2NudCA9IDA7DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgaWYgKERSVl9TVUNDRVNTID09IHRkbV9DaGFuZ2VUeEJ1ZmZlclN0YXR1cyhCVUZGRVJfUkVBRCAsQlVGRkVSX05VTEwpKSAvKmNoYW5nZSB0aGUgQlVGIHN0YXRlIGZyb20gUkVBRCB0byBGVUxMIGFmdGVyIHRoZSBkYXRhIG9mIHRoZSBidWYgaXMgcmVhZCBvdmVyLHRoZW4gcmVsZWFzZSB0aGUgc2VtKi8NCi0gICAgew0KLSAgICAgICAgek9zc19QdXRTZW1hcGhvcmUodGRtVHhTdHJlYW0tPnR4U2VtKTsNCi0gICAgfQ0KLQkNCi0gICAgaWYgKCEodGRtX0lzUXVldWVFbXB0eSgmdGRtVHhTdHJlYW0tPnR4UXVldWUpKSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRkbVR4U3RyZWFtLT5wYXVzZUZsYWcgPT0gRkFMU0UpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0ID0gdGRtX1F1ZXVlR2V0KCZ0ZG1UeFN0cmVhbS0+dHhRdWV1ZSwgJnF1ZXVlTm9kZSk7DQotCSAgICAgaWYocXVldWVOb2RlICE9IE5VTEwpDQotCSAgICAgew0KLSAgICAgICAgICAgIHJldCArPSB0ZG1fVXBkYXRlVHhCdWZmZXJTdGF0dXMocXVldWVOb2RlLT5wQnVmLCBCVUZGRVJfUkVBRCk7DQotICAgICAgICAgICAgcmV0ICs9IHRkbVR4U3RyZWFtLT50eFRyYW5zbWl0KHF1ZXVlTm9kZS0+cEJ1ZiwgcXVldWVOb2RlLT5sZW4pOw0KLQkgICAgIH0NCi0gICAgICAgICAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0ZG1UeFN0cmVhbS0+VHJhbnNpbmcgPSBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRkbVR4U3RyZWFtLT5UcmFuc2luZyA9IEZBTFNFOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHRkbVR4U3RyZWFtLT5UcmFuc2luZyA9IEZBTFNFOw0KLSAgICAgICAgc2VtX2NudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQodGRtVHhTdHJlYW0tPnR4U2VtKTsNCi0gICAgICAgIGlmIChzZW1fY250ID09IFRETV9PVVRfQlVGX05VTSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAodGRtVHhTdHJlYW0tPnBfY2IgIT0gTlVMTCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRkbVR4U3RyZWFtLT5wX2NiKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9JbnRSeEJ1ZkNoYW5nZQ0KLSogRGVzY3JpcHRpb246IGNvbmZpZyBpbnRlcnJ1cHQgaGFuZGxlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBWT0lEIHRkbV9JbnRSeENoYW5nZUJ1ZigpDQotew0KLSNpZiAwDQotICAgIFRfVGRtX1J4U3RyZWFtICp0ZG1SeFN0cmVhbSA9ICZzX3RkbVJ4U3RyZWFtOw0KLQ0KLSAgICBpZiAodGRtUnhTdHJlYW0tPnJ4QnVmZmVyQXJyYXlbdGRtUnhTdHJlYW0tPnJ4SWR4XS50ZG1CdWZTdGF0dXMgPT0gQlVGRkVSX05VTEwpDQotICAgIHsNCi0gICAgICAgIHRkbV9RdWV1ZVB1dCgmKHRkbVJ4U3RyZWFtLT5yeFF1ZXVlKSwgKFVJTlQxNiAqKXRkbVJ4U3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZiwgKHRkbVJ4U3RyZWFtLT5yeExlbiAvIHNpemVvZihVSU5UMTYpKSk7IC8qyc+0zsrVtb21xMr9vt0qLw0KLSAgICAgICAgdGRtX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzKChVSU5UMTYqKXRkbVJ4U3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZiAsQlVGRkVSX0ZVTEwpOw0KLQ0KLSAgICAgICAgek9zc19QdXRTZW1hcGhvcmUodGRtUnhTdHJlYW0tPnJ4U2VtKTsNCi0gICAgICAgIHRkbVJ4U3RyZWFtLT5yeEJ1ZmZlckFycmF5W3RkbVJ4U3RyZWFtLT5yeElkeF0udGRtQnVmU3RhdHVzID0gQlVGRkVSX1dSSVRFOw0KLSAgICAgICAgdGRtUnhTdHJlYW0tPmN1cnJlbnRSeEJ1ZiA9ICZ0ZG1SeFN0cmVhbS0+cnhCdWZmZXJBcnJheVt0ZG1SeFN0cmVhbS0+cnhJZHhdOw0KLSAgICAgICAgdGRtX3J4QnVmID0gKFVJTlQxNiAqKXRkbVJ4U3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZjsNCi0gICAgICAgIHRkbV9yeExlbiA9IHRkbVJ4U3RyZWFtLT5yeExlbiAvIHNpemVvZihVSU5UMTYpOw0KLSAgICAgICAgdGRtUnhTdHJlYW0tPnJ4SWR4ID0gKHRkbVJ4U3RyZWFtLT5yeElkeCArMSkgJSBURE1fT1VUX0JVRl9OVU07ICAgICAgICAgIC8qdXNlIHRoZSBidWYgaW4gdHVybiovDQotICAgIH0NCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgLyppZiB0aGUgbmV4dCBidWYgaXMgYmluZyB1c2Vko3R0aGVuIHJld3JpdGUgdGhlIGJ1ZiovDQotICAgIHsNCi0gICAgICAgIC8qIGZvciAocnhJbmRleCA9IDA7IHJ4SW5kZXggPCBURE1fT1VUX0JVRl9OVU0gOyByeEluZGV4ICsrKQ0KLSAgICAgICAgIHsNCi0gICAgICAgICAgICAgaWYgKHRkbVJ4U3RyZWFtLT5yeEJ1ZmZlckFycmF5W3J4SW5kZXhdLnRkbUJ1ZlN0YXR1cyA9PSBCVUZGRVJfV1JJVEUpDQotICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRkbVJ4U3RyZWFtLT5yeElkeCA9IHJ4SW5kZXg7DQotICAgICAgICAgdGRtUnhTdHJlYW0tPmN1cnJlbnRSeEJ1ZiA9ICZ0ZG1SeFN0cmVhbS0+cnhCdWZmZXJBcnJheVt0ZG1SeFN0cmVhbS0+cnhJZHhdOyovDQotICAgICAgICB0ZG1fcnhCdWYgPSAoVUlOVDE2ICopdGRtUnhTdHJlYW0tPmN1cnJlbnRSeEJ1Zi0+YnVmOw0KLSAgICAgICAgdGRtX3J4TGVuID0gdGRtUnhTdHJlYW0tPnJ4TGVuLyBzaXplb2YoVUlOVDE2KTsNCi0gICAgfQ0KLSNlbmRpZg0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICBpc3JfdGRtDQotKiBEZXNjcmlwdGlvbjogY29uZmlnIGludGVycnVwdCBoYW5kbGUNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgTm9uZQ0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFZPSUQgaXNyX3RkbShWT0lEKQ0KLXsNCi0gICAgdGRtX0ludElzcigpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgdGRtX0ludFR4DQotKiBEZXNjcmlwdGlvbjogdHJhbnMgZGF0YSBmcm9tIHJhbSB0byBmaWZvICB3aGlsZSBpbiBpbnQgbW9kZQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcEJ1ZiA6IGJ1ZmZlciBwb2ludGVyDQotKiAgICAgICAgICAgdWlMZW4gOiBidWZmZXIgbGVuZ3RoDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTogZXJyb3IgcGFyYW0NCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0ludFR4KGNvbnN0IFVJTlQxNiAqcEJ1ZiwgVUlOVDMyIHVpTGVuKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgVF9UZG1fRGV2aWNlICAgICpwdERldiA9IE5VTEw7DQotICAgIFRfVGRtX1JlZyAgICAgICAqcHRSZWcgPSBOVUxMOw0KLQ0KLQ0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgYXNzZXJ00sa1vWlmwO8qLw0KLSAgICBpZiAoTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgVERNX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKSANCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fUExBWV9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLSAgICB9DQotDQotICAgIHRkbV90eEJ1ZiA9IHBCdWY7DQotICAgIHRkbV90eExlbiA9IHVpTGVuOw0KLQ0KLSAgICBwdERldiA9IHB0SW5zdGFuY2UtPnB0RGV2Ow0KLSAgICBwdFJlZyA9IHB0RGV2LT5yZWdzOw0KLSAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fUlhfRklGT19USFJFU0hPTEQoNyk7ICAgIC8qRE1BIE1PREUgaXMgYWxzbyBuZWNlc3NyeSovDQotICAgIC8qIGNsZWFyIHR4IGludGVycnVwdCAqLw0KLSAgICBwdFJlZy0+aW50U3RhdHVzIHw9IChURE1fSU5UX1RYX1RIUkVTSE9MRCB8IFRETV9JTlRfVFhfVU5ERVJSVU4pOyAgICAvKiBjbGVhciBpbnRlcnJ1cHQuIG11c3QgZGlzYWJsZSBpbnRlcnJ1cHQgb3IgdGRtIGF0IGZpcnN0ICovDQotICAgIHB0UmVnLT5pbnRFbiB8PSBURE1fSU5UX0VOX1JYX1RIUkVTSE9MRDsgICAgICAgIC8qIGVuYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0gICAgaWYoVERNX0lOVENUUkxfVEVTVF9NT0RFKSAvL2tsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uR0VODQotICAgIHsNCi0gICAgICAgIHB0UmVnLT5pbnRFbiB8PSAgVERNX0lOVF9FTl9UWF9VTkRFUlJVTjsgLyogZW5hYmxlIHR4IHVuZGVyIGludGVycnVwdCAqLw0KLSAgICB9DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9EbWFUeEludENiDQotKiBEZXNjcmlwdGlvbjogY2FsbGJhY2sgZnVuY3Rpb24gd2hpbGUgcGxheWluZw0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgdEludFN0YXR1cyA6IGRtYSBzdGF0dXMNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmIDANCi1zdGF0aWMgVk9JRCB0ZG1fRG1hVHhJbnRDYihWT0lEKSAgLy8oVF9aRHJ2RG1hX0ludFN0YXR1cyB0SW50U3RhdHVzKQ0KLXsNCi0NCi0gICAgVF9UZG1fUmVnICAgICpwdFJlZyA9IHNfdGRtSW5zdGFuY2UucHREZXYtPnJlZ3M7DQotICAgIGNvbnN0IFVJTlQzMiAgICAgdWlJbnRTdGF0dXMgPSBwdFJlZy0+aW50U3RhdHVzOw0KLQ0KLSAgICB6RHJ2X0FTU0VSVCh0SW50U3RhdHVzIDwgTUFYX0RNQV9JTlQpOw0KLSAgICBpZiAodEludFN0YXR1cyA+PSAgTUFYX0RNQV9JTlQpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQkNCi0gICAgc3dpdGNoICh0SW50U3RhdHVzKQ0KLSAgICB7DQotICAgICAgICBjYXNlIERNQV9JTlRfRU5EOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRkbV9JbnRUeENoYW5nZUJ1ZigpOw0KLSAgICAgICAgICAgIGlmICh1aUludFN0YXR1cyAmIFRETV9JTlRfVFhfVU5ERVJSVU4pICAgICAgICAgLyogdHggZXJyICovDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwdFJlZy0+aW50U3RhdHVzIHw9IFRETV9JTlRfVFhfVU5ERVJSVU47ICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotICAgICAgICAgICAgICAgIHB0UmVnLT50eEZpZm9DdHJsIHw9IFRETV9UWF9GSUZPX1JTVDsgICAgICAgICAgLyogcmVzZXQgdHggZmlmbyAqLw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGNhc2UgRE1BX0lOVF9FUlI6DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotDQotfQ0KLSNlbmRpZg0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fRG1hUnhJbnRDYg0KLSogRGVzY3JpcHRpb246IHJlY29yZCBjYWxsYmFjayBmdW5jdGlvbiBpbiBkbWEgbW9kZSx3aGlsZSBvbmUgYnVmZmVyIGlzIGZ1bGwsIGNhbGwgdGhpcyBmdW5jdGlvbg0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcHRJbnN0YW5jZSA6IHRkbSBpbnN0YW5jZQ0KLSogICAgICAgICAgIHRJbnRTdGF0dXMgOiBkbWEgc3RhdHVzDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZiAwDQotc3RhdGljIFZPSUQgdGRtX0RtYVJ4SW50Q2IoVF9UZG1fSW5zdGFuY2UgKnB0SW5zdGFuY2UpDQotew0KLQ0KLSAgICBUX1RkbV9SeFN0cmVhbSAqdGRtU3RyZWFtID0gJnNfdGRtUnhTdHJlYW07DQotICAgIFVJTlQ4IHJ4SW5kZXggPSAwOw0KLQ0KLSAgICBUX1RkbV9SZWcgICAgKnB0UmVnID0gc190ZG1JbnN0YW5jZS5wdERldi0+cmVnczsNCi0gICAgY29uc3QgVUlOVDMyICAgICB1aUludFN0YXR1cyA9IHB0UmVnLT5pbnRTdGF0dXM7DQotICAgIHpEcnZfQVNTRVJUKChwdEluc3RhbmNlICE9IE5VTEwpICYmICh0SW50U3RhdHVzIDwgTUFYX0RNQV9JTlQpKTsNCi0gICAgaWYgKChOVUxMID09IHB0SW5zdGFuY2UpIHx8ICh0SW50U3RhdHVzID49ICBNQVhfRE1BX0lOVCkpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBzd2l0Y2ggKHRJbnRTdGF0dXMpDQotICAgIHsNCi0gICAgICAgIGNhc2UgRE1BX0lOVF9FTkQ6DQotICAgICAgICB7CQkJDQotCQkJVE9TX0RDQUNIRV9JTlZBTElEQVRFX1JBTkdFKChVSU5UMzIpdGRtU3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZiwgKFVJTlQxNil0ZG1TdHJlYW0tPnJ4TGVuKTsNCi0JCQkNCi0gICAgICAgICAgICBpZiAodGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W3RkbVN0cmVhbS0+cnhJZHhdLnRkbUJ1ZlN0YXR1cyA9PSBCVUZGRVJfTlVMTCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRkbV9RdWV1ZVB1dCgmdGRtU3RyZWFtLT5yeFF1ZXVlLCAoVUlOVDE2ICopdGRtU3RyZWFtLT5jdXJyZW50UnhCdWYtPmJ1ZiwgKHRkbVN0cmVhbS0+cnhMZW4gLyBzaXplb2YoVUlOVDE2KSkpOyAvKnB1dCB0aGUgZnVsbCBidWYgdG8gdGhlIHF1ZXVlKi8NCi0gICAgICAgICAgICAgICAgdGRtX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzKChVSU5UMTYqKXRkbVN0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsIEJVRkZFUl9GVUxMKTsNCi0NCi0gICAgICAgICAgICAgICAgek9zc19QdXRTZW1hcGhvcmUodGRtU3RyZWFtLT5yeFNlbSk7ICAgICAgICAgIC8qaWYgdGhlIG5leHQgYnVmIHN0YXR1cyBpcyBudWxsLHRoZW4gcmVsZWFzZSB0aGUgc2VtIHNvIHRoZSB1cGxheWVyIGNhbiBnZXQgdGhlIGJ1ZiB0byByZWFkKi8NCi0gICAgICAgICAgICAgICAgdGRtX0RtYVJ4KHB0SW5zdGFuY2UsIHRkbVN0cmVhbS0+cnhJZHgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKsjnufu+ycr9vt3Jz7Lj1f3U2r+9sbSjrNDCzO7C+rXEYnVm1tjQwszu0LQqLw0KLSAgICAgICAgICAgICAgICBmb3IgKHJ4SW5kZXggPSAwOyByeEluZGV4IDwgVERNX09VVF9CVUZfTlVNOyByeEluZGV4KyspICAgICAgICAgICAgICAgICAgICAgIC8qaWYgdGhlIG5leHQgYnVmIGlzIGJpbmcgdXNlZKN0dGhlbiByZXdyaXRlIHRoZSBidWYqKi8NCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVtyeEluZGV4XS50ZG1CdWZTdGF0dXMgPT0gQlVGRkVSX1dSSVRFKSAgICAgICAgLyppdCBpcyBuZWNlc3NhcnkgdG8gZmluZCB0aGUgaW5kZXgqLw0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1aUludFN0YXR1cyAmIFRETV9JTlRfUlhfT1ZFUlJVTikgICAgICAgICAgIC8qIHJ4IGVyciAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1JYX09WRVJSVU47ICAgICAvKiBjbGVhciBpbnRlcnJ1cHQgKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRSZWctPnJ4Rmlmb0N0cmwgfD0gVERNX1JYX0ZJRk9fUlNUOyAgICAgICAgICAgLyogcmVzZXQgcnggZmlmbyAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidGRtX0RtYVJ4SW50Q2IgcnhlcnIxIHVpSW50U3RhdHVzPTB4JXgiLHVpSW50U3RhdHVzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGRtU3RyZWFtLT5yeElkeCA9IHJ4SW5kZXg7DQotICAgICAgICAgICAgICAgIHRkbV9EbWFSeChwdEluc3RhbmNlLCByeEluZGV4KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGRtU3RyZWFtLT5yeElkeCA9ICh0ZG1TdHJlYW0tPnJ4SWR4ICsxKSAlIFRETV9PVVRfQlVGX05VTTsNCi0NCi0gICAgICAgICAgICBpZiAodWlJbnRTdGF0dXMgJiBURE1fSU5UX1JYX09WRVJSVU4pICAgICAgICAgICAvKiByeCBlcnIgKi8NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHB0UmVnLT5pbnRTdGF0dXMgfD0gVERNX0lOVF9SWF9PVkVSUlVOOyAgICAgLyogY2xlYXIgaW50ZXJydXB0ICovDQotICAgICAgICAgICAgICAgIHB0UmVnLT5yeEZpZm9DdHJsIHw9IFRETV9SWF9GSUZPX1JTVDsgICAgICAgICAgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9EbWFSeEludENiIHJ4ZXJyMiB1aUludFN0YXR1cz0weCV4Iix1aUludFN0YXR1cyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBETUFfSU5UX0VSUjoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0NCi19DQotI2VuZGlmDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIGRtYWNiX3RkbV9yeA0KLSogRGVzY3JpcHRpb246IHNldCBjYWxsIGJhY2sgZnVuY3Rpb24NCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRJbnRTdGF0dXMgOiB0ZG0gaW5zdGFuY2UNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgTm9uZQ0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFZPSUQgZG1hY2JfdGRtX3J4KHZvaWQgKmRhdGEpDQotew0KLQlVSU5UMzIgc2VtX2NudCA9IDA7DQotCVRfVGRtX1J4U3RyZWFtICp0ZG1SeFN0cmVhbSA9ICZzX3RkbVJ4U3RyZWFtOw0KLQ0KLSAgICBpZih0ZG1SeFN0cmVhbS0+cnhCdWZmZXJBcnJheSA9PSBOVUxMKXsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLQl0ZG1fVXBkYXRlUnhCdWZmZXJTdGF0dXMoKFVJTlQxNiAqKSh0ZG1SeFN0cmVhbS0+cnhCdWZmZXJBcnJheVt0ZG1SeFN0cmVhbS0+cnhXcklkeF0uYnVmKSwgQlVGRkVSX0ZVTEwpOyANCi0JdGRtUnhTdHJlYW0tPnJ4V3JJZHggPSAodGRtUnhTdHJlYW0tPnJ4V3JJZHggKyAxKSAlIFRETV9PVVRfQlVGX05VTTsNCi0Jc2VtX2NudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQodGRtUnhTdHJlYW0tPnJ4U2VtKTsNCi0JaWYoc2VtX2NudCA8IFRETV9PVVRfQlVGX05VTSkgew0KLQkJek9zc19QdXRTZW1hcGhvcmUodGRtUnhTdHJlYW0tPnJ4U2VtKTsgDQotCX0gZWxzZSB7DQotCQl0ZG1SeFN0cmVhbS0+cnhSZElkeCA9ICh0ZG1SeFN0cmVhbS0+cnhSZElkeCArIDEpICUgVERNX09VVF9CVUZfTlVNOw0KLQl9DQotDQotICAgLy8gdGRtX0RtYVJ4SW50Q2IoJnNfdGRtSW5zdGFuY2UsIHRJbnRTdGF0dXMpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICBkbWFjYl90ZG1fdHgNCi0qIERlc2NyaXB0aW9uOiBjb25maWcgaW50ZXJydXB0IGNhbGxiYWNrDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBWT0lEIGRtYWNiX3RkbV90eCh2b2lkICpkYXRhKQ0KLXsNCi0JVUlOVDMyIHNlbV9jbnQgPSAwOw0KLQlUX1RkbV9UeFN0cmVhbSAqdGRtVHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0NCi0gICAgaWYodGRtVHhTdHJlYW0tPnR4QnVmZmVyQXJyYXkgPT0gTlVMTCl7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgDQotCXRkbV9VcGRhdGVUeEJ1ZmZlclN0YXR1cygoVUlOVDE2ICopKHRkbVR4U3RyZWFtLT50eEJ1ZmZlckFycmF5W3RkbVR4U3RyZWFtLT50eFJkSWR4XS5idWYpLCBCVUZGRVJfTlVMTCk7ICAgICAgIC8qyc+y4835KnBCdWbQtM3qyv2+3brzo6y4xLHkQlVG17TMrM6qRlVMTCovDQotCXRkbVR4U3RyZWFtLT50eFJkSWR4ID0gKHRkbVR4U3RyZWFtLT50eFJkSWR4ICsgMSklVERNX09VVF9CVUZfTlVNOw0KLQlzZW1fY250ID0gek9zc19HZXRTZW1hcGhvcmVDb3VudCh0ZG1UeFN0cmVhbS0+dHhTZW0pOw0KLQlpZihzZW1fY250IDwgVERNX09VVF9CVUZfTlVNKSB7DQotCQl6T3NzX1B1dFNlbWFwaG9yZSh0ZG1UeFN0cmVhbS0+dHhTZW0pOw0KLQl9IGVsc2Ugew0KLQkJdGRtVHhTdHJlYW0tPnR4V3JJZHggPSAodGRtVHhTdHJlYW0tPnR4V3JJZHggKyAxKSAlIFRETV9PVVRfQlVGX05VTTsNCi0JfQ0KLQ0KLSAgLy8gIHRkbV9EbWFUeEludENiKHRJbnRTdGF0dXMpOw0KLX0NCi0jaWYgMA0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fRG1hUngNCi0qIERlc2NyaXB0aW9uOiB1c2UgYnVmZmVyIGlkeCB0byByZWNvcmQgZGF0YQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgdEludFN0YXR1cyA6IHRkbSBpbnN0YW5jZQ0KLSogICAgICAgICAgIGlkeCA6IGJ1ZmZlciBpbmRleA0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBOb25lDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9EbWFSeChUX1RkbV9JbnN0YW5jZSAqcHRJbnN0YW5jZSwgVUlOVDggaWR4KQ0KLXsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBUX1RkbV9SeFN0cmVhbSAqdGRtU3RyZWFtID0gJnNfdGRtUnhTdHJlYW07DQotICAgIFRfWkRydkRtYV9DaGFubmVsRGVmIHRDaGFuRGVmID0gezB9Ow0KLSAgICAvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sInRkbV9EbWFSeCBcbiIpOw0KLQ0KLSAgICB6RHJ2X0FTU0VSVCgocHRJbnN0YW5jZSAhPSBOVUxMKSAmJiAoaWR4IDwgVERNX09VVF9CVUZfTlVNKSk7DQotICAgIGlmIChOVUxMID09IHB0SW5zdGFuY2UgfHwgaWR4ID49IFRETV9PVVRfQlVGX05VTSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLSAgICANCi0gICAgdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2lkeF0udGRtQnVmU3RhdHVzID0gQlVGRkVSX1dSSVRFIDsNCi0gICAgdGRtU3RyZWFtLT5jdXJyZW50UnhCdWYgPSAmdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W2lkeF07DQotDQotCVRPU19EQ0FDSEVfSU5WQUxJREFURV9SQU5HRSgoVUlOVDMyKXRkbVN0cmVhbS0+Y3VycmVudFJ4QnVmLT5idWYsIChVSU5UMTYpdGRtU3RyZWFtLT5yeExlbik7DQotICAgIC8vZHdDbnQg0KHT2jY0a8fpv/YNCi0gICAgdENoYW5EZWYuU3JjQWRkciA9IChVSU5UMzIpJihwdEluc3RhbmNlLT5wdERldi0+cmVncy0+ZGF0YSk7DQotICAgIHRDaGFuRGVmLkRlc3RBZGRyID0gKFVJTlQzMil0ZG1TdHJlYW0tPmN1cnJlbnRSeEJ1Zi0+YnVmOw0KLSAgICBpZihnVGRtQ250Q2hhbmdlUng+PSAtODApDQotICAgIHsNCi0gICAgICAgIHRDaGFuRGVmLkNvdW50ID0gKChVSU5UMTYpdGRtU3RyZWFtLT5yeExlbikgKyBnVGRtQ250Q2hhbmdlUngqMjsvLypzaXplb2YoVUlOVDMyKTsvL3VpTGVuKnNpemVvZihVSU5UMTYpDQotICAgICAgICBnVGRtQ250Q2hhbmdlUnggPSAwOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgdENoYW5EZWYuQ291bnQgPSAoKFVJTlQxNil0ZG1TdHJlYW0tPnJ4TGVuKSAtIDgwKjI7Ly8qc2l6ZW9mKFVJTlQzMik7Ly91aUxlbipzaXplb2YoVUlOVDE2KQ0KLSAgICAgICAgZ1RkbUNudENoYW5nZVJ4ID0gZ1RkbUNudENoYW5nZVJ4KzgwOw0KLSAgICB9DQotDQotICAgIHRDaGFuRGVmLkxMSSA9IE5VTEw7DQotDQotICAgIHRDaGFuRGVmLkNPTlRST0wuQnVyc3RSZXFNb2QgPSBETUFfUEVSSVBIRVJBTF9SRVE7DQotICAgIHRDaGFuRGVmLkNPTlRST0wuU3JjTW9kID0gRE1BX0FERFJNT0RfRklGTzsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5EZXN0TW9kID0gRE1BX0FERFJNT0RfUkFNOw0KLSAgICB0Q2hhbkRlZi5DT05UUk9MLklycU1vZCA9IERNQV9BTExfSVJRX0VOQUJMRTsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5TcmNCdXJzdFNpemUgPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5TcmNCdXJzdExlbiA9IERNQV9CVVJTVF9MRU5fODsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5EZXN0QnVyc3RTaXplID0gRE1BX0JVUlNUX1NJWkVfMzJCSVQ7DQotICAgIHRDaGFuRGVmLkNPTlRST0wuSW50U2VsID0gRE1BX0lOVF9UT19QUzsNCi0JDQotICAgIHJldCA9IHpEcnZEbWFfQ29uZmlnQ2hhbm5lbChwdEluc3RhbmNlLT5EbWFSeElELCB0Q2hhbkRlZik7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHpEcnZEbWFfRGVBbGxvY0NoYW5uZWwocHRJbnN0YW5jZS0+RG1hUnhJRCk7DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotICAgIC8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywidGRtX0RtYVJ4IHpEcnZEbWFfQ29uZmlnQ2hhbm5lbCByZXQgJWRcbiIsIHJldCk7DQotDQotICAgIHJldCA9IHpEcnZEbWFfU3RhcnRDaGFubmVsKHB0SW5zdGFuY2UtPkRtYVJ4SUQsIHB0SW5zdGFuY2UtPmZEbWFDYlJ4LCBGQUxTRSk7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHpEcnZEbWFfRGVBbGxvY0NoYW5uZWwocHRJbnN0YW5jZS0+RG1hUnhJRCk7DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotICAgIC8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywidGRtX0RtYVJ4IHpEcnZEbWFfU3RhcnRDaGFubmVsIHJldCAlZFxuIiwgcmV0KTsNCi0gICAgcmV0dXJuIHJldDsNCi19DQotI2VuZGlmDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9EbWFSeEluaXQNCi0qIERlc2NyaXB0aW9uOiBkbWEgIGluaXQgd2hpbGUgcmVjb3JkaW5nDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIFNJTlQzMiB0ZG1fRG1hUnhJbml0KCkNCi17DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9IE5VTEw7DQotICAgIFRfVGRtX1J4U3RyZWFtICp0ZG1TdHJlYW0gPSAmc190ZG1SeFN0cmVhbTsNCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLQ0KLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOw0KLQlkbWFfY2FwX21hc2tfdCBtYXNrOw0KLQkNCi0JZG1hX2NhcF96ZXJvKG1hc2spOw0KLQlkbWFfY2FwX3NldChETUFfQ1lDTElDLCBtYXNrKTsNCi0JDQotCWRtYV9jaGFubmVsX2RlZiB0ZW1wWzNdOw0KLQlpbnQgCWk7DQotCW1lbXNldCh0ZW1wLCAwLCBzaXplb2YodGVtcCkpOw0KLQl0ZG1EbWFTdGF0ZVtURE1fUlhdLmNoYW5uZWwgPSBETUFfQ0hfVERNX1JYMDsNCi0JdGRtRG1hU3RhdGVbVERNX1JYXS5jaCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgengyOV9kbWFfZmlsdGVyX2ZuLCAodm9pZCopKHRkbURtYVN0YXRlW1RETV9SWF0uY2hhbm5lbCkpOw0KLQkNCi0JZm9yIChpID0gMDsgaSA8IFRETV9PVVRfQlVGX05VTTsgaSsrKSB7DQotCQl0ZW1wW2ldLmRlc3RfYWRkciAJPSB0ZG1EbWFTdGF0ZVtURE1fUlhdLmRtYV9waHlhZGRyICArICh0ZG1TdHJlYW0tPnJ4TGVuKSAqIGk7DQotCQl0ZW1wW2ldLnNyY19hZGRyCT0gWlgyOV9URE1fUEhZUyArIDB4MjQ7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnRyYW5fbW9kZSA9IFRSQU5fUEVSSV9UT19NRU07DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9sZW4gCT0gRE1BX0JVUlNUX0xFTl84Ow0KLQkJdGVtcFtpXS5jb3VudAkJPSB0ZG1TdHJlYW0tPnJ4TGVuOw0KLQkJLy8JCXRlbXBbaV0uY2FsbGJhY2sJPSAoZG1hX2NhbGxiYWNrX2Z1bmMpZG1hX2NiOw0KLQkJLyoNCi0JCQl0ZW1wW2ldLmRtYV9jb250cm9sLnRyYW5fbW9kZSAJCT0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sNCi0JCQkJCQkJCQkJCQkJPyBUUkFOX01FTV9UT19QRVJJIDogVFJBTl9QRVJJX1RPX01FTSk7DQotCQkJdGVtcFtpXS5kbWFfY29udHJvbC5zcmNfYnVyc3RfbGVuIAk9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLDQotCQkJCQkJCQkJCQkJCT8gRE1BX0JVUlNUX0xFTl8xNiA6IERNQV9CVVJTVF9MRU5fOCk7DQotCQkqLw0KLQkJdGVtcFtpXS5kbWFfY29udHJvbC5zcmNfYnVyc3Rfc2l6ZSAJPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuZGVzdF9idXJzdF9zaXplID0gRE1BX0JVUlNUX1NJWkVfMzJCSVQ7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLmRlc3RfYnVyc3RfbGVuIAk9IERNQV9CVVJTVF9MRU5fODsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuaXJxX21vZGUgCQk9IERNQV9BTExfSVJRX0VOQUJMRTsNCi0JCXRlbXBbaV0ubGlua19hZGRyIAkJPSAxOw0KLQl9DQotDQotCXRlbXBbVERNX09VVF9CVUZfTlVNIC0gMV0ubGlua19hZGRyIAk9IDA7DQotDQotCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcodGRtRG1hU3RhdGVbVERNX1JYXS5jaCwgKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnKikmdGVtcCk7DQotDQotCWRlc2MgPSB0ZG1EbWFTdGF0ZVtURE1fUlhdLmNoLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMoDQotICAgICAgICAgICB0ZG1EbWFTdGF0ZVtURE1fUlhdLmNoLA0KLSAgICAgICAgICAgdGRtRG1hU3RhdGVbVERNX1JYXS5kbWFfcGh5YWRkciwgdGRtU3RyZWFtLT5yeExlbiAqIDMsDQotICAgICAgICAgICB0ZG1TdHJlYW0tPnJ4TGVuLA0KLSAgICAgICAgICAgRE1BX0RFVl9UT19NRU0sDQotICAgICAgICAgICBOVUxMKTsNCi0NCi0JZGVzYy0+Y2FsbGJhY2sgPSAoZG1hX2FzeW5jX3R4X2NhbGxiYWNrKWRtYWNiX3RkbV9yeDsNCi0JZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBOVUxMOw0KLQ0KLQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOyAgDQotDQotICAgCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHRkbURtYVN0YXRlW1RETV9SWF0uY2gpOw0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fRG1hVHhJbml0DQotKiBEZXNjcmlwdGlvbjogaW5pdCBkbWEgdHJhbnMNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotKiBPdGhlcnM6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgU0lOVDMyIHRkbV9EbWFUeEluaXQoKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBUX1RkbV9UeFN0cmVhbSAqdHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0NCi0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsNCi0JZG1hX2NhcF9tYXNrX3QgbWFzazsJDQotCWRtYV9jYXBfemVybyhtYXNrKTsNCi0JZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgbWFzayk7CQ0KLQlkbWFfY2hhbm5lbF9kZWYgdGVtcFszXTsNCi0JaW50IAlpOw0KLQltZW1zZXQodGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsNCi0JdGRtRG1hU3RhdGVbVERNX1RYXS5jaGFubmVsID0gRE1BX0NIX1RETV9UWDA7CQ0KLQl0ZG1EbWFTdGF0ZVtURE1fVFhdLmNoID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCB6eDI5X2RtYV9maWx0ZXJfZm4sICh2b2lkKikodGRtRG1hU3RhdGVbVERNX1RYXS5jaGFubmVsKSk7DQotCQ0KLQlmb3IgKGkgPSAwOyBpIDwgVERNX09VVF9CVUZfTlVNOyBpKyspIHsNCi0JCXRlbXBbaV0uc3JjX2FkZHIgCT0gdGRtRG1hU3RhdGVbVERNX1RYXS5kbWFfcGh5YWRkciArICh0eFN0cmVhbS0+dHhMZW4pICogaTsNCi0JCXRlbXBbaV0uZGVzdF9hZGRyCT0gWlgyOV9URE1fUEhZUyArIDB4MjQ7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnRyYW5fbW9kZSA9IFRSQU5fTUVNX1RPX1BFUkk7DQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9sZW4gCT0gRE1BX0JVUlNUX0xFTl84Ow0KLQkJdGVtcFtpXS5jb3VudAkJPSB0eFN0cmVhbS0+dHhMZW47DQotCQkvLwkJdGVtcFtpXS5jYWxsYmFjawk9IChkbWFfY2FsbGJhY2tfZnVuYylkbWFfY2I7DQotCQkvKg0KLQkJCXRlbXBbaV0uZG1hX2NvbnRyb2wudHJhbl9tb2RlIAkJPSAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSw0KLQkJCQkJCQkJCQkJCQk/IFRSQU5fTUVNX1RPX1BFUkkgOiBUUkFOX1BFUklfVE9fTUVNKTsNCi0JCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9sZW4gCT0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sNCi0JCQkJCQkJCQkJCQkJPyBETUFfQlVSU1RfTEVOXzE2IDogRE1BX0JVUlNUX0xFTl84KTsNCi0JCSovDQotCQl0ZW1wW2ldLmRtYV9jb250cm9sLnNyY19idXJzdF9zaXplIAk9IERNQV9CVVJTVF9TSVpFXzMyQklUOw0KLQkJdGVtcFtpXS5kbWFfY29udHJvbC5kZXN0X2J1cnN0X3NpemUgPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0JCXRlbXBbaV0uZG1hX2NvbnRyb2wuZGVzdF9idXJzdF9sZW4gCT0gRE1BX0JVUlNUX0xFTl84Ow0KLQkJdGVtcFtpXS5kbWFfY29udHJvbC5pcnFfbW9kZSAJCT0gRE1BX0FMTF9JUlFfRU5BQkxFOw0KLQkJdGVtcFtpXS5saW5rX2FkZHIgCQk9IDE7DQotCX0NCi0NCi0JdGVtcFtURE1fT1VUX0JVRl9OVU0gLSAxXS5saW5rX2FkZHIgCT0gMDsNCi0NCi0JZG1hZW5naW5lX3NsYXZlX2NvbmZpZyh0ZG1EbWFTdGF0ZVtURE1fVFhdLmNoLCAoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcqKSZ0ZW1wKTsNCi0NCi0JZGVzYyA9IHRkbURtYVN0YXRlW1RETV9UWF0uY2gtPmRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX2N5Y2xpYygNCi0gICAgICAgICAgIHRkbURtYVN0YXRlW1RETV9UWF0uY2gsDQotICAgICAgICAgICB0ZG1EbWFTdGF0ZVtURE1fVFhdLmRtYV9waHlhZGRyLCB0eFN0cmVhbS0+dHhMZW4gKiAzLA0KLSAgICAgICAgICAgdHhTdHJlYW0tPnR4TGVuLA0KLSAgICAgICAgICAgRE1BX01FTV9UT19ERVYsDQotICAgICAgICAgICBOVUxMKTsNCi0NCi0JZGVzYy0+Y2FsbGJhY2sgPSAoZG1hX2FzeW5jX3R4X2NhbGxiYWNrKWRtYWNiX3RkbV90eDsNCi0JZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBOVUxMOw0KLQ0KLQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOyAgIA0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLSNpZiAwDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHRkbV9EbWFSeA0KLSogRGVzY3JpcHRpb246IHBsYXlpbmcgZHVhbCBhdWRpbyBkYXRhIGRtYSBzZXR0aW5nDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwQnVmIDogYnVmZmVyIGluZGV4DQotKiAgICAgICAgICAgdWlMZW4gOiBidWZmZXIgc2l6ZQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUzpvcGVyYXRlIHN1Y2Nlc3MNCi0qIE90aGVyczoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBTSU5UMzIgdGRtX0RtYVR4KGNvbnN0IFVJTlQxNiAqcEJ1ZiwgVUlOVDMyICB1aUxlbikNCi17DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIFRfVGRtX1R4U3RyZWFtICAqdHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgVF9aRHJ2RG1hX0NoYW5uZWxEZWYgdENoYW5EZWYgPSB7MH07DQotDQotICAgIHpEcnZfQVNTRVJUKChwQnVmICE9IE5VTEwpICYmICh1aUxlbiAhPSAwKSAmJiAodWlMZW4gPD0gVERNX01BWF9UWF9CVUZfU0laRSkpOw0KLSAgICBpZiAoTlVMTCA9PSBwQnVmIHx8IDAgPT0gdWlMZW4gfHwgVERNX01BWF9UWF9CVUZfU0laRSA8IHVpTGVuKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbV9EbWFUeCBidWYgMHgleCEgXHJcbiIsICpwQnVmKTsNCi0JVE9TX0NBQ0hFX0NMRUFOX1JBTkdFKCh1bnNpZ25lZCBsb25nKXBCdWYsIHVpTGVuICogc2l6ZW9mKFVJTlQxNikpOy8veGl1DQotCQ0KLSAgICB0Q2hhbkRlZi5TcmNBZGRyID0gKFVJTlQzMikocEJ1Zik7DQotICAgIHRDaGFuRGVmLkRlc3RBZGRyID0gKFVJTlQzMikmKHB0SW5zdGFuY2UtPnB0RGV2LT5yZWdzLT5kYXRhKTsNCi0NCi0gICAgaWYoZ1RkbUNudENoYW5nZVR4ID49IC04MCkNCi0gICAgew0KLSAgICAgICAgdENoYW5EZWYuQ291bnQgPSB1aUxlbipzaXplb2YoVUlOVDE2KSArIGdUZG1DbnRDaGFuZ2VUeCAqIDI7Ly+0q8rktcTX1r3atPPQoQ0KLSAgICAgICAgZ1RkbUNudENoYW5nZVR4ID0gMDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHRDaGFuRGVmLkNvdW50ID0gdWlMZW4qc2l6ZW9mKFVJTlQxNikgLSA4MCAqIDI7Ly8qc2l6ZW9mKFVJTlQzMik7Ly91aUxlbipzaXplb2YoVUlOVDE2KQ0KLSAgICAgICAgZ1RkbUNudENoYW5nZVR4ID0gZ1RkbUNudENoYW5nZVR4ICsgODA7DQotICAgIH0NCi0NCi0gICAgdENoYW5EZWYuTExJID0gTlVMTDsNCi0NCi0gICAgdENoYW5EZWYuQ09OVFJPTC5CdXJzdFJlcU1vZCA9IERNQV9QRVJJUEhFUkFMX1JFUTsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5TcmNNb2QgPSBETUFfQUREUk1PRF9SQU07DQotICAgIHRDaGFuRGVmLkNPTlRST0wuRGVzdE1vZCA9IERNQV9BRERSTU9EX0ZJRk87DQotICAgIHRDaGFuRGVmLkNPTlRST0wuSXJxTW9kID0gRE1BX0FMTF9JUlFfRU5BQkxFOw0KLSAgICB0Q2hhbkRlZi5DT05UUk9MLlNyY0J1cnN0U2l6ZSA9IERNQV9CVVJTVF9TSVpFXzMyQklUOw0KLSAgICB0Q2hhbkRlZi5DT05UUk9MLlNyY0J1cnN0TGVuID0gRE1BX0JVUlNUX0xFTl84OyAgIA0KLSAgICB0Q2hhbkRlZi5DT05UUk9MLkRlc3RCdXJzdFNpemUgPSBETUFfQlVSU1RfU0laRV8zMkJJVDsNCi0gICAgdENoYW5EZWYuQ09OVFJPTC5JbnRTZWwgPSBETUFfSU5UX1RPX1BTOw0KLQ0KLSAgICByZXQgPSB6RHJ2RG1hX0NvbmZpZ0NoYW5uZWwocHRJbnN0YW5jZS0+RG1hVHhJRCwgdENoYW5EZWYpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB6RHJ2RG1hX0RlQWxsb2NDaGFubmVsKHB0SW5zdGFuY2UtPkRtYVR4SUQpOw0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICByZXQgPSB6RHJ2RG1hX1N0YXJ0Q2hhbm5lbChwdEluc3RhbmNlLT5EbWFUeElELCBwdEluc3RhbmNlLT5mRG1hQ2JUeCwgRkFMU0UpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB6RHJ2RG1hX0RlQWxsb2NDaGFubmVsKHB0SW5zdGFuY2UtPkRtYVR4SUQpOw0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLSNlbmRpZg0KLXN0YXRpYyBWT0lEIHRkbV9Jbml0SW50KCkNCi17DQotICAgIHN0YXRpYyBUX1RkbV9EZXZpY2Ugc19UZG1EZXY7DQotDQotICAgIGlmIChzX2JUZG1Jbml0SW50KQ0KLSAgICAgICAgcmV0dXJuOw0KLQkNCi0gICAgbWVtc2V0KCZzX1RkbURldiwgMCwgc2l6ZW9mKHNfVGRtRGV2KSk7DQotICAgIHNfVGRtRGV2LmludGxpbmUgPSBURE1fSU5UOw0KLSAgICBzX1RkbURldi5pbnRwcmlvID0gMTU7DQotICAgIHNfVGRtRGV2LnJlZ3MgPSAoVF9UZG1fUmVnKilURE1fUkVHX0JBU0U7ICAgICAgICAgICAgDQotICAgIHNfdGRtSW5zdGFuY2UucHREZXYgPSAmc19UZG1EZXY7DQotICAgIHNfYlRkbUluaXRJbnQgPSBUUlVFOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHRkbV9Jbml0SW50KFRETV9SRUdfQkFTRSkgPSAleCIsVERNX1JFR19CQVNFKTsgDQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VERNX0luaXQoVk9JRCkNCi17DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sInpEcnZURE1fX0luaXQgXG4iKTsNCi0NCi0gICAgc190ZG1SeFN0cmVhbS5yeFNlbSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJ0ZG1fcnhfc2VtIiwgMCk7IA0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBkZWxldGUgaWYqLw0KLQkvKg0KLSAgICBpZihOVUxMID09IHNfdGRtUnhTdHJlYW0ucnhTZW0pDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgdGRtX3J4X3NlbSBlcnIgXG4iKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0qLw0KLQ0KLSAgICBzX3RkbVR4U3RyZWFtLnR4U2VtID0gek9zc19DcmVhdGVTZW1hcGhvcmUoInRkbV90eF9zZW0iLCAwKTsNCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggZGVsZXRlIGlmKi8NCi0JLyoNCi0JaWYoTlVMTCA9PSBzX3RkbVR4U3RyZWFtLnR4U2VtKQ0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIHRkbV90eF9zZW0gZXJyIFxuIik7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9Ki8NCi0JDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHRkbV9yeHNlbV9jb3VudF9Jbml0KCkNCi17DQotICAgIFVJTlQzMiBpID0gMDsNCi0gICAgVUlOVDMyIHNlbUNvdW50ID0gMDsNCi0gICAgU0lOVDMyIENvdW50ID0gMDsNCi0NCi0gICAgVF9UZG1fUnhTdHJlYW0gICpyeFN0cmVhbSA9ICZzX3RkbVJ4U3RyZWFtOw0KLS8vcnggc2VtIGNvdW50IDANCi0gICAgc2VtQ291bnQgPSB6T3NzX0dldFNlbWFwaG9yZUNvdW50KHJ4U3RyZWFtLT5yeFNlbSk7DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ0ZG0gcnhTdHJlYW0tPnJ4U2VtIGNvdW50PSVkIFxyXG4iLHNlbUNvdW50KTsNCi0NCi0gICAgQ291bnQgPSBzZW1Db3VudDsNCi0gICAgaWYgKENvdW50ID4gMCkNCi0gICAgew0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IENvdW50OyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19HZXRTZW1hcGhvcmUocnhTdHJlYW0tPnJ4U2VtLCBaT1NTX05PX1dBSVQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB0ZG1fdHhzZW1fY291bnRfSW5pdCgpDQotew0KLSAgICBVSU5UMzIgaSA9IDA7DQotICAgIFVJTlQzMiBzZW1Db3VudCA9IDA7DQotICAgIFNJTlQzMiBDb3VudCA9IDA7DQotDQotICAgIFRfVGRtX1R4U3RyZWFtICAqdHhTdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgLy90eCBzZW0gY291bnQgMw0KLQ0KLSAgICBzZW1Db3VudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQodHhTdHJlYW0tPnR4U2VtKTsNCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRkbSB0eFN0cmVhbS0+dHhTZW0gY291bnQ9JWQgIixzZW1Db3VudCk7DQotDQotICAgIENvdW50PVRETV9VUExJTktfU0VNX05VTS1zZW1Db3VudDsNCi0gICAgaWYgKENvdW50ID4gMCkNCi0gICAgew0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IENvdW50OyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19QdXRTZW1hcGhvcmUodHhTdHJlYW0tPnR4U2VtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlIGlmIChDb3VudCA8IDApDQotICAgIHsNCi0gICAgICAgIENvdW50ID0gMCAtIENvdW50Ow0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IENvdW50OyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19HZXRTZW1hcGhvcmUodHhTdHJlYW0tPnR4U2VtLCBaT1NTX05PX1dBSVQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgekRydlRETV9PcGVuDQotKiBEZXNjcmlwdGlvbjpvcGVuIHRkbSBkZXZpY2UNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIHRkbVRyYW5zRnVuYyA6IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXINCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6RHJ2VERNX09wZW4oVF9aRHJ2STJzX1RyYW5zTW9kZSB0ZG1UcmFuc01vZGUpDQotew0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLSAgICBUX1RkbV9EZXZpY2UgICAgKnB0RGV2ID0gTlVMTDsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBTSU5UMzIJcmV0dXJuVmFsdWUgPSAwOw0KLQlVSU5UMzIgYnVmU2l6ZTsNCi0JVUlOVDMyIHR4QnVmU2l6ZTsNCi0JVUlOVDMyIHJ4QnVmU2l6ZTsNCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtU3RhdHVzID09IFRETV9PUEVOIHx8IHB0SW5zdGFuY2UtPnRkbVN0YXR1cyA9PSBURE1fUExBWV9JTlVTRSB8fCBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPT0gVERNX1JFQ09SRF9JTlVTRSB8fCBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJob3dhcmQgekRydlRETV9PcGVuIGVyciB0ZG1TdGF0dXM9JWQiLHB0SW5zdGFuY2UtPnRkbVN0YXR1cyk7DQotCQl6RHJ2X0FTU0VSVCgwKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX09QRU5fVElNRVM7DQotICAgIH0NCi0NCi0gICAgI2lmZGVmIF9VU0VfUFNNDQotICAgIHpEcnZQb3dfU2V0RGV2QWN0aXZlKChVSU5UMzIpSURMRV9GTEFHX1RETSk7DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX09wZW4gQWN0aXZlKElETEVfRkxBR19URE0pXG4iKTsNCi0gICAgI2VuZGlmDQotDQotICAgIHRkbV9Jbml0SW50KCk7DQotDQotICAgIHRkbV9DbGtJbml0KCk7DQotDQotICAgIHB0RGV2ID0gcHRJbnN0YW5jZS0+cHREZXY7DQotICAgIHB0SW5zdGFuY2UtPnRkbVRyYW5zTW9kZSA9IHRkbVRyYW5zTW9kZTsNCi0gICAgDQotCWlmKChnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9PSBWT0lDRV9HU01fTU9ERSl8fChnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9PSBWT0lDRV9MVEVfTU9ERSl8fCBcDQotCQkoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfV0NETUFfTU9ERSl8fChnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9PSBWT0lDRV9URF9NT0RFKSkgew0KLQkJYnVmU2l6ZSA9IFRETV9NQVhfVk9JQ0VfTFRFX01FTV9TSVpFICogNjsNCi0JCXR4QnVmU2l6ZSA9IFRETV9NQVhfVk9JQ0VfTFRFX01FTV9TSVpFOw0KLQkJcnhCdWZTaXplID0gVERNX01BWF9WT0lDRV9MVEVfTUVNX1NJWkU7DQotCX0gZWxzZSB7DQotCQlidWZTaXplID0gKFRETV9NQVhfVFhfQlVGX1NJWkUgKyBURE1fTUFYX1JYX0JVRl9TSVpFKSAqIDM7DQotCQl0eEJ1ZlNpemUgPSBURE1fTUFYX1RYX0JVRl9TSVpFOw0KLQkJcnhCdWZTaXplID0gVERNX01BWF9SWF9CVUZfU0laRTsNCi0JfQ0KLQ0KLQlpZigoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfR1NNX01PREUpfHwoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfTFRFX01PREUpfHwgXA0KLQkJKGdfdm9pY2VWYXIudm9pY2VNb2RlID09IFZPSUNFX1dDRE1BX01PREUpfHwoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfVERfTU9ERSkpDQotCXsNCi0JCXRkbURtYVN0YXRlW1RETV9UWF0udG90YWxidWZmc2l6ZSA9IFRETV9NQVhfVk9JQ0VfTFRFX01FTV9TSVpFICogMzsJDQotCQl0ZG1EbWFTdGF0ZVtURE1fUlhdLnRvdGFsYnVmZnNpemUgPSBURE1fTUFYX1ZPSUNFX0xURV9NRU1fU0laRSAqIDM7CQkNCi0JCXR4QnVmU2l6ZSA9IFRETV9NQVhfVk9JQ0VfTFRFX01FTV9TSVpFOw0KLQkJcnhCdWZTaXplID0gVERNX01BWF9WT0lDRV9MVEVfTUVNX1NJWkU7DQotCQl0ZG1EbWFTdGF0ZVtURE1fVFhdLnNpbmdsZWJ1ZmZzaXplID0gVERNX01BWF9WT0lDRV9MVEVfTUVNX1NJWkU7DQotCQl0ZG1EbWFTdGF0ZVtURE1fUlhdLnNpbmdsZWJ1ZmZzaXplID0gVERNX01BWF9WT0lDRV9MVEVfTUVNX1NJWkU7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl0ZG1EbWFTdGF0ZVtURE1fVFhdLnRvdGFsYnVmZnNpemUgPSBURE1fTUFYX1RYX0JVRl9TSVpFICogMzsJDQotCQl0ZG1EbWFTdGF0ZVtURE1fUlhdLnRvdGFsYnVmZnNpemUgPSBURE1fTUFYX1JYX0JVRl9TSVpFICogMzsNCi0JCXR4QnVmU2l6ZSA9IFRETV9NQVhfVFhfQlVGX1NJWkU7DQotCQlyeEJ1ZlNpemUgPSBURE1fTUFYX1JYX0JVRl9TSVpFOw0KLQkJdGRtRG1hU3RhdGVbVERNX1RYXS5zaW5nbGVidWZmc2l6ZSA9IFRETV9NQVhfVFhfQlVGX1NJWkU7DQotCQl0ZG1EbWFTdGF0ZVtURE1fUlhdLnNpbmdsZWJ1ZmZzaXplID0gVERNX01BWF9SWF9CVUZfU0laRTsNCi0JfQ0KLQ0KLQl0ZG1EbWFTdGF0ZVtURE1fVFhdLmRtYV92aXJhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZSgmdGRtX2RldmljZS5kZXYsIHRkbURtYVN0YXRlW1RETV9UWF0udG90YWxidWZmc2l6ZSwNCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3BoeWFkZHIpLCBHRlBfS0VSTkVMKTsgDQotCQ0KLQl0ZG1EbWFTdGF0ZVtURE1fUlhdLmRtYV92aXJhZGRyID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZSgmdGRtX2RldmljZS5kZXYsIHRkbURtYVN0YXRlW1RETV9SWF0udG90YWxidWZmc2l6ZSwNCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHRkbURtYVN0YXRlW1RETV9SWF0uZG1hX3BoeWFkZHIpLCBHRlBfS0VSTkVMKTsgDQotCQ0KLQlpZiAoKE5VTEwgPT0gdGRtRG1hU3RhdGVbVERNX1RYXS5kbWFfdmlyYWRkcil8fChOVUxMID09IHRkbURtYVN0YXRlW1RETV9SWF0uZG1hX3ZpcmFkZHIpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiW1hLXUJVRl9OVU0gTWFsbG9jIEZhaWxlZCEgJXAsJXAsJXgsJXhcbiIsIHRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3ZpcmFkZHIsIHRkbURtYVN0YXRlW1RETV9SWF0uZG1hX3ZpcmFkZHIsIFwNCi0JCQkJCQkJCXRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3BoeWFkZHIsIHRkbURtYVN0YXRlW1RETV9SWF0uZG1hX3BoeWFkZHIpOw0KLQkJcmV0dXJuIERSVl9FUlJfTUVNX0FMTE9DOw0KLQl9DQotCWVsc2UJCQ0KLQl7CQ0KLS8qCQl0ZG1fdHhCdWZBcnJheVt0SWRdWzBdID0gKFVJTlQ4ICopKHRkbURtYVN0YXRlW3RJZF1bVERNX1RYXS5kbWFfdmlyYWRkcik7DQotCQl0ZG1fdHhCdWZBcnJheVt0SWRdWzFdID0gdGRtX3R4QnVmQXJyYXlbdElkXVswXSArIHR4QnVmU2l6ZTsNCi0JCXRkbV90eEJ1ZkFycmF5W3RJZF1bMl0gPSB0ZG1fdHhCdWZBcnJheVt0SWRdWzFdICsgdHhCdWZTaXplOw0KLQkJdGRtX3J4QnVmQXJyYXlbdElkXVswXSA9IChVSU5UOCAqKSh0ZG1EbWFTdGF0ZVt0SWRdW1RETV9SWF0uZG1hX3ZpcmFkZHIpOw0KLQkJdGRtX3J4QnVmQXJyYXlbdElkXVsxXSA9IHRkbV9yeEJ1ZkFycmF5W3RJZF1bMF0gKyByeEJ1ZlNpemU7DQotCQl0ZG1fcnhCdWZBcnJheVt0SWRdWzJdID0gdGRtX3J4QnVmQXJyYXlbdElkXVsxXSArIHJ4QnVmU2l6ZTsNCi0NCi0JCXRkbURtYVN0YXRlW3RJZF0uZG1hX3R4X3BoeWFkZHJbMV0gPSB0ZG1EbWFTdGF0ZVt0SWRdLmRtYV90eF9waHlhZGRyWzBdICsgdHhCdWZTaXplOw0KLQkJdGRtRG1hU3RhdGVbdElkXS5kbWFfdHhfcGh5YWRkclsyXSA9IHRkbURtYVN0YXRlW3RJZF0uZG1hX3R4X3BoeWFkZHJbMV0gKyB0eEJ1ZlNpemU7DQotCQl0ZG1EbWFTdGF0ZVt0SWRdLmRtYV9yeF9waHlhZGRyWzFdID0gdGRtRG1hU3RhdGVbdElkXS5kbWFfcnhfcGh5YWRkclswXSArIHJ4QnVmU2l6ZTsNCi0JCXRkbURtYVN0YXRlW3RJZF0uZG1hX3J4X3BoeWFkZHJbMl0gPSB0ZG1EbWFTdGF0ZVt0SWRdLmRtYV9yeF9waHlhZGRyWzFdICsgcnhCdWZTaXplOw0KLSovDQotCX0NCi0NCi0gICAgcmV0ID0gdGRtX1Jlc2V0KCk7DQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIIGRlbGV0ZSBpZiovDQotICAgIC8qDQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgICNpZmRlZiBfVVNFX1BTTQ0KLSAgICAgICAgaWYgKHNfdGRtSW5zdGFuY2UudGRtU3RhdHVzID09IFRETV9JRExFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpEcnZQb3dfU2V0RGV2SWRsZSgoVUlOVDMyKUlETEVfRkxBR19URE0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZGlmDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiW1RETV10ZG1fUmVzZXRGYWlsZWQhISEhXG4iKTsNCi0JCXpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfSovDQotICAgIC8qIHZhbHVlIG9mIGNvbnRyb2wgcmVnaXN0ZXIgaXMgMCBhZnRlciByZXNldGVkICovDQotICAgIHB0SW5zdGFuY2UtPnRDZmcuYk1hc3RlciAgPSBGQUxTRTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVRyYW5zTW9kZSA9PSBUUkFOU19JTlRfTU9ERSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuVmFsdWUgPSB6RHJ2SW50X0luc3RhbGxJc3IocHREZXYtPmludGxpbmUsIChWT0lEICopaXNyX3RkbSwgInRkbSIsSU5UX0hJR0hMRVZFTCk7DQotDQotICAgICAgICBpZiAocmV0dXJuVmFsdWUgPCAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICNpZmRlZiBfVVNFX1BTTQ0KLSAgICAgICAgICAgIGlmIChzX3RkbUluc3RhbmNlLnRkbVN0YXR1cyA9PSBURE1fSURMRSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpEcnZQb3dfU2V0RGV2SWRsZSgoVUlOVDMyKUlETEVfRkxBR19URE0pOw0KLSAgICAgICAgICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9PcGVuIERldklkbGUoSURMRV9GTEFHX1RETSlcbiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHREZXYtPnBpZCA9IChQUk9DRVNTKXJldHVyblZhbHVlOw0KLSAgICB9DQotCQ0KLSNpZmRlZiBfVVNFX1BTTQ0KLQl6RHJ2UG93X1NldERldkFjdGl2ZSgoVUlOVDMyKSBJRExFX0ZMQUdfVERNKTsNCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fT3BlbiBEZXZBY3RpdmUoSURMRV9GTEFHX1RETSlcbiIpOw0KLSNlbmRpZg0KLQ0KLSAgICBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPSBURE1fT1BFTjsNCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1TSU5UMzIgekRydlRETV9SZXNldCgpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXJldCA9IHRkbV9SZXNldCgpOw0KLQkNCi0JcmV0dXJuIHJldDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgekRydlRETV9DbG9zZQ0KLSogRGVzY3JpcHRpb246Y2xvc2UgIHRkbSBkZXZpY2UNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpEcnZURE1fQ2xvc2UoKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQkNCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9PUEVOKQ0KLSAgICB7DQotICAgIAl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9DbG9zZSBURE0sIHRkbVN0YXR1cz0lZCAhPSBURE1fT1BFTiIsc190ZG1JbnN0YW5jZS50ZG1TdGF0dXMpOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTk9UX09QRU5FRDsNCi0gICAgfQ0KLQkNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVRyYW5zTW9kZSA9PSBUUkFOU19JTlRfTU9ERSkNCi0gICAgICAgIC8qIHJlc2V0IHR4L3J4IGZpZm8gdG8gZW5zdXJlIHRoZXJlJ3JlIG5vIGRhdGEgb2YgbGFzdCB0cmFuc2ZlciBpbiBmaWZvICovDQotICAgICAgICAvKiBzZXQgdGhlIEZJRk8gaW50IHRocmVzaG9sZCAqLw0KLSAgICB7DQotICAgICAgICByZXQgKz0gekRydkludF9Vbmluc3RhbGxJc3IocHRJbnN0YW5jZS0+cHREZXYtPmludGxpbmUpOw0KLSAgICAgICAgLyogZW5hYmxlIHRkbTsgZW5hYmxlIHR4ICovDQotDQotICAgIH0NCi0NCi0JaWYgKHRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3ZpcmFkZHIgIT0gTlVMTCkgew0KLQlkbWFfZnJlZV93cml0ZWNvbWJpbmUoJnRkbV9kZXZpY2UuZGV2LCB0ZG1EbWFTdGF0ZVtURE1fVFhdLnRvdGFsYnVmZnNpemUsDQotCQkgICAgICAgICAgICAgICAgICAgICAgdGRtRG1hU3RhdGVbVERNX1RYXS5kbWFfdmlyYWRkciwgdGRtRG1hU3RhdGVbVERNX1RYXS5kbWFfcGh5YWRkcik7DQotCXRkbURtYVN0YXRlW1RETV9UWF0uZG1hX3ZpcmFkZHIgPSBOVUxMOw0KLQl9DQotCWlmICh0ZG1EbWFTdGF0ZVtURE1fUlhdLmRtYV92aXJhZGRyICE9IE5VTEwpIHsNCi0JCWRtYV9mcmVlX3dyaXRlY29tYmluZSgmdGRtX2RldmljZS5kZXYsIHRkbURtYVN0YXRlW1RETV9SWF0udG90YWxidWZmc2l6ZSwNCi0JCQkgICAgICAgICAgICAgICAgICAgICAgdGRtRG1hU3RhdGVbVERNX1JYXS5kbWFfdmlyYWRkciwgdGRtRG1hU3RhdGVbVERNX1JYXS5kbWFfcGh5YWRkcik7DQotCQl0ZG1EbWFTdGF0ZVtURE1fUlhdLmRtYV92aXJhZGRyID0gTlVMTDsNCi0JfQ0KLQ0KLSAgICByZXQgPSB0ZG1fUmVzZXQoKTsNCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggZGVsZXRlIGlmKi8NCi0JLyoNCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLQkqLw0KLSAgICB0ZG1fQ2xvc2VDbGsoKTsNCi0gICAgdGRtX0Nsa0RlaW5pdCgpOw0KLSAgICBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPSBURE1fSURMRTsNCi0NCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggyb6z/Wlmx9K199X7y7PQ8iovDQotI2lmZGVmIF9VU0VfUFNNDQotICAgIHpEcnZQb3dfU2V0RGV2SWRsZSgoVUlOVDMyKUlETEVfRkxBR19URE0pOw0KLSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9PcGVuIERldklkbGUoSURMRV9GTEFHX1RETSlcbiIpOw0KLSNlbmRpZg0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9DbG9zZSwgdGRtU3RhdHVzPSVkIiwgc190ZG1JbnN0YW5jZS50ZG1TdGF0dXMpOw0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHpEcnZURE1fV3JpdGVfU3RhcnQNCi0qIERlc2NyaXB0aW9uOiBzdGFydCB0byB0cmFucyBkYXRhLHVzZSBpbiBwbGF5aW5nDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBidWZfc2l6ZSA6IG9uZSBidWZmZXIgaXMgaG93IG1hbnkgYnl0ZXMNCi0qICAgICAgICAgICBwdENmZyA6IGNvbmZpZyBwYXJhbQ0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpEcnZURE1fV3JpdGVfUHJlcGFyZShUX1pEcnZUZG1fQ2ZnICogcHRDZmcpDQotew0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgVF9UZG1fUmVnICAgICAgICpwdFJlZyA9IE5VTEw7DQotICAgIFNJTlQzMiAgICAgICAgICAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1dyaXRlX1ByZXBhcmUscHRDZmc9JXAhIFxyXG4iLHB0Q2ZnKTsNCi0NCi0gICAgaWYgKE5VTEwgPT0gcHRDZmcpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0NCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIltURE1dekRydlRETV9Xcml0ZV9QcmVwYXJlISBcclxuIik7DQotICAgIHB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotICAgIHJldCA9IHRkbV9UeENoZWNrU3RhdGUocHRDZmcpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9Xcml0ZV9QcmVwYXJlOiAgdGRtX1R4Q2hlY2tTdGF0ZSBlcnIgcmV0PSVkXHJcbiIscmV0KTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0NCi0gICAgcHRSZWctPnByb2Nlc3NDdHJsIHw9IFRETV9FTjsNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgdGltaW5nIGN0cmwpID0gJXgiLCAgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT50aW1pbmdDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgdHhGaWZvQ3RybCkgPSAleCIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+dHhGaWZvQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9Xcml0ZV9QcmVwYXJlIGZyYW1lIGN0cmwpID0gJXgiLChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+ZnJhbWVDbnRyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgdHhGaWZvQ3RybCkgPSAleCIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+dHhGaWZvQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9Xcml0ZV9QcmVwYXJlIHByb2Nlc3MgY3RybCkgPSAleCIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+cHJvY2Vzc0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fV3JpdGVfUHJlcGFyZSByZWcgaW50RW4pID0gJXgiLCAgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5pbnRFbik7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9Xcml0ZV9QcmVwYXJlIHJlZyBpbnRTdGF0dXMpID0gJXhcbiIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+aW50U3RhdHVzKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgcmVnIHdyaXRlQ250Q3RybCkgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+d3JpdGVDbnRDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgcmVnIHdyaXRlQ250cikgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+d3JpdGVDbnRyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1dyaXRlX1ByZXBhcmUgcmVnIHdyaXRlQ250cjIpID0gJXhcbiIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPndyaXRlQ250cjIpOw0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VERNX1dyaXRlX1N0YXJ0X0RvKFRfWkRydlRkbV9QYXJhbXMgKnBhcmFtcykNCi17DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBUX1RkbV9UeFN0cmVhbSAgKnR4U3RyZWFtID0gJnNfdGRtVHhTdHJlYW07DQotICAgIFRfVGRtX1JlZyAgICAgICAqcHRSZWcgPSBOVUxMOw0KLSAgICBTSU5UMzIgICAgICAgICAgIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBTSU5UMzIgICAgICAgICAgIHdhaXRUaW1lID0gMDsNCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggYXNzZXJ00sa1vWlmwO8qLw0KLSAgICBpZiAoTlVMTCA9PSBwYXJhbXMpDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQ0KLSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9Xcml0ZV9TdGFydC9yL24iKTsNCi0gICAgcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0gICAgdHhTdHJlYW0tPmNoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWw7DQotCQ0KLSAgICByZXQgKz0gdGRtX1R4Q29tSW5pdChwYXJhbXMpOw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtVHJhbnNNb2RlID09IFRSQU5TX0lOVF9NT0RFKQ0KLSAgICB7DQotICAgICAgICB0eFN0cmVhbS0+dHhUcmFuc21pdCA9IHRkbV9JbnRUeDsgICAgICAgICAgICAgIC8qaW5pdCB0aGUgdHJhbnN0ZXIgZnVuY3Rpb24gLGl0IHdpbGwgYmUgY2FsbGVkIGluIFdyaXRlKCkgZnVuY3Rpb24qLw0KLSAgICAgICAgcmV0ICs9IHRkbV9JbnRUeEluaXQoKTsNCi0gICAgICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGRtX0NsZWFuVHhSZXNvdXJjZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZSBpZiAocHRJbnN0YW5jZS0+dGRtVHJhbnNNb2RlID09IFRSQU5TX0RNQV9NT0RFKQ0KLSAgICB7DQotICAgLy8gICAgIHR4U3RyZWFtLT50eFRyYW5zbWl0ID0gdGRtX0RtYVR4Ow0KLSAgICAgICAgcmV0ICs9IHRkbV9EbWFUeEluaXQoKTsNCi0gICAgICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGRtX0NsZWFuVHhSZXNvdXJjZSgpOw0KLSAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICB9DQotICAgICAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fVFhfRE1BX0VOOyAgICAgICAgICAgIC8qIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8NCi0gICAgfQ0KLSAgICBwdFJlZy0+cHJvY2Vzc0N0cmwgfD0gIFRETV9UWF9PUEVOIDsNCi0NCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRDZmcuYk1hc3RlciA9PSBUUlVFKSAgICAgICAgICAgICAgICAgIC8qIHdhaXQgKi8NCi0gICAgew0KLSAgICAgICAgLy8gICB3aGlsZSAoMCA9PSAocHRSZWctPmNvbW1vbkN0cmwgJiBURE1fRU5fQkFDSyl8fCAwID09IChwdFJlZy0+Y29tbW9uQ3RybCAmIFRETV9UWF9PUEVOX0JBQ0spKSAgLyogZW5zdXJlIHRkbSBpcyBlbmFibGVkICovICAgLyogZW5zdXJlIHR4IGlzIG9wZW5lZCAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfU2xlZXAoVERNX0VOQUJMRV9ERUxBWV9USU1FKTsNCi0NCi0gICAgICAgICAgICB3YWl0VGltZSArPSBURE1fRU5BQkxFX0RFTEFZX1RJTUU7DQotCQkJLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggZGVsZXRlIGlmKi8NCi0JCQkvKg0KLSAgICAgICAgICAgIGlmICh3YWl0VGltZSA9PSAxMDAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIndhaXRUaW1lIGVycm9yIik7DQotICAgICAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICAgICAgfSovDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHRJbnN0YW5jZS0+dGRtU3RhdHVzID0gKChwdEluc3RhbmNlLT50ZG1TdGF0dXMpID09IFRETV9SRUNPUkRfSU5VU0UpPyBURE1fQk9USF9JTlVTRSA6IFRETV9QTEFZX0lOVVNFOw0KLQ0KLSAgICBnVGRtQ250Q2hhbmdlVHggPSAwOw0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VERNX1dyaXRlX1N0YXJ0KFRfWkRydlRkbV9QYXJhbXMgKnBhcmFtcywgVF9aRHJ2VGRtX0NmZyAqcHRDZmcpDQotew0KLSAgICBTSU5UMzIgICAgICAgICAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1dyaXRlX1N0YXJ0XHJcbiIpOw0KLQ0KLSAgICByZXQgPSB6RHJ2VERNX1dyaXRlX1ByZXBhcmUocHRDZmcpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9SZWFkX1N0YXJ0ICB6RHJ2VERNX1dyaXRlX1ByZXBhcmUgZXJyb3IgcmV0PSVkIFxyXG4iLHJldCk7DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotCQ0KLSAgICByZXQgPSB6RHJ2VERNX1dyaXRlX1N0YXJ0X0RvKHBhcmFtcyk7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1JlYWRfU3RhcnQgIHpEcnZURE1fV3JpdGVfU3RhcnRfRG8gZXJyb3IgcmV0PSVkIFxyXG4iLHJldCk7DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotCQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBGdW5jdGlvbjogIHpEcnZURE1fUmVhZF9TdGFydA0KLSogRGVzY3JpcHRpb246IHN0YXJ0IHRvIHRyYW5zIGRhdGEsdXNlIGluIHJlY29yZGluZw0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgYnVmX3NpemUgOiBvbmUgYnVmZmVyIGlzIGhvdyBtYW55IGJ5dGVzDQotKiAgICAgICAgICAgcHRDZmcgOiBjb25maWcgcGFyYW0NCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6RHJ2VERNX1JlYWRfUHJlcGFyZShUX1pEcnZUZG1fQ2ZnICpwdENmZykNCi17DQotICAgIFNJTlQzMiAgICAgICAgICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgVF9UZG1fUmVnICAgICAgICpwdFJlZyA9IE5VTEw7DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBhc3NlcnTSxrW9aWbA7yovDQotICAgIGlmIChOVUxMID09IHB0Q2ZnICkNCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJbVERNXXpEcnZURE1fUmVhZF9QcmVwYXJlIFxyXG4iKTsNCi0gICAgcHRSZWcgPSBwdEluc3RhbmNlLT5wdERldi0+cmVnczsNCi0gICAgcmV0ID0gdGRtX1J4Q2hlY2tTdGF0ZShwdENmZyk7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1JlYWRfUHJlcGFyZTogIHRkbV9SeENoZWNrU3RhdGUgZXJyIHJldD0lZFxyXG4iLHJldCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotICAgIHB0UmVnLT5wcm9jZXNzQ3RybCB8PSBURE1fRU47DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9SZWFkX1ByZXBhcmUgdGltaW5nIGN0cmwpID0gJXgiLCAgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT50aW1pbmdDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1JlYWRfUHJlcGFyZSByeEZpZm9DdHJsKSA9ICV4IiwgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5yeEZpZm9DdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1JlYWRfUHJlcGFyZSBmcmFtZSBjdHJsKSA9ICV4Iiwoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPmZyYW1lQ250cik7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9SZWFkX1ByZXBhcmUgcnhGaWZvQ3RybCkgPSAleCIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+cnhGaWZvQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9SZWFkX1ByZXBhcmUgcHJvY2VzcyBjdHJsKSA9ICV4IiwgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5wcm9jZXNzQ3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9SZWFkX1ByZXBhcmUgcmVnIGludEVuKSA9ICV4IiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+aW50RW4pOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fUmVhZF9QcmVwYXJlIHJlZyBpbnRTdGF0dXMpID0gJXhcbiIsIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+aW50U3RhdHVzKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1JlYWRfUHJlcGFyZSByZWcgcmVhZENudEN0cmwpID0gJXhcbiIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnJlYWRDbnRDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1JlYWRfUHJlcGFyZSByZWcgcmVhZENudHIpID0gJXhcbiIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnJlYWRDbnRyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX1JlYWRfUHJlcGFyZSByZWcgcmVhZENudHIyKSA9ICV4XG4iLCAgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5yZWFkQ250cjIpOw0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2VERNX1JlYWRfU3RhcnRfRG8oVF9aRHJ2VGRtX1BhcmFtcyAqcGFyYW1zKQ0KLXsNCi0NCi0gICAgU0lOVDMyICAgICAgICAgIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBUX1RkbV9SZWcgICAgICAgKnB0UmVnID0gTlVMTDsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIFNJTlQzMiAgICAgICAgICAgd2FpdFRpbWUgPSAwOw0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBhc3NlcnTSxrW9aWbA7yovDQotICAgIGlmIChOVUxMID09IHBhcmFtcykNCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1JlYWRfU3RhcnQvci9uIik7DQotICAgIHB0UmVnID0gcHRJbnN0YW5jZS0+cHREZXYtPnJlZ3M7DQotICAgIHJldCA9IHRkbV9SeENvbUluaXQocGFyYW1zKTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVRyYW5zTW9kZSA9PSBUUkFOU19JTlRfTU9ERSkNCi0gICAgew0KLSAgICAgICAgcmV0ICs9IHRkbV9JbnRSeEluaXQoKTsgICAgICAgICAgICAgICAgICAvKndpbGwgZW5hYmxlIHRoZSBSWCBpbnRlcnJ1cHQqLw0KLSAgICAgICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0ZG1fQ2xlYW5SeFJlc291cmNlKCk7DQotICAgICAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlIGlmIChwdEluc3RhbmNlLT50ZG1UcmFuc01vZGUgPT0gVFJBTlNfRE1BX01PREUpDQotICAgIHsNCi0gICAgICAgIHJldCArPSB0ZG1fRG1hUnhJbml0KCk7DQotICAgICAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRkbV9DbGVhblJ4UmVzb3VyY2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHRSZWctPnJ4Rmlmb0N0cmwgfD0gVERNX1JYX0RNQV9FTjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZSBkbWEgdHJhbnNmZXIgKi8NCi0gICAgfQ0KLSAgICBwdFJlZy0+cHJvY2Vzc0N0cmwgfD0gVERNX1JYX09QRU47DQotDQotICAgIGlmIChwdEluc3RhbmNlLT50Q2ZnLmJNYXN0ZXIgPT0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2FpdCAqLw0KLSAgICB7DQotICAgICAgICB6T3NzX1NsZWVwKFRETV9FTkFCTEVfREVMQVlfVElNRSk7DQotICAgICAgICB3YWl0VGltZSArPSBURE1fRU5BQkxFX0RFTEFZX1RJTUU7DQotCQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBkZWxldGUgaWYqLw0KLQkJLyoNCi0gICAgICAgIGlmICh3YWl0VGltZSA9PSAxMDAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ3YWl0VGltZSBlcnJvciIpOw0KLSAgICAgICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgICAgICB9Ki8NCi0gICAgfQ0KLQ0KLSAgICBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPSAoKHB0SW5zdGFuY2UtPnRkbVN0YXR1cykgPT0gVERNX1BMQVlfSU5VU0UpP1RETV9CT1RIX0lOVVNFIDogVERNX1JFQ09SRF9JTlVTRTsNCi0NCi0gICAgLyogYWRkIGJ5IGx2d2VuaHVhIGZvciB0ZG0gc3luYyAgICovDQotICAgIGdUZG1DbnRDaGFuZ2VSeCA9IDA7DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHpEcnZURE1fUmVhZF9TdGFydChUX1pEcnZUZG1fUGFyYW1zICpwYXJhbXMsIFRfWkRydlRkbV9DZmcgKnB0Q2ZnKQ0KLXsNCi0gICAgU0lOVDMyICAgICAgICAgIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9SZWFkX1N0YXJ0Iik7DQotDQotICAgIHJldCA9IHpEcnZURE1fUmVhZF9QcmVwYXJlKHB0Q2ZnKTsNCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fUmVhZF9TdGFydCAgekRydlRETV9SZWFkX1ByZXBhcmUgZXJyb3IgcmV0PSVkXHJcbiIscmV0KTsNCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi0JDQotICAgIHJldCA9IHpEcnZURE1fUmVhZF9TdGFydF9EbyhwYXJhbXMpOw0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9SZWFkX1N0YXJ0ICB6RHJ2VERNX1JlYWRfU3RhcnRfRG8gZXJyb3IgcmV0PSVkXHJcbiIscmV0KTsNCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi0JDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiAgekRydlRETV9Xcml0ZQ0KLSogRGVzY3JpcHRpb246IHRyYW5zIGRhdGEgdG8gZmlmbyBmcm9tIHJhbSB3aGlsZSBwbGF5aW5nDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBidWZfc2l6ZSA6IG9uZSBidWZmZXIgaXMgaG93IG1hbnkgYnl0ZXMNCi0qICAgICAgICAgICB1aUxlbiA6IGJ1ZmZlciBsZW5ndGgNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydlRETV9Xcml0ZShjb25zdCBVSU5UOCAqcEJ1ZiwgVUlOVDMyIHVpTGVuKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBVSU5UMTYgYnVmTGVuID0gMCA7DQotICAgIFRfVGRtX1F1ZXVlTm9kZSAqcXVldWVOb2RlID0gTlVMTDsNCi0gICAgVUlOVDE2ICpidWYgPSBOVUxMOw0KLQlUX1RkbV9UeFN0cmVhbSAqdGRtU3RyZWFtID0gJnNfdGRtVHhTdHJlYW07DQotDQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fV3JpdGUgcEJ1ZiAweCV4ISBcclxuIiwgKnBCdWYpOw0KLQ0KLSAgICBpZiAoIE5VTEwgPT0gcEJ1ZiB8fCAwID09IHVpTGVuIHx8IFRETV9NQVhfVFhfQlVGX1NJWkUgPCB1aUxlbikNCi0gICAgew0KLSAgICAgICAgdGRtd3JpdGVfcGJ1Zj1wQnVmOw0KLSAgICAgICAgdGRtd3JpdGVfdWlsZW49dWlMZW47DQotICAgIH0NCi0NCi0JLyprbG9jd29yayAzICBJTlZBUklBTlRfQ09ORElUSU9OLlVOUkVBQ0ggYXNzZXJ00sa1vWlmwO8qLw0KLSAgICBpZiAoIE5VTEwgPT0gcEJ1ZiB8fCAwID09IHVpTGVuIHx8IFRETV9NQVhfVFhfQlVGX1NJWkUgPCB1aUxlbikNCi0gICAgew0KLSAgIAkJekRydl9BU1NFUlQoMCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fUExBWV9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLSAgICB9DQotICAgIHJldCA9IHRkbV9VcGRhdGVUeEJ1ZmZlclN0YXR1cygoVUlOVDE2ICopcEJ1ZiAsIEJVRkZFUl9GVUxMKTsgICAgICAgLyrJz7LjzfkqcEJ1ZtC0zerK/b7duvOjrLjEseRCVUbXtMyszqpGVUxMKi8NCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfQ0KLQkNCi0JdGRtU3RyZWFtLT50eFdySWR4ID0gKHRkbVN0cmVhbS0+dHhXcklkeCArIDEpJVRETV9PVVRfQlVGX05VTTsNCi0NCi0JaWYoKHNfdGRtVHhTdHJlYW0ucGF1c2VGbGFnID09IEZBTFNFKSAmJiAoc190ZG1UeFN0cmVhbS5UcmFuc2luZyA9PSBGQUxTRSkpIHsNCi0JCXRkbVN0cmVhbS0+VHJhbnNpbmcgPSBUUlVFOw0KLQkJCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHRkbURtYVN0YXRlW1RETV9UWF0uY2gpOw0KLQkJCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIIGRlbGV0ZSBpZiovDQotCQkJLyoNCi0JCQlpZihyZXQgIT0gRFJWX1NVQ0NFU1MpIHsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fV3JpdGUgdXBkYXRlVHhCdWZTdGEgb3IgdHhUcmFuc21pdCBlcnIgcmV0PSVkIFxuIiwgcmV0KTsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9Ki8NCi0JfQ0KLQkNCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB6RHJ2VERNX1JlYWQNCi0qIERlc2NyaXB0aW9uOiBnZXQgcmVjb2QgZGF0YQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcEJ1ZiA6IHJlY29yZCBidWZmZXIgcG9pbnRlcg0KLSogICAgICAgICAgIHVpTGVuIDogYnVmZmVyIGxlbmd0aA0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6RHJ2VERNX1JlYWQoVUlOVDggKipwQnVmLCBVSU5UMzIgKnVpTGVuKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLSAgICBUX1RkbV9RdWV1ZU5vZGUgKnF1ZXVlTm9kZSA9IE5VTEw7DQotCVRfVGRtX1J4U3RyZWFtICp0ZG1TdHJlYW0gPSAmc190ZG1SeFN0cmVhbTsNCi0JDQotCS8qa2xvY3dvcmsgMyAgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIIGFzc2VydNLGtb1pZsDvKi8NCi0gICAgaWYgKCBOVUxMID09IHBCdWYgfHwgTlVMTCA9PSB1aUxlbikNCi0gICAgew0KLSAgICAgICAgekRydl9BU1NFUlQoMCk7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotDQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fUkVDT1JEX0lOVVNFICYmIHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fQk9USF9JTlVTRSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotICAgIH0NCi0gICAgLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9SZWFkIGJlZm9yZSB0ZXN0IHpPc3NfR2V0U2VtYXBob3JlIik7DQotICAgIGlmIChaT1NTX1NVQ0NFU1MgIT0gek9zc19HZXRTZW1hcGhvcmUoc190ZG1SeFN0cmVhbS5yeFNlbSwgWk9TU19XQUlUX0ZPUkVWRVIpKQ0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9SZWFkIHpPc3NfR2V0U2VtYXBob3JlIGVycm9yIik7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotICAgIC8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fUmVhZCB6T3NzX0dldFNlbWFwaG9yZSBkb25lIik7DQotDQotCSpwQnVmID0gdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W3RkbVN0cmVhbS0+cnhSZElkeF0uYnVmOw0KLQkqdWlMZW4gPSB0ZG1TdHJlYW0tPnJ4TGVuOw0KLQl0ZG1fVXBkYXRlUnhCdWZmZXJTdGF0dXMoKFVJTlQxNiAqKXRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVt0ZG1TdHJlYW0tPnJ4UmRJZHhdLmJ1ZiwgQlVGRkVSX1JFQUQpOw0KLQ0KLQkjaWYgMA0KLSAgICByZXQgPSB0ZG1fUXVldWVHZXQoJihzX3RkbVJ4U3RyZWFtLnJ4UXVldWUpLCAmcXVldWVOb2RlKTsNCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZURE1fUmVhZCB0ZG1fUXVldWVHZXQgZXJyb3IiKTsNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0NCi0gICAgaWYgKE5VTEwgIT0gcXVldWVOb2RlKQ0KLSAgICB7DQotICAgICAgICAqcEJ1ZiA9IChVSU5UOCAqKXF1ZXVlTm9kZS0+cEJ1ZjsNCi0gICAgICAgICp1aUxlbiA9IHF1ZXVlTm9kZS0+bGVuICogc2l6ZW9mKFVJTlQxNik7DQotICAgICAgICByZXQgPSB0ZG1fVXBkYXRlUnhCdWZmZXJTdGF0dXMocXVldWVOb2RlLT5wQnVmLCBCVUZGRVJfUkVBRCk7DQotICAgICAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1JlYWQgdGRtX1VwZGF0ZVJ4QnVmZmVyU3RhdHVzIGVycm9yIik7DQotICAgICAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX1JlYWQgcXVldWVOb2RlPT1OVUxMIGVycm9yIik7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotCSNlbmRpZg0KLQkNCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiAgekRydlRETV9TdG9wDQotKiBEZXNjcmlwdGlvbjogdXNlIHRvIHN0b3AgcGxheWluZyBvciByZWNvcmRpbmcNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6RHJ2VERNX1dyaXRlX1N0b3AoKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgVF9UZG1fUmVnICAgICAgICpwdFJlZyA9IE5VTEw7DQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0gICAgVF9UZG1fVHhTdHJlYW0gICp0eFN0cmVhbSA9ICZzX3RkbVR4U3RyZWFtOw0KLQ0KLSAgICBwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIHB0UmVnID0gc190ZG1JbnN0YW5jZS5wdERldi0+cmVnczsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fUExBWV9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLSAgICB9DQotICAgIHB0UmVnLT5wcm9jZXNzQ3RybCAmPSB+VERNX1RYX09QRU47ICAgICAgICAgICAgICAgIC8qZGlzYWJsZSB0eCBvbmx5ICovDQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1UcmFuc01vZGUgPT0gVFJBTlNfRE1BX01PREUpDQotICAgIHsNCi0gICAgICAgIHB0UmVnLT50eEZpZm9DdHJsICY9IH5URE1fVFhfRE1BX0VOOw0KLQkJZG1hX3JlbGVhc2VfY2hhbm5lbCh0ZG1EbWFTdGF0ZVtURE1fVFhdLmNoKTsNCi0gICAgfQ0KLSAgICAvKiByZXNldCB0eCBmaWZvICovDQotICAgIHB0UmVnLT50eEZpZm9DdHJsIHw9IFRETV9UWF9GSUZPX1JTVDsNCi0gICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1RYX1RIUkVTSE9MRDsNCi0gICAgcHRSZWctPmludEVuICY9IH5URE1fSU5UX0VOX1RYX1RIUkVTSE9MRDsgICAgICAgLyogZGlzYWJsZSB0eCBpbnRlcnJ1cHQgKi8NCi0NCi0gICAgcmV0ID0gdGRtX0NsZWFuVHhSZXNvdXJjZSgpOw0KLQkvKmtsb2N3b3JrIDMgSU5WQVJJQU5UX0NPTkRJVElPTi5VTlJFQUNIICBkZWxldGUgaWYqLw0KLQkvKg0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9Ki8NCi0gICAgdHhTdHJlYW0tPnR4VHJhbnNtaXQgPSBOVUxMOw0KLSAgICB0eFN0cmVhbS0+Y2hhbm5lbCA9IEFVRElPX01PTk9fQ0hBTk5FTDsNCi0gICAgdHhTdHJlYW0tPnR4TGVuID0gMDsNCi0gICAgdHhTdHJlYW0tPnBfY2IgPSBOVUxMOw0KLQkNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fQk9USF9JTlVTRSkNCi0gICAgew0KLSAgICAgICAgcHRJbnN0YW5jZS0+dGRtU3RhdHVzID0gVERNX09QRU47DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwdEluc3RhbmNlLT50ZG1TdGF0dXMgPSBURE1fUkVDT1JEX0lOVVNFOw0KLSAgICB9DQotCQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246ICB6RHJ2VERNX1N0b3ANCi0qIERlc2NyaXB0aW9uOiB1c2UgdG8gc3RvcCBwbGF5aW5nIG9yIHJlY29yZGluZw0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTogZXJyb3IgcGFyYW0NCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpEcnZURE1fUmVhZF9TdG9wKCkNCi17DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9IE5VTEw7DQotICAgIFRfVGRtX1JlZyAgICAgICAqcHRSZWcgPSBOVUxMOw0KLQ0KLSAgICBTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgcHRSZWcgPSBzX3RkbUluc3RhbmNlLnB0RGV2LT5yZWdzOw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9SRUNPUkRfSU5VU0UgJiYgcHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9CT1RIX0lOVVNFKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9OT1RfU1RBUlRFRDsNCi0gICAgfQ0KLSAgICBwdFJlZy0+cHJvY2Vzc0N0cmwgJj0gflRETV9SWF9PUEVOOyAgICAgICAgICAgICAgICAvKmRpc2FibGUgdHggb25seSAqLw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtVHJhbnNNb2RlID09IFRSQU5TX0RNQV9NT0RFKQ0KLSAgICB7DQotICAgICAgICBwdFJlZy0+cnhGaWZvQ3RybCAmPSB+VERNX1JYX0RNQV9FTjsNCi0JCWRtYV9yZWxlYXNlX2NoYW5uZWwodGRtRG1hU3RhdGVbVERNX1JYXS5jaCk7DQotICAgIH0NCi0gICAgcHRSZWctPnJ4Rmlmb0N0cmwgfD0gVERNX1JYX0ZJRk9fUlNUOyAgICAvKiByZXNldCB0eC9yeCBmaWZvICovDQotICAgIHB0UmVnLT5pbnRTdGF0dXMgfD0gVERNX0lOVF9SWF9USFJFU0hPTEQ7DQotICAgIHB0UmVnLT5pbnRFbiAmPSB+VERNX0lOVF9FTl9SWF9USFJFU0hPTEQ7ICAgICAgIC8qIGRpc2FibGUgdHggaW50ZXJydXB0ICovDQotDQotICAgIHJldCA9IHRkbV9DbGVhblJ4UmVzb3VyY2UoKTsNCi0JLyprbG9jd29yayAzIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCAgZGVsZXRlIGlmKi8NCi0JLyoNCi0gICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJPUjsNCi0gICAgfSovDQotDQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHB0SW5zdGFuY2UtPnRkbVN0YXR1cyA9IFRETV9PUEVOOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcHRJbnN0YW5jZS0+dGRtU3RhdHVzID0gVERNX1BMQVlfSU5VU0U7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiAgekRydlRETV9HZXRCdWYNCi0qIERlc2NyaXB0aW9uOiBnZXQgYnVmZmVyIHRvIHdyaXRlIHBsYXlpbmcgZGF0YQ0KLSogUGFyYW1ldGVyczoNCi0qICAgSW5wdXQ6DQotKiAgICAgICAgICAgcEJ1ZjogcGxheWluZyBkYXRhIGJ1ZmZlcg0KLSogICAgICAgICAgIHVpTGVuIDogYnVmZmVyIGxlbmd0aA0KLSogICBPdXRwdXQ6DQotKiAgICAgICAgICAgTm9uZQ0KLSogUmV0dXJuczoNCi0qICAgICAgICAgICBEUlZfRVJSX0lOVkFMSURfUEFSQU06IGVycm9yIHBhcmFtDQotKiAgICAgICAgICAgRFJWX0VSUk9SIDogb3BlcmF0ZSBlcnJvcg0KLSogICAgICAgICAgIERSVl9TVUNDRVNTIDogb3BlcmF0ZSBzdWNjZXNzDQotICoNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpEcnZURE1fR2V0QnVmKFVJTlQ4ICoqcEJ1ZiwgVUlOVDMyICp1aUxlbikNCi17DQotICAgIFRfVGRtX1R4U3RyZWFtICp0ZG1TdHJlYW0gPSAmc190ZG1UeFN0cmVhbTsNCi0gICAgVUlOVDggdHhJbmRleCA9IDAgOw0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLQ0KLSAgICAvL3pEcnZfQVNTRVJUKChwQnVmICE9IE5VTEwpICYmICh1aUxlbiAhPSBOVUxMKSk7DQotICAgIGlmICgoTlVMTCA9PSBwQnVmKSB8fCAoTlVMTCA9PSB1aUxlbikpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX0dldEJ1ZiAgZXJyIHJldHVybiBwQnVmPSVwLHVpTGVuPSVwIFxuIixwQnVmLHVpTGVuKTsJDQotICAgICAgICByZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLSAgICB9DQotICAgIHB0SW5zdGFuY2UgPSAmc190ZG1JbnN0YW5jZTsNCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fUExBWV9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX0dldEJ1ZiBzdGF0ZSBlcnIgIHJldHVybiBwdEluc3RhbmNlLT50ZG1TdGF0dXM9JWQgXG4gIixwdEluc3RhbmNlLT50ZG1TdGF0dXMpOwkNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLSAgICB9DQotICAgIGlmIChaT1NTX1NVQ0NFU1MgIT0gek9zc19HZXRTZW1hcGhvcmUodGRtU3RyZWFtLT50eFNlbSwgVERNX1NFTV9XQUlUX1RJTUUpKSAgIC8qY2hhbmdlZCBieSBkYW5ncGVpeGlhWzIwMTAuOS4yMF0qLw0KLSAgICB7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlRETV9HZXRCdWYgek9zc19HZXRTZW1hcGhvcmUgZXJyIFxuICIpOwkNCi0gICAgICAgIHJldHVybiBEUlZfRVJST1I7DQotICAgIH0NCi0NCi0NCi0JaWYodGRtU3RyZWFtLT50eEJ1ZmZlckFycmF5ID09IE5VTEwpIHsNCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VERNX0dldEJ1ZiB0ZG1TdHJlYW0tPnR4QnVmZmVyQXJyYXkgPT0gTlVMTCAgXG4gIik7CQ0KLQkJcmV0dXJuIERSVl9FUlJPUjsvKiAgveK+9lBTtffBy1NUT1C680xURbzM0PjQtMr9vt23w87Kv9XWuNXry8C7+iAqLw0KLQl9DQotDQotCXR4SW5kZXggPSB0ZG1TdHJlYW0tPnR4V3JJZHg7DQotDQotICAgICpwQnVmID0gdGRtU3RyZWFtLT50eEJ1ZmZlckFycmF5W3R4SW5kZXhdLmJ1ZjsNCi0gICAgKnVpTGVuID0gdGRtU3RyZWFtLT50eExlbjsNCi0gICAgIHRkbVN0cmVhbS0+dHhCdWZmZXJBcnJheVt0eEluZGV4XS50ZG1CdWZTdGF0dXMgPSBCVUZGRVJfV1JJVEU7DQotDQotI2lmIDANCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX0dldEJ1ZiB0aW1pbmcgY3RybCkgPSAleCIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnRpbWluZ0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHR4Rmlmb0N0cmwpID0gJXgiLCAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnR4Rmlmb0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIGZyYW1lIGN0cmwpID0gJXgiLChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+ZnJhbWVDbnRyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX0dldEJ1ZiB0eEZpZm9DdHJsKSA9ICV4IiwgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT50eEZpZm9DdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX0dldEJ1ZiBwcm9jZXNzIGN0cmwpID0gJXgiLCAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnByb2Nlc3NDdHJsKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX0dldEJ1ZiByZWcgaW50RW4pID0gJXgiLCAgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5pbnRFbik7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9HZXRCdWYgcmVnIGludFN0YXR1cykgPSAleFxuIiwgKHNfdGRtSW5zdGFuY2UucHREZXYpLT5yZWdzLT5pbnRTdGF0dXMpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJlZyB3cml0ZUNudEN0cmwpID0gJXhcbiIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPndyaXRlQ250Q3RybCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIoekRydlRETV9HZXRCdWYgcmVnIHdyaXRlQ250cikgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+d3JpdGVDbnRyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIih6RHJ2VERNX0dldEJ1ZiByZWcgd3JpdGVDbnRyMikgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+d3JpdGVDbnRyMik7DQotCQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJ4Rmlmb0N0cmwpID0gJXgiLCAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnJ4Rmlmb0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJ4Rmlmb0N0cmwpID0gJXgiLCAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnJ4Rmlmb0N0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJlZyByZWFkQ250Q3RybCkgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+cmVhZENudEN0cmwpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJlZyByZWFkQ250cikgPSAleFxuIiwgIChzX3RkbUluc3RhbmNlLnB0RGV2KS0+cmVncy0+cmVhZENudHIpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiKHpEcnZURE1fR2V0QnVmIHJlZyByZWFkQ250cjIpID0gJXhcbiIsICAoc190ZG1JbnN0YW5jZS5wdERldiktPnJlZ3MtPnJlYWRDbnRyMik7DQotI2VuZGlmDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotI2lmIDANCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiAgekRydlRETV9GcmVlQnVmDQotKiBEZXNjcmlwdGlvbjogaWYgY29weWluZyByZWNvcmQgZGF0YSBlbmQsIGZyZWUgYnVmZmVyIHRvIGNvbnRpbnVlIHJlY29yZA0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydlRETV9Cb3RoX1N0b3AoKQ0KLXsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0gICAgVF9UZG1fUmVnICAgICAgICpwdFJlZyA9IE5VTEw7DQotDQotICAgIFNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBwdFJlZyA9IHNfdGRtSW5zdGFuY2UucHREZXYtPnJlZ3M7DQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1JFQ09SRF9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UgJiYgcHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9QTEFZX0lOVVNFKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUl9OT1RfU1RBUlRFRDsNCi0gICAgfQ0KLSAgICBwdFJlZy0+cHJvY2Vzc0N0cmwgJj0gfiAoVERNX1RYX09QRU4gfCBURE1fUlhfT1BFTik7ICAgICAvKmRpc2FibGUgVERNICxUeCAsUlggKi8NCi0gICAgaWYgKHB0SW5zdGFuY2UtPnRkbVRyYW5zTW9kZSA9PSBUUkFOU19ETUFfTU9ERSkNCi0gICAgew0KLSAgICAgICAgcHRSZWctPnR4Rmlmb0N0cmwgJj0gflRETV9UWF9ETUFfRU47DQotICAgICAgICBwdFJlZy0+cnhGaWZvQ3RybCAmPSB+VERNX1JYX0RNQV9FTjsNCi0gICAgfQ0KLSAgICBwdFJlZy0+dHhGaWZvQ3RybCB8PSBURE1fVFhfRklGT19SU1Q7ICAvKiByZXNldCB0eCBmaWZvICovDQotICAgIHB0UmVnLT5yeEZpZm9DdHJsIHw9IFRETV9SWF9GSUZPX1JTVDsgIC8qIHJlc2V0IHJ4IGZpZm8gKi8NCi0gICAgcHRSZWctPmludFN0YXR1cyB8PSBURE1fSU5UX1RYX1RIUkVTSE9MRCB8IFRETV9JTlRfUlhfVEhSRVNIT0xEOw0KLSAgICBwdFJlZy0+aW50RW4gJj0gfihURE1fSU5UX0VOX1RYX1RIUkVTSE9MRCB8VERNX0lOVF9FTl9SWF9USFJFU0hPTEQpOyAgIC8qIGRpc2FibGUgdHggaW50ZXJydXB0ICovDQotICAgIHB0UmVnLT5wcm9jZXNzQ3RybCAmPSB+VERNX0VOOyAgICAgICAgICAgICAgICAvKmRpc2FibGUgVERNICxUeCAsUlggKi8NCi0NCi0gICAgcmV0ID0gdGRtX0NsZWFuUnhSZXNvdXJjZSgpOw0KLSAgICByZXQgKz0gdGRtX0NsZWFuVHhSZXNvdXJjZSgpOw0KLQ0KLSAgICBpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHB0SW5zdGFuY2UtPnRkbVN0YXR1cyA9IFRETV9PUEVOOw0KLQ0KLSAgICByZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246ICB6RHJ2VERNX0ZyZWVCdWYNCi0qIERlc2NyaXB0aW9uOiBpZiBjb3B5aW5nIHJlY29yZCBkYXRhIGVuZCwgZnJlZSBidWZmZXIgdG8gY29udGludWUgcmVjb3JkDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBwQnVmIDogcmVjb3JkIGJ1ZmZlciBwb2ludGVyDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIERSVl9FUlJfSU5WQUxJRF9QQVJBTTogZXJyb3IgcGFyYW0NCi0qICAgICAgICAgICBEUlZfRVJST1IgOiBvcGVyYXRlIGVycm9yDQotKiAgICAgICAgICAgRFJWX1NVQ0NFU1MgOiBvcGVyYXRlIHN1Y2Nlc3MNCi0gKg0KLSAqIE90aGVyczoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydlRETV9GcmVlQnVmKFVJTlQ4ICpwQnVmKQ0KLXsNCi0gICAgVF9UZG1fUnhTdHJlYW0gKnRkbVN0cmVhbSA9ICZzX3RkbVJ4U3RyZWFtOw0KLSAgICBTSU5UMzIgaSA9IDA7DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCQ0KLQkvKmtsb2N3b3JrIDMgIElOVkFSSUFOVF9DT05ESVRJT04uVU5SRUFDSCBhc3NlcnTSxrW9aWbA7yovDQotICAgIGlmIChOVUxMID09IHBCdWYpDQotICAgIHsNCi0gICAgICAgIHpEcnZfQVNTRVJUKDApOw0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0gICAgfQ0KLQ0KLSAgICBwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1JFQ09SRF9JTlVTRSAmJiBwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX0JPVEhfSU5VU0UpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX05PVF9TVEFSVEVEOw0KLSAgICB9DQotDQotCXRkbV9VcGRhdGVSeEJ1ZmZlclN0YXR1cygoVUlOVDE2ICopdGRtU3RyZWFtLT5yeEJ1ZmZlckFycmF5W3RkbVN0cmVhbS0+cnhSZElkeF0uYnVmLCBCVUZGRVJfTlVMTCk7DQotCXRkbVN0cmVhbS0+cnhSZElkeCA9ICh0ZG1TdHJlYW0tPnJ4UmRJZHggKzEpICUgVERNX09VVF9CVUZfTlVNIDsNCi0NCi0jaWYgMA0KLSAgICB3aGlsZSAoaSA8IFRETV9PVVRfQlVGX05VTSkNCi0gICAgew0KLSAgICAgICAgaWYgKHRkbVN0cmVhbS0+cnhCdWZmZXJBcnJheVtpXS5idWYgPT0gcEJ1ZikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0ZG1TdHJlYW0tPnJ4QnVmZmVyQXJyYXlbaV0udGRtQnVmU3RhdHVzID0gQlVGRkVSX05VTEw7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBpKys7DQotICAgIH0NCi0NCi0gICAgaWYgKGkgPT0gVERNX09VVF9CVUZfTlVNKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gRFJWX0VSUk9SOw0KLSAgICB9DQotI2VuZGlmDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotI2lmIDANCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB6RHJ2VERNX0dldFJlbWFpbmVkDQotKiBEZXNjcmlwdGlvbjogZ2V0IGhvdyBtYW55IGRhdGEgaW4gYnVmZmVyIHdoaWxlIHBsYXlpbmcNCi0qIFBhcmFtZXRlcnM6DQotKiAgIElucHV0Og0KLSogICAgICAgICAgIGxlbiA6IGJ1ZmZlciBsZW5ndGgNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgRFJWX0VSUl9JTlZBTElEX1BBUkFNOiBlcnJvciBwYXJhbQ0KLSogICAgICAgICAgIERSVl9FUlJPUiA6IG9wZXJhdGUgZXJyb3INCi0qICAgICAgICAgICBEUlZfU1VDQ0VTUyA6IG9wZXJhdGUgc3VjY2Vzcw0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpEcnZURE1fR2V0UmVtYWluZWQoVUlOVDMyICpsZW4pDQotew0KLSAgICBUX1RkbV9RdWV1ZSAqdGRtUXVldWUgPSAmKHNfdGRtVHhTdHJlYW0udHhRdWV1ZSk7DQotICAgIFVJTlQ4IGluZGV4ID0gMDsNCi0gICAgVUlOVDMyIHVpTGVuID0gMDsNCi0gICAgVF9UZG1fSW5zdGFuY2UgICpwdEluc3RhbmNlID0gTlVMTDsNCi0NCi0gICAgekRydl9BU1NFUlQobGVuICE9IE5VTEwpOw0KLSAgICBpZiAoTlVMTCA9PSBsZW4pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotICAgIH0NCi0gICAgcHRJbnN0YW5jZSA9ICZzX3RkbUluc3RhbmNlOw0KLSAgICBpZiAocHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9QTEFZX0lOVVNFICYmIHB0SW5zdGFuY2UtPnRkbVN0YXR1cyAhPSBURE1fQk9USF9JTlVTRSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIERSVl9FUlJfTk9UX1NUQVJURUQ7DQotICAgIH0NCi0NCi0gICAgaW5kZXggPSB0ZG1RdWV1ZS0+cmVhZEluZGV4Ow0KLSAgICB3aGlsZSAoaW5kZXggIT0gdGRtUXVldWUtPndyaXRlSW5kZXgpDQotICAgIHsNCi0gICAgICAgIHVpTGVuICs9IHRkbVF1ZXVlLT5kYXRhW2luZGV4XS5sZW47DQotICAgICAgICBpbmRleCA9IChpbmRleCArIDEpICUgVERNX1FVRVVFX1NJWkU7DQotICAgIH0NCi0gICAgKmxlbiA9IHVpTGVuICogc2l6ZW9mKFVJTlQxNik7DQotDQotICAgIHJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBGdW5jdGlvbjogIHpEcnZURE1fUGF1c2UNCi0qIERlc2NyaXB0aW9uOiBwYXVzZSB3aGlsZSBwbGF5aW5nDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgIE5vbmUNCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6RHJ2VERNX1BhdXNlKCkNCi17DQotICAgIFRfVGRtX0luc3RhbmNlICAqcHRJbnN0YW5jZSA9IE5VTEw7DQotCQ0KLSAgICBwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1BMQVlfSU5VU0UgJiYgcHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9CT1RIX0lOVVNFKQ0KLSAgICB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgc190ZG1UeFN0cmVhbS5wYXVzZUZsYWcgPSBUUlVFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB6RHJ2VERNX1Jlc3VtZQ0KLSogRGVzY3JpcHRpb246IHJlc3VtZSBwbGF5aW5nIGlmIHBhdXNlDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiAgIE91dHB1dDoNCi0qICAgICAgICAgICBOb25lDQotKiBSZXR1cm5zOg0KLSogICAgICAgICAgTm9uZQ0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6RHJ2VERNX1Jlc3VtZSgpDQotew0KLSAgICBUX1RkbV9JbnN0YW5jZSAgKnB0SW5zdGFuY2UgPSBOVUxMOw0KLSAgICBUX1RkbV9UeFN0cmVhbSAqdGRtU3RyZWFtID0gJnNfdGRtVHhTdHJlYW07DQotICAgIFRfVGRtX1F1ZXVlTm9kZSAqcXVldWVOb2RlID0gTlVMTDsNCi0gICAgU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLSAgICBwdEluc3RhbmNlID0gJnNfdGRtSW5zdGFuY2U7DQotICAgIGlmIChwdEluc3RhbmNlLT50ZG1TdGF0dXMgIT0gVERNX1BMQVlfSU5VU0UgJiYgcHRJbnN0YW5jZS0+dGRtU3RhdHVzICE9IFRETV9CT1RIX0lOVVNFKQ0KLSAgICB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgcmV0ID0gdGRtX1F1ZXVlR2V0KCYodGRtU3RyZWFtLT50eFF1ZXVlKSwgJnF1ZXVlTm9kZSk7DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBpZiAocXVldWVOb2RlICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHRkbVN0cmVhbS0+VHJhbnNpbmcgPSBUUlVFOw0KLSAgICAgICAgdGRtX1VwZGF0ZVR4QnVmZmVyU3RhdHVzKHF1ZXVlTm9kZS0+cEJ1ZiwgQlVGRkVSX1JFQUQpOw0KLSAgICAgICAgcmV0ID0gdGRtU3RyZWFtLT50eFRyYW5zbWl0KHF1ZXVlTm9kZS0+cEJ1ZiwgcXVldWVOb2RlLT5sZW4pOw0KLSAgICB9DQotICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB0ZG1TdHJlYW0tPnBhdXNlRmxhZyA9IEZBTFNFOw0KLQ0KLSAgICByZXR1cm47DQotfQ0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogRnVuY3Rpb246ICB0ZG1fUmxzUnhTZW0NCi0qIERlc2NyaXB0aW9uOiBkZWFsIHdpdGggcmVhZCBkZWFkbG9jayBwcm9ibGVtDQotKiBQYXJhbWV0ZXJzOg0KLSogICBJbnB1dDoNCi0qICAgT3V0cHV0Og0KLSogICAgICAgICAgIE5vbmUNCi0qIFJldHVybnM6DQotKiAgICAgICAgICAgTm9uZQ0KLSogT3RoZXJzOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotVk9JRCB6RHJ2VGRtX1J4UmxzU2VtYUJlZm9yZVN0b3AoKQ0KLXsNCi0gICAgVF9UZG1fUnhTdHJlYW0gKnRkbVJ4U3RyZWFtID0gJnNfdGRtUnhTdHJlYW07DQotDQotICAgIHpPc3NfUHV0U2VtYXBob3JlKHRkbVJ4U3RyZWFtLT5yeFNlbSk7DQotfQ0KLQ0KLVZPSUQgekRydlRkbV9UeFJsc1NlbWFCZWZvcmVTdG9wKCkNCi17DQotICAgIFRfVGRtX1R4U3RyZWFtICp0ZG1UeFN0cmVhbSA9ICZzX3RkbVR4U3RyZWFtOw0KLQ0KLSAgICB6T3NzX1B1dFNlbWFwaG9yZSh0ZG1UeFN0cmVhbS0+dHhTZW0pOw0KLX0NCi0NCi1WT0lEIHZwX1NldFRvcFRkbUNvbmZpZyhWT0lEKQ0KLXsNCi0jaWYgMA0KLSAgICBVSU5UMzIgQW1yUmVnQml0ID0gMDsNCi0JaW50IHJldCA9IDA7DQotCQ0KLQkvL3RkbSBwaW4gY2ZnDQotI2lmIGRlZmluZWQgKF9DSElQX1pYMjk3NTIwVjMpDQotLyoNCi0JcmV0ID0gZ3Bpb19yZXF1ZXN0KFBJTl9URE1fRlMsICJpMnMwX3dzIik7DQotCWlmIChyZXQgPCAwKQ0KLQkJQlVHKCk7DQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fVERNX0NMSywgImkyczBfY2xrIik7DQotCWlmIChyZXQgPCAwKQ0KLQkJQlVHKCk7DQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fVERNX0RJTiwgImkyczBfZGluIik7DQotCWlmIChyZXQgPCAwKQ0KLQkJQlVHKCk7DQotCXJldCA9IGdwaW9fcmVxdWVzdChQSU5fVERNX0RPVVQsICJpMnMwX2RvdXQiKTsNCi0JaWYgKHJldCA8IDApDQotCQlCVUcoKTsNCi0JengyOV9ncGlvX2NvbmZpZyhQSU5fVERNX0ZTLCBGVU5fVERNX0ZTKTsNCi0JengyOV9ncGlvX2NvbmZpZyhQSU5fVERNX0NMSywgRlVOX1RETV9DTEspOw0KLQl6eDI5X2dwaW9fY29uZmlnKFBJTl9URE1fRElOLCBGVU5fVERNX0RJTik7DQotCXp4MjlfZ3Bpb19jb25maWcoUElOX1RETV9ET1VULCBGVU5fVERNX0RPVVQpOw0KLSovDQotCWF1ZGlvVGRtV3NIYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJpMnMwX3dzIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9UZG1Xc0hhbmRsZSwgR1BJTzM1X1RETV9GUyk7DQotCWF1ZGlvVGRtQ2xrSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMF9jbGsiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb1RkbUNsa0hhbmRsZSwgR1BJTzM2X1RETV9DTEspOw0KLQlhdWRpb1RkbURpbkhhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczBfZGluIik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9UZG1EaW5IYW5kbGUsIEdQSU8zN19URE1fREFUQV9JTik7DQotCWF1ZGlvVGRtRG91dEhhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczBfZG91dCIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvVGRtRG91dEhhbmRsZSwgR1BJTzM4X1RETV9EQVRBX09VVCk7DQotDQotI2VsaWYgZGVmaW5lZCAoX0NISVBfWlgyOTc1MjBWMikNCi0JYXVkaW9UZG1Xc0hhbmRsZSA9IHpEcnZHcGlvX1JlcXVlc3QoImkyczBfd3MiKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb1RkbVdzSGFuZGxlLCBHUElPMzhfVERNX0ZTKTsNCi0JYXVkaW9UZG1DbGtIYW5kbGUgPSB6RHJ2R3Bpb19SZXF1ZXN0KCJpMnMwX2NsayIpOw0KLQl6RHJ2R3Bpb19TZXRGdW5jKGF1ZGlvVGRtQ2xrSGFuZGxlLCBHUElPMzlfVERNX0NMSyk7DQotCWF1ZGlvVGRtRGluSGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMF9kaW4iKTsNCi0JekRydkdwaW9fU2V0RnVuYyhhdWRpb1RkbURpbkhhbmRsZSwgR1BJTzQwX1RETV9EQVRBX0lOKTsNCi0JYXVkaW9UZG1Eb3V0SGFuZGxlID0gekRydkdwaW9fUmVxdWVzdCgiaTJzMF9kb3V0Iik7DQotCXpEcnZHcGlvX1NldEZ1bmMoYXVkaW9UZG1Eb3V0SGFuZGxlLCBHUElPNDFfVERNX0RBVEFfT1VUKTsNCi0jZW5kaWYNCi0NCi0gICAgLy90b3AgdGRtIGNmZw0KLSAgICBBbXJSZWdCaXQgID0gQVJNX1RETV9MT09QX1NFVDsNCi0gICAgQW1yUmVnQml0ICY9IDB4ZmZmZmZmZjg7DQotICAgIEFtclJlZ0JpdCB8PSAweDAwMDAwMDAxOyAvLyAgaW50ZXIgYXJtIHRkbTEtLXRvcCB0ZG0xDQotICAgIEFtclJlZ0JpdCAmPSAweGZmZkZmZTA3Ow0KLSAgICBBbXJSZWdCaXQgfD0gMHgwMDAwMDBhODsgLy8gICBsb29wIGRzcCBhZmUobG9vcCB0ZG0xKS0tYXJtIHRkbTIobG9vcCB0ZG0yKQ0KLSAgICAvL0FtclJlZ0JpdCB8PSAweDAwMDAwMTUwOyAvLyAgIGxvb3AgZHNwIGFybShsb29wIHRkbTEpLS1hZmUgdGRtMihsb29wIHRkbTIpDQotICAgIEFSTV9URE1fTE9PUF9TRVQgPSBBbXJSZWdCaXQ7DQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sInZwX1NldFRvcFRkbUNvbmZpZyBzZXQgdG9wIFRETSxBUk1fVERNX0xPT1BfU0VUPTB4JXhcbiIsQVJNX1RETV9MT09QX1NFVCk7DQotDQotICAgIEFtclJlZ0JpdCA9IFRETV9NT0RfQ0xLX1NFTDsNCi0gICAgQW1yUmVnQml0ICY9IDB4ZmNmZmZmZmY7ICAgLy9zZXQgbW9kX2Nsa19zZWwgYml0IDI1OjI0IHRvIHNlbGVjdCB0aGUgdGRtIHdjbGsNCi0jaWYgZGVmaW5lZCAoX0NISVBfWlgyOTc1MjBWMykNCi0gICAgQW1yUmVnQml0IHw9IDB4MDAwMDAwMDsNCi0jZWxpZiBkZWZpbmVkIChfQ0hJUF9aWDI5NzUyMFYyKQ0KLQlBbXJSZWdCaXQgfD0gMHgxMDAwMDAwOyAvLzB4MTAwMDAwMCgyNk0gKTB4MDAwMDAwMCg4MS45Mk0pDQotI2VuZGlmDQotICAgIFRETV9NT0RfQ0xLX1NFTCA9IEFtclJlZ0JpdDsNCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywidnBfU2V0VG9wVGRtQ29uZmlnIHNldCB0b3AgVERNLE1PRF9DTEtfU0VMPTB4JXhcbiIsVERNX01PRF9DTEtfU0VMKTsNCi0NCi0gICAgQW1yUmVnQml0ID0gRE1BX1NFTF9DRkc7DQotI2lmIGRlZmluZWQgKF9DSElQX1pYMjk3NTIwVjMpDQotICAgIEFtclJlZ0JpdCAmPSAweGZmZmZmZmU3OyAgDQotCUFtclJlZ0JpdCB8PSAweDE4OwkJICAgLy9zZXQgZG1hX3NlbF9jZmcgYml0IDMgNCB0byAxLCB0byB1c2UgdGRtIG1vZGUNCi0jZWxpZiBkZWZpbmVkIChfQ0hJUF9aWDI5NzUyMFYyKQ0KLSAgICBBbXJSZWdCaXQgJj0gMHhmZmZmZmZmYjsgICANCi0JQW1yUmVnQml0IHw9IDB4NDsJCSAgIC8vc2V0IGRtYV9zZWxfY2ZnIGJpdCAyIHRvIDEsIHRvIHVzZSB0ZG0gbW9kZQ0KLSNlbmRpZg0KLSAgICBETUFfU0VMX0NGRyA9IEFtclJlZ0JpdDsNCi0gICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywidnBfU2V0VG9wVGRtQ29uZmlnIHNldCB0b3AgVERNLERNQV9TRUxfQ0ZHPTB4JXhcbiIsRE1BX1NFTF9DRkcpOw0KLSAgI2VuZGlmDQotfQ0KLQ0KLQ0KLQ0KLXN0YXRpYyBpbnQgX19pbml0IHRkbV9pbml0KHZvaWQpDQotew0KLS8vCXByaW50aygiaTJzX2luaXQgcmVnaXN0ZXJcbiIpOw0KLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ0ZG1fZGV2aWNlKTsNCi19DQotDQotc3RhdGljIHZvaWQgX19leGl0IHRkbV9leGl0KHZvaWQpDQotew0KLS8vCXByaW50aygiaTJzX2V4aXQgdW5yZWdpc3RlclxuIik7DQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZ0ZG1fZGV2aWNlKTsNCi19DQotDQotbW9kdWxlX2luaXQodGRtX2luaXQpOw0KLW1vZHVsZV9leGl0KHRkbV9leGl0KTsNCmRpZmYgLS1naXQgYS9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL3ZvaWNlcHJvY2Vzcy9oYWxfdm9pY2Vwcm9jZXNzLmMgYi9VYm9vdC9jcC9wcy9kcml2ZXIvc3JjL2NoaXBzZXRzL3NyYy9hdWRpb19iYXNlL3ZvaWNlcHJvY2Vzcy9oYWxfdm9pY2Vwcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzNGQwYjcuLjAwMDAwMDAKLS0tIGEvVWJvb3QvY3AvcHMvZHJpdmVyL3NyYy9jaGlwc2V0cy9zcmMvYXVkaW9fYmFzZS92b2ljZXByb2Nlc3MvaGFsX3ZvaWNlcHJvY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoQykgMjAwNywgWlRFIENvcnBvcmF0aW9uLg0KLSAqDQotICogRmlsZSBOYW1lOmhhbF92b2ljZXByb2Nlc3MuYw0KLSAqIEZpbGUgTWFyazoNCi0gKiBEZXNjcmlwdGlvbjogTG9vcCB2b2ljZSBkYXRhIGZyb20gdGVhayB0byBhcm0uDQotICAgICAgICAgICAgICAgICAgICBTZXR0aW5nczogYXJtIGlpczEtPnRvcCBpaXMxKGNvbm5lY3QgdG8gYXApLCBhcm0gaWlzMiBsb29wIHRvIHRlYWsgYWZlLg0KLQ0KLSAqIE90aGVyczoNCi0gKiBWZXJzaW9uOg0KLSAqIEF1dGhvcjogICAgICAgIGx2d2VuaHVhDQotICogRGF0ZTogICAgICAgICAgMjAxMS04LTMNCi0gKiBIaXN0b3J5IDE6DQotICogICAgIERhdGU6IDIwMTYtMi0xNg0KLSAqICAgICBWZXJzaW9uOg0KLSAqICAgICBBdXRob3I6eHV4aW5xaWFuZw0KLSAqICAgICBNb2RpZmljYXRpb246IGVkaXQgZm9yIHVuaW9uIHZlcnNpb24NCi0gKiBIaXN0b3J5IDI6DQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGZpbGVzDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaW5jbHVkZSAiZHJ2c19nZW5lcmFsLmgiDQotI2luY2x1ZGUgImRydnNfdm9sdGUuaCINCi0jaW5jbHVkZSAiZHJ2c19pMnMuaCINCi0jaW5jbHVkZSAiZHJ2c192b2ljZXByb2Nlc3MuaCINCi0jaW5jbHVkZSAiaGFsX3ZvaWNlcHJvY2Vzcy5oIg0KLSNpbmNsdWRlICJkcnZzX3ZvaWNlX2NvbmZpZy5oIg0KLS8vI2luY2x1ZGUgImhhbF9wY21taXhlci5oIg0KLSNpbmNsdWRlICJOdlBhcmFtX2Rydi5oIg0KLSNpbmNsdWRlICJkcnZzX2lvX3ZvaWNlLmgiDQotI2luY2x1ZGUgImhhbF9yaW5nZGF0YS5oIg0KLSNpbmNsdWRlICJkcnZzX3RkbS5oIg0KLSNpbmNsdWRlICJoYWxfZHRtZl9kZXRlY3QuaCINCi0jaW5jbHVkZSAiaGFsX2F1ZGlvX2RhdGEuaCINCi0vLyNkZWZpbmUgVEVTVF9XSElURV9OT0lTRQ0KLQ0KLS8vI2RlZmluZSAgVkJfREFUQV9MT1NTX1RFU1QNCi0jaWZkZWYgVEVTVF9XSElURV9OT0lTRQ0KLSNpbmNsdWRlICJGczgwMDBfV2hpdGVOb2lzZV9Nb24uaCINCi0vLyNpbmNsdWRlICJGczgwMDBfU2luZV80NDBIel9Nb24uaCINCi0jZW5kaWYNCi0NCi0jaW5jbHVkZSAiZHJ2c19pY3AuaCINCi0jaW5jbHVkZSAiZHJ2c19ycG1zZy5oIg0KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBNYWNyb3MNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8vI2RlZmluZSBVU0VfQVVESU9fUklORw0KLS8vI2RlZmluZSBWUF9HRVRfVFhfQUxMX0RBVEENCi0NCi0jZGVmaW5lIFZQX0JVRl9MRU5HVEggIDB4N0ZGODAgLy8weEZGRDgwICAgLy8weDdGRTQwICAvLzB4NGRmODAvLyAoMC41TSAgMHg4MDAwMCkNCi0jZGVmaW5lIFZQX0ZSQU1FX0JVRkZFUl9TSVpFIDMyMCAvLzIwbXMgODAwS0haDQotI2RlZmluZSBWUF9JMlNfQlVGRkVSX1NJWkUgMzIwDQotI2RlZmluZSBWT0lDRV9TWU5DX1RJTUVPVVRfVElNRSAxMDANCi0NCi0jZGVmaW5lIFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSAweDMwMDAwICAvLyAweDYwMDAwDQotI2RlZmluZSBWUF9JTk9VVF9OT0JBS19CVUZTSVpFICA2NDANCi0jZGVmaW5lIFZCX01BWF9JTlQJICAgICAweDdmZmZmZmZmDQotI2RlZmluZSBWQl9NSU5fSU5UICAgICAgICAwIC8vKDAtMjw8MzEpLy8weDgwMDAwMDAwDQotDQotI2RlZmluZSBWQl9JTlRfT1ZFUkZMT1coeCkgaWYoKHggPCBWQl9NSU5fSU5UKXx8KHggPiBWQl9NQVhfSU5UKSkgIHggPSAwOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsIFR5cGVzDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0JdHlwZWRlZiBlbnVtDQotCXsNCi0JCVZCVUZfU0VNID0gMCwvL3ZvaWNlIGJ1ZmZlcg0KLQkJRUNBTExfU0VNLAkJDQotCQlTRU1fTUFYDQotCX0gVF9TZW1fT3duZXI7DQotDQotCXR5cGVkZWYgZW51bQ0KLQl7DQotCQlESVJfUlgsDQotCQlESVJfVFgsIAkNCi0JCURJUl9BTEwsDQotCQlESVJfTUFYDQotCX0gVF9EYXRhX0Rpcl9UeXBlOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsIENvbnN0YW50cw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWwgRnVuY3Rpb24gUHJvdG90eXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHZvaWNlX1RvbmVNaXhlclN0b3AoVk9JRCk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHpEcnZJMlNfUmVhZF9TdGFydF9EbyhUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMpOy8veGl1IGdhaSBjaHUgc2hlbmcgbWluZw0KLVNJTlQzMiB6RHJ2STJTX1dyaXRlX1N0YXJ0X0RvKFRfWkRydkkyU19JZCB0SWQsIFRfWkRydkkyc19QYXJhbXMgKnBhcmFtcyk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi1TSU5UMzIgZHJ2X0dldF9FY2FsbF9TdGF0ZShWT0lEKTsJDQotU0lOVDMyIGRydl9FY2FsbF9SZWFkKFVJTlQ4ICpwQnVmLFVJTlQzMiAqaW5TaXplKTsNCi1TSU5UMzIgZHJ2X0VjYWxsX1dyaXRlKFVJTlQ4ICpwQnVmLFVJTlQzMiBpblNpemUpOwkgICANCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBDb25zdGFudHMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIFZhcmlhYmxlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLy9zdGF0aWMgVF96RHJ2VnBfU3BlZWNoU3RhdGUgKnNfcFNwZWVjaFN0YXRlID0gTlVMTDsNCi1zdGF0aWMgVF96RHJ2VnBfU3BlZWNoU3RhdGUgc19zcGVlY2hTdGF0ZSA9IHswfTsgIC8vMTA0IGJ5dGVzDQotDQotVF96RHJ2Vm9pY2VfR2JWYXIgZ192b2ljZVZhciA9DQotew0KLQkwLC8vdm9sdGVJc1diIDENCi0JMCwvL2lzVXNlU2xpY0NvZGVjIDINCi0JMCwvL2dfaXNVc2VUZG0gMw0KLQkwLC8vdm9pY2VJbkdzbVRkTW9kZSA0DQotCTAsLy92b2ljZUluVm9sdGVNb2RlICA1DQotCUZBTFNFLCAvL2lubmVySTJzSXNNYXN0ZXIgNg0KLQlUUlVFLC8vaW5uZXJJMnNJc0kyc01vZGUgNw0KLQlGQUxTRSwvL3ZwTG9vcFJ1bmluZyA4DQotCUZBTFNFLC8vbXV0ZUVuIDkNCi0JRkFMU0UsLy92UHJvY0lzTm9ybWFsIDEwDQotCVZQX0kyU19JRExFLC8vdnBJMnNTdGF0dXMgMTENCi0JVlBfUEFUSF9IQU5EU0VULC8vdnBQYXRoIDEyIA0KLQlWUF9QQVRIX0hBTkRTRVQsLy92cExvb3BQYXRoIDEzDQotCVZQX1ZPTF8zLCAvL3ZwVm9sIDE0DQotCU1BWF9WT0lDRV9NT0RFLC8vdm9pY2VNb2RlIDE1IA0KLQktMSwvL3ZwSW5pdEdhaW4gMTYNCi0JezB9LC8vYXVkaW9fY3RybEZsYWcgMTcNCi0gICAgRFRNRl9JRExFLC8vIDE4DQotICAgIDAsLy9kdG1mRGlyU2VsIDE5DQotICAgIDAsIC8vc2FtcGxlX3JhdGUgMjAgDQotCTAsIC8vdXNlRHRtZkxvb3A7IDIxDQotCTAsIC8vbXV0ZUNvdW50Oy8vbXV0ZV9jb3VudCAyMgkNCi0gICAgRkFMU0UsIC8vMjMgdnBMb29wQmtSdW5uaW5nDQotCUZBTFNFLCAvLzI0IHJ4TXV0ZUVuDQotCUZBTFNFLCAvLzI1IGZpcnN0UmVnWkNBVEZsYWcNCi0jaWZkZWYgRUNBTExfU1VQUE9SVAkNCi0JezB9LCAvLzI2IGVjYWxsRGF0YQ0KLSNlbmRpZg0KLSAgICAwIC8vMjcgdm9pY2VfbnZfdXBkYXRlDQotfTsNCi0NCi1zdGF0aWMgVF96RHJ2VnBfU3RhdGUgc192cFN0YXRlID0NCi17DQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCTAsDQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCU5VTEwsDQotCXswfSwNCi0JezB9LA0KLQkwLA0KLQlOVUxMLA0KLQlOVUxMLA0KLQlOVUxMLA0KLQlOVUxMLA0KLQlOVUxMLA0KLQlOVUxMLA0KLQlOVUxMDQotLy8JezB9DQotfTsNCi0NCi0vL2ZvciB0ZXN0IHdoaXRlTm9pc2UNCi0jaWZkZWYgVEVTVF9XSElURV9OT0lTRQ0KLVVJTlQzMiB0ZW1wQ291bnQgPSAwOw0KLVVJTlQ4ICpwVm9pY2VUZW1wQnVmID0gTlVMTDsNCi0jZW5kaWYNCi0NCi1zdGF0aWMgVF9aRHJ2VGRtX1BhcmFtcyBzX3ZwVGRtUmVhZFBhcmFtID0ge0FVRElPX01PTk9fQ0hBTk5FTCwgVlBfSTJTX0JVRkZFUl9TSVpFLCBOVUxMfTsNCi1zdGF0aWMgVF9aRHJ2VGRtX1BhcmFtcyBzX1ZwVGRtV3JpdGVQYXJhbSA9IHtBVURJT19NT05PX0NIQU5ORUwsIFZQX0kyU19CVUZGRVJfU0laRSwgTlVMTH07DQotI2lmZGVmIFZPSUNFX1RPTkVfTUlYRVJfRlVOQ1RJT04NCi1leHRlcm4gVF9IYWxNaXhlclRvbmVJbmZvIG1peGVyVG9uZUluZm87DQotI2VuZGlmDQotLyoNCi0jaWZkZWYgVlBfR0VUX1RYX0FMTF9EQVRBDQotVUlOVDggKnBWcFR4SW5BbGxEYXRhQnVmZmVyID0gTlVMTDsNCi1zdGF0aWMgVUlOVDMyIHNfVHhBbGxEYXRhU2F2ZUxlbiA9IDA7DQotI2VuZGlmDQotKi8NCi0jaWZkZWYgRUNBTExfU1VQUE9SVA0KLS8vZXh0ZXJuIFRfRHJ2RWNhbGxfT3B0ICBnRHJ2RWNhbGxfT2JqOyANCi1UX0RydkVjYWxsX09wdCB0X2VjYWxsT2JqID17DQotCWRydl9HZXRfRWNhbGxfU3RhdGUsCQkgIA0KLQlkcnZfRWNhbGxfUmVhZCwJCSAgIA0KLQlkcnZfRWNhbGxfV3JpdGUsICANCi0NCi19Ow0KLSNlbmRpZg0KLQ0KLWV4dGVybiBUX1pEcnZfVnBJbk91dEJ1ZmZlciB2cEluT3V0QnVmZmVyOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZmRlZiBDT05GSUdfQ1BfVVNFX1NPRlRfRFRNRl9ERVRFQ1QNCi1leHRlcm4gdm9pZCBzbGljX3R3X2R0bWZfZGV0ZWN0X29wZW4odm9pZCk7DQotZXh0ZXJuIGludCAgc2xpY190d19kdG1mX2RldGVjdChzaG9ydCAqcGNtLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBpbnQgZnMpOw0KLWV4dGVybiB2b2lkIHNsaWNfdHdfZHRtZl9kZXRlY3RfY2xvc2Uodm9pZCk7DQotI2VuZGlmDQotZXh0ZXJuIFNJTlQzMiB2b2ljZV9DcmVhdGVSY2RTZW1BbmRUaHJlYWQoVk9JRCk7DQotZXh0ZXJuIFNJTlQzMiB2b2ljZV9Jbml0Q29kZWMoVk9JRCk7DQotLy9leHRlcm4gU0lOVDMyIHpEcnZfRHRtZlRvbmVTdGFydChVSU5UMzIgdG9uZU51bSk7DQotZXh0ZXJuIFVJTlQzMiB6RHJ2VGltZXJfU3RhbXAoVk9JRCk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2STJTX0luaXQoVk9JRCk7DQotZXh0ZXJuIGludCBuYW5kX210ZF9lcmFzZShVSU5UMzIgZHdBZGRyKTsNCi0vL2FkdXZvaWNlIGNvbmZpZyBjb2RlDQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19PcGVuKFRfWkRydlZwX1NvdXJjZVR5cGUgc3JjdHlwZSk7DQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19DbG9zZShWT0lEKTsNCi1leHRlcm4gU0lOVDMyIGhhbFZwQ2ZnX0VuYWJsZShWT0lEKTsNCi1leHRlcm4gU0lOVDMyIGhhbFZwQ2ZnX0Rpc2FibGUoVk9JRCk7DQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19TZXRGcyhUX1pEcnZfVnBGcyBmcyk7DQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19TZXRJbnB1dFBhdGgoVF9aRHJ2X1ZwUGF0aCBwYXRoLCBCT09MIGVuYWJsZSk7DQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19TZXRJbnB1dFBhdGgoVF9aRHJ2X1ZwUGF0aCBwYXRoLCBCT09MIGVuYWJsZSk7DQotZXh0ZXJuIFNJTlQzMiBoYWxWcENmZ19TZXRNdXRlKFRfWkRydl9WcFBhdGggcGF0aCwgQk9PTCBtdXRlKTsNCi1leHRlcm4gVk9JRCB2cF9TZXRUb3BJMnNDb25maWcoVk9JRCk7DQotLy9leHRlcm4gU0lOVDMyIHpEcnZBdWRpb19Jbml0aWF0ZShWT0lEKTsNCi0NCi1zdGF0aWMgVk9JRCAgdnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeShTSU5UMzIgYXJndSk7DQotU0lOVDMyIHZwX1dyaXRlRGF0YVRvQ29kZWMoVUlOVDggKnBCdWYsIFVJTlQzMiBjb3VudCk7DQotU0lOVDMyIHZwX1JlYWREYXRhRnJvbUNvZGVjKFVJTlQ4ICpwQnVmLCBVSU5UMzIgY291bnQpOw0KLVNJTlQzMiB2cF9Wb2ljZUkyc1N0YXJ0KFZPSUQpOw0KLVNJTlQzMiB6RHJ2VnBfTG9vcFN0YXJ0RG8oVk9JRCk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2QXVkX0RzcFNldEF1ZFNldHRpbmcoQk9PTCB1c2VBZmVJMnMpOw0KLWV4dGVybiBTSU5UMzIgekRydkkyU19SZXNldChUX1pEcnZJMlNfSWQgdElkKTsNCi1TSU5UMzIgdnBfVGRtQ2ZnUGFyYW0oVF9aRHJ2VnBfQ2ZnICpjZmdQYXJhbSk7DQotU0lOVDMyIHZwX0kyc0NmZ1BhcmFtKFRfWkRydlZwX0NmZyAqY2ZnUGFyYW0pOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9Jbml0KFZPSUQpOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9PcGVuKFRfWkRydkkyc19UcmFuc01vZGUgdGRtVHJhbnNNb2RlKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZURE1fUmVzZXQoKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZURE1fQ2xvc2UoKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZURE1fV3JpdGVfUHJlcGFyZShUX1pEcnZUZG1fQ2ZnICogcHRDZmcpOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9Xcml0ZV9TdGFydChUX1pEcnZUZG1fUGFyYW1zICpwYXJhbXMsIFRfWkRydlRkbV9DZmcgKiBwdENmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VERNX1JlYWRfUHJlcGFyZShUX1pEcnZUZG1fQ2ZnICpwdENmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VERNX1JlYWRfU3RhcnQoVF9aRHJ2VGRtX1BhcmFtcyAqcGFyYW1zLCBUX1pEcnZUZG1fQ2ZnICpwdENmZyk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VERNX1dyaXRlKGNvbnN0IFVJTlQ4ICpwQnVmLCBVSU5UMzIgdWlMZW4pOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9SZWFkKFVJTlQ4ICoqIHBCdWYsIFVJTlQzMiAqIHVpTGVuKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZURE1fV3JpdGVfU3RvcCgpOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9SZWFkX1N0b3AoKTsNCi1leHRlcm4gU0lOVDMyIHpEcnZURE1fR2V0QnVmKFVJTlQ4ICoqcEJ1ZiwgVUlOVDMyICp1aUxlbik7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VERNX0JvdGhfU3RvcCgpOw0KLWV4dGVybiBTSU5UMzIgekRydlRETV9GcmVlQnVmKFVJTlQ4ICpwQnVmKTsNCi1leHRlcm4gVk9JRCB2cF9TZXRUb3BUZG1Db25maWcoVk9JRCk7DQotZXh0ZXJuIFNJTlQzMiB6RHJ2VnBfRWNhbGxTZXRNdXRlKFVJTlQzMiBlbmFibGUpOw0KLQ0KLQ0KLQ0KLSNpZmRlZiBWT0lDRV9UT05FX01JWEVSX0ZVTkNUSU9ODQotU0lOVDMyIHZvaWNlX1RvbmVNaXhlckRhdGEyKFVJTlQ4ICpwdmRhdGEsIFVJTlQzMiBzaXplLCBVSU5UOCAqcG1peGRhdGEpOw0KLSNlbmRpZg0KLQ0KLVNJTlQzMiBoYWxWcENmZ19TZXRPdXRwdXRQYXRoKFRfWkRydl9WcFBhdGggcGF0aCwgQk9PTCBlbmFibGUpOyAvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi1TSU5UMzIgekRydkkyU19Xcml0ZV9TdG9wKFRfWkRydkkyU19JZCB0SWQpOy8veGl1IGdhaSBjaHUgc2hlbmcgbWluZw0KLVNJTlQzMiB2b2ljZV9Ub25lTWl4ZXJEYXRhKFVJTlQ4ICpwdmRhdGEsIFVJTlQzMiBzaXplLCBVSU5UOCAqcG1peGRhdGEpOy8veGl1IGdhaSBjaHUgc2hlbmcgbWluZw0KLVNJTlQzMiB6RHJ2STJTX1JlYWRfUHJlcGFyZShUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMlNfQ2ZnICpwdENmZyk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHpEcnZJMlNfV3JpdGVfUHJlcGFyZShUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMlNfQ2ZnICpwdENmZyk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHpEcnZWb2x0ZV9Jbml0aWF0ZShWT0lEKTsvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi0vL1NJTlQzMiBWb2ljZVByb2NfU2V0R2FpbihTSU5UMzIgZ2FpbiwgVUlOVDMyIGNoYW5uZWwsIFRfWkRydl9WcFBhdGggcGF0aCk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHZvaWNlX1JjZFN0b3AoVk9JRCk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHZvaWNlX1JjZFN0YXJ0KFRfWkRydlJjZF9JbmZvUGFyYW0gKnBQYXJhbSk7Ly94aXUgZ2FpIGNodSBzaGVuZyBtaW5nDQotU0lOVDMyIHpEcnZJMlNfUmVhZF9TdGFydChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKTsvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi1TSU5UMzIgekRydkkyU19Xcml0ZV9TdGFydChUX1pEcnZJMlNfSWQgdElkLCBUX1pEcnZJMnNfUGFyYW1zICpwYXJhbXMsIFRfWkRydkkyU19DZmcgKnB0Q2ZnKTsvL3hpdSBnYWkgY2h1IHNoZW5nIG1pbmcNCi1TSU5UMzIgekRydkV4dEF1ZGlvX0dldEJ1ZihVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2lmZGVmIF9WQlVGRl9JTl9NVUxUSV9DT1JFDQotI2RlZmluZSBSUE1TR19DQVBfSUQgMQ0KLQ0KLVpPU1NfVElNRVJfSUQgc192b2ljZVRpbWVySWQgOw0KLVpPU1NfU0VNQVBIT1JFX0lEIHNfdm9pY2VSZFNlbWE7DQotWk9TU19TRU1BUEhPUkVfSUQgc192b2ljZVdyU2VtYTsNCi0NCi1pbnQgdGltZXJfY2JfY291bnQgPSAwOw0KLWludCBmaXJzdF9mdWxsX2ZsYWcgPSAwOw0KLWludCBmaXJzdF9lbXB0eV9mbGFnID0gMDsNCi0NCi1pbnQgdmJfcmVhZF9jb3VudCA9IDA7DQotaW50IHZiX3dyaXRlX2NvdW50ID0gMDsNCi0NCi0NCi12b2lkIHZvaWNlVGltZXJDYWxsQmFjayhTSU5UMzIgcGFyYSkNCi17DQotCVRfWkRydlJwTXNnX01zZyBpY3BfcE1zZyA9IHswfTsgDQotCQ0KLQlVSU5UOCBzID0gMTsNCi0JaWNwX3BNc2cuYWN0b3JJRCA9IFJQTVNHX0NBUF9JRDsNCi0NCi0JaWNwX3BNc2cuY2hJRCA9IGNoYW5uZWxfNDE7DQotCWljcF9wTXNnLmZsYWcgfD0gUlBNU0dfV1JJVEVfSU5UOw0KLQlpY3BfcE1zZy5idWYgPSAodm9pZCAqKSZzOw0KLQlpY3BfcE1zZy5sZW4gPSAxOw0KLQ0KLQ0KLQl6T3NzX1B1dFNlbWFwaG9yZShzX3ZvaWNlV3JTZW1hKTsNCi0Jek9zc19QdXRTZW1hcGhvcmUoc192b2ljZVJkU2VtYSk7DQotCS8vekRydlJwTXNnX1dyaXRlKCZpY3BfcE1zZyk7IA0KLQl6RHJ2UnBNc2dfV3JpdGVfQ2FwKCZpY3BfcE1zZyk7IA0KLQl0aW1lcl9jYl9jb3VudCsrOw0KLQlWQl9JTlRfT1ZFUkZMT1codGltZXJfY2JfY291bnQpOw0KLSNpZmRlZiBWQl9EQVRBX0xPU1NfVEVTVA0KLQ0KLQlpZigodGltZXJfY2JfY291bnQlMTAwMCApID09IDApew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiVzOnRpbWVyX2NiX2NvdW50KCVkKVxuIixfX0ZVTkNUSU9OX18sdGltZXJfY2JfY291bnQpOw0KLQkJaWYodGltZXJfY2JfY291bnQ+IDEwMDAwMDAwKSANCi0JCQl0aW1lcl9jYl9jb3VudD0wOw0KLQl9DQotDQotI2VuZGlmDQotCQ0KLS8vCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZVRpbWVyQ2FsbEJhY2sgdGltZXI9JXVcbiIsIGNwdV9jbG9jaygwKT4+MTApOw0KLX0NCi0jZGVmaW5lIE1BWF9CVUZfU0laRQkgICAgIDY0MA0KLSNkZWZpbmUgTUFYX0JVRl9OVU0gICAgICAgIDMNCi0NCi0NCi1lbnVtew0KLQlVUF9MSU5LLA0KLQlET1dOX0xJTksJDQotfTsNCi0NCi1zdHJ1Y3Qgdm9pY2VfcmluZ19idWZmZXIgew0KLQl2b2xhdGlsZSB1aW50IHJlYWRfcG9zOw0KLQl2b2xhdGlsZSB1aW50IHdyaXRlX3BvczsNCi0Jdm9sYXRpbGUgY2hhciBkYXRhW107DQotDQotfTsNCi1zdHJ1Y3Qgdm9pY2VfcmluZ19idWZmZXIgKnZvaWNlX2J1ZmZbMl0gPSB7TlVMTCxOVUxMfTsNCi0NCi0NCi0NCi1zdGF0aWMgYm9vbCB2b2ljZV9idWZmX2lzX2Z1bGwoaW50IHJlYWRfcG9zLCBpbnQgd3JpdGVfcG9zKQ0KLXsNCi0NCi0NCi0JaWYgKCh3cml0ZV9wb3MgLSByZWFkX3BvcykgPj0gMjAwMDAwMDApIHsNCi0JCXdyaXRlX3BvcyA9IHdyaXRlX3BvcyAtIDIwMDAwMDAwOw0KLQkJLy92b2ljZV9idWZmW1VQX0xJTktdLT53cml0ZV9wb3MgPSB3cml0ZV9wb3M7DQotCQl2b2ljZV9idWZmW0RPV05fTElOS10tPndyaXRlX3BvcyA9IHdyaXRlX3BvczsNCi0JfQ0KLQlyZXR1cm4gKCh3cml0ZV9wb3MgLSByZWFkX3BvcykgPT0gTUFYX0JVRl9OVU0pOw0KLX0NCi1zdGF0aWMgYm9vbCB2b2ljZV9idWZmX2lzX2VtcHR5KGludCByZWFkX3BvcywgaW50IHdyaXRlX3BvcykNCi17DQotCQ0KLQlyZXR1cm4gKHdyaXRlX3BvcyA9PSByZWFkX3Bvcyk7DQotfQ0KLXN0YXRpYyBpbnQgdm9pY2VfYnVmZmVyX3dyaXRlKCBjaGFyICpidWYsIGludCBjb3VudCkNCi17DQotCWludCByZWFkX3Bvcywgd3JpdGVfcG9zOwkNCi0NCi0NCi0JcmVhZF9wb3MgPSB2b2ljZV9idWZmW0RPV05fTElOS10tPnJlYWRfcG9zOw0KLQl3cml0ZV9wb3MgPSB2b2ljZV9idWZmW0RPV05fTElOS10tPndyaXRlX3BvczsJDQotCWlmKHZiX3dyaXRlX2NvdW50ID09IDApew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywiJXM6IGZpcnN0IHJlYWRfcG9zPSVkIHdyaXRlX3Bvcz0lZCBcbiIsX19GVU5DVElPTl9fLHJlYWRfcG9zLHdyaXRlX3Bvcyk7DQotCX0NCi0NCi0JDQotCWlmKHZvaWNlX2J1ZmZfaXNfZnVsbChyZWFkX3Bvcywgd3JpdGVfcG9zKSl7DQotCQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZV9idWZmZXJfcmVhZCByZWFkYnVmZmVyIGlzIGZ1bGwgXG4iKTsNCi0gICAJCSBmaXJzdF9mdWxsX2ZsYWcrKzsNCi0JCVZCX0lOVF9PVkVSRkxPVyhmaXJzdF9mdWxsX2ZsYWcpOw0KLQkJaWYoZmlyc3RfZnVsbF9mbGFnID09IDEpDQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiVzOiB3cml0ZWJ1ZmZlciBpcyBmdWxsICByZWFkX3BvcyAlZCx3cml0ZV9wb3MgJWQsdmJfd3JpdGVfY291bnQgJWQsY291bnQgJWRcbiIsX19GVU5DVElPTl9fLHJlYWRfcG9zLHdyaXRlX3Bvcyx2Yl93cml0ZV9jb3VudCxjb3VudCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SX0ZVTEw7DQotCX0NCi0JZWxzZSB7DQotCQl2Yl93cml0ZV9jb3VudCsrOwkNCi0JCQ0KLQkJVkJfSU5UX09WRVJGTE9XKHZiX3dyaXRlX2NvdW50KTsNCi0JCWZpcnN0X2Z1bGxfZmxhZyA9IDA7DQotCQl6T3NzX01lbWNweSgmKHZvaWNlX2J1ZmZbRE9XTl9MSU5LXS0+ZGF0YVsod3JpdGVfcG9zJU1BWF9CVUZfTlVNKSpNQVhfQlVGX1NJWkVdKSwgYnVmLCBjb3VudCk7DQotCQ0KLQkJd3JpdGVfcG9zKys7DQotDQotCQl2b2ljZV9idWZmW0RPV05fTElOS10tPndyaXRlX3BvcyA9IHdyaXRlX3BvczsNCi0NCi0JfQ0KLQkNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi1zdGF0aWMgaW50IHZvaWNlX2J1ZmZlcl9yZWFkKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQ0KLXsNCi0JaW50IHJlYWRfcG9zLCB3cml0ZV9wb3M7DQotCWludCogYnVmX2ludDsNCi0JaW50IGk7DQotCQ0KLQlyZWFkX3BvcyA9IHZvaWNlX2J1ZmZbVVBfTElOS10tPnJlYWRfcG9zOw0KLQl3cml0ZV9wb3MgPSB2b2ljZV9idWZmW1VQX0xJTktdLT53cml0ZV9wb3M7DQotCWlmKHZiX3JlYWRfY291bnQgPT0gMCl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCIlczogZmlyc3QgcmVhZF9wb3M9JWQgd3JpdGVfcG9zPSVkIFxuIixfX0ZVTkNUSU9OX18scmVhZF9wb3Msd3JpdGVfcG9zKTsNCi0JfQ0KLQ0KLQlpZiAoKGNvdW50ID4gMCkgJiYgKGNvdW50IDw9IE1BWF9CVUZfU0laRSkpICB7DQotCQlpZih2b2ljZV9idWZmX2lzX2VtcHR5KHJlYWRfcG9zLCB3cml0ZV9wb3MpKXsNCi0JCQlmaXJzdF9lbXB0eV9mbGFnKys7DQotCQkJVkJfSU5UX09WRVJGTE9XKGZpcnN0X2VtcHR5X2ZsYWcpOw0KLQkJCWlmKGZpcnN0X2VtcHR5X2ZsYWcgPT0xKQ0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCIlczogcmVhZGJ1ZmZlciBpcyBlbXB0eSxyZWFkX3BvcyAlZCx3cml0ZV9wb3MgJWQsdmJfcmVhZF9jb3VudCAlZCxjb3VudCAlZFxuIixfX0ZVTkNUSU9OX18scmVhZF9wb3Msd3JpdGVfcG9zLHZiX3JlYWRfY291bnQsY291bnQpOw0KLQkJCS8vYWRkIG1lbXNldCxkZWwgcmV0dXJuIC4gZWRpdCBmb3IgIGZhciBlbmQgaGVhciBuZWFyIGVuZCByZXByZWF0IHZvaWNlIHBjbSwgRlJPTSBNQkIgVEVTVA0KLQkJCQ0KLQkJI2lmbmRlZiAgVkJfREFUQV9MT1NTX1RFU1QNCi0JCQl6T3NzX01lbXNldCgmKHZvaWNlX2J1ZmZbVVBfTElOS10tPmRhdGFbKHJlYWRfcG9zJU1BWF9CVUZfTlVNKSpNQVhfQlVGX1NJWkVdKSwwLCBjb3VudCk7DQotCQkJek9zc19NZW1zZXQoYnVmLDAsIGNvdW50KTsNCi0JCSNlbmRpZgkJCQ0KLQkJCS8vcmV0dXJuIERSVl9FUlJPUl9FTVBUWTsNCi0JCQkNCi0NCi0JCX0NCi0JCWVsc2Ugew0KLQkJCQ0KLQkJICAgIHZiX3JlYWRfY291bnQrKzsgCQkJDQotCQkJVkJfSU5UX09WRVJGTE9XKHZiX3JlYWRfY291bnQpOwkJDQotCQkJZmlyc3RfZW1wdHlfZmxhZyA9IDA7DQotCQkJDQotCQkJek9zc19NZW1jcHkoYnVmLCAmKHZvaWNlX2J1ZmZbVVBfTElOS10tPmRhdGFbKHJlYWRfcG9zJU1BWF9CVUZfTlVNKSpNQVhfQlVGX1NJWkVdKSwgY291bnQpOw0KLQkJCS8vek9zc19NZW1zZXQoJih2b2ljZV9idWZmW1VQX0xJTktdLT5kYXRhWyhyZWFkX3BvcyVNQVhfQlVGX05VTSkqTUFYX0JVRl9TSVpFXSksMCwgY291bnQpOw0KLQ0KLSNpZmRlZiBWQl9EQVRBX0xPU1NfVEVTVA0KLQ0KLQkJCQ0KLQkJCWlmKHZiX3JlYWRfY291bnQgPCA1KXsNCi0JCQkJcHJfaW5mbygicHMgOmNvdW50PSVkIHZiX3JlYWRfY291bnQ9JWQscmVhZF9wb3M9JWQsd3JpdGVfcG9zPSVkXG4iLGNvdW50LHZiX3JlYWRfY291bnQscmVhZF9wb3Msd3JpdGVfcG9zKTsNCi0NCi0JCQkNCi0JCQkJYnVmX2ludCA9KCBpbnQqKSAmdm9pY2VfYnVmZltVUF9MSU5LXS0+ZGF0YVsod3JpdGVfcG9zJU1BWF9CVUZfTlVNKSpNQVhfQlVGX1NJWkVdOw0KLQkJCQkNCi0JCQkJZm9yKGk9MDtpPChjb3VudC80KTtpKyspew0KLQkJCQkgICAvLyooYnVmX2ludCtpKSA9IGk7DQotCQkJCSAgIC8vYnVmX2ludFtpXSA9IGk7DQotCQkJCSBpZihpPjB4MWYpICANCi0JCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sInBzOiAqKGJ1Zl9pbnQrJWQpPSVkXG4iLGksKihidWZfaW50K2kpKTsNCi0JCQkJfQ0KLQkJCQ0KLQkJCX0NCi0jZW5kaWYNCi0JCQlyZWFkX3BvcysrOw0KLQkJCWlmKHJlYWRfcG9zID09IDIwMDAwMDAwKQ0KLQkJCQlyZWFkX3BvcyA9IDA7DQotCQkJdm9pY2VfYnVmZltVUF9MSU5LXS0+cmVhZF9wb3MgPSByZWFkX3BvczsNCi0JCX0NCi0NCi0NCi0JfQ0KLQkJDQotCQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLSNlbHNlDQotZXh0ZXJuIGludCB2b2ljZWJ1ZmZlcl91bHF1ZXVlX3JlYWQodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSk7DQotZXh0ZXJuIGludCAgdm9pY2VidWZmZXJfZGxxdWV1ZV93cml0ZSh2b2lkICAqYnVmLCB1bnNpZ25lZCBpbnQgIHNpemUpOw0KLWV4dGVybiB2b2lkIHZvaWNlX2luZm9ybV90b19hcHAodm9pZCk7DQotLy9zdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHNfdm9pY2VfY29tcGxldGlvbik7DQotWk9TU19USU1FUl9JRCBzX3ZvaWNlVGltZXJJZCA7DQotWk9TU19TRU1BUEhPUkVfSUQgc192b2ljZVJkU2VtYTsNCi1aT1NTX1NFTUFQSE9SRV9JRCBzX3ZvaWNlV3JTZW1hOw0KLXZvaWQgdm9pY2VUaW1lckNhbGxCYWNrKFNJTlQzMiBwYXJhKQ0KLXsNCi0vLwljb21wbGV0ZV9hbGwoJnNfdm9pY2VfY29tcGxldGlvbik7DQotCXpPc3NfUHV0U2VtYXBob3JlKHNfdm9pY2VXclNlbWEpOw0KLQl6T3NzX1B1dFNlbWFwaG9yZShzX3ZvaWNlUmRTZW1hKTsNCi0Jdm9pY2VfaW5mb3JtX3RvX2FwcCgpOw0KLS8vCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZVRpbWVyQ2FsbEJhY2sgdGltZXI9JXVcbiIsIGNwdV9jbG9jaygwKT4+MTApOw0KLX0NCi0NCi0NCi0NCi0jZW5kaWYNCi0NCi1TSU5UMzIgdnBfcnhzZW1fY291bnRfSW5pdCh2b2lkKQ0KLXsNCi0JVUlOVDMyIGkgPSAwOw0KLQlVSU5UMzIgc2VtQ291bnQgPSAwOw0KLQlTSU5UMzIgQ291bnQgPSAwOw0KLQ0KLQlzZW1Db3VudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQoc192b2ljZVJkU2VtYSk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9yeHNlbV9jb3VudF9Jbml0IHJ4U2VtIGNvdW50PSVkXG4iLCAgc2VtQ291bnQpOw0KLQ0KLQlDb3VudCA9IHNlbUNvdW50Ow0KLQlpZihDb3VudCA+IDApICB7DQotCQlmb3IoaSA9IDA7IGkgPCBDb3VudDsgaSsrKSB7DQotCQkJek9zc19HZXRTZW1hcGhvcmUoc192b2ljZVJkU2VtYSwgWk9TU19OT19XQUlUKTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB2cF90eHNlbV9jb3VudF9Jbml0KHZvaWQpDQotew0KLQlVSU5UMzIgaSA9IDA7DQotCVVJTlQzMiBzZW1Db3VudCA9IDA7DQotCVNJTlQzMiBDb3VudCA9IDA7DQotDQotCXNlbUNvdW50ID0gek9zc19HZXRTZW1hcGhvcmVDb3VudChzX3ZvaWNlV3JTZW1hKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX3R4c2VtX2NvdW50X0luaXQgdHhTZW0gY291bnQ9JWQgXG4iLCAgc2VtQ291bnQpOw0KLQ0KLQlDb3VudCA9IDMgLSBzZW1Db3VudDsNCi0JaWYoQ291bnQgPiAwKSB7DQotCQlmb3IoaSA9IDA7IGkgPCBDb3VudDsgaSsrKSB7DQotCQkJek9zc19QdXRTZW1hcGhvcmUoc192b2ljZVdyU2VtYSk7DQotCQl9DQotCX0gZWxzZSBpZihDb3VudCA8IDApIHsNCi0JCUNvdW50ID0gMCAtIENvdW50Ow0KLQkJZm9yKGkgPSAwOyBpIDwgQ291bnQ7IGkrKykgew0KLQkJCXpPc3NfR2V0U2VtYXBob3JlKHNfdm9pY2VXclNlbWEsIFpPU1NfTk9fV0FJVCk7DQotCQl9DQotCX0NCi0JDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotI2VuZGlmDQotDQotDQotI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi1pbnQgZVdyRXJyID0gMDsNCi1VSU5UOCBlX3JlZ19mbGFnID0gMDsNCi0NCi1VSU5UMzIgZV9zdGFydENvdW50ID0gMDsNCi1VSU5UMzIgZV9zdG9wQ291bnQgPSAwOw0KLVVJTlQzMiBlX3dyQ291bnQgPSAwOw0KLVVJTlQzMiBlX3JkQ291bnQgPSAwOw0KLVRfRWNhbGxfU3RhdGUgcHJlRWNhbGxSeFN0YSA9IDA7DQotVF9FY2FsbF9TdGF0ZSBwcmVFY2FsbFR4U3RhID0gMDsJDQotDQotLy90eA0KLVNJTlQzMiByZHNlbV9jb3VudF9Jbml0KFRfU2VtX093bmVyIG93bmVyKQ0KLXsNCi0JVUlOVDMyIGkgPSAwOw0KLQlVSU5UMzIgc2VtQ291bnQgPSAwOw0KLQlTSU5UMzIgQ291bnQgPSAwOw0KLSAgICBaT1NTX1NFTUFQSE9SRV9JRCByZFNlbTsJDQotICAgIGlmKG93bmVyID09IEVDQUxMX1NFTSl7DQotCSAgICByZFNlbSA9IGdfdm9pY2VWYXIuZWNhbGxEYXRhLnJkU2VtYXBob3JlOwkJDQotCQlzZW1Db3VudCA9IHpPc3NfR2V0U2VtYXBob3JlQ291bnQocmRTZW0pOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInJkc2VtX2NvdW50X0luaXQgb3duZXI9JWQsIHJ4U2VtIGNvdW50PSVkXG4iLG93bmVyLHNlbUNvdW50KTsNCi0jaWYgMQ0KLQkJQ291bnQgPSAxIC0gc2VtQ291bnQ7CQ0KLQkJaWYoQ291bnQgPiAwKSB7DQotCQkJZm9yKGkgPSAwOyBpIDwgQ291bnQ7IGkrKykgew0KLQkJCQl6T3NzX1B1dFNlbWFwaG9yZShyZFNlbSk7DQotCQkJfQ0KLQkJfSBlbHNlIGlmKENvdW50IDwgMCkgew0KLQkJCUNvdW50ID0gMCAtIENvdW50Ow0KLQkJCWZvcihpID0gMDsgaSA8IENvdW50OyBpKyspIHsNCi0JCQkJek9zc19HZXRTZW1hcGhvcmUocmRTZW0sIFpPU1NfTk9fV0FJVCk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotI2Vsc2UNCi0NCi0JCUNvdW50ID0gc2VtQ291bnQ7DQotCQlpZihDb3VudCA+IDApICB7DQotCQkJZm9yKGkgPSAwOyBpIDwgQ291bnQ7IGkrKykgew0KLQkJCQl6T3NzX0dldFNlbWFwaG9yZShyZFNlbSwgWk9TU19OT19XQUlUKTsNCi0JCQl9DQotCQl9DQotI2VuZGlmCQkNCi0gICAgfQ0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLS8vcngNCi1TSU5UMzIgd3JzZW1fY291bnRfSW5pdChUX1NlbV9Pd25lciBvd25lcikNCi17DQotCVVJTlQzMiBpID0gMDsNCi0JVUlOVDMyIHNlbUNvdW50ID0gMDsNCi0JU0lOVDMyIENvdW50ID0gMDsNCi0NCi0gICAgWk9TU19TRU1BUEhPUkVfSUQgd3JTZW07CQ0KLSAgICBpZihvd25lciA9PSBFQ0FMTF9TRU0pew0KLQkJd3JTZW0gPSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZTsNCi0NCi0JCXNlbUNvdW50ID0gek9zc19HZXRTZW1hcGhvcmVDb3VudCh3clNlbSk7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAid3JzZW1fY291bnRfSW5pdCBvd25lcj0lZCwgdHhTZW0gY291bnQ9JWQgXG4iLG93bmVyLHNlbUNvdW50KTsNCi0NCi0jaWYgMQ0KLQkJQ291bnQgPSAxIC0gc2VtQ291bnQ7CQ0KLQkJaWYoQ291bnQgPiAwKSB7DQotCQkJZm9yKGkgPSAwOyBpIDwgQ291bnQ7IGkrKykgew0KLQkJCQl6T3NzX1B1dFNlbWFwaG9yZSh3clNlbSk7DQotCQkJfQ0KLQkJfSBlbHNlIGlmKENvdW50IDwgMCkgew0KLQkJCUNvdW50ID0gMCAtIENvdW50Ow0KLQkJCWZvcihpID0gMDsgaSA8IENvdW50OyBpKyspIHsNCi0JCQkJek9zc19HZXRTZW1hcGhvcmUod3JTZW0sIFpPU1NfTk9fV0FJVCk7DQotCQkJfQ0KLQkJfQ0KLQ0KLSNlbHNlDQotDQotCQlDb3VudCA9IHNlbUNvdW50Ow0KLQkJaWYoQ291bnQgPiAwKSAgew0KLQkJCWZvcihpID0gMDsgaSA8IENvdW50OyBpKyspIHsNCi0JCQkJek9zc19HZXRTZW1hcGhvcmUod3JTZW0sIFpPU1NfTk9fV0FJVCk7DQotCQkJfQ0KLQkJfQ0KLQ0KLSNlbmRpZgkNCi0gICAgfQ0KLQ0KLSAgICBlV3JFcnIgPSAwOw0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLXZvaWQgZWNhbGxUaW1lckNhbGxCYWNrKFNJTlQzMiBwYXJhKQ0KLXsNCi0vLwljb21wbGV0ZV9hbGwoJnNfdm9pY2VfY29tcGxldGlvbik7DQotCXpPc3NfUHV0U2VtYXBob3JlKGdfdm9pY2VWYXIuZWNhbGxEYXRhLndyU2VtYXBob3JlKTsNCi0Jek9zc19QdXRTZW1hcGhvcmUoZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUpOw0KLS8vCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbFRpbWVyQ2FsbEJhY2sgdGltZXI9JXVcbiIsIGNwdV9jbG9jaygwKT4+MTApOw0KLX0NCi1TSU5UMzIgZWNhbGxfSW5pdChWT0lEKQ0KLXsNCi0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUgPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiZWNhbGxfcmRfc2VtIiwgMCk7DQotCWlmKE5VTEwgPT0gZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgZWNhbGxfcmRfc2VtIGVyciBcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZSAgPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiZWNhbGxfd3Jfc2VtIiwgMCk7DQotCWlmKE5VTEwgPT0gZ192b2ljZVZhci5lY2FsbERhdGEud3JTZW1hcGhvcmUpIHsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgZWNhbGxfd3Jfc2VtIGVyciBcbiIpOw0KLQkgICAgek9zc19EZWxldGVTZW1hcGhvcmUoZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUpOw0KLSAgICAJZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUgPSBaT1NTX05VTEw7CQkNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JDQotCSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS50aW1lcklkICA9IHpPc3NfQ3JlYXRlVGltZXIoImVjYWxsX2ZyYW1lVGltZXIiLCBlY2FsbFRpbWVyQ2FsbEJhY2ssIDAsIFRSVUUpOw0KLQkgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsIFRpbWVySWQ9JXBcbiIsIGdfdm9pY2VWYXIuZWNhbGxEYXRhLnRpbWVySWQpOw0KLQlpZighZ192b2ljZVZhci5lY2FsbERhdGEudGltZXJJZCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX2ZyYW1lVGltZXIgIGZhaWxlZFxuIik7DQotCSAgICB6T3NzX0RlbGV0ZVNlbWFwaG9yZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS5yZFNlbWFwaG9yZSk7DQotICAgIAlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5yZFNlbWFwaG9yZSA9IFpPU1NfTlVMTDsJDQotCSAgICB6T3NzX0RlbGV0ZVNlbWFwaG9yZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZSk7DQotICAgIAlnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZSA9IFpPU1NfTlVMTDsJCQkNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEgPSBFQ0FMTF9TVF9JTklUOwkNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX0luaXQgc3VjY2Vzcy4gXHJcbiIpOw0KLQkNCi0JcmV0dXJuIERSVl9TVUNDRVNTOwkNCi19DQotI2RlZmluZSBFQ0FMTF9OQl9NRU1fU0laRQkJMzIwDQotI2RlZmluZSBFQ0FMTF9XQl9NRU1fU0laRQkJNjQwDQotDQotU0lOVDMyIGVjYWxsX09wZW4oVUlOVDMyIGZzKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlpbnQgYnVmc2l6ZTsNCi0JDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9PcGVuICBzdGFydCBcbiIgKTsNCi0NCi0JaWYgKChnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSAhPSAgRUNBTExfU1RfQ0xPU0UpJiYoZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEgIT0gIEVDQUxMX1NUX0lOSVQpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfT3BlbiBlcnJvcjogZWNhbGxTdGEgPSVkXG4iLCBnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSk7DQotCQlyZXR1cm4gRFJWX0VSUl9PUEVOX1RJTUVTOw0KLQl9DQotDQotCWlmKGZzID09IDgwMDApDQotCXsNCi0JCWJ1ZnNpemUgPSBFQ0FMTF9OQl9NRU1fU0laRTsNCi0NCi0JfQ0KLQllbHNlIGlmKGZzID09IDE2MDAwKQ0KLQl7DQotCQlidWZzaXplID0gRUNBTExfV0JfTUVNX1NJWkU7DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfT3BlbiBlcnJvcjogZnMgPSVkXG4iLCBmcyk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotDQotCWdfdm9pY2VWYXIuZWNhbGxEYXRhLnJ4RGF0YUJ1ZiA9IHpPc3NfTWFsbG9jKGJ1ZnNpemUpOw0KLQlpZiAoZ192b2ljZVZhci5lY2FsbERhdGEucnhEYXRhQnVmID09IE5VTEwpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbCBGYWlsZWQgdG8gYWxsb2NhdGUgcnhEYXRhQnVmXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEudHhEYXRhQnVmID0gek9zc19NYWxsb2MoYnVmc2l6ZSk7DQotCWlmIChnX3ZvaWNlVmFyLmVjYWxsRGF0YS50eERhdGFCdWYgPT0gTlVMTCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsIEZhaWxlZCB0byBhbGxvY2F0ZSB0eERhdGFCdWZcbiIpOw0KLQkgICAgek9zc19GcmVlKGdfdm9pY2VWYXIuZWNhbGxEYXRhLnJ4RGF0YUJ1Zik7CQkNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEuZGF0YUJ1ZlNpemUgPSBidWZzaXplOw0KLQ0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9IEVDQUxMX1NUX09QRU47DQotCWdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsUnhTdGEgPSBFQ0FMTF9TVF9SWF9JRExFOw0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFR4U3RhID0gRUNBTExfU1RfVFhfSURMRTsNCi0NCi0JZV9zdGFydENvdW50ID0gMDsNCi0gICAgZV9zdG9wQ291bnQgPSAwOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfT3BlbiAgZW5kIVxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotDQotDQotU0lOVDMyIGVjYWxsX0Nsb3NlKFZPSUQpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmIChnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9PSAgRUNBTExfU1RfQ0xPU0UpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9DbG9zZSByZXBlYXQ6IGVjYWxsU3RhID0lZFxuIiwgZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEpOw0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX09QRU5FRDsNCi0JfQ0KLQ0KLQlpZiAoKGdfdm9pY2VWYXIuZWNhbGxEYXRhLnR4RGF0YUJ1ZiA9PSBOVUxMKXx8KGdfdm9pY2VWYXIuZWNhbGxEYXRhLnR4RGF0YUJ1ZiA9PSBOVUxMKSB8fCAoZ192b2ljZVZhci5lY2FsbERhdGEuZGF0YUJ1ZlNpemUgID09IDApKSANCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX0Nsb3NlIGJ1ZiBwYXJhIGlzIG51bGwgIVxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXpPc3NfRnJlZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS5yeERhdGFCdWYpOw0KLQl6T3NzX0ZyZWUoZ192b2ljZVZhci5lY2FsbERhdGEudHhEYXRhQnVmKTsNCi0NCi0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEuZGF0YUJ1ZlNpemUgPSAwOw0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5yeERhdGFCdWYgPSBOVUxMOw0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS50eERhdGFCdWYgPSBOVUxMOw0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9IEVDQUxMX1NUX0NMT1NFOw0KLQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFJ4U3RhID0gRUNBTExfU1RfUlhfSURMRTsNCi0JZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSA9IEVDQUxMX1NUX1RYX0lETEU7DQotCXByZUVjYWxsUnhTdGEgPSBFQ0FMTF9TVF9SWF9JRExFOwkgICAgDQotCXByZUVjYWxsVHhTdGEgPSBFQ0FMTF9TVF9UWF9JRExFOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiJXMgZV9zdGFydENvdW50PSVkIGVfc3RvcENvdW50PSVkIFxuIixfX0ZVTkNUSU9OX18sZV9zdGFydENvdW50LGVfc3RvcENvdW50KTsNCi0JDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9DbG9zZSAgZW5kIVxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi0NCi0NCi19DQotDQotDQotDQotU0lOVDMyIGVjYWxsX1N0YXJ0KFZPSUQpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlcyBzdGFydCBlX3N0YXJ0Q291bnQ9JWQgXG4iLF9fRlVOQ1RJT05fXyxlX3N0YXJ0Q291bnQpOw0KLQlpZihnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9PSBFQ0FMTF9TVF9TVEFSVCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX1N0YXJ0IHJlcGVhdCBlY2FsbFN0YT0lZFxuIixnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSk7DQotCQlyZXR1cm4gRFJWX0VSUl9PUEVOX1RJTUVTOw0KLQl9CQ0KLQlpZigoZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEgIT0gRUNBTExfU1RfT1BFTikmJihnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSAhPSBFQ0FMTF9TVF9TVE9QKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX1N0YXJ0IG5vdCBzdXBwb3J0IGVjYWxsU3RhPSVkXG4iLGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhKTsNCi0JCXJldHVybiBEUlZfRVJSX1NUQVJUX1RJTUVTOw0KLQl9DQotDQotDQotCXpPc3NfU3RhcnRUaW1lcihnX3ZvaWNlVmFyLmVjYWxsRGF0YS50aW1lcklkLCAyMCwgZWNhbGxUaW1lckNhbGxCYWNrLCAwKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX1N0YXJ0IHpPc3NfU3RhcnRUaW1lciBzdGFydFxuIik7DQotCWdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhID0gRUNBTExfU1RfU1RBUlQ7CQ0KLQllX3N0YXJ0Q291bnQrKzsNCi0JZV93ckNvdW50ID0gMDsNCi0JZV9yZENvdW50ID0gMDsJDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICAiZWNhbGxfU3RhcnQgZW5kIFxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIGVjYWxsX1N0b3AoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlcyBzdGFydCBlX3N0b3BDb3VudD0lZCBcbiIsX19GVU5DVElPTl9fLGVfc3RvcENvdW50KTsNCi0JDQotCWlmKChnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9PSBFQ0FMTF9TVF9TVE9QKXx8KGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhID09IEVDQUxMX1NUX0NMT1NFKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX1N0b3AgcmVwZWF0IGVjYWxsU3RhPSVkXG4iLGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhKTsNCi0JCXJldHVybiBEUlZfRVJSX1NUQVJUX1RJTUVTOw0KLQl9ICANCi0NCi0Jek9zc19QdXRTZW1hcGhvcmUoZ192b2ljZVZhci5lY2FsbERhdGEucmRTZW1hcGhvcmUpOw0KLQl6T3NzX1B1dFNlbWFwaG9yZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZSk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9TdG9wIHB1dCByZCB3ciBzZW1cbiIpOwkNCi0Jek9zc19TdG9wVGltZXIoZ192b2ljZVZhci5lY2FsbERhdGEudGltZXJJZCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9TdG9wIHpPc3NfU3RvcFRpbWVyXG4iKTsNCi0NCi0JZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEgPSBFQ0FMTF9TVF9TVE9QOwkNCi0gICAgZV9zdG9wQ291bnQgKys7DQotDQotCQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiJXM6IGVfcmRDb3VudD0lZCBlX3dyQ291bnQ9JWQgXG4iLF9fRlVOQ1RJT05fXyxlX3JkQ291bnQsZV93ckNvdW50KTsNCi0NCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX1N0b3AgZW5kXG4iKTsNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHVwZGF0ZV9lY2FsbF9zdGF0ZShUX0RhdGFfRGlyX1R5cGUgZGlyKQ0KLXsNCi0JaW50IHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQkNCi0JaWYoZ192b2ljZVZhci5lY2FsbERhdGEub3B0LmRydl9HZXRfRWNhbGxfU3RhdGUgPT0gTlVMTCkNCi0JewkNCi0JDQotCSAgICB6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ1cGRhdGVfZWNhbGxfc3RhdGUgZ2V0X19lY2FsbF9zdGF0ZSBmdW4gbm90IHJlZ2lzdGVyIVxuIik7DQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfU1VQUE9SVEVEOw0KLQl9DQotCWlmKChkaXIgIT0gRElSX1RYKSYmKGRpciAhPSBESVJfUlgpKQ0KLQl7DQotCQkJCQ0KLQkJcmV0ID0gRFJWX0VSUl9JTlZBTElEX1BBUkFNOwkNCi0JCQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInVwZGF0ZV9lY2FsbF9zdGF0ZSAgZGlyIG5vdCBzdXBwb3J0IHJldHVybiwgZGlyID0gJWQgcmV0PSVkXG4iLGRpcixyZXQpOw0KLQl9CQ0KLQ0KLQlpZihnX3ZvaWNlVmFyLmVjYWxsRGF0YS5vcHQuZHJ2X0dldF9FY2FsbF9TdGF0ZSgpID09IDEpCQ0KLQl7CQkJCQkJDQotCQlpZihkaXIgPT0gRElSX1JYKQ0KLQkJew0KLQkJCQ0KLQkJCXByZUVjYWxsUnhTdGEgPSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFJ4U3RhOw0KLQkJCWdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsUnhTdGEgPSBFQ0FMTF9TVF9SWF9JTlVTRTsNCi0JCQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ1cGRhdGVfZWNhbGxfc3RhdGUgcnggc3RhdGUgY2hhbmdlIHRvIGVjYWxsUnhTdGEgPSAlZFxuIiwgZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxSeFN0YSk7DQotCQkJDQotCQl9DQotCQllbHNlIGlmKGRpciA9PSBESVJfVFgpDQotCQl7DQotDQotCQkJcHJlRWNhbGxUeFN0YSA9IGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsVHhTdGE7CQkJDQotCQkJZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSA9IEVDQUxMX1NUX1RYX0lOVVNFOwkNCi0JCQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ1cGRhdGVfZWNhbGxfc3RhdGUgdHggc3RhdGUgY2hhbmdlIHRvIGVjYWxsVHhTdGEgPSAlZFxuIiwgZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSk7DQotCQkJDQotCQl9DQotCQ0KLQkJDQotCQl6RHJ2VnBfRWNhbGxTZXRNdXRlKDEpOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkgICAgaWYoZGlyID09IERJUl9SWCkNCi0JCXsNCi0JCQlwcmVFY2FsbFJ4U3RhID0gZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxSeFN0YTsJCQ0KLQkJCWdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsUnhTdGEgPSBFQ0FMTF9TVF9SWF9JRExFOwkNCi0JCQ0KLQkgICAgfQ0KLQkJZWxzZSBpZihkaXIgPT0gRElSX1RYKQ0KLQkJew0KLQkJCXByZUVjYWxsVHhTdGEgPSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFR4U3RhOwkJDQotCQkJZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSA9IEVDQUxMX1NUX1RYX0lETEU7DQotDQotCQl9DQotCQkNCi0JCXpEcnZWcF9FY2FsbFNldE11dGUoMCk7DQotDQotCX0JDQotCQ0KLQlpZigoZGlyID09IERJUl9UWCkmJiggcHJlRWNhbGxUeFN0YSA9PSBFQ0FMTF9TVF9UWF9JRExFKSYmKGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsVHhTdGEgPT0gRUNBTExfU1RfVFhfSU5VU0UpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiJXM6ZGlyPSVkIGVjYWxsU3RhPSVkIGVjYWxsUnhTdGE9JWQgZWNhbGxUeFN0YT0lZCBwcmVFY2FsbFJ4U3RhPSVkIHByZUVjYWxsVHhTdGE9JWQgXG4iLF9fRlVOQ1RJT05fXyxkaXIsZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEsIFwNCi0JCQlnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFJ4U3RhLGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsVHhTdGEscHJlRWNhbGxSeFN0YSxwcmVFY2FsbFR4U3RhKTsNCi0JCXJkc2VtX2NvdW50X0luaXQoRUNBTExfU0VNKTsNCi0NCi0JfQ0KLQkJDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLQ0KLVNJTlQzMiBlY2FsbF9HZXRSeEJ1ZihVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQ0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmICgoTlVMTCA9PSBwQnVmKSB8fCAoTlVMTCA9PSB1aUxlbikpDQotCXsNCi0NCi0JICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9HZXRSeEJ1ZiBlcnJvciwgaXBhcmEgaXMgbnVsbCBcbiIpOw0KLQkJLy96RHJ2X0FTU0VSVCgwKTsJCQ0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoKGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhID09IEVDQUxMX1NUX0lOSVQpfHwoZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEgPT0gRUNBTExfU1RfQ0xPU0UpKSANCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX0dldFJ4QnVmIGVycm9yLCBpbnZhbGlkIGVjYWxsU3RhID0gJWRcbiIsIGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhKTsNCi0JDQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfT1BFTkVEOw0KLQl9DQotCQ0KLQlpZiAoKGdfdm9pY2VWYXIuZWNhbGxEYXRhLnJ4RGF0YUJ1ZiA9PSBOVUxMKSB8fCAoZ192b2ljZVZhci5lY2FsbERhdGEuZGF0YUJ1ZlNpemUgPT0gMCkpIA0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfR2V0UnhCdWYgZXJyb3IsIHJldHVybiBwYXJhIGlzIG51bGwgIVxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotDQotCSpwQnVmID0gZ192b2ljZVZhci5lY2FsbERhdGEucnhEYXRhQnVmOw0KLQkqdWlMZW4gPSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS5kYXRhQnVmU2l6ZTsNCi0JDQotDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiBlY2FsbF9HZXRUeEJ1ZihVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQ0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmICgoTlVMTCA9PSBwQnVmKSB8fCAoTlVMTCA9PSB1aUxlbikgKQ0KLQl7DQotCQkvL3pEcnZfQVNTRVJUKDApOw0KLQkgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX0dldFR4QnVmIGVycm9yLCBpcGFyYSBpcyBudWxsIFxuIik7DQotCQkvL3pEcnZfQVNTRVJUKDApOwkJCQkNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaWYgKChnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFN0YSA9PSBFQ0FMTF9TVF9JTklUKXx8KGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsU3RhID09IEVDQUxMX1NUX0NMT1NFKSApIA0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfR2V0VHhCdWYgZXJyb3IsIGludmFsaWQgZWNhbGxTdGEgPSAlZFxuIiwgZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxTdGEpOw0KLQkNCi0JCXJldHVybiBEUlZfRVJSX05PVF9PUEVORUQ7DQotCX0NCi0JaWYgKChnX3ZvaWNlVmFyLmVjYWxsRGF0YS50eERhdGFCdWYgPT0gTlVMTCl8fChnX3ZvaWNlVmFyLmVjYWxsRGF0YS50eERhdGFCdWYgPT0gTlVMTCkgfHwgKGdfdm9pY2VWYXIuZWNhbGxEYXRhLmRhdGFCdWZTaXplICA9PSAwKSkgDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJlY2FsbF9HZXRUeEJ1ZiBlcnJvciwgcmV0dXJuIHBhcmEgaXMgbnVsbCAhXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0NCi0JKnBCdWYgPSBnX3ZvaWNlVmFyLmVjYWxsRGF0YS50eERhdGFCdWY7DQotCSp1aUxlbiA9IGdfdm9pY2VWYXIuZWNhbGxEYXRhLmRhdGFCdWZTaXplOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jZW5kaWYNCi0NCi1TSU5UMzIgekRydl9Jbml0KFZPSUQpDQotew0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXpEcnZJMlNfSW5pdCgpOw0KLQl9DQotCWVsc2UgaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSA9PSAxKQ0KLQl7DQotCQl6RHJ2STJTX0luaXQoKTsNCi0JCXpEcnZURE1fSW5pdCgpOw0KLQl9DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHpEcnZFeHRBdWRpb19PcGVuKFRfWkRydkkyc19UcmFuc01vZGUgaTJzVHJhbnNNb2RlKQ0KLXsNCi0JaW50IHJldCA9IDA7DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jZWxzZQ0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZJMlNfT3BlbihJMlNfMSwgaTJzVHJhbnNNb2RlKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9PcGVuKGkyc1RyYW5zTW9kZSk7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fUmVzZXQoKQ0KLXsNCi0JaW50IHJldCA9IDA7DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jZWxzZQkNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX1Jlc2V0KEkyU18xKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9SZXNldCgpOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX0Nsb3NlKCkNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19DbG9zZShJMlNfMSk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fQ2xvc2UoKTsNCi0JfQ0KLSNlbmRpZgkNCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHpEcnZFeHRBdWRpb19Xcml0ZV9QcmVwYXJlKFRfWkRydkkyU19DZmcgKmkyc0NmZywgVF9aRHJ2VGRtX0NmZyAqdGRtQ2ZnKQ0KLXsNCi0JaW50IHJldCA9IDA7DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jZWxzZQkNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX1dyaXRlX1ByZXBhcmUoSTJTXzEsIGkyc0NmZyk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fV3JpdGVfUHJlcGFyZSh0ZG1DZmcpOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX1dyaXRlX1N0YXJ0KFRfWkRydkkyc19QYXJhbXMgKmkyc1BhcmFtcywgVF9aRHJ2STJTX0NmZyAqaTJzQ2ZnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9aRHJ2VGRtX1BhcmFtcyAqdGRtUGFyYW1zLCBUX1pEcnZUZG1fQ2ZnICp0ZG1DZmcpDQotew0KLQlpbnQgcmV0ID0gMDsNCi0jaWZkZWYgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgIA0KLSNlbHNlCQ0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZJMlNfV3JpdGVfU3RhcnQoSTJTXzEsIGkyc1BhcmFtcywgaTJzQ2ZnKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9Xcml0ZV9TdGFydCh0ZG1QYXJhbXMsIHRkbUNmZyk7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fV3JpdGVfU3RhcnRfRG8oVF9aRHJ2STJzX1BhcmFtcyAqaTJzUGFyYW1zLCBUX1pEcnZJMlNfQ2ZnICppMnNDZmcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1pEcnZUZG1fUGFyYW1zICp0ZG1QYXJhbXMsIFRfWkRydlRkbV9DZmcgKnRkbUNmZykNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19Xcml0ZV9TdGFydF9EbyhJMlNfMSwgaTJzUGFyYW1zKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9Xcml0ZV9TdGFydF9Ebyh0ZG1QYXJhbXMpOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX1JlYWRfUHJlcGFyZShUX1pEcnZJMlNfQ2ZnICppMnNDZmcsIFRfWkRydlRkbV9DZmcgKnRkbUNmZykNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19SZWFkX1ByZXBhcmUoSTJTXzEsIGkyc0NmZyk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fUmVhZF9QcmVwYXJlKHRkbUNmZyk7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fUmVhZF9TdGFydChUX1pEcnZJMnNfUGFyYW1zICppMnNQYXJhbXMsIFRfWkRydkkyU19DZmcgKmkyc0NmZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9aRHJ2VGRtX1BhcmFtcyAqdGRtUGFyYW1zLCBUX1pEcnZUZG1fQ2ZnICp0ZG1DZmcpDQotew0KLQlpbnQgcmV0ID0gMDsNCi0jaWZkZWYgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgIA0KLSNlbHNlCQ0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZJMlNfUmVhZF9TdGFydChJMlNfMSwgaTJzUGFyYW1zLCBpMnNDZmcpOw0KLQl9DQotCWVsc2UgaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSA9PSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2VERNX1JlYWRfU3RhcnQodGRtUGFyYW1zLCB0ZG1DZmcpOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX1JlYWRfU3RhcnRfRG8oVF9aRHJ2STJzX1BhcmFtcyAqaTJzUGFyYW1zLCBUX1pEcnZJMlNfQ2ZnICppMnNDZmcsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfWkRydlRkbV9QYXJhbXMgKnRkbVBhcmFtcywgVF9aRHJ2VGRtX0NmZyAqdGRtQ2ZnKQ0KLXsNCi0JaW50IHJldCA9IDA7DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jZWxzZQkNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX1JlYWRfU3RhcnRfRG8oSTJTXzEsIGkyc1BhcmFtcyk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fUmVhZF9TdGFydF9Ebyh0ZG1QYXJhbXMpOw0KLQl9DQotI2VuZGlmDQotCXJldHVybiByZXQ7DQotfQ0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fV3JpdGUoY29uc3QgVUlOVDggKnBCdWYsIFVJTlQzMiB1aUxlbikNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX1dyaXRlKEkyU18xLCBwQnVmLCB1aUxlbik7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fV3JpdGUocEJ1ZiwgdWlMZW4pOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX1JlYWQoY29uc3QgVUlOVDggKipwQnVmLCBVSU5UMzIgKnVpTGVuKQ0KLXsNCi0JaW50IHJldCA9IDA7DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICAJDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19SZWFkKEkyU18xLCBwQnVmLCB1aUxlbik7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fUmVhZChwQnVmLCB1aUxlbik7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotU0lOVDMyIGVjYWxsX1dyaXRlKGNvbnN0IFVJTlQ4ICpwQnVmLCBVSU5UMzIgdWlMZW4pDQotew0KLQlpbnQgcmV0ID0gMDsNCi0JaWYoZ192b2ljZVZhci5lY2FsbERhdGEub3B0LmRydl9FY2FsbF9Xcml0ZSA9PSBOVUxMKQ0KLQl7CQ0KLQkJcmV0dXJuIERSVl9FUlJfTk9UX1NVUFBPUlRFRDsNCi0JfQ0KLQ0KLQlyZXQgPSB6T3NzX0dldFNlbWFwaG9yZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS53clNlbWFwaG9yZSwgMjApOw0KLQlpZihyZXQgPT0gWk9TU19TVUNDRVNTKXsNCi0JCXJldCA9IGdfdm9pY2VWYXIuZWNhbGxEYXRhLm9wdC5kcnZfRWNhbGxfV3JpdGUocEJ1ZiwgdWlMZW4pOw0KLQkJZV93ckNvdW50Kys7DQotCX0NCi0JZWxzZXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlczogZ2V0IHNlbSB0aW1lb3V0IHJldD0lZCBcbiIsX19GVU5DVElPTl9fLHJldCk7DQotCQkNCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgZWNhbGxfUmVhZChjb25zdCBVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQlpbnQgcmV0ID0gMDsNCi0NCi0JaWYoZ192b2ljZVZhci5lY2FsbERhdGEub3B0LmRydl9FY2FsbF9SZWFkID09IE5VTEwpDQotCXsJDQotCQlyZXR1cm4gRFJWX0VSUl9OT1RfU1VQUE9SVEVEOw0KLQl9DQotCWlmKCBnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFR4U3RhID09IEVDQUxMX1NUX1RYX0lOVVNFKQ0KLQl7DQotCSAgICByZXQgPSB6T3NzX0dldFNlbWFwaG9yZShnX3ZvaWNlVmFyLmVjYWxsRGF0YS5yZFNlbWFwaG9yZSwgIDIwKTsNCi0JCWlmKHJldCA9PSBaT1NTX1NVQ0NFU1Mpew0KLQkJCXJldCA9IGdfdm9pY2VWYXIuZWNhbGxEYXRhLm9wdC5kcnZfRWNhbGxfUmVhZCgqcEJ1ZiwgdWlMZW4pOw0KLQkJCWVfcmRDb3VudCsrOw0KLQkJfQ0KLQkJZWxzZXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiJXM6IGdldCBzZW0gdGltZW91dCByZXQ9JWQgXG4iLF9fRlVOQ1RJT05fXyxyZXQpOw0KLQkJCQ0KLQkJfQkJDQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotI2VuZGlmDQotU0lOVDMyIHpEcnZFeHRBdWRpb19Xcml0ZV9TdG9wKCkNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19Xcml0ZV9TdG9wKEkyU18xKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9Xcml0ZV9TdG9wKCk7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fUmVhZF9TdG9wKCkNCi17DQotCWludCByZXQgPSAwOw0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19SZWFkX1N0b3AoSTJTXzEpOw0KLQl9DQotCWVsc2UgaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSA9PSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2VERNX1JlYWRfU3RvcCgpOw0KLQl9DQotI2VuZGlmCQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydkV4dEF1ZGlvX0dldEJ1ZihVSU5UOCAqKnBCdWYsIFVJTlQzMiAqdWlMZW4pDQotew0KLQlpbnQgcmV0ID0gMDsNCi0jaWZkZWYgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgIAkNCi0jZWxzZQ0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZJMlNfR2V0QnVmKEkyU18xLCBwQnVmLCB1aUxlbik7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fR2V0QnVmKHBCdWYsIHVpTGVuKTsNCi0JfQ0KLSNlbmRpZg0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jaWYgMA0KLVNJTlQzMiB6RHJ2RXh0QXVkaW9fQm90aF9TdG9wKCkNCi17DQotCWludCByZXQgPSAwOw0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZJMlNfQm90aF9TdG9wKEkyU18xKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydlRETV9Cb3RoX1N0b3AoKTsNCi0JfQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jZW5kaWYNCi1TSU5UMzIgekRydkV4dEF1ZGlvX0ZyZWVCdWYoVUlOVDggKnBCdWYpDQotew0KLQlpbnQgcmV0ID0gMDsNCi0jaWZkZWYgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgIA0KLSNlbHNlCQkNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX0ZyZWVCdWYoSTJTXzEsIHBCdWYpOw0KLQl9DQotCWVsc2UgaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSA9PSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2VERNX0ZyZWVCdWYocEJ1Zik7DQotCX0NCi0jZW5kaWYJDQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLXZvaWQgekRydkV4dEF1ZGlvX1Jsc0FsbFNlbWFCZWZvcmVTdG9wKHZvaWQpDQotew0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2Vsc2UJCQ0KLQlpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXpEcnZUZG1fUnhSbHNTZW1hQmVmb3JlU3RvcCgpOw0KLQkJekRydlRkbV9UeFJsc1NlbWFCZWZvcmVTdG9wKCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2STJzX1J4UmxzU2VtYUJlZm9yZVN0b3AoSTJTXzEpOw0KLQkJekRydkkyc19UeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18xKTsNCi0JfQ0KLSNlbmRpZgkNCi19DQotDQotdm9pZCB6RHJ2RXh0QXVkaW9fUnhSbHNTZW1hQmVmb3JlU3RvcCh2b2lkKQ0KLXsNCi0jaWZkZWYgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgIA0KLSNlbHNlCQkNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSA9PSAxKQ0KLQl7DQotCQl6RHJ2VGRtX1J4UmxzU2VtYUJlZm9yZVN0b3AoKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZJMnNfUnhSbHNTZW1hQmVmb3JlU3RvcChJMlNfMSk7DQotCX0NCi0jZW5kaWYJDQotfQ0KLQ0KLXZvaWQgekRydkV4dEF1ZGlvX1R4UmxzU2VtYUJlZm9yZVN0b3Aodm9pZCkNCi17DQotI2lmZGVmIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jZWxzZQkJDQotCWlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJekRydlRkbV9UeFJsc1NlbWFCZWZvcmVTdG9wKCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2STJzX1R4UmxzU2VtYUJlZm9yZVN0b3AoSTJTXzEpOw0KLQl9DQotI2VuZGlmCQ0KLX0NCi0NCi1WT0lEIHZwX1NldFRvcENvbmZpZyhWT0lEKQ0KLXsNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQl2cF9TZXRUb3BJMnNDb25maWcoKTsNCi0JfQ0KLQllbHNlIGlmIChnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gPT0gMSkNCi0Jew0KLQkJdnBfU2V0VG9wVGRtQ29uZmlnKCk7DQotCX0NCi19DQotI2lmIDANCi0vL2R0bWbmo4DmtYst5rWL6K+V55SoDQotVF9EcnZEdG1mX0RldGVjdF9PcHQgZHRtZl90ZXN0Ow0KLXZvaWQgZHJ2X2R0bWZyeF9yZXBvcnQoY2hhciAqZHRtZl9zdHJpbmcsIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbikNCi17DQotICAgIC8vcHJpbnRrKCJjcCBkcnZfZHRtZnJ4X3JlcG9ydCwgZHRtZl9zdHJpbmc9JWMsIHN0cmluZ19sZW49JWRcbiIsICpkdG1mX3N0cmluZywgc3RyaW5nX2xlbik7DQotICAgIHpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgImNwIGRydl9kdG1mcnhfcmVwb3J0LCBkdG1mX3N0cmluZz0lYywgc3RyaW5nX2xlbj0lZFxuIiwgKmR0bWZfc3RyaW5nLCBzdHJpbmdfbGVuKTsNCi19DQotdm9pZCBkcnZfZHRtZnR4X3JlcG9ydChjaGFyICpkdG1mX3N0cmluZywgdW5zaWduZWQgY2hhciBzdHJpbmdfbGVuKQ0KLXsNCi0gICAgLy9wcmludGsoImNwIGRydl9kdG1mdHhfcmVwb3J0LCBkdG1mX3N0cmluZz0lYywgc3RyaW5nX2xlbj0lZFxuIiwgKmR0bWZfc3RyaW5nLCBzdHJpbmdfbGVuKTsNCi0gICAgek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAiY3AgZHJ2X2R0bWZ0eF9yZXBvcnQsIGR0bWZfc3RyaW5nPSVjLCBzdHJpbmdfbGVuPSVkXG4iLCAqZHRtZl9zdHJpbmcsIHN0cmluZ19sZW4pOw0KLX0NCi0jZW5kaWYNCi0NCi1VSU5UMzIgZXh0X2FSZENvdW50ID0gMDsNCi1VSU5UMzIgZXh0X2FSZEZCdWZDb3VudCA9IDA7DQotDQotU0lOVDMyIHZwX09wZW4oVF9aRHJ2Vm9pY2VfTU9ERSB2b2ljZU1vZGUpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuICBzdGFydCB2b2ljZU1vZGUgPSAlZFxuIiwgdm9pY2VNb2RlKTsNCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gIFZQX0kyU19JRExFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiBlcnJvcjogdnBJMnNTdGF0dXMgISA9ICBWUF9JMlNfSURMRSB2cEkyc1N0YXR1cz0lZFxuIiwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCQlyZXR1cm4gRFJWX0VSUl9PUEVOX1RJTUVTOw0KLQl9DQotDQotCWlmIChnX3ZvaWNlVmFyLnZwTG9vcFJ1bmluZyA9PSBUUlVFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiBFcnIsIHZwTG9vcCBpcyBSdW5pbmcgXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JZ192b2ljZVZhci52b2ljZUluR3NtVGRNb2RlID0gMDsNCi0JZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlID0gMDsNCi0NCi0JaWYgKHZvaWNlTW9kZSA9PSBWT0lDRV9HU01fTU9ERSkNCi0Jew0KLQkJZ192b2ljZVZhci52b2ljZUluR3NtVGRNb2RlID0gMTsNCi0JfQ0KLQllbHNlIGlmICgodm9pY2VNb2RlID09IFZPSUNFX0xURV9NT0RFKSB8fCAodm9pY2VNb2RlID09IFZPSUNFX1dDRE1BX01PREUpIHx8ICh2b2ljZU1vZGUgPT0gVk9JQ0VfVERfTU9ERSkpDQotCXsNCi0JCWdfdm9pY2VWYXIudm9pY2VJblZvbHRlTW9kZSA9IDE7DQotCQlzX3NwZWVjaFN0YXRlLnZvbHRlVnBXcml0ZVN0b3BGbGFnID0gMDsvL3RvZ2V0aGVyIGNvbnRyb2wgdnAgdnBzdGF0ZQ0KLQkJc19zcGVlY2hTdGF0ZS52b2x0ZVZwUmVhZFN0b3BGbGFnID0gMDsvL3RvZ2V0aGVyIGNvbnRyb2wgdnAgdnBzdGF0ZQ0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX09wZW4gdm9pY2Vtb2RlIG5vdCBzdXBwb3J0ICFcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlpZiAoKE5VTEwgIT0gc192cFN0YXRlLnBWcFJ4SW5CdWZmZXIpICYmIChOVUxMICE9IHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyKSAmJiAoTlVMTCAhPSBzX3ZwU3RhdGUucFZwUnhPdXRQdXRCdWZmZXIpICYmIChOVUxMICE9IHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlcikpDQotCXsNCi0JCXpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBSeEluQnVmZmVyLCAwLCBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplKTsNCi0JCXpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyLCAwLCBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplKTsNCi0JCXpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlciwgMCwgc192cFN0YXRlLmluT3V0QnVmU2l6ZSk7DQotI2lmZGVmIF9VU0VfVlBfT1VUUFVUX1JYT1VUX0RBVEENCi0gICAgICAgIHpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlciwgMCwgc192cFN0YXRlLmluT3V0QnVmU2l6ZSk7DQotI2Vsc2UNCi0JCXpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlciwgMCwgNjQwKTsNCi0jZW5kaWYNCi0NCi0JCXNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlcjsNCi0JCXNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhJbkJ1ZmZlcjsNCi0JCXNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyOw0KLQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhPdXRQdXRCdWZmZXI7DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiBzX3ZvaWNlQnVmZmVyIGlzIE5VTEwiKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotDQotCX0NCi0NCi0JcmV0ID0gaGFsVnBDZmdfT3BlbihWUF9WT0lDRV9TT1VSQ0UpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiBoYWxWcENmZ19PcGVuIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0NCi0JaWYgKGdfdm9pY2VWYXIuaXNVc2VTbGljQ29kZWMgIT0gMSkNCi0Jew0KLQkJcmV0ID0gekRydkV4dEF1ZGlvX09wZW4oVFJBTlNfRE1BX01PREUpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiB6RHJ2STJTX09wZW4oVFJBTlNfRE1BX01PREUpIGVyciByZXQ9JWQgIiwgcmV0KTsNCi0JCQlyZXQgPSBoYWxWcENmZ19DbG9zZSgpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfT3BlbiBoYWxfVnBDZmdfQ2xvc2UgZXJyIHJldD0lZCIsIHJldCk7DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotDQotCX0NCi0JaWYgKHZvaWNlTW9kZSA9PSBWT0lDRV9HU01fTU9ERSkNCi0Jew0KLQkJcmV0ID0gekRydkkyU19PcGVuKEkyU18yLCBUUkFOU19ETUFfTU9ERSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIHpEcnZJMlNfT3BlbihJMlNfMixUUkFOU19ETUFfTU9ERSkgZXJyIHJldD0lZCAiLCByZXQpOw0KLQkJCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCQkJew0KLQkJCQlyZXQgPSB6RHJ2RXh0QXVkaW9fQ2xvc2UoKTsNCi0JCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQkJew0KLQkJCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX09wZW4gekRydkkyU19DbG9zZSBpMnMxIGVyciByZXQ9JWQiLCByZXQpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCXJldCA9IGhhbFZwQ2ZnX0Nsb3NlKCk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIGhhbF9WcENmZ19DbG9zZSBlcnIgcmV0PSVkIiwgcmV0KTsNCi0JCQl9DQotDQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JfQ0KLQkvKg0KLQkjaWZkZWYgVlBfR0VUX1RYX0FMTF9EQVRBDQotCSAgICBwVnBUeEluQWxsRGF0YUJ1ZmZlcj0oVUlOVDggKikweDI1NTAwMDAwOw0KLQkgICAgek9zc19NZW1zZXQocFZwVHhJbkFsbERhdGFCdWZmZXIsMCwweDEwMDAwMCk7DQotCSAgICBzX1R4QWxsRGF0YVNhdmVMZW49MDsNCi0JI2VuZGlmDQotCSovDQotI2lmZGVmIFRFU1RfV0hJVEVfTk9JU0UNCi0JcFZvaWNlVGVtcEJ1ZiA9IHNfdm9pY2VUZW1wQnVmZmVyOy8vZm9yIHRlc3QNCi0JdGVtcENvdW50ID0gMDsNCi0jZW5kaWYNCi0jaWZkZWYgQ09ORklHX0NQX1VTRV9TT0ZUX0RUTUZfREVURUNUDQotCXNsaWNfdHdfZHRtZl9kZXRlY3Rfb3BlbigpOw0KLSNlbmRpZg0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotI2lmZGVmIF9WQlVGRl9JTl9NVUxUSV9DT1JFDQotDQotDQotCXZwX3J4c2VtX2NvdW50X0luaXQoKTsNCi0JdnBfdHhzZW1fY291bnRfSW5pdCgpOw0KLQl2b2ljZV9idWZmW1VQX0xJTktdLT5yZWFkX3BvcyA9IDA7DQotCXZvaWNlX2J1ZmZbVVBfTElOS10tPndyaXRlX3BvcyA9IDA7IA0KLQl2b2ljZV9idWZmW0RPV05fTElOS10tPnJlYWRfcG9zID0gMDsNCi0Jdm9pY2VfYnVmZltET1dOX0xJTktdLT53cml0ZV9wb3MgPSAwOyANCi0Jek9zc19NZW1zZXQoJih2b2ljZV9idWZmW0RPV05fTElOS10tPmRhdGFbMF0pLDAsIE1BWF9CVUZfTlVNKk1BWF9CVUZfU0laRSk7DQotCXpPc3NfTWVtc2V0KCYodm9pY2VfYnVmZltVUF9MSU5LXS0+ZGF0YVswXSksMCwgTUFYX0JVRl9OVU0qTUFYX0JVRl9TSVpFKTsNCi0NCi0jZWxzZQ0KLS8vCUlOSVRfQ09NUExFVElPTihzX3ZvaWNlX2NvcGxldGlvbik7DQotCXZwX3J4c2VtX2NvdW50X0luaXQoKTsNCi0JdnBfdHhzZW1fY291bnRfSW5pdCgpOw0KLSNlbmRpZg0KLSNlbmRpZg0KLQ0KLQlnX3ZvaWNlVmFyLm11dGVDb3VudCA9IDA7DQotCXNfc3BlZWNoU3RhdGUudHhTYXZlTGVuID0gMDsNCi0Jc19zcGVlY2hTdGF0ZS5yeFNhdmVMZW4gPSAwOw0KLQlzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPSAwOw0KLQlzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPSAwOw0KLQlzX3NwZWVjaFN0YXRlLmkyc0lzUnN0RmxhZyA9IEZBTFNFOw0KLQlzX3NwZWVjaFN0YXRlLmZpcnN0V3JpdGVEYXRhRmxhZyA9IEZBTFNFOw0KLQlzX3NwZWVjaFN0YXRlLmZpcnN0UmVhZERhdGFGbGFnID0gRkFMU0U7DQotDQotCWdfdm9pY2VWYXIudm9pY2VNb2RlID0gdm9pY2VNb2RlOw0KLQlnX3ZvaWNlVmFyLm11dGVFbiA9IEZBTFNFOw0KLQlnX3ZvaWNlVmFyLnJ4TXV0ZUVuID0gRkFMU0U7DQotCWdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPSBWUF9JMlNfT1BFTjsNCi0JZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gRkFMU0U7DQotICAgIGdfdm9pY2VWYXIuZHRtZkRpclNlbCA9IERUTUZfSURMRTsNCi0NCi0gICAgaWYgKEZBTFNFID09IGdfdm9pY2VWYXIuZmlyc3RSZWdaQ0FURmxhZykgew0KLSAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTAsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhJbkJ1ZmZlcik7DQotICAgICAgICBpZihyZXQgIT0gRFJWX1NVQ0NFU1Mpew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIFJYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTIsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhJbkJ1ZmZlcik7DQotICAgICAgICBpZihyZXQgIT0gRFJWX1NVQ0NFU1Mpew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIFRYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICANCi0JCXJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDEzLFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSwoVUlOVDMyKXZwSW5PdXRCdWZmZXIucF92b2ljZVR4T3V0UHV0QnVmZmVyKTsNCi0gICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX09wZW4gVFhPVVQgcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgIH0NCi0NCi0jaWZkZWYgX1VTRV9WUF9PVVRQVVRfUlhPVVRfREFUQQ0KLQkJcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTEsIFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSwgKFVJTlQzMil2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICBpZihyZXQgIT0gRFJWX1NVQ0NFU1Mpew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIFJYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICB9DQotDQotI2Vsc2UNCi0JCXJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDExLFZQX0lOT1VUX05PQkFLX0JVRlNJWkUsKFVJTlQzMil2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICBpZihyZXQgIT0gRFJWX1NVQ0NFU1Mpew0KLSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuIFJYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICB9DQotI2VuZGlmDQotDQotICAgICAgICBnX3ZvaWNlVmFyLmZpcnN0UmVnWkNBVEZsYWcgPSBUUlVFOyAgIA0KLSAgICB9DQotICAgDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9PcGVuICBlbmQhXG4iKTsNCi0jaWYgMA0KLSAgICAvL2R0bWbmo4DmtYst5rWL6K+V55SoDQotICAgIGR0bWZfdGVzdC5kcnZfZHRtZnJ4X3JlcG9ydF9jYiA9IGRydl9kdG1mcnhfcmVwb3J0Ow0KLSAgICBkdG1mX3Rlc3QuZHJ2X2R0bWZ0eF9yZXBvcnRfY2IgPSBkcnZfZHRtZnR4X3JlcG9ydDsNCi0gICAgekRydkR0bWZfRGV0ZWN0X1JlZ0NhbGxiYWNrcyhkdG1mX3Rlc3QpOw0KLSNlbmRpZg0KLSNpZiBkZWZpbmVkKENPTkZJR19WT0lDRV9CVUZGRVJfRFJWKSAmJiBkZWZpbmVkKF9WQlVGRl9JTl9NVUxUSV9DT1JFKQ0KLQ0KLQl0aW1lcl9jYl9jb3VudCA9IDA7DQotCWZpcnN0X2Z1bGxfZmxhZyA9IDA7DQotCWZpcnN0X2VtcHR5X2ZsYWcgPSAwOw0KLQ0KLQl2Yl9yZWFkX2NvdW50ID0gMDsNCi0JdmJfd3JpdGVfY291bnQgPSAwOwkNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX09wZW4gIGluaXQgdm9pY2UgYnVmZmVyIHZhbCFcbiIpOw0KLSNlbmRpZg0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotCQkNCi0JDQotCWlmKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VFY2FsbCA9PSAxKQ0KLQl7DQotCQkvL3pEcnZFY2FsbF9TZXRDYWxsYmFja3ModF9lY2FsbE9iaik7Ly9mb3IgdGVzdA0KLQ0KLQkJaWYoKGdfdm9pY2VWYXIuZWNhbGxEYXRhLm9wdC5kcnZfR2V0X0VjYWxsX1N0YXRlICE9IE5VTEwpJiYoZ192b2ljZVZhci52b2ljZU1vZGUgIT0gVk9JQ0VfTFRFX01PREUpKQ0KLQkJew0KLQkJCWVfcmVnX2ZsYWcgPSAxOw0KLQkJCXJkc2VtX2NvdW50X0luaXQoRUNBTExfU0VNKTsNCi0JCQl3cnNlbV9jb3VudF9Jbml0KEVDQUxMX1NFTSk7CQkJDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJZV9yZWdfZmxhZyA9IDA7DQotDQotCQl9DQotDQotCQ0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJZV9yZWdfZmxhZyA9IDA7DQotCQ0KLQl9DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlczplY2FsbCBjaGVjaywgdm9pY2VNb2RlPSVkLGVfcmVnX2ZsYWc9JWQgXG4iLF9fRlVOQ1RJT05fXyx2b2ljZU1vZGUsZV9yZWdfZmxhZyk7DQotCQ0KLQkJDQotI2VuZGlmCQkNCi0NCi0JZXh0X2FSZENvdW50ID0gMDsNCi0JZXh0X2FSZEZCdWZDb3VudCA9IDA7DQotDQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0NCi19DQotDQotU0lOVDMyIHZwX0NmZ1BhcmFtKFRfWkRydlZwX0NmZyAqY2ZnUGFyYW0pDQotew0KLQlpbnQgcmV0ID0gMDsNCi0JaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB2cF9JMnNDZmdQYXJhbShjZmdQYXJhbSk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHZwX1RkbUNmZ1BhcmFtKGNmZ1BhcmFtKTsNCi0JfQ0KLSAgICBnX3ZvaWNlVmFyLnNhbXBsZV9yYXRlID0gc19zcGVlY2hTdGF0ZS52cENmZ1BhcmFtLmNsb2NrX3JhdGU7DQotDQotICAgIC8vZHRtZuajgOa1i+WQr+WKqA0KLSAgICBpZigoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVJ4RHRtZkRldCA9PSAxKSB8fCAoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVR4RHRtZkRldCA9PSAxKSkNCi0Jew0KLSAgICAgICAgaWYoKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VSeER0bWZEZXQgPT0gMSkgJiYgKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VUeER0bWZEZXQgPT0gMSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ192b2ljZVZhci5kdG1mRGlyU2VsID0gRFRNRl9UWFJYOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlUnhEdG1mRGV0ID09IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ192b2ljZVZhci5kdG1mRGlyU2VsID0gRFRNRl9SWDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnX3ZvaWNlVmFyLmR0bWZEaXJTZWwgPSBEVE1GX1RYOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0ID0gekRydlZwX0R0bWZTb2Z0d2FyZVN0YXJ0KGdfdm9pY2VWYXIuZHRtZkRpclNlbCAsIHNfc3BlZWNoU3RhdGUudnBDZmdQYXJhbS5jbG9ja19yYXRlKTsNCi0gICAgICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgICAgICB7DQotICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHpEcnZWcF9EdG1mU29mdHdhcmVTdGFydCBlcnIsIHJldD0lZFxuIiwgcmV0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSB6RHJ2VnBfRHRtZlNvZnR3YXJlU3RhcnQgZW5kXG4iKTsNCi0gICAgfQ0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUCQ0KLQlpZigoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZUVjYWxsID09IDEpJiYoZV9yZWdfZmxhZyA9PSAxKSkNCi0Jew0KLQ0KLQkgICBpZihnX3ZvaWNlVmFyLnZvbHRlSXNXYiA9PSAxKQ0KLQkgICB7DQotCSAgIAkgICByZXQgPSBlY2FsbF9PcGVuKDE2MDAwKTsNCi0JICAgfQ0KLQkgICBlbHNlDQotCSAgIHsNCi0JCSAgIHJldCA9IGVjYWxsX09wZW4oODAwMCk7DQotDQotCSAgIH0NCi0JICAgaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JICAgew0KLQkJICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX09wZW4gZXJyb3IscmV0PSVkIiwgcmV0KTsNCi0NCi0JCSAgIGVfcmVnX2ZsYWcgPSAwOw0KLQkgICB9DQotCSAgIGVsc2UNCi0JICAgew0KLQ0KLQkJCXJldCA9IGVjYWxsX1N0YXJ0KCk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlczogZWNhbGxfU3RhcnQgZXJyLHJldD0lZFxuIixyZXQpOw0KLQkJCX0NCi0JCQ0KLQkgICB9DQotDQotCSAgIA0KLQkNCi0JfQ0KLSNlbmRpZgkNCi0JcmV0dXJuIHJldDsNCi19DQotDQotVk9JRCB6RHJ2VnBfU3RhdHVzKFVJTlQzMiAqc2FtcGxlX3JhdGUsIFVJTlQzMiAqdm9pY2Vfc3RhdHVzKQ0KLXsNCi0gICAgaWYoTlVMTCAhPSBzYW1wbGVfcmF0ZSkNCi0gICAgICAgICpzYW1wbGVfcmF0ZSA9IGdfdm9pY2VWYXIuc2FtcGxlX3JhdGU7DQotDQotICAgIGlmKE5VTEwgIT0gdm9pY2Vfc3RhdHVzKQ0KLSAgICAgICAgKnZvaWNlX3N0YXR1cyA9IGdfdm9pY2VWYXIudnBJMnNTdGF0dXM7DQotfQ0KLQ0KLVZPSUQgekRydlZwX1VwZGF0ZVZvaWNlTnYoVUlOVDggKnZvaWNlX252X3VwZGF0ZSkNCi17DQotICAgIGlmKE5VTEwgIT0gdm9pY2VfbnZfdXBkYXRlKQ0KLSAgICAgICAgKnZvaWNlX252X3VwZGF0ZSA9IGdfdm9pY2VWYXIudm9pY2VfbnZfdXBkYXRlOw0KLQ0KLSAgICAvL2dfdm9pY2VWYXIudm9pY2VfbnZfdXBkYXRlID0gMDsNCi0gICAgDQotICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVXBkYXRlVm9pY2VOdiBzdGFydCFcbiIpOw0KLX0NCi0NCi1TSU5UMzIgdnBfVGRtQ2ZnUGFyYW0oVF9aRHJ2VnBfQ2ZnICpjZmdQYXJhbSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9aRHJ2X1ZwRnMgZnMgPSBWUF9GU184MDAwOw0KLQ0KLQ0KLQlpZiAoKGNmZ1BhcmFtID09IE5VTEwpIHx8IChjZmdQYXJhbS0+Y2hhbm5lbF9jb3VudCAhPSAxKSB8fCAoY2ZnUGFyYW0tPmJpdHNfcGVyX3NhbXBsZSAhPSAxNikpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBlcnIgXHJcbiIpOw0KLQkJcmV0ID0gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQkJZ290byBlcnJfZXhpdDsNCi0JfQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVGRtQ2ZnUGFyYW0gc3RhcnQsY2ZnUGFyYW0tPnJhdGUgPSAlZCIsIGNmZ1BhcmFtLT5jbG9ja19yYXRlKTsNCi0JaWYgKCgoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gODAwMCkgJiYgKGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZSAhPSAxNjApKSB8fCAoKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDE2MDAwKSAmJiAoY2ZnUGFyYW0tPnNhbXBsZXNfcGVyX2ZyYW1lICE9IDMyMCkpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gIHNhbXBsZXNfcGVyX2ZyYW1lIGVyciwgY2ZnUGFyYW0tPmNsb2NrX3JhdGU9JWQsY2ZnUGFyYW0tPnNhbXBsZXNfcGVyX2ZyYW1lPSVkISBcclxuIiwgY2ZnUGFyYW0tPmNsb2NrX3JhdGUsIGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZSk7DQotCQlyZXQgPSBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotCXNfc3BlZWNoU3RhdGUudnBDZmdQYXJhbSA9ICpjZmdQYXJhbTsNCi0NCi0JaWYgKChzX3ZwU3RhdGUuc19wVnBUZG1DZmcgPT0gTlVMTCkgfHwgKHNfdnBTdGF0ZS5zX3BWcFRkbVdiQ2ZnID09IE5VTEwpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gZXJyb3Igc19wVnBFeHRJMnNDZmcgbm90IGluaXQhIFxyXG4iKTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXJyX2V4aXQ7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlpZiAoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gMTYwMDApDQotCQl7DQotCQkJc192cFN0YXRlLnBWcFRkbUNmZyA9IHNfdnBTdGF0ZS5zX3BWcFRkbVdiQ2ZnOw0KLQkJCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMTsNCi0JCQlzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgPSBjZmdQYXJhbS0+c2FtcGxlc19wZXJfZnJhbWU7DQotCQkJc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcgPSBzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmc7DQotCQl9DQotCQllbHNlIGlmIChjZmdQYXJhbS0+Y2xvY2tfcmF0ZSA9PSA4MDAwKQ0KLQkJew0KLQkJCXNfdnBTdGF0ZS5wVnBUZG1DZmcgPSBzX3ZwU3RhdGUuc19wVnBUZG1DZmc7DQotCQkJZ192b2ljZVZhci52b2x0ZUlzV2IgPSAwOw0KLQkJCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZTsNCi0JCQlzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9IHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmc7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHRoZSBmcyBub3Qgc3VwcG9ydCEgXHJcbiIpOw0KLQkJCXJldCA9IERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JCQlnb3RvIGVycl9leGl0Ow0KLQkJfQ0KLQ0KLQkJaWYgKHNfdnBTdGF0ZS5wVnBUZG1DZmctPnRUc0VuYWJsZSA9PSBURE1fMlRTX0VOQUJMRSkNCi0JCXsNCi0JCQlzX3ZwVGRtUmVhZFBhcmFtLmNoYW5uZWwgPSBBVURJT19EVUFMX0NIQU5ORUw7DQotCQkJc19WcFRkbVdyaXRlUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCX0NCi0NCi0JCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSAoc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ICogMik7DQotDQotCQlzX1ZwVGRtV3JpdGVQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCXNfdnBUZG1SZWFkUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQlzX3NwZWVjaFN0YXRlLmluT3V0QnVmVXNlU2l6ZSA9IHNfdnBTdGF0ZS5pbk91dEJ1ZlNpemUgLSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQ0KLQkJaWYgKHNfdnBTdGF0ZS5wVnBJbm5lckkyc0NmZy0+dENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkNCi0JCXsNCi0JCQlpZiAoc192cFN0YXRlLnBWcElubmVySTJzQ2ZnLT50VHJhY2tGbXQgPT0gRE9VQkxFX1RSQUNLKQ0KLQkJCXsNCi0JCQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IChzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyKTsNCi0JCQkJKHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbSkuY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQkJKHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtKS5jaGFubmVsID0gQVVESU9fRFVBTF9DSEFOTkVMOw0KLQkJCX0NCi0NCi0JCQllbHNlIGlmICgoc192cFN0YXRlLnBWcElubmVySTJzQ2ZnLT50VHJhY2tGbXQgPT0gTEVGVF9UUkFDSykgfHwgKHNfdnBTdGF0ZS5wVnBJbm5lckkyc0NmZy0+dFRyYWNrRm10ID09IFJJR0hUX1RSQUNLKSkNCi0JCQl7DQotCQkJCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSAoc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ICogMik7DQotCQkJCShzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0pLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQkJCShzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbSkuY2hhbm5lbCA9IEFVRElPX01PTk9fQ0hBTk5FTDsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHRUcmFja0ZtdCBub3Qgc3VwcG9ydCEgXHJcbiIpOw0KLQkJCQlyZXQgPSBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQkJCWdvdG8gZXJyX2V4aXQ7DQotCQkJfQ0KLQ0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCX0NCi0NCi0NCi0JCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5wX2NiID0gTlVMTDsNCi0JCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLnBfY2IgPSBOVUxMOw0KLQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIFRkbSByZWFkL3dyaXRlIGJ1ZmZlcnNpemU9JWRcbiIsIHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSAgVnBJMnNTdGF0dXM9JWQsc19pbk91dEJ1ZlVzZVNpemU9JWRcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMsIHNfc3BlZWNoU3RhdGUuaW5PdXRCdWZVc2VTaXplKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBzZXQgdG90YWxGcmFtZUJ1ZlNpemU9JWQsc192cEZyYW1lQ291bnQ9JWRcbiIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUsIHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCk7DQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHNldCByZWFkIC93aXJ0ZSBQYXJhbSBlbmQhIFxyXG4iKTsNCi0NCi0NCi0JaWYgKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDgwMDApDQotCXsNCi0JCWZzID0gVlBfRlNfODAwMDsNCi0JfQ0KLQllbHNlIGlmIChjZmdQYXJhbS0+Y2xvY2tfcmF0ZSA9PSAxNjAwMCkNCi0Jew0KLQkJZnMgPSBWUF9GU18xNjAwMDsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSB0aGUgZnMgbm90IHN1cHBvcnQgLG9ubHkgc3VwcG9ydCA4aywxNmsgIVxuIik7DQotCQlyZXQgPSBEUlZfRVJST1I7DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX1NldEZzKGZzKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIGhhbFZwQ2ZnX1NldEZzIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXJyX2V4aXQ7DQotCX0NCi0NCi0JaWYgKChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX1NQRUFLRVIpKQ0KLQl7DQotCQlyZXQgPSBoYWxWcENmZ19TZXRJbnB1dFBhdGgoZ192b2ljZVZhci52cFBhdGgsIFRSVUUpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gdm9pY2VfU2V0UGFodEluIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXJyX2V4aXQ7DQotCQl9DQotCQlyZXQgPSBoYWxWcENmZ19TZXRPdXRwdXRQYXRoKGdfdm9pY2VWYXIudnBQYXRoLCBUUlVFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHZvaWNlX1NldFBhaHRPdXQgaGFsVnBDZmdfU2V0T3V0cHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXJyX2V4aXQ7DQotCQl9DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gdm9pY2VfU2V0UGFodE91dCB0aGUgcGF0aCBub3Qgc3VwcG9ydCAhXG4iKTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXJyX2V4aXQ7DQotCX0NCi0NCi0NCi0JaWYgKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQl7DQotCQlyZXQgPSBWb2ljZVByb2NfT3BlbigxNjAwMCk7DQotCX0NCi0JZWxzZSBpZiAoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gODAwMCkNCi0Jew0KLQkJcmV0ID0gVm9pY2VQcm9jX09wZW4oODAwMCk7DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gVm9pY2VQcm9jX09wZW4gZnMgbm90IHN1cHBvcnRcbiIpOw0KLQkJcmV0ID0gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBWb2ljZVByb2NfT3BlbiBzX3ZvaWNlTW9kZT0lZCwgcmV0PSVkIFxuIiwgZ192b2ljZVZhci52b2ljZU1vZGUsIHJldCk7DQotDQotCWlmIChyZXQgPT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXJldCA9IFZvaWNlUHJvY19HZXRQYXJhbShnX3ZvaWNlVmFyLnZvaWNlTW9kZSwgZ192b2ljZVZhci52cFBhdGgpOw0KLQkJaWYgKHJldCA9PSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHZwX0NmZ1BhcmFtIFZvaWNlUHJvY19HZXRQYXJhbSBPSyFcclxuIik7DQotCQkJZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gVFJVRTsNCi0JCQlyZXQgPSBWb2ljZVByb2NfU2V0UGFyYW0oZ192b2ljZVZhci52b2ljZU1vZGUsIGdfdm9pY2VWYXIudnBQYXRoLCBnX3ZvaWNlVmFyLnZwVm9sLCBGQUxTRSk7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIFZvaWNlUHJvY19TZXRQYXJhbSByZXQ9JWQgXG4iLCByZXQpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQlnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPSBGQUxTRTsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIFZvaWNlUHJvY19TZXRQYXJhbSByZXQ9JWQgLHZvaWNlIHByb2Nlc3MgZG9uJ3QgdXNlISBcbiIsIHJldCk7DQotCQkJCVZvaWNlUHJvY19DbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gVm9pY2VQcm9jX0dldFBhcmFtIGVycm9yIHJldD0lZCAhIFxyXG4iLCByZXQpOw0KLQkJCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IEZBTFNFOw0KLQkJCVZvaWNlUHJvY19DbG9zZSgpOw0KLQ0KLQkJfQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gRkFMU0U7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLWVycl9leGl0Og0KLQlpZiAoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfR1NNX01PREUpDQotCXsNCi0JCXpEcnZJMlNfQ2xvc2UoSTJTXzIpOw0KLQl9DQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCXsNCi0JCXpEcnZFeHRBdWRpb19DbG9zZSgpOw0KLQl9DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLQ0KLVNJTlQzMiB2cF9JMnNDZmdQYXJhbShUX1pEcnZWcF9DZmcgKmNmZ1BhcmFtKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQlUX1pEcnZfVnBGcyBmcyA9IFZQX0ZTXzgwMDA7DQotDQotCWlmICgoY2ZnUGFyYW0gPT0gTlVMTCkgfHwgKGNmZ1BhcmFtLT5jaGFubmVsX2NvdW50ICE9IDEpIHx8IChjZmdQYXJhbS0+Yml0c19wZXJfc2FtcGxlICE9IDE2KSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIGVyciBcclxuIik7DQotDQotCQlyZXQgPSBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSAgc3RhcnQsY2ZnUGFyYW0tPnJhdGUgPSAlZCIsIGNmZ1BhcmFtLT5jbG9ja19yYXRlKTsNCi0JaWYgKCgoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gODAwMCkgJiYgKGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZSAhPSAxNjApKSB8fCAoKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDE2MDAwKSAmJiAoY2ZnUGFyYW0tPnNhbXBsZXNfcGVyX2ZyYW1lICE9IDMyMCkpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gIHNhbXBsZXNfcGVyX2ZyYW1lIGVyciwgY2ZnUGFyYW0tPmNsb2NrX3JhdGU9JWQsY2ZnUGFyYW0tPnNhbXBsZXNfcGVyX2ZyYW1lPSVkISBcclxuIiwgY2ZnUGFyYW0tPmNsb2NrX3JhdGUsIGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZSk7DQotDQotCQlyZXQgPSBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotCXNfc3BlZWNoU3RhdGUudnBDZmdQYXJhbSA9ICpjZmdQYXJhbTsNCi0NCi0JaWYgKChzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnID09IE5VTEwpIHx8IChzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmcgPT0gTlVMTCkpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBlcnJvciBzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnIG5vdCBpbml0ISBcclxuIik7DQotCQlyZXQgPSBEUlZfRVJST1I7DQotCQlnb3RvIGVycl9leGl0Ow0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQkJew0KLQkJCXNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnID0gc192cFN0YXRlLnBWcEV4dEkyc1diQ2ZnOw0KLQkJCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMTsNCi0JCQlzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgPSBjZmdQYXJhbS0+c2FtcGxlc19wZXJfZnJhbWU7DQotCQkJc192cFN0YXRlLnBWcFRkbUNmZyA9IHNfdnBTdGF0ZS5zX3BWcFRkbVdiQ2ZnOw0KLQ0KLQkJfQ0KLQkJZWxzZSBpZiAoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gODAwMCkNCi0JCXsNCi0NCi0JCQlzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9IHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmc7DQotDQotCQkJZ192b2ljZVZhci52b2x0ZUlzV2IgPSAwOw0KLQkJCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IGNmZ1BhcmFtLT5zYW1wbGVzX3Blcl9mcmFtZTsNCi0JCQlzX3ZwU3RhdGUucFZwVGRtQ2ZnID0gc192cFN0YXRlLnNfcFZwVGRtQ2ZnOw0KLQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSB0aGUgZnMgbm90IHN1cHBvcnQhIFxyXG4iKTsNCi0JCQlyZXQgPSBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCQkJZ290byBlcnJfZXhpdDsNCi0JCX0NCi0NCi0JCS8qDQotCQkgICAgICAgIGlmKChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkmJihzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFRyYWNrRm10ID09IERPVUJMRV9UUkFDSykpDQotCQkgICAgICAgIHsNCi0JCSAgICAgICAgICAgIChzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbSkuY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCSAgICAgICAgICAgIChzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0pLmNoYW5uZWwgPSBBVURJT19EVUFMX0NIQU5ORUw7DQotDQotCQkgICAgICAgIH0NCi0JCSovDQotCQlpZiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlID09IEkyU19USU1FX01PREUpDQotCQl7DQotCQkJaWYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50VHJhY2tGbXQgPT0gRE9VQkxFX1RSQUNLKQ0KLQkJCXsNCi0JCQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IChzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyKTsNCi0JCQkJKHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbSkuY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQkJKHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtKS5jaGFubmVsID0gQVVESU9fRFVBTF9DSEFOTkVMOw0KLQkJCX0NCi0NCi0JCQllbHNlIGlmICgoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRUcmFja0ZtdCA9PSBMRUZUX1RSQUNLKSB8fCAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRUcmFja0ZtdCA9PSBSSUdIVF9UUkFDSykpDQotCQkJew0KLQkJCQlzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplID0gKHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDIpOw0KLQkJCQkoc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtKS5jaGFubmVsID0gQVVESU9fTU9OT19DSEFOTkVMOw0KLQkJCQkoc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0pLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSB0VHJhY2tGbXQgbm90IHN1cHBvcnQhIFxyXG4iKTsNCi0NCi0JCQkJcmV0ID0gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQkJCQlnb3RvIGVycl9leGl0Ow0KLQ0KLQkJCX0NCi0JCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotDQotCQl9DQotCQllbHNlIGlmICgoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlID09IFBDTV9USU1FX01PREUpICYmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzFUSU1FX1NMT1QpKQ0KLQkJew0KLQkJCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSAoc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ICogMik7DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQ0KLQkJfQ0KLQkJZWxzZSBpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0JCXsNCi0JCQlzX3NwZWVjaFN0YXRlLnBjbVNsb3ROdW0gPSBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gKyAxOw0KLQ0KLQkJCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzE2VElNRV9TTE9UKQ0KLQkJCXsNCi0JCQkJc19zcGVlY2hTdGF0ZS5wY21XYlNlY0RhdGFQb3NpdGlvbiA9IDE2Ow0KLQkJCX0NCi0JCQllbHNlIGlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzRUSU1FX1NMT1QpDQotCQkJew0KLQkJCQlzX3NwZWVjaFN0YXRlLnBjbVdiU2VjRGF0YVBvc2l0aW9uID0gNDsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bT0lZCxub3Qgc3VwcG9ydCAhXG4iLCBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0pOw0KLQkJCQlyZXQgPSBEUlZfRVJST1I7DQotCQkJCWdvdG8gZXJyX2V4aXQ7DQotDQotCQkJfQ0KLQkJCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSBzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyOw0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICogc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICogc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlPSVkLG5vdCBzdXBwb3J0ICFcbiIsIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSk7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXJyX2V4aXQ7DQotCQl9DQotCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0ucF9jYiA9IE5VTEw7DQotCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5wX2NiID0gTlVMTDsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBJMlMgekRydkkyU19Xcml0ZV9TdGFydCBidWZmZXJzaXplPSVkXG4iLCBzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uYnVmZmVyc2l6ZSk7DQotCQlzX3NwZWVjaFN0YXRlLmluT3V0QnVmVXNlU2l6ZSA9IHNfdnBTdGF0ZS5pbk91dEJ1ZlNpemUgLSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtICBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzPSVkLHNfc3BlZWNoU3RhdGUuaW5PdXRCdWZVc2VTaXplPSVkXG4iLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzLCBzX3NwZWVjaFN0YXRlLmluT3V0QnVmVXNlU2l6ZSk7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gc2V0IHRvdGFsRnJhbWVCdWZTaXplPSVkLHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudD0lZFxuIiwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSwgc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50KTsNCi0NCi0NCi0JfQ0KLSNpZiAwDQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCXsNCi0JCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+c2FtcGxlX3JhdGUgIT0gY2ZnUGFyYW0tPmNsb2NrX3JhdGUpDQotCQl7DQotCQkJc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnNhbXBsZV9yYXRlID0gY2ZnUGFyYW0tPmNsb2NrX3JhdGU7DQotCQl9DQotCX0NCi0jZW5kaWYNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHNldCByZWFkIC93aXJ0ZSBQYXJhbSBlbmQhIFxyXG4iKTsNCi0NCi0NCi0JaWYgKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDgwMDApDQotCXsNCi0JCWZzID0gVlBfRlNfODAwMDsNCi0JfQ0KLQllbHNlIGlmIChjZmdQYXJhbS0+Y2xvY2tfcmF0ZSA9PSAxNjAwMCkNCi0Jew0KLQkJZnMgPSBWUF9GU18xNjAwMDsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSB0aGUgZnMgbm90IHN1cHBvcnQgLG9ubHkgc3VwcG9ydCA4aywxNmsgIVxuIik7DQotCQlyZXQgPSBEUlZfRVJST1I7DQotCQlnb3RvIGVycl9leGl0Ow0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX1NldEZzKGZzKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIGhhbFZwQ2ZnX1NldEZzIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXJyX2V4aXQ7DQotDQotCX0NCi0NCi0JaWYgKChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX1NQRUFLRVIpKQ0KLQl7DQotCQlyZXQgPSBoYWxWcENmZ19TZXRJbnB1dFBhdGgoZ192b2ljZVZhci52cFBhdGgsIFRSVUUpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gdm9pY2VfU2V0UGFodEluIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXJyX2V4aXQ7DQotCQl9DQotCQlyZXQgPSBoYWxWcENmZ19TZXRPdXRwdXRQYXRoKGdfdm9pY2VWYXIudnBQYXRoLCBUUlVFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NmZ1BhcmFtIHZvaWNlX1NldFBhaHRPdXQgaGFsVnBDZmdfU2V0T3V0cHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0ID0gRFJWX0VSUk9SOw0KLQkJCWdvdG8gZXJyX2V4aXQ7DQotCQl9DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gdm9pY2VfU2V0UGFodE91dCB0aGUgcGF0aCBub3Qgc3VwcG9ydCAhXG4iKTsNCi0JCXJldCA9IERSVl9FUlJPUjsNCi0JCWdvdG8gZXJyX2V4aXQ7DQotCX0NCi0NCi0JaWYgKGNmZ1BhcmFtLT5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQl7DQotCQlyZXQgPSBWb2ljZVByb2NfT3BlbigxNjAwMCk7DQotCX0NCi0JZWxzZSBpZiAoY2ZnUGFyYW0tPmNsb2NrX3JhdGUgPT0gODAwMCkNCi0Jew0KLQkJcmV0ID0gVm9pY2VQcm9jX09wZW4oODAwMCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gVm9pY2VQcm9jX09wZW4gZnMgbm90IHN1cHBvcnRcbiIpOw0KLQkJcmV0ID0gRFJWX0VSUl9OT1RfU1VQUE9SVEVEOw0KLQl9DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBWb2ljZVByb2NfT3BlbiBnX3ZvaWNlVmFyLnZvaWNlTW9kZT0lZCwgcmV0PSVkIFxuIiwgZ192b2ljZVZhci52b2ljZU1vZGUsIHJldCk7DQotCS8vZ192b2ljZVZhci52cFBhdGggPSBWUF9QQVRIX0hBTkRTRVQ7DQotCS8vZ192b2ljZVZhci52cFZvbCA9IFZQX1ZPTF8zOw0KLQlpZiAocmV0ID09IERSVl9TVUNDRVNTKQ0KLQl7DQotCQkvL2dfdm9pY2VWYXIudnBQYXRoID0gVlBfUEFUSF9IRUFEU0VUOw0KLQkJLy9nX3ZvaWNlVmFyLnZwVm9sID0gVlBfVk9MXzM7DQotCQlyZXQgPSBWb2ljZVByb2NfR2V0UGFyYW0oZ192b2ljZVZhci52b2ljZU1vZGUsIGdfdm9pY2VWYXIudnBQYXRoKTsNCi0JCWlmIChyZXQgPT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiB2cF9DZmdQYXJhbSBWb2ljZVByb2NfR2V0UGFyYW0gT0shXHJcbiIpOw0KLQkJCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IFRSVUU7DQotCQkJcmV0ID0gVm9pY2VQcm9jX1NldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCBnX3ZvaWNlVmFyLnZwUGF0aCwgZ192b2ljZVZhci52cFZvbCwgRkFMU0UpOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBWb2ljZVByb2NfU2V0UGFyYW0gcmV0PSVkIFxuIiwgcmV0KTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gRkFMU0U7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBWb2ljZVByb2NfU2V0UGFyYW0gcmV0PSVkICx2b2ljZXByb2Nlc3MgZG9uJ3QgdXNlISBcbiIsIHJldCk7DQotCQkJCVZvaWNlUHJvY19DbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2ZnUGFyYW0gVm9pY2VQcm9jX0dldFBhcmFtIGVycm9yIHJldD0lZCAhIFxyXG4iLCByZXQpOw0KLQkJCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IEZBTFNFOw0KLQkJCVZvaWNlUHJvY19DbG9zZSgpOw0KLQkJfQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gRkFMU0U7DQotCX0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLWVycl9leGl0Og0KLQlpZiAoZ192b2ljZVZhci52b2ljZU1vZGUgPT0gVk9JQ0VfR1NNX01PREUpDQotCXsNCi0JCXpEcnZJMlNfQ2xvc2UoSTJTXzIpOw0KLQl9DQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCXsNCi0JCXpEcnZFeHRBdWRpb19DbG9zZSgpOw0KLQl9DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB2cF9DbG9zZShUX1pEcnZWb2ljZV9NT0RFIHZvaWNlTW9kZSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gVlBfSTJTX09QRU4pDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSBlcnJvcjogZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfT1BFTiBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzPSVkXG4iLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfSTJTX0lETEUpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZTogdnAgaXMgY2xvc2VkIGFscmVhZHkiKTsNCi0JCXJldHVybiBEUlZfU1VDQ0VTUzsNCi0JfQ0KLQ0KLQlnX3ZvaWNlVmFyLnZwUGF0aCA9IFZQX1BBVEhfSEFORFNFVDsNCi0NCi0jaWZkZWYgQ09ORklHX0NQX1VTRV9TT0ZUX0RUTUZfREVURUNUDQotCXNsaWNfdHdfZHRtZl9kZXRlY3RfY2xvc2UoKTsNCi0jZW5kaWYNCi0JaWYgKCh2b2ljZU1vZGUgPT0gVk9JQ0VfTFRFX01PREUpIHx8ICh2b2ljZU1vZGUgPT0gVk9JQ0VfV0NETUFfTU9ERSkgfHwgKHZvaWNlTW9kZSA9PSBWT0lDRV9URF9NT0RFKSkNCi0Jew0KLSNpZiAxLy9tb3ZlIGZyb20gc3RvcC4gbHZ3ZW5odWEgMjAxNTA5MTANCi0JCXJldCA9IHpEcnZFeHRBdWRpb19SZWFkX1N0b3AoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SZWFkU3RvcCBJMlMxIFN0b3Agd3JvbmcgIHJldD0lZCBcbiIsIHJldCk7DQotCQl9DQotI2VuZGlmDQotDQotI2lmIDEvL21vdmUgZnJvbSBzdG9wLiBsdndlbmh1YSAyMDE1MDkxMA0KLSNpZmRlZiBWT0lDRV9UT05FX01JWEVSX0ZVTkNUSU9ODQotCQl2b2ljZV9Ub25lTWl4ZXJTdG9wKCk7DQotI2VuZGlmDQotDQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fV3JpdGVfU3RvcCgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1dyaXRlU3RvcCBJMlMxIFN0b3Agd3JvbmcgIHJldD0lZCBcbiIsIHJldCk7DQotCQl9DQotDQotI2VuZGlmDQotDQotCQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyAhPSAxKQ0KLQkJew0KLQ0KLQkJCXJldCA9IHpEcnZFeHRBdWRpb19DbG9zZSgpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAicmV0PSVkIHpEcnZFeHRBdWRpb19DbG9zZSgpIFxuIiwgcmV0KTsNCi0JCQl9DQotDQotCQkJcmV0ID0gaGFsVnBDZmdfQ2xvc2UoKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwIGhhbF9WcENmZ19DbG9zZSBlcnIgcmV0PSVkIiwgcmV0KTsNCi0JCQl9DQotDQotDQotCQl9DQotCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2b2x0ZSBJMlMgQ2xvc2UgZW5kIVxuIik7DQotDQotCQlpZiAoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID09IFRSVUUpDQotCQl7DQotCQkJcmV0ID0gVm9pY2VQcm9jX0Nsb3NlKCk7DQotDQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSBWb2ljZVByb2NfQ2xvc2Ugd3JvbmcgIHJldD0lZCBcbiIsIHJldCk7DQotCQkJfQ0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSBWb2ljZVByb2NfQ2xvc2UgICByZXQ9JWQgXG4iLCByZXQpOw0KLQ0KLQkJCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IEZBTFNFOw0KLQkJfQ0KLQ0KLQkJZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlID0gMDsNCi0JCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMDsNCi0NCi0JfQ0KLQllbHNlIGlmICh2b2ljZU1vZGUgPT0gVk9JQ0VfR1NNX01PREUpDQotCXsNCi0JCWdfdm9pY2VWYXIudm9pY2VJbkdzbVRkTW9kZSA9IDA7DQotCQlyZXQgPSBoYWxWcENmZ19DbG9zZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnAgaGFsX1ZwQ2ZnX0Nsb3NlIGVyciByZXQ9JWQiLCByZXQpOw0KLQkJfQ0KLQ0KLQkJaWYgKHNfdnBTdGF0ZS52cFRocmVhZFF1aXRTZW1hICE9IE5VTEwpDQotCQl7DQotCQkJek9zc19HZXRTZW1hcGhvcmUoc192cFN0YXRlLnZwVGhyZWFkUXVpdFNlbWEsIFZPSUNFX1NZTkNfVElNRU9VVF9USU1FKTsNCi0JCQl6T3NzX0RlbGV0ZVNlbWFwaG9yZShzX3ZwU3RhdGUudnBUaHJlYWRRdWl0U2VtYSk7DQotCQkJc192cFN0YXRlLnZwVGhyZWFkUXVpdFNlbWEgPSBOVUxMOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSx6T3NzX0RlbGV0ZVNlbWFwaG9yZSB0aWNrPSVkXG4iLCB6T3NzX0dldFRpY2tDb3VudCgpKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLSAgICAvL2R0bWbmo4DmtYvlhbPpl60NCi0gICAgaWYoZ192b2ljZVZhci5kdG1mRGlyU2VsICE9IERUTUZfSURMRSkNCi0gICAgew0KLSAgICAgICAgcmV0ID0gekRydlZwX0R0bWZTb2Z0d2FyZVN0b3AoKTsNCi0gICAgICAgIGlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotICAgIAl7DQotICAgIAkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0Nsb3NlIHpEcnZWcF9EdG1mU29mdHdhcmVTdG9wIGVyciwgcmV0PSVkXG4iLCByZXQpOw0KLSAgICAJfQ0KLSAgICAgICAgDQotICAgICAgICBnX3ZvaWNlVmFyLmR0bWZEaXJTZWwgPSBEVE1GX0lETEU7DQotICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2xvc2UgekRydlZwX0R0bWZTb2Z0d2FyZVN0b3AgZW5kXG4iKTsNCi0gICAgfQ0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotCWlmKChnX3ZvaWNlVmFyLmF1ZGlvX2N0cmxGbGFnLmlzVXNlRWNhbGwgPT0gMSkmJihlX3JlZ19mbGFnID09IDEpKQ0KLQl7DQotICAgIAlyZXQgPSBlY2FsbF9TdG9wKCk7CQ0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidXBkYXRlX2VjYWxsX3N0YXRlIGVjYWxsX1N0b3AgZXJyLHJldD0lZFxuIixyZXQpOw0KLQkJfQkNCi0JCXJldCA9IGVjYWxsX0Nsb3NlKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImVjYWxsX09wZW4gZXJyb3IscmV0PSVkIiwgcmV0KTsNCi0JCX0JDQotCQllX3JlZ19mbGFnID0gMDsNCi0JfQ0KLSNlbmRpZgkNCi0JZ192b2ljZVZhci52cEkyc1N0YXR1cyA9IFZQX0kyU19JRExFOw0KLQlnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9IE1BWF9WT0lDRV9NT0RFOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2xvc2UsZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZFxuIiwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotDQotCXNfc3BlZWNoU3RhdGUuaTJzSXNSc3RGbGFnID0gRkFMU0U7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSBlbmQgdm9pY2VNb2RlID0gJWRcbiIsIHZvaWNlTW9kZSk7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSxzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlcj0lcFxuIiwgc192cFN0YXRlLnBWcFJ4SW5CdWZmZXIpOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfQ2xvc2Usc192cFN0YXRlLnBWcFR4SW5CdWZmZXI9JXBcbiIsIHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0Nsb3NlLHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlcj0lcFxuIiwgc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0Nsb3NlLHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlcj0lcFxuIiwgc192cFN0YXRlLnBWcFR4T3V0UHV0QnVmZmVyKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0Nsb3NlLHNfdnBTdGF0ZS5pbk91dEJ1ZlNpemU9JXhcbiIsIHNfdnBTdGF0ZS5pbk91dEJ1ZlNpemUpOw0KLSNpZiBkZWZpbmVkKENPTkZJR19WT0lDRV9CVUZGRVJfRFJWKSAmJiBkZWZpbmVkKF9WQlVGRl9JTl9NVUxUSV9DT1JFKQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiJXM6IHRpbWVyX2NiX2NvdW50ICVkLGZpcnN0X2Z1bGxfZmxhZyAlZCxmaXJzdF9lbXB0eV9mbGFnICVkLHZiX3JlYWRfY291bnQgJWQsdmJfd3JpdGVfY291bnQgJWQhXG4iLF9fRlVOQ1RJT05fXyx0aW1lcl9jYl9jb3VudCxmaXJzdF9mdWxsX2ZsYWcsZmlyc3RfZW1wdHlfZmxhZyx2Yl9yZWFkX2NvdW50LHZiX3dyaXRlX2NvdW50KTsNCi0jZW5kaWYNCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiVzOiBleHRfYVJkQ291bnQgJWQsZXh0X2FSZEZCdWZDb3VudCAlZCFcbiIsX19GVU5DVElPTl9fLGV4dF9hUmRDb3VudCxleHRfYVJkRkJ1ZkNvdW50KTsNCi0NCi0NCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi0NCi0NCi0NCi1TSU5UMzIgdnBfVm9pY2VJMnNTdGFydChWT0lEKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQlVSU5UOCAqcmVhZF9idWYgPSBOVUxMOw0KLQlVSU5UOCAqd3JpdGVfYnVmID0gTlVMTDsNCi0JVUlOVDMyIHJlYWRfbGVuID0gMDsNCi0JVUlOVDMyIHdyaXRlX2xlbiA9IDA7DQotDQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IHN0YXJ0LlxuIik7DQotDQotCWlmICgoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnID09IE5VTEwpICYmIChzX3ZwU3RhdGUucFZwVGRtQ2ZnID09IE5VTEwpKSB8fCAoc192cFN0YXRlLnBWcElubmVySTJzQ2ZnID09IE5VTEwpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBOVUxMIGVyciBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZz0lcCxzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmc9JXAgISBcbiIsIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLS8vCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFRlc3RNb2RlID09IEkyU19MT09QQkFDS19NT0RFKQ0KLS8vCXsNCi0vLwkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImlzIHRoZSBpMnMgbG9vcGJhY2sgbW9kZSIpOw0KLS8vCX0NCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICAJDQotCXJldCA9IHpEcnZJMlNfUmVhZF9TdGFydChJMlNfMiwgJnNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyUzJfUmVhZF9TdGFydCBmYWlsZWQgcmV0IGlzICVkIC5cbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCQ0KLQl6T3NzX1N0YXJ0VGltZXIoc192b2ljZVRpbWVySWQsIDIwLCB2b2ljZVRpbWVyQ2FsbEJhY2ssIDApOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBWQiB6T3NzX1N0YXJ0VGltZXJcbiIpOw0KLQ0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1N0YXJ0KEkyU18yLCAmc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQ0KLQlyZXQgKz0gekRydkkyU19HZXRCdWYoSTJTXzIsICZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjc6ekRydkkyU19HZXRCdWYgSTJTXzIgcmV0PSVkIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0Jek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlKEkyU18yLCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yMTI6ekRydkkyU19Xcml0ZSBJMlNfMiByZXQ9JWQiLCByZXQpOw0KLQl9DQotCQ0KLQlyZXQgKz0gekRydkkyU19HZXRCdWYoSTJTXzIsICZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjEzOnpEcnZJMlNfR2V0QnVmIEkyU18yIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCXpPc3NfTWVtc2V0KHdyaXRlX2J1ZiwgMCwgd3JpdGVfbGVuKTsNCi0JcmV0ID0gekRydkkyU19Xcml0ZShJMlNfMiwgd3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjE0OnpEcnZJMlNfV3JpdGUgSTJTXzIgcmV0PSVkIiwgcmV0KTsNCi0JfQ0KLSNpZmRlZiBfVkJVRkZfSU5fTVVMVElfQ09SRQ0KLQl2b2ljZV9idWZmZXJfd3JpdGUoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQ0KLSNlbHNlDQotCXZvaWNlYnVmZmVyX2RscXVldWVfd3JpdGUoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLSNlbmRpZg0KLSNlbHNlCQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyA9PSAxKQ0KLQl7DQotDQotCQlpZiAoc19zcGVlY2hTdGF0ZS5pMnNJc1JzdEZsYWcgPT0gRkFMU0UpDQotCQl7DQotCQkJcmV0ID0gekRydkV4dEF1ZGlvX1Jlc2V0KCk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IHpEcnZFeHRBdWRpb19SZXNldCgpIGVyciByZXQ9JWQgIiwgcmV0KTsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNJc1JzdEZsYWcgPSBUUlVFOw0KLQkJfQ0KLQ0KLQl9DQotDQotCXJldCA9IHpEcnZJMlNfUmVhZF9TdGFydChJMlNfMiwgJnNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyUzJfUmVhZF9TdGFydCBmYWlsZWQgcmV0IGlzICVkIC5cbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldCArPSB6RHJ2RXh0QXVkaW9fUmVhZF9TdGFydCgmc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0sIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLCAmc192cFRkbVJlYWRQYXJhbSwgc192cFN0YXRlLnBWcFRkbUNmZyk7DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTMV9SZWFkX1N0YXJ0IGZhaWxlZCByZXQgaXMgJWQgLlxuIiwgcmV0KTsNCi0JCXpEcnZJMlNfUmVhZF9TdG9wKEkyU18yKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgekRydkkyU19SZWFkX1N0YXJ0ICByZXQ9JWQiLCByZXQpOw0KLQ0KLQlyZXQgPSB6RHJ2STJTX1JlYWQoSTJTXzIsICZyZWFkX2J1ZiwgJnJlYWRfbGVuKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgZXJyb3I6ekRydkkyU19SZWFkIEkyU18yIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IHpEcnZJMlNfUmVhZCBJMlNfMiByZXQ9JWQiLCByZXQpOw0KLQ0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fUmVhZCgmcmVhZF9idWYsICZyZWFkX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yOnpEcnZJMlNfUmVhZCAgcmV0PSVkIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgekRydkkyU19SZWFkIEkyU18xIHJldD0lZCIsIHJldCk7DQotDQotCXJldCArPSB6RHJ2RXh0QXVkaW9fUmVhZF9TdG9wKCk7DQotCXJldCArPSB6RHJ2STJTX1JlYWRfU3RvcChJMlNfMik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yOnpEcnZJMlNfUmVhZCAgcmV0PSVkIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgZmlyc3QgcmVhZC93cml0ZSBzdG9wIHJldD0lZCIsIHJldCk7DQotDQotCXJldCArPSB6RHJ2RXh0QXVkaW9fUmVhZF9TdGFydCgmc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0sIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLCAmc192cFRkbVJlYWRQYXJhbSwgc192cFN0YXRlLnBWcFRkbUNmZyk7DQotDQotCXJldCArPSB6RHJ2STJTX1JlYWRfU3RhcnQoSTJTXzIsICZzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbSwgc192cFN0YXRlLnBWcElubmVySTJzQ2ZnKTsNCi0NCi0JcmV0ICs9IHpEcnZFeHRBdWRpb19Xcml0ZV9TdGFydCgmc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLCBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZywgJnNfVnBUZG1Xcml0ZVBhcmFtLCBzX3ZwU3RhdGUucFZwVGRtQ2ZnKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgZXJyb3I0OnpEcnZJMlNfV3JpdGVfU3RhcnQgIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCXJldCArPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjU6ekRydkkyU19HZXRCdWYgIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXpPc3NfTWVtc2V0KHdyaXRlX2J1ZiwgMCwgd3JpdGVfbGVuKTsNCi0JcmV0ICs9IHpEcnZFeHRBdWRpb19Xcml0ZSh3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yNjp6RHJ2STJTX1dyaXRlICByZXQ9JWQiLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1N0YXJ0KEkyU18yLCAmc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQlyZXQgKz0gekRydkkyU19HZXRCdWYoSTJTXzIsICZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjc6ekRydkkyU19HZXRCdWYgSTJTXzIgcmV0PSVkIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0Jek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlKEkyU18yLCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yODp6RHJ2STJTX1dyaXRlIEkyU18yIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCXJldCArPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlcnJvcjk6ekRydkkyU19HZXRCdWYgIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCXpPc3NfTWVtc2V0KHdyaXRlX2J1ZiwgMCwgd3JpdGVfbGVuKTsNCi0JcmV0ICs9IHpEcnZFeHRBdWRpb19Xcml0ZSh3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0YXJ0IGVycm9yMTA6ekRydkkyU19Xcml0ZSAgcmV0PSVkIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JcmV0ICs9IHpEcnZJMlNfR2V0QnVmKEkyU18yLCAmd3JpdGVfYnVmLCAmd3JpdGVfbGVuKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgZXJyb3IxMTp6RHJ2STJTX0dldEJ1ZiBJMlNfMiByZXQ9JWQiLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQl6T3NzX01lbXNldCh3cml0ZV9idWYsIDAsIHdyaXRlX2xlbik7DQotCXJldCA9IHpEcnZJMlNfV3JpdGUoSTJTXzIsIHdyaXRlX2J1Ziwgd3JpdGVfbGVuKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RhcnQgZXJyb3IxMjp6RHJ2STJTX1dyaXRlIEkyU18yIHJldD0lZCIsIHJldCk7DQotCX0NCi0NCi0jZW5kaWYNCi0jaWZkZWYgRUNBTExfU1VQUE9SVA0KLQlpZigoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZUVjYWxsID09IDEpJiYoZV9yZWdfZmxhZyA9PSAxKSkNCi0Jew0KLQ0KLQkJcmRzZW1fY291bnRfSW5pdChFQ0FMTF9TRU0pOw0KLQkJd3JzZW1fY291bnRfSW5pdChFQ0FMTF9TRU0pOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiVzOiBlY2FsbCBzZW0gaW5pdCBcbiIsX19GVU5DVElPTl9fKTsNCi0JCQ0KLSAgICB9DQotI2VuZGlmDQotCQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdGFydCBlbmQuXG4iKTsNCi0JcmV0dXJuIHJldDsNCi19DQotVk9JRCB2cF9Wb2ljZUkyc1N0b3AoVk9JRCkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JcmV0ID0gekRydkV4dEF1ZGlvX1JlYWRfU3RvcCgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdG9wIGVycm9yOiB6RHJ2STJTX1JlYWRfU3RvcCBJMlMxIHdyb25nICByZXQ9JWQiLCByZXQpOw0KLQl9DQotCXJldCA9IHpEcnZFeHRBdWRpb19Xcml0ZV9TdG9wKCk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2ljZUkyc1N0b3AgZXJyb3I6IHpEcnZJMlNfV3JpdGVfU3RvcCBJMlMxIHdyb25nICByZXQ9JWQiLCByZXQpOw0KLQl9DQotDQotCXJldCA9IHpEcnZJMlNfUmVhZF9TdG9wKEkyU18yKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RvcCBlcnJvcjogekRydkkyU19SZWFkX1N0b3AgSTJTMiB3cm9uZyAgcmV0PSVkIiwgcmV0KTsNCi0JfQ0KLQ0KLQlyZXQgPSB6RHJ2STJTX1dyaXRlX1N0b3AoSTJTXzIpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdG9wIGVycm9yOiB6RHJ2STJTX1dyaXRlX1N0b3AgSTJTMiB3cm9uZyAgcmV0PSVkIiwgcmV0KTsNCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID09IFRSVUUpDQotCXsNCi0JCXJldCA9IFZvaWNlUHJvY19DbG9zZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdG9wIGVycm9yOiBWb2ljZVByb2NfQ2xvc2Ugd3JvbmcgIHJldD0lZCIsIHJldCk7DQotCQl9DQotCQlnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPSBGQUxTRTsNCi0JfQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fQ2xvc2UoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlSTJzU3RvcCBlcnJvcjogekRydkkyU19DbG9zZSBJMlMxICByZXQ9JWQiLCByZXQpOw0KLQkJfQ0KLQl9DQotCXJldCA9IHpEcnZJMlNfQ2xvc2UoSTJTXzIpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VJMnNTdG9wIGVycm9yOiB6RHJ2STJTX1dyaXRlX1N0b3AgSTJTMiAgcmV0PSVkIiwgcmV0KTsNCi0JfQ0KLQ0KLQlpZiAoc192cFN0YXRlLnZwVGhyZWFkUXVpdFNlbWEgIT0gTlVMTCkNCi0Jew0KLQkJek9zc19QdXRTZW1hcGhvcmUoc192cFN0YXRlLnZwVGhyZWFkUXVpdFNlbWEpOw0KLQl9DQotfQ0KLQ0KLVNJTlQzMiB2cF9Wb2ljZVdvcmtTdGFydChWT0lEKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQkvL1RfWkRydkkyc19QYXJhbXMgcGFyYW1ldGVyID0gezB9Oy8veGl1IGdhaSBjaHUNCi0NCi0JLy9VSU5UOCAqd3JpdGVfYnVmID0gTlVMTDsvL3hpdSBnYWkgY2h1DQotCS8vVUlOVDMyIHdyaXRlX2xlbiA9IDA7Ly94aXUgZ2FpIGNodQ0KLQkvL1VJTlQ4ICpyZWFkX2J1ZiA9IE5VTEw7Ly94aXUgZ2FpIGNodQ0KLQkvL1VJTlQzMiByZWFkX2xlbiA9IDA7Ly94aXUgZ2FpIGNodQ0KLQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VXb3JrU3RhcnQgc3RhcnRcbiIpOw0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfT1BFTikNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlV29ya1N0YXJ0IGVycm9yOiBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzICE9IFZQX0kyU19PUEVOIGdfdm9pY2VWYXIudnBJMnNTdGF0dXM9JWRcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMpOw0KLQkJdnBfVm9pY2VJMnNTdG9wKCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX0VuYWJsZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidm9pY2VfZW5hYmxlIGhhbFZwQ2ZnX0VuYWJsZSBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQl2cF9Wb2ljZUkyc1N0b3AoKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaWYgKHNfdnBTdGF0ZS52cFRocmVhZFF1aXRTZW1hID09IE5VTEwpDQotCXsNCi0JCXNfdnBTdGF0ZS52cFRocmVhZFF1aXRTZW1hID0gek9zc19DcmVhdGVTZW1hcGhvcmUoIlZwRGF0YVRocmVhZFF1aXRTZW1hcGhvcmUiLCAwKTsNCi0JCWlmIChOVUxMID09IHNfdnBTdGF0ZS52cFRocmVhZFF1aXRTZW1hKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgc192cFN0YXRlLnZwVGhyZWFkUXVpdFNlbWEgZXJyIFxyXG4iKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQl9DQotDQotCWdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPSBWUF9JMlNfSU5VU0U7DQotDQotCWlmIChaT1NTX1NVQ0NFU1MgIT0gek9zc19QdXRTZW1hcGhvcmUoc192cFN0YXRlLnZwU2VtYXBob3JlKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvaWNlV29ya1N0YXJ0IHB1dCBzZW1hIGVycm9yLlxuIik7DQotCQlnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID0gVlBfSTJTX09QRU47DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi0NCi0JaWYoKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VFY2FsbCA9PSAxKSYmKGVfcmVnX2ZsYWcgPT0gMSkpDQotCXsNCi0NCi0JCXJkc2VtX2NvdW50X0luaXQoRUNBTExfU0VNKTsNCi0JCXdyc2VtX2NvdW50X0luaXQoRUNBTExfU0VNKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIlczogZWNhbGwgc2VtIGluaXQgXG4iLF9fRlVOQ1RJT05fXyk7DQotCQkNCi0gICAgfQ0KLSNlbmRpZg0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9pY2VXb3JrU3RhcnQgZW5kLGFuZCBwdXQgc2VtYSBzdWNjZXNzLlxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9Wb2ljZVdvcmtTdG9wKFZPSUQpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSU5VU0UpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVm9pY2VXb3JrU3RvcCBlcnJvcjogZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSU5VU0UgZ192b2ljZVZhci52cEkyc1N0YXR1cz0lZFxuIiwgZ192b2ljZVZhci52cEkyc1N0YXR1cyk7DQotCQkvL3JldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0NCi0NCi0jaWZkZWYgVk9JQ0VfVE9ORV9NSVhFUl9GVU5DVElPTg0KLQl2b2ljZV9Ub25lTWl4ZXJTdG9wKCk7DQotI2VuZGlmDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVm9pY2VXb3JrU3RvcCBjYWxsIHZvaWNlX1RvbmVNaXhlclN0b3AgIVxuIik7DQotDQotCWdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPSBWUF9JMlNfT1BFTjsNCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWIA0KLQkvL2NvbXBsZXRlX2FsbCgmc192b2ljZV9jb21wbGV0aW9uKTsNCi0Jek9zc19QdXRTZW1hcGhvcmUoc192b2ljZVJkU2VtYSk7DQotCXpPc3NfUHV0U2VtYXBob3JlKHNfdm9pY2VXclNlbWEpOw0KLQl6T3NzX1N0b3BUaW1lcihzX3ZvaWNlVGltZXJJZCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfVm9pY2VXb3JrU3RvcCB6T3NzX1N0b3BUaW1lclxuIik7DQotI2Vsc2UNCi0JLy96RHJ2STJzX1J4UmxzU2VtYUJlZm9yZVN0b3AoSTJTXzEpOw0KLQkvL3pEcnZJMnNfVHhSbHNTZW1hQmVmb3JlU3RvcChJMlNfMSk7DQotCXpEcnZFeHRBdWRpb19SbHNBbGxTZW1hQmVmb3JlU3RvcCgpOw0KLSNlbmRpZg0KLQkNCi0JekRydkkyc19SeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18yKTsNCi0JekRydkkyc19UeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18yKTsNCi0NCi0JcmV0ID0gaGFsVnBDZmdfRGlzYWJsZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidm9pY2VfZGlzYWJsZSBoYWxWcENmZ19EaXNhYmxlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JfQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1ZvaWNlV29ya1N0b3Agc3VjY2VzcyIpOw0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLVNJTlQzMiB2cF9Wb2x0ZVJlYWRTdGFydChWT0lEKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgc3RhcnRcbiIpOw0KLQ0KLQlnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID0gVlBfSTJTX09QRU47DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJJMlNfMSB2cF9Wb2x0ZVJlYWRTdGFydCBidWZmZXJzaXplPSVkXG4iLCBzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplKTsNCi0JaWYgKGdfdm9pY2VWYXIuaXNVc2VTbGljQ29kZWMgPT0gMSkNCi0Jew0KLQkJaWYgKHNfc3BlZWNoU3RhdGUuaTJzSXNSc3RGbGFnID09IEZBTFNFKQ0KLQkJew0KLQkJCXJldCA9IHpEcnZFeHRBdWRpb19SZXNldCgpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgekRydkkyU19SZXNldCgpIGVyciByZXQ9JWQgIiwgcmV0KTsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNJc1JzdEZsYWcgPSBUUlVFOw0KLQkJfQ0KLQ0KLQl9DQotCWlmICgoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcgPT0gTlVMTCkgJiYgKHNfdnBTdGF0ZS5wVnBUZG1DZmcgPT0gTlVMTCkpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2x0ZVJlYWRTdGFydCAgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcgaXMgTlVMTCEgXHJcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlpZiAoc19zcGVlY2hTdGF0ZS52b2x0ZVZwQ2ZnRW5GbGFnID09IDApDQotCXsNCi0JCXJldCA9IGhhbFZwQ2ZnX0VuYWJsZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgaGFsVnBDZmdfRW5hYmxlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXNfc3BlZWNoU3RhdGUudm9sdGVWcENmZ0VuRmxhZyA9IDE7DQotCQl9DQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIkkyU18xIHZwX1ZvbHRlUmVhZFN0YXJ0XG4iKTsNCi0NCi0JcmV0ID0gekRydkV4dEF1ZGlvX1JlYWRfU3RhcnQoJnNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLCBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZywgJnNfdnBUZG1SZWFkUGFyYW0sIHNfdnBTdGF0ZS5wVnBUZG1DZmcpOw0KLQ0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgZmFpbGVkIHJldCBpcyAlZCAuXG4iLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID0gVlBfSTJTX0lOVVNFOw0KLSNpZmRlZiAgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYNCi0Jek9zc19TdGFydFRpbWVyKHNfdm9pY2VUaW1lcklkLCAyMCwgdm9pY2VUaW1lckNhbGxCYWNrLCAwKTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvbHRlUmVhZFN0YXJ0IHpPc3NfU3RhcnRUaW1lciBzdGFydFxuIik7DQotI2VuZGlmCQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAgInZwX1ZvbHRlUmVhZFN0YXJ0IFxuIik7DQotDQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHZwX1ZvbHRlUmVhZFN0b3AoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotI2lmZGVmICBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotCXpPc3NfUHV0U2VtYXBob3JlKHNfdm9pY2VSZFNlbWEpOw0KLSNlbHNlDQotDQotCS8vekRydkkyc19SeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18xKTsNCi0JekRydkV4dEF1ZGlvX1J4UmxzU2VtYUJlZm9yZVN0b3AoKTsNCi0NCi0jaWYgMC8vbW92ZSB0byBjbG9zZSBsdndlbmh1YSAyMDE1MDkxMA0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fUmVhZF9TdG9wKCk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9sdGVfUmVhZFN0b3AgSTJTMSBTdG9wIHdyb25nICByZXQ9JWQiLCByZXQpOw0KLQl9DQotI2VuZGlmDQotI2VuZGlmDQotDQotCWlmIChzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPT0gMSkNCi0Jew0KLQkJcmV0ID0gaGFsVnBDZmdfRGlzYWJsZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgaGFsVnBDZmdfRW5hYmxlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPSAwOw0KLQkJfQ0KLQl9DQotDQotCXNfc3BlZWNoU3RhdGUudm9sdGVWcFJlYWRTdG9wRmxhZyA9IDE7Ly90b2dldGhlciBjb250cm9sIHZwIHNfc3BlZWNoU3RhdGUNCi0JaWYgKChzX3NwZWVjaFN0YXRlLnZvbHRlVnBXcml0ZVN0b3BGbGFnID09IDEpICYmIChzX3NwZWVjaFN0YXRlLnZvbHRlVnBSZWFkU3RvcEZsYWcgPT0gMSkpDQotCXsNCi0JCWdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPSBWUF9JMlNfT1BFTjsNCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICAJDQotCQl6T3NzX1N0b3BUaW1lcihzX3ZvaWNlVGltZXJJZCk7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RvcCB6T3NzX1N0b3BUaW1lclxuIik7DQotI2VuZGlmDQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2x0ZV9SZWFkU3RvcFxuIik7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLVNJTlQzMiB2cF9Wb2x0ZVdyaXRlU3RhcnQoVk9JRCkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVUlOVDggKndyaXRlX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiB3cml0ZV9sZW4gPSAwOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IHN0YXJ0XG4iKTsNCi0NCi0JZ192b2ljZVZhci52cEkyc1N0YXR1cyA9IFZQX0kyU19PUEVOOw0KLQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyA9PSAxKQ0KLQl7DQotCQlpZiAoc19zcGVlY2hTdGF0ZS5pMnNJc1JzdEZsYWcgPT0gRkFMU0UpDQotCQl7DQotCQkJcmV0ID0gekRydkV4dEF1ZGlvX1Jlc2V0KCk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2x0ZVJlYWRTdGFydCB6RHJ2STJTX1Jlc2V0KEkyU18xKSBlcnIgcmV0PSVkICIsIHJldCk7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotCQkJfQ0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzSXNSc3RGbGFnID0gVFJVRTsNCi0NCi0JCX0NCi0JfQ0KLQ0KLQlpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnID09IE5VTEwpICYmIChzX3ZwU3RhdGUucFZwVGRtQ2ZnID09IE5VTEwpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0ICBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyBpcyBOVUxMISBcclxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCWlmIChzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPT0gMCkNCi0Jew0KLQkJcmV0ID0gaGFsVnBDZmdfRW5hYmxlKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2x0ZVJlYWRTdGFydCBoYWxWcENmZ19FbmFibGUgZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJc19zcGVlY2hTdGF0ZS52b2x0ZVZwQ2ZnRW5GbGFnID0gMTsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fV3JpdGVfU3RhcnQoJnNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbSwgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcsICZzX1ZwVGRtV3JpdGVQYXJhbSwgc192cFN0YXRlLnBWcFRkbUNmZyk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJJMlNfMSB2cF9Wb2x0ZVdyaXRlU3RhcnQgcmV0PSVkXG4iLCByZXQpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IGZhaWxlZCByZXQgaXMgJWQgLlxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JZ192b2ljZVZhci52cEkyc1N0YXR1cyA9IFZQX0kyU19JTlVTRTsNCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0jaWZkZWYgX1ZCVUZGX0lOX01VTFRJX0NPUkUNCi0Jdm9pY2VfYnVmZmVyX3dyaXRlKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0NCi0jZWxzZQ0KLQl2b2ljZWJ1ZmZlcl9kbHF1ZXVlX3dyaXRlKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0jZW5kaWYNCi0jZWxzZQ0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IGVycm9yMTp6RHJ2STJTX0dldEJ1ZiBJMlNfMSByZXQ9JWQiLCByZXQpOw0KLQkJekRydkV4dEF1ZGlvX1dyaXRlX1N0b3AoKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0Jek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fV3JpdGUod3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IGVycm9yMjp6RHJ2STJTX1dyaXRlIEkyU18xIHJldD0lZCIsIHJldCk7DQotCQl6RHJ2RXh0QXVkaW9fV3JpdGVfU3RvcCgpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IGVycm9yMzp6RHJ2STJTX0dldEJ1ZiBJMlNfMSByZXQ9JWQiLCByZXQpOw0KLQkJekRydkV4dEF1ZGlvX1dyaXRlX1N0b3AoKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0Jek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fV3JpdGUod3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVXcml0ZVN0YXJ0IGVycm9yNDp6RHJ2STJTX1dyaXRlIEkyU18xIHJldD0lZCIsIHJldCk7DQotCQl6RHJ2RXh0QXVkaW9fV3JpdGVfU3RvcCgpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLSNlbmRpZg0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAgInZwX1ZvbHRlV3JpdGVTdGFydCBcbiIpOw0KLQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVNJTlQzMiB2cF9Wb2x0ZVdyaXRlU3RvcChWT0lEKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0JLy9jb21wbGV0ZV9hbGwoJnNfdm9pY2VfY29tcGxldGlvbik7DQotCXpPc3NfUHV0U2VtYXBob3JlKHNfdm9pY2VXclNlbWEpOw0KLSNlbHNlDQotCS8vekRydkkyc19UeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18xKTsNCi0JekRydkV4dEF1ZGlvX1R4UmxzU2VtYUJlZm9yZVN0b3AoKTsNCi0jZW5kaWYNCi0NCi0jaWYgMC8vbW92ZSB0byBjbG9zZSBsdndlbmh1YSAyMDE1MDkxMA0KLQkvL3dhaXQgZm9yIHdyaXRlIGRyYWluIHNlbWFwaG9yZQ0KLSNpZmRlZiBWT0lDRV9UT05FX01JWEVSX0ZVTkNUSU9ODQotCXZvaWNlX1RvbmVNaXhlclN0b3AoKTsNCi0jZW5kaWYNCi0NCi0JcmV0ID0gekRydkV4dEF1ZGlvX1dyaXRlX1N0b3AoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWb2x0ZV9Xcml0ZVN0b3AgSTJTMSBTdG9wIHdyb25nICByZXQ9JWQiLCByZXQpOw0KLQl9DQotDQotCS8vc19Wb2x0ZVdyaXRlU2VtYSA9IDA7DQotI2VuZGlmDQotDQotCWlmIChzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPT0gMSkNCi0Jew0KLQkJcmV0ID0gaGFsVnBDZmdfRGlzYWJsZSgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfVm9sdGVSZWFkU3RhcnQgaGFsVnBDZmdfRW5hYmxlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQlzX3NwZWVjaFN0YXRlLnZvbHRlVnBDZmdFbkZsYWcgPSAwOw0KLQkJfQ0KLQl9DQotDQotCXNfc3BlZWNoU3RhdGUudm9sdGVWcFdyaXRlU3RvcEZsYWcgPSAxOy8vdG9nZXRoZXIgY29udHJvbCB2cCBzX3NwZWVjaFN0YXRlDQotCWlmICgoc19zcGVlY2hTdGF0ZS52b2x0ZVZwV3JpdGVTdG9wRmxhZyA9PSAxKSAmJiAoc19zcGVlY2hTdGF0ZS52b2x0ZVZwUmVhZFN0b3BGbGFnID09IDEpKQ0KLQl7DQotCQlnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID0gVlBfSTJTX09QRU47DQotI2lmZGVmICBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViANCi0JCXpPc3NfU3RvcFRpbWVyKHNfdm9pY2VUaW1lcklkKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Wb2x0ZVdyaXRlU3RvcCB6T3NzX1N0b3BUaW1lclxuIik7DQotI2VuZGlmDQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1ZvbHRlV3JpdGVTdG9wIFxuIik7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRm9yIHVuaW9uIHZlcnNpb24NCi0gKiBPdGhlcnM6DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB2cF9Xcml0ZURhdGFUb0NvZGVjKFVJTlQ4ICpwQnVmLCBVSU5UMzIgY291bnQpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQlTSU5UMzIgIGVfcmV0ID0gRFJWX1NVQ0NFU1M7CQ0KLQlVSU5UOCAqd3JpdGVfYnVmID0gTlVMTDsNCi0JVUlOVDMyIHdyaXRlX2xlbiA9IDA7DQotCVVJTlQ4ICplX3dyaXRlX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiBlX3dyaXRlX2xlbiA9IDA7DQotCVVJTlQzMiBpID0gMCwgaiA9IDA7DQotI2lmZGVmIFRFU1RfV0hJVEVfTk9JU0UNCi0JLy8gVUlOVDMyIHRlbXBDb3VudCA9IDA7DQotCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInRlc3QgdGhlIHdoaXRlIG5vaXNlIik7DQotCS8vVUlOVDggKnBWb2ljZVRlbXBCdWYgPSBzX3ZvaWNlVGVtcEJ1ZmZlcjsNCi0jZW5kaWYNCi0NCi0NCi0NCi0JaWYgKHBCdWYgPT0gTlVMTCkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoY291bnQgIT0gc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Xcml0ZURhdGFUb0NvZGVjIHdyaXRlIGRhdGEgbGVuZ3RoIGVycixjb3VudD0lZCx3cml0ZWJ1ZmZlcnNpemU9JWQgXG4iLCBjb3VudCwgc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQkjaWZkZWYgRUNBTExfU1VQUE9SVAkNCi0NCi0JaWYoZV9yZWdfZmxhZyA9PSAxKQ0KLQl7CQkNCi0JCWVfcmV0ID0gdXBkYXRlX2VjYWxsX3N0YXRlKERJUl9SWCk7IA0KLQkJaWYgKGVfcmV0ID09IERSVl9FUlJfTk9UX1NVUFBPUlRFRCkNCi0JCXsNCi0JCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9Xcml0ZURhdGFUb0NvZGVjIGdldF9fZWNhbGxfc3RhdGUgZnVuIG5vdCByZWdpc3RlciBvciBpbnZhbGlkIHBhcmEsZV9yZXQ9JWQgIVxuIixlX3JldCk7DQotCQ0KLQkJfQkNCi0JfQkNCi0JI2VuZGlmDQotDQotI2lmZGVmICBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgCQ0KLQ0KLQkjaWZkZWYgVEVTVF9XSElURV9OT0lTRQ0KLQ0KLQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCBwVm9pY2VUZW1wQnVmLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0NCi0JcFZvaWNlVGVtcEJ1ZiArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQl0ZW1wQ291bnQgKz0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JaWYgKHRlbXBDb3VudCA+PSAweDRkZjgwKSAgIC8vMzA3MjAwDQotCQkvL2lmKHRlbXBDb3VudCA+PSAweDRlMjAwKSAgIC8vMzIwMDAwDQotCXsNCi0JCXBWb2ljZVRlbXBCdWYgPSBzX3ZvaWNlVGVtcEJ1ZmZlcjsNCi0JCXRlbXBDb3VudCA9IDA7DQotCX0NCi0JI2VuZGlmDQotDQotCSNpZmRlZiBWT0lDRV9UT05FX01JWEVSX0ZVTkNUSU9ODQotDQotCWlmIChtaXhlclRvbmVJbmZvLlN0YXJ0TWl4ZXIgPT0gVFJVRSkgDQotCXsNCi0JCS8vdm9pY2VfVG9uZU1peGVyRGF0YSggc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcik7DQotCQlpZiAoKGdfdm9pY2VWYXIudm9pY2VJblZvbHRlTW9kZSA9PSAxKSAmJiAoZ192b2ljZVZhci52b2x0ZUlzV2IgPT0gMSkpIA0KLQkJew0KLQkJCXZvaWNlX1RvbmVNaXhlckRhdGEoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciwgNjQwLCAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcik7DQotCQl9IA0KLQkJZWxzZSANCi0JCXsNCi0JCQl2b2ljZV9Ub25lTWl4ZXJEYXRhKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsIDMyMCwgIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIpOw0KLQkJfQ0KLQ0KLQl9DQotDQotCSNlbmRpZg0KLQlpZiAocEJ1ZiAhPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcikNCi0Jew0KLQkJek9zc19NZW1jcHkoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciwgcEJ1Ziwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSk7DQotCX0NCi0gICAgDQotCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkNCi0Jew0KLQkJVm9pY2VQcm9jX1J4UHJvY2VzcygmIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsICYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6T3NzX01lbWNweSgoVk9JRCAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQl9DQotCS8vd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZzX3ZvaWNlX2NvbXBsZXRpb24sIDYwKTsNCi0Jek9zc19HZXRTZW1hcGhvcmUoc192b2ljZVdyU2VtYSwgIDYwKTsNCi0JI2lmZGVmIF9WQlVGRl9JTl9NVUxUSV9DT1JFDQotCXZvaWNlX2J1ZmZlcl93cml0ZShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSk7DQotDQotCSNlbHNlDQotCXZvaWNlYnVmZmVyX2RscXVldWVfd3JpdGUoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQkjZW5kaWYNCi0JaWYgKGdfdm9pY2VWYXIudm9pY2VJblZvbHRlTW9kZSA9PSAxKQ0KLQl7DQotCQlzX3NwZWVjaFN0YXRlLnJ4U2F2ZUxlbiArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJaWYgKHNfc3BlZWNoU3RhdGUucnhTYXZlTGVuID49IHNfc3BlZWNoU3RhdGUuaW5PdXRCdWZVc2VTaXplKQ0KLQkJew0KLQkJCXNfc3BlZWNoU3RhdGUucnhTYXZlTGVuID0gMDsNCi0JCX0NCi0JCXNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlciArIHNfc3BlZWNoU3RhdGUucnhTYXZlTGVuOw0KLQkJI2lmZGVmIF9VU0VfVlBfT1VUUFVUX1JYT1VUX0RBVEENCi0gICAgICAgIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyICsgc19zcGVlY2hTdGF0ZS5yeFNhdmVMZW47DQotCQkjZWxzZQ0KLQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhPdXRQdXRCdWZmZXI7DQotCQkjZW5kaWYNCi0JfQ0KLQ0KLSNlbHNlIC8vbm90IGRlZmluZWQgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYNCi0NCi0JI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi0NCi0JaWYgKGVfcmVnX2ZsYWcgPT0gMSkNCi0Jew0KLQkNCi0JCWVfcmV0ID0gZWNhbGxfR2V0UnhCdWYoJmVfd3JpdGVfYnVmLCZlX3dyaXRlX2xlbik7DQotCQlpZiAoKGVfcmV0ID09IERSVl9TVUNDRVNTKSAmJiAoZV93cml0ZV9idWYgIT0gTlVMTCkgJiYgKGVfd3JpdGVfbGVuID09IHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplKSkNCi0JCXsNCi0NCi0JCQl6T3NzX01lbWNweShlX3dyaXRlX2J1ZiwgcEJ1Ziwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSk7DQotDQotCQl9DQotCQ0KLQ0KLQl9DQotDQotCSNlbmRpZgkNCi0NCi0JcmV0ID0gekRydkV4dEF1ZGlvX0dldEJ1Zigmd3JpdGVfYnVmLCAmd3JpdGVfbGVuKTsJDQotCWlmICgocmV0ID09IERSVl9TVUNDRVNTKSAmJiAod3JpdGVfYnVmICE9IE5VTEwpICYmICh3cml0ZV9sZW4gPT0gc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUpKQ0KLQl7DQotCQlpZiAocEJ1ZiAhPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcikNCi0JCXsNCi0JCQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCBwQnVmLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCX0NCi0JCSNpZiAwDQotCQkjaWZkZWYgVEVTVF9XSElURV9OT0lTRQ0KLQkJek9zc19NZW1jcHkoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciwgcFZvaWNlVGVtcEJ1ZiwgVlBfSTJTX0JVRkZFUl9TSVpFKTsNCi0NCi0JCXBWb2ljZVRlbXBCdWYgKz0gVlBfSTJTX0JVRkZFUl9TSVpFOw0KLQkJdGVtcENvdW50ICs9IFZQX0kyU19CVUZGRVJfU0laRTsNCi0JCWlmICh0ZW1wQ291bnQgPj0gMHg0RTIwMCkgICAvLzMwNzIwMA0KLQkJew0KLQkJCXBWb2ljZVRlbXBCdWYgPSBzX3ZvaWNlVGVtcEJ1ZmZlcjsNCi0JCQl0ZW1wQ291bnQgPSAwOw0KLQkJfQ0KLQkJI2VuZGlmDQotCQkjZW5kaWYNCi0JCSNpZmRlZiBURVNUX1dISVRFX05PSVNFDQotDQotCQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCBwVm9pY2VUZW1wQnVmLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0NCi0JCXBWb2ljZVRlbXBCdWYgKz0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCXRlbXBDb3VudCArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJaWYgKHRlbXBDb3VudCA+PSAweDRkZjgwKSAgIC8vMzA3MjAwDQotCQkJLy9pZih0ZW1wQ291bnQgPj0gMHg0ZTIwMCkgICAvLzMyMDAwMA0KLQkJew0KLQkJCXBWb2ljZVRlbXBCdWYgPSBzX3ZvaWNlVGVtcEJ1ZmZlcjsNCi0JCQl0ZW1wQ291bnQgPSAwOw0KLQkJfQ0KLQkJI2VuZGlmDQotDQotCQkjaWZkZWYgVk9JQ0VfVE9ORV9NSVhFUl9GVU5DVElPTg0KLQ0KLQkJaWYgKG1peGVyVG9uZUluZm8uU3RhcnRNaXhlciA9PSBUUlVFKQ0KLQkJew0KLQkJCS8vdm9pY2VfVG9uZU1peGVyRGF0YSggc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcik7DQotCQkJaWYgKChnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUgPT0gMSkgJiYgKGdfdm9pY2VWYXIudm9sdGVJc1diID09IDEpKQ0KLQkJCXsNCi0JCQkJdm9pY2VfVG9uZU1peGVyRGF0YShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCA2NDAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJdm9pY2VfVG9uZU1peGVyRGF0YShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCAzMjAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKTsNCi0JCQl9DQotDQotCQl9DQotDQotCQkjZW5kaWYNCi0NCi0gICAgICAgIC8vZHRtZuajgOa1i+S4i+ihjOWGmeWFpQ0KLSAgICAgICAgaWYoKGdfdm9pY2VWYXIuZHRtZkRpclNlbCA9PSBEVE1GX1JYKSB8fCAoZ192b2ljZVZhci5kdG1mRGlyU2VsID09IERUTUZfVFhSWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZHRtZlJ4X1JpbmdXcml0ZShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgICNpZiAwDQotICAgICAgICAvLysrK21peGRhdGE/Pz8/Pz8sPz8/Pz8NCi0gICAgICAgIGlmKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VSeE1peERhdGEgPT0gMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlID09IDEpICYmIChnX3ZvaWNlVmFyLnZvbHRlSXNXYiA9PSAxKSkgDQotICAgIAkJew0KLSAgICAJCQl2b2ljZV9NaXhlckRhdGFSeChzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCA2NDAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKTsNCi0gICAgCQl9IA0KLSAgICAJCWVsc2UgDQotICAgIAkJew0KLSAgICAJCQl2b2ljZV9NaXhlckRhdGFSeChzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCAzMjAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKTsNCi0gICAgCQl9DQotICAgICAgICB9DQotICAgICAgICAjZW5kaWYNCi0NCi0JCSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotICAgICAgICBpZiAoKGdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9PSBUUlVFKSYmKChlX3JlZ19mbGFnICE9IDEpfHwoKGVfcmVnX2ZsYWcgPT0gMSkmJihnX3ZvaWNlVmFyLmVjYWxsRGF0YS5lY2FsbFJ4U3RhID09IEVDQUxMX1NUX1JYX0lETEUpKSkpDQotCQkjZWxzZSAgICAgICAgDQotCQlpZiAoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID09IFRSVUUpDQotCQkjZW5kaWYJCQ0KLQkJew0KLQ0KLQkJCXJldCA9IFZvaWNlUHJvY19SeFByb2Nlc3MoJnNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsICZzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciwgc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50KTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIndyaXRlIHRvIGNkZWMgVm9pY2VQcm9jX1J4UHJvY2VzcyBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQkJfQ0KLQkJCS8vek9zc19NZW1jcHkod3JpdGVfYnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlcix3cml0ZV9sZW4pOw0KLQkJCS8vcHZwUnhNaWRCdWZmZXI9IHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCS8vek9zc19NZW1jcHkod3JpdGVfYnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLHdyaXRlX2xlbik7DQotCQkJLy9wVnBSeE1pZEJ1ZmZlcj0gc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcjsNCi0JCQl6T3NzX01lbWNweSgoVk9JRCAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQ0KLQkJfQ0KLQ0KLQ0KLQkJaWYgKChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dENsa01vZGUgPT0gUENNX1RJTUVfTU9ERSkgJiYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSAhPSBQQ01fMVRJTUVfU0xPVCkpDQotCQl7DQotCQkJek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQkJCS8vZm9yKGk9MDtpPFZQX0ZSQU1FX0JVRkZFUl9TSVpFOykNCi0JCQlmb3IgKGkgPSAwOyBpIDwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTspDQotCQkJew0KLQ0KLQkJCQkqICh3cml0ZV9idWYgKyBqICogc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtKSA9ICogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyICsgaSk7DQotCQkJCSogKHdyaXRlX2J1ZiArIGogKiBzX3NwZWVjaFN0YXRlLnBjbVNsb3ROdW0gKyAxKSA9ICgqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciArIGkgKyAxKSk7DQotCQkJCS8vaSs9MjsNCi0jaWYgMQ0KLQ0KLQkJCQlpZiAoc19zcGVlY2hTdGF0ZS52cENmZ1BhcmFtLmNsb2NrX3JhdGUgPT0gMTYwMDApDQotCQkJCXsNCi0NCi0JCQkJCSogKHdyaXRlX2J1ZiArIGogKiBzX3NwZWVjaFN0YXRlLnBjbVNsb3ROdW0gKyBzX3NwZWVjaFN0YXRlLnBjbVdiU2VjRGF0YVBvc2l0aW9uKSA9ICogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyICsgaSArIDIpOw0KLQkJCQkJKiAod3JpdGVfYnVmICsgaiAqIHNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSArIHNfc3BlZWNoU3RhdGUucGNtV2JTZWNEYXRhUG9zaXRpb24gKyAxKSA9ICgqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciArIGkgKyAzKSk7DQotCQkJCQlpICs9IDI7DQotCQkJCQkvLyBqKz0xOw0KLQ0KLQ0KLQkJCQl9DQotI2VuZGlmDQotCQkJCWogKz0gMjsNCi0JCQkJaSArPSAyOw0KLQ0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCX0NCi0NCi0NCi0JCWlmIChnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUgPT0gMSkNCi0JCXsNCi0JCQkvLyBzX3NwZWVjaFN0YXRlLnJ4U2F2ZUxlbiArPSBWUF9GUkFNRV9CVUZGRVJfU0laRTsNCi0JCQlzX3NwZWVjaFN0YXRlLnJ4U2F2ZUxlbiArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJCWlmIChzX3NwZWVjaFN0YXRlLnJ4U2F2ZUxlbiA+PSBzX3NwZWVjaFN0YXRlLmluT3V0QnVmVXNlU2l6ZSkNCi0JCQl7DQotCQkJCXNfc3BlZWNoU3RhdGUucnhTYXZlTGVuID0gMDsNCi0JCQl9DQotCQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBSeEluQnVmZmVyICsgc19zcGVlY2hTdGF0ZS5yeFNhdmVMZW47DQotCQkJI2lmZGVmIF9VU0VfVlBfT1VUUFVUX1JYT1VUX0RBVEENCi0JCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlciArIHNfc3BlZWNoU3RhdGUucnhTYXZlTGVuOw0KLQ0KLQkJCSNlbHNlDQotCQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhPdXRQdXRCdWZmZXI7DQotCQkJI2VuZGlmDQotDQotCQl9DQotDQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfV3JpdGVEYXRhVG9Db2RlYyB6RHJ2STJTX0dldEJ1ZjpJMlMxOnJldD0lZCx3cml0ZV9idWYgPSAlcCx3cml0ZV9sZW4gPSAlZC5cbiIsIHJldCwgd3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQkjaWZkZWYgRUNBTExfU1VQUE9SVA0KLQ0KLQkNCi0JaWYoZV9yZWdfZmxhZyA9PSAxKQ0KLQl7CQ0KLQ0KLQkJZV9yZXQgPSBlY2FsbF9Xcml0ZShlX3dyaXRlX2J1ZiwgZV93cml0ZV9sZW4pOw0KLQkJaWYgKGVfcmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLSAgICAgICAgICAgIGVXckVycisrOw0KLQkJCWlmKGVXckVyciA9PSAxKQ0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZWNhbGxfV3JpdGUgZXJyIHJldD0lZCAhXG4iLCBlX3JldCk7DQotDQotCQl9CQ0KLQ0KLQkJDQotCQlpZiggZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxSeFN0YSA9PSBFQ0FMTF9TVF9SWF9JTlVTRSkNCi0JCXsNCi0JCSAgICB6T3NzX01lbXNldCh3cml0ZV9idWYsIDAsIHdyaXRlX2xlbik7Ly9uZWVkICBtdXRlIHJ4CQkNCi0JCX0NCi0JfQkNCi0JI2VuZGlmCQkNCi0JcmV0ID0gekRydkV4dEF1ZGlvX1dyaXRlKHdyaXRlX2J1Ziwgd3JpdGVfbGVuKTsNCi0NCi0NCi0NCi0NCi0NCi0NCi0jZW5kaWYNCi0NCi0JaWYgKHNfc3BlZWNoU3RhdGUuZmlyc3RXcml0ZURhdGFGbGFnID09IEZBTFNFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfV3JpdGVEYXRhVG9Db2RlYyBmaXJzdCB3cml0ZSByZXQ9JWQsdGljaz0lZC5cbiIsIHJldCwgek9zc19HZXRUaWNrQ291bnQoKSk7DQotCQlzX3NwZWVjaFN0YXRlLmZpcnN0V3JpdGVEYXRhRmxhZyA9IFRSVUU7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotDQotDQotU0lOVDMyIHZwX1JlYWREYXRhRnJvbUNvZGVjKFVJTlQ4ICpwQnVmLCBVSU5UMzIgY291bnQpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQlVSU5UOCAqcmVhZF9idWYgPSBOVUxMOw0KLQlVSU5UMzIgcmVhZF9sZW4gPSAwOw0KLQ0KLQlVSU5UMzIgaSA9IDAsIGogPSAwOw0KLSNpZmRlZiBDT05GSUdfQVJDSF9aWDI5NzUyMFYzX0NQRV9TV0lUQ0gNCi0JVUlOVDggdGVtcDhiaXQgPSAwOw0KLQlVSU5UOCAqcHRlbXA4Yml0ID0gTlVMTDsNCi0jZW5kaWYNCi0NCi0JaWYgKHBCdWYgPT0gTlVMTCkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQ0KLQlpZiAoY291bnQgIT0gc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uYnVmZmVyc2l6ZSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1JlYWREYXRhRnJvbUNvZGVjIHJlYWQgZGF0YSBsZW5ndGggZXJyLGNvdW50PSVkLHJlYWRidWZmZXJzaXplPSVkIFxuIiwgY291bnQsIHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUpOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotDQotCWlmKGVfcmVnX2ZsYWcgPT0gMSkNCi0JewkJDQotCQlyZXQgPSB1cGRhdGVfZWNhbGxfc3RhdGUoRElSX1RYKTsgDQotCQlpZiAocmV0ID09IERSVl9FUlJfTk9UX1NVUFBPUlRFRCkNCi0JCXsNCi0JCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2cF9SZWFkRGF0YUZyb21Db2RlYyBnZXRfX2VjYWxsX3N0YXRlIGZ1biBub3QgcmVnaXN0ZXIscmV0PSVkICFcbiIscmV0KTsNCi0JDQotCQl9CQ0KLQl9CQ0KLSNlbmRpZg0KLQkNCi0jaWZkZWYgIENPTkZJR19WT0lDRV9CVUZGRVJfRFJWICANCi0NCi0vLwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnNfdm9pY2VfY29tcGxldGlvbiwgNjApOw0KLQl6T3NzX0dldFNlbWFwaG9yZShzX3ZvaWNlUmRTZW1hLCAgNjApOw0KLQkjaWZkZWYgX1ZCVUZGX0lOX01VTFRJX0NPUkUNCi0Jdm9pY2VfYnVmZmVyX3JlYWQoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQ0KLQkjZWxzZQ0KLQl2b2ljZWJ1ZmZlcl91bHF1ZXVlX3JlYWQoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQkjZW5kaWYNCi0JaWYgKGdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9PSBUUlVFKQ0KLQl7DQotCQlWb2ljZVByb2NfVHhQcm9jZXNzKCZzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCBOVUxMLCAmc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCk7CQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJek9zc19NZW1jcHkoKFZPSUQgKikoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIpLCAoVk9JRCAqKSBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JfQ0KLQ0KLQlpZiAocEJ1ZiAhPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIpDQotCXsNCi0JCXpPc3NfTWVtY3B5KHBCdWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JfQ0KLQkNCi0JaWYgKGdfdm9pY2VWYXIudm9pY2VJblZvbHRlTW9kZSA9PSAxKQ0KLQl7DQotCQkvLyBzX3NwZWVjaFN0YXRlLnR4U2F2ZUxlbiArPSBWUF9GUkFNRV9CVUZGRVJfU0laRTsNCi0JCXNfc3BlZWNoU3RhdGUudHhTYXZlTGVuICs9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQlpZiAoc19zcGVlY2hTdGF0ZS50eFNhdmVMZW4gPj0gc19zcGVlY2hTdGF0ZS5pbk91dEJ1ZlVzZVNpemUpDQotCQl7DQotCQkJc19zcGVlY2hTdGF0ZS50eFNhdmVMZW4gPSAwOw0KLQkJfQ0KLQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyICsgc19zcGVlY2hTdGF0ZS50eFNhdmVMZW47DQotCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlciArIHNfc3BlZWNoU3RhdGUudHhTYXZlTGVuOw0KLQl9DQotCQ0KLSNlbHNlIC8vbm90IGRlZmluZSBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgDQotCSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotCWlmICgoZV9yZWdfZmxhZyA9PSAxKSYmKGdfdm9pY2VWYXIuZWNhbGxEYXRhLmVjYWxsVHhTdGEgPT0gRUNBTExfU1RfVFhfSU5VU0UpKQkJDQotCXsJDQotCQlyZXQgPSBlY2FsbF9HZXRUeEJ1ZigmcmVhZF9idWYsJnJlYWRfbGVuKTsNCi0JCWlmKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnAgdnBfUmVhZERhdGFGcm9tQ29kZWMgZWNhbGxfR2V0UnhCdWYgZXJyIHJldD0lZFxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJDQotCQlyZXQgPSBlY2FsbF9SZWFkKCZyZWFkX2J1ZiwgJnJlYWRfbGVuKTsNCi0JCS8vcmV0ID0gekRydkV4dEF1ZGlvX1JlYWQoJnJlYWRfYnVmLCAmcmVhZF9sZW4pOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJcmV0ID0gekRydkV4dEF1ZGlvX1JlYWQoJnJlYWRfYnVmLCAmcmVhZF9sZW4pOw0KLQkJZXh0X2FSZENvdW50ICsrOw0KLQkNCi0JfQkNCi0JI2Vsc2UvL25vIEVDQUxMX1NVUFBPUlQNCi0gICAgcmV0ID0gekRydkV4dEF1ZGlvX1JlYWQoJnJlYWRfYnVmLCAmcmVhZF9sZW4pOw0KLQlleHRfYVJkQ291bnQgKys7CQ0KLQkjZW5kaWYJDQotCWlmICgocmV0ID09IERSVl9TVUNDRVNTKSAmJiAocmVhZF9idWYgIT0gTlVMTCkgJiYgKHJlYWRfbGVuID09IHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUpKQ0KLQl7DQotCQlpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0JCXsNCi0NCi0NCi0JCQkvL2ZvcihpPTA7aTxWUF9GUkFNRV9CVUZGRVJfU0laRTspDQotCQkJZm9yIChpID0gMDsgaSA8IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7KQ0KLQkJCXsNCi0JCQkJKiAoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciArIGkpID0gKiAocmVhZF9idWYgKyBqICogc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtKTsNCi0JCQkJKiAoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciArIGkgKyAxKSA9ICogKHJlYWRfYnVmICsgaiAqIHNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSArIDEpOw0KLQkJCQkvLyBpICs9IDI7DQotI2lmIDENCi0JCQkJaWYgKHNfc3BlZWNoU3RhdGUudnBDZmdQYXJhbS5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQkJCQl7DQotDQotCQkJCQkqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyICsgaSArIDIpID0gKiAocmVhZF9idWYgKyBqICogc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICsgc19zcGVlY2hTdGF0ZS5wY21XYlNlY0RhdGFQb3NpdGlvbik7DQotCQkJCQkqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyICsgaSArIDMpID0gKiAocmVhZF9idWYgKyBqICogc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICsgc19zcGVlY2hTdGF0ZS5wY21XYlNlY0RhdGFQb3NpdGlvbiArIDEpOw0KLQ0KLQkJCQkJaSArPSAyOw0KLQkJCQkJLy9qKz0gMTsNCi0JCQkJfQ0KLSNlbmRpZg0KLQkJCQlqICs9IDI7IC8vb25lIHNsb3QgLHR3byBieXRlDQotCQkJCWkgKz0gMjsNCi0NCi0JCQl9DQotCQkJLy96T3NzX01lbWNweSggc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlcixyZWFkX2J1ZixyZWFkX2xlbik7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJek9zc19NZW1jcHkoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgcmVhZF9idWYsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQkJfQ0KLQkJLyoNCi0JCSNpZmRlZiBWUF9HRVRfVFhfQUxMX0RBVEENCi0JCSAgICAgICAgek9zc19NZW1jcHkocFZwVHhJbkFsbERhdGFCdWZmZXIscmVhZF9idWYscmVhZF9sZW4pOw0KLQkJICAgICAgICBpZiAocmVhZF9sZW4gIT0gIHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUpDQotCQkgICAgICAgIHsNCi0JCSAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2x0ZSB2cF9SZWFkRGF0YUZyb21Db2RlYyByZWFkX2xlbiA9JWRcbiIscmVhZF9sZW4pOw0KLQ0KLQkJICAgICAgICB9DQotCQkgICAgICAgIHNfVHhBbGxEYXRhU2F2ZUxlbis9cmVhZF9sZW47DQotDQotCQkgICAgICAgIC8vaWYoc19UeEFsbERhdGFTYXZlTGVuPj0weDEwMDAwMCkNCi0JCSAgICAgICAgaWYgKHNfVHhBbGxEYXRhU2F2ZUxlbiA+PSAweEZBMDAwKQ0KLQkJICAgICAgICB7DQotCQkgICAgICAgICAgICBzX1R4QWxsRGF0YVNhdmVMZW4gPSAwOw0KLQ0KLQkJICAgICAgICB9DQotDQotCQkgICAgICAgIHBWcFR4SW5BbGxEYXRhQnVmZmVyPShVSU5UOCAqKTB4MjU1MDAwMDArc19UeEFsbERhdGFTYXZlTGVuOw0KLQkJI2VuZGlmDQotCQkqLw0KLQkJI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi0NCi0JCWlmICgoZV9yZWdfZmxhZyAhPSAxKXx8KChlX3JlZ19mbGFnID09IDEpJiYoZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSA9PSBFQ0FMTF9TVF9UWF9JRExFKSkpDQotCQl7DQotCQkJcmV0ID0gekRydkV4dEF1ZGlvX0ZyZWVCdWYocmVhZF9idWYpOw0KLQkJCWlmIChyZXQgICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwIHZwX1JlYWREYXRhRnJvbUNvZGVjIGVyciByZXQ9JWRcbiIsIHJldCk7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotCQkJfQ0KLQkJCWV4dF9hUmRGQnVmQ291bnQgKys7CQkJCQ0KLQkJfQkJDQotICAgICAgDQotCQkjZWxzZSAvL25vdCBFQ0FMTF9TVVBQT1JUDQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fRnJlZUJ1ZihyZWFkX2J1Zik7DQotCQlpZiAocmV0ICAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnAgdnBfUmVhZERhdGFGcm9tQ29kZWMgZXJyIHJldD0lZFxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJZXh0X2FSZEZCdWZDb3VudCArKzsJDQotCQkjZW5kaWYNCi0JCQ0KLQkJI2lmZGVmIENPTkZJR19DUF9VU0VfU09GVF9EVE1GX0RFVEVDVA0KLQkJZm9yIChpID0gMDsgaSA8IChzX3NwZWVjaFN0YXRlLnZwQ2ZnUGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgLyA4MCk7ICkNCi0JCXsNCi0JCQlTSU5UMzIgZHRtZl9yZXQgPSBEUlZfU1VDQ0VTUzsNCi0JCQlkdG1mX3JldCA9IHNsaWNfdHdfZHRtZl9kZXRlY3QoKFNJTlQxNiAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyICsgaSAqIDE2MCksIDgwLCBzX3NwZWVjaFN0YXRlLnZwQ2ZnUGFyYW0uY2xvY2tfcmF0ZSk7DQotCQkJaSsrOw0KLQkJCWlmIChkdG1mX3JldCA9PSAweDAwMTApIHsNCi0JCQkJZ192b2ljZVZhci5tdXRlQ291bnQgPSAyMDsNCi0JCQkJLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnAgc2xpY190d19kdG1mX2RldGVjdCAxIHJldD0lZFxuIiwgcmV0KTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoZHRtZl9yZXQgPT0gMHgwMDAwKSB7DQotCQkJCWdfdm9pY2VWYXIubXV0ZUNvdW50ID0gMTsNCi0JCQkJLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnAgc2xpY190d19kdG1mX2RldGVjdCAyICByZXQ9JWRcbiIsIHJldCk7DQotCQkJfQ0KLQkJfQ0KLQkJI2VuZGlmDQotCQkNCi0JCS8vbGU5NjQzDQotCQkjaWYgMA0KLQkJLy8jaWZkZWYgQ09ORklHX0FSQ0hfWlgyOTc1MjBWM19DUEVfU1dJVENIDQotDQotDQotCQlpZiAoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVRkbSA9PSAxKQ0KLQkJew0KLQkJCXB0ZW1wOGJpdCA9IHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXI7DQotCQkJZm9yIChpID0gMDsgaSA8IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7KQ0KLQkJCXsNCi0JCQkJdGVtcDhiaXQgPSAqKHB0ZW1wOGJpdCArIGkpOw0KLQkJCQkqKHB0ZW1wOGJpdCArIGkpID0gKihwdGVtcDhiaXQgKyBpICsgMSk7DQotCQkJCSoocHRlbXA4Yml0ICsgaSArIDEpID0gdGVtcDhiaXQ7DQotCQkJCWkgKz0gMjsNCi0JCQl9DQotCQl9DQotCQkjZW5kaWYNCi0gICAgICAgIA0KLSAgICAgICAgLy9kdG1m5qOA5rWL5LiK6KGM5YaZ5YWlDQotICAgICAgICBpZigoZ192b2ljZVZhci5kdG1mRGlyU2VsID09IERUTUZfVFgpIHx8IChnX3ZvaWNlVmFyLmR0bWZEaXJTZWwgPT0gRFRNRl9UWFJYKSkNCi0gICAgICAgIHsgICAgICAgICAgDQotICAgICAgICAgICAgZHRtZlR4X1JpbmdXcml0ZShzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8rKyttaXhkYXRhPz8/Pz8/DQotICAgICAgICBpZigoZ192b2ljZVZhci5hdWRpb19jdHJsRmxhZy5pc1VzZVR4TWl4RGF0YSA9PSAxKSAmJiAoZ192b2ljZVZhci52b2ljZUluVm9sdGVNb2RlID09IDEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKGdfdm9pY2VWYXIuc2FtcGxlX3JhdGUgPT0gMTYwMDApLy92b2x0ZUlzV2I/Pz8/Pz8/PysrKysrDQotICAgIAkJew0KLSAgICAJCQl2b2ljZV9NaXhlckRhdGFUeChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCA2NDAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyKTsvLzY0MCA/Pw0KLSAgICAJCX0gDQotICAgIAkJZWxzZSBpZihnX3ZvaWNlVmFyLnNhbXBsZV9yYXRlID09IDgwMDApDQotICAgIAkJew0KLSAgICAJCQl2b2ljZV9NaXhlckRhdGFUeChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCAzMjAsICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyKTsNCi0gICAgCQl9DQotICAgICAgICB9DQotCQkjaWZkZWYgRUNBTExfU1VQUE9SVA0KLSAgICAgICAgaWYgKChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkmJigoZV9yZWdfZmxhZyAhPSAxKXx8KChlX3JlZ19mbGFnID09IDEpJiYoZ192b2ljZVZhci5lY2FsbERhdGEuZWNhbGxUeFN0YSA9PSBFQ0FMTF9TVF9UWF9JRExFKSkpKQ0KLQkJI2Vsc2UgICAgDQotCQlpZiAoZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID09IFRSVUUpDQotCQkjZW5kaWYJCQ0KLQkJew0KLQkJCXJldCA9IFZvaWNlUHJvY19UeFByb2Nlc3MoJnNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsIE5VTEwsICZzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciwgc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50KTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInJlYWQgZnJvbSBjZGVjIFZvaWNlUHJvY19UeFByb2Nlc3MgZXJyIHJldD0lZCAhXG4iLCByZXQpOw0KLQ0KLQkJCX0NCi0JCQkvLyB6T3NzX01lbWNweShwQnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlcixWUF9GUkFNRV9CVUZGRVJfU0laRSk7DQotCQkJLy96T3NzX01lbWNweShwQnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlcixzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQkvL3pPc3NfTWVtY3B5KHBCdWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsVlBfRlJBTUVfQlVGRkVSX1NJWkUpOw0KLQkJCS8vek9zc19NZW1jcHkocEJ1Ziwgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlcixzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCQl6T3NzX01lbWNweSgoVk9JRCAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQ0KLQ0KLQkJfQ0KLQ0KLQkJaWYgKGdfdm9pY2VWYXIuaXNVc2VTbGljQ29kZWMgPT0gMSkNCi0JCXsNCi0JCQlpZiAoZ192b2ljZVZhci5tdXRlQ291bnQgPiAwKQ0KLQkJCXsNCi0JCQkJbWVtc2V0KHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLCAwLCBjb3VudCk7DQotCQkJCWdfdm9pY2VWYXIubXV0ZUNvdW50LS07DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHBCdWYgIT0gIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyKQ0KLQkJew0KLQkJCXpPc3NfTWVtY3B5KHBCdWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCX0NCi0JCWlmIChnX3ZvaWNlVmFyLnZvaWNlSW5Wb2x0ZU1vZGUgPT0gMSkNCi0JCXsNCi0JCQkvLyBzX3NwZWVjaFN0YXRlLnR4U2F2ZUxlbiArPSBWUF9GUkFNRV9CVUZGRVJfU0laRTsNCi0JCQlzX3NwZWVjaFN0YXRlLnR4U2F2ZUxlbiArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJCWlmIChzX3NwZWVjaFN0YXRlLnR4U2F2ZUxlbiA+PSBzX3NwZWVjaFN0YXRlLmluT3V0QnVmVXNlU2l6ZSkNCi0JCQl7DQotCQkJCXNfc3BlZWNoU3RhdGUudHhTYXZlTGVuID0gMDsNCi0JCQl9DQotCQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyICsgc19zcGVlY2hTdGF0ZS50eFNhdmVMZW47DQotCQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhPdXRQdXRCdWZmZXIgKyBzX3NwZWVjaFN0YXRlLnR4U2F2ZUxlbjsNCi0JCX0NCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgdnAgdnBfUmVhZERhdGFGcm9tQ29kZWMgekRydkkyU19SZWFkOkkyUzE6cmV0PSVkLHJlYWRfYnVmID0gJXAscmVhZF9sZW4gPSAlZC5cbiIsIHJldCwgcmVhZF9idWYsIHJlYWRfbGVuKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0jZW5kaWYNCi0JDQotCWlmIChzX3NwZWVjaFN0YXRlLmZpcnN0UmVhZERhdGFGbGFnID09IEZBTFNFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfUmVhZERhdGFGcm9tQ29kZWMgZmlyc3QgcmVhZCB0aWNrPSVkLlxuIiwgek9zc19HZXRUaWNrQ291bnQoKSk7DQotCQlzX3NwZWVjaFN0YXRlLmZpcnN0UmVhZERhdGFGbGFnID0gVFJVRTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0NCi1zdGF0aWMgVk9JRCAgdnBfRGF0YVByb2Nlc3NUaHJlYWRFbnRyeShTSU5UMzIgYXJndSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JVUlOVDggKnJlYWRfYnVmID0gTlVMTDsNCi0JVUlOVDggKndyaXRlX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiByZWFkX2xlbiA9IDA7DQotCVVJTlQzMiB3cml0ZV9sZW4gPSAwOw0KLQ0KLQkvL1VJTlQ4ICogc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciA9IE5VTEw7DQotCS8vVUlOVDggKiBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyID0gTlVMTDsNCi0NCi0JLy9VSU5UOCAqIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyID0gTlVMTDsNCi0JLy9VSU5UOCAqIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyID0gTlVMTDsNCi0NCi0NCi0JLy9VSU5UMzIgaSA9IDA7Ly94aXUgZ2FpIGNodQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfRGF0YVByb2Nlc3NUaHJlYWRFbnRyeSBcbiIpOw0KLQ0KLQl3aGlsZSAoMSkNCi0Jew0KLQkJZ192b2ljZVZhci52cExvb3BSdW5pbmcgPSBGQUxTRTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5IHdhaXQgc192cFN0YXRlLnZwU2VtYXBob3JlIVxuIik7DQotDQotCQl6T3NzX0dldFNlbWFwaG9yZShzX3ZwU3RhdGUudnBTZW1hcGhvcmUsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0JCWdfdm9pY2VWYXIudnBMb29wUnVuaW5nID0gVFJVRTsNCi0JCS8vIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlcjsNCi0JCS8vIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhJbkJ1ZmZlcjsNCi0NCi0JCS8vIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyOw0KLQkJLy8gc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhPdXRQdXRCdWZmZXI7DQotDQotCQkvLyNpZmRlZiBURVNUX1dISVRFX05PSVNFDQotCQkvL3BWb2ljZVRlbXBCdWYgPSBzX3ZvaWNlVGVtcEJ1ZmZlcjsvL2ZvciB0ZXN0DQotCQkvLyNlbmRpZg0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkgZ192b2ljZVZhci52cEkyc1N0YXR1cyAlZCFcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMpOw0KLQ0KLQkJaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gVlBfSTJTX0lOVVNFKQ0KLQkJew0KLQkJCXZwX1ZvaWNlSTJzU3RvcCgpOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5ICBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzICE9IFZQX0kyU19JTlVTRSFcbiIpOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkgc3RhcnQgdnBfVm9pY2VJMnNTdGFydCFcbiIpOw0KLQ0KLQkJcmV0ID0gdnBfVm9pY2VJMnNTdGFydCgpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl2cF9Wb2ljZUkyc1N0b3AoKTsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfRGF0YVByb2Nlc3NUaHJlYWRFbnRyeSBlcnJvcjogdnBfVm9pY2VJMnNTdGFydCFcbiIpOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkgZGF0YSBwcm9jZXNzIHN0YXJ0IVxuIik7DQotCQl6T3NzX1ByaW50ZihTVUJNRExfSEFMLCBQUklOVF9MRVZFTF9OT1JNQUwsICJ2b2ljZSB2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5IHdvcmsgc3RhcnQhXG4iKTsNCi0NCi0JCXdoaWxlIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JTlVTRSkNCi0JCXsNCi0JCQkvKmRvd25saW5rOnJlYWQgZnJvbSB0ZWFrKi8NCi0JCQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJkb3dubGluazppMnMyIHJlYWQgZnJvbSB0ZWFrXG4iKTsNCi0JCQlyZXQgPSB6RHJ2STJTX1JlYWQoSTJTXzIsICZyZWFkX2J1ZiwgJnJlYWRfbGVuKTsNCi0NCi0JCQkvL3pPc3NfQVNTRVJUKHJlYWRfYnVmICE9IE5VTEwpOw0KLQkJCS8vek9zc19BU1NFUlQocmVhZF9sZW4gIT0gMCk7DQotI2lmIDANCi0JCQlpZiAoc19zcGVlY2hTdGF0ZS5zYXZlTGVuID09IDMyMDApDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19SZWFkOkkyUzI6cmV0PSVkLHJlYWRfYnVmID0gJXgscmVhZF9sZW4gPSAlZC5cbiIsIHJldCwgcmVhZF9idWYsIHJlYWRfbGVuKTsNCi0JCQl9DQotI2VuZGlmDQotCQkJLy9pZihyZXQgPT0gRFJWX1NVQ0NFU1MpDQotCQkJaWYgKChyZXQgPT0gRFJWX1NVQ0NFU1MpICYmIChyZWFkX2J1ZiAhPSBOVUxMKSAmJiAocmVhZF9sZW4gIT0gMCkpDQotCQkJew0KLQkJCQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCByZWFkX2J1Ziwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSk7DQotDQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWQ6STJTMjpyZXQ9JWQscmVhZF9idWYgPSAlcCxyZWFkX2xlbiA9ICVkLlxuIiwgcmV0LCByZWFkX2J1ZiwgcmVhZF9sZW4pOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJcmV0ID0gekRydkkyU19GcmVlQnVmKEkyU18yLCByZWFkX2J1Zik7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7CS8qY292ZXJpdHkgbWVkaXVtIFBSSU5URl9BUkdTIOaKiiV45o2i5oiQJXAqLw0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19GcmVlQnVmOkkyU18yOnJldD0lZCxyZWFkX2J1ZiA9ICVwLlxuIiwgcmV0LCByZWFkX2J1Zik7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0NCi0JCQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSU5VU0UpDQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotDQotCQkJLypkb3dubGluazp2b2ljZSBwcm9jZXNzKi8NCi0JCQl2cF9Xcml0ZURhdGFUb0NvZGVjKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsIHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplKTsNCi0jaWYgMA0KLQkJCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkNCi0JCQkJcmV0ID0gVm9pY2VQcm9jX1J4UHJvY2VzcygmIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsICYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfRGF0YVByb2Nlc3NUaHJlYWRFbnRyeSBlcnJvcjpWb2ljZVByb2NfUnhQcm9jZXNzIDpyZXQ9JWQuXG4iLCByZXQpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJLy96T3NzX01lbWNweSgoVk9JRCAqKSggc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIpLCAoVk9JRCAqKSBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCBWUF9JMlNfQlVGRkVSX1NJWkUpOw0KLSAgICAJCWVsc2UNCi0gICAgCQl7DQotICAgIAkJCXpPc3NfTWVtY3B5KChWT0lEICopKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyKSwgKFZPSUQgKikgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlciwgMzIwKTsNCi0gICAgCQl9DQotDQotICAgIAkJaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gVlBfSTJTX0lOVVNFKQ0KLSAgICAJCXsNCi0gICAgCQkJYnJlYWs7DQotICAgIAkJfQ0KLQ0KLSNpZiAxDQotICAgIAkJLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZG93bmxpbms6aTJzMSB3cml0ZSB0byBjb2RlY1xuIik7DQotICAgIAkJLypkb3dubGluazp3cml0ZSB0byBjb2RlYyovDQotICAgIAkJcmV0ID0gekRydkV4dEF1ZGlvX0dldEJ1Zigmd3JpdGVfYnVmLCAmd3JpdGVfbGVuKTsNCi0NCi0gICAgCQkvL3pPc3NfQVNTRVJUKHdyaXRlX2J1ZiAhPSBOVUxMKTsNCi0gICAgCQkvL3pPc3NfQVNTRVJUKHdyaXRlX2xlbiAhPSAwKTsNCi0jaWYgMA0KLSAgICAJCWlmIChzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPT0gMzIwMCkNCi0gICAgCQl7DQotICAgIAkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX0dldEJ1ZjpJMlMxOnJldD0lZCx3cml0ZV9idWYgPSAleCx3cml0ZV9sZW4gPSAlZC5cbiIsIHJldCwgd3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLSAgICAJCX0NCi0jZW5kaWYNCi0gICAgCQkvL2lmKHJldCA9PSBEUlZfU1VDQ0VTUykNCi0gICAgCQlpZiAoKHJldCA9PSBEUlZfU1VDQ0VTUykgJiYgKHdyaXRlX2J1ZiAhPSBOVUxMKSAmJiAod3JpdGVfbGVuICE9IDApKQ0KLSAgICAJCXsNCi0NCi0gICAgCQkJaWYgKChzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc192cFN0YXRlLnBWcEV4dEkyc0NmZy0+dFBjbVNsb3ROdW0gIT0gUENNXzFUSU1FX1NMT1QpKQ0KLSAgICAJCQl7DQotICAgIAkJCQkvL0l0IGlzIHVzZWQgZm9yIHhpbmtlIHRvIHNldCB0ZWFrIHZvaWNlIGdhaW4gd2hlbiBvcGVuICBsdndlbmh1YSAyMDE1MDcwOQ0KLSAgICAJCQkJek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLSAgICAJCQkJZm9yIChpID0gMDsgaSA8IFZQX0kyU19CVUZGRVJfU0laRTspDQotICAgIAkJCQl7DQotICAgIAkJCQkJKiAod3JpdGVfYnVmICsgaSAqIChzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnLT50UGNtU2xvdE51bSArIDEpKSA9ICogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyICsgaSk7DQotICAgIAkJCQkJKiAod3JpdGVfYnVmICsgaSAqIChzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnLT50UGNtU2xvdE51bSArIDEpICsgMSkgPSAqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciArIGkgKyAxKTsNCi0gICAgCQkJCQlpICs9IDI7DQotICAgIAkJCQl9DQotICAgIAkJCX0NCi0gICAgCQkJZWxzZQ0KLQ0KLSAgICAJCQl7DQotICAgIAkJCQl6T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyLCBWUF9JMlNfQlVGRkVSX1NJWkUpOw0KLSAgICAJCQkJLy96T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsMzIwKTsNCi0gICAgCQkJfQ0KLSAgICAJCX0NCi0gICAgCQllbHNlDQotICAgIAkJew0KLSAgICAJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAid3JpdGUgZWxzZSB6RHJ2STJTX0dldEJ1ZjpJMlMxOnJldD0lZCx3cml0ZV9idWYgPSAleCx3cml0ZV9sZW4gPSAlZC5cbiIsIHJldCwgd3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLSAgICAJCQlicmVhazsNCi0gICAgCQl9DQotICAgIAkJcmV0ID0gekRydkV4dEF1ZGlvX1dyaXRlKHdyaXRlX2J1Ziwgd3JpdGVfbGVuKTsNCi0gICAgCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAJCXsNCi0gICAgCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfV3JpdGU6STJTXzE6cmV0PSVkLHdyaXRlX2J1ZiA9ICV4LHdyaXRlX2xlbiA9ICVkLlxuIiwgcmV0LCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotICAgIAkJCWJyZWFrOw0KLSAgICAJCX0NCi0NCi0jZW5kaWYNCi0jZW5kaWYNCi0gICAgCQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSU5VU0UpDQotICAgIAkJew0KLSAgICAJCQlicmVhazsNCi0gICAgCQl9DQotDQotICAgIAkJLyp1cGxpbms6cmVhZCBmcm9tIGNvZGVjKi8NCi0gICAgCQkvLyB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZG93bmxpbms6aTJzMSByZWFkIGZyb20gY29kZWNcbiIpOw0KLSAgICAJCXZwX1JlYWREYXRhRnJvbUNvZGVjKHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplKTsNCi0jaWYgMA0KLSAgICAJCXJldCA9IHpEcnZFeHRBdWRpb19SZWFkKCZyZWFkX2J1ZiwgJnJlYWRfbGVuKTsNCi0NCi0gICAgCQkvL3pPc3NfQVNTRVJUKHJlYWRfYnVmICE9IE5VTEwpOw0KLSAgICAJCS8vek9zc19BU1NFUlQocmVhZF9sZW4gIT0gMCk7DQotI2lmIDANCi0NCi0gICAgCQlpZiAoc19zcGVlY2hTdGF0ZS5zYXZlTGVuID09IDMyMDApDQotICAgIAkJew0KLSAgICAJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19HZXRCdWY6STJTMTpyZXQ9JWQscmVhZF9idWYgPSAleCxyZWFkX2xlbiA9ICVkLlxuIiwgcmV0LCByZWFkX2J1ZiwgcmVhZF9sZW4pOw0KLSAgICAJCX0NCi0jZW5kaWYNCi0gICAgCQkvL2lmKHJldCA9PSBEUlZfU1VDQ0VTUykNCi0gICAgCQlpZiAoKHJldCA9PSBEUlZfU1VDQ0VTUykgJiYgKHJlYWRfYnVmICE9IE5VTEwpICYmIChyZWFkX2xlbiAhPSAwKSkNCi0gICAgCQl7DQotICAgIAkJCWlmICgoc192cFN0YXRlLnBWcEV4dEkyc0NmZy0+dENsa01vZGUgPT0gUENNX1RJTUVfTU9ERSkgJiYgKHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0gICAgCQkJew0KLSAgICAJCQkJLy9JdCBpcyB1c2VkIGZvciB4aW5rZSB0byBzZXQgdGVhayB2b2ljZSBnYWluIHdoZW4gb3BlbiAgbHZ3ZW5odWEgMjAxNTA3MDkNCi0gICAgCQkJCWZvciAoaSA9IDA7IGkgPCBWUF9JMlNfQlVGRkVSX1NJWkU7KQ0KLSAgICAJCQkJew0KLSAgICAJCQkJCSogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIgKyBpKSA9ICogKHJlYWRfYnVmICsgaSAqIChzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnLT50UGNtU2xvdE51bSArIDEpKTsNCi0gICAgCQkJCQkqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyICsgaSArIDEpID0gKiAocmVhZF9idWYgKyBpICogKHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmctPnRQY21TbG90TnVtICsgMSkgKyAxKTsNCi0gICAgCQkJCQlpICs9IDI7DQotICAgIAkJCQl9DQotICAgIAkJCX0NCi0gICAgCQkJZWxzZQ0KLSAgICAJCQl7DQotICAgIAkJCQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCByZWFkX2J1ZiwgVlBfSTJTX0JVRkZFUl9TSVpFKTsNCi0gICAgCQkJfQ0KLSAgICAJCX0NCi0gICAgCQllbHNlDQotICAgIAkJew0KLSAgICAJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydkkyU19SZWFkOkkyUzE6cmV0PSVkLHJlYWRfYnVmID0gJXAscmVhZF9sZW4gPSAlZC5cbiIsIHJldCwgcmVhZF9idWYsIHJlYWRfbGVuKTsNCi0gICAgCQkJYnJlYWs7DQotICAgIAkJfQ0KLSAgICAJCXJldCA9IHpEcnZFeHRBdWRpb19GcmVlQnVmKHJlYWRfYnVmKTsNCi0gICAgCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLSAgICAJCXsNCi0gICAgCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfRnJlZUJ1ZjpJMlMxOnJldD0lZCxyZWFkX2J1ZiA9ICV4LlxuIiwgcmV0LCByZWFkX2J1Zik7DQotICAgIAkJCWJyZWFrOw0KLSAgICAJCX0NCi0NCi0gICAgCQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSU5VU0UpDQotICAgIAkJew0KLSAgICAJCQlicmVhazsNCi0gICAgCQl9DQotDQotICAgIAkJLyp1cGxpbms6dm9pY2UgcHJvY2VzcyovDQotICAgIAkJaWYgKGdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9PSBUUlVFKQ0KLSAgICAJCQlyZXQgPSBWb2ljZVByb2NfVHhQcm9jZXNzKCYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgTlVMTCwgJiBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlcik7DQotICAgIAkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgCQl7DQotICAgIAkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5IGVycm9yOlZvaWNlUHJvY19UeFByb2Nlc3MgOnJldD0lZC5cbiIsIHJldCk7DQotICAgIAkJCWJyZWFrOw0KLSAgICAJCX0NCi0gICAgCQkvL3pPc3NfTWVtY3B5KChWT0lEICopKCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsIFZQX0kyU19CVUZGRVJfU0laRSk7DQotICAgICAgICAJZWxzZQ0KLSAgICAgICAgCXsNCi0NCi0gICAgICAgIAkJLy9ubyBueHAgbGliIGx3ZW5odWEgMjAxNTAzMTcNCi0gICAgICAgIAkJLy9Wb2ljZVByb2NfVHhQcm9jZXNzKCYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgTlVMTCwgJiBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICAJCXpPc3NfTWVtY3B5KChWT0lEICopKHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyKSwgKFZPSUQgKikgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgMzIwKTsNCi0gICAgICAgIAl9DQotI2VuZGlmDQotDQotDQotICAgICAgICAJaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gVlBfSTJTX0lOVVNFKQ0KLSAgICAgICAgCXsNCi0gICAgICAgIAkJYnJlYWs7DQotICAgICAgICAJfQ0KLQ0KLSAgICAgICAgCS8qdXBsaW5rOndyaXRlIHRvIHRlYWsqLw0KLSAgICAgICAgCS8vekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImRvd25saW5rOmkyczIgd3JpdGUgdG8gdGVha1xuIik7DQotICAgICAgICAJcmV0ID0gekRydkkyU19HZXRCdWYoSTJTXzIsICZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQ0KLSAgICAgICAgCS8vek9zc19BU1NFUlQod3JpdGVfYnVmICE9IE5VTEwpOw0KLSAgICAgICAgCS8vek9zc19BU1NFUlQod3JpdGVfbGVuICE9IDApOw0KLSNpZiAwDQotDQotICAgICAgICAJaWYgKHNfc3BlZWNoU3RhdGUuc2F2ZUxlbiA9PSAzMjAwKQ0KLSAgICAgICAgCXsNCi0gICAgICAgIAkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfR2V0QnVmOkkyUzI6cmV0PSVkLHdyaXRlX2J1ZiA9ICV4LHdyaXRlX2xlbiA9ICVkLlxuIiwgcmV0LCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotICAgICAgICAJfQ0KLSNlbmRpZg0KLSAgICAgICAgCS8vaWYocmV0ID09IERSVl9TVUNDRVNTKQ0KLSAgICAgICAgCWlmICgocmV0ID09IERSVl9TVUNDRVNTKSAmJiAod3JpdGVfYnVmICE9IE5VTEwpICYmICh3cml0ZV9sZW4gIT0gMCkpDQotICAgICAgICAJew0KLSAgICAgICAgCQl6T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLCBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0gICAgICAgIAkJLy96T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsMzIwKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJZWxzZQ0KLSAgICAgICAgCXsNCi0gICAgICAgIAkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfR2V0QnVmOkkyUzI6cmV0PSVkLHdyaXRlX2J1ZiA9ICVwLHdyaXRlX2xlbiA9ICVkLlxuIiwgcmV0LCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotICAgICAgICAJCWJyZWFrOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlyZXQgPSB6RHJ2STJTX1dyaXRlKEkyU18yLCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotICAgICAgICAJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0gICAgICAgIAl7DQotICAgICAgICAJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlOkkyUzI6cmV0PSVkLHdyaXRlX2J1ZiA9ICVwLHdyaXRlX2xlbiA9ICVkLlxuIiwgcmV0LCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotICAgICAgICAJCWJyZWFrOw0KLSAgICAgICAgCX0NCi0jaWYgMA0KLSAgICAgICAgCWlmIChzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPT0gMzIwMCkNCi0gICAgICAgIAl7DQotICAgICAgICAJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5OiAgc19zcGVlY2hTdGF0ZS5zYXZlTGVuID0gJWQuXG4iLCAgc19zcGVlY2hTdGF0ZS5zYXZlTGVuKTsNCi0gICAgICAgIAl9DQotI2VuZGlmDQotICAgICAgICAJLy9pZiggc19zcGVlY2hTdGF0ZS5zYXZlTGVuIDwgVlBfQlVGX0xFTkdUSCkNCi0gICAgICAgIAl7DQotICAgICAgICAJCXNfc3BlZWNoU3RhdGUuc2F2ZUxlbiArPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLSAgICAgICAgCQlpZiAoc19zcGVlY2hTdGF0ZS5zYXZlTGVuID49IHNfc3BlZWNoU3RhdGUuaW5PdXRCdWZVc2VTaXplKQ0KLSAgICAgICAgCQl7DQotICAgICAgICAJCQlzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPSAwOw0KLSAgICAgICAgCQl9DQotICAgICAgICAJCXNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlciArIHNfc3BlZWNoU3RhdGUuc2F2ZUxlbjsNCi0gICAgICAgIAkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyICsgc19zcGVlY2hTdGF0ZS5zYXZlTGVuOw0KLSAgICAgICAgCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlciArICBzX3NwZWVjaFN0YXRlLnNhdmVMZW47DQotI2lmZGVmIF9VU0VfVlBfT1VUUFVUX1JYT1VUX0RBVEENCi0gICAgICAgIAkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhPdXRQdXRCdWZmZXIgKyAgc19zcGVlY2hTdGF0ZS5zYXZlTGVuOw0KLSNlbHNlDQotICAgICAgICAJCXNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyOw0KLSNlbmRpZg0KLQkgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHZwX1ZvaWNlSTJzU3RvcCgpOw0KLQ0KLSAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkgd29yayBlbmQuXG4iKTsNCi0gICAgICAgIHpPc3NfUHJpbnRmKFNVQk1ETF9IQUwsIFBSSU5UX0xFVkVMX05PUk1BTCwgInZvaWNlIHZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkgd29yayBlbmQhXG4iKTsNCi0NCi0gICAgfQ0KLX0NCi0NCi0jaWZkZWYgIF9PU19UT1MNCi1zdGF0aWMgdm9pZCB2cF9yY3ZEdG1mVGhyZWFkKFNJTlQzMiBhcmd1KQ0KLXsNCi0JaW50IHJldCA9IDA7DQotDQotCXNfdnBTdGF0ZS5wTXNnLmFjdG9ySUQgPSBJQ1BfTVNHX0FDVE9SX0E5Ow0KLQlzX3ZwU3RhdGUucE1zZy5jaElEID0gRFRNRjsNCi0Jc192cFN0YXRlLnBNc2cuZmxhZyAmPSB+UlBNU0dfUkVBRF9QT0xMOw0KLQlzX3ZwU3RhdGUucE1zZy5idWYgPSBzX3ZwU3RhdGUucE1zZ0J1ZjsNCi0Jc192cFN0YXRlLnBNc2cubGVuID0gODsNCi0NCi0JcmV0ID0gekRydlJwTXNnX0NyZWF0ZUNoYW5uZWwoSUNQX01TR19BQ1RPUl9BOSwgRFRNRiwgMHgxMCk7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2UnBNc2dfQ3JlYXRlQ2hhbm5lbCByZXQgJWQiLCByZXQpOw0KLQl3aGlsZSAoMSkNCi0Jew0KLQkJcmV0ID0gekRydlJwTXNnX1JlYWQoJnNfdnBTdGF0ZS5wTXNnKTsNCi0JCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JTlVTRSkNCi0JCXsNCi0JCQlnX3ZvaWNlVmFyLm11dGVDb3VudCA9IDIwOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJtdXRlIik7DQotCQl9DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlJwTXNnX1JlYWQgcmV0ICVkIiwgcmV0KTsNCi0JfQ0KLX0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX09TX0xJTlVYDQotVk9JRCAgekRydlZwX1NldER0bWZNdXRlX1dyYXAoVk9JRCkNCi17DQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JTlVTRSkNCi0Jew0KLQkJZ192b2ljZVZhci5tdXRlQ291bnQgPSAyMDsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJkdG1mIG11dGVcbiIpOw0KLQl9DQotfQ0KLSNlbmRpZg0KLQ0KLVNJTlQzMiB2cF9DcmVhdGVUaHJlYWRTZW1hcGgoVk9JRCkNCi17DQotCXNfdnBTdGF0ZS52cFNlbWFwaG9yZSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJWcEkyc1JlYWRXcml0ZVNlbWFwaG9yZSIsIDApOw0KLSNpZmRlZiBfVVNFX1dFQlJUQ19BVUQNCi0Jc192cFN0YXRlLnZwVGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkiLCB2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5LCAwLCA4MTkyLCAxNSwgMCwgMSk7DQotI2Vsc2UNCi0Jc192cFN0YXRlLnZwVGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoInZwX0RhdGFQcm9jZXNzVGhyZWFkRW50cnkiLCB2cF9EYXRhUHJvY2Vzc1RocmVhZEVudHJ5LCAwLCAxMDI0LCAxNSwgMCwgMSk7DQotI2VuZGlmDQotDQotI2lmZGVmICBfT1NfVE9TDQotDQotDQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjID09IDEpDQotCXsNCi0JCXNfdnBTdGF0ZS5yY3ZEdG1mVGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoInZwX3JjdkR0bWZUaHJlYWQiLCB2cF9yY3ZEdG1mVGhyZWFkLCAwLCAxMDI0LCAxMCwgMCwgMSk7DQotCQlpZiAoTlVMTCA9PSBzX3ZwU3RhdGUucmN2RHRtZlRocmVhZCkNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIHZwIFRocmVhZCBzX3ZwU3RhdGUucmN2RHRtZlRocmVhZCBlcnIgXHJcbiIpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCX0NCi0jZW5kaWYNCi0NCi0JaWYgKChOVUxMID09IHNfdnBTdGF0ZS52cFRocmVhZCkgfHwgKE5VTEwgPT0gc192cFN0YXRlLnZwU2VtYXBob3JlKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImNyZWF0ZSB2cCBUaHJlYWQgc2VtIGVyciBzX3ZwU3RhdGUudnBUaHJlYWQ9JXAsc192cFN0YXRlLnZwU2VtYXBob3JlPSVwICFcclxuIiwgc192cFN0YXRlLnZwVGhyZWFkLCBzX3ZwU3RhdGUudnBTZW1hcGhvcmUpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLSNpZmRlZiBDT05GSUdfVk9JQ0VfQlVGRkVSX0RSViAgCQ0KLS8vCWluaXRfY29tcGxldGlvbigmc192b2ljZV9jb21wbGV0aW9uKTsNCi0Jc192b2ljZVJkU2VtYSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJ2b2ljZV9yeF9zZW0iLCAwKTsNCi0JaWYoTlVMTCA9PSBzX3ZvaWNlUmRTZW1hKSB7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIHZvaWNlX3J4X3NlbSBlcnIgXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0Jc192b2ljZVdyU2VtYSAgPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgidm9pY2VfdHhfc2VtIiwgMCk7DQotCWlmKE5VTEwgPT0gc192b2ljZVdyU2VtYSkgew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImNyZWF0ZSB2b2ljZV90eF9zZW0gZXJyIFxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotCQ0KLQkgc192b2ljZVRpbWVySWQgID0gek9zc19DcmVhdGVUaW1lcigidm9pY2VfZnJhbWVUaW1lciIsIHZvaWNlVGltZXJDYWxsQmFjaywgMCwgVFJVRSk7DQotCSB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAic192b2ljZVRpbWVySWQ9JXBcbiIsIHNfdm9pY2VUaW1lcklkKTsNCi0JaWYoIXNfdm9pY2VUaW1lcklkKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidm9pY2VfZnJhbWVUaW1lciAgZmFpbGVkXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0jaWZkZWYgX1ZCVUZGX0lOX01VTFRJX0NPUkUNCi0JCVNJTlQzMiByZXQgPSAwOw0KLQ0KLQkJLy9yZXQgPSB6RHJ2UnBNc2dfQ3JlYXRlQ2hhbm5lbChJUENfTVNHX0FDVE9SX0E5LGNoYW5uZWxfNDEsMHgxMCk7DQotCQlyZXQgPSB6RHJ2UnBNc2dfQ3JlYXRlQ2hhbm5lbF9DYXAoUlBNU0dfQ0FQX0lELGNoYW5uZWxfNDEsMHgxMCk7DQotDQotCQlpZihEUlZfU1VDQ0VTUyAhPSByZXQpIHsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiY3JlYXRlIHJwbXNnIGVyciglZCkgXG4iLHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0JCQ0KLQkJdm9sYXRpbGUgVF9aRHJ2UnBNc2dfTXNnIGljcF9wTXNnID0gezB9OyANCi0JCXZvbGF0aWxlIHVuc2lnbmVkIGludCBycE1zZ0J1ZlsyXSA9IHswLDB9OyANCi0JCS8vcHJpbnRrKCAidmlyX2J1ZjE6MHgleCwgdmlyX2J1ZjI6MHgleCwgcGh5X2J1ZjE6MHgleCwgcGh5X2J1ZjI6MHgleCxcbiIsdm9pY2VfYnVmZlswXSx2b2ljZV9idWZmWzFdLHJwTXNnQnVmWzBdLHJwTXNnQnVmWzFdKTsNCi0JCWljcF9wTXNnLmFjdG9ySUQgPSBSUE1TR19DQVBfSUQ7DQotCQlpY3BfcE1zZy5jaElEID0gY2hhbm5lbF80MTsNCi0JCWljcF9wTXNnLmZsYWcgJj0gflJQTVNHX1JFQURfUE9MTDsNCi0JCWljcF9wTXNnLmJ1ZiA9IHJwTXNnQnVmOw0KLQkJaWNwX3BNc2cubGVuID0gODsNCi0JCXJldCA9IHpEcnZScE1zZ19SZWFkX0NhcCgmaWNwX3BNc2cpOw0KLQkJaWYocmV0IDw9IDApew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZSBidWZmZXIgIHJwbXNnIGFkZHIgcmVhZCAgZmFpbCxyZXQ9JWQgXG4iLHJldCk7DQotCQkJek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAicHMgdm9pY2UgYnVmZmVyICBycG1zZyBhZGRyIHJlYWQgIGZhaWwscmV0PSVkIFxuIixyZXQpOw0KLQkJCQ0KLQ0KLQkJfQ0KLQkJZWxzZXsNCi0JCQkjaWYgMA0KLQ0KLQkJCXZvaWNlX2J1ZmZbVVBfTElOS10gPSAoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyICopKHJwTXNnQnVmWzBdKTsNCi0JCQl2b2ljZV9idWZmW0RPV05fTElOS10gPSAoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyICopKHJwTXNnQnVmWzFdKTsJDQotCQkJI2Vsc2UNCi0NCi0JCQl2b2ljZV9idWZmW1VQX0xJTktdID0gKHN0cnVjdCB2b2ljZV9yaW5nX2J1ZmZlciAqKWlvcmVtYXBfd2MocnBNc2dCdWZbMF0sIChzaXplb2Yoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyKSArIE1BWF9CVUZfU0laRSpNQVhfQlVGX05VTSkpOw0KLQkJCXZvaWNlX2J1ZmZbRE9XTl9MSU5LXSA9IChzdHJ1Y3Qgdm9pY2VfcmluZ19idWZmZXIgKilpb3JlbWFwX3djKHJwTXNnQnVmWzFdLChzaXplb2Yoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyKSArIE1BWF9CVUZfU0laRSpNQVhfQlVGX05VTSkpOwkNCi0JCQkjZW5kaWYNCi0JDQotCQkJek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAicHMgcnBtc2cgdm9pY2UgYnVmZmVyIGFkZHIsdXAgdmlyIGJ1Zj0weCV4LCAgZG93biB2aXIgYnVmPTB4JXggLHVwIHBoeSBidWY9MHgleCwgIGRvd24gcGh5IGJ1Zj0weCV4LHNpemU9JWQgXG4iIFwNCi0JCQksdm9pY2VfYnVmZlswXSx2b2ljZV9idWZmWzFdLHJwTXNnQnVmWzBdLHJwTXNnQnVmWzFdLChzaXplb2Yoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyKSArIE1BWF9CVUZfU0laRSpNQVhfQlVGX05VTSkpOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2b2ljZSBidWZmZXIgYWRkcix1cCB2aXIgYnVmPTB4JXgsICBkb3duIHZpciBidWY9MHgleCAsdXAgcGh5IGJ1Zj0weCV4LCAgZG93biBwaHkgYnVmPTB4JXgsc2l6ZT0lZCBcbiIgXA0KLQkJCQksdm9pY2VfYnVmZlswXSx2b2ljZV9idWZmWzFdLHJwTXNnQnVmWzBdLHJwTXNnQnVmWzFdLChzaXplb2Yoc3RydWN0IHZvaWNlX3JpbmdfYnVmZmVyKSArIE1BWF9CVUZfU0laRSpNQVhfQlVGX05VTSkpOw0KLQkJfQ0KLSNlbmRpZg0KLSNlbmRpZg0KLQkNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0NyZWF0ZVRocmVhZFNlbWFwaCBzdWNjZXNzLiBcclxuIik7DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotU0lOVDMyIHZwX0NyZWF0ZUxvb3BUaHJlYWRTZW1hcGgoVk9JRCkNCi17DQotCXNfdnBTdGF0ZS52cExvb3BTZW1hcGhvcmUgPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiVnBMb29wU2VtYXBob3JlIiwgMCk7DQotI2lmZGVmIF9VU0VfV0VCUlRDX0FVRC8v6K+l5a6P5o6n5Yi2Vm9pY2VQcm9jX1R4UHJvY2Vzc+WHveaVsOiwg+eUqHdlYnJ0Y+eahOS6keWQjuWkhOeQhu+8jOatpOaXtuWIm+W7uue6v+eoi+aXtuW6lOiuvuS4ujhL77yM5ZCm5YiZ5qCI5rqi5Ye6DQotCXNfdnBTdGF0ZS52cExvb3BUaHJlYWQgPSB6T3NzX0NyZWF0ZVRocmVhZCgiVnBMb29wVGhyZWFkIiwgdnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeSwgMCwgODE5MiwgMTYsIDAsIDEpOw0KLSNlbHNlDQotICAgIHNfdnBTdGF0ZS52cExvb3BUaHJlYWQgPSB6T3NzX0NyZWF0ZVRocmVhZCgiVnBMb29wVGhyZWFkIiwgdnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeSwgMCwgMTAyNCwgMTYsIDAsIDEpOw0KLSNlbmRpZg0KLQ0KLQlpZiAoKE5VTEwgPT0gc192cFN0YXRlLnZwTG9vcFRocmVhZCkgfHwgKE5VTEwgPT0gc192cFN0YXRlLnZwTG9vcFNlbWFwaG9yZSkpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJjcmVhdGUgdnAgTG9vcCBUaHJlYWQgc2VtIGVyciBcclxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DcmVhdGVMb29wVGhyZWFkU2VtYXBoIHN1Y2Nlc3MuIFxyXG4iKTsNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0luaXQoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotICAgIGdfdm9pY2VWYXIudm9pY2VfbnZfdXBkYXRlID0gMTsNCi0gICAgDQotCXJldCA9IFZvaWNlUHJvY19Jbml0TnZQYXJhbSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQlyZXR1cm4gWk9TU19FUlJPUjsNCi0JfQ0KLQ0KLQlyZXQgPSB2cF9DcmVhdGVUaHJlYWRTZW1hcGgoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJcmV0dXJuIFpPU1NfRVJST1I7DQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Jbml0IGNyZWF0ZSBzdWNjZXNzLlxuIik7DQotI2lmZGVmIEVDQUxMX1NVUFBPUlQJDQotCWlmKGdfdm9pY2VWYXIuYXVkaW9fY3RybEZsYWcuaXNVc2VFY2FsbCA9PSAxKQ0KLQl7DQotICAgIAlyZXQgPSBlY2FsbF9Jbml0KCk7CQ0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQlyZXR1cm4gWk9TU19FUlJPUjsNCi0JCX0NCi0JfQ0KLSNlbmRpZg0KLQl2b2ljZV9Jbml0Q29kZWMoKTsNCi0NCi0JcmV0ID0gdm9pY2VfQ3JlYXRlUmNkU2VtQW5kVGhyZWFkKCk7DQotDQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXJldHVybiBaT1NTX0VSUk9SOw0KLQl9DQotDQotCXJldCA9IHZwX0NyZWF0ZUxvb3BUaHJlYWRTZW1hcGgoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJcmV0dXJuIFpPU1NfRVJST1I7DQotCX0NCi0JcmV0ID0gekRydl9Jbml0KCk7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX19Jbml0IGVycm9yLlxuIik7DQotCQlyZXR1cm4gWk9TU19FUlJPUjsNCi0JfQ0KLQ0KLQl2cF9TZXRUb3BDb25maWcoKTsNCi0JLy92cF9TZXRUb3BJMnNDb25maWcoKTsNCi0NCi0JaWYgKGdfdm9pY2VWYXIuaXNVc2VTbGljQ29kZWMgPT0gMSkNCi0Jew0KLQkJLy9hZGRlZCBieSB6aGFuZ2xpeGlhDQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fT3BlbihUUkFOU19ETUFfTU9ERSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfSW5pdCByZXQ9JWQgekRydkkyU19PcGVuKEkyU18xLFRSQU5TX0RNQV9NT0RFKSBcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0NCi0jaWYgMA0KLQkJaWYgKHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmcgPT0gTlVMTCkNCi0JCXsNCi0JCQlzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnID0gJnNfVnBFeHRJMnNDZmc7DQotCQl9DQotDQotCQlpZiAoc19wVnBJMnMxQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKQ0KLQkJew0KLQkJCXNfVnBFeHRJMnNwYXJhbWV0ZXIuYnVmZmVyc2l6ZSA9IChzX3BWcEkyczFDZmctPnRQY21TbG90TnVtICsgMSkgKiBWUF9JMlNfQlVGRkVSX1NJWkU7DQotCQl9DQotI2VuZGlmDQotDQotCQlpZiAoc192cFN0YXRlLnBWcEV4dEkyc0NmZyAhPSBOVUxMIHx8IHNfdnBTdGF0ZS5zX3BWcFRkbUNmZyAhPSBOVUxMKQ0KLQkJew0KLQkJCS8vcmV0ICs9IHRkbV9jbGtDb25maWd1cmUoc192cFN0YXRlLnNfcFZwVGRtQ2ZnKTsNCi0JCQlyZXQgKz0gekRydkV4dEF1ZGlvX1JlYWRfUHJlcGFyZShzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnICwgc192cFN0YXRlLnNfcFZwVGRtQ2ZnKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJLy8gekRydkkyU19SZWFkX1N0b3AoSTJTXzIpOw0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgekRydkkyU19SZWFkX1ByZXBhcmUgZXJyIFxuIik7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotCQkJfQ0KLQkJCXJldCArPSB6RHJ2RXh0QXVkaW9fV3JpdGVfUHJlcGFyZShzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnICwgc192cFN0YXRlLnNfcFZwVGRtQ2ZnKTsNCi0JCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJCXsNCi0JCQkJLy8gekRydkkyU19SZWFkX1N0b3AoSTJTXzIpOw0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgekRydkkyU19Xcml0ZV9QcmVwYXJlIGVyciBcbiIpOw0KLQkJCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJCX0NCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgc192cFN0YXRlLnBWcEV4dEkyc0NmZyBpcyBOVUxMIFxuIik7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCX0NCi0NCi0JfQ0KLSNpZm5kZWYgX1VTRV9BVURJT19PTl83NTEwDQotCXJldCA9IHpEcnZWb2ljZV9Jbml0aWF0ZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgekRydlZvaWNlX0luaXRpYXRlICBmYWlsIHJldD0lZCFcbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotCXJldCA9IHpEcnZWb2x0ZV9Jbml0aWF0ZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0luaXQgIHpEcnZWb2x0ZV9Jbml0aWF0ZSBmYWlsIHJldD0lZCFcbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfSW5pdCB6RHJ2Vm9sdGVfSW5pdGlhdGUgZW5kIFxuIik7DQotDQotCXJldHVybiBaT1NTX1NVQ0NFU1M7DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogRnVuY3Rpb246IHpEcnZWcF9TZXRFeHRJMnNDZmcNCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB2b2ljZSBwcm9jZXNzIGJ1ZmZlcnMuDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Ok5vbmUNCi0gKiAgIE91dHB1dDpOb25lDQotICoNCi0gKiBSZXR1cm5zOiBzdWNjZXNzIG9yIGVycm9yIGNvZGUNCi0gKg0KLSAqDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekRydlZwX1NldEV4dEF1ZGlvQ2ZnKFRfWkRydkkyU19DZmcgKnBJMnNOYkNmZywgVF9aRHJ2STJTX0NmZyAqcEkyc1diQ2ZnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9aRHJ2VGRtX0NmZyAqcFRkbU5iQ2ZnLCBUX1pEcnZUZG1fQ2ZnICpwVGRtV2JDZmcpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEV4dENmZyEiKTsNCi0JLy9pZihnX3ZvaWNlVmFyLmdfaXNVc2VUZG0gIT0gMSkNCi0Jew0KLQkJc192cFN0YXRlLnBWcEV4dEkyc0NmZyAgPSBwSTJzTmJDZmc7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEV4dENmZyAgc192cFN0YXRlLnBWcEV4dEkyc0NmZyA9MHglcCFcclxuIiwgc192cFN0YXRlLnBWcEV4dEkyc0NmZyk7DQotCQlzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmcgPSBwSTJzV2JDZmc7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEV4dENmZyAgc192cFN0YXRlLnBWcEV4dEkyc1diQ2ZnID0gMHglcCFcclxuIiwgc192cFN0YXRlLnBWcEV4dEkyc1diQ2ZnKTsNCi0JfQ0KLQkvL2Vsc2UgaWYoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXNfdnBTdGF0ZS5zX3BWcFRkbUNmZyA9IHBUZG1OYkNmZzsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0RXh0Q2ZnICBzX3BWcFRkbUNmZyA9MHglcCFcclxuIiwgc192cFN0YXRlLnNfcFZwVGRtQ2ZnKTsNCi0JCXNfdnBTdGF0ZS5zX3BWcFRkbVdiQ2ZnID0gcFRkbVdiQ2ZnOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRFeHRDZmcgIHNfcFZwVGRtV2JDZmcgPSAweCVwIVxyXG4iLCBzX3ZwU3RhdGUuc19wVnBUZG1XYkNmZyk7DQotCX0NCi0JcmV0dXJuIHJldDsNCi19DQotU0lOVDMyIHpEcnZWcF9TZXRFeHRJMnNDZmcoVF9aRHJ2STJTX0NmZyAqcEkyc05iQ2ZnLCBUX1pEcnZJMlNfQ2ZnICpwSTJzV2JDZmcpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEV4dEkyc0NmZyEiKTsNCi0NCi0Jc192cFN0YXRlLnBWcEV4dEkyc0NmZyA9IHBJMnNOYkNmZzsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRFeHRJMnNDZmcgIHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmcgPTB4JXAhIFxyXG4iLCBzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnKTsNCi0Jc192cFN0YXRlLnBWcEV4dEkyc1diQ2ZnID0gcEkyc1diQ2ZnOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEV4dEkyc0NmZyAgc192cFN0YXRlLnBWcEV4dEkyc1diQ2ZnICA9IDB4JXAhIFxyXG4iLCBzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmcpOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jaWYgMA0KLS8vb2Jzb2xldGUNCi1TSU5UMzIgekRydlZvbHRlX1NldEkyc0NmZyhUX1pEcnZJMlNfQ2ZnICpwSTJzQ2ZnKQ0KLXsNCi0JekRydlZwX1NldEV4dEkyc0NmZyhwSTJzQ2ZnLCBOVUxMKTsNCi0JcmV0dXJuIDA7Ly94aXUgZ2FpIGNodSB0aWFuIGppYSByZXR1cm4gMA0KLX0NCi0vL29ic29sZXRlDQotU0lOVDMyIHpEcnZWcF9TZXRJMnNDZmcoVF9aRHJ2STJTX0NmZyAqcEkyc0NmZykNCi17DQotCXpEcnZWcF9TZXRFeHRJMnNDZmcocEkyc0NmZywgTlVMTCk7DQotCXJldHVybiAwOy8veGl1IGdhaSBjaHUgdGlhbiBqaWEgcmV0dXJuIDANCi19DQotI2VuZGlmDQotLy9jb25uZWN0IHRvIHRlYWtsaXQNCi1TSU5UMzIgekRydlZwX1NldElubmVySTJzQ2ZnKFRfWkRydkkyU19DZmcgKnBJMnNDZmcpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldElubmVySTJzQ2ZnIVxuIik7DQotCWlmIChwSTJzQ2ZnID09IE5VTEwpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0SW5uZXJJMnNDZmcgZXJyb3I6IHBJMnNDZmcgPT0gTlVMTFxuIik7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotCXNfdnBTdGF0ZS5wVnBJbm5lckkyc0NmZyA9IHBJMnNDZmc7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfU2V0SW5uZXJJMnNDZmcgIHNfdnBTdGF0ZS5wVnBJbm5lckkyc0NmZyA9JXAhIFxyXG4iLCBzX3ZwU3RhdGUucFZwSW5uZXJJMnNDZmcpOw0KLQlpZiAoc192cFN0YXRlLnBWcElubmVySTJzQ2ZnLT5iTWFzdGVyID09IFRSVUUpDQotCXsNCi0JCWdfdm9pY2VWYXIuaW5uZXJJMnNJc01hc3RlciA9IFRSVUU7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldElubmVySTJzQ2ZnIElubmVyQXJtSTJzIGlzIG1hdGVyXG4iKTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWdfdm9pY2VWYXIuaW5uZXJJMnNJc01hc3RlciA9IEZBTFNFOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRJbm5lckkyc0NmZyBJbm5lckFybUkycyBpcyBzbGF2ZVxuIik7DQotDQotCX0NCi0NCi0JaWYgKHNfdnBTdGF0ZS5wVnBJbm5lckkyc0NmZy0+dENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkNCi0Jew0KLQkJZ192b2ljZVZhci5pbm5lckkyc0lzSTJzTW9kZSA9IFRSVUU7DQotI2lmIFBTX1JBVF9HU00NCi0JCXpEcnZBdWRfRHNwU2V0QXVkU2V0dGluZyhUUlVFKTsNCi0jZW5kaWYNCi0JfQ0KLQllbHNlDQotCXsNCi0JCWdfdm9pY2VWYXIuaW5uZXJJMnNJc0kyc01vZGUgPSBGQUxTRTsNCi0jaWYgUFNfUkFUX0dTTQ0KLQkJekRydkF1ZF9Ec3BTZXRBdWRTZXR0aW5nKEZBTFNFKTsNCi0jZW5kaWYNCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0Ow0KLQ0KLX0NCi0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIEZ1bmN0aW9uOiB6RHJ2Vm9pY2VDb25maWdfU2V0VnBCdWZmZXINCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNldCB2b2ljZSBwcm9jZXNzIGJ1ZmZlcnMuDQotICogUGFyYW1ldGVyczoNCi0gKiAgIElucHV0Ok5vbmUNCi0gKiAgIE91dHB1dDpOb25lDQotICoNCi0gKiBSZXR1cm5zOiBzdWNjZXNzIG9yIGVycm9yIGNvZGUNCi0gKg0KLSAqDQotICogT3RoZXJzOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1TSU5UMzIgekRydlZwX1NldEluT3V0QnVmZmVyQWRkU2l6ZShUX1pEcnZfVnBJbk91dEJ1ZmZlciAqcEluT3V0QnVmZmVyLCBVSU5UMzIgIGJ1ZlNpemUpDQotew0KLQkvL1NJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7Ly94aXUgZ2FpIGNodQ0KLQ0KLQlpZiAocEluT3V0QnVmZmVyID09IE5VTEwpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfU2V0VnBCdWZmZXIgZXJyb3I6IHBJbk91dEJ1ZmZlcj09IE5VTEwiKTsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JaWYgKChwSW5PdXRCdWZmZXItPnBfdm9pY2VSeEluQnVmZmVyID09IE5VTEwpIHx8IChwSW5PdXRCdWZmZXItPnBfdm9pY2VSeE91dFB1dEJ1ZmZlciA9PSBOVUxMKSB8fCAocEluT3V0QnVmZmVyLT5wX3ZvaWNlVHhJbkJ1ZmZlciA9PSBOVUxMKSB8fCAocEluT3V0QnVmZmVyLT5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIgPT0gTlVMTCkpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfU2V0VnBCdWZmZXIgZXJyb3I6IEJ1ZmZlcj09IE5VTEwiKTsNCi0JCXJldHVybiBEUlZfRVJSX01FTV9BTExPQzsNCi0JfQ0KLQ0KLQlzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlciA9IHBJbk91dEJ1ZmZlci0+cF92b2ljZVJ4SW5CdWZmZXI7Ly9zaXplID49MC41TQ0KLQlzX3ZwU3RhdGUucFZwVHhJbkJ1ZmZlciA9IHBJbk91dEJ1ZmZlci0+cF92b2ljZVR4SW5CdWZmZXIgOy8vc2l6ZSA+PTAuNU0NCi0Jc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyID0gcEluT3V0QnVmZmVyLT5wX3ZvaWNlUnhPdXRQdXRCdWZmZXI7Ly9zaXplID02NDANCi0Jc192cFN0YXRlLnBWcFR4T3V0UHV0QnVmZmVyID0gcEluT3V0QnVmZmVyLT5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIgOy8vc2l6ZSA+PTAuNU0NCi0Jc192cFN0YXRlLmluT3V0QnVmU2l6ZSA9IGJ1ZlNpemU7DQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2Vm9pY2VDb25maWdfU2V0VnBCdWZmZXIgc3VjY2VzcyEiKTsNCi0NCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLQ0KLX0NCi0NCi0jaWYgMA0KLS8vb2Jzb2xldGUNCi1TSU5UMzIgekRydlZwX1NldEluT3V0QnVmZmVyKFRfWkRydl9WcEluT3V0QnVmZmVyICpwSW5PdXRCdWZmZXIpDQotew0KLQl6RHJ2VnBfU2V0SW5PdXRCdWZmZXJBZGRTaXplKHBJbk91dEJ1ZmZlciwgNTI0Mjg4KTsNCi0JcmV0dXJuIDA7Ly94aXUgZ2FpIGNodSB0aWFuIGppYSByZXR1cm4gMA0KLX0NCi0vL29ic29sZXRlDQotU0lOVDMyIHpEcnZWb2x0ZV9TZXRJbk91dEJ1ZmZlcihUX1pEcnZfVnBJbk91dEJ1ZmZlciAqcEluT3V0QnVmZmVyKQ0KLXsNCi0JekRydlZwX1NldEluT3V0QnVmZmVyQWRkU2l6ZShwSW5PdXRCdWZmZXIsIDUyNDI4OCk7DQotLy9JdCBpcyB1c2VkIGZvciB4aW5rZSB0byBzZXQgdGVhayB2b2ljZSBnYWluIHdoZW4gb3BlbiAgbHZ3ZW5odWEgMjAxNTA3MDkNCi0JcmV0dXJuIDA7Ly94aXUgZ2FpIGNodSB0aWFuIGppYSByZXR1cm4gMA0KLX0NCi1TSU5UMzIgekRydlZwX1NldEdhaW4oU0lOVDMyIHZnYWluLCBVSU5UMzIgY2hhbm5lbCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCWlmICgodmdhaW4gPCAtMjUpIHx8ICh2Z2FpbiA+IDEwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9TZXRHYWluIHZnYWluIGludmFsaWQgLHZnYWluPSVkIVxuIiwgdmdhaW4pOw0KLQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JfQ0KLQlpZiAoKGNoYW5uZWwgPCAwKSB8fCAoY2hhbm5lbCA+IDEpKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEdhaW4gY2hhbm5lbCBpbnZhbGlkICxjaGFubmVsPSVkIVxuIiwgY2hhbm5lbCk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQ0KLQl9DQotDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JRExFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1NldEdhaW46IHZwc3RhdHVzIG5vdCBzdXBwb3J0IHRvIHNldCBnYWluICAhXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlyZXQgPSBWb2ljZVByb2NfU2V0R2Fpbih2Z2FpbiwgY2hhbm5lbCwgZ192b2ljZVZhci52cFBhdGgpOw0KLQl9DQotCXJldHVybiByZXQ7DQotDQotDQotfQ0KLSNlbmRpZg0KLQ0KLVNJTlQzMiB6RHJ2VnBfU2V0SW5pdEdhaW4oVUlOVDggdmFsdWUpDQotew0KLQlpZiAodmFsdWUgPiAxMDApDQotCXsNCi0JCXJldHVybiBEUlZfRVJSX0lOVkFMSURfUEFSQU07DQotCX0NCi0NCi0JZ192b2ljZVZhci52cEluaXRHYWluID0gdmFsdWU7DQotCXJldHVybiBaT1NTX1NVQ0NFU1M7DQotfQ0KLQ0KLSNpZmRlZiBfVVNFX1ZPSUNFX1JDRA0KLVNJTlQzMiB6RHJ2VnBfUmNkT25PZmYoVUlOVDMyIG9uKQ0KLXsNCi0JU0lOVDMyICByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JVF9aRHJ2UmNkX0luZm9QYXJhbSBQYXJhbSA9IHtSRUNPUkRfREFUQV9GT1JNQVRfQU1SLCAzMiwgVk9JQ0VfUkVDT1JEX1VQTElOS19BTkRfRE9XTkxJTkt9Ow0KLQ0KLQlpZiAoMCA9PSBvbikNCi0Jew0KLQkJcmV0ID0gdm9pY2VfUmNkU3RvcCgpOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZvaWNlX1JjZFN0b3AgcmV0PSVkIVxuIiwgcmV0KTsNCi0JfQ0KLQllbHNlIGlmICgxID09IG9uKQ0KLQl7DQotCQlyZXQgPSB2b2ljZV9SY2RTdGFydCgmUGFyYW0pOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZvaWNlX1JjZFN0YXJ0IHJldD0lZCFcbiIsIHJldCk7DQotCX0NCi0JZWxzZQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1JjZE9uT2ZmIHBhcmEgZXJyb3IhXG4iKTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotDQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SY2RPbk9mZiBvbj0lZCxyZXQ9JWQhIiwgb24sIHJldCk7DQotCXJldHVybiByZXQ7DQotDQotfQ0KLSNlbmRpZg0KLSNpZmRlZiBfVVNFX0RUTUZfVE9ORQ0KLQ0KLVNJTlQzMiB6RHJ2VnBfRHRtZlRvbmUoVUlOVDMyIE51bSkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCWlmICgoTnVtID4gMTEpIHx8IChOdW0gPCAwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9EdG1mVG9uZSBpbnZhbGlkIE51bT0lZCFcbiIsIE51bSk7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzICE9IFZQX0kyU19JTlVTRSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9EdG1mVG9uZSBjYW5ub3QgY2FsbCFcbiIpOw0KLQkJcmV0dXJuIAlEUlZfRVJSX05PVF9TVVBQT1JURUQ7DQotCX0NCi0NCi0JLy8gcmV0ID0gekRydl9EdG1mVG9uZVN0YXJ0KCBOdW0pOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0jZW5kaWYNCi1zdGF0aWMgVk9JRCAgdnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeShTSU5UMzIgYXJndSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0NCi0JVUlOVDggKnJlYWRfYnVmID0gTlVMTDsNCi0JVUlOVDggKndyaXRlX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiByZWFkX2xlbiA9IDA7DQotCVVJTlQzMiB3cml0ZV9sZW4gPSAwOw0KLQ0KLQkvL1VJTlQzMiBsb29wX3BvaW50ID0gMDsvL3hpdSBnYWkgY2h1DQotCVVJTlQzMiBsb29wQ291bnQgPSBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplIC0gMzIwOw0KLQ0KLSNpZmRlZiBURVNUX1dISVRFX05PSVNFDQotCVVJTlQzMiB0ZW1wTG9vcENvdW50ID0gMDsNCi0JVUlOVDggKnBWb2ljZUxvb3BUZW1wQnVmID0gTlVMTDsNCi0NCi0jZW5kaWYNCi0JVUlOVDMyIGkgPSAwOw0KLQ0KLQl6T3NzX01lbXNldChzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlciwgMCwgc192cFN0YXRlLmluT3V0QnVmU2l6ZSk7DQotCXpPc3NfTWVtc2V0KHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyLCAwLCBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplKTsNCi0Jek9zc19NZW1zZXQoc192cFN0YXRlLnBWcFR4T3V0UHV0QnVmZmVyLCAwLCBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplKTsNCi0jaWZkZWYgX1VTRV9WUF9PVVRQVVRfUlhPVVRfREFUQQ0KLSAgICAgICAgek9zc19NZW1zZXQoc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyLCAwLCBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplKTsNCi0jZWxzZQ0KLQkJek9zc19NZW1zZXQoc192cFN0YXRlLnBWcFJ4T3V0UHV0QnVmZmVyLCAwLCA2NDApOw0KLSNlbmRpZg0KLQ0KLQkvKg0KLQkgICAgIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhJbkJ1ZmZlcjsNCi0JICAgICBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyID0gc192cFN0YXRlLnBWcFR4SW5CdWZmZXI7DQotCSAgICAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwUnhPdXRQdXRCdWZmZXI7DQotCSAgICAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIgPSBzX3ZwU3RhdGUucFZwVHhPdXRQdXRCdWZmZXI7DQotCSovDQotDQotCXdoaWxlICgxKQ0KLQl7DQotCSAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAgIiVzOiB3YWl0IHZwTG9vcFNlbWFwaG9yZSFcbiIsX19GVU5DVElPTl9fKTsNCi0JCXpPc3NfR2V0U2VtYXBob3JlKHNfdnBTdGF0ZS52cExvb3BTZW1hcGhvcmUsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0JICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICAiJXM6IGdldCB2cExvb3BTZW1hcGhvcmUsIHN0YXJ0IGxvb3AhXG4iLF9fRlVOQ1RJT05fXyk7DQotCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyID0gc192cFN0YXRlLnBWcFJ4SW5CdWZmZXI7DQotCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyID0gc192cFN0YXRlLnBWcFR4SW5CdWZmZXI7DQotCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlcjsNCi0JCXNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFR4T3V0UHV0QnVmZmVyOw0KLQkJek9zc19NZW1zZXQoc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIDAsIDY0MCk7DQotDQotCQlzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPSAwOw0KLSNpZmRlZiBURVNUX1dISVRFX05PSVNFDQotCQlwVm9pY2VMb29wVGVtcEJ1ZiA9IHNfdm9pY2VUZW1wQnVmZmVyOy8vZm9yIHRlc3QNCi0JCS8vICAgIHBWb2ljZUxvb3BJblNhdmVCdWZmZXIgPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXI7DQotCQkvLyAgcFZvaWNlTG9vcE91dFNhdmVCdWZmZXIgPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcjsNCi0jZW5kaWYNCi0jaWYgMA0KLSAgICAgICAgaWYgKEZBTFNFID09IGdfdm9pY2VWYXIuZmlyc3RSZWdaQ0FURmxhZykgew0KLSAgICAgICAgICAgIHJldCA9IHpDYXRBZ3RfQXVkaW9fUmVnKDEwLFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSwoVUlOVDMyKXZwSW5PdXRCdWZmZXIucF92b2ljZVJ4SW5CdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IFJYSU4gcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTIsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0xvb3BQcm9jZXNzVGhyZWFkRW50cnkgVFhJTiByZWdpc3RlciB6Q2F0QWd0X0F1ZGlvX1JlZyBlcnJcbiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgIAkJcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTMsVlBfSU5PVVRfQkFLX0JVRkZFUl9TSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlVHhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IFRYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSNpZmRlZiBfVVNFX1ZQX09VVFBVVF9SWE9VVF9EQVRBDQotICAgIAkJcmV0ID0gekNhdEFndF9BdWRpb19SZWcoMTEsIFZQX0lOT1VUX0JBS19CVUZGRVJfU0laRSwgKFVJTlQzMil2cEluT3V0QnVmZmVyLnBfdm9pY2VSeE91dFB1dEJ1ZmZlcik7DQotICAgICAgICAgICAgaWYocmV0ICE9IERSVl9TVUNDRVNTKXsNCi0gICAgICAgICAgICAgICAgekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX0xvb3BQcm9jZXNzVGhyZWFkRW50cnkgUlhPVVQgcmVnaXN0ZXIgekNhdEFndF9BdWRpb19SZWcgZXJyXG4iKTsNCi0gICAgICAgICAgICB9DQotDQotI2Vsc2UNCi0gICAgCQlyZXQgPSB6Q2F0QWd0X0F1ZGlvX1JlZygxMSxWUF9JTk9VVF9OT0JBS19CVUZTSVpFLChVSU5UMzIpdnBJbk91dEJ1ZmZlci5wX3ZvaWNlUnhPdXRQdXRCdWZmZXIpOw0KLSAgICAgICAgICAgIGlmKHJldCAhPSBEUlZfU1VDQ0VTUyl7DQotICAgICAgICAgICAgICAgIHpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IFJYT1VUIHJlZ2lzdGVyIHpDYXRBZ3RfQXVkaW9fUmVnIGVyclxuIik7DQotICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLQ0KLSAgICAgICAgICAgIGdfdm9pY2VWYXIuZmlyc3RSZWdaQ0FURmxhZyA9IFRSVUU7ICAgDQotICAgICAgICB9DQotI2VuZGlmICAgICAgICANCi0JCXpPc3NfU2xlZXAoNTAwKTsNCi0JCXJldCA9IHpEcnZWcF9Mb29wU3RhcnREbygpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIGVyciEgXHJcbiIpOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wIHRocmVhZCBzdGFydCEgXHJcbiIpOw0KLQkJZ192b2ljZVZhci52cExvb3BCa1J1bm5pbmcgPSBUUlVFOwkJCQ0KLQ0KLQkJd2hpbGUgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPT0gVlBfTE9PUF9PTikNCi0JCXsNCi0JCQlyZXQgPSB6RHJ2RXh0QXVkaW9fUmVhZCgmcmVhZF9idWYsICZyZWFkX2xlbik7DQotCQkJaWYgKChyZXQgPT0gRFJWX1NVQ0NFU1MpICYmIChyZWFkX2J1ZiAhPSBOVUxMKSAmJiAocmVhZF9sZW4gIT0gMCkpDQotCQkJew0KLQkJCQlpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0JCQkJew0KLQkJCQkJZm9yIChpID0gMDsgaSA8IFZQX0kyU19CVUZGRVJfU0laRTspDQotCQkJCQl7DQotCQkJCQkJKiAoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciArIGkpID0gKiAocmVhZF9idWYgKyBpICogKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSArIDEpKTsNCi0JCQkJCQkqIChzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyICsgaSArIDEpID0gKiAocmVhZF9idWYgKyBpICogKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSArIDEpICsgMSk7DQotCQkJCQkJaSArPSAyOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJek9zc19NZW1jcHkoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgcmVhZF9idWYsIFZQX0kyU19CVUZGRVJfU0laRSk7DQotCQkJCX0NCi0NCi0NCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfUmVhZDpJMlMxOnJldD0lZCxyZWFkX2J1ZiA9ICVwLHJlYWRfbGVuID0gJWQuXG4iLCByZXQsIHJlYWRfYnVmLCByZWFkX2xlbik7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlyZXQgPSB6RHJ2RXh0QXVkaW9fRnJlZUJ1ZihyZWFkX2J1Zik7DQotDQotICAgICAgICAgICAgLy9kdG1m5qOA5rWLLeWbnueOr+S4iuihjOWGmeWFpQ0KLSAgICAgICAgICAgIGlmKGdfdm9pY2VWYXIudXNlRHRtZkxvb3AgPT0gMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldCA9IGR0bWZUeF9SaW5nV3JpdGUoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlcik7DQotICAgICAgICAgICAgICAgIC8vek9zc19QcmludGYoU1VCTURMX0hBTCwgUFJJTlRfTEVWRUxfTk9STUFMLCAidnBfTG9vcFByb2Nlc3NUaHJlYWRFbnRyeSBkdG1mVHhfUmluZ1dyaXRlIGVuZCwgcmV0PSVkXG4iLCByZXQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgek9zc19NZW1jcHkoKFZPSUQgKikoc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIpLCAoVk9JRCAqKSBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLCBWUF9JMlNfQlVGRkVSX1NJWkUpOw0KLQkJCQlzX3NwZWVjaFN0YXRlLnNhdmVMZW4gKz0gVlBfSTJTX0JVRkZFUl9TSVpFOw0KLQkJCQkvLwkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9sb29wUHJvY2Vzc1RocmVhZEVudHJ5ICBzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPSAlZFxuIiwgc19zcGVlY2hTdGF0ZS5zYXZlTGVuKTsNCi0JCQkJaWYgKHNfc3BlZWNoU3RhdGUuc2F2ZUxlbiA+PSBsb29wQ291bnQpDQotCQkJCXsNCi0JCQkJCXNfc3BlZWNoU3RhdGUuc2F2ZUxlbiA9IDA7DQotCQkJCX0NCi0JCQkJc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeEluQnVmZmVyICsgc19zcGVlY2hTdGF0ZS5zYXZlTGVuOw0KLQkJCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBUeE91dFB1dEJ1ZmZlciArIHNfc3BlZWNoU3RhdGUuc2F2ZUxlbjsNCi0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgDQotCQkJLyp2b2ljZSBwcm9jZXNzKi8NCi0JCQl7DQotDQotCQkJCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkNCi0JCQkJew0KLQ0KLQkJCQkJVm9pY2VQcm9jX1R4UHJvY2VzcygmIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsIE5VTEwsICYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCk7DQotDQotCQkJCQkvLyB6T3NzX01lbWNweShwQnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeE91dFB1dEJ1ZmZlcixWUF9GUkFNRV9CVUZGRVJfU0laRSk7DQotCQkJCQkvL3pPc3NfTWVtY3B5KHBCdWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyLHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUpOw0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJLy96T3NzX01lbWNweShwQnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyLFZQX0ZSQU1FX0JVRkZFUl9TSVpFKTsNCi0JCQkJCS8vek9zc19NZW1jcHkocEJ1Ziwgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlcixzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplKTsNCi0JCQkJCXpPc3NfTWVtY3B5KChWT0lEICopKHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyKSwgKFZPSUQgKikgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlciwgVlBfSTJTX0JVRkZFUl9TSVpFKTsNCi0NCi0NCi0JCQkJfQ0KLQ0KLQkJCQkvL25vIG54cCBsaWIgbHdlbmh1YSAyMDE1MDMxNw0KLQ0KLQkJCQkvLyAgIHpPc3NfTWVtY3B5KChWT0lEICopKCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFR4SW5CdWZmZXIsIDMyMCk7DQotCQkJfQ0KLSAgICAgICAgICAgIGlmKGdfdm9pY2VWYXIudXNlRHRtZkxvb3AgPT0gMSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0JCQl6T3NzX01lbWNweSgoVk9JRCAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyKSwgKFZPSUQgKikgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhPdXRQdXRCdWZmZXIsIFZQX0kyU19CVUZGRVJfU0laRSk7DQotDQotI2lmZGVmIFRFU1RfV0hJVEVfTk9JU0UNCi0JCQl6T3NzX01lbWNweShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyLCBwVm9pY2VMb29wVGVtcEJ1ZiwgVlBfSTJTX0JVRkZFUl9TSVpFKTsNCi0JCQlwVm9pY2VMb29wVGVtcEJ1ZiArPSBWUF9JMlNfQlVGRkVSX1NJWkU7DQotCQkJdGVtcExvb3BDb3VudCArPSBWUF9JMlNfQlVGRkVSX1NJWkU7DQotCQkJaWYgKHRlbXBMb29wQ291bnQgPj0gMHg0RTIwMCkNCi0JCQl7DQotCQkJCS8vMzA3MjAwDQotCQkJCXBWb2ljZUxvb3BUZW1wQnVmID0gc192b2ljZVRlbXBCdWZmZXI7DQotCQkJCXRlbXBMb29wQ291bnQgPSAwOw0KLQkJCX0NCi0NCi0jZW5kaWYNCi0NCi0JCQlyZXQgPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQkJCWlmICgocmV0ID09IERSVl9TVUNDRVNTKSAmJiAod3JpdGVfYnVmICE9IE5VTEwpICYmICh3cml0ZV9sZW4gIT0gMCkpDQotCQkJew0KLSNpZiAwDQotCQkJCWlmIChzX3NwZWVjaFN0YXRlLnNhdmVMZW4gKyAzMjAgPCA4MDAwKQ0KLQkJCQl7DQotCQkJCQlsb29wX3BvaW50ID0gIHNfc3BlZWNoU3RhdGUuc2F2ZUxlbiArIDMyMDsNCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCWxvb3BfcG9pbnQgPSAwOw0KLQkJCQl9DQotDQotCQkJCXB2b2ljZUludGVyQnVmZmVyID0gIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyICsgbG9vcF9wb2ludDsNCi0jZW5kaWYNCi0JCQkJaWYgKGdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9PSBUUlVFKQ0KLQkJCQl7DQotDQotCQkJCQkvL1ZvaWNlUHJvY19SeFByb2Nlc3MoJnB2b2ljZUludGVyQnVmZmVyLCAmd3JpdGVfYnVmLCBzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQpOw0KLQkJCQkJVm9pY2VQcm9jX1J4UHJvY2VzcygmIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsICYgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsIHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCk7DQotDQotCQkJCQkvL3pPc3NfTWVtY3B5KHdyaXRlX2J1Ziwgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhPdXRQdXRCdWZmZXIsd3JpdGVfbGVuKTsNCi0JCQkJCS8vcHZwUnhNaWRCdWZmZXI9IHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4T3V0UHV0QnVmZmVyOw0KLQkJCQl9DQotCQkJCWVsc2UNCi0JCQkJew0KLQkJCQkJLy96T3NzX01lbWNweSh3cml0ZV9idWYsIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsd3JpdGVfbGVuKTsNCi0JCQkJCS8vcFZwUnhNaWRCdWZmZXI9IHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXI7DQotCQkJCQl6T3NzX01lbWNweSgoVk9JRCAqKShzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciksIChWT0lEICopIHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIsIDMyMCk7DQotDQotCQkJCX0NCi0NCi0NCi0JCQkJLy9ubyBueHAgbGliIGx3ZW5odWEgMjAxNTAzMTcNCi0NCi0JCQkJLy8gek9zc19NZW1jcHkoKFZPSUQgKikod3JpdGVfYnVmKSwgKFZPSUQgKilwdm9pY2VJbnRlckJ1ZmZlciwgMzIwKTsNCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZJMlNfR2V0QnVmOkkyUzE6cmV0PSVkLHdyaXRlX2J1ZiA9ICVwLHdyaXRlX2xlbiA9ICVkLlxuIiwgcmV0LCB3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0NCi0NCi0NCi0JCQlpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0JCQl7DQotCQkJCWZvciAoaSA9IDA7IGkgPCBWUF9JMlNfQlVGRkVSX1NJWkU7KQ0KLQkJCQl7DQotCQkJCQkqICh3cml0ZV9idWYgKyBpICogKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSArIDEpKSA9ICogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgKyBpKTsNCi0JCQkJCSogKHdyaXRlX2J1ZiArIGkgKiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICsgMSkgKyAxKSA9ICogKHNfc3BlZWNoU3RhdGUucFZwVGVtcFJ4SW5CdWZmZXIgKyBpICsgMSk7DQotCQkJCQlpICs9IDI7DQotCQkJCX0NCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJek9zc19NZW1jcHkod3JpdGVfYnVmLCBzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciwgVlBfSTJTX0JVRkZFUl9TSVpFKTsNCi0JCQl9DQotDQotCQkJcmV0ID0gekRydkV4dEF1ZGlvX1dyaXRlKHdyaXRlX2J1Ziwgd3JpdGVfbGVuKTsNCi0NCi0JCQkvKg0KLQkJCSAgICAgICAgICAgIGlmKCBzX3NwZWVjaFN0YXRlLnNhdmVMZW4gPT0gMzIwMDApDQotCQkJICAgICAgICAgICAgew0KLQkJCSAgICAgICAgICAgICAgICB6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAibG9vcCAzMjAwXG4iKTsNCi0JCQkgICAgICAgICAgICB9DQotCQkJKi8NCi0NCi0JCQl7DQotCQkJCXNfc3BlZWNoU3RhdGUuc2F2ZUxlbiArPSBWUF9JMlNfQlVGRkVSX1NJWkU7DQotCQkJCS8vCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX2xvb3BQcm9jZXNzVGhyZWFkRW50cnkgIHNfc3BlZWNoU3RhdGUuc2F2ZUxlbiA9ICVkXG4iLCBzX3NwZWVjaFN0YXRlLnNhdmVMZW4pOw0KLQkJCQlpZiAoc19zcGVlY2hTdGF0ZS5zYXZlTGVuID49IGxvb3BDb3VudCkNCi0JCQkJew0KLQkJCQkJc19zcGVlY2hTdGF0ZS5zYXZlTGVuID0gMDsNCi0JCQkJfQ0KLQkJCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBUeEluQnVmZmVyID0gc192cFN0YXRlLnBWcFR4SW5CdWZmZXIgKyBzX3NwZWVjaFN0YXRlLnNhdmVMZW47DQotCQkJCXNfc3BlZWNoU3RhdGUucFZwVGVtcFR4T3V0UHV0QnVmZmVyID0gc192cFN0YXRlLnBWcFR4T3V0UHV0QnVmZmVyICsgc19zcGVlY2hTdGF0ZS5zYXZlTGVuOw0KLQkJCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeEluQnVmZmVyID0gc192cFN0YXRlLnBWcFJ4SW5CdWZmZXIgKyAgc19zcGVlY2hTdGF0ZS5zYXZlTGVuOw0KLQkJCQlzX3NwZWVjaFN0YXRlLnBWcFRlbXBSeE91dFB1dEJ1ZmZlciA9IHNfdnBTdGF0ZS5wVnBSeE91dFB1dEJ1ZmZlcjsNCi0JCQl9DQotCQl9DQotDQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fUmVhZF9TdG9wKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1JlYWRfU3RvcCBJMlMxIFN0b3Agd3JvbmcgIHJldD0lZFxuIiwgcmV0KTsNCi0JCX0NCi0JCXJldCA9IHpEcnZFeHRBdWRpb19Xcml0ZV9TdG9wKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX1dyaXRlX1N0b3AgSTJTMSBTdG9wIHdyb25nICByZXQ9JWRcbiIsIHJldCk7DQotCQl9DQotDQotCQkvL25vIG54cCBsaWIgbHdlbmh1YSAyMDE1MDMxNw0KLS8vICAgICAgICByZXQgKz0gVnBfTnhwQ2xvc2UoKTsNCi0JCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCQl7DQotCQkJcmV0ID0gekRydkV4dEF1ZGlvX0Nsb3NlKCk7DQotCQl9DQotDQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX0Nsb3NlIEkyUzEgU3RvcCB3cm9uZyAgcmV0PSVkIiwgcmV0KTsNCi0JCX0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9Mb29wUHJvY2Vzc1RocmVhZEVudHJ5IHdvcmsgZW5kLlxuIik7DQotCQlnX3ZvaWNlVmFyLnZwTG9vcEJrUnVubmluZyA9IEZBTFNFOwkNCi0JfQ0KLX0NCi0NCi1TSU5UMzIgdnBfU3RhdGVJbml0VXNlSTJzKFRfWkRydlZwX0NmZyBjZmdQYXJhbSkNCi17DQotDQotCWlmIChjZmdQYXJhbS5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQl7DQotDQotCQlzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9IHNfdnBTdGF0ZS5wVnBFeHRJMnNXYkNmZzsNCi0JCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMTsNCi0JCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IDE2MDsNCi0NCi0JfQ0KLQllbHNlIGlmIChjZmdQYXJhbS5jbG9ja19yYXRlID09IDgwMDApDQotCXsNCi0NCi0JCXNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnID0gc192cFN0YXRlLnBWcEV4dEkyc0NmZzsNCi0JCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMDsNCi0JCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IDE2MDsNCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9TdGF0ZUluaXRVc2VJMnMgdGhlIGZzIG5vdCBzdXBwb3J0ISBcclxuIik7DQotCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQl9DQotCS8qDQotCSAgICAgICAgaWYoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBJMlNfVElNRV9NT0RFKSYmKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50VHJhY2tGbXQgPT0gRE9VQkxFX1RSQUNLKSkNCi0JICAgICAgICB7DQotCSAgICAgICAgICAgIHNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmNoYW5uZWwgPSBBVURJT19EVUFMX0NIQU5ORUw7DQotCSAgICAgICAgICAgIHNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5jaGFubmVsID0gQVVESU9fRFVBTF9DSEFOTkVMOw0KLQ0KLQkgICAgICAgIH0NCi0JKi8NCi0JaWYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnID09IE5VTEwpDQotCXsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaWYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBJMlNfVElNRV9NT0RFKQ0KLQl7DQotCQlpZiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRUcmFja0ZtdCA9PSBET1VCTEVfVFJBQ0spDQotCQl7DQotCQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IChzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyKSAqIDI7DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCX0NCi0JCWVsc2UgaWYgKChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFRyYWNrRm10ID09IExFRlRfVFJBQ0spIHx8IChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFRyYWNrRm10ID09IFJJR0hUX1RSQUNLKSkNCi0JCXsNCi0JCQlzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplID0gKHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDIpOw0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQkJc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1N0YXRlSW5pdFVzZUkycyB0VHJhY2tGbXQgbm90IHN1cHBvcnQhIFxyXG4iKTsNCi0NCi0JCQlyZXR1cm4gRFJWX0VSUl9JTlZBTElEX1BBUkFNOw0KLQ0KLQkJfQ0KLQkJc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotDQotCX0NCi0JZWxzZSBpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtID09IFBDTV8xVElNRV9TTE9UKSkNCi0Jew0KLQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IChzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyKTsNCi0JCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQ0KLQl9DQotCWVsc2UgaWYgKChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dENsa01vZGUgPT0gUENNX1RJTUVfTU9ERSkgJiYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSAhPSBQQ01fMVRJTUVfU0xPVCkpDQotCXsNCi0JCXNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSA9IHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSArIDE7DQotDQotCQlpZiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtID09IFBDTV8xNlRJTUVfU0xPVCkNCi0JCXsNCi0JCQlzX3NwZWVjaFN0YXRlLnBjbVdiU2VjRGF0YVBvc2l0aW9uID0gMTY7DQotCQl9DQotCQllbHNlIGlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzRUSU1FX1NMT1QpDQotCQl7DQotCQkJc19zcGVlY2hTdGF0ZS5wY21XYlNlY0RhdGFQb3NpdGlvbiA9IDQ7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInZwX1N0YXRlSW5pdFVzZUkycyBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW09JWQsbm90IHN1cHBvcnQgIVxuIiwgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQkJfQ0KLQ0KLQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDI7DQotCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSAqIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICogc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9TdGF0ZUluaXRVc2VJMnMgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlPSVkLG5vdCBzdXBwb3J0ICFcbiIsIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQl9DQotDQotCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5wX2NiID0gTlVMTDsNCi0Jc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0ucF9jYiA9IE5VTEw7DQotDQotCQ0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KLVZPSUQgdnBfU3RhdGVJbml0VXNlVGRtKFZPSUQpDQotew0KLQlzX3ZwU3RhdGUucFZwVGRtQ2ZnID0gc192cFN0YXRlLnNfcFZwVGRtQ2ZnOw0KLQlzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9IHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmc7DQotDQotCWlmIChzX3ZwU3RhdGUucFZwVGRtQ2ZnLT50VHNFbmFibGUgPT0gVERNXzJUU19FTkFCTEUpDQotCXsNCi0JCXNfdnBUZG1SZWFkUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCXNfVnBUZG1Xcml0ZVBhcmFtLmNoYW5uZWwgPSBBVURJT19EVUFMX0NIQU5ORUw7DQotCX0NCi0NCi0JZ192b2ljZVZhci52b2x0ZUlzV2IgPSAwOw0KLQlzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgPSAxNjA7DQotCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSAoc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ICogMik7DQotCXNfVnBUZG1Xcml0ZVBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQlzX3ZwVGRtUmVhZFBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfU3RhdGVJbml0VXNlVGRtIGJ1ZmZlcnNpemU9JWRcbiIsIHNfVnBUZG1Xcml0ZVBhcmFtLmJ1ZmZlcnNpemUpOw0KLQ0KLX0NCi0NCi0NCi0NCi1TSU5UMzIgekRydlZwX0xvb3BTdGFydERvKFZPSUQpDQotew0KLQlTSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVVJTlQ4ICp3cml0ZV9idWYgPSBOVUxMOw0KLQlVSU5UMzIgd3JpdGVfbGVuID0gMDsNCi0JLy9VSU5UOCAqcmVhZF9idWYgPSBOVUxMOy8veGl1IGdhaSBjaHUNCi0JLy9VSU5UMzIgcmVhZF9sZW4gPSAwOy8vY2l1IGdhaSBjaHUNCi0JVF9aRHJ2VnBfQ2ZnIGxvb3BDZmdQYXJhbTsNCi0JVF9aRHJ2X1ZwRnMgZnMgPSBWUF9GU184MDAwOw0KLQlsb29wQ2ZnUGFyYW0uY2xvY2tfcmF0ZSA9IDgwMDA7IC8vMTYwMDA7IC8vDQotCWxvb3BDZmdQYXJhbS5iaXRzX3Blcl9zYW1wbGUgPSAxNjsNCi0JbG9vcENmZ1BhcmFtLmNoYW5uZWxfY291bnQgPSAxOw0KLQlsb29wQ2ZnUGFyYW0uc2FtcGxlc19wZXJfZnJhbWUgPSAxNjA7DQotDQotCWlmICgoKHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmcgID09IE5VTEwpIHx8IChzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmcgPT0gTlVMTCkpICYmICgoc192cFN0YXRlLnNfcFZwVGRtQ2ZnID09IE5VTEwpKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBlcnJvciBzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnIG5vdCBpbml0ISBcclxuIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQkJew0KLSAgICAgICAgICAgIHJldCA9IHZwX1N0YXRlSW5pdFVzZUkycyhsb29wQ2ZnUGFyYW0pOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAidnBfU3RhdGVJbml0VXNlSTJzIGVycm9yICByZXQ9JWQhXG4iLCByZXQpOw0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCX0NCi0JCQ0KLSNpZiAwDQotCQkJaWYgKGxvb3BDZmdQYXJhbS5jbG9ja19yYXRlID09IDE2MDAwKQ0KLQkJCXsNCi0NCi0JCQkJc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcgPSBzX3ZwU3RhdGUucFZwRXh0STJzV2JDZmc7DQotCQkJCWdfdm9pY2VWYXIudm9sdGVJc1diID0gMTsNCi0JCQkJc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ID0gMzIwOw0KLQ0KLQkJCX0NCi0JCQllbHNlIGlmIChsb29wQ2ZnUGFyYW0uY2xvY2tfcmF0ZSA9PSA4MDAwKQ0KLQkJCXsNCi0NCi0JCQkJc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcgPSBzX3ZwU3RhdGUucFZwRXh0STJzQ2ZnOw0KLQkJCQlnX3ZvaWNlVmFyLnZvbHRlSXNXYiA9IDA7DQotCQkJCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IDE2MDsNCi0NCi0JCQl9DQotCQkJZWxzZQ0KLQkJCXsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyB0aGUgZnMgbm90IHN1cHBvcnQhIFxyXG4iKTsNCi0JCQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0JCQl9DQotCQkJLyoNCi0JCQkgICAgICAgIGlmKChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dENsa01vZGUgPT0gSTJTX1RJTUVfTU9ERSkmJihzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFRyYWNrRm10ID09IERPVUJMRV9UUkFDSykpDQotCQkJICAgICAgICB7DQotCQkJICAgICAgICAgICAgc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQkgICAgICAgICAgICBzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0NCi0JCQkgICAgICAgIH0NCi0JCQkqLw0KLQkJCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9PSBOVUxMKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JCQl9DQotDQotCQkJaWYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBJMlNfVElNRV9NT0RFKQ0KLQkJCXsNCi0JCQkJaWYgKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50VHJhY2tGbXQgPT0gRE9VQkxFX1RSQUNLKQ0KLQkJCQl7DQotCQkJCQlzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplID0gKHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDIpICogMjsNCi0JCQkJCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmNoYW5uZWwgPSBBVURJT19EVUFMX0NIQU5ORUw7DQotCQkJCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRUcmFja0ZtdCA9PSBMRUZUX1RSQUNLKSB8fCAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRUcmFja0ZtdCA9PSBSSUdIVF9UUkFDSykpDQotCQkJCXsNCi0JCQkJCXNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemUgPSAoc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50ICogMik7DQotCQkJCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5jaGFubmVsID0gQVVESU9fTU9OT19DSEFOTkVMOw0KLQkJCQkJc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQkJCX0NCi0JCQkJZWxzZQ0KLQkJCQl7DQotCQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIHRUcmFja0ZtdCBub3Qgc3VwcG9ydCEgXHJcbiIpOw0KLQ0KLQkJCQkJcmV0dXJuIERSVl9FUlJfSU5WQUxJRF9QQVJBTTsNCi0NCi0JCQkJfQ0KLQkJCQlzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQkJCXNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQ0KLQkJCX0NCi0JCQllbHNlIGlmICgoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlID09IFBDTV9USU1FX01PREUpICYmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzFUSU1FX1NMT1QpKQ0KLQkJCXsNCi0JCQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IChzX3NwZWVjaFN0YXRlLmZyYW1lQ291bnQgKiAyKTsNCi0JCQkJc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0NCi0JCQl9DQotCQkJZWxzZSBpZiAoKHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSA9PSBQQ01fVElNRV9NT0RFKSAmJiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtICE9IFBDTV8xVElNRV9TTE9UKSkNCi0JCQl7DQotCQkJCXNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSA9IHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50UGNtU2xvdE51bSArIDE7DQotDQotCQkJCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW0gPT0gUENNXzE2VElNRV9TTE9UKQ0KLQkJCQl7DQotCQkJCQlzX3NwZWVjaFN0YXRlLnBjbVdiU2VjRGF0YVBvc2l0aW9uID0gMTY7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtID09IFBDTV80VElNRV9TTE9UKQ0KLQkJCQl7DQotCQkJCQlzX3NwZWVjaFN0YXRlLnBjbVdiU2VjRGF0YVBvc2l0aW9uID0gNDsNCi0JCQkJfQ0KLQkJCQllbHNlDQotCQkJCXsNCi0JCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DZmdQYXJhbSBzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZy0+dFBjbVNsb3ROdW09JWQsbm90IHN1cHBvcnQgIVxuIiwgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRQY21TbG90TnVtKTsNCi0JCQkJCXJldHVybiBEUlZfRVJST1I7DQotDQotCQkJCX0NCi0NCi0JCQkJc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSA9IHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDI7DQotCQkJCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5idWZmZXJzaXplID0gc19zcGVlY2hTdGF0ZS5wY21TbG90TnVtICogc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0JCQkJc19zcGVlY2hTdGF0ZS5pMnNSZWFkUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUucGNtU2xvdE51bSAqIHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcFN0YXJ0RG8gc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmctPnRDbGtNb2RlPSVkLG5vdCBzdXBwb3J0ICFcbiIsIHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLT50Q2xrTW9kZSk7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotDQotCQkJfQ0KLQ0KLQkJCXNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbS5wX2NiID0gTlVMTDsNCi0JCQlzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbS5wX2NiID0gTlVMTDsNCi0jZW5kaWYJCQ0KLQkJfQ0KLQkJZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCQl7DQotCQkJdnBfU3RhdGVJbml0VXNlVGRtKCk7CQ0KLSNpZiAwDQotCQkJc192cFN0YXRlLnBWcFRkbUNmZyA9IHNfdnBTdGF0ZS5zX3BWcFRkbUNmZzsNCi0JCQlzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9IHNfdnBTdGF0ZS5wVnBFeHRJMnNDZmc7DQotDQotCQkJaWYgKHNfdnBTdGF0ZS5wVnBUZG1DZmctPnRUc0VuYWJsZSA9PSBURE1fMlRTX0VOQUJMRSkNCi0JCQl7DQotCQkJCXNfdnBUZG1SZWFkUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQkJc19WcFRkbVdyaXRlUGFyYW0uY2hhbm5lbCA9IEFVRElPX0RVQUxfQ0hBTk5FTDsNCi0JCQl9DQotDQotCQkJZ192b2ljZVZhci52b2x0ZUlzV2IgPSAwOw0KLQkJCXNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCA9IDE2MDsNCi0JCQlzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplID0gKHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudCAqIDIpOw0KLQkJCXNfVnBUZG1Xcml0ZVBhcmFtLmJ1ZmZlcnNpemUgPSBzX3NwZWVjaFN0YXRlLnRvdGFsRnJhbWVCdWZTaXplOw0KLQkJCXNfdnBUZG1SZWFkUGFyYW0uYnVmZmVyc2l6ZSA9IHNfc3BlZWNoU3RhdGUudG90YWxGcmFtZUJ1ZlNpemU7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBUZG0gekRydlRkbV9Xcml0ZV9TdGFydCBidWZmZXJzaXplPSVkXG4iLCBzX1ZwVGRtV3JpdGVQYXJhbS5idWZmZXJzaXplKTsNCi0jZW5kaWYNCi0JCX0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcFN0YXJ0RG8gSTJTIHpEcnZJMlNfV3JpdGVfU3RhcnQgYnVmZmVyc2l6ZT0lZFxuIiwgc19zcGVlY2hTdGF0ZS5pMnNXcml0ZVBhcmFtLmJ1ZmZlcnNpemUpOw0KLQkJc19zcGVlY2hTdGF0ZS5pbk91dEJ1ZlVzZVNpemUgPSBzX3ZwU3RhdGUuaW5PdXRCdWZTaXplIC0gc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcFN0YXJ0RG8gIGdfdm9pY2VWYXIudnBJMnNTdGF0dXM9JWQsc19zcGVlY2hTdGF0ZS5pbk91dEJ1ZlVzZVNpemU9JWRcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMsIHNfc3BlZWNoU3RhdGUuaW5PdXRCdWZVc2VTaXplKTsNCi0NCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcFN0YXJ0RG8gc2V0IHRvdGFsRnJhbWVCdWZTaXplPSVkLHNfc3BlZWNoU3RhdGUuZnJhbWVDb3VudD0lZFxuIiwgc19zcGVlY2hTdGF0ZS50b3RhbEZyYW1lQnVmU2l6ZSwgc19zcGVlY2hTdGF0ZS5mcmFtZUNvdW50KTsNCi0NCi0NCi0JfQ0KLQ0KLQlpZiAoZ192b2ljZVZhci5pc1VzZVNsaWNDb2RlYyAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fT3BlbihUUkFOU19ETUFfTU9ERSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJyZXQ9JWQgekRydkkyU19PcGVuKEkyU18xLFRSQU5TX0RNQV9NT0RFKVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX09wZW4oVlBfVk9JQ0VfU09VUkNFKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBoYWxWcENmZ19PcGVuIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0JcmV0ID0gaGFsVnBDZmdfU2V0RnMoZnMpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIGhhbFZwQ2ZnX1NldEZzIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JaWYgKChnX3ZvaWNlVmFyLnZwTG9vcFBhdGggPT0gVlBfUEFUSF9IQU5EU0VUKSB8fCAoZ192b2ljZVZhci52cExvb3BQYXRoID09IFZQX1BBVEhfSEVBRFNFVCkgfHwgKGdfdm9pY2VWYXIudnBMb29wUGF0aCA9PSBWUF9QQVRIX1NQRUFLRVIpKQ0KLQl7DQotCQlyZXQgPSBoYWxWcENmZ19TZXRJbnB1dFBhdGgoZ192b2ljZVZhci52cExvb3BQYXRoLCBUUlVFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyB2b2ljZV9TZXRQYWh0SW4gaGFsVnBDZmdfU2V0SW5wdXRQYXRoIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQkJfQ0KLQkJcmV0ID0gaGFsVnBDZmdfU2V0T3V0cHV0UGF0aChnX3ZvaWNlVmFyLnZwTG9vcFBhdGgsIFRSVUUpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIHZvaWNlX1NldFBhaHRPdXQgaGFsVnBDZmdfU2V0T3V0cHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJcmV0dXJuIERSVl9FUlJPUjsNCi0NCi0JCX0NCi0NCi0JfQ0KLQllbHNlDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfTG9vcFN0YXJ0RG8gcGF0aCBub3Qgc3VwcG9ydCAgZ192b2ljZVZhci52cExvb3BQYXRoPSVkICFcbiIsIGdfdm9pY2VWYXIudnBMb29wUGF0aCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQl9DQotDQotCXJldCA9IGhhbFZwQ2ZnX0VuYWJsZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIGhhbFZwQ2ZnX0VuYWJsZSBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotI2lmbmRlZiBURVNUX1dISVRFX05PSVNFDQotDQotCWlmIChsb29wQ2ZnUGFyYW0uY2xvY2tfcmF0ZSA9PSAxNjAwMCkNCi0Jew0KLQkJcmV0ID0gVm9pY2VQcm9jX09wZW4oMTYwMDApOw0KLQl9DQotCWVsc2UgaWYgKGxvb3BDZmdQYXJhbS5jbG9ja19yYXRlID09IDgwMDApDQotCXsNCi0JCXJldCA9IFZvaWNlUHJvY19PcGVuKDgwMDApOw0KLQ0KLQl9DQotCWVsc2UNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBWb2ljZVByb2NfT3BlbiBmcyBub3Qgc3VwcG9ydFxuIik7DQotDQotDQotCX0NCi0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBWb2ljZVByb2NfT3BlbiBnX3ZvaWNlVmFyLnZvaWNlTW9kZT0lZCwgcmV0PSVkIFxuIiwgZ192b2ljZVZhci52b2ljZU1vZGUsIHJldCk7DQotCS8vZ192b2ljZVZhci52cFBhdGggPSBWUF9QQVRIX0hBTkRTRVQ7DQotCS8vIGdfdm9pY2VWYXIudnBWb2wgPSBWUF9WT0xfMzsNCi0JaWYgKHJldCA9PSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJLy9nX3ZvaWNlVmFyLnZwUGF0aCA9IFZQX1BBVEhfSEVBRFNFVDsNCi0JCWdfdm9pY2VWYXIudnBWb2wgPSBWUF9WT0xfNTsNCi0JCWdfdm9pY2VWYXIudm9pY2VJbkdzbVRkTW9kZSA9IDE7DQotCQlnX3ZvaWNlVmFyLnZvaWNlTW9kZSA9IFZPSUNFX0dTTV9NT0RFOw0KLQkJcmV0ID0gVm9pY2VQcm9jX0dldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCBnX3ZvaWNlVmFyLnZwTG9vcFBhdGgpOw0KLQkJaWYgKHJldCA9PSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHpEcnZWcF9Mb29wU3RhcnREbyBWb2ljZVByb2NfR2V0UGFyYW0gT0shXHJcbiIpOw0KLQkJCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IFRSVUU7DQotCQkJcmV0ID0gVm9pY2VQcm9jX1NldFBhcmFtKGdfdm9pY2VWYXIudm9pY2VNb2RlLCBnX3ZvaWNlVmFyLnZwTG9vcFBhdGgsIGdfdm9pY2VWYXIudnBWb2wsIEZBTFNFKTsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydERvIFZvaWNlUHJvY19TZXRQYXJhbSByZXQ9JWQgXG4iLCByZXQpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQlnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPSBGQUxTRTsNCi0JCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBWb2ljZVByb2NfU2V0UGFyYW0gcmV0PSVkICx2b2ljZSBwcm9jZXNzIGRvbid0IHVzZSEgXG4iLCByZXQpOw0KLQkJCQlWb2ljZVByb2NfQ2xvc2UoKTsNCi0JCQl9DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyBWb2ljZVByb2NfR2V0UGFyYW0gZXJyb3IgcmV0PSVkICEgXHJcbiIsIHJldCk7DQotCQkJZ192b2ljZVZhci52UHJvY0lzTm9ybWFsID0gRkFMU0U7DQotCQkJVm9pY2VQcm9jX0Nsb3NlKCk7DQotDQotCQl9DQotCX0NCi0JZWxzZQ0KLQl7DQotCQlnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPSBGQUxTRTsNCi0JfQ0KLSNlbHNlDQotDQotCWdfdm9pY2VWYXIudlByb2NJc05vcm1hbCA9IEZBTFNFOw0KLQ0KLSNlbmRpZg0KLQ0KLQkvL25vIG54cCBsaWIgbHdlbmh1YSAyMDE1MDMxNw0KLSNpZiAwDQotCS8vCXJldCA9IFZvaWNlUHJvY19PcGVuKCk7DQotCS8vCXJldCArPSBWb2ljZVByb2NfU2V0UGFyYW0oc192cFBhdGgsIFZQX1ZPTF81LFRSVUUpOw0KLQ0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQlyZXQgKz0gekRydkV4dEF1ZGlvX0Nsb3NlKCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjID09IDEpIA0KLQl7DQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fUmVzZXQoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RhcnREbyB6RHJ2RXh0QXVkaW9fUmVzZXQgZXJyIHJldD0lZCAiLCByZXQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotCX0NCi0JcmV0ID0gekRydkV4dEF1ZGlvX1JlYWRfU3RhcnQoJnNfc3BlZWNoU3RhdGUuaTJzUmVhZFBhcmFtLHNfc3BlZWNoU3RhdGUucFZwSTJzQ2ZnLCZzX3ZwVGRtUmVhZFBhcmFtLHNfdnBTdGF0ZS5wVnBUZG1DZmcpOw0KLSAgICByZXQgKz0gekRydkV4dEF1ZGlvX1dyaXRlX1N0YXJ0KCZzX3NwZWVjaFN0YXRlLmkyc1dyaXRlUGFyYW0sc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcsJnNfVnBUZG1Xcml0ZVBhcmFtLHNfdnBTdGF0ZS5wVnBUZG1DZmcpOw0KLSNpZiAwDQotCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCXsNCi0JCXJldCA9IHpEcnZFeHRBdWRpb19SZWFkX1N0YXJ0KCZzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbSwgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcsICZzX3ZwVGRtUmVhZFBhcmFtLCBzX3ZwU3RhdGUucFZwVGRtQ2ZnKTsNCi0JCXJldCArPSB6RHJ2RXh0QXVkaW9fV3JpdGVfU3RhcnQoJnNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbSwgc19zcGVlY2hTdGF0ZS5wVnBJMnNDZmcsICZzX1ZwVGRtV3JpdGVQYXJhbSwgc192cFN0YXRlLnBWcFRkbUNmZyk7DQotCX0NCi0JZWxzZSBpZiAoZ192b2ljZVZhci5nX2lzVXNlVGRtID09IDEpDQotCXsNCi0JCXJldCA9IHpEcnZURE1fUmVhZF9TdGFydF9Ebygmc192cFRkbVJlYWRQYXJhbSk7DQotCQlyZXQgKz0gekRydlRETV9Xcml0ZV9TdGFydF9Ebygmc19WcFRkbVdyaXRlUGFyYW0pOw0KLQl9DQotCWVsc2UgaWYgKGdfdm9pY2VWYXIuZ19pc1VzZVRkbSAhPSAxKQ0KLQl7DQotCQlyZXQgPSB6RHJ2STJTX1JlYWRfU3RhcnRfRG8oSTJTXzEsICZzX3NwZWVjaFN0YXRlLmkyc1JlYWRQYXJhbSk7DQotCQlyZXQgKz0gekRydkkyU19Xcml0ZV9TdGFydF9EbyhJMlNfMSwgJnNfc3BlZWNoU3RhdGUuaTJzV3JpdGVQYXJhbSk7DQotCX0NCi0jZW5kaWYNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInJldD0lZCB6RHJ2STJTX1JlYWRfU3RhcnQgekRydkkyU19Xcml0ZV9TdGFydChJMlNfMSkiLCByZXQpOw0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQlyZXQgPSB6RHJ2RXh0QXVkaW9fR2V0QnVmKCZ3cml0ZV9idWYsICZ3cml0ZV9sZW4pOw0KLQl6T3NzX01lbXNldCh3cml0ZV9idWYsIDAsIHdyaXRlX2xlbik7DQotCXJldCArPSB6RHJ2RXh0QXVkaW9fV3JpdGUod3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQlyZXQgKz0gekRydkV4dEF1ZGlvX0dldEJ1Zigmd3JpdGVfYnVmLCAmd3JpdGVfbGVuKTsNCi0Jek9zc19NZW1zZXQod3JpdGVfYnVmLCAwLCB3cml0ZV9sZW4pOw0KLQlyZXQgKz0gekRydkV4dEF1ZGlvX1dyaXRlKHdyaXRlX2J1Ziwgd3JpdGVfbGVuKTsNCi0JcmV0ICs9IHpEcnZFeHRBdWRpb19HZXRCdWYoJndyaXRlX2J1ZiwgJndyaXRlX2xlbik7DQotCXpPc3NfTWVtc2V0KHdyaXRlX2J1ZiwgMCwgd3JpdGVfbGVuKTsNCi0JcmV0ICs9IHpEcnZFeHRBdWRpb19Xcml0ZSh3cml0ZV9idWYsIHdyaXRlX2xlbik7DQotCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJyZXQ9JWQgekRydlZwX0xvb3BTdGFydERvICAgekRydkkyU19HZXRCdWYgIHpEcnZJMlNfV3JpdGUoSTJTXzEpIiwgcmV0KTsNCi0JCXJldHVybiBEUlZfRVJST1I7DQotCX0NCi0NCi0JcmV0dXJuIHJldDsNCi19DQotDQotU0lOVDMyIHpEcnZWcF9Mb29wU3RhcnQoVF9aRHJ2X1ZwUGF0aCBwYXRoKQ0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAgInpEcnZWcF9Mb29wU3RhcnQgYmVnaW4gZ192b2ljZVZhci52cEkyc1N0YXR1cyA9JWRcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMpOw0KLQkvL3ZwX1NldFRvcEkyc0NvbmZpZygpOw0KLQ0KLQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSURMRSkNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydCAgc3RhcnRcbiIpOw0KLSNpZiAwDQotCWlmIChzX3NwZWVjaFN0YXRlLnBWcEkyc0NmZyA9PSBOVUxMKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdGFydCBlcnJvcjogaTJzIHBhcmFtZXRlciBpcyBub3Qgc2V0dGVkIik7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotI2VuZGlmDQotDQotCWdfdm9pY2VWYXIudnBMb29wUGF0aCA9IHBhdGg7DQotDQotCWdfdm9pY2VWYXIudnBJMnNTdGF0dXMgPSBWUF9MT09QX09OOw0KLQlpZiAoc192cFN0YXRlLnZwTG9vcFNlbWFwaG9yZSAhPSBOVUxMKQ0KLQl7DQotCQl6T3NzX1B1dFNlbWFwaG9yZShzX3ZwU3RhdGUudnBMb29wU2VtYXBob3JlKTsNCi0JfQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAgInpEcnZWcF9Mb29wU3RhcnQgZ192b2ljZVZhci52cEkyc1N0YXR1cyA9JWRcbiIsIGdfdm9pY2VWYXIudnBJMnNTdGF0dXMpOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi1TSU5UMzIgekRydlZwX0xvb3BTdG9wKHZvaWQpLy94aXUgZ2FpIGNodSB0aWFuIGppYSB2b2lkDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdG9wIGJlZ2luIGdfdm9pY2VWYXIudnBJMnNTdGF0dXM9JWQiLCBnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzKTsNCi0NCi0JaWYgKGdfdm9pY2VWYXIudnBJMnNTdGF0dXMgIT0gVlBfTE9PUF9PTikNCi0Jew0KLQkJcmV0dXJuIERSVl9FUlJPUjsNCi0JfQ0KLQ0KLQlnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID0gVlBfSTJTX0lETEU7DQotDQotCS8vekRydkkyc19SeFJsc1NlbWFCZWZvcmVTdG9wKEkyU18xKTsNCi0JLy96RHJ2STJzX1R4UmxzU2VtYUJlZm9yZVN0b3AoSTJTXzEpOw0KLQl6RHJ2RXh0QXVkaW9fUmxzQWxsU2VtYUJlZm9yZVN0b3AoKTsNCi0NCi0JcmV0ID0gaGFsVnBDZmdfRGlzYWJsZSgpOw0KLQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdG9wIGhhbFZwQ2ZnX0VuYWJsZSBlcnIgcmV0PSV4ICFcbiIsIHJldCk7DQotCX0NCi0NCi0JcmV0ID0gaGFsVnBDZmdfQ2xvc2UoKTsNCi0JaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9Mb29wU3RvcCBoYWxfVnBDZmdfQ2xvc2UgZXJyIHJldD0lZCIsIHJldCk7DQotCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQl9DQotDQotCWlmIChnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPT0gVFJVRSkNCi0Jew0KLQkJcmV0ID0gVm9pY2VQcm9jX0Nsb3NlKCk7DQotDQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ2cF9DbG9zZSBWb2ljZVByb2NfQ2xvc2Ugd3JvbmcgIHJldD0lZCBcbiIsIHJldCk7DQotCQl9DQotCQlnX3ZvaWNlVmFyLnZQcm9jSXNOb3JtYWwgPSBGQUxTRTsNCi0JfQ0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX0xvb3BTdG9wIHN1Y2Nlc3MhIFxuIik7DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotDQotDQotI2lmZGVmIF9VU0VfSEFMX0hEVFRTVA0KLVNJTlQzMiB2b2ljZUdldFBjbURhdGEoVUlOVDMyICpVcGxpbmtkYXRhLCBVSU5UMzIgKkRvd25saW5rZGF0YSkNCi17DQotCShVSU5UOCAqKSAqVXBsaW5rZGF0YSA9ICAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wVHhJbkJ1ZmZlcjsNCi0JKFVJTlQ4ICopICpEb3dubGlua2RhdGEgPSAgc19zcGVlY2hTdGF0ZS5wVnBUZW1wUnhJbkJ1ZmZlcjsNCi0JcmV0dXJuIDAgOw0KLX0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgVVNFX0FVRElPX1JJTkcNCi1zdGF0aWMgWk9TU19USFJFQURfSUQgc19yaW5nUGxheVRocmVhZCA9IE5VTEw7DQotc3RhdGljIFpPU1NfU0VNQVBIT1JFX0lEIHNfcmluZ1BsYXlTZW1hcGhvcmUgPSBOVUxMOw0KLXN0YXRpYyBaT1NTX1NFTUFQSE9SRV9JRCBzX3JpbmdQbGF5RW5kU2VtYXBob3JlID0gTlVMTDsNCi1zdGF0aWMgQk9PTCBzX2ZpcnN0U3RhcnQgPSBUUlVFOw0KLQ0KLXN0YXRpYyBUX1pEcnZDb2RlY19IYW5kbGUgc19jb2RlY1JpbmdIYW5kbGUgPSBOVUxMOw0KLXN0YXRpYyBUX1pEcnZJMlNfQ2ZnIHNfcmluZ0kyczFDZmcgPSAge1RSVUUsIEkyU19EQVRBXzE2QklULCBJMlNfVFNfMTZDWUNMRSwgODAwMCwgICAgIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJMlNfVElNRV9NT0RFLCBUUkFOU19QT1NJVElWRV9ORUdBVElWRSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFRlRfVFJBQ0ssIEkyU19OT1JNQUxfTU9ERSwgRklSU1RfREFUQV9BTElHTl9UT19GSVJTVF9DWUNMRSwgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDTV9OT1JNQUxfTU9ERSwgUENNX01TQl9GSVJTVCwgUENNX0ZTWU5DX0xFTkdUSF8xQ0xLLCBQQ01fMVRJTUVfU0xPVCwgVElNSU5HX0kyU19NT05PX0xFRlQsIFBDTV9TSE9SVF9GU1lOQywgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRETV9OT19FWFRSQV9DWUNMRSwgREFUQV9BTElHTl9TVERfSTJTLCBSRUZfQ0xLMjZNDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Oy8vVEVTVCBGT1IgaTJzDQotc3RhdGljICBCT09MIHNfcmluZ1N0b3AgPSBUUlVFOw0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBVU0VfQVVESU9fUklORw0KLXN0YXRpYyBWT0lEIHJpbmdQbGF5RW50cnkoU0lOVDMyIHBhcmEpDQotew0KLQlVSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7DQotCVRfWkRydl9WcEZzIGZzID0gVlBfRlNfODAwMDsNCi0JVF9aRHJ2STJTX0NmZyBwdENmZyA9IHswfTsNCi0JVUlOVDggKndyaXRlX2J1ZiA9IE5VTEw7DQotCVVJTlQzMiB3cml0ZV9sZW4gPSAwOw0KLQ0KLQ0KLQlVSU5UMzIgYXJyYXlTaXplID0gMDsNCi0NCi0JVUlOVDMyIGNvdW50ID0gMDsNCi0JVUlOVDggKmJ1ZnB0ciA9IE5VTEw7DQotCWJ1ZnB0ciA9IGNhbGxSaW5nUGNtOw0KLQlhcnJheVNpemUgPSBzaXplb2YoY2FsbFJpbmdQY20pIC8gc2l6ZW9mKFVJTlQ4KTsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiByaW5nUGxheUVudHJ5IGFycmF5U2l6ZT0leFxuIiwgYXJyYXlTaXplKTsNCi0Jd2hpbGUgKDEpDQotCXsNCi0NCi0JCXpPc3NfR2V0U2VtYXBob3JlKHNfcmluZ1BsYXlTZW1hcGhvcmUsIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0NCi0NCi0JCXJldCA9IGhhbFZwQ2ZnX09wZW4oVlBfVk9JQ0VfU09VUkNFKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCBoYWxWcENmZ19PcGVuIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQkJcmV0ID0gaGFsVnBDZmdfU2V0RnMoZnMpOw0KLQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCXsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1JpbmdTdG9wIGhhbFZwQ2ZnX1NldEZzIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQkJfQ0KLQ0KLQkJaWYgKChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hBTkRTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX0hFQURTRVQpIHx8IChnX3ZvaWNlVmFyLnZwUGF0aCA9PSBWUF9QQVRIX1NQRUFLRVIpKQ0KLQkJew0KLQkJCXJldCA9IGhhbFZwQ2ZnX1NldElucHV0UGF0aChnX3ZvaWNlVmFyLnZwUGF0aCwgVFJVRSk7DQotCQkJaWYgKHJldCAhPSBEUlZfU1VDQ0VTUykNCi0JCQl7DQotCQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3Agdm9pY2VfU2V0UGFodEluIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotDQotCQkJfQ0KLQkJCXJldCA9IGhhbFZwQ2ZnX1NldE91dHB1dFBhdGgoZ192b2ljZVZhci52cFBhdGgsIFRSVUUpOw0KLQkJCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQkJew0KLQkJCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1JpbmdTdG9wIHZvaWNlX1NldFBhaHRPdXQgaGFsVnBDZmdfU2V0T3V0cHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotCQkJCXJldHVybiBEUlZfRVJST1I7DQotDQotCQkJfQ0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3Agdm9pY2VfU2V0UGFodE91dCB0aGUgcGF0aCBub3Qgc3VwcG9ydCAhXG4iKTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQ0KLQkJfQ0KLQkJcmV0ID0gaGFsVnBDZmdfRW5hYmxlKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3AgaGFsVnBDZmdfRW5hYmxlIGVyciByZXQ9JXggIVxuIiwgcmV0KTsNCi0JCQlyZXR1cm4gRFJWX0VSUk9SOw0KLQkJfQ0KLQ0KLQ0KLQ0KLQ0KLQkJcHRDZmcgPSBzX3JpbmdJMnMxQ2ZnOw0KLQ0KLQkJLy9yZXQgPSB6RHJ2STJTX0luaXQoKTsNCi0JCWlmIChnX3ZvaWNlVmFyLmlzVXNlU2xpY0NvZGVjICE9IDEpDQotCQl7DQotCQkJcmV0ICs9IHpEcnZFeHRBdWRpb19PcGVuKFRSQU5TX0RNQV9NT0RFKTsNCi0NCi0JCX0NCi0NCi0NCi0JCVRfWkRydkkyc19QYXJhbXMgcGFyYW1ldGVyID0gezB9Ow0KLQkJcGFyYW1ldGVyLmNoYW5uZWwgPSBBVURJT19NT05PX0NIQU5ORUw7DQotCQlwYXJhbWV0ZXIuYnVmZmVyc2l6ZSA9IDMyMDsNCi0JCXBhcmFtZXRlci5wX2NiID0gTlVMTDsNCi0NCi0JCXJldCArPSB6RHJ2STJTX1dyaXRlX1N0YXJ0KEkyU18xLCAmcGFyYW1ldGVyLCAmcHRDZmcpOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIkkyU18xIHpEcnZJMlNfV3JpdGVfU3RhcnQgcmV0PSVkIVxuIiwgcmV0KTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJek9zc19QcmludGYoMSwgMSwgInpEcnZJMlNfV3JpdGVfU3RhcnQgZmFpbCByZXQ9JXhcbiIsIHJldCk7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiByaW5nUGxheUVudHJ5IEkyUyBDRkcgZW5kIHJldD0lZCFcbiIsIHJldCk7DQotCQkJY29udGludWU7DQotCQl9DQotDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHJpbmdQbGF5RW50cnkgSTJTIENGRyBlbmQhXG4iKTsNCi0NCi0NCi0JCXdoaWxlIChzX3JpbmdTdG9wID09IEZBTFNFKQ0KLQkJew0KLQ0KLQkJCXJldCA9IHpEcnZJMlNfR2V0QnVmKEkyU18xLCAmd3JpdGVfYnVmLCAmd3JpdGVfbGVuKTsNCi0JCQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2STJTX0dldEJ1ZiB3cml0ZV9idWY9MHgleCx3cml0ZV9sZW49JWQhXG4iLHdyaXRlX2J1Zix3cml0ZV9sZW4pOw0KLQkJCS8vL3pPc3NfUHJpbnRmKDEsMSwiekRydkkyU19HZXRCdWYgd3JpdGVfYnVmPTB4JXgsd3JpdGVfbGVuPSVkIVxuIix3cml0ZV9idWYsd3JpdGVfbGVuKTsNCi0NCi0JCQkvL3dyaXRlX2xlbiA9IDE2MDsNCi0JCQl6T3NzX01lbWNweSgoVk9JRCAqKSh3cml0ZV9idWYpLCBidWZwdHIsIHdyaXRlX2xlbik7DQotCQkJcmV0ID0gekRydkkyU19Xcml0ZShJMlNfMSwgd3JpdGVfYnVmLCB3cml0ZV9sZW4pOw0KLQ0KLQ0KLQ0KLQkJCWJ1ZnB0ciArPSB3cml0ZV9sZW47DQotCQkJY291bnQgKz0gd3JpdGVfbGVuOw0KLQ0KLQkJCWlmIChjb3VudCA+PSBhcnJheVNpemUpDQotCQkJew0KLQkJCQljb3VudCA9IDA7DQotCQkJCS8vcmVjb3JkRmlsZUZsYWcgPSAwOw0KLQkJCQlidWZwdHIgPSBjYWxsUmluZ1BjbTsNCi0JCQl9DQotDQotCQl9DQotDQotCQl6T3NzX1B1dFNlbWFwaG9yZShzX3JpbmdQbGF5RW5kU2VtYXBob3JlKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgcmluZ1BsYXlFbnRyeSBlbmQgIVxuIik7DQotDQotCX0NCi0NCi19DQotDQotDQotDQotU0lOVDMyIHpEcnZWcF9SaW5nU3RhcnQoVk9JRCkNCi17DQotCVNJTlQzMiAgcmV0ID0gRFJWX1NVQ0NFU1M7DQotDQotCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0YXJ0IVxuIik7DQotDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzICE9IFZQX0kyU19JRExFKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiekRydlZwX1JpbmdTdGFydCBlcnIsIHZvaWNlIGFjdGl2ZSFcbiIpOw0KLQkJcmV0dXJuIERSVl9FUlJfQlVTWTsNCi0JfQ0KLQ0KLQ0KLQlpZiAoc19yaW5nU3RvcCA9PSBGQUxTRSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RhcnQgZXJyLCBsYXRlc3QgcmluZyBub3Qgc3RvcCFcbiIpOw0KLQ0KLQkJcmV0dXJuIERSVl9FUlJfU1RBUlRfVElNRVM7DQotCX0NCi0NCi0JaWYgKHNfZmlyc3RTdGFydCkNCi0Jew0KLQkJc19yaW5nUGxheVNlbWFwaG9yZSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJWcFJpbmdQbGF5U2VtYXBob3JlIiwgMCk7DQotCQlzX3JpbmdQbGF5VGhyZWFkID0gek9zc19DcmVhdGVUaHJlYWQoIlZwUmluZ1BsYXkiLCByaW5nUGxheUVudHJ5LCAwLCAxMDI0ICogOSwgMjUsIDAsIDEpOw0KLQkJc19yaW5nUGxheUVuZFNlbWFwaG9yZSA9IHpPc3NfQ3JlYXRlU2VtYXBob3JlKCJWcFJpbmdQbGF5RW5kU2VtYXBob3JlIiwgMCk7DQotDQotCQlpZiAoKE5VTEwgPT0gc19yaW5nUGxheVNlbWFwaG9yZSkgfHwgKE5VTEwgPT0gc19yaW5nUGxheVRocmVhZCkgfHwgKE5VTEwgPT0gc19yaW5nUGxheUVuZFNlbWFwaG9yZSkpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImNyZWF0ZSBSaW5nUGxheSBUaHJlYWQgc2VtIGVyciEgXHJcbiIpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotDQotDQotCQlzX2ZpcnN0U3RhcnQgPSBGQUxTRTsNCi0JfQ0KLQlzX3JpbmdTdG9wID0gRkFMU0U7DQotDQotCS8vdnBfU2V0VG9wSTJzQ29uZmlnKCk7DQotCXpPc3NfUHV0U2VtYXBob3JlKHNfcmluZ1BsYXlTZW1hcGhvcmUpOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi1TSU5UMzIgekRydlZwX1JpbmdTdG9wKFZPSUQpDQotew0KLQlTSU5UMzIgIHJldCA9IERSVl9TVUNDRVNTOw0KLQ0KLQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHpEcnZWcF9SaW5nU3RvcCAgc3RhcnQhXG4iKTsNCi0NCi0JaWYgKHNfcmluZ1N0b3AgPT0gVFJVRSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCBlcnIsIHN0b3AgZmxhZyBhbHJlYWR5IGlzIHRydWUhXG4iKTsNCi0JCXJldHVybiBEUlZfRVJSX0RFVl9DTE9TRUQ7DQotCX0NCi0NCi0Jc19yaW5nU3RvcCA9IFRSVUU7DQotDQotCWlmIChnX3ZvaWNlVmFyLnZwSTJzU3RhdHVzID09IFZQX0kyU19JRExFKQ0KLQl7DQotCQl6T3NzX0dldFNlbWFwaG9yZShzX3JpbmdQbGF5RW5kU2VtYXBob3JlLCBaT1NTX1dBSVRfRk9SRVZFUik7DQotDQotCQlpZiAoZ192b2ljZVZhci52cEkyc1N0YXR1cyAhPSBWUF9JMlNfSURMRSkgICByZXR1cm4gRFJWX0VSUl9CVVNZOw0KLQ0KLQ0KLQkJcmV0ID0gekRydkV4dEF1ZGlvX1dyaXRlX1N0b3AoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCB6RHJ2STJTX1dyaXRlX1N0b3AgZXJyLCByZXQ9JWRcbiIsIHJldCk7DQotCQl9DQotDQotCQlyZXQgPSB6RHJ2RXh0QXVkaW9fQ2xvc2UoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCB6RHJ2STJTX0Nsb3NlIGVyciwgIHJldD0lZFxuIiwgcmV0KTsNCi0NCi0JCX0NCi0NCi0JCXJldCA9IGhhbFZwQ2ZnX0Rpc2FibGUoKTsNCi0JCWlmIChyZXQgIT0gRFJWX1NVQ0NFU1MpDQotCQl7DQotCQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCBoYWxWcENmZ19FbmFibGUgZXJyIHJldD0leCAhXG4iLCByZXQpOw0KLQkJfQ0KLQ0KLQkJcmV0ID0gaGFsVnBDZmdfU2V0SW5wdXRQYXRoKGdfdm9pY2VWYXIudnBQYXRoLCBGQUxTRSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3Agdm9pY2VfU2V0UGFodEluIGhhbFZwQ2ZnX1NldElucHV0UGF0aCBlcnIgcmV0PSVkICFcbiIsIHJldCk7DQotDQotCQl9DQotCQlyZXQgPSBoYWxWcENmZ19TZXRPdXRwdXRQYXRoKGdfdm9pY2VWYXIudnBQYXRoLCBGQUxTRSk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3Agdm9pY2VfU2V0UGFodE91dCBoYWxWcENmZ19TZXRPdXRwdXRQYXRoIGVyciByZXQ9JWQgIVxuIiwgcmV0KTsNCi0NCi0JCX0NCi0NCi0JCXJldCA9IGhhbFZwQ2ZnX0Nsb3NlKCk7DQotCQlpZiAocmV0ICE9IERSVl9TVUNDRVNTKQ0KLQkJew0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJ6RHJ2VnBfUmluZ1N0b3AgaGFsX1ZwQ2ZnX0Nsb3NlIGVyciByZXQ9JWQiLCByZXQpOw0KLQkJCXJldHVybiBEUlZfRVJST1I7DQotCQl9DQotDQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHJpbmdzdG9wICBjbG9zZSBkZXYgZW5kIVxuIik7DQotDQotCX0NCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgInpEcnZWcF9SaW5nU3RvcCBlbmRcbiIpOw0KLQ0KLQlyZXR1cm4gcmV0Ow0KLX0NCi0NCi0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX1VTRV9WUF9JMlNfU1lOQw0KLQ0KLWV4dGVybiBTSU5UMzIgZ0kyc0RtYVJlYWRJbnRUaW1lW01BWF9JMlNfSURdOw0KLWV4dGVybiBTSU5UMzIgZ0kyc0RtYVdyaXRlSW50VGltZVtNQVhfSTJTX0lEXTsNCi1leHRlcm4gU0lOVDMyIGdJMnNUaW1lczsNCi1leHRlcm4gU0lOVDMyIGdJMnNDbnRDaGFuZ2VUeFtNQVhfSTJTX0lEXTsNCi1leHRlcm4gU0lOVDMyIGdJMnNDbnRDaGFuZ2VSeFtNQVhfSTJTX0lEXTsNCi1WT0lEIFZwX0kyUzFSZWFkQ2hhbmdlQnVmTGVuKFZPSUQpDQotew0KLSNpZiAwIC8vbGF0ZXN0IHVzZQ0KLQlTSU5UMzIgY3VycmVudFRpbWVEaWZmID0gMDsNCi0NCi0JZ0kyc1RpbWVzKys7DQotCWlmIChnSTJzVGltZXMgPD0gMikNCi0Jew0KLQkJZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXSA9IHpEcnZUaW1lcl9TdGFtcCgpOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlZwX0kyUzFSZWFkQ2hhbmdlQnVmTGVuIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV0gPSVkLlxuIiwgZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXSk7DQotCQlpZiAoZ0kyc1RpbWVzID09IDIpDQotCQl7DQotCQkJY3VycmVudFRpbWVEaWZmID0gZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXSAtIDIwMDAwIC0gZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMV07DQotCQkJZ0kyc0NudENoYW5nZVR4W0kyU18xXSA9IChjdXJyZW50VGltZURpZmYgLSAxMDAwKSAvIDEyNSAvIDIgKiAyOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWcF9JMlMxUmVhZENoYW5nZUJ1ZkxlbiBnSTJzQ250Q2hhbmdlVHhbSTJTXzFdID0lZC5cbiIsIGdJMnNDbnRDaGFuZ2VUeFtJMlNfMV0pOw0KLQ0KLQkJCWN1cnJlbnRUaW1lRGlmZiA9IGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV0gLSAyMDAwMCAtIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl07DQotCQkJZ0kyc0NudENoYW5nZVJ4W0kyU18yXSA9IChjdXJyZW50VGltZURpZmYgLSAyMDAwKSAvIDEyNSAvIDIgKiAyOw0KLQkJCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWcF9JMlMxUmVhZENoYW5nZUJ1ZkxlbiBnSTJzQ250Q2hhbmdlUnhbSTJTXzJdID0lZC5cbiIsIGdJMnNDbnRDaGFuZ2VSeFtJMlNfMl0pOw0KLQ0KLQkJCWN1cnJlbnRUaW1lRGlmZiA9IGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV0gLSAyMDAwMCAtIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzJdOw0KLQkJCWdJMnNDbnRDaGFuZ2VUeFtJMlNfMl0gPSAoY3VycmVudFRpbWVEaWZmIC0gMzAwMCkgLyAxMjUgLyAyICogMjsNCi0JCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVnBfSTJTMVJlYWRDaGFuZ2VCdWZMZW4gZ0kyc0NudENoYW5nZVR4W0kyU18yXSA9JWQuXG4iLCBnSTJzQ250Q2hhbmdlVHhbSTJTXzJdKTsNCi0JCX0NCi0JfQ0KLSNlbmRpZg0KLQ0KLSNpZiAwDQotCWlmIChnSTJzVGltZXMgPT0gMTApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJnSTJzVGltZXMgPT0gMTAgZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXT0lZC5cbiIsIHpEcnZUaW1lcl9TdGFtcCgpKTsNCi0JfQ0KLQ0KLQlpZiAoZ0kyc1RpbWVzID09IDIwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZ0kyc1RpbWVzID09IDIwIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSA1MDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJnSTJzVGltZXMgPT0gNTAwIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSAxMDAwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiZ0kyc1RpbWVzID09IDEwMDAgZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXT0lZC5cbiIsIHpEcnZUaW1lcl9TdGFtcCgpKTsNCi0JfQ0KLQ0KLQlpZiAoZ0kyc1RpbWVzID09IDE1MDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJnSTJzVGltZXMgPT0gMTUwMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzFdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMzAwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgImdJMnNUaW1lcyA9PSAzMDAwIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0jZW5kaWYNCi0NCi0JZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18xXSArPSAxOw0KLX0NCi0NCi1WT0lEIFZwX0kyUzFXcml0ZUNoYW5nZUJ1ZkxlbihWT0lEKQ0KLXsNCi0jaWYgMCAvL2xhdGVzdCB1c2UNCi0JaWYgKGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdID09IDApDQotCXsNCi0JCWdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdID0gekRydlRpbWVyX1N0YW1wKCk7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiVnBfSTJTMldyaXRlQ2hhbmdlQnVmTGVuIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdID0lZC5cbiIsIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdKTsNCi0JfQ0KLSNlbmRpZg0KLQ0KLSNpZiAwDQotCWlmIChnSTJzVGltZXMgPT0gMTApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDEwIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMjApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDIwIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gNTAwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGdJMnNUaW1lcyA9PSA1MDAgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMV09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSAxMDAwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGdJMnNUaW1lcyA9PSAxMDAwIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzFdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMTUwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMTUwMCBnSTJzRG1hV3JpdGVJbnRUaW1lW0kyU18xXT0lZC5cbiIsIHpEcnZUaW1lcl9TdGFtcCgpKTsNCi0JfQ0KLQ0KLQlpZiAoZ0kyc1RpbWVzID09IDMwMDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDMwMDAgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMV09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0jZW5kaWYNCi0NCi19DQotDQotVk9JRCBWcF9JMlMyUmVhZENoYW5nZUJ1ZkxlbihWT0lEKQ0KLXsNCi0jaWYgMCAvL2xhdGVzdCB1c2UNCi0JaWYgKGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl0gPT0gMCkNCi0Jew0KLQkJZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18yXSA9IHpEcnZUaW1lcl9TdGFtcCgpOw0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIlZwX0kyUzJSZWFkQ2hhbmdlQnVmTGVuIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl0gPSVkLlxuIiwgZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18yXSk7DQotCX0NCi0jZW5kaWYNCi0jaWYgMA0KLQlpZiAoZ0kyc1RpbWVzID09IDEwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGdJMnNUaW1lcyA9PSAxMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMjApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDIwIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSA1MDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDUwMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMTAwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMTAwMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMTUwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMTUwMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMzAwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMzAwMCBnSTJzRG1hUmVhZEludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotI2VuZGlmDQotCWdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl0gKz0gMTsNCi0NCi0JaWYgKCEoZ0kyc0RtYVJlYWRJbnRUaW1lW0kyU18yXSAlIDUwKSkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIltJMlNfMV09JWQ7W0kyU18yXT0lZC5cbiIsIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMV0sIGdJMnNEbWFSZWFkSW50VGltZVtJMlNfMl0pOw0KLQl9DQotfQ0KLQ0KLVZPSUQgVnBfSTJTMldyaXRlQ2hhbmdlQnVmTGVuKFZPSUQpDQotew0KLSNpZiAwIC8vbGF0ZXN0IHVzZQ0KLQlpZiAoZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl0gPT0gMCkNCi0Jew0KLQkJZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl0gPSB6RHJ2VGltZXJfU3RhbXAoKTsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJWcF9JMlMyV3JpdGVDaGFuZ2VCdWZMZW4gZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl0gPSVkLlxuIiwgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl0pOw0KLQl9DQotI2VuZGlmDQotI2lmIDANCi0JaWYgKGdJMnNUaW1lcyA9PSAxMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMTAgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSAyMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMjAgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSA1MDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDUwMCBnSTJzRG1hV3JpdGVJbnRUaW1lW0kyU18yXT0lZC5cbiIsIHpEcnZUaW1lcl9TdGFtcCgpKTsNCi0JfQ0KLQ0KLQlpZiAoZ0kyc1RpbWVzID09IDEwMDApDQotCXsNCi0JCXpEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICIgZ0kyc1RpbWVzID09IDEwMDAgZ0kyc0RtYVdyaXRlSW50VGltZVtJMlNfMl09JWQuXG4iLCB6RHJ2VGltZXJfU3RhbXAoKSk7DQotCX0NCi0NCi0JaWYgKGdJMnNUaW1lcyA9PSAxNTAwKQ0KLQl7DQotCQl6RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGdJMnNUaW1lcyA9PSAxNTAwIGdJMnNEbWFXcml0ZUludFRpbWVbSTJTXzJdPSVkLlxuIiwgekRydlRpbWVyX1N0YW1wKCkpOw0KLQl9DQotDQotCWlmIChnSTJzVGltZXMgPT0gMzAwMCkNCi0Jew0KLQkJekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiBnSTJzVGltZXMgPT0gMzAwMCBnSTJzRG1hV3JpdGVJbnRUaW1lW0kyU18yXT0lZC5cbiIsIHpEcnZUaW1lcl9TdGFtcCgpKTsNCi0JfQ0KLSNlbmRpZg0KLQ0KLX0NCi0NCi0jZW5kaWYNCi1TSU5UMzIgekRydlZwX0dldFZvaWNlU3RhdGUoVk9JRCAqKnBWb2ljZVN0YXRlKQ0KLXsNCi0JLy9TSU5UMzIgcmV0ID0gRFJWX1NVQ0NFU1M7Ly94aXUgZ2FpIGNodQ0KLQkqcFZvaWNlU3RhdGUgPSAmZ192b2ljZVZhcjsNCi0JekRydlJhbWxvZ19QUklOVEYoUkFNTE9HX01PRF9BVURJTywgIiB6RHJ2VnBfR2V0Vm9pY2VTdGF0ZSBwVm9pY2VTdGF0ZT0lcC5cbiIsICpwVm9pY2VTdGF0ZSk7DQotCXJldHVybiBEUlZfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIEZ1bmN0aW9uOiB6RHJ2RWNhbGxfU2V0T3BlcmF0aW9ucw0KLSogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGVjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uLg0KLSogUGFyYW1ldGVyczogDQotKiAgIElucHV0Og0KLSogICAgICAgICAgIFZvaWNlT2JqUHRyOlRoZSBwb2ludGVyIHRvIGVjYWxsIGNhbGxiYWNrIGZ1bmN0aW9uIHR5cGUuIA0KLSogICBPdXRwdXQ6Tm9uZQ0KLSoNCi0qIFJldHVybnM6IG5vbmUNCi0qDQotKiBPdGhlcnM6IA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekRydkVjYWxsX1NldENhbGxiYWNrcyhUX0RydkVjYWxsX09wdCBlY2FsbE9iaikNCi17DQotICAgIGdfdm9pY2VWYXIuZWNhbGxEYXRhLm9wdCA9IGVjYWxsT2JqOw0KLX0NCi0NCi0NCi1TSU5UMzIgZHJ2X0dldF9FY2FsbF9TdGF0ZShWT0lEKQkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIHpEcnZWcF9HZXRWb2ljZVN0YXRlIHBWb2ljZVN0YXRlPSVwLlxuIiwgKnBWb2ljZVN0YXRlKTsNCi0JcmV0dXJuIDE7DQotfQ0KLQ0KLVNJTlQzMiBkcnZfRWNhbGxfUmVhZChVSU5UOCAqcEJ1ZixVSU5UMzIgKmluU2l6ZSkNCi17DQotCVNJTlQzMiByZXQgPSBEUlZfU1VDQ0VTUzsNCi0JLy96RHJ2UmFtbG9nX1BSSU5URihSQU1MT0dfTU9EX0FVRElPLCAiIGRydl9FY2FsbF9SZWFkXG4iKTsNCi0JcmV0dXJuIERSVl9TVUNDRVNTOw0KLX0NCi0NCi1TSU5UMzIgZHJ2X0VjYWxsX1dyaXRlKFVJTlQ4ICpwQnVmLFVJTlQzMiBpblNpemUpCSAgIA0KLXsNCi0JU0lOVDMyIHJldCA9IERSVl9TVUNDRVNTOw0KLQkvL3pEcnZSYW1sb2dfUFJJTlRGKFJBTUxPR19NT0RfQVVESU8sICJkcnZfRWNhbGxfV3JpdGVcbiIpOw0KLQlyZXR1cm4gRFJWX1NVQ0NFU1M7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL21vZGVtL2NvbS9zcmMvYXBwc3RhcnQvaW5jL3ZlcnNpb25fbnVtYmVyLmggYi9VYm9vdC9jcC9wcy9tb2RlbS9jb20vc3JjL2FwcHN0YXJ0L2luYy92ZXJzaW9uX251bWJlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNzJmMTMxLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL21vZGVtL2NvbS9zcmMvYXBwc3RhcnQvaW5jL3ZlcnNpb25fbnVtYmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpZiBkZWZpbmVkIF9DSElQX1pYMjk3NTIwCi0jZGVmaW5lIFZFUlNJT05fTlVNQkVSICI3NTIwU0NWMi4wMS4wMS4wMlA1NlUwNiIKLSNlbmRpZgotI2lmIGRlZmluZWQgX0NISVBfWlgyOTc1MjBWMgotI2RlZmluZSBWRVJTSU9OX05VTUJFUiAiNzUyMFYyU0NWMi4wMS4wMS4wMlA1NlUwNiIKLSNlbmRpZgotI2lmIGRlZmluZWQgX0NISVBfWlgyOTc1MjBWMwotI2RlZmluZSBWRVJTSU9OX05VTUJFUiAiNzUyMFYzU0NWMi4wMS4wMS4wMlA1NlUwNiIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvVWJvb3QvY3AvcHMvbW9kZW0vcHMvaW5jL2FwdWljY2ludC5oIGIvVWJvb3QvY3AvcHMvbW9kZW0vcHMvaW5jL2FwdWljY2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2QzNjRmLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL21vZGVtL3BzL2luYy9hcHVpY2NpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrDmsb7L+dPQIChDKTIwMDfW0NDLzajRtrnJt93T0M/euavLvg0KLSogIMSjv+nD+yAgo7oNCi0qICDOxLz+w/sgIKO6YXBVaWNjSW50LmgNCi0qICDOxLz+serKtqO6DQotKiAgz+C52M7EvP6jug0KLSogIMq1z9a5psTco7pVSUNDttTN4szhuam1xL3Tv9rK/b7dveG5ubao0uUNCi0qICDX99XfICAgIKO6DQotKiAgsOaxviAgICCjujEuMC4wDQotKiAgzeqzycjVxtqjujIwMDcuMTAuMQ0KLSogIMbky/zLtcP3o7oNCi0qDQotKiAg0N64xLzHwrwxo7oNCi0qICAgIMjVICDG2qO6MjAwOC43LjI0DQotKiAgICDQ3rjEyMujumx1aHVhbg0KLSogICAg0N64xMTayN2jqNeiOrD8wKjQ3rjEtcTUrdLyvLC6r8r9o6mjug0KLSogICAgICAgMSlFZmVjYyBFZmFkIEVmc3N0tci94bm50tTC+tfjMkczR73hubm1xLrPsqINCi0qICAgICAgIDIp0N64xMHLa2V5aWQNCi0qICAgICAgIDMpvavUrbao0uXU2rHgveLC67P2tcQyR87EvP694bm5zOHIobP2sqK3xcjrYXBVaWNjSW5pdC5o1tANCi0NCi0qICDQ3rjEvMfCvDKjug0KLSogICAgyNUgIMbao7oyMDA4LjkuNA0KLSogICAg0N64xMjLo7psdWh1YW4NCi0qICAgINDeuMTE2sjdo6jXojqw/MCo0N64xLXE1K3S8rywuq/K/aOpo7oNCi0qICAgICAgIDEpzqrX8dGtveG5uTTX1r3attTG66OsttTPwsHQveG5udT2vNPM7rPk19a92qO6DQotICAgICAgICAgICAgVF96UFNfVUlDQ19BQ01tYXiholRfelBTX1VJQ0NfR0lEMaGiVF96UFNfVUlDQ19HSUQyoaJUX3pQU19VSUNDX0NCTUmhog0KLSAgICAgICAgICAgIFRfelBTX1VJQ0NfQ2JtaWSholRfelBTX1VJQ0NfRXh0MqGiVF96UFNfVUlDQ19FeHQzoaJUX3pQU19VSUNDX1NsbA0KLSAgICAgICAgMinPwsHQveG5udLGyOtwc0NvbS5oo7oNCi0gICAgICAgICAgICBUX3pQU19VSUNDX0hwUGxtblNyaFByZKO9obdUX3pQU19VaWNjSWRfSHBQbG1uU3JoUHJkDQotICAgICAgICAgICAgVF96UFNfVUlDQ19BQ0OjvaG3VF96UFNfVWljY0lkX0FDQw0KLSAgICAgICAgICAgIFRfelBTX1VJQ0NfQWFlbaO9obdUX3pQU19VaWNjSWRfQWFlbQ0KLQ0KLSogINDeuMS8x8K8M6O6DQotKiAgICDI1SAgxtqjujIwMDguMTAuMTUNCi0qICAgINDeuMTIy6O6bHVodWFuDQotKiAgICDQ3rjExNrI3aO6DQotKiAgICAgICAxKc6q1qez1r+o1tBSRlXX1rbOseSzpLSmwO2jrL3hublUX3pQU19VSUNDX1Ntc3PW0NT2vNNiUmZ1TnVtss7K/aGjDQotDQotKiAg0N64xLzHwrw0o7oNCi0qICAgIMjVICDG2qO6MjAwOC4xMC4yNw0KLSogICAg0N64xMjLo7psdWh1YW4NCi0qICAgINDeuMTE2sjdo7oNCi0qICAgICAgIDEpdXN0veG5udDeuMSjrL2r1K3PyMO709C2qNLltcRleHRlbnNpb27OxLz+seq8x867tqjS5b34yKUNCi0qICAgICAgIDIp1Pa800NCTUlEyv3X6cnPz94NCi0qICAgICAgIDPQ3rjERUZwbG1uc2VsveG5uaOs0N64xLe9yr23wtTsRlBMTU4NCi0NCi0qICDQ3rjEvMfCvDWjug0KLSogICAgyNUgIMbao7oyMDA4LjEyLjE1DQotKiAgICDQ3rjEyMujunlhbmd5dW4NCi0qICAgINDeuMTE2sjdo7oNCi0qICAgICAgIDEpVF96UFNfQXBVaWNjX0F1dGhfQ25mveG5udDeuMSjrNT2vNNiUmVzTGVuss7K/aOs0tTWuMq+yrW8ylJFU9PQ0Ke49sr9DQotDQotKiAg0N64xLzHwrw2o7oNCi0qICAgIMjVICDG2qO6MjAwOS4wMS4xMw0KLSogICAg0N64xMjLo7psdWh1YW4NCi0qICAgINDeuMTE2sjdo7oNCi0qICAgICAgIDEp0N64xL3hubnM5VZnY3MgVmJzIENwYmNjaL3hubnS1LHcw+JXT1JEtPPQobbLzsrM4g0KLQ0KLSogINDeuMS8x8K8N6O6DQotKiAgICDI1SAgxtqjujIwMDkuMDIuMTYNCi0qICAgINDeuMTIy6O6bHVodWFuDQotKiAgICDQ3rjExNrI3aO6DQotKiAgICAgICAxKdStsM6/qM/7z6KjrM/Uyr3KudPDTm9DYXJkSW5kz/vPos2o1qrQrdLp1bu6zU1NSaGjz9ZNTUnSqsfzsuWhorDOv6i6z9PD0rvM9c/7z6Khow0KLSAgICAgICAgICDU8k5vQ2FyZEluZL3208PT2tCt0unVu6OsucrJvrP91K294bm51tBiU3JjSW5kZXihomJEZXN0SW5kZXijrLjEseTOqr/Vz/vPoqGjDQotDQotKiAg0N64xLzHwrw4o7oNCi0qICAgIMjVICDG2qO6MjAwOS4wMi4yMw0KLSogICAg0N64xMjLo7pqaWFuZ3poYW9jaHVuDQotKiAgICDQ3rjExNrI3aO6DQotKiAgICAgICAxKVRfelBTX1VJQ0NfU2ltUGxtbnNlbL3hubmxu9LGtq+1vXBzQ29tLmjW0KOstMu94bm5sbvJvrP9oaMNCi0NCi0gKiAg0N64xLzHwrw5o7oNCi0gKiAgICDI1SAgxtqjujIwMDguMDIuMjQNCi0gKiAgICDQ3rjEyMs6IGx1aHVhbg0KLSAqICAgINDeuMTE2sjdo7oNCi0gKiAgICAgIDEp1qez1lVTQVS5psTcDQotICogICAgICAyKcm+s/3I39PgtcRSRlW2qNLl19a2zqO6VF96UFNfVUlDQ19BZKGiVF96UFNfVUlDQ19TaW1DQ1ANCi0gDQotICAqICDQ3rjEvMfCvDmjug0KLSAqICAgIMjVICDG2qO6MjAwOS4wMy4xOA0KLSAqICAgINDeuMTIyzogd2FuZ3hpYW9qaW4NCi0gKiAgICDQ3rjExNrI3aO6DQotICogICAgICAxKdDeuMS66ta1WlBTX0FQVUlDQ19VU0FUX01BWF9SRU1BRERSX0xFTixaUFNfQVBVSUNDX1VTQVRfTUFYX0lURU1fTlVNo7sNCi0gKiAgICAgIDIpyb6z/b3hublUX3pQU19BcFVpY2NfVVNBVF9TbXNEb3duQ25mtcRiQ29tUmx0o7sNCi0gKiAgICAgIDMp1Nq94bm5VF96UFNfQXBVaWNjX1VTQVRfRW52ZWxvcENtZF9DbmbW0NT2vNO07c7zwuujuw0KLSAqICAgICAgNCnJvrP9veG5uVRfelBTX0FwVWljY19VU0FUX0NhbGxDdHJsQWN0tcRiU3RydWN0RmcsINPJYlVuaW9use3KvrTm1NrQ1DsNCi0gKiAgICAgIDUpyb6z/b3hublUX3pQU19BcFVpY2NfVVNBVF9DYWxsQ3RybLXEQ3RyU3RyRmcs08kgYlVuaW9use3KvrTm1NrQ1DsNCi0gKiAgICAgIDYp1Pa803VzYXS94bm51tB1bmlvbsih1rWx6sq2zru1xNeiys2juw0KLSAqICAgICAgNym9q1VTQVTD/MHuveG5udbQtcTUtMS/tcTL99L9yb6z/aOssqLX1r3attTG66O7DQotDQotICogINDeuMS8x8K8MTCjug0KLSAqICAgIMjVICDG2qO6MjAwOS4wMy4zMA0KLSAqICAgINDeuMTIyzogbHVodWFuDQotICogICAg0N64xMTayN2jug0KLSAqICAgICAgMSnQ3rjEuurWtVpQU19VSUNDX0xFTl9GUExNTrTTNrW9ODUssLS/qNbQzsS8/tfutPOzpLbItqjS5Q0KLSANCi0gICogINDeuMS8x8K8MTGjug0KLSAqICAgIMjVICDG2qO6MjAwOS4wNC4wOA0KLSAqICAgINDeuMTIyzogbHVodWFuDQotICogICAg0N64xMTayN2jug0KLSAqICAgICAgMSnOqsHLsdzD4tPrcHNDb20uaNbQveG5ubao0uWz5c27o6zM2NLGs/3S1M/CveG5uaO6DQotICAgICAgICAgIEVmYWQgIEVGa2V5cyBFRmtleXNwcyAgRUZrYyBFRmtjZ3BycyBFZmhwbG1uIEVGdXBsbW4gRWZvcGxtbiAgRWZzdGFydCAgIEVmdGhyZXNob2xkDQotDQotICogINDeuMS8x8K8MTKjug0KLSAqICAgIMjVICDG2qO6MjAwOS4wNC4yMQ0KLSAqICAgINDeuMTIyzogbHVodWFuDQotICogICAg0N64xMTayN2jutDeuMS94bm5VF96UFNfVUlDQ19DQk1Jo6xUX3pQU19VSUNDX0NibWlyDQotIA0KLSAgKiAg0N64xLzHwrwxM6O6DQotICogICAgyNUgIMbao7oyMDA5LjQuMjgNCi0gKiAgICDQ3rjEyMujumx1aHVhbg0KLSAqICAgINDeuMTE2sjdo6jXojqw/MCo0N64xLXE1K3S8rywuq/K/aOpo7oNCi0gKiAgIM6qyrm2wcihuPzQwrPJuaajrCDU3cqx1Pa087K/t9a66ta1o6wNCi0gICogIFpQU19VSUNDX0xFTl9MSURBVEEgLCBaUFNfVUlDQ19MRU5fRkROICwgWlBTX1VJQ0NfTEVOX1NETiwgDQotICBaUFNfVUlDQ19MRU5fSUNJLCAgWlBTX1VJQ0NfTEVOX09DSSAsICBaUFNfVUlDQ19MRU5fQ0NQMiwgICBaUFNfVUlDQ19MRU5fQkROICAsIA0KLSAgWlBTX1VJQ0NfTEVOX0VTVCwgICAgWlBTX1VJQ0NfTEVOX0FDTCwgIFpQU19VSUNDX0xFTl9OSUEsICBaUFNfVUlDQ19MRU5fSUFQLA0KLSAgWlBTX1VJQ0NfTEVOX0FETiwgICBaUFNfVUlDQ19MRU5fQUFTICwgICBaUFNfVUlDQ19MRU5fR0FTLCAgWlBTX1VJQ0NfTEVOX1NORSAgLA0KLSAgWlBTX1VJQ0NfTEVOX0NDUDEsICBaUFNfVUlDQ19MRU5fRU1BSUwsIFpQU19VSUNDX1NJTV9MUCAsICBaUFNfVUlDQ19TSU1fTE5EICANCi0gIA0KLSAgICogINDeuMS8x8K8MTSjug0KLSAqICAgIMjVICDG2qO6MjAwOS4wNy4wMg0KLSAqICAgINDeuMTIyzogbHVodWFuDQotICogICAg0N64xMTayN2jutT2vNO94bm5IA0KLSAgICAgICBUX3pQU19BcFVpY2NfUGluRW5hYmxlUXVlcnlfUmVxDQotICAgICAgIFRfelBTX0FwVWljY19QaW5FbmFibGVRdWVyeV9DbmYNCi0gICAgICAgVF96UFNfQXBVaWNjX1BpblN0YXRRdXJleV9SZXENCi0gICAgICAgVF96UFNfQXBVaWNjX1BpblN0YXRRdXJleV9DbmYNCi0gICAgICAgVF96UFNfQXBVaWNjX0NhcmRNb2RlX1JlcQ0KLSAgICAgICBUX3pQU19BcFVpY2NfQ2FyZE1vZGVfQ25mDQotICAgICAgINDeuMS94bm5OiBUX3pQU19BcFVpY2NfTm9DYXJkX0luZA0KLSAgICAgICDU9rzTuuo6IA0KLSAgICAgICBaUFNfQXBVaWNjX1NFVF9PSw0KLSAgICAgICBaUFNfQXBVaWNjX1BJTl9SRUFEWQ0KLSAgICAgICBaUFNfQXBVaWNjX1BJTl9TSU1QSU4NCi0gICAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLDQotICAgICAgIFpQU19BcFVpY2NfUElOX1NJTVBJTjINCi0gICAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLMg0KLSAgICAgICBaUFNfQXBVaWNjX1BJTl9OT1RBQ1RJVkUNCi0gICAgICAgWlBTX0FwVWljY19QSU5fQUNUSVZFDQotICAgICAgIFpQU19BcFVpY2NfQ0FSRF9TVEFVVFNfSU5WQUxJRA0KLSAgICAgICBaUFNfQXBVaWNjX0NBUkRfU1RBVVRTX05PQ0FSRA0KLSAgICAgICBaUFNfQXBVaWNjX0NBUkRfU1RBVVRTX1BJTkVSUk9SDQotICAgICAgIFpQU19BcFVpY2NfQ0FSRF9TVEFVVFNfTkVFRFVOQkxQSU4NCi0gICAgICAgWlBTX0FwVWljY19DQVJEX1NUQVVUU19FVlVMU0lPTg0KLSAgICAgICBaUFNfQXBVaWNjX0NBUkRfVFlQRV9VSUNDICAgDQotICAgICAgIFpQU19BcFVpY2NfQ0FSRF9UWVBFX1NJTSAgICANCi0gICAgICAgWlBTX0FwVWljY19DQVJEX1RZUEVfTlVMTCAgICAgICAgICAgICAgIA0KLSAgICAgICANCi0gKiAg0N64xLzHwrwxNaO6DQotICogICAgyNUgIMbao7oyMDA5LjA3LjE2DQotICogICAg0N64xMjLOiBsdWh1YW4NCi0gKiAgICDQ3rjExNrI3aO60N64xL3hubkgDQotICAgICAgIFRfelBTX0FwVWljY19QaW5TdGF0UXVyZXlfQ25mDQotICAgICAgVF96UFNfQXBVaWNjX1BpbkVuYWJsZVF1ZXJ5X0NuZg0KLSAgICAgIL2rv6jXtMysuurWtdLGyOtwc0NvbS5o1tANCi0gICAgICANCi0gICogINDeuMS8x8K8MTajug0KLSAqICAgIMjVICDG2qO6MjAwOS4wNy4yMQ0KLSAqICAgINDeuMTIyzogbHVodWFuDQotICogICAg0N64xMTayN2jutDeuMQgU01TzsS8/r3hubkNCi0gDQotICAgKiAg0N64xLzHwrwxN6O6DQotICogICAgyNUgIMbao7oyMDA5LjA3LjI3DQotICogICAg0N64xMjLOiBsdWh1YW4NCi0gKiAgICDQ3rjExNrI3aO60N64xLOktsjO3rHqyr7H6b/2o6zQ3rjEveG5ucjnz8INCi0gICAgICBUX3pQU19VSUNDX1NpbUxORA0KLSAgICAgIFRfelBTX1VJQ0NfRGlyDQotICAgICAgVF96UFNfVUlDQ19GZG4NCi0gICAgICBUX3pQU19VSUNDX01zaXNkbg0KLSAgICAgIFRfelBTX1VJQ0NfU2RuDQotICAgICAgVF96UFNfVUlDQ19JY2kNCi0gICAgICBUX3pQU19VSUNDX09jaQ0KLSAgICAgIFRfelBTX1VJQ0NfQmRuDQotICAgICAgVF96UFNfVUlDQ19DbWkNCi0gICAgICBUX3pQU19VSUNDX01iZG4NCi0gICAgICBUX3pQU19VSUNDX0Fkbg0KLSAgICAgIFRfelBTX1VJQ0NfU25lDQotICAgICAgVF96UFNfVUlDQ19BYXMNCi0gICAgICBUX3pQU19VSUNDX0dhcw0KLSAgICAgIFRfelBTX1VJQ0NfRW1haWwNCi0gICAgICBUX3pQU19VSUNDX0FwUGJFbnRyeQ0KLSAgICAgIFRfelBTX1VJQ0NfQXBFbWFpbDtUX3pQU19VSUNDX0FwU25lDQotICAgICAgDQotICogINDeuMS8x8K8MTejug0KLSAqICAgIMjVICDG2qO6MjAwOS4xMS4xNw0KLSAqICAgINDeuMTIyzogs8LOxA0KLSAqICAgINDeuMTE2sjdo7rQ3rjEs6S2yM7eserKvsfpv/ajrNDeuMS94bm5yOfPwqOsyb6z/cHLYkFscGhhSWRMZW6yzsr9DQotICAgICAgVF96UFNfVUlDQ19TaW1MTkQNCi0gICAgICBUX3pQU19VSUNDX0Rpcg0KLSAgICAgIFRfelBTX1VJQ0NfRmRuDQotICAgICAgVF96UFNfVUlDQ19Nc2lzZG4NCi0gICAgICBUX3pQU19VSUNDX1Nkbg0KLSAgICAgIFRfelBTX1VJQ0NfSWNpDQotICAgICAgVF96UFNfVUlDQ19PY2kNCi0gICAgICBUX3pQU19VSUNDX0Jkbg0KLSAgICAgIFRfelBTX1VJQ0NfQ21pDQotICAgICAgVF96UFNfVUlDQ19NYmRuDQotICAgICAgVF96UFNfVUlDQ19BZG4NCi0gICAgICBUX3pQU19VSUNDX1NuZQ0KLSAgICAgIFRfelBTX1VJQ0NfQWFzDQotICAgICAgVF96UFNfVUlDQ19HYXMNCi0gICAgICBUX3pQU19VSUNDX0VtYWlsDQotICAgICAgVF96UFNfVUlDQ19BcFBiRW50cnkNCi0gICAgICBUX3pQU19VSUNDX0FwRW1haWw7VF96UFNfVUlDQ19BcFNuZQ0KLSAgICAgIA0KLSAgICAgINDeuMTBy1RfelBTX1VJQ0NfU1BOtcS94bm5DQotDQotICAgICAgDQotICogINDeuMS8x8K8MTmjug0KLSAqICAgIMjVICDG2qO6MjAwOS4xMi4wMyANCi0gKiAgICDQ3rjEyMs6IGNoZW53ZW4NCi0gKiAgICDQ3rjExNrI3aO61Pa80yBBVCDD/MHuIENSU00gy/m21NOmtcTP+8+iveG5uczlDQotICAgICAgICAgICAgICAgINT2vNMgVF96UFNfQXBVaWNjX0NvbW1vbl9DbmYgz/vPog0KLSAgICAgICAgICAgICAgICC199X7IFpQU19BcFVpY2NfTUFYX0RBVEFfVkFMILTz0KHOqjIwMjijrMq5veG5uczl19yzpLK7s6y5/TIwNDgNCi0NCi0gKiAg0N64xLzHwrwyMKO6DQotICogICAgyNUgIMbao7oyMDEwLjAxLjA1IA0KLSAqICAgINDeuMTIyzogY2hlbndlbg0KLSAqICAgINDeuMTE2sjdo7rQ3rjEWlBTX1VJQ0NfTEVOX01TSVNETiC1xLrq1rUNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0N64xCBJTUcgILXEveG5uczlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDU9rzTIElNR8/gudi1xElEDQotDQotICogINDeuMS8x8K8MjGjug0KLSAqICAgIMjVICDG2qO6MjAxMC4wNC4xNSANCi0gKiAgICDQ3rjEyMs6IGx1aHVhbg0KLSAqICAgINDeuMTE2sjdo7rU9rzTTFRF1qez1g0KLSANCi0qICDQ3rjEvMfCvDIyo7oNCi0gKiAgICDI1SAgxtqjujIwMTAuMDQuMjcgDQotICogICAg0N64xMjLOiBjaGVud2VuDQotICogICAg0N64xMTayN2jurX31fu907/a16LKzaOs1Pa8005vQ2FyZLTtzvPC69a4yr6jrMnmvLC907/a09ANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVF96UFNfQXBVaWNjX1VpY2NPa19JbmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVF96UFNfQXBVaWNjX1Bpbl9DbmYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVF96UFNfQXBVaWNjX1JlYWRfQ25mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfelBTX0FwVWljY19QaW5SZW1haW5OdW1fQ25mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfelBTX0FwVWljY19VcGRhdGVfQ25mDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfelBTX0FwVWljY19HZXRJbmZvX0NuZg0KLQ0KLSAqICDQ3rjEvMfCvDIzo7oNCi0gKiAgICDI1SAgxtqjujIwMTAuMDUuMTQgDQotICogICAg0N64xMjLOiB3YW5neGlhb2ppbg0KLSAqICAgINDeuMTE2sjdo7rQ3rjEVVNBVM/gudi907/ao6y8xsjrY21kRGV0YWlscw0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfR2V0SW5rZXlDbWQsVF96UFNfQXBVaWNjX1VTQVRfTVRpbWVDbWQsVF96UFNfQXBVaWNjX1VTQVRfUGxheVRvbmVDbWQsDQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9Qb2xsQ21kLFRfelBTX0FwVWljY19VU0FUX1NuZFNzQ21kLFRfelBTX0FwVWljY19VU0FUX1NuZFVzc2RDbWQsDQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9Qb2xsT2ZmQ21kLFRfelBTX0FwVWljY19VU0FUX1NldFVwRXZ0TGlzdENtZCxUX3pQU19BcFVpY2NfVVNBVF9QZXJmb3JtQ2FyZEFwZHVDbWQsDQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9Qd3JPZmZDYXJkQ21kLFRfelBTX0FwVWljY19VU0FUX1B3ck9uQ2FyZENtZCxUX3pQU19BcFVpY2NfVVNBVF9TZXRJZGxlTW9kVHh0Q21kLA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfUnVuQVRDbWQsVF96UFNfQXBVaWNjX1VTQVRfUnN2RGF0YUNtZCxUX3pQU19BcFVpY2NfVVNBVF9HZXRDaG5sU3RhdHVzQ21kLA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfU3J2U2VhcmNoQ21kLFRfelBTX0FwVWljY19VU0FUX0dldFNydkluZm9DbWQNCi0NCi0qICDQ3rjEvMfCvDI0o7oNCi0gKiAgICDI1SAgxtqjujIwMTAuMDUuMjIgDQotICogICAg0N64xMjLOiBjaGVud2VuDQotICogICAg0N64xMTayN2jutT2vNNUX3pQU19BcFVpY2NfQWN0aXZlT3JEZWFjdGl2ZUZpbGVfUmVxL1RfelBTX0FwVWljY19BY3RpdmVPckRlYWN0aXZlRmlsZV9DbmYNCi0NCi0gKiAg0N64xLzHwrwyNaO6DQotICogICAgyNUgIMbao7oyMDEwLjA2LjA4IA0KLSAqICAgINDeuMTIyzogd2FuZ3hpYW9qaW4NCi0gKiAgICDQ3rjExNrI3Togzqp1c2F0w/zB7tTaOTAgMDDKsdT2vNPW97avyc+xqM/7z6JUX3pQU19BcFVpY2NfVVNBVF9Ob3Byb2NOb3RpZnlfSW5kDQotICAgICAgzqrPwsHQvdO/2rX31fu07c7zwus6DQotICAgICAgVF96UFNfQXBVaWNjX1Bpbl9DbmYsVF96UFNfQXBVaWNjX1BpbkVuYWJsZVF1ZXJ5X0NuZixUX3pQU19BcFVpY2NfUGluU3RhdFF1cmV5X0NuZg0KLSAgICAgICxUX3pQU19BcFVpY2NfUmVhZF9DbmYsVF96UFNfQXBVaWNjX1BpblJlbWFpbk51bV9DbmYsVF96UFNfQXBVaWNjX1VwZGF0ZV9DbmYNCi0gICAgICBUX3pQU19BcFVpY2NfR2V0SW5mb19DbmYsVF96UFNfQXBVaWNjX1BpbkFwcGxTZXRfQ25mLA0KLSAgICAgIA0KLSogINDeuMS8x8K8Mjajug0KLSAqICAgIMjVICDG2qO6MjAxMC4wNy45DQotICogICAg0N64xMjLOiB3YW5neGlhb2ppbg0KLSAqICAgINDeuMTE2sjdo7rKtc/W0MIzR7Xnu7Cxvre9sLijrNDeuMTI58/CveG5uQ0KLSAgICAgICAgVF96UFNfVUlDQ19QYnJCYXNpYyxUX3pQU19VSUNDX1Bicl9UeXBlLFRfelBTX1VJQ0NfUGJyLFRfelBTX0FwVWljY19SZWFkX1JlcSxUX3pQU19BcFVpY2NfUmVhZF9DbmYNCi0gICAgICAgICxUX3pQU19BcFVpY2NfVXBkYXRlX1JlcSxUX3pQU19BcFVpY2NfVXBkYXRlX0NuZixUX3pQU19BcFVpY2NfR2V0SW5mb19SZXEsVF96UFNfQXBVaWNjX0dldEluZm9fQ25mDQotICAgICAg1Pa8073hubk6DQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9Ob3Byb2NOb3RpZnlfSW5kLCBUX3pQU19BcFVpY2NfRWZTdGF0dXNRdWVyeV9SZXEsVF96UFNfQXBVaWNjX0VmU3RhdHVzUXVlcnlfQ25mLA0KLSAgICAgICAgVF96UFNfQXBVaWNjX0VmU3RhdHVzTW9kaWZ5X1JlcSxUX3pQU19BcFVpY2NfRWZTdGF0dXNNb2RpZnlfQ25mDQotICAgICAgyb6z/cjnz8K94bm5Og0KLSAgICAgICAgVF96UFNfVUlDQ19BcFBiRW50cnksVF96UFNfVUlDQ19BcEVtYWlsLFRfelBTX1VJQ0NfQXBTbmUsVF96UFNfVUlDQ19BcEFucg0KLSAgICAgINT2vNPI58/Cuuq2qNLlOg0KLSAgICAgICAgWlBTX0FwVWljY19VU0lNX1BCX0JBU0UgICAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfRU5UUlkgICAgIA0KLSAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQkVMRU1fQkFTRSAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FETiAgICAgICANCi0gICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfSUFQICAgICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9FWFQxICAgICAgDQotICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX1NORSAgICAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQU5SQSAgICAgIA0KLSAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9QQkMgICAgICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0dSUCAgICAgICANCi0gICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQUFTICAgICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9HQVMgICAgICAgDQotICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX1VJRCAgICAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfRU1BSUwgICAgICAgICAgICANCi0gICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQ0NQMSAgICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BTlJCICAgICAgDQotICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FOUkMgICAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJFTEVNX0VORCAgIA0KLSAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9FTkQgICAgICANCi0gICAgICAgIFpQU19BcFVpY2NfVVNJTV9QQl9CQVNFICAgICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9FWFQxICAgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BQVMgICAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfR0FTICAgICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQ0NQMSAgICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FETl8xICAgICAgICANCi0gICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FETl8yICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BRE5fMyAgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9JQVBfMSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfSUFQXzIgICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfSUFQXzMgICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfU05FXzEgICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX1NORV8yICAgICAgICANCi0gICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX1NORV8zICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9QQkNfMSAgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9QQkNfMiAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfUEJDXzMgICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfR1JQXzEgICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0dSUF8yICAgICAgICANCi0gICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0dSUF8zICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9VSURfMSAgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9VSURfMiAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfVUlEXzMgICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfRU1BSUxfMSAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0VNQUlMXzIgICAgICANCi0gICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0VNQUlMXzMgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BTlJBXzEgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BTlJBXzIgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQU5SQV8zICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQU5SQl8xICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FOUkJfMiAgICAgICANCi0gICAgICAgICBaUFNfQXBVaWNjX0tFWUlEX1BCX0FOUkJfMyAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BTlJDXzEgICAgICAgDQotICAgICAgICAgWlBTX0FwVWljY19LRVlJRF9QQl9BTlJDXzIgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfQU5SQ18zICAgICAgIA0KLSAgICAgICAgIFpQU19BcFVpY2NfS0VZSURfUEJfRU5EICANCi0gKiAg0N64xLzHwrwyNqO6DQotICogICAgyNUgIMbao7oyMDEwLjA5LjI1DQotICogICAg0N64xMjLOiB3YW5neGlhb2ppbg0KLSAgICAgINDeuMTE2sjdOiC94r72zajWqnN0bcv4v6i6zb3iy/jU9rzTVF96UFNfQXBVaWNjX0NhcmRsb2NrU3RhdHVzX0luZA0KLSAgICAgICAgWlBTX0FwVWljY19DYXJkU3RhdHVzX0xvY2ssWlBTX0FwVWljY19DYXJkU3RhdHVzX1VubG9jaw0KLQ0KLSAqICDQ3rjEvMfCvDI2o7oNCi0gKiAgICDI1SAgxtqjujIwMTAuMDkuMjUNCi0gKiAgICDQ3rjEyMs6IHdhbmd4aWFvamluDQotICAgICAg0N64xMTayN06INT2vNNUX3pQU19BcFVpY2NfV3JpdGVJdGVtX0luZCxUX3pQU19BcFVpY2NfSXRlbURhdGEsDQotICAgICAgVF96UFNfQXBVaWNjX1VwZGF0ZUl0ZW1fUmVxLFRfelBTX0FwVWljY19VcGRhdGVJdGVtX0NuZg0KLQ0KLSAqICDQ3rjEvMfCvDI3o7oNCi0gKiAgICDI1SAgxtqjujIwMTAuMTIuMzENCi0gKiAgICDQ3rjEyMs6IHdhbmd4aWFvamluDQotICAgICAg0N64xMTayN06IDEpzqpsdGXOxLz+sOaxvsn9vLbQ3rjEa2V5aWS66g0KLSAgICAgIDIp1Pa803NlYXJjaLmmxNyjrNT2vNO94bm5VF96UFNfQXBVaWNjX1ByZVBlcnNuUmVjU3JjaF9SZXGjrFRfelBTX0FwVWljY19QcmVQZXJzblJlY1NyY2hfQ25mDQotDQotICogINDeuMS8x8K8Mjijug0KLSAqICAgIMjVICDG2qO6MjAxMS4yLjExDQotICogICAg0N64xMjLOiB3YW5neGlhb2ppbg0KLSAgICAgINDeuMTE2sjdOiBwaW4y0enWpKOs1Pa80yBUX3pQU19BcFVpY2NfVmVyaWZ5UGluMl9SZXGjrFRfelBTX0FwVWljY19WZXJpZnlQaW4yX0NuZg0KLSAgICAgIA0KLSAqINDeuMS8x8K8Mjk6DQotICogyNXG2iAyMDExLjAzLjAxDQotICog0N64xMjLOiDV1NXxu9QNCi0gKiDQ3rjExNrI3Tog1Pa8073hublUX3pQU19BcFVpY2NfWnB1a19SZXENCi0NCi0gKiAg0N64xLzHwrwzMKO6DQotICogICAgyNUgIMbao7oyMDExLjMuMg0KLSAqICAgINDeuMTIyzogd2FuZ3hpYW9qaW4NCi0gICAgICDQ3rjExNrI3TrU9rzTvMa30bmmxNwNCi0gICAgICAgICAg1Pa8073hublUX3pQU19BcFVpY2NfSW5jcmVhc2VfUmVxo6xUX3pQU19BcFVpY2NfUmVzZXRBY21fUmVxDQotICAgICAgICAgINDeuMS94bm5VF96UFNfVUlDQ19BY22jrFRfelBTX1VJQ0NfQUNNbWF4ICANCi0NCi0gKiDQ3rjEvMfCvDMxOg0KLSAqIMjVxtogMjAxMS4wMy4yMw0KLSAqINDeuMTIyzogzfXQob34DQotICog0N64xMTayN06INDeuMS66ta1WlBTX0FQVUlDQ19VU0FUX01BWF9UWFRTVFJfTEVODQotICAgIM6qbGkvUEwg0N64xCBaUFNfVUlDQ19MRU5fUExDT0RFo6xaUFNfVUlDQ19MRU5fTElEQVRBo6wgveG5uSBUX3pQU19BcFVpY2NfSW5pdF9DbmYNCi0NCi0gKiDQ3rjEvMfCvDMyOg0KLSAqIMjVxtogMjAxMS4wNC4yNg0KLSAqINDeuMTIyzogzfXQob34DQotICog0N64xMTayN06INDeuMS66ta1WlBTX1VJQ0NfTEVOX0NCTUlSLCBaUFNfVUlDQ19MRU5fQ0JNSQ0KLQ0KLSAgKiDQ3rjEvMfCvDMzOg0KLSAqIMjVxtogMjAxMS4wNS4yNA0KLSAqINDeuMTIyzogzfXQob34DQotICAg0N64xMTayN06IHVpY2PTxbuvDQotICAg1Pa8073hubkgVF96QXBVaWNjX1BiU2VhcmNoX1JlcaOsIFRfekFwVWljY19QYlNlYXJjaF9DbmYNCi0gICDJvrP9veG5uSBUX3pQU19BcFVpY2NfQWN0aXZlT3JEZWFjdGl2ZUZpbGVfUmVxLFRfelBTX0FwVWljY19BY3RpdmVPckRlYWN0aXZlRmlsZV9DbmYNCi0NCi0gKiAg0N64xLzHwrwzNKO6DQotICogIMjVxtqjujIwMTEuMDguMDINCi0gKiAg0N64xMjLo7rTyLqj06INCi0gKiAg0N64xMTayN2jutT2vNO8+MiotO3O88LrWlBTX0FwVWljY19BVVRIX09USEVSRkFJTA0KLQ0KLSANCi0gICogINDeuMS8x8K8MzWjug0KLSAqICDI1cbao7oyMDExLjA4LjI5DQotICogINDeuMTIy6O608i6o9OiDQotICogINDeuMTE2sjdo7pyZWZyZXNo0N64xA0KLQ0KLSAqICDQ3rjEvMfCvDM2o7oNCi0gKiAgyNXG2qO6MjAxMS4xMS44DQotICogINDeuMTIy6O608i6o9OiDQotICogINDeuMTE2sjdo7q808Pcv6jJ6LzG0N64xL3hublUX3pBcFVpY2NfVVNBVF9UZXJtbmxQcm9maWxfUmVxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDU9rzTveG5uczlVF96QXBVaWNjX1RvUmVhZENhcmRfUmVxDQotDQotICogINDeuMS8x8K8Mzejug0KLSAqICDI1cbao7oyMDExLjEyLjI3DQotICogINDeuMTIy6O608i6o9OiDQotICogINDeuMTE2sjdo7pFQzYxNzAwMTIzMzc4MiDU9rzTWlBTX0FwVWljY19NU0dUWVBFX1NNU0NUUl9DTka1yLrq1rUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9w09DP7NOmyv2+3cqxt7W72LXEbXNndHlwZQ0KLQkJCQkJCQkJDQotICogINDeuMS8x8K8Mzijug0KLSAqICDI1cbao7oyMDEyLjMuMjkNCi0gKiAg0N64xMjLo7rTyLqj06INCi0gKiAg0N64xMTayN2jukVDNjE3MDAxMzk0MDE0INT2vNNTaW1SZWFkZXK5psTcz+C52L3hubnM5brNuurWtQ0KLQ0KLSAqICDQ3rjEvMfCvDM5o7oNCi0gKiAgyNXG2qO6MjAxMi43LjEzDQotICogINDeuMTIy6O608i6o9OiDQotICogINDeuMTE2sjdo7o2MTcwMDE1OTE0MTYgob7Wx8Tcu/rQ6Mfzob8tINbHxNy7+tDox/NWM7Dmsb7NrLK9yrXP1i1jZnVuPTUNCi0gICAg1Pa80yBUX3pBcFVpY2NfQXBQd3JPZmZfUmVxDQotDQotICogINDeuMS8x8K8NDCjug0KLSAqICDI1cbao7oyMDEyLjguMg0KLSAqICDQ3rjEyMujus310KG9+A0KLSAqICDQ3rjExNrI3aO6NjE3MDAxNjYyMTQyIKG+1sfE3Lv60OjH86G/ob51aWNjIHYzob9DU0lNLENSU00sQ0NIT7XIz+C52EFUyrXP1g0KLSAgICDU9rzTvdO/2jogVF96QXBVaWNjX1VTQVRfRmV0Y2hfSW5kO1RfekFwVWljY19DcnNtX0NuZjtUX3pBcFVpY2NfQ3JzbV9SZXE7DQotICAgIFRfekFwVWljY19DR2xhX0NuZjtUX3pBcFVpY2NfQ0dsYV9SZXE7VF96QXBVaWNjX0NjaGNfUmVxO1RfekFwVWljY19DY2hvX0NuZjsNCi0NCi0gKiAg0N64xLzHwrw0MaO6DQotICogIMjVxtqjujIwMTIuMTAuMzANCi0gKiAg0N64xMjLo7rN9dChvfgNCi0gKiAg0N64xMTayN2jujYxNzAwMTgxNDM0NyBDUlNN1fu6z7TmtKK53MDtDQotIA0KLSAqICDQ3rjEvMfCvDQyo7oNCi0gKiAgyNXG2qO6MjAxMi4xMC4zMQ0KLSAqICDQ3rjEyMujutDts6wNCi0gKiAg0N64xMTayN2jujYxNzAwMTgyMDE0MCArWlJBUMP8we7Q3rjEDQotDQotICogINDeuMS8x8K8NDOjug0KLSAqICDI1cbao7oyMDEzLjMuMjYNCi0gKiAg0N64xMjLo7rA7tHSDQotICogINDeuMTE2sjdo7o2MTcwMDIwNzEyNzMgK1pVVFLD/MHuveLC61Byb3RvSWTX1rbOo6zA4NDN08lCWVRFuMTOqldPUkQNCi0NCi0gKiAg0N64xLzHwrw0NKO6DQotICogIMjVxtqjujIwMTMuMTAuMzANCi0gKiAg0N64xMjLo7rN9dChvfgNCi0gKiAg0N64xMTayN2jujYxNzAwMjQ2NzMxMSDTxbuv0N64xKOs1fvA7WtleWlkoaK94bm5DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmbmRlZiBaUFNfQVBfVUlDQ19JTlRFUkZBQ0VfSA0KLSNkZWZpbmUgICBaUFNfQVBfVUlDQ19JTlRFUkZBQ0VfSA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICDNt87EvP6w/LqsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2luY2x1ZGUgInBzLmgiDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICCzo8G/tqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICDIq77Wuuq2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1rZXlpZLuut9bLtcP3o7oNCi0gICAgc2lt16jT0A0KLSAgICAgICAgICAgICAgICBzaW3XqNPQa2V5aWQNCi0gICAgICAgICAgICAgICAgsbjTw9a1DQotICAgIHNpbdeo09C94cr4DQotICAgIHVzaW2jrHNpbbmy09ANCi0gICAgICAgICAgICAgICAgdXNpbSBzaW25stPQDQotICAgICAgICAgICAgICAgILG408PWtQ0KLSAgICB1c2lto6xzaW25stPQveHK+A0KLSAgICB1c2lt16jT0CAgICAgICAgDQotICAgICAgICAgICAgICAgIHVzaW3XqNPQICAgICANCi0gICAgdXNpbdeo09C94cr4DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0JBU0UgICAgICAgIChXT1JEKSgwKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TSU1fQkFTRSAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQkFTRSkgICAgICAgICANCi0NCi0vL732U0lN07XT0A0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DQ1AgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyAwKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9MUCAgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyAxKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9QTE1OU0VMICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyAyKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TU1QgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyAzKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9CQ0NIICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyA0KSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9QSEFTRSAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyA1KSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TSU1BRE4gICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyA2KSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TSU1FWFQxICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0JBU0UgKyA3KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRUNDUCAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NJTV9CQVNFICsgOCkgICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NJTV9FTkQgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9FQ0NQKSAgICAgICAgIA0KLQ0KLS8vU0lNus1VU0lNubLTww0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU0lNX0VORCArIDUpICAgICAgICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1VTSU1fQkFTRSAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSkgIA0KLQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9MTkQgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAwKSAgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU1VNRSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMSkgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TQUkgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAyKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTEwgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAzKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9PUlBLICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA0KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUlBLICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA1KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9UUFJLICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA2KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DUEJDQ0ggICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA3KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JTlZTQ0FOICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA4KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRENLICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgOSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQ05MICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMTApDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FDTU1BWCAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDExKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9GRE4gICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAxMikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01TICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMTMpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0dJRDEgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDE0KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9HSUQyICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAxNSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTVNJU0ROICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMTYpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1BVQ1QgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDE3KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTVNQICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAxOCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01TUyAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMTkpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0NCTUkgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDIwKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TUE4gICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAyMSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01TUiAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMjIpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NETiAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDIzKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FWFQyICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAyNCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRVhUMyAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMjUpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0JETiAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDI2KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DQk1JUiAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAyNykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRVhUNCAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMjgpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0NNSSAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDI5KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FTUxQUCAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAzMCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQUFFTSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMzEpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX01CRE4gICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDMyKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FWFQ2ICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAzMykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUJJICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMzQpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX01XSVMgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDM1KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DRklTICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAzNikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRVhUNyAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgMzcpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX01NU04gICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDM4KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FWFQ4ICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyAzOSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTU1TSUNQICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNDApDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX01NU1VQICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDQxKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9NTVNVQ1AgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA0MikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTklBICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNDMpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1ZHQ1MgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDQ0KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9WR0NTUyAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA0NSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfVkJTICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNDYpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1ZCU1MgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDQ3KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JTUcgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA0OCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8xICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNDkpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMiAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDUwKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMyAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDUxKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfNCAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDUyKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfNSAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDUzKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfNiAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDU0KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfNyAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDU1KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfOCAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDU2KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfOSAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDU3KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8xMCAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNTgpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMTEgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDU5KSAgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8xMiAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNjApICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMTMgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDYxKSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JTUdJTlNUXzE0ICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA2MikgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8xNSAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNjMpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMTYgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDY0KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JTUdJTlNUXzE3ICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA2NSkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8xOCAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNjYpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMTkgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDY3KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JTUdJTlNUXzIwICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA2OCkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1HSU5TVF8yMSAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNjkpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjIgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDcwKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjMgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDcxKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjQgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDcyKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjUgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDczKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjYgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDc0KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjcgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDc1KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0lNR0lOU1RfMjggIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDc2KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX01FWEVTVCAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDc3KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JQ0NJRCAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA3OCkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfUEwgICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgNzkpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0VDQyAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDgwKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BRCAgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA4MSkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSU1TSSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgODIpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1BMTU5XQUNUICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDgzKSAgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfUFNMT0NJICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgODQpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0xPQ0kgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDg1KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9GUExNTiAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA4NikgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQ0JNSUQgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgODcpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX09QTE1OV0FDVCAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDg4KSAgICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0hQUExNTiAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDg5KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9IUExNTldBQ1QgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA5MCkgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9QTk4gICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA5MSkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfT1BMICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgOTIpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NQREkgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDkzKSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BQ00gICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA5NCkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfS0MgICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0NPTV9CQVNFICsgOTUpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0tDR1BSUyAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fQkFTRSArIDk2KSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BQ0MgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQ09NX0JBU0UgKyA5NykgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQ09NX0VORCAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FDQykgIA0KLQ0KLS8v0MLU9teo08PT2nVzaW3TptPDyrGy6dGvZ3NtxL/CvM/CtcRzcG4NCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfR1NNX1NQTiAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fRU5EICsgMSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfR1NNX1NQREkgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fRU5EICsgMikgICANCi0NCi0vL732VVNJTQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9DT01fRU5EICsgMTApICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTEkgICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAwKSAgICAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9VU1QgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDEpICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRVNUICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAyKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfS0VZUyAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAzKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfS0VZU1BTICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU1RBUlRIRk4gICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfVEhSRVNIT0xEICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSUNJICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfT0NJICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA4KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0NDUDIgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgOSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1VTSU1BUlIgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMTApIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FUFNMT0NJICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDExKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRVBTTlNDICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAxMikgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FDU0dMICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMTMpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9DU0dUICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDE0KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSE5CTiAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAxNSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0RJUiAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMTYpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9NRkFSUiAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDE3KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfT0NTR0wgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAxOCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX09DU0dUICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMTkpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9PSE5CTiAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDIwKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRUhQTE1OICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAyMSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0VYVDUgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMjIpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BQ0wgICAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDIzKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSUNUICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAyNCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX09DVCAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMjUpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9ISURERU5LRVkgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDI2KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTkVUUEFSICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAyNykgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1RFTEVBUlIgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMjgpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9QU0lTTVNDICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDI5KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTFJQTE1OU0kgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAzMCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1JNQSAgICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMzEpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9JQ0VETiAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDMyKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSUNFRkYgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAzMykgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1BTRVVETyAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMzQpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9VUExNTldMQU4gICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDM1KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfT1BMTU5XTEFOICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAzNikgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1VXU0lETCAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgMzcpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9PV1NJREwgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDM4KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfV1JJICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyAzOSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0hXU0lETCAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgNDApIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9XRUhQTE1OUEkgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDQxKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfV0hQSSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0MikgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1dMUlBMTU4gICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgNDMpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9IUExNTkRBSSAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfVVNJTU9OTFlfQkFTRSArIDQ0KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTU1MICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0NSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTU1ERiAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0NikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZBRE4gICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0NykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZFWFQxICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0OCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZGRE4gICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA0OSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZTTVMgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1MCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZNU0lTRE4gICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1MSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZTTVNQICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1MikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZTTVNTICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1MykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZTTVNSICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1NCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZTRE4gICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1NSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZFWFQyICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1NikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZFWFQzICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1NykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZCRE4gICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1OCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTUZFWFQ0ICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA1OSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfVkdDU0NBICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2MCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfVkJDU0NBICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2MSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfR0JBQlAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2MikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTVNLICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2MykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTVVLICAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2NCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfR0JBTkwgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2NSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRUhQTE1OUEkgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2NikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTkFGS0NBICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2NykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU1BOSSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2OCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfUE5OSSAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA2OSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTkNQSVAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3MCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfSUNFRyAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3MSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfVEtDREZfMSAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3MikgICAvKiBFRlRLQ0RGv8nS1NPQtuC49qOsvavAtLj5vt3Q6Mfzv8nAqbPkICovDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1RLQ0RGXzIgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgNzMpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1RLQ0RGXzMgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgNzQpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0xTQURGXzEgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9VU0lNT05MWV9CQVNFICsgNzUpICAgLyogTFNBIERlc2NyaXB0b3IgZmlsZXO/ydLU09C24Lj2o6y9q8C0uPm+3dDox/O/ycCps+QgKi8NCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTFNBREZfMiAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3NikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfTFNBREZfMyAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3NykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfRkROVVJJICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3OCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU0ROVVJJICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1VTSU1PTkxZX0JBU0UgKyA3OSkNCi0NCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQkFTRSAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NETlVSSSArIDEpICANCi0NCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fUFNDICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAwKSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0NDICAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMSkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fUFVJRCAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyKSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9QQlIgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDMpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0VYVDEgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgNCkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQUFTICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyA1KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0dBUyAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgNikgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9DQ1AxICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDcpICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQUROXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyA4KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0FETl8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgOSkgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9BRE5fMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDEwKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fSUFQXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAxMSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0lBUF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMTIpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9JQVBfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDEzKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fUEJDXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAxNCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX1BCQ18yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMTUpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9QQkNfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDE2KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fR1JQXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAxNykgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0dSUF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMTgpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9HUlBfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDE5KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fVUlEXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyMCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX1VJRF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMjEpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9VSURfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDIyKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fU05FXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyMykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fU05FXzIgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyNCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fU05FXzMgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyNSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fRU1BSUxfMSAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyNikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fRU1BSUxfMiAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyNykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fRU1BSUxfMyAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAyOCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQU5SXzEgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDI5KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9BTlJfMiAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMzApDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0FOUl8zICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAzMSkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQU5SXzQgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDMyKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9BTlJfNSAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMzMpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0FOUl82ICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAzNCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fQU5SXzcgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfU01fQkFTRSArIDM1KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9TTV9BTlJfOCAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9CQVNFICsgMzYpDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX1NNX0FOUl85ICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0JBU0UgKyAzNykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01fRU5EICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX1NNX0FOUl85KSAgDQotDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9TTV9FTkQgKyAxKSAgDQotDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX1BTQyAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMCkgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9DQyAgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDEpICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfUFVJRCAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAyKSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9QQlIgICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDMpICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0VYVDEgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgNCkgICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfQUFTICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyA1KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0dBUyAgICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgNikgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9DQ1AxICAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDcpICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfQUROXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyA4KSAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0FETl8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgOSkgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9BRE5fMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDEwKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfSUFQXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAxMSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0lBUF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMTIpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9JQVBfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDEzKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfUEJDXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAxNCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX1BCQ18yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMTUpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9QQkNfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDE2KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfR1JQXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAxNykgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0dSUF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMTgpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9HUlBfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDE5KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfVUlEXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAyMCkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX1VJRF8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMjEpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9VSURfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDIyKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfU05FXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAyMykgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX1NORV8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMjQpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9TTkVfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDI1KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfRU1BSUxfMSAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAyNikgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0VNQUlMXzIgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMjcpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9FTUFJTF8zICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDI4KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfQU5SXzEgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAyOSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0FOUl8yICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMzApIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9BTlJfMyAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDMxKSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfQU5SXzQgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAzMikgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0FOUl81ICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMzMpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9BTlJfNiAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDM0KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfQU5SXzcgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0JBU0UgKyAzNSkgDQotI2RlZmluZSAgIFpfQVBVSUNDX0tFWUlEX0FQX0FOUl84ICAgIChXT1JEKShaX0FQVUlDQ19LRVlJRF9BUF9CQVNFICsgMzYpIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9BUF9BTlJfOSAgICAoV09SRCkoWl9BUFVJQ0NfS0VZSURfQVBfQkFTRSArIDM3KSANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBfRU5EICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0FOUl85KSANCi0NCi0vKiCx7cq+U02hokFQxL/CvLXEy/nT0M7EvP4gKi8NCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfU01QQiAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0VORCArIDEpICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfS0VZSURfQVBQQiAgICAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQX0VORCArIDIpICANCi0NCi0vKklTSU3XqNPQzsS8/iovDQotI2RlZmluZSAgIFpfQVBVSUNDX0lTSU1fS0VZSURfQkFTRSAgICAgKFdPUkQpKFpfQVBVSUNDX0tFWUlEX0FQUEIgKyAxKSAgICAgICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0lTVCAgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAwKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0lNUEkgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAxKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0lNUFUgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAyKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0RPTUFJTiAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAzKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX1BDU0NGICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA0KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0dCQUJQICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA1KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0dCQU5MICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA2KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0FEICAgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA3KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX0FSUiAgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA4KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX05BRktDQSAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyA5KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX1NNUyAgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAxMCkNCi0jZGVmaW5lICAgWl9BUFVJQ0NfSVNJTV9LRVlJRF9TTVNSICAgICAoV09SRCkoWl9BUFVJQ0NfSVNJTV9LRVlJRF9CQVNFICsgMTEpDQotI2RlZmluZSAgIFpfQVBVSUNDX0lTSU1fS0VZSURfU01TUCAgICAgKFdPUkQpKFpfQVBVSUNDX0lTSU1fS0VZSURfQkFTRSArIDEyKQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX1NNU1MgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAxMykNCi0jZGVmaW5lICAgWl9BUFVJQ0NfSVNJTV9LRVlJRF9VSUNDSUFSSSAoV09SRCkoWl9BUFVJQ0NfSVNJTV9LRVlJRF9CQVNFICsgMTQpDQotI2RlZmluZSAgIFpfQVBVSUNDX0lTSU1fS0VZSURfRElSICAgICAgKFdPUkQpKFpfQVBVSUNDX0lTSU1fS0VZSURfQkFTRSArIDE1KQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19JU0lNX0tFWUlEX1BTSVNNU0MgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0JBU0UgKyAxNikNCi0jZGVmaW5lICAgWl9BUFVJQ0NfSVNJTV9LRVlJRF9FTkQgICAgICAoV09SRCkoWl9BUFVJQ0NfSVNJTV9LRVlJRF9QU0lTTVNDKSAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19LRVlJRF9FTkQgICAgICAgICAgIChXT1JEKShaX0FQVUlDQ19JU0lNX0tFWUlEX0VORCkgIA0KLQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgIFBJTiBUWVBFILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLypVU0lNIFBJTjEqLw0KLSNkZWZpbmUgIFpQU19BcFVpY2NfUElOMV9CQVNFICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMSAgDQotI2RlZmluZSAgWl9BUFVJQ0NfUElOMV9CQVNFICAgICAgICAgICBaUFNfQXBVaWNjX1BJTjFfQkFTRSAgICAgICAgICAgICAgICAgIA0KLQ0KLSNkZWZpbmUgIFpQU19BcFVpY2NfS0VZUkVGX1BJTjExICAgICAgICAgICAgICAgKEJZVEUpKFpQU19BcFVpY2NfUElOMV9CQVNFICsgMCkgIA0KLSNkZWZpbmUgIFpfQVBVSUNDX0tFWVJFRl9QSU4xMSAgICAgICAgICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xMSAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpQU19BcFVpY2NfS0VZUkVGX1BJTjEyICAgICAgICAgICAgICAgKEJZVEUpKFpQU19BcFVpY2NfUElOMV9CQVNFICsgMSkgIA0KLSNkZWZpbmUgIFpfQVBVSUNDX0tFWVJFRl9QSU4xMiAgICAgICAgICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xMiAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpQU19BcFVpY2NfS0VZUkVGX1BJTjEzICAgICAgICAgICAgICAgKEJZVEUpKFpQU19BcFVpY2NfUElOMV9CQVNFICsgMikgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTMgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTMgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xNCAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjFfQkFTRSArIDMpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTQgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTQgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xNSAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjFfQkFTRSArIDQpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTUgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTUgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xNiAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjFfQkFTRSArIDUpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTYgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTYgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xNyAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjFfQkFTRSArIDYpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTcgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTcgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4xOCAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjFfQkFTRSArIDcpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMTggICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMTggICAgICAgICAgICAgICANCi0NCi0jZGVmaW5lICBaUFNfQXBVaWNjX1BJTjFfRU5EICAgICAgICAgICAgICAgICAgIChCWVRFKVpQU19BcFVpY2NfS0VZUkVGX1BJTjE4ICANCi0jZGVmaW5lICBaX0FQVUlDQ19QSU4xX0VORCAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU4xX0VORCAgICANCi0vKlVTSU0gdW5pdmVyc2FsIFBJTiovDQotI2RlZmluZSAgWlBTX0FwVWljY19LRVlSRUZfVU5WU0xfUElOICAgICAgICAgICAoQllURSkweDExICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfVU5WU0xfUElOICAgICAgWlBTX0FwVWljY19LRVlSRUZfVU5WU0xfUElOICAgICAgICAgICANCi0NCi0vKlVTSU0gUElOMiovDQotI2RlZmluZSAgWlBTX0FwVWljY19QSU4yX0JBU0UgICAgICAgICAgICAgICAgICAoQllURSkweDgxICANCi0jZGVmaW5lICBaX0FQVUlDQ19QSU4yX0JBU0UgICAgICAgICAgICAgWlBTX0FwVWljY19QSU4yX0JBU0UgICAgICAgICAgICAgICAgICAgICAgIAkNCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yMSAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDApICAgIA0KLSNkZWZpbmUgIFpfQVBVSUNDX0tFWVJFRl9QSU4yMSAgICAgICAgICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yMSAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpQU19BcFVpY2NfS0VZUkVGX1BJTjIyICAgICAgICAgICAgICAgKEJZVEUpKFpQU19BcFVpY2NfUElOMl9CQVNFICsgMSkgICAgIA0KLSNkZWZpbmUgIFpfQVBVSUNDX0tFWVJFRl9QSU4yMiAgICAgICAgICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yMiAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpQU19BcFVpY2NfS0VZUkVGX1BJTjIzICAgICAgICAgICAgICAgKEJZVEUpKFpQU19BcFVpY2NfUElOMl9CQVNFICsgMikgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjMgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjMgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yNCAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDMpICAgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjQgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjQgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yNSAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDQpICAgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjUgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjUgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yNiAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDUpICAgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjYgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjYgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yNyAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDYpICAgICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjcgICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjcgICAgICAgICAgICAgICANCi0jZGVmaW5lICBaUFNfQXBVaWNjX0tFWVJFRl9QSU4yOCAgICAgICAgICAgICAgIChCWVRFKShaUFNfQXBVaWNjX1BJTjJfQkFTRSArIDcpICANCi0jZGVmaW5lICBaX0FQVUlDQ19LRVlSRUZfUElOMjggICAgICAgICAgWlBTX0FwVWljY19LRVlSRUZfUElOMjggICAgICAgICAgICAgICANCi0NCi0jZGVmaW5lICBaUFNfQXBVaWNjX1BJTjJfRU5EICAgICAgICAgICAgICAgICAgIChCWVRFKVpQU19BcFVpY2NfS0VZUkVGX1BJTjI4ICANCi0jZGVmaW5lICBaX0FQVUlDQ19QSU4yX0VORCAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU4yX0VORCAgICAgICAgICAgICAgICAgICANCi0vKlNJTSBQSU4qLw0KLSNkZWZpbmUgIFpQU19BcFVpY2NfU0lNX0NNRF9DSFYxICAgICAgICAgICAgICAgKEJZVEUpMHgwMSAgDQotI2RlZmluZSAgWl9BUFVJQ0NfU0lNX0NNRF9DSFYxICAgICAgICAgIFpQU19BcFVpY2NfU0lNX0NNRF9DSFYxICAgICAgICAgICAgICAgDQotI2RlZmluZSAgWlBTX0FwVWljY19TSU1fQ01EX0NIVjIgICAgICAgICAgICAgICAoQllURSkweDAyICANCi0jZGVmaW5lICBaX0FQVUlDQ19TSU1fQ01EX0NIVjIgICAgICAgICAgWlBTX0FwVWljY19TSU1fQ01EX0NIVjIgICAgICAgICAgICAgICANCi0NCi0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICBFRtbQs6PBv7rqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fUExDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEyNyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1BMQ09ERSAgICAgICAgICAgIFpQU19VSUNDX0xFTl9QTENPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTElEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEyNyAgLyrUrda1zqo1Ki8gIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9MSURBVEEgICAgICAgICAgICBaUFNfVUlDQ19MRU5fTElEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX1VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4ICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1VTVCAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9VU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fR0lEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9HSUQxICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fR0lEMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0dJRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0dJRDIgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9HSUQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQ0JNSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1NSAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NCTUkgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DQk1JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotLy8jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9GUExNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpODUgIA0KLS8vI2RlZmluZSAgICBaX1VJQ0NfTEVOX0ZQTE1OICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9GUExNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9BRCAgICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0NCTUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NCTUlEICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DQk1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQ0JNSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1NSAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NCTUlSICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DQk1JUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fRkROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0ZETiAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9GRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTVNJU0ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX01TSVNETiAgICAgICAgICAgIFpQU19VSUNDX0xFTl9NU0lTRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fU0ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MiAgIC8q1K3PyM6qOCovICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1NETiAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9TRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fSUNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0lDSSAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9JQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fT0NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX09DSSAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9PQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQ0NQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MiAgIC8q1K3PyM6qMjAqLyAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9DQ1AyICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fQ0NQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0JETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTAgICAvKtStz8jOqjE0Ki8gICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0JETiAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9CRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQ01JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE0ICAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NNSSAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9FU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUyICAgLyrUrc/Izqo4Ki8gICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fRVNUICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9BQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAgICAvKtStz8jOqjgqLyAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9BQ0wgICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fQUNMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0NOTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4ICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NOTCAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DTkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTkJETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE0ICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTkJETiAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX05CRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9TUERJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fU1BESSAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX1NQREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9NTVNOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNTAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX01NU04gICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9NTVNOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fRVhUOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTExICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fRVhUOCAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0VYVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9OSUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjQ5ICAgLyrUrc/IzqoyNSovICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX05JQSAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9OSUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fVkdDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUwICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fVkdDUyAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX1ZHQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9WQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNTAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9WQlMgICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fVkJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX1NBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2NCAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fU0FJICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX1NBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9TTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzIgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1NMTCAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9TTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTFNBX0RFU0NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTY0ICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTFNBX0RFU0NSICAgICAgICAgWlBTX1VJQ0NfTEVOX0xTQV9ERVNDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9JQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUyICAgLyrUrc/Izqo4Ki8gICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fSUFQICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0lBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9BRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUwICAgLyrUrc/IzqoxNCovICAgICAgICAgICAgIC8q1tDSxrnmt7a9qNLp1rUqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0FETiAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9BRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fQUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fQUFTICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0FBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0dBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTAgICAvKtStz8jOqjE0Ki8gICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fR0FTICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0dBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9TTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUwICAgLyrUrc/IzqoxNCovICAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9TTkUgICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fU05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9DQ1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUxICAgLyrUrc/IzqoxNSovICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0NDUDEgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9DQ1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fRU1BSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qNTAqLyAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fRU1BSUwgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0VNQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9DUEJDQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fQ1BCQ0NIICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0NQQkNDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9NRVhFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOSAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX01FWEVTVCAgICAgICAgICAgIFpQU19VSUNDX0xFTl9NRVhFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fU1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE1ICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fU1NUICAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX1NTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9PUlBLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNjQgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fT1JQSyAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX09SUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fVFBSUEtfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMyICAgICAgICAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9UUFJQS19JRCAgICAgICAgICBaUFNfVUlDQ19MRU5fVFBSUEtfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fVFBSUEtfQ0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMyICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1RQUlBLX0NFUlQgICAgICAgIFpQU19VSUNDX0xFTl9UUFJQS19DRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fVEtDREYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMyICAgICAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9US0NERiAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fVEtDREYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX1NVTUVfSUNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1MCAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX1NVTUVfSUNPTiAgICAgICAgIFpQU19VSUNDX0xFTl9TVU1FX0lDT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0lNRyAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX0lNR0lOU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1MCAgICAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0lNR0lOU1QgICAgICAgICAgIFpQU19VSUNDX0xFTl9JTUdJTlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX01NU0lDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4ICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTU1TSUNQICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX01NU0lDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9NTVNVQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOCAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTU1TVUNQICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX01NU1VDUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9BUlBLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNjQgICAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fQVJQSyAgICAgICAgICAgICAgWlBTX1VJQ0NfTEVOX0FSUEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX1BOTl9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNCAgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fUE5OX0ZVTEwgICAgICAgICAgWlBTX1VJQ0NfTEVOX1BOTl9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fUE5OX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI0ICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fUE5OX1NIT1JUICAgICAgICAgWlBTX1VJQ0NfTEVOX1BOTl9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTU1TVVBfTkFNRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI0ICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX01NU1VQX05BTUUgICAgICAgIFpQU19VSUNDX0xFTl9NTVNVUF9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX01NU1VQX0lORk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2NCAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTU1TVVBfSU5GT1JNICAgICAgWlBTX1VJQ0NfTEVOX01NU1VQX0lORk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9NTVNJQ1BfVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNiAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTU1TSUNQX1ZBTCAgICAgICAgWlBTX1VJQ0NfTEVOX01NU0lDUF9WQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fTU1TSUNQX1NFUlZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTYgICAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19MRU5fTU1TSUNQX1NFUlZFUiAgICAgWlBTX1VJQ0NfTEVOX01NU0lDUF9TRVJWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9NTVNJQ1BfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgICAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX01NU0lDUF9JTlRFUiAgICAgIFpQU19VSUNDX0xFTl9NTVNJQ1BfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfTEVOX01NU0lDUF9HQVRFV0FZICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2ICAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9NTVNJQ1BfR0FURVdBWSAgICBaUFNfVUlDQ19MRU5fTU1TSUNQX0dBVEVXQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9BUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0FSUiAgICAgICAgICAgICAgIFpQU19VSUNDX0xFTl9BUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19TSU1fRUNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgIA0KLSNkZWZpbmUgICAgWl9VSUNDX1NJTV9FQ0MgICAgICAgICAgICAgICBaUFNfVUlDQ19TSU1fRUNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfU0lNX0xQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTMgICAvKtStz8jKxzUqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfU0lNX0xQICAgICAgICAgICAgICAgIFpQU19VSUNDX1NJTV9MUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19TSU1fQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgIA0KLSNkZWZpbmUgICAgWl9VSUNDX1NJTV9BRCAgICAgICAgICAgICAgICBaUFNfVUlDQ19TSU1fQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfU0lNX1BMTU5TRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNiAgDQotI2RlZmluZSAgICBaX1VJQ0NfU0lNX1BMTU5TRUwgICAgICAgICAgIFpQU19VSUNDX1NJTV9QTE1OU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfU0lNX0VDQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzMiAgDQotI2RlZmluZSAgICBaX1VJQ0NfU0lNX0VDQ1AgICAgICAgICAgICAgIFpQU19VSUNDX1NJTV9FQ0NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19TSU1fTE5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MCAgIC8q1K3PyM6qMTQqLyAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19TSU1fTE5EICAgICAgICAgICAgICAgWlBTX1VJQ0NfU0lNX0xORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fR1JPVVBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgLypHcm91cElkyv3X6bOktsgqLyAgDQotI2RlZmluZSAgICBaX1VJQ0NfTEVOX0dST1VQSUQgICAgICAgICAgIFpQU19VSUNDX0xFTl9HUk9VUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfQXBVaWNjX01BWF9JTUdfRFNDUlBfTlVNICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI4ICANCi0jZGVmaW5lICAgIFpfQVBVSUNDX01BWF9JTUdfRFNDUlBfTlVNICAgWlBTX0FwVWljY19NQVhfSU1HX0RTQ1JQX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX1BCUl9NQVhfUEJSVFlQRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgDQotI2RlZmluZSAgICBaX1VJQ0NfUEJSX01BWF9QQlJUWVBFTlVNICAgIFpQU19VSUNDX1BCUl9NQVhfUEJSVFlQRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX1BCUl9NQVhfS0VZSUROVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX1BCUl9NQVhfS0VZSUROVU0gICAgICBaUFNfVUlDQ19QQlJfTUFYX0tFWUlETlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfUEJSX01BWF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTUgIA0KLSNkZWZpbmUgICAgWl9VSUNDX1BCUl9NQVhfTEVOICAgICAgICAgICBaUFNfVUlDQ19QQlJfTUFYX0xFTiAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9BUE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAxICAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9BUE4gICAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fQVBODQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fRkROVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1NQ0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9GRE5VUkkgICAgICAgICAgICBaUFNfVUlDQ19MRU5fRkROVVJJICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19MRU5fU0ROVVJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1NQ0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9TRE5VUkkgICAgICAgICAgICBaUFNfVUlDQ19MRU5fU0ROVVJJIA0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgIFVpY2NNYW5hZ2Vyus1BcL3Tv9rW0LrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyo9PT09PT09PT09PT09PT09PT09PT09PSAgv6iy2yA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lICAgWlBTX0FwVWljY19TTE9UMCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19TTE9UMCAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1NMT1QwICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgIFpQU19BcFVpY2NfU0xPVDEgICAgICAgICAgICAgICAgICAgICAoQllURSkxICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfU0xPVDEgICAgICAgICAgICAgICAgWlBTX0FwVWljY19TTE9UMSAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICBaUFNfQXBVaWNjX1NMT1QyICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMiAgDQotI2RlZmluZSAgIFpfQVBVSUNDX1NMT1QyICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfU0xPVDIgICAgICAgICAgICAgICAgICAgICANCi0NCi0jZGVmaW5lICAgWlBTX0FwVWljY19NQVhfQ0FSRF9OVU0gICAgICAgICAgICAgIChCWVRFKTMgICAgICAgDQotI2RlZmluZSAgIFpfQVBVSUNDX01BWF9DQVJEX05VTSAgICAgICAgIFpQU19BcFVpY2NfTUFYX0NBUkRfTlVNICAgICAgICAgICAgICANCi0vKj09PT09PT09PT09PT09PT09PT09IHRoZSBtYWNybyBvZiBjYXJkIHR5cGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfQ0FSRE1PREVfVUlDQyAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgICBaX0FQVUlDQ19DQVJETU9ERV9VSUNDICAgICAgICAgIFpQU19BcFVpY2NfQ0FSRE1PREVfVUlDQyAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19DQVJETU9ERV9TSU0gICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSAgIFpfQVBVSUNDX0NBUkRNT0RFX1NJTSAgICAgICAgICAgWlBTX0FwVWljY19DQVJETU9ERV9TSU0gICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0NBUkRNT0VfVU5LTk9XTiAgICAgICAgICAgIChCWVRFKTAgIC8qzrSz9cq8u6/HsMnPsai4w9e0zKwqLw0KLSNkZWZpbmUgICBaX0FQVUlDQ19DQVJETU9FX1VOS05PV04gICAgICAgIFpQU19BcFVpY2NfQ0FSRE1PRV9VTktOT1dOICAgICAgICAgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09ICDP1r3Xts6/ydPDtcTTptPDtcTWxsq9ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgICBaUFNfQXBVaWNjX0FQUE1PREVfTlVMTCAgICAgICAgICAgICAgIChCWVRFKTAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19BUFBNT0RFX05VTEwgICAgICAgICAgICAgWlBTX0FwVWljY19BUFBNT0RFX05VTEwgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgWlBTX0FwVWljY19BUFBNT0RFX1VTSU0gICAgICAgICAgICAgICAoQllURSkxICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfQVBQTU9ERV9VU0lNICAgICAgICAgICAgIFpQU19BcFVpY2NfQVBQTU9ERV9VU0lNICAgICAgICAgICAgICAgDQotI2RlZmluZSAgIFpQU19BcFVpY2NfQVBQTU9ERV9TSU0gICAgICAgICAgICAgICAgKEJZVEUpMiAgDQotI2RlZmluZSAgIFpfQVBVSUNDX0FQUE1PREVfU0lNICAgICAgICAgICAgICBaUFNfQXBVaWNjX0FQUE1PREVfU0lNICAgIA0KLSNkZWZpbmUgICBaUFNfQXBVaWNjX0FQUE1PREVfSVNJTSAgICAgICAgICAgICAgICAoQllURSkzICANCi0jZGVmaW5lICAgWl9BUFVJQ0NfQVBQTU9ERV9JU0lNICAgICAgICAgICAgICBaUFNfQXBVaWNjX0FQUE1PREVfSVNJTSANCi0jZGVmaW5lICAgWlBTX0FwVWljY19NQVhfSU5JVEFQUE1PREVWQUwgICAgICAgICAoQllURSlaUFNfQXBVaWNjX0FQUE1PREVfSVNJTQ0KLSNkZWZpbmUgICBaX0FQVUlDQ19NQVhfSU5JVEFQUE1PREVWQUwgICAgICAgWlBTX0FwVWljY19NQVhfSU5JVEFQUE1PREVWQUwgICAgICAgICANCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT0gIHNpbb+otcSw5rG+usUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgICBaUFNfQXBVaWNjX1NJTV9OT19QSEFTRSAgICAgICAgICAgICAgICAoQllURSk0ICAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19TSU1fTk9fUEhBU0UgICAgICAgICAgICAgWlBTX0FwVWljY19TSU1fTk9fUEhBU0UgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgIFpQU19BcFVpY2NfU0lNX1BIQVNFMSAgICAgICAgICAgICAgICAgIChCWVRFKTAgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19TSU1fUEhBU0UxICAgICAgICAgICAgICAgWlBTX0FwVWljY19TSU1fUEhBU0UxICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgIFpQU19BcFVpY2NfU0lNX1BIQVNFMiAgICAgICAgICAgICAgICAgIChCWVRFKTIgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19TSU1fUEhBU0UyICAgICAgICAgICAgICAgWlBTX0FwVWljY19TSU1fUEhBU0UyICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgIFpQU19BcFVpY2NfU0lNX1BIQVNFMl9TUEVDSUFMICAgICAgICAgIChCWVRFKTMgIA0KLSNkZWZpbmUgICBaX0FQVUlDQ19TSU1fUEhBU0UyX1NQRUNJQUwgICAgICAgWlBTX0FwVWljY19TSU1fUEhBU0UyX1NQRUNJQUwgICAgICAgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PSB0aGUgY2FyZCBhY3Rpb249PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfRVZVTFNJT05fQ0FSRCAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfRVZVTFNJT05fQ0FSRCAgICAgICAgICAgWlBTX0FwVWljY19FVlVMU0lPTl9DQVJEDQotI2RlZmluZSAgICBaUFNfQXBVaWNjX0lOU0VSVF9DQVJEICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lICAgIFpfQVBVSUNDX0lOU0VSVF9DQVJEICAgICAgICAgICAgIFpQU19BcFVpY2NfSU5TRVJUX0NBUkQNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09IHRoZSBjYXJkIGFjdGlvbiBjYXVzZT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19DQVJEX1BIWV9PUEVSICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgICBaX0FQVUlDQ19DQVJEX1BIWV9PUEVSICAgICAgICAgICBaUFNfQXBVaWNjX0NBUkRfUEhZX09QRVINCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfQ0FSRF9PVEhFUl9PUEVSICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfQ0FSRF9PVEhFUl9PUEVSICAgICAgICAgWlBTX0FwVWljY19DQVJEX09USEVSX09QRVINCi0NCi0vKj09PT09PT09PT09PT09PT09PT09IHRoZSBtYWNybyBvZiBBdXRoZW50aWNhdGU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKkF1dGhlbnRpY2F0ZSBsZW5ndGgqLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTUFYX0xFTl9SQU5EICAgICAgICAgICAgKEJZVEUpMTYgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX01BWF9MRU5fUkFORCAgICAgICAgICAgWlBTX0FwVWljY19NQVhfTEVOX1JBTkQgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9MRU5fQVVUTiAgICAgICAgICAgIChCWVRFKTE2ICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19NQVhfTEVOX0FVVE4gICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0xFTl9BVVROICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19NQVhfTEVOX0tDICAgICAgICAgICAgICAoQllURSk4ICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19NQVhfTEVOX0tDICAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0xFTl9LQyAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19NQVhfTEVOX1JFUyAgICAgICAgICAgICAoQllURSkxNiAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTUFYX0xFTl9SRVMgICAgICAgICAgICBaUFNfQXBVaWNjX01BWF9MRU5fUkVTICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTUFYX0xFTl9BVVRTICAgICAgICAgICAgKEJZVEUpMTQgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX01BWF9MRU5fQVVUUyAgICAgICAgICAgWlBTX0FwVWljY19NQVhfTEVOX0FVVFMgICAgICAgICAgICANCi0vKnRoZSBmbGFnIG9mIEF1dGhlbnRpY2F0ZSBjb250ZXh0Ki8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0FVVEhfR1NNICAgICAgICAgICAgICAgIChCWVRFKTAgICAgICAgIC8qR1NNIGF1dGgqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVVUSF9HU00gICAgICAgICAgICAgICBaUFNfQXBVaWNjX0FVVEhfR1NNICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfQVVUSF9VTVRTICAgICAgICAgICAgICAgKEJZVEUpMSAgICAgICAgLypVTVRTIGF1dGgqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVVUSF9VTVRTICAgICAgICAgICAgICBaUFNfQXBVaWNjX0FVVEhfVU1UUyAgICAgICAgICAgICAgIA0KLQ0KLS8qQXV0aGVudGljYXRlIGVyciovDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19BVVRIX01BQ0ZBSUwgICAgICAgICAgICAoQllURSkyMCAgICAvKk1BQyBmYWlsdXJlKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FVVEhfTUFDRkFJTCAgICAgICAgICAgWlBTX0FwVWljY19BVVRIX01BQ0ZBSUwgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0FVVEhfU1lOQ0ZBSUwgICAgICAgICAgIChCWVRFKTIxICAgIC8qU3luYyBmYWlsdXJlKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FVVEhfU1lOQ0ZBSUwgICAgICAgICAgWlBTX0FwVWljY19BVVRIX1NZTkNGQUlMICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0FVVEhfR1NNQVVUSFVOQUNDUFQgICAgIChCWVRFKTIzICAgIC8qR3NtIGF1dGggdW5hY2NlcHQqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVVUSF9HU01BVVRIVU5BQ0NQVCAgICBaUFNfQXBVaWNjX0FVVEhfR1NNQVVUSFVOQUNDUFQgICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19BVVRIX09USEVSRkFJTCAgICAgICAgIChCWVRFKSAweEZGDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVVUSF9PVEhFUkZBSUwgICAgICAgICAgIFpQU19BcFVpY2NfQVVUSF9PVEhFUkZBSUwNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09IHRoZSBtYWNybyBvZiBvdGhlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfTUFYX0RJUl9OVU0gICAgICAgICAgICAgKEJZVEUpNCAgDQotI2RlZmluZSAgICBaX0FQVUlDQ19NQVhfRElSX05VTSAgICAgICAgICAgICBaUFNfQXBVaWNjX01BWF9ESVJfTlVNICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19NQVhfQVBQTF9OVU0gICAgICAgICAgICAoQllURSk4ICANCi0jZGVmaW5lICAgIFpfQVBVSUNDX01BWF9BUFBMX05VTSAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0FQUExfTlVNICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfQXBVaWNjX01BWF9QSU5fTlVNICAgICAgICAgICAgIChCWVRFKTggIA0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfTUFYX1BJTl9OVU0gICAgICAgICAgICAgWlBTX0FwVWljY19NQVhfUElOX05VTSAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfTUFYX0RBVEFfVkFMICAgICAgICAgICAgKFdPUkQpMjAyOCAgDQotI2RlZmluZSAgICBaX0FQVUlDQ19NQVhfREFUQV9WQUwgICAgICAgICAgICBaUFNfQXBVaWNjX01BWF9EQVRBX1ZBTCAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19NQVhfUkRfS0VZSURfTlVNICAgICAgICAoQllURSkxMCAgDQotI2RlZmluZSAgICBaX0FQVUlDQ19NQVhfUkRfS0VZSURfTlVNICAgICAgICBaUFNfQXBVaWNjX01BWF9SRF9LRVlJRF9OVU0gICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19NQVhfVVBEQVRFX0tFWUlEX05VTSAgICAoQllURSkxMCAgDQotI2RlZmluZSAgICBaX0FQVUlDQ19NQVhfVVBEQVRFX0tFWUlEX05VTSAgICBaUFNfQXBVaWNjX01BWF9VUERBVEVfS0VZSURfTlVNICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19NQVhfTEdDTENITkxfTlVNICAgICAgICAoQllURSkzICANCi0jZGVmaW5lICAgIFpfQVBVSUNDX01BWF9MR0NMQ0hOTF9OVU0gICAgICAgIFpQU19BcFVpY2NfTUFYX0xHQ0xDSE5MX05VTSAgICAgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PVVTQVTP4LnYuuo9PT09PT09PT09PT09PT09PT0qLw0KLS8qOS4xICAgICAgICBCRVItVExWIHRhZ3MgaW4gdGVybWluYWwgdG8gVUlDQyBkaXJlY3Rpb24gKi8NCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfUFJPQUNNRF9UQUcgICAgICAgICAoQllURSkweEQwICAvKlByb2FjdGl2ZSBVSUNDIGNvbW1hbmQgdGFnICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVSX1BST0FDTURfVEFHICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRVJfUFJPQUNNRF9UQUcgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfU01TUFBfVEFHICAgICAgICAgICAoQllURSkweEQxICAvKlJlc2VydmVkIGZvciBhc19nc20vM0cvM0dQUDIgKFNNUy1QUCBkb3dubG9hZCB0YWcpICovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9CRVJfU01TUFBfVEFHICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFUl9TTVNQUF9UQUcgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0JFUl9DQlNET1dOX1RBRyAgICAgICAgIChCWVRFKTB4RDIgIC8qUmVzZXJ2ZWQgZm9yIGFzX2dzbS8zRy8zR1BQMiAoQ2VsbCBCcm9hZGNhc3QgZG93bmxvYWQgdGFnKSAqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVSX0NCU0RPV05fVEFHICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRVJfQ0JTRE9XTl9UQUcgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfTUVOVVNFTF9UQUcgICAgICAgICAoQllURSkweEQzICAvKk1lbnUgU2VsZWN0aW9uIHRhZyAqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVSX01FTlVTRUxfVEFHICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRVJfTUVOVVNFTF9UQUcgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfQ0FMTENUUkxfVEFHICAgICAgICAoQllURSkweEQ0ICAvKkNhbGwgY29udHJvbCB0YWcgKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFUl9DQUxMQ1RSTF9UQUcgICAgICBaUFNfQXBVaWNjX1VTQVRfQkVSX0NBTExDVFJMX1RBRyAgICAgICAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfQkVSX1NNU0NUUkxfVEFHICAgICAgICAgKEJZVEUpMHhENSAgLypSZXNlcnZlZCBmb3IgYXNfZ3NtLzNHIChNTyBTaG9ydCBtZXNzYWdlIGNvbnRyb2wgdGFnKSAqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVSX1NNU0NUUkxfVEFHICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRVJfU01TQ1RSTF9UQUcgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfRVZURE9XTl9UQUcgICAgICAgICAoQllURSkweEQ2ICAvKkV2ZW50IGRvd25sb2FkIHRhZyAqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVSX0VWVERPV05fVEFHICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRVJfRVZURE9XTl9UQUcgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRVJfVElNRVhQSVJfVEFHICAgICAgICAoQllURSkweEQ3ICAvKlRpbWVyIGV4cGlyYXRpb24gKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9CRVJfVElNRVhQSVJfVEFHICAgICAgWlBTX0FwVWljY19VU0FUX0JFUl9USU1FWFBJUl9UQUcgICAgICAgIA0KLQ0KLQ0KLS8qPT09PVVTQVTD/MHuwODQzc/gudi66rao0uU9PT09Ki8NCi0vKkV4ZWN1dGlvbiBvZiB1c2F0IGNvbW1hbmQgK1pFVUMgw/zB7tbQtcTD/MHuwODQzSovDQotLyrW97avyr3D/MHuKi8gIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1JFRlJFU0ggIChXT1JEKTB4MDEgICAgLyoxMDIyMjMgNi42LjEzICAgIFJFRlJFU0ggICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUkVGUkVTSCAgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9SRUZSRVNIICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9NT1JFVElNRSAoV09SRCkweDAyICAgIC8qMTAyMjIzIDYuNi40ICAgICBNT1JFIFRJTUUgICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfTU9SRVRJTUUgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9NT1JFVElNRSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT0xJTlRWTCAoV09SRCkweDAzICAgIC8qMTAyMjIzIDYuNi42ICAgICBQT0xMIElOVEVSVkFMICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUE9MSU5UVkwgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT0xJTlRWTCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT0xMT0ZGICAoV09SRCkweDA0ICAgIC8qMTAyMjIzIDYuNi4xNCAgICBQT0xMSU5HIE9GRiAgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9QT0xMT0ZGICAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1BPTExPRkYgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NUVVBFVk5UIChXT1JEKTB4MDUgICAgLyoxMDIyMjMgNi42LjE2ICAgIFNFVCBVUCBFVkVOVCBMSVNUICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU1RVUEVWTlQgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVFVQRVZOVCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVFVQQ0FMTCAoV09SRCkweDEwICAgIC8qMTAyMjIzIDYuNi4xMiAgICBTRVQgVVAgQ0FMTCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1NUVVBDQUxMICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU1RVUENBTEwgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VORFNTICAgKFdPUkQpMHgxMSAgICAvKjMxMTExICA2LjQuMTEgICAgU0VORCBTUyovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU0VORFNTICAgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TRU5EU1MgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TRU5EVVNTRCAoV09SRCkweDEyICAgIC8qMzExMTEgIDYuNC4xMiAgICBTRU5EIFVTU0QqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1NFTkRVU1NEICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VORFVTU0QgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VORFNNUyAgKFdPUkQpMHgxMyAgICAvKjEwMjIyMyA2LjYuOSAgICAgU0VORCBTSE9SVCBNRVNTQUdFICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU0VORFNNUyAgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TRU5EU01TICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TRU5ERFRNRiAoV09SRCkweDE0ICAgIC8qMTAyMjIzIDYuNi4yNCAgICBTRU5EIERUTUYgQ09NTUFORCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1NFTkREVE1GICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VORERUTUYgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfTENIQlJXU1IgKFdPUkQpMHgxNSAgICAvKjEwMjIyMyA2LjYuMjYgICAgTEFVTkNIIEJST1dTRVIgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9MQ0hCUldTUiAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0xDSEJSV1NSIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1BMQVlUT05FIChXT1JEKTB4MjAgICAgLyoxMDIyMjMgNi42LjUgICAgIFBMQVkgVE9ORSAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1BMQVlUT05FICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfUExBWVRPTkUgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfRElTUFRFWFQgKFdPUkQpMHgyMSAgICAvKjEwMjIyMyA2LjYuMSAgICAgRElTUExBWSBURVhUICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfRElTUFRFWFQgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9ESVNQVEVYVCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9HRVRJTktFWSAoV09SRCkweDIyICAgIC8qMTAyMjIzIDYuNi4yICAgICBHRVQgSU5LRVkgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9HRVRJTktFWSAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0dFVElOS0VZIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0dFVElOUFVUIChXT1JEKTB4MjMgICAgLyoxMDIyMjMgNi42LjMgICAgIEdFVCBJTlBVVCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0dFVElOUFVUICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfR0VUSU5QVVQgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VMRUlURU0gKFdPUkQpMHgyNCAgICAvKjEwMjIyMyA2LjYuOCAgICAgU0VMRUNUIElURU0gKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9TRUxFSVRFTSAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NFTEVJVEVNIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NUVVBNRU5VIChXT1JEKTB4MjUgICAgLyoxMDIyMjMgNi42LjcgICAgIFNFVC1VUCBNRU5VICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU1RVUE1FTlUgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVFVQTUVOVSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QTE9DSU5GTyAoV09SRCkweDI2ICAgIC8qMTAyMjIzIDYuNi4xNSAgICBQUk9WSURFIExPQ0FMIElORk9STUFUSU9OICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUExPQ0lORk8gIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QTE9DSU5GTyANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9USU1FUk1ORyAoV09SRCkweDI3ICAgIC8qMTAyMjIzIDYuNi4yMSAgICBUSU1FUiBNQU5BR0VNRU5UICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfVElNRVJNTkcgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9USU1FUk1ORyANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVElETFRYVCAoV09SRCkweDI4ICAgIC8qMTAyMjIzIDYuNi4yMiAgICBTRVQgVVAgSURMRSBNT0RFIFRFWFQgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9TVElETFRYVCAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NUSURMVFhUIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1BSQ0RBUERVIChXT1JEKTB4MzAgICAgLyoxMDIyMjMgNi42LjE3ICAgIFBFUkZPUk0gQ0FSRCBBUERVICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUFJDREFQRFUgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QUkNEQVBEVSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT05DQVJEICAoV09SRCkweDMxICAgIC8qMTAyMjIzIDYuNi4xOSAgICBQT1dFUiBPTiBDQVJEICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUE9OQ0FSRCAgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT05DQVJEICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9QT0ZGQ0FSRCAoV09SRCkweDMyICAgIC8qMTAyMjIzIDYuNi4xOCAgICBQT1dFUiBPRkYgQ0FSRCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1BPRkZDQVJEICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfUE9GRkNBUkQgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfR1RSRFJTVEEgKFdPUkQpMHgzMyAgICAvKjEwMjIyMyA2LjYuMjAgICAgR0VUIFJFQURFUiBTVEFUVVMgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9HVFJEUlNUQSAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0dUUkRSU1RBIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1JVTkFUQ01EIChXT1JEKTB4MzQgICAgLyoxMDIyMjMgNi42LjIzICAgIFJVTiBBVCBDT01NQU5EICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUlVOQVRDTUQgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9SVU5BVENNRCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9MTkdOT1RGWSAoV09SRCkweDM1ICAgIC8qMTAyMjIzIDYuNi4yNSAgICBMQU5HVUFHRSBOT1RJRklDQVRJT04gKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9MTkdOT1RGWSAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0xOR05PVEZZIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX09QRU5DSE5MIChXT1JEKTB4NDAgICAgLyoxMDIyMjMgNi42LjI3ICAgIE9QRU4gQ0hBTk5FTCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX09QRU5DSE5MICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfT1BFTkNITkwgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ0xPU0NITkwgKFdPUkQpMHg0MSAgICAvKjEwMjIyMyA2LjYuMjggICAgQ0xPU0UgQ0hBTk5FTCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0NMT1NDSE5MICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ0xPU0NITkwgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfUkVDVkRBVEEgKFdPUkQpMHg0MiAgICAvKjEwMjIyMyA2LjYuMjkgICAgUkVDRUlWRSBEQVRBICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfUkVDVkRBVEEgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9SRUNWREFUQSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TRU5EREFUQSAoV09SRCkweDQzICAgIC8qMTAyMjIzIDYuNi4zMCAgICBTRU5EIERBVEEgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9TRU5EREFUQSAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NFTkREQVRBIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0dUQ0hTVEFUIChXT1JEKTB4NDQgICAgLyoxMDIyMjMgNi42LjMxICAgIEdFVCBDSEFOTkVMIFNUQVRVUyAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0dUQ0hTVEFUICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfR1RDSFNUQVQgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VSVlNSQ0ggKFdPUkQpMHg0NSAgICAvKjEwMjIyMyA2LjYuMzIgICAgU0VSVklDRSBTRUFSQ0ggKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9TRVJWU1JDSCAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NFUlZTUkNIIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0dUU0VSSU5GIChXT1JEKTB4NDYgICAgLyoxMDIyMjMgNi42LjMzICAgIEdFVCBTRVJWSUNFIElORk9STUFUSU9OICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfR1RTRVJJTkYgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9HVFNFUklORiANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9ERUNMU0VSViAoV09SRCkweDQ3ICAgIC8qMTAyMjIzIDYuNi4zNCAgICBERUNMQVJFIFNFUlZJQ0UgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9ERUNMU0VSViAgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0RFQ0xTRVJWIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NFVEZSQU1FUyAoV09SRCkweDUwICAgIC8qMTAyMjIzIDYuNi4zNSAgICBTRVQgRlJBTUVTICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU0VURlJBTUVTICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VURlJBTUVTIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1NFVEZSQU1FU1NUQVRVUyAoV09SRCkweDUxICAgIC8qMTAyMjIzIDYuNi4zNiAgICBTRVQgRlJBTUVTIFNUQVRVUyovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfUFJPX01TR1RZUEVfU0VURlJBTUVTU1RBVFVTICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfU0VURlJBTUVTU1RBVFVTIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX1JFVE1VTFRNU0cgKFdPUkQpMHg2MCAgICAvKjEwMjIyMyA2LjYuMzcgICAgUkVUUkVJVkUgTVVMVElNRURJQSBNRVNTQUdFKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9SRVRNVUxUTVNHICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfUkVUTVVMVE1TRyANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVUJNVUxUTVNHIChXT1JEKTB4NjEgICAgLyoxMDIyMjMgNi42LjM4ICAgIFNVQk1JVCBNVUxUSU1FRElBIE1FU1NBR0UqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX1NVQk1VTFRNU0cgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9TVUJNVUxUTVNHIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0RJU01VTFRNU0cgKFdPUkQpMHg2MiAgICAvKjEwMjIyMyA2LjYuMzkgICAgRElTUExBWSBNVUxUSU1FRElBIE1FU1NBR0UqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0RJU01VTFRNU0cgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9ESVNNVUxUTVNHIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0FDVElWRSAoV09SRCkweDcwICAgIC8qMTAyMjIzIDYuNi40MCAgICBBQ1RJVkUgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9BQ1RJVkUgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9BQ1RJVkUgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ09OVFNUQVRDSEFOR0UgKFdPUkQpMHg3MSAgICAvKjEwMjIyMyA2LjYuNDEgICAgQ09OVEFDVExFU1MgU1RBVEUgQ0hBTkdFRCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0NPTlRTVEFUQ0hBTkdFICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ09OVFNUQVRDSEFOR0UgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ01EQ09OVCAoV09SRCkweDcyICAgIC8qMTAyMjIzIDYuNi40MiAgICBDT01NQU5EIENPTlRBSU5FUiAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BST19NU0dUWVBFX0NDTURDT05UICBaUFNfQXBVaWNjX1VTQVRfUFJPX01TR1RZUEVfQ01EQ09OVA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BST19NU0dUWVBFX0VOQ1NFU1NDT05UIChXT1JEKTB4NzMgICAgLyoxMDIyMjMgNi42LjQzICAgIEVOQ0FQU1VMQVRFRCBTRVNTSU9OIENPTlRST0wgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9QUk9fTVNHVFlQRV9FTkNTRVNTQ09OVCAgIFpQU19BcFVpY2NfVVNBVF9QUk9fTVNHVFlQRV9FTkNTRVNTQ09OVCANCi0NCi0vKmV2ZWxvcMP8we4qLw0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfU01TRE9XTiAgKFdPUkQpMHgwMSAgICAvKjMxMTExIDcuMS4xLjIgICAgU01TLVBQIERPV05MT0FEKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9FVkVMUF9NU0dUWVBFX1NNU0RPV04gICAgIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX1NNU0RPV04gIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfQ0JTRE9XTiAgKFdPUkQpMHgwMiAgICAvKjMxMTExIDcuMS4yLjIgICAgQ0VMTCBCUk9BRENBU1QgRE9XTkxPQUQqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfQ0JTRE9XTiAgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfQ0JTRE9XTiAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9NRU5VU0VMICAoV09SRCkweDAzICAgIC8qMTAyMjIzIDcuMiAgICAgICBNZW51IHNlbGVjdGlvbiAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfTUVOVVNFTCAgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfTUVOVVNFTCAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9DQUxMQ1RSTCAoV09SRCkweDA0ICAgIC8qMTAyMjIzIDcuMyAgICAgICBDYWxsIENvbnRyb2wgYnkgTkFBICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9DQUxMQ1RSTCAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9DQUxMQ1RSTCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX1NNU0NUUiAgIChXT1JEKTB4MDUgICAgLyozMTExMSAgNy4zLjEuNiAgIENBTEwgQ09OVFJPTCovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9TTVNDVFIgICAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9TTVNDVFIgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX1RJTVJFWFAgIChXT1JEKTB4MDYgICAgLyoxMDIyMjMgNy40ICAgICAgIFRpbWVyIGV4cGlyYXRpb24gKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9FVkVMUF9NU0dUWVBFX1RJTVJFWFAgICAgIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX1RJTVJFWFAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfTVRDQUwgKFdPUkQpMHgwNyAgICAvKjEwMjIyMyA3LjUuMSAgICAgTVQgY2FsbCBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfTVRDQUwgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfTVRDQUwgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9DQ09OVCAoV09SRCkweDA4ICAgIC8qMTAyMjIzIDcuNS4yICAgICBDYWxsIGNvbm5lY3RlZCBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfQ0NPTlQgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfQ0NPTlQgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9EQ09OVCAoV09SRCkweDA5ICAgIC8qMTAyMjIzIDcuNS4zICAgICBDYWxsIGRpc2Nvbm5lY3RlZCBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfRENPTlQgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfRENPTlQgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9MT0NTVCAoV09SRCkweDBBICAgIC8qMTAyMjIzIDcuNS40ICAgICBMb2NhdGlvbiBzdGF0dXMgZXZlbnQgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0xPQ1NUICAgIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0xPQ1NUIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfVVNSQUMgKFdPUkQpMHgwQiAgICAvKjEwMjIyMyA3LjUuNSAgICAgVXNlciBhY3Rpdml0eSBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfVVNSQUMgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfVVNSQUMgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9TQ05BViAoV09SRCkweDBDICAgIC8qMTAyMjIzIDcuNS42ICAgICBJZGxlIHNjcmVlbiBhdmFpbGFibGUgZXZlbnQgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX1NDTkFWICAgIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX1NDTkFWIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfQ1JTVEEgKFdPUkQpMHgwRCAgICAvKjEwMjIyMyA3LjUuNyAgICAgQ2FyZCByZWFkZXIgc3RhdHVzIGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9DUlNUQSAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9DUlNUQSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0xOR1NMIChXT1JEKTB4MEUgICAgLyoxMDIyMjMgNy41LjggICAgIExhbmd1YWdlIHNlbGVjdGlvbiBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfTE5HU0wgICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfTE5HU0wgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9CUlNUUiAoV09SRCkweDBGICAgIC8qMTAyMjIzIDcuNS45ICAgICBCcm93c2VyIHRlcm1pbmF0aW9uIGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9CUlNUUiAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9CUlNUUiANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0RBVEFWIChXT1JEKTB4MTAgICAgLyoxMDIyMjMgNy41LjEwICAgIERhdGEgYXZhaWxhYmxlIGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9EQVRBViAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9EQVRBViANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0NIU1RBIChXT1JEKTB4MTEgICAgLyoxMDIyMjMgNy41LjExICAgIENoYW5uZWwgc3RhdHVzIGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9DSFNUQSAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9DSFNUQSANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX0FDVENIIChXT1JEKTB4MTIgICAgLyoxMDIyMjMgNy41LjEyICAgIEFjY2VzcyB0ZWNobm9sb2d5IGNoYW5nZSBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfQUNUQ0ggICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfQUNUQ0ggDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9QQVJDSCAoV09SRCkweDEzICAgIC8qMTAyMjIzIDcuNS4xMyAgICBEaXNwbGF5IHBhcmFtZXRlcnMgY2hhbmdlZCBldmVudCAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0VWRUxQX01TR1RZUEVfRVRfUEFSQ0ggICAgWlBTX0FwVWljY19VU0FUX0VWRUxQX01TR1RZUEVfRVRfUEFSQ0ggDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9MT0NOVCAoV09SRCkweDE0ICAgIC8qMTAyMjIzIDcuNS4xNCAgICBMb2NhbCBjb25uZWN0aW9uIGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9MT0NOVCAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9MT0NOVCANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FVkVMUF9NU0dUWVBFX0VUX05XUkVKIChXT1JEKTB4MTUgICAgLyoxMDIyMjMgNy41LjE3ICAgIE5ldHdvcmsgUmVqZWN0IGV2ZW50ICovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9OV1JFSiAgICBaUFNfQXBVaWNjX1VTQVRfRVZFTFBfTVNHVFlQRV9FVF9OV1JFSiANCi0NCi0vKmVudmVsb3C72Li0z/vPotbQtcTD/MHuwODQzSovDQotI2RlZmluZSBaUFNfQXBVaWNjX01TR1RZUEVfU01TQ1RSX0NORiAgICAgICAgICAgKFdPUkQpMHgwMSANCi0jZGVmaW5lIFpfQVBVSUNDX01TR1RZUEVfU01TQ1RSX0NORiAgICAgICAgICAgICBaUFNfQXBVaWNjX01TR1RZUEVfU01TQ1RSX0NORg0KLSNkZWZpbmUgWlBTX0FwVWljY19NU0dUWVBFX0NBTENUUl9DTkYgICAgICAgICAgIChXT1JEKTB4MDIgDQotI2RlZmluZSBaX0FQVUlDQ19NU0dUWVBFX0NBTENUUl9DTkYgICAgICAgICAgIFpQU19BcFVpY2NfTVNHVFlQRV9DQUxDVFJfQ05GDQotI2RlZmluZSBaUFNfQXBVaWNjX01TR1RZUEVfU01TRE9XX0NORiAgICAgICAgICAgKFdPUkQpMHgwMyANCi0jZGVmaW5lIFpfQVBVSUNDX01TR1RZUEVfU01TRE9XX0NORiAgICAgICAgICAgWlBTX0FwVWljY19NU0dUWVBFX1NNU0RPV19DTkYNCi0NCi0vKlRlcm1pbmFsIHJlc3BvbnNlKi8NCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9URVJNUlNQX01TR1RZUEVfVEVSTUxSU1AgICAgIChXT1JEKTB4M0QgICAgLyoxMDIyMjMgNi44ICBTdHJ1Y3R1cmUgb2YgVEVSTUlOQUwgUkVTUE9OU0UgKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9URVJNUlNQX01TR1RZUEVfVEVSTUxSU1AgIFpQU19BcFVpY2NfVVNBVF9URVJNUlNQX01TR1RZUEVfVEVSTUxSU1AgICAgIA0KLQ0KLS8qVGVybWluYWwgcHJvZmlsZSovDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfVEVSTVBSRkxfTVNHVFlQRV9URVJNTFBSTyAgICAoV09SRCkweDNFICAgIC8qMTAyMjIzIDUuMiAgU3RydWN0dXJlIGFuZCBjb2Rpbmcgb2YgVEVSTUlOQUwgUFJPRklMRSAqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1RFUk1QUkZMX01TR1RZUEVfVEVSTUxQUk8gWlBTX0FwVWljY19VU0FUX1RFUk1QUkZMX01TR1RZUEVfVEVSTUxQUk8gICAgDQotDQotDQotLyoxMDIyMjMgOC41MiBCZWFyZXIgZGVzY3JpcHRpb24gKGJlYXJlciB0eXBlKSovDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfQ1NEICAgICAgICAgICAgIChCWVRFKTB4MDEgICAgIC8qcmVzZXJ2ZWQgZm9yIGFzX2dzbS8zR1BQIENTRCovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVBUlRZUEVfQ1NEICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfQ1NEICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFXzNHR1BSUyAgICAgICAgICAoQllURSkweDAyICAgICAvKnJlc2VydmVkIGZvciBhc19nc20vM0dQUCBwYWNrZXQgZGF0YSBzZXJ2aWNlKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9CRUFSVFlQRV8zR0dQUlMgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV8zR0dQUlMgICAgICAgICAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfREVGQVVUICAgICAgICAgIChCWVRFKTB4MDMgICAgIC8qZGVmYXVsdCBiZWFyZXIgZm9yIHJlcXVlc3RlZCB0cmFuc3BvcnQgbGF5ZXIqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFQVJUWVBFX0RFRkFVVCAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX0RFRkFVVCAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9MT0NBTElOSyAgICAgICAgKEJZVEUpMHgwNCAgICAgLypsb2NhbCBsaW5rIHRlY2hub2xvZ3kgaW5kZXBlbmRlbnQqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFQVJUWVBFX0xPQ0FMSU5LICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX0xPQ0FMSU5LICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9CTFVUT09USCAgICAgICAgKEJZVEUpMHgwNSAgICAgLypCbHVldG9vdGgqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFQVJUWVBFX0JMVVRPT1RIICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX0JMVVRPT1RIICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9JUkRBICAgICAgICAgICAgKEJZVEUpMHgwNiAgICAgLypJckRBKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9CRUFSVFlQRV9JUkRBICAgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9JUkRBICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfUlMyMzIgICAgICAgICAgIChCWVRFKTB4MDcgICAgIC8qUlMyMzIqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFQVJUWVBFX1JTMjMyICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX1JTMjMyICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9USUFHUFJTICAgICAgICAgKEJZVEUpMHgwOCAgICAgLypUSUEvSVMtODIwLUEgcGFja2V0IGRhdGEgc2VydmljZSovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQkVBUlRZUEVfVElBR1BSUyAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfVElBR1BSUyAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX0VNVVBEUyAgICAgICAgICAgICAoQllURSkweDBCICAgICAvKkUtVVRSQU4vTWFwcGVkIFVUUkFOIHBhY2tldCBkYXRhIHNlcnZpY2UqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0JFQVJUWVBFX0VNVVBEUyAgICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0JFQVJUWVBFX0VNVVBEUyAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfQkVBUlRZUEVfVVNCICAgICAgICAgICAgIChCWVRFKTB4MTAgICAgIC8qVVNCKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9CRUFSVFlQRV9VU0IgICAgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9CRUFSVFlQRV9VU0IgICAgICAgICAgICAgDQotDQotLyozMTExMSA4LjYgsb612NDFz6LRoc/uKi8NCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfTE9DQVQgICAgICAgICAgICAgKEJZVEUpMHgwMCAgICAgLypMb2NhdGlvbiBJbmZvcm1hdGlvbiAoTUNDLCBNTkMsIExBQywgQ2VsbCBJZGVudGl0eSBhbmQgRXh0ZW5kZWQgQ2VsbCBJZGVudGl0eSkqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0xPQ0lORl9MT0NBVCAgICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9MT0NBVCAgICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfSU1FSSAgICAgICAgICAgICAgKEJZVEUpMHgwMSAgICAgLypJTUVJIG9mIHRoZSB0ZXJtaW5hbCovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTE9DSU5GX0lNRUkgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfTE9DSU5GX0lNRUkgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9OTVIgICAgICAgICAgICAgICAoQllURSkweDAyICAgICAvKk5ldHdvcmsgTWVhc3VyZW1lbnQgcmVzdWx0c6OssPzAqEJDQ0gqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0xPQ0lORl9OTVIgICAgICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9OTVIgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfRFRaICAgICAgICAgICAgICAgKEJZVEUpMHgwMyAgICAgLypEYXRlLCB0aW1lIGFuZCB0aW1lIHpvbmUqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0xPQ0lORl9EVFogICAgICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9EVFogICAgICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfTEFORyAgICAgICAgICAgICAgKEJZVEUpMHgwNCAgICAgLypMYW5ndWFnZSBzZXR0aW5nKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9MT0NJTkZfTEFORyAgICAgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfTEFORyAgICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfTE9DSU5GX1RJTUFEViAgICAgICAgICAgIChCWVRFKTB4MDUgICAgIC8qVGltaW5nIEFkdmFuY2UqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0xPQ0lORl9USU1BRFYgICAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9USU1BRFYgICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9MT0NJTkZfQUNUICAgICAgICAgICAgICAgKEJZVEUpMHgwNiAgICAgLypBY2Nlc3MgVGVjaG5vbG9neSovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTE9DSU5GX0FDVCAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfTE9DSU5GX0FDVCAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9JTUVJU1YgICAgICAgICAgICAgICAoQllURSkweDA4ICAgICAvKkltZWlTdiovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTE9DSU5GX0lNRUlTViAgICAgICAgICAgWlBTX0FwVWljY19VU0FUX0xPQ0lORl9JTUVJU1YgICAgICAgICAgDQotDQotLyrK/b7d1+6089a1Ki8NCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQkNETlVNX0xFTiAgICAgICAgICAgKEJZVEUpNDAgICAvKmFwLW1taWG907/ao6y66lpQU19BUE1NSUFfTUFYX0JDRE5VTV9MRU4qLyAgICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9CQ0ROVU1fTEVOICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0JDRE5VTV9MRU4gICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9BTFBIQV9MRU4gICAgICAgICAgICAoQllURSkyNDEgIC8q1tDSxrnmt7Y2LjQuNS4yKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9BTFBIQV9MRU4gICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0FMUEhBX0xFTiAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9TVUJBRFJfTEVOICAgICAgICAgICAoQllURSkyMSAgIC8qxr3MqMzhuakqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1NVQkFEUl9MRU4gICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfU1VCQURSX0xFTiAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0JDX0xFTiAgICAgICAgICAgICAgIChCWVRFKTE2ICAgLyqy4zO94bm5o6xUX3pQU19MM19CYyhsM2NjLmgpKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9CQ19MRU4gICAgICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0JDX0xFTiAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTiAgICAgICAgICAoQllURSk0ICAgIC8qMTAyMjIzIDguNzIqLyAgICAgICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfU1NTVFJfTEVOICAgICAgICAgICAgKEJZVEUpODAgICAvKsa9zKjM4bmpvq3R6da1Ki8gICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1NTU1RSX0xFTiAgICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfU1NTVFJfTEVOICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX1VTU0RTVFJfTEVOICAgICAgICAgIChCWVRFKTgwICAgLyrGvcyozOG5qb6t0enWtSovICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9VU1NEU1RSX0xFTiAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX1VTU0RTVFJfTEVOICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRTVFJfTEVOICAgICAgICAgICAoQllURSkyNDQgIC8qsLTV1dfu0KG8r6OsvMbL47XE1+6089a1Ki8gICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1RYVFNUUl9MRU4gICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfVFhUU1RSX0xFTiAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0ZJTEVMU1RfTEVOICAgICAgICAgIChCWVRFKTY0ICAgIC8qxr3MqMzhuam+rdHp1rUqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfRklMRUxTVF9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9GSUxFTFNUX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfRVZOVExTVF9MRU4gICAgICAgICAgKEJZVEUpMjggICAvKjEwMjIyMyA4LjI1Ki8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9FVk5UTFNUX0xFTiAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0VWTlRMU1RfTEVOICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9DUkVBRFJJRF9MRU4gICAgICAgICAoQllURSkyNTUgIC8q1N22qCovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfQ1JFQURSSURfTEVOICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9DUkVBRFJJRF9MRU4gICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQ0FSREFUUl9MRU4gICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX0NBUkRBVFJfTEVOICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfQ0FSREFUUl9MRU4gICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX1JQRFVEQVRBX0xFTiAgICAgICAgIChCWVRFKTIzNyAgLyoxMDIyMjMgOC4zNiovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfUlBEVURBVEFfTEVOICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9SUERVREFUQV9MRU4gICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQVRSU1BfTEVOICAgICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX0FUUlNQX0xFTiAgICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfQVRSU1BfTEVOICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0JFQVJQUkFNX0xFTiAgICAgICAgIChCWVRFKTEzICAgLyrGvcyozOG5qb6t0enWtSovICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9CRUFSUFJBTV9MRU4gICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0JFQVJQUkFNX0xFTiAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9DSE5MREFUQV9MRU4gICAgICAgICAoQllURSkyNTUgIC8q1N22qCovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfQ0hOTERBVEFfTEVOICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9DSE5MREFUQV9MRU4gICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfT1RIUkFERFJfTEVOICAgICAgICAgKEJZVEUpMTYgICAvKjEwMjIyMyA4LjU4Ki8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9PVEhSQUREUl9MRU4gICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX09USFJBRERSX0xFTiAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9BSURfTEVOICAgICAgICAgICAgICAoQllURSkxNiAgIC8qVUlDQ01OR76t0enWtUVGYWlkKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9BSURfTEVOICAgICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0FJRF9MRU4gICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9TUlZSQ1JEX0xFTiAgICAgICAgICAoQllURSkyNTUgIC8q1N22qCovICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9TUlZSQ1JEX0xFTiAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX1NSVlJDUkRfTEVOICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9EVkNGTFRSX0xFTiAgICAgICAgICAoQllURSkyNTUgICAvKtTdtqgqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfRFZDRkxUUl9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9EVkNGTFRSX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfU1JWU1JDSF9MRU4gICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfU1JWU1JDSF9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9TUlZTUkNIX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQVRUUklORl9MRU4gICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfQVRUUklORl9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9BVFRSSU5GX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfU1JWTFNUX0xFTiAgICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfU1JWTFNUX0xFTiAgICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9TUlZMU1RfTEVOICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfUkVNQUREUl9MRU4gICAgICAgICAgKEJZVEUpNiAgIC8qxr3MqMzhuam+rdHp1rUqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfUkVNQUREUl9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9SRU1BRERSX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfTkVUTkFNRV9MRU4gICAgICAgICAgKEJZVEUpMTAwICAvKsa9zKjM4bmpvq3R6da1Ki8gICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX05FVE5BTUVfTEVOICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfTkVUTkFNRV9MRU4gICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0lNRUlfTEVOICAgICAgICAgICAgIChCWVRFKTggICAgLyogVF96UFNfSU1FSShwc0NvbS5oKSovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfSU1FSV9MRU4gICAgICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9JTUVJX0xFTiAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9JTUVJU1ZfTEVOICAgICAgICAgICAgIChCWVRFKTggICAgLyogVF96UFNfSU1FSShwc0NvbS5oKSovICAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfSU1FSVNWX0xFTiAgICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0lNRUlTVl9MRU4gICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfTU5SUkxUX0xFTiAgICAgICAgICAgKEJZVEUpMTYgICAvKjMxLjExMSA4LjIyKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9NTlJSTFRfTEVOICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX01OUlJMVF9MRU4gICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9CQ0NITFNUX0xFTiAgICAgICAgICAoQllURSkyNTUgIC8qxr3MqMzhuam+rdHp1rUqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfQkNDSExTVF9MRU4gICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9CQ0NITFNUX0xFTiAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQVRTVFJfTEVOICAgICAgICAgICAgKEJZVEUpMjU1ICAvKtTdtqgqLyAgIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfQVRTVFJfTEVOICAgICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9BVFNUUl9MRU4gICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfVVJMX0xFTiAgICAgICAgICAgICAgKEJZVEUpMjI2ICAvKsa9zKjM4bmpvq3R6da1Ki8gICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1VSTF9MRU4gICAgICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfVVJMX0xFTiAgICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX1BST0ZJTEVfTEVOICAgICAgICAgIChCWVRFKTYwICAgLyqwtNXV1+7Qobyvo6y8xsvjtcTX7rTz1rUqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1BST0ZJTEVfTEVOICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfUFJPRklMRV9MRU4gICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0JFQVJMU1RfTEVOICAgICAgICAgIChCWVRFKTUgICAgLyrGvcyozOG5qb6t0enWtSovICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9CRUFSTFNUX0xFTiAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0JFQVJMU1RfTEVOICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9ESVNDQ0FVU19MRU4gICAgICAgICAoQllURSkzMCAgIC8qMTAyMjIzIDguMjYqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX0RJU0NDQVVTX0xFTiAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfRElTQ0NBVVNfTEVOICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX1RQRFVfTEVOICAgICAgICAgICAgIChCWVRFKTE2NCAgLyptbWlhLXNtc73Tv9qjrFpQU19NTUlBU01TX01BWF9UUERVX0xFTihtbWlhc21zSW50LmgpKi8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9UUERVX0xFTiAgICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX1RQRFVfTEVOICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9UUFVEX0xFTiAgICAgICAgICAgICAoQllURSkxMjggIC8qMzEuMTExIDcuMS4xLjIqLyAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfTUFYX1RQVURfTEVOICAgICAgICAgIFpQU19BUFVJQ0NfVVNBVF9NQVhfVFBVRF9MRU4gICAgICAgICAgICAgDQotI2RlZmluZSBaUFNfQVBVSUNDX1VTQVRfTUFYX0NCU1BBR19MRU4gICAgICAgICAgIChCWVRFKTg4ICAgLyozMS4xMTEgOC41Ki8gICAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9DQlNQQUdfTEVOICAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0NCU1BBR19MRU4gICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9DQVBEVURBVF9MRU4gICAgICAgICAoQllURSkyMzYgIC8qMTAyMjIzIDguMzUqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9DQVBEVURBVF9MRU4gICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0NBUERVREFUX0xFTiAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FQVUlDQ19VU0FUX01BWF9JVEVNX05VTSAgICAgICAgICAgICAoQllURSkzMCAgIC8qsLTV1dfu0KG8r6OsvMbL47XE1+6089a1Ki8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9NQVhfSVRFTV9OVU0gICAgICAgICAgWlBTX0FQVUlDQ19VU0FUX01BWF9JVEVNX05VTSAgICAgICAgICAgICANCi0jZGVmaW5lIFpQU19BUFVJQ0NfVVNBVF9NQVhfQURESU5GT19MRU4gICAgICAgICAgKEJZVEUpNSAgICAvKtTdtqgqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX01BWF9BRERJTkZPX0xFTiAgICAgICBaUFNfQVBVSUNDX1VTQVRfTUFYX0FERElORk9fTEVOICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1BkcEFkZHIgICAgICAgICAgICAgICAgICAoQllURSkyMCAgICAvKrLO1dWy4zMqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1BkcEFkZHIgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfUGRwQWRkciAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0FwbiAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMDAgICAvKrLO1dWy4zMqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0FwbiAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfQXBuICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX1Byb3RvSUQgICAgICAgICAgICAgICAgICAoQllURSk1MCAgICAvKrLO1dWy4zMqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX1Byb3RvSUQgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfUHJvdG9JRCAgICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfQklQX0NIQU5ORUxfTlVNICAgICAgICAgICAgICAgKEJZVEUpNyAgICANCi0NCi0jZGVmaW5lIFpfQVBVSUNDX0NNRF9TVUNDICAgICAgICAgICAgICAgICAgICAwDQotI2RlZmluZSBaX0FQVUlDQ19DTURfRkFJTCAgICAgICAgICAgICAgICAgICAgMQ0KLQ0KLSNkZWZpbmUgWlBTX0FwVWljY19DTURfU1VDQyAgICAgICAgICAgICAgICAgICAgWl9BUFVJQ0NfQ01EX1NVQ0MNCi0jZGVmaW5lIFpQU19BcFVpY2NfQ01EX0ZBSUwgICAgICAgICAgICAgICAgICAgIFpfQVBVSUNDX0NNRF9GQUlMDQotDQotDQotDQotLyo9PT09PXRoZSBtYWNybyAgb2YgZXJyLCBkZWZpbmUgaW4gdGhlIDI3LjAwNz09PT09Ki8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX05PX0NBUkQgICAgICAgICAgICAgICAgKERXT1JEKTEwICAgICAgICAgICAgICAgICAgICAgICAgLypTSU0gbm90IGluc2VydGVkKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05PX0NBUkQgICAgICAgICAgICAgICAgWlBTX0FwVWljY19OT19DQVJEICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkVFRF9QSU4gICAgICAgICAgICAgICAoRFdPUkQpMTEgICAgICAgICAgICAgICAgICAgICAgICAvKlNJTSBQSU4gcmVxdWlyZWQqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTkVFRF9QSU4gICAgICAgICAgICAgICBaUFNfQXBVaWNjX05FRURfUElOICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19ORUVEX1VOQkxQSU4gICAgICAgICAgIChEV09SRCkxMiAgICAgICAgICAgICAgICAgICAgICAgIC8qU0lNIFBVSyByZXF1aXJlZCovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19ORUVEX1VOQkxQSU4gICAgICAgICAgIFpQU19BcFVpY2NfTkVFRF9VTkJMUElOICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0NBUkRfRkFJTEVEICAgICAgICAgICAgKERXT1JEKTEzICAgICAgICAgICAgICAgICAgICAgICAgLypTSU0gZmFsaXVyZSovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19DQVJEX0ZBSUxFRCAgICAgICAgICAgIFpQU19BcFVpY2NfQ0FSRF9GQUlMRUQgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0NBUkRfQlVTWSAgICAgICAgICAgICAgKERXT1JEKTE0ICAgICAgICAgICAgICAgICAgICAgICAgLypTSU0gYnVzeSovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19DQVJEX0JVU1kgICAgICAgICAgICAgIFpQU19BcFVpY2NfQ0FSRF9CVVNZICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0NBUkRfV1JPTkcgICAgICAgICAgICAgKERXT1JEKTE1ICAgICAgICAgICAgICAgICAgICAgICAgLypTSU0gd3JvbmcqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQ0FSRF9XUk9ORyAgICAgICAgICAgICBaUFNfQXBVaWNjX0NBUkRfV1JPTkcgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19QSU5fSU5DT1JSRUNUICAgICAgICAgIChEV09SRCkxNiAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5jb3JyZWN0IHBhc3N3b3JkKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX1BJTl9JTkNPUlJFQ1QgICAgICAgICAgWlBTX0FwVWljY19QSU5fSU5DT1JSRUNUICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkVFRF9QSU4yICAgICAgICAgICAgICAoRFdPUkQpMTcgICAgICAgICAgICAgICAgICAgICAgICAvKlNJTSBQSU4yIHJlcXVpcmVkKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05FRURfUElOMiAgICAgICAgICAgICAgWlBTX0FwVWljY19ORUVEX1BJTjIgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkVFRF9VTkJMUElOMiAgICAgICAgICAoRFdPUkQpMTggICAgICAgICAgICAgICAgICAgICAgICAvKlNJTSBQVUsyIHJlcXVpcmVkKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05FRURfVU5CTFBJTjIgICAgICAgICAgWlBTX0FwVWljY19ORUVEX1VOQkxQSU4yICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfT1BFUl9OT1RfQUxMT1dFRCAgICAgICAoRFdPUkQpMyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfT1BFUl9OT1RfQUxMT1dFRCAgICAgICBaUFNfQXBVaWNjX09QRVJfTk9UX0FMTE9XRUQgICAgICAgDQotDQotLypVaWNjTW5n0OjSqsCp1bm1xLTtzvPC6yovDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19BUFBMX0ZBSUwgICAgICAgICAgICAgIChEV09SRClaUFNfQXBVaWNjX0NBUkRfRkFJTEVEICAgLyp0aGUgdW5ibG9jayBwaW4gb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGJsb2NrZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKtPrxr3MqM/gudjIy9SxzNbC27rzo6zU3dPrQ2FyZEZhaWzWtc/gzawqLw0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FQUExfRkFJTCAgICAgICAgICAgICAgWlBTX0FwVWljY19BUFBMX0ZBSUwgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0vKlVTQVS94sLrtO3O88LrKi8NCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9ERV9NU0dTSE9SVF9FUlIgICAgICAgIChEV09SRCkyNjIgICAgIC8qVExWveG5ubK7yKsqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0RFX01TR1NIT1JUX0VSUiAgICAgICBaUFNfQXBVaWNjX1VTQVRfREVfTVNHU0hPUlRfRVJSICAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9ERV9NSVNTT0lORk9fRVJSICAgICAgIChEV09SRCkyNjMgICAgIC8q1KrL2LK7yKujrLWr09DX7tChvK8qLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0RFX01JU1NPSU5GT19FUlIgICAgICBaUFNfQXBVaWNjX1VTQVRfREVfTUlTU09JTkZPX0VSUiAgICAgICANCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9ERV9NSVNTTUlORk9fRVJSICAgICAgIChEV09SRCkyNjQgICAgIC8qyLHJ2dfu0KG8ryovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfREVfTUlTU01JTkZPX0VSUiAgICAgIFpQU19BcFVpY2NfVVNBVF9ERV9NSVNTTUlORk9fRVJSICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0RFX1VOS05PV19FUlIgICAgICAgICAgKERXT1JEKTI2NSAgICAgLyqyu7/JwO294iovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfREVfVU5LTk9XX0VSUiAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9ERV9VTktOT1dfRVJSICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0RFX1BBVElBTF9FUlIgICAgICAgICAgKERXT1JEKTI2NiAgICAgLyqyv7fWwO294iovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfREVfUEFUSUFMX0VSUiAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9ERV9QQVRJQUxfRVJSICAgICAgICAgIA0KLSNkZWZpbmUgWlBTX0FwVWljY19VU0FUX0RFX0xFTlRIX0VSUiAgICAgICAgICAgKERXT1JEKTI2NyAgICAgLyqzpLbI09DO8yoqLyAgDQotI2RlZmluZSBaX0FQVUlDQ19VU0FUX0RFX0xFTlRIX0VSUiAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfREVfTEVOVEhfRVJSICAgICAgICAgICANCi0NCi0vKlVTQVSx4MLrtO3O88LrKi8NCi0jZGVmaW5lIFpQU19BcFVpY2NfVVNBVF9FTl9NU0dXUk9OR19FUlIgICAgICAgIChEV09SRCkyNjggICAgIC8qyc+y48Sjv+m3os/CtcTP+8+ixNrI3bK7ttSjrLK7xNyx4MLrKi8gIA0KLSNkZWZpbmUgWl9BUFVJQ0NfVVNBVF9FTl9NU0dXUk9OR19FUlIgICAgICAgWlBTX0FwVWljY19VU0FUX0VOX01TR1dST05HX0VSUiAgICAgICAgDQotI2RlZmluZSBaUFNfQXBVaWNjX1VTQVRfRU5fVUtOT1dfRVJSICAgICAgICAgICAoRFdPUkQpMjY5ICAgICAvKrHgwuvOtNaqtO3O8yovICANCi0jZGVmaW5lIFpfQVBVSUNDX1VTQVRfRU5fVUtOT1dfRVJSICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9FTl9VS05PV19FUlIgICAgICAgICAgIA0KLQ0KLS8qVVNBVNT2vNO07c7zwusqLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfVVNBVF9FTkRGRVRDSCAgICAgICAgICAgICAoRFdPUkQpMjcwICAgICAvKlNXID0gOTFYWCovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX0VOREZFVENIICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9FTkRGRVRDSCAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1VTQVRfQlVTWSAgICAgICAgICAgICAgICAgKERXT1JEKTI3MSAgICAgLypTVyA9IDkzMDAqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfVVNBVF9CVVNZICAgICAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfQlVTWSAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19VU0FUX05WVUNITkcgICAgICAgICAgICAgIChEV09SRCkyNzIgICAgIC8qU1cgPSA2MiAwMCovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX05WVUNITkcgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9OVlVDSE5HICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1VTQVRfREFUQUNSUFQgICAgICAgICAgICAgKERXT1JEKTI3MyAgICAgLypTVyA9NjIgODEqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfVVNBVF9EQVRBQ1JQVCAgICAgICAgICBaUFNfQXBVaWNjX1VTQVRfREFUQUNSUFQgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19VU0FUX0VORFJFQUNIICAgICAgICAgICAgIChEV09SRCkyNzQgICAgIC8qU1cgPTYyIDgyKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX1VTQVRfRU5EUkVBQ0ggICAgICAgICAgWlBTX0FwVWljY19VU0FUX0VORFJFQUNIICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfVVNBVF9GSUxFSU5WQUxJRCAgICAgICAgICAoRFdPUkQpMjc1ICAgICAvKlNXID0gNjIgODMqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfVVNBVF9GSUxFSU5WQUxJRCAgICAgICBaUFNfQXBVaWNjX1VTQVRfRklMRUlOVkFMSUQgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19VU0FUX1NVQ0NSRVRSWSAgICAgICAgICAgIChEV09SRCkyNzYgICAgIC8qU1cgPSA2MyBYWCovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX1NVQ0NSRVRSWSAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9TVUNDUkVUUlkgICAgICAgICAgICANCi0NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1VTQVRfTkFBTk9UQUNUX0VSUiAgIChEV09SRCkyNzcNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX05BQU5PVEFDVF9FUlIgICAgIFpQU19BcFVpY2NfVVNBVF9OQUFOT1RBQ1RfRVJSDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19VU0FUX05FRURJTklUVVNJTV9FUlIgIChEV09SRCkyNzgNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX05FRURJTklUVVNJTV9FUlIgIFpQU19BcFVpY2NfVVNBVF9ORUVESU5JVFVTSU1fRVJSDQotDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19VU0FUX0RFX09LICAgICAgICAgICAgIChEV09SRCkzMCANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19VU0FUX0RFX09LICAgICAgICAgICAgIFpQU19BcFVpY2NfVVNBVF9ERV9PSw0KLQ0KLS8qPT09PXRoZSBtYWNybyBvZiBzdWNjZXNzIGNvZGU9PT09Ki8NCi0jZGVmaW5lICAgICAgIFpQU19BcFVpY2NfQ01EX09LICAgICAgICAgICAgICAgICAoRFdPUkQpMzAgICAgICANCi0jZGVmaW5lICAgICAgIFpfQVBVSUNDX0NNRF9PSyAgICAgICAgICAgICAgIFpQU19BcFVpY2NfQ01EX09LICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICAgIFpQU19BcFVpY2NfRUxFTUVOVEFSWV9JTklUX09LICAgICAoRFdPUkQpMzENCi0jZGVmaW5lICAgICAgIFpfQVBVSUNDX0VMRU1FTlRBUllfSU5JVF9PSyAgIFpQU19BcFVpY2NfRUxFTUVOVEFSWV9JTklUX09LICAgICANCi0NCi0vKrXnu7Cxvs7EvP6zpLbItqjS5SovDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19FTUFJTF9MRU4gICAgICAgICAgICAgIChCWVRFKTUwICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19FTUFJTF9MRU4gICAgICAgICAgICAgIFpQU19BcFVpY2NfRU1BSUxfTEVOICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1NORV9MRU4gICAgICAgICAgICAgICAgKEJZVEUpMTQgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX1NORV9MRU4gICAgICAgICAgICAgICAgWlBTX0FwVWljY19TTkVfTEVOICAgICAgICAgICAgICAgIA0KLQ0KLS8qv6jJz1BJTte0zKwsss68+zI3MDA3Ki8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1BJTl9SRUFEWSAgICAgICAgICAgICAgIChCWVRFKTAgIC8qsrvQ6NKq0enWpFBJTiovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19QSU5fUkVBRFkgICAgICAgICAgICAgIFpQU19BcFVpY2NfUElOX1JFQURZICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19QSU5fU0lNUElOICAgICAgICAgICAgICAoQllURSkxICAvKnVuaXZlcnNhbCBQSU68sFBJTjHQ6NKq0enWpMq508MqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfUElOX1NJTVBJTiAgICAgICAgICAgICBaUFNfQXBVaWNjX1BJTl9TSU1QSU4gICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfUElOX1NJTVBVSyAgICAgICAgICAgICAgKEJZVEUpMiAgLyp1bml2ZXJzYWwgUElOvLBQSU4x0OjSqr3iy/jKudPDKi8gIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX1BJTl9TSU1QVUsgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLICAgICAgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1BJTl9TSU1QSU4yICAgICAgICAgICAgIChCWVRFKTMgIC8qUElOMtDo0qrR6dakyrnTwyovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19QSU5fU0lNUElOMiAgICAgICAgICAgIFpQU19BcFVpY2NfUElOX1NJTVBJTjIgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLMiAgICAgICAgICAgICAoQllURSk0ICAvKlBJTjLQ6NKqveLL+Mq508MqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfUElOX1NJTVBVSzIgICAgICAgICAgICBaUFNfQXBVaWNjX1BJTl9TSU1QVUsyICAgICAgICAgICAgIA0KLQ0KLS8qv6jJz1BJTsrHt/Gxu7yku+4oyse38UVuYWJsZbvyRGlzYWJsZSksss68+zI3MDA3Ki8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1BJTl9OT1RBQ1RJVkUgICAgICAgICAgIChCWVRFKTAgLyptbWlh16q7r86qWlBTX0FQTU1JQV9DTENLX05PVEFDVElWRSovICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19QSU5fTk9UQUNUSVZFICAgICAgICAgIFpQU19BcFVpY2NfUElOX05PVEFDVElWRSAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19QSU5fQUNUSVZFICAgICAgICAgICAgICAoQllURSkxIC8qbW1pYdequ6/OqlpQU19BUE1NSUFfQ0xDS19BQ1RJVkUqLyAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfUElOX0FDVElWRSAgICAgICAgICAgICBaUFNfQXBVaWNjX1BJTl9BQ1RJVkUgICAgICAgICAgICAgIA0KLSANCi0vKlBJTlJlcdbQUElOdHlwZSy99tTaQ1BXRNbQyrnTwyzTw9PaQ2hhbmdlUElOKi8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX1BJTjFUWVBFICAgICAgICAgICAgICAgIChCWVRFKTAgICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19QSU4xVFlQRSAgICAgICAgICAgICAgIFpQU19BcFVpY2NfUElOMVRZUEUgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19QSU4yVFlQRSAgICAgICAgICAgICAgICAoQllURSkxICAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfUElOMlRZUEUgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1BJTjJUWVBFICAgICAgICAgICAgICAgIA0KLQ0KLS8qQVQgY29tbWFuZCBDUlNNKi8NCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfTUFYX0NSU01SRVFEQVRBX0xFTiAgICAgICAgICAgIChCWVRFKTI1NQ0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfTUFYX0NSU01SRVFEQVRBX0xFTiAgICAgICAgWlBTX0FwVWljY19NQVhfQ1JTTVJFUURBVEFfTEVODQotI2RlZmluZSAgICBaUFNfQXBVaWNjX01BWF9DUlNNQ05GREFUQV9MRU4gICAgICAgICAgICAoV09SRCkyNTYgIA0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfTUFYX0NSU01DTkZEQVRBX0xFTiAgICAgICAgWlBTX0FwVWljY19NQVhfQ1JTTUNORkRBVEFfTEVOICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfQXBVaWNjX01BWF9QQVRIX0xFTiAgICAgICAgICAgICAgICAoQllURSk4ICANCi0jZGVmaW5lICAgIFpfQVBVSUNDX01BWF9QQVRIX0xFTiAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX1BBVEhfTEVOICAgICAgICAgICAgICAgIA0KLQ0KLQ0KLSNkZWZpbmUgICAgWlBTX1VJQ0NfUEJSX1RZUEUxICAgICAgICAgICAgICAgICAgIChCWVRFKTAgICANCi0jZGVmaW5lICAgIFpfVUlDQ19QQlJfVFlQRTEgICAgICAgICAgICAgICAgIFpQU19VSUNDX1BCUl9UWVBFMSAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgIFpQU19VSUNDX1BCUl9UWVBFMiAgICAgICAgICAgICAgICAgICAoQllURSkxICAgDQotI2RlZmluZSAgICBaX1VJQ0NfUEJSX1RZUEUyICAgICAgICAgICAgICAgICBaUFNfVUlDQ19QQlJfVFlQRTIgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSAgICBaUFNfVUlDQ19QQlJfVFlQRTMgICAgICAgICAgICAgICAgICAgKEJZVEUpMiAgIA0KLSNkZWZpbmUgICAgWl9VSUNDX1BCUl9UWVBFMyAgICAgICAgICAgICAgICAgWlBTX1VJQ0NfUEJSX1RZUEUzICAgICAgICAgICAgICAgICAgIA0KLS8qQVQgY29tbWFuZCBDUlNNKi8NCi0jZGVmaW5lICAgIFpQU19BcFVpY2NfQWN0aXZlRmlsZSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgDQotI2RlZmluZSAgICBaX0FQVUlDQ19BQ1RJVkVGSUxFICAgICAgICAgICAgICBaUFNfQXBVaWNjX0FjdGl2ZUZpbGUgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgWlBTX0FwVWljY19EZWFjdGl2ZUZpbGUgICAgICAgICAgICAgICAgICAoQllURSkxICANCi0jZGVmaW5lICAgIFpfQVBVSUNDX0RFQUNUSVZFRklMRSAgICAgICAgICAgIFpQU19BcFVpY2NfRGVhY3RpdmVGaWxlICAgICAgICAgICAgICAgICAgDQotDQotLyogRUYgc3RhdHVzICovDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19FZlN0YXR1c19JTlZBTElEICAgIChCWVRFKTAgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0VGU1RBVFVTX0lOVkFMSUQgICAgICAgICAgIFpQU19BcFVpY2NfRWZTdGF0dXNfSU5WQUxJRCAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0VmU3RhdHVzX1JFSEFCICAgICAgKEJZVEUpMSAgDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfRUZTVEFUVVNfUkVIQUIgICAgICAgICAgICAgWlBTX0FwVWljY19FZlN0YXR1c19SRUhBQiAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfRWZTdGF0dXNfRVJST1IgICAgICAoQllURSkyICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19FRlNUQVRVU19FUlJPUiAgICAgICAgICAgICBaUFNfQXBVaWNjX0VmU3RhdHVzX0VSUk9SICAgICAgDQotDQotLyogbW9kaWZ517TMrCAqLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfRWZTdGF0dXNNb2RpZnlfSU5WQUxJRCAgICAoQllURSkwICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19FRlNUQVRVU01PRElGWV9JTlZBTElEICAgICBaUFNfQXBVaWNjX0VmU3RhdHVzTW9kaWZ5X0lOVkFMSUQgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19FZlN0YXR1c01vZGlmeV9SRUhBQiAgICAgIChCWVRFKTEgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0VGU1RBVFVTTU9ESUZZX1JFSEFCICAgICAgIFpQU19BcFVpY2NfRWZTdGF0dXNNb2RpZnlfUkVIQUIgICAgICANCi0NCi0vKiC/qMv417TMrCAqLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfQ2FyZFN0YXR1c19Mb2NrICAgICAgICAgICAoQllURSkwICANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19DQVJEU1RBVFVTX0xPQ0sgICAgICAgICAgICBaUFNfQXBVaWNjX0NhcmRTdGF0dXNfTG9jayAgICAgICAgICAgDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19DYXJkU3RhdHVzX1VubG9jayAgICAgICAgIChCWVRFKTEgIA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0NBUkRTVEFUVVNfVU5MT0NLICAgICAgICAgIFpQU19BcFVpY2NfQ2FyZFN0YXR1c19VbmxvY2sgICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9ESVJBSURfTEVOICAgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX01BWF9ESVJBSURfTEVOICAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0RJUkFJRF9MRU4gICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9JTklUQVBQTU9ERV9OVU0gICAgICAoQllURSkzDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTUFYX0lOSVRBUFBNT0RFX05VTSAgICAgICAgWlBTX0FwVWljY19NQVhfSU5JVEFQUE1PREVfTlVNICAgICAgDQotI2RlZmluZSAgICAgIFpQU19BcFVpY2NfTUFYX0ZSRUVSRUNfTlVNICAgICAgICAgIChCWVRFKTI1NQ0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX01BWF9GUkVFUkVDX05VTSAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0ZSRUVSRUNfTlVNICAgIA0KLSNkZWZpbmUgICAgICBaUFNfQXBVaWNjX01BWF9QQVRURVJOX05VTSAgICAgICAgICAoQllURSkyNTUgICAgLyogU0VBUkNIstnX97XEcGF0dGVybtfutPOzpLbIICovDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTUFYX1BBVFRFUk5fTlVNICAgICAgICAgICAgWlBTX0FwVWljY19NQVhfUEFUVEVSTl9OVU0gICAgIA0KLSNkZWZpbmUgICAgICBaUFNfQXBVaWNjX01BWF9BQ0NPUkRSRUNfTlVNICAgICAgICAoQllURSkyNTUgICAgLyogU0VBUkNIstnX97XEveG5+7zHwrzK/dfutPO49sr9ICovDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTUFYX0FDQ09SRFJFQ19OVU0gICAgICAgICAgWlBTX0FwVWljY19NQVhfQUNDT1JEUkVDX05VTSAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9JVEVNX05VTSAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX01BWF9JVEVNX05VTSAgICAgICAgICAgICAgIFpQU19BcFVpY2NfTUFYX0lURU1fTlVNICAgIA0KLQ0KLQ0KLS8qIG1vZGUgdmFsdWUgaW4gVF96UFNfQXBVaWNjX0ZhY2lsaXR5UGluX1JlcSAqLw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfRkFDSUxJVFlQSU5fRElTICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19GQUNJTElUWVBJTl9ESVMgICAgICAgICAgICBaUFNfQXBVaWNjX0ZBQ0lMSVRZUElOX0RJUyAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfRkFDSUxJVFlQSU5fRU4gICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lICAgICBaX0FQVUlDQ19GQUNJTElUWVBJTl9FTiAgICAgICAgICAgICBaUFNfQXBVaWNjX0ZBQ0lMSVRZUElOX0VOICAgICAgICAgICAgICAgIA0KLQ0KLS8qIFJlZnJlc2ggz+C52LrqKi8NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX05BQUluaXRfRnVsbEZpbGVDaG5nICAgICAgIChCWVRFKTANCi0jZGVmaW5lICAgICBaX0FQVUlDQ19OQUFJTklUX0ZVTExGSUxFQ0hORyAgICAgICAgICBaUFNfQXBVaWNjX05BQUluaXRfRnVsbEZpbGVDaG5nDQotI2RlZmluZSAgICAgWlBTX0FwVWljY19GaWxlQ2huZyAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfRklMRUNITkcgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19GaWxlQ2huZw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkFBSW5pdF9GaWxlQ2huZyAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05BQUlOSVRfRklMRUNITkcgICAgICAgICAgICAgIFpQU19BcFVpY2NfTkFBSW5pdF9GaWxlQ2huZw0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkFBSW5pdCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05BQUlOSVQgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfTkFBSW5pdA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfVUlDQ19SZXNldCAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX1VJQ0NfUkVTRVQgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfVUlDQ19SZXNldA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTkFBX0FwcFJlc2V0ICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX05BQV9BUFBSRVNFVCAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfTkFBX0FwcFJlc2V0DQotI2RlZmluZSAgICAgWlBTX0FwVWljY19OQUFfU2Vzc2lvblJlc2V0ICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19OQUFfU0VTU0lPTlJFU0VUICAgICAgICAgICAgIFpQU19BcFVpY2NfTkFBX1Nlc3Npb25SZXNldA0KLQ0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfTUFYX0ZJTEVfTlVNICAgICAgICAgICAgICAoQllURSkxMjgNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19NQVhfRklMRV9OVU0gICAgICAgICAgICAgICAgWlBTX0FwVWljY19NQVhfRklMRV9OVU0NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9TTVBCX05VTSAgICAgICAgICAgICAgKEJZVEUpMzYNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19NQVhfU01QQl9OVU0gICAgICAgICAgICAgICAgWlBTX0FwVWljY19NQVhfU01QQl9OVU0NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX01BWF9BUFBCX05VTSAgICAgICAgICAgICAgKEJZVEUpMzYNCi0jZGVmaW5lICAgICBaX0FQVUlDQ19NQVhfQVBQQl9OVU0gICAgICAgICAgICAgICAgWlBTX0FwVWljY19NQVhfQVBQQl9OVU0NCi0NCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0FUUl9NQVhMRU4gICAgICAgICAgICAgICAoQllURSkzNA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FUUl9NQVhMRU4gICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfQVRSX01BWExFTiAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgICAgIFpQU19BcFVpY2NfQVBEVV9SRVFfTUFYTEVOICAgICAgICAgKFdPUkQpMjYyDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVBEVV9SRVFfTUFYTEVOICAgICAgICAgICAgWlBTX0FwVWljY19BUERVX1JFUV9NQVhMRU4gICAgICAgICANCi0jZGVmaW5lICAgICBaUFNfQXBVaWNjX0FQRFVfQ05GX01BWExFTiAgICAgICAgIChXT1JEKTI1OA0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FQRFVfQ05GX01BWkxFTiAgICAgICAgICAgIFpQU19BcFVpY2NfQVBEVV9DTkZfTUFYTEVOIA0KLQ0KLSNkZWZpbmUgICAgIFpfVkNBUkRfQUlSX0FVVEhfUlNQX0xFTiAgICAgICAgKEJZVEUpNjMNCi0jZGVmaW5lICAgICBaX1ZDQVJEX0FJUl9BVVRIX1JFUV9MRU4gICAgICAgIChCWVRFKTM0DQotDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfU0VBUkNIX0ZST01fQ0FSRCAgICAgICAoQllURSkwDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfU0VBUkNIX0ZST01fQ0FDSEUgICAgKEJZVEUpMQ0KLQ0KLSNkZWZpbmUgICAgIFpfQVBVSUNDX0FUQ01EX0NTSU0gICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfQVRDTURfWlNJTSAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKs7ev6jP+8+iwODQzSovDQotI2RlZmluZSAgICAgWl9BUFVJQ0NfTk9DQVJEX1RZUEVfTk9STUFMICAgICAgICAgICAgICAgICAoQllURSkwICAvKtX9s6PO3r+oKi8NCi0jZGVmaW5lICAgICBaX0FQVUlDQ19OT0NBUkRfVFlQRV9SRVNFVF9SRUZSRVNIICAgIChCWVRFKTEgIC8qVUlDQyBSRVNFVCDA4NDNtcRSRUZSRVNIINL9xvC1xM7ev6gqLw0KLQ0KLSNkZWZpbmUgWl9VU0FUX0xPQ0FUSU9OX1VQREFURV9OT1JNQUwgICAgICAgICAgIChCWVRFKTB4MDAgIC8vLScwMCcgPSAiTm9ybWFsIExvY2F0aW9uIFVwZGF0aW5nIiBpbiB0aGUgY2FzZSBvZiBhIExvY2F0aW9uIFVwZGF0aW5nIFJlcXVlc3QgbWVzc2FnZTsNCi0jZGVmaW5lIFpfVVNBVF9MT0NBVElPTl9VUERBVEVfUEVSSU9ESUMgICAgICAgICAoQllURSkweDAxICAvLy0nMDEnID0gIlBlcmlvZGljIFVwZGF0aW5nIiBpbiB0aGUgY2FzZSBvZiBhIExvY2F0aW9uIFVwZGF0aW5nIFJlcXVlc3QgbWVzc2FnZTsNCi0jZGVmaW5lIFpfVVNBVF9MT0NBVElPTl9VUERBVEVfSU1TSSAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMiAgLy8tJzAyJyA9ICJJTVNJIEF0dGFjaCIgaW4gdGhlIGNhc2Ugb2YgYSBMb2NhdGlvbiBVcGRhdGluZyBSZXF1ZXN0IG1lc3NhZ2U7DQotI2RlZmluZSBaX1VTQVRfR1BSU19BVFRBQ0hfR1BSU19BVFRBQ0ggICAgICAgICAgKEJZVEUpMHgwMyAgLy8tJzAzJyA9ICJHUFJTIEF0dGFjaCIgaW4gdGhlIGNhc2Ugb2YgYSBHUFJTIEF0dGFjaCBSZXF1ZXN0IG1lc3NhZ2U7DQotI2RlZmluZSBaX1VTQVRfR1BSU19BVFRBQ0hfQ09NQl9HUFJTX0lNU0kgICAgKEJZVEUpMHgwNCAgLy8tJzA0JyA9ICJDb21iaW5lZCBHUFJTL0lNU0kgQXR0YWNoIiBpbiB0aGUgY2FzZSBvZiBhIEdQUlMgQXR0YWNoIFJlcXVlc3QgbWVzc2FnZTsNCi0jZGVmaW5lIFpfVVNBVF9SQVVfUkFfVVBEQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwNSAgLy8tJzA1JyA9ICJSQSBVcGRhdGluZyIgaW4gdGhlIGNhc2Ugb2YgYSBSb3V0aW5nIEFyZWEgVXBkYXRlIFJlcXVlc3QgbWVzc2FnZTsNCi0jZGVmaW5lIFpfVVNBVF9SQVVfQ09NQl9SQV9MQSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MDYgIC8vLScwNicgPSAiQ29tYmluZWQgUkEvTEEgVXBkYXRpbmciIGluIHRoZSBjYXNlIG9mIGEgUm91dGluZyBBcmVhIFVwZGF0ZSBSZXF1ZXN0IG1lc3NhZ2U7DQotI2RlZmluZSBaX1VTQVRfUkFVX0NPTUJfUkFfTEFfSU1TSSAgICAgICAgICAgICAgICAgKEJZVEUpMHgwNyAgLy8tJzA3JyA9ICJDb21iaW5lZCBSQS9MQSBVcGRhdGluZyB3aXRoIElNU0kgQXR0YWNoIiBpbiB0aGUgY2FzZSBvZiBhIFJvdXRpbmcgQXJlYSBVcGRhdGUgUmVxdWVzdCBtZXNzYWdlOw0KLSNkZWZpbmUgWl9VU0FUX1JBVV9QRVJJT0RJQ19VUERBVEUgICAgICAgICAgICAgICAgICAoQllURSkweDA4ICAvLy0nMDgnID0gIlBlcmlvZGljIFVwZGF0aW5nIiBpbiB0aGUgY2FzZSBvZiBhIFJvdXRpbmcgQXJlYSBVcGRhdGUgUmVxdWVzdCBtZXNzYWdlDQotI2RlZmluZSBaX1VTQVRfRU1NX0FUVEFDSF9FUFNfQVRUQUNIICAgICAgICAgICAgKEJZVEUpMHgwOSAgLy8tJzA5JyA9ICJFUFMgQXR0YWNoIiBpbiB0aGUgY2FzZSBvZiBhbiBFTU0gQVRUQUNIIFJFUVVFU1QgbWVzc2FnZQ0KLSNkZWZpbmUgWl9VU0FUX0VNTV9BVFRBQ0hfQ09NQl9FUFNfSU1TSSAgICAgICAoQllURSkweDBBICAvLy0nMEEnID0gIkNvbWJpbmVkIEVQUy9JTVNJIEF0dGFjaCIgaW4gdGhlIGNhc2Ugb2YgYW4gRU1NIEFUVEFDSCBSRVFVRVNUIG1lc3NhZ2UNCi0jZGVmaW5lIFpfVVNBVF9FTU1fVEFVX1RBX1VQREFURSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwQiAgLy8tJzBCJyA9ICJUQSB1cGRhdGluZyAiIGluIHRoZSBjYXNlIG9mIGFuIEVNTSBUUkFDS0lORyBBUkVBIFVQREFURSBSRVFVRVNUIG1lc3NhZ2UNCi0jZGVmaW5lIFpfVVNBVF9FTU1fVEFVX0NPTUJfVEFfTEEJCSAgICAgIChCWVRFKTB4MEMgIC8vLScwQycgPSAiQ29tYmluZWQgVEEvTEEgdXBkYXRpbmciIGluIHRoZSBjYXNlIG9mIGFuIEVNTSBUUkFDS0lORyBBUkVBIFVQREFURSBSRVFVRVNUIG1lc3NhZ2UNCi0jZGVmaW5lIFpfVVNBVF9FTU1fVEFVX0NPTUJfVEFfTEFfSU1TSSAgICAgICAgIChCWVRFKTB4MEQgIC8vLScwRCcgPSAiQ29tYmluZWQgVEEvTEEgdXBkYXRpbmcgd2l0aCBJTVNJIGF0dGFjaCIgaW4gdGhlIGNhc2Ugb2YgYW4gRU1NIFRSQUNLSU5HIEFSRUEgVVBEQVRFIFJFUVVFU1QgbWVzc2FnZQ0KLSNkZWZpbmUgWl9VU0FUX0VNTV9UQVVfUEVSSU9ESUNfVVBEQVRFICAgICAgICAgKEJZVEUpMHgwRSAgLy8tJzBFJyA9ICJQZXJpb2RpYyB1cGRhdGluZyIgaW4gdGhlIGNhc2Ugb2YgYW4gRU1NIFRSQUNLSU5HIEFSRUEgVVBEQVRFIFJFUVVFU1QgbWVzc2FnZQ0KLQ0KLSNkZWZpbmUgICAgWl9BUFVJQ0NfRUlEX0xFTiAgICAgICAgICAgIChCWVRFKTEwICANCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgIMirvtbK/b7dwODQzbao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgIFVJQ0PW0EVGveG5ubao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKjQuMS4xIEVGRGlyICAqLw0KLXR5cGVkZWYgc3RydWN0IHsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWlkTGVuOyAgICAgICAgICAgICAgLyoxLi4uMTYqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXBwTGFiZWxGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFwcExhYmVsTWF4TGVuOyAgICAgLyq1scewv6jW0GFscGhh1+6087OktsgqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFpZFZhbFtaUFNfQXBVaWNjX01BWF9ESVJBSURfTEVOXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBcHBMYWJlbFZhbFszMl07DQotfVRfelBTX1VJQ0NfRGlyLA0KLVRfel9VSUNDX0RpcjsNCi0NCi0NCi0vKjQuMS4yIEVGSUNDSUQgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYklkWzEwXTsgICAgICAgICAgIC8qSWRlbnRpZmljYXRpb24gbnVtYmVyKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96UFNfVUlDQ19JY2NpZCwNCi1UX3pfVUlDQ19JY2NpZDsNCi0NCi0NCi0NCi0vKjQuMS4zIEVGUEwgICAqLw0KLXR5cGVkZWYgc3RydWN0eyAgICAgICAgICAgICAgICAgICAgICAgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgICAgLyrT79HUseDC69bWyv0qLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3TGFuZ0NvZGVbWlBTX1VJQ0NfTEVOX1BMQ09ERV07ICAgICAgLypsYW5ndWFnZSBDb2RlKi8gDQotfVRfelBTX1VJQ0NfUEwsDQotVF96X1VJQ0NfUEw7DQotDQotDQotLyogNC4xLjQgRUZhcnIgIDQuMi41NbrNNC41LjXSstPDtMu94bm5Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFjY0NvbmRWYWw7DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjZG9UYWc7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjZG9OdW07ICAgICAgIC8qILj41rUwLjIuNCC8xsr9xvcqLyANCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiS2V5UmVmMVZhbDsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXNhZ2UxVmFsOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJLZXlSZWYyVmFsOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVc2FnZTJWYWw7DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX1VJQ0NfQXJyQWNjLA0KLVRfel9VSUNDX0FyckFjYzsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFjY051bTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICBUX3pQU19VSUNDX0FyckFjYyAgICAgICAgICAgICAgICAgICAgICAgYXRBcnJBY2NbWlBTX1VJQ0NfTEVOX0FSUl07DQotfVRfelBTX1VJQ0NfQXJyLA0KLVRfel9VSUNDX0FycjsNCi0NCi0NCi0vKjQuMi4xIEVGTEkgKi8NCi10eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrT79HUseDC69bWyv0qLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3TGFuZ0NvZGVbWlBTX1VJQ0NfTEVOX0xJREFUQV07ICAgICAgICAgLypsYW5ndWFnZSBDb2RlKi8gICAgIA0KLX1UX3pQU19VSUNDX0xpLA0KLVRfel9VSUNDX0xpOw0KLQ0KLQ0KLS8qNC4yLjIgRUZJTVNJINaxvdPS/dPDVF96UFNfSU1TSSovDQotDQotLyo0LjIuMyBFRktFWVM7IDQuMi40IEVGS0VZU1BTICCyzrz7VF96UFNfVWljY0lkX1VtdHNTZWNLZXkqLw0KLQ0KLS8qNC4yLjUgRUZQTE1OV0FDVCCjrCCyzrz7VF96UFNfVWljY0lkX1VQbG1uSW5mbyovDQotDQotLyo0LjIuNyAgRUZBQ01tYXggKi8NCi10eXBlZGVmIERXT1JEICAgVF96UFNfVUlDQ19BQ01tYXgsDQotVF96X1VJQ0NfQUNNbWF4Ow0KLQ0KLS8qNC4yLjggIEVGVVNUICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxvY2FsUGJGZzoxOyAgIC8qIFNlcnZpY2UgbqHjMTogIExvY2FsIFBob25lIEJvb2sgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGZG5GZzoxOyAgICAgICAvKiBTZXJ2aWNlIG6h4zI6ICBGaXhlZCBEaWFsbGluZyBOdW1iZXJzIChGRE4pICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0ZW5zaW9uMjoxOyAgLyogU2VydmljZSBuoeMzOiAgRXh0ZW5zaW9uIDIgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZG5GZzoxOyAgICAgICAvKiBTZXJ2aWNlIG6h4zQ6ICBTZXJ2aWNlIERpYWxsaW5nIE51bWJlcnMgKFNETikgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHRlbnNpb24zOjE7ICAvKiBTZXJ2aWNlIG6h4zU6ICBFeHRlbnNpb24zICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmRuRmc6MTsgICAgICAgLyogU2VydmljZSBuoeM2OiAgQmFycmVkIERpYWxsaW5nIE51bWJlcnMgKEJETikgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHRlbnNpb240OjE7ICAvKiBTZXJ2aWNlIG6h4zc6ICBFeHRlbnNpb240ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT2NpRmc6MTsgICAgICAgLyogU2VydmljZSBuoeM4OiAgT3V0Z29pbmcgQ2FsbCBJbmZvcm1hdGlvbiAoT0NJIGFuZCBPQ1QpICovDQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNpRmc6MTsgICAgICAgLyogU2VydmljZSBuoeM5OiAgSW5jb21pbmcgQ2FsbCBJbmZvcm1hdGlvbiAoSUNJIGFuZCBJQ1QpICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU21zRmc6MTsgICAgICAgLyogU2VydmljZSBuoeMxMDogU2hvcnQgTWVzc2FnZSBTdG9yYWdlIChTTVMpICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU21zckZnOjE7ICAgICAgLyogU2VydmljZSBuoeMxMTogU2hvcnQgTWVzc2FnZSBTdGF0dXMgUmVwb3J0cyAoU01TUikgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbXNwRmc6MTsgICAgICAvKiBTZXJ2aWNlIG6h4zEyOiBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgUGFyYW1ldGVycyAoU01TUCkgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBb2NGZzoxOyAgICAgICAvKiBTZXJ2aWNlIG6h4zEzOiBBZHZpY2Ugb2YgQ2hhcmdlIChBb0MpICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2NwRmc6MTsgICAgICAgLyogU2VydmljZSBuoeMxNDogQ2FwYWJpbGl0eSBDb25maWd1cmF0aW9uIFBhcmFtZXRlcnMgKENDUCkgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYm1pRmc6MTsgICAgICAvKiBTZXJ2aWNlIG6h4zE1OiBDZWxsIEJyb2FkY2FzdCBNZXNzYWdlIElkZW50aWZpZXIgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2JtaXJGZzoxOyAgICAgLyogU2VydmljZSBuoeMxNjogQ2VsbCBCcm9hZGNhc3QgTWVzc2FnZSBJZGVudGlmaWVyIFJhbmdlcyAgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHcnBJZEwxRmc6MTsgICAvKiBTZXJ2aWNlIG6h4zE3OiBHcm91cCBJZGVudGlmaWVyIExldmVsIDEgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHcnBJZEwyRmc6MTsgICAvKiBTZXJ2aWNlIG6h4zE4OiBHcm91cCBJZGVudGlmaWVyIExldmVsIDIgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCc3BuRmc6MTsgICAgICAvKiBTZXJ2aWNlIG6h4zE5OiBTZXJ2aWNlIFByb3ZpZGVyIE5hbWUgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVUGxtbkZnOjE7ICAgICAvKiBTZXJ2aWNlIG6h4zIwOiBVc2VyIGNvbnRyb2xsZWQgUExNTiBzZWxlY3RvciB3aXRoIEFjY2VzcyBUZWNobm9sb2d5ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNpc2RuRmc6MTsgICAgLyogU2VydmljZSBuoeMyMTogTVNJU0ROICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1nRmc6MTsgICAgICAgLyogU2VydmljZSBuoeMyMjogSW1hZ2UgKElNRykgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTb2xzYUZnOjE7ICAgICAvKiBTZXJ2aWNlIG6h4zIzOiBTdXBwb3J0IG9mIExvY2FsaXNlZCBTZXJ2aWNlIEFyZWFzIChTb0xTQSkgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW1scHBGZzoxOyAgICAgLyogU2VydmljZSBuoeMyNDogRW5oYW5jZWQgTXVsdGkgTGV2ZWwgUHJlY2VkZW5jZSBhbmQgUHJlIGVtcHRpb24gU2VydmljZSAgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBYWVtbHBwRmc6MTsgICAvKiBTZXJ2aWNlIG6h4zI1OiBBdXRvbWF0aWMgQW5zd2VyIGZvciBlTUxQUCAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjE7ICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjMjY6IFJGVSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdzbUFjY0ZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjMjc6IEdTTSBBY2Nlc3MgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZHZTbXNQcEZnOjE7ICAvKiBTZXJ2aWNlIG6h4zI4OiBEYXRhIGRvd25sb2FkIHZpYSBTTVMtUFAgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZHZTbXNDYkZnOjE7ICAvKiBTZXJ2aWNlIG6h4zI5OiBEYXRhIGRvd25sb2FkIHZpYSBTTVMgQ0IgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDY0J5VXNpbUZnOjE7ICAvKiBTZXJ2aWNlIG6h4zMwOiBDYWxsIENvbnRyb2wgYnkgVVNJTSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1vc21zQnlVc2ltRmc6MTsvKiBTZXJ2aWNlIG6h4zMxOiAgTU8tU01TIENvbnRyb2wgYnkgVVNJTSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJ1bkF0Y21kRmc6MTsgIC8qIFNlcnZpY2UgbqHjMzI6IFJVTiBBVCBDT01NQU5EIGNvbW1hbmQgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxOyAgICAgICAgICAgICAgICAgLyogU2VydmljZSBuoeMzMzogc2hhbGwgYmUgc2V0IHRvICcxJyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVzdEZnOjE7ICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zM0OiBFbmFibGVkIFNlcnZpY2VzIFRhYmxlICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWNsRmc6MTsgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjMzU6IEFQTiBDb250cm9sIExpc3QgKEFDTCkgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEY2tGZzoxOyAgICAgICAgICAgLyogU2VydmljZSBuoeMzNjogRGVwZXJzb25hbGlzYXRpb24gQ29udHJvbCBLZXlzICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29vcE5ldExpc3RGZzoxOyAgIC8qIFNlcnZpY2UgbqHjMzc6IENvLW9wZXJhdGl2ZSBOZXR3b3JrIExpc3QgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHc21TZWNGZzoxOyAgICAgICAgLyogU2VydmljZSBuoeMzODogR1NNIHNlY3VyaXR5IGNvbnRleHQgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3BiY2NoSW5mb0ZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjMzk6IENQQkNDSCBJbmZvcm1hdGlvbiAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzRmc6MTsgICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zQwOiBJbnZlc3RpZ2F0aW9uIFNjYW4gKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZXhlRmc6MTsgICAgICAgICAgLyogU2VydmljZSBuoeM0MTogTUV4RSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk9QbG1uRmc6MTsgICAgICAgICAvKiBTZXJ2aWNlIG6h4zQyOiBPcGVyYXRvciBjb250cm9sbGVkIFBMTU4gc2VsZWN0b3Igd2l0aCBBY2Nlc3MgVGVjaG5vbG9neSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhQbG1uRmc6MTsgICAgICAgICAvKiBTZXJ2aWNlIG6h4zQzOiBIUExNTiBzZWxlY3RvciB3aXRoIEFjY2VzcyBUZWNobm9sb2d5ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0ZW5zaW9uNToxOyAgICAgIC8qIFNlcnZpY2UgbqHjNDQ6IEV4dGVuc2lvbiA1ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGxtbk5ldE5hbWVGZzoxOyAgIC8qIFNlcnZpY2UgbqHjNDU6IFBMTU4gTmV0d29yayBOYW1lICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT1BsbW5MaXN0Rmc6MTsgICAgIC8qIFNlcnZpY2UgbqHjNDY6IE9wZXJhdG9yIFBMTU4gTGlzdCAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1kbkZnOjE7ICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zQ3OiBNYWlsYm94IERpYWxsaW5nIE51bWJlcnMgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXdpU3RhRmc6MTsgICAgICAgIC8qIFNlcnZpY2UgbqHjNDg6IE1lc3NhZ2UgV2FpdGluZyBJbmRpY2F0aW9uIFN0YXR1cyAqLw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNmaVN0YUZnOjE7ICAgICAgICAvKiBTZXJ2aWNlIG6h4zQ5OiBDYWxsIEZvcndhcmRpbmcgSW5kaWNhdGlvbiBTdGF0dXMgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxOyAgICAgICAgICAgICAgICAgLyogU2VydmljZSBuoeM1MDogUmVzZXJ2ZWQgYW5kIHNoYWxsIGJlIGlnbm9yZWQgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcGRJbmZvRmc6MTsgICAgICAgLyogU2VydmljZSBuoeM1MTogU2VydmljZSBQcm92aWRlciBEaXNwbGF5IEluZm9ybWF0aW9uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW1zRmc6MTsgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjNTIgIE11bHRpbWVkaWEgTWVzc2FnaW5nIFNlcnZpY2UgKE1NUykgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHRlbnNpb244OjE7ICAgICAgLyogU2VydmljZSBuoeM1MyAgRXh0ZW5zaW9uIDggKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDY09uR3Byc1VzaW1GZzoxOyAgLyogU2VydmljZSBuoeM1NCAgQ2FsbCBjb250cm9sIG9uIEdQUlMgYnkgVVNJTSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1tc1VjcEZnOjE7ICAgICAgICAvKiBTZXJ2aWNlIG6h4zU1ICBNTVMgVXNlciBDb25uZWN0aXZpdHkgUGFyYW1ldGVycyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5pYUZnOjE7ICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zU2ICBOZXR3b3JrJ3MgaW5kaWNhdGlvbiBvZiBhbGVydGluZyBpbiB0aGUgTVMgKE5JQSkgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWZ2NzRmc6MTsgICAgICAgICAgLyogU2VydmljZSBuoeM1NyAgVkdDUyBHcm91cCBJZGVudGlmaWVyIExpc3QgKEVGVkdDUyBhbmQgRUZWR0NTUykgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWYnNGZzoxOyAgICAgICAgICAgLyogU2VydmljZSBuoeM1OCAgVkJTIEdyb3VwIElkZW50aWZpZXIgTGlzdCAoRUZWQlMgYW5kIEVGVkJTUykgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQc2V1ZG9ueW1GZzoxOyAgICAgLyogU2VydmljZSBuoeM1OSAgUHNldWRvbnltICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVVBsbW5Gb3JJV2xhbkZnOjE7IC8qIFNlcnZpY2UgbqHjNjAgICAgVXNlciBDb250cm9sbGVkIFBMTU4gc2VsZWN0b3IgZm9yIEktV0xBTiBhY2Nlc3MgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPUGxtbkZvcklXbGFuRmc6MTsgLyogU2VydmljZSBuoeM2MSAgICBPcGVyYXRvciBDb250cm9sbGVkIFBMTU4gc2VsZWN0b3IgZm9yIEktV0xBTiBhY2Nlc3MgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVV3NpZExpc3RGZzoxOyAgICAgLyogU2VydmljZSBuoeM2MiAgICBVc2VyIGNvbnRyb2xsZWQgV1NJRCBsaXN0ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT1dzaWRMaXN0Rmc6MTsgICAgIC8qIFNlcnZpY2UgbqHjNjMgICAgT3BlcmF0b3IgY29udHJvbGxlZCBXU0lEIGxpc3QgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWZ2NzU2VjdXJpdHlGZzoxOyAgLyogU2VydmljZSBuoeM2NCAgICBWR0NTIHNlY3VyaXR5ICovDQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZic1NlY3VyaXR5Rmc6MTsgICAvKiBTZXJ2aWNlIG6h4zY1ICAgIFZCUyBzZWN1cml0eSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYldsYW5SZUF1dGhJZEZnOjE7ICAvKiBTZXJ2aWNlIG6h4zY2ICAgIFdMQU4gUmVhdXRoZW50aWNhdGlvbiBJZGVudGl0eSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk11bHRpTWVkaWFNc2dTdG9GZzoxOyAgLyogU2VydmljZSBuoeM2NyAgICBNdWx0aW1lZGlhIE1lc3NhZ2VzIFN0b3JhZ2UgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHYmFGZzoxOyAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjNjggICAgR2VuZXJpYyBCb290c3RyYXBwaW5nIEFyY2hpdGVjdHVyZSAoR0JBKSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1ibXNTZWN1cml0eUZnOjE7ICAgICAgLyogU2VydmljZSBuoeM2OSAgICBNQk1TIHNlY3VyaXR5ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGF0YURsVmlhVXNzZEFuZFVzc2RBcHBGZzoxOyAgLyogU2VydmljZSBuoeM3MCBEYXRhIGRvd25sb2FkIHZpYSBVU1NEIGFuZCBVU1NEIGFwcGxpY2F0aW9uIG1vZGUgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFSHBsbW5GZzoxOyAgICAgICAgICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zcxIEVxdWl2YWxlbnQgSFBMTU4gKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZFRlcm1Qcm9mQWZ0ZXJVaWNjQWN0Rmc6MTsgICAvKiBTZXJ2aWNlIG6h4zcyIEFkZGl0aW9uYWwgVEVSTUlOQUwgUFJPRklMRSBhZnRlciBVSUNDIGFjdGl2YXRpb24gKi8NCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRUhwbG1uUHJlc2VudEluZEZnOjE7ICAgICAgICAgLyogU2VydmljZSBuoeM3MyBFcXVpdmFsZW50IEhQTE1OIFByZXNlbnRhdGlvbiBJbmRpY2F0aW9uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGFzdFJwbG1uU2VsSW5kRmc6MTsgICAgICAgICAgLyogU2VydmljZSBuoeM3NCBMYXN0IFJQTE1OIFNlbGVjdGlvbiBJbmRpY2F0aW9uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT21hQmNhc3RTbWFydENhcmRQcm9mRmc6MTsgICAgLyogU2VydmljZSBuoeM3NSBPTUEgQkNBU1QgU21hcnQgQ2FyZCBQcm9maWxlICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR2JhQmFzZWRMb2NhbEtleUZnOjE7ICAgICAgICAgLyogU2VydmljZSBuoeM3NiBHQkEtYmFzZWQgTG9jYWwgS2V5IEVzdGFibGlzaG1lbnQgTWVjaGFuaXNtICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGVybUFwcEZnOjE7ICAgICAgICAgICAgICAgICAgLyogU2VydmljZSBuoeM3NyBUZXJtaW5hbCBBcHBsaWNhdGlvbnMgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcG5JY29uRmc6MTsgICAgICAgICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zc4IFNlcnZpY2UgUHJvdmlkZXIgTmFtZSBJY29uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGxtbk5hbWVJY29uRmc6MTsgICAgICAgICAgICAgLyogU2VydmljZSBuoeM3OSBQTE1OIE5ldHdvcmsgTmFtZSBJY29uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFyYUZvclVzaW1JcENvbm5lY0ZnOjE7ICAgICAgLyogU2VydmljZSBuoeM4MCBDb25uZWN0aXZpdHkgUGFyYW1ldGVycyBmb3IgVVNJTSBJUCBjb25uZWN0aW9ucyAqLw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIb21lSVdsYW5TcGVjSWRMaXN0Rmc6MTsgICAgICAvKiBTZXJ2aWNlIG6h4zgxIEhvbWUgSS1XTEFOIFNwZWNpZmljIElkZW50aWZpZXIgTGlzdCAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklXbGFuRUhwbG1uUHJlc2VudEluZEZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjODIgSS1XTEFOIEVxdWl2YWxlbnQgSFBMTU4gUHJlc2VudGF0aW9uIEluZGljYXRpb24gKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJV2xhbkhwbG1uUHJpb3JpdHlJbmRGZzoxOyAgICAvKiBTZXJ2aWNlIG6h4zgzIEktV0xBTiBIUExNTiBQcmlvcml0eSBJbmRpY2F0aW9uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSVdsYW5MYXN0UnBsbW5GZzoxOyAgICAgICAgICAgLyogU2VydmljZSBuoeM4NCBJLVdMQU4gTGFzdCBSZWdpc3RlcmVkIFBMTU4gKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFbW1JbmZvRmc6MTsgICAgICAgICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zg1IEVQUyBNb2JpbGl0eSBNYW5hZ2VtZW50IEluZm9ybWF0aW9uICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxsb3dlZENzZ0xpc3RBbmRJbmRGZzoxOyAgICAgLyogU2VydmljZSBuoeM4NiBBbGxvd2VkIENTRyBMaXN0cyBhbmQgY29ycmVzcG9uZGluZyBpbmRpY2F0aW9ucyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxDdHJsT25FUGRuQ29ubmVjdEZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjODcgQ2FsbCBjb250cm9sIG9uIEVQUyBQRE4gY29ubmVjdGlvbiBieSBVU0lNICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSHBsbW5EaXJlY3RBY2Nlc3NGZzoxOyAgICAgICAgLyogU2VydmljZSBuoeM4OCBIUExNTiBEaXJlY3QgQWNjZXNzICovDQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVDYWxsRGF0YUZnOjE7ICAgICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjODkgZUNhbGwgRGF0YSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk9wZXJhdG9yQ3NnTGlzdEFuZEluZEZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjOTAgT3BlcmF0b3IgQ1NHIExpc3RzIGFuZCBjb3JyZXNwb25kaW5nIGluZGljYXRpb25zICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3VwcFNtT3ZlcklwRmc6MTsgICAgICAgICAgICAgLyogU2VydmljZSBuoeM5MSBTdXBwb3J0IGZvciBTTS1vdmVyLUlQICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVyaVN1cEJ5VWljY0ZnOjE7ICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjOTkgVVJJIHN1cHBvcnQgYnkgVUlDQyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFQ2FsbERhdGFPdmVySW1zRmc6MTsgICAgICAgICAvKiBTZXJ2aWNlIG6h4zExMiBlQ2FsbCBEYXRhIG92ZXIgSU1TKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nWzNdOw0KLX1UX3pQU19VSUNDX1VzdCwNCi1UX3pfVUlDQ19Vc3Q7DQotDQotDQotLyo0LjIuOSBFRkFDTSAqLw0KLXR5cGVkZWYgICAgIERXT1JEICAgVF96UFNfVUlDQ19BY20sDQotVF96X1VJQ0NfQWNtOw0KLQ0KLQ0KLQ0KLS8qNC4yLjEwIEVGR0lEMSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJVc2ltR0lEMVtaUFNfVUlDQ19MRU5fR0lEMV07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW47ICAgICAgICAgICAgICAgICAgICAgIC8qMS4uLjI1NSovDQotfVRfelBTX1VJQ0NfR0lEMSwNCi1UX3pfVUlDQ19HSUQxOw0KLQ0KLQ0KLQ0KLS8qNC4yLjExIEVGR0lEMiAgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVXNpbUdJRDJbWlBTX1VJQ0NfTEVOX0dJRDJdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qMS4uLjI1NSovDQotfVRfelBTX1VJQ0NfR0lEMiwNCi1UX3pfVUlDQ19HSUQyOw0KLQ0KLQ0KLS8qNC4yLjEyICBFRlNQTiAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGNSUExNTjoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEY1NQTjoxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2OyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQcm92TmFtZVsxNl07IA0KLX1UX3pQU19VSUNDX1NQTiwNCi1UX3pfVUlDQ19TUE47DQotDQotDQotLyo0LjIuMTMgRUZQVUNUICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDdXJyZW5jeUNvZGVbM107IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlByaWNlUGVyVW5pdFsyXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfVUlDQ19QVUNULA0KLVRfel9VSUNDX1BVQ1Q7DQotDQotDQotDQotLyo0LjIuMTQgRUZDQk1JICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhMZW47ICAgLyrC68H31tBDQk1JuPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07ICAgICAgLyrC68H31tDKtbzK09DQp7XEQ0JNSbj2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3Q0JNZXNzSWRlbltaUFNfVUlDQ19MRU5fQ0JNSV07ICAgICAgIC8qQ0IgTWVzc2FnZSBJZGVudGlmaWVyKi8NCi19VF96UFNfVUlDQ19DQk1JLA0KLVRfel9VSUNDX0NCTUk7DQotDQotDQotLyo0LjIuMTYgIEVGRlBMTU4gKi8NCi0vKg0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4TnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICBUX3pQU19QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0RlBsbW5bWlBTX1VJQ0NfTEVOX0ZQTE1OXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzE7DQotfVRfelBTX1VJQ0NfRlBsbW5MaXN0LA0KLVRfel9VSUNDX0ZQbG1uTGlzdDsqLw0KLQ0KLQ0KLS8qNC4yLjE3ICBFRkxPQ0kgLCC8+1RfelBTX0xvY2kqLw0KLQ0KLS8qNC4yLjE4IEVGQUQgILLOvPtUX3pQU19VaWNjSWRfQWQgKi8NCi0NCi0vKjQuMi4yMCBFRkNCTUlEICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAgICAgICAgIC8qwuvB99bQyrW8ytPQ0Ke49sr9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdDYm1pZFtaUFNfVUlDQ19MRU5fQ0JNSURdOw0KLX1UX3pQU19VSUNDX0NibWlkLA0KLVRfel9VSUNDX0NibWlkOw0KLQ0KLQ0KLS8qNC4yLjIxIEVGZWNjICwgvPtUX3pQU19FY2MgKi8NCi0NCi0NCi0vKjQuMi4yMiAgRUZDQk1JUiAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhMZW47ICAgIC8qwuvB99bQQ0JNSVK49sr9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAvKsLrwffW0Mq1vMrT0NCntcRDQk1JUrj2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkd0NCTUlSW1pQU19VSUNDX0xFTl9DQk1JUl07ICAgICAgICAvKkNCIG1lc3NhZ2UgaWRlbnRpZmllciByYW5nZSovICAgDQotfVRfelBTX1VJQ0NfQ2JtaXIsDQotVF96X1VJQ0NfQ2JtaXI7DQotDQotLyo0LjIuMjMgRUZQU0xPQ0ksILz7VF96UFNfUHNMb2NpKi8NCi0NCi0vKiA0LjIuMjQgRUZGRE4gKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhSWRMZW47ICAgICAgICAgIC8qse3D97Wxx7C/qNans9a1xEFscGhhSWTX7rTzs6S2yCovDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY2RTc2NMZW47DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb25OcGk7DQotICANCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwYkNmZzJJZDsgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQyUmVjSWQ7IA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX0ZETl07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRGlhbE51bVNzY1sxMF07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzNbMl07DQotfVRfelBTX1VJQ0NfRmRuLA0KLVRfel9VSUNDX0ZkbjsNCi0NCi0NCi0vKjQuMi4yNSAgRUZTbXMgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0dXM7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuOyAgLyphYlJlbWFpbmRlciC8x8K8YWJSZW1haW5kZXLW0NPQ0KezpLbIKi8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUmVtYWluZGVyWzE3NV07LyrO3tCnzrvM7tC0MHhGRiovDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzI7DQotfVRfelBTX1VJQ0NfU21zLA0KLVRfel9VSUNDX1NtczsNCi0NCi0NCi0vKjQuMi4yNiBFRk1TSVNETiAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFJZExlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJjZFNzY0xlbjsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbk5waTsNCi0gIA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3BiQ2ZnMklkOyANCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDVSZWNJZDsgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFJZFtaUFNfVUlDQ19MRU5fTVNJU0ROXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEaWFsTnVtU3NjWzEwXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi19VF96UFNfVUlDQ19Nc2lzZG4sDQotVF96X1VJQ0NfTXNpc2RuOw0KLQ0KLS8qNC4yLjI3IEVGU01TUCAsILz7VF96UFNfU21zcCAqLw0KLQ0KLS8qNC4yLjI4IEVGU01TUyAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMYXN0VXNlZFRwbXI7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1jZWY7IA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZnVOdW07IC8qvMfCvFJGVbXE19a92sr9Ki8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96UFNfVUlDQ19TbXNzLA0KLVRfel9VSUNDX1Ntc3M7DQotDQotLyo0LjIuMjkgIEVGU0ROICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhBbHBoYUlkTGVuOyAgICAgICAgICAvKrHtw/e1scewv6jWp7PWtcRBbHBoYUlk1+6087OktsgqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmNkU3NjTGVuOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9uTnBpOw0KLSAgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcGJDZmdJZDsgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQzUmVjSWQ7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFJZFtaUFNfVUlDQ19MRU5fU0ROXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEaWFsTnVtU3NjWzEwXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi19VF96UFNfVUlDQ19TZG4sDQotVF96X1VJQ0NfU2RuOw0KLQ0KLQ0KLS8qNC4yLjMwIEVGRVhUMiAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlY1R5cGU7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnQ7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJFeHREYXRhWzExXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsNCi19VF96UFNfVUlDQ19FeHQyLA0KLVRfel9VSUNDX0V4dDI7DQotDQotDQotLyo0LjIuMzEgRUZFWFQzICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjVHlwZTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudDsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkV4dERhdGFbMTFdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pQU19VSUNDX0V4dDMsDQotVF96X1VJQ0NfRXh0MzsNCi0NCi0NCi0vKjQuMi4zMiAgRUZTbXNyICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlY0lkOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTdGF0dXNSZXBvcnRbMjldOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbM107DQotfVRfelBTX1VJQ0NfU21zciwNCi1UX3pfVUlDQ19TbXNyOw0KLQ0KLQ0KLQ0KLS8qNC4yLjMzIEVGSUNJICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhSWRMZW47ICAgICAgICAgIC8qse3D97Wxx7C/qNans9a1xEFscGhhSWTX7rTzs6S2yCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJjZFNzY0xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbk5waTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwYkNmZzJJZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQ1UmVjSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmNvbUNhbGxTdGF0dXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBiUmVmOyAgICAgICAgICAgICAgICAgICAgICAgLyq157uwsb7Ou9bDo7oNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjCjukdsb2JhbCBQaG9uZSBCb29rDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoxo7pMb2NhbCBQaG9uZSBCb29rDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpGRjrO3tCnzrsqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdSZWNOdW07ICAgICAgICAgICAgICAgICAgICAgIC8qveLC68qxo6y439fWvdrOqr+oxNq157uwsb7Q8sHQusWjrLXN19a92s6qv6jE2rXnu7CxvtbQvMfCvLrFo7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpY2NNbme3osvNuPhBUMqxo6zG5Na1zqrXqru7uvO1xLzNwry6xSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX0lDSV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkluY29tQ2FsbE51bVsxMF07ICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi0gICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSW5jb21DYWxsRGF0ZVRpbWVbN107ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nNDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSW5jb21DYWxsRHVyYVszXTsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nNTsgICAgICAgDQotfVRfelBTX1VJQ0NfSWNpLA0KLVRfel9VSUNDX0ljaTsNCi0NCi0NCi0NCi0vKjQuMi4zNCBFRk9DSSAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhBbHBoYUlkTGVuOyAgICAgICAgICAvKrHtw/e1scewv6jWp7PWtcRBbHBoYUlk1+6087OktsgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY2RTc2NMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb25OcGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcGJDZmcySWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0NVJlY0lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGJSZWY7ICAgICAgICAgICAgICAgICAgICAgICAvKrXnu7Cxvs671sOjug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqMKO6R2xvYmFsIFBob25lIEJvb2sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjGjukxvY2FsIFBob25lIEJvb2sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkZGOs7e0KfOuyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOw0KLSAgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3UmVjTnVtOyAgICAgICAgICAgICAgICAgICAgICAvKr3iwuvKsaOsuN/X1r3azqq/qMTatee7sLG+0PLB0LrFo6y1zdfWvdrOqr+oxNq157uwsb7W0LzHwry6xaO7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaWNjTW5nt6LLzbj4QVDKsaOsxuTWtc6q16q7u7rztcS8zcK8usUqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBbHBoYUlkW1pQU19VSUNDX0xFTl9PQ0ldOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzNbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJPdXRnb2luZ0NhbGxOdW1bMTBdOyAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmc0WzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiT3V0Z29pbmdDYWxsRGF0ZVRpbWVbN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzU7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJPdXRnb2luZ0NhbGxEdXJhdGlvblszXTsgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc2Ow0KLX1UX3pQU19VSUNDX09jaSwNCi1UX3pfVUlDQ19PY2k7DQotDQotDQotLyo0LjIuMzUgRUZJY3QgLCA0LjIuMzYgVF96UFNfVUlDQ19PY3QqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBY2N1bUNhbGxUaW1lclszXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX1VJQ0NfSWN0LCBUX3pQU19VSUNDX09jdCwNCi1UX3pfVUlDQ19JY3QsIFRfel9VSUNDX09jdDsNCi0NCi0vKjQuMi4zNyBFRkVYVDUgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjVHlwZTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRXh0RGF0YVsxMV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzI7DQotfVRfelBTX1VJQ0NfRXh0NSwNCi1UX3pfVUlDQ19FeHQ1Ow0KLQ0KLQ0KLQ0KLS8qNC4yLjM5IEVGRW1scHAsILz7VF96UFNfVWljY0lkX0VtbHBwICovDQotDQotLyo0LjIuNDIgICBFRkhpZGRlbmtleSAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkhpZGRlbktleVs0XTsNCi19VF96UFNfVUlDQ19IaWRkZW5LZXksDQotVF96X1VJQ0NfSGlkZGVuS2V5Ow0KLQ0KLQ0KLS8qNC4yLjQ0IEVGQkROICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhBbHBoYUlkTGVuOyAgICAgICAgICAvKrHtw/e1scewv6jWp7PWtcRBbHBoYUlk1+6087OktsgqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmNkU3NjTGVuOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9uTnBpOw0KLSAgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcGJDZmdJZDsgDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQ0UmVjSWQ7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb21wYXJNZXRob2RQdHI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX0JETl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEaWFsTnVtU3NjWzEwXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmczWzJdOw0KLX1UX3pQU19VSUNDX0JkbiwNCi1UX3pfVUlDQ19CZG47DQotDQotDQotLyo0LjIuNDUgRUZFeHQ0ICAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWNUeXBlOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlY0lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJFeHREYXRhWzExXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pQU19VSUNDX0V4dDQsDQotVF96X1VJQ0NfRXh0NDsNCi0NCi0NCi0vKjQuMi40NiAgIEVGQ21pKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbXBhck1ldGhJZDsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhSWRMZW47ICAgICAgICAgIC8qse3D97Wxx7C/qNans9a1xEFscGhhSWTX7rTzs6S2yCovDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBbHBoYUlkW1pQU19VSUNDX0xFTl9DTUldOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotfVRfelBTX1VJQ0NfQ21pLA0KLVRfel9VSUNDX0NtaTsNCi0NCi0NCi0vKjQuMi40NyAgRUZFU1QgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGZG46MTsNCi0gIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCZG46MTsNCi0gIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY2w6MTsNCi0gIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo1Ow0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTZXJ2aWNlW1pQU19VSUNDX0xFTl9FU1RdOw0KLX1UX3pQU19VSUNDX0VzdCwNCi1UX3pfVUlDQ19Fc3Q7DQotLyozMTEwMyAgNC4yLjcgIEVGSVNUICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGNzY2ZfYWRkckZnOjE7ICAgICAgLyogU2VydmljZSBuoeMxOiBQLUNTQ0YgYWRkcmVzcyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdiYUZnOjE7ICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjMjogIEdlbmVyaWMgQm9vdHN0cmFwcGluZyBBcmNoaXRlY3R1cmUgKEdCQSkqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkh0dHBEaWdzdEZnOjE7ICAgICAgIC8qIFNlcnZpY2UgbqHjMzogIEhUVFAgRGlnZXN0ICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR2JhTGtlbUZnOjE7ICAgICAgICAgLyogU2VydmljZSBuoeM0OiAgR0JBLWJhc2VkIExvY2FsIEtleSBFc3RhYmxpc2htZW50IE1lY2hhbmlzbSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN1cHBvcnRQY3NzZkZnOjE7ICAgIC8qIFNlcnZpY2UgbqHjNTogIFN1cHBvcnQgb2YgUC1DU0NGIGRpc2NvdmVyeSBmb3IgSU1TIExvY2FsIEJyZWFrIE91dCAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNtc0ZnOjE7ICAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjNjogIFNob3J0IE1lc3NhZ2UgU3RvcmFnZSAoU01TKSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNtc3JGZzoxOyAgICAgICAgICAgIC8qIFNlcnZpY2UgbqHjNzogIFNob3J0IE1lc3NhZ2UgU3RhdHVzIFJlcG9ydHMgKFNNU1IpICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU29pcEZnOjE7ICAgICAgICAgICAgLyogU2VydmljZSBuoeM4OlN1cHBvcnQgZm9yIFNNLW92ZXItSVAgaW5jbHVkaW5nIGRhdGEgZG93bmxvYWQgdmlhIFNNUy1QUCAqLw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbUNvbnRsRmc6MTsgICAgICAgIC8qIFNlcnZpY2UgbqHjOTogIENvbW11bmljYXRpb24gQ29udHJvbCBmb3IgSU1TIGJ5IElTSU0gKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVaWNjQWNjSW1zRmc6MTsgICAgICAvKiBTZXJ2aWNlIG6h4zEwOiBTdXBwb3J0IG9mIFVJQ0MgYWNjZXNzIHRvIElNUyAgKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2OyAgICAgICAgICAgICAgICAgICAvKiBTZXJ2aWNlIG6h4zogUkZVICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX1VJQ0NfSXN0LA0KLVRfel9VSUNDX0lzdDsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgYlRhZzsNCi0gIEJZVEUgYkxlbjsNCi0gIEJZVEUgYWJQYWRkaW5nWzJdOw0KLSAgQllURSBhYlZhbFtaX1VJQ0NfTEVOX0FQTl07DQotfVRfelBTX1VJQ0NfQXBuVGx2LA0KLVRfel9VSUNDX0FwblRsdjsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIENIQVIgYWJBcG5bWl9VSUNDX0xFTl9BUE5dOw0KLSAgQllURSBhYlBhZGRpbmdbM107DQotfVRfelBTX1VJQ0NfQXBuLA0KLVRfel9VSUNDX0FwbjsNCi0NCi0vKjQuMi40OCBFRkFjbCAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcG5OdW07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgVF96X1VJQ0NfQXBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdEFwbnNbWl9VSUNDX0xFTl9BQ0xdOyAgICAgICAvKlRhZzonREQnIGxlbmd0aDowKi8NCi19VF96UFNfVUlDQ19BY2wsDQotVF96X1VJQ0NfQWNsOw0KLQ0KLS8qNC4yLjQ5ICBFRkRjayAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTmV0RGVwZXJzb25Da1s0XTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5ldFN1YkRlcGVyc29uQ2tbNF07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTZXJ2RGVwZXJzb25Da1s0XTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkNvcnBvckRlcGVyc29uQ2tbNF07DQotfVRfelBTX1VJQ0NfRGNrLA0KLVRfel9VSUNDX0RjazsNCi0NCi0NCi0NCi0vKjQuMi41MCBFRkNubCAgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDb29wZXJhTmV0TGlzdFs2XTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX1VJQ0NfQ25sUmVjLA0KLVRfel9VSUNDX0NubFJlYzsNCi0NCi0NCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICBUX3pQU19VSUNDX0NubFJlYyAgICAgICAgICAgICAgICAgICAgICAgIGF0Q29PcGVyYU5ldExpc3RbWlBTX1VJQ0NfTEVOX0NOTF07ICAvKjEuLi4yNTUqLw0KLX1UX3pQU19VSUNDX0NubCwNCi1UX3pfVUlDQ19Dbmw7DQotDQotDQotLyo0LjIuNTEgRUZTdGFydEhmbiAgss68+1RfelBTX1VpY2NJZF9TdGFydEhmbiovDQotDQotLyo0LjIuNTIgIEVGVGhyZVNob2xkICCyzrz7VF96UFNfVWljY0lkX1RocmVzaG9sZCovDQotDQotLyo0LjIuNTMgRUZvcGxtbndhY3QgILLOvPtUX3pQU19VaWNjSWRfUGxtbkluZm8gKi8NCi0NCi0vKjQuMi41NCAgIEVGSHBsbW53YWN0ICAgss68+1RfelBTX1VpY2NJZF9QbG1uSW5mbyovDQotDQotLyo0LjIuNTcgIEVGTmV0cGFyICwgvPtUX3pQU19VaWNjSWRfQ2VsbEluZm8gKi8NCi0NCi0vKjQuMi41OCBFRlBubiAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsTmFtZUllaTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsTmFtZUxlbjsgICAgICAgICAgLyozLi4uMjU1Ki8gICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTaG9ydE5hbWVGZzsgICAgICAgICAgICAgICAgICAgLypJRUkgRmxhZyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2hvcnROYW1lSWVpOyAgICANCi0gICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2hvcnROYW1lTGVuOyAgICAgICAgICAgICAgICAgICAgLyozLi4uMjU1Ki8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkZ1bGxOYW1lQ29udFtaUFNfVUlDQ19MRU5fUE5OX0ZVTExdOyAgDQotICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiU2hvcnROYW1lQ29udFtaUFNfVUlDQ19MRU5fUE5OX1NIT1JUXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX1BubiwNCi1UX3pfVUlDQ19Qbm47DQotDQotDQotDQotDQotLyo0LjIuNTkgRUZPcGwgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkxvY2FBcmVhSWRbN107DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUExNTk5ldE5hbWVSZWNJZDsNCi19VF96UFNfVUlDQ19PcGwsDQotVF96X1VJQ0NfT3BsOw0KLQ0KLQ0KLQ0KLS8qNC4yLjYwIEVGTUJETiAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFJZExlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJjZFNzY0xlbjsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbk5waTsNCi0gIA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3BiQ2ZnSWQ7IA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0NlJlY0lkOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX05CRE5dOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLQ0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkRpYWxOdW1Tc2NbMTBdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmczWzJdOw0KLX1UX3pQU19VSUNDX01iZG4sDQotVF96X1VJQ0NfTWJkbjsNCi0NCi0NCi0vKjQuMi42MSBFRkVYVDYgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjVHlwZTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudDsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkV4dERhdGFbMTFdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pQU19VSUNDX0V4dDYsDQotVF96X1VJQ0NfRXh0NjsNCi0NCi0NCi0vKjQuMi42MiAgRUZNQkkgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2ljZW1haWxNYmk7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmF4TWJpOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVNYWlsTWJpOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk90aGVyTWJpOw0KLX1UX3pQU19VSUNDX01iaSwNCi1UX3pfVUlDQ19NYmk7DQotDQotDQotLyo0LjIuNjMgIEVGTVdJUyAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnV2FpdEluZFN0YXR1czsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2ljZW1haWxNc2dXYWl0TnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZheE1zZ1dhaXROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRWxlTWFpbE1zZ1dhaXROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT3RoZXJNc2dXYWl0TnVtOw0KLX1UX3pQU19VSUNDX013aXMsDQotVF96X1VJQ0NfTXdpczsNCi0NCi0NCi0vKjQuMi42NCAgRUZDRklTICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zcE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2Z1SW5kU3RhdHVzOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY2RTc2NMZW47ICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9uTnBpOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcGJDZmcySWQ7ICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0N1JlY0lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkRpYWxsTnVtWzEwXTsgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfVUlDQ19DZmlzLA0KLVRfel9VSUNDX0NmaXM7DQotDQotDQotLyo0LjIuNjUgICBFRkVYVDcgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjVHlwZTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJZGVudDsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkV4dERhdGFbMTFdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pQU19VSUNDX0V4dDcsDQotVF96X1VJQ0NfRXh0NzsNCi0NCi0NCi0NCi0vKjQuMi42NiAgRUZTcGRpICAqLw0KLXR5cGVkZWYgc3RydWN0DQoteyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRQbG1uW1pQU19VSUNDX0xFTl9TUERJXTsgIC8qMS4uLjI1NSovDQotfVRfelBTX1VJQ0NfU3BkaSwNCi1UX3pfVUlDQ19TcGRpOw0KLQ0KLQ0KLS8qNC4yLjY3IEVGTW1zbiAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW1zSW1wbGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1tc05vdGlMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dEZpbGVSZWNOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTW1zU3RhdHVzWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJNbXNOb3RpW1pQU19VSUNDX0xFTl9NTVNOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmczWzJdOw0KLX1UX3pQU19VSUNDX01tc24sDQotVF96X1VJQ0NfTW1zbjsNCi0NCi0NCi0NCi0vKjQuMi42OCAgRUZFeHQ4ICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlY1R5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRXh0RGF0YVtaUFNfVUlDQ19MRU5fRVhUOF07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pQU19VSUNDX0V4dDgsDQotVF96X1VJQ0NfRXh0ODsNCi0NCi0NCi0vKjQuMi42OSAgRUZNTVNJQ1AgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbkJlYXJlckxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVszXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJJbnRlckNuQmVhcmVyW1pQU19VSUNDX0xFTl9NTVNJQ1BfVkFMXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfVUlDQ19JbnRlckNuQmVhcmVyLA0KLVRfel9VSUNDX0ludGVyQ25CZWFyZXI7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW1zSW1wbGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWxheVNlcnZlckxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzaW1JbnRlck51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdhdGV3YXlGZzsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdhdGV3YXlMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUmVsYXlTZXJ2ZXJBZGRyW1pQU19VSUNDX0xFTl9NTVNJQ1BfU0VSVkVSXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0gIA0KLSAgICBUX3pQU19VSUNDX0ludGVyQ25CZWFyZXIgICAgICAgICAgICAgICAgICAgICAgYXRVc2ltSW50ZXJbWlBTX1VJQ0NfTEVOX01NU0lDUF9JTlRFUl07DQotICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJHYXRld2F5SW5mb3JbWlBTX1VJQ0NfTEVOX01NU0lDUF9HQVRFV0FZXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi19VF96UFNfVUlDQ19NbXNpY3BUbHYsDQotVF96X1VJQ0NfTW1zaWNwVGx2Ow0KLQ0KLQ0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgDQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgVF96UFNfVUlDQ19NbXNpY3BUbHYgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE1tc2ljcFRsdk9ialtaUFNfVUlDQ19MRU5fTU1TSUNQXTsgDQotfVRfelBTX1VJQ0NfTW1zaWNwLA0KLVRfel9VSUNDX01tc2ljcDsNCi0NCi0NCi0vKjQuMi43MCAgRUZNTVNVUCAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1tc0ltcGxlbUluZm9yOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5hbWVMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb3JtTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk1OYW1lVmFsW1pQU19VSUNDX0xFTl9NTVNVUF9OQU1FXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSW5mb3JtVmFsW1pQU19VSUNDX0xFTl9NTVNVUF9JTkZPUk1dOw0KLX1UX3pQU19VSUNDX01tc3VwLA0KLVRfel9VSUNDX01tc3VwOw0KLQ0KLQ0KLQ0KLS8qNC4yLjcxIEVGTU1TVUNQICAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pQU19VSUNDX01tc2ljcFRsdiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRsdk9ialtaUFNfVUlDQ19MRU5fTU1TVUNQXTsgDQotfVRfelBTX1VJQ0NfTW1zdWNwLA0KLVRfel9VSUNDX01tc3VjcDsNCi0NCi0NCi0vKjQuMi43MiBFRk5JQSAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxlcnRDYXRlZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb3JUZXh0TGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJJbmZvclRleHRbWlBTX1VJQ0NfTEVOX05JQV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlszXTsNCi19VF96UFNfVUlDQ19OaWEsDQotVF96X1VJQ0NfTmlhOw0KLQ0KLS8qIEdyb3VwSWQsIEJDRMLruPHKvaOsyv3X6TDUqsvYtc00Yml0zqpEaWdpdDGjrLjfNGJpdM6qRGlnaXQyo6zSwLTLwODNxiovDQotdHlwZWRlZiBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfelBTX1VJQ0NfR3JvdXBJZFtaUFNfVUlDQ19MRU5fR1JPVVBJRF0sDQotVF96X1VJQ0NfR3JvdXBJZFtaX1VJQ0NfTEVOX0dST1VQSURdOw0KLQ0KLS8qNC4yLjczICBFRlZHQ1MgICAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8qMS4uLjUwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pQU19VSUNDX0dyb3VwSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFZnY3NbWlBTX1VJQ0NfTEVOX1ZHQ1NdOw0KLX1UX3pQU19VSUNDX1ZnY3MsDQotVF96X1VJQ0NfVmdjczsNCi0NCi0NCi0vKjQuMi43NCBFRlZHQ1NTLCA0LjIuNzYgRUZWQlNTICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRGVBY3RGbGFnc1s3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96UFNfVUlDQ19WZ2NzcywgVF96UFNfVUlDQ19WYnNzLA0KLVRfel9VSUNDX1ZnY3NzLCBUX3pfVUlDQ19WYnNzOw0KLQ0KLS8qNC4yLjc1ICBFRlZCUyAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgICAvKjEuLi41MCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96UFNfVUlDQ19Hcm91cElkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRWYnNbWlBTX1VJQ0NfTEVOX1ZCU107DQotfVRfelBTX1VJQ0NfVmJzLA0KLVRfel9VSUNDX1ZiczsNCi0NCi0vKiA0LjIuOTcgRUZGRE5VUkkgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXJpQWRkckxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFJZExlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlVyaUFkZHJbWlBTX1VJQ0NfTEVOX0ZETlVSSV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBbHBoYUlkW1pQU19VSUNDX0xFTl9GRE5VUkldOw0KLX1UX3pfVUlDQ19GZG5Vcmk7DQotDQotLyogNC4yLjk5IEVGU0ROVVJJICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVyaUFkZHJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhSWRMZW47ICAgICAgICAgIC8qse3D97Wxx7C/qNans9a1xEFscGhhSWTX7rTzs6S2yCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJVcmlBZGRyW1pQU19VSUNDX0xFTl9TRE5VUkldOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFJZFtaUFNfVUlDQ19MRU5fU0ROVVJJXTsNCi19VF96X1VJQ0NfU2RuVXJpOw0KLQ0KLS8qNC40LjEuMSAgIEVGU2FpICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMU0FBY2NJbmQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJMU0FBY2NJbmRUZXh0W1pQU19VSUNDX0xFTl9TQUldOw0KLX1UX3pQU19VSUNDX1NhaSwNCi1UX3pfVUlDQ19TYWk7DQotDQotDQotLyo0LjQuMS4yICBFRlNMTCAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb25maWdQYXJhbTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbklkZW50Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbGxQcmlvcml0eTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTFNBRGVzY1JlY0lkZW50Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMU0FOYW1lTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJMU0FOYW1lW1pQU19VSUNDX0xFTl9TTExdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTFNBRGVzY0ZpbGVJZFsyXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLQ0KLSAgICBUX3pQU19QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQTE1OQ29kZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzM7DQotfVRfelBTX1VJQ0NfU2xsLA0KLVRfel9VSUNDX1NsbDsNCi0NCi0NCi0NCi0vKjQuNC4xLjMgIExTQSBEZXNjcmlwdG9yIGZpbGVzICAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTFNBRGVzY1R5cGVOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWNJZGVudDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHdMU0FEZXNjcmlwdG9yW1pQU19VSUNDX0xFTl9MU0FfREVTQ1JdOw0KLX1UX3pQU19VSUNDX0xTQV9EZXNjciwNCi1UX3pfVUlDQ19MU0FfRGVzY3I7DQotDQotDQotLyo0LjQuMi4xICBFRnBiciAgICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17IA0KLSAgQllURSAgICAgICAgICAgICAgICBiQmFzaWNMZW47IC8qIMLrwfezpLbIICovDQotICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgYWJQYnJWYWx1ZVtaUFNfVUlDQ19QQlJfTUFYX0xFTl07DQotfVRfelBTX1VJQ0NfUGJyQmFzaWMsDQotVF96X1VJQ0NfUGJyQmFzaWM7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17IA0KLSAgQllURSAgICAgICBiUGJyVGFnOyAvKrjDUGJyttTTprXEVHlwZcDg0M2jrMbk1tBaUFNfVUlDQ19QQlJfVFlQRTEoMCkgse3KvlR5cGUxo7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX1VJQ0NfUEJSX1RZUEUyKDEpILHtyr5UeXBlMqO7IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfVUlDQ19QQlJfVFlQRTMoMikgse3KvlR5cGUzIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgICAgICAgDQotICBCWVRFICAgICAgIGJQYnJLZXlpZExpc3ROdW07ICAgICAgICAgICAgLyogYWJLZXlpZExpc3TT0NCnuPbK/SovDQotICBCWVRFICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gIFdPUkQgICAgICAgYXdLZXlpZExpc3RbWlBTX1VJQ0NfUEJSX01BWF9LRVlJRE5VTV07IC8qILjDVHlwZc/CsPy6rLXEzsS8/mtleWlkwdCx7SovDQotfVRfelBTX1VJQ0NfUGJyX1R5cGUsDQotVF96X1VJQ0NfUGJyX1R5cGU7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17IA0KLSAgQllURSAgICAgICAgICAgICAgICBiUGJyVHlwZU51bTsgLyogVF96UFNfVUlDQ19QYnK94bm51tBhdFBiclR5cGVMaXN0uPbK/SAqLw0KLSAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotIFRfelBTX1VJQ0NfUGJyX1R5cGUgIGF0UGJyVHlwZUxpc3RbWlBTX1VJQ0NfUEJSX01BWF9QQlJUWVBFTlVNXTsgLyogUEJS1tBUeXBlIExpc3Qgo6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDDv9K7uPZMSVNU1tCx7cq+uMNMaXN0ttTTprXDzsS8/lR5cGXA4NDNDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0tS8sLD8uqy1xM7EvP5rZXlpZCovDQotfVRfelBTX1VJQ0NfUGJyLA0KLVRfel9VSUNDX1BicjsNCi0NCi0NCi0vKjQuNC4yLjIgICBFRklhcCAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSW5kUmVjTnVtW1pQU19VSUNDX0xFTl9JQVBdOyANCi19VF96UFNfVUlDQ19JYXAsDQotVF96X1VJQ0NfSWFwOw0KLQ0KLQ0KLQ0KLS8qNC40LjIuMyBFRkFkbiAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFJZExlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmNkU3NjTGVuOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb25OcGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcGJDZmcxSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDFSZWNvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX0FETl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkRpYWxsU3NjWzEwXTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX0FkbiwNCi1UX3pfVUlDQ19BZG47DQotDQotDQotLyo0LjQuMi40ICAgRUZFeHQxICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWNUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWRlbnQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRXh0RGF0YVsxMV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsNCi19VF96UFNfVUlDQ19FeHQxLA0KLVRfel9VSUNDX0V4dDE7DQotDQotDQotLyo0LjQuMi41ICAgIEVGUEJDICAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVudHJ5Q3RsSW5mb3I7ICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRkZW5JbmZvcjsgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOyAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfelBTX1VJQ0NfUGJjLA0KLVRfel9VSUNDX1BiYzsNCi0NCi0NCi0vKjQuNC4yLjYgIEVGR1JQICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAgICAgICAgICAgICAgLyoxLi4uMTAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzNdOyAgICAgICAgICAgICAgICAgICAgICAgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiR3JvdXBJZFsxMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07ICAgICAgICAgICAgICAgICAgICAgICANCi19VF96UFNfVUlDQ19HcnAsDQotVF96X1VJQ0NfR3JwOw0KLQ0KLQ0KLQ0KLS8qNC40LjIuNyAgRUZBYXMgICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFMZW47ICAgICAgICAgIC8qse3D97Wxx7C/qNans9a1xEFscGhhVGV4dFN0ctfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsgICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhVGV4dFN0cltaUFNfVUlDQ19MRU5fQUFTXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX0FhcywNCi1UX3pfVUlDQ19BYXM7DQotDQotDQotLyo0LjQuMi44ICBFRkdhcyAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhTGVuOyAgICAgICAgICAvKrHtw/e1scewv6jWp7PWtcRBbHBoYUlk1+6087OktsgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOyAgICAgICAgICAgICAgICAgICAgICAgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFJZFtaUFNfVUlDQ19MRU5fR0FTXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX0dhcywNCi1UX3pfVUlDQ19HYXM7DQotDQotDQotLyo0LjQuMi4xMSAgIEVGQ0NQMSAqLw0KLS8qNC4yLjM4IEVGQ0NQMiAgKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSYWRSZXE6MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZVN0ZDoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcmFuTW9kZToxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcmFuQ2FwYTozOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQxOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNUTToxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcGNoVmVyc0luZDo0Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNwY2hJbmRMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlNwY2hJbmRbMV07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnByZXNlbnRmZzE7ICAgICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ21wcnNzOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0cnU6MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRHVwbE1vZGU6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2ZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5JUlI6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXN0OjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjE7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnByZXNlbnRmZzI7ICAgICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0NDoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSYXRlQWRhcDoyOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTaWduYWxBUDozOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQ1OjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk90aGVySVRDOjI7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk90aGVyQWRhcHQ6MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MzsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGRyTm9IZHI6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXVsdGlGcm06MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZToxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMTEk6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXNzaWdub3JlOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluYk5lZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50ZmczOyAgICAgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXNlckluZm9MYXkxOjQ7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN5bmNBc3luYzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHQ4OjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bVN0b3BCaXQ6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmVnbzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1EYXRhQml0OjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzZXJSYXRlOjQ7DQotDQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDk6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW50ZXJtUmF0ZToyOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOSUNvblRYOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5JQ29uUlg6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFyaXR5OjM7DQotICAgICANCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0MTA6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29ubkVsZW06MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZW1UeXBlOjU7DQotICAgICANCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0MTE6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT3RoZXJtb2RUeXA6MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRml4TmV0U2VycmF0OjU7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDEyOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFjY3B0Q29kZTo0Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhOdW06MzsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0MTM6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVUlNSTozOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXYW50dXNlcnJhdDo0Ow0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY3B0Q2hhbkNvZDozOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBc3lJbmQ6MjsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MzsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHJlc2VudGZnNDsgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVc2VySW5mb0xheTI6NTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MzsNCi19VF96UFNfVUlDQ19DY3AxLFRfelBTX1VJQ0NfQ2NwMiwNCi1UX3pfVUlDQ19DY3AxLFRfel9VSUNDX0NjcDI7DQotDQotDQotLyo0LjQuMi4xMi4xICBFRlVJRCAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGhvbmVCb29rVWlkWzJdOyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfelBTX1VJQ0NfVWlkLA0KLVRfel9VSUNDX1VpZDsNCi0NCi0NCi0vKjQuNC4yLjEyLjIgIEVGUFNDICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUFNDWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96UFNfVUlDQ19Qc2MsDQotVF96X1VJQ0NfUHNjOw0KLQ0KLQ0KLS8qNC40LjIuMTIuMyAgRUZDQyAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGhvbmVCb29rQ0NbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX0NjLA0KLVRfel9VSUNDX0NjOw0KLQ0KLQ0KLS8qNC40LjIuMTIuNCAgIEVGUFVJRCAgKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBob25lQm9va1BVSURbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19VSUNDX1B1aWQsDQotVF96X1VJQ0NfUHVpZDsNCi0NCi0NCi0vKjQuNC4yLjEzICAgRUZFTUFJTCAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZG5GZzsgICAgICAgLyoxo7piQWRuS2V5aWS6zSBiQWRuUmVjSW5keCwwOiBiQWRuS2V5aWS6zSBiQWRuUmVjTnVtzt7QpyAqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkblJlY0lkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovIA0KLSAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0FkbktleWlkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovICAgICAgICAgICAgICAgICAgICAgICANCi0gIA0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEVtYWlsQWRkcmVzc0xlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXERW1haWxBZGRyZXNz1+6087OktsgqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVszXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJFbWFpbEFkZHJlc3NbWlBTX1VJQ0NfTEVOX0VNQUlMXTsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfQXBVaWNjX0VtYWlsLA0KLVRfekFwVWljY19FbWFpbDsNCi0NCi0vKjQuNC4yLjkgICBFRkFuciAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZG5GZzsgICAgICAgLyoxo7piQWRuS2V5aWS6zSBiQWRuUmVjSW5keCwwOiBiQWRuS2V5aWS6zSBiQWRuUmVjTnVtzt7QpyAqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkblJlY0lkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovIA0KLSAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0FkbktleWlkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBbnJJZDsgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY2RTc2NMZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbk5waTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwYkNmZzFJZDsgDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0MVJlY0lkOyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBZG5Tc2NbMTBdOyAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfQXBVaWNjX0FuciwNCi1UX3pBcFVpY2NfQW5yOw0KLQ0KLS8qNC40LjIuMTAgIEVGU25lICAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZG5GZzsgICAgICAgLyoxo7piQWRuS2V5aWS6zSBiQWRuUmVjSW5keCwwOiBiQWRuS2V5aWS6zSBiQWRuUmVjTnVtzt7QpyAqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkblJlY0lkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovIA0KLSAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0FkbktleWlkOyAgICAvKmJBZG5GZyDOqjHKsdPQ0KcgICovICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhBbHBoYUxlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfTEVOX1NORV07DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLX1UX3pQU19BcFVpY2NfU25lLA0KLVRfekFwVWljY19TbmU7DQotDQotDQotLyo0LjQuMy4xICAgRUZLQzsgNC40LjMuMiAgIEVGS2NHUFJTICCyzrz7VF96UFNfVWljY0lkX0dzbVNlY0tleSovDQotDQotLyo0LjQuMy40ICAgRUZDUEJDQ0ggICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFbXB0eUluZDsgICAgLyq4w7zHwrzKx7fxzqq/1aGjMTq/1aOsvLS8x8K8zt7Qp6O7MDq3x7/VKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFuZEluZDsgICAgIC8qMTpQQ1MxOTAwLCAwOkRDUzE4MDC78sbky/sqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdBUkZDTjsgIA0KLX1UX3pQU19VSUNDX0NQQkNDSFJlYywNCi1UX3pfVUlDQ19DUEJDQ0hSZWM7DQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pQU19VSUNDX0NQQkNDSFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0Q1BCQ0NIW1pQU19VSUNDX0xFTl9DUEJDQ0hdOw0KLX1UX3pQU19VSUNDX0NQQkNDSCwNCi1UX3pfVUlDQ19DUEJDQ0g7DQotDQotDQotDQotLyo0LjQuMy41ICBFRkludlNjYW4gKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkludmVzdFNjYW5GbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96UFNfVUlDQ19JbnZTY2FuLA0KLVRfel9VSUNDX0ludlNjYW47DQotDQotDQotLyo0LjQuNC4xICBFRk1FeEUtU1QgKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07ICAgICAgICAgICAgICAgICAvKjEuLi45Ki8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVszXTsNCi0NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJNZXhlc3RTZXJ2W1pQU19VSUNDX0xFTl9NRVhFU1RdOw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBBZGRpbmcyWzNdOw0KLX1UX3pQU19VSUNDX1VTSU1fTUV4RVNULFRfelBTX1VJQ0NfU0lNX01FeEVTVCwNCi1UX3pfVUlDQ19VU0lNX01FeEVTVCxUX3pfVUlDQ19TSU1fTUV4RVNUOw0KLQ0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIEJZVEUgICAgIGJNRXhFRmxhZzsgICAgICAgICAgICAgICAgICAgICAgIC8qM0e94bm5yKExo6wyR73hubnIoTIqLw0KLSAgICBCWVRFICAgICBhYlBhZGRpbmdbM107DQotICAgIHVuaW9uDQotICAgIHsNCi0gICAgICAgIFRfelBTX1VJQ0NfVVNJTV9NRXhFU1QgICB0VXNpbU1FeEVTVDsNCi0gICAgICAgIFRfelBTX1VJQ0NfU0lNX01FeEVTVCAgICB0U2ltTUV4RVNUOw0KLSAgICB9VmFsdWU7DQotfVRfelBTX1VJQ0NfTUV4RVNULA0KLVRfel9VSUNDX01FeEVTVDsNCi0NCi0vKjQuNC40LjEgIEVGU1NUICovDQotdHlwZWRlZiBzdHJ1Y3R7DQotDQotICAgIEJJVFMgICAgICAgIGJDSFZEaXNGdW5GZzoyOw0KLSAgICBCSVRTICAgICAgICBiQURORmc6MjsNCi0gICAgQklUUyAgICAgICAgYkZETkZnOjI7DQotICAgIEJJVFMgICAgICAgIGJTTVNGZzoyOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgYkFvQ0ZnOjI7DQotICAgIEJJVFMgICAgICAgIGJDQ1BGZzoyOw0KLSAgICBCSVRTICAgICAgICBiUExNTlNlbGVjdG9yRmc6MjsNCi0gICAgQklUUyAgICAgICAgOjI7DQotICAgIA0KLSAgICBCSVRTICAgICAgICBiTVNJU0RORmc6MjsNCi0gICAgQklUUyAgICAgICAgYkV4dGVuMUZnOjI7DQotICAgIEJJVFMgICAgICAgIGJFeHRlbjJGZzoyOw0KLSAgICBCSVRTICAgICAgICBiU01TUEZnOjI7DQotDQotICAgIEJJVFMgICAgICAgIGJMTkRGZzoyOw0KLSAgICBCSVRTICAgICAgICBiQ0JNSUZnOjI7DQotICAgIEJJVFMgICAgICAgIGJHSURMZXYxRmc6MjsNCi0gICAgQklUUyAgICAgICAgYkdJRExldjJGZzoyOw0KLQ0KLSAgICBCSVRTICAgICAgICBiU1BORmc6MjsNCi0gICAgQklUUyAgICAgICAgYlNETkZnOjI7DQotICAgIEJJVFMgICAgICAgIGJFeHRlbjNGZzoyOw0KLSAgICBCSVRTICAgICAgICA6MjsNCi0NCi0gICAgQklUUyAgICAgICAgYlZHQ1NHcnBJZExpc3RGZzoyOw0KLSAgICBCSVRTICAgICAgICBiVkJTR3JwSWRMaXN0Rmc6MjsNCi0gICAgQklUUyAgICAgICAgYk11bExldlBQU2VydkZnOjI7DQotICAgIEJJVFMgICAgICAgIGJBQWZvcmVNTFBQRmc6MjsNCi0NCi0gICAgQklUUyAgICAgICAgYlNNU0NCRmc6MjsNCi0gICAgQklUUyAgICAgICAgYlNNU1BQRmc6MjsNCi0gICAgQklUUyAgICAgICAgYk1lbnVTZWxlRmc6MjsNCi0gICAgQklUUyAgICAgICAgYkNhbGxDdHJvbEZnOjI7DQotDQotICAgIEJJVFMgICAgICAgIGJQcm9hY3RpdmVTSU1GZzoyOw0KLSAgICBCSVRTICAgICAgICBiQ0JNSWRSYW5nRmc6MjsNCi0gICAgQklUUyAgICAgICAgYkJETkZnOjI7DQotICAgIEJJVFMgICAgICAgIGJFeHRlbjRGZzoyOw0KLQ0KLSAgICBCSVRTICAgICAgICBiRGVQZXJzb25DbnRybGtleUZnOjI7DQotICAgIEJJVFMgICAgICAgIGJDb05ldFdvcmtMaXN0Rmc6MjsNCi0gICAgQklUUyAgICAgICAgYlNNU1JGZzoyOw0KLSAgICBCSVRTICAgICAgICBiTmV0SW5kaWNGZzoyOw0KLQ0KLSAgICBCSVRTICAgICAgICBiTU9TTUZnOjI7DQotICAgIEJJVFMgICAgICAgIGJHUFJTRmc6MjsNCi0gICAgQklUUyAgICAgICAgYklNR0ZnOjI7DQotICAgIEJJVFMgICAgICAgIGJTb0xTQUZnOjI7DQotDQotICAgIEJJVFMgICAgICAgIGJVU1NERmc6MjsNCi0gICAgQklUUyAgICAgICAgYlJ1bkFURmc6MjsNCi0gICAgQklUUyAgICAgICAgYlVQbG1uQWNjVGVjaEZnOjI7DQotICAgIEJJVFMgICAgICAgIGJPUGxtbkFjY1RlY2hGZzoyOw0KLQ0KLSAgICBCSVRTICAgICAgICBiSFBsbW5BY2NUZWNoRmc6MjsNCi0gICAgQklUUyAgICAgICAgYkNQQkNDSEZnOjI7DQotICAgIEJJVFMgICAgICAgIGJJbnZlc1NjYW5GZzoyOw0KLSAgICBCSVRTICAgICAgICBiRXh0ZW5DQ1BGZzoyOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgYk1FeEVGZzoyOw0KLSAgICBCSVRTICAgICAgICA6MjsNCi0gICAgQklUUyAgICAgICAgYlBMTU5OZXROYW1lRmc6MjsNCi0gICAgQklUUyAgICAgICAgYk9QTE1OTGlzdEZnOjI7DQotDQotICAgIEJJVFMgICAgICAgIGJNRE5GZzoyOw0KLSAgICBCSVRTICAgICAgICBiTVdJU0ZnOjI7DQotICAgIEJJVFMgICAgICAgIGJDRklTRmc6MjsNCi0gICAgQklUUyAgICAgICAgYlNQRElGZzoyOw0KLQ0KLSAgICBCSVRTICAgICAgICBiTU1TRmc6MjsNCi0gICAgQklUUyAgICAgICAgYkV4dGVuOEZnOjI7DQotICAgIEJJVFMgICAgICAgIGJNTVNVQ1BGZzoyOw0KLSAgICBCSVRTICAgICAgICA6MjsNCi0gDQotfVRfelBTX1VJQ0NfU1NULA0KLVRfel9VSUNDX1NTVDsNCi0NCi0NCi0vKjQuNC40LjIgRUZPUlBLICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFyYUluZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZsYWdzOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2VydFR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJLZXlJZExlbjsgICAgICAgICAgICAgICAgICAgICAgLy9NDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydGVJZFsyXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJLZXlDZXJ0T2Zmc2V0WzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYktleUNlcnRMZW5bMl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzNbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5SWRbWlBTX1VJQ0NfTEVOX09SUEtdOyAgICAgICAgICAvL00NCi19VF96UFNfVUlDQ19PUlBLLA0KLVRfel9VSUNDX09SUEs7DQotDQotDQotDQotLyo0LjQuNC4zICBFRkFSUEsgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhcmFJbmQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGbGFnczsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlcnRUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiS2V5SWRMZW47DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydElkWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYktleUNlcnRPZmZzZXRbMl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydExlblsyXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJLZXlJZFtaUFNfVUlDQ19MRU5fQVJQS107ICAgIA0KLX1UX3pQU19VSUNDX0FSUEssDQotVF96X1VJQ0NfQVJQSzsNCi0NCi0NCi0NCi0vKjQuNC40LjQgICBFRlRQUlBLICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFyYUluZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGbGFnczsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDZXJ0VHlwZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJLZXlJZExlbjsgICAgICAgICAgICAgICAgICAgICAgIC8vTQ0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlcnRJZExlbjsgICAgICAgICAgICAgICAgICAgICAgIC8vTQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVszXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydElkWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydE9mZnNldFsyXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzNbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYktldHlDZXJ0TGVuWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nNFsyXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5SWRbWlBTX1VJQ0NfTEVOX1RQUlBLX0lEXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQ2VydElkW1pQU19VSUNDX0xFTl9UUFJQS19DRVJUXTsNCi19VF96UFNfVUlDQ19UUFJQSywNCi1UX3pfVUlDQ19UUFJQSzsNCi0NCi0NCi0NCi0vKjQuNC40LjUgRUZUS0NERiAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiS2V5Q2VydERhdGFbWlBTX1VJQ0NfTEVOX1RLQ0RGXTsNCi19VF96UFNfVUlDQ19US0NERiwNCi1UX3pfVUlDQ19US0NERjsNCi0NCi0NCi0NCi0vKjQuNS40IEVGU1VNRSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbMjBdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSWNvbklkW1pQU19VSUNDX0xFTl9TVU1FX0lDT05dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25JZExlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pQU19VSUNDX1N1bWUsDQotVF96X1VJQ0NfU3VtZTsNCi0NCi0NCi0vKjQuNi4xLjIgSW1hZ2UgSW5zdGFuY2UgRGF0YSBGaWxlcyAgKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkltZ0luc3RbWlBTX1VJQ0NfTEVOX0lNR0lOU1RdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX1VJQ0NfSW1nSW5zdCwNCi1UX3pfVUlDQ19JbWdJbnN0Ow0KLQ0KLQ0KLS8qNC42LjEuMSBFRklNRyAoSW1hZ2UpICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiV2lkdGg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIZWlnaDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvZGVTY2hlbWU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbnN0bmNGaWQ7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3T2Zmc2V0SW50b0luc3RuYzsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbnN0bmNEYXRhTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfSBUX3pQU19VSUNDX0ltZ0RzY3JwLA0KLVRfel9VSUNDX0ltZ0RzY3JwOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgIGJJbWdOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIFRfelBTX1VJQ0NfSW1nRHNjcnAgICAgdEltZ0RzY3JwW1pQU19BcFVpY2NfTUFYX0lNR19EU0NSUF9OVU1dOw0KLX0gVF96UFNfVUlDQ19JbWcsDQotVF96X1VJQ0NfSW1nOw0KLQ0KLQ0KLS8qNC42LjEuMSBFRklNRyAoSW1hZ2UpICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5zdG5jS2V5SWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXaWR0aDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhlaWdoOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvZGVTY2hlbWU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdPZmZzZXRJbnRvSW5zdG5jOw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luc3RuY0RhdGFMZW47DQotfSBUX3pQU19BcFVpY2NfSW1nRHNjcnAsDQotVF96QXBVaWNjX0ltZ0RzY3JwOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICBiSW1nTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgVF96UFNfQXBVaWNjX0ltZ0RzY3JwICB0SW1nRHNjcnBbWlBTX0FwVWljY19NQVhfSU1HX0RTQ1JQX05VTV07DQotfSBUX3pQU19BcFVpY2NfSW1nLA0KLVRfekFwVWljY19JbWc7DQotDQotDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICDX1Lao0uVFRr3hubm2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyo3LTIz1Pa80zJHveG5uSovDQotLyogc2ltX1BoYXNlICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGhhc2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96UFNfVWljY19TaW1QaGFzZSwNCi1UX3pfVUlDQ19TaW1QaGFzZTsNCi0NCi0NCi0NCi0vKiBzaW1fQkNDSCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJCY2NoWzE2XTsNCi19VF96UFNfVWljY19TaW1CY2NoLA0KLVRfel9VSUNDX1NpbUJjY2g7DQotDQotDQotLyogc2ltX0xQICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgICAgICAgICAgICAgICAgICAgICAgLyrT79HUseDC69bWyv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVszXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTGFuZ1ByZWZlcltaUFNfVUlDQ19TSU1fTFBdOyAgICAgIC8qbGFuZ3VhZ2UgQ29kZSovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlszXTsNCi19VF96UFNfVWljY19TaW1McCwNCi1UX3pfVUlDQ19TaW1McDsNCi0NCi0NCi0vKlNpbUNDUCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkJDSUVbMTBdOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX1VJQ0NfU2ltQ0NQLA0KLVRfel9VSUNDX1NpbUNDUDsNCi0NCi0NCi0vKlNpbUVDQ1AgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsgICAgIC8qIGJOdW0gPj0gMTUgIFVudXNlZCBieXRlcyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGZpbGxlZCB3aXRoICdGRicuKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJCQ0lFW1pQU19VSUNDX1NJTV9FQ0NQXTsNCi19VF96UFNfVUlDQ19TaW1FQ0NQLA0KLVRfel9VSUNDX1NpbUVDQ1A7DQotDQotDQotLypTaW1MTkQgKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFscGhhSWRNYXhMZW47ICAgIC8qtbHHsL+oYWxwaGHL+dans9a1xNfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmNkU3NjTGVuOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb25OcGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwYkNmZzFJZDsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV4dDFSZWNvcmQ7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEaWFsbFNzY1sxMF07ICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFscGhhSWRbWlBTX1VJQ0NfU0lNX0xORF07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nM1syXTsNCi19VF96UFNfVUlDQ19TaW1MTkQsDQotVF96X1VJQ0NfU2ltTE5EOw0KLQ0KLS8qVXN0U3N0ICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFIGJGbGFnOyAvKiAwIM6qzt7QpywxzqpVU1QsIDLOqlNTVCovDQotICAgIHVuaW9uDQotICAgIHsNCi0gICAgICAgIFRfelBTX1VJQ0NfVXN0IHRVc3Q7DQotICAgICAgICBUX3pQU19VSUNDX1NTVCB0U3N0Ow0KLSAgICB9IHZhbDsNCi19VF96UFNfVUlDQ19Vc3RTc3QsDQotVF96X1VJQ0NfVXN0U3N0Ow0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT1VU0FUz+C52L3hubk9PT09PT09PT09PT09PT09PSovDQotLyoxMDIyMjEgOC4xICAgICAgICBBZGRyZXNzICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbjozOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOUEk6NDsgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxOdW1MZW47ICAgLyq12Na3usXC67XE19a92sr9o6y3ts6nPj0wo6w8PTQwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDYWxsTnVtW1pQU19BUFVJQ0NfVVNBVF9NQVhfQkNETlVNX0xFTl07DQotfVRfelBTX0FwVWljY19VU0FUX0FkZHIsDQotVF96QXBVaWNjX1VTQVRfQWRkcjsNCi0NCi0NCi0vKjguMiAgICAgICAgQWxwaGEgaWRlbnRpZmllciAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFbWlBTX0FQVUlDQ19VU0FUX01BWF9BTFBIQV9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBbHBoYUxlbjsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9BbHBoYSwNCi1UX3pBcFVpY2NfVVNBVF9BbHBoYTsNCi0NCi0NCi0vKjguMyAgICAgICAgU3ViYWRkcmVzcyAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlN1YkFkZHJbWlBTX0FQVUlDQ19VU0FUX01BWF9TVUJBRFJfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbjsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX0FwVWljY19VU0FUX1N1YkFkZHIsDQotVF96QXBVaWNjX1VTQVRfU3ViQWRkcjsNCi0NCi0NCi0vKjguNCAgICAgICAgQ2FwYWJpbGl0eSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDYXBhW1pQU19BUFVJQ0NfVVNBVF9NQVhfQkNfTEVOXTsNCi0gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3BhTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107ICANCi19VF96UFNfQXBVaWNjX1VTQVRfQ2FwYSwNCi1UX3pBcFVpY2NfVVNBVF9DYXBhOw0KLQ0KLQ0KLS8qOC42ICAgICAgICBDb21tYW5kIGRldGFpbHMgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNtZE51bTsgICAgICAvKsP8we7C66OsyKHWtTAtZmYqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ21kUXVhbDsgICAgIC8qw/zB7s/etqi3+6Os1ri2qLj31ve2r8q9w/zB7s/etqiy2df3o6yyztXVMTIyLjIyMyA4LjYqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX0FwVWljY19VU0FUX0NtZER0bHMsDQotVF96QXBVaWNjX1VTQVRfQ21kRHRsczsNCi0NCi0vKjguNyAgICAgICAgRGV2aWNlIGlkZW50aXRpZXMgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNEdmNJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkREdmNJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9EdmNJZCwNCi1UX3pBcFVpY2NfVVNBVF9EdmNJZDsNCi0NCi0vKjguOCAgICAgICAgRHVyYXRpb24gKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRpbWVVbml0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGltZUZyZXE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96UFNfQXBVaWNjX1VTQVRfRHVyYSwNCi1UX3pBcFVpY2NfVVNBVF9EdXJhOw0KLQ0KLS8qMTAyLjIyMw0KLSAgOC45ICAgICAgSXRlbSANCi0gIDguMjQgICAgIEl0ZW1zIG5leHQgYWN0aW9uIGluZGljYXRvciANCi0gIDguMzIgICAgIEl0ZW0gaWNvbiBpZGVudGlmaWVyIGxpc3QgDQotICA4LjczICAgICBJdGVtIHRleHQgYXR0cmlidXRlIGxpc3QqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1JRDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1OQUk7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXRlbUljb25JRDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0cltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsgDQotICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICB0VHh0U3RyOyANCi19VF96UFNfQXBVaWNjX1VTQVRfSXRlbUluZm8sDQotVF96QXBVaWNjX1VTQVRfSXRlbUluZm87DQotDQotDQotLyo4LjExICAgICBSZXNwb25zZSBsZW5ndGggKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1pbkxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heExlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9Sc3BMZW4sDQotVF96QXBVaWNjX1VTQVRfUnNwTGVuOw0KLQ0KLS8qOC4xMiAgICAgUmVzdWx0ICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWRkUmx0W1pQU19BUFVJQ0NfVVNBVF9NQVhfQURESU5GT19MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29tUmx0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRkUmx0TGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9SZXN1bHQsDQotVF96QXBVaWNjX1VTQVRfUmVzdWx0Ow0KLQ0KLS8qMzExMTEgOC4xNCAgU1Mgc3RyaW5nKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRvbjozOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTlBJOjQ7IA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlNzU3RyW1pQU19BUFVJQ0NfVVNBVF9NQVhfU1NTVFJfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19VU0FUX1NzU3RyLA0KLVRfekFwVWljY19VU0FUX1NzU3RyOw0KLQ0KLS8qMzExMTEgIDguMTUgVGV4dCBzdHJpbmcNCi0gIDEwMjIyMSA4LjIzIERlZmF1bHQgVGV4dCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dFtaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVFNUUl9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZU1vZGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIsVF96UFNfQXBVaWNjX1VTQVRfRGVmVHh0LA0KLVRfekFwVWljY19VU0FUX1R4dFN0cixUX3pBcFVpY2NfVVNBVF9EZWZUeHQ7DQotDQotLyozMTExMSA4LjE3ICBVU1NEIHN0cmluZyovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEY3M7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJVc3NkU3RyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVVNTRFNUUl9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICAgDQotfVRfelBTX0FwVWljY19VU0FUX1Vzc2RTdHIsDQotVF96QXBVaWNjX1VTQVRfVXNzZFN0cjsNCi0NCi0vKjguMTggICAgIEZpbGUgbGlzdCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbGVOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaWROdW0gOyAgIC8qV09SRLXEuPbK/aOsyOczRjAwo6wzRrXEuPbK/by0zqrOxLz+uPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdGaWRbWlBTX0FQVUlDQ19VU0FUX01BWF9GSUxFTFNUX0xFTl07DQotfSBUX3pQU19BcFVpY2NfVVNBVF9GaWxlTGlzdCwNCi1UX3pBcFVpY2NfVVNBVF9GaWxlTGlzdDsNCi0NCi0vKjguMTkgICAgIExvY2F0aW9uIGluZm9ybWF0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTUNDMSAgICAgOjQ7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNQ0MyICAgICA6NDsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1DQzMgICAgIDo0Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTU5DMyAgICAgOjQ7ICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1OQzEgICAgIDo0Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTU5DMiAgICAgOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFQYWRkaW5nOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTGFjWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07ICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9MQUksDQotVF96QXBVaWNjX1VTQVRfTEFJOw0KLQ0KLQ0KLS8qOC4xOSAgICAgTG9jYXRpb24gaW5mb3JtYXRpb24gKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFeHRDZWxsRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQ2VsbElkWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkV4dENlbGxJZFsyXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfTEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgdEN1ckxhaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19IFRfelBTX0FwVWljY19VU0FUX0xvY2F0aW9uLA0KLVRfekFwVWljY19VU0FUX0xvY2F0aW9uOw0KLQ0KLS8qOC4yNSAgICAgRXZlbnQgbGlzdCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkV2dExzdCBbWlBTX0FQVUlDQ19VU0FUX01BWF9FVk5UTFNUX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgDQotfVRfelBTX0FwVWljY19VU0FUX0V2dExzdCwNCi1UX3pBcFVpY2NfVVNBVF9FdnRMc3Q7DQotDQotLyo4LjMxICAgICBJY29uIGlkZW50aWZpZXIgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25XaXRoRGVzYzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25JZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9JY29uLA0KLVRfekFwVWljY19VU0FUX0ljb247DQotDQotLyo4LjMzICAgICBDYXJkIHJlYWRlciBzdGF0dXMgDQotICA4LjU3ICAgICBDYXJkIHJlYWRlciBpZGVudGlmaWVyICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUkNhcmRTdGF0dXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQ2FyZElkTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJSQ2FyZElkW1pQU19BUFVJQ0NfVVNBVF9NQVhfQ1JFQURSSURfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOyAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9SZENhcmRTdGF0dXMsDQotVF96QXBVaWNjX1VTQVRfUmRDYXJkU3RhdHVzOw0KLQ0KLS8qOC4zNCAgICAgQ2FyZCBBVFIqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUkNhcmRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9DQVJEQVRSX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYXJkQXRyTGVuOyAgICANCi19VF96UFNfQXBVaWNjX1VTQVRfQ2FyZEF0ciwNCi1UX3pBcFVpY2NfVVNBVF9DYXJkQXRyOw0KLQ0KLS8qOC4zNSAgICAgQy1BUERVKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2xhOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5zOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUDE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQMjsNCi0gICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxjRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjY7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMYzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEYXRhWzIzNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9DQXBkdSwNCi1UX3pBcFVpY2NfVVNBVF9DQXBkdTsNCi0NCi0NCi0vKjguMzYgICAgIFItQVBEVSovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUkFwZHVbWlBTX0FQVUlDQ19VU0FUX01BWF9SUERVREFUQV9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU1cxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU1cyOyAgICAgICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19VU0FUX1JBcGR1LA0KLVRfekFwVWljY19VU0FUX1JBcGR1Ow0KLQ0KLQ0KLS8qOC4zNyAgICAgVGltZXIgaWRlbnRpZmllciANCi0gIDguMzggICAgIFRpbWVyIHZhbHVlICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsRmc6MTsgIC8q1rXKx7fxtObU2iovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGltZXJJZDsgICAgICAgICAgICAgLyrIoda1MC04LCDO3tCn1rXOqjB4ZmYqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlRpbWVyVmFsWzNdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgDQotfVRfelBTX0FwVWljY19VU0FUX1RpbWVySW5mbywNCi1UX3pBcFVpY2NfVVNBVF9UaW1lckluZm87DQotDQotDQotLyo4LjM5ICAgICBEYXRlLXRpbWUgYW5kIHRpbWUgem9uZSAqLw0KLXR5cGVkZWYgc3RydWN0eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlllYXI7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1vbnRoOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXk7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhvdXI7IA0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1pbnV0ZTsgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2Vjb25kOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUbVpvbmU7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19VU0FUX1RaQW5kVGltZSwNCi1UX3pBcFVpY2NfVVNBVF9UWkFuZFRpbWU7ICANCi0NCi0NCi0vKjguNDEgICAgIEFUIHJlc3BvbnNlICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBdFJzcFtaUFNfQVBVSUNDX1VTQVRfTUFYX0FUUlNQX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdFJzcExlbjsgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9BdFJzcCwNCi1UX3pBcFVpY2NfVVNBVF9BdFJzcDsNCi0NCi0vKjMxMTExICA4LjQ2IFRpbWluZyBBZHZhbmNlKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZVN0YXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUaW1lQWR2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfSBUX3pQU19BcFVpY2NfVVNBVF9UaW1lQWR2LA0KLVRfekFwVWljY19VU0FUX1RpbWVBZHY7DQotDQotDQotDQotLyo4LjUwICAgICBQcm92aXNpb25pbmcgZmlsZSByZWZlcmVuY2UgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaWROdW0gOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3RmlkW1pQU19BUFVJQ0NfVVNBVF9NQVhfRklMRUxTVF9MRU5dOw0KLX0gVF96UFNfQXBVaWNjX1VTQVRfUHJvRmlsZVJlZiwNCi1UX3pBcFVpY2NfVVNBVF9Qcm9GaWxlUmVmOw0KLQ0KLS8qOC41MiAgICAgQmVhcmVyIGRlc2NyaXB0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhcmFtW1pQU19BUFVJQ0NfVVNBVF9NQVhfQkVBUlBSQU1fTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJlYXJUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFyYW1MZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgDQotfVRfelBTX0FwVWljY19VU0FUX0JEZXNjcCwNCi1UX3pBcFVpY2NfVVNBVF9CRGVzY3A7DQotDQotLyo4LjUzICAgICBDaGFubmVsIGRhdGEgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEYXRhW1pQU19BUFVJQ0NfVVNBVF9NQVhfQ0hOTERBVEFfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGFMZW47IA0KLX1UX3pQU19BcFVpY2NfVVNBVF9DaG5sRGF0YSwNCi1UX3pBcFVpY2NfVVNBVF9DaG5sRGF0YTsNCi0NCi0vKjguNTYgICAgIENoYW5uZWwgU3RhdHVzICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaG5sSUQ6MzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvblN0YXRMZW46MjsgLypiQ29ubnQg1bzTw7y4uPZiaXQgzrujrMih1rUxLDIqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbm50OjI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmZvOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX0FwVWljY19VU0FUX0NobmxTdGF0LA0KLVRfekFwVWljY19VU0FUX0NobmxTdGF0Ow0KLQ0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbk51bTozOyAgICAgICAvKk1F1qez1rXEQ0hBTk5FTCC49sr9Ki8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgVF96QXBVaWNjX1VTQVRfQ2hubFN0YXQgICAgICAgICAgICAgYXRDaGFuU3RhdFtaX0FQVUlDQ19VU0FUX0JJUF9DSEFOTkVMX05VTV07DQotfVRfelBTX0FwVWljY19VU0FUX0NobmxTdGF0X1RyLA0KLVRfekFwVWljY19VU0FUX0NobmxTdGF0X1RyOw0KLQ0KLS8qOC41OCAgICAgT3RoZXIgYWRkcmVzcyAgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZGRyVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWRkcltaUFNfQVBVSUNDX1VTQVRfTUFYX09USFJBRERSX0xFTl07ICAgICANCi19IFRfelBTX0FwVWljY19VU0FUX090aHJBZGRyLA0KLVRfekFwVWljY19VU0FUX090aHJBZGRyOw0KLQ0KLS8qOC41OSAgICAgVUlDQy90ZXJtaW5hbCBpbnRlcmZhY2UgdHJhbnNwb3J0IGxldmVsICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdQb3J0TnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhblByb1R5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9JbnRmY1Ruc3B0THYsDQotVF96QXBVaWNjX1VTQVRfSW50ZmNUbnNwdEx2Ow0KLQ0KLQ0KLQ0KLS8qOC42MCAgICAgQUlEICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuIDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFpZFtaUFNfQVBVSUNDX1VTQVRfTUFYX0FJRF9MRU5dIDsNCi19IFRfelBTX0FwVWljY19VU0FUX0FpZCwNCi1UX3pBcFVpY2NfVVNBVF9BaWQ7DQotDQotDQotLyo4LjYyICAgICBEaXNwbGF5IHBhcmFtZXRlcnMgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JIZWlnaHQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JXaWR0aDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjckVmZjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19VU0FUX0Rpc3BseVBhcmFtLA0KLVRfekFwVWljY19VU0FUX0Rpc3BseVBhcmFtOw0KLQ0KLS8qOC42MyAgICAgU2VydmljZSByZWNvcmQgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJlYXJUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3J2SUQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWNMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJSZWNvcmRbWlBTX0FQVUlDQ19VU0FUX01BWF9TUlZSQ1JEX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsgICAgDQotfVRfelBTX0FwVWljY19VU0FUX1NydlJlYywNCi1UX3pBcFVpY2NfVVNBVF9TcnZSZWM7DQotDQotLyo4LjY0ICAgICBEZXZpY2UgZmlsdGVyICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMQlR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaWx0ZXJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRmlsZXJbWlBTX0FQVUlDQ19VU0FUX01BWF9EVkNGTFRSX0xFTl07IA0KLX1UX3pQU19BcFVpY2NfVVNBVF9EdmNGaWx0ZXIsDQotVF96QXBVaWNjX1VTQVRfRHZjRmlsdGVyOw0KLQ0KLS8qOC42NSAgICAgU2VydmljZSBzZWFyY2ggKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJlYXJJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTcnZTcmNoW1pQU19BUFVJQ0NfVVNBVF9NQVhfU1JWU1JDSF9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96UFNfQXBVaWNjX1VTQVRfU3J2U3JjaCwNCi1UX3pBcFVpY2NfVVNBVF9TcnZTcmNoOw0KLQ0KLS8qOC42NiAgICAgQXR0cmlidXRlIGluZm9ybWF0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCZWFyVHlwZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF0ckxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBdHJJbmZvW1pQU19BUFVJQ0NfVVNBVF9NQVhfQVRUUklORl9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96UFNfQXBVaWNjX1VTQVRfQXRySW5mbywNCi1UX3pBcFVpY2NfVVNBVF9BdHJJbmZvOw0KLQ0KLQ0KLS8qOC42NyAgICAgU2VydmljZSBhdmFpbGFiaWxpdHkgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiU3J2TGlzdFtaUFNfQVBVSUNDX1VTQVRfTUFYX1NSVkxTVF9MRU5dOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbjsgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9TcnZBdmFpbCwNCi1UX3pBcFVpY2NfVVNBVF9TcnZBdmFpbDsNCi0NCi0vKjguNjggICAgIFJlbW90ZSBlbnRpdHkgYWRkcmVzcyAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvZGVUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlJtdEFkZHJbWlBTX0FQVUlDQ19VU0FUX01BWF9SRU1BRERSX0xFTl07DQotfSBUX3pQU19BcFVpY2NfVVNBVF9SbXRBZGRyLA0KLVRfekFwVWljY19VU0FUX1JtdEFkZHI7DQotDQotDQotLyo4LjcwICAgICBOZXR3b3JrIGFjY2VzcyBuYW1lICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5ldE5hbWVbWlBTX0FQVUlDQ19VU0FUX01BWF9ORVROQU1FX0xFTl0gOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuIDsgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfSBUX3pQU19BcFVpY2NfVVNBVF9OZXROYW1lLA0KLVRfekFwVWljY19VU0FUX05ldE5hbWU7DQotDQotLyoyNDAwOCAxMC41LjYuNSBRdWFsaXR5IG9mIHNlcnZpY2UgKi8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRseUNsc3M6MzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlbGlhYkNsc3M6MzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjI7DQotICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBlYWtQdXQ6NDsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByZWNDbHNzOjM7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVhblB1dDo1Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MzsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50ZmcxOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcmFmZkNsc3M6MzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlbGl2T3JkOjI7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWxpdkVyclNEVTozOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50ZmcyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4U0RVc2l6OyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnByZXNlbnRmZzM7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4Qml0VXA7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHJlc2VudGZnNDsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhCaXREb3duOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50Zmc1OyAgICAgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNpQkVSOjQ7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTRFVlcnJSYXQ6NDsNCi0gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHJlc2VudGZnNjsgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhbkxheTo2Ow0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhZkhhbmQ6MjsNCi0gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHJlc2VudGZnNzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkd1YXJCaXRVcDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50Zmc4OyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkd1YXJCaXREb3duOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcmVzZW50Zmc5OyAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25JbmQ6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNvdXJEZXNjcjo0OyANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjM7DQotICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnByZXNlbnRmZzEwOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4Qml0RXh0OyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnByZXNlbnRmZzExOyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkd1YXJCaXRFeHQ7ICAgICAgICANCi19VF96UFNfQXBVaWNjX1VTQVRfUW9zLA0KLVRfekFwVWljY19VU0FUX1FvczsNCi0NCi0vKjI0MDA4ICAxMC41LjYuNCBQYWNrZXQgZGF0YSBwcm90b2NvbCBhZGRyZXNzKi8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGRwVHlwZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBkcFR5cGVOdW07ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZHJJbmZvTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWRkckluZm9bWlBTX0FwVWljY19VU0FUX1BkcEFkZHJdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9QZHBBZGRyLA0KLVRfekFwVWljY19VU0FUX1BkcEFkZHI7DQotDQotLyogMjQwMDggMTAuNS42LjEgQWNjZXNzIFBvaW50IE5hbWUqLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXBuVmFsTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQXBuVmFsW1pQU19BcFVpY2NfVVNBVF9BcG5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9BcG4sDQotVF96QXBVaWNjX1VTQVRfQXBuOw0KLQ0KLS8qIDI0MDA4IDEwLjUuNi4zIFByb3RvY29sIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdQcm90b0lkOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm90b0lkQ29udExlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQcm90b0lkQ29udFsxMF07DQotfVRfelBTX0FwVWljY19VU0FUX1Byb3RvSUQsDQotVF96QXBVaWNjX1VTQVRfUHJvdG9JRDsgICAgICAgICAgICAgICAgDQotDQotLyoyNDAwOCAxMC41LjYuMyBQcm90b2NvbCBjb25maWd1cmF0aW9uIG9wdGlvbnMqLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDZmdQcm90bzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm90b0lETGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9Qcm90b0lEICAgICAgICAgICAgICAgICAgICAgICAgYXRQcm90b0lEW1pQU19BcFVpY2NfVVNBVF9Qcm90b0lEXTsNCi19VF96UFNfQXBVaWNjX1VTQVRfUHJvdENmZ09wdCwNCi1UX3pBcFVpY2NfVVNBVF9Qcm90Q2ZnT3B0Ow0KLQ0KLS8qIDMxLjExMSA4LjcyICBQRFAgY29udGV4dCBBY3RpdmF0aW9uIHBhcmFtZXRlcnMgLyAyNDAwOCA5LjUuMSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGQ6NDsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUaTo0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1R5cGU7DQotICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm90Q2ZnRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcG5GZzsNCi0gICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5zYXBpOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxsY1NhcGk7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfUW9zICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRSZXFRb1M7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1BkcEFkZHIgICAgICAgICAgICAgICAgICAgICAgICB0UmVxUGRwQWRkcjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQXBuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBcG47DQotICAgIFRfelBTX0FwVWljY19VU0FUX1Byb3RDZmdPcHQgICAgICAgICAgICAgICAgICAgICB0UHJvdENmZzsNCi19VF96UFNfQXBVaWNjX1VTQVRfUGRwQWN0UGFyYW0sDQotVF96QXBVaWNjX1VTQVRfUGRwQWN0UGFyYW07DQotDQotLyo4LjMwICAgICBDYWxsIGNvbnRyb2wgcmVxdWVzdGVkIGFjdGlvbiAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY1JlcEZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJjUmVwdHI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVW5pb247Lyqx7cq+dWlvbrXE09DQp8/uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDogQWRkcmVzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE6IHNzIHN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI6IHVzc2Qgc3RyaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzogcGRwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjogdWlvbs7e0KcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIHVuaW9uIHsNCi0gICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgIHRBZHI7DQotICAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfU3NTdHIgICAgICAgICAgICAgICAgICAgICB0U3NTdHI7DQotICAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfVXNzZFN0ciAgICAgICAgICAgICAgICAgICB0VXNzZDsNCi0gICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9QZHBBY3RQYXJhbSAgICAgICAgICAgICAgIHRQZHA7DQotICAgIH11U3RydWN0Ow0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ2FwYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDYXBhMSA7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0NhcGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2FwYTIgOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9TdWJBZGRyICAgICAgICAgICAgICAgICAgICAgICAgdFN1YkFkcjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbHBoYSA7DQotfVRfelBTX0FwVWljY19VU0FUX0NhbGxDdHJsQWN0LA0KLVRfekFwVWljY19VU0FUX0NhbGxDdHJsQWN0Ow0KLQ0KLS8qNi44LjcgICAgICBMb2NhbCBpbmZvcm1hdGlvbiAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb1R5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTm1yTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSW1laVtaUFNfQVBVSUNDX1VTQVRfTUFYX0lNRUlfTEVOXTsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk1lc1JsdFtaUFNfQVBVSUNDX1VTQVRfTUFYX01OUlJMVF9MRU5dOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY2NoTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJCY2NoTGlzdFtaUFNfQVBVSUNDX1VTQVRfTUFYX0JDQ0hMU1RfTEVOXTsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkxhbmdbMl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWN0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVGltZUFkdiAgICAgICAgICAgICAgICAgICAgICAgIHRUaW1lQWR2Ow0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UWkFuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgdEN1clRpbWU7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0xvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICB0TG9jYXRpb247DQotfVRfelBTX0FwVWljY19VU0FUX0xvY0luZm8sDQotVF96QXBVaWNjX1VTQVRfTG9jSW5mbzsNCi0NCi0vKjYuOCBURVJNSU5BTCBSRVNQT05TRSAvIFNFVCBVUCBDQUxMKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWN0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSbHRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ2FsbEN0cmxBY3QgICAgICAgICAgICAgICAgICAgIHRDYWxsQ3RybEFjdCA7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICB0Umx0MjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVHh0U3RyICAgICAgICAgICAgICAgICAgICAgICAgIHRUZXh0MiA7DQotfVRfelBTX0FwVWljY19VU0FUX0NhbGxDdHJsX1RyLA0KLVRfekFwVWljY19VU0FUX0NhbGxDdHJsX1RyOw0KLQ0KLS8qNi44IFRFUk1JTkFMIFJFU1BPTlNFIC8gR0VUIElOS0VZKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEdXJhRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgdFRleHQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R1cmEgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGlzcER1cmE7DQotfVRfelBTX0FwVWljY19VU0FUX0lua2V5X1RyLA0KLVRfekFwVWljY19VU0FUX0lua2V5X1RyOw0KLQ0KLS8qNi44IFRFUk1JTkFMIFJFU1BPTlNFIC8gUkVDRUlWRSBEQVRBIG9yIFNFTkQgREFUQSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGF0YUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXRhTGVudGg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIFRfelBTX0FwVWljY19VU0FUX0NobmxEYXRhICAgICAgICAgICAgICAgICAgICAgICB0Q2hubERhdGE7DQotfVRfelBTX0FwVWljY19VU0FUX0NoZGF0YV9UciwNCi1UX3pBcFVpY2NfVVNBVF9DaGRhdGFfVHI7DQotDQotLyo2LjggVEVSTUlOQUwgUkVTUE9OU0UgLyBPUEVOIENIQU5ORUwqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2l6ZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc2NGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3QnVmU2l6ZSA7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0JEZXNjcCAgICAgICAgICAgICAgICAgICAgICAgICAgdEJEZXNjOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9PdGhyQWRkciAgICAgICAgICAgICAgICAgICAgICAgIHRPdGhyQWRyOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DaG5sU3RhdCAgICAgICAgICAgICAgICAgICAgICAgIHRDaG5sU3RhdDsNCi19VF96UFNfQXBVaWNjX1VTQVRfT3BjaGxfVHIsDQotVF96QXBVaWNjX1VTQVRfT3BjaGxfVHI7DQotDQotLyo2LjggVEVSTUlOQUwgUkVTUE9OU0UgLyBTRU5EIFVTU0QqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWN0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmx0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0MkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ2FsbEN0cmxBY3QgICAgICAgICAgICAgICAgICAgICB0Q2FsbEN0cmxBY3QgOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9SZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgIHRSbHQyOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgIHRUZXh0Ow0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgIHRUZXh0MiA7DQotfVRfelBTX0FwVWljY19VU0FUX1Vzc2RjdHJfVHIsDQotVF96QXBVaWNjX1VTQVRfVXNzZGN0cl9UcjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qINLUz8LKx8P8we694bm5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKjYuNi4xICAgICAgRElTUExBWSBURVhUICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRHVyYUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltdFJzcEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgIHRUeHRTdHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0ljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljb247DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R1cmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdER1cmE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUeHRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07ICANCi19VF96UFNfQXBVaWNjX1VTQVRfRGlzUGxheVR4dENtZCwNCi1UX3pBcFVpY2NfVVNBVF9EaXNQbGF5VHh0Q21kOw0KLQ0KLQ0KLS8qNi42LjIgICAgICBHRVQgSU5LRVkgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEdXJhRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfelBTX0FwVWljY19VU0FUX0NtZER0bHMgICAgICAgICAgICAgICAgICAgICAgICAgdENtZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVHh0U3RyICAgICAgICAgICAgICAgICAgICAgICAgICB0VHh0U3RyOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0ljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljb247DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R1cmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdER1cmE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUeHRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07DQotfVRfelBTX0FwVWljY19VU0FUX0dldElua2V5Q21kLA0KLVRfekFwVWljY19VU0FUX0dldElua2V5Q21kOw0KLQ0KLQ0KLS8qNi42LjMgICAgICBHRVQgSU5QVVQgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWZUeHRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo1Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgIHRUeHRTdHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1JzcExlbiAgICAgICAgICAgICAgICAgICAgICAgICAgdFJzcExlbjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRGVmVHh0ICAgICAgICAgICAgICAgICAgICAgICAgICB0RGVmVHh0Ow0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLSAgICAgICAgICAgICAgICAgICAgICANCi19VF96UFNfQXBVaWNjX1VTQVRfR2V0SW5wdXRDbWQsDQotVF96QXBVaWNjX1VTQVRfR2V0SW5wdXRDbWQ7DQotDQotLyo2LjYuNCAgICAgIE1PUkUgVElNRSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOyANCi19VF96UFNfQXBVaWNjX1VTQVRfTVRpbWVDbWQsDQotVF96QXBVaWNjX1VTQVRfTVRpbWVDbWQ7DQotDQotLyo2LjYuNSAgICAgIFBMQVkgVE9ORSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9uZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkR1cmFGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NDsNCi0gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb25lOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOyAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHZjSWQgICAgICAgICAgICAgICAgICAgICAgICAgICB0RGV2SWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdXJhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9QbGF5VG9uZUNtZCwNCi1UX3pBcFVpY2NfVVNBVF9QbGF5VG9uZUNtZDsNCi0NCi0NCi0vKjYuNi42ICAgICAgUE9MTCBJTlRFUlZBTCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdXJhOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9Qb2xsQ21kLA0KLVRfekFwVWljY19VU0FUX1BvbGxDbWQ7DQotDQotLyo2LjYuNyAgICAgIFNFVC1VUCBNRU5VICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJdGVtTnVtOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjY7DQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1Mc3RRdWYgOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb05BSUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZm9JY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb1R4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0cltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsgDQotDQotICAgIFRfelBTX0FwVWljY19VU0FUX0NtZER0bHMgICAgICAgICAgICAgICAgICAgICAgICAgdENtZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWxwaGE7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0ljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljb247IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JdGVtSW5mbyAgICAgICAgICAgICAgICAgICAgICAgIGF0SXRtSW5mb1taUFNfQVBVSUNDX1VTQVRfTUFYX0lURU1fTlVNXSA7DQotfVRfelBTX0FwVWljY19VU0FUX1NldFVwTWVudUNtZCwNCi1UX3pBcFVpY2NfVVNBVF9TZXRVcE1lbnVDbWQ7DQotDQotDQotLyo2LjYuOCAgICAgIFNFTEVDVCBJVEVNICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJdGVtTnVtOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXRlbUlkRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXRlbUlkOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXRlbUxzdFF1ZiA7DQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmZvTkFJRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5mb0ljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmZvVHh0QXRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUeHRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWNvbjsgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JdGVtSW5mbyAgICAgICAgICAgICAgICAgICAgICAgIGF0SXRtSW5mb1taUFNfQVBVSUNDX1VTQVRfTUFYX0lURU1fTlVNXSA7DQotDQotfVRfelBTX0FwVWljY19VU0FUX1NlbGVjdEl0ZW1DbWQsDQotVF96QXBVaWNjX1VTQVRfU2VsZWN0SXRlbUNtZDsNCi0NCi0NCi0vKjYuNi45ICAgICAgU0VORCBTSE9SVCBNRVNTQUdFICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsNCi0gICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUUGR1TGVuZ3RoOyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOyAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUUGR1QnVmZmVyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFBEVV9MRU5dOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0cltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsgDQotICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhSWQ7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBZHI7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOyANCi0gICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9TbmRTbXNDbWQsDQotVF96QXBVaWNjX1VTQVRfU25kU21zQ21kOw0KLQ0KLQ0KLS8qMzExMTEgNi42LjEwICBTRU5EIFNTKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOyAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfU3NTdHIgICAgICAgICAgICAgICAgICAgICAgICAgICB0U3M7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOyANCi0gICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19VU0FUX1NuZFNzQ21kLA0KLVRfekFwVWljY19VU0FUX1NuZFNzQ21kOw0KLQ0KLQ0KLS8qMzExMSA2LjYuMTEgU0VORCBVU1NEKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOyAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9Vc3NkU3RyICAgICAgICAgICAgICAgICAgICAgICAgIHRVc3NkOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbHBoYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWNvbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0cltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsNCi0gICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19VU0FUX1NuZFVzc2RDbWQsDQotVF96QXBVaWNjX1VTQVRfU25kVXNzZENtZDsNCi0NCi0NCi0vKjYuNi4xMiAgICBTRVQgVVAgQ0FMTCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uQ25mRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRHVyYUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25TdHVwRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyQ25mRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyU3R1cEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbHBoYUNuZjsgLyqzpLbIv8nX986qtObU2rHqvMcqLw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBZHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1N1YkFkZHIgICAgICAgICAgICAgICAgICAgICAgICAgdFN1YkFkcjsgIC8qs6S2yL/J1/fOqrTm1Nqx6rzHKi8NCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ2FwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2FwYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RHVyYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWNvbkNuZjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWxwaGFTdHVwOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uU3R1cDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0ckNuZltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0clN0dXBbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07DQotfVRfelBTX0FwVWljY19VU0FUX1NldHVwQ2FsbENtZCwNCi1UX3pBcFVpY2NfVVNBVF9TZXR1cENhbGxDbWQ7DQotDQotLyo2LjYuMTMgICAgUkVGUkVTSCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0ZpbGVMaXN0ICAgICAgICAgICAgICAgICAgICAgICAgdEZpbGVMaXN0Ow0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBaWQ7DQotfVRfelBTX0FwVWljY19VU0FUX1JlZnJlc2hDbWQsDQotVF96QXBVaWNjX1VTQVRfUmVmcmVzaENtZDsNCi0NCi0vKjYuNi4xNCAgICBQT0xMIE9GRiAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7ICAgIA0KLX0gVF96UFNfQXBVaWNjX1VTQVRfUG9sbE9mZkNtZCwNCi1UX3pBcFVpY2NfVVNBVF9Qb2xsT2ZmQ21kOw0KLQ0KLS8qNi42LjE1ICAgIFBST1ZJREUgTE9DQUwgSU5GT1JNQVRJT04gKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgQllURSBiTWVhc3VyZVF1YWxGZzsNCi0gICAgQllURSBiTWVhc3VyZVJwdFF1YWw7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0NtZER0bHMgICAgICAgICAgICAgICAgICAgICAgICAgdENtZDsNCi19IFRfelBTX0FwVWljY19VU0FUX0xvY0luZm9DbWQsDQotVF96QXBVaWNjX1VTQVRfTG9jSW5mb0NtZDsNCi0NCi0NCi0NCi0vKjYuNi4xNiAgICBTRVQgVVAgRVZFTlQgTElTVCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0V2dExzdCAgICAgICAgICAgICAgICAgICAgICAgICAgdEV2dExpc3Q7DQotfVRfelBTX0FwVWljY19VU0FUX1NldFVwRXZ0TGlzdENtZCwNCi1UX3pBcFVpY2NfVVNBVF9TZXRVcEV2dExpc3RDbWQ7DQotDQotLyo2LjYuMTcgICAgUEVSRk9STSBDQVJEIEFQRFUgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdmNJZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdmNJZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ0FwZHUgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q0FwZHU7DQotfVRfelBTX0FwVWljY19VU0FUX1BlcmZvcm1DYXJkQXBkdUNtZCwNCi1UX3pBcFVpY2NfVVNBVF9QZXJmb3JtQ2FyZEFwZHVDbWQ7DQotDQotDQotLyo2LjYuMTggICAgUE9XRVIgT0ZGIENBUkQgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdmNJZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdmNJZDsNCi19VF96UFNfQXBVaWNjX1VTQVRfUHdyT2ZmQ2FyZENtZCwNCi1UX3pBcFVpY2NfVVNBVF9Qd3JPZmZDYXJkQ21kOw0KLQ0KLS8qNi42LjE5ICAgIFBPV0VSIE9OIENBUkQgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdmNJZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdmNJZDsNCi19IFRfelBTX0FwVWljY19VU0FUX1B3ck9uQ2FyZENtZCwNCi1UX3pBcFVpY2NfVVNBVF9Qd3JPbkNhcmRDbWQ7DQotDQotLyo2LjYuMjAgICAgR0VUIFJFQURFUiBTVEFUVVMgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0NCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdmNJZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdmNJZDsNCi19VF96UFNfQXBVaWNjX1VTQVRfR2V0UmVhZGVyU3RhdHVzQ21kLA0KLVRfekFwVWljY19VU0FUX0dldFJlYWRlclN0YXR1c0NtZDsNCi0NCi0vKjYuNi4yMSAgICBUSU1FUiBNQU5BR0VNRU5UICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0NtZER0bHMgICAgICAgICAgICAgICAgICAgICAgICAgdENtZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVGltZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICB0VGltZUluZm87DQotfVRfelBTX0FwVWljY19VU0FUX1RpbXJNbmdDbWQsDQotVF96QXBVaWNjX1VTQVRfVGltck1uZ0NtZDsNCi0NCi0NCi0vKjYuNi4yMiAgICBTRVQgVVAgSURMRSBNT0RFIFRFWFQgKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjY7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9UeHRTdHIgICAgICAgICAgICAgICAgICAgICAgICAgIHRUeHRTdHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0ljb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljb247DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUeHRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07DQotfVRfelBTX0FwVWljY19VU0FUX1NldElkbGVNb2RUeHRDbWQsDQotVF96QXBVaWNjX1VTQVRfU2V0SWRsZU1vZFR4dENtZDsNCi0NCi0NCi0vKjYuNi4yMyAgICBSVU4gQVQgQ09NTUFORCAqLw0KLXR5cGVkZWYgc3RydWN0ICB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF0U3RyTGVuOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjY7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkF0U3RyW1pQU19BUFVJQ0NfVVNBVF9NQVhfQVRTVFJfTEVOXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbHBoYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWNvbjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHZjSWQgICAgICAgICAgICAgICAgICAgICAgICAgICB0RHZjSWQ7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX0gVF96UFNfQXBVaWNjX1VTQVRfUnVuQVRDbWQsDQotVF96QXBVaWNjX1VTQVRfUnVuQVRDbWQ7DQotDQotLyo2LjYuMjUgICAgTEFOR1VBR0UgTk9USUZJQ0FUSU9OICAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZ0ZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTGdbMl07DQotfVRfelBTX0FwVWljY19VU0FUX0xnTm90aWNlQ21kLA0KLVRfekFwVWljY19VU0FUX0xnTm90aWNlQ21kOw0KLQ0KLQ0KLS8qNi42LjI2ICAgIExBVU5DSCBCUk9XU0VSICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCcm93SWRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRTdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJyb3dlcklkOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVXJsW1pQU19BUFVJQ0NfVVNBVF9NQVhfVVJMX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVybExlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQmVhckxzdFtaUFNfQVBVSUNDX1VTQVRfTUFYX0JFQVJMU1RfTEVOXTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJlYXJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbGVOdW07IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsNCi0gICAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX1Byb0ZpbGVSZWYgICAgICAgICAgICAgICAgICAgICAgYXRQcm92RmlsZVtaUFNfQVBVSUNDX1VTQVRfTUFYX1BST0ZJTEVfTEVOXTsgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVHh0U3RyICAgICAgICAgICAgICAgICAgICAgICAgICB0VHh0U3RyOyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWxwaGE7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOyANCi0gICAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0NtZER0bHMgICAgICAgICAgICAgICAgICAgICAgICAgdENtZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHZjSWQgICAgICAgICAgICAgICAgICAgICAgICAgICB0RHZjSWQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19VU0FUX0xhdW5jaEJyb3dzZXJDbWQsDQotVF96QXBVaWNjX1VTQVRfTGF1bmNoQnJvd3NlckNtZDsNCi0NCi0vKjYuNi4yNyAgICBPUEVOIENIQU5ORUwgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkR1cmExRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRHVyYTJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPQWRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9nRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHN3ZEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRyTHZGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXRhQWRyRmc6MTsNCi0gIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZHJGZzoxOyAgICAgICAgIC8vY3MgdHlwZSDH6b/2z8K05tTaDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlbUFkckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlR4dEF0ckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdCdWZTaXplIDsNCi0gICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUeHRBdHJbWlBTX0FQVUlDQ19VU0FUX01BWF9UWFRBVFRSX0xFTl07DQotICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBZHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1N1YkFkZHIgICAgICAgICAgICAgICAgICAgICAgICAgdFN1YkFkcjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RHVyYTE7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R1cmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdER1cmEyOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9CRGVzY3AgICAgICAgICAgICAgICAgICAgICAgICAgIHRCZGVzYzsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSW50ZmNUbnNwdEx2ICAgICAgICAgICAgICAgICAgICB0VHJMdjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfT3RockFkZHIgICAgICAgICAgICAgICAgICAgICAgICB0T2FkcjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfT3RockFkZHIgICAgICAgICAgICAgICAgICAgICAgICB0RGF0YUFkcjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfVHh0U3RyICAgICAgICAgICAgICAgICAgICAgICAgICB0TG9naW47DQotICAgIFRfelBTX0FwVWljY19VU0FUX1R4dFN0ciAgICAgICAgICAgICAgICAgICAgICAgICAgdFBzd2Q7DQotICAgIFRfelBTX0FwVWljY19VU0FUX05ldE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgdE5ldE5hbWU7DQotICAgIFRfelBTX0FwVWljY19VU0FUX1JtdEFkZHIgICAgICAgICAgICAgICAgICAgICAgICAgdFJlbUFkcjsNCi19VF96UFNfQXBVaWNjX1VTQVRfT3BlbkNobmxDbWQsDQotVF96QXBVaWNjX1VTQVRfT3BlbkNobmxDbWQ7DQotDQotLyo2LjYuMjggICAgQ0xPU0UgQ0hBTk5FTCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9EdmNJZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHREdmNJZDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWxwaGE7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9DbG9zZUNobmxDbWQsDQotVF96QXBVaWNjX1VTQVRfQ2xvc2VDaG5sQ21kOw0KLQ0KLS8qNi42LjI5ICAgIFJFQ0VJVkUgREFUQSAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNEZXZJRDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGF0YUxlbjsNCi0gIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgICAgICB0Q21kOyAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9Sc3ZEYXRhQ21kLA0KLVRfekFwVWljY19VU0FUX1JzdkRhdGFDbWQ7DQotDQotLyo2LjYuMzAgICAgU0VORCBEQVRBICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0RldklEOw0KLSAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgICAgICAgICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DaG5sRGF0YSAgICAgICAgICAgICAgICAgICAgICAgIHRDaG5sRGF0YTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlR4dEF0cltaUFNfQVBVSUNDX1VTQVRfTUFYX1RYVEFUVFJfTEVOXTsNCi19VF96UFNfQXBVaWNjX1VTQVRfU25kRGF0YUNtZCwNCi1UX3pBcFVpY2NfVVNBVF9TbmREYXRhQ21kOw0KLQ0KLQ0KLS8qNi42LjMxICAgIEdFVCBDSEFOTkVMIFNUQVRVUyAqLw0KLXR5cGVkZWYgc3RydWN0ICB7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9HZXRDaG5sU3RhdHVzQ21kLA0KLVRfekFwVWljY19VU0FUX0dldENobmxTdGF0dXNDbWQ7DQotDQotLyo2LjYuMzIgICAgU0VSVklDRSBTRUFSQ0ggKi8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkljb25GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEdmNGaWx0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBbHBoYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfSWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWNvbjsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfRHZjRmlsdGVyICAgICAgICAgICAgICAgICAgICAgICB0RHZjRmlsdGVyOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9TcnZTcmNoICAgICAgICAgICAgICAgICAgICAgICAgIHRTcnZTcmNoOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9TcnZTZWFyY2hDbWQsDQotVF96QXBVaWNjX1VTQVRfU3J2U2VhcmNoQ21kOw0KLQ0KLS8qNi42LjMzICAgIEdFVCBTRVJWSUNFIElORk9STUFUSU9OICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJY29uRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXRyOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjY7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY29uOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BdHJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgIHRBdHJJbmZvOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVHh0QXRyW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFhUQVRUUl9MRU5dOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9HZXRTcnZJbmZvQ21kLA0KLVRfekFwVWljY19VU0FUX0dldFNydkluZm9DbWQ7DQotDQotLyo2LjYuMzQgICAgREVDTEFSRSBTRVJWSUNFICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZlRyTHZGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DbWREdGxzICAgICAgICAgICAgICAgICAgICAgICAgIHRDbWQ7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9TcnZSZWMgICAgICAgICAgICAgICAgICAgICAgICAgIHRTcnZSZWMgOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9JbnRmY1Ruc3B0THYgICAgICAgICAgICAgICAgICAgIHRJdGZUckx2Ow0KLX1UX3pQU19BcFVpY2NfVVNBVF9EZWNsZWFyU3J2Q21kLA0KLVRfekFwVWljY19VU0FUX0RlY2xlYXJTcnZDbWQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBldm5lbG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qNy41LjEgICAgICBNVCBjYWxsIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGk7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWRyOyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfU3ViQWRkciAgICAgICAgICAgICAgICAgICAgICAgICB0U3ViQWRyOyANCi19VF96UFNfQXBVaWNjX1VTQVRfQ2FsbE10RXZ0LA0KLVRfekFwVWljY19VU0FUX0NhbGxNdEV2dDsNCi0NCi0vKjcuNS4yICAgICAgQ2FsbCBjb25uZWN0ZWQgZXZlbnQgKi8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUaTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9DYWxsQ29uRXZ0LA0KLVRfekFwVWljY19VU0FUX0NhbGxDb25FdnQ7DQotDQotDQotDQotLyo3LjUuMyAgICAgIENhbGwgZGlzY29ubmVjdGVkIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDYXVzZVtaUFNfQVBVSUNDX1VTQVRfTUFYX0RJU0NDQVVTX0xFTl07ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbjsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGk7DQotDQotICAgIFRfelBTX0FwVWljY19VU0FUX0R2Y0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgdER2Y0lkOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9DYWxsRGlzY0V2dCwNCi1UX3pBcFVpY2NfVVNBVF9DYWxsRGlzY0V2dDsNCi0NCi0NCi0vKjcuNS40ICAgICAgTG9jYXRpb24gc3RhdHVzIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXR1czsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTG9jRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgICAgICAgICAgICAgICAgICAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0xvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgdExvY2F0aW9uOyANCi19VF96UFNfQXBVaWNjX1VTQVRfTG9jRXZ0LA0KLVRfekFwVWljY19VU0FUX0xvY0V2dDsNCi0NCi0vKjMxLjExMSA3LjUuMiAgICAgIE5ldHdvcmsgUmVqZWN0aW9uIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgYkFjdDsgIA0KLSAgICBCWVRFICBiVXBkYXRhQXR0YWNoVHlwZTsgDQotICAgIEJZVEUgIGJSZWpDYXVzZTsNCi0gICAgQllURSAgYkV4dFJlakNhdXNlRmxnOw0KLSAgICBCWVRFICBiRXh0UmVqQ2F1c2U7DQotICAgIHVuaW9uDQotICAgIHsNCi0gICAgICAgIFRfelBTX1RBSSAgdFRhaTsNCi0gICAgICAgIFRfelBTX1JBSSAgdFJhaTsNCi0gICAgICAgIFRfekFwVWljY19VU0FUX0xvY2F0aW9uIHRMb2NhdGlvbjsNCi0gICAgfXVWYWw7DQotfVRfelBTX0FwVWljY19VU0FUX053UmVqRXZ0LA0KLVRfekFwVWljY19VU0FUX053UmVqRXZ0Ow0KLQ0KLQ0KLS8qNy41LjcgICAgICBDYXJkIHJlYWRlciBzdGF0dXMgZXZlbnQgKi8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0dXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLX1UX3pQU19BcFVpY2NfVVNBVF9SZENhcmRTdGF0ZUV2dCwNCi1UX3pBcFVpY2NfVVNBVF9SZENhcmRTdGF0ZUV2dDsNCi0NCi0vKjcuNS44ICAgICAgTGFuZ3VhZ2Ugc2VsZWN0aW9uIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkxhdWd1YWdlWzJdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi19VF96UFNfQXBVaWNjX1VTQVRfTGF1Z3VhZ2VFdnQsDQotVF96QXBVaWNjX1VTQVRfTGF1Z3VhZ2VFdnQ7DQotDQotLyo3LjUuOSAgICAgIEJyb3dzZXIgdGVybWluYXRpb24gZXZlbnQgKi8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfelBTX0FwVWljY19VU0FUX0Jyb3dzZVN0b3BFdnQsDQotVF96QXBVaWNjX1VTQVRfQnJvd3NlU3RvcEV2dDsNCi0NCi0vKjcuNS4xMCAgICBEYXRhIGF2YWlsYWJsZSBldmVudCAqLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGFMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ2hubFN0YXQgICAgICAgICAgICAgICAgICAgICAgICB0Q2hubFN0YXQ7DQotfSBUX3pQU19BcFVpY2NfVVNBVF9EYXRhQXZsRXZ0LA0KLVRfekFwVWljY19VU0FUX0RhdGFBdmxFdnQ7DQotDQotLyo3LjUuMTEgICAgQ2hhbm5lbCBzdGF0dXMgZXZlbnQgKi8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLQ0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DaG5sU3RhdCAgICAgICAgICAgICAgICAgICAgICAgIHRDaG5sU3RhdDsNCi19VF96UFNfQXBVaWNjX1VTQVRfQ2hubFN0YXRlRXZ0LA0KLVRfekFwVWljY19VU0FUX0NobmxTdGF0ZUV2dDsNCi0NCi0vKjcuNS4xMiAgICBBY2Nlc3MgdGVjaG5vbG9neSBjaGFuZ2UgZXZlbnQgKi8NCi10eXBlZGVmIHN0cnVjdCAgew0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY3Q7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9BY3RDaGdFdnQsDQotVF96QXBVaWNjX1VTQVRfQWN0Q2hnRXZ0Ow0KLQ0KLS8qNy41LjEzICAgIERpc3BsYXkgcGFyYW1ldGVycyBjaGFuZ2VkIGV2ZW50ICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhcmFtWzNdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pQU19BcFVpY2NfVVNBVF9EaXNQbGF5Q2hnRXZ0LA0KLVRfekFwVWljY19VU0FUX0Rpc1BsYXlDaGdFdnQ7DQotDQotLyo3LjUuMTQgICAgTG9jYWwgY29ubmVjdGlvbiBldmVudCAqLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1BZHJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJdGZUckxGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUckx2QWRyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIA0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfU3J2UmVjICAgICAgICAgICAgICAgICAgICAgICAgICB0U3J2UmVjIDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfUm10QWRkciAgICAgICAgICAgICAgICAgICAgICAgICB0UmVtQWRyOyAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0ludGZjVG5zcHRMdiAgICAgICAgICAgICAgICAgICAgdEl0ZlRyTHY7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9PdGhyQWRkciAgICAgICAgICAgICAgICAgICAgICAgIHRUckx2QWRyOyANCi19VF96UFNfQXBVaWNjX1VTQVRfTG9jYWxDb25uY3RFdnQsDQotVF96QXBVaWNjX1VTQVRfTG9jYWxDb25uY3RFdnQ7DQotDQotLyo3LjIgICAgICAgIE1lbnUgc2VsZWN0aW9uICovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1JZDsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGVscFJlcToxOyANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotfVRfelBTX0FwVWljY19VU0FUX01lbnVTZWwsDQotVF96QXBVaWNjX1VTQVRfTWVudVNlbDsNCi0NCi0vKjcuMy4yIE1PIFNob3J0IE1lc3NhZ2UgQ29udHJvbCBieSBVU0lNKi8NCi10eXBlZGVmIHN0cnVjdCAgeyAgICANCi0NCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UnBEYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VHBEYTsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICB0TG9jYXRpb247DQotICAgIA0KLX1UX3pQU19BcFVpY2NfVVNBVF9TbXNDdHJsLA0KLVRfekFwVWljY19VU0FUX1Ntc0N0cmw7DQotDQotLyo3LjMuMiBNTyBTaG9ydCBNZXNzYWdlIENvbnRyb2wgYnkgVVNJTSovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkN0clJsdDsgICAgICANCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJwZGFGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcGRhRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRScERhOyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VHBEYTsgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0FscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFscGhhOyANCi19VF96UFNfQXBVaWNjX1VTQVRfU21zQ3RybENuZiwNCi1UX3pBcFVpY2NfVVNBVF9TbXNDdHJsQ25mOw0KLQ0KLS8qNy4zICAgICAgICBDYWxsIENvbnRyb2wgYnkgTkFBICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVuaW9uRmc7Lyqx7cq+dWlvbrXE09DQp8/uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDogQWRkcmVzcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDE6IHNzIHN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDI6IHVzc2Qgc3RyaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMzogcGRwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIFRfelBTX0FwVWljY19VU0FUX0NhcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENhcGExOyAgICAgDQotICAgIFRfelBTX0FwVWljY19VU0FUX0NhcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENhcGEyOyAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfU3ViQWRkciAgICAgICAgICAgICAgICAgICAgICAgICB0U3ViQWRyOw0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9Mb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHRMb2NhdGlvbjsNCi0gICAgdW5pb24gew0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgIHRBZGRyOw0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfU3NTdHIgICAgICAgICAgICAgICAgICAgICAgIHRTc1N0cjsNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1Vzc2RTdHIgICAgICAgICAgICAgICAgICAgICB0VXNzZFN0cjsNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1BkcEFjdFBhcmFtICAgICAgICAgICAgICAgICB0UGRwOw0KLSAgICB9IHVDdHJTdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19IFRfelBTX0FwVWljY19VU0FUX0NhbGxDdHJsLA0KLVRfekFwVWljY19VU0FUX0NhbGxDdHJsOw0KLQ0KLQ0KLS8qNy4zICAgICAgICBDYWxsIENvbnRyb2wgYnkgTkFBICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkN0cmxSbHQ7DQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCY1JlcEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjcgOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJjUmVwdHI7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVbmlvbkZnOy8qse3KvnVpb261xNPQ0KfP7g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA6IEFkZHJlc3MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOiBzcyBzdHJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyOiB1c3NkIHN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDM6IHBkcA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY6IHVpb27O3tCnKi8NCi0gICAgdW5pb24gew0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfQWRkciAgICAgICAgICAgICAgICAgICAgICAgIHRBZGRyOw0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfU3NTdHIgICAgICAgICAgICAgICAgICAgICAgIHRTc1N0cjsNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1Vzc2RTdHIgICAgICAgICAgICAgICAgICAgICB0VXNzZFN0cjsNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1BkcEFjdFBhcmFtICAgICAgICAgICAgICAgICB0UGRwOw0KLSAgICB9IHVDdHJTdHI7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9TdWJBZGRyICAgICAgICAgICAgICAgICAgICAgICAgIHRTdWJBZHI7DQotICAgIFRfelBTX0FwVWljY19VU0FUX0NhcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgdENhcGExOyANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICB0QWxwaGE7IA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9DYXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDYXBhMjsgDQotfSBUX3pQU19BcFVpY2NfVVNBVF9DYWxsQ3RybENuZiwNCi1UX3pBcFVpY2NfVVNBVF9DYWxsQ3RybENuZjsNCi0NCi0vKjcuNCAgICAgICAgVGltZXIgZXhwaXJhdGlvbiAqLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIFRfelBTX0FwVWljY19VU0FUX1RpbWVySW5mbyAgICAgICAgICAgICAgICAgICAgICAgdFRpbWVySW5mbzsNCi19VF96UFNfQXBVaWNjX1VTQVRfVGltZUV4cGlyZSwNCi1UX3pBcFVpY2NfVVNBVF9UaW1lRXhwaXJlOw0KLQ0KLQ0KLS8qMzExMTEgNy4xLjEgU01TLVBQIGRhdGEgZG93bmxvYWQqLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY2FGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcGR1TGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlRwZHVbWlBTX0FQVUlDQ19VU0FUX01BWF9UUERVX0xFTl07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBUX3pQU19BcFVpY2NfVVNBVF9BZGRyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTY2E7IA0KLX0gVF96UFNfQXBVaWNjX1VTQVRfU21zRG93biwNCi1UX3pBcFVpY2NfVVNBVF9TbXNEb3duOw0KLQ0KLS8qMzExMTEgNy4xLjEgU01TLVBQIGRhdGEgZG93bmxvYWQgu9i4tCovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUcHVkW1pQU19BUFVJQ0NfVVNBVF9NQVhfVFBVRF9MRU5dOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHBkdUxlbjsNCi0NCi19IFRfelBTX0FwVWljY19VU0FUX1Ntc0Rvd25DbmYsDQotVF96QXBVaWNjX1VTQVRfU21zRG93bkNuZjsNCi0NCi0vKjcuMS4yIENlbGwgQnJvYWRjYXN0IGRhdGEgZG93bmxvYWQqLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDYnNQYWdlW1pQU19BUFVJQ0NfVVNBVF9NQVhfQ0JTUEFHX0xFTl07DQotfSBUX3pQU19BcFVpY2NfVVNBVF9DYnNEb3duLA0KLVRfekFwVWljY19VU0FUX0Nic0Rvd247DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgIFVpY2NNYW5hZ2Vyus1BUL3Tv9rP+8+iveG5ubao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfSW5pdFJlcV9FdihNTUktPlVpY2NNYW5hZ2VyKQ0KLSDLtcP3OiC45taqv6i9+NDQs/XKvLuvDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU2xvdCBOdW1iZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX1NMT1QwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWlBTX0FwVWljY19TTE9UMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfU0xPVDIgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQXBwTW9kZVtaUFNfQXBVaWNjX01BWF9JTklUQVBQTU9ERV9OVU1dOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVWljYyBNYW5hZ2VyIHdpbGwgaW5pdCB0aGUgYXBwbG1vZGUgbGlzdGVkIGluIHRoZSBhcnJheSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDogWlBTX0FwVWljY19BUFBNT0RFX05VTEwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTogWlBTX0FwVWljY19BUFBNT0RFX1VTSU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAyOiBaUFNfQXBVaWNjX0FQUE1PREVfU0lNIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsNCi19VF96UFNfQXBVaWNjX0luaXRfUmVxLA0KLVRfekFwVWljY19Jbml0X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfSW5pdENuZl9FdihVaWNjTWFuYWdlci0+TU1JKQ0KLSDLtcP3OiBBcFVpY2NfSW5pdF9SZXG1xM/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFwcE1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnQgb3BlcmF0aW9uIGFwcGxpY2F0aW9uIG1vZGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoxOiBaUFNfQXBVaWNjX0FQUE1PREVfVVNJTQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjI6IFpQU19BcFVpY2NfQVBQTU9ERV9TSU0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGhhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfU0lNX1BIQVNFMSAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWlBTX0FwVWljY19TSU1fUEhBU0UyIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfU0lNX1BIQVNFMl9TUEVDSUFMOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgcGhhc2UgMiBhbmQgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBQUk9GSUxFIERPV05MT0FEIHJlcXVpcmVkIChzZWUgM0dQUCBUUyA1MS4wMTQgWzI3XSkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWlBTX0FwVWljY19TSU1fTk9fUEhBU0UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3VWljY1N0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2FyZCBpbml0IHN0YXQ6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX05PX0NBUkQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfTU9ERV9TRUxFX09LDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX0NBUkRfV1JPTkcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfTkVFRF9VTkJMUElODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX05FRURfUElODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX05FRURfVU5WU0xQSU4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfTkVFRF9VTkJMX1VOVlNMUElODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX0FQUExfRkFJTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkljY0lkWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkVGIGljY2lkKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQbEZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pQU19VSUNDX1BMICAgICAgICAgICAgICAgICAgICAgICB0UGw7DQotICAgIFRfelBTX1VJQ0NfTGkgICAgICAgICAgICAgICAgICAgICAgIHRMaTsNCi19VF96UFNfQXBVaWNjX0luaXRfQ25mLA0KLVRfekFwVWljY19Jbml0X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfVWljY09rSW5kX0V2KFVpY2NNYW5hZ2VyLT5NTUkpDQotIMu1w/c6ILP1yry7r73hyvjP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBsTW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hJZDsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdJbml0UmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGUgaW5pdCByZXN1bHQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX0lOSVRfT0sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaUFNfQXBVaWNjX0VMRU1FTlRBUllfSU5JVF9PSw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfQ0FSRF9XUk9ORw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpQU19BcFVpY2NfTk9fQ0FSRCAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi19VF96UFNfQXBVaWNjX1VpY2NPa19JbmQsDQotVF96QXBVaWNjX1VpY2NPa19JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX0NhcmRJbmRfRXYoVWljY01hbmFnZXItPk1NSSkNCi0gy7XD9zogICCy5b+osM6/qMnPsajP+8+iLLbUTU1Jzt7C27Llv6i78srHsM6/qLa8zqq4w8/7z6INCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbG90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzbG90Ki8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbG90U3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjYXJkIHN0YXR1cyAwLVpQU19BcFVpY2NfRVZVTFNJT05fQ0FSRCwgMS1aUFNfQXBVaWNjX0lOU0VSVF9DQVJEKi8NCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyqy5bDO1K3S8iAwLc7vwO2y5bDOIFpfQVBVSUNDX0NBUkRfUEhZX09QRVIgMS3G5Mv71K3S8iBaX0FQVUlDQ19DQVJEX09USEVSX09QRVIqLw0KLSAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pQU19BcFVpY2NfQ2FyZF9JbmQsDQotVF96QXBVaWNjX0NhcmRfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFQX1VJQ0NfTk9DQVJEX0lORF9FVg0KLSDLtcP3OiAgzt6/qMqxzajWqsbky/vEo7/ptcRpbmQgz/vPog0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5vY2FyZFR5cGU7ICAgICAgIC8qse3Kvs7ev6jP+8+iwODQzaOsxL/HsNans9bBvdbWwODQzToNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUFVJQ0NfTk9DQVJEX1RZUEVfTk9STUFMICAgICAgICAgICAgICAgIChCWVRFKTAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQVUlDQ19OT0NBUkRfVFlQRV9SRVNFVF9SRUZSRVNIICAgIChCWVRFKTEgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pQU19BcFVpY2NfTm9DYXJkX0luZCwNCi1UX3pBcFVpY2NfTm9DYXJkX0luZDsgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19WZXJpZnlSZXFfRXYoTU1JQS0+VUlDQ01uZykNCi0gy7XD9zogINPJTU1JQc/Ct6JwaW7R6dakx+vH8w0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICBiRGVzSW5kZXg7IA0KLSAgICBCWVRFICAgYkNoSWQ7DQotICAgIEJZVEUgICBiUGFkZGluZzsNCi0gICAgQllURSAgIGFiS2V5WzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19WZXJpZnlfUmVxLA0KLVRfekFwVWljY19WZXJpZnlfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfVW5ibG9ja1JlcV9FdihNTUlBLT5VSUNDTW5nKQ0KLSDLtcP3OiAg08lNTUlBz8K3onBpbsv4x+vH8w0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICBiRGVzSW5kZXg7ICANCi0gICAgQllURSAgIGJDaElkOw0KLSAgICBCWVRFICAgYlBhZGRpbmc7DQotICAgIEJZVEUgICBhYlVuYmxvY2tLZXlbOF07ICAgICAgDQotICAgIEJZVEUgICBhYk5ld1ZlcmlmeUtleVs4XTsNCi19VF96UFNfQXBVaWNjX1VuYmxvY2tfUmVxLA0KLVRfekFwVWljY19VbmJsb2NrX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX0NoYW5nZVJlcV9FdihNTUlBLT5VSUNDTW5nKQ0KLSDLtcP3OiAg08lNTUlBz8K3onBpbtDeuMTH68fzDQotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgIGJEZXNJbmRleDsgDQotICAgIEJZVEUgICBiRmFjOyAgICAgICAgLypaUFNfQXBVaWNjX1BJTjFUWVBFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU4yVFlQRSAqLw0KLSAgICBCWVRFICAgYkNoSWQ7DQotICAgIEJZVEUgICBhYk9sZEtleVs4XTsgICAgDQotICAgIEJZVEUgICBhYk5ld0tleVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfelBTX0FwVWljY19DaGFuZ2VfUmVxLA0KLVRfekFwVWljY19DaGFuZ2VfUmVxOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfRmFjaWxpdHlQaW5SZXFfRXYoTU1JQS0+VUlDQ01uZykNCi0gy7XD9zogINPJTU1JQc/Ct6JwaW68pLvuyKW77sfrx/MNCi0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgYkRlc0luZGV4OyAgIA0KLSAgICBCWVRFICAgYk1vZGU7ICAgICAgIC8qWlBTX0FwVWljY19GQUNJTElUWVBJTl9ESVMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfRkFDSUxJVFlQSU5fRU4gICAqLw0KLSAgICBCWVRFICAgYkNoSWQ7DQotICAgIEJZVEUgICBhYktleVs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfRmFjaWxpdHlQaW5fUmVxLA0KLVRfekFwVWljY19GYWNpbGl0eVBpbl9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX1BpbkVuYWJsZVF1ZXJ5UmVxX0V2KE1NSS0+VWljY01hbmFnZXIpDQotIMu1w/c6ILLp0a+1scewUElOMcrHt/Gxu7yku+4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96UFNfQXBVaWNjX1BpbkVuYWJsZVF1ZXJ5X1JlcSwNCi1UX3pBcFVpY2NfUGluRW5hYmxlUXVlcnlfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFwVWljY19QaW5FbmFibGVRdWVyeUNuZl9FdihVaWNjTWFuYWdlci0tPk1NSSkNCi0gy7XD9zogsunRr7Wxx7BQSU4xyse38bG7vKS77g0KLSAgICAgICC07c7zyrHKudPDQ29tbW9uQ25mu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGluMVN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qUElOMcrHt/Gxu7yku+4sYlBpbkVuYWJsZVF1ZXJ5U3RhdCA9PSBaUFNfQXBVaWNjX1JFQURfT0vKsdPQ0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfUElOX05PVEFDVElWRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fQUNUSVZFKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KLX1UX3pQU19BcFVpY2NfUGluRW5hYmxlUXVlcnlfQ25mLA0KLVRfekFwVWljY19QaW5FbmFibGVRdWVyeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX1BpblN0YXRRdXJleVJlcV9FdihNTUktPlVpY2NNYW5hZ2VyKQ0KLSDLtcP3OiCy6dGvtbHHsL+oyc/Kx7fx0OjSqtHp1qRQSU4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2hJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pQU19BcFVpY2NfUGluU3RhdFF1cmV5X1JlcSwNCi1UX3pBcFVpY2NfUGluU3RhdFF1cmV5X1JlcTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfUGluU3RhdFF1cmV5Q25mX0V2KE1NSS0+VWljY01hbmFnZXIpDQotIMu1w/c6ILLp0a+1scewv6jJz8rHt/HQ6NKq0enWpFBJTg0KLSAgICAgICC07c7zyrHKudPDQ29tbW9uQ25mu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgICAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQaW5TdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyq1scewv6jJz8rHt/HQ6NKq0enWpFBJTiwgYlBpblN0YXRRdXJleVN0YXQgPT0gWlBTX0FwVWljY19SRUFEX09LyrHT0NCnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fUkVBRFkgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fU0lNUElOICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fU0lNUElOMiAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19QSU5fU0lNUFVLMiAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoSWQ7DQotfVRfelBTX0FwVWljY19QaW5TdGF0UXVyZXlfQ25mLA0KLVRfekFwVWljY19QaW5TdGF0UXVyZXlfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFwVWljY19Jbml0SW5kX0V2KFVpY2NNYW5hZ2VyLT5VTU0vTU1JKQ0KLSDLtcP3OiCz9cq8u6/P4LnY0MXPorXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoZSBhcHBsaWNhdGlvbiBtb2RlKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJVc3RGbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkVzdEZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3N0RmxhZzsNCi0NCi0gICAgVF96UFNfVUlDQ19Vc3QgICAgICAgICAgICAgIHRVc3Q7DQotICAgIFRfelBTX1VJQ0NfRXN0ICAgICAgICAgICAgICB0RXN0Ow0KLSAgICBUX3pQU19VSUNDX1NTVCAgICAgICAgICAgICAgdFNzdDsgICANCi19VF96UFNfQXBVaWNjX0luaXRfSW5kLA0KLVRfekFwVWljY19Jbml0X0luZDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6WlBTX0FwVWljY19DYXJkTW9kZVJlcV9Fdg0KLSDLtcP3OiBBVF5DQVJETU9ERSAgU0lNL1VTSU2/qMSjyr3KtrHwDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLX1UX3pQU19BcFVpY2NfQ2FyZE1vZGVfUmVxLA0KLVRfekFwVWljY19DYXJkTW9kZV9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpQU19BcFVpY2NfQ2FyZE1vZGVDbmZfRXYoTU1JQS0+QVRJKQ0KLSDLtcP3OiBBVF5DQVJETU9ERSAgU0lNL1VTSU2/qMSjyr3KtrHwLLWxx7C/qM60s/XKvLuvu/K1yLT9udi7+sqxyc+xqFpQU19BcFVpY2NfQ0FSRF9UWVBFX1VOS05PV04NCi0gvLQs1NrIzrrO17TMrM/CtrzQ6NKqvdPK3LjDz/vPog0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhcmRNb2RlOyAgICAgICAvKr+owODQzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfQ0FSRF9UWVBFX1VJQ0MgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19DQVJEX1RZUEVfU0lNICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX0NBUkRfVFlQRV9VTktOT1dOICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLX1UX3pQU19BcFVpY2NfQ2FyZE1vZGVfQ25mLA0KLVRfekFwVWljY19DYXJkTW9kZV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX1JlYWRSZXFfRXYoVU1NL01NSS0+VWljY01hbmFnZXIpDQotIMu1w/c6IFVNTbvyTU1Jx+vH87bByKG/qNbQtcTOxLz+DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIFdPUkQgICAgd0tleUlkOw0KLSAgICANCi0gICAgQllURSAgICBiQXBwbE1vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgIGJSZWNJZDsNCi0gICAgQllURSAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX0FwVWljY19SZWFkX1JlcSwNCi1UX3pBcFVpY2NfUmVhZF9SZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX1JlYWRDbmZfRXYoVWljY01hbmFnZXItPlVNTS9NTUkpDQotIMu1w/c6ILbBx+vH87XEz+zTpg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIFdPUkQgICB3S2V5SWQ7DQotICAgIA0KLSAgICBEV09SRCAgZHdFeGVjdXRlU3RhdHVzOyAgDQotDQotICAgIEJZVEUgICBiQXBwbE1vZGU7IA0KLSAgICBCWVRFICAgYlJlY0lkOw0KLSAgICBXT1JEICAgd1ZhbExlbjsNCi0gICAgDQotICAgIEJZVEUgICAgYWJWYWxbWlBTX0FwVWljY19NQVhfREFUQV9WQUxdOyAgICAgICAgDQotfVRfelBTX0FwVWljY19SZWFkX0NuZiwNCi1UX3pBcFVpY2NfUmVhZF9DbmY7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX1VwZGF0ZVJlcV9FdihVTU0vTU1JLT5VaWNjTWFuYWdlcikNCi0gy7XD9zogVU1Nu/JNTUnH68fzuPzQwr+o1tC1xM7EvP4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIFdPUkQgICB3S2V5SWQ7DQotICAgIA0KLSAgICBCWVRFICAgYkFwcGxNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgIGJSZWNJZDsNCi0gICAgV09SRCAgIHdWYWxMZW47DQotICAgIA0KLSAgICBCWVRFICAgYWJWYWxbWlBTX0FwVWljY19NQVhfREFUQV9WQUxdOyAgICAgICANCi19VF96UFNfQXBVaWNjX1VwZGF0ZV9SZXEsDQotVF96QXBVaWNjX1VwZGF0ZV9SZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19QaW5SZW1haW5OdW1SZXFfRXYoTU1JLT5VaWNjTWFuYWdlcikNCi0gy7XD9zogTU1Jx+vH87Lp0a9QSU7Ko9PgtM7K/Q0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19QaW5SZW1haW5OdW1fUmVxLA0KLVRfekFwVWljY19QaW5SZW1haW5OdW1fUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfUGluUmVtYWluTnVtQ25mX0V2KFVpY2NNYW5hZ2VyLT5NTUkpDQotIMu1w/c6IFVpY2NNYW5hZ2Vyt7W72FBJTsqj0+C0zsr9DQotICAgICAgINLss6PKscq508NDb21tb25Dbma72Li0DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaElkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBpbjFSZW1haW47ICAgICAgICAgICAgICAgICAgICAgICAgICAvKlBpbjG1xMqj0+DR6daktM7K/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQaW4yUmVtYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgLypQaW4ytcTKo9Pg0enWpLTOyv0syOfOtLvxyKFQSU4yz+C52Mr9vt2jrNTyzqoweEZGKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVuYmxQaW4xUmVtYWluOyAgICAgICAgICAgICAgICAgICAgICAvKlVuYmxvY2sgUGluMbXEyqPT4NHp1qS0zsr9Ki8gICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVuYmxQaW4yUmVtYWluOyAgICAgICAgICAgICAgICAgICAgICAvKlVuYmxvY2sgUGluMrXEyqPT4NHp1qS0zsr9LMjnzrS78cihUElOMs/gudjK/b7do6zU8s6qMHhGRiovDQotfVRfelBTX0FwVWljY19QaW5SZW1haW5OdW1fQ25mLA0KLVRfekFwVWljY19QaW5SZW1haW5OdW1fQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFwVWljY19VcGRhdGVDbmZfRXYoVWljY01hbmFnZXItPlVNTS9NTUkpDQotIMu1w/c6IFVNTbvyTU1Jx+vH87j80MK/qNbQtcTOxLz+DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgV09SRCAgIHdLZXlJZDsgDQotICAgIA0KLSAgICBCWVRFICAgYkFwcGxNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgYlJlY0lkOw0KLSAgICBCWVRFICAgYWJQYWRkaW5nWzJdOyAgICANCi0gICAgRFdPUkQgIGR3RXhlY3V0ZVN0YXR1czsgICAgICAgICAgICAgICAgICANCi19VF96UFNfQXBVaWNjX1VwZGF0ZV9DbmYsDQotVF96QXBVaWNjX1VwZGF0ZV9DbmY7DQotDQotDQotICAgIA0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFwVWljY19BdXRoUmVxX0V2KE1NL0dNTS0+VWljY01hbmFnZXIpDQotIMu1w/c6ILeiy828+Miotb1VaWNjTWFuYWdlcqOsTU0vR01NubLTww0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRvbWFpbklkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY27T8rHqyr6jrMih1rW8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXV0aFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiC8+MiowODQzaOsss68+7rqtqjS5SAqLyAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2VxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlJhbmRbWlBTX0FwVWljY19NQVhfTEVOX1JBTkRdOyAgICAgICAgICAgIC8qIFRoZSBhdXRoLnBhcmFtZXRlciAgUkFORCAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkF1dG5bWlBTX0FwVWljY19NQVhfTEVOX0FVVE5dOyAgICAgICAgICAgIC8qIFRoZSBhdXRoLnBhcmFtZXRlciAgQVVUTiAqLw0KLX1UX3pQU19BcFVpY2NfQXV0aF9SZXEsDQotVF96QXBVaWNjX0F1dGhfUmVxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfQXV0aFJzcF9FdihVaWNjTWFuYWdlci0+TU0vR01NKQ0KLSDLtcP3OiC8+Mioz+zTprW9R01NL01NDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRG9tYWluSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY27T8rHqyr6jrMih1rW8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXV0aFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogvPjIqMDg0M2jrLLOvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc0xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFU7XEs6S2yKOsR1NNvPjIqMqxucy2qMih1rU0LFVNVFO8+MioyKHWtTQtMTYgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlcTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pQU19DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q2s7DQotDQotICAgIFRfelBTX0lLICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJazsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJLY1taUFNfQXBVaWNjX01BWF9MRU5fS0NdOyAgICAgICAgICAgICAgIC8qIFRoZSBjaXBoZXJpbmcgS2V5IEtjLCAgaW4gR1NNICovIA0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlJlc1taUFNfQXBVaWNjX01BWF9MRU5fUkVTXTsgICAgICAgICAgICAgLyogVGhlIHJlc3BvbnNlIG9mIGF1dGhlbnRpY2F0aW9uLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gR1NNIGF1dGhlbnRpY2F0aW9uIDogU1JFUyAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGVuIFVNVFMgYXV0aGVudGljYXRpb246IFJFUyAqLw0KLX1UX3pQU19BcFVpY2NfQXV0aF9DbmYsDQotVF96QXBVaWNjX0F1dGhfQ25mOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBcFVpY2NfQXV0aEZhaWxJbmRfRXYoVWljY01hbmFnZXItPk1NL0dNTSkNCi0gy7XD9zogvPjIqMqnsNy1vUdNTS9NTQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRvbWFpbklkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRvbWFpbklkLCBVaWNjTWFuYWdlciBkbyBub3QgdWVzIGl0ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZhaWxDYXVzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQXV0aGVudGljYXRlIGZhaWx1cmUgY2F1c2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTWFjRmFpbCAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTeW5jRmFpbCAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkdzbUF1dGhVbkFjY3B0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2VxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbM107DQotICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBdXRzW1pQU19BcFVpY2NfTUFYX0xFTl9BVVRTXTsgICAgICAgICAgIC8qIFRoZSBTeW5jaCBmYWlsdXJlICBwYXJhbWV0ZXIgQVVUUyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96UFNfQXBVaWNjX0F1dGhGYWlsX0NuZiwNCi1UX3pBcFVpY2NfQXV0aEZhaWxfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAg1K3T7zpaUFNfQXBVaWNjX1BpbkFwcGxTZXRSZXFfRXYNCi0gILmmxNw6yejWw1BJTs/gudjTptPDo6zG5Lrzy/nT0LXEUElOstnX97a8zqq4w9Om08PPwr340NANCi0gILbU06ZBVMP8we46DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotIHR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgLyogxL+1xMv30v0gKi8gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQXBwTW9kZTsgICAgIC8qyejWw7Wxx7DTptPDo6zG5Lrz0+tQSU7P4LnYtcTD/MHutry9q9TL0NDU2rjD06bTw8/Co6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILWxv6q7+s60yejWw9b306bTw8qxo6xVaWNjTW5nvavErMjPyrnTw9b306bTw6OsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILWxuMPJ6NbDyqew3Mqxo6y689D4tcRQSU7B97PMtry9q8jPzqq07c7zKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICAgDQotfVRfelBTX0FwVWljY19QaW5BcHBsU2V0X1JlcSwNCi1UX3pBcFVpY2NfUGluQXBwbFNldF9SZXE7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpQU19BcFVpY2NfUGluQXBwbFNldENuZl9Fdg0KLSAguabE3DpaUFNfQVBNTUlBX1BpbkFwcGxTZXRSZXFfRXbP7NOmz/vPog0KLSAgttTTpkFUw/zB7joNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAvKiDEv7XEy/fS/SAqLyAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3U2V0U3RhdHVzOyAgICAvKsno1sO94bn7o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX0NBUkRfV1JPTkcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1NFVF9PSyAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOyAgICAgDQotfVRfelBTX0FwVWljY19QaW5BcHBsU2V0X0NuZiwNCi1UX3pBcFVpY2NfUGluQXBwbFNldF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpQU19BcFVpY2NfUGluQXBwbFJlYWRDbmZfRXYNCi0gILmmxNw6tsHIobWxx7BQSU7P4LnY06bTw8no1sPXtMysDQotICC21NOmQVTD/MHuOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSB0eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgIC8qIMS/tcTL99L9ICovICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsgICAgIA0KLX1UX3pQU19BcFVpY2NfUGluQXBwbFJlYWRfUmVxLA0KLVRfekFwVWljY19QaW5BcHBsUmVhZF9SZXE7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpQU19BcFVpY2NfUGluQXBwbFJlYWRDbmZfRXYNCi0gILmmxNw6WlBTX0FQTU1JQV9QaW5BcHBsUmVhZFJlcV9FdrXEz+zTpqOstbHJ6NbDyqew3Mqxo6y3tbvYMHhGRg0KLSAgttTTpkFUw/zB7joNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAvKiDEv7XEy/fS/SAqLyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBNb2RlOyAgICAgICAvKlBJTs/gudjTptPDyejWw73hufujrLWxyejWw8qnsNzKsaOst7W72DB4RkYqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgICAgICAgDQotfVRfelBTX0FwVWljY19QaW5BcHBsUmVhZF9DbmYsDQotVF96QXBVaWNjX1BpbkFwcGxSZWFkX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgVWljY01hbmFnZXLW0FVTQVTP4LnYuabE3LrNQVC907/az/vPor3hubm2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi294bm5o7pUX3pQU19BcFVpY2NfVVNBVF9UZXJtaW5hbFJzcF9SZXEoTU1JQS0tPlVpY2NNYW5hZ2VyKQ0KLcrCvP66xToNCi0gy7XD9zpVU0FU1tC21FJlc3VsdCtSZWFzb27A4NDNz/vPorvYuLTKudPD1eLM9c/7z6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsNCi19VF96UFNfQXBVaWNjX1VTQVRfQ29tbW9uX0NuZiwNCi1UX3pBcFVpY2NfVVNBVF9Db21tb25fQ25mOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotveG5uaO6VF96UFNfQXBVaWNjX1VTQVRfVGVybWluYWxSc3BfUmVxKE1NSUEtLT5VaWNjTWFuYWdlcikNCi3Kwrz+usU6DQotIMu1w/c6IFVTQVTW0LXEVGVybWluYWwgUmVzcG9uc2UsuMPP+8+ittTTprXEu9i4tM/7z6LKudPDVF96UFNfQXBVaWNjX1VTQVRfQ29tbW9uX0NuZg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyo2LjggICAgICAgIFN0cnVjdHVyZSBvZiBURVJNSU5BTCBSRVNQT05TRSAqLw0KLXR5cGVkZWYgc3RydWN0ICB7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdQcm9DbWRUeXBlOyAvKtb3tq/KvcP8we61xMP8we7A4NDNKLu5v8nS1MihxuTL/MP8we61xMDg0M3WtSmjug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzOiBwb2xsIGludGVydmFsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA6IHNldCB1cCBjYWxsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjI6IGdldCBpbmtleQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIzOiBnZXQgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjQ6IHNlbGVjdCBpdGVtIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI2OiBwcm92aWRlIGxvY2FsIGluZm9ybWF0aW9uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4Mjc6IHRpbWVyIG1hbmFnZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDogcGVyZm9ybSBjYXJkIGFwZHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzE6IHBvd2VyIG9uIGNhcmQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMzogZ2V0IHJlYWRlciBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzQ6IHJ1biBhdCBjb21tYW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA6IG9wZW4gY2hhbm5lbA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyOiByZWNlaXZlIGRhdGENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Mzogc2VuZCBkYXRhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ6IGdldCBjaGFubmVsIHN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTogc2VydmljZSBzZWFyY2gNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NjogZ2V0IHNlcnZpY2UgaW5mb3JtYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHS1MnP1rW1xMqxuvKyu8Tcy7XD93VuaW9u0ru2qLTm1NoqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVuaW9uRmc7ICAgIC8qse3KvnVuaW9uyse38bTm1NoqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIA0KLSAgICANCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfQ21kRHRscyAgICAgICAgICAgICAgICAgICAgdENtZDsNCi0gICAgVF96UFNfQXBVaWNjX1VTQVRfUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgdFJsdDsNCi0gICAgdW5pb24gew0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfRHVyYSAgICAgICAgICAgICAgICAgICB0RHVyYTsgICAgICAgICAgICAvL3BvbGwgaW50ZXJ2YWwNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1R4dFN0ciAgICAgICAgICAgICAgICAgdFR4dFN0cjsgICAgICAgICAgLy9nZXQgaW5wdXQNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX0lua2V5X1RyICAgICAgICAgICAgICAgdElua2V5OyAgICAgICAgICAgLy9nZXQgaW5rZXkNCi0gICAgICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1JZDsgICAgICAgICAgLy9zZWxlY3QgaXRlbSAgICAgICAgIA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfTG9jSW5mbyAgICAgICAgICAgICAgICB0TG9jSW5mbzsgICAgICAgICAvL3Byb3ZpZGUgbG9jYWwgaW5mb3JtYXRpb24NCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX0NhbGxDdHJsX1RyICAgICAgICAgICAgdENhbGxDdHJsQWN0OyAgICAgLy8gc2V0IHVwIGNhbGwNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1Vzc2RjdHJfVHIgICAgICAgICAgICAgdFVzc2RjdHIgOw0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfUmRDYXJkU3RhdHVzICAgICAgICAgICB0UkNhcmRTdGF0dXM7ICAgICAvL2dldCByZWFkZXIgc3RhdHVzDQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9DYXJkQXRyICAgICAgICAgICAgICAgIHRDYXJkQXRyOyAgICAgICAgIC8vcG93ZXIgb24gY2FyZA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfUkFwZHUgICAgICAgICAgICAgICAgICB0UkFwZHU7ICAgICAgICAgICAvL3BlcmZvcm0gY2FyZCBhcGR1DQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9UaW1lckluZm8gICAgICAgICAgICAgIHRUaW1lckluZm87ICAgICAgIC8vdGltZXIgbWFuYWdlbWVudA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfQXRSc3AgICAgICAgICAgICAgICAgICB0QXRSc3A7ICAgICAgICAgICAvL3J1biBhdCBjb21tYW5kDQotICAgICAgICBUX3pQU19BcFVpY2NfVVNBVF9DaGRhdGFfVHIgICAgICAgICAgICAgIHRDaGRhdGE7ICAgICAgICAgIC8vcmVjZWl2ZSBkYXRhIG9yIHNlbmQgZGF0YQ0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfQ2hubFN0YXRfVHIgICAgICAgICAgdENobmxTdGF0OyAgICAgICAgLy9nZXQgY2hhbm5lbCBzdGF0dXMNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX09wY2hsX1RyICAgICAgICAgICAgICAgdE9wQ2hsOyAgICAgICAgICAgLy9vcGVuIGNoYW5uZWwNCi0gICAgICAgIFRfelBTX0FwVWljY19VU0FUX1NydkF2YWlsICAgICAgICAgICAgICAgdFNydkF2bCA7ICAgICAgICAgLy9zZXJ2aWNlIHNlYXJjaA0KLSAgICAgICAgVF96UFNfQXBVaWNjX1VTQVRfU3J2UmVjICAgICAgICAgICAgICAgICB0U3J2UmVjIDsgICAgICAgICAvL2dldCBzZXJ2aWNlIGluZm9ybWF0aW9uDQotICAgIH11U3RydWN0OyANCi19VF96UFNfQXBVaWNjX1VTQVRfVGVybWluYWxSc3BfUmVxLA0KLVRfekFwVWljY19VU0FUX1Rlcm1pbmFsUnNwX1JlcTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLb3hubmjulRfelBTX0FwVWljY19VU0FUX1Rlcm1ubFByb2ZpbF9SZXEoTU1JQS0tPlVpY2NNYW5hZ2VyKQ0KLcrCvP66xToNCi0gy7XD9zogVVNBVNbQtcRURVJNSU5BTCBQUk9GSUxFLLjDz/vPorbU06a1xLvYuLTP+8+iyrnTw1RfelBTX0FwVWljY19VU0FUX0NvbW1vbl9DbmYNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qNS4yICAgICAgICBTdHJ1Y3R1cmUgYW5kIGNvZGluZyBvZiBURVJNSU5BTCBQUk9GSUxFICovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRG93bmxvYWQgOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk90aGVyIDsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvRGlzcFR4dCA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvU2VsSXRlbSA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW52dEluZm8gOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVudnRFeHRuIDsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXVsdENhcmQgOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb1RpbWVyIDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9Mb2NJbmY7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU29mdEtleVNwcHQgOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTb2Z0S2V5SW5mbyA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJvT0Nobm5sIDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcm9Mb2NCZWFyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcm5IZWlnaHQ7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcm5XaWR0aCA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NybkVmZmVjdCA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHJhbnNQcm90b2NsOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByb1RpbW91dDsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHh0QXR0cmliMTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeHRBdHRyaWIyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZhY3RDb2RlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlJhbmRbOF07IA0KLX1UX3pQU19BcFVpY2NfVVNBVF9UZXJtbmxQcm9maWxfUmVxLA0KLVRfekFwVWljY19VU0FUX1Rlcm1ubFByb2ZpbF9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T7zogWlBTX0FwVWljY19Ub1JlYWRDYXJkUmVxX0V2KE1NSUEtLS0+VWljY01hbmFnZXIpDQotILmmxNw6IE1NSc2o1qpVSUNDv8m8zND4tsHIob+oyv2+3aGjuMPP+8+ittTTprXEu9i4tM/7z6LKudPDVF96UFNfQXBVaWNjX0NvbW1vbl9DbmYNCi0gttTTprXEQVTD/MHuo7orWlRSQyi6rNLlo7pUbyBSZWFkIENhcmQpo6zE2sjdzqq/1aOst7W72L3hufvOqqO6T0svQ01FIEVSUk9SDQotDQotINSt0+86IEFQX1VJQ0NfQVBfUFdST0ZGX1JFUV9FVihNTUlBLS0tPlVpY2NNYW5hZ2VyKQ0KLSC5psTcOiBNTUlBzajWqrnYv6gNCi0gQVTD/MHuOiArY2Z1bj01DQotDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96UFNfQXBVaWNjX1RvUmVhZENhcmRfUmVxLCBUX3pQU19BcFVpY2NfQXBQd3JPZmZfUmVxLA0KLVRfekFwVWljY19Ub1JlYWRDYXJkX1JlcSwgVF96QXBVaWNjX0FwUHdyT2ZmX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLb3hubmjulRaUFNfQXBNbWlhX1Byb2NtZEluZF9FdihVaWNjTWFuYWdlci0tLT5NTUlBKQ0KLcrCvP66xToNCi0gy7XD9zogVVNBVNbQtcRURVJNSU5BTCBQUk9GSUxFLLjDz/vPorbU06a1xLvYuLTP+8+iyrnTw1RfelBTX0FwVWljY19VU0FUX0NvbW1vbl9DbmYNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgIA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZ1R5cGU7ICAgICAgLyrD/MHuwODQzSy66ta1tqjS5c/qvPtVU0FUw/zB7sDg0M3P4LnYuuq2qNLlKi8gIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdFcnJDb2RlOyAgICAgLyq94sLr1rTQ0L3hufsqLw0KLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcjsgICAgICAgLyrW97avyr3D/MHuveG5ucTayN0svt/M5b3hubnTyXdNc2dUeXBlvva2qCovDQotfVRfelBTX0FwVWljY19VU0FUX1Byb2NtZF9JbmQsDQotVF96QXBVaWNjX1VTQVRfUHJvY21kX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBUX3pQU19BcE1taWFfRW52ZWxvcENtZF9SZXEoTU1JQS0tLT5VaWNjTWFuYWdlcikNCi0gysK8/rrFOg0KLSDLtcP3OiBVU0FU1tC1xEVudmVsb3Blw/zB7g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7IA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2dUeXBlOyAvKsP8we7A4NDNLLrq1rW2qNLlz+q8+1VTQVTD/MHuwODQzc/gudi66rao0uUqLyAgDQotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlcjsgIC8qRW52ZWxvcGXD/MHuxNrI3Sy+38zlveG5udPJd01zZ1R5cGW+9raoKi8NCi19VF96UFNfQXBVaWNjX1VTQVRfRW52ZWxvcENtZF9SZXEsDQotVF96QXBVaWNjX1VTQVRfRW52ZWxvcENtZF9SZXE7DQotIA0KLSAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgysK8/rrFOlpQU19BcFVpY2NfTm9wcm9jTm90aWZ5SW5kX0V2KFVpY2NNYW5hZ2VyLS0tPk1NSUEpDQotIMu1w/c6IFVTQVTD/MHu1rTQ0L3hufvOqjkwMDDKsaOsvvnJz7GotMvP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzQmFja1RvVG9wTWVudTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19VU0FUX05vcHJvY05vdGlmeV9JbmQsDQotVF96QXBVaWNjX1VTQVRfTm9wcm9jTm90aWZ5X0luZDsNCi0NCi0NCi0gLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gVF96UFNfQXBNbWlhX0VudmVsb3BDbWRfQ25mKFVpY2NNYW5hZ2VyLS0tPk1NSUEpDQotIMrCvP66xToNCi0gy7XD9zogVVNBVNbQtcRFbnZlbG9wZcP8we61xLvYuLQsxuTW0M7e0KfTpsr9vt3S1M/7z6JUX3pQU19BcFVpY2NfVVNBVF9Db21tb25fQ25mu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7IA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2dUeXBlOyAgLyrD/MHuwODQzSy66ta1tqjS5c/qvPtVU0FUw/zB7sDg0M3P4LnYuuq2qNLlKi8gIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RXJyQ29kZTsgIA0KLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdWZmZXI7ICAgLypFbnZlbG9wZcP8we672Li0xNrI3Sy+38zlveG5udPJd01zZ1R5cGW+9raoKi8NCi19VF96UFNfQXBVaWNjX1VTQVRfRW52ZWxvcENtZF9DbmYsDQotVF96QXBVaWNjX1VTQVRfRW52ZWxvcENtZF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlRfelBTX0FwVWljY19Db21tb25fQ25mIChVSUNDLT5NTUlBKQ0KLSAguabE3DpVSUNDILbUsru0psDttcTP+8+itcTNs9K7u9i4tA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qIFRoZSBzb3VyY2UgaW5kZXggICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogVGhlIGRlc3RpbmF0aW9uIGluZGV4Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgICAvKiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hJZDsgICAgICAgICAgIC8qIFRoZSBsb2dpYyBjaGFubmVsIGlkICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOyAgICAgICAgICAgIC8qILbU06YyNzAwN7TtzvPC66Osss7V1VpfQVBVSUNDX05PX0NBUkS1yL3hufvC6yAqLw0KLX1UX3pQU19BcFVpY2NfQ29tbW9uX0NuZiwNCi1UX3pBcFVpY2NfQ29tbW9uX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX0NhcmRsb2NrU3RhdHVzSW5kX0V2DQotIMu1w/c6INa4yr6/qLG7y/i78rG7veLL+A0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAvKiAweGZmICovICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIDB4ZmYgKi8gICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdHVzOyAgICAvKiDIoda1Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX0NhcmRTdGF0dXNfTG9jayANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19DYXJkU3RhdHVzX1VubG9jaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX0gVF96UFNfQXBVaWNjX0NhcmRsb2NrU3RhdHVzX0luZCwNCi1UX3pBcFVpY2NfQ2FyZGxvY2tTdGF0dXNfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julRfelBTX0FwVWljY19SZWZyZXNoSGFwcGVuX0luZA0KLSDLtcP3OiDWuMq+09C/ycTctbzWwklNU0kgtcix2NGhzsS8/rHku6+1xFJFRlJFU0ggw/zB7snPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgLyogMHhmZiAqLyAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAvKiAweGZmICovICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX0gVF96UFNfQXBVaWNjX1JlZnJlc2hIYXBwZW5fSW5kLA0KLVRfekFwVWljY19SZWZyZXNoSGFwcGVuX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pUX3pQU19BcFVpY2NfQWlyQXV0aF9JbmQNCi0gy7XD9zogILDZucjN9bao1sbQ6Mfzo6y/1dbQvPjIqNb3tq/D/MHuyc+xqKGjVUlDQ01ORyB0byBBVEkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgLyogMHhmZiAqLyAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAvKiAweGZmICovICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdXRoUGFybUxlbjsgIC8qR1NNILz4yKizpLbIzqoxNqOsVVNJTbz4yKizpLbIMzQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkF1dGhQYXJtW1pfVkNBUkRfQUlSX0FVVEhfUkVRX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07IA0KLX0gVF96UFNfQXBVaWNjX0FpckF1dGhfSW5kLA0KLVRfekFwVWljY19BaXJBdXRoX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pUX3pQU19BcFVpY2NfQWlyQXV0aFJzcF9JbmQNCi0gy7XD9zogILDZucjN9bao1sbQ6Mfzo6y/1dbQvPjIqL3hufvP7NOmICCho0FUSSB0byBVSUNDTU5HDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXV0aFJzcExlbjsgIC8qv9XW0Lz4yKi94bn7YXBkdcLrwfezpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBdXRoUnNwW1pfVkNBUkRfQUlSX0FVVEhfUlNQX0xFTl07Lyq/1dbQvPjIqL3hufthcGR1wuvB9yovDQotfSBUX3pQU19BcFVpY2NfQWlyQXV0aFJzcF9JbmQsDQotVF9BcFVpY2NfQWlyQXV0aFJzcF9JbmQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAvKiAweGZmICovICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIDB4ZmYgKi8gICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGV2S2V5SWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dDb3VudDsNCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYlJzdEFkZHI7DQotfSBUX3pQU19BcFVpY2NfT3BydFBzZGV2X0luZCwNCi1UX3pBcFVpY2NfT3BydFBzZGV2X0luZDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qIDB4ZmYgKi8gICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgLyogMHhmZiAqLyAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXZLZXlJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXJ0UmVjOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5kUmVjOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnQ291bnQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYlJzdEFkZHI7DQotfSBUX3pQU19BcFVpY2NfUmVhZERpcmVjdERldl9JbmQsDQotVF96QXBVaWNjX1JlYWREaXJlY3REZXZfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfV3JpdGVJdGVtSW5kX0V2DQotIMu1w/c6IM2ouf1wc0Rldtfp17DP+8+io6zNqNaqdWljY01uZ7340NDK/b7duPzQwg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgIHsgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVWljY0tleUlkOyAgICAvKrj80MJ1aWNjzsS8/mlko6zIoda1z+rOqnBzQ29tLmgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjTnVtOyAgICAgICAvKrj80MLOxLz+vMfCvLrFo6y1scfSvfa1sbj80MLOxLz+zqq8x8K80M3KsdPQ0KehoyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsgICANCi0gDQotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhOyAgICAgICAgIC8qtP24/NDCzsS8/sTayN2jrM7EvP694bm5zai5/WJVaWNjS2V5SWTH+LfWo6y+38zlyKHWtc6qyrW8ysq508O1xLj3aWS94bm5zOUqLw0KLX1UX3pQU19BcFVpY2NfV3JpdGVJdGVtX0luZCwgVF96UFNfQXBVaWNjX0l0ZW1EYXRhLA0KLVRfekFwVWljY19Xcml0ZUl0ZW1fSW5kLCBUX3pBcFVpY2NfSXRlbURhdGE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19VcGRhdGVJdGVtUmVxX0V2DQotIMu1w/c6ILj80MLOxLz+x+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgIHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVaWNjSWROdW07ICAgLyq0/bj80MJpZMr9xL8qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgVF96UFNfQXBVaWNjX0l0ZW1EYXRhICAgICAgICAgICAgICAgICAgICAgICAgdEl0ZW1EYXRhW1pQU19BcFVpY2NfTUFYX0lURU1fTlVNXTsNCi19VF96UFNfQXBVaWNjX1VwZGF0ZUl0ZW1fUmVxLA0KLVRfekFwVWljY19VcGRhdGVJdGVtX1JlcTsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX1VwZGF0ZUl0ZW1DbmZfRXYNCi0gy7XD9zoguPzQws7EvP7P7NOmDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCAgeyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVaWNjSWROdW07ICAvKrT9uPzQwmlkyv3EvyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1dyaXRlUmVzdWx0W1pQU19BcFVpY2NfTUFYX0lURU1fTlVNXTsgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q1rTQ0L3hufujrMih1rWyzrz7dWljY73hufvC67ao0uUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19VUERBVEVfT0u1yCovDQotfVRfelBTX0FwVWljY19VcGRhdGVJdGVtX0NuZiwNCi1UX3pBcFVpY2NfVXBkYXRlSXRlbV9DbmY7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19WZXJpZnlQaW4yUmVxX0V2DQotIMu1w/c6IMfrx/PR6dakcGluMiy/ydaxvdPNqLn9sb7P+8+i0enWpHBpbjINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgQllURSAgICAgICAgYWJQaW5bOF07ICAgICAgICAgICAvKiBQSU4ywuujrNKqx/PO3tCn19a92szus+TOqjB4ZmYgKi8NCi19VF96UFNfQXBVaWNjX1ZlcmlmeVBpbjJfUmVxLA0KLVRfekFwVWljY19WZXJpZnlQaW4yX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX1ZlcmlmeVBpbjJDbmZfRXYNCi0gy7XD9zog0enWpHBpbjK1xLvYuLTP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVzdWx0OyAgLyogyKHWtQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX1BJTl9QQVNTDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfUElOX0lOQ09SUkVDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX05FRURfVU5CTFBJTjINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19DQVJEX1dST05HDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpQU19BcFVpY2NfTk9fQ0FSRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX1UX3pQU19BcFVpY2NfVmVyaWZ5UGluMl9DbmYsDQotVF96QXBVaWNjX1ZlcmlmeVBpbjJfQ25mOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfSW5jcmVhc2VSZXFfRXYgKFBTREVWLT5VSUNDKQ0KLSDLtcP3OiBwc2RldiDH68fzaW5jcmVhc2Wy2df3DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVaWNjS2V5SWQ7ICAvKiBwc2RldrXEa2V5aWSjrMS/x7C99tans9ZBQ00gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRpbmdbM107DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3QWNjdUNvdW50OyAvKiC8xrfR1PbBvyAqLw0KLX0gVF96UFNfQXBVaWNjX0luY3JlYXNlX1JlcSwNCi1UX3pBcFVpY2NfSW5jcmVhc2VfUmVxOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfSW5jcmVhc2VBY21GYWlsSW5kX0V2IChVSUNDLT5DQykNCi0gy7XD9zogaW5jcmVhc2UgYWNtyqew3MnPsai4+ENDDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKr/VveG5uSovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19SZXNldEFjbVJlcV9FdiAoTU1JQS0+VUlDQykoVF96UFNfQXBVaWNjX0NvbW1vbl9DbmYgu9i4tCkNCi0gy7XD9zog08O7p8frx/PH5b/VYWNtDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVaWNjS2V5SWQ7ICAvKiBwc2RldrXEa2V5aWSjrMS/x7C99tans9ZBQ00gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfSBUX3pQU19BcFVpY2NfUmVzZXRBY21fUmVxLA0KLVRfekFwVWljY19SZXNldEFjbV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19acHVrUmVxX0V2KE1NSUEtPlVJQ0NNbmcpDQotIMu1w/c6ICBQVUvR6dakuabE3A0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZhYzsgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWlBTX0FwVWljY19QSU4xVFlQRTpTSU0gUFVLOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWlBTX0FwVWljY19QSU4yVFlQRTpTSU0gUFVLMg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoSWQ7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUHVrW1pQU19BcFVpY2NfTUFYX1BJTl9OVU1dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBpbltaUFNfQXBVaWNjX01BWF9QSU5fTlVNXTsNCi19VF96UFNfQXBVaWNjX1pwdWtfUmVxLA0KLVRfekFwVWljY19acHVrX1JlcTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBUF9VSUNDX0FUUl9JTkRfRVYoVUlDQ01uZy0+TU1JQSkNCi0gy7XD9zogIMnPsahBVFLQxc+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCAgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIA0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbmd0aDsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBdHJbWl9BUFVJQ0NfQVRSX01BWExFTl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfelBTX0FwVWljY19BdHJfSW5kLA0KLVRfekFwVWljY19BdHJfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFQX1VJQ0NfQ1NJTV9SRVFfRVYoTU1JQS0+VUlDQ01uZykNCi0gy7XD9zogICtjc2ltLytaU0lNx+vH88/7z6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2VxRmc7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0xlbmd0aDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQXBkdVtaX0FQVUlDQ19BUERVX1JFUV9NQVhMRU5dOyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdFR5cGU7Ly8wLVpfQVBVSUNDX0FUQ01EX0NTSU0sMS1aX0FQVUlDQ19BVENNRF9aU0lNDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19IFRfelBTX0FwVWljY19Dc2ltX1JlcSwNCi1UX3pBcFVpY2NfQ3NpbV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QVBfVUlDQ19DU0lNX0NORl9FVihVSUNDTW5nLT5NTUlBKQ0KLSDLtcP3OiAgK2NzaW0vK1pTSU272Li0z/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgDQotICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXE7ICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXFGZzsgDQotICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdMZW5ndGg7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFwZHVbWl9BUFVJQ0NfQVBEVV9DTkZfTUFaTEVOXTsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07ICAgICAgICAgICAgICAgICAgICAgICANCi19IFRfelBTX0FwVWljY19Dc2ltX0NuZiwNCi1UX3pBcFVpY2NfQ3NpbV9DbmY7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19SZWZyZXNoUmVxX0V2KE1NSUEtPlVJQ0NNbmcpKFRfelBTX0FwVWljY19Db21tb25fQ25mILvYuLQpDQotIMu1w/c6ICAgIFJlZnJlc2gguabE3A0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgVF96QXBVaWNjX1VTQVRfUmVmcmVzaENtZCAgICAgICAgIHRSZWZyZXNoOw0KLX1UX3pQU19BcFVpY2NfUmVmcmVzaF9SZXEsDQotVF96QXBVaWNjX1JlZnJlc2hfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfRmlsZUNoYW5nZV9JbmRfRVYoVUlDQ01uZy0+U1RNKQ0KLSDLtcP3OiAgICDNqNaqU1RNzsS8/rj80MLB0LHtDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGdWxsQ2hhbmdlRmc7DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiS2V5SWROdW07DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzFbMl07DQotICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd0tleUlkTGlzdFtaX0FQVUlDQ19NQVhfRklMRV9OVU1dOw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNtUGJLZXlJZE51bTsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcFBiS2V5SWROdW07DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzJbMl07DQotICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd1NtUGJLZXlJZExpc3RbWl9BUFVJQ0NfTUFYX1NNUEJfTlVNXTsNCi0gICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3QXBQYktleUlkTGlzdFtaX0FQVUlDQ19NQVhfQVBQQl9OVU1dOw0KLX1UX3pQU19BcFVpY2NfRmlsZUNoYW5nZV9JbmQsDQotVF96QXBVaWNjX0ZpbGVDaGFuZ2VfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juiAgQVBfVUlDQ19DQ0hPX1JFUV9FViAgIChBVEktPlVJQ0NNTkcpDQotIMu1w/c6ICAgK0NDSE8gtPK/qsLfvK3NqLXADQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBaWRMZW47DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWlkW1pfQVBVSUNDX01BWF9ESVJBSURfTEVOXTsNCi19VF96UFNfQXBVaWNjX0NjaG9fUmVxLA0KLVRfekFwVWljY19DY2hvX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7ogIEFQX1VJQ0NfQ0NIT19DTkZfRVYgICAoVUlDQ01ORy0+QVRJKQ0KLSDLtcP3OiAgILvYuLTC37ytzai1wLrFDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXNzaW9uSUQ7ICAgLyogttTTptPa06bTw7XEwt+8rc2otcC6xSAqLw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19DY2hvX0NuZiwNCi1UX3pBcFVpY2NfQ2Nob19DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6ICBBUF9VSUNDX0NDSENfUkVRX0VWICAgKEFUSS0+VUlDQ01ORykgKFRfelBTX0FwVWljY19Db21tb25fQ25mILvYuLQpDQotIMu1w/c6ICAgudix1cLfvK3NqLXADQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXNzaW9uSUQ7ICAgLyogttTTptPa06bTw7XEwt+8rc2otcC6xSAqLw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfelBTX0FwVWljY19DY2hjX1JlcSwNCi1UX3pBcFVpY2NfQ2NoY19SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6ICBBUF9VSUNDX0NDSENfQ05GX0VWICAgKFVJQ0NNTkctPkFUSSkNCi0gy7XD9zogICC72Li0udix1cLfvK3NqLXAusUNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcFVpY2NfQ2NoY19DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6ICBBUF9VSUNDX0NHTEFfUkVRX0VWICAgKEFUSS0+VUlDQ01ORykNCi0gy7XD9zogICDWtNDQv6jD/MHuDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXNzaW9uSUQ7DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3TGVuZ3RoOw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBcGR1W1pfQVBVSUNDX0FQRFVfUkVRX01BWExFTl07IA0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pQU19BcFVpY2NfQ0dsYV9SZXEsDQotVF96QXBVaWNjX0NHbGFfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juiAgQVBfVUlDQ19DR0xBX0NORl9FViAgIChVSUNDTU5HLT5BVEkpDQotIMu1w/c6ICAg1rTQ0L+ow/zB7s/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ICANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsgDQotICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdMZW5ndGg7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFwZHVbWl9BUFVJQ0NfQVBEVV9DTkZfTUFaTEVOXTsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOyAgICAgICAgICAgICAgICAgICAgICAgDQotfSBUX3pQU19BcFVpY2NfQ0dsYV9DbmYsDQotVF96QXBVaWNjX0NHbGFfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfQ3JzbV9SZXFfRVYoQVRJLT5VSUNDTW5nKQ0KLSDLtcP3OiAgK0NSU03H68fzz/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgeyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpZEZnOyAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYXJhbUZnOyAgICAgDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNtZDsgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlAxOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkZpZFsyXTsgIA0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQMjsgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQMzsgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGFMZW47ICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGF0aExlbjsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRGF0YVtaUFNfQXBVaWNjX01BWF9DUlNNUkVRREFUQV9MRU5dOyAvKiBUaGUgdGVybWluYWwgbWF5IHNlbmQgZnJvbSAxIHRvIDI1NSBieXRlcyBvZiBjb21tYW5kIGRhdGEgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaElkOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGF0aFtaUFNfQXBVaWNjX01BWF9QQVRIX0xFTl07ICANCi19IFRfelBTX0FwVWljY19DcnNtX1JlcSwNCi1UX3pBcFVpY2NfQ3JzbV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19DcnNtX0NuZl9FVihVSUNDTW5nLT5NTUlBKQ0KLSDLtcP3OiAgK0NSU0272Li0z/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgeyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN3MTsgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN3MjsgICAgICANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlJzcFtaUFNfQXBVaWNjX01BWF9DUlNNQ05GREFUQV9MRU5dOyAvKiBUaGUgVUlDQyBtYXkgcmV0dXJuIGFueSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJhbmdlIDEgdG8gMjU2LiAqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1JzcExlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaElkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgICANCi19IFRfelBTX0FwVWljY19DcnNtX0NuZiwNCi1UX3pBcFVpY2NfQ3JzbV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6WlBTX0FwVWljY19VU0FUX0ZldGNoX0luZF9FVihVSUNDTW5nLT5NTUlBKQ0KLSDLtcP3OiAgK0NSU0272Li0z/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgeyAgDQotICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsgICAgICAgICAgICAgICAgICAgICANCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3TGVuZ3RoOyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBcGR1W1pQU19BcFVpY2NfQVBEVV9DTkZfTUFYTEVOXTsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOyAgICANCi19IFRfelBTX0FwVWljY19VU0FUX0ZldGNoX0luZCwNCi1UX3pBcFVpY2NfVVNBVF9GZXRjaF9JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICC6r8r9vdO/2iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0guq/K/cP7s8Y6IHpBcFVpY2NfR2V0RWZJbmZvUHJvYw0KLSC6r8r9uabE3Dogu/HIoc7EvP6zpLbIoaK8x8K8yv3Qxc+iDQotIMrkICDI6zogICAgDQotICAgICAgICBiUHNJZHggINCt0unVu7rFo6zIoda1MCwxDQotICAgICAgICB3S2V5aWQgIM7EvP621NOmtcRrZXlpZA0KLSDK5CAgs/Y6IA0KLSAgICAgICAgcGJSZWNOdW0gzsS8/rzHwrzK/aOs1rjV67K7v8nOqr/Vo6y199PD1d/J6sfrxNq05g0KLSAgICAgICAgcHdSZWNMZW4gvMfCvLOktsijrNa41euyu7/Jzqq/1aOstffTw9XfyerH68TatOYNCi0gt7UgILvYOiANCi0gICAgICAgILav1/e94bn7o6zIoda1ss7V1brqtqjS5VpfQVBVSUNDX0NNRF9PS7XIDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1EV09SRCB6QXBVaWNjX0dldEVmSW5mb1Byb2MoQllURSBiUHNJZHgsIFdPUkQgd0tleWlkLCBQQllURSBwYlJlY051bSwgUFdPUkQgcHdSZWNMZW4pOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotILqvyv3D+7PGOiB6QXBVaWNjX1JlYWRGaWxlUHJvYw0KLSC6r8r9uabE3Dogzai5/WtleWlktsHIoc7EvP6jrLb+vfjWxs7EvP6jrLvy1d+8x8K80M3OxLz+vMfCvA0KLSDK5CAgyOs6IA0KLSAgICAgICAgYlBzSWR4ICDQrdLp1bu6xaOsyKHWtTAsMQ0KLSAgICAgICAgd0tleWlkICDOxLz+ttTTprXEa2V5aWQNCi0gICAgICAgIGJSZWNJZCAg0qrH87bByKG1xLzHwrzQ8rrFDQotICAgICAgICBwd1ZhbExlbiDJ6sfrcFZhbMTatOa1xLTz0KGjrNfWvdrK/Q0KLSDK5CAgs/Y6IA0KLSAgICAgICAgcHdWYWxMZW4gtsHIocTayN21xNfWvdqzpLbIo6zWuNXrsru/yc6qv9WjrLX308PV38nqx+vE2rTmDQotICAgICAgICBwVmFsICAgICC2wcihxNrI3aOs0tS94bm5zOW05tTao6zWuNXrsru/yc6qv9WjrLX308PV38nqx+vE2rTmDQotICAgICAgICANCi0gt7UgILvYOiANCi0gICAgICAgILav1/e94bn7o6zIoda1ss7V1brqtqjS5VpfQVBVSUNDX0NNRF9PS7XIDQotICAgICAgICC1sbe1u9jWtc6qT0vKsaOsyuSz9tPQ0KcuDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1EV09SRCB6QXBVaWNjX1JlYWRGaWxlUHJvYyhCWVRFIGJQc0lkeCwgV09SRCB3S2V5aWQsIEJZVEUgYlJlY0lkLCBQV09SRCBwd1ZhbExlbiwgUEJZVEUgcFZhbCk7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0guq/K/cP7s8Y6IHpBcFVpY2NfVXBkYXRlRmlsZVByb2MNCi0guq/K/bmmxNw6IM2ouf1rZXlpZLj80MLOxLz+o6y2/r341sbOxLz+o6y78tXfvMfCvNDNzsS8/rzHwrwNCi0gyuQgIMjrOiANCi0gICAgICAgIGJQc0lkeCAg0K3S6dW7usWjrMih1rUwLDENCi0gICAgICAgIHdLZXlpZCAgzsS8/rbU06a1xGtleWlkDQotICAgICAgICBiUmVjSWQgINKqx/O2wcihtcS8x8K80PK6xQ0KLSAgICAgICAgd1ZhbExlbiC4/NDCxNrI3bXE19a92rOktsgNCi0gICAgICAgIHBWYWwgICAguPzQwsTayN2jrNLUveG5uczltObU2qOs1rjV67K7v8nOqr/Vo6y199PD1d/J6sfrxNq05g0KLSDK5CAgs/Y6IA0KLSAgICAgICAgTk9ORQ0KLSC3tSAgu9g6IA0KLSAgICAgICAgtq/X973hufujrMih1rWyztXVuuq2qNLlWl9BUFVJQ0NfQ01EX09LtcgNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLURXT1JEIHpBcFVpY2NfVXBkYXRlRmlsZVByb2MoQllURSBiUHNJZHgsIFdPUkQgd0tleWlkLCBCWVRFIGJSZWNJZCwgV09SRCB3VmFsTGVuLCBjb25zdCBQQllURSBwVmFsKTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSC6r8r9w/uzxjogekFwVWljY19TZWFyY2hQc25sUmVjUHJvYw0KLSC6r8r9uabE3Dogy9HL987EvP6/1bzHwrzQ8rrFDQotIMrkICDI6zogDQotICAgICAgICBiUHNJZHggINCt0unVu7rFo6zIoda1MCwxDQotICAgICAgICB3S2V5aWQgIM7EvP621NOmtcRrZXlpZA0KLSDK5CAgs/Y6IA0KLSAgICAgICAgcGJGcmVlUmVjTnVtIL/VvMfCvMr9xL8NCi0gICAgICAgIHBGcmVlUmVjIL/VvMfCvL3hufujrNfutuDOqiBaX0FQVUlDQ19NQVhfRlJFRVJFQ19OVU0guPYNCi0gICAgICAgINa41euyu7/Jzqq/1aOstffTw9XfyerH68TatOYNCi0gt7UgILvYOiANCi0gICAgICAgIE5PTkUNCi0gy7UgIMP3Og0KLSAgICAzR8q1z9bPwsr2zsS8/rLp1dKjurLp1dLEo7DlvvnRz7jxsLTV1TMxMTAyuL3CvNbQIHByZS1wZXJzb25hbGl6YXRpb27WtQ0KLSAgICBaX0FQVUlDQ19LRVlJRF9TTVMsIFpfQVBVSUNDX0tFWUlEX1NNU1IsIFpfQVBVSUNDX0tFWUlEX0ZETiwNCi0gICAgWl9BUFVJQ0NfS0VZSURfTVNJU0ROLCBaX0FQVUlDQ19LRVlJRF9QQl9FWFQxICwgWl9BUFVJQ0NfS0VZSURfRVhUMiwNCi0gICAgWl9BUFVJQ0NfS0VZSURfRVhUNSwgWl9BUFVJQ0NfS0VZSURfUEJfVUlEXzEsICBaX0FQVUlDQ19LRVlJRF9QQl9BRE5fMSwgIA0KLSAgICBaX0FQVUlDQ19LRVlJRF9QQl9JQVBfMSwgWl9BUFVJQ0NfS0VZSURfUEJfUEJDXzEsICBaX0FQVUlDQ19LRVlJRF9QQl9HUlBfMSwgDQotICAgIFpfQVBVSUNDX0tFWUlEX1BCX0FOUkFfMSwgWl9BUFVJQ0NfS0VZSURfUEJfQU5SQl8xLCBaX0FQVUlDQ19LRVlJRF9QQl9BTlJDXzEsIA0KLSAgICBaX0FQVUlDQ19LRVlJRF9QQl9TTkVfMSwgIFpfQVBVSUNDX0tFWUlEX1BCX0VNQUlMXzEsWl9BUFVJQ0NfS0VZSURfUEJfVUlEXzIsICANCi0gICAgWl9BUFVJQ0NfS0VZSURfUEJfQUROXzIsICBaX0FQVUlDQ19LRVlJRF9QQl9JQVBfMiwgIFpfQVBVSUNDX0tFWUlEX1BCX1BCQ18yLCAgDQotICAgIFpfQVBVSUNDX0tFWUlEX1BCX0dSUF8yLCAgWl9BUFVJQ0NfS0VZSURfUEJfQU5SQV8yLCBaX0FQVUlDQ19LRVlJRF9QQl9BTlJCXzIsIA0KLSAgICBaX0FQVUlDQ19LRVlJRF9QQl9BTlJDXzIsIFpfQVBVSUNDX0tFWUlEX1BCX1NORV8yLCAgWl9BUFVJQ0NfS0VZSURfUEJfRU1BSUxfMiwNCi0gICAgWl9BUFVJQ0NfS0VZSURfUEJfVUlEXzMsICBaX0FQVUlDQ19LRVlJRF9QQl9BRE5fMywgIFpfQVBVSUNDX0tFWUlEX1BCX0lBUF8zLCAgDQotICAgIFpfQVBVSUNDX0tFWUlEX1BCX1BCQ18zLCAgWl9BUFVJQ0NfS0VZSURfUEJfR1JQXzMsICBaX0FQVUlDQ19LRVlJRF9QQl9BTlJBXzMsIA0KLSAgICBaX0FQVUlDQ19LRVlJRF9QQl9BTlJCXzMsIFpfQVBVSUNDX0tFWUlEX1BCX0FOUkNfMywgWl9BUFVJQ0NfS0VZSURfUEJfU05FXzMsICANCi0gICAgWl9BUFVJQ0NfS0VZSURfUEJfRU1BSUxfMywNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLURXT1JEIHpBcFVpY2NfU2VhcmNoUHNubFJlY1Byb2MoQllURSBiUHNJZHgsIFdPUkQgd0tleWlkLCBQQllURSBwYkZyZWVSZWNOdW0sIFBCWVRFIHBGcmVlUmVjLCBCWVRFIGJTZWFyY2hGbGcpOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotILqvyv3D+7PGOiB6QXBVaWNjX1NlYXJjaFBhdHRuUmVjUHJvYw0KLSC6r8r9uabE3Dogy9HL97f7us/K5MjrcGF0dGVybrXEvMfCvNDyusUNCi0gyuQgIMjrOiANCi0gICAgICAgIGJQc0lkeCAg0K3S6dW7usWjrMih1rUwLDENCi0gICAgICAgIHdLZXlpZCAgICDOxLz+ttTTprXEa2V5aWQNCi0gICAgICAgIGJQYXR0bkxlbiAgcGF0dGVybiCzpLbILNfutPPOqlpfQVBVSUNDX01BWF9QQVRURVJOX05VTQ0KLSAgICAgICAgcFBhdHRuVmFsICBwYXR0ZXJuINfWvdrB96Os1rjV67K7v8nOqr/Vo6y199PD1d/J6sfrxNq05g0KLSDK5CAgs/Y6IA0KLSAgICAgICAgcGJBY2NyZE51bSC3+7rPzPW8/rzHwrzK/cS/DQotICAgICAgICBwQWNjcmRWYWwgt/u6z8z1vP68x8K8veG5+6Os1+624M6qIFpfQVBVSUNDX01BWF9BQ0NPUkRSRUNfTlVNILj2LCANCi0gICAgICAgINa41euyu7/Jzqq/1aOstffTw9XfyerH68TatOajrMnqx+vE2rTmtPPQoc6qWl9BUFVJQ0NfTUFYX0FDQ09SRFJFQ19OVU0NCi0gt7UgILvYOiANCi0gICAgICAgIE5PTkUNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLVZPSUQgekFwVWljY19TZWFyY2hQYXR0blJlY1Byb2MoQllURSBiUHNJZHgsIFdPUkQgd0tleUlkLCBCWVRFIGJQYXR0bkxlbiwgY29uc3QgUEJZVEUgcFBhdHRuVmFsLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBCWVRFIHBiQWNjcmROdW0sIFBCWVRFIHBBY2NyZFZhbCk7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0guq/K/cP7s8Y6IHpBcFVpY2NfVmVyaWZ5UGluMlByb2MNCi0guq/K/bmmxNw6INHp1qRwaW4yo6zO3sew1sPM9bz+DQotIMrkICDI6zogDQotICAgICAgICBiUHNJZHggINCt0unVu7rFo6zIoda1MCwxDQotICAgICAgICBwUGluQ29kICBQSU7C66Os1+624FpfQVBVSUNDX01BWF9QSU5fTlVNILj219a92g0KLSDK5CAgs/Y6IA0KLSAgICAgICAgTk9ORQ0KLSC3tSAgu9g6IA0KLSAgICAgICAgtq/X973hufujrMih1rWyztXVuuq2qNLlWl9BUFVJQ0NfQ01EX09LtcgNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLURXT1JEIHpBcFVpY2NfVmVyaWZ5UGluMlByb2MoQllURSBiUHNJZHgsIGNvbnN0IFBCWVRFIHBQaW5Db2QpOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotILqvyv3D+7PGOiB6QXBVaWNjX1F1ZXJ5RWZTdGF0dXNQcm9jDQotILqvyv25psTcOiCy6dGvzsS8/rXEvKS77te0zKwNCi0gyuQgIMjrOiANCi0gICAgICAgIGJQc0lkeCAg0K3S6dW7usWjrMih1rUwLDENCi0gICAgICAgIHdLZXlpZCAgzsS8/rbU06a1xGtleWlkDQotIMrkICCz9jogDQotICAgICAgICBOT05FDQotILe1ICC72DogDQotICAgICAgICDOxLz+17TMrKOsyKHWtToNCi0gICAgICAgIFpfQVBVSUNDX0VGU1RBVFVTX0lOVkFMSUQgzrS8pLvuIA0KLSAgICAgICAgWl9BUFVJQ0NfRUZTVEFUVVNfUkVIQUIgICC8pLvuDQotICAgICAgICBaX0FQVUlDQ19FRlNUQVRVU19FUlJPUiC78cihyqew3A0KLSDLtSAgw/c6DQotICAgICAgICC6r8r9vfa0psDtc2lt06bTw8/CKEFETrrNQkROKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotQllURSB6QXBVaWNjX1F1ZXJ5RWZTdGF0dXNQcm9jKEJZVEUgYlBzSWR4LCBXT1JEIHdLZXlpZCk7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0guq/K/cP7s8Y6IHpBcFVpY2NfTW9kaWZ5RWZTdGF0dXNQcm9jDQotILqvyv25psTcOiDQ3rjEzsS8/te0zKwNCi0gyuQgIMjrOiANCi0gICAgICAgIGJQc0lkeCAg0K3S6dW7usWjrMih1rUwLDENCi0gICAgICAgIHdLZXlpZCAgzsS8/rbU06a1xGtleWlkDQotICAgICAgICBiTW9kZSAgINDeuMTA4NDNo6zIoda1OiAgICAgDQotICAgICAgICAgICAgICAgIFpfQVBVSUNDX0VGU1RBVFVTX0lOVkFMSUQgzrS8pLvuIA0KLSAgICAgICAgICAgICAgICBaX0FQVUlDQ19FRlNUQVRVU19SRUhBQiAgILyku+4NCi0gyuQgILP2OiANCi0gICAgICAgIE5PTkUNCi0gt7UgILvYOiANCi0gICAgICAgILav1/e94bn7o6zIoda1ss7V1brqtqjS5VpfQVBVSUNDX0NNRF9PS7XIDQotIMu1ICDD9zoNCi0gICAgICAgILqvyv299rSmwO1zaW3TptPDz8IoQUROus1CRE4pDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1EV09SRCB6QXBVaWNjX01vZGlmeUVmU3RhdHVzUHJvYyhCWVRFIGJQc0lkeCwgV09SRCB3S2V5aWQsIEJZVEUgYk1vZGUpOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotILqvyv3D+7PGOiB6QXBVaWNjX0hhc1JlY0NhY2hlDQotILqvyv25psTcOiDF0LbPzsS8/rzHwrzKx7fx09BjYWNoZQ0KLSDK5CAgyOs6IA0KLSAgICAgICAgYlBzSWR4ICDQrdLp1bu6xaOsyKHWtTAsMQ0KLSAgICAgICAgd0tleWlkICDOxLz+ttTTprXEa2V5aWQNCi0gICAgICAgIGJSZWNJZCAgvMfCvMv30v0NCi0gyuQgILP2OiANCi0gICAgICAgIE5PTkUNCi0gt7UgILvYOiANCi0gICAgICAgIDAgsru05tTao6wgMbTm1NoNCi0gy7UgIMP3Og0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotQllURSB6QXBVaWNjX0hhc1JlY0NhY2hlKEJZVEUgYlBzSWR4LCBXT1JEIHdLZXlpZCwgQllURSBiUmVjSWQpOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgILqvyv3D+yAgICCjunpVaWNjbW5nX0dldElzaW1DaElkDQotICogICAguabE3CAgICAgIKO6u/HIoWlzaW3TptPDttTTprXEzai1wGlkDQotICogICAgyuTI67LOyv0gIKO6dFRhc2tJZHggLSDQrdLp1bvKtcD9usWjrMih1rUwIG9yIDEuDQotICogICAgyuSz9rLOyv0gIKO6zt4NCi0gKiAgICC3tbvY1rXLtcP3o7rO3g0KLSAqICAgIMbky/vLtcP3ICCjug0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1leHRlcm4gIEJZVEUgelVpY2NtbmdfR2V0SXNpbUNoSWQoQllURSB0VGFza0lkeCk7DQotDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfUmVhZE5WX1VpY2NJdGVtDQotuq/K/bmmxNw6u/HIoU5W1tC05rSitcS1pb+oy6u0/VREL0xURdK7suC/qM/gudiyzsr9DQott7UgILvYOlpfQVBVSUNDX0NNRF9PS7Htyr6zybmmDQot16IgIMrNOg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLWV4dGVybiBEV09SRCB6RGV2X1JlYWROVl9VaWNjSXRlbShCWVRFIGJVaWNjS2V5SWQsIEJZVEUgYlN0YXJ0UmVjLCBCWVRFIGJFbmRSZWMsUEJZVEUgcFZhbEJ1Zik7DQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfV3JpdGVOVl9VaWNjSXRlbQ0KLbqvyv25psTcOtC0yOtOVtbQtOa0orXEtaW/qMurtP1URC9MVEXSu7Lgv6jP4LnYss7K/Q0KLbe1ICC72DrO3g0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gVk9JRCB6RGV2X1dyaXRlTlZfVWljY0l0ZW0oQllURSBiVWljY0tleUlkLCBCWVRFIGJTdGFydFJlYywgQllURSBiRW5kUmVjLFBCWVRFIHBWYWxCdWYpOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0guq/K/cP7s8Y6IHpQU19kZXZfUmVhZEl0ZW1fTm9CYWNrdXANCi0guq/K/bmmxNw6INHPuPGxo9aktsHIoS+4/NDCveG5+7rNv6jSu9bCDQotIMrkICAgIMjrOiAgICBiVWljY0tleUlkIA0KLSAgICAgICAgICAgICAgIGJTdGFydFJlYyAgICDG8Mq8vMfCvLrFLCC00zG/qsq8DQotICAgICAgICAgICAgICAgYkVuZFJlYyAgICAgINbV1rm8x8K8usUsILTTMb+qyrwgICAgICAgICAgICAgIA0KLSDK5CAgICCz9qO6ICAgIHBWYWxCdWYgICAgICDK/b7dxNq05ta41eujrNPJtffTw9XfyerH68TatOYNCi0gt7UgICAgu9ijuiAgICBEV09SRCANCi0g16IgICAgys2juiAgIMS/x7BtbWlhtffTwyBfUmVjserKtrXEzqq8x8K80M3OxLz+o6xiU3RhcnRSZWOjrGJFbmRSZWOwtMjnyc/M7tC0DQotICAgICAgICAgICAgICAgxuTL/LXEzqq2/r341sbOxLz+o6zM7tC0YlN0YXJ0UmVjPTGjrGJFbmRSZWM9MQ0KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotINDeuMTI1cbaICAgICAgICCw5rG+ICAgICAgICDQ3rjEyMsgICAgICAgINDeuMTUrdLyvLDE2sjdDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLWV4dGVybiBEV09SRCB6RGV2X1JlYWRJdGVtX05vQmFja3VwKEJZVEUgYlVpY2NLZXlJZCwgQllURSBiU3RhcnRSZWMsIEJZVEUgYkVuZFJlYywgUEJZVEUgcFZhbEJ1ZixCWVRFIGJJbmRleCk7DQotDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfVWljY1NhdmUNCi26r8r9uabE3Dogvau/qMnPzsS8/sTayN27urTm1sHK/b7dx/ijrLjDuq/K/b32zOG5qbj4dWljY01uZ8q508MuDQotyuQgIMjrOiAgICAgICAgICBCWVRFIGJVaWNjS2V5SWQsICAg0OjSqru6tOa1xFVJQ0POxLz+1NpQU0RFVtbQtcRJRKOstviyu8rHVUlDQ8Sjv+m1xEtFWUlEDQotICAgICAgICAgICAgICAgICAgICAgICAgQllURSBiTWF4UmVjLCAgINfutPO8x8K8yv2jrMjnufvKx7b+vfjWxs7EvP6jrNTyzqoxLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBCWVRFIHBWYWxCdWYsyv2+3cf41rjV67b+vfjWxs7EvP605rfFxLO49s7EvP61xMr9vt294bm5Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgILzHwrzOxLz+tOa3xc7EvP61xMO/0rvM9bzHwryjrLC00PLFxcHQLg0KLcrkICCz9jogzt4NCi23tSAgu9g6IFpfRkFJTCxaX1NVQ0MNCi3XoiAgys06ILTLuq/K/b3Tv9rWu8zhuam4+FVJQ0PEo7/ptffTww0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi3Q3rjEyNXG2iAgICCw5rG+ICAgINDeuMTIyyAg0N64xNSt0vK8sMTayN0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gQllURSB6RGV2X1VpY2NTYXZlKEJZVEUgYlVpY2NLZXlJZCwgQllURSBiTWF4UmVjLCBQQllURSBwVmFsQnVmLEJZVEUgYkluZGV4KTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9VaWNjR2V0Q2FyZEFwcFR5cGUNCi26r8r9uabE3Dogu/HIoXVpY2PK/b7dx/i1xGJDYXJkQXBwVHlwZQ0KLcrkICDI6zoNCi3K5CAgs/Y6DQott7UgILvYOkJZVEUNCi3XoiAgys06DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLdDeuMTI1cbaICAgILDmsb4gICAg0N64xMjLICDQ3rjE1K3S8rywxNrI3Q0KLQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLWV4dGVybiBCWVRFIHpEZXZfVWljY0dldENhcmRBcHBUeXBlIChCWVRFIGJJbmRleCk7DQotDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSC6r8r9w/uzxjogelBTX2Rldl9HZXRSZWNOdW0NCi0guq/K/bmmxNw6ILvxyKG/qMnPvMfCvM7EvP61xLzHwry49sr9DQotIMrkICAgIMjrOiAgICAgICAgQllURSBiVWljY0tleUlkDQotICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgYlBzSWQsICC0/bv60K3S6dW7usWjrNPQ0KfWtc6qMKOsMQ0KLSDK5CAgICCz9qO6ICAgIM7eDQotILe1ICAgILvYo7ogICAgvMfCvMr9OiC2/r341sYgMSCju7zHwrzQzSA+PTEgIKO70uyzoyAwDQotINeiICAgIMrNo7ogICANCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSDQ3rjEyNXG2iAgICAgICAgsOaxviAgICAgICAg0N64xMjLICAgICAgICDQ3rjE1K3S8rywxNrI3Q0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gQllURSB6RGV2X0dldFJlY051bShCWVRFIGJVaWNjS2V5SWQsIEJZVEUgYlBzSWQpOw0KLWV4dGVybiBWT0lEIHpEZXZfU2V0U3YoQllURSBiSW5kZXgpOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgc3Rt08PT2tDFwe64+tfZtcS907/aICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFwVWljY19HZXRJbmZvUmVxX0V2DQotIMu1w/c6IMr9vt2/4sSjv+nP8r+otsHIobXnu7CxvrvytszP+8+ivMfCvMr9DQotDQotINSt0++julpQU19BcFVpY2NfUHJlUGVyc29uUmVjU2VhcmNoUmVxX0V2DQotIMu1w/c6ICAgICCy6dXSvMfCvNDNzsS8/tbQt/u6z9Ct0ukgcHJlLXBlcnNvbmFsaXphdGlvbr2o0unWtcv509C8x8K8usUNCi0NCi0g1K3T76O6WlBTX0FwVWljY19FZlN0YXR1c1F1ZXJ5UmVxX0V2DQotIMu1w/c6ILLp0a/OxLz+17TMrKOsvLRpbnZhbGlkYXRlL3JlaGFiaWxpdGF0ZaOsuMO6r8r9vfbV67bUc2lt06bTw8/CKEFETrrNQkROKcq1z9YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3S2V5SWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmtleWlkKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcFVpY2NfR2V0SW5mb19SZXEsIFRfekFwVWljY19QcmVQZXJzblJlY1NyY2hfUmVxLCBUX3pBcFVpY2NfRWZTdGF0dXNRdWVyeV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6QXBVaWNjX0dldEluZm9DbmZfRXYNCi0gy7XD9zogyv2+3b/ixKO/6c/yv6i2wcihtee7sLG+u/K2zM/7z6K8x8K8yv21xM/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLyAgDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdLZXlJZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qa2V5aWQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjTnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlY29yZCBOdW1iZXIqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjTGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlJlY29yZCBsZW5ndGgqLw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96QXBVaWNjX0dldEluZm9fQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfUHJlUGVyc25SZWNTcmNoQ25mX0V2DQotIMu1w/c6ICAgILLp1dK8x8K80M3OxLz+1tC3+7rP0K3S6SBwcmUtcGVyc29uYWxpemF0aW9uvajS6da1y/nT0LzHwry6xQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBXT1JEICAgICAgICB3S2V5SWQ7DQotICAgIEJZVEUgICAgICAgIGJGcmVlUmVjTnVtOyAgICAgICAgLyqy6dXStb21xML61+NwcmUtcGVyc29uYWxpemF0aW9uvajS6da1vMfCvMr9yv3X6dbQ09DQp7OktsijrLLp1dLKp7Dc1PKzpLbIzqowKi8NCi0gICAgQllURSAgICAgICAgYlBhZGRpbmcxOw0KLSAgICANCi0gICAgQllURSAgICAgICAgYWJGcmVlUmVjW1pQU19BcFVpY2NfTUFYX0ZSRUVSRUNfTlVNXTsgICAgLyqy6dXStb21xML61+NwcmUtcGVyc29uYWxpemF0aW9uvajS6da1vMfCvMr9Ki8NCi0gICAgQllURSAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pBcFVpY2NfUHJlUGVyc25SZWNTcmNoX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX1BiU2VhcmNoUmVxX0V2DQotIMu1w/c6ILC01ri2qHBhdHRlcm6y6dXSt/u6z7XEvMfCvLrFLL32z94zR7+oDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFdPUkQgICAgICAgICB3S2V5SWQ7ICAgIA0KLSAgICBCWVRFICAgICAgICAgYlBhdHRlcm5MZW47DQotICAgIEJZVEUgICAgICAgICBiUGFkZGluZzE7DQotDQotICAgIEJZVEUgICAgICAgICBhYlBhdHRlcm5bWlBTX0FwVWljY19NQVhfUEFUVEVSTl9OVU1dOw0KLSAgICBCWVRFICAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pBcFVpY2NfUGJTZWFyY2hfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfUGJTZWFyY2hDbmZfRXYNCi0gy7XD9zogsLTWuLaoxNrI3bLp1dK1vbXEy/nT0LzHwrwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgV09SRCAgICAgICAgd0tleUlkOw0KLSAgICBCWVRFICAgICAgICBiQWNjb3JkTnVtOyAgICAgICANCi0gICAgQllURSAgICAgICAgYlBhZGRpbmcxOw0KLSAgICANCi0gICAgQllURSAgICAgICAgYWJBY2NvcmRSZWNbWlBTX0FwVWljY19NQVhfQUNDT1JEUkVDX05VTV07ICANCi0gICAgQllURSAgICAgICAgYlBhZGRpbmcyOw0KLX1UX3pBcFVpY2NfUGJTZWFyY2hfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfRWZTdGF0dXNRdWVyeUNuZl9Fdg0KLSDLtcP3OiCy6dGvzsS8/te0zKzP7NOmo6y8tGludmFsaWRhdGUvcmVoYWJpbGl0YXRlo6y4w7qvyv299tXrttRzaW3TptPDz8IoQUROus1CRE4pyrXP1g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgYkVmU3RhdHVzOyAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX0VmU3RhdHVzX0lOVkFMSUQgICDOxLz+aW52YWxpZGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaUFNfQXBVaWNjX0VmU3RhdHVzX1JFSEFCICAgIM7EvP5yZWhhYmlsaXRhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19FZlN0YXR1c19FUlJPUiAgICAgILLp0a+07c7zKi8NCi0gICAgQllURSAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96QXBVaWNjX0VmU3RhdHVzUXVlcnlfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpQU19BcFVpY2NfRWZTdGF0dXNNb2RpZnlSZXFfRXYNCi0gy7XD9zoguPy4xM7EvP7XtMyso6zKuc7EvP5pbnZhbGlkYXRlL3JlaGFiaWxpdGF0ZSy4w7qvyv299tXrttRzaW3TptPDz8IoQUROus1CRE4pyrXP1g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBXT1JEICAgICAgICAgd0tleUlkOw0KLSAgICBCWVRFICAgICAgICAgYk1vZGU7ICAgIC8qWlBTX0FwVWljY19FZlN0YXR1c01vZGlmeV9JTlZBTElEICAgyrnOxLz+aW52YWxpZGF0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FwVWljY19FZlN0YXR1c01vZGlmeV9SRUhBQiAgICDKuc7EvP5yZWhhYmlsaXRhdGUqLw0KLSAgICBCWVRFICAgICAgICBiUGFkZGluZzsNCi19VF96QXBVaWNjX0VmU3RhdHVzTW9kaWZ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7paUFNfQXBVaWNjX0VmU3RhdHVzTW9kaWZ5Q25mX0V2DQotIMu1w/c6ILj8uMTOxLz+17TMrM/s06YsuMO6r8r9vfbV67bUc2lt06bTw8/CKEFETrrNQkROKcq1z9YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsgICAgDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RXJyQ29kZTsgIC8q1rTQ0L3hufvC66Osss68+3VpY2PNt87EvP62qNLlKi8NCi19VF96QXBVaWNjX0VmU3RhdHVzTW9kaWZ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pBUF9VSUNDX1JFQURfRUlEX1JFUV9FVihBVEktPlVpY2NNbmdlcikNCi0gy7XD9zogQVRJx+vH87bByKG/qNbQtcRFSUQgzsS8/g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgIGFiUGFkZGluZ1syXTsNCi19VF96UFNfQXBVaWNjX1JlYWRfRWlkX1JlcSwNCi1UX3pBcFVpY2NfUmVhZF9FaWRfUmVxOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++jukFQX1VJQ0NfUkVBRF9FSURfQ05GX0VWKFVpY2NNYW5hZ2VyLT5BVElJKQ0KLSDLtcP3OiC2wcfrx/O1xM/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgYWJFaWRbWl9BUFVJQ0NfRUlEX0xFTl07ICAgICAgICANCi19VF96UFNfQXBVaWNjX1JlYWRfRWlkX0NuZiwNCi1UX3pBcFVpY2NfUmVhZF9FaWRfQ25mOw0KLQ0KLQ0KLQ0KLSNlbmRpZiAgLyogQVBfVUlDQ19JTlRFUkZBQ0VfSCAqLw0KLQ0KLSAgIA0KZGlmZiAtLWdpdCBhL1Vib290L2NwL3BzL21vZGVtL3BzL2luYy9hdGlwc2NvbS5oIGIvVWJvb3QvY3AvcHMvbW9kZW0vcHMvaW5jL2F0aXBzY29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyNTYwYmEuLjAwMDAwMDAKLS0tIGEvVWJvb3QvY3AvcHMvbW9kZW0vcHMvaW5jL2F0aXBzY29tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSqw5rG+y/nT0CAoQykyMDE21tDQy82o0ba5ybfd09DP3rmry74NCi0qxKO/6cP7Og0KLSrOxLz+w/s6YXRpcHNjb20uaA0KLSrKtc/WuabE3DphdGnKudPDtcS5q7myvdO/2g0KLSqw5rG+OlYxLjANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZuZGVmICAgWlBTX0FUSV9DT01fSA0KLSNkZWZpbmUgICBaUFNfQVRJX0NPTV9IDQotDQotI2luY2x1ZGUgInBzLmgiDQotI2luY2x1ZGUgInBzdHJhY2VpbnQuaCINCi0jaW5jbHVkZSAiYXRpcHNldmVudC5oIg0KLSNpbmNsdWRlICJhdGlwc2Vycm9yLmgiDQotDQotLyojaWYgZGVmaW5lZCAoX1VTRV9TSUdfVFJBQ0UpIHx8IGRlZmluZWQgKF9VU0VfRVhDUF9UUkFDRSkqLw0KLSNpbmNsdWRlICJUcmFjZVNoYXJlLmgiDQotLyojZW5kaWYqLw0KLQ0KLSNpZmRlZiBQU19SQVRfR1NNDQotI2luY2x1ZGUgInByb2NfaWQuaCINCi0jaW5jbHVkZSAic2lnX2NvZGUuaCINCi0jZW5kaWYNCi0NCi0jZGVmaW5lIFpfSW1zaUxlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9UbXNpTGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX1B0bXNpTGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKirUy9Oqycy2qNLlKioqKioqKioqKioqKioqKioqKioqLw0KLS8qMNLGtq+jrDG159DFo6wywarNqKOsM8bky/sqLw0KLSNkZWZpbmUgWl9PUEVSX0NNQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9PUEVSX0NUQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9PUEVSX1VOSUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9PUEVSX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qVjItVjPD+9fWvObI3WJlZ2luKi8NCi0jZGVmaW5lIFpfSW1laUxlbiBaUFNfSW1laUxlbg0KLSNkZWZpbmUgWl9JbWVpU3ZMZW4gWlBTX0ltZWlTdkxlbg0KLSNkZWZpbmUgWl9ERVZfTVNJTkZPX01BWF9CT1JETkFNRV9MRU4gWlBTX0RFVl9NU0lORk9fTUFYX0JPUkROQU1FX0xFTg0KLSNkZWZpbmUgWl9ERVZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9MRU4gWlBTX0RFVl9NU0lORk9fTUFYX1NPRlRWRVJTSU9OX0xFTg0KLSNkZWZpbmUgWl9ERVZfTVNJTkZPX01BWF9FUVVJUE5BTUVfTEVOIFpQU19ERVZfTVNJTkZPX01BWF9FUVVJUE5BTUVfTEVODQotDQotLyo9PT09PT09PT09PT09PT09PT09UERQyc/Pws7Ez+C52Lrq1rU9PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUFYX0FQTl9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMDANCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWF9QRFBBRERSX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjANCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWF9DSEFMTEVOR0VfTEVOICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgLyrL5rv6yv2zpLbIKi8gICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUFYX0hBU0hfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNiAgLypIQVNIILOktsgqLw0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUFYX1NUUl9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2NCAgIC8qQVBOvPjIqNfutPOzpLbI19a3+7SuKi8NCi0jZGVmaW5lIFpfTUFYX0NJRF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLQ0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUlOSU5VTV9DSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0RFVl9BdE1lbV9NSU5JTlVNX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWElOVU1fRklMVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYNCi0jZGVmaW5lIFpfREVWX0F0TWVtX0NJRF9CQVNFSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUlOSU5VTV9URkFESUQgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0RFVl9BdE1lbV9NSU5JTlVNX0VTTV9GSUxURVIgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWElOVU1fRVNNX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fVEZBRElEX0JBU0VJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT0gIEF0TWVttOa0osr9vt266rao0uUgID09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX0RFVl9BdE1lbV9DT05UWFRfRmlyc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgLyog0ru0ziAqLw0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fQ09OVFhUX1NlY25kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIC8qILb+tM4gKi8NCi0NCi0jZGVmaW5lIFpfREVWX0F0TWVtX1BEUF9Ob3REZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAvKiDOtLao0uUgKi8NCi0jZGVmaW5lIFpfREVWX0F0TWVtX1BEUF9EZWZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAvKiDS0bao0uUgKi8NCi0NCi0jaWZkZWYgX1VTRV9MVEVfR0NGDQotI2RlZmluZSBaX0RFVl9BdE1lbV9NQVhfQ0lEX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWElOVU1fQ0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fQ0lEX01BWElOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk3DQotI2RlZmluZSBaX0RFVl9BdE1lbV9NQVhfVEZBRElEX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWElOVU1fVEZBRElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fVEZBRElEX01BWElOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk3DQotI2Vsc2UNCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWF9DSURfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUFYSU5VTV9DSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX0RFVl9BdE1lbV9DSURfTUFYSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfREVWX0F0TWVtX01BWF9URkFESURfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fTUFYSU5VTV9URkFESUQgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX0RFVl9BdE1lbV9URkFESURfTUFYSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZW5kaWYNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PdTL06rJzM/gudjQxc+iuurWtT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01BWF9NRV9PUEVSX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTY0IC8qTlbW0E1F1MvTqsnM0MXPotfcs6S2yKOssrvUytDtuMS2ryovDQotI2RlZmluZSBaX01BWF9ORVRfT1BFUl9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEyIC8qTlbW0M34wue31sXk1MvTqsnM0MXPotfcs6S2yKOssrvUytDtuMS2ryovDQotI2RlZmluZSBaX01BWF9MT05HTkFNRV9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTY0IC8q1MvTqsnMs6TD+zI3MDA30K3S6bnmtqjX7rOkMTajrLK71MrQ7bjEtq8qLw0KLSNkZWZpbmUgWl9NQVhfU0hPUlROQU1FX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2NCAvKtTL06rJzLbMw/syNzAwN9Ct0um55rao1+6zpDijrLK71MrQ7bjEtq8qLw0KLSNkZWZpbmUgWl9NQVhfT1BFUkFURV9QTE1OTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1MCAvKlBMTU5JRMr9wb8qLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PSAgy9HN+M/gudi66rao0uUgID09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01heFVpY2NQbG1uTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMwICAgICAgICAvKlVJQ0O/qNbQ1+6087TmtKJPUExNTi9VUExNTi9IUExNTrj2yv0qLw0KLSNkZWZpbmUgWl9NYXhVaWNjRlBsbW5OdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4NSAgICAgICAgLypVSUNDv6jW0NfutPO05rSiRlBMTU649sr9Ki8NCi0jZGVmaW5lIFpfTWF4RmJkTGFpTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAgICAgICAgIC8qvfvWuUxBSbj2yv0qLw0KLSNkZWZpbmUgWl9NYXhVaWNjUGxtblNlbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4NSAgICAgICAgIC8qUGxtblNlbNbQUExNTrj2yv0s1K3PyM6qMTYqLw0KLSNkZWZpbmUgWl9NYXhQb3NzaWJsZVBsbW5OdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgICAgICAgLyq/ydPDUExNTrj2yv0qLw0KLSNkZWZpbmUgWl9NYXhTbXNwQWxwaGFMZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTIgICAgICAvKtStz8jOqjgqLw0KLS8qPT09PT09PT09Pc/6wb/Ns7zGt/7O8cb30/LD+9futPOzpLbIPT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9ERVZfU0VMTFNUQVRfTUFYX0RPTUFJTl9MRU4gICAgICAgICAgICAgICAgICAoQllURSkxMjgNCi0NCi0vKj09PT09PT09PT09PT09PT09PdfutPPQxbrFuPE9PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTUFYX1NJR05BTF9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT0gy/jQocf408O1vbXEuurWtSA9PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTUFYX05VQ2VsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwICAgICAgICAgLypURC9XwdrH+NfutPO49sr9Ki8NCi0jZGVmaW5lIFpfTUFYX05HQ2VsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwICAgICAgICAgLypHU03B2sf41+6087j2yv0qLw0KLSNkZWZpbmUgWl9NQVhfTkxDZWxsTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAgICAgICAgICAvKkxURcHax/jX7rTzuPbK/SovDQotDQotLyo9PT09PT09PT09PT09PT09PT3Uy9OqyczGtbbO0MXPoj09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NQVhfT1BFUkFUT1JfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgICAvKiC/ycXk1sPUy9OqyczX7rTzuPbK/SAqLw0KLSNkZWZpbmUgWl9NQVhfT1BFUkFUT1JfUExNTl9OVU0gICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwICAvKiDDv7j21MvTqsnMz8K/ycXk1sNQTE1OINfutPO49sr9Ki8NCi0jZGVmaW5lIFpfTUFYX09QRVJBVE9SX0JBTkRfTlVNICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMCAgLyogw7+49tTL06rJzM/Cv8nF5NbDTFRFxrW2ziDX7rTzuPbK/SovDQotDQotI2RlZmluZSBaX01BWF9PUEVSQVRPUl9GUkVRX05VTSAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOCAgLyogw7+49tTL06rJzM/Cv8nF5NbDTFRFs6PTw8a1teMg1+6087j2yv0qLw0KLQ0KLSNkZWZpbmUgWl9BVF9NQVhfUlBJX05SICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBXX01BWF9CQU5EX1JQSV9TVVBQT1JUICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIEdTTV9NQVhfQkFORF9SUElfU1VQUE9SVCAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgTFRFX01BWF9CQU5EX1JQSV9TVVBQT1JUICAgICAgICAgICAgICAgICAoQllURSkxMg0KLQ0KLSNkZWZpbmUgWl9NQVhfTFRFX0JMS0NFTExfTlVNICAgICAgICAgICAgKEJZVEUpNQ0KLQ0KLSNkZWZpbmUgWl9ERVZfTUFYX0JFRVBDQUxMX05VTSAgICAgICAgICAgICAgICAgIChCWVRFKTExDQotI2RlZmluZSBaX0RFVl9NQVhfQkVFUENBTExfR1JPVVAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLSNkZWZpbmUgWl9ERVZfTUFYX0VDQUxMX05VTSAgICAgICAgICAgICAgICAgIChCWVRFKTExDQotDQotI2RlZmluZSBaX0RFVl9NQVhfTVNJU0ROX05VTSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUNCi0NCi0jaWZkZWYgX1VTRV9MUFBfRUNJRA0KLSNkZWZpbmUgWl9NQVhfRUNJRF9ORU1BU1RSX0xFTiAgICAgICAgICAgICAgICAgIChCWVRFKTIyDQotI2VuZGlmDQotDQotI2lmZGVmIEJUUlVOS19TVVBQT1JUDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT0gIFB0dLyvyLrP4LnYID09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01BWF9CQ0RfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwDQotI2RlZmluZSBaX01BWF9HUk9VUF9JTkZPX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwMQ0KLSNkZWZpbmUgWl9NQVhfR1JPVVBfTkFNRV9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzMg0KLSNkZWZpbmUgWl9NQVhfU0NBTkdST1VQX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogINfutPPJqMPo1+m49sr9MjAqLw0KLQ0KLS8qMKO6zerIq8mow+i5psTcIDGjurK/t9bJqMPouabE3CAyo7q52LHVyajD6LmmxNw6Ki8NCi0jZGVmaW5lIFpfRlVMTF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICAgICANCi0jZGVmaW5lIFpfUEFSVF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9DTE9TRV9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotDQotLyoxo7pSMbDmsb4gMqO6UjKw5rG+IDOjulIzsOaxvjoqLw0KLSNkZWZpbmUgWl9SMV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxICAgICAgIA0KLSNkZWZpbmUgWl9SMl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX1IzX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PSAgUHR0vK/Ius/gudggPT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZW5kaWYNCi0NCi0vKiBDQlMo0Oi6zWFwTW1pYUludC5o1tBDQlOyv7fWuuq2qNLlsaOz1tK71sIpICovDQotI2RlZmluZSBaX0RFVl9BdE1lbV9DQlNfTUFYX1NJTkdFTF9NSURfTlVNICAgICAgICAgICAgICAgICAgIChCWVRFKTMyIC8qtaW49sno1sNNZXNzYWdlSWS1xNfutuC49sr9Ki8NCi0jZGVmaW5lIFpfREVWX0F0TWVtX0NCU19NQVhfUkFOR0VfTUlEX05VTSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTAgLyq3ts6nyejWw01lc3NhZ2VJZLXE1+624Lj2yv0qLw0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fQ0JTX01BWF9NSURfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9ERVZfQXRNZW1fQ0JTX01BWF9TSU5HRUxfTUlEX05VTSArIFpfREVWX0F0TWVtX0NCU19NQVhfUkFOR0VfTUlEX05VTSArIDEpDQotDQotI2RlZmluZSBaX0RFVl9BdE1lbV9DQlNfTUFYX1NJTkdFTF9EQ1NfTlVNICAgICAgICAgICAgICAgICAgIChCWVRFKTE2ICAgLyq1pbj2yejWw0RhdGFDb2RpbmdTY2hlbWW1xNfutuC49sr9Ki8NCi0jZGVmaW5lIFpfREVWX0F0TWVtX0NCU19NQVhfUkFOR0VfRENTX05VTSAgICAgICAgICAgICAgICAgICAgKEJZVEUpNSAgICAvKre2zqfJ6NbDRGF0YUNvZGluZ1NjaGVtZbXE1+624Lj2yv0qLw0KLSNkZWZpbmUgWl9ERVZfQXRNZW1fQ0JTX01BWF9EQ1NfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9ERVZfQXRNZW1fQ0JTX01BWF9TSU5HRUxfRENTX05VTSArIFpfREVWX0F0TWVtX0NCU19NQVhfUkFOR0VfRENTX05VTSArIDEpDQotDQotI2RlZmluZSBaX0RFVl9OVl9BTVRMVEVCQU5EX05VTSAgICAgICAgICAgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgWl9ERVZfTlZfQU1URkREQkFORF9OVU0gICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9ERVZfTlZfQU1UVEREQkFORF9OVU0gICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9ERVZfTlZfQU1UR1NNQkFORF9OVU0gICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PSDP+sG/zbO8xs/gudi66rao0uUgPT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSAgWl9ERVZfTlZfU2VsbFN0YXRfUEFDS1NFTkRfVkFMSUQgICAgICAgICAgICAgICAgICAoQllURSkxICAvKs/6wb/Ns7zGSVCw/MjUv8m3osvNKi8NCi0jZGVmaW5lICBaX0RFVl9OVl9TZWxsU3RhdF9QQUNLU0VORF9JTlZBTElEICAgICAgICAgICAgICAgIChCWVRFKTAgIC8qz/rBv82zvMZJULD8t6LLzdLRyLfIz7vyt6LLzdfctM7K/dLRs6y5/cnPz94qLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkFUSbbB0LROVsv30v3WtSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUgWl9BVElfTlZfUHNBdHRTdGF0ZTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FUSV9OVl9Qc0F0dFN0YXRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9Qc0F0dFN0YXRlMSsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfQ2lkUGRwQ29udGV4dDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1BzQXR0U3RhdGUyKzEpDQotI2RlZmluZSBaX0FUSV9OVl9DaWRQZHBDb250ZXh0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfQ2lkUGRwQ29udGV4dDErMSkNCi0jZGVmaW5lIFpfQVRJX05WX0x0ZUxjQ2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0NpZFBkcENvbnRleHQyKzEpDQotI2RlZmluZSBaX0FUSV9OVl9Qc1NlcnZPdXRQYXJhbSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9MdGVMY0NmZysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRnJvcEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfUHNTZXJ2T3V0UGFyYW0rMSkNCi0jZGVmaW5lIFpfQVRJX05WX0NvcHNNb2RlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0Zyb3BJbmZvKzEpDQotI2RlZmluZSBaX0FUSV9OVl9Db3BzTW9kZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9Db3BzTW9kZTErMSkNCi0jZGVmaW5lIFpfQVRJX05WX1dMY0NmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0NvcHNNb2RlMisxKQ0KLSNkZWZpbmUgWl9BVElfTlZfVExjQ2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfV0xjQ2ZnKzEpDQotI2RlZmluZSBaX0FUSV9OVl9HTGNDZmcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfVExjQ2ZnKzEpDQotI2RlZmluZSBaX0FUSV9OVl9HTGNDZmcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfR0xjQ2ZnMSsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRW1ibXNTdGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfR0xjQ2ZnMisxKQ0KLSNkZWZpbmUgWl9BVElfTlZfU2VyUGxtblNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfRW1ibXNTdGF0KzEpDQotI2RlZmluZSBaX0FUSV9OVl9CYW5kVHJhbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9TZXJQbG1uU2V0KzEpDQotI2RlZmluZSBaX0FUSV9OVl9Hc21TaWduYWxib3hDZmcgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9CYW5kVHJhbnMrMSkNCi0jZGVmaW5lIFpfQVRJX05WX1RkU2lnbmFsYm94Q2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0dzbVNpZ25hbGJveENmZysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfV1NpZ25hbGJveENmZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfVGRTaWduYWxib3hDZmcrMSkNCi0jZGVmaW5lIFpfQVRJX05WX0x0ZVNpZ25hbGJveENmZyAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1dTaWduYWxib3hDZmcrMSkNCi0jZGVmaW5lIFpfQVRJX05WX0x0ZUFjdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0x0ZVNpZ25hbGJveENmZysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTHRlQWN0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTHRlQWN0MSsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTWVPcGVyUGxtbklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTHRlQWN0MisxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTmV0T3BlclBsbW5JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTWVPcGVyUGxtbklEKzEpDQotI2RlZmluZSBaX0FUSV9OVl9TZWxsU3RhdDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTmV0T3BlclBsbW5JRCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfU2VsbFN0YXQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1NlbGxTdGF0MSsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRXVkb0ZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfU2VsbFN0YXQyKzEpDQotI2RlZmluZSBaX0FUSV9OVl9NYXhUeFBvd2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9FdWRvRlIrMSkNCi0jZGVmaW5lIFpfQVRJX05WX0x0ZUJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX01heFR4UG93ZXIrMSkNCi0jZGVmaW5lIFpfQVRJX05WX0x0ZUJhbmRCYWNrVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0x0ZUJhbmQrMSkNCi0jZGVmaW5lIFpfQVRJX05WX1VlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0x0ZUJhbmRCYWNrVXArMSkNCi0jZGVmaW5lIFpfQVRJX05WX0dzbUJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1VlSW5mbysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfR3NtQmFuZEJhY2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfR3NtQmFuZCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfVGRkQmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfR3NtQmFuZEJhY2t1cCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfVGRkQmFuZEJhY2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfVGRkQmFuZCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRmRkQmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfVGRkQmFuZEJhY2t1cCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRmRkQmFuZEJhY2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfRmRkQmFuZCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfR3Byc0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfRmRkQmFuZEJhY2t1cCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRmRTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfR3Byc0NsYXNzKzEpDQotI2RlZmluZSBaX0FUSV9OVl9FZ3Byc1NldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9GZFNldCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfQXBNZW1DYXBhMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0VncHJzU2V0KzEpDQotI2RlZmluZSBaX0FUSV9OVl9BcE1lbUNhcGEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfQXBNZW1DYXBhMSsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfU3lzY29uZmlnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0FwTWVtQ2FwYTIrMSkNCi0jZGVmaW5lIFpfQVRJX05WX1N5c2NvbmZpZzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9TeXNjb25maWcxKzEpDQotI2RlZmluZSBaX0FUSV9OVl9FUERDUFRpbWVyTGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfU3lzY29uZmlnMisxKQ0KLSNkZWZpbmUgWl9BVElfTlZfQmxhY2tXaGl0ZUxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0VQRENQVGltZXJMZW4rMSkNCi0jZGVmaW5lIFpfQVRJX05WX0dyckNlbGxCYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9CbGFja1doaXRlTGlzdCsxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTmNlbGxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0dyckNlbGxCYXIrMSkNCi0jZGVmaW5lIFpfQVRJX05WX09wZXJhdG9yTHRlQmFuZEluZm8gICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9OY2VsbEluZm8rMSkNCi0jZGVmaW5lIFpfQVRJX05WX1JQSUNmZ0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9PcGVyYXRvckx0ZUJhbmRJbmZvKzEpDQotI2RlZmluZSBaX0FUSV9OVl9OaXR6VXBkYXRlQ2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfUlBJQ2ZnSW5mbysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfVU1UU0FNUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX05pdHpVcGRhdGVDZmcrMSkNCi0jZGVmaW5lIFpfQVRJX05WX01vYmlsZUluZm9DZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9VTVRTQU1SKzEpDQotI2RlZmluZSBaX0FUSV9OVl9VZUNhcGFDZmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTW9iaWxlSW5mb0NmZysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfWkxjQ2ZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1VlQ2FwYUNmZysxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTHRlQmxrQ2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1pMY0NmZyArIDEpDQotI2RlZmluZSBaX0FUSV9OVl9DbWdmTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTHRlQmxrQ2VsbCArIDEpDQotI2RlZmluZSBaX0FUSV9OVl9DdXN0b21NY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfQ21nZk1vZGUgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfQmVlcENhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0N1c3RvbU1jYyArIDEpDQotI2RlZmluZSBaX0FUSV9OVl9Nc2lzZG4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfQmVlcENhbGwgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfTXNpc2RuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX01zaXNkbjEgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRWNhbGxDYXBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX01zaXNkbjIgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfRWNhbGxOdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0VjYWxsQ2FwYSArIDEpDQotI2RlZmluZSBaX0FUSV9OVl9FY2FsbFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfRWNhbGxOdW0gKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfUnJjU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX0VjYWxsVGltZSArIDEpDQotI2lmZGVmIEJUUlVOS19TVVBQT1JUDQotI2RlZmluZSBaX0FUSV9OVl9QdHRUcnVuY1VzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfUnJjU3RhdHVzICsgMSkNCi0jZGVmaW5lIFpfQVRJX05WX1B0dElPVEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0FUSV9OVl9QdHRUcnVuY1VzZXIgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfUHR0U3ViV2F5RmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1B0dElPVEZsYWcgKyAxKQ0KLSNkZWZpbmUgWl9BVElfTlZfUHJ2RW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX1B0dFN1YldheUZsYWcgKyAwKQ0KLSNlbHNlDQotI2RlZmluZSBaX0FUSV9OVl9QcnZFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfUnJjU3RhdHVzICsgMCkNCi0jZW5kaWYNCi0NCi0NCi0jZGVmaW5lIFpfQVRJX05WX01JWEJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfUHJ2RW5kICsgMSkNCi0jZGVmaW5lIFpfQVRJX05WX01zSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BVElfTlZfTUlYQmFzZSArIDEpDQotI2RlZmluZSBaX0FUSV9OVl9NSVhFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQVRJX05WX01zSW5mbyArIDApDQotDQotLyo9PT09PT09PT09PT09PT09ICDQrdLp1btBdE1lbc/gudjK/b7dy/fS/brqtqjS5SAgPT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX0F0TWVtX0lEX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgICAgICAgDQotI2RlZmluZSBaX0F0TWVtX0lEX01taWFQcnZ0TWVtICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfQkFTRSArIDApDQotI2RlZmluZSBaX0F0TWVtX0lEX0N2bW9kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0F0TWVtX0lEX01taWFQcnZ0TWVtKzEpDQotI2RlZmluZSBaX0F0TWVtX0lEX0NlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0F0TWVtX0lEX0N2bW9kICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfU21zT3ZlcklwTmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfQ2Vtb2RlICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfQ21vZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfU21zT3ZlcklwTmV0ICsgMSkgIA0KLSNkZWZpbmUgWl9BdE1lbV9JRF9DYnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9DbW9kICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfQ2FsbExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfQ2JzdCArIDEpDQotI2RlZmluZSBaX0F0TWVtX0lEX0ZjbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0F0TWVtX0lEX0NhbGxMaW5lICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfQ3NucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfRmNsYXNzICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfQXV0b1JzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9Dc25zICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfQ25taSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfQXV0b1JzcCArIDEpDQotI2RlZmluZSBaX0F0TWVtX0lEX0NybHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKShaX0F0TWVtX0lEX0NubWkgKyAxKQ0KLSNkZWZpbmUgWl9BdE1lbV9JRF9Dc2NiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9DcmxwICsgMSkNCi0jaWZkZWYgX1VTRV9MUFBfRUNJRA0KLSNkZWZpbmUgWl9BdE1lbV9JRF9Nb0xyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9Dc2NiICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfU21DaWREYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfTW9MciArIDEpDQotI2Vsc2UNCi0jZGVmaW5lIFpfQXRNZW1fSURfU21DaWREYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9Dc2NiICsgMSkNCi0jZW5kaWYNCi0jZGVmaW5lIFpfQXRNZW1fSURfRXNtRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfU21DaWREYXRhICsgMSkNCi0jZGVmaW5lIFpfQXRNZW1fSURfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpWl9BdE1lbV9JRF9Fc21EYXRhDQotDQotI2lmZGVmIF9VU0VfTFBQX0VDSUQNCi0jZGVmaW5lIFpfQXRNZW1fQXRDbWRfTUFYSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfTW9MciArIDEpICAvKkF0w/zB7s/gudijqLP9U028sEVTTbbgQ0lEo6nK/dfp1+6088nPz94qLw0KLSNkZWZpbmUgWl9BdE1lbV9BdENtZF9MQVNUSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9Nb0xyICsgMCkgICAgICAvKkF0w/zB7s/gudijqLP9U028sEVTTbbgQ0lEo6lMYXN0ICBBdE1lbSBJZCovDQotI2Vsc2UNCi0jZGVmaW5lIFpfQXRNZW1fQXRDbWRfTUFYSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpKFpfQXRNZW1fSURfQ3NjYiArIDEpICAvKkF0w/zB7s/gudijqLP9U028sEVTTbbgQ0lEo6nK/dfp1+6088nPz94qLw0KLSNkZWZpbmUgWl9BdE1lbV9BdENtZF9MQVNUSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkoWl9BdE1lbV9JRF9Dc2NiICsgMCkgICAgICAvKkF0w/zB7s/gudijqLP9U028sEVTTbbgQ0lEo6lMYXN0ICBBdE1lbSBJZCovDQotI2VuZGlmDQotDQotLyo9PT09PT09PT09PT09PT09ICDQrdLp1bvE2sSjv+m2waGi0LRVSUNDv6jK/b7dy/fS/brqtqjS5SAgPT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfVWljY0lkX0ZJUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKVpfVWljY0lkX1NIUFBMTU5fVElNRV9CSU4NCi0jZGVmaW5lIFpfVWljY0lkX1NIUFBMTU5fVElNRV9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfVWljY0lkX0hQTE1OX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIA0KLSNkZWZpbmUgWl9VaWNjSWRfRlBMTU5fQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9VaWNjSWRfVVBMTU5fQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9VaWNjSWRfT1BMTU5fQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9VaWNjSWRfU01TUF9SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9VaWNjSWRfU01TU19CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNiAgICANCi0jZGVmaW5lIFpfVWljY0lkX0VNTFBQX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcgICAgDQotI2RlZmluZSBaX1VpY2NJZF9BQUVNX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4ICAgIA0KLSNkZWZpbmUgWl9VaWNjSWRfRUNDX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOSAgICANCi0jZGVmaW5lIFpfVWljY0lkX0xPQ0lfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwDQotI2RlZmluZSBaX1VpY2NJZF9QU0xPQ0lfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMQ0KLSNkZWZpbmUgWl9VaWNjSWRfQUNDX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTINCi0jZGVmaW5lIFpfVWljY0lkX0NFTExJTkZPX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEzDQotI2RlZmluZSBaX1VpY2NJZF9DU0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNA0KLSNkZWZpbmUgWl9VaWNjSWRfUFNLRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUgIC8qQ0svSUsvS0MqLyAgICAgICAgDQotI2RlZmluZSBaX1VpY2NJZF9DU0tTSV9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNiAgLypDSy9JSy9LQyovDQotI2RlZmluZSBaX1VpY2NJZF9QU0tTSV9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNyAgLyrQtEtTSSovDQotI2RlZmluZSBaX1VpY2NJZF9DU0NLU05fQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxOCAgLyrQtEtTSSovICANCi0jZGVmaW5lIFpfVWljY0lkX1BTQ0tTTl9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE5ICAvKtC0Q0tTTiovDQotI2RlZmluZSBaX1VpY2NJZF9TVEFSVF9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgLyrQtENLU04qLw0KLSNkZWZpbmUgWl9VaWNjSWRfVUlDQ19BUFBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjENCi0jZGVmaW5lIFpfVWljY0lkX1VJQ0NfU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIyDQotI2RlZmluZSBaX1VpY2NJZF9BRF9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyMw0KLSNkZWZpbmUgWl9VaWNjSWRfUExNTlNFTF9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjQNCi0jZGVmaW5lIFpfVWljY0lkX1NJTUJDQ0hfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1IC8qILbB0LRzaW3TptPDYmNjaCovDQotI2RlZmluZSBaX1VpY2NJZF9JTVNJX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNg0KLSNkZWZpbmUgWl9VaWNjSWRfVEhSRVNIT0xEX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjcNCi0jZGVmaW5lIFpfVWljY0lkX1VTVFNTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI4IA0KLSNkZWZpbmUgWl9VaWNjSWRfSU1FSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjkgDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkxURSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUgWl9VaWNjSWRfRVBTTE9DSV9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzAgIC8qRVBTIExvY2m1xMv30v0qLw0KLSNkZWZpbmUgWl9VaWNjSWRfTFJQTE1OU0lfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzEgIC8qUlBMTU4gU2VsZWN0aW9uIEluZGljYXRpb261xMv30v0qLw0KLSNkZWZpbmUgWl9VaWNjSWRfRUhQTE1OX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzIgIC8qRUhQTE1OtcTL99L9Ki8NCi0jZGVmaW5lIFpfVWljY0lkX0VQU05TQ19SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMzICAvKrCyyKvJz8/CzsS1xMv30v0qLw0KLSNkZWZpbmUgWl9VaWNjSWRfQUNTR0xfUkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzQgIC8qQWxsb3dlZCBDU0cgbGlzdLXEy/fS/SovDQotI2RlZmluZSBaX1VpY2NJZF9DU0dUX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzNSAgLypDU0cgSW5kYWNhdGlvbrXEy/fS/SovDQotI2RlZmluZSBaX1VpY2NJZF9ITkJOX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzNiAgLypITkIgTmFtZbXEy/fS/SovDQotI2RlZmluZSBaX1VpY2NJZF9PQ1NHTF9SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzNyAgLypFRk9DU0dMtcTL99L9Ki8NCi0NCi0jZGVmaW5lIFpfVWljY0lkX0FDTV9DWUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTM4DQotI2RlZmluZSBaX1VpY2NJZF9BQ01NQVhfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzOQ0KLSNkZWZpbmUgWl9VaWNjSWRfUFVDVF9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNDANCi0jZGVmaW5lIFpfVWljY0lkX1BMX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQxDQotI2RlZmluZSBaX1VpY2NJZF9MSV9CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0Mg0KLSNkZWZpbmUgWl9VaWNjSWRfSU1FSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNDMNCi0jZGVmaW5lIFpfVWljY0lkX0JBQ0tVUF9EQVRBX0ZMRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQ0DQotI2RlZmluZSBaX1VpY2NJZF9FU1RfQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0NQ0KLSNkZWZpbmUgWl9VaWNjSWRfQUNMX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNDYNCi0jZGVmaW5lIFpfVWljY0lkX0lDQ0lEX0JJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQ3DQotI2RlZmluZSBaX1VpY2NJZF9PUExfUkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0OA0KLSNkZWZpbmUgWl9VaWNjSWRfUE5OX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNDkNCi0jZGVmaW5lIFpfVWljY0lkX0ZETl9SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUwDQotI2RlZmluZSBaX1VpY2NJZF9TRE5fUkVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1MQ0KLSNkZWZpbmUgWl9VaWNjSWRfRkROVVJJX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNTINCi0jZGVmaW5lIFpfVWljY0lkX1NETlVSSV9SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUzDQotI2RlZmluZSBaX1VpY2NJZF9FWFQyX1JFQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1NA0KLSNkZWZpbmUgWl9VaWNjSWRfRVhUM19SRUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNTUNCi0jZGVmaW5lIFpfVWljY0lkX0xBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKVpfVWljY0lkX0VYVDNfUkVDDQotDQotDQotLyogRlBMTU4gKi8NCi0jZGVmaW5lICAgIFpQU19VSUNDX0xFTl9GUExNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpODUgIA0KLSNkZWZpbmUgICAgWl9VSUNDX0xFTl9GUExNTiAgICAgICAgICAgICBaUFNfVUlDQ19MRU5fRlBMTU4NCi0NCi0jZGVmaW5lIFpfTUFYX0xFTl9VUklfVExWX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI1NSAvKiBFRlBTSVNNU0Mg1tBVUkkgVExWtcTX7rTzs6S2yCovDQotI2RlZmluZSBaX01BWF9MRU5fRUhQTE1OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTg1ICAvKkVIUExNTsHQse0qLyANCi0jZGVmaW5lIFpfTUFYX0xFTl9OQVNJTlRfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgIC8qzerV+9DUsaO7pMPc1L+1xNfutPOzpLbIKi8gDQotI2RlZmluZSBaX01BWF9MRU5fTkFTRU5DX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE2ICAvKrzTw9zD3NS/tcTX7rTzs6S2yCovIA0KLSNkZWZpbmUgWl9NQVhfTEVOX05IX09SX05DQ19QQVJBICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzMiAgLypOQVPD3NS/tcTX7rTzs6S2yCovIA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09ICC/qNe0zKzP4LnYtqjS5SAgPT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfVWljY19DYXJkT2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgIC8qIHBzRGV2uPm+3b+os/XKvLuvz/vPosnov6hvayovDQotI2RlZmluZSBaX1VpY2NfTm9DYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAvKiB1aWNjyc+xqM7ev6gqLw0KLSNkZWZpbmUgWl9VaWNjX1N0YXRlSW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyICAgLyogdWljY8nPsai/qNe0zKzO3tCnKi8NCi0jZGVmaW5lIFpfVWljY19TdGF0ZUxvZ2ljSW52YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgIC8qILz4yKjl5bvy1d/Hv9bGzsS8/rP2tO0oRUZpbXNpL0VGYWQpo6y1yHBzuf2zzMq5v6jXtMyszt7QpyovDQotI2RlZmluZSBaX1VpY2NfUGluTm90VmVyaWZ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgICAvKiB1aWNjyc+xqHBpbsO709DR6dakKi8NCi0jZGVmaW5lIFpfVWljY19DYXJkTG9ja2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNSAgIC8qIHVpY2PJz7Gov6jDu9PQveLL+CovDQotI2RlZmluZSBaX1VpY2NfV2FpdERlYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTYgICAvKiC1yLT9yKW77iovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09INDFwe64+tfZt73P8rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX1NJR1RSQUNFX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfU0lHVFJBQ0VfUkVDViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qPT09PT09PT09PT09PT09PSC2r9f3veG5+7vyuq/K/be1u9i94bn7uuq2qNLlID09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfU1VDQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09INPQ0Kehos7e0Ke66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9OVUxMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweGZmDQotI2RlZmluZSBaX05VTExfV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTB4ZmZmZg0KLSNkZWZpbmUgWl9OVUxMX0RXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHhmZmZmZmZmZg0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT0g1sbKvbrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX05PX0FDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MDANCi0jZGVmaW5lIFpfVERfQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMQ0KLSNkZWZpbmUgWl9XX0FDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDAyDQotI2RlZmluZSBaX0dTTV9BQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MDQNCi0jZGVmaW5lIFpfR1NNX0NPTVBBQ1RfQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwOA0KLSNkZWZpbmUgWl9MVEVfQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDEwDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PdbQ0sa2qNbGuuogPT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9DTUNDX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMA0KLSNkZWZpbmUgWl9DTUNDX1ZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09ICDPtc2z19PEo8q9uuq2qNLlID09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lICAgWl9TVUJNT0RFX05PU0VSVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgIC8qIM7et/7O8SAqLw0KLSNkZWZpbmUgICBaX1NVQk1PREVfR1NNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxICAgLyogR1NNxKPKvSAqLw0KLSNkZWZpbmUgICBaX1NVQk1PREVfR1BSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyICAgLyogR1BSU8Sjyr0gKi8NCi0jZGVmaW5lICAgWl9TVUJNT0RFX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgIC8qIEVER0XEo8q9ICovDQotI2RlZmluZSAgIFpfU1VCTU9ERV9XQ0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgICAvKiBXQ0RNQcSjyr0gKi8NCi0jZGVmaW5lICAgWl9TVUJNT0RFX0hTRFBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNSAgIC8qIEhTRFBBxKPKvSAqLw0KLSNkZWZpbmUgICBaX1NVQk1PREVfSFNVUEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2ICAgLyogSFNVUEHEo8q9ICovDQotI2RlZmluZSAgIFpfU1VCTU9ERV9EUEFfVVBBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcgICAvKiBIU1VQQbrNSFNEUEHEo8q9ICovDQotI2RlZmluZSAgIFpfU1VCTU9ERV9URCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTggICAvKiBURF9TQ0RNQcSjyr0gKi8NCi0jZGVmaW5lICAgWl9TVUJNT0RFX0xURV9UREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOSAgLyogTFRFxKPKvVRERCAqLw0KLSNkZWZpbmUgICBaX1NVQk1PREVfTFRFX0ZERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMCAgLyogTFRFxKPKvSBGREQqLw0KLSNkZWZpbmUgICBaX1NVQk1PREVfTFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMSAgLyogTFRFxKPKvSovDQotI2RlZmluZSAgIFpfU1VCTU9ERV9EUEFPUlVQQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEyICAgLyogSFNEUEG78tXfSFNVUEHEo8q9ICovDQotI2RlZmluZSAgIFpfU1VCTU9ERV9IU1BBX1BMVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEzICAvKiBIU1BBKyDEo8q9Ki8NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09IMnkxrW/qrnYuuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfUkZfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9SRl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT0gINPyserKtrrqtqjS5SAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX0NzRG9tYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfUHNEb21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NYmF1RG9tYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotDQotLyo9PT09PT09PT09PT0gQ00vVU1NxKO/6c/ybW1pYbXEz/vPotbQ1LTL99L9yrnTw7XExKO/6brqtqjS5SAgPT09PT09PSovDQotI2RlZmluZSBaX1BTTURMX0NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAvKiBwc7XEY2PEo7/pusUqLw0KLSNkZWZpbmUgWl9QU01ETF9TTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyICAgICAgLyogcHO1xHNtc8Sjv+m6xSovDQotI2RlZmluZSBaX1BTTURMX1NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgICAgICAvKiBwc7XEc3PEo7/pusUqLw0KLSNkZWZpbmUgWl9QU01ETF9TTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0ICAgICAgLyogcHO1xHNtxKO/6brFKi8NCi0jZGVmaW5lIFpfUFNNRExfVU1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNSAgICAgIC8qIHBztcR1bW3Eo7/pusUqLw0KLSNkZWZpbmUgWl9QU01ETF9FU00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2ICAgICAgLyogcHO1xGVzbcSjv+m6xSovDQotI2RlZmluZSBaX1BTTURMX1BCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcgICAgICAvKiBwc7XEc3RtxKO/6brFKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKrWxx7Cw5rG+1sbKvdDFz6IqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUgWl9ERVZfTlZfUkFUX1ZFUlNJT05fVERfT05MWSAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9ERVZfTlZfUkFUX1ZFUlNJT05fR1NNX09OTFkgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9ERVZfTlZfUkFUX1ZFUlNJT05fVERfUFJJT1JJVFkgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9ERVZfTlZfUkFUX1ZFUlNJT05fR1NNX1BSSU9SSVRZICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9ERVZfTlZfUkFUX1ZFUlNJT05fREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLQ0KLS8qVjItVjPD+9fWvObI3WVuZCovDQotI2RlZmluZSBaX1NVQk1ETF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKSgoU1VCTURMX1BTRU5EIC0gU1VCTURMX1BTQkFTRSkgKyAxKQ0KLQ0KLSNpZmRlZiBfVVNFX1BSSU5URg0KLSAgICAjZGVmaW5lICBaX1BSSU5URihYKVwNCi0gICAgaWYgKHpDYXRBZ3RfSXNNb2RlbVByaW50VHJhY2VkKCkpIHpPc3NfUHJpbnRmIFgNCi0gICAgI2RlZmluZSAgWl9EVUFMUFJJTlRGKFgpXA0KLSAgICBpZiAoekNhdEFndF9Jc01vZGVtUHJpbnRUcmFjZWQoKSkgekNhdEFndF9EdWFsUHJpbnRmIFgNCi0jZWxzZQ0KLSAgICAjZGVmaW5lICBaX1BSSU5URihYKQ0KLSAgICAjZGVmaW5lICBaX0RVQUxQUklOVEYoWCkgDQotI2VuZGlmDQotDQotI2lmZGVmIF9VU0VfRVhDUF9UUkFDRQ0KLSAgICAjZGVmaW5lIFpfRVhDUF9UUkFDRV9BR1QoIGJJbnNObywgYk1vZElkLCBkd0VycmNvZGUsIGR3UmN2TXNnSWQsIGR3U2VuZE1zZ0lkLCBcDQotICAgICAgICAgICAgcFN0cmluZywgYlN0YXRlLCBiRXJyTGV2ZWwgKSBcDQotICAgICAgICB6RXhwdDJUcmFjZUFndCggYkluc05vLCBiTW9kSWQsIGR3RXJyY29kZSwgZHdSY3ZNc2dJZCwgZHdTZW5kTXNnSWQsIFwNCi0gICAgICAgICAgICBwU3RyaW5nLCBfX0ZJTEVfXywgX19MSU5FX18sIGJTdGF0ZSwgYkVyckxldmVsICkNCi0jZWxzZQ0KLSAgICAjZGVmaW5lIFpfRVhDUF9UUkFDRV9BR1QoIGJJbnNObywgYk1vZElkLCBkd0VycmNvZGUsIGR3UmN2TXNnSWQsIGR3U2VuZE1zZ0lkLCBcDQotICAgICAgICAgICAgcFN0cmluZywgYlN0YXRlLCBiRXJyTGV2ZWwgKQ0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0q0K3S6dW7TlbP4LnYveG5uSzOqrHcw+LU7LPJTlbOycLSvfvWubbUz8LD5r3hubm9+NDQ0N64xA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF1dG9HcHJzQXR0OyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDWuMq+yse38dans9bX1LavR1BSU7i918UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7oxLbHtyr7Wp7PWIDAtse3KvrK71qez1g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96QXRpX05WX1BzQXR0U3RhdGU7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgIGJMdGVBY3Q7ICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyejWw0xURb3TyOu8vMr1DQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAgfiAzKDC99tans9ZURESjrDG99tans9ZGRESjrDLWp7PWVEREus1GRETH0lRERNPFz8ijrDPWp7PWVEREus1GRETH0kZERNPFz8gpDQotICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oyDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICANCi0gICAgQllURSAgICBhYlBhZGRpbmdbM107DQotfVRfekF0aV9OVl9MdGVBY3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNpZDsgICAgICAgICAgICAgICAgIC8qIL2o0umz9rOn1rWjujAqLyAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGRwVHlwZTsgICAgICAgICAgICAgLyogvajS6bP2s6fWtaO6MCovICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRENvbXA7ICAgICAgICAgICAgICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIQ29tcDsgICAgICAgICAgICAgICAvKiC9qNLps/azp9a1o7owKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklQdjRBZGRyQWxsb2M7ICAgICAgIC8qIL2o0umz9rOn1rWjujAqLyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW1lcmdlbmN5SW5kOyAgICAgICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQQ3NjZkRpc2M7ICAgICAgICAgICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbWNuU2lnbkluZDsgICAgICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQY29BdXRoRmc7ICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdXRoVHlwZTsgICAgLyq8+MiowODQzSy9qNLps/azp9a1OjAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQXBuW1pfREVWX0F0TWVtX01BWF9BUE5fTEVOXTsgICAgICAgICAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGRwQWRkcltaX0RFVl9BdE1lbV9NQVhfUERQQUREUl9MRU5dOyAgLyogvajS6bP2s6fWtaO6MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFzc1dvcmRbWl9ERVZfQXRNZW1fTUFYX1NUUl9MRU5dOy8qsrvE3LTz09o2NCy9qNLps/azp9a1o7owKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlVzZXJOYW1lW1pfREVWX0F0TWVtX01BWF9TVFJfTEVOXTsvKrK7xNy089PaNjQsvajS6bP2s6fWtaO6MCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhc3NXb3JkTGVuOy8qs/azp9a1MCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzZXJOYW1lTGVuOy8qs/azp9a1MCovDQotfVRfekF0aV9OVl9DaWRQZHBDb250ZXh0Ow0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBUX3pBdGlfTlZfQ2lkUGRwQ29udGV4dCAgICB0Q2lkUGRwQ29udFtaX01BWF9DSURfTlVNXTsNCi19VF96QXRpX05WX1BkcENvbnQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMdGVMQ0FjdGlvbjsgICAgICAgLyowOiDOtMno1sPL+LaoxrW147vy0KHH+CwgMTog0tHJ6NbDy/i2qMa1teO78tChx/gsIL2o0umz9rOn1rWjujAqLyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3THRlTENDZWxsUGFyYUlkOyAgIC8qy/i2qLXE0KHH+KOsvajS6bP2s6fWtaO6MHhGRkZGKi8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0x0ZUxDVWFyZmNuOyAgICAgICAvKsv4tqi1xMa1teOjrL2o0umz9rOn1rWjujB4RkZGRkZGRkYqLw0KLX1UX3pBdGlfTlZfTHRlTGNDZmc7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RlOyAgICAgICAgLyogvajS6bP2s6fWtaO6MiDX1Lavy9HN+CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFjcW9yZGVyOyAgICAvKiC9qNLps/azp9a1o7o2IMSsyM/Txc/IvLajrLC01dVMVEUtPlRELT5HU03Wxsq9y7PQ8svRzfgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSb2FtOyAgICAgICAgLyogvajS6bP2s6fWtaO6MSDWp7PWwv7TziovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNydmRvbWFpbjsgICAvKiC9qNLps/azp9a1o7oyINans9ZDUy9QUyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96QXRpX05WX1N5c2NvbmZpZzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFRfel9QbG1uSWQgICAgICAgICAgICAgICAgIHRQbG1uSWQ7IC8qUExNTklEKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgIGFiRnVsbE5hbWVbWl9NQVhfTE9OR05BTUVfTEVOXTsgLyrUy9OqycyzpMP7Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgYWJTaG9ydE5hbWVbWl9NQVhfU0hPUlROQU1FX0xFTl07IC8q1MvTqsnMtszD+yovDQotfVRfekF0aV9OVl9PcGVyUGxtbkluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBUX3pBdGlfTlZfT3BlclBsbW5JbmZvICAgICBhdE52TWVQbG1uSURJbmZvW1pfTUFYX01FX09QRVJfTlVNXTsvKtTL06rJzM34wufQxc+iwdCx7SovDQotICAgICAvKrP2s6HWtToNCi0gICAgICAgYXROdk1lUGxtbklESW5mb1swXTogdFBsbW5JZDogNDYwMDAgIGFiRnVsbE5hbWU6ICJDSElOQSBNT0JJTEUiLGFiU2hvcnROYW1lOiJDTUNDIg0KLSAgICAgICBhdE52TWVQbG1uSURJbmZvWzFdOiB0UGxtbklkOiA0NjAwMiAgYWJGdWxsTmFtZTogIkNISU5BIE1PQklMRSIsYWJTaG9ydE5hbWU6IkNNQ0MiDQotICAgICAgIGF0TnZNZVBsbW5JREluZm9bMl06IHRQbG1uSWQ6IDQ2MDA3ICBhYkZ1bGxOYW1lOiAiQ0hJTkEgTU9CSUxFIixhYlNob3J0TmFtZToiQ01DQyINCi0gICAgICAgYXROdk1lUGxtbklESW5mb1szXTogdFBsbW5JZDogNDYwMDggIGFiRnVsbE5hbWU6ICJDSElOQSBNT0JJTEUiLGFiU2hvcnROYW1lOiJDTUNDIg0KLSAgICAgICBhdE52TWVQbG1uSURJbmZvWzRdOiB0UGxtbklkOiA0NjAwMSAgYWJGdWxsTmFtZTogIkNISU5BLVVOSUNPTSIsYWJTaG9ydE5hbWU6IlVOSUNPTSINCi0gICAgICAgYXROdk1lUGxtbklESW5mb1s1XTogdFBsbW5JZDogNDYwMDYgIGFiRnVsbE5hbWU6ICJDSElOQS1VTklDT00iLGFiU2hvcnROYW1lOiJVTklDT00iDQotICAgICAgIGF0TnZNZVBsbW5JREluZm9bNl06IHRQbG1uSWQ6IDQ2MDA5ICBhYkZ1bGxOYW1lOiAiQ0hJTkEtVU5JQ09NIixhYlNob3J0TmFtZToiVU5JQ09NIg0KLSAgICAgICBhdE52TWVQbG1uSURJbmZvWzddOiB0UGxtbklkOiA0NjAwMyBhYkZ1bGxOYW1lOiAiQ0hOLUNUIixhYlNob3J0TmFtZToiQ1QiDQotICAgICAgIGF0TnZNZVBsbW5JREluZm9bOF06IHRQbG1uSWQ6IDQ2MDA1IGFiRnVsbE5hbWU6ICJDSE4tQ1QiLGFiU2hvcnROYW1lOiJDVCINCi0gICAgICAgYXROdk1lUGxtbklESW5mb1s5XTogdFBsbW5JZDogNDYwMTEgYWJGdWxsTmFtZTogIkNITi1DVCIsYWJTaG9ydE5hbWU6IkNUIg0KLSAgICAgICBhdE52TWVQbG1uSURJbmZvWzEwXTogdFBsbW5JZDogNDYwMTIgYWJGdWxsTmFtZTogIkNITi1DVCIsYWJTaG9ydE5hbWU6IkNUIg0KLSAgICAgICDG5Mv7tcRQTE1OSUTOqsirRizD+7PGzqrIqzAqLw0KLX1UX3pBdGlfTlZfTWVQbG1uSW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFRfekF0aV9OVl9PcGVyUGxtbkluZm8gICAgICAgICAgIGF0TnZOZXRQbG1uSURJbmZvW1pfTUFYX05FVF9PUEVSX05VTV07DQotICAgIC8qs/azp9a1OmF0TnZOZXRQbG1uSURJbmZvWzBdOiAgdFBsbW5JZDrIq0YsYWJGdWxsTmFtZTrIqzAsYWJTaG9ydE5hbWU6yKswIC7S1LTLwODNxiovDQotfVRfekF0aV9OVl9OZXRQbG1uSW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICBiU2VsbFN0YXRTd2l0Y2g7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgz/rBv82zvMa/qrnYDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKO6z/rBv7mmxNy52LHVo7sxo7rP+sG/zbO8xrmmxNy08r+qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQllURSAgICAgICAgICBiQ1JDOyAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgQ1JD1rWjrNPD09q3osvNz/rBv82zvMaw/MqxvfjQ0LzTw9wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owfjI1NQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oweDU1DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJZVEUgICAgICAgICAgYkRlYnVnOyAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgIL+qxvREZWJ1ZyDEo8q9o6y9tbXNz/rBv82zvMaz9reiw8XP3g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjumRlYnVnxKPKvbnYsdWjrDGjumRlYnVnxKPKvb+qxvQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCWVRFICAgICAgICAgIGJTZWxsU3RhdFRyaUZnOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjus/6wb/Ns7zGseq8x867o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdDCjurWltM5wZHC8pLvuzPW8/sL61+Ox6rzHzrujrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0MaO6wNu8xlBEULyku+7KsbzkwvrX47HqvMfOu6OsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXQyo7q0/bv6yrG85Mz1vP7C+tfjseq8x867oaMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejusO/0ru49mJpdNbDMbHtyr7M9bz+wvrX46OsMLHtyr7M9bz+srvC+tfjICAweDAwfjB4MDcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MHgwMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgd1BvcnQ7ICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgz/rBv82zvMa3/s7xxve2y7/ausUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owfjB4RkZGRg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7rQobbLyrHIoda1MHgyMzMyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotICAgIEJZVEUgICAgICAgICAgYlBhY2tldFNlbmRDbnQ7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6z/rBv82zvMaw/Leiy828xsr9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MH4yNTUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCWVRFICAgICAgICAgIGJQYWNrZXRTZW5kU3RhdGU7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgz/rBv82zvMZJULD8t6LLzde0zKwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLS0tz/rBv82zvMZJULD8t6LLzdLRyLfIz7vyt6LLzdfctM7K/dLRs6y5/cnPz94NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLS3P+sG/zbO8xklQsPzI1L/Jt6LLzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujB+MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotICAgIEJZVEUgICAgICAgIGJSZWdDbnQ7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgzfjC59eisuHKsbzkwvrX48/6wb/Ns7zGw8XP3rTOyv0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owfjI1NQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJZVEUgICAgICAgICAgYWJQYWRkaW5nWzNdOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuszus+TOuw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSAgICBEV09SRCAgICAgICAgZHdTdW1QZHBUaW1lOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNw6wNu8xlBEUMnPzfjKsbzkLLWlzrvOqm1zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MH4weGZmZmZmZmZmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0gICAgQllURSAgICAgICAgIGFiRG9tYWluW1pfREVWX1NFTExTVEFUX01BWF9ET01BSU5fTEVOXTsgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjus/6wb/Ns7zGt/7O8cb30/LD+6Os19a3+7Suse3KvqOs0tRcMLHtyr694cr4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6yM7S4tfWt/u0rg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oiaHEwLnBhdHJvbC51cGRhdGUyLnp0ZS5jb20uY24iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotfVRfekF0aV9OVl9TZWxsU3RhdDsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgIGJMdGVUaHJlc2hSc3JwOyAgICAgICAgICAgLyowLTk3LLP2s6fWtTAqLw0KLSAgICBCWVRFICAgICAgICAgICAgYkx0ZVRocmVzaFJzcnBfSGlnaDsgICAgICAvKjAtOTcss/azp9a1OTcqLw0KLSAgICBCWVRFICAgICAgICAgICAgYkx0ZVRocmVzaFJzcnE7ICAgICAgICAgICAvKjAtMzQss/azp9a1MCovDQotICAgIEJZVEUgICAgICAgICAgICBiTHRlVGhyZXNoUnNycV9IaWdoOyAgICAgIC8qMC0zNCyz9rOn1rUzNCovDQotICAgIEJZVEUgICAgICAgICAgICBiVGRUaHJlc2hSc2NwOyAgICAgICAgICAgIC8qMC05Niyz9rOn1rUwKi8NCi0gICAgQllURSAgICAgICAgICAgIGJUZFRocmVzaFJzY3BfSGlnaDsgICAgICAgLyowLTk2LLP2s6fWtTk2Ki8NCi0gICAgQllURSAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96QXRpX05WX1BzU2Vydk91dFBhcmFtOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgYlRpbWVyTGVuOyAgICAgICAgICAgLyowLTEwLLP2s6fWtTQqLw0KLSAgICBCWVRFICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pBdGlfTlZfRnJvcEluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgYkNvcHNNb2RlOyAgICAgICAgLyqz9rOn1rUwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICBiT3BlckZnOyAgICAgICAgICAvKiCz9rOn1rUwICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgYk5hbWVGZzsgICAgICAgIC8qILP2s6fWtTAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICBhYk9wZXJhdGVbWl9NQVhfTE9OR05BTUVfTEVOXTsgICAgICAgICAvKiCz9rOn1rXIqzAgKi8NCi0gICAgVF96X1BsbW5BY3QgICAgICAgICAgICB0UGxtbkFjdDsgICAgICAgICAvKiCz9rOn1rXIqzB4ZmYgKi8NCi19VF96QXRpX05WX0NvcHNNb2RlOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIGJFbmRwb2ludDoxse3KvrHVus+149Ta0MW6xce/tsjQobXE0ru2yywyse3KvrHVus+149Ta0MW6xce/tsi087XE0ru2yw0KLSDS1GJFbmRwb2ludD0yzqrA/Sw+LTgwKDW48SksWy04MCwtOTApNLjxLFstOTAsLTk4KTO48SxbLTk4LC0xMDQpMrjxLFstMTA0LC0xMTApMbjxLA0KLSDQodPatcjT2i0xMTDOqjC48Q0KLSAgYlN0ZXBOdW06se3KvtDFusW48dfutPPK/SzEv8ew1+6088r9zqo1uPEsyOe5+7jEzqrQodPaNbXE1rUs1PK21NOmtcQNCi0gICAgICAgICAgICAgICAgICAg0MW6xce/tsix373n1rXK/dfpYWJSc3NpwO+1xNa10rLSqs/g06a89cnZDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICBiRW5kcG9pbnQ7ICAgICAgICAgICAgICAgICAgICAvKsf4vOSx1brPteOz9rOn1rUyKi8NCi0gICAgQllURSAgICAgIGJTdGVwTnVtOyAgICAgICAgICAgICAgICAgICAgICAvKtDFusW48cr9s/azp9a1NSAqLw0KLSAgICBCWVRFICAgICAgYWJSc3NpW1pfTUFYX1NJR05BTF9TVEVQXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKtDFusXH+Lzksd+959a1MbP2s6fWtTgwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1MrP2s6fWtTkwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1M7P2s6fWtTk4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1NLP2s6fWtTEwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQxbrFx/i85LHfvefWtTWz9rOn1rUxMTAqLw0KLSAgICBCWVRFICAgICAgYlBhZGRpbmc7DQotfVRfekF0aV9OVl9Hc21TaWduYWxib3hDZmc7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gYkVuZHBvaW50OjGx7cq+sdW6z7Xj1NrQxbrFx7+2yNChtcTSu7bLLDKx7cq+sdW6z7Xj1NrQxbrFx7+2yLTztcTSu7bLDQotINLUYkVuZHBvaW50PTLOqsD9LD4tODAoNbjxKSxbLTgwLC05MCk0uPEsWy05MCwtOTgpM7jxLFstOTgsLTEwNCkyuPEsWy0xMDQsLTExMCkxuPEsDQotINCh09q1yNPaLTExMM6qMLjxDQotIGJTdGVwTnVtOrHtyr7QxbrFuPHX7rTzyv0sxL/HsNfutPPK/c6qNbjxLMjnufu4xM6q0KHT2jW1xNa1LNTyttTTprXEDQotICAgICAgICAgICAgICAgICAgINDFusXHv7bIsd+959a1yv3X6WFiUnNzacDvtcTWtdKy0qrP4NOmvPXJ2Q0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgYkVuZHBvaW50OyAgICAgICAgICAgICAgICAgICAgLyrH+LzksdW6z7Xjs/azp9a1MiovDQotICAgIEJZVEUgICAgICBiU3RlcE51bTsgICAgICAgICAgICAgICAgICAgICAgIC8q0MW6xbjxyv2z9rOn1rU1ICovDQotICAgIEJZVEUgICAgICBhYlJzc2lbWl9NQVhfU0lHTkFMX1NURVBdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q0MW6xcf4vOSx373n1rUxs/azp9a1ODANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rUys/azp9a1OTANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rUzs/azp9a1OTgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rU0s/azp9a1MTA0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1NbP2s6fWtTExMCovDQotICAgIEJZVEUgICAgICBiUGFkZGluZzsNCi19VF96QXRpX05WX1RkU2lnbmFsYm94Q2ZnOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIGJFbmRwb2ludDoxse3KvrHVus+149Ta0MW6xce/tsjQobXE0ru2yywyse3KvrHVus+149Ta0MW6xce/tsi087XE0ru2yw0KLSDS1GJFbmRwb2ludD0yzqrA/Sw+LTgwKDW48SksWy04MCwtOTApNLjxLFstOTAsLTk4KTO48SxbLTk4LC0xMDQpMrjxLFstMTA0LC0xMTApMbjxLA0KLSDQodPatcjT2i0xMTDOqjC48Q0KLSAgYlN0ZXBOdW06se3KvtDFusW48dfutPPK/SzEv8ew1+6088r9zqo1uPEsyOe5+7jEzqrQodPaNbXE1rUs1PK21NOmtcQNCi0gICAgICAgICAgICAgICAgICAg0MW6xce/tsix373n1rXK/dfpYWJSc3NpwO+1xNa10rLSqs/g06a89cnZDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICBiRW5kcG9pbnQ7ICAgICAgICAgICAgICAgICAgICAgLyrH+LzksdW6z7Xjs/azp9a1MiovDQotICAgIEJZVEUgICAgICBiU3RlcE51bTsgICAgICAgICAgICAgICAgICAgICAgICAvKtDFusW48cr9s/azp9a1NSAqLw0KLSAgICBCWVRFICAgICAgYWJSc3NpW1pfTUFYX1NJR05BTF9TVEVQXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKtDFusXH+Lzksd+959a1MbP2s6fWtTgwDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQxbrFx/i85LHfvefWtTKz9rOn1rU5MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rUzs/azp9a1OTgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1NLP2s6fWtTEwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rU1s/azp9a1MTEwKi8NCi0gICAgQllURSAgICAgYlBhZGRpbmc7DQotfVRfekF0aV9OVl9XU2lnbmFsYm94Q2ZnOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSBiRW5kcG9pbnQ6MbHtyr6x1brPtePU2tDFusXHv7bI0KG1xNK7tsssMrHtyr6x1brPtePU2tDFusXHv7bItPO1xNK7tssNCi0g0tRiRW5kcG9pbnQ9Mc6qwP0sPj0gLTk3KDW48SksKC05NywtMTA1XTS48SwoLTEwNSwtMTEwXTO48SwoLTExMCwtMTE1XTK48SwoLTExNSwtMTIwXTG48SwNCi0g0KHT2i0xMjDOqjC48S4NCi0gYlN0ZXBOdW06se3KvtDFusW48dfutPPK/SzEv8ew1+6088r9zqo1uPEsyOe5+7jEzqrQodPaNbXE1rUs1PK21NOmtcQNCi0gICAgICAgICAgICAgICAgICAg0MW6xce/tsix373n1rXK/dfpYWJSc3NpwO+1xNa10rLSqs/g06a89cnZDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgYkVuZHBvaW50OyAgICAgICAgICAgICAgICAgICAgIC8qx/i85LHVus+147P2s6fWtTEqLw0KLSAgICBCWVRFICAgICAgYlN0ZXBOdW07ICAgICAgICAgICAgICAgICAgICAgICAgLyrQxbrFuPHK/bP2s6fWtTUqLyAgIA0KLSAgICBCWVRFICAgICAgYWJSc3NpW1pfTUFYX1NJR05BTF9TVEVQXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKtDFusXH+Lzksd+959a1MbP2s6fWtTk3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQxbrFx/i85LHfvefWtTKz9rOn1rUxMDUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINDFusXH+Lzksd+959a1M7P2s6fWtTExMA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0MW6xcf4vOSx373n1rU0s/azp9a1MTE1DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQxbrFx/i85LHfvefWtTWz9rOn1rUxMjAqLw0KLSAgIEJZVEUgICAgICBiUGFkZGluZzsNCi19VF96QXRpX05WX0x0ZVNpZ25hbGJveENmZzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgIGJXTENBY3Q7ICAgIC8qMDrOtMno1sPL+LaoxrW147vy0KHH+DE60tHJ6NbDy/i2qNChx/gsvajS6bP2s6fWtTAqLw0KLSAgICBCWVRFICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pfV0NlbGwgICAgICB0V0NlbGw7DQotICAgICAgICAgICAgICAgICAgICAgLyp3VWFyZmNuOiDL+Lao0KHH+LXDz8LQ0Ma1teMsNDEyfjEwODM4LLP2s6fWtaO6MFhGRkZGDQotICAgICAgICAgICAgICAgICAgICAgIHdQcmltU2M6IMv4tqjQocf4tcTIxcLrLDB+NTExLLP2s6fWtaO6MFhGRkZGKi8NCi19VF96QXRpX05WX1dMY0NmZzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgIGJUTENBY3Q7ICAgIC8qMDrOtMno1sPL+LaoxrW147vy0KHH+DE60tHJ6NbDy/i2qNChx/gsvajS6bP2s6fWtTAqLw0KLSAgICBCWVRFICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pfVGRDZWxsICAgICB0VENlbGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJDZWxsUGFyYUlkOiC9qNLps/azp9a1MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdVYXJmY246vajS6bP2s6fWtTAqLw0KLX1UX3pBdGlfTlZfVExjQ2ZnOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgYkdMQ0FjdDsvKjA6zrTJ6NbDy/i2qMa1teO78tChx/gxOtLRyejWw8v4tqjQocf4LL2o0umz9rOn1rUwKi8NCi0gICAgQllURSAgICAgIGFiUGFkZGluZzsNCi0gICAgV09SRCAgICAgIHdBcmZjbjsvKr2o0umz9rOn1rUwKi8NCi19VF96QXRpX05WX0dMY0NmZzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgIGJTYWlMaXN0U2V0OyAvKlNBScHQse3Jz7Gov6q52CwwOrnYsdUxOrTyv6oss/azp9a1OjAqLw0KLSAgICBCWVRFICAgICAgYlRtZ2lMaXN0U2V0OyAvKlRNR0nB0LHtyc+xqL+qudgsMDq52LHVMTq08r+qLLP2s6fWtTowKi8NCi0gICAgQllURSAgICAgIGJNYm1zTW9kZVNldDsgLypFTUJNU9PFz8i5pNf3xKPKvSwwOnVuaWNhc3TTxc/IMTrX6bKl08XPyCyz9rOn1rU6MCovDQotICAgIEJZVEUgICAgICBiUGFkZGluZzsNCi19VF96QXRpX05WX0VtYm1zU3RhdDsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgIGJTZXJhY2hTZXQ7LyrKx7fx1MrQ7cvRzfgs08PS1Mf4t9bKx7fxzqrL+M34vPjIqLDmsb4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgysfL+M34vPjIqLDmsb7U8rP2s6fWtc6qMCyx7cq+udix1cvRzfi5psTcDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgsrvKx9Tys/azp9a1zqoxLLHtyr608r+qy9HN+LmmxNwqLw0KLSAgICBCWVRFICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pBdGlfTlZfTG9ja1NlYXJjaFBsbW47DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICBiQ3VzdG9tSW5mb0ZsZzsvKrP2s6fWtTAs08O7p8no1sPQxc+iyse38bTm1NosMbHtyr7T0NCnvLTT0NCntcQgYkN1c3RvbUJhbmTT6yBiRXF1YXRlQmFuZLXIzayhozCx7cq+zt7Qp6OssrvQ6NKq1/a1yLzbQkFORNequ7sqLw0KLSAgICBCWVRFICAgICAgYkN1c3RvbUJhbmQ7IC8qs/azp9a1MCzTw7un1K3KvMa1ts4syKHWtTEtNjQusbjXoqO608O7p9a71MrQ7cno1sNVRbK71qez1rXEYmFuZC61scewtqjWxtDox/PKx2JDdXN0b21CYW5kucy2qM6qNjMqLw0KLSAgICBCWVRFICAgICAgYkVxdWF0ZUJhbmQ7Lyqz9rOn1rUwLNPr08O7p9StyrzGtbbOtcjNrLXExrW2zizIoda1MS02NCovDQotICAgIEJZVEUgICAgICBiUGFkZGluZzsNCi19VF96QXRpX05WX0N1c3RvbUJhbmRUcmFuc0luZm87DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICBiTHRlQ3VzdG9tUGVtYXg7ICAgICAgLyrIoda1t7bOpzEtNjMsMM6qzt7Qp9a1o6zKudPDyrHQ6NKqvPUzMKOsyrW8ysih1rW3ts6nysctMzAtLTMzICBkYm0qLw0KLSAgICBCWVRFICAgICAgYlRkZE1heEFsd1VsVHhQd3I7ICAgICAvKsih1rW3ts6nMS0tODMsMM6qzt7Qp9a1o6zKudPDyrHQ6NKqvPU1MKOsyrW8ysih1rW3ts6nysctNTAtLTMzIGRibSovDQotICAgIEJZVEUgICAgICBiRmRkTWF4QWx3VWxUeFB3cjsgICAgIC8qyKHWtbe2zqcxLS04MywwzqrO3tCn1rWjrMq508PKsdDo0qq89TUwo6zKtbzKyKHWtbe2zqfKxy01MC0tMzMgZGJtKi8NCi0gICAgQllURSAgICAgIGJHc21DdXN0b21Qb3dlcjsgICAgLyrIoda1t7bOpzEtMzEsMM6qzt7Qp9a1LLjD1rXT63Bvd2VyIGNvbnRyb2wgbGV2ZWzL99L91rXSu9bCo6zKx8v30v3WtSCyu8rH1ebKtbmmwspkQm0qLw0KLX1UX3pBdGlfTnZfQ3VzdG9tVHhQb3dlcjsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICBCSVRTICAgICAgICAgYkJhbmQxOjE7ICAvKiAguabE3KO6xrW2zjHWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDI6MTsgIC8qICC5psTco7ogxrW2zjLWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQzOjE7ICAvKiAguabE3KO6xrW2zjPWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQ0OjE7ICAvKiAguabE3KO6xrW2zjTWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDU6MTsgIC8qICC5psTco7rGtbbONdans9bT67fxICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDY6MTsgIC8qICC5psTco7rGtbbONtans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDc6MTsgIC8qICC5psTco7rGtbbON9ans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjEqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDg6MTsgIC8qICC5psTco7rGtbbOONans9bT67fxICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDk6MTsgIC8qICC5psTco7rGtbbOOdans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDEwOjE7IC8qICC5psTco7rGtbbOMTDWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgICAgICAgDQotICAgQklUUyAgICAgICAgIGJCYW5kMTE6MTsgLyogILmmxNyjusa1ts4xMdans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDEyOjE7IC8qICC5psTco7rGtbbOMTLWp7PW0+u38SAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQxMzoxOyAvKiAguabE3KO6xrW2zjEz1qez1tPrt/EgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovDQotICAgQklUUyAgICAgICAgIGJCYW5kMTQ6MTsgLyogILmmxNyjusa1ts4xNNans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDE1OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQxNjoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQxNzoxOyAvKiAguabE3KO6xrW2zjE31qez1tPrt/EgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovDQotICAgQklUUyAgICAgICAgIGJCYW5kMTg6MTsgLyogILmmxNyjusa1ts4xONans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDE5OjE7IC8qICC5psTco7rGtbbOMTnWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQyMDoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyANCi0gICBCSVRTICAgICAgICAgYkJhbmQyMToxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kMjI6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDIzOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQyNDoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kMjU6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDI2OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQyNzoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kMjg6MTsgLyogILmmxNyjusa1ts4yONans9bT67fxICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDI5OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQzMDoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kMzE6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDMyOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICAgIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDMzOjE7IC8qICC5psTco7rGtbbOMzPWp7PW0+u38SAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQzNDoxOyAvKiAguabE3KO6xrW2zjM01qez1tPrt/EgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovDQotICAgQklUUyAgICAgICAgIGJCYW5kMzU6MTsgLyogILmmxNyjusa1ts4zNdans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDM2OjE7IC8qICC5psTco7rGtbbOMzbWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQzNzoxOyAvKiAguabE3KO6xrW2zjM31qez1tPrt/EgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovDQotICAgQklUUyAgICAgICAgIGJCYW5kMzg6MTsgLyogILmmxNyjusa1ts4zONans9bT67fxICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjEqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDM5OjE7IC8qICC5psTco7rGtbbOMznWp7PW0+u38SAgICDIoda1t7bOpzowfjEgILP2s6fWtToxKi8NCi0gICBCSVRTICAgICAgICAgYkJhbmQ0MDoxOyAvKiAguabE3KO6xrW2zjQw1qez1tPrt/EgICDIoda1t7bOpzowfjEgILP2s6fWtToxICovICAgIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDQxOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ0MjoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNDM6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDQ0OjE7IC8qICC5psTco7rGtbbONDTWp7PW0+u38SAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8gICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ0NToxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNDY6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDQ3OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ0ODoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNDk6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDUwOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ1MToxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNTI6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gDQotICAgQklUUyAgICAgICAgIGJCYW5kNTM6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDU0OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ1NToxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNTY6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDU3OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ1ODoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNTk6MTsgLyogILmmxNyjulJlc2VydmVkICAgICDIoda1t7bOpzowfjEgILP2s6fWtTowKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDYwOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ2MToxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLyAgDQotICAgQklUUyAgICAgICAgIGJCYW5kNjI6MTsgLyogILmmxNyjulJlc2VydmVkICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAgKi8gIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDYzOjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovICANCi0gICBCSVRTICAgICAgICAgYkJhbmQ2NDoxOyAvKiAguabE3KO6UmVzZXJ2ZWQgICAgIMih1rW3ts6nOjB+MSAgs/azp9a1OjAqLw0KLSAgIEJJVFMgICAgICAgICBiQmFuZDY1OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovIA0KLSAgIEJJVFMgICAgICAgICBiQmFuZDY2OjE7IC8qICC5psTco7pSZXNlcnZlZCAgICAgyKHWtbe2zqc6MH4xICCz9rOn1rU6MCovIA0KLSAgIEJJVFMgICAgICAgICA6NjsgICAgICAgIC8qICAguabE3KO6ICAgIMzus+TOuyAgIMih1rW3ts6no7owICAgICAgs/azp9a1o7owKi8NCi0gICBCWVRFICAgICAgICAgYWJCYW5kUGFkZGluZ1szXTsNCi19VF96QXRpX052X0x0ZUJhbmQsVF96QXRpX052X0x0ZUJhbmRfQmFja3VwOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCSVRTICAgIGJUZGRBOjE7ICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWVEREIEGyqLbOLDGx7cq+1qez1g0KLSAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MSAoyPSyu7+q0NCx6rrqo6xB1qez1rXEyscxODAwLTE5MDAsyPS/qsHL0NCx6rXEuuqjrEHWp7PWtcTOqjIwMTAtMjAyNSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJUZGRCOjE7ICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWVEREIEKyqLbOo6wxse3Kvtans9YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAtMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJUZGRDOjE7ICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWVEREIEOyqLbOLDGx7cq+1qez1g0KLSAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlRkZEQ6MTsgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38dans9ZUREQgRLKots4sMbHtyr7Wp7PWDQotICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owLTENCi0gICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiVGRkRToxOyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fx1qez1lRERCBFsqi2ziwxse3Kvtans9YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAtMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJUZGRGOjE7ICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWVEREIEayqLbOLDGx7cq+1qez1g0KLSAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MSAoRtans9a1xM6qMTg4MC0xOTIwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICANCi0gICBCSVRTICAgICBiVGRkRzoxOyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC5piAgICDE3DrKx7fx1qez1lRkZEcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owLTENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgIA0KLSAgIEJJVFMgICAgIGJUZGRIOjE7ICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguaYgICAgxNw6yse38dans9ZUZGRIDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICANCi0gICBCSVRTICAgICBiVGRkSToxOyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmICAgIMTcOsrHt/HWp7PWVGRkSQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAtMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgICAgDQotICAgQklUUyAgICAgYlRkZEo6MTsgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC5piAgICDE3DrKx7fx1qez1lRkZEoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owLTENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgIA0KLSAgIEJJVFMgICAgIGJUZGRLOjE7ICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguaYgICAgxNw6yse38dans9ZUZGRLDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICANCi0gICBCSVRTICAgICBiVGRkTDoxOyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmICAgIMTcOsrHt/HWp7PWVGRkTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAtMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgICAgDQotICAgQklUUyAgICAgYlRkZE06MTsgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC5piAgICDE3DrKx7fx1qez1lRkZE0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owLTENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotICAgQklUUyAgICAgYlRkZE46MTsgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC5piAgICDE3DrKx7fx1qez1lRkZE4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owLTENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgIA0KLSAgIEJJVFMgICAgIGJUZGRPOjE7ICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguaYgICAgxNw6yse38dans9ZUZGRPDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MC0xDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICANCi0gICBCSVRTICAgICBiVGRkUDoxOyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILmmICAgIMTcOsrHt/HWp7PWVGRkUA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujAtMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQllURSAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBdGlfTnZfVGRkQmFuZCxUX3pBdGlfTnZfVGRkQmFuZF9CYWNrdXA7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kMToxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oxDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDI6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQzOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kNDoxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDU6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQ2OjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujE/DQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDc6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQ4OjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujENCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kOToxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oxDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDEwOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kMTE6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQxMjoxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDEzOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kMTQ6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQxNToxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDE2OjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kMTc6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQxODoxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDE5OjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujENCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYlN1cHBGZGRCYW5kMjA6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38crH1qez1rXERkREILKots4NCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9a4w7Kots6jrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiU3VwcEZkZEJhbmQyMToxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fxysfWp7PWtcRGREQgsqi2zg0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1rjDsqi2zqOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJTdXBwRmRkQmFuZDIyOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HKx9ans9a1xEZERCCyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWuMOyqLbOo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgOjI7DQotICAgIEJZVEUgICBiUGFkZGluZzsNCi19VF96QXRpX052X0ZkZEJhbmQsVF96QXRpX052X0ZkZEJhbmRfQmFja3VwOw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCSVRTICAgIGJHc200NTA6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fx1qez1kdzbTQ1MA0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1qOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYkdzbTQ4MDoxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWR3NtNDgwDQotICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgILP2s6fWtaO6MA0KLSAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiR3NtNzUwOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38dans9ZHc203NTANCi0gICAgICAgICAgICAgICAgICAgICAgICDIoda1t7bOp6O6MKOsMaOoMLHtyr6yu9ans9ajrDGx7cq+1qez1qOpDQotICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJHc204NTA6MTsgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fx1qez1kdzbTg1MA0KLSAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1qOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujANCi0gICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJJVFMgICAgYkdzbTkwMDoyOyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICC5psTco7ogICAgyse38dans9ZHc205MDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjrDKjrDOjqDCx7cq+srvWp7PWo6wxse3Kvtans9ZQOTAwo6wyse3Kvtans9ZFOTAwo6wzse3Kvtans9ZSOTAwo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7oyDQotICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQklUUyAgICBiR3NtMTgwMDoxOyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICAgICAgICAgICAgICAgICAgICAgICAgILmmxNyjuiAgICDKx7fx1qez1kdzbTE4MDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICCz9rOn1rWjujENCi0gICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICBCSVRTICAgIGJHc20xOTAwOjE7IC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PWVEREIEGyqLbODQotICAgICAgICAgICAgICAgICAgICAgICAgIMih1rW3ts6no7owo6wxo6gwse3KvrK71qez1qOsMbHtyr7Wp7PWo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgs/azp9a1o7owDQotICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgQllURSAgIGFiUGFkZGluZ1szXTsNCi19VF96QXRpX052X0dzbUJhbmQsVF96QXRpX052X0dzbUJhbmRfQmFja3VwOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFIGJTdXB0UHNldWRvRnI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICAgICAgICAgICAgICAgICAgICAgICAguabE3KO6ICAgIMrHt/HWp7PW17xGUg0KLSAgICAgICAgICAgICAgICAgICAgICAgyKHWtbe2zqejujCjrDGjqDCx7cq+srvWp7PWo6wxse3Kvtans9ajqQ0KLSAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIEJZVEUgYWJQYWRkaW5nWzNdOw0KLX1UX3pBdGlfTlZfRXVkb0ZSOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgYkx0ZUN1c3RvbVBlbWF4OyAgICAgIC8qyKHWtbe2zqcxLTYzLDDOqs7e0KfWtaOsyrnTw8qx0OjSqrz1MzCjrMq1vMrIoda1t7bOp8rHLTMwLS0zMyAgZGJtKi8NCi0gICAgQllURSAgICAgIGJUZGRNYXhBbHdVbFR4UHdyOyAgICAgLyrIoda1t7bOpzEtLTgzLDDOqs7e0KfWtaOsyrnTw8qx0OjSqrz1NTCjrMq1vMrIoda1t7bOp8rHLTUwLS0zMyBkYm0qLw0KLSAgICBCWVRFICAgICAgYkZkZE1heEFsd1VsVHhQd3I7ICAgICAvKsih1rW3ts6nMS0tODMsMM6qzt7Qp9a1o6zKudPDyrHQ6NKqvPU1MKOsyrW8ysih1rW3ts6nysctNTAtLTMzIGRibSovDQotICAgIEJZVEUgICAgICBiR3NtQ3VzdG9tUG93ZXI7ICAgIC8qyKHWtbe2zqcxLTMxLDDOqs7e0KfWtSy4w9a10+twb3dlciBjb250cm9sIGxldmVsy/fS/da10rvWwqOsysfL99L91rUgsrvKx9XmyrW5psLKZEJtKi8NCi19VF96QXRpX05WX01heFR4UG93ZXI7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgIGJVZUNhdGVnb3J5T2ZDYTsNCi0gICAgQllURSAgICAgYlVlQ2F0ZWdvcnk7DQotICAgIEJZVEUgICAgIGFiYWRkaW5nWzJdOw0KLX1UX3pBdGlfTlZfVWVJbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgIGJHcHJzU3VwcG9ydDsNCi0gICAgQllURSAgICBiRWdwcnNTdXBwb3J0Ow0KLSAgICBCWVRFICAgIGJHcHJzTXVsdGlTbG90Q2FwYTsNCi0gICAgQllURSAgICBiRWdwcnNNdWx0aVNsb3RDYXBhOw0KLX1UX3pBdGlfTlZfR3Byc0NsYXNzOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgIGJGZE1vZGU7DQotICAgIEJZVEUgICAgYkZkVGltZXJMZW5ndGg7DQotICAgIEJZVEUgICAgYWJhZGRpbmdbMl07DQotfVRfekF0aV9OVl9GZFNldDsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICBiRWdwcnNTdXBwb3J0Ow0KLSAgICBCWVRFICAgIGI4UHNrTW9kQ2FwYTsNCi0gICAgQllURSAgICBiTW9kQk11bHRpQ2xhc3NTdXBwOw0KLSAgICBCWVRFICAgIGJFZ3Byc011bHRpU2xvdENhcGE7DQotICAgIEJZVEUgICAgYjhQc2tNdWx0aXNsb3RQd3JDYXBhOw0KLSAgICBCWVRFICAgIGJFZ3Byc0V4dER5bkFsbG9jOw0KLSAgICBCWVRFICAgIGI4UHNrOw0KLSAgICBCWVRFICAgIGI4UHNrUHdyQ2FwYTE7DQotICAgIEJZVEUgICAgYjhQc2tQd3JDYXBhMjsNCi0gICAgQllURSAgICBiTXVzY0NhcFJlZHVjdGlvbmZvckRsRHVhbENhcnJpZXJTdXBwb3J0Ow0KLSAgICBCWVRFICAgIGJNdWx0aVNsb3RDYXBSZWR1Y3Rpb25mb3JEbER1YWxDYXJyaWVyOw0KLSAgICBCWVRFICAgIGJQYWRkaW5nOw0KLX1UX3pBdGlfTlZfRWdwcnNTZXQ7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgYkFwTWVtQ2FwYTsvKkFQtszQxbTmtKK/1bzkyse38cL6o6wwOrK7wvqjrDE6wvoqLw0KLSAgICBCWVRFIGFiUGFkZGluZ1szXTsNCi19VF96QXRpX05WX0FwTWVtQ2FwYTsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgYlQxVGltZXJMZW47LypFUERDULaoyrHG91QxtcTKsbOko6y1pc67o7rD6ywwLTI1NSwgMCAgse3KvraoyrHG98qxs6TO3tCno6yyu8b0tq+0y7nmsdy5psTcKi8NCi0gICAgQllURSAgICAgYWJhZGRpbmdbM107DQotfVRfekF0aV9OVl9FcGRjcFRpbWVyTGVuOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFIGJNb2RlOyAgICAvKsrHt/HG9NPDutqw18P7taU6MM6qsrvG9NPDutqw18P7taWjrDHOqsb008O62rDXw/u1pSovDQotICAgIEJZVEUgYWJQYWRkaW5nWzNdOw0KLX1UX3pBdGlfTlZfQmxhY2tXaGl0ZUxpc3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgIGJDbWQ7ICAgICAgICAvKiC/qrnY1rUsIDAtudix1Wdzbb3TyOvKp7DcYmFy0KHH+LmmxNyjrDEttPK/qmdzbb3TyOvKp7DcYmFy0KHH+LmmxNwqLw0KLSAgICBCWVRFICBiUGFkZGluZzsNCi0gICAgV09SRCB3VGltZXI7ICAgICAvKiBiYXLQocf4tcTKsbOko6y1pc67OsPrKi8gDQotfVRfekF0aV9OVl9HcnJDZWxsQmFyOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgYkdzbUNlbGxOdW1iZXI7DQotICAgIEJZVEUgICAgICAgICAgIGJUZENlbGxOdW1iZXI7DQotICAgIEJZVEUgICAgICAgICAgIGJXQ2VsbE51bWJlcjsNCi0gICAgQllURSAgICAgICAgICAgYkx0ZUNlbGxOdW1iZXI7DQotICAgIFRfel9Hc21DZWxsICAgIGF0R3NtQ2VsbFtaX01BWF9OR0NlbGxOdW1dOy8qR1NNwdrH+NDFz6KjrLC0UlNTSbTTx7+1vcj1xcXQ8qOsyv3X6TDOqtfux7/Qocf4Ki8NCi0gICAgVF96X1RkQ2VsbCAgICAgYXRUZENlbGxbWl9NQVhfTlVDZWxsTnVtXTsvKlREwdrH+MHQse2jrLC0UlNDULTTx7+1vcj1xcXQ8qOsyv3X6TDOqtfux7/Qocf4Ki8NCi0gICAgVF96X1dDZWxsICAgICAgYXRXQ2VsbFtaX01BWF9OVUNlbGxOdW1dOy8qV8Hax/jB0LHto6ywtFJTQ1C008e/tb3I9cXF0PKjrMr91+kwzqrX7se/0KHH+CovDQotICAgIFRfel9MdGVDZWxsICAgIGF0THRlQ2VsbFtaX01BWF9OTENlbGxOdW1dOy8qTFRFwdrH+MHQse2jrLC0UlNSULTTx7+1vcj1xcXQ8qOsyv3X6TDOqtfux7/Qocf4Ki8NCi19VF96QXRpX05WX05DZWxsSW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICBiRXF1aXBUeXBlOyAgICAgICANCi0gICAgQllURSAgICAgICBiU2VxTnVtOyAgICAgICAgICANCi0gICAgQllURSAgICAgICBhYlBhZGRpbmcxWzJdOw0KLSAgICBCWVRFICAgICAgIGFiRXF1aXBOYW1lW1pfREVWX01TSU5GT19NQVhfRVFVSVBOQU1FX0xFTl07ICANCi0gICAgQllURSAgICAgICBhYlBhZGRpbmcyWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgIGFiQm9yZE51bVtaX0RFVl9NU0lORk9fTUFYX0JPUkROQU1FX0xFTl07ICAgICANCi0gICAgQllURSAgICAgICBhYlBhZGRpbmczWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgIGFiU29mdFZlcnNpb25bWl9ERVZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9MRU5dOyANCi0gICAgQllURSAgICAgICBhYlBhZGRpbmc0WzJdOw0KLX1UX3pBdGlfTlZfTXNJbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICBiQmFuZDsgICAgICAgICAgLypCQU5EusUuyKHWtTEtLTY2IKOst9ax8LbU06ZCQU5EMSxCQU5EMi4uLkJBTkQ2NiovDQotICAgIEJZVEUgICAgIGFiUGFkaW5nWzNdOw0KLSAgICBEV09SRCAgICAgZHdNaW5EbEVhcmZjbjsgICAvKiC21NOmQkFORLXE1+7Qoc/C0NDGtbXjICovDQotICAgIERXT1JEICAgICBkd01heERsRWFyZmNuOyAgIC8qILbU06ZCQU5EtcTX7rTzz8LQ0Ma1teMgKi8NCi19VF96QXRpX052X09wZXJhdG9yTHRlQmFuZFJhbmdlOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICBiRmxhZzsgICAgLyrUy9OqyczGtbbO0MXPosrHt/HT0NCno6zIoda1o7rT0NCnWl9WQUxJRKOszt7Qp1pfSU5WQUxJRCovDQotICAgIEJZVEUgICAgICAgICAgICAgIGJQbG1uTnVtOyANCi0gICAgQllURSAgICAgICAgICAgICAgYkJhbmROdW07DQotICAgIC8vQllURSAgICAgICAgICAgICAgYkZyZXFOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgIGF0UGxtbkxpc3RQYWRkaW5nWzNdOy8qttTG6yovDQotICAgIFRfel9QbG1uSWQgICAgICAgIGF0UGxtbkxpc3RbWl9NQVhfT1BFUkFUT1JfUExNTl9OVU1dOyAgLyog1MvTqsnMUExNTsHQse0gKi8NCi0gICAgVF96QXRpX052X09wZXJhdG9yTHRlQmFuZFJhbmdlICAgICAgIHRPcGVyQmFuZFtaX01BWF9PUEVSQVRPUl9CQU5EX05VTV07IC8qINTL06rJzLao1sbGtbbOt7bOpyAqLw0KLSAgICAvL0RXT1JEICAgICAgICAgICBhZHdGcmVxTGlzdFtaX01BWF9PUEVSQVRPUl9GUkVRX05VTV07Lyog1MvTqsnMtqjWxrOj08PGtbXjwdCx7SAqLw0KLX1UX3pBdGlfTnZfT3BlcmF0b3JMaXN0SW5mbzsNCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgVF96QXRpX052X09wZXJhdG9yTGlzdEluZm8gICAgICAgdE9wZXJhdG9yTGlzdFtaX01BWF9PUEVSQVRPUl9OVU1dOyAgICAgIC8qINTL06rJzLao1sbGtbbO0MXPosHQse0gKi8NCi19VF96QXRpX052X09wZXJhdG9yTHRlQmFuZEluZm87DQotDQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICBiYW5kOw0KLSAgICBCWVRFICBwdW1heFtaX0FUX01BWF9SUElfTlJdOw0KLX1UX3pBdGlfTlZfQmFuZFJQSUNmZzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgVF96QXRpX05WX0JhbmRSUElDZmcgICB0R0JhbmRScGlDZmdbR1NNX01BWF9CQU5EX1JQSV9TVVBQT1JUXTsNCi19VF96QXRpX05WX0dTTV9SUElDZmc7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgIFRfekF0aV9OVl9CYW5kUlBJQ2ZnICAgdFdCYW5kUnBpQ2ZnW1dfTUFYX0JBTkRfUlBJX1NVUFBPUlRdOw0KLX1UX3pBdGlfTlZfV19SUElDZmc7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgIFRfekF0aV9OVl9CYW5kUlBJQ2ZnICAgICB0THRlQmFuZFJwaUNmZ1tMVEVfTUFYX0JBTkRfUlBJX1NVUFBPUlRdOw0KLX1UX3pBdGlfTlZfTFRFX1JQSUNmZzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgZmxhZzsgLy8wLS25psTcyKXKucTcLDEtLS25psTcyrnE3A0KLSAgICBCWVRFICAgIHBhZGRpbmdbM107DQotICAgIFRfekF0aV9OVl9XX1JQSUNmZyAgICAgdFdScGlDZmc7DQotICAgIFRfekF0aV9OVl9MVEVfUlBJQ2ZnICAgdEx0ZVJwaUNmZzsgDQotICAgIFRfekF0aV9OVl9HU01fUlBJQ2ZnICAgdEdzbVJwaUNmZzsNCi19VF96QXRpX05WX1JQSUNmZ0luZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICBiT25PZmY7LyrKx7fx1qez1k5JVFrX1LavuPzQwsqxx/gwsrvWp7PWLDHWp7PWKi8NCi0gICAgQllURSAgICAgYlJwdE1vZDsvKsqxx/ix5Luvyc+xqMSjyr0syKHWtbe2zqcwLTEqLw0KLSAgICBCWVRFICAgICBiWm1taVNldDsvKsrHt/G08r+qWk1NScnPsagsMC252LHVLDEttPK/qiovDQotICAgIEJZVEUgICAgIGJQYWRkaW5nOw0KLX1UX3pBdGlfTlZfTml0ekNmZzsNCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSBiQU1SU3VwQ2RlYzsNCi0gICAgQllURSBiQW1yUGF0aDsNCi0gICAgQllURSBhYlBhZGRpbmdbMl07DQotfVRfekF0aV9Odl9VbXRzQW1ySW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgYlQzNDExTGVuOy8qVDM0MTHKsbOkLLWlzrvD6yyz9rOn1rUwKi8NCi0gICAgQllURSAgICBiVDM0MTFUcnllZE51bTsvKlQzNDExs6LK1LTOyv0ss/azp9a1MCovDQotICAgIEJZVEUgICAgYkJhclRtTGVuOy8qQkFS0KHH+Mqxs6QstaXOu7fW1tMss/azp9a1MCovDQotICAgIEJZVEUgICAgYlBhZGRpbmc7DQotfVRfekF0aV9OVl9Nb2JpbGVDZmc7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgIGJDZHJ4Rmc7DQotICAgIEJZVEUgICAgYkFuckZnOw0KLSAgICBCWVRFICAgIGJTcHNGZzsNCi0gICAgQllURSAgICBiVHRpYnVuZGluZ0ZnOw0KLSAgICBCWVRFICAgIGJFZmRwY2hGZzsNCi0gICAgQllURSAgICBiU2xvdEZvcm1hdDRGZzsNCi0gICAgQllURSAgICBhYlBhZGRpbmdbMl07DQotfVRfekF0aV9OVl9VZUNhcGFDZmc7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY3Rpb247ICAgICAgIC8qMDogzrTJ6NbDy/i2qMa1teO78tChx/gsIDE6INLRyejWw8v4tqjGtbXju/LQocf4LCC9qNLps/azp9a1o7owKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0NlbGxQYXJhOyAgIC8qy/i2qLXE0KHH+KOsvajS6bP2s6fWtaO6MHhGRkZGKi8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0FyZmNuOyAgICAgICAvKsv4tqi1xMa1teOjrL2o0umz9rOn1rWjujB4RkZGRkZGRkYqLw0KLX1UX3pBdGlfTlZfWkxjQ2ZnOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBUX3pfUGxtbklkICB0cGxtbjsNCi0gICAgQllURSAgICAgICAgYlBhZGRpbmc7DQotICAgIERXT1JEICAgICAgIGR3Q2VsbEdsb2JhbElkOw0KLX0gVF96QXRpX05WX0NlbGxHbG9iSWQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMdGVDZWxsTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96QXRpX05WX0NlbGxHbG9iSWQgICAgICAgICAgYXRMdGVCbGFja0NlbGxbWl9NQVhfTFRFX0JMS0NFTExfTlVNXTsNCi19VF96QXRpX05WX0x0ZUJsa0NlbGw7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbWdmTW9kZTsgICAvKjA6IHBkdSwxOiB0eHQss/azp9a1MCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsgICANCi19VF96QXRpX05WX0NtZ2ZNb2RlOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTUNDMTo0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNQ0MyOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1DQzM6NDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6NDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07ICAgDQotfVRfekF0aV9OVl9DdXN0b21NY2M7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1MZW47Ly/X1r3ayv0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkNhbGxOdW1bWl9ERVZfTUFYX0JFRVBDQUxMX05VTV07DQotfVRfekF0aV9OVl9CZWVwTnVtSW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pBdGlfTlZfQmVlcE51bUluZm8gICAgICAgICAgIGF0Q2FsbEdyb3VwW1pfREVWX01BWF9CRUVQQ0FMTF9HUk9VUF07DQotfVRfekF0aV9OVl9CZWVwQ2FsbE51bTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bUxlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk1zaXNkbk51bVtaX0RFVl9NQVhfTVNJU0ROX05VTV07DQotfVRfekF0aV9OVl9Nc2lzZG47DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgIGJFY2FsbE1vZGU7LyowLW5vdCBzdXAgZWNhbGwgMS1lY2FsbCBvbmx5IDItZWNhbGwgJiBub3JtYWwgY2FsbCovDQotICAgIEJZVEUgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96QXRpX05WX0VjYWxsQ2FwYTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRlc3ROdW1MZW47Lyqz9rOn1rUwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVDZmdOdW1MZW47Lyqz9rOn1rUwKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlRlc3ROdW1bWl9ERVZfTUFYX0VDQUxMX05VTV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJSZUNmZ051bVtaX0RFVl9NQVhfRUNBTExfTlVNXTsNCi19VF96QXRpX05WX0VjYWxsTnVtOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgd1QyVGltZTsvKlQytqjKscb3yrGzpCy1pc67cyyz9rOn1rUzNjAwKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgd1Q3VGltZTsvKlQ3tqjKscb3yrGzpCy1pc67c6Oss/azp9a1MjAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICB3VDlUaW1lOy8qVDm2qMqxxvfKsbOkLLWlzrtzLLP2s6fWtTM2MDAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfekF0aV9OVl9FY2FsbFRpbWU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgYlNvZnRQb3dTdGF0Oy8qMC1kaXNhYmxlLCAxLXNsZWVwLCAyLXdha2V1cCyz9rOn1rUwKi8NCi0gICAgQllURSAgICBhYlBhZGRpbmdbM107DQotfVRfekF0aV9OVl9ScmNTdGF0dXM7DQotDQotI2lmZGVmIEJUUlVOS19TVVBQT1JUDQotdHlwZWRlZiBzdHJ1Y3QgIA0KLXsNCi0gICAgQllURSAgICBiSU9URmxhZzsNCi0gICAgQllURSAgICBiSXNUcnVuY1VzZXI7ICAgICAgLyrKx7fxyse8r8i608O7p6OsMDqyu8rHo6wxOsrHKi8NCi0gICAgQllURSAgICBiSXNTdWJXYXk7ICAgIC8qyse38c6qU3ViV2F5zNjK4rao1sYqLw0KLSAgICBCWVRFICAgIGJQYWRkaW5nOw0KLX1UX3pBdGlfTlZfTHRlUHR0SW5mbzsNCi0jZW5kaWYNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09uau5srrq1rW2qNLlPT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NQVhfQ1NHX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTUNCi0jZGVmaW5lIFpfTUFYX0hOQl9OQU1FX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNDggIC8qSE5CIE5hbWXX7rTzs6S2yCovDQotLypUTVNJKi8NCi10eXBlZGVmIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBUX3pfVE1TSVtaX1Rtc2lMZW5dOw0KLS8qUC1UTVNJKi8NCi10eXBlZGVmIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBUX3pfUFRNU0lbWl9QdG1zaUxlbl07DQotLypJTUVJKi8NCi10eXBlZGVmIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBUX3pfSU1FSVtaX0ltZWlMZW5dOw0KLS8qSU1FSVNWKi8NCi10eXBlZGVmIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBUX3pfSU1FSVNWW1pfSW1laVN2TGVuXTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09uau5sr3hubk9PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKkNTRyBJRCovDQotdHlwZWRlZiBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX3pfQ3NnSWQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJDU0dfaW5kW1pfTUFYX0NTR19OVU1dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbmd0aDsNCi19IFRfel9VaWNjSWRfVGV4dENTR1Q7DQotDQotLyo0LjQuNi4zICAgIEVGQ1NHVCAoQ1NHIFR5cGUpKSAzMTEwMi05NDAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSWNvbkxpbmtbWl9NQVhfQ1NHX05VTV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBiR3JhcGhpY1RhZzsvKlpfQ1NHX0xJTktVUkkgb3IgWl9DU0dfTElOS0lNRyAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzgwJyA9IHRoZSBHcmFwaGljIENTRyBUeXBlIEljb24gTGluayBpcyBhbiBVUkkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzgxJyA9IHRoZSBHcmFwaGljIENTRyBUeXBlIEljb24gTGluayBpcyBhIHBvaW50ZXIgdG8gdGhlIHJlY29yZCBudW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2UgaW4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJTUcsICovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvbkxpbmtMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBiSWNvblF1YWw7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfSBUX3pfVWljY0lkX0dwaGNDU0dUOw0KLQ0KLS8qYlRleHRDc2dGZ7vyYkdwaGNDc2dGZ9bDMaOsse3KvrjDvMfCvLK7zqq/1aOsDQotICAgIMj00OjSqsm+s/24w7zHwrzWtaOs1PK9q2JUZXh0Q3NnRmfS1LywYkdwaGNDc2dGZ7751sMxKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZUxlbjsgICAgLyrTw9PaseDC66Osx+vO8LjEtq8qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRleHRDc2dGZzsgIC8qyKHWtc6qMSC78iAwKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHcGhjQ3NnRmc7ICAvKsih1rXOqjEgu/IgMCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIFRfel9VaWNjSWRfVGV4dENTR1QgICAgICAgICAgICAgdFRleHRDc2c7ICAgIC8qYlRleHRDc2dGZ86qMcqx09DQpyovDQotICAgIFRfel9VaWNjSWRfR3BoY0NTR1QgICAgICAgICAgICAgdEdwaGNDc2c7ICAgIC8qYkdwaGNDc2dGZ86qMcqx09DQpyovDQotfSBUX3pfVWljY0lkX0NTR1Q7DQotDQotLyo0LjQuNi40ICAgIEVGSE5CTiAoSG9tZSAoZSlOb2RlQiBOYW1lKSAzMTEwMi04NDAqLw0KLS8qYlZhbExlbqOstbG/qMnPwuvB91RhZ7K7zqoweDgwyrGjrGJWYWxMZW7WwzCjrLHtyr7O3tPQ0KfK/b7dDQotICAgIMm+s/3KsaOsv8m9q2JWYWxMZW7WwzAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb2RlTGVuOyAgIC8qwuvB98q1vMqzpLbIo6zH687wuMS2ryovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsTGVuOyAgIC8q09DQp8r9vt2zpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSE5CTltaX01BWF9ITkJfTkFNRV9MRU5dOw0KLX0gVF96X1VpY2NJZF9ITkJOOw0KLQ0KLS8qQ1NHKi8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgVF96X1VpY2NJZF9DU0dUICAgICAgICAgICAgICAgICAgICAgICAgIHRDc2dJbmQ7DQotICAgIFRfel9VaWNjSWRfSE5CTiAgICAgICAgICAgICAgICAgICAgICAgICB0SG5iTmFtZTsNCi0gICAgVF96X0NzZ0lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDc2dJZDsNCi19VF96X0NTRzsNCi0NCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgVF96X1BsbW5JZCAgICAgICAgICAgICAgICAgICAgdFBsbW47DQotICAgIFRfel9DU0cgICAgICAgICAgICAgICAgICAgICAgIHRDc2dJbmZvOw0KLX1UX3pfQ3NnSWRMaXN0Ow0KLQ0KLS8qQ1NHIEluZm+jrEFTwdC+2UNTR9DFz6LTwyovICANCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgVF96X0FjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRBY3Q7DQotICAgIFRfel9Dc2dJZExpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NnOw0KLX1UX3pfQ3NnSW5mbzsNCi0NCi0vKklNU0kqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAgICAgLypCQ0TC67j2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYklkW1pfSW1zaUxlbl07IA0KLX1UX3pfSU1TSTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1zaUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pfSU1TSSAgICAgICAgICAgICAgICAgICAgICAgIHRJbXNpOw0KLQ0KLX1UX3pfVWljY0lkX0ltc2lJbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1laUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96X0lNRUkgICAgICAgICAgICAgICAgICAgICAgdEltZWk7DQotfVRfel9VaWNjSWRfSW1laUluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbWVpc3ZGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfel9JTUVJU1YgICAgICAgICAgICAgICAgICAgIHRJbWVpU3Y7DQotfVRfel9VaWNjSWRfSW1laVN2SW5mbzsNCi0NCi0vKiBaX1VpY2NJZF9IUExNTqGiIFpfVWljY0lkX1VQTE1OoaJaX1VpY2NJZF9PUExNTiAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96X1BsbW5BY3QgICAgICAgICAgICAgICAgICAgYXRMaXN0W1pfTWF4VWljY1BsbW5OdW1dOw0KLX1UX3pfVWljY0lkX1BsbW5JbmZvOw0KLQ0KLS8qICBaX1VpY2NJZF9VUExNTiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQbG1uVmFsaWRGZ1taX01heFVpY2NQbG1uTnVtXTsgIC8qseq8x3VwbG1uyse38dPQ0KejrDGjutPQ0KejrDCjus7e0KcqLw0KLSAgICBUX3pfUGxtbkFjdCAgICAgICAgICAgICAgICAgICAgIGF0TGlzdFtaX01heFVpY2NQbG1uTnVtXTsNCi19VF96X1VpY2NJZF9VUGxtbkluZm87DQotDQotLyogUGxtblNlbGVjdG9yKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heE51bTsgICAgICAgICAgICAgICAgICAgICAgLyrX7rTz19a92sr9ID44Ki8gICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qxuTW0NPQ0KfX1r3ayv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBsbW5WYWxpZEZnW1pfTWF4VWljY1BsbW5TZWxOdW1dOyAgLyqx6rzHcGxtbnNlbMrHt/HT0NCno6wxo7rT0NCno6wwo7rO3tCnKi8NCi0gICAgVF96X1BsbW5JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRQbG1uW1pfTWF4VWljY1BsbW5TZWxOdW1dOw0KLX1UX3pfVWljY0lkX1BsbW5TZWw7DQotDQotLyogWl9VaWNjSWRfU01TUCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWF4QWxwaGFJZExlbjsgICAgICAgICAgLyqx7cP3tbHHsL+o1qez1rXEQWxwaGFJZNfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxwaGFJZExlbjsgICAgICAgICAgICAgLypBbHBoYUlk1tDT0NCns6S2yCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhcmFtSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRQUGlkOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVFBEY3M7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRQVnA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQWxwaGFJZFtaX01heFNtc3BBbHBoYUxlbl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUUERlc3RBZGRbMTJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVFNTY0FkZFsxMl07DQotfVRfel9VaWNjSWRfU21zcDsNCi0NCi0vKjQuMi4xNiAgRUZGUExNTiAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhOdW07Lyqz9rOn1rU4NSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgICAgIC8qs/azp9a1MCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIFRfelBTX1BsbW5JZCAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0RlBsbW5bWlBTX1VJQ0NfTEVOX0ZQTE1OXTsvKrP2s6fWtcirMHhmZiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcxOw0KLX1UX3pQU19VSUNDX0ZQbG1uTGlzdCwNCi1UX3pfVUlDQ19GUGxtbkxpc3Q7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgINCt0unVu8TaxKO/6bbUVUlDQ7+oyv2+3bfDzsq907/aveG5ubao0uUgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogWl9VaWNjSWRfVUVJTkZPICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBUX3pfVE1TSSAgICAgICAgICAgICAgICAgICAgICB0VG1zaTsNCi0gICAgVF96X0xBSSAgICAgICAgICAgICAgICAgICAgICAgdExhaTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTHVTdGE7DQotfVRfel9VaWNjSWRfTG9jaTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFRfel9QVE1TSSAgICAgICAgICAgICAgICAgICAgIHRQdG1zaTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlB0bXNpU2lnWzNdOw0KLSAgICBUX3pfUkFJICAgICAgICAgICAgICAgICAgICAgICB0UmFpOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSdVN0YTsNCi19VF96X1VpY2NJZF9Qc0xvY2k7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUbXNpVmFsaWRGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfel9VaWNjSWRfTG9jaSAgICAgICAgICAgICAgIHRMb2NpOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLX1UX3pfVWljY0lkX0xvY2lJbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHRtc2lWYWxpZEZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96X1VpY2NJZF9Qc0xvY2kgICAgICAgICAgICAgdFBzTG9jaTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlszXTsNCi19VF96X1VpY2NJZF9Qc0xvY2lJbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3NCa0RhdGFGZzsgICAvKiBjc9Pyyv2+3bG4t93T0NCn0NSx6sq2o6zIoda1Wl9WQUxJRC9aX0lOVkFMSUQgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHNCa0RhdGFGZzsgICAvKiBwc9Pyyv2+3bG4t93T0NCn0NSx6sq2o6zIoda1Wl9WQUxJRC9aX0lOVkFMSUQgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXBzQmtEYXRhRmc7ICAvKiBMVEXK/b7dsbi33dPQ0KfQ1LHqyrajrMih1rVaX1ZBTElEL1pfSU5WQUxJRCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pfVWljY0lkX0JhY2t1cERhdGFDdHJsSW5mbzsNCi0NCi0vKiBaX1VpY2NJZF9FQ0MgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVjY0xlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypFQ0O6xcLr09DQp7OktsijrLOktsjOqtfWvdq49sr9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkVjQ29kZVszXTsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heEFscGhhSWROdW07ICAgICAgICAgICAgICAgICAgICAgLypBcGxoYdfutPOzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxwaGFJZE51bTsgICAgICAgICAgICAgICAgICAgICAgICAvKkFwbGhh09DQp7OktsgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQWxwaGFJZFsyNTVdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRWNDYXRlZ29yeTsNCi19VF96X1VpY2NJZF8zR0VjYzsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRWNjTGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRUNDusXC69PQ0KezpLbIo6yzpLbIzqrX1r3auPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJFY0NvZGVbM107DQotfVRfel9VaWNjSWRfRWNjTnVtOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRWNjTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96X1VpY2NJZF9FY2NOdW0gICAgICAgICAgICAgdEVjY0NvZGVbNV07DQotfVRfel9VaWNjSWRfMkdFY2M7DQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFY2NGbGFnOyAgICAgICAgICAgICAgLyrTydPaMkfT6zNHveG5uc/gsu7Mq7Tzo6xlY2PU2jNH1tDSu7TO1rvE3LbByKHSu8z1vMfCvA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICq1q9TaMkfW0NK7tM7ItL/J0tS9q8v509BlY2O6xcLrtry2wbP2DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjGjunVzaW0gIDKjunNpbSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICB1bmlvbg0KLSAgICB7DQotICAgICAgICBUX3pfVWljY0lkXzNHRWNjICAgICAgICAgIHQzR0VjYzsgICAgICAgICAgICAgICAgLyozR0VDQ73209DSu8z1RUNDusXC67zHwrwqLw0KLSAgICAgICAgVF96X1VpY2NJZF8yR0VjYyAgICAgICAgICB0MkdFY2M7ICAgICAgICAgICAgICAgIC8qMkdFQ0Ow/Lqsy/nT0LXERUNDusXC6yovDQotICAgIH1WYWx1ZTsNCi19VF96X1VpY2NJZF9FY2M7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFY2NOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pfVWljY0lkX0VjYyAgICAgICAgICAgICAgICAqcEVjY0xpc3Q7DQotfVRfel9VaWNjSWRfRWNjSW5mbzsNCi0NCi0vKiBaX1VpY2NJZF9FbWxwcCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJpTGV2ZWw7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZjU2V0dXBDb25kOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96X1VpY2NJZF9FbWxwcDsNCi0NCi0vKiBaX1VpY2NJZF9DU0tFWSwgWl9VaWNjSWRfUFNLRVkgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYktzaTsgICAgICAgICAgIC8qS2V5IFNldCBJZGVudGlmaWVyIEtTSSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pfQ0sgICAgICAgICAgICAgICAgICAgICAgICB0Q2s7DQotICAgIFRfel9JSyAgICAgICAgICAgICAgICAgICAgICAgIHRJazsNCi19VF96X1VpY2NJZF9VbXRzU2VjS2V5Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2tzbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJLY1s4XTsNCi19VF96X1VpY2NJZF9Hc21TZWNLZXk7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOZXdGZzoxOyAgICAgICAgICAgIC8qINa4yr5DUy9QU7CyyKuyzsr9yse38c6q0MIgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXRyYW5GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHc21GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo1Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96X1VpY2NJZF9VbXRzU2VjS2V5ICAgICAgICAgdFVtdHNLZXk7DQotDQotICAgIFRfel9VaWNjSWRfR3NtU2VjS2V5ICAgICAgICAgIHRHc21LZXk7DQotfVRfel9VaWNjSWRfU2VjS2V5Ow0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZU51bTsgICAgICAgLyrTw9LUvMfCvE5ldFBhcsLrwffOxLz+tPPQoSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pfQ2VsbExpc3QgICAgICAgICAgICAgICAgICB0Q2VsbExpc3Q7ICAgICAgLyrUvLaoo7oNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpR1NN0KHH+MHQse1hdEdDZWxsTGlzdNbQo6y12tK7uPbOqrf+zvHQocf4o7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpVEREoaJGRETGtcLKwdCx7WFiVEZyZXFMaXN0oaJhYldGcmVxTGlzdNbQo6y12tK7uPbWuLaotcS++c6qzazGtca1teMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMp0KHH+L75DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX1UX3pfVWljY0lkX0NlbGxJbmZvOw0KLQ0KLS8qNC4yLjE4IEVGQUQgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVlT3BlcmFNb2RlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJPRk07ICAgICAgICAgICAgLypiT0ZNPTA6IE9GTSB0byBiZSBkZWFjdGl2YXRlZCBieSB0aGUgTUUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk9GTT0xOiBPRk0gdG8gYmUgYWN0aXZhdGVkIGJ5IHRoZSBNRSAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxsb3dlZENzZ0xpc3Q7ICAgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwOiBBbGxvd2VkIENTRyBMaXN0IG5vdCBpbmhpYml0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTogQWxsb3dlZCBDU0cgTGlzdCBpbmhpYml0ZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1uY0xlbkZnOyAgICAgIC8qMTogtObU2qOsMKO6sru05tTaKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW5jTGVuOyAgICAgICAgLyogT25seSB0aGUgdmFsdWVzICcwMDEwJyBhbmQgJzAwMTEnIGFyZSBjdXJyZW50bHkgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfel9VaWNjSWRfQWQ7DQotDQotLyo0LjIuNiBFRkhQUExNTiAgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSHBQbG1uU3JoUHJkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pfVWljY0lkX0hwUGxtblNyaFByZDsNCi0NCi0vKjQuMi4xNSBFRkFDQyAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQUNDWzJdOyAvKkJUWUUxIGJpdDEtLS1OdW1vZkFjYzogMDgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRZRTEgYml0OC0tLU51bW9mQWNjOiAxNQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUWUUyIGJpdDEtLS1OdW1vZkFjYzogMDANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRZRTIgYml0OC0tLU51bW9mQWNjOiAwNw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgvt/M5bLOvPsgIDMxLjEwMiBFZkFjYw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96X1VpY2NJZF9BQ0M7DQotDQotLyo0LjIuNDAgRUZBQWVNICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFhZW07ICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsgDQotfVRfel9VaWNjSWRfQWFlbTsNCi0NCi0vKjQuMi41MSBFRlN0YXJ0SGZuICAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXJ0Q3M7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhcnRQczsNCi19VF96X1VpY2NJZF9TdGFydEhmbjsNCi0NCi10eXBlZGVmIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF96X1VpY2NJZF9UaHJlc2hvbGQ7DQotDQotLyogWl9VaWNjSWRfU1RBUlQgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFRfel9VaWNjSWRfU3RhcnRIZm4gICAgICAgICAgICAgICAgICAgICAgICB0U3RhcnRIZm47DQotICAgIFRfel9VaWNjSWRfVGhyZXNob2xkICAgICAgICAgICAgICAgICAgICAgICB0VGhyZXNob2xkOw0KLX1UX3pfVWljY0lkX1N0YXJ0Ow0KLQ0KLS8qIFpfVWljY0lkX0JDQ0ggKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQmNjaFsxNl07DQotfVRfel9VaWNjSWRfU2ltQmNjaDsNCi0NCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkxURSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qNC4yLjkxIEVQU0xPQ0kgMzExMDItODQwKi8NCi0NCi0vKkdVVEkqLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJZFR5cGU6MzsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT29yRToxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo0Ow0KLSAgICANCi0gICAgVF96X1BsbW5JZCAgICAgICAgICAgICAgICAgICAgdFBsbW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1NRUdST1VQSURbMl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1NRUNPREU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1UTVNJWzRdOyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pfR1VUSTsNCi0NCi0vKkVQUyBMb2NpKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVF96X0dVVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEd1dGk7ICAgICAgICAgICAgICAgIA0KLSAgICBUX3pfVEFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VGFpOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUYXVTdGF0dXMgOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotfVRfel9VaWNjSWRfRXBzTG9jaTsNCi0NCi0vKjQuMi44LjYgTFJQTE1OU0kgMzExMDItODQwKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTHJwbG1uU2k7DQotICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96X1VpY2NJZF9McnBsbW5TaTsNCi0NCi0vKjQuMi44NCBFSFBMTU4gMzExMDItODQwKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07ICAgICAgICAgICAgICAgLyrC68H31tDKtbzK09DQp7j2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfel9QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0RWhwbG1uW1pfTUFYX0xFTl9FSFBMTU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96X1VpY2NJZF9FaHBsbW47DQotDQotLyo0LjIuOTIgICAgRUZFUFNOU0MgKEVQUyBOQVMgU2VjdXJpdHkgQ29udGV4dCkgMzExMDItODQwKi8NCi0NCi0vKktTSSovDQotdHlwZWRlZiAgQllURSAgVF96X1VpY2NJZF9LU0lfQVNNRTsNCi0NCi0vKlVMIE5BUyBDT1VOVCovDQotdHlwZWRlZiAgRFdPUkQgVF96X1VpY2NJZF9VTF9OQVNfQ09VTlQ7DQotDQotLypETCBOQVMgQ09VTlQqLw0KLXR5cGVkZWYgIERXT1JEIFRfel9VaWNjSWRfRExfTkFTX0NPVU5UOw0KLQ0KLS8qQUxHICBJRCovDQotdHlwZWRlZiAgQllURSAgVF96X1VpY2NJZF9TRUxFQ1RfQUxHX0lEOw0KLQ0KLS8qQVNNRSBLRVkqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW5ndGg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYktleXNbWl9NQVhfTEVOX0FTTUVfS0VZXTsNCi19IFRfel9VaWNjSWRfQVNNRV9LRVk7DQotDQotLypJTlQgS0VZKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGVuZ3RoOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJLZXlzW1pfTUFYX0xFTl9OQVNJTlRfS0VZXTsNCi19IFRfel9VaWNjSWRfTkFTSU5UX0tFWTsNCi0NCi0vKkVOQyBLRVkqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW5ndGg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYktleXNbWl9NQVhfTEVOX05BU0VOQ19LRVldOw0KLX0gVF96X1VpY2NJZF9OQVNFTkNfS0VZOw0KLQ0KLS8qTkggUEFSQSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxlbmd0aDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFyYVtaX01BWF9MRU5fTkhfT1JfTkNDX1BBUkFdOw0KLX0gVF96X1VpY2NJZF9OSF9QQVJBOw0KLQ0KLS8qTkNDIFBBUkEqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW5ndGg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhcmFbWl9NQVhfTEVOX05IX09SX05DQ19QQVJBXTsNCi19IFRfel9VaWNjSWRfTkNDX1BBUkE7DQotDQotLypFUFMgTkNTKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZUxlbjsgIC8qwuvB97OktsijrNPD09qx4MLro6zH687wuMS2ryovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIFRfel9VaWNjSWRfS1NJX0FTTUUgICAgICAgICAgICAgICAgICAgICAgdEtzaTsgICAgICAgICAgLyogQllURSAqLw0KLSAgICBUX3pfVWljY0lkX1NFTEVDVF9BTEdfSUQgICAgICAgICAgICAgICAgIGJzZWxlY3RlZF9hbGc7IC8qIEJZVEUgKi8NCi0gICAgDQotICAgIFRfel9VaWNjSWRfQVNNRV9LRVkgICAgICAgICAgICAgICAgICAgICAgdEFzbWVLZXk7DQotICAgIFRfel9VaWNjSWRfVUxfTkFTX0NPVU5UICAgICAgICAgICAgICAgICAgdFVsQ291bnQ7DQotICAgIFRfel9VaWNjSWRfRExfTkFTX0NPVU5UICAgICAgICAgICAgICAgICAgdERsQ291bnQ7ICAgIA0KLX0gVF96X1VpY2NJZF9FUFNOU0M7DQotDQotLyo0LjQuNi4yICAgIEVGQUNTR0wgKEFsbG93ZWQgQ1NHIExpc3RzKSAzMTEwMi05NDAqLw0KLXR5cGVkZWYgc3RydWN0IHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZUxlbjsgLyrC68H3s6S2yKOsseDC68q508OjrM7w0N64xCovDQotCUJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsaWRGZzsgIC8qzsS8/sr9vt3T0NLi0uWjrNTy1sMxo6zOxLz+yv2+3c6qv9WjrNTy1sMwKi8NCi0JQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDc2dUeXBlSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSG5iTmFtZUluZDsNCi0gICAgDQotICAgIFRfel9QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgdFBsbW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIFRfel9Dc2dJZCAgICAgICAgICAgICAgICAgICAgICAgdENzZ0lkOw0KLX0gVF96X1VpY2NJZF9BQ1NHTDsNCi0NCi0gLyo0LjQuNi41ICAgIEVGT0NTR0wgKE9wZXJhdG9yIENTRyBMaXN0cykgMzExMDItOTQwKi8NCi10eXBlZGVmIHN0cnVjdCB7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvZGVMZW47IC8qwuvB97OktsijrLHgwuvKudPDo6zO8NDeuMQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZhbGlkRmc7ICAvKs7EvP7K/b7d09DS4tLlo6zU8tbDMaOszsS8/sr9vt3Oqr/Vo6zU8tbDMCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3NnVHlwZUlkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhuYk5hbWVJbmQ7DQotICAgIA0KLSAgICBUX3pfUGxtbklkICAgICAgICAgICAgICAgICAgICAgICAgdFBsbW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIFRfel9Dc2dJZCAgICAgICAgICAgICAgICAgICAgICAgICB0Q3NnSWQ7DQotfSBUX3pfVWljY0lkX09DU0dMOw0KLQ0KLSAvKjQuNC41LjExIEVGSFBMTU5EQUkgKEhQTE1OIERpcmVjdCBBY2Nlc3MgSW5kaWNhdG9yKSAzMTEwMi05NDAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSHBsbW5EYWk7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICcwMCcgLSBIUExNTiBEaXJlY3QgQWNjZXNzIEluZGljYXRvciBpcyBkaXNhYmxlZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogJzAxJyAtIEhQTE1OIERpcmVjdCBBY2Nlc3MgSW5kaWNhdG9yIGlzIGVuYWJsZWQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96X1VpY2NJZF9IcGxtbmRhaTsNCi0NCi0vKjQuNC42LjYgRUZPQ1NHVCAoT3BlcmF0b3IgQ1NHIFR5cGUpIDMxMTAyLTk0MCovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvZGVMZW47ICAgIC8q08PT2rHgwuujrMfrzvC4xLavKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUZXh0Q3NnRmc7ICAvKsih1rXOqjEgu/IgMCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR3BoY0NzZ0ZnOyAgLyrIoda1zqoxILvyIDAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBUX3pfVWljY0lkX1RleHRDU0dUICAgICAgICAgICAgIHRUZXh0Q3NnOyAgICAvKmJUZXh0Q3NnRmfOqjHKsdPQ0KcqLw0KLSAgICBUX3pfVWljY0lkX0dwaGNDU0dUICAgICAgICAgICAgIHRHcGhjQ3NnOyAgICAvKmJHcGhjQ3NnRmfOqjHKsdPQ0KcqLw0KLX0gVF96X1VpY2NJZF9PQ1NHVDsNCi0NCi0vKjQuNC42LjcgRUZPSE5CTiAoT3BlcmF0b3IgSG9tZSBOb2RlQiBOYW1lKSAzMTEwMi05NDAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb2RlTGVuOyAgIC8qwuvB98q1vMqzpLbIo6zH687wuMS2ryovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmFsTGVuOyAgIC8q09DQp8r9vt2zpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiSE5CTltaX01BWF9ITkJfTkFNRV9MRU5dOw0KLX0gVF96X1VpY2NJZF9PSE5CTjsNCi0NCi0vKiA0LjUuOSAgICBFRlBTSVNNU0MgKFB1YmxpYyBTZXJ2aWNlIElkZW50aXR5IG9mIHRoZSBTTS1TQykgMzExMDItOTQwICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVXJpVGx2RGF0YVtaX01BWF9MRU5fVVJJX1RMVl9EQVRBXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXJpTWF4TGVuOw0KLX1UX3pfVWljY0lkX1BzaXNtc2M7DQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKipMVEUgRU5EKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRNRU294bm5LL371rnQ3rjEDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qILK5s+TStc7xzOHKvsno1sMgKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNzc2lTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNzc3VTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pEZXZfQXRNZW1fQ3NzblNldDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01pbjsgLyptaW4gbWVzc2FnZSBJRFxEY3NzKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TWF4OyAvKm1heCBtZXNzYWdlIElEXERjc3MqLw0KLX1UX3pEZXZfQXRNZW1fQ0JTX1JhbmdlIDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNpbmdsZU51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmFuZ2VOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd1NpbmdsZUxpc3RbWl9ERVZfQXRNZW1fQ0JTX01BWF9NSURfTlVNXTsgLypzaW5nbGUgbWVzc2FnZSBJZCBsaXN0LCAwLi42NTUzNSwgMjMwNDEgKi8NCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQlNfUmFuZ2UgICAgICAgICAgYXRSYW5nZUxpc3RbWl9ERVZfQXRNZW1fQ0JTX01BWF9NSURfTlVNXTsgICAvKnJhbmdlIG1lc3NhZ2UgSUQgbGlzdCAqLyAgICAgICAgIA0KLX1UX3pEZXZfQXRNZW1fQ0JTX01pZFNldDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNpbmdsZU51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmFuZ2VOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlNpbmdsZUxpc3RbWl9ERVZfQXRNZW1fQ0JTX01BWF9EQ1NfTlVNXTsgLypzaW5nbGUgbWVzc2FnZSBEY3MgbGlzdCwgMjMwMzggKi8NCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQlNfUmFuZ2UgICAgICAgICAgYXRSYW5nZUxpc3RbWl9ERVZfQXRNZW1fQ0JTX01BWF9EQ1NfTlVNXTsgICAvKnJhbmdlIG1lc3NhZ2UgRGNzIGxpc3QqLw0KLX1UX3pEZXZfQXRNZW1fQ0JTX0Rjc1NldCA7ICANCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotLyogy9HN+LK/t9YgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlZ1NldDsgICAgICAgLyogQVTD/MHuK0NSRUe1xMno1sPWtSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDb3BzTW9kZTsgICAgICAvKiBBVMP8we4rQ09QU8no1sO1xNGhzfjEo8q9o6xkZWZhdWx0IHZhbHVlo7owICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvcHNGb3JtYXQ7ICAgIC8qIEFUw/zB7itDT1BTyejWw7XEzfjC58P7uPHKvaOsZGVmYXVsdCB2YWx1ZaO6MCAqLyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3Bsc0xpc3Q7ICAgICAgLyogQVTD/MHuK0NQTFO1xMno1sPWtSAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDZ3JlZ1NldDsgICAgICAvKiBBVMP8we4rQ0dSRUe1xMno1sPWtSAqLyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTeXNNb2RlOyAgICAgICAvKiBBVF5NT0RF1ve2r8nPsai/qrnYOiAwILnYsdWjrDG08r+qKi8gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwb2xGb3JtYXQ7ICAgIC8qIEFUw/zB7itDUE9MyejWw7XEzfjC58P7uPHKvSAqLwkNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiWm1taVNldDsgICAgICAgLyogQVTD/MHuK1pNTUm1xMno1sPWtSAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2VyZWdTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlZXJTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlYXJjaFBsbW5TZXQ7LyrKx7fx1MrQ7cvRzfi/qsnkxrW1xMno1sPWtStaU0NIUExNTiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcwOw0KLSANCi0vKkNDsr+31iovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNyY1NldDsgICAgICAgIC8qIENSQ8no1sMgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JTZXQ7ICAgICAgICAgLyogQVTD/MHuK0NStcTJ6NbDICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFvY1NldDsgICAgICAgIC8qICtDQU9DyejWw9b3tq/Jz7Gov6q52CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNjd2VTZXQ7ICAgICAgIC8qICtDQ1dFyejWw9b3tq/Jz7Gov6q52CovDQotDQotICAgIFRfekRldl9BdE1lbV9Dc3NuU2V0ICAgICAgICAgICAgdENzc25TZXQ7ICAgICAgIC8qIEFUw/zB7itDU1NOtcTJ6NbDICovICAgDQotDQotLypTTVOyv7fWKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2dzbXNTdmM7ICAgICAgLyogQVTD/MHuK0NHU01TtcTJ6NbD1rUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ21tc1NldDsgICAgICAgLyogQVTD/MHuK0NNTVO1xMno1sPWtSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDc21zU3ZjOyAgICAgICAvKiBBVMP8we4rQ1NNU7XEyejWwyAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbWdmTW9kZTsgICAgICAvKiAwIHBkdcSjyr0gMSB0ZXh0xKPKvSAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3NkaFNob3c7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcEZvRmc7ICAgICAgIC8qINa4yr5UUEZPyse38dPQ0KejrDAgzt7Qp6OsMSDT0NCnICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRwRm87ICAgICAgICAgLyogVFBEVbXa0ru49tfWvdogKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiVnBbN107ICAgICAgIC8qIDfX1r3auPHKvbXEVlAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzI7DQotDQotLypTU7K/t9YqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbGlyU2V0OyAvKiAwIGRpc2FibGUgMSBlbmFibGUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2xpcFNldDsgLyogMCBkaXNhYmxlIDEgZW5hYmxlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbHBTZXQ7IC8qIDAgZGlzYWJsZSAxIGVuYWJsZSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDY3dhU2V0OyAvKiAwIGRpc2FibGUgMSBlbmFibGUgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3VzZFNldDsgLyogMCBkaXNhYmxlIDEgZW5hYmxlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNuYXBTZXQ7IC8qIEFUw/zB7itDTkFQyejWw9a1Ki8NCi0gLypFVFdTsr+31iBMVEXQwtT2Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiWkVUV1NQcmltYXJ5U2V0Oy8qyejWw1pFVFdTUHJpbWFyeUluZNb3tq/Jz7Gov6q52C4gMCC52LHVo6wxIL+qxvQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJaRVRXU1NlY29uZGFyeVF1ZXJ5U2V0Oy8qyejWw1pFVFdTU2Vjb25kYXJ5SW5k1ve2r8nPsai/qrnYLiAwILnYsdWjrDEgv6rG9CovDQotDQotLyogU02yv7fWICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNwc2JTZXQ7ICAgICAgIC8qIEFUw/zB7qOsK0NQU0IgyejWwyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlblNldDsgICAgICAgICAvKkFUw/zB7qOsK0NFTiDJ6NbDKi8NCi0NCi0vKiBVSUNDsr+31iAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJadXN0YXRTZXQ7ICAgIC8qyejWwytaVVNUQVTW97avyc+xqL+qudguIDAgudix1aOsMSC/qsb0Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiWnVyZHlTZXQ7ICAgICAvKsno1sMrWlVSRFnW97avyc+xqL+qudguIDAgudix1aOsMSC/qsb0Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiWnVzbG90U2V0OyAgICAvKsno1sMrWlVTTE9U1ve2r8nPsai/qrnYLiAwILnYsdWjrDEgv6rG9CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlpwaW5zdGF0U2V0OyAgLyrJ6NbDK1pQSU5TVEFU1ve2r8nPsai/qrnYLiAwILnYsdWjrDEgv6rG9CovDQotDQotLyrLq7T90MLU9iovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlpwc3N0YXRTZXQ7ICAvKkFUIMP8we4rWlBTU1RBVLXEyejWw9a1Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSU1TUmVnU3RhdGU7IC8qQVQgw/zB7itaSU1TU1RBVEW1xMno1sPWtSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNpcmVwU2V0OyAgICAvKkFUIMP8we4rQ0lSRVC1xMno1sPWtSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNuZW1TZXQ7ICAgICAvKkFUIMP8we4rQ05FTbXEyejWw9a1Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiWmltc3BsdXNTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkF0ckluZFNldDsgICAgLypaQ0FSREFUUtb3tq/Jz7Gov6q52CovDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdEdXJhdGlvbjsgLypWVETJ6NbD1rUqLw0KLSNpZmRlZiBfVVNFX0xQUF9FQ0lEDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk10THJJbmRTZXQ7IC8qTVQgTFLWuMq+yc+xqL+qudgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0jZW5kaWYNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUm9hbU5ldFNlcmNoOyAvKrn6xNrC/tPOzfjC58vRy/e5psTcv6q52CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlY25TZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhdXNlSW5kU2V0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMzsNCi19VF96RGV2X0F0TWVtX01taWFfUHJpdmF0ZU1lbTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNtc092ZXJJcE5ldFN1cHA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pEZXZfQXRNZW1fVU1NX1Ntc092ZXJJcE5ldDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZvaWNlTW9kZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfekRldl9BdE1lbV9VTU1fQ3Ztb2Q7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVZU1vZGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pEZXZfQXRNZW1fVU1NX0NlbW9kZTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNtb2RNb2RlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUEFkZGluZ1szXTsNCi19VF96RGV2X0F0TWVtX0NDX0Ntb2RNb2RlOyAgICAgICAgICAgICAgICAgICAgICAgLyogQVTD/MHuK0NNT0S1xMno1sMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmNsYXNzTW9kZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfekRldl9BdE1lbV9DQ19GY2xhc3NNb2RlOyAgICAgICAgICAgICAgICAgICAgIC8qIEFUw/zB7itGQ0xBU1O1xMno1sMsxuTW0DEuMD0yNTQsIDIuMD0yNTUgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNzbnNTZXQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pEZXZfQXRNZW1fQ0NfQ3Nuc1NldDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBVMP8we4rQ1NOU7XEyejWwyAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDZ2F1dG87DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBiUzA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfekRldl9BdE1lbV9TTV9BdXRvUnNwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLS8qILPQ1NjStc7xwODQzSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3BlZWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5hbWU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pEZXZfQXRNZW1fQ0NfQ2JzdFNldDsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxMaW5lOyAgICAvKiAwOs/fwrcxo6jSxravo6ksMaO6z9/CtzKjqMz6zaijqSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96RGV2X0F0TWVtX0NDX0NhbGxMaW5lOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ25taU1kOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbm1pTXQ7ICAgICAgICAvKiBBVMP8we4rQ05NScno1sPWtSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbm1pQm07ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbm1pRHM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNubWlCZnI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pEZXZfQXRNZW1fU01TX0NubWlDbWQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJd3NGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNd3NGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUMUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk4yRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVDRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDozOw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JscFZlcnNpb246MjsgICAgLypSTFCw5rG+usUwoaIxoaIyICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNybHBJd3M6NjsgICAgICAgIC8qSVdGtb1VRbXEu6y2r7Swv9q089ChKi8NCi0gICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNybHBNd3M6NjsgICAgICAgIC8qVUW1vUlXRrXEu6y2r7Swv9q089ChKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MjsgICAgICAgICAgIC8qsaPB9M67Ki8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNybHBUMTsgICAgICAgICAgIC8qtaXOuzEwbXMgKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNybHBOMjsgICAgICAgICAgIC8q1ti0q7TOyv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDcmxwVDQ7ICAgICAgICAgICAvKrWlzrsxMG1zo6yw5rG+MtPQ0KcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96RGV2X0F0TWVtX1RBRl9DcmxwQ21kOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3NjYk1vZGU7IC8qMDphY2NlcHRlZCwgMTpub3QgYWNjZXB0ZWQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQlNfTWlkU2V0ICAgICAgICAgdENzY2JNaWQ7DQotICAgIFRfekRldl9BdE1lbV9DQlNfRGNzU2V0ICAgICAgICAgdENzY2JEY3M7DQotfVRfekRldl9BdE1lbV9DQlNfQ3NjYkNtZDsNCi0NCi0jaWZkZWYgX1VTRV9MUFBfRUNJRA0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5hYmxlOy8qMNbV1rlNT0xSLLeixvBNT0xSKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSG9yQWNjU2V0Oy8qyse38cno1sPLrsa9vqu2yDAtsrvJ6NbDMS3J6NbDKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSG9yQWNjOyAgICAvKsuuxr2+q7bIMC0xMjcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWZXJSZXE7ICAgLyq0udaxt73P8tKqx/MsMC0yRCwxLTNEKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVmVyQWNjU2V0Oy8qyse38cno1sO0udaxvqu2yCwwLbK7yejWwzEtyejWwyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZlckFjYzsgIC8qtLnWsb6rtsgwLTEyNyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZlbFJlcTsgIC8qy9nCytKqx/MwLTQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXBNb2Q7ICAvKsnPsajEo8q9MLWltM7Jz7GoMdbcxtrJz7GoKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGxhbmU7IC8qMC1DUCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICB3VGltZU91dDsgIC8qtaW0zraozruzrMqxyrG85DEtNjU1MzVzKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbnRlclZhbDsgIC8q1tzG2snPsajKscG9tM62qM67tcS85Lj0yrG85CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJObWVhUmVwW1pfTUFYX0VDSURfTkVNQVNUUl9MRU5dOyAgLypORU1Byc+xqLXE19a3+7SuuPHKvTAtJEdQUk1DKi8NCi19VF96RGV2X0F0TWVtX01vTHJDbWQ7DQotI2VuZGlmDQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiQXBuW1pfREVWX0F0TWVtX01BWF9BUE5fTEVOXTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBkcFR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRDb21wOyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIQ29tcDsgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSVB2NEFkZHJBbGxvYzsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVtZXJnZW5jeUluZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUENzY2ZEaXNjOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbWNuU2lnbkluZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBkcEFkZHJbWl9ERVZfQXRNZW1fTUFYX1BEUEFERFJfTEVOXTsgDQotfVRfekRldl9BdE1lbV9TbVBkcENvbnRleHQ7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhc3NXb3JkTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzZXJOYW1lTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYXNzV29yZFtaX0RFVl9BdE1lbV9NQVhfU1RSX0xFTisxXTsvKsPcwusqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJVc2VyTmFtZVtaX0RFVl9BdE1lbV9NQVhfU1RSX0xFTisxXTsvKtPDu6fD+yovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkNoYWxsZW5nZVtaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTl07LyrL5rv6yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJIYXNoUnNwW1pfREVWX0F0TWVtX01BWF9IQVNIX0xFTl07LypIQVNIKi8NCi19VF96RGV2X0F0TWVtX1NtUGNvQXV0aF9QYXBDaGFwSW5mbzsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXV0aFR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIFRfekRldl9BdE1lbV9TbVBjb0F1dGhfUGFwQ2hhcEluZm8gICAgdFBhcENoYXBJbmZvOw0KLX1UX3pEZXZfQXRNZW1fU21QY29BdXRoQ29udGV4dDsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbHRlcklkOyAgICAgICAvKiC31sDgxvex6rrFo6zIoda1MS4uOKGjyKHWtc6qMMqxse3KvrTLt9bA4Mb3zt7QpyAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmVJbmRleDsgICAgICAgLyogt9bA4Mb308XPyLy2ICovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJUHZGZzoxOyAgICAgICAgICAgLyogMD1JUHY0LDE9SVB2NiAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQaWROZXh0SGVhZGVyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9zVGNNYXNrRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWRkck1hc2tGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMb2NhbFBvcnRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1vdGVQb3J0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3BpRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRmxvd0xhYmVsRmc6MTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGlkTmV4dEhlYWRlcjsgIC8qIElQdjQgcHJvdG9jb2wgaWQvSVB2NiBuZXh0IGhlYWRlciAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb3NUYzsgICAgICAgICAgLyogdHlwZSBvZiBzZXJ2aWNlICh0b3MpIChpcHY0KS8gdHJhZmZpYyBjbGFzcyAoaXB2NikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9zVGNNYXNrRmc9Mcqx09DQpyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1hc2s7ICAgICAgICAgICAvKiBtYXNrKGlwdjQvaXB2NiksIGJUb3NUY01hc2tGZz0xyrHT0NCnKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlyZWN0aW9uOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFkZHJNYXNrWzMyXTsgIC8qILXY1re6zdHawuujrElQdjTKscewONfWvdrT0NCnICovDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0ZMb2NhbFBvcnQ7ICAgICAgLyrG8Mq8TG9jYWy2y7/at7bOp6OsyKHWtTAuLjY1NTM1LCBiTG9jYWxQb3J0Rmc9Mcqx09DQpyovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RMb2NhbFBvcnQ7ICAgICAgLyrW1da5TG9jYWy2y7/at7bOp6OsyKHWtTAuLjY1NTM1oaO1sXdGTG9jYWxQb3J00+t3VExvY2FsUG9ydM/gtcjKsaOsse3KvrWl0ru2y7/aDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxvY2FsUG9ydEZnPTHKsdPQ0KcqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdGUmVtb3RlUG9ydDsgICAgICAvKsbwyrxSZW1vdGW2y7/at7bOp6OsyKHWtTAuLjY1NTM1LGJSZW1vdGVQb3J0Rmc9Mcqx09DQpyovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RSZW1vdGVQb3J0OyAgICAgIC8q1tXWuVJlbW90ZbbLv9q3ts6no6zIoda1MC4uNjU1MzWho7Wxd0ZSZW1vdGVQb3J00+t3VFJlbW90ZVBvcnTP4LXIyrGjrLHtyr61pdK7tsu/2g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZW1vdGVQb3J0Rmc9Mcqx09DQpyovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTcGk7ICAgICAgICAgICAvKiBzZWN1cml0eSBwYXJhbWV0ZXIgaW5kZXggKi8NCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0Zsb3dMYWJlbDsgICAgIC8qIElQdjYgZmxvdyBsYWJlbCAqLw0KLX1UX3pEZXZfQXRNZW1fRmlsdGVyVHlwZTsNCi0NCi0vKkxURSDQwtT2Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3BhcmU6NTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUWNpRmxnOjE7ICAgICAgICAvKsrHt/G3tbvYUUNJKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVWxEbEdickZsZzoxOyAgICAvKsrHt/G3tbvYR0JSss7K/SovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVsRGxNYnJGbGc6MTsgICAgLyrKx7fxt7W72E1CUrLOyv0qLw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qv8nRobLOyv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJRY2k7ICAgICAgICAgICAgIC8qUUNJIG9mIEVQUyBRb1MqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1VsR2JyOyAgICAgICAgICAgLypVcGxpbmsgR0JSIGluIEVQUyBRb1OjrNLUa2Jwc86qtaXOuyovDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdEbEdicjsgICAgICAgICAgIC8qRG93bmxpbmsgR0JSIGluIEVQUyBRb1OjrNLUa2Jwc86qtaXOuyovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdVbE1icjsgICAgICAgICAgIC8qIFVwbGluayBNQlIgaW4gRVBTIFFvU6Os0tRrYnBzzqq1pc67Ki8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0RsTWJyOyAgICAgICAgICAgLypEb3dubGluayBNQlIgaW4gRVBTIFFvU6Os0tRrYnBzzqq1pc67Ki8NCi19VF96RGV2X0F0TWVtX0VzbVFvc0luZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFUW9zRmxhZzsgICAgICAgIC8qse3KvsrHt/HOqlFvc8iltqjS5aOsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtaO6Wl9NTUlBX1FPU19Ob3REZWZpbmWjrFpfTU1JQV9RT1NfRGVmaW5lKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfekRldl9BdE1lbV9Fc21Rb3NJbmZvICAgICAgICAgdEVRb3M7ICAvLytDR0VRT1MNCi0gICAgLypvbmx5IGZvciBSNyAtPmJlZ2luKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkZpbHRlclZhbGlkRmxhZ1taX0RFVl9BdE1lbV9NQVhJTlVNX0ZJTFRFUl07DQotICAgIFRfekRldl9BdE1lbV9GaWx0ZXJUeXBlICAgICAgICAgYXRFc21GaWx0ZXJbWl9ERVZfQXRNZW1fTUFYSU5VTV9GSUxURVJdOw0KLSAgICAvKm9ubHkgZm9yIFI3IC0+ZW5kKi8NCi19VF96RGV2X0F0TWVtX0VzbURhdGE7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmVjZWRlbmNlRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsYXlGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZWxpYWJpbGl0eUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBlYWtGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZWFuRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MzsNCi0gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmVjZWRlbmNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWxheTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVsaWFiaWxpdHk7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBlYWs7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lYW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pEZXZfQXRNZW1fU21Rb3NUeXBlOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGNGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWxpT3JkZXJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWxpRXJyU2R1Rmc6MTsgICAgICAgIA0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcmFmZlByaUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNkdUVyclJhdGlvRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzaWR1YWxCZXJGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhSYXRlVWxGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXhSYXRlRGxGZzoxOw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHdWFyUmF0ZVVsRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR3VhclJhdGVEbEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1heFNkdVNpemVGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcmFuc0RlbGF5Rmc6MTsgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUYzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsaXZlcnlPcmRlcjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsaXZlcnlFcnJTZHU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRyYWZmaWNQcmk7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTZHVFcnJSYXRpb1syXTsvKmFiU2R1RXJyUmF0aW9bMF06bSwgYWJTZHVFcnJSYXRpb1sxXTplLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMjnNSoxMC0zse3Kvs6qo7phYlNkdUVyclJhdGlvWzBdo701LGFiU2R1RXJyUmF0aW9bMV2jvTMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUmVzaWR1YWxCZXJbMl07ICAvKmFiUmVzaWR1YWxCZXJbMF06bSwgYWJSZXNpZHVhbEJlclsxXTplLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMjnNSoxMC0zse3Kvs6qo7phYlJlc2lkdWFsQmVyWzBdo701LGFiUmVzaWR1YWxCZXJbMV2jvTMqLw0KLSAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNTdGF0c0Rlc2NyaXB0b3I7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNpZ25hbEluZGljYXRpb247DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd01heFJhdGVVbDsgICAgLyq1pc67zqprYnBzKi8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd01heFJhdGVEbDsgICAgLyq1pc67zqprYnBzKi8NCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0d1YXJSYXRlVWw7ICAgLyq1pc67zqprYnBzKi8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0d1YXJSYXRlRGw7ICAgLyq1pc67zqprYnBzKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TWF4U2R1U2l6ZTsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VHJhbnNEZWxheTsgICAvKrWlzrvOqm1zKi8NCi19VF96RGV2X0F0TWVtX1NtRVFvc1R5cGU7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQZHBJbmZvRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGNvQXV0aEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjJHTWluUW9zRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiM0dNaW5Rb3NGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIyR1Fvc0ZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjNHUW9zRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MjsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJlQ2lkOyAgICAvLyAgQ0dEU0NPTlQNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29udEZsYWc7ICAvKiAwINK7tM7Jz8/CzsSjrCAxILb+tM7Jz8/CzsQgKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBUX3pEZXZfQXRNZW1fU21QZHBDb250ZXh0ICAgICAgIHRQZHBDb250ZXh0OyAgLy9DR0RDT05ULCBDR0RTQ09OVA0KLQ0KLSAgICBUX3pEZXZfQXRNZW1fU21QY29BdXRoQ29udGV4dCAgdFBjb0F1dGg7Ly9aR1BDT0FVVEgNCi0gDQotICAgIFRfekRldl9BdE1lbV9GaWx0ZXJUeXBlICAgICAgICAgYXRGaWx0ZXJbWl9ERVZfQXRNZW1fTUFYSU5VTV9GSUxURVJdOyAgLy9DR1RGVCDSu7TOvfbT0NK7uPajrM/CserKx3BmaWQNCi0NCi0gICAgVF96RGV2X0F0TWVtX1NtUW9zVHlwZSAgICAgICAgICB0MkdRb3M7ICAvL2NncXJlcQ0KLQ0KLSAgICBUX3pEZXZfQXRNZW1fU21Rb3NUeXBlICAgICAgICAgIHQyR01pblFvczsgLy9jZ3FtaW4NCi0NCi0gICAgVF96RGV2X0F0TWVtX1NtRVFvc1R5cGUgICAgICAgICB0M0dRb3M7IC8vY2dlcXJlcQ0KLQ0KLSAgICBUX3pEZXZfQXRNZW1fU21FUW9zVHlwZSAgICAgICAgIHQzR01pblFvczsgLy9jZ2VxbWluDQotfVRfekRldl9BdE1lbV9TbUNpZERhdGE7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBUX3pEZXZfQXRNZW1fTW1pYV9Qcml2YXRlTWVtICAgICAgICAgdE1taWFQcml2YXRlTWVtOw0KLQ0KLSAgICBUX3pEZXZfQXRNZW1fVU1NX0N2bW9kICAgICAgICAgICAgICAgdEN2bW9kOw0KLQ0KLSAgICBUX3pEZXZfQXRNZW1fVU1NX0NlbW9kZSAgICAgICAgICAgICAgdENlbW9kZTsNCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9VTU1fU21zT3ZlcklwTmV0ICAgICAgICB0U21zT3ZlcklwTmV0Ow0KLSAgICANCi0gICAgVF96RGV2X0F0TWVtX0NDX0Ntb2RNb2RlICAgICAgICAgICAgIHRDbW9kTW9kZTsNCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQ19DYnN0U2V0ICAgICAgICAgICAgICB0Q2JzdFNldDsNCi0NCi0gICAgVF96RGV2X0F0TWVtX0NDX0NhbGxMaW5lICAgICAgICAgICAgIHRDYWxsTGluZTsNCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQ19GY2xhc3NNb2RlICAgICAgICAgICB0RmNsYXNzTW9kZTsNCi0gICAgDQotICAgIFRfekRldl9BdE1lbV9DQ19Dc25zU2V0ICAgICAgICAgICAgICB0Q3Nuc1NldDsgDQotICAgIA0KLSAgICBUX3pEZXZfQXRNZW1fU01fQXV0b1JzcCAgICAgICAgICAgICAgdEF1dG9Sc3A7DQotICAgIA0KLSAgICBUX3pEZXZfQXRNZW1fU01TX0NubWlDbWQgICAgICAgICAgICAgdENubWlDbWQ7ICAgIA0KLSAgICANCi0gICAgVF96RGV2X0F0TWVtX1RBRl9DcmxwQ21kICAgICAgICAgICAgIHRDcmxwQ21kOw0KLSAgICANCi0gICAgVF96RGV2X0F0TWVtX0NCU19Dc2NiQ21kICAgICAgICAgICAgIHRDc2NiQ21kOw0KLSNpZmRlZiBfVVNFX0xQUF9FQ0lEDQotICAgIFRfekRldl9BdE1lbV9Nb0xyQ21kICAgICAgICAgICAgIHRNb0xyQ21kOw0KLSNlbmRpZg0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhICAgICAgICAgICAgICAgYXRDaWREYXRhTGlzdFtaX0RFVl9BdE1lbV9NQVhfQ0lEX05VTV07DQotDQotICAgIFRfekRldl9BdE1lbV9Fc21EYXRhICAgICAgICAgICAgICAgICBhdEVzbURhdGFMaXN0W1pfREVWX0F0TWVtX01BWF9DSURfTlVNXTsNCi19VF96RGV2X0F0TWVtOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgz/vPoreiy83P4LnYveG5ubao0uUgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhcnRGZzsgICAgICAgICAgICAvKsb0tq+x6ta+Ki8gICAgIA0KLSAgICBDSEFSICAqICAgICAgICAgICAgICAgICAgICAgcE1vZE5hbWU7ICAgICAgICAgICAgIC8qxKO/6cP7Ki8gICAgICANCi0gICAgQ0hBUiAgKiAgICAgICAgICAgICAgICAgICAgIHBUYXNrTmFtZTE7ICAgICAgICAgICAvKsSjv+nL+cr009q1xMq1wP3Su8jOzvHD+6OsyPTO3sjOzvHU8sih1rUiWl9NT0RVTEUiKi8gICAgDQotICAgIFpPU1NfVEFTS19JRCAgICAgICAgICAgICAgICB0VGFza0lkMTsgICAgICAgICAgICAgLyrKtcD90rvIzs7xSUSjrLfHyM7O8bvyyM7O8bK7xvS2r8qxyKHWtVpPU1NfSU5WQUxJRF9UQVNLX0lEKi8gICAgICAgDQotICAgIENIQVIgICogICAgICAgICAgICAgICAgICAgICBwVGFza05hbWUyOyAgICAgICAgICAgLyrEo7/py/nK9NPatcTKtcD9tv7Izs7xw/ujrMj0zt7Izs7x1PLIoda1IlpfTU9EVUxFIiovICAgICAgICANCi0gICAgWk9TU19UQVNLX0lEICAgICAgICAgICAgICAgIHRUYXNrSWQyOyAgICAgICAgICAgICAvKsq1wP22/sjOzvFJRKOst8fIzs7xu/LIzs7xsrvG9LavyrHIoda1Wk9TU19JTlZBTElEX1RBU0tfSUQqLyAgICAgICAgIA0KLX1UX3pfTW9kdWxlSW5mbzsNCi0NCi0NCi1leHRlcm4gVF96X01vZHVsZUluZm8gZ196X1N1Yk1kbFtaX1NVQk1ETF9OVU1dOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgz/vPoreiy83P4LnYveG5ubao0uUgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3TXNnSWQ7ICAgICAgICAgICAgICAgIC8qz/vPoklEKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTdGFja0luZGV4OyAgICAgICAgICAgIC8qyrXA/UlELMih1rUxLTIqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmdbM107DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3TXNnTGVuOyAgICAgICAgICAgICAgICAvKs/7z6KzpLbIKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjTW9kOyAgICAgICAgICAgICAgICAvKtS0xKO/6SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdE1vZDsgICAgICAgICAgICAgICAvKsS/tcTEo7/pKi8NCi0NCi0gICAgWk9TU19UQVNLX0lEICAgICAgICAgICAgICAgIHRTcmNUYXNrOyAgICAgICAgICAgICAgIC8q1LTIzs7xKi8gICAgICAgICAgICANCi0gICAgWk9TU19UQVNLX0lEICAgICAgICAgICAgICAgIHREZXN0VGFzazsgICAgICAgICAgICAgIC8qxL+1xMjOzvEqLw0KLQ0KLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgcE1zZzsgICAgICAgICAgICAgICAgICAgLyrP+8+i1rjV6yovDQotfVRfel9Nc2dJbmZvOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6RGV2X05WX0F0aVJlYWRJdGVtDQotKrqvyv25psTcOkFUSdeo08O2wU5Wuq/K/Q0KLSrK5CAgICAgICAgICAgIMjrOmJOdkl0ZW0g0qq2wbXETlbK/b7dy/fS/da1LLz7YXRpcHNjb20uaLrqtqjS5Q0KLSrK5CAgICAgICAgICAgILP2OnBWYWxCdWa2wbP2wLS1xMr9vt0s08m199PD1d/J6sfrxNq05g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgekRldl9OVl9BdGlSZWFkSXRlbShCWVRFIGJBdGlOdkl0ZW0sIFBCWVRFIHBWYWxCdWYpOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6RGV2X05WX0F0aVdyaXRlSXRlbQ0KLSq6r8r9uabE3DpBVEnXqNPD0LROVrqvyv0NCi0qyuQgICAgICAgICAgICDI6zpiTnZJdGVtINKq0LS1xE5Wyv2+3cv30v3WtSy8+2F0aXBzY29tLmi66rao0uUNCi0qyuQgICAgICAgICAgICCz9jpwVmFsQnVmtP3QtMjrtcTK/b7dLNPJtffTw9XftKvI6w0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgekRldl9OVl9BdGlXcml0ZUl0ZW0oQllURSBiQXRpTnZJdGVtLCBQQllURSBwVmFsQnVmKTsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrqvyv3D+7PGOnpEZXZfTlZfQXRpUmVmcmVzaEl0ZW0NCi0quq/K/bmmxNw6vavIq77W1tC1xNa1uPzQwtbBTlbW0A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIHpEZXZfTlZfQXRpUmVmcmVzaEl0ZW0oQllURSBiQXRpTnZJdGVtKTsNCi0NCi0jaWZkZWYgX1VTRV9GUkVRX0FNVE5WDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfR2V0QW10TnZMdGVCYW5kDQotuq/K/bmmxNw6u/HIoUFNVCBOViBMVEUgQkFORA0KLbe1ICC72DoNCi3XoiAgys06Yml0se3KvrXEQkFORLC0UFMgTlbW0Ex0ZUJhbmTLs9Dyt8UNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1WT0lEIHpEZXZfR2V0QW10TnZMdGVCYW5kKFBCWVRFIHBBbXRudkJhbmQpOw0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldEFtdE52RmRkQmFuZA0KLbqvyv25psTcOrvxyKFBTVQgTlYgRkREIEJBTkQNCi23tSAgu9g6DQot16IgIMrNOmJpdLHtyr61xEJBTkSwtFBTIE5W1tBGZGRCYW5ktcTLs9Dyt8UNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1WT0lEIHpEZXZfR2V0QW10TnZGZGRCYW5kKFBCWVRFIHBBbXRudkJhbmQpOw0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldEFtdE52VGRkQmFuZA0KLbqvyv25psTcOrvxyKFBTVQgTlYgVEREIEJBTkQNCi23tSAgu9g6DQot16IgIMrNOmJpdLHtyr61xEJBTkSwtFBTIE5W1tBUZGRCYW5ktcTLs9Dyt8UNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1WT0lEIHpEZXZfR2V0QW10TnZUZGRCYW5kKFBCWVRFIHBBbXRudkJhbmQpOw0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldEFtdE52R3NtQmFuZA0KLbqvyv25psTcOrvxyKFBTVQgTlYgR1NNIEJBTkQNCi23tSAgu9g6DQot16IgIMrNOmJpdLHtyr61xEJBTkSwtFBTIE5W1tBHc21CYW5ktcTLs9Dyt8UNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1WT0lEIHpEZXZfR2V0QW10TnZHc21CYW5kKFBCWVRFIHBBbXRudkJhbmQpOw0KLSNlbmRpZg0KLQ0KLWV4dGVybiBCWVRFIHpEZXZfSXNTdXBwb3J0R3NtQmFuZChWT0lEKTsNCi1leHRlcm4gQllURSB6RGV2X0lzU3VwcG9ydEZkZEJhbmQoVk9JRCk7DQotZXh0ZXJuIEJZVEUgekRldl9Jc1N1cHBvcnRUZGRCYW5kKFZPSUQpOw0KLWV4dGVybiBCWVRFIHpEZXZfSXNTdXBwb3J0THRlQmFuZChWT0lEKTsNCi1leHRlcm4gQllURSB6RGV2X01vZGlmeVRkZE9yRmRkKFZPSUQpOw0KLWV4dGVybiBCWVRFIHpEZXZfQ2hlY2tFcXVhdGVCYW5kKEJZVEUgYkN1c3RvbUJhbmQsIEJZVEUgYkVxdWF0ZUJhbmQpOw0KLWV4dGVybiBWT0lEIHpEZXZfUGNvQXV0aENpcGhlcihQQllURSBwQ29udGVudCxCWVRFIGJMZW4pOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6U3lzX0dldE5WQ21kVmFsdWUNCi26r8r9uabE3Dq78cihWlNFVMP8we7J6NbDtcS94bn7DQotyuTI6zpjbWQsWlNFVMP8we61xNfWt/u0rg0KLbe1ICC72DrD/MHutcTJ6NbDveG5+w0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gVUlOVDMyIHpTeXNfR2V0TlZDbWRWYWx1ZShjb25zdCBDSEFSKiBjbWQpOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6T3NzX0dldFN2Q29uZmlnDQotuq/K/bmmxNw6u/HIoUlNRUlTVtbQtcRTVg0KLcrkyOs6DQott7UgILvYOtK7uPbX1r3atcRTVg0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gVUlOVDggek9zc19HZXRTdkNvbmZpZyhWT0lEKTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9HZXRBdGlOdkl0ZW0NCi26r8r9uabE3DpOVklURU21xNOzyeQNCi3K5MjrOmJBdGlOdkl0ZW06QVRJyrnTw7XETlZJRA0KLcrks/Y6cGJOdkl0ZW06TU9ERU21xE5WSUQNCi23tbvYOlpfU1VDQ7PJuaYsWl9GQUlMyqew3A0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gQllURSB6RGV2X0dldEF0aU52SXRlbShCWVRFIGJBdGlOdkl0ZW0sIFBCWVRFIHBiTnZJdGVtKTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9OVldyaXRlSXRlbQ0KLbqvyv25psTcOk5WtsHQtL3Tv9oNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotZXh0ZXJuIEJZVEUgekRldl9OVldyaXRlSXRlbShCWVRFIGJOdkl0ZW0pOw0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGo7p6U2VuZExvZ1RvVHJhY2UNCi25psTcw+jK9qO6t6LLzdK7sONMT0fQxc+iDQotss7K/cu1w/ejuihJTikNCi0gICAgICAgICAgICBkd0xvZ0lkICAgICAgICAgTG9nIElEDQotICAgICAgICAgICAgd0xvZ0xlbiAgICAgICAgIExvZ9DFz6KzpLbIDQotICAgICAgICAgICAgcExvZyAgICAgICAgICAgIExvZ9DFz6LC68H3DQott7Ugu9gg1rWjus7eDQotxuTL/Mu1w/ejus7eDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotZXh0ZXJuIFZPSUQgelNlbmRMb2dUb1RyYWNlKEJZVEUgYlN0YWNrSW5kZXgsIERXT1JEICBkd0xvZ0lkLCBXT1JEICB3TG9nTGVuLFBCWVRFICBwTG9nKTsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0guq/K/cP7s8Y6IHpEZXZfQXRNZW1Xcml0ZUl0ZW0NCi0guq/K/bmmxNw6ILj5vt3I67LOo6zP8tCt0unVu8r9vt27urTmx/jW0NC0yOtJdGVtDQotIMrkICAgIMjrOiAgYkF0TWVtSXRlbSC0/dC0yOu1xEl0ZW1JZA0KLSAgICAgICAgICAgICAgICAgICAgIGJJZCAg0LTI61BEUM/Iudi1xENJRMqx09DQpw0KLSDK5CAgICCz9jogIHBBdE1lbUJ1ZiCjutC0yOu1xMirvtbK/b7dx/jK/b7doaPTybqvyv2199PD1d/J6sfrus3KzbfFxNq05g0KLSC3tSAgICC72DogIFpfU1VDQyCzybmmDQotICAgICAgICAgICAgICAgICAgICAgWl9GQUlMIMqnsNwNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotZXh0ZXJuIEJZVEUgekRldl9BdE1lbVdyaXRlSXRlbShCWVRFIGJBdE1lbUl0ZW0sIEJZVEUgYklkLCBQQllURSBwQXRNZW1CdWYsIEJZVEUgYkluc05vKTsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0guq/K/cP7s8Y6IHpEZXZfQXRNZW1SZWFkSXRlbQ0KLSC6r8r9uabE3Dq4+b7dyOuyzqOstsHIodCt0unVu8r9vt27urTmx/jW0LXESXRlbQ0KLSDK5CAgICDI6zogIGJBdE1lbUl0ZW0gtP22wcihtcRJdGVtSWQNCi0gICAgICAgICAgICAgICAgICAgICBiSWQgILbgQ0lEyrG0+MjrDQotIMrkICAgILP2OiAgcEF0TWVtQnVmIKO6tsGz9rXEyKu+1sr9vt3H+Mr9vt2ho9PJuq/K/bX308PV38nqx+u6zcrNt8XE2rTmDQotILe1ICAgILvYOiAgWl9TVUNDILPJuaYNCi0gICAgICAgICAgICAgICAgICAgICBaX0ZBSUwgyqew3A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4gQllURSB6RGV2X0F0TWVtUmVhZEl0ZW0oQllURSBiQXRNZW1JdGVtLCBCWVRFIGJJZCwgUEJZVEUgcEF0TWVtQnVmLCBCWVRFIGJJbnNObyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8ajunpFeHB0MlRyYWNlQWd0IA0KLbmmxNzD6Mr2o7rS7LOjuduy7Lqvyv0NCi2yzsr9y7XD96O6KElOKQ0KLSAgICAgICAgICAgIGJJbnNObzrKtcD9usWjrDAtMSCjutCt0unVuzGjrCAyo7rQrdLp1bsyDQotICAgICAgICAgICAgYk1vZElkOsSjv+m6xQ0KLSAgICAgICAgICAgIGR3RXJyY29kZTq07c7zwusNCi0gICAgICAgICAgICBkd1Jjdk1zZ0lkOr3TytW1xM/7z6JpZA0KLSAgICAgICAgICAgIGR3U2VuZE1zZ0lkOiC3orP2tcTP+8+iaWQNCi0gICAgICAgICAgICBwU3RyaW5nOiDX1rf7tK7Qxc+iLMTayN2yu8/eLLOktsjX7rrDz97WxtTaNTDX1r3a0tTE2izTybqvyv2199PD1d+wtNDo0qrM7tC0DQotICAgICAgICAgICAgcEZpbGVOYW1lOiCz9rTttcTOxLz+w/sNCi0gICAgICAgICAgICBkd0xpbmVOdW06ILP2tO21xM7EvP7Q0LrFDQotICAgICAgICAgICAgYlN0YXRlo7q498Sjv+nXtMysDQott7Ugu9gg1rWjus7eIA0KLcbky/zLtcP3o7ogDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBWT0lEIHpFeHB0MlRyYWNlQWd0KEJZVEUgYkluc05vLCBCWVRFIGJNb2RJZCwgRFdPUkQgZHdFcnJjb2RlLERXT1JEIGR3UmN2TXNnSWQsIERXT1JEIGR3U2VuZE1zZ0lkLCBDSEFSICpwU3RyaW5nLCBDSEFSICogcEZpbGVOYW1lLCBEV09SRCBkd0xpbmVOdW0sIEJZVEUgYlN0YXRlLCBCWVRFIGJFcnJMZXZlbCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8ajunpTZW5kTXNnIA0KLbmmxNzD6Mr2o7pNT0RFTcTauPfIzs7x0uyyvc/7z6K3osvNIA0KLbLOyv3LtcP3o7ooSU4pDQotICAgICAgICAgICAgcE1zZ0luZm86tP23osvNz/vPotDFz6INCi0gICAgICAgICAgICAoT1VUKQ0KLSAgICAgICAgICAgIHBDYXVzZTq07c7z1K3S8g0KLbe1ILvYINa1o7rO3iANCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelNlbmRNc2coVF96X01zZ0luZm8gKnBNc2dJbmZvLCBQRFdPUkQgcENhdXNlKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxqO6ek1zZ1RyYWNlIA0KLbmmxNzD6Mr2o7rQxcHuuPrX2b3Tv9q6r8r9DQotss7K/cu1w/ejuihJTikNCi0gICAgICAgICAgICAgICAgYkRpcmVjdDrP+8+it73P8ixaX1NJR1RSQUNFX1JFQ1bI68/7z6IsWl9TSUdUUkFDRV9TRU5EOrP2z/vPog0KLSAgICAgICAgICAgICAgICBwTXNnSW5mbzq0/bj619nP+8+i0MXPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBWT0lEIHpNc2dUcmFjZShCWVRFIGJEaXJlY3QsIFRfel9Nc2dJbmZvICogcE1zZ0luZm8pOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTZXRSZWxhdGl2ZVRpbWVyDQotuabE3MPoyvY6xvS2r7aoyrG6r8r9DQotss7K/cu1w/c6KElOKQ0KLSAgICAgICAgICAgIGR3VGltZXJMZW46yrGzpA0KLSAgICAgICAgICAgIGR3TXNnSWQ6s6zKsc/7z6JpZA0KLSAgICAgICAgICAgIGR3QXJnOri9vP7Qxc+iDQott7Ugu9gg1rWjus7eIA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gWk9TU19USU1FUl9JRCB6U2V0UmVsYXRpdmVUaW1lcihEV09SRCBkd1RpbWVyTGVuLCBEV09SRCBkd01zZ0lkLCBEV09SRCBkd0FyZyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elNldExvb3BUaW1lcg0KLbmmxNzD6Mr2Osb0tq/Rrbu3tqjKsbqvyv0NCi2yzsr9y7XD9zooSU4pDQotICAgICAgICAgICAgZHdUaW1lckxlbjrKsbOkDQotICAgICAgICAgICAgZHdNc2dJZDqzrMqxz/vPomlkDQotICAgICAgICAgICAgZHdBcmc6uL28/tDFz6INCi23tSC72CDWtToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFpPU1NfVElNRVJfSUQgelNldExvb3BUaW1lcihEV09SRCBkd1RpbWVyTGVuLCBEV09SRCBkd01zZ0lkLCBEV09SRCBkd0FyZyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6ek9zc19LaWxsVGltZXINCi25psTcw+jK9jrJvrP91ri2qLaoyrHG9w0KLbLOyv3LtcP3OnRpbWVyX2lkOiAgICC2qMqxxvdJRA0KLbe1ILvYINa1OrPJuaY6Wk9TU19TVUNDRVNTOyDKp7DcOlpPU1NfRVJST1INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFVJTlQzMiB6T3NzX0tpbGxUaW1lcihaT1NTX1RJTUVSX0lEIHRpbWVyX2lkKTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9HZXRDZnVuRmxhZw0KLbqvyv25psTcOrvxyKG/qrv6serWvg0KLcrkICDI6zrO3g0KLcrkICCz9jrO3g0KLbe1ICC72Dq/qrv6serWvg0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gQllURSB6RGV2X0dldENmdW5GbGFnKFZPSUQpOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldE1hbnVhbFNlYXJjaEZnDQotuq/K/bmmxNw61rjKvsrHt/HWp7PWv6q7+srWtq/L0c34xKPKvQ0KLbe1ICC72DowOiCyu9ans9YxOiDWp7PWDQot16IgIMrNOg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLWV4dGVybiBCWVRFICB6RGV2X0dldE1hbnVhbFNlYXJjaEZnKFZPSUQpOw0KLQ0KLS8vZXh0ZXJuICBVSU5UMzIgTnZyYW1fRmx1c2goVk9JRCk7DQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfR2V0VGFza0lkDQotuq/K/bmmxNw6u/HIocjOzvFJRA0KLcrkyOs6YlN1Yk1vZMSjv+m6xQ0KLSAgICAgICAgICAgICAgYkluc05vdLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLbe1u9jWtTrIzs7xSUS6xQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLw0KLWV4dGVybiBaT1NTX1RBU0tfSUQgIHpEZXZfR2V0VGFza0lkKEJZVEUgYlN1Yk1vZCwgQllURSBiSW5zTm8pOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldEF0TWVtRGF0YQ0KLbqvyv25psTcOiC78cihQXRNZW3K/b7dx/jK17XY1rcNCi3K5CAgyOs6zt4NCi3K5CAgs/Y6zt4NCi23tSAgu9g6IEF0TWVtyv2+3cf4yte12Na3DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotZXh0ZXJuIFBCWVRFIHpEZXZfR2V0QXRNZW1EYXRhIChCWVRFIGJJbnNObyk7DQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpEZXZfR2V0TnZEYXRhU2l6ZQ0KLbqvyv25psTcOiC78cihTlbK/b7dx/i089ChDQotyuQgIMjrOs7eDQotyuQgILP2Os7eDQott7UgILvYOiBOVsr9vt3H+LTz0KENCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gV09SRCB6RGV2X0dldE52RGF0YVNpemUgKFZPSUQpOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6RGV2X0dldE52RGF0YQ0KLbqvyv25psTcOiC78cihTlbK/b7dx/jK17XY1rcNCi3K5CAgyOs6zt4NCi3K5CAgs/Y6zt4NCi23tSAgu9g6IE5Wyv2+3cf4yte12Na3DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotZXh0ZXJuIFBCWVRFIHpEZXZfR2V0TnZEYXRhIChWT0lEKTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9HZXRSYXRWZXJzaW9uDQotuq/K/bmmxNw6u/HIobWxx7Cw5rG+1sbKvdDFz6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1CWVRFIHpEZXZfR2V0UmF0VmVyc2lvbihWT0lEKTsNCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekRldl9HZXRDU0ZCQW5zTW9kRmxhZw0KLbqvyv25psTcOkNTRkLTprTwt73KvQ0KLcrkICDI6zrO3g0KLcrkICCz9jrO3g0KLbe1ICC72DowOsjLuaTTprTwMTrX1Lav06a08A0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1CWVRFIHpEZXZfR2V0Q1NGQkFuc01vZEZsYWcoVk9JRCk7DQotDQotZXh0ZXJuIERXT1JEIHpEZXZfTlZJbml0X1N5c2NvbmZpZ0luaXQoVk9JRCk7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICC6r8r9w/sgICAgIKO6ek5hc19TZXRFdmVudFN0YXJ0DQotKiAgICC5psTcICAgICAgIKO6yejWw05BU8rCvP6/qsq8DQotKiAgICDK5Mjrss7K/SAgIKO6QllURSBiSW5zSWR4IC0tILT9u/qy4Mq1wP26xTogMCwgv6gxtP27+rLgOyAxLCC/qDK0/bv6suAuDQotICAgICAgICAgICAgICAgICAgQllURSBiRXZlbnQgLS0g0rXO8bbU06a1xMv30v0oMC4uLjMxKTogy/fS/TC1xNPFz8i8ttfuuN8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgvt/M5bqs0uXH67z7uuq2qNLlLg0KLSogICAgyuSz9rLOyv0gICCjus7eDQotKiAgICC3tbvY1rXLtcP3IKO6zt4NCi0qICAgIMbky/vLtcP3ICAgo7rO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLWV4dGVybiBWT0lEIHpOYXNfU2V0RXZlbnRTdGFydChCWVRFIGJJbnNJZHgsIEJZVEUgYkV2ZW50KTsNCi0gICAgDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICC6r8r9w/sgICAgIKO6ek5hc19TZXRFdmVudEVuZA0KLSogICAguabE3CAgICAgICCjusno1sNOQVPKwrz+veHK+A0KLSogICAgyuTI67LOyv0gICCjukJZVEUgYkluc0lkeCAtLSC0/bv6suDKtcD9usU6IDAsIL+oMbT9u/qy4DsgMSwgv6gytP27+rLgLg0KLSAgICAgICAgICAgICAgICAgIEJZVEUgYkV2ZW50IC0tINK1zvG21NOmtcTL99L9KDAuLi4zMSk6IMv30v0wtcTTxc/IvLbX7rjfLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL7fzOW6rNLlx+u8+7rqtqjS5S4NCi0qICAgIMrks/ayzsr9ICAgo7rO3g0KLSogICAgt7W72Na1y7XD9yCjus7eDQotKiAgICDG5Mv7y7XD9yAgIKO6zt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICANCi1leHRlcm4gVk9JRCB6TmFzX1NldEV2ZW50RW5kKEJZVEUgYkluc0lkeCwgQllURSBiRXZlbnQpOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAguq/K/cP7ICAgICCjunpOYXNfSXNFdmVudEV4aXN0DQotKiAgICC5psTcICAgICAgIKO6sunRr7bU06a1xMrCvP7Kx7fxtObU2g0KLSogICAgyuTI67LOyv0gICCjukJZVEUgYkluc0lkeCAtLSC0/bv6suDKtcD9usU6IDAsIL+oMbT9u/qy4DsgMSwgv6gytP27+rLgLg0KLSAgICAgICAgICAgICAgICAgIEJZVEUgYkV2ZW50IC0tINK1zvG21NOmtcTL99L9KDAuLi4zMSk6IMv30v0wtcTTxc/IvLbX7rjfLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL7fzOW6rNLlx+u8+7rqtqjS5S4NCi0qICAgIMrks/ayzsr9ICAgo7rO3g0KLSogICAgt7W72Na1y7XD9yCjulpfVkFMSUQvWl9JTlZBTElEDQotKiAgICDG5Mv7y7XD9yAgIKO6zt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4gQllURSB6TmFzX0lzRXZlbnRFeGlzdChCWVRFIGJJbnNJZHgsIEJZVEUgYkV2ZW50KTsNCi0NCi0vKiBQU8r9vt3D5qOsyc/Q0Lu6tObH+LavzKzJ6sfruq/K/SAqLw0KLWV4dGVybiBUX3pfVXBMaW5rX1NkdSogIHpBbGxvY1VwTGlua1NkdSh2b2lkKTsNCi0NCi0vKiBQU8r9vt3D5qOsyc/Q0Lu6tObH+LavzKzKzbfFuq/K/SAqLw0KLWV4dGVybiB2b2lkIHpGcmVlVXBMaW5rU2R1KFRfel9VcExpbmtfU2R1KiBwU2R1KTsNCi0NCi0vKiBQU8r9vt3D5qOsz8LQ0Lu6tObH+LavzKzKzbfFuq/K/SAqLw0KLWV4dGVybiB2b2lkIHpGcmVlRG93bkxpbmtTZHUoVF96X0Rvd25MaW5rX1NkdSogcFNkdSk7DQotDQotZXh0ZXJuIFZPSUQgelNlbmRNc2dUb0VsMihUX3pfTXNnSW5mbyAqcE1zZ0luZm8sIEJZVEUgYkZsYWcpOw0KLQ0KLWV4dGVybiBWT0lEIHpQc19TYXZlQXBVdGNJbmZvKFdPUkQgd1llYXIsIFdPUkQgd01vbnRoKTsNCi0jZW5kaWYNCi0NCmRpZmYgLS1naXQgYS9VYm9vdC9jcC9wcy9tb2RlbS9wcy9pbmMvYXRpcHNpbnQuaCBiL1Vib290L2NwL3BzL21vZGVtL3BzL2luYy9hdGlwc2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTc5ZWJhLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL21vZGVtL3BzL2luYy9hdGlwc2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTA0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qsOaxvsv509AgKEMpMjAxNtbQ0MvNqNG2ucm33dPQz965q8u+DQotKsSjv+nD+zoNCi0qzsS8/sP7OmF0aXBzaW50LmgNCi0qyrXP1rmmxNw6YXRp0+u497mmxNzEo7/pvOS1xL3Tv9oNCi0qsOaxvjpWMS4wDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmbmRlZiAgIFpQU19BVElfSU5UX0gNCi0jZGVmaW5lICAgWlBTX0FUSV9JTlRfSA0KLQ0KLSNpbmNsdWRlICJhdGlwc2NvbS5oIg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qQVRJus3G5Mv7xKO/6bzktcS907/avLC66ta1tqjS5Sy9+9a5y+bS4tDeuMQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotIC8qzajTw7rqtqjS5aO6xLOx5MG/yse38bTm1Nq1xLHq1r7Ou8ih1rUqLw0KLSNkZWZpbmUgWl9BUE1NSUFfVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSANCi0jZGVmaW5lIFpfQVBNTUlBX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgDQotDQotLyogYXTD/MHuveG5+8LrLCBjb21tb24gY25m1tC94bn7wussIG1taWG6zXN0bb3Tv9q1xLe1u9jWtSovDQotI2RlZmluZSBaX0FQTU1JQV9PUEVSQVRJT05fRkFJTFVSRSAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9PUEVSQVRJT05fU1VDQ0VTUyAgICAgICAgICAgICAgICAoQllURSkxICANCi0NCi0vKj09PT09PT09PT09PT09PT0gyqew3NSt0vK66rao0uUgPT09PT09PT09PT09PT09PT09PT09Ki8NCi0gICAgLyogQ29tbWFuZCBUeXBlICovDQotI2RlZmluZSBaX0FQTU1JQV9TTVNDTURUWVBFX1NFVCAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9TTVNDTURUWVBFX1FVRVJZICAgICAgICAgICAgICAoQllURSkxDQotDQotI2RlZmluZSBaX01taWFVbW1fSW1zaVVua25vd0luSGxyX0VyciAgICAgICAgICAgICAgICAgKFdPUkQpMTAyIC8qVU1NwKnVucqnsNzUrdLyLDI3MDA3IDkuMsO709C0y9St0vIqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0lsbGVnYWxNc19FcnIgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTEwMw0KLSNkZWZpbmUgWl9NbWlhVW1tX0lsbGVnYWxNZV9FcnIgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTEwNg0KLSNkZWZpbmUgWl9NbWlhVW1tX0dwcnNTcnZOb3RBbHdfRXJyICAgICAgICAgICAgICAgICAgIChXT1JEKTEwNw0KLSNkZWZpbmUgWl9NbWlhVW1tX1BsbW5Ob3RBbHdfRXJyICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTExMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX0xBTm90QWx3X0VyciAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTExMg0KLSNkZWZpbmUgWl9NbWlhVW1tX1JvYW1Ob3RBbHdJbkxhX0VyciAgICAgICAgICAgICAgICAgIChXT1JEKTExMw0KLSNkZWZpbmUgWl9NbWlhVW1tX1Bob25lRmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTANCi0jZGVmaW5lIFpfTW1pYVVtbV9PcHROb3RBbHcgICAgICAgICAgICAgICAgICAgICAgICAgICAoV09SRCkzDQotI2RlZmluZSBaX01taWFVbW1fT3B0Tm90U3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpNA0KLSNkZWZpbmUgWl9NbWlhVW1tX1NpbU5vdEluc2VydCAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTEwDQotI2RlZmluZSBaX01taWFVbW1fU2ltV3JvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpMTUNCi0jZGVmaW5lIFpfTW1pYVVtbV9Ob05ldFN2YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV09SRCkzMA0KLSNkZWZpbmUgWl9NbWlhVW1tX0VtY0NhbGxPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTMyDQotI2RlZmluZSBaX01taWFVbW1fVW5rbm93bkVyciAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpMTAwDQotDQotLyrAqdW5uaSzzMSjyr207c7zwusqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0NlbGxPZk90aGVyUGxtbl9FcnIgICAgICAgICAgICAgICAgIChXT1JEKTI1Nw0KLSNkZWZpbmUgWl9NbWlhVW1tX0NlbGxPZkZvcmJpZExhX0VyciAgICAgICAgICAgICAgICAgIChXT1JEKTI1OA0KLSNkZWZpbmUgWl9NbWlhVW1tX0NlbGxCYXJyZWRfRXJyICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTI1OQ0KLSNkZWZpbmUgWl9NbWlhVW1tX05vQXZhaWxhYmxlQmFuZF9FcnIgICAgICAgICAgICAgICAgIChXT1JEKTYwMDkNCi0NCi0vKj09PT09PT09PT09PT09PT0gTW1pYVVtbb3Tv9rW0NbGyr21xLrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0dTTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfR1NNX0FDVA0KLSNkZWZpbmUgWl9NbWlhVW1tX0dTTUNPTVBBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIFpfR1NNX0NPTVBBQ1RfQUNUDQotI2RlZmluZSBaX01taWFVbW1fVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9URF9BQ1QNCi0jZGVmaW5lIFpfTW1pYVVtbV9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX1dfQUNUDQotI2RlZmluZSBaX01taWFVbW1fQUxMQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhmZg0KLQ0KLS8qPT09PT09PT09PT09PT09PSDTw7un1tjRobrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX05vUmVzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTW1pYVVtbV9Vc2VyUmVzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotDQotLyo9PT09PT09PT09PT09PT09INGhzfjEo8q9uuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01taWFVbW1fQXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NbWlhVW1tX01hbnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKj09PT09PT09PT09PT09PT0gyta2r9GhzfjKp7DctKbA7brqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTW1pYVVtbV9GYWlsQW5kTWFudSAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwIC8qIMqnsNy687Gjs9bK1ravICovDQotI2RlZmluZSBaX01taWFVbW1fRmFpbFRvQXV0byAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAvKjrKp7DcuvPXqtfUtq/Roc34xKPKvSovDQotDQotLyo9PT09PT09PT09PT09PT09ILyku+678silu+666rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01taWFVbW1fQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTW1pYVVtbV9ERUFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIA0KLQ0KLS8qPT09PT09PT09PT09PT09PSC21MG9uPbT8r340NCy2df3uuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0FsbERvbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIgIC8qILbUwb249tPyvfjQ0LLZ1/cgKi8NCi0NCi0vKj09PT09PT09PT09PT09PT0gUExNTte0zKy66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTW1pYVVtbV9Vbmtub3duUGxtbiAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01taWFVbW1fQXZhaWxQbG1uICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX0N1clBsbW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTW1pYVVtbV9GUGxtbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzDQotDQotLyo9PT09PT09PT09PT09PT09INeisuHXtMysuuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01taWFVbW1fTm9SZWdOb1NlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NbWlhVW1tX1JlZ0hwbG1uICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTW1pYVVtbV9Ob1JlZ0J1dFNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01taWFVbW1fUmVnRGVuaWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NbWlhVW1tX1Vua25vd24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTW1pYVVtbV9SZWdSb2FtaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1DQotI2RlZmluZSBaX01taWFVbW1fUGxtblNlYXJjaE5vdEFsbG93ZWQgICAgICAgICAgICAgICAgKEJZVEUpNiAvKiC0y9e0zKzXqMPF08PT2r7cvvjL0c34z/vPoiAqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0F0dGVtcFVwZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcgLyogtMvXtMysyse4/NDC0ruw48qnsNzJz7GotcTW0Lzk17TMrCAqLw0KLS8qIM+1zbPEo8q9ss6/vLrqtqjS5SAtIG1vZGUqLw0KLQ0KLSNkZWZpbmUgWl9NbWlhVW1tX0F1dG9TZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTW1pYVVtbV9Hc21Pbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMw0KLSNkZWZpbmUgWl9NbWlhVW1tX1djZG1hT25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE0DQotI2RlZmluZSBaX01taWFVbW1fVGRPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUNCi0jZGVmaW5lIFpfTW1pYVVtbV9Nb2RlTm9DaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgWl9NbWlhVW1tX0x0ZU9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE3DQotI2RlZmluZSBaX01taWFVbW1fR1NNX1REICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTgNCi0jZGVmaW5lIFpfTW1pYVVtbV9HU01fTFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxOQ0KLSNkZWZpbmUgWl9NbWlhVW1tX1REX0xURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIwDQotI2RlZmluZSBaX01taWFVbW1fR1NNX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjEgLypHU00gV8urxKMqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX1REX1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIyIC8qVEQgV8urxKMqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX1dfTFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIzICAvKlcgTFRFy6vEoyovDQotI2RlZmluZSBaX01taWFVbW1fVERfR1NNX0xURSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjQgLypURCBHU00gTFRFyP3EoyovDQotI2RlZmluZSBaX01taWFVbW1fVERfV19MVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMjUgLypURCBXIExURcj9xKMqLw0KLSNkZWZpbmUgWl9NbWlhVW1tX1REX1dfR1NNICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTI2IC8qVEQgVyBHU03I/cSjKi8NCi0jZGVmaW5lIFpfTW1pYVVtbV9XX0dTTV9MVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNyAvKkdTTSBXIExURcj9xKMqLw0KLQ0KLS8qIM34wue908jrtM7Q8rrqtqjS5SAtIGFjcW9yZGVyKi8NCi0jZGVmaW5lIFpfTW1pYVVtbV9BdXRvQWNxb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01taWFVbW1fR3NtUHJpb3JpdHlfVGRTZWNvbmRfTHRlVGhpcmQgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX1RkUHJpb3JpdHlfR3NtU2Vjb25kX0x0ZVRoaXJkICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTW1pYVVtbV9BY3FvTm9jaGFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX01taWFVbW1fR3NtUHJpb3JpdHlfTHRlU2Vjb25kX1RkVGhpcmQgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NbWlhVW1tX1RkUHJpb3JpdHlfTHRlU2Vjb25kX0dzbVRoaXJkICAgICAgIChCWVRFKTUgDQotI2RlZmluZSBaX01taWFVbW1fTHRlUHJpb3JpdHlfVGRTZWNvbmRfR3NtVGhyaWQgICAgICAgKEJZVEUpNiANCi0jZGVmaW5lIFpfTW1pYVVtbV9MdGVQcmlvcml0eV9Hc21TZWNvbmRfVGRUaGlyZCAgICAgICAoQllURSk3IA0KLSNkZWZpbmUgWl9NbWlhVW1tX0dzbVByaW9yaXR5X1dTZWNvbmRfTHRlVGhpcmQgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfTW1pYVVtbV9XUHJpb3JpdHlfR3NtU2Vjb25kX0x0ZVRoaXJkICAgICAgICAoQllURSk5DQotI2RlZmluZSBaX01taWFVbW1fR3NtUHJpb3JpdHlfTHRlU2Vjb25kX1dUaGlyZCAgICAgICAgKEJZVEUpMTANCi0jZGVmaW5lIFpfTW1pYVVtbV9XUHJpb3JpdHlfTHRlU2Vjb25kX0dzbVRoaXJkICAgICAgICAoQllURSkxMSANCi0jZGVmaW5lIFpfTW1pYVVtbV9MdGVQcmlvcml0eV9XU2Vjb25kX0dzbVRocmlkICAgICAgICAoQllURSkxMiANCi0jZGVmaW5lIFpfTW1pYVVtbV9MdGVQcmlvcml0eV9Hc21TZWNvbmRfV1RoaXJkICAgICAgICAoQllURSkxMw0KLSNkZWZpbmUgWl9NbWlhVW1tX1RkUHJpb3JpdHlfV1NlY29uZF9MdGVUaGlyZCAgICAgICAgIChCWVRFKTE0DQotI2RlZmluZSBaX01taWFVbW1fV1ByaW9yaXR5X1RkU2Vjb25kX0x0ZVRoaXJkICAgICAgICAgKEJZVEUpMTUNCi0jZGVmaW5lIFpfTW1pYVVtbV9UZFByaW9yaXR5X0x0ZVNlY29uZF9XVGhpcmQgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgWl9NbWlhVW1tX1dQcmlvcml0eV9MdGVTZWNvbmRfVGRUaGlyZCAgICAgICAgIChCWVRFKTE3IA0KLSNkZWZpbmUgWl9NbWlhVW1tX0x0ZVByaW9yaXR5X1dTZWNvbmRfVGRUaHJpZCAgICAgICAgIChCWVRFKTE4IA0KLSNkZWZpbmUgWl9NbWlhVW1tX0x0ZVByaW9yaXR5X1RkU2Vjb25kX1dUaGlyZCAgICAgICAgIChCWVRFKTE5DQotI2RlZmluZSBaX01taWFVbW1fVGRQcmlvcml0eV9XU2Vjb25kX0dzbVRoaXJkICAgICAgICAgKEJZVEUpMjANCi0jZGVmaW5lIFpfTW1pYVVtbV9XUHJpb3JpdHlfVGRTZWNvbmRfR3NtVGhpcmQgICAgICAgICAoQllURSkyMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX1RkUHJpb3JpdHlfR3NtU2Vjb25kX1dUaGlyZCAgICAgICAgIChCWVRFKTIyDQotI2RlZmluZSBaX01taWFVbW1fV1ByaW9yaXR5X0dzbVNlY29uZF9UZFRoaXJkICAgICAgICAgKEJZVEUpMjMgDQotI2RlZmluZSBaX01taWFVbW1fR3NtUHJpb3JpdHlfV1NlY29uZF9UZFRocmlkICAgICAgICAgKEJZVEUpMjQgDQotI2RlZmluZSBaX01taWFVbW1fR3NtUHJpb3JpdHlfVGRTZWNvbmRfV1RoaXJkICAgICAgICAgKEJZVEUpMjUNCi0NCi0vKiDKx7fx1qez1sL+084gLSByb2FtKi8NCi0jZGVmaW5lIFpfTW1pYVVtbV9Ob3RTdXBwb3J0Um9hbSAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01taWFVbW1fU3VwcG9ydFJvYW0gICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX1JvYW1Ob2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0vKiDT8sno1sO66rao0uUgLSBzcnZkb21haW4qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0NzT25seSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTW1pYVVtbV9Qc09ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01taWFVbW1fQ3NQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NbWlhVW1tX0FueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTW1pYVVtbV9Eb21haW5Ob2NoYW5nZSAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotDQotLyogUFO4vdfF17TMrCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX01taWFVbW1fQ0dBVFRTRVRfREVUQUNIICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NbWlhVW1tX0NHQVRUU0VUX0FUVEFDSCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKiBDU7i918XXtMysICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfTW1pYVVtbV9aQVRUU0VUX0RFVEFDSCAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01taWFVbW1fWkFUVFNFVF9BVFRBQ0ggICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qPT09PT09PT09PT09PT09PSByZiBjb250cm9s1tC1xLLZ1/e66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qI2RlZmluZSBaUFNfUkZfT04JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpQU19SRl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxILz7cHNDb20uaCAqLyANCi0jZGVmaW5lIFpfTW1pYVVtbV9Qd3JPZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotDQotLyo9PT09PT09PT09PT09PT09IENTR8HQse3X7rTzuPbK/brqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01taWFVbW1fTWF4Q3NnTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTANCi0NCi0vKj09PT09PT09PT09PT09PT0gQ1NH0aHU8cSjyr266rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0NzZ01vZGVfT2ZmICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTW1pYVVtbV9Dc2dNb2RlX0F1dG8gICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01taWFVbW1fQ3NnTW9kZV9NYW51ICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLQ0KLS8qPT09PT09PT09PT09PT09PSBDU0fXtMysuuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTW1pYVVtbV9Dc2dTdGF0ZV9Ob3RBbHcgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01taWFVbW1fQ3NnU3RhdGVfQWxsb3dlZCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NbWlhVW1tX0NzZ1N0YXRlX0N1cnJlbnQgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0vKj09PT09PT09PT09PT09PT0gK0NFTU9ERbrqtqjS5SAt08Nwc2NvbS5o1tC1xLrqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLQ0KLS8qPT09PT09PT09PT09PT09PSDU9rzTTFRF1sbKvSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTW1pYVVtbV9FVVRSQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0xURV9BQ1QNCi0NCi0gLyo9PT09PT09PT09PT09PT09ICBMVEXWp7PWtcS908jrvLzK9SA9PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NbWlhVW1tX0xURV9URERfT25seSAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAgLyrWu8vRVERExrW2ziovDQotI2RlZmluZSBaX01taWFVbW1fTFRFX0ZERF9Pbmx5ICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAgICAvKta7y9FGRETGtbbOKi8NCi0jZGVmaW5lIFpfTW1pYVVtbV9MVEVfVEREX1ByZWYgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMiAgICAgICAgIC8qRkREus1GRETGtbbOtrzL0aOsVERE08XPyCovDQotI2RlZmluZSBaX01taWFVbW1fTFRFX0ZERF9QcmVmICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgICAgICAgICAvKkZERLrNRkRExrW2zra8y9GjrEZERNPFz8gqLw0KLQ0KLSAvKj09PT09PT09PT09PT09PT0gIElNUyDXorLh17TMrD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgIFpfTW1pYVVtbV9JTVNfREVSRUdJU1RFUkVEICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAvKs6016Ky4bvy16Ky4cqnsNwqLw0KLSNkZWZpbmUgIFpfTW1pYVVtbV9JTVNfUkVHSVNURVJFRCAgICAgICAgICAgICAgICAgICAgICAoQllURSkxICAgICAgICAvKtLR16Ky4bPJuaYqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PSAgINPv0vTT8sno1sMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9WT0lDRV9NT0RFX0NTX09OTFkgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgWl9NTUlBVU1NX1ZPSUNFX01PREVfVk9JUF9PTkxZICAgICAgICAgICAgICAgIChCWVRFKTEgICAgIA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9WT0lDRV9NT0RFX0NTX1BSRUYgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSAgWl9NTUlBVU1NX1ZPSUNFX01PREVfVk9JUF9QUkVGICAgICAgICAgICAgICAgIChCWVRFKTMNCi0gDQotLyo9PT09PT09PT09PT09PT09ICAgy6u0/VBT17TMrNDFz6IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9QU19TVEFURV9OVUxMICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgWl9NTUlBVU1NX1BTX1NUQVRFX0FWQUlMICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAvKiBwc7/J08MgKi8gIA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9QU19TVEFURV9OT1RfQVZBSUwgICAgICAgICAgICAgICAgICAoQllURSkyICAgLyogcHOyu7/J08MgKi8NCi0NCi0gLyo9PT09PT09PT09PT09PT09INa4tqjUy9Oqycw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lICBaX01NSUFVTU1fUExNTl9DSElOQU1PQklMRSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgLyrW0Ln60sa2ryovDQotI2RlZmluZSAgWl9NTUlBVU1NX1BMTU5fQ0hJTkFVTklDT00gICAgICAgICAgICAgICAgICAgIChCWVRFKTIgIC8q1tC5+sGqzagqLw0KLSNkZWZpbmUgIFpfTU1JQVVNTV9QTE1OX0NISU5BVEVMRUNPTSAgICAgICAgICAgICAgICAgICAoQllURSkzLyrW0Ln6tefQxSovDQotIA0KLS8qPT09PT09PT09PT09PT09PSBVTU3Jz7GoU1JWQ0PKwrz+PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9TUlZDQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgIFpfTU1JQVVNTV9TUlZDQ19TVUNDICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgIFpfTU1JQVVNTV9TUlZDQ19GQUlMICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLQ0KLS8qPT09PT09PT09PT09PT09PSBDRUVStO3O88LrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIA0KLSNkZWZpbmUgIFpfQVRJVU1NX0ludmFsaWRQYXJhICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgWl9BVElVTU1fSWxsZWdhbE1zICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwMw0KLSNkZWZpbmUgIFpfQVRJVU1NX0lsbGVnYWxNZSAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMDYNCi0jZGVmaW5lICBaX0FUSVVNTV9HcHJzTm90QWxsb3dkICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTA3DQotI2RlZmluZSAgWl9BVElVTU1fR3Byc0FuZE5vbkdwcnNOb3RBbGxvd2QgICAgICAgICAgIChCWVRFKTEwOA0KLSNkZWZpbmUgIFpfQVRJVU1NX1VlSWRDYW5ub3RCZURlcml2ZWRCeU5ldCAgICAgICAgICAoQllURSkxMDkNCi0jZGVmaW5lICBaX0FUSVVNTV9VZUltcGxpY2l0bHlEZXRhY2hlZCAgICAgICAgICAgICAgKEJZVEUpMTEwDQotI2RlZmluZSAgWl9BVElVTU1fUGxtbk5vdEFsbG93ZWQgICAgICAgICAgICAgICAgICAgIChCWVRFKTExMQ0KLSNkZWZpbmUgIFpfQVRJVU1NX0xhTm90QWxsb3dlZCAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMTINCi0jZGVmaW5lICBaX0FUSVVNTV9Sb2FtaW5nTm90QWxsb3dlZEluTGEgICAgICAgICAgICAgKEJZVEUpMTEzDQotI2RlZmluZSAgWl9BVElVTU1fR3Byc05vdEFsbG93ZWRJblRoZVBsbW4gICAgICAgICAgIChCWVRFKTExNA0KLSNkZWZpbmUgIFpfQVRJVU1NX05vU3VpdGFibGVDZWxsSW5MYSAgICAgICAgICAgICAgICAoQllURSkxMTUNCi0jZGVmaW5lICBaX0FUSVVNTV9BdXRoUmVqICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTE2DQotI2RlZmluZSAgWl9BVElVTU1fQXV0aEZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTExNw0KLSNkZWZpbmUgIFpfQVRJVU1NX0ltZWlOb3RBY2NlcHQgICAgICAgICAgICAgICAgICAgICAoQllURSkxMTgNCi0jZGVmaW5lICBaX0FUSVVNTV9JbXNpUGFnaW5nICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTE5DQotI2RlZmluZSAgWl9BVElVTU1fTXREZXRhY2hSZWF0dGFjaCAgICAgICAgICAgICAgICAgIChCWVRFKTEyMA0KLSNkZWZpbmUgIFpfQVRJVU1NX1VzZXJEZWFjdGl2ZWQgICAgICAgICAgICAgICAgICAgICAoQllURSkxMjENCi0jZGVmaW5lICBaX0FUSVVNTV9Db25nZXN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTIyICAgIC8vQ29uZ2VzdGlvbg0KLSNkZWZpbmUgIFpfQVRJVU1NX0VzbUZhaWx1cmUgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMjMgICAgLy9FU00gZmFpbHVyZSAgDQotI2RlZmluZSAgWl9BVElVTU1fTm9QZHBDb250ZXh0QWN0aXZhdGVkICAgICAgICAgICAgIChCWVRFKTEyNCAgICAvL05vIFBEUCBjb250ZXh0IGFjdGl2YXRlZA0KLSNkZWZpbmUgIFpfQVRJVU1NX05vdEF1dGhvcml6ZWRGb3JDc2cgICAgICAgICAgICAgICAoQllURSkxMjUgICAgLy9Ob3QgQXV0aG9yaXplZCBGb3IgVGhpcyBDU0cNCi0jZGVmaW5lICBaX0FUSVVNTV9BdHRhY2hMb3dlckxheWVyRmFpbE9yUmVsICAgICAgICAgKEJZVEUpMTI2ICAgIC8vQXR0YWNoIExvd2VyIExheWVyIEZhaWx1cmUgT3IgUmVsZWFzZQ0KLSNkZWZpbmUgIFpfQVRJVU1NX1QzNDEwVGltZU91dCAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMjcgICAgLy9UMzQxMCBUaW1lIE91dA0KLSNkZWZpbmUgIFpfQVRJVU1NX1JlcVNlcnZpY2VOb3RBdXRob3JpemVkICAgICAgICAgICAoQllURSkxMjggICAgLy9SZXF1ZXN0ZWQgc2VydmljZSBvcHRpb24gbm90IGF1dGhvcml6ZWQgaW4gdGhpcyBQTE1ODQotI2RlZmluZSAgWl9BVElVTU1fQWN0aXZlRGVmYXVsdEVwc0JlYXJSZWogICAgICAgICAgIChCWVRFKTEyOSAgICAvL0FjdGl2ZSBEZWZhdWx0IEVwcyBCZWFyIFJlamVjdA0KLSNkZWZpbmUgIFpfQVRJVU1NX0F1dGhNYWNGYWlsICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMzAgICAgLy9BdXRoZW50aWNhdGlvbiBNYWMgRmFpbHVyZQ0KLSNkZWZpbmUgIFpfQVRJVU1NX0F1dGhTeW5jRmFpbCAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMzEgICAgLy9BdXRoZW50aWNhdGlvbiBTeW5jIEZhaWx1cmUNCi0jZGVmaW5lICBaX0FUSVVNTV9BdXRoTm9uZUVwcyAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTMyICAgIC8vQXV0aGVudGljYXRpb24gTm9uZSBFcHMgcGFyYW1ldGVyDQotI2RlZmluZSAgWl9BVElVTU1fTXREZXRhY2hOb0NhdXNlICAgICAgICAgICAgICAgICAgIChCWVRFKTEzMyAgICAvL1JlYXR0YWNoIG5vdCByZXF1aXJlZCBhbmQgbm8gY2F1c2UNCi0jZGVmaW5lICBaX0FUSVVNTV9HZXRVZUluZm9GYWlsdXJlICAgICAgICAgICAgICAgICAgKEJZVEUpMTM0ICAgIC8vR2V0IFVlIEluZm9ybWF0aW9uIEZhaWx1cmUNCi0jZGVmaW5lICBaX0FUSVVNTV9UMzMxMFRpbWVPdXQgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTM1ICAgIC8vVDMzMTAgVGltZSBPdXQNCi0jZGVmaW5lICBaX0FUSVVNTV9BdXRoVW5hY2NlcHRhYmxlICAgICAgICAgICAgICAgICAgKEJZVEUpMTM2ICAgIC8vQXV0aGVudGljYXRpb24gVW5hY2NlcHRhYmxlDQotI2RlZmluZSAgWl9BVElVTU1fQXR0YWNoRXN0UmVqICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEzNyAgICAvL0F0dGFjaCBFc3RhYmxpc2ggUmVqZWN0DQotI2RlZmluZSAgWl9BVElVTU1fVW5TcGVjaWZpZWRHcHJzRXJyb3IgICAgICAgICAgICAgIChCWVRFKTE0OA0KLSNkZWZpbmUgIFpfQVRJVU1NX05vcm1hbEZhaWxGaXZlVGltZXMgICAgICAgICAgICAgICAoQllURSkxNDkgICAgLy9Ob3JtYWwgRmFpbCBDb250aW51b3VzbHkgRml2ZSBUaW1lcw0KLSNkZWZpbmUgIFpfQVRJVU1NX1NlbWFudGljYWxseUluY29yTXNnICAgICAgICAgICAgICAoQllURSkxNzIgICAgLy9TZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UNCi0jZGVmaW5lICBaX0FUSVVNTV9JbnZhbGlkTWFuZGF0b3J5SW5mbyAgICAgICAgICAgICAgKEJZVEUpMTczICAgIC8vSW52YWxpZCBtYW5kYXRvcnkgaW5mb3JtYXRpb24NCi0jZGVmaW5lICBaX0FUSVVNTV9Nc2dUeXBlTm9FeHNpdE9ySW1wbCAgICAgICAgICAgICAgKEJZVEUpMTc0ICAgIC8vTWVzc2FnZSB0eXBlIG5vbi1leGlzdGVudCBvciBub3QgaW1wbGVtZW50ZWQNCi0jZGVmaW5lICBaX0FUSVVNTV9JRU5vRXhzaXRPckltcGwgICAgICAgICAgICAgICAgICAgKEJZVEUpMTc1ICAgIC8vSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkDQotI2RlZmluZSAgWl9BVElVTU1fUHJvdG9jb2xFcnJvciAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE3NiAgICAvL1Byb3RvY29sIGVycm9yLCB1bnNwZWNpZmllZA0KLSNkZWZpbmUgIFpfQVRJVU1NX01zZ1R5cGVOb3RDb21wV2l0aFByb3RvY1N0YXQgICAgICAoQllURSkxNzcgICAgLy9NZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgc3RhdGUNCi0jZGVmaW5lICBaX0FUSVVNTV9Db25kaXRpb25hbElFZXJyICAgICAgICAgICAgICAgICAgKEJZVEUpMTc4ICAgIC8vQ29uZGl0aW9uYWwgSUUgZXJyb3INCi0jZGVmaW5lICBaX0FUSVVNTV9Nc2dOb3RDb21wV2l0aFByb3RvY1N0YXQgICAgICAgICAgKEJZVEUpMTc5ICAgIC8vTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2NvbCBzdGF0ZQ0KLSNkZWZpbmUgIFpfQVRJVU1NX01zZ05vcm1hbFdpdGhOZXdDZWxsX0VyciAgICAgICAgICAoQllURSkxODAgICAgLy9yZXRyeSB1cG9uIGVudHJ5IGludG8gYSBuZXcgY2VsbA0KLSNkZWZpbmUgIFpfQVRJVU1NX1VlU2VjdXJpdHlDYXBhTWlzbWF0Y2ggICAgICAgICAgICAoQllURSkxODEgICAgLy9VRSBzZWN1cml0eSBjYXBhYmlsaXRpZXMgbWlzbWF0Y2gNCi0jZGVmaW5lICBaX0FUSVVNTV9TZWN1cml0eW1vZGVyZWplY3RlZCAgICAgICAgICAgICAgKEJZVEUpMTgyICAgIC8vU2VjdXJpdHkgbW9kZSByZWplY3RlZCwgdW5zcGVjaWZpZWQNCi0jZGVmaW5lICBaX0FUSVVNTV9UZW1wZXJhdHVyZVN0YXJ0ICAgICAgICAgICAgICAgICAgICAoQllURSkxODMgIC8vzsK/2L+qyrwNCi0jZGVmaW5lICBaX0FUSVVNTV9UZW1wZXJhdHVyZVN0b3AgICAgICAgICAgICAgICAgICAgIChCWVRFKTE4NCAgLy/Owr/YveHK+A0KLQ0KLS8qPT09PT09PT09PT09TU3Eo7/pQ0VFUrTtzvPC6z09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi0jZGVmaW5lIFpfQVRJTU1fSW1zaVVua25vd25JbkhsciAgICAgICAgICAgKEJZVEUpMiAvL0lNU0kgdW5rbm93biBpbiBITFINCi0jZGVmaW5lIFpfQVRJTU1fSWxsZWdhbE1zICAgICAgICAgICAgICAgICAgKEJZVEUpMyAvL0NTIERvbWFpbiBJbGxlZ2FsIE1TDQotI2RlZmluZSBaX0FUSU1NX0ltc2lVbmtvbnduSW5WbHIgICAgICAgICAgIChCWVRFKTQgLy9JTVNJIHVua25vd24gaW4gVkxSDQotI2RlZmluZSBaX0FUSU1NX0ltZWlOb3RBY2NlcHRlZCAgICAgICAgICAgIChCWVRFKTUgLy9DUyBEb21haW4gSU1FSSBub3QgYWNjZXB0ZWQNCi0jZGVmaW5lIFpfQVRJTU1fSWxsZWdhbE1lICAgICAgICAgICAgICAgICAgKEJZVEUpNiAvL0NTIERvbWFpbiBJbGxlZ2FsIE1FDQotDQotI2RlZmluZSBaX0FUSU1NX1BsbW5Ob3RBbGxvd2VkICAgICAgICAgICAgIChCWVRFKTExIC8vQ1MgRG9tYWluIFBMTU4gbm90IGFsbG93ZWQNCi0jZGVmaW5lIFpfQVRJTU1fTGFOb3RBbGxvd2VkICAgICAgICAgICAgICAgKEJZVEUpMTIgLy9DUyBEb21haW4gTG9jYXRpb24gQXJlYSBub3QgYWxsb3dlZA0KLSNkZWZpbmUgWl9BVElNTV9Sb2FtaW5nTm90QWxsb3dlZCAgICAgICAgICAoQllURSkxMyAvL0NTIERvbWFpbiBSb2FtaW5nIG5vdCBhbGxvd2VkIGluIHRoaXMgbG9jYXRpb24gYXJlYQ0KLSNkZWZpbmUgWl9BVElNTV9Ob1N1aXRDZWxsSW5MYSAgICAgICAgICAgICAoQllURSkxNSAvL0NTIERvbWFpbiBObyBTdWl0YWJsZSBDZWxscyBJbiBMb2NhdGlvbiBBcmVhDQotI2RlZmluZSBaX0FUSU1NX01zY1RlbXBOb3RSZWFjaGFibGUgICAgICAgIChCWVRFKTE2IC8vTVNDIHRlbXBvcmFyaWx5IG5vdCByZWFjaGFibGUNCi0jZGVmaW5lIFpfQVRJTU1fTmV0RmFpbHJlICAgICAgICAgICAgICAgICAgKEJZVEUpMTcgLy9DUyBEb21haW4gTmV0d29yayBmYWlsdXJlDQotI2RlZmluZSBaX0FUSU1NX1JldHJ5SW5OZXdDZWxsICAgICAgICAgICAgIChCWVRFKTE4IC8vQ1MgRG9tYWluIFJldHJ5IEluVG8gTmV3IENlbGwNCi0jZGVmaW5lIFpfQVRJTU1fRGVmYXVsdFJlakNhdXNlICAgICAgICAgICAgKEJZVEUpMTkgLy9DUyBEb21haW4gRGVmYXVsdCBSZWplY3QgQ2F1c2UNCi0NCi0jZGVmaW5lIFpfQVRJTU1fTWFjRmFpbHVyZSAgICAgICAgICAgICAgICAoQllURSkyMCAvL01BQyBmYWlsdXJlDQotI2RlZmluZSBaX0FUSU1NX1N5bmNoRmFpbHVyZSAgICAgICAgICAgICAgKEJZVEUpMjEgLy9TeW5jaCBmYWlsdXJlDQotI2RlZmluZSBaX0FUSU1NX0Nvbmdlc3Rpb24gICAgICAgICAgICAgICAgKEJZVEUpMjIgLy9DUyBEb21haW4gQ29uZ2VzdGlvbg0KLSNkZWZpbmUgWl9BVElNTV9Hc21BdXRoVW5hY2NlcHQgICAgICAgICAgIChCWVRFKTIzIC8vR1NNIGF1dGhlbnRpY2F0aW9uIHVuYWNjZXB0YWJsZQ0KLSNkZWZpbmUgWl9BVElNTV9BdXRoUmVqZWN0ICAgICAgICAgICAgICAgIChCWVRFKTI0IC8vQ1MgRG9tYWluIEF1dGhlbnRpY2F0aW9uIFJlamVjdA0KLSNkZWZpbmUgWl9BVElNTV9Ob3RBdXRob3JpemVkRm9yVGhpc0NTRyAgIChCWVRFKTI1IC8vTm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgQ1NHDQotDQotI2RlZmluZSBaX0FUSU1NX0NtU3J2QWJvcnQgICAgICAgICAgICAgICAgICAgIChCWVRFKTMwIC8vQ20gU2VydmljZSBBYm9ydGlvbg0KLSNkZWZpbmUgWl9BVElNTV9TcnZPcHROb3RTdXBwb3J0ICAgICAgICAgICAgICAoQllURSkzMiAvL1NlcnZpY2Ugb3B0aW9uIG5vdCBzdXBwb3J0ZWQNCi0jZGVmaW5lIFpfQVRJTU1fU3J2T3B0Tm90U3Vic2NyaWJlZCAgICAgICAgICAgKEJZVEUpMzMgLy9SZXF1ZXN0ZWQgc2VydmljZSBvcHRpb24gbm90IHN1YnNjcmliZWQNCi0jZGVmaW5lIFpfQVRJTU1fU3J2T3B0VGVtcE91dE9mT2RlciAgICAgICAgICAgKEJZVEUpMzQgLy9TZXJ2aWNlIG9wdGlvbiB0ZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXINCi0jZGVmaW5lIFpfQVRJTU1fQ2FsbE5vdElkZW50aWZpZWQgICAgICAgICAgICAgKEJZVEUpMzggLy9DYWxsIGNhbm5vdCBiZSBpZGVudGlmaWVkDQotI2RlZmluZSBaX0FUSU1NX0NzU3J2VGVtcE5vdEF2YWlsYWJsZSAgICAgICAgIChCWVRFKTM5IC8vRXh0ZW5kZWQgc2VydmljZSByZXF1ZXN0IHByb2NlZHVyZSwgQ1Mgc2VydmljZSB0ZW1wb3JhcmlseSBub3QgYXZhaWxhYmxlDQotDQotI2RlZmluZSBaX0FUSU1NX1JyY0VzdENlbGxSZXNlbCAgICAgICAgIChCWVRFKTQwIC8vUlJDIENvbm5lY3Rpb24gRXN0YWJsaXNoIENlbGwgUmVzZWxlY3Rpb24NCi0jZGVmaW5lIFpfQVRJTU1fUnJFc3RGYWlsdXJlICAgICAgICAgICAgKEJZVEUpNDEgLy9SUkMgQ29ubmVjdGlvbiBFc3RhYmxpc2ggRmFpbHVyZQ0KLSNkZWZpbmUgWl9BVElNTV9SYW5kb21BY2Nlc3NGYWlsICAgICAgICAoQllURSk0MiAvL1JhbmRvbSBBY2VzcyBGYWlsdXJlDQotI2RlZmluZSBaX0FUSU1NX0xvd0xheWVyRmFpbCAgICAgICAgICAgIChCWVRFKTQzIC8vTG93TGF5ZXIgRmFpbHVyZQ0KLSNkZWZpbmUgWl9BVElNTV9HcnJBYm9ydEluZCAgICAgICAgICAgICAoQllURSk0NCAvL0dSUiBBYm9ydCBJbmRpY2F0aW9uDQotI2RlZmluZSBaX0FUSU1NX1BhZ2luZ1BlbmRpbmcgICAgICAgICAgIChCWVRFKTQ1IC8vUGFnaW5nIFBlbmRpbmcNCi0jZGVmaW5lIFpfQVRJTU1fUnJSZWxQcmVlbXB0aXZlICAgICAgICAgKEJZVEUpNDYgLy9SUkMgQ29ubmVjdGlvbiBSZWxlYXNlIFByZWVtcHRpdmUNCi0jZGVmaW5lIFpfQVRJTU1fUnJSZWxDb25nZXN0aW9uICAgICAgICAgKEJZVEUpNDcgLy9SUkMgQ29ubmVjdGlvbiBSZWxlYXNlIENvbmdlc3Rpb24NCi0jZGVmaW5lIFpfQVRJTU1fUnJSZWxSZWVzdFJlaiAgICAgICAgICAgKEJZVEUpNDggLy9SUkMgQ29ubmVjdGlvbiBSZWxlYXNlIFJlZXN0YWJsaXNoIFJlamVjdA0KLSNkZWZpbmUgWl9BVElNTV9SclJlbERpclNpZ1JlZXN0ICAgICAgICAoQllURSk0OSAvL1JSQyBDb25uZWN0aW9uIFJlbGVhc2UgRGlyZWN0IFNpZ25hbCBSZWVzdGFibGlzaA0KLSNkZWZpbmUgWl9BVElNTV9SclJlbFVzZXJJbmFjdCAgICAgICAgICAoQllURSk1MCAvL1JSQyBDb25uZWN0aW9uIFJlbGVhc2UgVXNlciBJbmFjdGl2ZQ0KLSNkZWZpbmUgWl9BVElNTV9Dc0RvbWFpbk5vdEF2YWlsYWJsZSAgICAoQllURSk1MSAvL0NvbWJpbmVkIEVQUyBhdHRhY2ggb3IgVEFVIHN1Y2Nlc3NmdWwgZm9yIEVQUyBvbmx5LCBDUyBkb21haW4gbm90IGF2YWlsYWJsZQ0KLSNkZWZpbmUgWl9BVElNTV9Ob3JtYWxGYWlsTmVlZFNlYXJjaFBsbW4gKEJZVEUpNTIgLy9NTSBub3JtYWwgZmFpbCBvciBuZXR3b3JrIGZhaWwgY29udGludW91c2x5IDQgdGltZXMsIG5lZWQgc2VhcmNoIFBMTU4NCi0jZGVmaW5lIFpfQVRJTU1fSW1zaURldGFjaEJ5VGhlTmV0d29yayAgIChCWVRFKTUzIC8vTVQgZGV0YWNoLCBhbmQgdGhlIGRldGFjaCB0eXBlIGlzIElNU0kgZGV0YWNoDQotDQotI2RlZmluZSBaX0FUSU1NX1NlbWFudGljYWxseUluY29ycmVjdE1zZyAgICAgICAgICAgICAgKEJZVEUpOTUgLy9TZW1hbnRpY2FsbHkgaW5jb3JyZWN0IG1lc3NhZ2UNCi0jZGVmaW5lIFpfQVRJTU1fSW52YWxpZE1hbmRJbmZvICAgICAgICAgICAgICAgICAgICAgICAoQllURSk5NiAvL0ludmFsaWQgbWFuZGF0b3J5IGluZm9ybWF0aW9uDQotI2RlZmluZSBaX0FUSU1NX01zZ1R5cGVOb0V4c2l0T3JJbXBsZW1lbnQgICAgICAgICAgICAgKEJZVEUpOTcgLy9NZXNzYWdlIHR5cGUgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZA0KLSNkZWZpbmUgWl9BVElNTV9Nc2dUeXBlTm90Q29tcGF0UHJvdG9jb2xTdGF0ZSAgICAgICAgIChCWVRFKTk4IC8vTWVzc2FnZSBub3QgY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlDQotI2RlZmluZSBaX0FUSU1NX0lFTm9FeHNpdE9ySW1wbGVtZW50ICAgICAgICAgICAgICAgICAgKEJZVEUpOTkgLy9JbmZvcm1hdGlvbiBlbGVtZW50IG5vbi1leGlzdGVudCBvciBub3QgaW1wbGVtZW50ZWQNCi0jZGVmaW5lIFpfQVRJTU1fQ29uZEllRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMDAgLy9Db25kaXRpb25hbCBJRSBlcnJvcg0KLSNkZWZpbmUgWl9BVElNTV9Nc2dOb3RDb21wYXRQcm90b2NvbFN0YXRlICAgICAgICAgICAgIChCWVRFKTEwMSAvL01lc3NhZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZQ0KLSNkZWZpbmUgWl9BVElNTV9Qcm90b2NvbEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTExMSAvL1Byb3RvY29sIGVycm9yLCB1bnNwZWNpZmllZA0KLQ0KLSNkZWZpbmUgWl9BVElNTV9VbnNwZWNpZmllZEZhaWwgICAgICAgICAgIChCWVRFKTEyMCAvL1Vuc3BlY2lmaWVkIEZhaWx1cmUNCi0NCi0vKj09PT09PT09PT09PT09PT0gy6u/qMurtP3F0LbPwb3Vxb+oyse38dDo0qq9u7u7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovIA0KLSNkZWZpbmUgIFpfTk9fTkVFRF9DSEFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSAgWl9ORUVEX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lICBaX05FRURfVVNFUl9ERUNJREUgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLQ0KLSNkZWZpbmUgWl9BVElVTU1fTUFYX0VNRVJOVU1fRElHSVRfTlVNICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfQVRJVU1NX01BWF9FTUVSTlVNX05VTSAgICAgICAgICAoQllURSkxMA0KLSNkZWZpbmUgWl9BVElVTU1fTUFYX1RYVFNUUl9OVU0gICAgICAgICAgIChCWVRFKTIxOA0KLSNkZWZpbmUgWl9BVElVTU1fTUFYX0xTQUlEX05VTSAgICAgICAgICAgIChCWVRFKTMNCi0NCi0jZGVmaW5lIFpfTU1JQVNNX01BWF9DSURfTlVNICAgICAgICAgICAgICAgICAgICAgIFpfREVWX0F0TWVtX01BWF9DSURfTlVNICAvKiAg1+6080NJRLj2yv0gICovDQotDQotI2RlZmluZSBaX01NSUFTTV9JUFY0X0FERFJfTUFYX0xFTiAgICAgICAgICAgICAgICAoQllURSk0ICAgICAgIC8qIElQVjS12Na31+6087OktsgqLw0KLSNkZWZpbmUgWl9NTUlBU01fSVBWNl9BRERSX01BWF9MRU4gICAgICAgICAgICAgICAgKEJZVEUpMTYgICAgICAvKiBJUFY2tdjWt9futPOzpLbIKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0FERFJfTUFYX0xFTiAgICAgICAgICAgICAgICAgICAgIChCWVRFKVpfTU1JQVNNX0lQVjZfQUREUl9NQVhfTEVOICAgICAgLyogIFBEULXY1rfX7rTzs6S2yCAgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0FQTl9NQVhfTEVOICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwMCAgICAgLyogIEFQTtfutPOzpLbIICAqLw0KLQ0KLSNkZWZpbmUgWl9NTUlBU01fUENPX0lURU1fVkFMX01BWF9MRU4gICAgICAgICAgICAgKEJZVEUpMTM0ICAgICAgLyogUENP0MXPorWl1KrE2sjd1+6087OktsggKi8NCi0NCi0jZGVmaW5lIFpfTU1JQVNNX1BDT19QUk9UX0lURU1fTUFYX05VTSAgICAgICAgICAgIChCWVRFKTYgICAgICAgLyogUENP0K3S6dDFz6K1pdSq1+6087j2yv0gKi8NCi0jZGVmaW5lIFpfTU1JQVNNX1BDT19QQVJBX0lURU1fTUFYX05VTSAgICAgICAgICAgIChCWVRFKTEzICAgICAgLyogUENPuL2807LOyv21pdSq1+6087j2yv0gKi8NCi0jZGVmaW5lIFpfTU1JQVNNX01BWF9QRFBBRERSX01BU0tfTEVOICAgICAgICAgICAgIChCWVRFKTMyDQotI2RlZmluZSBaX01NSUFTTV9NQVhfRklMVEVSX0lEICAgICAgICAgICAgICAgICAgICAoQllURSkxNg0KLQ0KLS8qIFBEUMDg0M0gKi8NCi0jZGVmaW5lIFpfTU1JQVNNX1BQUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTBYMDEgICAgICAgLyogIFBQUMDg0M0gICovDQotI2RlZmluZSBaX01NSUFTTV9JUFY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwWDIxICAgICAgIC8qICBJUHY0wODQzSAgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0lQVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTBYNTcgICAgICAgLyogIElQdjbA4NDNICAqLw0KLSNkZWZpbmUgWl9NTUlBU01fSVBWNFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMFg4RCAgICAgICAvKiBJUHY0djbA4NDNICAqLw0KLQ0KLS8qIMqnsNzUrdLytqjS5SAqLw0KLSNkZWZpbmUgWl9NTUlBU01fTUVNX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTIzDQotI2RlZmluZSBaX01NSUFTTV9QRFBfSEFORExFX0JVU1kgICAgICAgICAgICAgICAgICAoRFdPUkQpMTE0DQotI2RlZmluZSBaX01NSUFTTV9QRFBfSEFORExFX0FCT1JUICAgICAgICAgICAgICAgICAoRFdPUkQpMTE1DQotI2RlZmluZSBaX01NSUFTTV9QRFBfQUREUkVTU19UWVBFX1VOS05PVyAgICAgICAgICAoRFdPUkQpMTI4DQotI2RlZmluZSBaX01NSUFTTV9TUlZfTk9UX1NQVCAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTMyDQotI2RlZmluZSBaX01NSUFTTV9TUlZfTk9UX1NVQiAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTMzDQotI2RlZmluZSBaX01NSUFTTV9TUlZfT1VUT0ZfT1JERVIgICAgICAgICAgICAgICAgICAoRFdPUkQpMTM0DQotI2RlZmluZSBaX01NSUFTTV9VTlNQRUNfR1BSU19FUlIgICAgICAgICAgICAgICAgICAoRFdPUkQpMTQ4DQotI2RlZmluZSBaX01NSUFTTV9QRFBfQVVUSF9GQUlMICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTQ5DQotI2RlZmluZSBaX01NSUFTTV9MQVNUX1BETl9OT1RfREVBQ1QgICAgICAgICAgICAgICAoRFdPUkQpMTUxDQotDQotLyogTVQgUERQvKS77tOmtPDA4NDNICovDQotI2RlZmluZSBaX01NSUFTTV9NVF9BQ1RfUkVKICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAvKiC+3L74zfjC57LgvKS77sfrx/MgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX01UX0FDVF9BQ0MgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIC8qIL3TytzN+MLnsuC8pLvux+vH8yAqLw0KLQ0KLS8qIL3hufvC67ao0uUgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX1JFU1VMVF9DT0RFX09LICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNX1JFU1VMVF9DT0RFX0VSUk9SICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQVNNX1JFU1VMVF9DT0RFX05PX0NBUlJJRVIgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQVNNX1JFU1VMVF9DT0RFX0NPTk5FQ1QgICAgICAgICAgICAgIChCWVRFKTMNCi0NCi0vKiBDR0VWysK8/sDg0M0gKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTUVfUFJJX1BETl9BQ1QgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTldfUFJJX1BETl9ERUFDVCAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTUVfUFJJX1BETl9ERUFDVCAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTldfUFJJX1BETl9BQ1QgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTldfTU9ESUZZICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTUVfTU9ESUZZICAgICAgICAgICAgICAgICAgIChCWVRFKTUNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTldfU0VDX1BETl9BQ1QgICAgICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTUVfU0VDX1BETl9BQ1QgICAgICAgICAgICAgIChCWVRFKTcNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTldfU0VDX1BETl9ERUFDVCAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTUVfU0VDX1BETl9ERUFDVCAgICAgICAgICAgIChCWVRFKTkNCi0jZGVmaW5lIFpfTU1JQVNNX0NHRVZfTVRfQUNUX1JFSiAgICAgICAgICAgICAgICAgIChCWVRFKTEwDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX05XX1JFQUNUICAgICAgICAgICAgICAgICAgICAoQllURSkxMQ0KLQ0KLSNkZWZpbmUgWl9NTUlBU01fQ0dFVl9DSE5HX1RGVCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgIA0KLSNkZWZpbmUgWl9NTUlBU01fQ0dFVl9DSE5HX1FPUyAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBU01fQ0dFVl9DSE5HX1RGVF9BTkRfUU9TICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLSNkZWZpbmUgWl9NTUlBU01fQ0dFVl9FVkVOVF9UWVBFX0lORk8gICAgICAgICAgICAgKEJZVEUpMCAgDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX0VWRU5UX1RZUEVfQUNLUkVRICAgICAgICAgICAoQllURSkxDQotDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX1RZUEVfUFJJX1BETl9JTkQgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX1RZUEVfTU9ESUZZX0lORCAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX1RZUEVfU0VDX1BETl9JTkQgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTTV9DR0VWX1RZUEVfT1RIRVJfSU5EICAgICAgICAgICAgICAoQllURSkzDQotDQotDQotLyogyse38da71eu21ElQtcSx6ta+zrvIoda1ICovDQotI2RlZmluZSBaX01NSUFTTV9JUF9QUFAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFTTV9PTkxZX0lQICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotDQotLyogyc+y482otcDXtMysyKHWtSAqLw0KLSNkZWZpbmUgWl9NTUlBU01fQ0hfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBU01fQ0hfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qIEFUw/zB7sDg0M0gKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR0NNT0QgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9aUU5FRyAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR0VRTkVHICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR0RTQ09OVCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR0NPTlRSRFAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR1NDT05UUkRQICAgICAgICAgICAgICAgICAgIChCWVRFKTUNCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR1RGVFJEUCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lIFpfTU1JQVNNX0NNRF9DR0VRT1NSRFAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcNCi0NCi0vKiBNTUlB0+tTTS9FU02907/ao6zH+LfWsrvNrEFUw/zB7rSlt6IgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0FUQ01EX0NHQUNUICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNX0FUQ01EX1pHQUNUICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKiArQ1BTQiA8Y3Vycl9iZWFyZXI+ILrqtqjS5SovDQotI2RlZmluZSBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfTk9fQkVBUkVSICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9HUFJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX0VHUFJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfTk9OX0hTVVBBX1VQX05PTl9IU0RQQV9ET1dOICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9IU1VQQV9VUF9OT05fSFNEUEFfRE9XTiAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX05PTl9IU1VQQV9VUF9IU0RQQV9ET1dOICAgICAgICAgICAoQllURSk1DQotI2RlZmluZSBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfSFNVUEFfVVBfSFNEUEFfRE9XTiAgICAgICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9FUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNw0KLQ0KLQ0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0FDVF9DQVVTRV9JUFY0X09OTFlfQUxMT1dFRCAgICAgICAgICAgICAgICAgICAoQllURSk1MA0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0FDVF9DQVVTRV9JUFY2X09OTFlfQUxMT1dFRCAgICAgICAgICAgICAgICAgICAoQllURSk1MQ0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0FDVF9DQVVTRV9TSU5HTEVfQUREUl9PTkxZX0FMTE9XRUQgICAgICAgICAgICAoQllURSk1Mg0KLQ0KLS8qWkdQQ09BVVRIIDxhdXRoX3R5cGU+uuq2qNLlKi8NCi0jZGVmaW5lIFpfTU1JQVNNX1BEUF9BVVRIX1RZUEVfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBU01fUERQX0FVVEhfVFlQRV9QQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTTV9QRFBfQVVUSF9UWVBFX0NIQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQVNNX1BEUF9BVVRIX1RZUEVfUEFQQ0hBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qVF96TW1pYVNtX05vdGlmaWNhdGlvbl9JbmTW0GJOb3RpZmljYXRpb25JbmS66ta1Ki8NCi0jZGVmaW5lIFpfTU1JQVNNX1NSVkNDX0hBTkRPVkVSX0NBTkNFTF9JTVNfUkVFU1RBQkxJU0hNRU5UICAgICAgICAgIChCWVRFKTENCi0NCi0jZGVmaW5lICBaX01NSUFTTV9NU0lTRE5fTEVOICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUNCi0NCi0vKiBQU9K1zvGw4ceoyc/Pws7E1rjKviAqLw0KLSNkZWZpbmUgWl9NTUlBU01fQ09OVEVYVF9OVUxMICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICAgICAgLyogzt7Jz8/CzsQgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0NPTlRFWFRfRVNNX1ZBTElEICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIC8qIEVTTcnPz8LOxNPQ0KcgKi8NCi0jZGVmaW5lIFpfTU1JQVNNX0NPTlRFWFRfU01fVkFMSUQgICAgICAgICAgICAgICAgIChCWVRFKTIgICAgICAgIC8qIFNNyc/Pws7E09DQpyAqLw0KLQ0KLSNkZWZpbmUgWl9NTUlBRVNNX01BWF9QRl9OVU0gICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgICAgICAgIC8qUGFja2V0IEZpbHRlcrXEyv3EvyovDQotDQotI2RlZmluZSBaX01NSUFFU01fTUFYX0NJRF9OVU0gICAgICAgICAgICAgICAgICAgICBaX0RFVl9BdE1lbV9NQVhfQ0lEX05VTSAgLyog1+6080NJRLj2yv0gKi8NCi0NCi0jZGVmaW5lIFpfTU1JQUVTTV9BRERSX01BWF9MRU4gICAgICAgICAgICAgICAgICAgIChCWVRFKTE2ICAgICAgICAvKiBQRFC12Na31+6087OktsggKi8NCi0jZGVmaW5lIFpfTU1JQUVTTV9BUE5fTUFYX0xFTiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwMCAgICAgICAvKiBBUE7X7rTzs6S2yCAqLw0KLQ0KLS8qUEROIFRZUEUqLw0KLSNkZWZpbmUgWl9NTUlBRVNNX0lQVjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyMSAgICAgICAgICAgLyogSVB2NMDg0M0gKi8NCi0jZGVmaW5lIFpfTU1JQUVTTV9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4NTcgICAgICAgICAgICAvKiBJUHY2wODQzSAqLw0KLSNkZWZpbmUgWl9NTUlBRVNNX0lQVjRWNiAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHg4RCAgICAgICAgICAgIC8qIElQdjR2NsDg0M0gKi8NCi0NCi0vKiBNVCDXqNPDvKS77sfrx/PTprTwwODQzSAqLw0KLSNkZWZpbmUgWl9NTUlBRVNNX01UX0RFRF9BQ1RfUkVKICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICAgICAgLyog08O7p77cvvjN+MLnsuDXqNPDvKS77sfrx/MgKi8NCi0jZGVmaW5lIFpfTU1JQUVTTV9NVF9ERURfQUNUX0FDQyAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIC8qINPDu6e908rczfjC57Lg16jTw7yku+7H68fzICovDQotDQotLyogtKW3orLp0a9FUFOz0NTYyc/Pws7EtcTUrdLyICovDQotI2RlZmluZSBaX01NSUFFU01fRVBTX1NUQVRVU19DR0FDVCAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAvKitDR0FDVLLp0a/D/MHutKW3orXEsunRryovDQotDQotLyogK0NHRVbW97avyc+xqMqxyc+xqLXEuPzQwtSt0vIqLw0KLSNkZWZpbmUgWl9NTUlBRVNNX01PRF9SRUFTT05fVEZUX09OTFkgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBRVNNX01PRF9SRUFTT05fUU9TX09OTFkgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBRVNNX01PRF9SRUFTT05fVEZUX0FORF9RT1MgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qICtDR0VW1ve2r8nPsajKsbPQ1NjKx7fxzqrErMjPs9DU2LXEserKtiovDQotI2RlZmluZSBaX01NSUFFU01fQ0dFVl9QRE5fQ09OICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFFU01fQ0dFVl9ERURfQkVBUkVSICAgICAgICAgICAgICAgICAoQllURSkwDQotDQotDQotLyogveG5+8LrtqjS5SAqLw0KLSNkZWZpbmUgWl9NTUlBRVNNX1JFU1VMVF9DT0RFX09LICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBRVNNX1JFU1VMVF9DT0RFX0VSUk9SICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBRVNNX1JFU1VMVF9DT0RFX05PX0NBUlJJRVIgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBRVNNX1JFU1VMVF9DT0RFX0NPTk5FQ1QgICAgICAgICAgKEJZVEUpMw0KLQ0KLQ0KLS8qIMnPsuPNqLXA17TMrMih1rUgKi8NCi0jZGVmaW5lIFpfTU1JQUVTTV9DSF9JRExFICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFFU01fQ0hfQlVTWSAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLQ0KLSNkZWZpbmUgWl9NTUlBRVNNX0NNRF9XSVRIT1VUQ0lEICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUVTTV9DTURfV0lUSENJRCAgICAgICAgICAgICAgICAgICAoQllURSkxDQotDQotDQotI2RlZmluZSBaX01NSUFFU01fSVBWNF9BRERSX0xFTkdUSCAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQUVTTV9JUFY2X0FERFJfTEVOR1RIICAgICAgICAgICAgICAgICAgKEJZVEUpMTYNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1DRUVSILTtzvPC6z09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKjI0MzAxIEFueSBvdGhlciB2YWx1ZSByZWNlaXZlZCBieSB0aGUgVUUgc2hhbGwgYmUgdHJlYXRlZCBhcyAwMDEwIDAwMTAsICJzZXJ2aWNlIG9wdGlvbiB0ZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIiLiAqLyAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0VQRENQX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkweDA1LyogRVBEQ1AgZmFpbHVyZSAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fT1BFUkFUT1JfREVURVJNSU5FRF9CQVJSSU5HICAgICAgICAgICAgICAgKERXT1JEKTB4MDgvKiBPcGVyYXRvciBEZXRlcm1pbmVkIEJhcnJpbmcgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgICAgICAgICAgICAgICAgICAgIChEV09SRCkweDFBLyogSW5zdWZmaWNpZW50IHJlc291cmNlcyAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fVU5LTk9XTl9NSVNTSU5HX0FQTiAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4MUIvKiBVbmtub3duIG9yIG1pc3NpbmcgQVBOICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9VTktOT1dOX1BEUF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgxQy8qIFVua25vd24gUEROIHR5cGUgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1VTRVJfQVVUSEVOVElDQVRJT05fRkFJTEVEICAgICAgICAgICAgICAgIChEV09SRCkweDFELyogVXNlciBhdXRoZW50aWNhdGlvbiBmYWlsZWQgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0FDVElWQVRJT05fUkVKRUNUX0dXICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkweDFFLyogUmVxdWVzdCByZWplY3RlZCBieSBTZXJ2aW5nIEdXIG9yIFBETiBHVyAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fQUNUSVZBVElPTl9SRUpFQ1RfVU5TUEVDSUZJRUQgICAgICAgICAgICAgKERXT1JEKTB4MUYvKiBBY3RpdmF0aW9uIHJlamVjdGVkLCB1bnNwZWNpZmllZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fU1JWX09QVElPTl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAgKERXT1JEKTB4MjAvKiBTZXJ2aWNlIG9wdGlvbiBub3Qgc3VwcG9ydGVkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9SRVFVRVNURURfU1JWX09QVElPTl9OT1RfU1VCICAgICAgICAgICAgICAoRFdPUkQpMHgyMS8qIFJlcXVlc3RlZCBzZXJ2aWNlIG9wdGlvbiBub3Qgc3Vic2NyaWJlZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fU1JWX09QVElPTl9PVVRPRl9PUkRFUiAgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4MjIvKiBTZXJ2aWNlIG9wdGlvbiB0ZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1BUSV9JTl9VU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkweDIzLyogUFRJIGFscmVhZHkgaW4gdXNlICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9SRUdVTEFSX0RFQUNUSVZBVElPTiAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyNC8qIFJlZ3VsYXIgZGVhY3RpdmF0aW9uICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9FUFNRT1NfTk9UX0FDQ0VQVEVEICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyNS8qIEVQUyBRb1Mgbm90IGFjY2VwdGVkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9ORVRXT1JLX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyNi8qIE5ldHdvcmsgZmFpbHVyZSAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fUkVBQ1RJVkFUSU9OX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4MjcvKiBSZWFjdGl2YXRpb24gcmVxdWlyZWQgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1NFTUFOVElDX0VSUk9SX1RGVF9PUEVSQVRJT04gICAgICAgICAgICAgIChEV09SRCkweDI5LyogU2VtYW50aWMgZXJyb3IgaW4gdGhlIFRGVCBvcGVyYXRpb24gKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1NZTlRBQ1RJQ0FMX0VSUk9SX1RGVF9PUEVSQVRJT04gICAgICAgICAgIChEV09SRCkweDJBLyogU3ludGFjdGljYWwgZXJyb3IgaW4gdGhlIFRGVCBvcGVyYXRpb24gKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0lOVkFMSURfRVBTX0JFQVJFUl9JREVOVElUWSAgICAgICAgICAgICAgIChEV09SRCkweDJCLyogSW52YWxpZCBFUFMgYmVhcmVyIGlkZW50aXR5ICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9TRU1BTlRJQ19FUlJPUl9GSUxURVIgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyQy8qIFNlbWFudGljIGVycm9ycyBpbiBwYWNrZXQgZmlsdGVyKHMpICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9TWU5UQUNUSUNBTF9FUlJPUl9GSUxURVIgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyRC8qIFN5bnRhY3RpY2FsIGVycm9ycyBpbiBwYWNrZXQgZmlsdGVyICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9QVElfTUlTTUFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHgyRi8qUFRJIG1pc21hdGNoICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9MQVNUX1BETl9ESVNDT05ORUNUSU9OX05PVF9BTExPV0VEICAgICAgICAoRFdPUkQpMHgzMS8qTGFzdCBQRE4gZGlzY29ubmVjdGlvbiBub3QgYWxsb3dlZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fUEROX1RZUEVfSVBWNF9PTkxZX0FMT09XRUQgICAgICAgICAgICAgICAgKERXT1JEKTB4MzIvKlBETiB0eXBlIElQdjQgb25seSBhbGxvd2VkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9QRE5fVFlQRV9JUFY2X09OTFlfQUxPT1dFRCAgICAgICAgICAgICAgICAoRFdPUkQpMHgzMy8qUEROIHR5cGUgSVB2NiBvbmx5IGFsbG93ZWQgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1NJTkdMRV9BRERSRVNTX0JFQVJFUlNfT05MWV9BTE9PV0VEICAgICAgIChEV09SRCkweDM0LypTaW5nbGUgYWRkcmVzcyBiZWFyZXJzIG9ubHkgYWxsb3dlZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fRVNNX0lORk9STUFUSU9OX05PVF9SRUNFSVZFRCAgICAgICAgICAgICAgKERXT1JEKTB4MzUvKkVTTSBpbmZvcm1hdGlvbiBub3QgcmVjZWl2ZWQgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1BETl9DT05ORUNUSU9OX05PVF9FWElTVCAgICAgICAgICAgICAgICAgIChEV09SRCkweDM2LypQRE4gY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fTVVMX1BETl9DT05ORUNUSU9OU19OT1RfQUxPT1dFRF9GT1JfQVBOICAgKERXT1JEKTB4MzcvKk11bHRpcGxlIFBETiBjb25uZWN0aW9ucyBmb3IgYSBnaXZlbiBBUE4gbm90IGFsbG93ZWQqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fQ09MTElTSU9OX1dJVEhfTkVUV09SS19JTklUSUFFRF9SRVEgICAgICAgKERXT1JEKTB4MzgvKkNvbGxpc2lvbiB3aXRoIG5ldHdvcmsgaW5pdGlhdGVkIHJlcXVlc3QqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fVU5TVVBQT1JURURfUUNJX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4M0IvKlVuc3VwcG9ydGVkIFFDSSB2YWx1ZSovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9CRUFSRVJfSEFORExJTkdfTk9UX1NVUFBPUlRFRCAgICAgICAgICAgICAoRFdPUkQpMHgzQy8qQmVhcmVyIGhhbmRsaW5nIG5vdCBzdXBwb3J0ZWQqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fTUFYTlVNX0VQU19CRUFSRVJTX1JFQUNIRUQgICAgICAgICAgICAgICAgKERXT1JEKTB4NDEvKiBNYXhpbXVtIG51bWJlciBvZiBFUFMgYmVhcmVycyByZWFjaGVkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9SRVFVRVNUX0FQTl9OT1RfU1VQUE9SVF9JTl9DVVJSRU5UX1JBVF9QTE1OIChEV09SRCkweDQyLyogUmVxdWVzdGVkIEFQTiBub3Qgc3VwcG9ydGVkIGluIGN1cnJlbnQgUkFUIGFuZCBQTE1OIGNvbWJpbmF0aW9uICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9JTlZBTElEX1BUSV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHg1MS8qIEludmFsaWQgUFRJIHZhbHVlICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9TRU1BTlRJQ0xZX0lOQ09SUkVDVF9NRVNTQUdFICAgICAgICAgICAgICAoRFdPUkQpMHg1Ri8qIFNlbWFudGljYWxseSBpbmNvcnJlY3QgbWVzc2FnZSAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fSU5WQUxJRF9NQU5EQVRPUllfSU5GT1JNQVRJT04gICAgICAgICAgICAgKERXT1JEKTB4NjAvKiBJbnZhbGlkIG1hbmRhdG9yeSBpbmZvcm1hdGlvbiAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fTVNHX1RZUEVfTk9ORVhJU1RfTk9UX0lNUExFTUVOVEVEICAgICAgICAgKERXT1JEKTB4NjEvKiBNZXNzYWdlIHR5cGUgbm9uLWV4aXN0ZW50IG9yIG5vdCBpbXBsZW1lbnRlZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fTVNHX1RZUEVfTk9UX0NPTVBBVElCTEUgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4NjIvKiBNZXNzYWdlIHR5cGUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgc3RhdGUgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0lORk9fTk9ORVhJU1RfTk9UX0lNUExFTUVOVEVEICAgICAgICAgICAgIChEV09SRCkweDYzLyogSW5mb3JtYXRpb24gZWxlbWVudCBub24tZXhpc3RlbnQgb3Igbm90IGltcGxlbWVudGVkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9DT05ESVRJT05BTF9JRV9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHg2NC8qIENvbmRpdGlvbmFsIElFIGVycm9yICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9NRVNTQUdFX05PVF9DT01QQVRJQkxFICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHg2NS8qIE1lc3NhZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wgc3RhdGUgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1BST1RPQ09MX0VSUk9SX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgIChEV09SRCkweDZGLyogUHJvdG9jb2wgZXJyb3IsIHVuc3BlY2lmaWVkICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9BUE5fVkFMVUVfSU5DT01QQVRJQkxFX0FDVElWRV9FUFNfQkVBUkVSICAoRFdPUkQpMHg3MC8qIEFQTiByZXN0cmljdGlvbiB2YWx1ZSBpbmNvbXBhdGlibGUgd2l0aCBhY3RpdmUgRVBTIGJlYXJlciBjb250ZXh0Ki8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX01VTFRJUExFX0FDQ0VTU0VTX0FQTl9OT1RfQUxMT1cgICAgICAgICAgIChEV09SRCkweDcxLyogTXVsdGlwbGUgYWNjZXNzZXMgdG8gYSBQRE4gY29ubmVjdGlvbiBub3QgYWxsb3dlZCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fUERQX0hBTkRMRV9BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTB4RDAvKiBBYm9ydCBieSB1c2VyICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9QRFBfSEFORExFX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHhEMS8qIEhhbmRsZSBmYWlsdXJlICovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9FUFNfQkVBUkVSX0xPQ0FMX0RFQUNUSVZFICAgICAgICAgICAgICAgICAoRFdPUkQpMHhEMi8qIEVwcyBCZWFyZXIgTG9jYWwgZGVhY3RpdmUgKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX1BEUF9OT19TVUlUQUJMRV9DSUQgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkweEQzLyogTm8gc3VpdGFibGUgY2lkKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0VNRVJHRU5DWV9BQ1RfTk9UX0FMTE9XICAgICAgICAgICAgICAgICAgIChEV09SRCkweEQ0LypFbWVyZ2VuY3kgYWN0aXZhdGlvbiBub3QgYWxsb3dlZCBvciBlbWVyZ2VuY3kgYmVhciBleGlzdGVudCBhbHJlYWR5Ki8NCi0jZGVmaW5lIFpfQVBNTUlBX0NFRVJfRVNNX0wzX01TR19USU1FUl9GSUZUSF9FWFBJUlkgICAgICAgICAgICAgICAgIChEV09SRCkweEQ1LypMMyBtZXNzYWdlIHRpbWVyIGZpZnRoIGV4cGlyeSovDQotI2RlZmluZSBaX0FQTU1JQV9DRUVSX0VTTV9QRFBfTk9BUE5fSU5BQ0wgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMHhENi8qTm8gQVBOIG9yIEFQTiBpbiBBQ0wqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ0VFUl9FU01fREVBQ1RfQUxMX1BETl9DT05OX05PVF9BTExPVyAgICAgICAgICAgICAgKERXT1JEKTB4RDcvKkRlYWN0aXZlIGFsbCBQRE4gY29ubmVjdGlvbiBpcyBub3QgYWxsb3dlZCovDQotDQotI2RlZmluZSAgICBaU1RNX1NUT1JBR0VfSURfUEJfREMgICAgICAoQllURSkwCi0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQl9FTiAgICAgIChCWVRFKTEKLSNkZWZpbmUgICAgWlNUTV9TVE9SQUdFX0lEX1BCX0ZEICAgICAgKEJZVEUpMgotI2RlZmluZSAgICBaU1RNX1NUT1JBR0VfSURfUEJfTEQgICAgICAoQllURSkzCi0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQl9NQyAgICAgIChCWVRFKTQKLSNkZWZpbmUgICAgWlNUTV9TVE9SQUdFX0lEX1BCX01FICAgICAgKEJZVEUpNQotI2RlZmluZSAgICBaU1RNX1NUT1JBR0VfSURfUEJfTVQgICAgICAoQllURSk2Ci0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQl9PTiAgICAgIChCWVRFKTcKLSNkZWZpbmUgICAgWlNUTV9TVE9SQUdFX0lEX1BCX1JDICAgICAgKEJZVEUpOAotI2RlZmluZSAgICBaU1RNX1NUT1JBR0VfSURfUEJfU00gICAgICAoQllURSk5Ci0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQl9UQSAgICAgIChCWVRFKTEwCi0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQl9BUCAgICAgIChCWVRFKTExCi0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQk1BWCAgICAgIChCWVRFKTEyCi0jZGVmaW5lICAgIFpTVE1fU1RPUkFHRV9JRF9QQklOVkFMSUQgIChCWVRFKVpTVE1fU1RPUkFHRV9JRF9QQk1BWA0KLQ0KLSNkZWZpbmUgWkFUSTJfRUNDX01BWE5VTSAgICAgICAgOA0KLSNkZWZpbmUgWkFUSTJfQ1BNU01FTV9VU0lNX01BWF9OVU0gICAzMDANCi0vKiANCi0gKiBmYWMoQ0xDSywgQ1BXRCkgVFMgMjcuMDA3DQotICogttTT2lNTwLTLtaOs1rvKudPDQU8sIE9JLCBPWCwgQUksIElSLCBBQiwgQUcsIEFDDQotKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0ZBQ1ZBTFVFX0NTICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUFMgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0FQTU1JQV9GQUNWQUxVRV9QRiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfQVBNTUlBX0ZBQ1ZBTFVFX1NDICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgLyrU2kNQV0TW0LbU06bOqlpQU19BcFVpY2NfUElOMVRZUEUqLw0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfQU8gICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX0FQTU1JQV9GQUNWQUxVRV9PSSAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUNCi0jZGVmaW5lIFpfQVBNTUlBX0ZBQ1ZBTFVFX09YICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNg0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfQUkgICAgICAgICAgICAgICAgICAgICAoQllURSk3DQotI2RlZmluZSBaX0FQTU1JQV9GQUNWQUxVRV9JUiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfQVBNTUlBX0ZBQ1ZBTFVFX05UICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOQ0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfTk0gICAgICAgICAgICAgICAgICAgICAoQllURSkxMA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfTlMgICAgICAgICAgICAgICAgICAgICAoQllURSkxMSAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfTkEgICAgICAgICAgICAgICAgICAgICAoQllURSkxMiAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9GQUNWQUxVRV9BQiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEzICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9GQUNWQUxVRV9BRyAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE0IA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfQUMgICAgICAgICAgICAgICAgICAgICAoQllURSkxNQ0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfRkQgICAgICAgICAgICAgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUE4gICAgICAgICAgICAgICAgICAgICAoQllURSkxNw0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUFUgICAgICAgICAgICAgICAgICAgICAoQllURSkxOA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUFAgICAgICAgICAgICAgICAgICAgICAoQllURSkxOQ0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUEMgICAgICAgICAgICAgICAgICAgICAoQllURSkyMA0KLSNkZWZpbmUgWl9BUE1NSUFfRkFDVkFMVUVfUDIgICAgICAgICAgICAgICAgICAgICAoQllURSkyMSAvKtTaQ1BXRNbQttTTps6qWlBTX0FwVWljY19QSU4yVFlQRSovICAgICAgICAgICAgIA0KLQ0KLS8qILTmtKK53MDtxKO/6cXQts+6xcLrtcTA4NDNICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX05VTVRZUEVfVU5BTExPV0NBTExfQkROICAgICAgICAgIChCWVRFKTAgICAgIC8qsrvUytDtuvS90CovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfTlVNVFlQRV9VTkFMTE9XQ0FMTF9GRE4gICAgICAgICAgKEJZVEUpMSAgICAgLyqyu9TK0O269L3QKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9OVU1UWVBFX0VDQ0NBTEwgICAgICAgICAgICAgICAgICAoQllURSkyICAgICAvKr30vLG6xcLruvS90CAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX05VTVRZUEVfTk9STUNBTEwgICAgICAgICAgICAgICAgIChCWVRFKTMgICAgIC8qxtXNqLr0vdAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfTlVNVFlQRV9VTktOT1dOICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgICAgLyogzrTWqrrFwuvA4NDNKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9OVU1UWVBFX0VDQ0lORkROICAgICAgICAgICAgICAgICAoQllURSk1DQotI2RlZmluZSBaX0FQTU1JQV9OVU1UWVBFX0VDQ05PVElORkROICAgICAgICAgICAgICAoQllURSk2DQotDQotLyrSu7DjtO3O88Lro6y21NOmMjcwMDcgOS4yLjEqLw0KLSNkZWZpbmUgWl9BUE1NSUFfUEhPTkVGQUlMX0VSUiAgICAgICAgICAgICAgICAgKERXT1JEKTANCi0jZGVmaW5lIFpfQVBNTUlBX05PQ09OTlRPUEhPTkVfRVJSICAgICAgICAgICAgIChEV09SRCkxDQotI2RlZmluZSBaX0FQTU1JQV9QSE9ORUFEUFRMSU5LUkVTVkVEX0VSUiAgICAgICAoRFdPUkQpMg0KLSNkZWZpbmUgWl9BUE1NSUFfT1BUTk9UQUxXX0VSUiAgICAgICAgICAgICAgICAgKERXT1JEKTMNCi0jZGVmaW5lIFpfQVBNTUlBX09QVE5PVFNQVF9FUlIgICAgICAgICAgICAgICAgIChEV09SRCk0DQotI2RlZmluZSBaX0FQTU1JQV9QSFNJTVBJTlJFUVVJUkVEX0VSUiAgICAgICAgICAoRFdPUkQpNQ0KLSNkZWZpbmUgWl9BUE1NSUFfUEhGU0lNUElOUkVRVUlSRURfRVJSICAgICAgICAgKERXT1JEKTYNCi0jZGVmaW5lIFpfQVBNTUlBX1BIU0lNUFVLUkVRVUlSRURfRVJSICAgICAgICAgIChEV09SRCk3DQotI2RlZmluZSBaX0FQTU1JQV9OT1NJTV9FUlIgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTANCi0jZGVmaW5lIFpfQVBNTUlBX05FRURQSU5fRVJSICAgICAgICAgICAgICAgICAgIChEV09SRCkxMQ0KLSNkZWZpbmUgWl9BUE1NSUFfTkVFRFBVS19FUlIgICAgICAgICAgICAgICAgICAgKERXT1JEKTEyDQotI2RlZmluZSBaX0FQTU1JQV9TSU1GQUlMVVJFX0VSUiAgICAgICAgICAgICAgICAoRFdPUkQpMTMNCi0jZGVmaW5lIFpfQVBNTUlBX1NJTUJVU1lfRVJSICAgICAgICAgICAgICAgICAgIChEV09SRCkxNA0KLSNkZWZpbmUgWl9BUE1NSUFfU0lNV1JPTkdfRVJSICAgICAgICAgICAgICAgICAgKERXT1JEKTE1DQotI2RlZmluZSBaX0FQTU1JQV9JTkNSQ1RQV0RFUlIgICAgICAgICAgICAgICAgICAoRFdPUkQpMTYNCi0jZGVmaW5lIFpfQVBNTUlBX05FRURQSU4yX0VSUiAgICAgICAgICAgICAgICAgIChEV09SRCkxNw0KLSNkZWZpbmUgWl9BUE1NSUFfTkVFRFBVSzJfRVJSICAgICAgICAgICAgICAgICAgKERXT1JEKTE4DQotI2RlZmluZSBaX0FQTU1JQV9NRU1GVUxMX0VSUiAgICAgICAgICAgICAgICAgICAoRFdPUkQpMjANCi0jZGVmaW5lIFpfQVBNTUlBX0lOVkFMSURJTkRFWF9FUlIgICAgICAgICAgICAgIChEV09SRCkyMQ0KLSNkZWZpbmUgWl9BUE1NSUFfTk9URk9VTkRfRVJSICAgICAgICAgICAgICAgICAgKERXT1JEKTIyDQotI2RlZmluZSBaX0FQTU1JQV9OVkZBSUxVUkVfRVJSICAgICAgICAgICAgICAgICAoRFdPUkQpMjMNCi0jZGVmaW5lIFpfQVBNTUlBX1RFWFRTVFJUT09MT05HX0VSUiAgICAgICAgICAgIChEV09SRCkyNA0KLSNkZWZpbmUgWl9BUE1NSUFfSU5WQUxJRFRFWFRDSEFSX0VSUiAgICAgICAgICAgKERXT1JEKTI1DQotI2RlZmluZSBaX0FQTU1JQV9ESUFMU1RSVE9PTE9OR19FUlIgICAgICAgICAgICAoRFdPUkQpMjYNCi0jZGVmaW5lIFpfQVBNTUlBX0lOVkFMSURESUFMQ0hBUl9FUlIgICAgICAgICAgIChEV09SRCkyNw0KLSNkZWZpbmUgWl9BUE1NSUFfTk9ORVRTUlZfRVJSICAgICAgICAgICAgICAgICAgKERXT1JEKTMwDQotI2RlZmluZSBaX0FQTU1JQV9ORVRUSU1PVVRfRVJSICAgICAgICAgICAgICAgICAoRFdPUkQpMzENCi0jZGVmaW5lIFpfQVBNTUlBX05FVE5PVEFMTE9XRURfRVJSICAgICAgICAgICAgIChEV09SRCkzMg0KLSNkZWZpbmUgWl9BUE1NSUFfTkVUUEVSUElOUkVRX0VSUiAgICAgICAgICAgICAgKERXT1JEKTQwDQotI2RlZmluZSBaX0FQTU1JQV9ORVRQRVJQVUtSRVFfRVJSICAgICAgICAgICAgICAoRFdPUkQpNDENCi0jZGVmaW5lIFpfQVBNTUlBX05FVFNVQlBFUlBJTlJFUV9FUlIgICAgICAgICAgIChEV09SRCk0Mg0KLSNkZWZpbmUgWl9BUE1NSUFfTkVUU1VCUEVSUFVLUkVRX0VSUiAgICAgICAgICAgKERXT1JEKTQzDQotI2RlZmluZSBaX0FQTU1JQV9TRVJQUk9QRVJQSU5SRVFfRVJSICAgICAgICAgICAoRFdPUkQpNDQNCi0jZGVmaW5lIFpfQVBNTUlBX1NFUlBST1BFUlBVS1JFUV9FUlIgICAgICAgICAgIChEV09SRCk0NQ0KLSNkZWZpbmUgWl9BUE1NSUFfQ09OUFJPUElOUkVRX0VSUiAgICAgICAgICAgICAgKERXT1JEKTQ2DQotI2RlZmluZSBaX0FQTU1JQV9DT05QUk9QVUtSRVFfRVJSICAgICAgICAgICAgICAoRFdPUkQpNDcNCi0jZGVmaW5lIFpfQVBNTUlBX0hJRERFTktFWVJFUV9FUlIgICAgICAgICAgICAgIChEV09SRCk0OA0KLQ0KLSNkZWZpbmUgWl9BUE1NSUFfRUFQTUVUSE9ETk9UU1VQUE9SVF9FUlIgICAgICAgKERXT1JEKTQ5DQotI2RlZmluZSBaX0FQTU1JQV9VTktOT1dOX0VSUiAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTAwDQotDQotLyogYWRkaXRpb25hbCArQ01TIEVSUk9SOjxlcnI+IGZhaWx1cmUgY2F1c2UgZGVmaW5lLjI3MDA1IDMuMi41ICovDQotI2RlZmluZSBaX0FQTU1JQV9DTVNTTVNTVkNSU1ZfRVJSICAgICAgICAgICAgICAoRFdPUkQpMzAxDQotI2RlZmluZSBaX0FQTU1JQV9DTVNNRUZBSUxVUkVfRVJSICAgICAgICAgICAgICAoRFdPUkQpMzAwDQotI2RlZmluZSBaX0FQTU1JQV9DTVNPUFROT1RBTExPV19FUlIgICAgICAgICAgICAoRFdPUkQpMzAyIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TT1BUTk9UU1BUX0VSUiAgICAgICAgICAgICAgKERXT1JEKTMwMyAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNJTlZBTElEUERVUEFSQV9FUlIgICAgICAgICAoRFdPUkQpMzA0ICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TSU5WQUxJRFRFWFRQQVJBX0VSUiAgICAgICAgKERXT1JEKTMwNSAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNVU0lNTk9USU5TRVJUX0VSUiAgICAgICAgICAoRFdPUkQpMzEwICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNVU0lNUElOUkVRX0VSUiAgICAgICAgICAgICAoRFdPUkQpMzExICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TUEhVU0lNUElOUkVRX0VSUiAgICAgICAgICAgKERXT1JEKTMxMiAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU1VTSU1GQUlMX0VSUiAgICAgICAgICAgICAgIChEV09SRCkzMTMgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TVVNJTUJVU1lfRVJSICAgICAgICAgICAgICAgKERXT1JEKTMxNCAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU1VTSU1XUk9OR19FUlIgICAgICAgICAgICAgIChEV09SRCkzMTUgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNVU0lNUFVLUkVRX0VSUiAgICAgICAgICAgICAoRFdPUkQpMzE2ICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TVVNJTVBJTjJSRVFfRVJSICAgICAgICAgICAgKERXT1JEKTMxNyAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU1VTSU1QVUsyUkVRX0VSUiAgICAgICAgICAgIChEV09SRCkzMTggICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNNRU1GQUlMX0VSUiAgICAgICAgICAgICAgICAoRFdPUkQpMzIwICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TSU5WQUxJRE1FTV9FUlIgICAgICAgICAgICAgKERXT1JEKTMyMSAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU01FTUZVTExfRVJSICAgICAgICAgICAgICAgIChEV09SRCkzMjIgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTVNTQ0FVTktOT1dOX0VSUiAgICAgICAgICAgICAoRFdPUkQpMzMwDQotI2RlZmluZSBaX0FQTU1JQV9DTVNOT05FVFdPUktTVkNfRVJSICAgICAgICAgICAoRFdPUkQpMzMxICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU05FVFdPUktUSU1FT1VUX0VSUiAgICAgICAgIChEV09SRCkzMzIgICANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU05PQ05NQUFDS19FUlIgICAgICAgICAgICAgIChEV09SRCkzNDANCi0jZGVmaW5lIFpfQVBNTUlBX0NNU1VOS05PV05fRVJSICAgICAgICAgICAgICAgIChEV09SRCk1MDAgIC8qIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0NNU01PQUJPUlRPS19FUlIgICAgICAgICAgICAgIChEV09SRCk1MDEgIC8qIE1PIFNNIGFib3J0ZWQgb2sqLw0KLSNkZWZpbmUgWl9BUE1NSUFfQ01TTk9UTUFUQ0hfRVJSICAgICAgICAgICAgICAgKERXT1JEKTUwMg0KLQ0KLS8qIFNNU8qnsNzUrdLyIDI0MDExIDIzMDQwIDI3MDA1ICovDQotLyogQVQgQ29tbWFuZCBmYWlsdWVyIGRlZmluZSx2YWx1ZSBtYXAgdG8gPGVycj4gaW4gK0NNUyBFUlJPUjo8ZXJyPi4qLw0KLS8qIFJQIExheWVyIGZhaWx1ZXIgY2F1c2UgZGVmaW5lLiAyNDAxMSBjYXVzZSBFMiovDQotI2RlZmluZSBaX0FQTU1JQV9SUFVOQVNTSUdORUROVU1fRVJSICAgICAgICAgICAoRFdPUkQpMSAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQT1BFUkFUT1JERVRSRU1CQVJfRVJSICAgICAgIChEV09SRCk4ICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBDQUxMQkFSUkVEX0VSUiAgICAgICAgICAgICAgKERXT1JEKTEwICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9SUFNNVFJBTlNGRVJSRUpfRVJSICAgICAgICAgICAoRFdPUkQpMjEgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQTUVNQ0FQQUNFWENFRURfRVJSICAgICAgICAgIChEV09SRCkyMiAgIC8qIGZvciBNVC4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBERVNUSU5BVElPTk9VVE9GT1JERVJfRVJSICAgKERXT1JEKTI3ICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9SUFVOSURFTlRJU1VCU0NSSUJFUl9FUlIgICAgICAoRFdPUkQpMjggICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQRkFDSUxJVFlSRUpfRVJSICAgICAgICAgICAgIChEV09SRCkyOSAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBVTktOT1dOU1VCU0NSSUJFUl9FUlIgICAgICAgKERXT1JEKTMwICAgLyogZm9yIE1PLFNNTUEuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQTkVUV09SS09VVE9GT1JERVJfRVJSICAgICAgIChEV09SRCkzOCAgIC8qIGZvciBNTyxTTU1BLiovDQotI2RlZmluZSBaX0FQTU1JQV9SUFRFTVBPUkFSWUZBSUxVUkVfRVJSICAgICAgICAoRFdPUkQpNDEgICAvKiBmb3IgTU8sU01NQS4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBDT05HRVNUSU9OX0VSUiAgICAgICAgICAgICAgKERXT1JEKTQyICAgLyogZm9yIE1PLFNNTUEuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQUlNDVU5BVkFJTEFCTEVfRVJSICAgICAgICAgIChEV09SRCk0NyAgIC8qIGZvciBNTyxTTU1BLiovDQotI2RlZmluZSBaX0FQTU1JQV9SUEZBQ05PVFNVQl9FUlIgICAgICAgICAgICAgICAoRFdPUkQpNTAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQRkFDTk9USU1QX0VSUiAgICAgICAgICAgICAgIChEV09SRCk2OSAgIC8qIGZvciBNTyxTTU1BLiovDQotI2RlZmluZSBaX0FQTU1JQV9SUElOVkFMSURTTU1SX0VSUiAgICAgICAgICAgICAoRFdPUkQpODEgICAvKiBmb3IgTU8sTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQSU5DT1JSRUNUTVNHX0VSUiAgICAgICAgICAgIChEV09SRCk5NSAgIC8qIGZvciBNTyxTTU1BLE1ULiovDQotI2RlZmluZSBaX0FQTU1JQV9SUElOVkFMSURNQU5EQUlORk9fRVJSICAgICAgICAoRFdPUkQpOTYgICAvKiBmb3IgTU8sU01NQSxNVC4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBNU0dUWVBFTk9URVhJU1RfRVJSICAgICAgICAgKERXT1JEKTk3ICAgLyogZm9yIE1PLFNNTUEsTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQTVNHTk9UQ01QUFJPU1RBVEVfRVJSICAgICAgIChEV09SRCk5OCAgIC8qIGZvciBNTyxTTU1BLE1ULiovDQotI2RlZmluZSBaX0FQTU1JQV9SUElFTk9URVhJU1RfRVJSICAgICAgICAgICAgICAoRFdPUkQpOTkgICAvKiBmb3IgTU8sU01NQSxNVC4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfUlBQUk9UT0NPTF9FUlIgICAgICAgICAgICAgICAgKERXT1JEKTExMSAgLyogZm9yIE1PLFNNTUEsTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1JQSU5URVJXT1JLSU5HX0VSUiAgICAgICAgICAgIChEV09SRCkxMjcgIC8qIGZvciBNTyxTTU1BLiovIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiBNTyAmIFNOTUEgOm90aGVyIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyA0MSMgLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluIE1UICAgICAgICA6b3RoZXIgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIDExMSMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIA0KLS8qIFRQIExheWVyIGZhaWx1cmUgY2F1c2UgZGVmaW5lLiAyMzA0MCA5LjIuMy4yMiovIA0KLSNkZWZpbmUgWl9BUE1NSUFfVFBURUxFSU5URVJXT1JLSU5HTk9UU1BUX0VSUiAgKERXT1JEKTEyOCAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9UUFNNVFlQRTBOT1RTUFRfRVJSICAgICAgICAgICAoRFdPUkQpMTI5ICAvKiBmb3IgTU8sTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQQ0FOVFJFUExBQ0VTTV9FUlIgICAgICAgICAgIChEV09SRCkxMzAgIC8qIGZvciBNTyxNVCovDQotI2RlZmluZSBaX0FQTU1JQV9UUElEX0VSUiAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMTQzICAvKiBmb3IgTU8sTVQqLw0KLSNkZWZpbmUgWl9BUE1NSUFfVFBEQ1NOT1RTUFRfRVJSICAgICAgICAgICAgICAgKERXT1JEKTE0NCAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9UUE1TR0NMQVNTTk9UU1BUX0VSUiAgICAgICAgICAoRFdPUkQpMTQ1ICAvKiBmb3IgTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQRENTX0VSUiAgICAgICAgICAgICAgICAgICAgIChEV09SRCkxNTkgIC8qIGZvciBNTyxNVCovDQotI2RlZmluZSBaX0FQTU1JQV9UUENPTU1BTkRDQU5UQUNUX0VSUiAgICAgICAgICAoRFdPUkQpMTYwICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQQ09NTUFORFVOU1VQUE9SVEVEX0VSUiAgICAgIChEV09SRCkxNjEgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfVFBDT01NQU5EX0VSUiAgICAgICAgICAgICAgICAgKERXT1JEKTE3NSAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9UUFRQRFVOT1RTUFRfRVJSICAgICAgICAgICAgICAoRFdPUkQpMTc2ICAvKiBmb3IgTU8sTVQuKi8gICAgDQotI2RlZmluZSBaX0FQTU1JQV9UUFNDQlVTWV9FUlIgICAgICAgICAgICAgICAgICAoRFdPUkQpMTkyICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQTk9TQ1NVQl9FUlIgICAgICAgICAgICAgICAgIChEV09SRCkxOTMgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfVFBTQ1NZU1RFTUZBSUxfRVJSICAgICAgICAgICAgKERXT1JEKTE5NCAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9UUElOVkFMSURTTUVBRERSX0VSUiAgICAgICAgICAoRFdPUkQpMTk1ICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQREVTVFNNRUJBUlJFRF9FUlIgICAgICAgICAgIChEV09SRCkxOTYgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfVFBTTURVUExJUkVKX0VSUiAgICAgICAgICAgICAgKERXT1JEKTE5NyAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX0FQTU1JQV9UUFZQRk5PVFNQVF9FUlIgICAgICAgICAgICAgICAoRFdPUkQpMTk4ICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQVlBOT1RTUFRfRVJSICAgICAgICAgICAgICAgIChEV09SRCkxOTkgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9BUE1NSUFfVFBVU0lNTUVNRlVMTF9FUlIgICAgICAgICAgICAgKERXT1JEKTIwOCAgLyogZm9yIE1ULiovDQotI2RlZmluZSBaX0FQTU1JQV9UUE5PU01TTUVNQ0FQQV9FUlIgICAgICAgICAgICAoRFdPUkQpMjA5ICAvKiBmb3IgTVQuKi8gDQotI2RlZmluZSBaX0FQTU1JQV9UUEVSUklOTVNfRVJSICAgICAgICAgICAgICAgICAoRFdPUkQpMjEwICAvKiBmb3IgTVQuKi8NCi0jZGVmaW5lIFpfQVBNTUlBX1RQTUVNQ0FQQUVYQ0VFRF9FUlIgICAgICAgICAgIChEV09SRCkyMTEgIC8qIGZvciBNVC4qLyAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfVFBVU0lNQVBQQlVTWV9FUlIgICAgICAgICAgICAgKERXT1JEKTIxMiAgLyogZm9yIE1ULiovDQotI2RlZmluZSBaX0FQTU1JQV9UUFVTSU1ET1dOTE9BRF9FUlIgICAgICAgICAgICAoRFdPUkQpMjEzICAvKiBmb3IgTVQuKi8gIA0KLSNkZWZpbmUgWl9BUE1NSUFfVFBVTlNQRUNFUlJDQVVTRV9FUlIgICAgICAgICAgKERXT1JEKTI1NSAgLyogZm9yIE1PLE1ULiovDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuKi8NCi0NCi0vKiBhZGQgZm9yIExvY2tDZWxsIEZhaWwgQ2F1c2UgKi8NCi0vKiBJbnZhbGlkIG9wZXJhdGlvbiB1c2UgWl9BUE1NSUFfT1BUTk9UQUxXX0VSUiAqLw0KLS8qIG5ldHdvcmsgZmFpbHVyZSB1c2UgWl9BUE1NSUFfTkVUV09SS0ZBSUxVUkVfRVJSICovDQotI2RlZmluZSBaX0FQTU1JQV9FTV9QTE1OTk9UQUxXX0VSUiAgICAgICAgICAgICAoRFdPUkQpMjU3DQotI2RlZmluZSBaX0FQTU1JQV9FTV9MQU5PVEFMV19FUlIgICAgICAgICAgICAgICAoRFdPUkQpMjU4DQotI2RlZmluZSBaX0FQTU1JQV9FTV9DRUxMQkFSUkVEX0VSUiAgICAgICAgICAgICAoRFdPUkQpMjU5DQotI2RlZmluZSBaX0FQTU1JQV9OVU1UT09MT05HX0VSUiAgICAgICAgICAgICAgICAoRFdPUkQpMzAwDQotDQotICAgIC8qIERlbEZsZyBvZiArQ01HRCBDb21tYW5kICovICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfU01TREVMRkxHX0JZSURYICAgICAgICAgICAgICAgKEJZVEUpMCAgDQotI2RlZmluZSBaX0FQTU1JQV9TTVNERUxGTEdfUkVBRCAgICAgICAgICAgICAgICAoQllURSkxICANCi0jZGVmaW5lIFpfQVBNTUlBX1NNU0RFTEZMR19SRUFEU0VORCAgICAgICAgICAgIChCWVRFKTIgIA0KLSNkZWZpbmUgWl9BUE1NSUFfU01TREVMRkxHX1JFQURTRU5EVU5TRU5EICAgICAgKEJZVEUpMyAgDQotI2RlZmluZSBaX0FQTU1JQV9TTVNERUxGTEdfQUxMICAgICAgICAgICAgICAgICAoQllURSk0ICANCi0NCi0gICAgLyogVF96UFNfQVBNTUlBX1Ntc01zZ0NvbnRlbnQgwaq6z7XEserKtiAqLyAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9DTUdMUkxUX1BTTVMgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfQVBNTUlBX0NNR0xSTFRfVERFTCAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0FQTU1JQV9DTUdMUkxUX1RTVUIgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9BUE1NSUFfQ01HTFJMVF9UU1IgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfQVBNTUlBX0NNR0xSTFRfVENPTSAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX0FQTU1JQV9DTUdMUkxUX1RDQk0gICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9BUE1NSUFfQ01HTFJMVF9QQ0JNICAgICAgICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lIFpfQVBNTUlBX0NNR0xSTFRfQ09NTSAgICAgICAgICAgICAgICAoQllURSk3DQotDQotICAgIC8qIFRfelBTX0FQTU1JQV9QYkNvbW1vbl9DbmYgserKtiAqLyAgICAgICAgICAgICAgICANCi0jZGVmaW5lICAgWl9BUE1NSUFfUEJDT01NQ05GX01FTUNBUEEgICAgICAgICAgICAoQllURSkxICAgLyogWl9BUE1NSUFfUGJNZW1DYXBhUmVxX0V2ICovDQotDQotICAgIC8qIE1lc3NhZ2Ugc3RhdGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfTVNHU1RBVF9SRUNVTlJFQUQgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9NU0dTVEFUX1JFQ1JFQUQgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfQVBNTUlBX01TR1NUQVRfU1RPVU5TRU5UICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9BUE1NSUFfTVNHU1RBVF9TVE9TRU5UX05PU1RBVFJQVCAgICAgICAoQllURSkzDQotI2RlZmluZSBaX0FQTU1JQV9NU0dTVEFUX0FMTCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfQVBNTUlBX01TR1NUQVRfU1RPU0VOVF9TVEFUUlBUTk9UUkNWICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9BUE1NSUFfTVNHU1RBVF9TVE9TRU5UX1NUQVRSUFRTVE9PVEhSICAoQllURSk2DQotI2RlZmluZSBaX0FQTU1JQV9NU0dTVEFUX1NUT1NFTlRfU1RBVFJQVFNUT1NNU1IgIChCWVRFKTcNCi0NCi0vKiDN+LLgvfS8sbrFwuvX1r3ayv2jrLj5vt1sM73hubm2qCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfRUNDX01BWE5VTSAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9BUE1NSUFfUElOX0xFTiAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLS8qzajTw7Oktsi66rao0uUqLw0KLSNkZWZpbmUgWl9BUE1NSUFfTUFYX0NBTExOQU1FX0xFTiAgICAgICAgICAgICAgICAgKEJZVEUpMjQxICAgLyogtNO157uwsr669L3QtcTQ1cP7s6S2yCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfTUFYX0VNQUlMX0xFTiAgICAgICAgICAgICAgICAgKEJZVEUpMjUwDQotI2RlZmluZSBaX0FQTU1JQV9NQVhfR0FTX0xFTiAgICAgICAgICAgICAgICAgICAoQllURSkyNTANCi0jZGVmaW5lIFpfQVBNTUlBX01BWF9TTkVfTEVOICAgICAgICAgICAgICAgICAgIChCWVRFKTI1MA0KLSNkZWZpbmUgWl9BUE1NSUFfQ05VTV9NQVhDT1VOVCAgICAgICAgICAgICAgICAoQllURSkxMCAgLyogY251bSDX7rTzuPbK/SAqLw0KLS8qIMPcwuuzpLbIyc/P3iovDQotI2RlZmluZSBaX0FQTU1JQV9NQVhfUEFTU1dEX0xFTiAgICAgICAgICAgICAoQllURSk4DQotI2RlZmluZSBaX0FQTU1JQV9DVVJfVFlQRV9FRk5VTSAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX0FQTU1JQV9QQl9DQVBBX01BWF9OVU0gICAgICAgICAgICAgICAoQllURSkzDQotDQotLyogsai4+FBCvfS8sbrFwuu1xMr91+m089ChICovDQotI2RlZmluZSBaX0FQTU1JQV9FQ0NOVU1fTk9DQVJEICAgICAgICAgICAgICAgICAgICAoQllURSkxMCAgICAvKiDO3r+oyrG1xLj2yv0gKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0VDQ05VTV9DQVJEICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIyICAgIC8qINPQv6i49sr9o6zN+LLg1+624DEwuPajrE5W1N3Ksc7eKi8NCi0jZGVmaW5lIFpfQVBNTUlBX0VDQ05VTV9NQVggICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwICAgICAvKs34suK99LyxusXC69futPO49sr9Ki8NCi0vKiBTTVO05rSixvfX7rTzuPbK/SAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX1NNU01FTV9NQVhfUkFOR0UgICAgICAgICAgICAgIChCWVRFKTYNCi0NCi0jZGVmaW5lIFpfTU1JQVNNU19NQVhfUERVX0xFTiAgICAgICAgICAgICAgICAgKEJZVEUpMTc2DQotI2RlZmluZSBaX01NSUFTTVNfTUFYX1RQRFVfTEVOICAgICAgICAgICAgICAgIChCWVRFKTE2NA0KLSNkZWZpbmUgWl9BUE1NSUFfTUFYX0FERFJWQUxVRV9MRU4gICAgICAgICAgICAgICAgKEJZVEUpMTANCi0jZGVmaW5lIFpfQVBNTUlBX01BWF9TTVNQRFVfTEVOICAgICAgICAgICAgICAgICAgIChCWVRFKTE3Ng0KLSNkZWZpbmUgWl9BUE1NSUFfQ0JTX01BWF9URVhUX1BBR0VfTEVOICAgICAgICAgKEJZVEUpODIgICAvKlRFWFTEo8q9z8KjrLWl0rPX7rTzs9DU2NfWvdrK/SovDQotI2RlZmluZSBaX0FQTU1JQV9DQlNfTUFYX1BEVV9QQUdFX0xFTiAgICAgICAgICAoQllURSk4OCAgIC8qUERVxKPKvc/Co6y1pdKz1+6087PQ1NjX1r3ayv0qLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMirvta66rao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKiBDUCBMYXllciBlcnJvciBkZWZpbmUuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19DUF9OV19GQUlMVVJFICAgICAgICAgICAgICAgKERXT1JEKTE3DQotI2RlZmluZSBaX01NSUFTTVNfQ1BfQ09OR0VTVElPTiAgICAgICAgICAgICAgIChEV09SRCkyMg0KLSNkZWZpbmUgWl9NTUlBU01TX0NQX0lOVkFMSURfVEkgICAgICAgICAgICAgICAoRFdPUkQpODENCi0jZGVmaW5lIFpfTU1JQVNNU19DUF9TRU1BTl9JTkNPUiAgICAgICAgICAgICAgKERXT1JEKTk1DQotI2RlZmluZSBaX01NSUFTTVNfQ1BfSU5WQUxfTUFORF9JRSAgICAgICAgICAgIChEV09SRCk5Ng0KLSNkZWZpbmUgWl9NTUlBU01TX0NQX1RZUEVfTk9ORVhJU1QgICAgICAgICAgICAoRFdPUkQpOTcNCi0jZGVmaW5lIFpfTU1JQVNNU19DUF9TVEFURV9OT1RfU1VQICAgICAgICAgICAgKERXT1JEKTk4DQotI2RlZmluZSBaX01NSUFTTVNfQ1BfSUVfTk9ORVhJU1QgICAgICAgICAgICAgIChEV09SRCk5OQ0KLSNkZWZpbmUgWl9NTUlBU01TX0NQX1BST1RPX0VSUiAgICAgICAgICAgICAgICAoRFdPUkQpMTExICANCi0NCi0vKiBSUCBMYXllciBlcnJvciBkZWZpbmUuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9VTkFTU0lHTl9OVU0gICAgICAgICAgICAgKERXT1JEKTEgICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX09QRVJBVE9SX0JBUiAgICAgICAgICAgICAoRFdPUkQpOCAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfQ0FMTF9CQVJSRUQgICAgICAgICAgICAgIChEV09SRCkxMCAgICAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9UUkFOU0ZfUkVKICAgICAgICAgICAgICAgKERXT1JEKTIxICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX01FTV9DQVBBX0VYQ0UgICAgICAgICAgICAoRFdPUkQpMjIgICAgICAgLyogZm9yIE1ULiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfREVTVE5BVElPTl9PVVQgICAgICAgICAgIChEV09SRCkyNyAgICAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9VTklERU5USV9TVUJTQyAgICAgICAgICAgKERXT1JEKTI4ICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX0ZBQ0lMSVRZX1JFSiAgICAgICAgICAgICAoRFdPUkQpMjkgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfVU5LTk9XTl9TVUJTQyAgICAgICAgICAgIChEV09SRCkzMCAgICAgICAvKiBmb3IgTU8sU01NQShQKS4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX05XX09VVF9PUkRFUiAgICAgICAgICAgICAoRFdPUkQpMzggICAgICAgLyogZm9yIE1PLFNNTUEoVCkuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9URU1QT1JBUllfRkFJTCAgICAgICAgICAgKERXT1JEKTQxICAgICAgIC8qIGZvciBNTyxTTU1BKFQpLiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfQ09OR0VTVElPTiAgICAgICAgICAgICAgIChEV09SRCk0MiAgICAgICAvKiBmb3IgTU8sU01NQShUKS4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX1JFU09VUl9VTkFWQUlMICAgICAgICAgICAoRFdPUkQpNDcgICAgICAgLyogZm9yIE1PLFNNTUEoVCkuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9GQUNJX05PTlNVQiAgICAgICAgICAgICAgKERXT1JEKTUwICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX0ZBQ0lfTk9OSU1QICAgICAgICAgICAgICAoRFdPUkQpNjkgICAgICAgLyogZm9yIE1PLFNNTUEoUCkuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9JTlZBTF9TTV9NUiAgICAgICAgICAgICAgKERXT1JEKTgxICAgICAgIC8qIGZvciBNTyxNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX0lOVkFMX01TRyAgICAgICAgICAgICAgICAoRFdPUkQpOTUgICAgICAgLyogZm9yIE1PLFNNTUEoUCksTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9JTlZBTF9NQU5EX0lFICAgICAgICAgICAgKERXT1JEKTk2ICAgICAgIC8qIGZvciBNTyxTTU1BKFApLE1ULiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfVFlQRV9OT05FWElTVCAgICAgICAgICAgIChEV09SRCk5NyAgICAgICAvKiBmb3IgTU8sU01NQShQKSxNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX1NUQVRFX05PVF9TVVAgICAgICAgICAgICAoRFdPUkQpOTggICAgICAgLyogZm9yIE1PLFNNTUEoUCksTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUF9JRV9OT05FWElTVCAgICAgICAgICAgICAgKERXT1JEKTk5ICAgICAgIC8qIGZvciBNTyxTTU1BKFApLE1ULiovDQotI2RlZmluZSBaX01NSUFTTVNfUlBfUFJPVE9fRVJSICAgICAgICAgICAgICAgIChEV09SRCkxMTEgICAgICAvKiBmb3IgTU8sU01NQShQKSxNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1JQX0lXX1VOU1BFQyAgICAgICAgICAgICAgICAoRFdPUkQpMTI3ICAgICAgLyogZm9yIE1PLFNNTUEoUCkuKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotLyogVFAgTGF5ZXIgZmFpbHVyZSBjYXVzZSBkZWZpbmUuKi8gDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX0lXX0ZBSUwgICAgICAgICAgICAgICAgIChEV09SRCkxMjggICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19UWVBFMF9GQUlMICAgICAgICAgICAgICAoRFdPUkQpMTI5ICAgICAgICAvKiBmb3IgTU8sTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfQ0FOTk9UX1JFUEwgICAgICAgICAgICAgKERXT1JEKTEzMCAgICAgICAgLyogZm9yIE1PLE1UKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfVFBQSURfRVJSICAgICAgICAgICAgICAgKERXT1JEKTE0MyAgICAgICAgLyogZm9yIE1PLE1UKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfVFBEQ1NfTk9UX1NVUCAgICAgICAgICAgKERXT1JEKTE0NCAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX0NMQVNTX05PVF9TVVAgICAgICAgICAgIChEV09SRCkxNDUgICAgICAgIC8qIGZvciBNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19UUERDU19FUlIgICAgICAgICAgICAgICAoRFdPUkQpMTU5ICAgICAgICAvKiBmb3IgTU8sTVQqLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19DTURfTk9UX0FDVCAgICAgICAgICAgICAoRFdPUkQpMTYwICAgICAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfQ01EX05PVF9TVVAgICAgICAgICAgICAgKERXT1JEKTE2MSAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX0NNRF9FUlIgICAgICAgICAgICAgICAgIChEV09SRCkxNzUgICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19UUERVX05PVF9TVVAgICAgICAgICAgICAoRFdPUkQpMTc2ICAgICAgICAvKiBmb3IgTU8sTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfU0NfQlVTWSAgICAgICAgICAgICAgICAgKERXT1JEKTE5MiAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX05PX1NDX1NVQlNDICAgICAgICAgICAgIChEV09SRCkxOTMgICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19TQ19TWVNfRkFJTCAgICAgICAgICAgICAoRFdPUkQpMTk0ICAgICAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfSU5WQUxfQUREUiAgICAgICAgICAgICAgKERXT1JEKTE5NSAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX0RFU1RfQkFSICAgICAgICAgICAgICAgIChEV09SRCkxOTYgICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19TTV9SRUpfRFVQTEkgICAgICAgICAgICAoRFdPUkQpMTk3ICAgICAgICAvKiBmb3IgTU8uKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfVFBWUEZfTk9UX1NVUCAgICAgICAgICAgKERXT1JEKTE5OCAgICAgICAgLyogZm9yIE1PLiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX1RQVlBfTk9UX1NVUCAgICAgICAgICAgIChEV09SRCkxOTkgICAgICAgIC8qIGZvciBNTy4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19VU0lNX01FTV9GVUxMICAgICAgICAgICAoRFdPUkQpMjA4ICAgICAgICAvKiBmb3IgTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfTk9fTUVNX0NBUEEgICAgICAgICAgICAgKERXT1JEKTIwOSAgICAgICAgLyogZm9yIE1ULiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX0VSUl9JTl9NUyAgICAgICAgICAgICAgIChEV09SRCkyMTAgICAgICAgIC8qIGZvciBNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19NRU1fQ0FQQV9FWENFICAgICAgICAgICAoRFdPUkQpMjExICAgICAgICAvKiBmb3IgTVQuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19GQ1NfVVNJTV9BUFBfQlVTWSAgICAgICAgICAgKERXT1JEKTIxMiAgICAgICAgLyogZm9yIE1ULiovDQotI2RlZmluZSBaX01NSUFTTVNfRkNTX1VTSU1fRExfRVJSICAgICAgICAgICAgIChEV09SRCkyMTMgICAgICAgIC8qIGZvciBNVC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0ZDU19VTlNQRUNfRVJSICAgICAgICAgICAgICAoRFdPUkQpMjU1ICAgICAgICAvKiBmb3IgTU8sTVQuKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLS8qIGFkZGl0aW9uYWwgK0NNUyBFUlJPUjo8ZXJyPiBmYWlsdXJlIGNhdXNlIGRlZmluZS4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19NRV9GQUlMICAgICAgICAgICAgICAgICAoRFdPUkQpMzAwICAgICAgICANCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfU1JWX1JFU0VSViAgICAgICAgICAgICAgKERXT1JEKTMwMSANCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfT1BFUl9OT1RfQUxMT1cgICAgICAgICAgKERXT1JEKTMwMiANCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfT1BFUl9OT1RfU1VQICAgICAgICAgICAgKERXT1JEKTMwMw0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19JTlZBTF9QRFVfUEFSQSAgICAgICAgICAoRFdPUkQpMzA0DQotI2RlZmluZSBaX01NSUFTTVNfQ01TX0lOVkFMX1RFWFRfUEFSQSAgICAgICAgIChEV09SRCkzMDUNCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfVVNJTV9OT1RfSU5TRVJUICAgICAgICAgKERXT1JEKTMxMA0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19VU0lNX1BJTl9SRVEgICAgICAgICAgICAoRFdPUkQpMzExDQotI2RlZmluZSBaX01NSUFTTVNfQ01TX1BIX1VTSU1fUElOX1JFUSAgICAgICAgIChEV09SRCkzMTINCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfVVNJTV9GQUlMICAgICAgICAgICAgICAgKERXT1JEKTMxMw0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19VU0lNX0JVU1kgICAgICAgICAgICAgICAoRFdPUkQpMzE0DQotI2RlZmluZSBaX01NSUFTTVNfQ01TX1VTSU1fRVJPTkcgICAgICAgICAgICAgIChEV09SRCkzMTUNCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfVVNJTV9QVUtfUkVRICAgICAgICAgICAgKERXT1JEKTMxNg0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19VU0lNX1BJTjJfUkVRICAgICAgICAgICAoRFdPUkQpMzE3DQotI2RlZmluZSBaX01NSUFTTVNfQ01TX1VTSU1fUFVLMl9SRVEgICAgICAgICAgIChEV09SRCkzMTgNCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfTUVNX0ZBSUwgICAgICAgICAgICAgICAgKERXT1JEKTMyMA0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19JTlZBTF9JTkRFWCAgICAgICAgICAgICAoRFdPUkQpMzIxDQotI2RlZmluZSBaX01NSUFTTVNfQ01TX01FTV9GVUxMICAgICAgICAgICAgICAgIChEV09SRCkzMjINCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfU0NBX1VOS05PV04gICAgICAgICAgICAgKERXT1JEKTMzMA0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19OT19OV19TUlYgICAgICAgICAgICAgICAoRFdPUkQpMzMxDQotI2RlZmluZSBaX01NSUFTTVNfQ01TX05XX1RJTUVPVVQgICAgICAgICAgICAgIChEV09SRCkzMzINCi0jZGVmaW5lIFpfTU1JQVNNU19DTVNfTk9fQ05NQV9BQ0sgICAgICAgICAgICAgKERXT1JEKTM0MA0KLSNkZWZpbmUgWl9NTUlBU01TX0NNU19VTktOT1dOX0VSUiAgICAgICAgICAgICAoRFdPUkQpNTAwICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX01NSUFTTVNfQ01TX1VTRVJfQUJPUlRfRVJSICAgICAgICAgIChEV09SRCk1MDEgDQotDQotLyogTU8gU01TIENTL1BTIHNlcnZpY2UgcGF0aC4qLw0KLSNkZWZpbmUgWl9NTUlBU01TX1NFUlZJQ0VfUFNfT05MWSAgICAgICAgICAgICAgICAgICAoQllURSkwIA0KLSNkZWZpbmUgWl9NTUlBU01TX1NFUlZJQ0VfQ1NfT05MWSAgICAgICAgICAgICAgICAgICAoQllURSkxIA0KLSNkZWZpbmUgWl9NTUlBU01TX1NFUlZJQ0VfUFNfUFJFRkVSICAgICAgICAgICAgICAgICAoQllURSkyIA0KLSNkZWZpbmUgWl9NTUlBU01TX1NFUlZJQ0VfQ1NfUFJFRkVSICAgICAgICAgICAgICAgICAoQllURSkzDQotDQotLyogQ29uY2F0ZW5hdGluZyBvciBTTU1BIFNNIGxpbmsgdHJhbnNmZXIgY2hvaWNlLiovDQotI2RlZmluZSBaX01NSUFTTVNfTU1TX0xJTktfRElTQUJMRSAgICAgICAgICAgICAgICAgIChCWVRFKTAgICAgDQotI2RlZmluZSBaX01NSUFTTVNfTU1TX0xJTktfRU5BQkxFX0FTICAgICAgICAgICAgICAgIChCWVRFKTEgIA0KLSNkZWZpbmUgWl9NTUlBU01TX01NU19MSU5LX0VOQUJMRV9NUyAgICAgICAgICAgICAgICAoQllURSkyIA0KLQ0KLS8qIHBhcmFtZXRlciBhY2ttb2RlIGRlZmluZSAuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19DTk1BX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19DTk1BX1JQQUNLICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSANCi0jZGVmaW5lIFpfTU1JQVNNU19DTk1BX1JQRVJST1IgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMiANCi0NCi0vKiBwYXJhbWV0ZXIgPG10PiBvZiArQ05NSSBDb21tYW5kLiovDQotI2RlZmluZSBaX01NSUFTTVNfQ05NSU1UX05PUk9VVEUgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNU19DTk1JTVRfU1RPUkVJTkQgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBU01TX0NOTUlNVF9ESVJFQ1RST1VURSAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTTVNfQ05NSU1UX0NMQVNTM1JPVVRFICAgICAgICAgICAgICAgIChCWVRFKTMNCi0NCi0vKiBwYXJhbWV0ZXIgPGRzPiBvZiArQ05NSSBDb21tYW5kLiovDQotI2RlZmluZSBaX01NSUFTTVNfQ05NSURTX05PUk9VVEUgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNU19DTk1JRFNfRElSRUNUUk9VVEUgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBU01TX0NOTUlEU19TVE9SRUlORCAgICAgICAgICAgICAgICAgICAoQllURSkyDQotDQotLyogTVQgTWVzc2FnZSBzdG9yZSBJbmRpY2F0aW9uLiovDQotI2RlZmluZSBaX01NSUFTTVNfUFJFRkVSX1NUT1JBR0UgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgDQotI2RlZmluZSBaX01NSUFTTVNfVVNJTV9TVE9SQUdFICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgDQotDQotLyogTW1pYVNtc19NZW1BdmFpbFJlcc/7z6Kyzsr9Yk5vdGlmQWJvcnQgKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SUFNNTUFfUkVRICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19SUFNNTUFfQUJPUlQgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSANCi0NCi0vKiBtZXNzYWdlIHR5cGUgcGFyYW1ldGVyIG9mIE1PIFNNIFNlbmRpbmcgKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19ESVJFQ1RfU1VCTUlUX1NFTkQgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19TVE9SRV9TVUJNSVRfU0VORCAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBU01TX0RJUkVDVF9DT01NQU5EX1NFTkQgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTTVNfU1RPUkVfQ09NTUFORF9TRU5EICAgICAgICAgICAgICAgIChCWVRFKTMgDQotDQotLyogcmV0dXJuIHBhcmFuZXRlciB2YWx1ZSBmb3IgU01TIG1lc3NhZ2UuKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19SRVNVTFRfT0sgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19SRVNVTFRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qIFRQRFUgbWVzc2FnZSB0eXBlIElELiovDQotI2RlZmluZSBaX01NSUFTTVNfREVMSVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNNU19ERUxJVkVSX1JQVCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBU01TX1NVQk1JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTTVNfU1VCTUlUX1JQVCAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQVNNU19TVEFUVVNfUlBUICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBU01TX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTTVNfUkVTRVJWRSAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0NCi0vKiBUUC1VREggRXhpc3QgRmxhZy4qLyANCi0jZGVmaW5lIFpfTU1JQVNNU19UUFVESF9OT05FWElTVCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19UUFVESF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qIFRQLVZQRiBzZXR0aW5nICovIA0KLSNkZWZpbmUgWl9NTUlBU01TX1RQVlBfTk9ORVhJU1QgICAgICAgICAgICAgICAgICAgICAoQllURSkwIA0KLSNkZWZpbmUgWl9NTUlBU01TX1RQVlBfRU5IQU5DRSAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTTVNfVFBWUF9SRUxBVElWRSAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQVNNU19UUFZQX0FCU09MVVRFICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qIFRQLUNUIHNldHRpbmcgb2YgU01TX0NPTU1BTkQgKi8gDQotI2RlZmluZSBaX01NSUFTTVNfVFBDVF9FTlFVSVJZICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgDQotI2RlZmluZSBaX01NSUFTTVNfVFBDVF9DQU5DRUwgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgDQotI2RlZmluZSBaX01NSUFTTVNfVFBDVF9ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIgDQotI2RlZmluZSBaX01NSUFTTVNfVFBDVF9TVEFUVVNSUFQgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0NCi0vKiBmbGFnIG9mIFJlcXVpcmluZyBzdGF1cy1yZXBvcnQgKi8NCi0jZGVmaW5lIFpfTU1JQVNNU19TVEFUUlBUX05PVFJFUVVJUkVEICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQVNNU19TVEFUUlBUX1JFUVVJUkVEICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLSAgICAgLyogtOa0orbMz/vPorHq1r7OuyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19VUFJFUVVFU1QgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19ERUxJVkVSTk9UUkVQICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19ERUxJVkVSUkVQICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19TVEFUVVNOT1RSRVAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19TVEFUVVNSRVAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19DQk1TTk9UUkVQICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9BUE1NSUFfU01TQVZFRkxBR19DQk1TUkVQICAgICAgICAgICAgKEJZVEUpNg0KLQ0KLSAgICAvKiC2wbbMz/vPorHq1r7OuyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX1NNUkVBREZMQUdfT05MWVJFQUQgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfQVBNTUlBX1NNUkVBREZMQUdfRk9SU0VORCAgICAgICAgICAgIChCWVRFKTENCi0NCi0gICAgLyogtOa0or/VvOS/ydPD0NQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9TTU1FTU9SWV9VTkFWQUlMQUJMRSAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9TTU1FTU9SWV9BVkFJTEFCTEUgICAgICAgICAgICAoQllURSkxDQotDQotICAgIC8qIE1Pz/vPoreiy823vcq9ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9NU0dfRElSRUNUX1NFTkQgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9NU0dfU1RPUkVfU0VORCAgICAgICAgICAgICAgICAoQllURSkxDQotDQotLyogU01TLURFTElWRVLP+8+itOa0orSmwO3WuMq+ICovICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfTUVNM19QUkVGRVJSRUQgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9BUE1NSUFfVVNJTV9GSVhFRCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLSAgICAvKiDXtMyssai45sfrx/Ox6ta+ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9BUE1NSUFfU1RBVFVTUkVQT1JUX05PVFJFUVVJUkVEICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9BUE1NSUFfU1RBVFVTUkVQT1JUX1JFUVVJUkVEICAgICAgICAgKEJZVEUpMQ0KLQ0KLSAgICAvKiBTTVPP+8+i17TMrLjEseSx6ta+ICovICAgICAgICAgICAgICAgICAgICAgICAgICANCi0jZGVmaW5lIFpfQVBNTUlBX1NUQVRDSEFOR0VfRU5BQkxFICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfQVBNTUlBX1NUQVRDSEFOR0VfRElTQUJMRSAgICAgICAgICAgIChCWVRFKTENCi0NCi0gICAgLyogU01TtOa0osTcwaYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9TTVNNRU1fRlJFRSAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX0FQTU1JQV9TTVNNRU1fRlVMTCAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0FQTU1JQV9TTVNNRU1fSU1TX05PVElGWV9GUkVFICAgICAgICAoQllURSkyDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PSAgQ2FsbEluZm/W0GJEaXK1xMih1rUgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExESVJfTU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExESVJfTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBNT0MgUkVR1tC1xGJFQ2FsbFR5cGW66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX05PUk1BTF9DQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0VNRVJHRU5DWV9DQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQUNDX0VDQUxMX1RFU1RDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQUNDX0VDQUxMX1JFQ09ORklHQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQUNDX0VDQUxMX01BTlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQUNDX0VDQUxMX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBNT0MgUkVR1tC1xGJDYWxsVHlwZbrqtqjS5aOsy+Zl0NDW0E9SSUcvQ09OTiDP+8+i0rLKudPDID09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01NSUFDQ19WT0lDRV9DQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFDQ19EQVRBX0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotLyogz8LD5jK49rrqysfOqtbQ0sbL5mXQ0MCps+S1xCAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfQ01DQ19QU19EQVRBX0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfQ01DQ19FTUVSR0VOQ1lfQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gIE1PQyBSRVHW0LXEuvS90MSjyr266rao0uUgPT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfU0lOR0xFX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfQUxUX1ZPSUNFX0ZBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQUxUX1ZPSUNFX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfRk9MTE9XRURfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgICAgICAgICANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBNT0MgUkVR1tC1xGNsaXLIoda1uuq2qNLlID09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NMSVJfU1VCU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NMSVJfSU5WT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQUNDX0NMSVJfU1VQUFJFU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBDQUxMIElORk/W0LXEuvS90MSjyr266rao0uUgMjcwMDcgK0NMQ0PW0Lao0uU9PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19WT0lDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19GQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19GT0xMT1dFRF9EQVRBX1ZPSUNFICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19BTFRfVk9JQ0VfREFUQV9WT0lDRSAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19BTFRfVk9JQ0VfRkFYX1ZPSUNFICAgICAgICAgICAgICAgICAgIChCWVRFKTUNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19GT0xMT1dFRF9EQVRBX0RBVEEgICAgICAgICAgICAgICAgICAgIChCWVRFKTYNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19BTFRfVk9JQ0VfREFUQV9EQVRBICAgICAgICAgICAgICAgICAgIChCWVRFKTcNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19BTFRfVk9JQ0VfRkFYX0ZBWCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfSU5GT19VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTkNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBDQUxMIElORk/W0LXEY2FsbCBzdGF0ZbrqtqjS5SAyNzAwNyArQ0xDQ9bQtqjS5SA9PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX0hFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX01PX0RJQUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX01PX0FMRVJUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX01UX0lOQ09NSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX01UX1dBSVRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1DQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2IC8qIMvmZdDQXkRTQ0nU9rzTICovDQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX01UX0NPTk5SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk3DQotI2RlZmluZSBaX01NSUFDQ19DQUxMX1NUQVRFX0RJU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk4DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PSAgQ0FMTCBJTkZP1tC1xE1QVFkgZmxhZ7rqtqjS5SAyNzAwNyArQ0xDQ9bQtqjS5T09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX01QVFlfT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX01QVFlfSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBDVUcgSU5GT7rqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gIA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1VHX05PX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1VHX1NVUFBSRVNTX09BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1VHX1NVUFBSRVNTX1BSRUZFUl9DVUcgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1VHX1NVUFBSRVNTX09BX1BSRUZFUl9DVUcgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gIE1PQyBDTka66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfUkVTVUxUX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAvKk1PQyBDTkYgveG5+8LroaJBTlNNT0QgQ05GoaIgTU9ESUZZIElORCovDQotI2RlZmluZSBaX01NSUFDQ19SRVNVTFRfVVNFUkJVU1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIC8qTU9DIENORiC94bn7wusqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfUkVTVUxUX05PQ0FSUklFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMiAvKk1PQyBDTkYgveG5+8LroaJBTlNNT0QgQ05GKi8NCi0jZGVmaW5lIFpfTU1JQUNDX1JFU1VMVF9DT05ORUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgLypNT0MgQ05GIL3hufvC66GiQU5TTU9EIENORqGiIE1PRElGWSBJTkQqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfUkVTVUxUX05PQU5TV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAvKk1PQyBDTkYgveG5+8LrKi8NCi0jZGVmaW5lIFpfTU1JQUNDX1JFU1VMVF9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgLyogTU9DIENORiC94bn7wusgKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBTZXJ2ILLOyv0guuq2qNLlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKiCxyMvmZdDQtcTWtbTzMSAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1JfU0VSVl9BU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1JfU0VSVl9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1JfU0VSVl9SRUxfQVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1JfU0VSVl9SRUxfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gIFByaW9yaXR5ICC66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9NTUlBQ0NfUFJJT1JJVFlfTEVWRUxfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNg0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gIE1UQyBSU1AgcmVzdWx0ILrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX01UQ19SU1BfQUNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgIC8qIMS/x7BtbWlhvfa0psDtvdPK3CwgTW9kVG9NdWx0TWVkaWFfUnNw1tAgvdPK3MfQu7sqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTVRDX1JTUF9SRUogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgLyogTW9kVG9NdWx0TWVkaWFfUnNw1tAgvty++MfQu7sqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gIE1UQyBJTkTW0GJDYWxsVHlwZbrqtqjS5SAyNzAwNyArQ1JD1tC2qNLlID09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9BU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9SRUxfQVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9SRUxfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9GQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9WT0lDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9WT0lDRV9BU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNg0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9WT0lDRV9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNw0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9WT0lDRV9SRUxfQVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9WT0lDRV9SRUxfU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOQ0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9BTFRfVk9JQ0VfQVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTANCi0jZGVmaW5lIFpfTU1JQUNDX1RZUEVfQUxUX1ZPSUNFX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTExDQotI2RlZmluZSBaX01NSUFDQ19UWVBFX0FMVF9WT0lDRV9SRUxfQVNZTkMgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMg0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9BTFRfVk9JQ0VfUkVMX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTMNCi0jZGVmaW5lIFpfTU1JQUNDX1RZUEVfQUxUX0FTWU5DX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE0DQotI2RlZmluZSBaX01NSUFDQ19UWVBFX0FMVF9TWU5DX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNQ0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9BTFRfUkVMX0FTWU5DX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYNCi0jZGVmaW5lIFpfTU1JQUNDX1RZUEVfQUxUX1JFTF9TWU5DX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTE3DQotI2RlZmluZSBaX01NSUFDQ19UWVBFX0FMVF9WT0lDRV9GQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxOA0KLSNkZWZpbmUgWl9NTUlBQ0NfVFlQRV9BTFRfRkFYX1ZPSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTkNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PSAgTVRDIElORNbQIGJDd0ZsYWcguuq2qNLlID09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NBTExfV0FJVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PSAgTVRDIElORNbQICBiTm9DbGlDYXVzZSC66rao0uUgPT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTk9DTElfVU5BVkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgLyog07PJ5M6qYXBtbWlhX25vdEF2YWlsKi8NCi0jZGVmaW5lIFpfTU1JQUNDX05PQ0xJX1JFSkJZVVNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgIC8qINOzyeTOqmFwbW1pYV93aXRoaGVsZCovDQotI2RlZmluZSBaX01NSUFDQ19OT0NMSV9JTlRFUkFDVFdJVEhPU1JWICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyICAvKiDTs8nkzqphcG1taWFfbm90QXZhaWwqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTk9DTElfQ09JTkxJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgLyog07PJ5M6qYXBtbWlhX25vdEF2YWlsKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PSAgTVRDIElORNbQY2FsbCBjbGFzc7rqtqjS5SAyNzAwNyArQ0NXQT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfVk9JQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfRkFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfU01TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfREFUQV9DSVJDVUlUX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYNCi0jZGVmaW5lIFpfTU1JQUNDX0NMQVNTX0RBVEFfQ0lSQ1VJVF9BU1lOQyAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMyDQotI2RlZmluZSBaX01NSUFDQ19DTEFTU19ERURJQ0FURURfUEFDS19BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAoQllURSk2NA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ0xBU1NfREVESUNBVEVEX1BBRF9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTI4DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PSAgRElTTU9EIFR5cGW66rao0uUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01NSUFDQ19ESVNNT0RfVFlQRV9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFDQ19ESVNNT0RfVFlQRV9DSFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotDQotLyo9PT09PT09PT09PT09PT09PT09PSAgUHJvZ3Jlc3MgaW5kaWNhdG9yuuq2qNLlIDI0MDA4IDEwLjUuNC4yMT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX1BJX05PVF9FTkRfVE9fRU5EX1BMTU4gICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQUNDX1BJX0RFU1RfSU5fTk9OX1BMTU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0jZGVmaW5lIFpfTU1JQUNDX1BJX09SSUdfSU5fTk9OX1BMTU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMNCi0jZGVmaW5lIFpfTU1JQUNDX1BJX1JFVFVSTl9UT19QTE1OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQNCi0jZGVmaW5lIFpfTU1JQUNDX1BJX0lOX0JBTkRfVE9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTgNCi0jZGVmaW5lIFpfTU1JQUNDX1BJX0VORF9UT19FTkRfUExNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMyDQotI2RlZmluZSBaX01NSUFDQ19QSV9RVUVVRUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2NA0KLSNkZWZpbmUgWl9NTUlBQ0NfUElfVU5TUEVDSUZJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhlZiAgLypBbGwgb3RoZXIgdmFsdWVzKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09ICBBbGVydCBpbmRpY2F0b3K66rao0uUg1N2xo8H0o6yyu8q508M9PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfRElBTF9UT05FX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfUklOR19CQUNLX1RPTkVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfSU5URVJDRVBUX1RPTkVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBQ0NfTldfQ09OR0VTVF9UT05FX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NTUlBQ0NfQlVTWV9UT05FX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ09ORl9UT05FX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQU5TV19UT05FX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNg0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1dfVE9ORV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNw0KLSNkZWZpbmUgWl9NTUlBQ0NfT0ZGX0hPT0tfVE9ORV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOA0KLSNkZWZpbmUgWl9NTUlBQ0NfVE9ORV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgzZg0KLSNkZWZpbmUgWl9NTUlBQ0NfQUxFUlRfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHg0Zg0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gTm90aWZ5IGluZGljYXRvcrrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfVVNFUl9TVVNQRU5ERUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBQ0NfVVNFUl9SRVNVTUVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQkVBUkVSX0NIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PSAgQ29tbW9uIENuZtbQY2F1c2W1xLrqtqjS5SA9PT09PT09PT09PT09PT09PT09PT0qLw0KLSNkZWZpbmUgWl9NTUlBQ0NfQ09NTU9OX0NBVVNFX1BIT05FX0ZBSUxVUkUgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NPTU1PTl9DQVVTRV9PUEVSX05PVF9BTExPV0VEICAgICAgICAgICAgICAgICAgIChEV09SRCkzDQotI2RlZmluZSBaX01NSUFDQ19DT01NT05fQ0FVU0VfT1BFUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgICAoRFdPUkQpNA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ09NTU9OX0NBVVNFX0lOVkFMSURfSU5ERVggICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTIxDQotI2RlZmluZSBaX01NSUFDQ19DT01NT05fQ0FVU0VfTkVUV09SS19USU1FT1VUICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMzENCi0jZGVmaW5lIFpfTU1JQUNDX0NPTU1PTl9DQVVTRV9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkxMDANCi0jZGVmaW5lIFpfTU1JQUNDX0NPTU1PTl9DQVVTRV9ESVNNT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKTEwMQ0KLQ0KLS8qIMvmZdDQwKnVubXEY2F1c2WjrNTaTm9DYXJyaWVyLE5vQW5zd2VyLFVzZXJCdXN5yrHTw7W9LiBOV19CQVNFfk5XX0VORLHtyr600834wufK1bW9tcRjYXVzZSAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTldfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpMHgwMTAwDQotI2RlZmluZSBaX01NSUFDQ19OV19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV09SRCkweDAxRkYNCi0NCi0vKlRoZSBtYWNybyBvZiB0aGUgY29uc3RhbnQgKi8NCi0jZGVmaW5lIFpfTU1JQUNDX0NDX0NDTV9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgDQotDQotLyogPT09PT09PT09PT09PT09PT09Pbr0vdC9+LPM1rjKvqO6VF96X01taWFDY19Qcm9jSW5mb19JbmTW0GJDYWxsSW5mb8ih1rUgPT09PT09PT09PT09PT09PT09PSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSNkZWZpbmUgWl9NTUlBQ0NfQUxFUlRfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgLyogbW+5/bPM1tDK1bW9YWxlcnTP+8+iICovDQotI2RlZmluZSBaX01NSUFDQ19DQUxMUFJPQ0RfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAvKiBtb7n9s8zW0MrVtb1jYWxsUHJvY2VlZGluZ8/7z6IgKi8NCi0jZGVmaW5lIFpfTU1JQUNDX1BST0dSRVNTX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyIC8qIG10uf2zzNbQytW1vVByb2dyZXNzz/vPoiAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTU9ESUZZVE9WT0lDRV9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTMgLyogbW9kaWZ5tb3T79L0s8m5piAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfTU9ESUZZVE9EQVRBX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgLyogbW9kaWZ5tb3K/b7ds8m5piAqLw0KLSNkZWZpbmUgWl9NTUlBQ0NfUkFESU9CRUFSRVNUX05PVElGWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgLyog0+/S9Lvyyv2+3br0vdDKsc7ez9/XytS0xeTWw83qs8nWuMq+ICovDQotI2RlZmluZSBaX01NSUFDQ19OT1JBRElPQkVBUl9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNiAvKiDT79L0u/LK/b7duvS90Mqxzt7P39fK1LTF5NbDsbvKzbfFICovDQotI2RlZmluZSBaX01NSUFDQ19NVERJU0NTVEFSVF9OT1RJRlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNyAvKiC21LbLudK2z8H3s8y/qsq8ICovDQotI2RlZmluZSBaX01NSUFDQ19TRU5EU0VUVVBNU0dfTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOCAvKiBtb7n9s8zW0Leis/ZMMyBTRVRVUM/7z6IgKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09IFNzTm90aWZ5X0luZNbQYklvclVGZ8ih1rW66rao0uUgPT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NTU0lfSU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFDQ19DU1NVX0lORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT0gU3NOb3RpZnlfSW5k1tBiSW9yVUZnyKHWtc6qQ1NTScqxY29kZcih1rW66rao0uUgPT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX0NTU0lfQ0ZVX0FDSVRWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwIA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTSV9DQ0ZfQUNJVFZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgDQotI2RlZmluZSBaX01NSUFDQ19DU1NJX0NBTExfQkVGT1JXQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMiANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU0lfQ0FMTF9JU1dBSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzIA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTSV9DQUxMX0lTQ1VHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgDQotI2RlZmluZSBaX01NSUFDQ19DU1NJX0NBTExfQk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNSANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU0lfQ0FMTF9CSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2IA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTSV9DTElSX1JFSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTcgDQotI2RlZmluZSBaX01NSUFDQ19DU1NJX0NBTExfQkVERUZMRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOCANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09IFNzTm90aWZ5X0luZNbQYklvclVGZ8ih1rXOqkNTU1XKsWNvZGXIoda1uuq2qNLlID09PT09PT09PT09PT09PT09PT09PSovDQotI2RlZmluZSBaX01NSUFDQ19DU1NVX0NBTExfQkVGT1JFQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU1VfQ0FMTF9JU0NVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTVV9DQUxMX0JFSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIgDQotI2RlZmluZSBaX01NSUFDQ19DU1NVX0NBTExfQkVSRVRSSUVWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU1VfQ0FMTF9JTk1UUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0IA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTVV9IT0xEQ0FMTF9SRUxFQVNFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgDQotI2RlZmluZSBaX01NSUFDQ19DU1NVX1JTVl9DSEVDS1NTX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNiANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU1VfQ0FMTF9JU0NPTk5FQ1RJTkdfSU5FQ1QgICAgICAgICAgICAgICAgICAgICAoQllURSk3IA0KLSNkZWZpbmUgWl9NTUlBQ0NfQ1NTVV9DQUxMX0NPTk5FQ1RFRF9XSVRIT1RIRVJSRU1PVEVSX0lORUNUICAgICAgIChCWVRFKTggDQotI2RlZmluZSBaX01NSUFDQ19DU1NVX0RFRkxFQ1RFRENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOSANCi0jZGVmaW5lIFpfTU1JQUNDX0NTU1VfSU5DQUxMX0ZPUldBUkRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMA0KLQ0KLS8qID09PT09PT09PT09PT09PT09PT09PT09IE1vZFRvTXVsdE1lZGlhX1JzcNbQveG5+7XEyKHWtbrqtqjS5T09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jZGVmaW5lIFpfTU1JQUNDX01PRFRPTUVESUFfQUNDRVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwIC8qIL3TytzH0Lu7ICovDQotI2RlZmluZSBaX01NSUFDQ19NT0RUT01FRElBX1JFSkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAvKiC908rcx9C7uyAqLw0KLQ0KLS8qIENOQVC66rao0uUgKi8NCi0jZGVmaW5lIFpfTU1JQUNDX0NOQVBfTkFNRV9NQVhfTEVOICAgICAgICAgICAgICAgKEJZVEUpMTYwDQotI2RlZmluZSBaX01NSUFDQ19DTklfTkFNRVBSRVNFTlRBTExPVyAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNDX0NOSV9QUkVTRU5UUkVTVFJJQ1QgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBQ0NfQ05JX05BTUVVTkFWQUlMICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFDQ19DTklfTkFNRVBSRVNFTlRSRVNUUklDVCAgICAgICAgIChCWVRFKTMNCi0NCi0vKlpDQ1NUQVRFuuq2qNLlKi8NCi0jZGVmaW5lIFpfTUFYQ0FMTE5NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNw0KLSNkZWZpbmUgWl9DQ19TVEFURV9OQU1FX01BWF9MRU4gICAgICAgICAgICAgICAgICAoQllURSk0MA0KLQ0KLSNkZWZpbmUgIFpfTU1JQVNNX0FUQ01EX0FURCAgICAgKEJZVEUpMCAgLy8gZm9yIFZvTFRFDQotI2RlZmluZSAgWl9NTUlBU01fQVRDTURfUkVESUFMICAgICAoQllURSkxICAvLyBmb3IgVm9MVEUNCi0NCi0jZGVmaW5lIFpfTU1JQVNTX01BWF9QV0RfTEVOICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTggICAgIC8qIGxlbmd0aCBvZiBwYXNzd29yZCBhcnJheSAgKi8NCi0jZGVmaW5lIFpfTU1JQVNTX01BWF9DQUxMTlVNX0xFTiAgICAgICAgICAgICAgICAgIChCWVRFKTE5ICAgIC8qIExlbmd0aCBvZiBDYWxsIE51bSBhcnJheSAgICovDQotI2RlZmluZSBaX01NSUFTU19NQVhfU1VCQURSX0xFTiAgICAgICAgICAgICAgICAgICAoQllURSkyMCAgICAvKiBMZW5ndGggb2YgQWRkcmVzcyBhcnJheSAgICovDQotI2RlZmluZSBaX01NSUFTU19NQVhfVVNTRF9MRU4gICAgICAgICAgICAgICAgICAgICAoQllURSkxNjAgICAvKiBtYXggbGVuZ3RoIG9mIFVTU0Qgc3RyaW5nICovDQotDQotLypTU8nPsai1xEFUw/zB7rTtzvPWuMq+1rWjrLbU06bT61Rfek1taWFTc19Db21tb25fQ25m1tC1xLLOyv1kd0Vycm9yQ29kZSovDQotI2RlZmluZSBaX01NSUFTU19PUFROT1RBTFdfRVJSICAgICAgICAgICAgICAgICAgICAoRFdPUkQpMyAgICAvKm9wZXJhdGlvbiBub3QgYWxsb3dlZCovDQotI2RlZmluZSBaX01NSUFTU19PUFROT1RTUFRfRVJSICAgICAgICAgICAgICAgICAgICAoRFdPUkQpNCAgICAvKm9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkKi8NCi0jZGVmaW5lIFpfTU1JQVNTX0lOQ1JDVFBXREVSUiAgICAgICAgICAgICAgICAgICAgIChEV09SRCkxNiAgIC8qaW5jb3JyZWN0IHBhc3N3b3JkKi8NCi0jZGVmaW5lIFpfTU1JQVNTX0lOVkFMRFRFWFRfRVJSICAgICAgICAgICAgICAgICAgIChEV09SRCkyNSAgIC8qaW52YWxpZCBjaGFyYWN0ZXJzIGluIHRleHQgc3RyaW5nICAgKi8NCi0jZGVmaW5lIFpfTU1JQVNTX05PTldTRVJWX0VSUiAgICAgICAgICAgICAgICAgICAgIChEV09SRCkzMCAgIC8qbm8gbmV0d29yayBzZXJ2aWNlKi8NCi0jZGVmaW5lIFpfTU1JQVNTX05FVFRJTU9VVF9FUlIgICAgICAgICAgICAgICAgICAgIChEV09SRCkzMSAgIC8qbmV0d29yayB0aW1lb3V0Ki8NCi0jZGVmaW5lIFpfTU1JQVNTX1VOS05PV05fRVJSICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkxMDAgIC8qdW5rbm93biovDQotDQotICAgIC8qIENDRkOy6dGv17TMrKGiIENMQ0tcQ0NXQbLp0a+94bn719O94bm5vKS77te0zKzIoda1oaIqLyANCi0jZGVmaW5lIFpfQVBNTUlBX1NTU1RBVFVTX05PVEFDVElWRSAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfQVBNTUlBX1NTU1RBVFVTX0FDVElWRSAgICAgICAgICAgICAgIChCWVRFKTENCi0NCi0gICAgLypDTENLLCBDQ0ZDLCBDQ1dBIMno1sO2r9f31tC1xG1vZGXIoda1uuq2qNLlKi8gICAgICAgICAgDQotI2RlZmluZSBaX0FQTU1JQV9TU09QVE1PREVfREVBQ1RJVkFUSU9OICAgICAgICAgICAoQllURSkwICAvKiC21NOmQ0NGQyxDQ1dBtcRkaXNhYmxlo6zS1LywQ0xDS7XEdW5sb2NrICovDQotI2RlZmluZSBaX0FQTU1JQV9TU09QVE1PREVfQUNUSVZBVElPTiAgICAgICAgICAgICAoQllURSkxICAvKiC21NOmQ0NGQyxDQ1dBtcRlbmFibGWjrNLUvLBDTENLtcRsb2NrICAgICovDQotI2RlZmluZSBaX0FQTU1JQV9TU09QVE1PREVfUVVFUlkgICAgICAgICAgICAgICAgICAoQllURSkyICAvKiBDTENLLCBDQ0ZDLCBDQ1dBIMno1sO2r9f3vdS/ycTcyrnTwyAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfU1NPUFRNT0RFX1JFR0lTVFJBVElPTiAgICAgICAgICAgKEJZVEUpMyAgLyogvfbTw9PaQ0NGQyAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfU1NPUFRNT0RFX0VSQVNVUkUgICAgICAgICAgICAgICAgKEJZVEUpNCAgLyogvfbTw9PaQ0NGQyAqLw0KLSANCi0vKkNMQ0ssIENQV0TJ6NbDtq/X99bQZmFjtcS66rao0uUNCi0gKiC21NPaU1PAtMu1o6zWu8q508NBTywgT0ksIE9YLCBBSSwgSVIsIEFCLCBBRywgQUMqLw0KLSNkZWZpbmUgWl9NTUlBU1NfQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgICANCi0jZGVmaW5lIFpfTU1JQVNTX09JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgICAgDQotI2RlZmluZSBaX01NSUFTU19PWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2ICAgIA0KLSNkZWZpbmUgWl9NTUlBU1NfQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNyAgICANCi0jZGVmaW5lIFpfTU1JQVNTX0lSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTggICAgDQotI2RlZmluZSBaX01NSUFTU19BQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMyAgICAgICAgICAgICAgDQotI2RlZmluZSBaX01NSUFTU19BRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxNCAgIA0KLSNkZWZpbmUgWl9NTUlBU1NfQUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUgICANCi0NCi0NCi0vKiBDTENLLCBDQ0ZDLCBDQ1dBIMno1sO2r9f31tC1xG1vZGXIoda1uuq2qNLlKi8NCi0jZGVmaW5lIFpfTU1JQVNTX0RFQUNUSVZBVElPTiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgICAgIC8qILbU06ZDQ0ZDLENDV0G1xGRpc2FibGWjrNLUvLBDTENLtcR1bmxvY2sgKi8NCi0jZGVmaW5lIFpfTU1JQVNTX0FDVElWQVRJT04gICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgICAgIC8qILbU06ZDQ0ZDLENDV0G1xGVuYWJsZaOs0tS8sENMQ0u1xGxvY2sgICAgKi8NCi0jZGVmaW5lIFpfTU1JQVNTX1FVRVJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIgICAgIC8qIENMQ0ssIENDRkMsIENDV0EgyejWw7av1/e91L/JxNzKudPDICovDQotI2RlZmluZSBaX01NSUFTU19SRUdJU1RSQVRJT04gICAgICAgICAgICAgICAgICAgICAoQllURSkzICAgICAvKiC99tPD09pDQ0ZDICovDQotI2RlZmluZSBaX01NSUFTU19FUkFTVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0ICAgICAvKiC99tPD09pDQ0ZDICovDQotDQotDQotLypjbGFzc3i66rao0uXU2kNMQ0uhokNDRkOhokNDV0G1xMno1sO2r9f3us2y6dGvveG5+9bQyrnTwyovDQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX1ZPSUNFICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX0RBVEEgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX0ZBWCAgICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX1NIT1JUTVNHICAgICAgICAgICAgICAgICAoQllURSk4DQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX0RBVEFDSVJDVUlUU1lOQyAgICAgICAgICAoQllURSkxNg0KLSNkZWZpbmUgWl9NTUlBU1NfU1NDTEFTU19EQVRBQ0lSQ1VJVEFTWU5DICAgICAgICAgKEJZVEUpMzINCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfREVESUNBVEVEUEFDS0VUQUNDRVNTICAgIChCWVRFKTY0DQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTX0RFRElDQVRFRFBBREFDQ0VTUyAgICAgICAoQllURSkxMjgNCi0NCi0vKmNsYXNzeLrqtqjS5cCp1bmjrNTaQ0xDS6GiQ0NGQ6GiQ0NXQbXEyejWw7av1/fW0Mq508MqLw0KLSNkZWZpbmUgWl9NTUlBU1NfU1NDTEFTU19BTExUUyAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTMgICAgLypBbGwgdGVsZXNlcnZpY2VzKi8NCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfQUxMREFUQVRTICAgICAgICAgICAgICAgIChCWVRFKTEyICAgIC8qQWxsIGRhdGEgdGVsZXNlcnZpY2VzKi8NCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfQUxMVFNOT1NNUyAgICAgICAgICAgICAgIChCWVRFKTUgICAgIC8qQWxsIHRlbGVzZXJ2aWNlcyBleGNlcHQgU01TKi8NCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfQVNZTkNTUlYgICAgICAgICAgICAgICAgIChCWVRFKTE2MCAgIC8qQWxsIGFzeW5jIHNlcnZpY2VzKi8NCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfU1lOQ1NSViAgICAgICAgICAgICAgICAgIChCWVRFKTgwICAgIC8qQWxsIHN5bmMgc2VydmljZXMqLw0KLSNkZWZpbmUgWl9NTUlBU1NfU1NDTEFTU18xNSAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTUgICAgDQotI2RlZmluZSBaX01NSUFTU19TU0NMQVNTXzI1NSAgICAgICAgICAgICAgICAgICAgICAoQllURSkyNTUNCi0jZGVmaW5lIFpfTU1JQVNTX1NTQ0xBU1NfU0VWRU4gICAgICAgICAgICAgICAgICAgIChCWVRFKTcNCi0NCi0NCi0vKiBDTENLoaJDQ0ZDoaJDQ1dBsunRr73hufvW0HN0YXR1c7XE17TMrLrqtqjS5SAqLw0KLSNkZWZpbmUgWl9NTUlBU1NfU1NTVEFUVVNfTk9UQUNUSVZFICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBU1NfU1NTVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLQ0KLS8qIENMSVChokNPTFChokNPTFKhokNOQVDN+LLg17TMrLLp0a+94bn71tBttcS66rao0uUgKi8NCi0jZGVmaW5lIFpfTU1JQVNTX0xJTkVfTk9UUFJPVklTRSAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQVNTX0xJTkVfUFJPVklTRSAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfTU1JQVNTX0xJTkVfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0NCi0vKiBDTElSzfiy4Ne0zKyy6dGvveG5+9bQbbXEuuq2qNLlICovDQotI2RlZmluZSBaX01NSUFTU19DTElSX05PVFBST1ZJU0UgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFTU19DTElSX1BFUk1fUFJPVklTRSAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTU19DTElSX1VOS05PV04gICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTU19DTElSX1RFTVBfUkVTVFJJQ1QgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX01NSUFTU19DTElSX1RFTVBfQUxMT1cgICAgICAgICAgICAgICAgICAoQllURSk0DQotDQotDQotLyogQ0NGQ8no1sOyzsr9cmVhc29uyKHWtbrqtqjS5SAqLw0KLSNkZWZpbmUgWl9NTUlBU1NfVU5DT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgWl9NTUlBU1NfTU9CX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgWl9NTUlBU1NfTk9fUkVQTFkgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9NTUlBU1NfTk9UX1JFQUNIICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLSNkZWZpbmUgWl9NTUlBU1NfQUxMX0ZPUlcgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNA0KLSNkZWZpbmUgWl9NTUlBU1NfQUxMX0NPTkRfRk9SVyAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLQ0KLQ0KLS8qICBDVVNEveG5+8nPsajW0KOsss7K/W3Ioda1uuq2qNLlICovDQotI2RlZmluZSBaX01NSUFTU19OT19GVVJUSEVSICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwDQotI2RlZmluZSBaX01NSUFTU19GVVJUSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX01NSUFTU19URVJNSU5BVEVEICAgICAgICAgICAgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSBaX01NSUFTU19PVEhFUl9SRVNQT05ERUQgICAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX01NSUFTU19OT1RfU1VQUE9SVEVSICAgICAgICAgICAgICAgICAgICAoQllURSk0DQotI2RlZmluZSBaX01NSUFTU19USU1FX09VVCAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1DQotDQotLyrSs7LOyv22qNLlKNDous1hcE1taWFJbnQuaNbQQ0JTsr+31rrqtqjS5bGjs9bSu9bCKSovDQotI2RlZmluZSBaX01NSUFDQlNfTUFYX1RFWFRfUEFHRV9MRU4gICAgICAgICAgIChCWVRFKTgyICAgICAgICAvKlRFWFTEo8q9z8KjrLWl0rPX7rTzs9DU2NfWvdrK/SovDQotI2RlZmluZSBaX01NSUFDQlNfTUFYX1BBR0VfTlVNICAgICAgICAgICAgICAgIChCWVRFKTE1ICAgICAgICAvKrnjsqXP+8+i1+6089Kzyv0qLyAgICANCi0jZGVmaW5lIFpfTU1JQUNCU19FVFdTX1NFQ1VSSVRZSU5GT19MRU4gICAgICAgKEJZVEUpNTAgICAgICAgIC8qRVRXU7CyyKvQxc+is6S2yCovDQotDQotLyrP+8+iwrfTyda4yr4qLw0KLSNkZWZpbmUgWl9NTUlBQ0JTX09OTFlfU1RPUkUgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAvKr32tOa0oiovDQotI2RlZmluZSBaX01NSUFDQlNfU1RPUkVfVFJBTlNGRVJTICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIC8qtOa0orKiyc+xqCovDQotI2RlZmluZSBaX01NSUFDQlNfT05MWV9UUkFOU0ZFUlMgICAgICAgICAgICAgIChCWVRFKTIgICAgICAgIC8qvfbJz7GoKi8NCi0NCi0vKkNTQ0IgbW9kZbrqtqjS5SovDQotI2RlZmluZSBaX01NSUFDQlNfQUNDRVBUICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfTU1JQUNCU19OT1RBQ0NFUFQgICAgICAgICAgICAgICAgICAgKEJZVEUpMQ0KLQ0KLS8qVF96TW1pYUNic19EYXRhX0luZNbQYldhcm5pbmdNc2dJbmS66rao0uUqLw0KLSNkZWZpbmUgWl9NTUlBQ0JTX05PX1dBUk5JTkdfTVNHICAgICAgICAgICAgICAoQllURSkwICAgICAgICAvKrfHvq+45s/7z6IqLw0KLSNkZWZpbmUgWl9NTUlBQ0JTX1BSSV9FVFdTX01TRyAgICAgICAgICAgICAgICAoQllURSkxICAgICAgICAvKtb3RVRXU8/7z6IqLw0KLSNkZWZpbmUgWl9NTUlBQ0JTX1NORF9FVFdTX01TRyAgICAgICAgICAgICAgICAoQllURSkyICAgICAgICAvKrioRVRXU8/7z6IqLw0KLSNkZWZpbmUgWl9NTUlBQ0JTX0NNQVNfTVNHICAgICAgICAgICAgICAgICAgICAoQllURSkzICAgICAgICAvKkNNQVPP+8+iKi8NCi0NCi0vKlRfek1taWFDYnNfRGF0YV9JbmTW0GJQcmlFdHdzU2VjRmxnuuq2qNLlKi8NCi0jZGVmaW5lIFpfTU1JQUNCU19TRUNJTkZPX05PVF9QUkVTRU5UICAgICAgICAgKEJZVEUpMCAgICAgICAgLyqwssir0MXPos60zOG5qSovDQotI2RlZmluZSBaX01NSUFDQlNfU0VDSU5GT19QUkVTRU5UICAgICAgICAgICAgIChCWVRFKTEgICAgICAgIC8qsLLIq9DFz6LS0czhuakqLw0KLQ0KLSNkZWZpbmUgWl9NTUlBUERJX1BEUEFERFJfTUFYX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgICAgICAgIC8qSVAgVjS48cq9z8JQRFC12Na31+6087OktsgqLw0KLSNkZWZpbmUgWl9NTUlBUERJX0ROU0FERFJfTUFYX0xFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCAgICAgICAgIC8qRE5TtdjWt9futPOzpLbIKi8NCi0jZGVmaW5lIFpfTU1JQVBESV9VRFBDT05URU5UX01BWF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgIChXT1JEKTI1NiAgICAgICAvKlVEUMr9vt2w/MTayN3X7rTzs6S2yCovDQotDQotI2RlZmluZSBaX01NSUFQRElfQUJPUlRDTEVBTl9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgICAgLypQREnK1bW91tC2z8/7z6K687K70OjSqsflv9WxvrXYseTBvyovDQotI2RlZmluZSBaX01NSUFQRElfQUJPUlRDTEVBTl9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxICAgICAgICAgLypQREnK1bW91tC2z8/7z6K689Do0qrH5b/Vsb612LHkwb8qLw0KLQ0KLSNpZmRlZiBCVFJVTktfU1VQUE9SVA0KLSNkZWZpbmUgWl9BVElUU01fTUFYX0dST1VQSU5GT19OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSlaX01BWF9HUk9VUF9JTkZPX05VTSAgICAgICAvKiAg1+6089fpuPbK/TEwMSovDQotI2RlZmluZSBaX0FUSVRTTV9NQVhfU0NBTkdST1VQX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKVpfTUFYX1NDQU5HUk9VUF9OVU0gICAgICAgIC8qICDX7rTzyajD6NfpuPbK/TIwKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01BWF9TQ0FOR1JPVVBfSU5EX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYgICAgICAgICAgICAgICAgICAgICAgICAgLyogINfutPPJqMPo1+nJz7GouPbK/TE2Ki8NCi0NCi0jZGVmaW5lIFpfQVRJVFNNX01BWF9TSE9SVERBVEFfTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpNTYwICAgICAgICAgICAgICAgICAgICAgICAgLyogILbMyv2+3bXE1+6087OktsgqLw0KLSNkZWZpbmUgWl9BVElUU01fTUFYX0JDRF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSlaX01BWF9CQ0RfTlVNICAgICAgICAgICAgICAvKtfutPPWtTEyKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01BWF9HUk9VUF9OQU1FX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpWl9NQVhfR1JPVVBfTkFNRV9OVU0gICAgICAgLyrX7rTz1rUzMiovDQotI2lmZGVmIF9SMl9TVVBQT1JUDQotI2RlZmluZSBaX0FUSVRTTV9NQVhfU0VSVkxJU1RfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwDQotI2RlZmluZSBaX0FUSVRTTV9NQVhfSVBBRERSX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEyDQotI2VuZGlmDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMX05PUk1BTFJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTAgICAgICAgDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMX0VYVFJBUkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfQVRJVFNNX0NBTExfVVNFUlJFSiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMg0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9ISUdIVExFVkVMUkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkzDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMX1NJTkdMRVVTRVJRVUlUICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTQgDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMX1VOU05BUFBUVEtFWUFIRUFEICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTUgDQotDQotLyowo7rN6siryajD6LmmxNwgMaO6sr+31smow+i5psTcIDKjurnYsdXJqMPouabE3DoqLw0KLSNkZWZpbmUgWl9BVElUU01fRlVMTF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSlaX0ZVTExfU0NBTiAgICAgICANCi0jZGVmaW5lIFpfQVRJVFNNX1BBUlRfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpWl9QQVJUX1NDQU4NCi0jZGVmaW5lIFpfQVRJVFNNX0NMT1NFX1NDQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpWl9DTE9TRV9TQ0FODQotDQotLyowMEjSo7HQMDFI0qPUzjAySLi0u+4qLw0KLSNkZWZpbmUgWl9BVElUU01fS0lMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICAgIA0KLSNkZWZpbmUgWl9BVElUU01fU1RVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxDQotI2RlZmluZSBaX0FUSVRTTV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0vKjCjuruwyKi9ste0zKwxo7q7sMiozP3XtMysKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1NQRUFLX1JJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICAgDQotI2RlZmluZSBaX0FUSVRTTV9MSVNURU5fUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgIA0KLQ0KLS8qMKO6t8e4vdfFMaO6uL3XxbPJuaYqLw0KLSNkZWZpbmUgWl9BVElUU01fREVSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwICAgICANCi0jZGVmaW5lIFpfQVRJVFNNX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgDQotDQotLyowo7rIpdeisuExo7rXorLhKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01PREVfREVSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICAgDQotI2RlZmluZSBaX0FUSVRTTV9NT0RFX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEgIA0KLQ0KLS8qMKO6uvS90L/Vz9DMrDGjurr0vdDNqLuwzKwqLw0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9JRExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkwIA0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxIA0KLQ0KLS8qQ2F1c2UqLw0KLSNkZWZpbmUgWl9BVElUU01fT1BSQVRFX1NVQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDAwICAgLyowMCAgILLZ1/ezybmmKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1BUSV9OT1RNQVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMSAgIC8qMDEgICBQVEmyu8alxeQqLw0KLSNkZWZpbmUgWl9BVElUU01fSU5WQUxJRF9QVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDAyICAgLyowMiAgIM7e0KdQVEnK/da1Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX05FVFdPUktfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwMyAgIC8qMDMgICDN+MLnyqew3CovDQotI2RlZmluZSBaX0FUSVRTTV9DT05HRVNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MDQgICAvKjA0ICAg07XI+yovDQotI2RlZmluZSBaX0FUSVRTTV9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MDUgICAvKjA1ICAg18rUtLK71+MqLw0KLSNkZWZpbmUgWl9BVElUU01fQUhUSF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDA2ICAgLyowNiAgILz4yKjKp7DcKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1VOREVGSU5FRF9DQVVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwNyAgIC8qMDcgICDOtLao0uXUrdLyKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0JFQVJFUl9BQ1RJVkVfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwOCAgIC8qMDggICCz0NTYvajBosqnsNwqLw0KLSNkZWZpbmUgWl9BVElUU01fVElNRVJfT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDA5ICAgLyowOSAgILaoyrHG97OsyrEqLw0KLSNkZWZpbmUgWl9BVElUU01fT1BFUkFUT1JfUFJPSElCSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDBBICAgLyowQSAgILLZ1/fUsb371rm4w9K1zvEqLw0KLSNkZWZpbmUgWl9BVElUU01fSUxMRUdBTF9VU0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDBCICAgLyowQiAgILfHt6jTw7unKi8NCi0jZGVmaW5lIFpfQVRJVFNNX05FVFdPUktfTk9UU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwQyAgIC8qMEMgICDN+MLnsrvWp7PWuMPStc7xKi8NCi0jZGVmaW5lIFpfQVRJVFNNX05FVFdPUktfQ1VSUkVOVF9OT1RTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwRCAgIC8qMEQgICDN+MLnsuC1scewsrvWp7PWuMPStc7xKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1VTRVJfTk9UX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwRSAgIC8qMEUgICDTw7unzrS/qs2ouMPStc7xKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01PVVNFUl9OT1RfUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgwRiAgIC8qMEYgICDW973Q08O7p8O709DIqM/eKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1BUSV9JTl9VU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxMCAgIC8qMTAgICBQVEnS0b6tsbvKudPDKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1VFX05FVFdPUktfUFJPQ0VTU19DT05GTElDVCAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxMSAgIC8qMTEgICDW1bbLus3N+MLnsuDB97PMs+XNuyovDQotI2RlZmluZSBaX0FUSVRTTV9NU0dfU0VNQU5USUNfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MTIgICAvKjEyICAgz/vPotPv0uK07c7zKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0lOVkFMSURfTUFOREFUT1JZX0lFICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxMyAgIC8qMTMgICDO3tCntcSx2NGhSUUqLw0KLSNkZWZpbmUgWl9BVElUU01fSUVfTk9UX0VYSVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDE0ICAgLyoxNCAgIElFsru05tTaKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0NPTkRJVElPTkFMX0lFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxNSAgIC8qMTUgICDM9bz+v8nRoUlFtO3O8yovDQotI2RlZmluZSBaX0FUSVRTTV9NU0dfUFJPVE9DT0xTVEFURV9DT05GTElDVCAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MTYgICAvKjE2ICAgz/vPorrN0K3S6de0zKyz5c27Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX1JPQU1JTkdfTk9UX0FMTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxNyAgIC8qMTcgICCyu9TK0O3C/tPOKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1NXSVRDSE9GRl9ERVJFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxOCAgIC8qMTggICC52Lv616LP+iovDQotI2RlZmluZSBaX0FUSVRTTV9TVEFOREFSRF9ERVJFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MTkgICAvKjE5ICAgserXvNeiz/oqLw0KLSNkZWZpbmUgWl9BVElUU01fREVSRUdfUkVBVFRBQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDFBICAgLyoxQSAgINeiz/q689Do1tjQwreixvDXorLhKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0RFTF9TVUJTQ1JJQkVSX0RBVEFfREVSRUcgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxQiAgIC8qMUIgICDTw7unx6nUvMr9vt2xu8m+s/3S/cbwtcTXos/6Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX0dST1VQX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgxQyAgIC8qMUMgICDX6bK7tObU2iovDQotI2RlZmluZSBaX0FUSVRTTV9BRE1JTklTVFJBVE9SX1BST0hJQklUX1RISVNHUk9VUCAgICAgICAgICAgICAgIChCWVRFKTB4MUQgICAvKjFEICAgudzA7dSxvfvWubjD1+kqLw0KLSNkZWZpbmUgWl9BVElUU01fTVRVU0VSX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDFFICAgLyoxRSAgILG7vdC3vbK7tObU2iovDQotI2RlZmluZSBaX0FUSVRTTV9BRE1JTklTVFJBVE9SX1BST0hJQklUX01UVVNFUiAgICAgICAgICAgICAgICAgIChCWVRFKTB4MUYgICAvKjFGICAgsbu90Le9sbu53MDt1LG9+9a5Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX0dST1VQX01FTUJFUl9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyMCAgIC8qMjAgICDX6bPJ1LHO3tCnKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01UVVNFUl9OT1RfQ0FMTFJJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyMSAgIC8qMjEgICCxu73Qt73O3rr0vdDIqM/eKi8NCi0jZGVmaW5lIFpfQVRJVFNNX01UVVNFUl9TV0lUQ0hPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyMiAgIC8qMjIgICCxu73Qt7252Lv6Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX01UVVNFUl9OT1RfUlNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyMyAgIC8qMjMgICCxu73Q08O7p87ez+zTpiovDQotI2RlZmluZSBaX0FUSVRTTV9OT1JNQUxfUkVMX0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MjQgICAvKjI0ICAg1f2zo7r0vdDKzbfFKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1BEU19SRUxfQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyNSAgIC8qMjUgICC197bIzKjKzbfFuvS90CovDQotI2RlZmluZSBaX0FUSVRTTV9FWENFUFRfUkVMX0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MjYgICAvKjI2ICAg0uyzo7r0vdDKzbfFKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1VTRVJfSVNfQlVTWUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyNyAgIC8qMjcgICDTw7un1f3DpiovDQotI2RlZmluZSBaX0FUSVRTTV9VU0VSX0FMRVJUSU5HX05PVF9BTlNXRVIgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MjggICAvKjI4ICAgsbu90NLRvq3V8cHlo6zTw7unzrS908z9Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX1VTRVJfUkVKX0FOU1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyOSAgIC8qMjkgICCxu73Q08O7p77cvvi908z9Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX0hJR0hFUl9QUklPUl9VU0VSX1JFTCAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyQSAgIC8qMkEgICCxu7jf08XPyLy208O7p8rNt8UqLw0KLSNkZWZpbmUgWl9BVElUU01fTk9UX1NQRUFLRVJfUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDJCICAgLyoyQiAgIMO709DLtbuwyKjP3iovDQotI2RlZmluZSBaX0FUSVRTTV9RVUVVRV9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MkMgICAvKjJDICAgttPB0ML6Ki8NCi0jZGVmaW5lIFpfQVRJVFNNX1dBSVRfSU5MSU5FX1RJTUVST1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgyRCAgIC8qMkQgICDFxbbTs6zKsSovDQotI2RlZmluZSBaX0FUSVRTTV9LSUNLX09VVF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MkUgICAvKjJFICAgsbvM37P2ttPB0CovDQotI2RlZmluZSBaX0FUSVRTTV9VRV9GTE9PUl9SRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MkYgICAvKjJGICAg1tW2y7eixvC7sMioys23xSovDQotI2RlZmluZSBaX0FUSVRTTV9GTE9PUl9JU19GT1JFU1RBTExFRCAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MzAgICAvKjMwICAgu7DIqLG7x8DVvCovDQotI2RlZmluZSBaX0FUSVRTTV9TUEVBS0VSX1RJTUVSX0lNTUVESUFURV9USU1FT1VUICAgICAgICAgICAgICAgIChCWVRFKTB4MzEgICAvKjMxICAgvbK7sLaoyrHG97y0vauzrMqxKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0FEREdST1VQX0VYSVNUX0lOX1VFICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgzMiAgIC8qMzIgICDQ6NKq0MLU9rXEyLrX6dTa1tW2y9LRtObU2iovDQotI2RlZmluZSBaX0FUSVRTTV9ERUxHUk9VUF9OT1RFWElTVF9JTl9VRSAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MzMgICAvKjMzICAg0OjSqsm+s/21xMi61+nU2tbVtsuyu7Tm1NoqLw0KLSNkZWZpbmUgWl9BVElUU01fTU9ESUZZR1JPVVBfTk9URVhJU1RfSU5fVUUgICAgICAgICAgICAgICAgICAgICAoQllURSkweDM0ICAgLyozNCAgINDo0qrQ3raptcTIutfp1NrW1bbLsru05tTaKi8NCi0jZGVmaW5lIFpfQVRJVFNNX09VVF9PRl9NQVhfU0FWRURHUk9VUFMgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHgzNSAgIC8qMzUgICCzrLn91tW2y7/J0tS05rSitcTX7rTzyLrX6cr9ICovDQotI2RlZmluZSBaX0FUSVRTTV9VRV9BUlJFQVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MzYgICAvKjM2ICAgx7e30SovDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMX05PVF9FWElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4MzcgICAvKjM3ICAgILr0vdCyu7Tm1NoqLw0KLSNkZWZpbmUgWl9BVElUU01fVVNFUl9OT1RJTl9TUlZfQVJFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDM4ICAgLyozOCAgICC3osbwx+vH87XE08O7p7K71NrStc7xt7bOp9auxNoqLw0KLSNkZWZpbmUgWl9BVElUU01fTkVUV09SS19SRUxFQVNFX0NBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweDM5ICAgLyozOSAgICC8r8i6usvQxM34x7/WxreixvC1xLr0vdDKzbfFKi8NCi0NCi0NCi0jZGVmaW5lIFpfQVRJVFNNX1VOSU9OQlJPQURfR1JPVVBfSVNBQ1RJVklORyAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhBMCAgIC8qQTAgICAgIMv5yvS1xM2osqjX6dX91Nq8pLvuKi8NCi0vLyNkZWZpbmUgWl9BVElUU01fVVNFUl9OT1RJTl9DQUxMSU5HX0FSRUEgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhBMSAgIC8qQTEgICAgINPDu6eyu9TauvS90Mf40/LE2iovDQotLy8jZGVmaW5lIFpfQVRJVFNNX05PVF9TUlZfQVJFQV9SRUpFQ1RfTkVUU0VSVklDRSAgICAgICAgICAgICAgIChCWVRFKTB4QTIgICAvKkEyICAgICDTw7unsrvU2tK1zvHH+NPyxNoqLw0KLSNkZWZpbmUgWl9BVElUU01fTk9USEFWRV9CRUZPUkVIQU5EX0FVVEhPUklUWSAgICAgICAgICAgICAgICAgICAoQllURSkweEEzICAgLypBMyAgICAgw7vT0NSk1bzTxc/IyKjP3iovDQotI2RlZmluZSBaX0FUSVRTTV9VRV9BSEVBRF9SRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4QTQgICAvKkE0ICAgICDTw7unzOHHsMrNt8UqLw0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9GT1JXQVJEX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweEE1ICAgLypBNSAgICAguvS90Neq0sbKp7DcKi8NCi0NCi0NCi0jZGVmaW5lIFpfQVRJVFNNX0NBTExGT1JXQVJEX0FCT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhEMCAgIC8qRDAgICAgILr0vdDHsNeqsbvW0LbPKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0NBTExGT1JXQVJEX1NFVENNRE5PVEVORCAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhEMSAgIC8qRDEgICAgIMew16rJ6NbDw/zB7s60veHK+KOssrvWtNDQsunRryovDQotI2RlZmluZSBaX0FUSVRTTV9DQUxMRk9SV0FSRF9ORVRXT1JLX1JTUEZBSUwgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4RDIgICAvKkQyICAgICDN+LLgu9i4tMqnsNwqLw0KLSNkZWZpbmUgWl9BVElUU01fVUVfSVNfU1RVTk5FRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweEQzICAgLypEMyAgICAg1tW2y7G70qPUziovDQotI2RlZmluZSBaX0FUSVRTTV9VRV9JU19LSUxMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4RDQgICAvKkQ0ICAgICDW1bbLsbvSo7HQKi8NCi0jZGVmaW5lIFpfQVRJVFNNX1JSQ19SRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhENSAgIC8qRDUgICAgIFJSQ8GsvdPKzbfFKi8NCi0jZGVmaW5lIFpfQVRJVFNNX0xURV9OT1RfQVRUQUNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMHhENiAgIC8qRDYgICAgIExURc6016Ky4SovDQotI2RlZmluZSBaX0FUSVRTTV9VRV9UUklHR0VSX0RFUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTB4RDcgICAvKkQ3ICAgICBVRbSlt6JMVEXIpdeisuEqLw0KLSNkZWZpbmUgWl9BVElUU01fTkVUV09SS19UUklHR0VSX0RFUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweEQ4ICAgLypEOCAgICAgzfjC57Slt6JMVEXIpdeisuEqLw0KLSNkZWZpbmUgWl9BVElUU01fTk9UX1NVUFBPUlRfUFRUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweEQ5ICAgLypEOSAgICAgsrvWp7PWvK/IutK1zvEqLw0KLSNkZWZpbmUgWl9BVElUU01fVU5TUEVDSUZJRURfQ0FVU0VfREVSRUdfU1RBVEUgICAgICAgICAgICAgICAgICAoQllURSkweERBICAgLypEQSAgICAgzrS2qNLl1K3S8qOovfjI686016Ky4cyso6kqLw0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9JU19QUk9DRUVESU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweERCICAgLypEQiAgICAg0tHT0Lr0vdDU2reixvAqLw0KLSNkZWZpbmUgWl9BVElUU01fTkVUV09SVF9OT1RfU1VQUE9SVF9URVJNSU5BTF9UT19URVJNSU5BTF9LRVkgICAoQllURSkweERDICAgLypEQyAgICAgzfjC57K71qez1rbLtb22y7zTw9wqLw0KLSNkZWZpbmUgWl9BVElUU01fTkVUV09SVF9OT1RfU1VQUE9SVF9IQUxGRFVQTEVYX1NJR0xFQ0FMTCAgICAgICAoQllURSkweEREICAgLypERCAgICAgzfjC57K71qez1rDry6u5pLWluvQqLw0KLSNkZWZpbmUgWl9BVElUU01fVVNFUl9BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweERFICAgLypERSAgICAg08O7p9bQts8qLw0KLSNkZWZpbmUgWl9BVElUU01fQ0FMTF9SRUxfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkweERGICAgLypERiAgICAguvS90MrNt8XKp7DcKi8NCi0NCi0NCi0jZGVmaW5lIFpfQVRJVFNNX1VTRVJfTkFNRV9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMzINCi0jZGVmaW5lIFpfQVRJVFNNX01BWF9UUlVOS19JUF9BRERSX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTYNCi0NCi0jZGVmaW5lIFpfQVRJVFNNX1BUVEJFQVJfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNCANCi0NCi0jZW5kaWYNCi0NCi0jZGVmaW5lIE1NSUFfQVNfTFRFX01BWF9TSU5SX05VTSAgKEJZVEUpNAotI2RlZmluZSBNTUlBX0FTX0xURV9NQVhfUlNTSV9OVU0gIChCWVRFKTIKLSNkZWZpbmUgWl9aRVBDR19QQVJBTV9OVU1CRVIgICAgICAoQllURSkyNQotI2RlZmluZSBaX1pHUENHX1BBUkFNX05VTUJFUiAgICAgIChCWVRFKTI1DQotI2RlZmluZSBaX1pVUENHX1BBUkFNX05VTUJFUiAgICAgIChCWVRFKTI1DQotI2RlZmluZSBaX1pVUENHX1ZBTEZHX05VTUJFUiAgICAgIChCWVRFKTgNCi0KLSNkZWZpbmUgWl9NQVhfVE1HSV9OVU1fSU5fTUJTRk5fQVJFQSAgICAgIChCWVRFKTE2Ci0jZGVmaW5lIFpfTUFYX01CU0ZOX0FSRUFfTlVNX0lOX0NFTEwgICAgICAoQllURSk4Ci0jZGVmaW5lIFpfTUFYX1NFU1NJT05fTlVNX19JTl9DRUxMICAgICAgICAoKFdPUkQpKDQzNSkpLyogMTVwbWNoICogMjlzZXNzaW9uICAqLw0KLSNkZWZpbmUgWl9NQVhfU0FJX05VTV9QRVJfRlJFUSAgICAgICAgICAgIChCWVRFKTY0Ci0jZGVmaW5lIFpfTUFYX1NBSV9OVU1fUEVSX1RNR0kgICAgICAgICAgICAoV09SRCkyNTYKLSNkZWZpbmUgWl9NQVhfTFRFX0ZSRVFfTlVNICAgICAgICAgICAgICAgIChCWVRFKTkKLSNkZWZpbmUgWl9NQVhfTUJNU19UTUdJX0xJU1RfTlVNICAgICAgICAgIChCWVRFKTMyCi0KLS8qZU1CTVO8pLvu17TMrCovCi0jZGVmaW5lIFRNR0lfQUNUX1NUQVRVU19TVUNDICAgICAgICAgICAgICAoQllURSkwICAgICAgIC8qvKS77rPJuaYqLwotI2RlZmluZSBUTUdJX0FDVF9TVEFUVVNfRFVQTENfQUNUICAgICAgICAgKEJZVEUpMSAgICAgICAvKtbYuLS8pLvuKi8KLSNkZWZpbmUgVE1HSV9BQ1RfU1RBVFVTX0NITkxfVU5BVkFJTEFCTEUgIChCWVRFKTIgICAgICAgLypUTUdJxqXF5MnPo6xzZXNzaW9uSWTDu9PQxqXF5MnPKi8KLSNkZWZpbmUgVE1HSV9BQ1RfU1RBVFVTX1VOSUNBU1RfVU5TVEFCTEUgIChCWVRFKTMgICAgICAgLypMVEUgUlJDtKbT2tTdzKwqLwotI2RlZmluZSBUTUdJX0FDVF9TVEFUVVNfRU1CTVNfVU5TVVBQT1JUICAgKEJZVEUpNCAgICAgICAvKlNJQjEzsru05tTatNO2+LK71qez1k1CTVMqLwotI2RlZmluZSBUTUdJX0FDVF9TVEFUVVNfVE1HSV9PT0MgICAgICAgICAgKEJZVEUpNSAgICAgICAvKlRNR0nDu9PQxqXF5MnPKi8KLSNkZWZpbmUgVE1HSV9BQ1RfU1RBVFVTX09PUyAgICAgICAgICAgICAgIChCWVRFKTYgICAgICAgLyq1pbKlT09To6xMVEW0ptPaT09Tu/LIpbvu17TMrCovCi0jZGVmaW5lIFRNR0lfQUNUX1NUQVRVU19NQVhfQUNUX1NFUlZJQ0UgICAoQllURSk3ICAgICAgIC8qs6y5/dfutPO8pLvuyv0qLwotCi0vKmVNQk1TyKW8pLvu17TMrCovCi0jZGVmaW5lIFRNR0lfREVBQ1RfU1RBVFVTX1NVQ0MgICAgICAgICAgICAoQllURSkwCi0jZGVmaW5lIFRNR0lfREVBQ1RfU1RBVFVTX0RVUExDX0FDVCAgICAgICAoQllURSkxCi0jZGVmaW5lIEFUSV9BU19TVEFDS18xICAgICAgICAgICAgKEJZVEUpODggICAgICAgLyrTw9PaQVPW97avyc+xqMqxxL+1xMv30v21xMzu0LSjrLWxx7BBU8rH1bsxKi8KLSNkZWZpbmUgQVRJX0FTX1NUQUNLXzIgICAgICAgICAgICAoQllURSkxNzggICAgICAgLyrTw9PaQVPW97avyc+xqMqxxL+1xMv30v21xMzu0LSjrLWxx7BBU8rH1bsyKi8KLSNkZWZpbmUgQVRJX0FTX0lWQUxJRF9TUkNJTkRFWCAgICAoQllURSkyNTUgICAgICAgLyrTw9PaQVPW97avyc+xqMqx1LTL99L9tcTM7tC0o6zEv8eww7vT0Mq508OjrNLytMvM7tC0zt7Qp9a1Ki8NCi0NCi0jZGVmaW5lIFpfQVBNTUlBX0VNX0lORF9ESVNBQkxFICAgICAgICAgICAgICAgICAgIChCWVRFKTAgIC8qILmks8zEo8q90KHH+NDFz6Imx9C7u9DFz6IsILnYsdXW97avyc+xqCAqLw0KLSNkZWZpbmUgWl9BUE1NSUFfRU1fSU5EX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgLyoguaSzzMSjyr3Qocf40MXPoibH0Lu70MXPoiwgtPK/qtb3tq/Jz7GoICovDQotDQotI2RlZmluZSBFVl9aQVRJMl9DcGJyRXhlUmVxX0V2IEFQX01NSUFfQ1BCUl9FWEVfUkVRX0VWDQotI2RlZmluZSBFVl9aQVRJMl9TQ3BiclNldFJlcV9FdiBBUF9NTUlBX1NDUEJSX1NFVF9SRVFfRVYNCi0jZGVmaW5lIEVWX1pBVEkyX0NwYnJFeGVDbmZfRXYgQVBfTU1JQV9DUEJSX0VYRV9DTkZfRVYgDQotI2RlZmluZSBFVl9aQVRJMl9DcGJyU2V0RW5kQ25mX0V2IEFQX01NSUFfQ1BCUl9TRVRfRU5EX0NORl9FVg0KLSNkZWZpbmUgRVZfWkFUSTJfU21zQ21nbFJlcV9FdiBBUF9NTUlBX1NNU19DTUdMX1JFUV9FVg0KLQ0KLSNkZWZpbmUgWl9NQVhfTEJTX0NFTExfTlVNICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMw0KLQ0KLS8qtqjS5UNT0+/S9MTcwabJz7GoveG5+9a1Ki8NCi0jZGVmaW5lIFpfQ1NWT0lDRV9OT1RfU1BUICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lIFpfQ1NWT0lDRV9TUFRfT05MWUVNQyAgICAgICAgICAgICAgICAgICAgIChCWVRFKTENCi0jZGVmaW5lIFpfQ1NWT0lDRV9TUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTINCi0NCi0jZGVmaW5lIE1TRF9NQVhfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMTQwDQotDQotI2lmZGVmIF9VU0VfTFBQX0VDSUQNCi0vKkNsaWVudEV4dElkIEFkZHLX7rTzs6S2yCovDQotI2RlZmluZSBaX01BWF9DTEVOVEFERFJfTEVOICAgICAgICAgICAgICAgICAgKEJZVEUpMjANCi0jZGVmaW5lIFpfTUFYX0NMRU5UTkFNRV9MRU4gICAgICAgICAgICAgICAgICAoQllURSkxNjANCi0NCi0NCi0vKiBUeXBlIG9mIHNoYXBlICAqLw0KLSNkZWZpbmUgICAgWl9FTExJUF9QT0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMA0KLSNkZWZpbmUgICAgWl9FTExJUF9QT0lOVF9VTkNFUlRfQ0lSQ0xFICAgICAoQllURSkxDQotI2RlZmluZSAgICBaX0VMTElQX1BPSU5UX1VOQ0VSVF9FTExJUFNFICAgIChCWVRFKTMNCi0jZGVmaW5lICAgIFpfUE9MWUdPTiAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpNQ0KLSNkZWZpbmUgICAgWl9FTExJUF9QT0lOVF9BTFQgICAgICAgICAgICAgICAoQllURSk4DQotI2RlZmluZSAgICBaX0VMTElQX1BPSU5UX0FMVF9VTkNFUlRFTExJUFNFIChCWVRFKTkNCi0jZGVmaW5lICAgIFpfRUxMSVBfUE9JTlRfQVJDICAgICAgICAgICAgICAgKEJZVEUpMTANCi0NCi0vKiBUeXBlIG9mIFZlbG9jaXR5ICovDQotI2RlZmluZSAgICBaX0hPUklaT05fVkVMICAgICAgICAgICAgICAgICAgIChCWVRFKTANCi0jZGVmaW5lICAgIFpfSE9SSVpPTl9WRVJUSUNfVkVMICAgICAgICAgICAgKEJZVEUpMQ0KLSNkZWZpbmUgICAgWl9IT1JJWk9OX1ZFTF9VTkNFUlQgICAgICAgICAgICAoQllURSkyDQotI2RlZmluZSAgICBaX0hPUklaT05fVkVSVElDX1ZFTF9VTkNFUlQgICAgIChCWVRFKTMNCi0jZW5kaWYNCi0NCi10eXBlZGVmIGVudW0gIA0KLXsNCi0gICAgRVZfWkFUSTJfQkVHSU4gICAgICAgICAgID0gMHg5MDAwLA0KLSAgICANCi0gICAgRVZfWkFUSTJfVEFTS19JTklUX1NJRywNCi0gICAgRVZfWkFUSTJfUkVDVl9DT01NQU5EX0lORCwNCi0gICAgRVZfWkFUSTJfTVVYX0NMT1NFX0lORCwgICAgICAvKiDK1bW9ttS3vbnYsdVNVVjNqLXAx+vH86Os0OjSqrnYsdWxvre9TVVYzai1wCAqLw0KLSAgICBFVl9aQVRJMl9JTklUX0NBUkRfQkFLX1JFQURZLCAvKiDTyUFUSTK45svfsb7Izs7xo6yxuLfdU0lNv6jK/b7dzeqzySAqLw0KLSAgICBFVl9aQVRJMl9JTklUX05WX0RBVEFfSU5ELCAgLyog08lBVEkyuObL37G+yM7O8aOss/XKvLuvTla/qMr9vt0gKi8NCi0gICAgRVZfWkFUSTJfU01fWkdJUEROU19JTkQsIC8qICsgWkdJUEROUzogyc+xqNa4yr7P+8+iICovDQotICAgIEVWX1pBVEkyX1pHREFUQVRFU1RfU0VUX0NORiwNCi0gICAgRVZfWkFUSTJfWkdEQVRBVEVTVF9TRVRfUkVRLA0KLSAgICBFVl9aQVRJMl9HRVRfUERQX0ROU19JUF9BRERSX0lORCwgICAvKiC78cihUERQvKS77rrztcRETlMvSVC12Na3ICovDQotICAgIEVWX1pBVEkyX05WX1NJTV9SRVNFTkRfQVZBSUxfSU5ELCAvKiDW2NDCt6LNqLjmo6zT0LnYU0lNv6i/1bzkv8nTwyAqLw0KLSAgICBFVl9aQVRJMl9URVNUX1NFTkRfQ1NfREFUQSwNCi0gICAgRVZfWkFUSTJfU21zQ21nZFRlc3RSZXFfRXYsDQotICAgIEVWX1pBVEkyX0NNR0RfVEVTVF9DTkYsDQotICAgIEVWX1pBVEkyX1pXRU5fU0VUX1JFUSwNCi0gICAgRVZfWkFUSTJfWldFTl9DTkYsDQotICAgIEVWX1pBVEkyX0RFTEVYVDFfQ05GLA0KLSAgICBFVl9aQVRJMl9ERUxFWFQ1X0NORiwNCi0gICAgRVZfWkFUSTJfWlBPRFdfU0VUX1JFUSwNCi0gICAgRVZfWkFUSTJfQk9BUkROVU1fU0VUX1JFUSwNCi0gICAgRVZfWkFUSTJfQk9BUkROVU1fUVVFUllfUkVRLA0KLSAgICBFVl9aQVRJMl9QUk9EVEVTVF9SRVEsDQotICAgIEVWX1pBVEkyX0RUTUZfUkVRLA0KLSAgICBFVl9aQVRJMl9aRkxBR19TRVRfUkVRLA0KLSAgICBFVl9aQVRJMl9aRkxBR19RVUVSWV9SRVEsDQotICAgIEVWX1pBVEkyX1NUTUxJU1RfSU5ELA0KLSAgICBFVl9aQVRJMl9aTU9ERVNXSVRDSF9TRVRfUkVRLA0KLSAgICBFVl9aQVQyX0FVVE9TVEFSVF9JTkQsDQotICAgIEVWX1pBVEkyX1pTRVRfU0VUX1JFUSwNCi0gICAgDQotICAgIEVWX1pBVEkyX0xURV9aQ09OU1RBVF9JTkQsIC8qICtaQ09OU1RBVDogyc+xqNa4yr7P+8+iIEZPUiBORVdDTSBaUFIgMTEtMDItMjYqLw0KLSAgICANCi0gICAgRVZfWkFUSTJfQ1BCUl9DTkYsDQotDQotICAgIEVWX1pBVEkyX1pNU1JJX0lORCwgICAgLyogNjE3MDAxNTkxNDExIKG+1sfE3Lv60OjH86G/LSDWx8Tcu/rQ6MfzVjOw5rG+zayyvcq1z9YqLw0KLSAgICBFVl9aQVRJMl9aTVNSSV9JTkRfRVhQSVJZX0VWLCAgLyogNjE3MDAxNTkxNDExIKG+1sfE3Lv60OjH86G/LSDWx8Tcu/rQ6MfzVjOw5rG+zayyvcq1z9YqLw0KLSAgICBFVl9aQVRJMl9DT1BOX0NORiwNCi0gICAgRVZfWkFUSTJfWkVNQ0VMTElORk9fUkVRLCAvKtPJuq/K/b3Tv9q0pbeitcS78cihNzUyMLmks8zEo8q9x+vH8yovDQotICAgIEVWX1pBVEkyX1pEVE1GX0lORCwNCi0gICAgRVZfWkFUSTJfRU5EDQotfVRfWkF0aV9FdkRlZjsNCi0NCi10eXBlZGVmIHN0cnVjdHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlNwYXJlMDozOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiU3J2Q2F0ZWcgIDo1OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiTnVtTGVuOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBhYk51bVtaX0FUSVVNTV9NQVhfRU1FUk5VTV9ESUdJVF9OVU1dOw0KLX1UX3pBdGlVbW1fRW1lck51bTsNCi0KLS8qMjQwMDhfMTAuNS4zLjEzICwgRW1lcmdlbmN5X051bWJlcl9MaXN0Ki8KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiRW1lck51bUxlbjsKLSAgICBUX3pBdGlVbW1fRW1lck51bSAgICAgICAgIGF0RW1lck51bVtaX0FUSVVNTV9NQVhfRU1FUk5VTV9OVU1dOw0KLX1UX3pBdGlVbW1fRWNOdW1MaXN0Ow0KLQ0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiU3BhcmUwOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJDb2RlU2NobSAgOjM7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJBZGRDSSAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJOdW1TcGFyZSAgOjM7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJUeHRTdHJMZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGFiVHh0U3RyW1pfQVRJVU1NX01BWF9UWFRTVFJfTlVNXTsNCi19VF96QXRpVW1tX05ldE5hbWU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJZZWFyOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiTW9udGg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJEYXk7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJIb3VyOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiTWludXRlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiU2Vjb25kOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiVG1ab25lOwotfVRfekF0aVVtbV9UWkFuZFRpbWU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJMc2FJZExlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYWJMc2FJZFtaX0FUSVVNTV9NQVhfTFNBSURfTlVNXTsNCi19VF96QXRpVW1tX0xzYUlkOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfVU1NX1NlYXJjaFBsbW5SZXFfRVYoIE1NSUEtPlVNTSApDQotIMu1w/c6INKqx/NVTU2/qsq80aHN+KOssqLWuMP30aHN+MSjyr2hota4tqi1xFBMTU61yA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiBUaGUgc291cmNlIGluZGV4ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBpbmRleCAqLw0KLSAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJSZXNlbEZnOjE7ICAgICAgICAgLyogMDq3x9PDu6fW2NGhIDE608O7p9bY0aEgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJBdXRvRmc6MTsgICAgICAgICAgLyogMDrX1LavxKPKvSAgIDE6yta2r8Sjyr0gKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJGYWlsVG9BdXRvRmc6MTsgICAgLyogMDrKp7DcuvOxo7PWyta2ryAgMTrKp7DcuvPXqtfUtq/Roc34xKPKvSAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYk9wZXJGZzoxOyAgICAgICAgLyowOs601ri2qNTL06rJzDE61ri2qNTL06rJzLWxYk9wZXJGZ9PQ0Kd0UGxtbkFjdNbQtcRQTG1uSUS69sLUKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIDo0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk5hbWVGZzsgLyowse3KvrOkw/ssMbHtyr62zMP7LGJPcGVyRmfOqjHKsdPQ0KcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJPcGVyYXRlW1pfTUFYX0xPTkdOQU1FX0xFTl07ICAgICAgICAgLyrW0Ln60sa2ry1DTUNDOyAg1tC5+sGqzagtQ1VDQzvW0Ln6tefQxS1DVENDKi8NCi0gICAgVF96X1BsbW5BY3QgICAgICAgICAgICAgICAgIHRQbG1uQWN0OyAgICAgICAgICAgLyog1ri2qFBMTU7Qxc+iICovDQotfVRfek1taWFVbW1fU2VhcmNoUGxtbl9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fUGxtbkluZm9JbmRfRVYoIFVNTS0+TU1JQSApDQotIMu1w/c6IFVNTcnPsai4+E1NSUG1xNekwfS1xFBMTU61xNDFz6K6zde0zKwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDc1N0YXRlOyAgICAgICAgICAgLyogQ1PT8teisuHXtMyso6y+38zl17TMrLz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUHNTdGF0ZTsgICAgICAgICAgIC8qIFBT0/LXorLh17TMrKOsvt/M5de0zKy8+7rqtqjS5SAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNzUmVhc29uOyAgICAgICAgICAvKiBDU9Py16Ky4cqnsNzUrdLyo6y8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBzUmVhc29uOyAgICAgICAgICAvKiBQU9Py16Ky4cqnsNzUrdLyo6y8+7rqtqjS5SAqLyANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUHNTcnY7ICAgICAgICAgICAgIC8qINChx/jKx7fx1qez1nBz0/LStc7xo6zAtNfUz7XNs8/7z6I6IHpwc19pbnZhbGlkOrK71qez1qOsenBzX3ZhbGlkOiDWp7PWICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ3NTcnY7ICAgICAgICAgICAgIC8qINChx/jKx7fx1qez1mNz0/LStc7xo6zAtNfUz7XNs8/7z6IgOiB6cHNfaW52YWxpZDqyu9ans9ajrHpwc192YWxpZDog1qez1iovDQotDQotICAgIFRfel9QbG1uQWN0ICAgICAgICAgICAgICAgICB0UGxtbkFjdDsNCi0gICAgVF96X0xBQyAgICAgICAgICAgICAgICAgICAgIHRMYWM7ICAgICAgICAgICAgICAgLyogzrvWw8f4seDC6yAqLw0KLSAgICBUX3pfQ2VsbElkICAgICAgICAgICAgICAgICAgdENlbGxJZDsgICAgICAgICAgICAvKiDQocf4SUQ/Pz8gKi8NCi0gICAgVF96QXRpVW1tX0VjTnVtTGlzdCAgICAgICAgICAgICB0RWNOdW1MaXN0OyAgICAgICAgIC8qIMbk1tBiTnVtzqrN+MLn0K+0+LXEvfS8sbr0vdC6xcLruPbK/aOstqjS5c2sMjQwMDguDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDU2rj2yv2yu86qMMqx0OjSqriyuMdNRdStwLS05rSitcS6xcLro7u49sr9zqowyrG4+b7dTUNDyKHWtci3tqjKx7fxyb6z/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUmFjOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkVwc1N0YXRlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkVwc1JlYXNvbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJJbXNPdmVyUHNJbmQ7ICAgICAgIC8qdGhlIElNUyB2b2ljZSBvdmVyIFBTIHNlc3Npb24gaW5kaWNhdG9yKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJFbWVyZ2VuY3liZWFyZXJJbmQ7IC8qdGhlIGVtZXJnZW5jeSBiZWFyZXIgc2VydmljZXMgaW5kaWNhdG9yKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdUYWM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVVtbV9QbG1uSW5mb19JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fUGxtbkxpc3RSZXFfRVYoIE1NSUEtPlVNTSApDQotIMu1w/c6IMfrx/NVTU3L0cv31ri2qMSz1sbKvbvyxLPQqcnPtcRQTE1OwdCx7Q0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvLyBUaGUgc291cmNlIGluZGV4DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBpbmRleA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkFjdDsgICAgICAgICAgICAgICAvLyDWxsq90MXPog0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk5lZWRCYW5kSW5mbzsgICAgICAvLyAwOiDG1c2otcRQTE1OwdCx7cfrx/M7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE6INKqx/PJz7GoxrW2ztDFz6K1xMfrx/MuDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU2NhbkZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfek1taWFVbW1fUGxtbkxpc3RfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfVU1NX1BsbW5MaXN0Q25mX0VWKCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU3Jz7GouPhNTUlBv8nTw8HQse21xNDFz6KjrLKiserD99e0zKwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTnVtUGxtbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBUX3pfUGxtbkFjdCAgICAgICAgICAgICAgICAgYXRQbG1uTGlzdFtaX01heFBvc3NpYmxlUGxtbk51bV07ICAgICAgLyrL+dPQy9HRsLW9tcRQTE1OwdCx7SovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICBhd1BsbW5Sc3JwW1pfTWF4UG9zc2libGVQbG1uTnVtXTsgICAgICAvKiDQxbrFx7+2yCovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICBhd1BsbW5RbWluW1pfTWF4UG9zc2libGVQbG1uTnVtXTsgICAgICAvKtekwfTDxc/eUXJ4bGV2bWluKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiU3RhdGVMaXN0W1pfTWF4UG9zc2libGVQbG1uTnVtXTsgICAgIC8qw79QTE1Oz+DTprXE17TMrKO6MDrOtNaqIDE6v8nTwyAyOrWxx7AgMzq9+9PDKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOyAgICAgICAgICAgIC8qILvxyKHB0LHtyqew3NSt0vIgKi8NCi19VF96TW1pYVVtbV9QbG1uTGlzdF9DbmY7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fU0NBTl9DTmZfRVYoIFVNTS0+TU1JQSApDQotIMu1w/c6IFVNTcnPsai4+E1NSUHJqMa1veG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiBUaGUgc291cmNlIGluZGV4ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBpbmRleCAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTY2FuUGxtbk51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBUX3pfU2NhblBsbW5JbmZvICAgICAgYXRTY2FuUGxtbkluZm9MaXN0W1pfTWF4UG9zc2libGVQbG1uTnVtXTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgIGR3Q2F1c2U7ICAgICAgICAgICAgLyogyqew3NSt0vIgKi8NCi19VF96TW1pYVVtbV9TY2FuX0NuZjsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0++juk1NSUFfVU1NX1BMTU5MSVNUX0JBTkRJTkZPX0NORl9FVihVTU0tPk1NSUEpDQoty7XD9zogu9i4tFBMTU7B0LHtv8nTw834wue8sMbkxrW2ztDFz6K1xMi3yM/P+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkdzbUFQbG1uTnVtOyAgICAgICAgICAgIC8qR1NN1sbKvc/Cv8nTw1BMTU7B0LHtuPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVGRBUGxtbk51bTsgICAgICAgICAgICAgLypVVFJBTtbGyr3Pwr/J08NQTE1OwdCx7bj2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYldBUGxtbk51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJMdGVBUGxtbk51bTsgICAgICAgICAgICAvKkxURdbGyr3Pwr/J08NQTE1OwdCx7bj2yv0qLw0KLQ0KLSAgICBUX3pfQXZhaWxQbG1uICAgICAgICAgICAgICAqcHRHQVBsbW5MaXN0OyAgICAgICAgICAgIC8qR1NN1sbKvc/Cv8nTw1BMTU7B0LHtKi8NCi0gICAgVF96X0F2YWlsUGxtbiAgICAgICAgICAgICAgKnB0VEFQbG1uTGlzdDsgICAgICAgICAgICAvKlRE1sbKvc/Cv8nTw1BMTU7B0LHtKi8NCi0gICAgVF96X0F2YWlsUGxtbiAgICAgICAgICAgICAgKnB0V0FQbG1uTGlzdDsgICAgICAgICAgICAvKlfWxsq9z8K/ydPDUExNTsHQse0qLw0KLSAgICBUX3pfQXZhaWxQbG1uICAgICAgICAgICAgICAqcHRFQVBsbW5MaXN0OyAgICAgICAgICAgIC8qTFRF1sbKvc/Cv8nTw1BMTU7B0LHtKi8NCi19VF96TW1pYVVtbV9QbG1uTGlzdF9CYW5kSW5mb19DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TW1pYVVtbV9BY3RpdmVSZXFfRVYoIE1NSUEtPlVNTSApDQotIMu1w/c6IMfrx/NVTU28pLvuu/LIpbyku+7Es7j20/INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJBY3RpdmVUeXBlOjE7ICAgIC8qIDA6YXR0YWNoOyAxOmRldGFjaCAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYkFjdGl2ZVZhbHVlOjI7ICAgIC8qIDA6Y3M7IDE6cHM7IDI6Y3MvcHMgKi8gDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICA6NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX0FjdGl2ZV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fQWN0aXZlQ25mX0VWKCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU221Lyku+678silvKS77rLZ1/e1xMi3yM8NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgIC8qILav1/e94bn7o6zIoda1bVN1Y2NSbHRfTSwgbUZhaWxSbHRfTSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd0NhdXNlOyAgICAgICAgICAgICAvKiBHUFJTIEF0dGFjaMqnsNzUrdLyo6y+38zlyKHWtbz7z+DTprXEuuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLX1UX3pNbWlhVW1tX0FjdGl2ZV9DbmY7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fTW1JbmZvSW5kX0VWKCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU3Jz7GouPhNTUlBzfjC57XE0MXPoqGjTU1JQbXEtKbA7c2ouf266sC0v9jWxg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiBUaGUgc291cmNlIGluZGV4ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBpbmRleCAqLw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYkZOYW1lRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJTTmFtZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiTFRab25lRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJVVGltZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiTGFzSWRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYlNUaW1lRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIDoyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkxvY2FsVFpvbmU7CS8qILWxtdjKscf4o6y+38zltqjS5bz7MjQwMDggMTAuNS4zLjgqLw0KLQ0KLSAgICBUX3pBdGlVbW1fTmV0TmFtZSAgICAgICAgICAgICAgIHRGdWxsTmFtZTsvKiDUy9OqyczIq7PGICovDQotICAgIFRfekF0aVVtbV9OZXROYW1lICAgICAgICAgICAgICAgdFNob3J0TmFtZTsvKiDUy9OqyczL9cP7ICovIA0KLSAgICBUX3pBdGlVbW1fVFpBbmRUaW1lICAgICAgICAgICAgIHRVVGltZTsgICAgICAgICAvKiDNqNPDyrG85LrNyrHH+KOsvt/M5bao0uW8+zI0MDA4IDEwLjUuMy45Ki8NCi0gICAgVF96QXRpVW1tX0xzYUlkICAgICAgICAgICAgICAgICB0THNhSWQ7ICAgICAgICAgLyogTFNBIElELL7fzOW2qNLlvPsyNDAwOCAxMC41LjMuMTEqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNhdlRpbWU7ICAgICAgIC8qIM/EyrHWxrX31sbKsbzko6y+38zltqjS5bz7MjQwMDggMTAuNS4zLjEyLrjDss7K/bK7tObU2sqxtcjNrNPayKHWtTAqLw0KLSAgICBUX3pfUGxtbklkICAgICAgICAgICAgICAgICAgdEN1clBsbW5JZDsgICAgIC8qtbHHsM34wudJRCovDQotfVRfek1taWFVbW1fTW1JbmZvX0luZDsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1VNTV9DQVVTRV9JTkRfRVYoIFVNTS0tPkFUSSApDQotIMu1w/c6ICBOQVPP8kFUSdb3tq/Jz7GoQ2F1c2UNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RUeXBlOy8qMC1NTSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQWN0OyAvKjMtR1NNLDUtVywxNS1URCwxNy1MVEUqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRvbWFpbjsgLyowLUNTLDEtUFMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhdXNlOw0KLX1UX3pNbWlhVW1tX0NhdXNlX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1VNTV9SRkNvbnRyb2xSZXFfRVYoIE1NSUEtPlVNTSApDQotIMu1w/c6IE1NSUG3osvNv6q52MnkxrW1xMfrx/O1vVVNTQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiBUaGUgc291cmNlIGluZGV4ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBpbmRleCAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXRlOyAgICAvKiAwOm9mZiwxOm9uKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX1JGQ29udHJvbF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fUkZDb250cm9sQ25mX0VWKCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU3P8k1NSUHIt8jPyeTGtb+qxvS78rnYsdUNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7Lyogtq/X973hufujrMih1rVtU3VjY1JsdF9NLCBtRmFpbFJsdF9NICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVVtbV9SRkNvbnRyb2xfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfVU1NX0Fib3J0UmVxX0VWKCBNTUlBLT5VTU0gKQ0KLSDLtcP3OiBNTUlBx+vH81VNTdbQts+1scewtcSy2df3DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qIFRoZSBzb3VyY2UgaW5kZXggKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogVGhlIGRlc3RpbmF0aW9uIGluZGV4ICovDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3Q2F1c2U7DQotfVRfek1taWFVbW1fQWJvcnRfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDP+8+io7pNTUlBX1VNTV9FTV9Mb2NrQ2VsbFJlcV9FdiANCi0guabE3KO6uaSzzMSjyr3Pwsfrx/PL+Lao0KHH+NekwfSjqL32ysrTw9PaVETWxsq9z8K1xMrWtq/L0c34x9LT0Lf+zvHQocf4o6kNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQWN0aW9uOyAgICAgICAvKjE6IMv4tqjQocf4LCAwOiC94sv40KHH+CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3VWFyZmNuOyAgICAgICAvKsv4tqjQocf4yrHT0NCnKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdDZWxsUGFyYUlkOyAgIC8qy/i2qNChx/jKsdPQ0KcqLyANCi19VF96TW1pYVVtbV9FTV9Mb2NrQ2VsbF9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0VNX0xvY2tDZWxsQ25mX0V2DQotILmmxNyjurmks8zEo8q9z8LL+NChx/jWpMq1o6i99srK08PT2lRE1sbKvc/CtcTK1ravy9HN+MfS09C3/s7x0KHH+KOpDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3UmVhc29uOw0KLX1UX3pNbWlhVW1tX0VNX0xvY2tDZWxsX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1VNTV9TeXNjb25maWdSZXFfRVYoIE1NSUEtPlVNTSApDQotICAgICAgICAgTU1JQV9VTU1fU1lTQ09ORklHX1FVRVJZX0NORl9FVihVTU0tPk1NSUEpDQotICAgICAgICAgy7XD9zog0qrH81VNTb+qyrzG9NPD0MK1xM+1zbPF5NbDoaMNCi0gICAgICAgICAgICAgICAgIFVNTbvYuLRNTUlBtbHHsLXEz7XNs8Xk1sPQxc+io7sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgICAgICAgIC8qIFRoZSBzb3VyY2UgaW5kZXggKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgICAgICAgIC8qIFRoZSBkZXN0aW5hdGlvbiBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGU7ICAgICAgICAgICAgICAgICAgICAgLyogz7XNs8Sjyr2yzr+8o6yyzrz7uuq2qNLlKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJhY3FvcmRlcjsgICAgICAgICAgICAgICAgIC8qIM34wue908jrtM7Q8qOsss68+7rqtqjS5SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBicm9hbTsgICAgICAgICAgICAgICAgICAgICAvKiDKx7fx1qez1sL+086jrLLOvPu66rao0uUqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNydmRvbWFpbjsgICAgICAgICAgICAgICAgLyog0/LJ6NbDo6yyzrz7uuq2qNLlKi8NCi19VF96TW1pYVVtbV9TeXNjb25maWdSZXFfUmVxLCBUX3pNbWlhVW1tX1N5c2NvbmZpZ1FyeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9VTU1fQ29tbW9uQ25mX0V2KCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU221Mb008PQwsXk1sOy2df3tcTIt8jPo6i689D4stnX97/J0tTAqdW5o6kNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiBUaGUgZGVzdGluYXRpb24gaW5kZXggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgICAgICAgLyogtq/X973hufujrMih1rVtU3VjY1JsdF9NLCBtRmFpbFJsdF9NICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOyAgICAgICAgICAgIC8qIMno1sPKp7Dc1K3S8jogo6i+rcK9u7bIt8jPo6zV67bUc3lzY29uZmln1rvM7tC0tMvUrdLyOrLZ1/eyu9TK0O2jqSovDQotfVRfek1taWFVbW1fQ29tbW9uX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBNTUlBX1VNTV9DZ2F0dFF1ZXJ5UmVxX0VWKCBNTUlBLT5VTU0gKQ0KLSBNTUlBX1VNTV9WT0lDRV9NT0RFX1FVRVJZX1JFUV9FVihNTUlBLT5VTU0pDQotIE1NSUFfVU1NX1NZU0NPTkZJR19RVUVSWV9SRVFfRVYoTU1JQS0+VU1NKQ0KLSDLtcP3OrLp0a9QU7i918XXtMysDQotICAgICAgILLp0a9Wb2ljZSBNb2RlILWxx7DWtQ0KLSAgICAgICCy6dGvc3lzY29uZmlnyejWw7XE1rUNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFVbW1fQ2dhdHRRdWVyeV9SZXEsIFRfek1taWFVbW1fVm9pY2VNb2RlUXJ5X1JlcSxUX3pNbWlhVW1tX1N5c2NvbmZpZ1FyeV9SZXEsVF96TW1pYVVtbV9DYXVzZVF1ZXJ5X1JlcSwgVF96TW1pYVVtbV9Dc1ZvaWNlUXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBNTUlBX1VNTV9DZ2F0dFF1ZXJ5Q25mX0V2KCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBQU7i918XXtMyssunRr73hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdGU7IC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9NbWlhVW1tX0NHQVRUU0VUX0RFVEFDSA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTW1pYVVtbV9DR0FUVFNFVF9BVFRBQ0gqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVVtbV9DZ2F0dFF1ZXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBNTUlBX1VNTV9DU1ZPSUNFUVJZX0NORl9FViggVU1NLT5NTUlBICkNCi0gy7XD9zogQ1PT79L0xNzBprLp0a+94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNzVm9pY2VTdXBGbGc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX0NzVm9pY2VRcnlfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotIE1NSUFfVU1NX1phdHRRdWVyeVJlcV9FViggTU1JQS0+VU1NICkNCi0gy7XD9zogsunRr0NTuL3Xxde0zKwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFVbW1fWmF0dFF1ZXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSBNTUlBX1VNTV9aYXR0UXVlcnlDbmZfRXYoIFVNTS0+TU1JQSApDQotIMu1w/c6IENTuL3Xxde0zKyy6dGvveG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgeyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0ZTsgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTW1pYVVtbV9aQVRUU0VUX0RFVEFDSA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9NbWlhVW1tX1pBVFRTRVRfQVRUQUNIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFVbW1fWmF0dFF1ZXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1VNTV9TZWFyY2hQbG1uQ25mX0V2KCBVTU0tPk1NSUEgKQ0KLSDLtcP3OiBVTU221MvRzfjH68fztcTIt8jPDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0Ow0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgZHdDYXVzZTsNCi19VF96TW1pYVVtbV9TZWFyY2hQbG1uX0NuZjsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gz/vPoqO6TU1JQV9VTU1fQ3NnU2VsX1JlcV9Fdg0KLSC5psTco7pDU0fRodTxx+vH88/7z6INCi0gQVTD/MHuOiArWkNTRz08bW9kZT5bLDxyYXQ+LDxDU0dfSUQ+XQ0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ3NnU2VsTW9kZTsgICAgICAvKkNTR9Gh1PHEo8q9o6zT0LnYsdWjrNfUtq+6zcrWtq8z1tYqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIFRfel9Dc2dJZCAgICAgICAgICAgICAgICAgICB0Q3NnSWQ7ICAgICAgICAgICAvKtGh1PG1xENTR9DFz6KjrLnYsdVDU0fKsaOsv8myu8zuKi8NCi0gICAgVF96X1BsbW5BY3QgICAgICAgICAgICAgICAgIHRQbG1uQWN0OyAgICAgICAgIC8qttTTptGh1PG1xENzZ8v5uenK9LXEzfjC57rN0aHU8bXE1sbKvSovDQotfVRfek1taWFVbW1fQ3NnU2VsX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gz/vPoqO6TU1JQV9VTU1fQ3NnU2VsX0NuZl9Fdg0KLSC5psTco7pDU0fRodTxyLfIz8/7z6INCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgLypDU0fRodTxtcS94bn7Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgYkVyckNvZGU7ICAgICAgICAgLyq07c7z1K3S8iovDQotfVRfek1taWFVbW1fQ3NnU2VsX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gTU1JQV9VTU1fQ3VyQ3NnUXJ5X1JlcV9Fdg0KLSC5psTco7qy6dGvtbHHsENTR7XE0aHU8cSjyr2jrNGh1PG1xFBMTU5JRCxSQVQsSE5CDQotIEFUw/zB7jogK1pDU0c/DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhVW1tX0N1ckNzZ1FyeV9SZXE7DQotDQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSBNTUlBX1VNTV9DU0dfQ25mX0V2DQotILmmxNyjukNTR7Lp0a+94bn7DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDc2dTZWxNb2RlOyAgICAgLyog0aHU8cSjyr0st9bOqrnYsdWjrNfUtq+6zcrWtq8z1tYgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICAgICAgDQotICAgIFRfel9Dc2dJbmZvICAgICAgICAgICAgICAgICB0Q3NnSW5mbzsgICAgICAgIC8qIENTR9DFz6IgKi8NCi19VF96TW1pYVVtbV9DdXJDc2dRcnlfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSBNTUlBX1VNTV9Dc2dMaXN0X1JlcV9Fdg0KLSC5psTco7rB0L7ZQ1NHIGxpc3QNCi0gQVTD/MHuOiArWkNTRz0/DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhVW1tX0NzZ0xpc3RfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSBNTUlBX1VNTV9Dc2dMaXN0X0NuZl9Fdg0KLSC5psTco7pDU0fB0LHtDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDU0e49sr9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgVF96X0NzZ0luZm8gICAgICAgICAgICAgICAgIGF0Q3NnSW5mb0xpc3RbWl9NbWlhVW1tX01heENzZ051bV07ICAvKiBDU0fB0LHtICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlN0YXRlW1pfTW1pYVVtbV9NYXhDc2dOdW1dOyAgICAgICAgLyogw7+49kNTRyBJbmZvyse38dTaQWxsb3dlZCBDU0cgbGlzdNbQICovDQotfVRfek1taWFVbW1fQ3NnTGlzdF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0Vwc01vZGVTZXRSZXFfRXYNCi0guabE3KO6TU1JQc2o1qpVTU3J6NbDQ0VNT0Syzsr9DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZTsgICAgLyorQ0VNT0RFyejWw9a1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NbWlhVW1tX0NFTU9ERV9QU01PREUgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NbWlhVW1tX0NFTU9ERV9NT0RFMSAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NbWlhVW1tX0NFTU9ERV9NT0RFMiAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFVbW1fRXBzTW9kZVNldF9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0Vwc01vZGVTZXRDbmZfRXYNCi0guabE3KO6VU1NzajWqk1NSUHJ6NbDQ0VNT0Syzsr9tcS94bn7DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmx0OyAvKlpQU19TVUNDLFpQU19GQUlMKi8gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOw0KLX1UX3pNbWlhVW1tX0Vwc01vZGVTZXRfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDP+8+io7pNTUlBX1VNTV9FcHNNb2RlUXJ5UmVxX0V2DQotILmmxNyjuk1NSUHP8lVNTcfrx/NOVtbQyejWw7XEQ0VNT0Syzsr9DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmdbMl07DQotfVRfek1taWFVbW1fRXBzTW9kZVFyeV9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0Vwc01vZGVRcnlDbmZfRXYNCi0guabE3KO6VU1Nz/JNTUlBu9i4tE5W1tDJ6NbDtcRDRU1PRLLOyv0NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgeyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RlOyAgICAvKitDRU1PREU/1tC1xMno1sPWtSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NbWlhVW1tX0NFTU9ERV9QU01PREUgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01taWFVbW1fQ0VNT0RFX01PREUxICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01taWFVbW1fQ0VNT0RFX01PREUyICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX0Vwc01vZGVRcnlfQ25mOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDP+8+io7pNTUlBX1VNTV9TZXRMdGVBY3RfUmVxX0V2DQotILmmxNyjusno1sNMVEW908jrvLzK9Q0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTHRlQWN0OyAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRF1qez1rXEvdPI67y8yvUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX01taWFVbW1fTFRFX1RERF9Pbmx5IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX01taWFVbW1fTFRFX0ZERF9Pbmx5ICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTW1pYVVtbV9MVEVfVEREX1ByZWYgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTW1pYVVtbV9MVEVfRkREX1ByZWYgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVVtbV9TZXRMdGVBY3RfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDP+8+io7pNTUlBX1VNTV9Dc1NydkluZF9Fdg0KLSC5psTco7pVTU3P8k1NSUHJz7GotbHHsNPQQ1Oxu73Qo6zH68fzyse38dDo0qq908z9DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3NDb2RlRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTc0NvZGU7DQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Q0xJOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfek1taWFVbW1fTXRDc1Nydl9JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0NzU3J2Q25mX0V2DQotILmmxNyjuk1NSUG72Li0VU1Nyse38dDo0qq908jrsbu90A0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJzdDsgICAgICAvKlpfVkFMSUQgLSC908rcTVTStc7xOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9JTlZBTElEIC0gvty++E1UINK1zvEqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICAgICAgICAgICAgICAgICAgICAgICAgDQotfVRfek1taWFVbW1fTXRDc1Nydl9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX0ltc1JlZ2lzdGVyU3RhdGVfRXYNCi0guabE3KO6TU1JQc2o1qpVTU0gSU1TINeisuHXtMysDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSU1TUmVnU3RhdGU7IC8qWl9NbWlhVW1tX0lNU19SRUdJU1RFUkVEOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX01taWFVbW1fSU1TX0RFUkVHSVNURVJFRCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICAgICAgICAgICAgICAgICAgICANCi19VF96TW1pYVVtbV9JbXNSZWdpc3RlclN0YXRlX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gz/vPoqO6TU1JQV9VTU1fVk9JQ0VfTU9ERV9TRVRfUkVRX0VWDQotICAgICAgICAgICAgICAgICBNTUlBX1VNTV9WT0lDRV9NT0RFX1FVRVJZX0NORl9FVg0KLSC5psTco7pNTUlBzajWqlVNTSBWb2ljZSBNb2RltcTJ6NbD1rUNCi0gICAgICAgICAgICAgICAgIFVNTbe1u9i1scewVm9pY2UgTW9kZbXEyrW8yta1DQoty7XD9yA6OiAgICtDVk1PRNPJVU1NtOa0oqOs08O7p8Xk1sPWtU1NSUG0q7j4VU1NDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRHN0SW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWb2ljZU1vZGU7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBVU1NX1ZPSUNFX01PREVfQ1NfT05MWSAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBVU1NX1ZPSUNFX01PREVfVk9JUF9PTkxZICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBVU1NX1ZPSUNFX01PREVfQ1NfUFJFRiAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBVU1NX1ZPSUNFX01PREVfVk9JUF9QUkVGICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX1ZvaWNlTW9kZVNldF9SZXEsIFRfek1taWFVbW1fVm9pY2VNb2RlUXJ5X0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gz/vPoqO6TU1JQV9VTU1fU01TT1ZFUklQTkVUX1NFVFJFUV9FVg0KLSC5psTco7rJ6NbDU01Tyse38dans9ZJUG5ldHdvcmu0q8rktcTQxc+iDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU21zT3ZlcklwTmV0U3VwcDsgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9WQUxJRDogse3KvlNNU9ans9ZJUG5ldHdvcmu0q8rkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfSU5WQUxJRDogse3KvlNNU7K71qez1klQbmV0d29ya7SryuQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi19VF96UFNfTW1pYVVtbV9TbXNPdmVySXBOZXRfU2V0X1JlcSwNCi1UX3pNbWlhVW1tX1Ntc092ZXJJcE5ldF9TZXRfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDP+8+io7pNTUlBX1VNTV9OT1RJRllfUFNfU1RBVEVfRVYNCi0guabE3KO6tuDEo8urtP3NqNaqtbHHsLT9u/qy4FBT17TMrNDFz6INCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgYlBzU3RhdGU7ICAgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBVU1NX1BTX1NUQVRFX05VTEwgzt7Qp9a1DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVVNTV9QU19TVEFURV9BVkFJTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFVTU1fUFNfU1RBVEVfTk9UX0FWQUlMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICBiU3RhY2tJZDsgICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwOiDQrdLp1bsxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTog0K3S6dW7Mg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX1UX3pNbWlhVW1tX05vdGlmeVBzU3RhdGU7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgIGJMdGVOdW07ICAvLyBMVEXB2sf4tcS49sr9DQotICAgIEJZVEUgICAgYlRkTnVtOyAgIC8vIFREwdrH+LXEuPbK/Q0KLSAgICBXT1JEICAgIHdFYXJmY25bWl9NQVhfU1RPUkVEX0VGUlFFX05VTV07IC8vTFRFwdrH+A0KLSAgICBXT1JEICAgIHdVYXJmY25bWl9NQVhfU1RPUkVEX0ZSUUVfTlVNXTsgIC8vVETB2sf4DQotfVRfek1taWFVbW1fRHVhbFBzVExOQ2VsbDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1VNTV9TVUJNT0RFX0lORF9FVg0KLSDLtcP3o7rW97avyc+xqLWxx7BIU1BBxNzBpg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgYkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qtbHHsNbGyr2jrNaxvdPIoXBzQ29tLmijrFpfVERfQUNUtcgqLw0KLSAgICBCWVRFICAgICAgICAgYlN1Yk1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qtbHHsNChx/jE3MGmo6zWsb3TyKFwc0NvbS5oo6xaX1NVQk1PREVfR1NNtcgqLw0KLSAgICBCWVRFICAgICAgICAgYlBhZGRpbmdbMl07DQotfVRfek1taWFVbW1fU3ViTW9kZV9JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotIM/7z6Kjuk1NSUFfVU1NX1NSVkNDX0lORF9FVg0KLSC5psTco7pVTU3P8kFUScnPsahTUlZDQ7XEveG5+yANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXZlbnQ7LypaX01NSUFVTU1fU1JWQ0NfU1RBUlQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX01NSUFVTU1fU1JWQ0NfU1VDQw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTU1JQVVNTV9TUlZDQ19GQUlMKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFVbW1fU3J2Y2NfSW5kOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLdSt0+86IE1NSUFfVU1NX1BTX0NPTlRFWFRfUkVRX0VWDQotuabE3DogQVRJu/HIocSz0ru49rT9u/qy4LXEUFPT8k1NsuPJz8/CzsTQxc+iDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhVW1tX1BzQ29udGV4dF9SZXE7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQot1K3T7zogTU1JQV9VTU1fUFNfQ09OVEVYVF9DTkZfRVYNCi25psTcOlVNTbe1u9i1scewUFPT8snPz8LOxNDFz6INCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICBiUHNSZWdTdGF0ZTsvKlpfVkFMSUTS0deisuGjrFpfSU5WQUxJRM6016Ky4SovDQotICAgIEJZVEUgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX1BzQ29udGV4dF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQot1K3T7zpNTUlBX1VNTV9QU19DT05URVhUX0lORF9FVg0KLbmmxNw6VU1NzajWqsHt0ru49rT9u/qy4E1NsuPJz8/CzsTQxc+iDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgYlBzUmVnU3RhdGU7LypaX1ZBTElE0tHXorLho6xaX0lOVkFMSUTOtNeisuEqLw0KLSAgICBCWVRFICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVVtbV9Qc0NvbnRleHRfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvo7pNTUlBX1VNTV9DQVVTRV9RVUVSWV9DTkZfRVYoQ0MtPk1NSUEpDQoty7XD9zogUFPT8sqnsNzUrdLysunRrw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBzQ2F1c2VGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDc0NhdXNlRmc7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd1BzQ2F1c2U7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NzQ2F1c2U7ICAgIC8q1+69/NK7tM64vdfFu/LIpbi918XKp7Dc1K3S8iC78rj80MLKp7DczNjK4tSt0vLKp7DcKi8NCi19VF96TW1pYVVtbV9DYXVzZVF1ZXJ5X0NuZjsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgYk51bTsNCi0gICAgQllURSBiUGFkZGluZzsNCi0gICAgVF96X1BsbW5JZCBhYk9wZXJhdGVQbG1uW1pfTUFYX09QRVJBVEVfUExNTk5VTV07DQotfVRfek1taWFVbW1fT3BlclBsbW47DQotDQotLypNTUlBX1VNTV9FQ0FMTFNQVF9RVUVSWV9SRVFfRVYsIE1NSUFfVU1NX0VDQUxMT05MWV9RVUVSWV9SRVFfRVYqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96TW1pYVVtbV9lQ2FsbFNwdF9RdWVyeVJlcSwgVF96TW1pYVVtbV9lQ2FsbE9ubHlfUXVlcnlSZXE7DQotDQotLypNTUlBX1VNTV9FQ0FMTFNQVF9RVUVSWV9DTkZfRVYqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICBCWVRFICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgQllURSAgICAgICAgICAgIGJlQ2FsbE92ZXJJbXM7DQotICAgQllURSAgICAgICAgICAgIGJVaWNjU3B0ZUNhbGw7DQotfVRfek1taWFVbW1fZUNhbGxTcHRfUXVlcnlDbmY7DQotDQotLypNTUlBX1VNTV9FQ0FMTE9OTFlfUVVFUllfQ05GX0VWKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgQllURSAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICBiZUNhbGxPbmx5OyAvKlpfVkFMSUQsIFpfSU5WQUxJRCovDQotICAgQllURSAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhVW1tX2VDYWxsT25seV9RdWVyeUNuZjsNCi0NCi0vKk1NSUFfVU1NX1QxMERFUkVHX0lORF9FViovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgIEJZVEUgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgQllURSAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhVW1tX1QxMERlcmVnX0luZDsNCi0NCi0NCi0vKlBEULXY1rcqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUGRwVHlwZTsgIC8qIFBEUMDg0M2jrMih1rXI58/CDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QUFANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0lQdjQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0lQdjYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0lQVjRWNg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiSVB2NEFkZHJbWl9NTUlBU01fSVBWNF9BRERSX01BWF9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiSVB2NkFkZHJbWl9NTUlBU01fSVBWNl9BRERSX01BWF9MRU5dOw0KLX1UX3pNbWlhU21fUGRwQWRkcjsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfek1taWFTbV9QZHBBZGRyICAgdFBkcEFkZHI7DQotfVRfek1taWFTbV9DaWRQZHBBZGRyOw0KLQ0KLS8qIFBDT8/gudjQxc+iICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBXT1JEICAgICAgICAgICAgICAgIHdJZDsgICAgICAgICAgICAvKlByb3RvY29sSWQgb3IgQ29udGFpbmVySWQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJCdWZbWl9NTUlBU01fUENPX0lURU1fVkFMX01BWF9MRU5dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypQcm90b2NvbElkIENvbnRlbnRzIG9yIENvbnRhaW5lcklkIGNvbnRlbnRzKi8NCi19VF96TW1pYVNtX0NvbnRhaW5lcjsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlByb3ROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkFkZFBhcmFOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pNbWlhU21fQ29udGFpbmVyIGF0UHJvdExpc3RbWl9NTUlBU01fUENPX1BST1RfSVRFTV9NQVhfTlVNXTsNCi0gICAgVF96TW1pYVNtX0NvbnRhaW5lciBhdEFkZFBhcmFMaXN0W1pfTU1JQVNNX1BDT19QQVJBX0lURU1fTUFYX05VTV07DQotfVRfek1taWFTbV9QY29JbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96TW1pYVNtX1Bjb0luZm8gICAqcHRQY287DQotfVRfek1taWFTbV9DaWRQY29JbmZvOw0KLQ0KLS8qILyku+6y2df3veG5+yAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJIYW5kbGVSZXN1bHQ7ICAgICAgLyogWl9TVUNDL1pfRkFJTCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDYXVzZTsgICAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QRFBfQUNUX0NBVVNFX0lQVjRfT05MWV9BTExPV0VEICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0FDVF9DQVVTRV9JUFY2X09OTFlfQUxMT1dFRCAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX1BEUF9BQ1RfQ0FVU0VfU0lOR0xFX0FERFJfT05MWV9BTExPV0VEICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdSZWFzb247DQotICAgIFRfek1taWFTbV9QZHBBZGRyICAgdFBkcEFkZHI7DQotfVRfek1taWFTbV9QZHBBY3RSZXMsVF96TW1pYVNtX0lwUGRwQWN0X0NuZjsNCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86IE1NSUFfU01fUERQX1NUQVRVU19RVUVSWV9SRVFfRVYsIE1NSUFfU01fUERQX0NBVVNFX1FVRVJZX1JFUV9FVg0KLSAgICAgICAgTU1JQV9TTV9BQk9SVF9SRVFfRVYsIE1NSUFfU01fQ09OTkVDVF9JTkRfRVYsIE1NSUFfU01fTk9fQ0FSUklFUl9DTkZfRVYNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFTbV9RdWVyeVBkcFN0YXR1c19SZXEsVF96TW1pYVNtX1F1ZXJ5UGRwQ2F1c2VfUmVxLA0KLSBUX3pNbWlhU21fQWJvcnRfUmVxLFRfek1taWFFc21fUXVlcnlQZHBDYXVzZV9SZXEsDQotIFRfek1taWFTbV9Db25uZWN0X0luZCxUX3pNbWlhU21fTm9DYXJyaWVyX0NuZixUX3pNbWlhU21fQ3BzYlF1ZXJ5X1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86IE1NSUFfU01fQ0xPU0VfQ0hOTF9JTkRfRVYsIE1NSUFfU01fR0VUX1BDT19JTkRfRVYNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fQ2xvc2VDaF9JbmQsVF96TW1pYVNtX0dldFBjb19JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOiBNTUlBX1NNX05FR19RT1NfUVVFUllfUkVRX0VWLCBNTUlBX1NNX05FR19FUU9TX1FVRVJZX1JFUV9FViwgDQotICAgICAgICBNTUlBX1NNX1BEUF9BRERSX1FVRVJZX1JFUV9FViwgTU1JQV9TTV9QRFBfTU9ESUZZX1JFUV9FViwNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiQ2lkW1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYVNtX1F1ZXJ5TmVnUW9zX1JlcSxUX3pNbWlhU21fUXVlcnlOZWdFUW9zX1JlcSwNCi0gVF96TW1pYVNtX1F1ZXJ5UGRwQWRkcl9SZXEsVF96TW1pYVNtX1BkcE1vZF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9QRFBfQUNUSVZBVEVfUkVRX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiBNTyBQRFDJz8/CzsS8pLvuDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJBdFR5cGU7ICAgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrZBVMP8we4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiArQ0dBQ1Q6ICBaX01NSUFTTV9BVENNRF9DR0FDVCAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogK1pHQUNUOiAgWl9NTUlBU01fQVRDTURfWkdBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkNpZFtaX01NSUFTTV9NQVhfQ0lEX05VTV07DQotfSBUX3pNbWlhU21fUGRwQWN0X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX1BEUF9ERUFDVElWQVRFX1JFUV9FVihNTUlBLT5TTSkNCi0gy7XD9zogTU8gUERQyc/Pws7EyKW8pLvux+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQXRUeXBlOy8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrZBVMP8we4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiArQ0dBQ1Q6ICBaX01NSUFTTV9BVENNRF9DR0FDVCAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogK1pHQUNUOiAgWl9NTUlBU01fQVRDTURfWkdBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiSXNEaXNjb25uZWN0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fUGRwRGVhY3RfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fTkVHX1FPU19RVUVSWV9SRVFfRVYoTU1JQS0+U00pDQotIMu1w/c6INCtycy1xDJHIFFvU7Lp0a8NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qILz7VF96TW1pYVNtX1F1ZXJ5TmVnUW9zX1JlcSAqLw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fTkVHX1FPU19RVUVSWV9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6INCtycy1xDJHUW9TsunRr7e1u9gNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUHJlY2VkZW5jZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVsYXk7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlJlbGlhYmlsaXR5Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQZWFrOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJNZWFuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96TW1pYVNtX1FvczsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfek1taWFTbV9Rb3MgICAgICAgdFFvUzsNCi19VF96TW1pYVNtX0NpZFFvczsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBUX3pNbWlhU21fQ2lkUW9zICAgIGF0TmVnUW9zW1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYVNtX1F1ZXJ5TmVnUW9zX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX05FR19FUU9TX1FVRVJZX1JFUV9FVihNTUlBLT5TTSkNCi0gy7XD9zog0K3JzLXEM0cgUW9TsunRrw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyogvPtUX3pNbWlhU21fUXVlcnlOZWdFUW9zX1JlcSAqLw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fTkVHX0VRT1NfUVVFUllfQ05GX0VWKFNNLT5NTUlBKQ0KLSDLtcP3OiDQrcnMtcQzR1FvU7Lp0a+3tbvYDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlRyYWZmQ2xhc3M7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRsdk9yZGVyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEbHZFcnJTZHU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlRyYWZmUHJpOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiU2R1RXJyUmF0aW9bMl07ICAgLyogYWJTZHVFcnJSYXRpb1swXTptLCBhYlNkdUVyclJhdGlvWzFdOmUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDI5zUqMTAtM7Htyr7OqjogYWJTZHVFcnJSYXRpb1swXaO9NSxhYlNkdUVyclJhdGlvWzFdo70zICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJSZXNCZXJbMl07ICAgLyogYWJSZXNpZHVhbEJlclswXTptLCBhYlJlc2lkdWFsQmVyWzFdOmUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDI5zUqMTAtM7Htyr7OqjogYWJSZXNpZHVhbEJlclswXaO9NSxhYlJlc2lkdWFsQmVyWzFdo70zICovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdNYXhSYXRlVWw7ICAgICAvKiC1pc67zqprYnBzICovDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdNYXhSYXRlRGw7ICAgICAvKiC1pc67zqprYnBzICovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdHdWFyUmF0ZVVsOyAgICAvKiC1pc67zqprYnBzICovDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdHdWFyUmF0ZURsOyAgICAvKiC1pc67zqprYnBzICovDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgd01heFNkdVNpemU7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgd1RyYW5zRGVsYXk7ICAgIC8qILWlzrvOqm1zICovDQotfVRfek1taWFTbV9FUW9zOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96TW1pYVNtX0VRb3MgICAgICB0RVFvczsNCi19VF96TW1pYVNtX0NpZEVRb3M7DQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgVF96TW1pYVNtX0NpZEVRb3MgICBhdE5lZ0VRb3NbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fUXVlcnlOZWdFUW9zX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0FDVElWQVRFRF9DSURfUVVFUllfUkVRX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiCy6dGv0tG+rbyku+61xFBEUMnPz8LOxLbU06a1xGNpZA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNtZFR5cGU7IC8qILSlt6Ky6dGvtcRBVMP8we7A4NDNDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE1NSUEvU02yorK7udjQxCzNuLSrvLS/yQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDTyUFUSTK3osvNyrHM7tC0LL3TytXKsbSmwO0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ01EX0NHQ01PRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DTURfWlFORUcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ01EX0NHRVFORUcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ01EX0NHQ09OVFJEUA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DTURfQ0dTQ09OVFJEUCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ01EX0NHVEZUUkRQICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NNRF9DR0VRT1NSRFAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYVNtX1F1ZXJ5QWN0Q2lkX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0FDVENJRF9RVUVSWV9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6ILe1u9jS0b6tvKS77rXEUERQyc/Pws7EttTTprXEY2lkDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ21kVHlwZTsgLyogss68+1Rfek1taWFTbV9BY3RpdmVDaWRfUmVx1tBiQ21kVHlwZSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fUXVlcnlBY3RDaWRfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fUERQX1NUQVRVU19RVUVSWV9SRVFfRVYoTU1JQS0+U00pDQotIMu1w/c6ILLp0a/L+dPQ0tG2qNLltcRQRFDJz8/CzsS1xNe0zKwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qILz7VF96TW1pYVNtX1F1ZXJ5UGRwU3RhdHVzX1JlcSAqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fUERQU1RBVFVTX1FVRVJZX0NORl9FVihTTS0+TU1JQSkNCi0gy7XD9zogt7W72Mv509DS0bao0uW1xFBEUMnPz8LOxLXE17TMrA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkFjdENpZE51bTsgICAgICAgICAvKiDS0byku+5jaWS1xMr9xL8gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiSW5hY3RDaWROdW07ICAgICAgIC8qIM60vKS77mNpZLXEyv3EvyAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiQWN0Q2lkW1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qINLRvKS77mNpZMHQse0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkluYWN0Q2lkW1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIM60vKS77mNpZMHQse0gKi8NCi19VF96TW1pYVNtX1F1ZXJ5UGRwU3RhdHVzX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX1BEUF9BRERSX1FVRVJZX1JFUV9FVihNTUlBLT5TTSkNCi0gy7XD9zogsunRr1BEULXY1rcovrLMrLXY1re78ravzKy12Na3KQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyogvPtUX3pNbWlhU21fUXVlcnlQZHBBZGRyX1JlcSAqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fUERQQUREUl9RVUVSWV9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6ILe1u9iy6dGvUERQtdjWtyi+ssystdjWt7vytq/MrLXY1rcpDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICBiQ2lkTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgVF96TW1pYVNtX0NpZFBkcEFkZHIgYXRQZHBBZGRyW1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYVNtX1F1ZXJ5UGRwQWRkcl9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9QRFBfQ0FVU0VfUVVFUllfUkVRX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiCy6dGv1+69/NK7tM68pLvuyqew3NSt0vK6zcilvKS77tSt0vINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qILz7VF96TW1pYVNtX1F1ZXJ5UGRwQ2F1c2VfUmVxICovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9QRFBDQVVTRV9RVUVSWV9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6ILe1u9jX7r380ru0zryku+7Kp7Dc1K3S8rrNyKW8pLvu1K3S8g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNhdXNlRmc7Ly8wLWR3Q2F1c2Wyu7Tm1NosMS1kd0NhdXNltObU2g0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJCa09mZlRpbWVGZzsvLzAtZHdCa09mZlRpbWWyu7Tm1NosMS1kd0JrT2ZmVGltZbTm1NoNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICBkd0NhdXNlOyAgLyrX7r380ru0zlBEULyku+7Kp7Dc1K3S8rvyyKW77tSt0vIqLw0KLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3QmtPZmZUaW1lOy8vcw0KLX1UX3pNbWlhU21fUXVlcnlQZHBDYXVzZV9DbmYsVF96TW1pYUVzbV9RdWVyeVBkcENhdXNlX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6IE1PIFBEUMnPz8LOxLyku+6horb+tM68pLvutcSy2df3veG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlJlc3VsdDsgIC8qINa00NDX3L3hufujrMih1rVaX1NVQ0MvWl9GQUlMICovICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkF0VHlwZTsvKrHqyrZBVMP8we4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtDR0FDVDogIFpfTU1JQVNNX0FUQ01EX0NHQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArWkdBQ1Q6ICBaX01NSUFTTV9BVENNRF9aR0FDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYmFkZGluZ1szXTsNCi0gICAgVF96TW1pYVNtX1BkcEFjdFJlcyBhdFJlc3VsdFtaX01NSUFTTV9NQVhfQ0lEX05VTV07DQotfVRfek1taWFTbV9QZHBBY3RfQ25mOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fUERQX0RFQUNUSVZBVEVfQ05GX0VWKFNNLT5NTUlBKQ0KLSDLtcP3OiBNTyBQRFDJz8/CzsTIpbyku+694bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUmVzdWx0OyAgLyog1rTQ0NfcveG5+6OsyKHWtVpfU1VDQy9aX0ZBSUwgKi8gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQXRUeXBlOy8qserKtkFUw/zB7g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK0NHQUNUOiAgWl9NTUlBU01fQVRDTURfQ0dBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtaR0FDVDogIFpfTU1JQVNNX0FUQ01EX1pHQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJJc0Rpc2Nvbm5lY3Q7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJhZGRpbmdbMl07DQotICAgIFRfek1taWFTbV9QZHBBY3RSZXMgYXRSZXN1bHRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fUGRwRGVhY3RfQ25mOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiSGFuZGxlUmVzdWx0Oy8qIFpfU1VDQy9aX0ZBSUwgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3UmVhc29uOw0KLX1UX3pNbWlhU21fTXRBY3RSZXM7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9NVF9BQ1RfQU5TX0NORl9FVihTTS0+QVRJKQ0KLSDLtcP3OiArQ0dBTlPJ6NbDx+vH88/s06bP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUmVzdWx0OyAgIC8qINa00NC94bn7o6zIoda1Wl9TVUNDL1pfRkFJTCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkF0Rmc7ICAgIC8qWl9WQUxJRCxaX0lOVkFMSUTWuMq+yse38dPJQVTD/MHutKW3oiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pNbWlhU21fTXRBY3RSZXMgICAgICBhdFJlc3VsdFtaX01NSUFTTV9NQVhfQ0lEX05VTV07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFpfTU1JQVNNX01UX0FDVF9SRUrH6b/2uvbC1LjDY2lkwdCx7SAqLw0KLX1UX3pNbWlhU21fTXRBY3RBbnNfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fUERQX01PRElGWV9SRVFfRVYoTU1JQS0+U00pDQotIMu1w/c6IE1PIFBEUMnPz8LOxNDeuMTH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKiC8+1Rfek1taWFTbV9QZHBNb2RfUmVxICovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9QRFBfTU9ESUZZX0NORl9FVihTTS0+TU1JQSkNCi0gy7XD9zogTU8gUERQyc/Pws7E0N64xLLZ1/e94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiSGFuZGxlUmVzdWx0OyAgICAgIC8qIFpfU1VDQy9aX0ZBSUwgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3UmVhc29uOw0KLX1UX3pNbWlhU21fUGRwTW9kUmVzOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAvKiDWtNDQ19y94bn7o6zIoda1Wl9TVUNDL1pfRkFJTCAqLyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkTnVtOw0KLQ0KLSAgICBUX3pNbWlhU21fUGRwTW9kUmVzIGF0UmVzdWx0W1pfTU1JQVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYVNtX1BkcE1vZF9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9BQk9SVF9SRVFfRVYoTU1JQS0+U00pDQotIMu1w/c6IMihz/u1scew1f3U2r340NC1xFBEUMnPz8LOxLyku+6y2df3o6y1pc/yz/vPoqOszt63tbvYDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKiC8+1Rfek1taWFTbV9BYm9ydF9SZXEgKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX1BEUF9BQ1RJVkFURV9JTkRfRVYoU00tPk1NSUEpDQotIMu1w/c6IE1UIFBEUMnPz8LOxLyku+7H68fztcTJz7Go1rjKvg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0NCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICB0UGRwQWRkcjsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkFwbltaX01NSUFTTV9BUE5fTUFYX0xFTl07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlszXTsNCi19VF96TW1pYVNtX1BkcEFjdF9JbmQ7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9DSURfREVBQ1RfSU5EX0VWKFNNLT5NTUlBKQ0KLSDLtcP3OiAgUERQyc/Pws7EyKW8pLvuyc+xqNa4yr4szqrP+sG/zbO8xsCpDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQXRUeXBlOy8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrZBVMP8we4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiArQ0dBQ1Q6ICBaX01NSUFTTV9BVENNRF9DR0FDVCAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogK1pHQUNUOiAgWl9NTUlBU01fQVRDTURfWkdBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFTbV9DaWREZWFjdF9JbmQ7DQotDQotDQotLyog0ru0zlBEUMnPz8LOxLyku+6hosilvKS77tb3tq/Jz7GoKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlR5cGU7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogserKtsTE0ru49itDR0VW1ve2r8nPsaijrMih1rW3ts6nOiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NHRVZfTUVfUFJJX1BETl9BQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NHRVZfTldfUFJJX1BETl9ERUFDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0dFVl9NRV9QUklfUEROX0RFQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX05XX1BSSV9QRE5fQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOyAgLyogserKttK7tM5QRFDJz8/CzsQgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfSBUX3pNbWlhU21fQ2dldl9QcmlQZG47DQotDQotLyog0N64xFBEUMnPz8LOxNb3tq/Jz7GoKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlR5cGU7IC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq2xMTSu7j2K0NHRVbW97avyc+xqKOsyKHWtbe2zqc6IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX05XX01PRElGWQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX01FX01PRElGWQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOyAgLyogserKttK7tM5QRFDJz8/CzsQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaG5nUmVhc29uOyAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq20N64xLXEttTP88rHyrLDtKOsyKHWtbe2zqc6IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX0NITkdfVEZUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NHRVZfQ0hOR19RT1MNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0dFVl9DSE5HX1RGVF9BTkRfUU9TDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJFdmVudFR5cGU7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq2uMMrQ0dFVtb3tq/Jz7Govfa99srHyc+xqNK7uPbQxc+io6y7ucrH0OjSqk1Fz/LN+LLg09DSu7j2u9jTpqOsyKHWtbe2zqc6IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX0VWRU5UX1RZUEVfSU5GTw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX0VWRU5UX1RZUEVfQUNLUkVRDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX0gVF96TW1pYVNtX0NnZXZfTW9kaWZ5UGRuOw0KLQ0KLS8qILb+tM5QRFDJz8/CzsS8pLvuoaLIpbyku+7W97avyc+xqCovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJUeXBlOyAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrbExNK7uPYrQ0dFVtb3tq/Jz7Goo6zIoda1t7bOpzogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX05XX1NFQ19QRE5fQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX01FX1NFQ19QRE5fQUNUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX05XX1NFQ19QRE5fREVBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NHRVZfTUVfU0VDX1BETl9ERUFDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlByaUNpZDsgIC8qILHqyrbSu7TOUERQyc/Pws7EKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOyAgLyogserKtrb+tM5QRFDJz8/CzsQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJFdmVudFR5cGU7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq2uMMrQ0dFVtb3tq/Jz7Govfa99srHyc+xqNK7uPbQxc+io6y7ucrH0OjSqk1Fz/LN+LLg09DSu7j2u9jTpqOsyKHWtbe2zqc6IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX0VWRU5UX1RZUEVfSU5GTw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX0VWRU5UX1RZUEVfQUNLUkVRDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX0gVF96TW1pYVNtX0NnZXZfU2VjUGRuOw0KLQ0KLS8qIFI1sOaxvrXEK0NHRVbLxLj21ve2r8nPsagqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgYlR5cGU7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrbExNK7uPYrQ0dFVtb3tq/Jz7Goo6zIoda1t7bOpzogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0dFVl9SNV9WRVJfTldfREVBQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX1I1X1ZFUl9NRV9ERUFDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NHRVZfUjVfVkVSX01UX0FDVF9SRUoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX1I1X1ZFUl9OV19SRUFDVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfek1taWFTbV9DaWRQZHBBZGRyIHRQZHBBZGRyOyAgLyogY2lkoaJwZHDA4NDNus1wZHC12Na3Ki8NCi19IFRfek1taWFTbV9DZ2V2X1I1VmVyOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fQ0dFVl9JTkRfRVYoU00tPk1NSUEpDQotIMu1w/c6IFBEUM/gudjKwrz+yc+xqA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDZ2V2VHlwZTsgIC8qIMrCvP7A4NDNo6y6zUNHRVbP4LbUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0dFVl9UWVBFX1BSSV9QRE5fSU5EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0dFVl9UWVBFX01PRElGWV9JTkQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX1RZUEVfU0VDX1BETl9JTkQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9DR0VWX1RZUEVfUjVfVkVSX0lORA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICB1bmlvbg0KLSAgICB7DQotICAgICAgICBUX3pNbWlhU21fQ2dldl9QcmlQZG4gICAgdFByaVBkbkluZDsgIC8qINK7tM5QRFDJz8/CzsS8pLvuoaLIpbyku+7W97avyc+xqCovDQotICAgICAgICBUX3pNbWlhU21fQ2dldl9Nb2RpZnlQZG4gdE1vZGlmeUluZDsgIC8qINDeuMRQRFDJz8/CzsTW97avyc+xqCovDQotICAgICAgICBUX3pNbWlhU21fQ2dldl9TZWNQZG4gICAgdFNlY1BkbkluZDsgIC8qILb+tM5QRFDJz8/CzsS8pLvuoaLIpbyku+7W97avyc+xqCovDQotICAgICAgICBUX3pNbWlhU21fQ2dldl9SNVZlciAgICAgdFI1VmVySW5kOyAgIC8qIFI1sOaxvrXEK0NHRVbLxLj21ve2r8nPsagqLw0KLSAgICB9dTsgDQotfVRfek1taWFTbV9DZ2V2X0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0RBVEFfU1RBVEVfUkVRX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiC9+Mjryv2+3cysx+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYk9ubHlJcEZnOyAvKiDIoda1yOfPwjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX09OTFlfSVAgLS3Wu9XrttRJUMDg0M0oRMP8we4pDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9JUF9QUFAgIC0tSVC6zVBQUMDg0M0oK0NHREFUQSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjaWTB0LHtKi8NCi19VF96TW1pYVNtX0RhdGFTdGF0ZV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9NVF9BQ1RfQU5TX1JFUV9FVihNTUlBLT5TTSkNCi0gy7XD9zogvdPK3Lvyvty++E1UIFBEUMnPz8LOxLyku+7H68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiVHlwZTsgICAgLyogstnX98Dg0M2jrMih1rW908rcu/K+3L74o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fTVRfQUNUX1JFSg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9NVF9BQ1RfQUNDDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlMwVmFsOyAgLyoguMPWtbK7zqowo6zU8rHqyrZTMNPQ0KcgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQXRGZzsgICAgLypaX1ZBTElELFpfSU5WQUxJRNa4yr7Kx7fx08lBVMP8we60pbeiKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBaX01NSUFTTV9NVF9BQ1RfUkVKx+m/9rr2wtS4w2NpZMHQse0gKi8NCi19VF96TW1pYVNtX010QWN0QW5zX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0lQX1BEUF9BQ1RfUkVRX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiBBVEkyzai5/U1NSUHU2lBQUNCtycy917bOo6y4+b7dTkNQIFJlcdbQtcRQRFC12Na30MXPoqOs0qrH81NNyLe2qNGhtqi1xGNpZA0KLSAgICAgICDKx7fxus/KyrKizeqzyVBEULyku+4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICB0UGRwQWRkcjsgICAgICAgICAgIC8qIE5DUCBSZXHW0MzhyKG1xElQtdjWtyAqLw0KLSAgICBUX3pNbWlhU21fUGNvSW5mbyAgIHRQY287ICAgICAgICAgICAgICAgLyogQVRJMszhuam1xNPD09pQRFC8pLvutcRQQ0/Qxc+iICovDQotfVRfek1taWFTbV9JcFBkcEFjdF9SZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9DTE9TRV9DSE5MX0lORF9FVihTTS0+TU1JQSkNCi0gy7XD9zogU03NqLn9TU1JQc2o1qpBVEkyys23xWNpZLbU06a1xM/gudjK/b7dzai1wA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyogvPtUX3pNbWlhU21fQ2xvc2VDaF9JbmQgKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0lETEVfQ0hOTF9RVUVSWV9JTkRfRVYoU00tPk1NSUEpDQotIMu1w/c6IFNNxKO/6c2ouf1NTUlBz/JBVEky0a/OysrHt/HT0L/Vz9C1xM2otcC/ycnPsahSSU5HLytDUklORyixvs/7z6LOqr/Vz/vPoikNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qIM7eICovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9JRExFX0NITkxfUVVFUllfUlNQX0VWKE1NSUEtPlNNKQ0KLSDLtcP3OiBBVEkyzai5/U1NSUHP8lNNt7W72LLp0a+94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlJlc3VsdDsgIC8qIMrHt/HT0L/Vz9DNqLXAveG5+7e1u9ggDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX0NIX0lETEUtLdPQv9XP0M2otcANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fQ0hfQlVTWS0tzt6/1c/Qzai1wA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfek1taWFTbV9RdWVyeUlkbGVDaF9Sc3A7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9HRVRfUENPX0lORF9FVihTTS0+TU1JQSkNCi0guabE3DogU03Eo7/pzai5/U1NSUHP8kFUSTLH68fzu/HIoVBDTw0KLSC21NOmQVTD/MHuOiDO3g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyogvPtUX3pNbWlhU21fR2V0UGNvX0luZCAqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IE1NSUFfU01fR0VUX1BDT19SU1BfRVYoTU1JQS0+U00pDQotILmmxNw6IEFUSTLNqLn9TU1JQc/yU023tbvYUENPDQotILbU06ZBVMP8we46IM7eDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgIGJDaWROdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgVF96TW1pYVNtX0NpZFBjb0luZm8gYXRDaWRQY29bWl9NTUlBU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhU21fR2V0UGNvX1JzcDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBNTUlBX1NNX0NPTU1PTl9DTkZfRVYoU00tPk1NSUEpDQotIMu1w/c6IFNNxKO/6c2ouf1NTUlBzajWqkFUSTLJz7GoveG5+8LrDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiUmVzdWx0OyAgICAgICAgICAgIC8qIMih1rVaX1NVQ0MvWl9GQUlMICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgZHdSZWFzb247ICAgICAgICAgICAvKiC+38zlyqew3NSt0vIgKi8NCi19VF96TW1pYVNtX0NvbW1vbl9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogTU1JQV9TTV9ESVNDT05ORUNUX1JFUV9FVihNTUlBLT5BVEkpDQotIMu1w/c6IEFUSTLNqLn9TU1JQc2o1qpTTaOs0rvCt7KmusXBrL3Tts+/qg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNobmw7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFTbV9EaXNjb25uZWN0X1JlcTsNCi0NCi0vKiC1scewvKS77lBEUMnPz8LOxLXEs9DU2CAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ2lkOyAgLyogserKttK7uPa8pLvutcRQRFDJz8/CzsQgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ3VyckJlYXJlcjsgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1scews9DU2MDg0M06IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX05PX0JFQVJFUg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX0dQUlMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9FR1BSUw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX05PTl9IU1VQQV9VUF9OT05fSFNEUEFfRE9XTg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX0hTVVBBX1VQX05PTl9IU0RQQV9ET1dODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfTk9OX0hTVVBBX1VQX0hTRFBBX0RPV04NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9IU1VQQV9VUF9IU0RQQV9ET1dODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfRVBTDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFTbV9DcHNiUGFyYTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiAoU00tPk1NSUEpDQotIMu1w/c6ILvYuLS1scewvKS77lBEUMnPz8LOxLXEs9DU2LywttTTpmNpZMTayN0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWROdW07ICAvKiCx6sq2tbHHsLyku+61xFBEUMr9xL8qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICANCi0gICAgVF96TW1pYVNtX0Nwc2JQYXJhICBhdFBzQmVhcmVyW1pfTU1JQVNNX01BWF9DSURfTlVNXTsgIC8qILyku+61xFBEUMnPz8LOxMHQse0qLw0KLX0gVF96TW1pYVNtX0Nwc2JRdWVyeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogKFNNLT5NTUlBKQ0KLSDLtcP3OiDW97avyc+xqLPQ1Ni3osn6uMSx5LXEUERQvLS1scews9DU2MDg0M0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWQ7ICAgLyogserKttK7uPa8pLvutcRQRFDJz8/CzsQgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiQ3VyckJlYXJlcjsgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1scews9DU2MDg0M06IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX05PX0JFQVJFUg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX0dQUlMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9FR1BSUw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX05PTl9IU1VQQV9VUF9OT05fSFNEUEFfRE9XTg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fUERQX0NVUlJfQkVBUkVSX0hTVVBBX1VQX05PTl9IU0RQQV9ET1dODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfTk9OX0hTVVBBX1VQX0hTRFBBX0RPV04NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQVNNX1BEUF9DVVJSX0JFQVJFUl9IU1VQQV9VUF9IU0RQQV9ET1dODQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9QRFBfQ1VSUl9CRUFSRVJfRVBTDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi19VF96TW1pYVNtX0Nwc2JfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IFpfTW1pYVNtX0NnY29udHJkcFJlcV9FdihNTUlBLT5TTSkNCi0gy7XD9zogtsHIoc34suC31sXktcTSu7TOUERQyc/Pws7Ez+C52LLOyv0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWRGbGc7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq2YkNpZNPQ0KfQ1DogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfVkFMSUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9JTlZBTElEDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDaWQ7ICAvKiCx6sq2UERQyc/Pws7EKi8NCi19IFRfek1taWFTbV9DZ2NvbnRyZHBfUmVxOyAgIA0KLQ0KLS8qILvYuLTN+LLgt9bF5LXE0ru0zlBEUMnPz8LOxLXEzfi52LXY1rehokROU7f+zvHG97XY1re8sENTQ0a3/s7xxve12Na3Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJJVFMgICAgICAgICAgICAgICAgYlNyY0FkZHJBbmRNYXNrRmxnOjE7ICAvKiCx6sq2YlNyY0FkZHJBbmRTdWJNYXNr09DQp9DUKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICBiR3dBZGRyRmxnOjE7ICAgICAgICAgIC8qILHqyrZiR3dBZGRy09DQp9DUKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICBiRG5zUHJpQWRkckZsZzoxOyAgICAgIC8qILHqyrZiRG5zUHJpQWRkctPQ0KfQ1CovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgYkRuc1NlY0FkZHJGbGc6MTsgICAgICAvKiCx6sq2YkRuc1NlY0FkZHLT0NCn0NQqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgIGJQQ3NjZlByaUFkZHJGbGc6MTsgICAgLyogserKtmJQQ3NjZlByaUFkZHLT0NCn0NQqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgIGJQQ3NjZlNlY0FkZHJGbGc6MTsgICAgLyogserKtmJQQ3NjZlNlY0FkZHLT0NCn0NQqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgIGJQQ3NjZlNlY0FkZHIyRmxnOjE7ICAgLyogserKtmJQQ3NjZlNlY0FkZHIy09DQp9DUKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICBiUENzY2ZTZWNBZGRyM0ZsZzoxOyAgIC8qILHqyrZiUENzY2ZTZWNBZGRyM9PQ0KfQ1CovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICBiSW1jblNpZ25JbmQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJTcmNBZGRyQW5kTWFza1taX01NSUFTTV9NQVhfUERQQUREUl9NQVNLX0xFTl07ICAvKiBJULXY1re6zdfTzfjR2sLrKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkd3QWRkcltaX01NSUFTTV9BRERSX01BWF9MRU5dOyAgIC8qIM34udi12Na3Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkRuc1ByaUFkZHJbWl9NTUlBU01fQUREUl9NQVhfTEVOXTsgIC8qINb3RE5Tt/7O8cb3SVC12Na3Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYkRuc1NlY0FkZHJbWl9NTUlBU01fQUREUl9NQVhfTEVOXTsgIC8qILG4RE5Tt/7O8cb3SVC12Na3Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICBhYlBDc2NmUHJpQWRkcltaX01NSUFTTV9BRERSX01BWF9MRU5dOyAgLyog1vdQLUNTQ0a3/s7xxvdJULXY1rcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUENzY2ZTZWNBZGRyW1pfTU1JQVNNX0FERFJfTUFYX0xFTl07ICAvKiCxuFAtQ1NDRrf+zvHG90lQtdjWtyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQQ3NjZlNlY0FkZHIyW1pfTU1JQVNNX0FERFJfTUFYX0xFTl07ICAvKiCxuFAtQ1NDRrf+zvHG90lQtdjWtzIqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUENzY2ZTZWNBZGRyM1taX01NSUFTTV9BRERSX01BWF9MRU5dOyAgLyogsbhQLUNTQ0a3/s7xxvdJULXY1rczKi8NCi19IFRfek1taWFTbV9DZ2NvbnRyZHBfQWRkckluZm87DQotDQotLyogu9i4tM34suC31sXktcTSu7TOUERQyc/Pws7Ez+C52LLOyv0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgYkNpZDsgIC8qILHqyrZQRFDJz8/CzsQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBiQmVhcmVySWQ7ICAvKiCx6sq20ru49rPQ1NgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBiUGRwVHlwZTsgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogserKtlBETrXY1rfA4NDNo6zIoda1t7bOpzogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBRVNNX0lQVjQgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBRVNNX0lQVjYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFFU01fSVBWNFY2DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFwbltaX01NSUFTTV9BUE5fTUFYX0xFTl07ICAvKiC3w87Kvdq148P7Ki8NCi0gICAgVF96TW1pYVNtX0NnY29udHJkcF9BZGRySW5mbyAgYXROd0VzdElQdjRJbmZvOyAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogzfiy4LfWxeS1xElQdjS12Na3wODQzbXEzfi52LXY1rehog0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBETlO3/s7xxve12Na3vLBDU0NGt/7O8cb3tdjWtw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1sWJQZHBUeXBltcjT2lpfTU1JQVNNX0lQVjS78g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFTTV9JUFY0VjbKsdPQ0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIFRfek1taWFTbV9DZ2NvbnRyZHBfQWRkckluZm8gIGF0TndFc3RJUHY2SW5mbzsgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIM34suC31sXktcRJUHY2tdjWt8Dg0M21xM34udi12Na3oaINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRE5Tt/7O8cb3tdjWt7ywQ1NDRrf+zvHG97XY1rcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogtbFiUGRwVHlwZbXI09paX01NSUFTTV9JUFY2u/INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBU01fSVBWNFY2yrHT0NCnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX0gVF96TW1pYVNtX0NnY29udHJkcF9QYXJhOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IFpfTW1pYVNtX0NnY29udHJkcENuZl9FdihTTS0+TU1JQSkNCi0gy7XD9zogu9i4tM34suC31sXktcTSu7TOUERQyc/Pws7Ez+C52LLOyv0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJDaWROdW07ICAvKiC78cihtcRQRFDJz8/CzsS1xLj2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAvKiDIoda1Wl9TVUNDL1pfRkFJTCAqLw0KLSAgICANCi0gICAgVF96TW1pYVNtX0NnY29udHJkcF9QYXJhICBhdE53RXN0SW5mb1taX01NSUFTTV9NQVhfQ0lEX05VTV07ICAvKiDSu7TOUERQyc/Pws7Ez+C52LLOyv0qLw0KLX0gVF96TW1pYVNtX0NnY29udHJkcF9DbmY7ICAgICAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zogWl9NbWlhU21fQ2dzY29udHJkcFJlcV9FdihNTUlBLT5TTSkNCi0gy7XD9zogtsHIoc34suC31sXktcS2/rTOUERQyc/Pws7Ez+C52LLOyv0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJDaWRGbGc7ICAvKiCx6sq2YkNpZNPQ0KfQ1CAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkNpZDsgIC8qILHqyrZQRFDJz8/CzsQgICAqLw0KLX0gVF96TW1pYVNtX0Nnc2NvbnRyZHBfUmVxOw0KLQ0KLS8qILbByKHN+LLgt9bF5LXEtv60zlBEUMnPz8LOxM/gudiyzsr9Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiUHJpQ2lkOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJCZWFyZXJJZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiSW1jblNpZ25JbmQ7DQotfSBUX3pNbWlhU21fQ2dzY29udHJkcF9QYXJhOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IFpfTW1pYVNtX0Nnc2NvbnRyZHBDbmZfRXYoU00tPk1NSUEpDQotIMu1w/c6ILvYuLTN+LLgt9bF5LXEtv60zlBEUMnPz8LOxM/gudiyzsr9DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiQ2lkTnVtOyAgIC8qILvxyKG1xFBEUMnPz8LOxLXEuPbK/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgLyogyKHWtVpfU1VDQy9aX0ZBSUwgKi8NCi0gICAgDQotICAgIFRfek1taWFTbV9DZ3Njb250cmRwX1BhcmEgdFNlY1BkcFBhcmFbWl9NTUlBU01fTUFYX0NJRF9OVU1dOyAgLyogtv60zlBEUMnPz8LOxM/gudiyzsr9Ki8NCi19IFRfek1taWFTbV9DZ3Njb250cmRwX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBaX01taWFTbV9DZ3RmdHJkcFJlcV9FdihNTUlBLT5TTSkNCi0gy7XD9zogtsHIoc34suC31sXktcRURlTP4LnYss7K/Q0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkNpZEZsZzsgICAvKiCx6sq2YkNpZNPQ0KfQ1CAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiQ2lkOyAgIC8qILHqyrZQRFDJz8/CzsQgICovDQotfSBUX3pNbWlhU21fQ2d0ZnRyZHBfUmVxOw0KLQ0KLS8qIFRGVLLOyv0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiQ2lkOyAgLyogserKtlBEUMnPz8LOxCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYk53RmlsdGVySWQ7ICAvKiDN+LLgt9bF5LXEZmlsdGVyIElEo6zIoda1t7bOpzogMX4xNiAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIFRfekRldl9BdE1lbV9GaWx0ZXJUeXBlICAgdEZpbHRlckRhdGE7ICAvKiDG5Mv7uf3Cy8b30MXPoiovDQotfSBUX3pNbWlhU21fQ2lkRmlsdGVyOw0KLQ0KLS8qILbByKHN+LLgt9bF5LXEVEZUz+C52LLOyv0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiRmlsdGVyTnVtOyAgLyogt9bA4Mb3tcS49sr9Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIA0KLSAgICBUX3pNbWlhU21fQ2lkRmlsdGVyICAgICAgIHROd0Fzc2lnbkZpbHRlcltaX01NSUFTTV9NQVhfRklMVEVSX0lEXTsgIC8qIM34suC31sXktcRmaWx0ZXLG5Mv70MXPoiovDQotfSBUX3pNbWlhU21fQ2d0ZnRyZHBfUGFyYTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOiBaX01taWFTbV9DZ3RmdHJkcENuZl9FdihTTS0+TU1JQSkNCi0gy7XD9zogu9i4tM34suC31sXktcRURlTP4LnYss7K/Q0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkNpZE51bTsgIC8qILvxyKG1xFBEUMnPz8LOxLXEuPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgIC8qIMih1rVaX1NVQ0MvWl9GQUlMICovDQotICAgICAgICAgICANCi0gICAgVF96TW1pYVNtX0NndGZ0cmRwX1BhcmEgICBhdE53QXNzaWduSW5mb1taX01NSUFTTV9NQVhfQ0lEX05VTV07ICAvKiDN+LLgt9bF5LXEVEZUz+C52LLOyv0qLw0KLX0gVF96TW1pYVNtX0NndGZ0cmRwX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86IE1NSUFfU01fTk9USUZJQ0FUSU9OX0lORF9FVg0KLSAgy7XD9zogRVNNzajWqkFUSSBNTUlBX1NNX05PVElGSUNBVElPTl9JTkRfRVbP+8+ise3KvlNSVkNDyqew3KOs0OjH80lNU9Ct0um71ri00rXO8aGjDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiTm90aWZpY2F0aW9uSW5kOyAgICANCi19IFRfek1taWFTbV9Ob3RpZmljYXRpb25fSW5kOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAg1K3T7zogTU1JQV9TTV9DT05URVhUX1JFUV9FVg0KLSAgy7XD9zogQVRJzajWqlNNL0VTTb340NDStc7xsOHHqA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19IFRfek1taWFTbV9Db250ZXh0X1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86IE1NSUFfU01fQ09OVEVYVF9DTkZfRVYvTU1JQV9TTV9DT05URVhUX0lORF9FVg0KLSAgy7XD9zogU00vRVNNu9i4tEFUSbXE0rXO8bDhx6i1xMi3yM/P+8+iDQotICAgICAgICAgICAgICAgICBBVEm4+MHt0ru0/VNNL0VTTbeiy82w4ceo1rjKvg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDb250ZXh0SW5kOyAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFpfTU1JQVNNX0NPTlRFWFRfTlVMTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfTU1JQVNNX0NPTlRFWFRfRVNNX1ZBTElEICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX01NSUFTTV9DT05URVhUX1NNX1ZBTElEKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgUEJZVEUgICAgICAgICAgICAgIHBTbUVzbURhdGE7DQotfSBUX3pNbWlhU21fQ29udGV4dF9DbmYsVF96TW1pYVNtX0NvbnRleHRfSW5kOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJOdW1MZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJNc2lzZG5OdW1bWl9NTUlBU01fTVNJU0ROX0xFTl07DQotfVRfek1taWFTbV9Nc2lzZG5fSW5kOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICBiQ2lkOyAgICAgICAgICAgICAgICAvKsnPz8LOxLG+ye21xGNpZCovDQotICAgIEJZVEUgICAgYlBmTnVtOyAgICAgICAgICAgICAvKlBhY2tldCBGaWx0ZXK1xMr9xL8qLw0KLSAgICBCWVRFICAgIGFiUGFkZGluZ1syXTsNCi0gICAgVF96RGV2X0F0TWVtX0ZpbHRlclR5cGUgICAgYXRGaWx0ZXJbWl9NTUlBRVNNX01BWF9QRl9OVU1dOw0KLX1UX3pNbWlhRXNtX1RmdEluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgYkNpZE51bTsgICAgICAgICAgICAvKsr91+nT0NCns6S2yCovDQotICAgIEJZVEUgICAgYlByaW1DaWQ7ICAgICAgICAgICAvKlBETsGsvdPL+bbU06bErMjPs9DU2MnPz8LOxLXEY2lkKi8NCi0gICAgQllURSAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBCWVRFICAgIGFiQ2lkW1pfTU1JQUVTTV9NQVhfQ0lEX05VTV07IC8quMNQRE7BrL3Tyc/XqNPDyc/Pws7EtcRjaWQqLw0KLX1UX3pNbWlhRXNtX1BkbkNvbkNpZEluZm87DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9FU01fRVBTX0JFQVJFUl9BQ1RfUkVRX0VWKEVTTS0+TU1JQSkNCi0gy7XD9zogRVNNz/JNTUlByc+xqEVQUyBCZWFyZXIgQ29udGV4dLyku+6zybmmo6y21NOm09rP4NOmtcQrQ0dFVrXE1ve2r8q9w/zB7qO7DQotILbU06YyzPXW97avyc+xqGF0w/zB7joNCi1iQmVhcmVyRmxnID09IFpfTU1JQUVTTV9DR0VWX1BETl9DT04NCi0rQ0dFVjogRVBTIFBETiBBQ1QgPHBfY2lkPg0KLWJCZWFyZXJGbGcgPT0gWl9NTUlBRVNNX0NHRVZfREVEX0JFQVJFUg0KLStDR0VWOiBFUFMgREVEIEFDVCA8cF9jaWQ+LCA8Y2lkPg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICBiQmVhcmVyRmxnOyAgICAgLyqx6sq2vKS77snPsai1xMrHt/HOqsSsyM+z0NTYo6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1zqpaX01NSUFFU01fQ0dFVl9QRE5fQ09OttTTptPaysfErMjPs9DU2A0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMih1rXOqlpfTU1JQUVTTV9DR0VWX0RFRF9CRUFSRVK21NOm09rXqNPDs9DU2CovDQotICAgIEJZVEUgICAgYkNpZDsgICAgICAgICAgIC8qY2lkIG9mIHRoZSBFUFMgQmVhcmVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgtbFiQmVhcmVyRmxnID09IFpfTU1JQUVTTV9DR0VWX0RFRF9CRUFSRVLKsdPQ0KcqLw0KLSAgICANCi0gICAgQllURSAgICBiUHJpbUNpZDsgICAgICAgLypjaWQgb2YgUEROIENvbm5lY3Rpb24qLw0KLSAgICBCWVRFICAgIGFiUGFkZGluZ1szXTsNCi19VF96TW1pYUVzbV9FcHNCZWFyZXJBY3RfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfRVNNX0VQU19CRUFSRVJfREVBQ1RfUkVRX0VWKEVTTS0+TU1JQSkNCi0gy7XD9zogRVNNz/JNTUlByc+xqEVQUyBCZWFyZXIgQ29udGV4dLXEyKW8pLvuysK8/qOsttTTptPaz+DTprXEK0NHRVa1xNb3tq/KvcP8we6juw0KLSC21NOmMsz11ve2r8nPsahhdMP8we46DQotYkJlYXJlckZsZyA9PSBaX01NSUFFU01fQ0dFVl9QRE5fQ09ODQotK0NHRVY6IEVQUyBQRE4gREVBQ1QgPHBfY2lkPg0KLWJCZWFyZXJGbGcgPT0gWl9NTUlBRVNNX0NHRVZfREVEX0JFQVJFUg0KLStDR0VWOiBFUFMgREVEIERFQUNUIDxwX2NpZD4sIDxjaWQ+DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICBiRGVzSW5kZXg7ICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICBCWVRFICAgIGJCZWFyZXJGbGc7ICAgICAvKrHqyra8pLvuyc+xqLXEyse38c6qxKzIz7PQ1NijrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMih1rXOqlpfTU1JQUVTTV9DR0VWX1BETl9DT0621NOm09rKx8SsyM+z0NTYDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogyKHWtc6qWl9NTUlBRVNNX0NHRVZfREVEX0JFQVJFUrbU06bT2teo08Oz0NTYKi8NCi0gICAgQllURSAgICBiQ2lkOyAgICAgICAgICAgLypjaWQgb2YgdGhlIEVQUyBCZWFyZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILWxYkJlYXJlckZsZyA9PSBaX01NSUFFU01fQ0dFVl9ERURfQkVBUkVSyrHT0NCnKi8NCi0gICAgDQotICAgIEJZVEUgICAgYlByaW1DaWQ7ICAgICAgIC8qY2lkIG9mIFBETiBDb25uZWN0aW9uKi8NCi0gICAgQllURSAgICBhYlBhZGRpbmdbM107DQotfVRfek1taWFFc21fRXBzQmVhcmVyRGVBY3RfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfRVNNX0VQU19CRUFSRVJfTU9EX1JFUV9FVihFU00tPk1NSUEpDQotIMu1w/c6IEVTTc/yTU1JQcnPsahFUFMgQmVhcmVyIENvbnRleHS1xLj80MLKwrz+o6y21NOm09rP4NOmtcQrQ0dFVrXE1ve2r8q9w/zB7qO7DQotILbU06bW97avyc+xqGF0w/zB7joNCi0rQ0dFVjogRVBTIE1PRElGWSA8Y2lkPiwgPGNoYW5nZV9yZWFzb24+DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgIGJEZXNJbmRleDsgICAgICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICBCWVRFICAgIGJDaWQ7ICAgICAgICAgICAgICAgLypNb0S1xEVQU7PQ1Ni1xENpZCovDQotICAgIEJZVEUgICAgYkNoYW5nZVJlYXNvbjsgICAgICAvKreiyfq4/NDCtcTUrdLyo6zG5Mih1rXOqjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBRVNNX01PRF9SRUFTT05fVEZUX09OTFm1yCovDQotfVRfek1taWFFc21fRXBzQmVhcmVyTW9kX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0++juk1NSUFfRVNNX0VQU19CRUFSRVJfTU9EX1JFUV9FVihNTUlBLT5FU00pDQoty7XD9zogz8K3otK1zvHH68fzo6zKuUVTTbeixvBCZWFyZXIgUmVzb3VyY2UgTW9kaWZpY2F0aW9uwfezzKOsttTTptPaK0NHRUJSTU9Ew/zB7qO7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgLyq/ydGhss7K/bHqvMcqLw0KLSAgICBCSVRTICAgICBiU3BhcmU6NjsNCi0gICAgQklUUyAgICAgYlFjaUZsZzoxOyAgICAgLypBVMrHt/HQr7T4UUNJKi8NCi0gICAgQklUUyAgICAgYlVsRGxHYnJGbGc6MTsgLypBVMrHt/HQr7T4R0JSss7K/SovDQotICAgIC8qsdjRobLOyv0qLw0KLSAgICBCWVRFICAgIGJQcmltQ2lkOyAgICAgICAvKnByaW1hcnkgY2lkKi8NCi0gICAgDQotICAgIEJZVEUgICAgYlRmYWRJZDsgICAgICAgIC8qVEZBRCBJRCovDQotICAgIC8qv8nRobLOyv0qLw0KLSAgICBCWVRFICAgIGJRY2k7ICAgICAgICAgICAvKlFDSSBvZiBFUFMgUW9TKi8NCi0gICAgRFdPUkQgICAgZHdVbEdicjsgICAgICAgICAgIC8qVXBsaW5rIEdCUiBpbiBFUFMgUW9TKi8NCi0gICAgRFdPUkQgICAgZHdEbEdicjsgICAgICAgICAgIC8qRG93bmxpbmsgR0JSIGluIEVQUyBRb1MqLw0KLX1UX3pNbWlhRXNtX0Vwc0JlYXJlck1vZF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvo7pNTUlBX0VTTV9FUFNfQkVBUkVSX01PRF9DTkZfRVYoRVNNLT5NTUlBKQ0KLcu1w/c6ICtDR0VCUk1PRMP8we7WtNDQs8m5pqO7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICBiRGVzSW5kZXg7ICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgYkNpZDsgICAgICAgLypjaWQgb2YgdGhlIEVQUyBCZWFyZXIqLw0KLSAgICBCWVRFICAgIGJQYWRkaW5nOyAgIA0KLX1UX3pNbWlhRXNtX0Vwc0JlYXJlck1vZF9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvo7pNTUlBX0VTTV9FUFNfQkVBUkVSX01PRF9SRUpfRVYoRVNNLT5NTUlBKQ0KLcu1w/c6ICtDR0VCUk1PRMP8we7WtNDQyqew3KO7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICBhYlBhZGRpbmdbMl07DQotICAgIERXT1JEICAgZHdFcnJDb2RlOyAgICAgIC8qstnX97TtzvPC6yovDQotfVRfek1taWFFc21fRXBzQmVhcmVyTW9kX1JlajsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0++juk1NSUFfRVNNX0NHQVRGVF9SRVFfRVYoTU1JQS0+RVNNKQ0KLcu1w/c6ILbU06bT2itDR0FURlTD/MHuo6y2wcih1ri2qMnPz8LOxLXEtbHHsFRGVMno1sOjuw0KLbbU06bW97avyc+xqGF0w/zB7joNCi0rQ0dBVEZUPTxjaWQxPlssPGNpZDI+WyyhrV1dDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICBiQ2lkTnVtOyAgICAgICAgLyrD/MHuy/nWuLaotcRjaWTK/cS/Ki8NCi0gICAgQllURSAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIEJZVEUgICAgYWJDaWRBcnJheVtaX01NSUFFU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhRXNtX0NnYXRmdFJlcTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0++juk1NSUFfRVNNX0NHQVRGVF9DTkZfRVYoRVNNLT5NTUlBKQ0KLcu1w/c6ILbUK0NHQVRGVMP8we61xLe1u9ijrMrks/bWuLaoyc/Pws7Ey/m21NOmtcRURlQNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgYkNpZE51bTsgICAgICAgICAgICAvKmNpZLXEyv3EvyovDQotICAgIEJZVEUgICAgYWJQYWRkaW5nWzFdOw0KLSAgICANCi0gICAgVF96TW1pYUVzbV9UZnRJbmZvICAgICAgIGF0VGZ0SW5mb1taX01NSUFFU01fTUFYX0NJRF9OVU1dOyAgICAgLyq3tbvYtcTJz8/CzsTL+bbU06ZURlTQxc+iKi8NCi19VF96TW1pYUVzbV9DZ2F0ZnRDbmY7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvo7pNTUlBX0VTTV9FQlJfTU9EX1FVRVJZX1JFUV9FVihNTUlBLT5FU00pDQoty7XD9zogttTTptPaK0NHRUJSTU9EtcSy6dGv0++3qKOssunRr7Wxx7C05tTatcRQRE7BrL3T0tS8sLjDUEROway908nPvKS77snPz8LOxLXEY2lko7sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhRXNtX0Vick1vZFF1ZXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0++juk1NSUFfRVNNX0VCUl9NT0RfUVVFUllfQ05GX0VWKEVTTS0+TU1JQSkNCi3LtcP3OiArQ0dFQlJNT0S1xLLp0a/T77eotcS3tbvYo6y3tbvYtbHHsLTm1Nq1xFBETsGsvdPS1LywuMNQRE7BrL3Tyc+8pLvuyc/Pws7EtcRjaWSjuw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgIGJTcmNJbmRleDsgICAgICAgICAgLyrP+8+i1LTL99L9Ki8NCi0gICAgQllURSAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICBiUGRuQ29uTnVtOyAgICAgICAgIC8qYXRQZG5Db25DaWRJbmZvyv3X6bXE09DQp7OktsgqLw0KLSAgICBCWVRFICAgIGJQYWRkaW5nOw0KLSAgICANCi0gICAgVF96TW1pYUVzbV9QZG5Db25DaWRJbmZvIGF0UGRuQ29uQ2lkSW5mb1taX01NSUFFU01fTUFYX0NJRF9OVU1dOw0KLX1UX3pNbWlhRXNtX0Vick1vZFF1ZXJ5X0NuZjsNCi0vKm9ubHkgZm9yIFI3JlI1IC0+ZW5kKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgYkNpZDsgICAgICAgICAgDQotICAgIC8qv8nRobLOyv2x6rzHKi8NCi0gICAgQklUUyAgICBiU3BhcmU6NDsNCi0gICAgQklUUyAgICBiUWNpRmxnOjE7ICAgICAgLyrKx7fxt7W72FFDSSovDQotICAgIEJJVFMgICAgYlVsRGxHYnJGbGc6MTsgIC8qyse38be1u9hHQlKyzsr9Ki8NCi0gICAgQklUUyAgICBiVWxEbE1ickZsZzoxOyAgLyrKx7fxt7W72E1CUrLOyv0qLw0KLSAgICBCSVRTICAgIGJVbERsQW1ickZsZzoxOyAvKsrHt/G3tbvYQU1CUrLOyv0qLw0KLQ0KLSAgICAvKr/J0aGyzsr9Ki8NCi0gICAgQllURSAgICBiUWNpOyAgICAgICAgICAgLypRQ0kgb2YgRVBTIFFvUyovDQotICAgIEJZVEUgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBEV09SRCAgICBkd1VsR2JyOyAgICAgICAgICAgIC8qVXBsaW5rIEdCUiBpbiBFUFMgUW9To6zS1GticHPOqrWlzrsqLw0KLSAgICBEV09SRCAgICBkd0RsR2JyOyAgICAgICAgICAgIC8qRG93bmxpbmsgR0JSIGluIEVQUyBRb1OjrNLUa2Jwc86qtaXOuyovDQotDQotICAgIERXT1JEICAgIGR3VWxNYnI7ICAgICAgICAgICAvKiBVcGxpbmsgTUJSIGluIEVQUyBRb1OjrNLUa2Jwc86qtaXOuyovDQotICAgIERXT1JEICAgIGR3RGxNYnI7ICAgICAgICAgIC8qRG93bmxpbmsgTUJSIGluIEVQUyBRb1OjrNLUa2Jwc86qtaXOuyovDQotDQotICAgIERXT1JEICAgIGR3VWxBbWJyOyAgICAgICAgLypBTUJSIGZvciBVcGxpbmssINLUa2Jwc86qtaXOuyovDQotICAgIERXT1JEICAgIGR3RGxBbWJyOyAgICAgICAgLypBTUJSIGZvciBEb3dubGluayzS1GticHPOqrWlzrsqLw0KLX1UX3pNbWlhRXNtX0Vwc1Fvc0luZm87DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9FU01fTVRfRVBTX0JFQVJFUl9BQ1RfUkVRX0VWKEVTTS0+TU1JQSkNCi0gy7XD9zogyc+xqE1U16jTw7yku+7H68fzx+vH86O7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgIGJTcmNJbmRleDsgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyrP+8+ixL+1xMv30v0qLw0KLSAgICBCWVRFICAgICAgICBhYlBhZGRpbmcyWzJdOw0KLSAgICANCi0gICAgQllURSAgICAgICAgYWJBcG5bWl9NTUlBRVNNX0FQTl9NQVhfTEVOXTsgIC8qQVBOKi8NCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICAgdFBkcEFkZHI7DQotfVRfek1taWFFc21fTXRFcHNCZWFyZXJBY3RfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfRVNNX01UX0VQU19CRUFSRVJfQUNUX0NORl9FVihNTUlBLT5FU00pDQotIMu1w/c6ILbUTVTXqNPDvKS77sfrx/O1xNOmtPDP+8+io7sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgYlNyY0luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICBiRGVzSW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgYk9wZXJhQ29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKta4w/fKx73Tyty78r7cvvhNVMfrx/MqLw0KLSAgICBCWVRFICBiQ2lkTnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQVTD/MHu1tBDaWTK/cS/Ki8NCi0gICAgDQotICAgIEJZVEUgIGFiQ2lkW1pfTU1JQUVTTV9NQVhfQ0lEX05VTV07ICAgICAgIC8qY2lkyv3X6SovDQotfVRfek1taWFFc21fTXRFcHNCZWFyZXJBY3RfUmVxOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T76O6TU1JQV9FU01fRVBTX1FPU19RVUVSWV9SRVFfRVYoTU1JQS0+RVNNKQ0KLcu1w/c6ILbU06bT2itDR0VRT1NSRFDD/MHuo6yy6dGv1ri2qEVQU7PQ1NjJz8/CzsTL+bbU06a1xEVQUyBRb1PJ6NbDo7sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgICAvKs/7z6LUtMv30v0qLw0KLSAgICBCWVRFICAgIGJEZXNJbmRleDsgICAgICAgIC8qz/vPosS/tcTL99L9Ki8NCi0gICAgQllURSAgICBiQ2lkRmxnOyAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQUVTTV9DTURfV0lUSE9VVENJRCCx6sq2w7vT0ENJRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9NTUlBRVNNX0NNRF9XSVRIQ0lEICAgICAgserKttPQQ0lEDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICBiQ2lkOyAgDQotfVRfek1taWFFc21fRXBzUW9zUXVlcnlfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T76O6TU1JQV9FU01fRVBTX1FPU19RVUVSWV9DTkZfRVYoRVNNLT5NTUlBKQ0KLcu1w/c6ICtDR0VRT1NSRFDD/MHutcS3tbvYo6y3tbvY1ri2qEVQU7PQ1NjJz8/CzsTL+bbU06a1xEVQUyBRb1PJ6NbDo7sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgICAgICAgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgYkNpZE51bTsgICAgICAgICAgICAvKsr91+nT0NCns6S2yCovDQotICAgIEJZVEUgICAgYlJlc3VsdDsgICAgICAgICAgICAvKiDIoda1Wl9TVUNDL1pfRkFJTCAqLw0KLSAgICANCi0gICAgVF96TW1pYUVzbV9FcHNRb3NJbmZvICAgICBhdEVwc1Fvc0luZm9bWl9NTUlBRVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYUVzbV9FcHNRb3NRdWVyeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9FU01fRVBTX0FERFJfUVVFUllfQ05GX0VWKEVTTS0+TU1JQSkNCi0gy7XD9zogt7W72LLp0a9QRFC12Na3KL6yzKy12Na3u/K2r8ystdjWtykNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgIGJDaWROdW07ICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgVF96TW1pYVNtX0NpZFBkcEFkZHIgICAgICAgICBhdFBkcEFkZHJbWl9NTUlBRVNNX01BWF9DSURfTlVNXTsNCi19VF96TW1pYUVzbV9RdWVyeVBkcEFkZHJfQ25mOw0KLQ0KLSNpZmRlZiBCVFJVTktfU1VQUE9SVA0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpQVFRfTU1JQV9FU01fVEFVVFlQRV9SRVFfRVYoQVRJLT5FU00pDQoty7XD9zrJ6NbDVEFVKFVFKcrH1vfTw7vy1d+xuNPDDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVGF1VHlwZVNldDsvKtb308O7ucrHsbjTw6OsMTEzse3Kvtb308OjrDExNLHtyr6xuNPDKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gfVRfekF0aUVzbV9UYXVUeXBlU2V0X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86UFRUX01NSUFfRVNNX1RBVVRZUEVfQ05GX0VWKEVTTS0+QVRJKQ0KLcu1w/c6yejWw1RBVShVRSnKx9b308O78tXfsbjTw8frx/O1xM/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7LyogyKHWtVpfU1VDQy9aX0ZBSUwgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSB9VF96QXRpRXNtX1RhdVR5cGVTZXRfQ25mOw0KLQ0KLSNlbmRpZg0KLQ0KLXR5cGVkZWYgZW51bQ0KLXsNCi0gICAgWl9TVE1fVEFTSzFfSURYLA0KLSAgICBaX1NUTV9UQVNLMl9JRFgNCi19VF96U3RtX1Rhc2tJZHg7DQotDQotLyq157uwsb605rSixvdJRLao0uUqLwotdHlwZWRlZiBCWVRFIFRfelN0bVBiX1N0b3JhZ2VJZDsNCi0NCi0vKiC6xcLrz+C52LXEzsSxviAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUZXh0VmFsW1pfQVBNTUlBX01BWF9DQUxMTkFNRV9MRU5dOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfekFwTW1pYV9QaG9uZVRleHQ7DQotDQotLyogUEK05rSitcRFbWFpbCAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJFbWFpbFtaX0FQTU1JQV9NQVhfRU1BSUxfTEVOXTsgIC8qILTmtKJFbWFpbCovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfekFwTW1pYV9FbWFpbDsNCi0NCi0vKiBQQrTmtKK1xEdyb3VwICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJBbHBoYUlkW1pfQVBNTUlBX01BWF9HQVNfTEVOXTsgIC8qILTmtKJHcm91cCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfekFwTW1pYV9HcnA7DQotDQotLyogUEK05rSitcRTZWNvbmQgTmFtZSAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJTbmVbWl9BUE1NSUFfTUFYX1NORV9MRU5dOyAgLyogtOa0olNlY29uZCBOYW1lKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcE1taWFfU25lOw0KLQ0KLS8qILXnu7CxvrTmtKLG9yAqLw0KLXR5cGVkZWYgc3RydWN0IHsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdG9yYWdlOyAgIC8qtee7sLG+tOa0osb3Og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BIT05FQk9PS19EQyAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9QSE9ORUJPT0tfRU4gICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUEhPTkVCT09LX0ZEICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BIT05FQk9PS19MRCAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9QSE9ORUJPT0tfTUMgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUEhPTkVCT09LX01FICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BIT05FQk9PS19NVCAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9QSE9ORUJPT0tfT04gICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUEhPTkVCT09LX1JDICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BIT05FQk9PS19TTSAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9QSE9ORUJPT0tfVEEgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUEhPTkVCT09LX0FQICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQaW4yRmxhZzsgLyogMCDO3nBpbjIgMSDT0HBpbjIgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBpbjJbWl9BUE1NSUFfUElOX0xFTl07ICAvKiBwaW4ytcTWtSAsINPJQVRJzO6z5MSpzrK1xDB4ZmYqLw0KLX1UX3pBcE1taWFfUGJTdG9yYWdlOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYlN0b3JhZ2VTdGF0dXNDbmZfRXYNCi0guabE3KO6sunRr7TmtKLG97XEzNjQ1Lyw17TMrA0KLSBBVMP8we6juitDUEJTPywrQ1BCUio/LCtDUEJGKj8sK0NQQlcqPw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJRdWVyeUZsYWc7IC8qIL2rx+vH87XEYlF1ZXJ5RmxhZ7T4u9ggKi8NCi0NCi0gICAgVF96QXBNbWlhX1BiU3RvcmFnZSAgICAgICAgICAgICAgICAgICAgICB0U3RvcmFnZTsNCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VG90YWw7ICAgLyog19zM9cr9ICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1VzZWQ7ICAgIC8qIMq508O1xMz1yv0gKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Tmxlbmd0aDsgLyogusXC69futPOzpLbIICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RsZW5ndGg7IC8qIHRleHTX7rTzs6S2yCAqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdHbGVuZ3RoOyAvKiBHcm91cLXE1+6087OktsgqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTbGVuZ3RoOyAvKiC12rb+yMvD+7XE1+6087OktsgqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdFbGVuZ3RoOyAvKiBFbWFpbLXE1+6087OktsgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsNCi19VF96QXBNbWlhX1BiU3RvcmFnZVN0YXR1c19DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpfQVBNTUlBX1BiQ29tbW9uQ25mX0V2KFBCLT5NTUlBKQ0KLSAguabE3DpQQsSjv+m1xM2o08PWtNDQveG5+8LrDQotICC21NOmQVTD/MHuOsSz0KlBVMP8we7WtNDQtcS94bn7o6xvay9lcnJvciAvY2Vyo7orZXJyb3INCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgICAvKiBBVMP8we694bn7IFpfQVBNTUlBX09QRVJBVElPTl9TVUNDRVNTL1pfQVBNTUlBX09QRVJBVElPTl9GQUlMVVJFKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkV2dEZnOyAgICAgICAgICAgICAvKiCx6sq2ttTTprXEx+vH88/7z6KjrLrz0Pi/ycrTx+m/9sztvNPG5Mv8z/vPog0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BCQ09NTUNORl9NRU1DQVBBIDEgse3Kvs/7z6IgWl9BUE1NSUFfUGJNZW1DYXBhUmVxX0V2ILXEu9i4tCAqLyAgICAgICAgICAgDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q2F1c2U7ICAgICAgICAgICAgLyogYlJlc3VsdCA9IFpfQVBNTUlBX09QRVJBVElPTl9GQUlMVVJF09DQpyovDQotfVRfekFwTW1pYV9QYkNvbW1vbl9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1BiU0ZpbmRJbmRleFJlcV9FdihNTUlBLT5QQikNCi0guabE3KO6x+vH88HQvtm157uwsb68x8K8KNa4tqi05rSixvcpo6yzpLXnu7Cxvg0KLSBBVMP8we6jul5TQ1BCUg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kZXgyRmc7ICAvKiDWuMq+d0luZGV4MtPQ0KfQ1KOsyKHWtQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1ZBTElEICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ21kRmxnOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMih1rW3ts6nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DSElOQV9NT0JJTEVfQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1pURV9PV05fQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDE7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4MjsNCi19VF96QXBNbWlhX1BiU0ZpbmRJbmRleF9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1BiU0ZpbmRJbmRleEVuZENuZl9FdiANCi0guabE3KO6wdC+2bXnu7CxvrzHwryjrL3hyvjP+8+iDQotIEFUw/zB7qO6XlNDUEJSDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAvKiAwIMqnsNwgMSCzybmmICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNtZEZsZzsgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMih1rW3ts6nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DSElOQV9NT0JJTEVfQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1pURV9PV05fQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVhc29uOyAgICAvKiDKp7Dc1K3S8iAqLw0KLX1UX3pBcE1taWFfUGJTRmluZEluZGV4RW5kX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfUGJTRWRpdENuZl9FdihQQi0+TU1JQSkNCi0guabE3KO61Pa807vyyb6z/bzHwry1xL3hufsNCi0gQVTD/MHuo7peU0NQQlcNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgLyogMMqnsNyjrDGzybmmICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNtZEZsZzsgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1t7bOpzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfQ0hJTkFfTU9CSUxFX0NNRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9aVEVfT1dOX0NNRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsNCi19VF96QXBNbWlhX1BiU0VkaXRfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYlNDcGJyVGVzdFJlcV9FdihNTUlBLT5QQiksIA0KLSAgICAgICBaX0FQTU1JQV9QYlNDcGJ3VGVzdFJlcV9FdihNTUlBLT5QQikNCi0guabE3KO6x+vH87LiytRTQ1BCUrrNU0NQQlfD/MHuss7K/b/J0aHWtQ0KLSC21NOmQVTD/MHuo7peU0NQQlI9PyxeU0NQQlc9Pw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ21kRmxnOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogyKHWtbe2zqc6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfQ0hJTkFfTU9CSUxFX0NNRA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1pURV9PV05fQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX0gVF96QXBNbWlhX1BiU0NwYnJUZXN0X1JlcSwgVF96QXBNbWlhX1BiU0NwYndUZXN0X1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfUGJTQ3BiclRlc3RDbmZfRXYoUEItPk1NSUEpLCANCi0gICAgICAgWl9BUE1NSUFfUGJTQ3Bid1Rlc3RDbmZfRXYoUEItPk1NSUEpDQotILmmxNyjure1u9hDUEJSus1DUEJXw/zB7rLOyv2/ydGh1rUNCi0gttTTpkFUw/zB7qO6XlNDUEJSPT8sIF5TQ1BCVz0/DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbWRGbGc7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1t7bOpzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DSElOQV9NT0JJTEVfQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfWlRFX09XTl9DTUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVtYWlsTGVudGhGZzsgICAgIC8qINa4yr53RW1haWxMZW50aNPQ0KfQ1CAqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TWF4SW5kZXg7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdOdW1MZW50aDsgICAgICAgICAvKiDV+9DN1rWjrLHtyr6157uwusXC67XE1+6087OktsggKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1R4dExlbnRoOyAgICAgICAgIC8qINX70M3WtaOsse3KvtDVw/u1xNfutPOzpLbIICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdFbWFpbExlbnRoOyAgICAgICAvKiDV+9DN1rWjrLHtyr5FTUFJTLXE1+6087OktsggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNuZUxlbmd0aEZnOyAgICAgIC8qILHqyrZ3U25lTGVuZ3Ro09DQp9DUKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTbmVMZW5ndGg7ICAgICAgICAvKiDV+9DN1rWjrLHqyrZTTkXX7rTzs6S2yCovDQotfVRfekFwTW1pYV9QYlNDcGJyVGVzdF9DbmYsIFRfekFwTW1pYV9QYlNDcGJ3VGVzdF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQXBNbWlhX1BiQ3Bid1F1ZXJ5Q25mX0V2KFBCLT5NTUlBKSwgDQotILmmxNyjurLp0a93cml0dGVuX2luZGV4DQotILbU06ZBVMP8we6juitDUEJXPw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEc3RJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiV3JpdHRlbkluZGV4RmxnOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILHqyrZiV3JpdHRlbkluZGV409DQp9DUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1ZBTElEserKttPQ0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfSU5WQUxJRLHqyrbO3tCnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1dyaXR0ZW5JbmRleDsgLyogaW50ZWdlciB0eXBlIHZhbHVlIGluZGljYXRpbmcgdGhlIGxhc3QgbG9jYXRpb24gbnVtYmVyIDxpbmRleD4gb2YgdGhlIHdyaXR0ZW4gcGhvbmVib29rIGVudHJ5Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfekFwTW1pYV9QYkNwYndRdWVyeV9DbmY7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++juiBaX0FwTW1pYV9QYkNwYndRdWVyeVJlcV9FdihNTUlBLT5QQikNCi0guabE3KO6ILLp0a93cml0dGVuX2luZGV4DQotILbU06ZBVMP8we6juiArQ1BCVz8NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX0gVF96QXBNbWlhX1BiQ3Bid1F1ZXJ5X1JlcSwgVF96QXBNbWlhX1BiQ251bV9SZXE7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpfQVBNTUlBX1BiQ251bV9DbmYgKFBCLT5NTUlBKQ0KLSAguabE3Dqy6dGv08O7p01TSVNETnMgtcS94bn7DQotICC21NOmQVTD/MHuOitDTlVNDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVXNlRmc7ICAgICAgICAvKiDWuMq+YlNwZWVkIGJTZXJ2aWNlIGJJdGPT0NCn0NQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICi/vMLHtb26xcLr0+tiU3BlZWQgYlNlcnZpY2UgYkl0Y86qU0lNv6jW0LK7zazOxLz+o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIMj0zt66xcLro6zU8taxvdOxqLTto6zI9Na709C6xcLrtvjO3mJTcGVlZCBiU2VydmljZSBiSXRjo6zU8mJVc2VGZz0wserKtrjDyP3P7s7e0KejrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgyPTT0LrFwuvH0rjDyP3P7tPQ0KejrNTyYlVzZUZnPTEpICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3BlZWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXJ2aWNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZGVuRmc7ICAgICAvKiDWuMq+aGlkZGVuyse38dPQ0KejrFpfQVBNTUlBX0lOVkFMSUQvWl9BUE1NSUFfVkFMSUQgKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRkZW47ICAgICAgIC8qIDAgbm90IGhpZGRlbiAxIGhpZGRlbiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXRjOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TnVtOw0KLSAgICBUX3pBcE1taWFfUGhvbmVUZXh0ICAgICAgICAgICAgICAgICAgICAgICB0VGV4dDsgDQotfVRfekFwTW1pYV9DbnVtOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgIC8qIEFUw/zB7r3hufsgWl9BUE1NSUFfT1BFUkFUSU9OX1NVQ0NFU1MvWl9BUE1NSUFfT1BFUkFUSU9OX0ZBSUxVUkUqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ251bUNvdW50OyAgICAgICAgLyog09DQp0NudW249sr9ICovDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q2F1c2U7ICAgICAgICAgICAvKiBiUmVzdWx0ID0gWl9BUE1NSUFfT1BFUkFUSU9OX0ZBSUxVUkXT0NCnKi8NCi0NCi0gICAgVF96QXBNbWlhX0NudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRDbnVtW1pfQVBNTUlBX0NOVU1fTUFYQ09VTlRdOw0KLX0gVF96QXBNbWlhX1BiQ251bV9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpfQVBNTUlBX1BiQ2xja1NldFJlcV9FdihNTUlBLT5QQikNCi0gILmmxNw6ILSmwO1GRLmmxNwNCi0gILbU06ZBVMP8we46K0NMQ0sNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGYWM7ICAgICAgICAvKiCyzrz7uuq2qNLlIFpfQVBNTUlBX0ZBQ1ZBTFVFX0ZEICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RlOyAgICAgICAvKiCyzrz7uuq2qNLlIFpfQVBNTUlBX1NTT1BUTU9ERV9ERUFDVElWQVRJT04gZXRjLiovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2xhc3NGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzOyAgICAgIC8qILLOvPu66rao0uUgWl9BUE1NSUFfQ0xBU1NfVk9JQ0UgZXRjLiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaElkOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFzc3dkTGVuOyAgLyogU1PStc7xtcTD3MLrs6S2yL32z940o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL+oz+C52NK1zvG1xMPcwuuzpLbIv8myu7aos6SjrNfutPPOqjgqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhc3N3b3JkW1pfQVBNTUlBX01BWF9QQVNTV0RfTEVOXTsgICAvKiDD3MLrKi8NCi19IFRfekFwTW1pYV9QYkNsY2tTZXRfUmVxOw0KLQ0KLS8qIENMQ0uhokNDV0Gy6dGvveG5+9fTveG5uSAqLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0dXM7ICAgICAgIC8qILLOvPu66rao0uUgWl9BUE1NSUFfU1NTVEFUVVNfTk9UQUNUSVZFIGV0Yy4qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbGFzc0ZnOyAgICAgIC8qIGJDbGFzc7Tm1Nqx6rzHzrsqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbGFzczsgICAgICAgIC8qILLOvPu66rao0uWjrLK7sPy6rMCp1bm66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19IFRfekFwTW1pYV9DbGFzc1N0YXR1czsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86Wl9BUE1NSUFfUGJDbGNrU3RhdHVzQ25mX0V2KFBCLT5NTUlBKQ0KLSAguabE3Dq72Li0sunRr7XEY2xhc3PS1Lywyse38byku+6jrL+oz+C52LvYuLTW0L3209BiQWN0aXZlU3RhdHVzDQotICC21NOmQVTD/MHuOitDTENLOiA8c3RhdHVzPlssPGNsYXNzMT5bPENSPjxMRj4rQ0xDSzogPHN0YXR1cz4sPGNsYXNzMj5bLi4uXV0gLG1vZGU9MrXEx+m/9g0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzTnVtOyAgICAgIC8qIGNsYXNz09DQp7j2yv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgVF96QXBNbWlhX0NsYXNzU3RhdHVzICAgICAgICAgICAgICAgICAgICAgYXRDbGFzc1s4XTsgICAgIC8qILLp0a+94bn7yv3X6SAqLw0KLX0gVF96QXBNbWlhX1BiQ2xja1N0YXR1c19DbmY7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkluZGV4MkZnOyAgICAgLyog1rjKvndJbmRleDLT0NCn0NSjrMih1rUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1ZBTElEICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4MTsgICAgICAgLyrX7tChtNMxv6rKvCwgKMvmZdDQ1+7QobTTML+qyrwpKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4MjsgICAgICAgLyrX7tChtNMxv6rKvCwgKMvmZdDQ1+7QobTTML+qyrwpKi8NCi19VF96QXBNbWlhX0NwYnJTZXRfUmVxOw0KLQ0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfQ3Bic1NldFJlcV9FdihDb21tb25Dbma72Li0KSxaX0FQTU1JQV9QYlN0b1NldFJlcV9FdihaX0FQTU1JQV9QYkNvbW1vbkNuZl9FdikNCi0guabE3KO6yejWw7Wxx7C1xLXnu7Cxvg0KLSC21NOmQVTD/MHuo7orQ1BCUw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIFRfekFwTW1pYV9QYlN0b3JhZ2UgICAgICAgICAgICAgICAgICAgICAgIHRQYlN0b3JhZ2U7DQotfVRfekFwTW1pYV9DcGJzU2V0X1JlcSxUX3pBcE1taWFfUGJTdG9TZXRfUmVxOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJIaWRkZW5GZzoxOyAgIC8q1rjKvmJIaWRkZW7T0NCn0NQqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kZXhGZzoxOyAgICAvKta4yr5pbmRleNPQ0KfQ1CovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1GZzoxOyAgICAgIC8qINa4yr50QmNkTnVt09DQp9DUICAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGV4dEZnOjE7ICAgICAvKiDWuMq+dFRleHTT0NCn0NQgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNuZUZnOjE7ICAgICAgLyog1rjKvnRTbmXT0NCn0NQgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVtYWlsRmc6MTsgICAgLyog1rjKvnRFbWFpbNPQ0KfQ1CAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQW5yRmc6MTsgICAgICAvKiDWuMq+dEFuctPQ0KfQ1CAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiR3JwRmc6MTsgICAgICAvKiDWuMq+dEdycNPQ0KfQ1CAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGlkZGVuOyAgICAgICAvKjAgbm90IGhpZGRlbqOsMSBoaWRkZW4sIMixyqHWtc6qMKOs08lBVEnM7tC0Ki8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4OyAgICAgICAgLyog1+7QobTTMb+qyrwgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE51bTsgDQotDQotICAgIFRfekFwTW1pYV9QaG9uZVRleHQgICAgICAgICAgICAgICAgICAgICAgIHRUZXh0OyANCi0gICAgVF96QXBNbWlhX1NuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNuZTsgIC8qILjDtee7sLzHwry21NOmtcS12rb+uPbIy8P7Ki8NCi0gICAgVF96QXBNbWlhX0VtYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgdEVtYWlsOyAvKiC159fT08rP5LXY1rcqLw0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0QW5yOyAgLyoguL2807XEusXC6yovDQotICAgIFRfekFwTW1pYV9HcnAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHcnA7ICAvKiCx7cP3uMO157uwvMfCvM/uyvTT2sTHuPZHcm91cCovDQotfVRfekFwTW1pYV9DcGJ3U2V0X1JlcSxUX3pBcE1taWFfUGJFZGl0X1JlcSxUX3pBcE1taWFfQ3BiclNldF9DbmYsVF96QXBNbWlhX1BiRmluZEluZGV4X0NuZjsNCi0NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyAgLyogveG5+zCjrMqnsNyjrDGzybmmICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247DQotfVRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZjsNCi0NCi10eXBlZGVmIHN0cnVjdCBMaXN0Rm9yU3RtDQotew0KLSAgICBUX1pPc3NfTm9kZSBub2RlOw0KLSAgICBVSU5UMzIgICAgICBpRXZJZDsNCi0gICAgVUlOVDggICAgICAqcERhdGFQdHI7DQotICAgIFVJTlQxNiAgICAgIGlEYXRhTGVuOw0KLX0gDQotVF9aQXRpX0xpc3RGb3JTdG07IA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotveG5uczlOiBUX1pBdGlfU3RtTGlzdF9JbmQNCi25psTcOiC9q7bM0MXB0LHtus3QrdLp1bvWuMq+serWvrT4uPhBVEkNCi1iUmVzdWx0OiANCi1BVMP8we46IEFUK0NNR0wNCi221NOmz/vPojogRVZfWkFUSTJfU1RNTElTVF9JTkQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3JjSW5kZXg7DQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGVzdEluZGV4Ow0KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YWNrSWQ7IC8qINCt0unVu9a4yr6x6ta+o6wwo7rQrdLp1bsxo6wgMaO60K3S6dW7MiAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIFRfWk9zc19MaXN0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RtTXNnTGlzdDsgICAvKiDWuNXrZ196U3RtX01zZ0xpc3S1xLXY1rcqLw0KLX1UX1pBdGlfU3RtTGlzdF9JbmQ7DQotDQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIFRfelN0bVBiX1N0b3JhZ2VJZCAgICAgICByZWFkU3RvcmFnZTsgICAgICAgICAgICAgICAgIAotICAgVF96QXBNbWlhX0NwYnJTZXRfUmVxICAgIGNwYnJTZXRSZXE7Ci0gICBVSU5UMzIgICAgICAgICAgICAgICAgICAgY25mTXNnSWQ7Ci0gICBUX3pBcE1taWFfQ3BiclNldF9DbmYgICAgY3BiclNldENuZjsKLSAgIFRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZiBDcGJyU2V0RW5kQ25mOwotfVRfelN0bV9DcGJyX0NuZjsNCi0NCi10eXBlZGVmIHN0cnVjdAotewotICAgVF96U3RtUGJfU3RvcmFnZUlkICAgICByZWFkU3RvcmFnZTsKLSAgIFVJTlQxNiAgICAgICAgICAgICAgICAgaVN0YXJ0UmVjOwotICAgVF96QXBNbWlhX0NwYnJTZXRfUmVxICBjcGJyU2V0UmVxOwotfVRfelN0bV9DcGJyX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAg1K3T7zpFVl9aQVRJMl9aV0VOX1NFVF9SRVENCi0gILmmxNw608O7p9T2vNNQQr30vLG6xcLrwdCx7Q0KLSAgttTTpkFUw/zB7jorWldFTj08TlVNPiw8Y2F0ZWdvcnk+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTcmNJbmRleDsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEZXN0SW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNydkNhdGVnRmc7ICAvKiCx7cq+YlNydkNhdGVnyse38dPQ0KejrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWlBTX0FQTU1JQV9JTlZBTElEICAgzt7Qp6OsWlBTX0FQTU1JQV9WQUxJRCAg09DQpw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNydkNhdGVnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1MZW47ICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk51bVtaQVRJMl9FQ0NfTUFYTlVNXTsNCi19IFRfWkF0aV9FbWVyTnVtX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLb3hubnM5TogVF9aQXRpX0VtZXJOdW1fQ25mDQotuabE3DogsaO05r30vLG6xcLrtcTP7NOmveG5+w0KLWJSZXN1bHQ6INa00NC94bn7o6xUUlVFzqqzybmmo6xGQUxTRc6qyqew3A0KLdei0uKjrLWx0tG+rcb0tq/By1BQUKOssrvE3NbDzqqyu8b0tq9QUFChow0KLUFUw/zB7jogQVQrWldFTg0KLbbU06bP+8+iOiBFVl9aQVRJMl9aV0VOX0NORg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTcmNJbmRleDsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEZXN0SW5kZXg7DQotICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyAvKiDWtNDQveG5+6OsVFJVRc6qs8m5pqOsRkFMU0XOqsqnsNwgKi8NCi19VF9aQXRpX0VtZXJOdW1fQ25mOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVNyY0luZGV4Ow0KLSAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURlc3RJbmRleDsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAvKiDB0L7ZveG5+yAqLw0KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247IC8qIMHQvtnKp7Dc1K3S8iAqLw0KLSAgICANCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmRleE51bTsgDQotICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJJbmRleFtaQVRJMl9DUE1TTUVNX1VTSU1fTUFYX05VTV07DQotfQ0KLVRfWkF0aV9WYWxpZEluZGV4Q25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICDUrdPvOiBaX0FQTU1JQV9TbXNDcG1zUmVxX0V2KEFUSS0+TU1JQSksWl9BUE1NSUFfUGJQcmVmTXNnU3RvUmVxX0V2IChNTUlBLT5QQikNCi0gILmmxNw6z/vPosrX0aG05rSixvfJ6NbDo7sNCi0gILbU06ZBVMP8we6juitDUE1ToaMNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ29tbWFuZEluZDsgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogttTTprXEw/zB7ta4yr4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU01TQ01EVFlQRV9TRVQgICAgICA6IMno1sPD/MHuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU0NNRFRZUEVfUVVFUlk6ILbBw/zB7izWu7e1u9i1scewYk1zZ1NlcnZpY2WjrGJNc2dTdXBwb3J0SW5ktcTWtaGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtMTsgLyogytfRobbBLMHQvtmjrMm+s/205rSixvcuILTmtKLG98P7s8aho7G+t72wuL/J08PK/da1tPrM5rHtyr6how0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DUE1TTUVNX0JNICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfQ1BNU01FTV9NRSAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX0NQTVNNRU1fTVQgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DUE1TTUVNX1VTSU0gICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DUE1TTUVNX1RBICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWl9BUE1NSUFfQ1BNU01FTV9TUiAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lbTJPcGVyRmc7ICAvKiDWuMq+bWVtMrXE09DQp9DUo6zIoda1DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BBUkFNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BBUkFNX1ZBTElEDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtMjsgLyogytfRobeiy82jrNC0tOa0osb3LiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtM09wZXJGZzsgIC8qINa4yr5tZW0ztcTT0NCn0NSjrMih1rUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfUEFSQU1fSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfUEFSQU1fVkFMSUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW0zOyAvKiDK19GhTVTP+8+isaO05rTmtKLG9y4qLyANCi19VF96QXBNbWlhX1Ntc0NwbXNfUmVxLFRfekFwTW1pYV9QYlByZWZNc2dTdG9fUmVxOyANCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfTGlzdFNtQ25mX0V2DQotILmmxNyjusHQvtnP+8+itcS72Li0DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0Q2hnRmxnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAvKiDB0L7ZveG5+yAqLw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVhc29uOyAvKiDB0L7Zyqew3NSt0vIgKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VyTnVtOw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUb3RhbE51bTsNCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1N0YXR1czsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtMTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0xlbjsgIC8qzqqy4srUuaS+37j8uMQqLw0KLQ0KLSAgICBQQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiTXNnOyAgICAgLyog1rjP8m1zZ7XE1rjV6yAqLw0KLX1UX3pBcE1taWFfTGlzdFNtX0NuZiwgVF96QXBNbWlhX0xpc3RTbVJsdDsNCi0NCi0vKiBUUC1GT8r9vt21xL3hubnA4NDNICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dUeXBlSWQ6MjsgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDP+8+iwODQzbHqyrZNVEnVvDLOu6OsYml0MbrNYml0MC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgMCBTTVMgREVMSVZFUiAoU0MnIE1TKSAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMCAwIFNNUyBERUxJVkVSIFJFUE9SVCAoTVMnIFNDKSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxIDAgU01TIFNUQVRVUyBSRVBPUlQgKFNDICcgTVMpICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMSAwIFNNUyBDT01NQU5EIChNUyAnIFNDKSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgMSBTTVMgU1VCTUlUIChNUycgU0MpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAgMSBTTVMgU1VCTUlUIFJFUE9SVCAoU0MgJyBNUykgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMSAxILGjwfQsTVPK1bW9uqzT0LTL1rW1xFNNyrEsytPG5M6qU01TIERFTElWRVKyotSt0fm05rSi1q4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ0ZlYXR1cmU6MTsgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogz/vPoszY1ffOu6OsvLS24M/7z6K3osvNTU1TL77cvvi4tNbGUlDWuMq+o6zVvDHOu2JpdDIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTU1TOtXrttRTTVMtREVMSVZFUrvyU01TLVNUQVRVUy1SRVBPUlQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgIDAgIDpTQ9bQ09C24Mz1tci0/dKqt6LN+bjDTVO1xFNNu/LXtMyssai45qGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAxICA6U0PW0MO709C24Mz1tci0/dKqt6LN+bjDTVO1xFNNu/LXtMyssai45qGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUkSjutXrttRTTVMtU1VCTUlULg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgMDrWuMq+U0PUytDtvdPEydK7uPZTTVMtU1VCTUlUuLTWxrXEU00uKFRQLU1SLFRQLURBLFRQLU9BvdTP4M2sKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgMTog1rjKvlNDvty++L3TxMnSu7j2uLTWxrXEU01TLVNVQk1JVC4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcHZwRm9ybWF0OjI7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog09DQp8bauPHKvVZQRizVvDLOu6OsYml0NLrNYml0My4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog1eu21FNNUy1TVUJNSVQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgIDAgIDAgVFAtVlDT8s60zOG5qQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAxICAwIFRQLVZQ0/LM4bmpIC0gz+C52Ljxyr0gIDogVFAtVlDVvNK7uPbX1r3aLM6q0ru49tfWvdq1xNX7yv3WtSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgse3KvtPQ0KfG2rXEs6S2yCy001NDvdPK1bW9U01TLVNVQk1JVMTH0ru/zMvjxvAuse3KvrXEyrG85Na1yOfPwjoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgIFRQLVZQINa1ICAgIFZhbGlkaXR5IHBlcmlvZCDWtQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgMCB0byAxNDMgICAgKFRQLVZQKzEpeDVtaW51dGVzIChpLmUuNSBtaW51dGVzIGludGVydmFscyB1cCB0byAxMiBob3VycykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgIDE0NCB0byAxNjcgIDEyaG91cnMrKChUUC1WUC0xNDMpIHggMzAgbWludXRlcykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgIDE2OCB0byAxOTYgIChUUC1WUC0xNjYpeDFkYXkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgIDE5NyB0byAyNTUgIChUUC1WUC0xOTIpeDF3ZWVrDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMCAxIFRQLVZQ0/LM4bmpIC0g1PbHv7jxyr0gIDrTyTdv1+mzySzL+dPQ19a92rHY0OvIq7K/s/bP1iy+obnczrSx2A0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICDIq9PDtb0uytfX1r3a1rjD98HLuvPD5ja49tfWvdq1xMq508O3vbeoLMjOus6xo8H0u/Kyu9PDtcTOu9Dr1sPOqjAuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMSAxIFRQIFZQ0/LM4bmpIC0gvvi21Ljxyr0gIDogVFAtVlDOqjdvLLDr19a92rHtyr4sse3KvtPQ0KfT8tbQ1rm1xL74ttQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgIMqxvOQszay1yNPaU0NUU7Htyr63qC4gICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0UnB0RmVhdHVyZToxOyAvKiDXtMyssai45szY1ffOu6OsvLTP+8+izNjV96Os17TMrLGouObWuMq+U1JJL9e0zKyxqLjmx+vH81NSUi/XtMyssai45tfKuPHV31NSUSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog1bwxzrujrGJpdDUuIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTUkmjutXrttRTTVMtREVMSVZFUi4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgMDrO3te0zKyxqLjmt7W72KGjoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgMTrSu7j217TMrLGouObTpqOotNNTQ6Opt7W72Lj41LRTTUUuKNLyzqrUtFNNRdTaU01TLVNVQk1JVNbQx+vH86GjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgIMHL17TMrLGouOYpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNSUqO61eu21FNNUy1TVUJNSVQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgIDA6zt7XtMyssai45sfrx/Ohow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAxOtK7uPbXtMyssai45rG7x+vH87e1u9ihow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTUlGjutXrttRTTVMtU1RBVFVTLVJFUE9SVA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAwOsrHU01TLVNVQk1JVLXEttTTpte0zKyxqLjmoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgMTrKx1NNUy1DT01NQU5EtcS21NOm17TMrLGouOahow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRwdWRIZWFkSW5kOjE7ICAgIC8qINPDu6fK/b7dzbeyv9a4yr5VREhJo6zVvDHOu6OsYml0Ni4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDpUUC1VRNPyvfaw/LqstszP+8+iLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxOiBUUC1VRNPysPy6rNPDu6fK/b7dzbeyv7rNtszP+8+izOUuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVwbHlQYXRoSW5kOjE7ICAgLyogu9i4tMK3vrbWuMq+UlAs1bwxzrujrGJpdDcuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDA6zrTJ6NbDu9i4tMK3vrahow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxOrvYuLTCt762ss7K/dTaU01TLVNVQk1JVC8gU01TLURFTElWRVIu0tHJ6NbDLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pBcE1taWFfVHBGbzsNCi0NCi0NCi0vKiC12Na3wODQzbXEtqjS5cDg0M0gKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bVBsYW5JZDo0OyAgLyogTnVtYmVyaW5nIFBsYW4gSWRlbnRpZmljYXRpb27Ou7bOICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1iZXJUeXBlOjM7IC8qIFR5cGUgb2YgTnVtYmVyzru2ziAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG9wQml0OjE7ICAgICAvKiDX7rjfzru5zLaozqoxLiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfekFwTW1pYV9BZGRyVHlwZTsNCi0NCi0vKiC12Na3wODQzSAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFkZHJMZW5ndGg7ICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogv8nOqrDr19a92rHtyr61xLXY1rfWtbOktsijrMih1rWjqDChqzIwo6kNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILWxYkFkZHJMZW5ndGjIoTDKsaOsYkFkZHJWYWx1ZbK7zOG5qaOsdEFkZHJUeXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC/yczhuakNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotDQotICAgIFRfekFwTW1pYV9BZGRyVHlwZSAgICAgICAgICAgICAgICAgICAgICAgIHRBZGRyZXNzVHlwZTsgLyogtdjWt8Dg0M2jrNfps8m48cq9o7oxK1RPTigzzrspK05QSSi1zTTOuykqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkFkZHJWYWx1ZVtaX0FQTU1JQV9NQVhfQUREUlZBTFVFX0xFTl07ICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogtdjWt9a10/KjrLDr19a92rHtyr678tfWxLjK/dfWse3Kvg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICqjqL3206bTw9PaU00tVEyy46OpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogyPS0y9Pys6S2yM6qxubK/aOs1PLX7rjf19a92rK5obBGRqGxtNWzycW8yv249g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzJbMl07DQotfVRfekFwTW1pYV9UcEFkZHJlc3M7ICAvKiDH+LfWU00tVEy12Na3us2117LjUlCy47XY1rcqLw0KLQ0KLXR5cGVkZWYgc3RydWN0eyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlllYXI7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1vbnRoOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXk7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhvdXI7IA0KLSAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNaW51dGU7ICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlY29uZDsgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG1ab25lOyAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pBcE1taWFfVFpBbmRUaW1lOyAgDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gINSt0+86Wl9BUE1NSUFfU21zVGRlbGlMaXN0Q25mX0V2KE1NSUEtPkFUSSkNCi0gILmmxNw6tNO05rSixvfB0L7Zz/vPorXEU01TLURFTElWRVLP+8+itcTP7NOmo7sNCi0gILbU06ZBVMP8we46zsSxvsSjyr21xCtDTUdMtcRTTVMtREVMSVZFUtfu1tW94bn7wuuhow0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXN0SW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dIZWFkSW5kOyAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogzsSxvsSjyr3PwrXEz/vPos23sr+yzsr9z9TKvta4yr6ho7y0K0NTREjD/MHutcTJ6NbDoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfQ1NESF9OT1NIT1c6ICtDU0RIzrTJ6NbDo6zU8rK7z9TKvjx0b29hPiwgPGxlbmd0aD6yzsr91rWjrLfWsfC21NOmdFRwT3JpZ2luYWxBZGRywODQzaGiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJUZXh0TGVuZ3RooaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog0tTPws2soaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfQ1NESF9TSE9XOiArQ1NESNLRyejWw86qMaGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU3RhdFZhbDsgLyogz/vPote0zKwsUERVxKPKvc/CzqrK/da1o6zOxLG+xKPKvc/Czqq0rrHtyr6hoyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VG90YWxOdW07IC8qINfctcTP+8+izPXK/SAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VyTnVtOyAvKiC1scewtcTP+8+izPXK/SAqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7IC8qILTmtKLOu9bD0PK6xS4qLyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFyTnVtOyAgICAvKiC21NOmVFBVREyjrNfutPPWtc6qWl9BUE1NSUFfTUFYX1NNU1RFWFRDSEFSX0xFTiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmFtZUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdENoZ0ZsZzsgICAvKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9FTkFCTEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1NUQVRDSEFOR0VfRElTQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGNzOyAgICAgICAgICAgLyq1scewz/vPosq508O1xERDUyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgVF96QXBNbWlhX1RwRm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRwRmlyc3RPY3RldDsNCi0NCi0gICAgVF96QXBNbWlhX1RwQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgdFRwT3JpZ2luYWxBZGRyOyAgLyogxL+1xLXY1rcv1LS12Na3oaMqLw0KLQ0KLSAgICBUX3pBcE1taWFfUGhvbmVUZXh0ICAgICAgICAgICAgICAgICAgICAgICB0TmFtZTsgICAgICAgICAvKiA8ZGE+ttTTprXEyMvD+yzTyWJOYW1lRme+9raoyse38bTm1NogKi8NCi0NCi0gICAgVF96QXBNbWlhX1RaQW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgdFRwU0NUUzsvKiDKsbzktMEuILWxzqpTTVMtU1VCTUlUyrHO3rTLss7K/aGjICovIA0KLSAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdUZXh0TGVuZ3RoOyAvKiDOxLG+yv2+3dfWt/uzpLbILs6qsuLK1Lmkvt+4/LjEKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRleHRCdWZmZXI7IC8qIM7Esb7K/b7du7qz5cf41rjV6y4qLw0KLX1UX3pBcE1taWFfU21zVGRlbGlMaXN0X0NuZiwgVF96QXBNbWlhX1Ntc1RkZWxpTGlzdFJsdDsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAg1K3T7zpaX0FQTU1JQV9TbXNQY21nbENuZl9FdiAoTU1JQS0+QVRJKQ0KLSAguabE3DrB0L7Zz/vPorXEz+zTpqO7DQotICC21NOmQVTD/MHuOitDTUdMw/zB7rXE1+7W1b3hufvC66GjDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RvdGFsTnVtOyAgIC8qIMHQvtnP+8+i19y1xMz1yv0gKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0N1ck51bTsgICAgIC8qILWxx7DP+8+izPXK/SAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7ICAgICAgLyogtOa0os671sPQ8rrFLiovICANCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1N0YXRWYWw7IC8qIM/7z6LXtMysLFBEVcSjyr3Pws6qyv3WtaOszsSxvsSjyr3Pws6qtK6x7cq+oaMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHBkdUxlbmd0aDsgLyogUERVyv2+3dbQVFBEVbXE19a92rOktsgs1+6088ih1rUxNjRCKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOYW1lRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0Q2hnRmxnOyAgIC8qICBaX0FQTU1JQV9TVEFUQ0hBTkdFX0VOQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9ESVNBQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgICAgICAgICAvKiDOqkNRTkowMDE5NDU2NtDeuMQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107ICAgIA0KLSAgICBUX3pBcE1taWFfUGhvbmVUZXh0ICAgICAgICAgICAgICAgICAgICAgICB0TmFtZTsgICAgICAgICAvKiA8b2E+LzxkYT621NOmtcTIy8P7ICovDQotDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGR1QnVmW1pfQVBNTUlBX01BWF9TTVNQRFVfTEVOXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qINPJdFRwU0NBZGRy0/IrVFBEVdPy1+mzybXEUERVyv2+3bu6s+XH+LXE1rjV66GjKi8NCi19VF96QXBNbWlhX1Ntc1BjbWdsX0NuZiwgVF96QXBNbWlhX1Ntc1BjbWdsUmx0OyANCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAg1K3T7zpaX0FQTU1JQV9TbXNUc3ViTGlzdENuZl9FdihNTUlBLT5BVEkpDQotICC5psTcOrTTtOa0osb3wdC+2c/7z6K1xFNNUy1TVUJNSVTP+8+itcTP7NOmo7sNCi0gILbU06ZBVMP8we46zsSxvsSjyr21xCtDTUdMtcRTTVMtU1VCTUlU1+7W1b3hufvC66GjDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ0hlYWRJbmQ7IC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDOxLG+xKPKvc/CtcTP+8+izbeyv7LOyv3P1Mq+1rjKvqGjvLQrQ1NESMP8we61xMno1sOhow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DU0RIX05PU0hPVzogK0NTREjOtMno1sOjrNTysrvP1Mq+PHRvZGE+LCA8bGVuZ3RoPrLOyv3WtaOst9ax8LbU06Z0VHBPcmlnaW5hbEFkZHLA4NDNoaINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYlRleHRMZW5ndGihow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDS1M/Czayhow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpfQVBNTUlBX0NTREhfU0hPVzogK0NTREjS0cno1sPOqjGhow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1N0YXRWYWw7Lyogz/vPote0zKwsUERVxKPKvc/CzqrK/da1o6zOxLG+xKPKvc/Czqq0rrHtyr6hoyovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RvdGFsTnVtOyAvKiDX3LXEz/vPosz1yv0gKi8NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0N1ck51bTsgICAvKiC1scewtcTP+8+izPXK/SAqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7ICAgICAvKiC05rSizrvWw9DyusUuKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhck51bTsgICAgLyogttTTplRQVURMo6zX7rTz1rXOqlpfQVBNTUlBX01BWF9TTVNURVhUQ0hBUl9MRU4gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5hbWVGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRjczsgICAgICAgICAgIC8qtbHHsM/7z6LKudPDtcREQ1MqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdENoZ0ZsZzsgICAvKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9FTkFCTEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1NUQVRDSEFOR0VfRElTQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pBcE1taWFfVHBGbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0VHBGaXJzdE9jdGV0Ow0KLQ0KLSAgICBUX3pBcE1taWFfVHBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICB0VHBEZXN0QWRkcjsvKiDEv7XEtdjWty/UtLXY1rehoyovDQotDQotICAgIFRfekFwTW1pYV9QaG9uZVRleHQgICAgICAgICAgICAgICAgICAgICAgIHROYW1lOyAgICAgICAgIC8qIDxkYT621NOmtcTIy8P7LNPJYk5hbWVGZ772tqjKx7fxtObU2iAqLw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1RleHRMZW5ndGg7LyogzsSxvsr9vt3X1rf7s6S2yC7OqrLiytS5pL7fuPy4xCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotDQotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZXh0QnVmZmVyOy8qIM7Esb7K/b7du7qz5cf41rjV6y4qLw0KLX1UX3pBcE1taWFfU21zVHN1Ykxpc3RfQ25mLCBUX3pBcE1taWFfU21zVHN1Ykxpc3RSbHQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gINSt0+86Wl9BUE1NSUFfU21zVHN0YXRMaXN0Q25mX0V2KE1NSUEtPkFUSSkNCi0gILmmxNw6wdC+2c/7z6K1xFNNUy1TVEFUVVMtUkVQT1JUz+zTpqO7DQotICC21NOmQVTD/MHuOs7Esb7Eo8q9tcQrQ01HTLXEU01TLVNUQVRVUy1SRVBPUlTX7tbVveG5+8LroaMNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU3RhdFZhbDsvKiDP+8+i17TMrCxQRFXEo8q9z8LOqsr91rWjrM7Esb7Eo8q9z8LOqrSuse3KvqGjKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHBNc2dSZWZlcjsgIC8qIFRQRFW1xM/7z6Kyzr+8yv2jrFRQLU1SLiovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0Q2hnRmxnOyAgIC8qICBaX0FQTU1JQV9TVEFUQ0hBTkdFX0VOQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9ESVNBQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdHVzVmFsdWU7IC8qU0O2zM/7z6K0psDtuvO1xNe0zKzWtSxUUC1TVKGjKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7IC8qILTmtKLOu9bD0PK6xS4qLyAgDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUb3RhbE51bTsgLyog19y1xM/7z6LM9cr9ICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDdXJOdW07ICAgLyogtbHHsLXEz/vPosz1yv0gKi8NCi0NCi0NCi0gICAgVF96QXBNbWlhX1RwRm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdFRwRmlyc3RPY3RldDsvKiBUUERVss7K/bXEtdrSu7j219a92qGjyejWw8HLz/vPosDg0M28sNK70Kmyzsr91rjKvqGjKi8NCi0NCi0gICAgVF96QXBNbWlhX1RwQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgdFRwUmVjZWl2ZUFkZHI7ICAvKiDUtMfrx/PXtMyssai45s/7z6K1xL3TytW12Na3o6y8tNe0zKyxqLjmtcTUtLeitdjWt6GjVFAtUkEuKi8gICAgIA0KLQ0KLSAgICBUX3pBcE1taWFfVFpBbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICB0VHBTQ1RTOyAvKiDKsbzktMEuICovIA0KLQ0KLSAgICBUX3pBcE1taWFfVFpBbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICB0VHBEaXNjaGFnZVRpbWU7IC8qIM/7z6LKzbfFyrG85KGjICovDQotfVRfekFwTW1pYV9TbXNUc3RhdExpc3RfQ25mLCBUX3pBcE1taWFfU21zVHN0YXRMaXN0Umx0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9SZWFkU21SZXFfRXYNCi0guabE3KO6tNO05rSixve2wbbMz/vPog0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVhZEZsYWc7ICAgLyogMCC99rbBIC8gMSC2wciht6LLzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1NNUkVBREZMQUdfT05MWVJFQUQgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWl9BUE1NSUFfU01SRUFERkxBR19GT1JTRU5EICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXRDaGdGbGc7IC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU01Tz/vPote0zKy4xLHkserWvqO6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC/ybjEseTP+8+i17TMrCAwIC8gsru4xLHkz/vPote0zKwgMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU1RBVENIQU5HRV9FTkFCTEUgLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU1RBVENIQU5HRV9ESVNBQkxFIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcE1taWFfUmVhZFNtX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfUmVhZFNtQ25mX0V2DQotILmmxNyjurTTtOa0osb3tsG2zM/7z6K1xLvYuLQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlYWRGbGFnOyAgLyogMCC99rbBIC8gMSC2wciht6LLzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWl9BUE1NSUFfU01SRUFERkxBR19PTkxZUkVBRCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1NNUkVBREZMQUdfRk9SU0VORCAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgLyogMCDKp7DcIC8gMSCzybmmICovDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVhc29uOyAgIC8qIMqnsNzUrdLyICovIA0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdENoZ0ZsZzsgICAvKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9FTkFCTEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1NUQVRDSEFOR0VfRElTQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdHVzOyAgICAvKiC2zM/7z6LXtMysICovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgICAgICAvKiDWuLaoU01TtOa0osb3ICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgIC8qINa4tqjOu9bDICovDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3TGVuOyAgICAgIC8qINfWvdqzpLbILM6qsuLK1Lmkvt+4/LjEICovDQotICAgIFBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiTXNnOyAgICAgLyog1rjP8m1zZ7XE1rjV6yAqLw0KLX1UX3pBcE1taWFfUmVhZFNtX0NuZjsNCi0NCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1NhdmVTbVJlcV9Fdg0KLSC5psTco7q05rSitszP+8+io6yw/MCoTVTKsbXEtOa0og0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2F2ZUZsYWc7IC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILe1u9i05rSiveG5+8qxvau0y7Hq1r60+LvYDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU01TQVZFRkxBR19VUFJFUVVFU1QgICAgICAgICA6yc+y47TmtKLH68fzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU01TQVZFRkxBR19ERUxJVkVSTk9UUkVQIDpNVC1kZWxpdmVytOa0orK7yc+xqA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU0FWRUZMQUdfREVMSVZFUlJFUCAgICAgICAgOk1ULWRlbGl2ZXK05rSiyc+xqA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU0FWRUZMQUdfU1RBVFVTTk9UUkVQICA6TVQtc3RhdHVzIHJlcG9ydLTmtKKyu8nPsagNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9TTVNBVkVGTEFHX1NUQVRVU1JFUCAgICAgICAgIDpNVC1zdGF0dXMgcmVwb3J0tOa0osnPsagNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9TTVNBVkVGTEFHX0NCTVNOT1RSRVAgICAgICA6TVQtQ0JNc7TmtKKyu8nPsagNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9TTVNBVkVGTEFHX0NCTVNSRVAgICAgICAgICAgICAgOk1ULUNCTXO05rSiyc+xqA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU3RhdHVzOyAvKiC99rWxYlNhdmVGbGFnzqpaX0FQTU1JQV9TTVNBVkVGTEFHX1VQUkVRVUVTVMqx09DQpyAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHBNc2dSZWY7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog17TMrLGouObP+8+iU01TLVNUQVRVUy1SRVBPUlS1xFRQLU1SoaMgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqINa708PT2rWxYlNhdmVGbGFnserKts6qU01TLVNUQVRVUy1SRVBPUlTP+8+iyrGjrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDKtrHwuMPP+8+ittTTprXERUZzbXMgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtU3R5bGU7ICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE1Uz/vPorTmtKK3vcq9KLP9YlNhdmVGbGFnPTDN4imjug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTWVtM9PFz8i05rSiIDAgLyBVU0lNucy2qLTmtKIgMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfTUVNM19QUkVGRVJSRUQvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9VU0lNX0ZJWEVEDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZ1syXTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdMZW47ICAgICAgIC8qINfWvdqzpLbILCzOqrLiytS5pL7fuPy4xCAqLyAgICANCi0gICAgUEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJNc2c7ICAgICAvKiDWuM/ybXNntcTWuNXrICovDQotfVRfekFwTW1pYV9TYXZlU21fUmVxOw0KLSANCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfU2F2ZVNtQ25mX0V2DQotILmmxNyjurTmtKK2zM/7z6K1xLvYuLQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNhdmVGbGFnOyAvKiC9q8frx/PW0LXEYlNhdmVGbGFntPi72CAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgLyogtOa0os671sMsMHhmZmZmse3KvsixyqEgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgICAgIC8qILTmyOu1xG1lbSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgLyogtOa0or3hufsgMCDKp7DcIDEgs8m5pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfT1BFUkFUSU9OX1NVQ0NFU1MgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9PUEVSQVRJT05fRkFJTFVSRSAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsgIC8qIMqnsNzUrdLyICovDQotfVRfekFwTW1pYV9TYXZlU21fQ25mOw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9MaXN0U21SZXFfRXYNCi0guabE3KO6x+vH87C017TMrMHQvtnP+8+iDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dTdGF0dXM7ICAvKiC2zM/7z6LXtMysICovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdENoZ0ZsZzsgLyogU01Tz/vPote0zKy4xLHkserWviAqLyANCi19VF96QXBNbWlhX0xpc3RTbV9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX0RlbGV0ZVNtUmVxX0V2DQotILmmxNyjusm+s/3P+8+ix+vH8w0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVsRmxhZzsgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMm+s/3M9bz+oaPI9LfHMKOsx9LT63dJbmRleM2syrGz9s/WyrGjrLr2wtR3SW5kZXijrNLUYkRlbEZsYWfOqte8oaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWl9BUE1NSUFfU01TREVMRkxHX0JZSURYICAgICAgICAgICAwIChvciBvbWl0dGVkKSDJvrP91ri2qNDyusW1xM/7z6KjqMSsyM+jqSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWl9BUE1NSUFfU01TREVMRkxHX1JFQUQgICAgICAgICAgICAxICDJvrP9y/nT0NLRtsG1xM/7z6INCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqWl9BUE1NSUFfU01TREVMRkxHX1JFQURTRU5EICAgICAgICAgICAgICAgMiAgyb6z/cv509DS0bbBtcS6zdLRt6LLzbXEz/vPog0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpaX0FQTU1JQV9TTVNERUxGTEdfUkVBRFNFTkRVTlNFTkQgICAzICDJvrP9y/nT0NLRtsG1xKOs0tG3osvNtcSjrLrNzrS3osvNtcTP+8+iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlpfQVBNTUlBX1NNU0RFTEZMR19BbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgyb6z/cv509DP+8+iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcE1taWFfRGVsZXRlU21fUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9EZWxldGVTbUNuZl9Fdg0KLSAgICAgICBaX0FQTU1JQV9TbU1lbUF2YWlsUnNwX0V2KE1NSUEtPlBCKQ0KLSC5psTco7rJvrP9z/vPorvYuLQNCi0gICAgICAgzai45s/s06bP+8+iDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lbVR5cGU7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247DQotfVRfekFwTW1pYV9EZWxldGVTbV9DbmYsVF96QXBNbWlhX01lbUF2YWlsX1JzcDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfU21NZW1BdmFpbEluZF9FdihQQi0+TU1JQSkNCi0guabE3KO6tszP+8+itOa0osb3v8nTwy+yu7/J08PNqNaqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdmFpbGFibGU7IC8qIFpfQVBNTUlBX1NNTUVNT1JZX1VOQVZBSUxBQkxFIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1NNTUVNT1JZX0FWQUlMQUJMRSAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfekFwTW1pYV9TbU1lbUF2YWlsX0luZDsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAg1K3T7zpaX0FQTU1JQV9QYlByZWZNc2dTdG9DbmZfRXYoUEItPk1NSUEpDQotICC5psTcOs/7z6LK19GhtOa0osb3yejWw7XEz+zTpqO7DQotICC21NOmQVTD/MHuOlBCttRjcG1z1rTQ0MP8we61xL3hufsNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyAgICAgLyogtOa0or3hufsgMCDKp7DcIDEgs8m5pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfT1BFUkFUSU9OX1NVQ0NFU1MgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9PUEVSQVRJT05fRkFJTFVSRSAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsgICAgLyogyqew3NSt0vIgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNvbW1hbmRJbmQ7IC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILbU06a1xMP8we7WuMq+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU0NNRFRZUEVfU0VUICAgICA6IMno1sPD/MHuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU0NNRFRZUEVfUVVFUlk6ILbBw/zB7iy2wcP8we6jrNa7t7W72LWxx7BiTWVtbiwgd01lbW5Vc2VkLCB3TWVtblRvdGFstcTWtaGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtMTsgICAgICAgLyogytfRobbBLMHQvtmjrMm+s/205rSixvcuKi8gDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW0yOyAgICAgICAvKiDK19Ght6LLzaOs0LS05rSixvcuKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW0zOyAgICAgICAvKiDK19GhTVTP+8+isaO05rTmtKLG9y4qLyAgDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNZW0xVXNlZDsgICAvKiBtZW0x0tGxo7TmtcTP+8+izPXK/aOsyKHWtaOoMKOtNTExo6mhoyovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNZW0xVG90YWw7ICAvKiBtZW0x1+6087/JsaO05rXEz/vPosz1yv2jrMih1rWjqDCjrTUxMaOpoaMqLw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3TWVtMlVzZWQ7ICAgLyogbWVtMtLRsaO05rXEz/vPosz1yv2jrMih1rWjqDCjrTUxMaOpoaMqLyANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01lbTJUb3RhbDsgIC8qIG1lbTLX7rTzv8mxo7TmtcTP+8+izPXK/aOsyKHWtaOoMKOtNTExo6mhoyovDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNZW0zVXNlZDsgICAvKiBtZW0z0tGxo7TmtcTP+8+izPXK/aOsyKHWtaOoMKOtNTExo6mhoyovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNZW0zVG90YWw7ICAvKiBtZW0z1+6087/JsaO05rXEz/vPosz1yv2jrMih1rWjqDCjrTUxMaOpoaMqLw0KLX1UX3pBcE1taWFfUGJQcmVmTXNnU3RvX0NuZjsgDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1BiVHBtclVwZGF0ZVJlcV9FdiAoTU1JQS0+UEIpDQotILmmxNyjuk1PtszP+8+it6LLzbPJuaa686OszajWqlBCtOa0orncwO3Eo7/puPzQwlRQLU1SDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcE1zZ1JlZjsgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog08PT2rj80MJFRnNtc3O1xFRQLU1SoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1sWJNc2dTZW5kU3R5bGXOqlpfQVBNTUlBX01TR19TVE9SRV9TRU5EyrGjrA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIM2syrG7udPDwLS72Mzu1sFFRnNtc7XEUERV1tAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0cnB0UmVxRmxnOyAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog17TMrLGouObOtMfrx/MgMC/XtMyssai45tLRx+vH8yAxDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1sWJNc2dTZW5kU3R5bGXOqlpfQVBNTUlBX01TR19TVE9SRV9TRU5EyrHT0NCnoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFBC08PT2rj80MJFRnNtc7XEU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU1RBVFVTUkVQT1JUX05PVFJFUVVJUkVELw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU1RBVFVTUkVQT1JUX1JFUVVJUkVEIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dTZW5kU3R5bGU7IC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTU/P+8+it6LLzbe9yr2jug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDWsb3Tt6LLzSAwIC8gtOa0oreiy80gMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9NU0dfRElSRUNUX1NFTkQgLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9NU0dfU1RPUkVfU0VORCAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1sWJNc2dTZW5kU3R5bGXOqlpfQVBNTUlBX01TR19TVE9SRV9TRU5EyrHT0NCnoaMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNNU7TmtKLG96OsyKHWtc2sK0NQTVO1xDxtZW0+IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgLyq1sWJNc2dTZW5kU3R5bGXOqlpfQVBNTUlBX01TR19TVE9SRV9TRU5EyrHT0NCnoaNFRnNtc7XEzrvWw7rFICovDQotfVRfekFwTW1pYV9QYlRwbXJVcGRhdGVfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYkluaXRDbXBsdEluZF9FdiAoUEItLT5NTUlBKQ0KLSAgICAgICBaX0FQTU1JQV9acGJpY0luZF9FdihNTUlBLS0+QVRJKQ0KLSC5psTco7rNqNaqyc+y4yxQQrTmtKK53MDtxKO/6dLRs/XKvLuvzeqzyQ0KLSC21NOmQVTD/MHuo7orWlBCSUOjujxyZXN1bHQ+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7IA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT3ByVHlwZTsgLyog0rXO8cDg0M3WuMq+o7owIFNNU6OsIDEgUEIgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgIC8qIL3hufvWuMq+o7oxILPJuaYgLyAwyqew3CAqLyAgIA0KLX1UX3pBcE1taWFfUGJJbml0Q21wbHRfSW5kLFRfekFwTW1pYV9acGJpY19JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1BiTXRQYXJhSW5kX0V2IChNTUlBLS0+UEIpDQotILmmxNyjuk1NSUG45taqUEIrQ05NSbXEss7K/TxtdD4NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXRQYXJhOyAgLyogIEFUw/zB7itDTk1Jss7K/TxtdD4gICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyANCi19VF96QXBNbWlhX1BiTXRQYXJhX0luZDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86Wl9BUE1NSUFfUGJRdWVyeVNtc01heEluZGV4UmVxX0V2KE1NSUEtPlBCKQ0KLSAguabE3Dqy6dGvtbHHsLbMz/vPorTmtKLG99ans9bX7rTzy/fS/Q0KLSAgttTTpkFUw/zB7jpjbWdkPT8NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96QXBNbWlhX1BiUXVlcnlTbXNNYXhJbmRleF9SZXEsIFRfekFwTW1pYV9QYlByZWZNc2dTdG9UZXN0X1JlcQ0KLSxUX3pBcE1taWFfUGJSZWFkU2V0TnVtX1JlcSxUX3pBcE1taWFfUGJSZWFkTGFzdEV4dEVycl9SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOlpfQVBNTUlBX1BiUXVlcnlTbXNNYXhJbmRleENuZl9FdihQQi0+TU1JQSkNCi0gILmmxNw6sunRr7Wxx7C2zM/7z6K05rSixvfWp7PW1+6088v30v21xL3hufsNCi0gILbU06ZBVMP8we46Y21nZD0/DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXhNYXg7ICAvKiArY3Btc8no1sO1xG1lbTHWp7PWtcTX7rTzy/fS/aOoy/fS/dfu0KG00zG/qsq8o6kgKi8NCi19VF96QXBNbWlhX1BiUXVlcnlTbXNNYXhJbmRleF9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1BiRmluZEluZGV4UmVxX0V2DQotILmmxNyjusfrx/PB0L7Ztee7sLG+vMfCvCjWuLaotOa0osb3KQ0KLSBBVMP8we6juitDUEJSDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMaXN0RmxhZzsgLyogMCBmb3IgQ1BCUiAxIGZvciBtbw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BCSU5ERVhSRUFEX0ZPUkNQQlINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9QQklOREVYUkVBRF9GT1JNTyAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmRleDJGZzsgIC8qINa4yr53SW5kZXgy09DQp9DUo6zIoda1DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfVkFMSUQgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDE7DQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4MjsNCi19VF96QXBNbWlhX1BiRmluZEluZGV4X1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfUGJGaW5kSW5kZXhFbmRDbmZfRXYgDQotILmmxNyjusHQvtm157uwsb68x8K8o6y94cr4z/vPog0KLSBBVMP8we6juitDUEJSDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAvKiAwIMqnsNwgMSCzybmmICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVhc29uOyAgICAvKiDKp7Dc1K3S8iAqLw0KLX1UX3pBcE1taWFfUGJGaW5kSW5kZXhFbmRfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYkZpbmRUZXh0Q25mX0V2DQotICAgICAgIFpfQVBNTUlBX0NwYmZTZXRDbmZfRXYNCi0guabE3KO6t7W72LC0sLTOxLG+sunRr7XEveG5+w0KLSAgICAgICCwtHRleHSy6dXStee7sLG+DQotIEFUw/zB7qO6K0NQQkYNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgIC8qIDAgyqew3CAxILPJuaYgKi8NCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsgICAgLyogyqew3NSt0vIgKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VyTnVtOyAgIC8qILWxx7DM9cr9ICovDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1RvdGFsTnVtOyAvKiDX3LXEwdC+2cz1yv0gKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpZGRlbkZnOjE7ICAgLyrWuMq+YkhpZGRlbtPQ0KfQ1CovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbmRleEZnOjE7ICAgIC8q1rjKvmluZGV409DQp9DUKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bUZnOjE7ICAgICAgLyog1rjKvnRCY2ROdW3T0NCn0NQgICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUZXh0Rmc6MTsgICAgIC8qINa4yr50VGV4dNPQ0KfQ1CAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU25lRmc6MTsgICAgICAvKiDWuMq+dFNuZdPQ0KfQ1CAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW1haWxGZzoxOyAgICAvKiDWuMq+dEVtYWls09DQp9DUICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBbnJGZzoxOyAgICAgIC8qINa4yr50QW5y09DQp9DUICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHcnBGZzoxOyAgICAgIC8qINa4yr50R3Jw09DQp9DUICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpZGRlbjsgICAgIC8qIDAgbm90IGhpZGRlbiAxIGhpZGRlbiAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsNCi0NCi0gICAgVF96X0NhbGxOdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE51bTsNCi0NCi0gICAgVF96QXBNbWlhX1Bob25lVGV4dCAgICAgICAgICAgICAgICAgICAgICB0VGV4dDsgDQotICAgIFRfekFwTW1pYV9TbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNuZTsgIC8qILjDtee7sLzHwry21NOmtcS12rb+uPbIy8P7Ki8NCi0gICAgVF96QXBNbWlhX0VtYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0RW1haWw7IC8qILXn19PTys/ktdjWtyovDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFucjsgIC8qILi9vNO1xLrFwusqLw0KLSAgICBUX3pBcE1taWFfR3JwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRHcnA7ICAvKiCx7cP3uMO157uwvMfCvM/uyvTT2sTHuPZHcm91cCovDQotfVRfekFwTW1pYV9QYkZpbmRUZXh0X0NuZixUX3pBcE1taWFfQ3BiZlNldF9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT0gILXnu7CxvrTmtKK53MDtILK/t9YgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYkZpbmRUZXh0UmVxX0V2DQotILmmxNyjusfrx/OwtM7Esb6y6dXStee7sLG+vMfCvCjWuLaotOa0osb3u/LIq7K/tOa0osb3KQ0KLSBBVMP8we6juitDUEJGDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0gICAgVF96QXBNbWlhX1Bob25lVGV4dCAgICAgICAgICAgICAgICAgICAgICB0VGV4dDsNCi19VF96QXBNbWlhX1BiRmluZFRleHRfUmVxOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYkVkaXRDbmZfRXYNCi0guabE3KO61Pa807vyyb6z/bzHwry1xL3hufsNCi0gQVTD/MHuo7orQ1BCVw0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdXcml0dGVuSW5kZXg7ICAvKiC4w7Xnu7C8x8K8saO05rXEy/fS/brFKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247DQotfVRfekFwTW1pYV9QYkVkaXRfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSDUrdPvo7paX0FQTU1JQV9QYlN0b3JhZ2VTdGF0dXNSZXFfRXYNCi0guabE3KO6sunRr7TmtKLG97XEzNjQ1Lyw17TMrA0KLSBBVMP8we6jug0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUXVlcnlGbGFnOyAvKg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1BCUVVFUllGTEFHX0ZPUkNQQlMgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1BCUVVFUllGTEFHX0ZPUkNQQlIgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1BCUVVFUllGTEFHX0ZPUkNQQkYgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIFpfQVBNTUlBX1BCUVVFUllGTEFHX0ZPUkNQQlcgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi19VF96QXBNbWlhX1BiU3RvcmFnZVN0YXR1c19SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1pjcGJxU2V0UmVxX0V2KEFUSS0+TU1JQSkNCi0gICAgICAgICAgICAgICAgIFpfQVBNTUlBX1BiUmVhZENhcGFSZXFfRXYoTU1JQS0+U1RNKQ0KLSC5psTco7qy6dGvtbHHsKOoQ1BCU9Gh1PG1xKOptOa0osb3ttTTprXEuPfQxc+i19a2zsjdwb8NCi0gttTTpkFUw/zB7qO6K1pDUEJRDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEluZGV4RmxnOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCx6sq2YlNldEluZGV409DQp9DUDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaUFNfVkFMSUQ6ICBiU2V0SW5kZXjT0NCnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaUFNfSU5WQUxJRDogIGJTZXRJbmRleM7e0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0SW5kZXg7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC157uwsb68r7rPy/fS/aOsttTH68fzw/zB7g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILWxuMOyzsr9yLHKocqxo6yy6dGvy/nT0LXnu7Cxvg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqvK+6z9DFz6IgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotfVRfekFwTW1pYV9aY3BicVNldF9SZXEsVF96QXBNbWlhX1BiUmVhZENhcGFjaXR5X1JlcTsNCi0NCi10eXBlZGVmIHN0cnVjdCB7ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJdGVtQ2FwW1pfQVBNTUlBX0NVUl9UWVBFX0VGTlVNXTsgIC8qIMO/uPbX1rbOKEVGKcjdwb8gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkl0ZW1Db3VudDsgIC8qINfWts621NOmtcTP7sS/KEVGu/K8x8K8Kcr9xL8gKi8NCi19VF96QXBNbWlhX0l0ZW1JbmZvOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNldEluZGV4OyAgLyogtee7sLG+vK+6z8v30v0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW50cnlOdW07ICAvKiC1scewtee7sLG+vK+6z7zHwrzM9cS/19zK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgVF96QXBNbWlhX0l0ZW1JbmZvICAgICAgICAgICAgICAgICAgICAgdEFuckluZm87ICAgICANCi0gICAgVF96QXBNbWlhX0l0ZW1JbmZvICAgICAgICAgICAgICAgICAgICAgdEdycE5hbWVJbmZvOyANCi0gICAgVF96QXBNbWlhX0l0ZW1JbmZvICAgICAgICAgICAgICAgICAgICAgdEVtYWlsSW5mbzsgICANCi0gICAgVF96QXBNbWlhX0l0ZW1JbmZvICAgICAgICAgICAgICAgICAgICAgdFNuZUluZm87ICAgICANCi19VF96QXBNbWlhX1BiU2V0Q2FwYTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfWmNwYnFTZXRDbmZfRXYoTU1JQS0+QVRJKQ0KLSAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUGJSZWFkQ2FwYUNuZl9FdihTVE0tPk1NSUEpDQotILmmxNyjurvYuLS1scewo6hDUEJT0aHU8bXEo6m05rSixve21NOmtcS499DFz6LX1rbOyN3Bvw0KLSC21NOmQVTD/MHuo7orWkNQQlENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtOyAgLyog1rjKvnRQYlNldENhcGHK/dfp1tDT0NCntcSzydSxuPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7LyogMCDKp7DcIDEgs8m5piAqLw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYXNvbjsgICAgLyogyqew3NSt0vIgKi8NCi0NCi0gICAgVF96QXBNbWlhX1BiU2V0Q2FwYSAgICAgICAgICAgICAgICAgICAgICAgdFBiU2V0Q2FwYVtaX0FQTU1JQV9QQl9DQVBBX01BWF9OVU1dOw0KLX1UX3pBcE1taWFfWmNwYnFTZXRfQ25mLFRfekFwTW1pYV9QYlJlYWRDYXBhY2l0eV9DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1pjcGJxUXVlcnlDbmZfRXYoTU1JQS0+QVRJKQ0KLSAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUGJSZWFkU2V0TnVtQ25mX0V2KFNUTS0+TU1JQSkNCi0guabE3KO6u9i4tLXnu7Cxvryvus/K/cS/DQotILbU06ZBVMP8we6juitaQ1BCUT8NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2V0TnVtOyAgLyogtee7sLG+vK+6z8r9xL8qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0Oy8qIDAgyqew3CAxILPJuaYgKi8NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247ICAgIC8qIMqnsNzUrdLyICovDQotfVRfekFwTW1pYV9aY3BicVF1ZXJ5X0NuZixUX3pBcE1taWFfUGJSZWFkU2V0TnVtX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0g1K3T76O6Wl9BUE1NSUFfWmVlclJlYWRDbmZfRXYoTU1JQS0+QVRJKQ0KLSAgICAgICAgICAgICAgICAgWl9BUE1NSUFfUGJSZWFkTGFzdEV4dEVyckNuZl9FdihTVE0tPk1NSUEpDQotILmmxNyjurLp0a/X7r380ru0zlBCtOa0orLZ1/e07c7zttTTprXEwKnVubTtzvPC6w0KLSC21NOmQVTD/MHuo7orWkVFUj8NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXh0RXJyOyAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog1+69/FBCtOa0orLZ1/e07c7zttTTprXEwKnVubTtzvPC6w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BCX0VYVEVSUl9FWFRfRlVMTCAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BCX0VYVEVSUl9BTlJfRlVMTCAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BCX0VYVEVSUl9TTkVfRlVMTCAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BCX0VYVEVSUl9FTUFJTF9GVUxMICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1BCX0VYVEVSUl9HUlBfRlVMTCAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96QXBNbWlhX1plZXJSZWFkX0NuZixUX3pBcE1taWFfUGJSZWFkTGFzdEV4dEVycl9DbmY7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotINSt0++julpfQVBNTUlBX1NDcGJ3U2V0UmVxX0V2KEFUSS0+TU1JQSkoWl9BUE1NSUFfQ29tbW9uX0NuZrvYuLQpDQotICDUrdPvo7paX0FQTU1JQV9TQ3BiclNldENuZl9FdihNTUlBLT5BVEkpDQotICAg1K3T76O6Wl9BUE1NSUFfUGJTRWRpdFJlcV9FdihNTUlBLT5QQikNCi0gICAg1K3T76O6Wl9BUE1NSUFfUGJTRmluZEluZGV4Q25mX0V2IChQQi0+TU1JQSkNCi0guabE3KO6saO05rTmusXC6w0KLSAgICAgICC3tbvYsLS8x8K8sunRr7XEveG5+w0KLSAgICAgICDU9rzTu/LJvrP9vMfCvCjWuLaotOa0osb3KQ0KLSAgICAgICDB0L7Ztee7sLG+vMfCvA0KLSC21NOmQVTD/MHuo7orU0NQQlcsK1NDUEJSDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgICAgICAgICAvKiDX7tChtNMwv6rKvCAqLw0KLQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW5kZXhGZzoxOyAgICAgICAgIC8qINa4yr53SW5kZXjT0NCn0NQqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtMUZnOjE7ICAgICAgICAgLyog1rjKvmJOdW0x09DQp9DUo6zIoda1MM7e0KejrDHT0NCnICAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtMkZnOjE7ICAgICAgICAgLyog1rjKvmJOdW0y09DQp9DUICDIoda1MM7e0KejrDHT0NCnICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW0zRmc6MTsgICAgICAgICAvKiDWuMq+Yk51bTPT0NCn0NQgIMih1rUwzt7Qp6OsMdPQ0KcgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bTRGZzoxOyAgICAgICAgIC8qINa4yr5iTnVtNNPQ0KfQ1CAgyKHWtTDO3tCno6wx09DQpyAqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGV4dEZnOjE7ICAgICAgICAgLyog1rjKvnRUZXh009DQp9DUIMih1rUwzt7Qp6OsMdPQ0KcgKi8NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVtYWlsRmc6MTsgICAgICAgIC8qINa4yr5FbWFpbNPQ0KfQ1CDIoda1MM7e0KejrDHT0NCnICovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTbmVGZzoxOyAgICAgICAgICAvKiDWuMq+dFNuZdPQ0KfQ1CDIoda1MM7e0KejrDHT0NCnICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDbWRGbGc7ICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1t7bOpzoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX0FQTU1JQV9DSElOQV9NT0JJTEVfQ01EDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfWlRFX09XTl9DTUQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TnVtMTsgICAgICAgICAgICAgIC8qINfWt/u0rsDg0M2jrNLGtq+157uwusXC66Ossru089PaMzLX1r3ao7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMihuupaX0FQTU1JQV9TY2FsbE51bV9NYXhMZW4gKi8NCi0gICAgVF96X0NhbGxOdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE51bTI7ICAgICAgICAgICAgICAvKiA8bnVtMj6jutfWt/u0rsDg0M2jrLDsuau157uwusXC66Ossru089PaMzLX1r3ao7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIobrqWl9BUE1NSUFfU2NhbGxOdW1fTWF4TGVuICovDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHROdW0zOyAgICAgICAgICAgICAgLyogPG51bTM+o7rX1rf7tK7A4NDNo6zXodWstee7sLrFwuujrLK7tPPT2jMy19a92qO7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKG66lpfQVBNTUlBX1NjYWxsTnVtX01heExlbiAqLw0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0TnVtNDsgICAgICAgICAgICAgIC8qIDxudW00PqO619a3+7SuwODQzaOsRkFYusXC66Ossru089PaMzLX1r3ao7sNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIobrqWl9BUE1NSUFfU2NhbGxOdW1fTWF4TGVuICovDQotICAgIFRfekFwTW1pYV9QaG9uZVRleHQgICAgICAgICAgICAgICAgICAgICAgIHRUZXh0OyAgICAgICAgICAgICAvKiA8dGV4dD6jutfWt/u0rsDg0M2jrLHtyr7Q1cP7oaMgKi8NCi0gICAgVF96QXBNbWlhX0VtYWlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEVtYWlsOyAgICAgICAgICAgIC8qIDxlbWFpbD6jutfWt/u0rsDg0M2jrLHtyr5lbWFpbLXY1rehow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMS/x7CjrLjD19a2zta71Nq05rSivenWys6qVVNJTb+oyrHT0NCno6zH0rK7tPPT2jY019a92qGjDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKG66lpfQVBNTUlBX0VNQUlMX01heExlbiAqLw0KLSAgICBUX3pBcE1taWFfU25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U25lOyAgLyogse3KvrXatv7D+7PGKi8NCi19IA0KLVRfekFwTW1pYV9TQ3Bid1NldF9SZXEsVF96QXBNbWlhX1NDcGJyU2V0X0NuZixUX3pBcE1taWFfUGJTRWRpdF9SZXEsVF96QXBNbWlhX1BiU0ZpbmRJbmRleF9DbmY7DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gINSt0+86IFpfQVBNTUlBX1Ntc1Rjb21MaXN0Q25mX0V2KE1NSUEtPkFUSSkNCi0gILmmxNw6wdC+2c/7z6K1xFNNUy1DT01NQU5Ez+zTpqO7DQotICC21NOmQVTD/MHuOs7Esb7Eo8q9tcQrQ01HTLXEU01TLUNPTU1BTkTX7tbVveG5+8LroaMNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU3RhdFZhbDsgICAvKiDP+8+i17TMrCxQRFXEo8q9z8LOqsr91rWjrM7Esb7Eo8q9z8LOqrSuse3KvqGjKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVHBDb21tYW5kVHlwZTsgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogw/zB7sDg0M2jrFRQLUNULg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDAwMDAwMDAgsunRr8eww+bM4b27tcTP4LnYtcRTTQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDAwMDAwMDEgyKHP+8eww+bM4b27tcTP4LnYtcRTTbXE17TMrLGouObH68fzIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDAwMDAwMTAgyb6z/ceww+bM4b27tcTP4LnYtcRTTQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMDAwMDAwMTEgvKS77seww+bM4b27tcTP4LnYtcRTTbXE17TMrLGouObH68fzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwMDAwMDEwMC4uMDAwMTExMTEgsaPB9A0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTExMDAwMDAuLjExMTExMTExIFZhbHVlcyBzcGVjaWZpYyBmb3IgZWFjaCBTQw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4OyAgICAgICAgLyogtOa0os671sPQ8rrFLiovICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXRDaGdGbGc7ICAgLyogIFpfQVBNTUlBX1NUQVRDSEFOR0VfRU5BQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBaX0FQTU1JQV9TVEFUQ0hBTkdFX0RJU0FCTEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VG90YWxOdW07IC8qINfctcTP+8+izPXK/SAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Q3VyTnVtOyAgIC8qILWxx7C1xM/7z6LM9cr9ICovDQotDQotICAgIFRfekFwTW1pYV9UcEZvICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRUcEZpcnN0T2N0ZXQ7IC8qIFRQRFWyzsr9tcS12tK7uPbX1r3aoaPJ6NbDwcvP+8+iwODQzbyw0rvQqbLOyv3WuMq+oaMqLw0KLX1UX3pBcE1taWFfU21zVGNvbUxpc3RfQ25mLCBUX3pBcE1taWFfU21zVGNvbUxpc3RSbHQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gINSt0+86Wl9BUE1NSUFfQ2JzX1RjYm1MaXN0Q25mX0V2KE1NSUEtPkFUSSkNCi0gILmmxNw6wdC+2c/7z6K1xENCU8/s06ajuw0KLSAgttTTpkFUw/zB7jrOxLG+xKPKvbXEK0NNR0y1xENCTdfu1tW94bn7wuuhow0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpc3RFbmRGZzsgICAgICAvKjEgse3KvsHQvtm94cr4Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU3RhdFZhbDsNCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7ICAgICAgICAgLyq05rSixvfW0LXEzrvWwyovIA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNaWQ7ICAgICAgICAgICAvKrWxx7DJz7Goz/vPorXETWVzc2FnZUlkKi8NCi0NCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3U247ICAgICAgICAgICAgLyq1scewyc+xqM/7z6K1xFNlcnJpYWxOdW1iZXIqLyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3VyUGFnZTsgICAgICAgLyq1scew0rMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUb3RhbFBhZ2U7ICAgICAvKtfc0rPK/SovDQotICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRjczsgICAgICAgICAgIC8qtbHHsM/7z6LKudPDtcREQ1MqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNc2dMZW47ICAgICAgICAvKlRFWFTSs9bQyrW8ysr9vt2zpLbIo6yyu7qsz/vPos23s6S2yCovICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0Q2hnRmxnOyAgIC8qICBaX0FQTU1JQV9TVEFUQ0hBTkdFX0VOQUJMRQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgWl9BUE1NSUFfU1RBVENIQU5HRV9ESVNBQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkJ1ZltaX0FQTU1JQV9DQlNfTUFYX1RFWFRfUEFHRV9MRU5dOyAvKkNCUyBURVhUz/vPotKzo6zO3s/7z6LNtyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96QXBNbWlhX0Nic19UY2JtTGlzdF9DbmYsIFRfekFwTW1pYV9DYnNfVGNibUxpc3RSbHQ7ICANCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAg1K3T7zpaX0FQTU1JQV9DYnNfUGNibUxpc3RDbmZfRXYoTU1JQS0+QVRJKQ0KLSAguabE3DrB0L7Zz/vPorXEQ0JTz+zTpqO7DQotICC21NOmQVTD/MHuOlBEVcSjyr21xCtDTUdMtcRDQk3X7tbVveG5+8LroaMNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMaXN0RW5kRmc7ICAgICAgLyoxILHtyr7B0L7ZveHK+CovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1N0YXRWYWw7DQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0luZGV4OyAgICAgICAgIC8qtOa0osb31tC1xM671sMqLyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ0xlbjsgICAgICAgIC8qUERV0rPW0Mq1vMrK/b7ds6S2yKOsuqzP+8+izbezpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXRDaGdGbGc7ICAgLyogIFpfQVBNTUlBX1NUQVRDSEFOR0VfRU5BQkxFDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBaX0FQTU1JQV9TVEFUQ0hBTkdFX0RJU0FCTEUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkJ1ZltaX0FQTU1JQV9DQlNfTUFYX1BEVV9QQUdFX0xFTl07IC8qQ0JTIFBEVc/7z6LSs6OsuqzP+8+izbejrL7fzOXE2sjdvPvXosrNsr+31iovDQotfVRfekFwTW1pYV9DYnNfUGNibUxpc3RfQ25mLCBUX3pBcE1taWFfQ2JzX1BjYm1MaXN0Umx0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICDUrdPvOlpfQVBNTUlBX0NwbXNUZXN0Q25mX0V2KE1NSUEtPkFUSSkNCi0gICAgICAgWl9BUE1NSUFfUGJQcmVmTXNnU3RvVGVzdENuZl9FdihQQi0+TU1JQSkNCi0gILmmxNw6z/vPosrX0aG05rSixvey4srUw/zB7rXEz+zTpqO7DQotICC21NOmQVTD/MHuOitDUE1TsuLK1MP8we61xNfu1tW94bn7wuuhow0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMVsyXTsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTGlzdE1lbTFbWl9BUE1NSUFfU01TTUVNX01BWF9SQU5HRV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW0xTnVtOyAgICAgLyogbWVtMdans9a1xFNNU7TmtKLG97j2yv0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJMaXN0TWVtMltaX0FQTU1JQV9TTVNNRU1fTUFYX1JBTkdFXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lbTJOdW07ICAgICAvKiBtZW0y1qez1rXEU01TtOa0osb3uPbK/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzM7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTGlzdE1lbTNbWl9BUE1NSUFfU01TTUVNX01BWF9SQU5HRV07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW0zTnVtOyAgICAgLyogbWVtM9ans9a1xFNNU7TmtKLG97j2yv0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc0Ow0KLX1UX3pBcE1taWFfQ3Btc1Rlc3RfQ25mLFRfekFwTW1pYV9QYlByZWZNc2dTdG9UZXN0X0NuZjsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86Wl9BUE1NSUFfQ29tbW9uQ25mX0V2IChNTUlBLT5BVEkpDQotICC5psTcOrLp0a+6zcno1sPD/MHutcTH68fzus272Li0DQotICC21NOmQVTD/MHuOsv509BBVMP8we7WtNDQtcS94bn7o6xvay9lcnJvciAvY2Vyo7orZXJyb3I6IMv509BBVMP8we61xL3hufujrNCvtPjUrdLyyrHS1ENFRVLJz7GoDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyogVGhlIHNvdXJjZSBpbmRleCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC438vEzrvOqtS0xKO/6brFLMih1rW8+7rqtqjS5SwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC1zcvEzrvOqtPrxKO/6brFttTTprXE1LTL99L9usUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDS1M/CtNNtbWlhtb1hdGm907/aYkRlc0luZGV40+u0y82sICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogVGhlIGRlc3RpbmF0aW9uIGluZGV4Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgICAvKiBBVMP8we694bn7IFpfQVBNTUlBX09QRVJBVElPTl9TVUNDRVNTL1pfQVBNTUlBX09QRVJBVElPTl9GQUlMVVJFKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgICAgICAgICAvKiBUaGUgb3BlcmF0b3IgdHlwZSwgcmVmZXIgdG8gdGhlIEludGVyZmFjZSAqLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDYXVzZTsgICAgICAgICAgICAvKiBiUmVzdWx0ID0gWl9BUE1NSUFfT1BFUkFUSU9OX0ZBSUxVUkXT0NCnKi8NCi19VF96QXBNbWlhX0NvbW1vbl9DbmYsIFRfekFwTW1pYV9DbWdsQ29tbW9uUmx0Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQot1K3T7zpaX0FQTU1JQV9TbXNabWVuYVJlcV9FdihBVEktPk1NSUEpICjP7NOmIFpfQVBNTUlBX0NvbW1vbkNuZl9FdikNCi0gICAgIFpfQVBNTUlBX1BiTWVtQ2FwYVJlcV9FdihNTUlBLT5QQikgKM/s06YgWl9BUE1NSUFfUGJDb21tb25DbmZfRXYpDQotuabE3DrJz7Ljt6LLzc/CwLS1xFNNU7TmtKLE3MGmzajWqg0KLbbU06ZBVMP8we6juitaTUVOQT08YXZhaWw+DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXZhaWw7ICAgICAgICAvKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU01TtOa0osTcwaajurK7wvovwvoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9BUE1NSUFfU01TTUVNX0ZSRUUvDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfQVBNTUlBX1NNU01FTV9GVUxMIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lbVR5cGU7ICAgLyowOlNNICAxOk1FKi8NCi19VF96QXBNbWlhX1Ntc1ptZW5hX1JlcSxUX3pBcE1taWFfUGJNZW1DYXBhX1JlcTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86Wl9BUE1NSUFfVWljY09rSW5kX0V2ICwgWl9BUE1NSUFfUGJVaWNjT2tJbmRfRXYNCi0gILmmxNw61NrTptPDzeqzybP1yry7r7rzo6y4+Ma9zKjJz7GoveG5+6GjDQotICC21NOmQVTD/MHuOg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgIC8qz/vPotS0y/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAvKs/7z6LEv7XEy/fS/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBcHBsTW9kZTsgICAvKsv50aHW0LXE1sbKvQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxo7pVU0lN1sbKvQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMqO6U0lN1sbKvQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0luaXRSZXN1bHQ7ICAgLyoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC/qLP1yry7r9e0zKwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAzMCAgv6jN6sirv8nTww0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDMxICC/qLv5sb6/ydPDDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgy7XD9zXM9brztcTEx9CpzsS8/rbByKHT0LTtzvOjrLWryc+y48jUyLu/ydLU1/fSu9CpstnX9w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE1ICCz9cq8u6/Kp7Dco6xaX0FQTU1JQV9TSU1XUk9OR19FUlINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxMCAgWl9BUE1NSUFfTk9TSU1fRVJSDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotfVRfekFwTW1pYV9VaWNjT2tfSW5kLFRfekFwTW1pYV9QYlVpY2NPa19JbmQ7DQotDQotLyqy6dGvveG5+yovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAvKiAwIMqnsNwgMSCzybmmIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCzybmmvLSx7cP3usXC66GizsSxvtPQ0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmdbM107DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdSZWFzb247ICAgLyogyqew3NSt0vIgKi8NCi0NCi0gICAgVF96X0NhbGxOdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdE51bTsNCi0gICAgVF96QXBNbWlhX1Bob25lVGV4dCAgICAgICAgICAgICAgICAgICAgICB0VGV4dDsNCi19IFRfekFwTW1pYV9RcnlQaG9uZVJlc3VsdDsNCi0NCi0vKsfrx/PB0L7Ztee7sLG+vMfCvCwqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtRmxnOyAgICAvKiDWuMq+yse38c6qRMP8we60+M/CtcRtZW2jrMj009DQp9TystnX97TLtOa0osb3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLSBiTWVtzt7QpyAgLyAxIC0gYk1lbdPQ0KcgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgICAgICAvKiDIoda1zaxUX3pBcE1taWFfQ2NTZXR1cF9SZXEgtcRNZW0gKi8gICAgIA0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgIC8qINfu0KG00zG/qsq8ICovDQotfSBUX3pBcE1taWFfUGJGaW5kSW5kZXg7DQotDQotLyogusXC68Dg0M2jrFBCxdC2z7rFwuu1xL3hufsgKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk51bVR5cGU7ICAgLyogusXC68Dg0M0syKHWtcjnz8Kjug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWl9BUE1NSUFfTlVNVFlQRV9VTkFMTE9XQ0FMTF9CRE4gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9OVU1UWVBFX1VOQUxMT1dDQUxMX0ZETiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX05VTVRZUEVfRUNDQ0FMTCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX05VTVRZUEVfTk9STUNBTEwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfQVBNTUlBX05VTVRZUEVfVU5LTk9XTiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcnZDYXRlZzsgICAvKiC99LyxusXC68Dg0M0sIGJOdW1UeXBlID0gWl9BUE1NSUFfTlVNVFlQRV9FQ0NDQUxMyrHT0NCnDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgMSAgIFBvbGljZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDIgICBBbWJ1bGFuY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdCAzICAgRmlyZSBCcmlnYWRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXQgNCAgIE1hcmluZSBHdWFyZA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDUgICBNb3VudGFpbiBSZXNjdWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHMgNiw3LDggYXJlIHNwYXJlIGFuZCBzZXQgdG8gIjAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwOCAxMC41LjQuMzMgIKOsTW9iaWxlIHN0YXRpb24gbWF5IHNldCBvbmUgb3IgbW9yZSBiaXRzIHRvICIxIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyOe5+7K7tObU2tTyzO4wDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pBcE1taWFfTnVtVHlwZTsgDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gINSt0+86Wl9BUE1NSUFfUGJFbWVyTnVtTGlzdEluZF9FdihNTUlBLT5QQikNCi0gILmmxNw6zai45lBCvfS8sbrFwuvB0LHtDQotICC21NOmQVTD/MHuOs7eDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3J2Q2F0ZWdGZzsgIC8qILHtyr5iU3J2Q2F0ZWfKx7fx09DQp6OsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaX0FQTU1JQV9JTlZBTElEICAgzt7Qp6OsWl9BUE1NSUFfVkFMSUQgINPQ0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcnZDYXRlZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTnVtTGVuOyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJOdW1bWl9BUE1NSUFfRUNDX01BWE5VTV07DQotfVRfekFwTW1pYV9FbWVyTnVtOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTm9jYXJkRWNjTnVtTGVuOyAgIC8qzt6/qL30vLG6xcLruPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYldpdGhjYXJkRWNjTnVtTGVuOyAvKtPQv6i99LyxusXC67j2yv0qLw0KLSAgICBUX3pfUGxtbklkICAgICAgICAgICAgICAgICAgICAgIHRQbG1uSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLSAgICBUX3pBcE1taWFfRW1lck51bSAgICAgICAgICAgICAgIGF0Tm9jYXJkRWNjTnVtW1pfQVBNTUlBX0VDQ05VTV9OT0NBUkRdOyAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogzt6/qL30vLG6xcLrwdCx7TogIDAwMCwgMDgsIDExMiwgMTEwLCAxMTgsIDExOSwgOTExIGFuZCA5OTkqLw0KLSAgICBUX3pBcE1taWFfRW1lck51bSAgICAgICAgICAgICAgIGF0V2l0aGNhcmRFY2NOdW1bWl9BUE1NSUFfRUNDTlVNX0NBUkRdOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qINPQv6i99LyxusXC68HQse0ssLS0y8uz0PI6zfiy4LrFwuujrE5WusXC66Oso6gxMTIsIDkxMaOpKi8NCi19VF96QXBNbWlhX1BiRW1lck51bUxpc3RfSW5kOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAguabE3DpBVEm78cihvfS8sbrFwuvB0LHtDQotICC21NOmQVTD/MHuOitDRU4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVjY051bUxlbjsgICAvKr30vLG6xcLruPbK/SovDQotICAgIFRfel9QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgdFBsbW5JZDsNCi0gICAgVF96QXBNbWlhX0VtZXJOdW0gICAgICAgICAgICAgICBhdEVjY051bVtaX0FQTU1JQV9FQ0NOVU1fTUFYXTsNCi19VF96QXBNbWlhX0VtZXJOdW1MaXN0OyANCi0vKiC21Gxpc3RzbV9jbma94s72tcS94bn7ICovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUeXBlb2ZSbHQ7ICAgICAgIA0KLSAgICAvKiC2zNDFwODQzSAsyKHWtSzTw8C01rjKvsGqubLTw8zl1tC1xLbM0MXA4NDNDQotICAgIFpfQVBNTUlBX0NNR0xSTFRfUFNNUyANCi0gICAgWl9BUE1NSUFfQ01HTFJMVF9UREVMIA0KLSAgICBaX0FQTU1JQV9DTUdMUkxUX1RTVUIgDQotICAgIFpfQVBNTUlBX0NNR0xSTFRfVFNSICANCi0gICAgWl9BUE1NSUFfQ01HTFJMVF9UQ09NIA0KLSAgICBaX0FQTU1JQV9DTUdMUkxUX1RDQk0gDQotICAgIFpfQVBNTUlBX0NNR0xSTFRfUENCTSANCi0gICAgWl9BUE1NSUFfQ01HTFJMVF9DT01NICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICB1bmlvbnsNCi0gICAgVF96QXBNbWlhX1Ntc1BjbWdsUmx0ICAgICAgICB0UGNtZ2xSbHQ7DQotICAgIFRfekFwTW1pYV9TbXNUZGVsaUxpc3RSbHQgICAgdFRkZWxpTGlzdFJsdDsNCi0gICAgVF96QXBNbWlhX1Ntc1RzdWJMaXN0Umx0ICAgICB0VHN1Ykxpc3RSbHQ7DQotICAgIFRfekFwTW1pYV9TbXNUc3RhdExpc3RSbHQgICAgdFRzdGF0TGlzdFJsdDsNCi0gICAgVF96QXBNbWlhX1Ntc1Rjb21MaXN0Umx0ICAgICB0VGNvbUxpc3RSbHQ7DQotICAgIFRfekFwTW1pYV9DYnNfVGNibUxpc3RSbHQgICAgdFRjYm1MaXN0Umx0Ow0KLSAgICBUX3pBcE1taWFfQ2JzX1BjYm1MaXN0Umx0ICAgIHRQY2JtTGlzdFJsdDsNCi0gICAgVF96QXBNbWlhX0NtZ2xDb21tb25SbHQgICAgICB0Q21nbENvbW1vblJsdDsNCi0gICAgfXVTbXNDb250ZW50Ow0KLX1UX3pBcE1taWFfU21zTXNnQ29udGVudDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NNU19TVUJNSVRfU0VORF9SRVFfRVYoTU1JQS0+U01TKQ0KLSDLtcP3OiBNT8rCzvHKsaOst6LLzVNNU19TVUJNSVTP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17ICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXN0SW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNtc1NlcnZpY2U7ICAgICAgICAgICAgLyogU01T0rXO8cK3vrYuyKHWtbz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmtTdGF0dXM7ICAgICAgICAgICAgLyogwbTCt9e0zKzWtS7Ioda1vPu66rao0uUgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnU2VuZFR5cGU7ICAgICAgICAgICAvKiDP+8+it6LLzcDg0M0uIMih1rW8+7rqtqjS5SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRwTXNnUmVmOyAgICAgICAgICAgICAgLyogVFBEVc/7z6Kyzr+81rVUUC1NUiAqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgICAgICAgICAgICAgIC8qIFBEVbTmtKLOu9bDy/fS/brFLLWxYk1zZ1NlbmRUeXBlzqq05rSit6LLzcqx09DQpyAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWVtOyAgICAgICAgICAgICAgICAgICAvKiBTTVO05rSixvfD+7PGo6y1sWJNc2dTZW5kVHlwZc6qtOa0oreiy83KsdPQ0KcqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQZHVMZW5ndGg7ICAgICAgICAgICAgIC8qIFBEVbXE19a92rOktsgsyKHWtSgwLTE3NkIpLiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzRXdhbGs7ICAgICAgICAgICAgICAgLyogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIMih1rW3ts6no7oNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWlBTX1ZBTElEo7qx7cq+y+Zl0NCw5rG+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpQU19JTlZBTElEo7qx7cq+t8fL5mXQ0LDmsb4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQZHVCdWZmZXJbWl9NTUlBU01TX01BWF9QRFVfTEVOXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDTyXRUcFNDQWRkctPyK1RQRFUoU01TLVNVQk1JVCnT8tfps8m1xFBEVcr9vt2hoyovDQotfVRfek1taWFTbXNfU3VibWl0U2VuZF9SZXE7ICANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NNU19DT01NQU5EX1NFTkRfUkVRX0VWKE1NSUEtPlNNUykNCi0gy7XD9zogTU/Kws7xyrGjrLeiy81TTVNfQ09NTUFORM/7z6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU21zU2VydmljZTsgICAgICAgICAgIC8qIFNNU9K1zvHCt762LiovICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmtTdGF0dXM7ICAgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ1NlbmRUeXBlOyAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRwTXNnUmVmOyANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICB3SW5kZXg7ICAgICAgICAgICAgICAgICAvKiBQRFW05rSizrvWw8v30v26xSy1sWJNc2dTZW5kVHlwZc6qtOa0oreiy83KsdPQ0KcgKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1lbTsgICAgICAgICAgICAgICAgICAgLyogU01TtOa0osb3w/uzxqOstbFiTXNnU2VuZFR5cGXOqrTmtKK3osvNyrHT0NCnKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGR1TGVuZ3RoOyAgICAgICAgICAgICAvKiBQRFW1xNfWvdqzpLbILMih1rUoMC0xNzZCKS4qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc0V3YWxrOyAgICAgICAgICAgICAgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1t7bOp6O6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpQU19WQUxJRKO6se3KvsvmZdDQsOaxvg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaUFNfSU5WQUxJRKO6se3KvrfHy+Zl0NCw5rG+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGR1QnVmZmVyW1pfTU1JQVNNU19NQVhfUERVX0xFTl07DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyog08l0VHBTQ0FkZHLT8itUUERVKFNNUy1DT01NQU5EKdPy1+mzybXEUERVyv2+3aGjKi8NCi19VF96TW1pYVNtc19Db21tYW5kU2VuZF9SZXE7ICANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NNU19NU0dfU0VORF9DTkZfRVYoU01TLT5NTUlBKQ0KLSDLtcP3OiBNT8rCzvHKsaOsvdPK1bW9tcTN+MLntcTP7NOmsai45qOsu/JTTVPX1MntsvrJ+rXEtO3O87GouOYNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXNnQ25mVHlwZTsgICAgICAgICAgIC8qIM/7z6K72Li0wODQzaGjyKHWtbz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRwTXNnUmVmOyAgICAgICAgICAgICAgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXRycHRSZXFGbGc7ICAgICAgICAvKiDXtMyssai45sfrx/Ox6ta+o6y1sWJNc2dDbmZUeXBlzqq05rSit6LLzcqx09DQpyovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJNZW07ICAgICAgICAgICAgICAgICAgLyogU01TtOa0osb3w/uzxqOstbFiTXNnQ25mVHlwZc6qtOa0oreiy83KsdPQ0KcqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJbmRleDsgICAgICAgICAgICAgICAgLyogUERVtOa0os671sPL99L9usUstbFiTXNnQ25mVHlwZc6qtOa0oreiy83KsdPQ0KcgKi8gIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgICAgICAgICAgLyogt7W72LXEveG5+6GjyKHWtbz7uuq2qNLlICovIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcGR1TGVuZ3RoOyAgICAgICAgICAgLyogVFBEVbXE19a92rOktsgsyKHWtSgwLTE2NEIpLiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q2F1c2U7ICAgICAgICAgICAgICAgLyogUlCy47XEtO3O89St0vKhoyovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUUGR1QnVmZmVyW1pfTU1JQVNNU19NQVhfVFBEVV9MRU5dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMC019TN+MLntcTP7NOmsai45rXEU3VibWl0IF9SZXBvcnQgX1RQRFUgZm9yIFJQLUFDSy9SUC1FUlJPUi4gyv2+3S4qLw0KLX1UX3pNbWlhU21zX01zZ1NlbmRfQ25mOyAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TTVNfREVMSVZFUl9SRUNfSU5EX0VWKFNNUy0+TU1JQSApDQotIMu1w/c6IE1UysLO8cqxo6zK1bW9tcTN+MLnwLS1xFNNU19ERUxJVkVSz/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSb3V0ZUluZDsgICAgICAgICAgICAvKiC2zM/7z6LCt9PJ1rjKvqGjyKHWtbz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN0b3JlSW5kOyAgICAgICAgICAgIC8qILTmtKK3vcq91rjKvqGj1NpiUm91dGVJbmTOqrTmtKLKsdPQ0Keho8ih1rW8+7rqtqjS5SAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQZHVMZW5ndGg7ICAgICAgICAgICAvKiBQRFW1xNfWvdqzpLbILMih1rUoMC0xNzZCKS4qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBkdUJ1ZmZlcltaX01NSUFTTVNfTUFYX1BEVV9MRU5dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDTyXRUcFNDQWRkctPyK1RQRFUoU01TLURFTElWRVIp0/LX6bPJtcRQRFXK/b7doaMqLw0KLX1UX3pNbWlhU21zX0RlbGl2ZXJSZWNfSW5kOyAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TTVNfU1RBVFVTX1JFQ19JTkRfRVYoU01TLT5NTUlBKQ0KLSDLtcP3OiBNVMrCzvHKsaOsytW1vbXEzfjC58C0tcRTTVNfU1RBVFVTX1JFUE9SVM/7z6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUm91dGVJbmQ7ICAgICAgICAgICAgIC8qILbMz/vPosK308nWuMq+oaMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQZHVMZW5ndGg7ICAgICAgICAgICAgLyogVFBEVbXE19a92rOktsgsyKHWtSgwLTE3NkIpLiovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQZHVCdWZmZXJbWl9NTUlBU01TX01BWF9QRFVfTEVOXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qINPJdFRwU0NBZGRy0/IrVFBEVShTTVMtU1RBVFVTLVJFUE9SVCnT8tfps8m1xFBEVcr9vt2hoyovDQotfVRfek1taWFTbXNfU3RhdHVzUmVjX0luZDsgIA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU01TX1JFQ19SU1BfUkVRX0VWKE1NSUEtPlNNUykNCi0gy7XD9zogTVTKws7xyrGjrMnPsuPP8s34wue72Li0tcTP7NOmsai45g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY2tNb2RlOyAgICAgICAgICAgICAgICAgLyogz+zTprGouOZzbXMtZGVsaXZlci1yZXBvcnS1xL3hufuho8ih1rW8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUcGR1TGVuZ3RoOyAgICAgICAgICAgICAgLyogVFBEVbXE19a92rOktsgsyKHWtSgwLTE2NEIpLiovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJUUGR1QnVmZmVyW1pfTU1JQVNNU19NQVhfVFBEVV9MRU5dOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogz/LN+MLnu9i4tLXEz+zTprGouOZEZWxpdmVyX1JlcG9ydCBUUERVIGZvciBSUC1BQ0svRVJST1LK/b7dLiovDQotfVRfek1taWFTbXNfUmVjUnNwX1JlcTsgIA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU01TX1JFQ19SU1BfQ05GX0VWKFNNUy0+TU1JQSkNCi0gICAgICAgICAgICAgTU1JQV9TTVNfTUVNX0FWQUlMX0NORl9FVihTTVMtPk1NSUEpDQotICAgICAgICAgICAgTU1JQV9TTVNfQ09NTU9OX0NORl9FVihTTVMtPk1NSUEpDQotIMu1w/c6IE1UysLO8cqxo6zJz7LjtcTP7NOmsai45rXEu9i4tA0KLSAgICAgICAgICAgTU/NqLjmuf2zzL3hyvi688/yyc+y47vYuLS1xM/7z6INCi0gICAgICAgICAgIL/J08PT2rfJ0NDEo8q9z8KjrM/yyc+y47vYuLTP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXN0SW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdCA7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDYXVzZTsNCi19VF96TW1pYVNtc19SZWNSc3BfQ25mLFRfek1taWFTbXNfTWVtQXZhaWxfQ25mLFRfek1taWFTbXNfQ29tbW9uX0NuZjsgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TTVNfTU1TX0RJU0FCTEVfSU5EX0VWKFNNUy0+TU1JQSkNCi0gy7XD9zogTU/Kws7xyrGjrNPD09rP8k1NSUGxqLjmTU1TwbTCt7K7v8nTww0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzdEluZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96TW1pYVNtc19NbXNEaXNhYmxlX0luZDsgIA0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU01TX01FTV9BVkFJTF9SRVFfRVYoTU1JQS0+U01TKQ0KLSDLtcP3OiBNT8rCzvHKsaOsTU1JQcfrx/PP8s34wue3osvNUlAtU01NQc/7z6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU21zU2VydmljZTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmtTdGF0dXM7IA0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOb3RpZkFib3J0OyAgICAgICAgICAgIC8qILWxx7DNqLjmx+vH89e0zKyho8ih1rW8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc0V3YWxrOyAgICAgICAgICAgICAgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiDIoda1t7bOp6O6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpQU19WQUxJRKO6se3KvsvmZdDQsOaxvg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaUFNfSU5WQUxJRKO6se3KvrfHy+Zl0NCw5rG+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96TW1pYVNtc19NZW1BdmFpbF9SZXE7ICANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NNU19TVE9SRV9SRVBPUlRfUkVRX0VWKE1NSUEtPlNNUykNCi0gy7XD9zogTVTKws7xyrGjrE1NSUHTw9Paz/JTTVOxqLjmTVTP+8+itOa0os/s06YNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3VHBDYXVzZTsvKiC05rSiyqew3MqxtcRUUC1GQ1Msv8nT67TmtKKy2df3t7W72LXEQVTD/MHutcS07c7z1rXTs8nkoaPIoda1vPu66rao0uUgKi8NCi19VF96TW1pYVNtc19TdG9ScHRfUmVxOyAgDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TTVNfQUJPUlRfTU9fUkVRX0VWKE1NSUEtPlNNUykNCi0gy7XD9zogx+vH88ihz/tNT8/7z6K3osvNDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc3RJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhU21zX0Fib3J0TW9fUmVxOw0KLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDaG5sX2lkOyAgICAgICAgICAvKiBBVCBjaGFubmVsIGlkICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbGlkOyAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEaXI7ICAgICAgICAgICAgICAgLyoguvS90Le9z/KjrLz7uuq2qNLlKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDY1N0YXRlOyAgICAgICAgICAvKiDNrCtDTENDICAqLyANCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbE1vZGU7ICAgICAgICAgIC8qILr0vdDEo8q9o6y8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk1wdHlzdGF0ZTsgIC8qIDE6bXB0ebr0vdCjrDA6ILfHbXB0ebr0vdAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsUHJpRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbFByaW9yaXR5OyAgICAgIC8qILr0vdDTxc/IvLajrLz7uuq2qNLlICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTnVtRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQWxwaGFGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJOYW1lRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTmFtZUxlbjsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJlQ2FsbEZnOy8vyse38dCvtPhlY2FsbLLOyv0sMC1ubywxLXllcw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYmVDYWxsVHlwZTsvL2JlQ2FsbEZnID0gMdPQ0KcNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdUMlJlbWFpbjsvL2JlQ2FsbEZnID0gMdPQ0KcNCi0NCi0gICAgVF96X0NhbGxOdW0gICAgICAgICAgICAgICAgIHROdW07ICAgICAgICAgLyogttS3vbrFwuvJz8/eNDAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJOYW1lW1pfQ0NfU1RBVEVfTkFNRV9NQVhfTEVOXTsNCi19VF96TW1pYUNjX1N0YXRlX0luZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBicGFkZGluZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsTnVtOw0KLSAgICBUX3pNbWlhQ2NfU3RhdGVfSW5mbyAgICAgICAgdFN0YXRlSW5mb1taX01BWENBTExOTV07ICAgICAvKiBaX01BWENBTExOTSDIoda1zqo3ICovDQotfVRfek1taWFDY19TdGF0ZV9SZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19NT0NfUkVRX0VWKE1NSUEtPkNDKQ0KLSDLtcP3OiC69L3QvajBosfrx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRUNhbGxUeXBlOyAgICAgICAgIC8qINK7sOO69L3Qu/K99LyxuvS90KOsvPu66rao0uUgKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRUNhbGxDYXRlZ29yeTsgICAgIC8qIL30vLG6xcLrwODQzaOstNO/qNbQu/HIobXE1rUqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxUeXBlOyAgICAgICAgICAvKiC69L3QwODQzaOsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsTW9kZTsgICAgICAgICAgLyoguvS90MSjyr2jrLz7uuq2qNLlICovIA0KLQ0KLS8qIENVRyBpbmZvbWF0aW9uICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ3VnSWR4Rmc7ICAgICAgICAgIC8qIGN1Z8rHt/G05tTaseq8x867LMS/x7Cyu9ans9ajrG1taWHWu8TczO7QtM7e0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogWl9WQUxJRDrP4NOm19a2ztPQ0KcsIFpfSU5WQUxJRDrP4NOm19a2zs7e0KcNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogtMu68ypGZ8Dgy8bX1rbOyOfO3szYyuLLtcP3LLSmwO3T67TLzawqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkN1Z0lkeDsgICAgICAgICAgICAvKiC99rWxYkN1Z0lkeEZnzqoxyrHT0NCnICAqIDB+OTogQ1VHIEluZGV4o6wxMCBubyBpbmRleCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkN1Z0luZm87ICAgICAgICAgICAvKiC99rWxYkN1Z0lkeEZnzqoxyrHT0NCnICovDQotICAgIA0KLS8qU1MgRmxhZyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2xpckluZm87ICAgICAgICAgICAgLyogMTrG9NPDQ0xJUiCjug0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ0xJUl9TVUJTQ1JJUFRJT04NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDTElSX0lOVk9DQVRJT04NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDTElSX1NVUFBSRVNTSU9OICyyzrz7uuq2qNLlICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWRGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7DQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgICB0Q2FsbGVkTnVtOyAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZWlhbEZsYWc7IC8vIDA6srvKx3JlZGlhbCwgIDE6IMrHcmVkaWFst6LG8LXEuvS90A0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJSZWlhbFBhZGRpbmc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUHNkb25lOyAvKkNFQ0FMTCC4w9a1yKEwo6xaRUNBTEy4w9a1yKExKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJNc2RMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYk1TRFtNU0RfTUFYX0xFTkdUSF07DQotfVRfek1taWFDY19Nb2NfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfTU9DX0NORl9FVihDQy0+TU1JQSkNCi0gy7XD9zoguvS90L2owaK94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgICAvKiC69L3QvajBor3hufujrLz7uuq2qNLlo6y21NOmYXBtbWlhvdO/2qO6VF9aX0FwTW1pYV9DY1NldHVwX0NuZiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNlcnY7ICAgICAgICAgICAgICAvKiArQ1Igss7K/aOsvPu66rao0uUgo6zIoda109DQp8qxo6i3xzB4ZmajqaOsttTTpmFwbW1pYb3Tv9qjulRfWl9BcE1taWFfQ3JfSW5ko6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq1NrX7tbVveG5+8Lryc+xqMewoaLIt7aowctzcGVlZLrNc2VydmljZSBxYWxpdHm6877Nyc+xqCovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbGVkTnVtRmc7ICAgICAgIC8qILWxtMux6ta+09DQp8qxo6zJz7GoVF9aX0FwTW1pYV9Db2xwX0luZKOs1NpDUrvyRMP8we694bn7wuvHsMnPsagqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxlZFN1YkFkZHJGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0gICAgDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3Q2F1c2U7ICAgICAgICAgICAgIC8qILr0vdDKp7Dc1K3S8iwgcmVzdWx0srvKx09LL0NPTk5FQ1TKsba8tPggKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7ICAgICAgICAgICAgLyogICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbFR5cGU7ICAgICAgICAgIC8qIMvmZdDQyc+xqMqxtcSyzsr9o6y8+7rqtqjS5SAqLw0KLQ0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgIHRDYWxsZWROdW07ICAgDQotICAgIFRfel9DYWxsU3ViQWRkciAgICAgICAgICAgdENhbGxlZFN1YkFkZHI7CQ0KLX1UX3pNbWlhQ2NfTW9jX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX01UQ19JTkRfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IMrVtb269L3QvajBota4yr4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ3dGZzsgICAgICAgICAgICAgIC8qILr0vdC1yLT9serKtqOsvPu66rao0uWjus6q0ruw47r0vdDKsaOs0tRDUkO1xMno1sO+9rao0tRyaW5nu/IrY3JpbmfJz7GowLS156O7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILWxzqq69L3Qtci0/cqxo6zI9GNjd2HJ6NbDz9TKvsqxo6zS1CtjY3dhyc+xqKOst/HU8tLUcmluZ7vyK2NyaW5nyc+xqA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogILbU06ZUX3pBcE1taWFfUmluZ19JbmQvVF96QXBNbWlhX0NyaW5nX0luZC9UX3pBcE1taWFfQ2N3YV9JbmQgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbFR5cGU7ICAgICAgICAgIC8qICtDUklOR8nPsajKsbXEss7K/aOsvPu66rao0uUgKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsQ2xhc3M7ICAgICAgICAgLyogK0NDV0HJz7GoyrG1xLLOyv2jrLz7uuq2qNLlICovDQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbGluZ051bUZnOjE7ICAgICAvKiC1sbTLserWvtPQ0KfKsaOsyc+xqFRfekFwTW1pYV9Db2xwX0luZKOs1NpDUrvyRMP8we694bn7wuvHsMnPsagqLw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxpbmdTdWJBZGRyOjE7CQ0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxlZE51bUZnOjE7ICAgICANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsZWRTdWJBZGRyOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiUmVkaXJOdW1GZzoxOyAgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiUmVkaXJTdWJBZGRyOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiTm9DbGlDYXVzZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiUHJpb3JpdHlGZzoxOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlByaW9yaXR5OyAgICAgICAgICAvKiC69L3Q08XPyLy2ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTm9DbGlDYXVzZTsgICAgICAgIC8qINb3vdC6xcLrsru05tTatcTUrdLyICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbElkOyAgICAgICAgICAgIC8qICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOyAgICAgICAvKiAgKi8NCi0gICAgDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdENhbGxpbmdOdW07ICAgICAgICAvKiDTw9PaY2N3YSxjcmluZ9bQwLS157rFwuujrNb3vdC6xcLryc/P3jEwKi8NCi0gICAgVF96X0NhbGxTdWJBZGRyICAgICAgICAgICB0Q2FsbGluZ1N1YkFkZHI7DQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdENhbGxlZE51bTsgICAgICAgICAvKiBtbWlh1N269sLUtMvQxc+iICovDQotICAgIFRfel9DYWxsU3ViQWRkciAgICAgICAgICAgdENhbGxlZFN1YkFkZHI7DQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdFJlZGlyTnVtOyAgICAgICAgICAvKiBtbWlh1N269sLUtMvQxc+iICovDQotICAgIFRfel9DYWxsU3ViQWRkciAgICAgICAgICAgdFJlZGlyU3ViYWRkcjsNCi19VF96TW1pYUNjX010Y19JbmQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX01UQ19SU1BfRVYoQ0MtPk1NSUEpDQotICAgICAgIE1NSUFfQ0NfTU9ERV9UT19NVUxUTUVESUFfUlNQX0VWKE1NSUEtPkNDKQ0KLSDLtcP3OiC69L3QvajBosi3yM+jrNb30qrTw9PaVURVQrvy1d+62rDXw/u1pQ0KLSAgICAgICDTw7un1rjKvr3Tyty78r7cvvjH0Lu71sHK08a1tee7sLXEx+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgICAgICAgLyog08O7p772tqjKx7fxvdPK3KOsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsgICAgICAgICAgICAgLyog08PT2lRfek1taWFDY19NdGNfUnNwLHJlc3VsdM6qUkVKyrGx2NDrtPiju7fx1PLOqr/J0aEgKi8NCi19VF96TW1pYUNjX010Y19Sc3AsIFRfek1taWFDY19Nb2RUb011bHRNZWRpYV9Sc3A7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6IE1NSUFfQ0NfQU5TX01PREVfUkVRX0VWKE1NSUEtPkNDKSwgDQotICAgICAgICBNTUlBX0NDX01PRElGWV9SRVFfRVYoTU1JQS0+Q0MpLCANCi0gICAgICAgIE1NSUFfQ0NfU1RBVEVfUVVFUllfUkVRX0VWKE1NSUEtPkNDKSwNCi0gICAgICAgIE1NSUFfQ0NfQ0FVU0VfUVVFUllfUkVRX0VWKE1NSUEtPkNDKSwNCi0gICAgICAgIE1NSUFfQ0NfQUJPUlRfUkVRX0VWKE1NSUEtPkNDKSwNCi0gICAgICAgIE1NSUFfQ0NfQ1NUQV9RVUVSWV9SRVFfRVYoTU1JQS0+Q0MpLA0KLSAgICAgICAgTU1JQV9DQ19NT0RFX1RPX01VTFRNRURJQUlORF9FVihDQy0+TU1JQSksDQotICAgICAgICBNTUlBX0NDX0RJU0NfQ05GX0VWKENDLT5NTUlBKSwgDQotIMu1w/c6ICC31rHwzqq69L3Q06a08Lvy1d/K1bW9QVRBt6LG8MSjyr3H0Lu7o6wNCi0gICAgICAgIMrVtb1BVES3osbwxKPKvcfQu7ujrA0KLSAgICAgICAg17TMrLLp0a8sDQotICAgICAgICDX7r380ru0zrr0vdDKp7Dcu/LKzbfF1K3S8rLp0a8sDQotICAgICAgICDK1bW9tcTW0LbPx+vH86OsDQotICAgICAgICCy6dGvY3N0YbXEyejWww0KLSAgICAgICAgytW1vbbUtsu9q9Pv0vS69L3Qx9C7u7W9ytPGtbXnu7DH68fzyrG4+MnPsuO1xNa4yr4NCi0gICAgICAgILnSts/P+8+itcTIt8jPLA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7ICAgICAgICAgICAgLyogQ0MtPk1NSUG1xM/7z6LM7iAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFDY19BbnNNb2RfUmVxLCBUX3pNbWlhQ2NfTW9kaWZ5X1JlcSwgVF96TW1pYUNjX1N0YXRlUXVlcnlfUmVxLA0KLVRfek1taWFDY19DYXVzZVF1ZXJ5X1JlcSwgVF96TW1pYUNjX0Fib3J0X1JlcSwNCi1UX3pNbWlhQ2NfQ3N0YVF1ZXJ5X1JlcSwgVF96TW1pYUNjX01vZFRvTXVsdE1lZGlhX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7ogTU1JQV9DQ19ESVNDX0lORF9FVihDQy0+TU1JQSksIA0KLSDLtcP3OiAgytW1vbnSts/P+8+itcTWuMq+LA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7ICAgICAgICAgICAgLyogICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotDQotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3Q2F1c2U7ICAgICAgICAgICAgIC8qILr0vdDKzbfF1K3S8iAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMlsyXTsNCi19VF96TW1pYUNjX0Rpc2NfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQU5TX01PREVfQ05GX0VWKENDLT5NTUlBKQ0KLSDLtcP3OiC69L3Q06a08Lvy1d9BVEG3osbwtcTEo8q9x9C7u7XEveG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgICAgICAgLyogQU5TTU9Ex+vH87XEveG5+6OsvPu66rao0uWju7bU06a907/aVF96QXBNbWlhX0NjQW5zd2VyX0NuZiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNlcnY7ICAgICAgICAgICAgICAvKiArQ1Igss7K/aOsvPu66rao0uUgo6y0psDtzaxUX3pNbWlhQ2NfTW9jX0NuZtbQYlNlcnYqLw0KLSAgICANCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdDYXVzZTsgICAgICAgICAgICAgLyoguvS90MqnsNzUrdLyLCByZXN1bHSyu8rHT0svQ09OTkVDVMqxtry0+CAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxJZDsgICAgICAgICAgICAvKiAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsVHlwZTsgICAgICAgICAgLyogy+Zl0NDJz7GoyrG1xLLOyv0sIHJlc3VsdMrHT0svQ09OTkVDVMqxtPijrLz7uuq2qNLlICovDQotfVRfek1taWFDY19BbnNNb2RfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfTU9ESUZZX0NORl9FVihDQy0+TU1JQSkNCi0gy7XD9zogQVREt6LG8LXETW9kaWZ5tcS94bn71rjKvg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTZXJ2OyAgICAgICAgICAgICAgLyogK0NSILLOyv2jrLz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbElkOyAgICAgICAgICAgIC8qICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAgICAvKrLZ1/e1xL3hufu8+7rqtqjS5TpaX1NVQ0MvWl9GQUlMKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsgICAgICAgICAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3Q2F1c2U7ICAgICAgICAgICAgLyogyqew3NSt0vIgKi8NCi19VF96TW1pYUNjX01vZGlmeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19ESVNfTU9ERV9SRVFfRVYoTU1JQS0+Q0MpDQotIMu1w/c6ILnSts+69L3Qx+vH86Osu/LV38rVtb1BVEgvK0NIVVDD/MHuDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkZsYWc7ICAgICAgICAgICAgICAvKiC50rbPx+vH87XEw/zB7qOsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi19VF96TW1pYUNjX0Rpc01vZF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19DT01NT05fQ05GX0VWKENDLT5NTUlBKQ0KLSDLtcP3OiBBVEgvK0NIVVDD/MHustnX97XEt7W72L3hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgICAgICAgLyqy2df3tcS94bn7vPu66rao0uU6Wl9TVUNDL1pfRkFJTCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbElkOyAgICAgICAgICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgZHdDYXVzZTsgICAgICAgICAgICAvKiDKp7Dc1K3S8iAqLw0KLX1UX3pNbWlhQ2NfRGlzY19DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19EVE1GX1JFUV9FVihNTUlBLT5DQykNCi0gy7XD9zogt6LLzURUTUbH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkR0bWY7ICAgICAgICAgICAgICAvKiBEVE1G19a3+yAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0R1cmF0aW9uOyAgICAgICAgICAvKiDI57n7VlRTsrvQr7T4yrGzpMihVlREyejWw9a1Ki8NCi19VF96TW1pYUNjX0R0bWZfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQ0hMRF9SRVFfRVYoTU1JQS0+Q0MpDQotIMu1w/c6ILeiy81IT0xEL1JFVFJJRVZFL01QVFkvQ1e1yLLZ1/e1xMfrx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiT3BlcmF0ZVR5cGU7ICAgICAgIC8qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiCy2df3wODQzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwOiDKzbfFy/nT0GhlbGS69L3Qu/LV372ruvS90LXItP0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgIMno1sPTw7unvva2qNPDu6fDpihVRFVCKSAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDE6IMrNt8XL+dPQYWN0aXZluvS90CjI57n7tObU2imjrCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICAgvdPK3Mbky/u69L3QKGhlbGQgb3Igd2FpdGluZykgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDFYOsrNt8XWuLaoYWN0aXZlIGNhbGwgWC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMjogvavL+dPQYWN0aXZluvS90CjI57n7tObU2inWw86qIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICBob2xko6y908rcxuTL+7r0vdAgKGhlbGQgb3Igd2FpdGluZykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMlg6IL2rs/3By1jWrs3itcTL+dPQYWN0aXZluvS90NbDzqpob2xkDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICC69L3QWNOmvMzQ+Nans9YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMzogvavSu8K3aGVsZLr0vdC808jrtb274buw1tANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiSGxkQ2F1c2VGZzsvKrHqvMe50rbP1K3S8srHt/G05tTaKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJIbGRDYXVzZTsgIC8qudK2z9St0vIoMS0xMjcpKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsNCi19VF96TW1pYUNjX0NobGRfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQ0hMRF9DTkZfRVYoQ0MtPk1NSUEpDQotICAgICAgICAgICAgICAgICBNTUlBX0NDX0RUTUZfQ05GX0VWKENDLT5NTUlBKQ0KLSAgICAgICAgICAgICAgICAgTU1JQV9DQ19DU1RBX1NFVF9DTkZfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IERJU01PRKGiRFRNRqGiQ0hMRLrNQ1NUQcno1sOy2df3tcS3tbvYveG5+9LUvLDL+dPQyqew3LLZ1/e1xLe1u9i94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyAgICAgICAgICAgIC8qIERUTUYsQ0hMRCxESVNNT0S6zcbky/vKp7DcstnX97XEveG5+w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC8+7rqtqjS5TpaX1NVQ0MvWl9GQUlMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxJZDsgICAgICAgICAgICAvKiAgKi8NCi0gICAgDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOyAgICAgICAgICAgIC8qIMqnsNzUrdLyICovDQotfVRfek1taWFDY19DaGxkX0NuZixUX3pNbWlhQ2NfRHRtZl9DbmYsVF96TW1pYUNjX0NzdGFTZXRfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfTk9USUZZX0lORF9FVihDQy0+TU1JQSkNCi0gy7XD9zogTm90aWZ51rjKvixtbWlh1N3Ksbr2wtS0y9DFz6INCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTm90aWZ5SW5kOyAgICAgICAgIC8qIE5vdGlmeSDWuMq+Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7ICAgICAgICAgICAgLyogICovDQotfVRfek1taWFDY19Ob3RpZnlfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfU1NfTk9USUZZX0lORF9FVihDQy0+TU1JQSkNCi0gy7XD9zogU1MgTm90aWZ51rjKvg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJJbmRleEZnOwkNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJJbmRleDsgICAgICAgICAgICAgLyogQ1VHIEluZGV4ICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiSW9yVUZnOyAgICAgICAgICAgIC8qIDA6ILbU06Zjc3Npo7sxttTTpmNzc3WjrMih1rW8+7rqtqjS5SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ29kZTsgICAgICAgICAgICAgIC8qICtDU1NJu/JDU1NV1tBjb2Rlss7K/Swgss6/vL3Tv9rOxLW1ICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbGluZ051bUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxpbmdTdWJBZGRyRmc7DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxJZDsgICAgICAgICAgICAvKiAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1szXTsgICAgICAgLyogICovDQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdENhbGxpbmdOdW07ICAgICAgICAvKtb3vdC6xcLryc/P3jEwKi8NCi0gICAgVF96X0NhbGxTdWJBZGRyICAgICAgICAgICB0Q2FsbGluZ1N1YkFkZHI7DQotfVRfek1taWFDY19Tc05vdGlmeV9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19TVEFURV9RVUVSWV9DTkZfRVYoQ0MtPk1NSUEpDQotIMu1w/c6ILr0vdDXtMyssunRr73hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qIFRoZSBzdHJ1Y3Qgb2YgdGhlIGNhbGwgaW5mb3JtYXRpb24uKi8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDaTsgICAgICAgICAgICAgICAgLyoguvS90LHqyrYgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEaXI7ICAgICAgICAgICAgICAgLyoguvS90Le9z/KjrLz7uuq2qNLlKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsU3RhdGU7ICAgICAgICAgLyoguvS90Ne0zKyjrLz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbE1vZGU7ICAgICAgICAgIC8qILr0vdDEo8q9o6y8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk1wdHlJbmZvOyAgICAgICAgICAvKiDKx7fxtKbT2k1QVFnW0LXEserKts67o6y8+7rqtqjS5SAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxQcmlGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsUHJpb3JpdHk7ICAgICAgLyoguvS90NPFz8i8tqOsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsZWROdW1GZzsNCi0NCi0gICAgVF96X0NhbGxOdW0gICAgICAgICAgICAgICAgIHRDYWxsZWROdW07ICAgICAgICAgLyogsbu90LrFwuvJz8/eNDAqLw0KLX1UX3pNbWlhQ2NfQ2FsbEluZm87DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJOdW1iZXI7ICAgICAgICAgICAgLyogt8dOVUxM17TMrLXEQ0PKtczluPbK/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIFRfek1taWFDY19DYWxsSW5mbyAgICAgICBhdENhbGxJbmZvWzddOyAgICAgDQotfVRfek1taWFDY19TdGF0ZVF1ZXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX0NBVVNFX1FVRVJZX0NORl9FVihDQy0+TU1JQSkNCi0gy7XD9zoguvS90MqnsNy78srNt8W1xLLp0a+94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIA0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgZHdDYXVzZTsgICAgICAgICAgICAvKiDX7r380ru0zrr0vdDKzbfFu/LKp7DctcTUrdLyICovDQotfVRfek1taWFDY19DYXVzZVF1ZXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX0NPTU1PTl9DTkZfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IERJU01PRKGiRFRNRqGiQ0hMRLrNQ1NUQcno1sOy2df3tcS3tbvYveG5+9LUvLDL+dPQyqew3LLZ1/e1xLe1u9i94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUmVzdWx0OyAgICAgICAgICAgIC8qIERUTUYsQ0hMRCxESVNNT0S6zcbky/vKp7DcstnX97XEveG5+w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiC8+7rqtqjS5TpaX1NVQ0MvWl9GQUlMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxJZDsgICAgICAgICAgICAvKiAgKi8NCi0gICAgDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOyAgICAgICAgICAgIC8qIMqnsNzUrdLyICovDQotfVRfek1taWFDY19Db21tb25fQ25mOw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAg1K3T7zpNTUlBX0NDX1BST0NfSU5GT19JTkRfRVYoQ0MtPk1NSUEpDQotICC5psTcOrr0vdC5/bPM1tDQxc+itcTW97avyc+xqA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbEluZm87ICAgICAgICAgLyoguvS90NDFz6LWuMq+o6y8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxJZDsgICAgICAgICAgIC8qICAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlByb2dyZXNzRmc7ICAgICAgIC8qIDA6zt5wcm9ncmVzc9DFz6IsMTog09Bwcm9ncmVzc7XE0MXPoiAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxMb2M7ICAgICAgICAgIC8qIGJQcm9ncmVzc0ZnPTHKx9PQ0KejrMih1rW8+zI0MDA4IDEwLjUuNC4yMaGjuMOyzsr91N3KsbK7sbtNTUlBtKbA7SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlByb2dEZXM7ICAgICAgICAgIC8qIGJQcm9ncmVzc0ZnPTHKx9PQ0KejrMih1rW8+zI0MDA4IDEwLjUuNC4yMSAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxUeXBlOyAgICAgICAgIC8qILWxx7C1xLr0vdDA4NDNo6xaX01NSUFDQ19WT0lDRV9DQUxML1pfTU1JQUNDX0RBVEFfQ0FMTCgvWl9NTUlBQ0NfQ01DQ19FTUVSR0VOQ1lfQ0FMTCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog1NpjYWxsaW5mb86qQ2FsbFByb2Nkus1zZW5kc2V0dXBNc2fKsbHY0Ou0+KOsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog1NpjYWxsaW5mb86qWl9NTUlBQ0NfQ0FMTFBST0NEX05PVElGWcqxLFpfTU1JQUNDX0NNQ0NfRU1FUkdFTkNZX0NBTEy21NOmtb1aX01NSUFDQ19WT0lDRV9DQUxMICovDQotfVRfek1taWFDY19Qcm9jSW5mb19JbmQ7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogDQotICDUrdPvOk1NSUFfQ0NfQ1NUQV9TRVRfUkVRX0VWKE1NSUEtPkNDKQ0KLSAgICAgICBNTUlBX0NDX0NTVEFfUVVFUllfQ05GX0VWKENDLT5NTUlBKQ0KLSAguabE3Dpjc3RhtcTJ6NbDw/zB7rrNsunRr8i3yM8NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlR5cGU7ICAgICAgICAgICAgIC8qIGNzdGG1xMno1sPWtbLOv7wyNDAwOCAxMC41LjQuN6OsyPTJ6NbD1rXO3tCnLLe1u9jKp7DcLGNjvMfO3tCntcR0eXBl1rUweGZmDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgsunRr7TL1rXKsSy3tbvYMHhmZs6qzt7Qp8no1sMqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgICAgICAgIA0KLX1UX3pNbWlhQ2NfQ3N0YVNldF9SZXEsIFRfek1taWFDY19Dc3RhUXVlcnlfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQ0FMTF9TVEFURV9JTkRfRVYoQ0MtPk1NSUEpDQotIMu1w/c6ILr0vdDXtMysuMSx5MnPsaijrLbU06bL5mXQ0Lnmt7Z2Mi4wLjAgXkRTQ0kNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7ICAgICAgICAgICAgLyoguvS90LHqyrYgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEaXI7ICAgICAgICAgICAgICAgLyoguvS90Le9z/KjrLz7uuq2qNLlICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbFN0YXRlOyAgICAgICAgIC8qILr0vdDXtMyso6y8+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxUeXBlOyAgICAgICAgICAvKiC69L3QwODQzaOsVk9JQ0UvREFUQaOsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJNcHR5SW5mbzsgICAgICAgICAgLyogyse38bSm09pNUFRZ1tC1xLHqyrbOu6OsvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJCc1R5cGVGZzsgICAgICAgICAgLyogyse38dPQYkJzVHlwZbXEserKts67o6xaX1ZBTElEse3KvtPQo6xaX0lOVkFMSUSx7cq+zt4gKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYXVzZUZnOyAgICAgICAgICAgLyogyse38dPQYkNhdXNltcSx6sq2zrujrFpfVkFMSUSx7cq+09CjrFpfSU5WQUxJRLHtyr7O3iAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkJzVHlwZTsgICAgICAgICAgICAvKiCz0NTY0rXO8cDg0M2jrLz7U2VydiCyzsr9ILrqtqjS5aOs0OjSqtei0uK6zcvmZdDQ1rW1xLLuICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7ICAgICAgICAgICAgIC8qILr0vdDKzbfF1K3S8qOsYkNhbGxTdGF0Zc6qRU5EyrHM7tC0ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUmVpYWxGbGFnOyAvLyAwOrK7ysdyZWRpYWwsICAxOiDKx3JlZGlhbLeixvC1xLr0vdANCi0gICAgDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdE51bWJlcjsgICAgICAgICAgICAvKiC69L3QttS2y7rFwusgKi8NCi19VF96TW1pYUNjX0NhbGxTdGF0ZUluZDsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX09QRU5fVk9JQ0VfQ0hOTF9JTkRfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IM2o1qpNTUlBtPK/qtPv0vTNqLXADQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGxhdEluZGV4OyAgIC8qttTTprr0vdDKtczlvajBosqxo6zGvcyoz8K3os/7z6LW0LXE1LTL99L9Ki8gICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkN1ckFjdDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNXaWRlQmFuZDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQW1yQ2RlYzsNCi19VF96TW1pYUNDX09wZW5Wb2ljZUNobmxfSW5kLFRfek1taWFDQ19DbG9zZVZvaWNlQ2hubF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19DTE9TRV9WT0lDRV9DSE5MX0lORF9FVihDQy0+TU1JQSkNCi0gy7XD9zogzajWqk1NSUG52LHV0+/S9M2otcANCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLS8qIL/Vz/vPoiAqLw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQ0NNX1FVRVJZX1JFUV9FVihNTUlBLT5DQykNCi0gy7XD9zogTU1JQbLp0a9jdXJyZW50IGNhbGwgbWV0ZXINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19VF96TW1pYUNjX0NjbVF1ZXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX0NDTV9RVUVSWV9DTkZfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IM/yTU1JQbvYuLRjdXJyZW50IGNhbGwgbWV0ZXINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGR3Q2NtOw0KLX1UX3pNbWlhQ2NfQ2NtUXVlcnlfQ25mOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfQ0NXVl9JTkRfRVYoQ0MtPk1NSUEpDQotIMu1w/c6IM/y08O7p76vuOa/7NKqtO+1vUFDTW1heA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhQ2NfQ2N3dl9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19OT1RJRllfQU9DX1RJTUVSX0lORF9FVihDQy0+TU1JQSkNCi0gy7XD9zogQ0PNqNaqTU1JQbnYsdWhorTyv6q2qMqxxvcNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkFvY1RpbWVyTm90aWZ5OyAgICAgLyogWl9WQUxJRCAgICAgICAgtPK/qraoyrHG9w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfSU5WQUxJRCAgICAgudix1baoyrHG9w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotfVRfek1taWFDY19Ob3RpZnlBb2NUaW1lcl9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19DTkFQX0lORF9FVihDQy0+TU1JQSkNCi0gy7XD9zogQ0PW97avyc+xqNb3vdDTw7unw/sNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkwzTXNnQ25pRmc7ICAvKiCx6sq2YkwzTXNnQ25p09DQp9DUICovICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkwzTXNnQ25pOyAgIC8qDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTDPP+8+i0K+0+LXEQ05Jo7oNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFDQ19DTklfTkFNRVBSRVNFTlRBTExPVw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfTU1JQUNDX0NOSV9QUkVTRU5UUkVTVFJJQ1QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFDQ19DTklfTkFNRVVOQVZBSUwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX01NSUFDQ19DTklfTkFNRVBSRVNFTlRSRVNUUklDVCAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRjczsgIC8qINPDu6fD+7XEseDC67e9yr0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmFtZUxlbjsgICAvKiCx6sq2YWJOYW1ltcTX1r3as6S2yCAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJMZW5JbkNoYXJzOyAvKiCx6sq2YWJOYW1ltcTX1rf7s6S2yCAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5hbWVbWl9NTUlBQ0NfQ05BUF9OQU1FX01BWF9MRU5dOyAgLyog1ve90NPDu6fD+yovDQotfSBUX3pNbWlhQ2NfQ25hcEluZDsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiANCi0gINSt0+86TU1JQV9DQ19PUEVOX1ZPSUNFQ0hOTF9SRVFfRVYoQVRJLT5DQykNCi0gILmmxNw6zajWqrTyv6rT79L0DQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICANCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsSWQ7IC8qILr0vdCx6sq2Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhQ2NfT3Blbl9Wb2ljZUNobmxfUmVxOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KLSAg1K3T7zpNTUlBX0NDX1NSVkNDX05PVE9QRU5fVk9JQ0VDSE5MX1JFUV9FVihBVEktPkNDKQ0KLSAguabE3DrNqNaqU1JWQ0PKsbK7tPK/qtPv0vQNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhQ2NfTm90T3Blbl9Wb2ljZUNobmxfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfU1RPUF9MT0NBTFZPSUNFX0lORF9FVihDQy0+QVRJKQ0KLSDLtcP3OiDNqNaqzaOxvrXY0vQNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbElkOyAvKiC69L3QserKtiovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYUNDX1N0b3BMb2NhbFZvaWNlX0luZCxUX3pNbWlhQ0NfU3RhcnRMb2NhbFZvaWNlX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NDX0NFQ05fSU5EX0VWKENDLT5BVEkpDQotIMu1w/c6IMnPsagrQ0VDTjogPGRhdGFfdHlwZT4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICBCWVRFICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgQllURSAgICAgICAgICAgIGJEYXRhVHlwZTsvLzAtdXBkYXRlZCBNU0QgZm9yIHRoZSBlQ2FsbCBpcyBwcm92aWRlZCB0byB0aGUgbmV0d29yayBieSB0aGUgTVQsMS1yZXF1ZXN0IGZvciB1cGRhdGVkIE1TRA0KLSAgIEJZVEUgICAgICAgICAgICBiTXRGaXJzdE1zZFJlcTsNCi19VF96TW1pYUNjX0NlY25fSW5kOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0NfWkVDQUxMX0lORF9FVihDQy0+QVRJKQ0KLSDLtcP3OiBDQ72rQ0VDQUxM16q9u0lNU7SmwO0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICBCWVRFICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgQllURSAgICAgICAgICAgIGJlQ2FsbFR5cGU7DQotICAgQllURSAgICAgICAgICAgIGJNc2RMZW47DQotICAgQllURSAgICAgICAgICAgIGFiTVNEW01TRF9NQVhfTEVOR1RIXTsNCi19VF96TW1pYUNjX1pFQ0FMTF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19FQ0FMTF9XT1JLU1RBVEVfSU5EX0VWKENDLT5BVEkpDQotIMu1w/c6IMnPsagrWkVDQUxMU1RBVEU6IDxDYWxsSWQ+LDxEaXI+LDxlY2FsbFN0YXRlPg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbElkOw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGlyOw0KLQ0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRUNhbGxTdGF0ZTsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsZWFyRG93bkZnOw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2xlYXJEb3duOw0KLSAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7DQotDQotICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJlQ2FsbE1vZGVGZzsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYmVDYWxsTW9kZTsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhQ2NfRUNhbGxXb3JrU3RhdGVJbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfQ0NfVDlUSU1FUl9TRVRfUkVRX0VWDQoty7XD9zq3osvNVDm2qMqxxvcNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkVuYWJsZTsvLzAtudix1SwxLbTyv6oNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhQ2NfVDlUaW1lcl9TZXRSZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfQ0NfVDlUSU1FUl9RUllfUkVRX0VWDQoty7XD9zq3osvNVDm2qMqxxvfXtMyssunRr8frx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhQ2NfVDlUaW1lcl9RcnlSZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQ19DQUxMQkFDS19FVkVOVF9FVihDQy0+QVRJKQ0KLSDLtcP3OiDJz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkV2ZW50OyAgLyowIEVuZCAxIFN0YXJ0Ki8NCi0gICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJwYWRkaW5nWzNdOw0KLX1UX3pNbWlhQ2NfQ2FsbEJhY2tFdmVudF9JbmQ7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfQ0NfVDlUSU1FUl9RUllfQ05GX0VWDQoty7XD9zpUObaoyrHG99e0zKyy6dGvveG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVDlTdGF0Oy8vMC21scewVDnDu9PQxvS2rywxLbWxx7BUOdLRxvS2rw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFDY19UOVRpbWVyX1FyeUNuZjsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9DQ19WT0lDRU1PREVfUVJZX1JFUV9FVg0KLcu1w/c6sunRr7Wxx7C1xEVjYWxstcTS9Ma1xKPKvQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFDY19Wb2NpZU1vZGVfUXJ5UmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpNTUlBX0NDX1ZPSUNFTU9ERV9RUllfQ05GX0VWDQoty7XD9zqy6dGvtbHHsLXERWNhbGy1xNL0xrXEo8q9veG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVm9pY2VNb2RlOyAvKjA61f2zo9Pv0vTEo8q9o6wxOkluYmFuZMSjyr0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFDY19Wb2NpZU1vZGVfUXJ5Q25mOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpNTUlBX0NDX1JFU0VUSVZTX1JFUV9FVg0KLcu1w/c6yc+y49bY1sNJVlMNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX1UX3pNbWlhQ2NfUmVzZXRJdnNfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zogTU1JQV9DQ19SRVNFVElWU19DTkZfRVYNCi3LtcP3OsnPsuPW2NbDSVZTveG5+w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUnN0Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0NhdXNlOw0KLX1UX3pNbWlhQ2NfUmVzZXRJdnNfQ25mOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlN0YXR1czsgICAgICAgIC8qILLOvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDbGFzc0ZnOyAgICAgICAvKiBiQ2xhc3O05tTaseq8x867o6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBaX1ZBTElEOs/g06ayzsr9tObU2g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFpfSU5WQUxJRDrP4NOmss7K/bK7tObU2g0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqILrz0Piyzsr9KipGZ9DOyr21xM7ezNjK4su1w/fKsaOs0+u0y82sKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDbGFzczsgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVGltZUZnOyAgICAgICAgLyogVGltZbTm1Nqx6rzHzrsqLyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlRpbWU7ICAgICAgICAgIC8qIM7e06a08Lr0vdDXqtLGtci0/cqxvOQsIMih1rW3ts6nWzEtMzBdICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107DQotICAgIA0KLSAgICBUX3pfQ2FsbE51bSAgICAgICAgICAgICAgIHRGd2ROdW07ICAgICAgIC8qIENDRkPEv7HqusXC67i4tdjWt6Os1Nq0y8/7z6LW0LOktsjJz8/ezqo4Ki8NCi0gICAgVF96X0NhbGxTdWJBZGRyICAgICAgICAgICB0U3ViQWRkcjsgICAgICAgLyogQ0NGQ8S/seq6xcLr19O12Na3o6yzpLbIyc/P3s6qMjAqLw0KLX0gVF96TW1pYVNzX0Z3ZEZlYXQ7DQotDQotLyogQ0xDS6GiQ0NXQbLp0a+94bn719O94bm5ICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3RhdHVzOyAgICAgICAgLyogss68+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzRmc7ICAgICAgIC8qIGJDbGFzc7Tm1Nqx6rzHzrsqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzOyAgICAgICAgIC8qILLOvPu66rao0uWjrLK7sPy6rMCp1bm66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgDQotfSBUX3pNbWlhU3NfQ2xhc3NTdGF0dXM7DQotDQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsgICAgICAgICAvKiDKx7fxuqy07c7z1rXWuMq+o6xaX0ZBSUyx7cq+uqy07c7z1rUqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgDQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0VyckNkOyAgICAgICAgIC8qILLOvPu66rao0uUgKi8NCi19IFRfek1taWFTc19Db21tb25fQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICC907/az/vPor3hubm2qNLlICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NTX0NMQ0tfU0VUX1JFUV9FVihNTUlBLT5TUykNCi0gy7XD9zogQ0xDS7XEyejWwy+y6dGvw/zB7g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRmFjOyAgICAgICAgICAgIC8qILLOvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJNb2RlOyAgICAgICAgICAgLyogss68+7rqtqjS5SAqLw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDbGFzc0ZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzOyAgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUHdkTnVtOyAgICAgICAgIC8qIMPcwuu49sr9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhc3N3b3JkW1pfTU1JQVNTX01BWF9QV0RfTEVOXTsgICAvKiDOqjAtObXEy8S49sr919YgKi8NCi19IFRfek1taWFTc19DaXNzX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NTX0NMQ0tfUVVFUllfQ05GX0VWKFNTLT5NTUlBKQ0KLSDLtcP3OiBDTENLsunRr8P8we61xLvYuLQNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIFRfek1taWFTc19DbGFzc1N0YXR1cyAgICBhdENsYXNzWzhdOyAgICAgIC8qILLp0a+94bn7yv3X6SAqLw0KLX0gVF96TW1pYVNzX0Npc3NRZXJfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU1NfQ1BXRF9TRVRfUkVRX0VWKE1NSUEtPlNTKQ0KLSDLtcP3OiBDUFdEtcTJ6NbDw/zB7g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ3NbMl07DQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkZhYzsgICAgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiT2xkUHdkTnVtOyAgICAgIC8qvsnD3MLruPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTmV3UHdkTnVtOyAgICAgIC8q0MLD3MLruPbK/SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTmV3UHdkQWduTnVtOyAgIC8q0MLD3MLryLfIz7XEw9zC67j2yv2jrM6qwePKsaOsc3PU2bTOu9i4tGFiTmV3UHdkKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiT2xkUHdkW1pfTU1JQVNTX01BWF9QV0RfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiTmV3UHdkW1pfTU1JQVNTX01BWF9QV0RfTEVOXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiTmV3UHdkQWduW1pfTU1JQVNTX01BWF9QV0RfTEVOXTsNCi19IFRfek1taWFTc19Qd2RDaGFuZ2VfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU1NfQ0xJUF9SRUFEX1JFUV9FVihNTUlBLT5TUymhok1NSUFfU1NfQ0xJUl9SRUFEX1JFUV9FVihNTUlBLT5TUymhog0KLSBNTUlBX1NTX0NPTFBfUkVBRF9SRVFfRVYoTU1JQS0+U1MpoaJNTUlBX1NTX0NPTFJfUkVBRF9SRVFfRVYoTU1JQS0+U1MpoaJNTUlBX1NTX0FCT1JUX1JFUV9FVihNTUlBLT5TUykNCi1NTUlBX1NTX0NOQVBfUkVBRF9SRVFfRVYoTU1JQS0+U1MpDQotIMu1w/c6IENsaXBcQ2xpclxDb2xwXENvbHJcQ05BULLOyv2y6dGvw/zB7sP8we4sttTTpr/J1tC2z0FUw/zB7rXE1tW2y8frx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZ1syXTsNCi19IFRfek1taWFTc19DbGlwUmVhZF9SZXEsVF96TW1pYVNzX0NsaXJSZWFkX1JlcSwgDQotVF96TW1pYVNzX0NvbHBSZWFkX1JlcSwgVF96TW1pYVNzX0NvbHJSZWFkX1JlcSwNCi1UX3pNbWlhU3NfQWJvcnRfUmVxLFRfek1taWFTc19Vc3NkQ2FuY2VsX1JlcSwNCi1UX3pNbWlhU3NfQ25hcFJlYWRfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfU1NfQ0xJUF9SRUFEX0NORl9FVihTUy0+TU1JQSmhok1NSUFfU1NfQ0xJUl9SRUFEX0NORl9FVihTUy0+TU1JQSmhog0KLSBNTUlBX1NTX0NPTFBfUkVBRF9DTkZfRVYoU1MtPk1NSUEpoaJNTUlBX1NTX0NPTFJfUkVBRF9DTkZfRVYoU1MtPk1NSUEpoaJNTUlBX1NTX0NOQVBfUkVBRF9DTkZfRVYoU1MtPk1NSUEpoaINCi0gy7XD9zogQ2xpcFxDbGlyXENvbHBcQ29sclxDbmFwtcSy6dGvw/zB7rXEu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJNUGFyYTsgICAgICAgICAgLyogss68+7rqtqjS5SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfSBUX3pNbWlhU3NfQ2xpcFFlcl9DbmYsIFRfek1taWFTc19DbGlyUWVyX0NuZiwgDQotVF96TW1pYVNzX0NvbHBRZXJfQ25mLFRfek1taWFTc19Db2xyUWVyX0NuZixUX3pNbWlhU3NfQ25hcFFlcl9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TU19DQ0ZDX1NFVF9SRVFfRVYoTU1JQS0+U1MpDQotIMu1w/c6IENDRkO1xMno1sMvsunRr8P8we4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlYXNvbjsgICAgICAgICAvKiCyzrz7uuq2qNLlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGU7ICAgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2xhc3M7ICAgICAgICAgIC8qILLOvPu66rao0uUgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJUaW1lRmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiVGltZTsgICAgICAgICAgIC8qILr016rHsLXItP3KsbzkLMih1rW3ts6nWzEtMzBdLiDIscqh1rXOqjIwICovDQotDQotICAgIFRfel9DYWxsTnVtICAgICAgICAgICAgICAgdEZ3ZE51bTsgICAgICAgIC8qIENDRkPEv7HqusXC67i4tdjWt6Os1Nq0y73hubnW0LOktsjJz8/ezqoxOSovDQotICAgIFRfel9DYWxsU3ViQWRkciAgICAgICAgICAgdFN1YkFkZHI7ICAgICAgICAvKiBDQ0ZDxL+x6rrFwuvX07XY1rejrLOktsjJz8/ezqoyMCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfSBUX3pNbWlhU3NfQ2NmY1NldF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TU19DQ0ZDX1FVRVJZX0NORl9FVihTUy0+TU1JQSkNCi0gy7XD9zogQ0NGQ7XEsunRr8P8we61xLvYuLQNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRndkRmVhdE51bTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICANCi0gICAgVF96TW1pYVNzX0Z3ZEZlYXQgICAgICAgIGF0RndkRmVhdFs4XTsgICAvKiBDQ0ZDsunRr9fTveG5ucr91+kgKi8gDQotfSBUX3pNbWlhU3NfQ2NmY1Flcl9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TU19DQ1dBX1NFVF9SRVFfRVYoTU1JQS0+U1MpDQotIMu1w/c6IENDV0G1xMno1sMvsunRr8P8we4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYk1vZGU7ICAgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQ2xhc3NGZzsgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzOyAgICAgICAgICAvKiCyzrz7uuq2qNLlICovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZ1szXTsNCi19IFRfek1taWFTc19DY3dhU2V0X1JlcTsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NTX0NDV0FfUVVFUllfQ05GX0VWKFNTLT5NTUlBKQ0KLSDLtcP3OiBDQ1dBtcS2wcihw/zB7rXEu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICAgKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAvKiDEv7XEy/fS/SAqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNsYXNzTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotDQotICAgIFRfek1taWFTc19DbGFzc1N0YXR1cyAgICBhdENsYXNzWzhdOyAgICAgIC8qIENDV0Gy6dGv19O94bm5yv3X6SAqLyANCi19IFRfek1taWFTc19DY3dhUWVyX0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX1NTX0NVU0RfU0VUX1JFUV9FVihNTUlBLT5TUykNCi0gy7XD9zogQ1VTRMP8we4oTVMtPk5ldHdvcmu3vc/yKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3RyTGVuOyAgICAgICAgIC8qIFVTU0S0rrOktsggKi8gICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGNzOyAgICAgICAgICAgLyogseDC67e9sLggKi8NCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiVXNzZFN0cltaX01NSUFTU19NQVhfVVNTRF9MRU5dOyAgDQotfSBUX3pNbWlhU3NfQ3VzZFNldF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9TU19DVVNEX01UX0lORF9FVihTUy0+TU1JQSkNCi0gy7XD9zogQ1VTRMP8we4oTmV0d29yay0+TVO3vc/yKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTVBhcmE7ICAgICAgICAgIC8qILLOvPu66rao0uUgKi8gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3RyTGVuOyAgICAgICAgIC8qIFVTU0S0rrOktsggKi8gICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGNzOyAgICAgICAgICAgLyogseDC67e9sLggKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsgDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlVzc2RTdHJbWl9NTUlBU1NfTUFYX1VTU0RfTEVOXTsgICAgICAgICAgICAgICAgICAgICAgICAgDQotfSBUX3pNbWlhU3NfQ3VzZE10X0luZDsNCi0jaWZkZWYgX1VTRV9MUFBfRUNJRA0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJMaXN0WzJdOw0KLX1UX3pNbWlhU3NfRGVmTG9jdEV2dFR5cGU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxvY2F0aW9uRXN0bWF0ZVR5cGU7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlZkxvY0V2dFRwRmcgOjE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjc7DQotICAgIFRfek1taWFTc19EZWZMb2N0RXZ0VHlwZSAgICAgICAgdERlZkxvY0V2dFR5cGU7DQotfVRfek1taWFTc19Mb2NhdGlvblR5cGU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICBiTnVtOw0KLSAgICBCWVRFICAgYWJBZGRyW1pfTUFYX0NMRU5UQUREUl9MRU5dOw0KLX1UX3pNbWlhU3NfQWRkcmVzczsNCi0NCi0vKmxzaHc6veG5udTdyrHOtLaoKi8NCi0vL3R5cGVkZWYgc3RydWN0ew0KLS8vfVRfek1taWFTc19FeHRlbnNpb25Db250YWluZXI7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYkV4dGVybmFsQWRkcmVzc0ZnOiAxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgIGJFeHRlbnNpb25Db250YWluZXJGZzogMTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICA6NjsNCi0NCi0gICAgVF96TW1pYVNzX0FkZHJlc3MgICAgICAgICB0RXh0ZXJuYWxBZGRyZXNzOw0KLSAgICAvL1Rfek1taWFTc19FeHRlbnNpb25Db250YWluZXIgICAgICB0RXh0ZW5zaW9uQ29udGFpbmVyOw0KLX1UX3pNbWlhU3NfQ2xpZW50RXh0SWQ7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICBiTnVtOw0KLSAgICBCWVRFICAgICAgICAgYWJVU1NEU3RyaW5nW1pfTUFYX0NMRU5UTkFNRV9MRU5dOw0KLX1UX3pNbWlhU3NfTmFtZVN0cmluZzsNCi0NCi10eXBlZGVmIHN0cnVjdHsgICAgICAgICAgICAgICAgICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGFDb2RTY2hlbWU7DQotICAgIFRfek1taWFTc19OYW1lU3RyaW5nICAgICAgICAgICAgICAgIHROYW1lU3RyaW5nOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGNzRm9ybWF0SW5kaWNhdG9yRmcgOjE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo3Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTGNzRm9ybWF0SW5kaWNhdG9yOw0KLX1UX3pNbWlhU3NfQ2xpZW50TmFtZTsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgRFdPUkQgIGJMYXREaXJlOjE7ICAvKlNpZ24gb2YgbGF0aXR1ZGUqLw0KLSAgICBEV09SRCAgOjc7DQotICAgIERXT1JEICBkd0xhdGl0dWRlOjI0OyAgLypEZWdyZWVzIG9mIGxhdGl0dWRlKi8NCi0gICAgTE9ORyAgZHdMb25naXR1ZGU7ICAvKkRlZ3JlZXMgb2YgbG9uZ2l0dWRlKi8NCi19VF96X0Nvb3JkaW5hdGU7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFRfel9Db29yZGluYXRlIHRDb29yZGluYXRlOw0KLX1UX3pfRWxsaXA7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFRfel9Db29yZGluYXRlICAgICAgdENvb3JkaW5hdGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlVuY2VydENvZGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmdbM107IA0KLX1UX3pfRWxsaXBfVW5jZXJ0Q2lyY2xlOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBUX3pfQ29vcmRpbmF0ZSAgICAgIHRDb29yZGluYXRlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJNYWpvckF4aXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYkNvbmZpZGVuY2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlVuY2VydFNlbWlNaW5vcjsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiVW5jZXJ0U2VtaU1ham9yOw0KLX1UX3pfRWxsaXBfVW5jZXJ0RWxsaXA7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFRfel9Db29yZGluYXRlICAgKnB0Q29vcmRpbmF0ZXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgIGJOdW07DQotICAgIEJZVEUgICAgICAgICAgICAgICAgIGJQYWRkaW5nWzNdOw0KLX1UX3pfUG9seWdvbjsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVF96X0Nvb3JkaW5hdGUgICAgICB0Q29vcmRpbmF0ZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiRGlyZWNBbHQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIFdPUkQgICAgICAgICAgICAgICB3QWx0aXR1ZGU7DQotfVRfel9FbGxpcF9BbHQ7DQotDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFRfel9Db29yZGluYXRlICAgICAgdENvb3JkaW5hdGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlVuY2VydFNlbWlNYWpvcjsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiVW5jZXJ0U2VtaU1pbm9yOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJNYWpvckF4aXM7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYlVuY2V0QWx0OyAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDb25maWRlbmNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEaXJlY0FsdDsNCi0gICAgV09SRCAgICAgICAgICAgICAgIHdBbHRpdHVkZTsNCi19VF96X0VsbGlwX0FsdF9VbmNlcnRFbGxpcDsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVF96X0Nvb3JkaW5hdGUgICAgICB0Q29vcmRpbmF0ZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICBiVW5jZXJ0UmFkaXVzOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJDb25maWRlbmNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJJbmNsdWRlQW5nbGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgYk9mZnNldEFuZ2xlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nWzJdOw0KLSAgICBXT1JEICAgICAgICAgICAgICAgd0lubmVyUmFkaXVzOw0KLX1UX3pfRWxsaXBfQXJjOw0KLQ0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgIGJUeXBlOw0KLSAgICB1bmlvbg0KLSAgICB7DQotICAgICAgICBUX3pfRWxsaXAgICAgICAgICAgICAgICAgICB0RWxsaXA7DQotICAgICAgICBUX3pfRWxsaXBfVW5jZXJ0Q2lyY2xlICAgICB0RWxsaXBVbmNlcnRDaXJjbGU7DQotICAgICAgICBUX3pfRWxsaXBfVW5jZXJ0RWxsaXAgICAgICB0RWxsaXBVbmNlcnRFbGxpcDsNCi0gICAgICAgIFRfel9Qb2x5Z29uICAgICAgICAgICAgICAgIHRQb2x5Z29uOw0KLSAgICAgICAgVF96X0VsbGlwX0FsdCAgICAgICAgICAgICAgdEVsbGlwQWx0Ow0KLSAgICAgICAgVF96X0VsbGlwX0FsdF9VbmNlcnRFbGxpcCAgdEVsbGlwQWx0VW5jZXJ0Ow0KLSAgICAgICAgVF96X0VsbGlwX0FyYyAgICAgICAgICAgICAgdEVsbGlwQXJjOw0KLSAgICB9VmFsOw0KLX1UX3pNbWlhU3NfTHJSZXNfU2hhcGVEYXRhOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBCWVRFICAgICAgICAgIGJIb3JVbmNlcnRTcGVlZDsNCi0gICAgQllURSAgICAgICAgICBiVmVyVW5jZXJ0U3BlZWQ7DQotICAgIEJZVEUgICAgICAgICAgYlZlclNwZWVkOw0KLSAgICBXT1JEICAgICAgICAgYlZlclNwZWVkRGlyZWN0OjE7DQotICAgIFdPUkQgICAgICAgICBiVmVyU3BlZWRGZzoxOw0KLSAgICBXT1JEICAgICAgICAgYkhvclVuY2VydFNwZWVkRmc6MTsNCi0gICAgV09SRCAgICAgICAgIGJWZXJVbmNlcnRTcGVlZEZnOjE7ICANCi0gICAgV09SRCAgICAgICAgIHdCZWFyaW5nOjk7DQotICAgIFdPUkQgICAgICAgICA6MzsNCi0gICAgV09SRCAgICAgICAgIHdIb3JTcGVlZDsNCi19VF96TW1pYVNzX0xyUmVzX1ZlbG9jaXR5RGF0YTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpNTUlBX1NTX01PTFJfRU5BQkxFX1JFUV9FVi9NTUlBX1NTX01PTFJfRElTQUJMRV9SRVFfRVYNCi3LtcP3OitaTU9MUsP8we4oQVRJLT5TUykstqjOu7eixvC78tXf1tXWuQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgIGJTcmNJbmRleDsgICAgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgYkRlc0luZGV4OyAgICAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgIGJFbmFibGU7DQotICAgIEJZVEUgIGJQYWRkaW5nOw0KLX1UX3pNbWlhU3NfTW9Mcl9FbmFibGVfUmVxLCBUX3pNbWlhU3NfTW9Mcl9EaXNhYmxlX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9TU19NVExPQ0lSRVFfTk9USUZZX0lORF9FVg0KLcu1w/c6U1PK1bW9zfjC57XETVS2qM67x+vH86OszajWqkFU0OjTw7unyLfIz7aozru908rcu/K+3L74DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2xpZW50RXh0SWRGZzsNCi0gICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNsaWVudE5hbWVGZzsNCi0NCi0gICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhhbmRsZUlkOw0KLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTm90aWZpYXRpb25UeXBlOw0KLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGxhbmU7IC8qyKHWtTAgQ3RybCBQbGFuZSAgMSBTVVBJo6zP1tTa1rvIoTAqLw0KLSAgICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgIFRfek1taWFTc19Mb2NhdGlvblR5cGUgICAgICAgICAgICB0TG9jYXRpb25UeXBlOw0KLSAgICAgVF96TW1pYVNzX0NsaWVudEV4dElkICAgICAgICAgICAgIHRDbGllbnRFeHRJZDsNCi0gICAgIFRfek1taWFTc19DbGllbnROYW1lICAgICAgICAgICAgICB0Q2xpZW50TmFtZTsJIA0KLX1UX3pNbWlhU3NfTXRMb2NhbFJlcU5vdGlmeV9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfU1NfTVRMUl9BTlNfUkVRX0VWDQoty7XD9zpBVEnK1bW9TVQgTFK687340NC1xNOmtPANCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgYlNyY0luZGV4OyAgICAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFIGJEZXNJbmRleDsgICAgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFIGJBbGxvdzsgICAgLypaX1ZBTEQtvdPK3E1UTFIvWl9JTlZBTES+3L74TVRMUiovDQotICAgIEJZVEUgYkhhbmxkSUQ7IC8qTVRMUrXEserKtiovDQotfVRfek1taWFTc19NdExyX0Fuc19SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9TU19NT0xSX1JFU19JTkRfRVYNCi3LtcP3Oraozru94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICBiU3JjSW5kZXg7ICAgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICBiRGVzSW5kZXg7ICAgICAgLyogxL+1xMv30v0gKi8NCi0gICAgQllURSAgICAgIGJSZXN1bHQ7ICAgIC8qtqjOu73huftaX1NVQ0MvWl9GQUlMKi8NCi0gICAgQllURSAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICBkd0NhdXNlOyAvKsqnsNzUrdLyKi8NCi0NCi0gICAgVF96TW1pYVNzX0xyUmVzX1NoYXBlRGF0YSogICAgIHB0U2hhcGVEYXRhOw0KLSAgICBUX3pNbWlhU3NfTHJSZXNfU2hhcGVEYXRhKiAgICAgcHRBZGRTaGFwZURhdGE7DQotICAgIFRfek1taWFTc19MclJlc19WZWxvY2l0eURhdGEqICAgIHB0VmVsRGF0YTsNCi19VF96TW1pYVNzX01vTHJfUmVzX0luZDsNCi0jZW5kaWYNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0NCU19BQ1RJVkFURV9SRVFfRVYoTU1JQS0+Q0JTKQ0KLSDLtcP3OiC8pLvux+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOyAgICANCi0gICAgVF96RGV2X0F0TWVtX0NCU19NaWRTZXQgICAgICAgICAgICAgICAgIHRNaWRzOw0KLSAgICBUX3pEZXZfQXRNZW1fQ0JTX0Rjc1NldCAgICAgICAgICAgICAgICAgdERjczsNCi19VF96TW1pYUNic19BY3RpdmF0ZV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9DQlNfQUNUSVZBVEVfQ05GX0VWKENCUy0+TU1JQSkNCi0gy7XD9zogQ0JTttS8pLvux+vH87XEu9i4tA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZTsgICAgICAgICAvKjC908rVwdCx7dbQtcTP+8+iLDGyu73TytXB0LHt1tDP+8+iKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7ICAgICAgIC8qse3Kvryku+7Kx7fxs8m5pi5aX0ZBSUw6yqew3CxaX1NVQ0M6s8m5piovDQotICAgIFRfekRldl9BdE1lbV9DQlNfTWlkU2V0ICAgICAgICAgICAgICAgICB0TWlkczsgICAgICAgICAgLyrB0LHt1tC1xM/7z6JJRCovDQotICAgIFRfekRldl9BdE1lbV9DQlNfRGNzU2V0ICAgICAgICAgICAgICAgICB0RGNzOyAgICAgICAgICAgLyrB0LHt1tC1xLHgwuvEo8q9Ki8gICAgDQotfVRfek1taWFDYnNfQWN0aXZhdGVfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQ0JTX0RBVEFfSU5EX0VWKENCUy0+TU1JQSkNCi0gy7XD9zogQ0JT1ve2r8nPsahDQlPP+8+itcTK/b7dDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gIA0KLS8q0rvSs8r9vt0qLw0KLXR5cGVkZWYgc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3VyUGFnZTsgICAgICAgICAgICAvKrWxx7DSs7HgusUqLyAgICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1zZ0xlbjsgICAgICAgICAgICAgLyq1scew0rO1xNPQ0KfK/b7dtcSzpLbIKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkJ1ZltaX01NSUFDQlNfTUFYX1RFWFRfUEFHRV9MRU5dOyAgDQotfVRfek1taWFDYnNfUGFnZURhdGE7DQotDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiV2FybmluZ01zZ0luZDsgICAgIC8qvq+45s/7z6LWuMq+wODQzSovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJpRXR3c1NlY0ZsZzsgICAgIC8qRVRXU8/7z6LW0MrHt/G05tTasLLIq9DFz6IqLw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01pZDsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDYm1JbmQ7ICAgICAgICAgICAgLyrP+8+iwrfTyda4yr4svPu66iovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVG90YWxQYWdlOyAgICAgICAgIC8qtbHHsENCU8/7z6LX3NKzyv0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkN1clBhZ2VOdW07ICAgICAgICAvKrWxx7C0q8rk0rPK/S4yR8O/tM699jHSs6OsyKHWtTGjuzNHzqrL+dPQ0rOjrMih1rXT62JUb3RhbFBhZ2XP4LXIKi8gICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEY3M7DQotICAgIFRfek1taWFDYnNfUGFnZURhdGEgICAgICAgICAgICAgICAgICAgICBhdEJ1ZltaX01NSUFDQlNfTUFYX1BBR0VfTlVNXTsgICAgICAgICAgICAgICAgDQotfVRfek1taWFDYnNfRGF0YV9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6Wl9NbWlhUGRpX1NlbGxTdGF0X1N0YXJ0U2VuZFBhY2tldEluZF9FdiAoTU1JQS0+UERJKQ0KLSDLtcP3o7rP+sG/zbO8xr3hubkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaWQ7ICAgICAgICAgIC8qtbHHsLyku+6/ydPDtcRDSUQqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQZHBBZGRyW1pfTU1JQVBESV9QRFBBRERSX01BWF9MRU5dOyAgLyrK/b7dv6hETlO12Na3Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRG5zYWRkcltaX01NSUFQRElfRE5TQUREUl9NQVhfTEVOXTsgIC8qRE5Tt/7O8cb3tdjWtyovDQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlVkcENvbnRlbnRbWl9NTUlBUERJX1VEUENPTlRFTlRfTUFYX0xFTl07ICAgLypVRFDK/b7dsPzE2sjdLNfWt/u0rrjxyr0s0tRcMLHtyr694cr4Ki8NCi19VF96TW1pYVBkaV9TZWxsU3RhdF9TdGFydFNlbmRQYWNrZXRfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpfTW1pYVBkaV9TZWxsU3RhdF9BYm9ydEluZF9FdiAoTU1JQS0+UERJKQ0KLSDLtcP3o7rW0LbPt6Kw/A0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNsZWFuRmc7ICAgICAgICAgICAgICAgLyogserKtsrHt/HQ6NKqx+W/1VBESbG+tdjP+sG/zbO8xs/gudjIq77WseTBvw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS0tLS0tLcflv9WjrG1taWHU2srVtb3P+sG/zbO8xr+qus252MqxtKW3og0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC0tLS0tLbK7x+W/1aOsbW1pYdTat6LP1rWxx7DO3mNpZL/J08PKsbSlt6IqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX1UX3pNbWlhUGRpX1NlbGxTdGF0X0Fib3J0X0luZDsNCi0NCi0jaWZkZWYgQlRSVU5LX1NVUFBPUlQNCi10eXBlZGVmIHN0cnVjdHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkJDRE51bWJlckxlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYWJCQ0ROdW1iZXJbWl9BVElUU01fTUFYX0JDRF9OVU1dOw0KLX1UX3pBdGlUc21fQkNETnVtYmVyOw0KLQ0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiTmFtZUxlbjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYWJOYW1lW1pfQVRJVFNNX1VTRVJfTkFNRV9MRU5dOw0KLX1UX3pBdGlUc21fVXNlck5hbWU7DQotDQotLyogVHJhbnNwb3J0IExheWVyIEFkZHJlc3MgQ29udGVudHMgKi8NCi0NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6NTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJBZGRyVHlwZVZhbHVlICA6MzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJBZGRySW5mb0xlbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGFiQWRkckluZm9bWl9BVElUU01fTUFYX1RSVU5LX0lQX0FERFJfTlVNXTsNCi19VF96QXRpVHNtX1RydW5rSVBBZGRyOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBUX3pBdGlUc21fVHJ1bmtJUEFkZHIgICB0VHJ1bmtJcEFkZHI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgYWJQb3J0WzJdOw0KLX1UX3pBdGlUc21fVHJhbnNMYXllckFkZHI7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6MzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkFuc3dlckluZCAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJGb3JiRmxvb3JJbmQgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiQ2lwZXJJbmQgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiUHJpb0NhbGwgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiRW1lckNhbGwgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiU3BhcmU2Ojg7Ci19VF96QXRpVHNtX0NhbGxBdHRyaWJ1dGU7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6NjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYk5WT0MgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiQU1SICA6MTsKLX1UX3pBdGlUc21fU3VwQXVkaW9Db2RlY0xpc3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6NjsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkJpdGVSYXRlMiAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJCaXRSYXRlMSAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTM6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkFtck92ZXJQZGNwSW5kICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlBheWxvYWRGb3IyICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlBheWxvYWRGb3IxICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlB0aW1lNCAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJQdGltZTMgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiUHRpbWUyICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlB0aW1lMSAgOjE7Ci19VF96QXRpVHNtX0FtclBhcmFtOw0KLQ0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiU3BhcmUwOjQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJoMjYzICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYm1wZWc0ICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYmgyNjQgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBidnA4ICA6MTsKLX1UX3pBdGlUc21fU3VwVmlkZW9Db2RlY0xpc3Q7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6NDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkZSNCAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJGUjMgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiRlIyICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkZSMSAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJRVkdBICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlZHQSAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJDSUYgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiUUNJRiAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTVkdBICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlhHQSAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJIRDcyMHAgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiSEQxMDgwcCAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTEzOjY7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJDSUY0ICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkQxICA6MTsKLX1UX3pBdGlUc21fSDI2NFBhcmFtOw0KLQ0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICBiU3BhcmUwOiA2OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICBiU3VwQXVkaW9Db2RlY0xpc3RGZzogMTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgYkFtclBhcmFtRmc6IDE7Ci0gICAgVF96QXRpVHNtX1RydW5rSVBBZGRyICAgICB0VHJ1bmtJUEFkZHI7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBhYlBvcnRbMl07Ci0gICAgVF96QXRpVHNtX1N1cEF1ZGlvQ29kZWNMaXN0ICAgICB0U3VwQXVkaW9Db2RlY0xpc3Q7DQotICAgIFRfekF0aVRzbV9BbXJQYXJhbSAgICAgICAgdEFtclBhcmFtOw0KLX1UX3pBdGlUc21fQXVkaW9EaXNjcmlwOw0KLQ0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICBiU3BhcmUwOiA2OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICBiU3VwVmlkZW9Db2RlY0xpc3RGZzogMTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgYkgyNjRQYXJhbUZnOiAxOwotICAgIFRfekF0aVRzbV9UcnVua0lQQWRkciAgICAgdFRydW5rSVBBZGRyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYWJQb3J0WzJdOwotICAgIFRfekF0aVRzbV9TdXBWaWRlb0NvZGVjTGlzdCAgICAgdFN1cFZpZGVvQ29kZWNMaXN0Ow0KLSAgICBUX3pBdGlUc21fSDI2NFBhcmFtICAgICAgIHRIMjY0UGFyYW07DQotfVRfekF0aVRzbV9WaWRlb0Rpc2NyaXA7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgIHdOdW07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGFiRTJFa2V5WzEwMjRdOwotfVRfekF0aVRzbV9FMkVLZXk7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJHcm91cE5hbWVMZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJHcm91cE5hbWVbWl9BVElUU01fTUFYX0dST1VQX05BTUVfTlVNXTsNCi19VF96QXRpVHNtX0dyb3VwTmFtZTsNCi0NCi10eXBlZGVmIHN0cnVjdHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNwYXJlMDogNzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkFtclBhcmFtRmc6IDE7Ci0gICAgVF96QXRpVHNtX1N1cEF1ZGlvQ29kZWNMaXN0ICAgICB0U3VwQXVkaW9Db2RlY0xpc3Q7DQotICAgIFRfekF0aVRzbV9BbXJQYXJhbSAgICAgICAgdEFtclBhcmFtOw0KLX1UX3pBdGlUc21fQXVkaW9Db2RlY0NhcGE7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6IDc7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJIMjY0UGFyYW1GZzogMTsKLSAgICBUX3pBdGlUc21fU3VwVmlkZW9Db2RlY0xpc3QgICAgIHRTdXBWaWRlb0NvZGVjTGlzdDsNCi0gICAgVF96QXRpVHNtX0gyNjRQYXJhbSAgICAgICB0SDI2NFBhcmFtOw0KLX1UX3pBdGlUc21fVmlkZW9Db2RlY0NhcGE7DQotDQotdHlwZWRlZiBzdHJ1Y3R7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTA6MzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYk5hc1ZpZGVvU3J2ICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlNpbmdsZUNhbGwgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiQW1yT3ZlclBkY3AgIDoxOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiUGRjcEhlYWRDb21wICA6MTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkNpcGhlciAgOjE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTY6ODsKLX1UX3pBdGlUc21fVWVUcnVua0NhcGE7DQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYk1vZGU7IC8qIGJNb2Rlo7oxse3Kvryku+6jrDCx7cq+yKW8pLvuKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7ICAgDQotfSBUX3pBdGlUc21fUmVnX1JlcTsNCi0jaWZkZWYgX1IyX1NVUFBPUlQNCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkFkZHJMZW47DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBhYkFkZHJbWl9BVElUU01fTUFYX0lQQUREUl9OVU1dOw0KLX1UX3pBdGlUc21fSXBBZGRyOw0KLQ0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlNlcnZUeXBlOw0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgd1BvcnQ7DQotICAgIFRfekF0aVRzbV9JcEFkZHIgICAgICAgICB0SXBBZGRyOw0KLX1UX3pBdGlUc21fU2VydkluZm87DQotDQotLypTZXJ2ZXIgTGlzdCovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiTnVtOw0KLSAgICBUX3pBdGlUc21fU2VydkluZm8gICAgICAgYXRTZXJ2SW5mb1taX0FUSVRTTV9NQVhfU0VSVkxJU1RfTlVNXTsNCi19VF96QXRpVHNtX1NlcnZMaXN0Ow0KLSNlbmRpZg0KLQ0KLS8qRGlhbGluZyBOdW1iZXIgRXh0Ki8NCi10eXBlZGVmIHN0cnVjdHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcGFyZToxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlR5cGVOdW06MzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJOdW1QbGFuSWQ6NDsNCi19VF96QXRpVHNtX0RpYWxOdW1FeHQ7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zpBVElfVFNNX1JFR1NUQVRFX0lORCBfRVYoVFNNLT5BVEkpDQotIMu1w/c6IMnPsajXorLh17TMrA0KLSDUrdPvOkFUSV9UU01fUkVHX0NORl9FVihUU00tPkFUSSkNCi0gy7XD9zogu9i4tNeisuHIpdeisuG94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUmVnU3RhdGU7ICAgLyoxOteisuEwOs6016Ky4SovDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJDYXVzZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJTdWJzY3JpYmVyQkNETnVtYmVyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYlVzZXJOYW1lRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkVtZXJnZW5jeU51bUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJFbWVyZ2VuY3lHcm91cE51bUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOjM7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdFN1YnNjcmliZXJCQ0ROdW1iZXI7DQotICAgIFRfekF0aVRzbV9Vc2VyTmFtZSAgICAgICAgICB0VXNlck5hbWU7DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0RW1lcmdlbmN5TnVtOw0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdEVtZXJnZW5jeUdyb3VwTnVtOw0KLX0gVF96QXRpVHNtX1JlZ1N0YXRlX0luZCxUX3pBdGlUc21fUmVnU3RhdGVfQ25mOw0KLSNpZmRlZiBfUjJfU1VQUE9SVA0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IEFUSV9UU01fUkVHRVhUSU5GT19JTkRfRVYoVFNNLT5BVEkpDQotIMu1w/c6INeisuHP+8+i0K+0+LXEtsu/2rywtdjWt9DFz6LJz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIFRfekF0aVRzbV9TZXJ2TGlzdCAgICAgIHRTZXJ2TGlzdDsNCi19VF96QXRpVHNtX1JlZ0V4dEluZm9fSW5kOw0KLSNlbmRpZg0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86IEFUSV9UU01fQ0FMTF9SRVFfRVYoQVRJLT5UU00pDQotIMu1w/c6ILr0vdDH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2FsbFR5cGU7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJBdWRpb0Rlc0NyaXB0aW9uRmxhZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiVmlkZW9EZXNDcmlwdGlvbkZsYWc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkUyRWtleUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJEaWFsTnVtRXh0Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc6NDsgIA0KLQ0KLSAgICBUX3pBdGlUc21fQ2FsbEF0dHJpYnV0ZSAgICAgdENhbGxBdHRyaWJ1dGU7DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0Q2FsbGVkTlVtYmVyOw0KLSAgICBUX3pBdGlUc21fQXVkaW9EaXNjcmlwICAgICAgdEF1ZGlvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX1ZpZGVvRGlzY3JpcCAgICAgIHRWaWRlb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9FMkVLZXkgICAgICAgICAgICB0RTJFa2V5Ow0KLSAgICBUX3pBdGlUc21fRGlhbE51bUV4dCAgICAgICAgdERpYWxOdW1FeHQ7DQotfSBUX3pBdGlUc21fQ2FsbF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zpBVElfVFNNX0NBTExfQ05GX0VWKFRTTS0+QVRJKQ0KLSDLtcP3OiC69L3Qz+zTpg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkNhdXNlRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkNhbGxUeXBlRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkZsb29yU3RhdGVGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiRTJFa2V5Rmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkF1ZGlvRGVzQ3JpcHRpb25GbGFnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJWaWRlb0Rlc0NyaXB0aW9uRmxhZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiQ2FsbEF0dHJpYnV0ZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOjE7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYWxsUmVzdWx0Oy8qMToguvS90LPJuaYgMDoguvS90MqnsNwqLw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYWxsVHlwZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkZsb29yU3RhdGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMTsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZFdDYWxsSWQ7DQotDQotICAgIFRfekF0aVRzbV9DYWxsQXR0cmlidXRlICAgICB0Q2FsbEF0dHJpYnV0ZTsNCi0gICAgVF96QXRpVHNtX0F1ZGlvRGlzY3JpcCAgICAgIHRBdWRpb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9WaWRlb0Rpc2NyaXAgICAgICB0VmlkZW9EaXNjcmlwOw0KLSAgICBUX3pBdGlUc21fRTJFS2V5ICAgICAgICAgICAgdEUyRWtleTsNCi19VF96QXRpVHNtX0NhbGxfQ25mOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9DQUxMQ09ORklSTV9SRVFfRVYoQVRJLT5UU00pDQotIMu1w/c6ILG7vdDIt8jPz/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkF1ZGlvRGVzQ3JpcHRpb25GbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiVmlkZW9EZXNDcmlwdGlvbkZsYWc7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLSAgICBUX3pBdGlUc21fQXVkaW9EaXNjcmlwICAgICAgdEF1ZGlvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX1ZpZGVvRGlzY3JpcCAgICAgIHRWaWRlb0Rpc2NyaXA7DQotfSBUX3pBdGlUc21fQ2FsbENvbmZpcm1fUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9DQUxMQ09OTkVDVF9SRVFfRVYoQVRJLT5UU00pDQotIMu1w/c6ILG7vdDIt8jPway908frx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJBdWRpb0Rlc0NyaXB0aW9uRmxhZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlZpZGVvRGVzQ3JpcHRpb25GbGFnOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi0gICAgVF96QXRpVHNtX0F1ZGlvRGlzY3JpcCAgICAgIHRBdWRpb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9WaWRlb0Rpc2NyaXAgICAgICB0VmlkZW9EaXNjcmlwOw0KLX0gVF96QXRpVHNtX0NhbGxDb25uZWN0X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fQ0FMTFJMU19SRVFfRVYoQVRJLT5UU00pDQotIMu1w/c6ILr0vdDKzbfFx+vH8w0KLSAgICAgICAgICAgICAgtbGyu9CvtPiyzsr9yrGjrLHtyr7Ioc/71f3U2reixvC1xNb3vdCjrA0KLSAgICAgICAgICAgICAgK1BUVENBTExSTFNSU1A6IDAsMLHtyr7Ioc/7tbHHsNb3vdCzybmmoaMNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJDYWxsSWRGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiQ2F1c2VGZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzo2Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLX0gVF96QXRpVHNtX0NhbGxSbHNfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9DQUxMUkxTX0NORl9FVihUU00tPkFUSSkNCi0gy7XD9zog1ve2r8rNt8XP7NOmDQotIA0KLSDUrdPvOiBBVElfVFNNX0NBTExSTFNfSU5EX0VWKFRTTS0+QVRJKQ0KLSDLtcP3OiDN+LLgu/LV37XXsuPKzbfFuvS90A0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkNhdXNlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2FsbElkRmc7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLX0gVF96QXRpVHNtX0NhbGxSbHNfQ25mLFRfekF0aVRzbV9DYWxsUmxzX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fQ0FMTF9JTkRfRVYoVFNNLT5BVEkpDQotIMu1w/c6IMrVtb2xu73Qx+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkNhbGxUeXBlOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUHJpb3JpdHk7DQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRTJFa2V5Rmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJBdWRpb0Rlc0NyaXB0aW9uRmxhZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlZpZGVvRGVzQ3JpcHRpb25GbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGlhbE51bUV4dEZnOw0KLQ0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdENhbGxlZE5VbWJlcjsNCi0gICAgVF96QXRpVHNtX0NhbGxBdHRyaWJ1dGUgICAgIHRDYWxsQXR0cmlidXRlOw0KLSAgICBUX3pBdGlUc21fQXVkaW9EaXNjcmlwICAgICAgdEF1ZGlvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX1ZpZGVvRGlzY3JpcCAgICAgIHRWaWRlb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9FMkVLZXkgICAgICAgICAgICB0RTJFa2V5Ow0KLSAgICBUX3pBdGlUc21fRGlhbE51bUV4dCAgICAgICAgdERpYWxOdW1FeHQ7DQotfSBUX3pBdGlUc21fQ2FsbF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fQ0FMTFBST0NFRURfSU5EX0VWKFRTTS0+QVRJKQ0KLSDLtcP3OiDW973QytW1vc34wuey4LXEUHJvY2VlZCDJz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2FsbFR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQcmlvcml0eTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJFMkVrZXlGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkF1ZGlvRGVzQ3JpcHRpb25GbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiVmlkZW9EZXNDcmlwdGlvbkZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdENhbGxlZE5VbWJlcjsNCi0gICAgVF96QXRpVHNtX0NhbGxBdHRyaWJ1dGUgICAgIHRDYWxsQXR0cmlidXRlOw0KLSAgICBUX3pBdGlUc21fQXVkaW9EaXNjcmlwICAgICAgdEF1ZGlvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX1ZpZGVvRGlzY3JpcCAgICAgIHRWaWRlb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9FMkVLZXkgICAgICAgICAgICB0RTJFa2V5Ow0KLX0gVF96QXRpVHNtX0NhbGxQcm9jZWVkX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fQ0FMTEFMRVJUSU5HX0lORF9FVihUU00tPkFUSSkNCi0gy7XD9zog1ve90MrVtb221Le9tcTV8cHlDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQXVkaW9EZXNDcmlwdGlvbkZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi0gICAgVF96QXRpVHNtX0F1ZGlvRGlzY3JpcCAgICAgIHRBdWRpb0Rpc2NyaXA7DQotfSBUX3pBdGlUc21fQ2FsbEFsZXJ0aW5nX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fQ0FMTENPTk5FQ1RBQ0tfSU5EX0VWKFRTTS0+QVRJKQ0KLSDLtcP3OiCxu73QytW1vcGsvdPTprTwyLfIzw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLSAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotfSBUX3pBdGlUc21fQ2FsbENvbm5lY3RBY2tfSW5kOyANCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvOkFUSV9UU01fRkxPT1JfUkVRX0VWKEFUSS0+VFNNKQ0KLSDLtcP3OiDJ6sfru7DIqA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkF1ZGlvRGVzQ3JpcHRpb25GbGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiVmlkZW9EZXNDcmlwdGlvbkZsYWc7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLSAgICBUX3pBdGlUc21fQXVkaW9EaXNjcmlwICAgICAgdEF1ZGlvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX1ZpZGVvRGlzY3JpcCAgICAgIHRWaWRlb0Rpc2NyaXA7DQotfSBUX3pBdGlUc21fRmxvb3JfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9GTE9PUkdSVF9JTkRfRVYoVFNNLT5BVEkpDQotIMu1w/c6ILvxyKG1vbuwyKi1xNb3tq/Jz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQXVkaW9EZXNDcmlwdGlvbkZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJWaWRlb0Rlc0NyaXB0aW9uRmxhZzsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotICAgIFRfekF0aVRzbV9BdWRpb0Rpc2NyaXAgICAgICB0QXVkaW9EaXNjcmlwOw0KLSAgICBUX3pBdGlUc21fVmlkZW9EaXNjcmlwICAgICAgdFZpZGVvRGlzY3JpcDsNCi19IFRfekF0aVRzbV9GbG9vckdydF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zpBVElfVFNNX0ZMT09SUkxTX1JFUV9FVihBVEktPlRTTSkNCi0gy7XD9zogu7DIqLXE1ve2r8rNt8XH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi19IFRfekF0aVRzbV9GbG9vclJsc19SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T7zpBVElfVFNNX0ZMT09SUkxTX0NORl9FVihUU00tPkFUSSkNCi0gy7XD9zogu7DIqLXE1ve2r8rNt8XH68fzDQotDQotINSt0+86QVRJX1RTTV9GTE9PUlJMU19JTkRfRVYoVFNNLT5BVEkpDQotIMu1w/c6ILuwyKi1xLG7ys23xUlORA0KLQ0KLSDUrdPvOkFUSV9UU01fRkxPT1JSRUpfSU5EX0VWKFRTTS0+QVRJKQ0KLSDLtcP3OiC7sMiotcS+3L74SU5EDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi19IFRfekF0aVRzbV9GbG9vclJsc19DbmYsVF96QXRpVHNtX0Zsb29yUmxzX0luZCxUX3pBdGlUc21fRmxvb3JSZWpfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fRkxPT1JXQUlUX0lORF9FVihUU00tPkFUSSkNCi0gIMu1w/c6IMnqx+u7sMiotKbT2sXFttPXtMysDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLX0gVF96QXRpVHNtX0Zsb29yV2FpdF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9GTE9PUklORk9STV9JTkRfRVYoVFNNLT5BVEkpDQotICDLtcP3OiC7sMio0MXPorXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJGbG9vckluZm9UeXBlOy8qMDrVvNPQMTq/1c/QKi8NCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYlNlYWtlclNob3J0TnVtRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkdyb3VwU2hvcnROdW1GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiR3JvdXBOdW1GZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiU3BlYWtlck51bUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJTcGVha2VyTmFtZUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJUcmFuc0xheWVyQWRkckZnIDoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiRGlhbE51bUV4dEZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOjE7DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLQ0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdFNlYWtlclNob3J0TnVtOw0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdEdyb3VwU2hvcnROdW07DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0R3JvdXBOdW07DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0U3BlYWtlck51bTsNCi0gICAgVF96QXRpVHNtX1VzZXJOYW1lICAgICAgICAgIHRTcGVha2VyTmFtZTsNCi0gICAgVF96QXRpVHNtX1RyYW5zTGF5ZXJBZGRyICAgIHRUcmFuc0xheWVyQWRkcjsgICAgICAgICAgICAgICAgICANCi0gICAgVF96QXRpVHNtX0RpYWxOdW1FeHQgICAgICAgIHREaWFsTnVtRXh0Ow0KLX0gVF96QXRpVHNtX0Zsb29ySW5mb19JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TVFVOSU5GT19RVUVSWV9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDSo9TO17TMrLLp0a8NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19IFRfekF0aVRzbV9TdHVuSW5mb19RdWVyeV9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TVFVOSU5GT19RVUVSWV9DTkZfRVYoVFNNLT5BVEkpDQotICDLtcP3OiDSo9TO17TMrLLp0a9DTkYNCi0NCi0gINSt0+86QVRJX1RTTV9TVFVOSU5GT19JTkRfRVYoVFNNLT5BVEkpDQotICDLtcP3OiDSo9TO17TMrMnPsaggIA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlN0dW47LyowOtKjsdAxOtKj1M4yOri0u+4qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19IFRfekF0aVRzbV9TdHVuSW5mb19RdWVyeV9DbmYsVF96QXRpVHNtX1N0dW5JbmZvX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0dST1VQSU5GT19RVUVSWV9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDX6dDFz6Ky6dGvDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfSBUX3pBdGlUc21fR3JvdXBJbmZvX1F1ZXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgy7XD9zogtqjS5dfp0MXPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiR3JvdXBJZEZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiR3JvdXBOdW1iZXJGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkdyb3VwU2hvcnRCQ0ROdW1iZXJGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkdyb3VwTmFtZUZnOw0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkdyb3VwSWRCQ0ROdW1iWzZdOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIA0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdEdyb3VwTnVtYmVyOw0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgdEdyb3VwU2hvcnRCQ0ROdW1iZXI7DQotICAgIFRfekF0aVRzbV9Hcm91cE5hbWUgICAgICAgICB0R3JvdXBOYW1lOw0KLX0gVF96QXRpVHNtX0dyb3VwSW5mbzsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0dST1VQSU5GT19RVUVSWV9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDX6dDFz6Ky6dGvDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiR3JvdXBJbmZvTnVtOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgDQotICAgIFRfekF0aVRzbV9Hcm91cEluZm8gICAgIGF0R3JvdXBJbmZvW1pfQVRJVFNNX01BWF9HUk9VUElORk9fTlVNXTsNCi19IFRfekF0aVRzbV9Hcm91cEluZm9fUXVlcnlfQ25mOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fR1JPVVBJTkZPX1VQREFURV9JTkRfRVYoVFNNLT5BVEkpDQotICDLtcP3OiDX6dDFz6K4/NDCzajWqg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYk1lc3NhZ2VTUU51bUZnIDoxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcgOjc7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDdXJOdW1iZXIgOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTdW1OdW1iZXIgOjQ7DQotfSBUX3pBdGlUc21fR3JvdXBJbmZvX0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0dST1VQQ0FMTF9JTkRfRVYoVFNNLT5BVEkpDQotICDLtcP3OiDX6br0sbu90LXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYWxsVHlwZTsNCi0NCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkNhbGxlZE5VbWJlckZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJBdWRpb0Rlc0NyaXB0aW9uRmxhZzoxOw0KLSAgICBCSVRTICAgICAgICAgICAgICAgICAgICBiVmlkZW9EZXNDcmlwdGlvbkZsYWc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYkUyRWtleUZnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgIGJHcm91cFNob3J0QkNETnVtYmVyRmc6MTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc6MzsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotICAgIFRfekF0aVRzbV9DYWxsQXR0cmlidXRlICAgICB0Q2FsbEF0dHJpYnV0ZTsNCi0gICAgVF96QXRpVHNtX0JDRE51bWJlciAgICAgICAgIHRDYWxsZWROVW1iZXI7DQotICAgIFRfekF0aVRzbV9BdWRpb0Rpc2NyaXAgICAgICB0QXVkaW9EaXNjcmlwOw0KLSAgICBUX3pBdGlUc21fVmlkZW9EaXNjcmlwICAgICAgdFZpZGVvRGlzY3JpcDsNCi0gICAgVF96QXRpVHNtX0UyRUtleSAgICAgICAgICAgIHRFMkVrZXk7DQotDQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0R3JvdXBOdW1iZXI7DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0R3JvdXBTaG9ydEJDRE51bWJlcjsNCi19IFRfekF0aVRzbV9Hcm91cENhbGxfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fU0NBTkdST1VQSU5GT19SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDJqMPo1+m1xMno1sPH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU2NhblR5cGU7Lyowo7rN6siryajD6LmmxNwgMaO6sr+31smow+i5psTcIDKjurnYsdXJqMPouabE3DoqLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU2Nhbkdyb3VwTGVuOw0KLQ0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgYXRHcm91cE51bWJlcltaX0FUSVRTTV9NQVhfU0NBTkdST1VQX05VTV07DQotfSBUX3pBdGlUc21fU2NhbkluZm9fUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9TQ0FOR1JPVVBJTkZPX0NORl9FVihUU00tPkFUSSkNCi0gy7XD9zogyajD6NfpyejWw73hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfSBUX3pBdGlUc21fU2Nhbkdyb3VwSW5mb19DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TQ0FOR1JPVVBJTkZPX0lORF9FVihUU00tPkFUSSkNCi0gIMu1w/c6IM/gzazTxc/IvLa1xMmow+jX6dDFz6LJz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkdyb3VwTGVuOw0KLSAgICANCi0gICAgVF96QXRpVHNtX0JDRE51bWJlciAgICAgICAgIGF0R3JvdXBOdW1iZXJbWl9BVElUU01fTUFYX1NDQU5HUk9VUF9JTkRfTlVNXTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLX0gVF96QXRpVHNtX1NjYW5Hcm91cEluZm9fSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fU0NBTlNXSVRDSF9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDNqLuwx9C7u8frx/MNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTd2l0Y2hUeXBlOy8qMKO6x9C7u8ilvKS77jGjusfQu7u8pLvuKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkdyb3VwTnVtYmVyRmc7DQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICB0R3JvdXBOdW1iZXI7DQotfSBUX3pBdGlUc21fU2NhblN3aWNoX1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX1NIQUtFSEFORF9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDO1crWx+vH8w0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOw0KLX0gVF96QXRpVHNtX1NoYWtlSGFuZF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TSEFLRUhBTkRfQ05GX0VWKFRTTS0+QVRJKQ0KLSAgy7XD9zogztXK1sfrx/PIt8jPDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3R1blR5cGU7LyowOtKjsdAxOtKj1M4yOri0u+4qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRmFsbEJhY2tTdGF0ZTsvKjA61f2zo8Sjyr0xOrnK1c/I9buvxKPKvSovDQotICAgIA0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUmVnU3RhdGU7LyowOs6016Ky4TE616Ky4SovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYWxsU3RhdGU7LyowOrr0vdC/1c/QMTq69L3Qzai7sCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJGbG9vclN0YXRlOy8qMDrLtbuwyKgxOsz9u7DIqyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX0gVF96QXRpVHNtX1NoYWtlSGFuZF9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TSE9SVF9EQVRBX1JFUSBfRVYoQVRJLT5UU00pDQotICDLtcP3OiC3osvNyv2+3cfrx/MNCi0NCi0gINSt0+86QVRJX1RTTV9TSE9SVF9EQVRBX0lORCBfRVYgX0VWKFRTTS0+QVRJKQ0KLSAgy7XD9zogytW1vU1UtszK/b7dDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGF0YVR5cGU7LyowMSAgtszK/b7dus3XtMysyv2+3TAyICC2y7W9tsu808Pcw9zUvyovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3U2hvcnREYXRhTGVuOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGFiU2hvcnREYXRhW1pfQVRJVFNNX01BWF9TSE9SVERBVEFfTEVOXTsNCi19IFRfekF0aVRzbV9TaG9ydF9EYXRhX1JlcSxUX3pBdGlUc21fU2hvcnRfRGF0YV9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9MT0NBVElORk9fUkVRX0VWKEFUSS0+VFNNKQ0KLSAgy7XD9zogt6LLzbaozrvH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiR3BzVGFnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkxvbmdpdHVkZURpcjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkxhdGl0dWRlRGlyOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotDQotICAgIERXT1JEICAgICAgICAgICAgICAgICAgIGR3TG9uZ2l0dWRlOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0xhdGl0dWRlOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NlcnRhaW50eTsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdCZWFyaW5nOw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd1NwZWVkSW50UGFydDsNCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdTcGVlZEZyYWN0UGFydDsNCi19IFRfekF0aVRzbV9Mb2NhdEluZm9fUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fTE9DQVRJTkZPX1RZUEVfSU5EX0VWKFRTTS0+QVRJKQ0KLSAgy7XD9zog1ve2r8nPsai2qM67wODQzQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYk9wZXJhdGVUeXBlOy8qMKO6xtXNqMSjyr22qM67MaO6vfS8scSjyr22qM67Ki8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfSBUX3pBdGlUc21fTG9jYXRJbmZvX1R5cGVfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fU0VUQUJJTElUWV9SRVFfRVYoQVRJLT5UU00pDQotICDLtcP3OiDJ6NbDvK/IusTcwaYNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgVF96QXRpVHNtX0F1ZGlvQ29kZWNDYXBhICAgICB0QXVkaW9Db2RlY0NhcGFiaWxpdHk7DQotICAgIFRfekF0aVRzbV9WaWRlb0NvZGVjQ2FwYSAgICAgdFZpZGVvQ29kZWNDYXBhYmlsaXR5Ow0KLSAgICBUX3pBdGlUc21fVWVUcnVua0NhcGEgICAgICAgIHRVZVRydW5rQ2FwYTsNCi19IFRfekF0aVRzbV9TZXRBYmlsaXR5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0ZBTExCQUNLX0lORF9FVihUU00tPkFUSSkNCi0gIMu1w/c6ILnK1c/I9buv17TMrMnPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTdGF0ZTsvKsih1rUwOtX9s6PEo8q9MTq5ytXPyPW7r8Sjyr0qLw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsNCi19IFRfekF0aVRzbV9GYWxsQmFja19JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TUEVBS0lOR1RJTUVST1VUX0lORF9FVihUU00tPkFUSSkNCi0gIMu1w/c6ILuwyKu8tL2rs6zKsc2o1qoNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZUZnOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiVFNwZWFrT3V0VmFsdWVGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgd1RTcGVha091dFZhbHVlOyAgICAgICAgICAgICAgIA0KLX0gVF96QXRpVHNtX1NwZWFraW5nVGltZXJPdXRfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fVklERU9TT1VSQ0VfSU5EX0VWKFRTTS0+QVRJKQ0KLSAgy7XD9zogytPGtdS0zajWqg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlNwYXJlOjQ7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiVmlkZW9Tb3VyY2VuYW1lRmcgOjE7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiVmlkZW9Tb3VyY2VJREZnIDoxOw0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgYlRyYW5zTGF5ZXJBZGRyRmcgOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICBiRGlhbE51bUV4dEZnIDoxOw0KLSAgICANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgIGR3Q2FsbElkOw0KLSAgICBUX3pBdGlUc21fQkNETnVtYmVyICAgICAgICAgIHRWaWRlb1NvdXJjZUlEOw0KLSAgICBUX3pBdGlUc21fVXNlck5hbWUgICAgICAgICAgIHRWaWRlb1NvdXJjZW5hbWU7ICAgICAgDQotICAgIFRfekF0aVRzbV9UcmFuc0xheWVyQWRkciAgICAgdFRyYW5zTGF5ZXJBZGRyOyAgICANCi0gICAgVF96QXRpVHNtX0RpYWxOdW1FeHQgICAgICAgICB0RGlhbE51bUV4dDsNCi19IFRfekF0aVRzbV9WaWRlb1NvdXJjZV9JbmQ7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9TUlNUQVRVU19JTkRfRVYoVFNNLT5BVEkpDQotICDLtcP3OiDStc7xyse38de0zKzJz7GoDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiU3JTdGF0dXM7LyrIoda1MDrV/bOjMTrK3M/eKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7DQotfSBUX3pBdGlUc21fU1JTdGF0dXNfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0+86QVRJX1RTTV9DQUxMSE9MRF9JTkRfRVYoVFNNLT5BVEkpDQotIMu1w/c6IMrVtb1UU021xGNhbGwgSG9sZCDP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2FsbEhvbGRUeXBlOyANCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYWxsZWROVW1iZXJGZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRpYWxOdW1FeHRGZzsNCi0NCi0gICAgVF96QXRpVHNtX0JDRE51bWJlciAgICAgICAgIHRDYWxsZWROVW1iZXI7DQotICAgIFRfekF0aVRzbV9EaWFsTnVtRXh0ICAgICAgICB0RGlhbE51bUV4dDsNCi19IFRfekF0aVRzbV9DYWxsSG9sZF9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOkFUSV9UU01fQlVTWV9BTEVSVElOR19JTkRfRVYoVFNNLT5BVEkpDQoty7XD9zrNqNaquN/Txc/IvLa69L3QDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgICAgDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAvKsS/tcTL99L9ucy2qMzus8kyNTW8tL/JKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsbW9kZTsgICAgICAgICAgIC8qMLDry6u5pLWluvQgMdfpuvSjrDLIq8uruaS1pSovICAgICANCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzsNCi0gICAgVF96QXRpVHNtX0JDRE51bWJlciAgICAgICAgICAgICB0Q2FsbGVkTlVtYmVyOyAgICAgIC8qtaW69MrH1ve90E5VTUJFUiwg1+m69MrH1rjX6bbU06a1xEdJRCovDQotfVRfekF0aVRzbV9CdXN5X0FsZXJ0aW5nX0luZDsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX1BUVEJFQVJfSU5EX0VWKFRTTS0+QVRJKQ0KLSAgy7XD9zogt6LLzbPQ1NjH68fzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiUHR0QmVhckF0Q2lkTnVtOw0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBhYlB0dEJlYXJBdENpZFtaX0FUSVRTTV9QVFRCRUFSX05VTV07DQotfSBUX3pBdGlUc21fUHR0QmVhcl9JbmQ7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOkFUSV9UU01fQ0FMTEZPUldBUkRfUkVRX0VWKEFUSS0tPlRTTSkNCi3LtcP3Os2o1qpUU029+NDQuvS90Mew16q8pLvuoaLIpbyku+6horLp0a8NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiTW9kZTsNCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgIGJTcGFyZTo2OyANCi0gICAgQklUUyAgICAgICAgICAgICAgICAgICAgIGJDYWxsRm9yd2FyZEZsYWc6MTsgICAgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICBiRGlhbE51bUV4dEZnOjE7DQotDQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgdERzdENhbGxlZE51bWJlcjsNCi0gICAgVF96QXRpVHNtX0RpYWxOdW1FeHQgICAgICB0RGlhbE51bUV4dDsNCi19IFRfekF0aVRzbV9DYWxsRm9yd2FyZF9SZXE7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOkFUSV9UU01fQ0FMTEZPUldBUkRfSU5EX0VWKFRTTS0+QVRJKQ0KLcu1w/c6u9i4tEFUSbyku+4vyKW8pLvuyLfIz6GisunRr73hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiTW9kZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7DQotDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiU3BhcmU6NjsgDQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiQ2FsbEZvcndhcmRGbGFnOjE7DQotICAgIEJJVFMgICAgICAgICAgICAgICAgICAgICAgICBiRGlhbE51bUV4dEZnOjE7DQotDQotICAgIFRfekF0aVRzbV9CQ0ROdW1iZXIgICAgICAgICAgdERzdENhbGxlZE51bWJlcjsNCi0gICAgVF96QXRpVHNtX0RpYWxOdW1FeHQgICAgICAgICB0RGlhbE51bUV4dDsNCi19IFRfekF0aVRzbV9DYWxsRm9yd2FyZF9JbmQ7DQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gINSt0+86QVRJX1RTTV9DQUxMX01PRElGWV9SRVFVRVNUKFRTTS0+QVRJKQ0KLSAgy7XD9zogw73M5dDeuMTH68fzz/vPorXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJBdWRpb0Rlc0NyaXB0aW9uRmxhZzsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlZpZGVvRGVzQ3JpcHRpb25GbGFnOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi0gICAgVF96QXRpVHNtX0F1ZGlvRGlzY3JpcCAgICAgIHRBdWRpb0Rpc2NyaXA7DQotICAgIFRfekF0aVRzbV9WaWRlb0Rpc2NyaXAgICAgICB0VmlkZW9EaXNjcmlwOw0KLX0gVF96QXRpVHNtX0NhbGxNb2RpZnlfUmVxOw0KLQ0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICDUrdPvOkFUSV9UU01fQ0FMTF9NT0RJRllfQUNLKFRTTS0+QVRJKQ0KLSAgy7XD9zogw73M5dDeuMTH68fzz/vPorXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZUZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJSZXN1bHQ7DQotDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJDYXVzZTsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi19IFRfekF0aVRzbV9DYWxsTW9kaWZ5X0FjazsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0NBTExfTU9ESUZZX1JTUChBVEktPlRTTSkNCi0gIMu1w/c6IEFQs8m5ps/s06bDvczl0N64xMfrx/PP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQXVkaW9EZXNDcmlwdGlvbkZsYWc7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJWaWRlb0Rlc0NyaXB0aW9uRmxhZzsNCi0NCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgZHdDYWxsSWQ7DQotICAgIFRfekF0aVRzbV9BdWRpb0Rpc2NyaXAgICAgICB0QXVkaW9EaXNjcmlwOw0KLSAgICBUX3pBdGlUc21fVmlkZW9EaXNjcmlwICAgICAgdFZpZGVvRGlzY3JpcDsNCi19IFRfekF0aVRzbV9DYWxsTW9kaWZ5X1JzcDsNCi0NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAg1K3T7zpBVElfVFNNX0NBTExfTU9ESUZZX1JFSihBVEktPlRTTSkNCi0gIMu1w/c6IEFQyqew3M/s06bDvczl0N64xMfrx/PP+8+iDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICBiQ2F1c2U7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLQ0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICBkd0NhbGxJZDsNCi19IFRfekF0aVRzbV9DYWxsTW9kaWZ5X1JlajsNCi0NCi0jZW5kaWYNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julpfTW1pYUFzX1JwdFJ4bGV2X1JlcV9FdiAoTU1JQS0+TUNSKQotICAgICAgIFJSTUlfU1RBUlRfUlhTVEFUX1JFUSAoTU1JQS0+R1JSKQotCi0gy7XD9zogMSlNTUlByejWw01DUtDFusXHv7bI1ve2r8nPsaiyzsr9IChaX01taWFBc19ScHRSeGxldl9SZXFfRXYpCi0gICAgICAgMilNTUlByejWw0dSUtDFusXHv7bI1ve2r8nPsaiyzsr9IChSUk1JX1NUQVJUX1JYU1RBVF9SRVEpCi0KLSDXoqO6uMO94bm5sdjQ67rNMkfKudPDtcR5UERlZl9SUk1JX1NUQVJUX1JYU1RBVF9SRVG94bm5z+DNrAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgICAgICAgLyog1LTL99L9ICovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgICAgICAgLyogxL+1xMv30v0qLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUnhsZXZUaHJlZDsgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAg0MW6xce/tsix5Luvt6fWtaOsyc+xqMz1vP4stbHQxbrFuMSx5CsvLShiUnhsZXZUaHJlZCnKscnPsaihowotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVERE0MW6xbHku6+3ts6nyscwLTkxo6xHU03QxbrFseS7r7e2zqfKxzCjrTYzoaMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIDGjutDFusW4xLHkMURCvs3Jz7GoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAyo7rQxbrFuMSx5DJEQr7Nyc+xqAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgMHhGRqO6udix1db3tq/Jz7GoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsKLX1UX3pNbWlhQXNfUnB0UnhsZXZfUmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julpfTW1pYUFTX1JwdFJ4bGV2X0luZF9FdiggTUNSLT5NTUlBICk7IAotICAgICAgIFpfTW1pYUFzX1F1ZXJ5UnhsZXZfQ25mX0V2KCBNQ1ItPk1NSUEgKQotICAgICAgIFJSTUlfUlhTVEFUX0lORCAoIEdSUi0+TU1JQSApCi0gICAgICAgUlJBVF9SWFNUQVRfSU5EICggR1JSLT5NTUlBICkKLQotIMu1w/c6IDEpTUNS0MW6xbjEseSzrLn9t6fWtcqxyc+xqNDFusXHv7bIIChaX01taWFBU19ScHRSeGxldl9JbmRfRXYpOwotICAgICAgIDIpTUNSsunRr8qxyc+xqNDFusXHv7bIIChaX01taWFBc19RdWVyeVJ4bGV2X0NuZl9FdikKLSAgICAgICAzKUdSUtDFusW4xLHks6y5/ben1rXKscnPsajQxbrFx7+2yCAoUlJNSV9SWFNUQVRfSU5EKQotICAgICAgIDQpR1JSsunRr8qxyc+xqNDFusXHv7bIIChSUkFUX1JYU1RBVF9JTkQpCi0KLSDXoqO6uMO94bm5sdjQ67rNMkfKudPDtcR5UERlZl9SUk1JX1JYU1RBVF9JTkS94bm5z+DNrAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OyAgLyog1LTL99L9ICovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJ4bGV2OyAgICAgICAgICAvKkxURSBSc3JwIDAtOTcgICBHU00gUnhsZXYgMC02NCAgVEQmVyBSc2NwIDAtOTEqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiQmxlckZsZzsgICAgICAgIC8qyse38bTm1NpCTEVS1rXJz7GoLmJCbGVyRmxnID0gMbHtyr7T0M7zwuvCysnPsagsYkJsZXJGbGcgPSAwse3Kvs7ezvPC68LKyc+xqCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJCbGVyOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbM107Ci19VF96TW1pYUFzX1JwdFJ4bGV2X0luZDsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julpfTW1pYUFzX0VNX0NlbGxJbmZvUmVxX0V2IChNTUlBLT5VTUNSKQotICAgICAgIFJSX0VNX0NFTExfSU5GT19SRVEgKE1NSUEtPkdSUikKLSDLtcP3OiC5pLPMxKPKvc/CTU1JQc2o1qpVTUNSv6rG9Nb3tq/Jz7Go0KHH+NDFz6IgKFpfTW1pYUFzX0VNX0NlbGxJbmZvUmVxX0V2KQotICAgICAgILmks8zEo8q9z8JNTUlBzajWqkdSUr+qxvTW97avyc+xqNChx/jQxc+iIChSUl9FTV9DRUxMX0lORk9fUkVRKQotCi0g16KjurjDveG5ubHY0Ou6zTJHyrnTw7XEeVBEZWZfUlJfRU1fQ0VMTF9JTkZPX1JFUb3hubnP4M2sCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotIHR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAvKiDUtMv30v0gKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAvKiDEv7XEy/fS/SovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFjdGlvbjsgICAgICAgLyoxOrTyv6rQocf40MXPotb3tq/Jz7Goo6wwOrnYsdXQocf40MXPotb3tq/Jz7GoKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsKLX1UX3pNbWlhQXNfRU1fQ2VsbEluZm9fUmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julpfTW1pYUFzX0VNX1VDZWxsSW5mb0luZF9FdgotIMu1w/ejurmks8zEo8q9z8JVTUNS1tzG2tDUyc+xqFVUUkFO0KHH+NDFz6KjqNbcxtrU3baozqoxc6OpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcwWzJdOwotLyrN+MLn0MXPoiovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDZWxsSWQ7ICAgICAgLyrPtc2z0MXPotbQueOypbXEQ0kqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSYWM7ICAgICAgICAgIC8qwrfTycf4Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzE7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0xhYzsgICAgICAgICAgLyrOu9bDx/gqLwotICAgIFRfel9QbG1uSWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRQbG1uSWQ7ICAgICAgIC8qtbHHsNekwfS1xHBsbW5pZCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcyOwotLyq3/s7x0KHH+NDFz6IqLwotICAgIFRfel9DZWxsSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRTQ2VsbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3ViTW9kZTsgICAgICAvKrWxx7DX08Sjyr0qLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBdHQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5tbzsgICAgICAgICAgLypOZXR3b3JrIG1vZGUqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSc2NwOyAgICAgICAgIC8qt/7O8dChx/jQxbrF1srBv6OsVETQocf4zqpSU0NQo6xHU03Qocf4zqpSU1NJIExURc6qUlNSUCovCi0KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VDMyMTI7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1dGcmVxOyAgICAgICAgLyq5pNf3xrW14yovCi0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFuZDsKLS8qwdrH+NDFz6IqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOVENlbGxOdW07ICAgIC8qyrW8ysnPsahURMHax/jK/aOsv8nS1M6qMCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5HQ2VsbE51bTsgICAgLyrKtbzKyc+xqEdTTcHax/jK/Sy/ydLUzqowKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTkxDZWxsTnVtOyAgICAvKsq1vMrJz7GoTFRFwdrH+Mr9LL/J0tTOqjAqLwotCi0gICAgVF96X1RkQ2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXROVENlbGxMaXN0W1pfRU1fTUFYX05UQ0VMTF9OVU1dOyAvKlREwdrH+MHQse2jrLC0UlNDULTTx7+1vcj1xcXQ8qOsyv3X6TDOqtfux7/Qocf4Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5UQ2VsbFJzY3BMaXN0W1pfRU1fTUFYX05UQ0VMTF9OVU1dOy8qVETB2sf4UlNDUNa1o6y6zWF0TlRDZWxsTGlzdNbQ0KHH+NK70ru21NOmKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmczWzJdOwotCi0gICAgVF96X0dzbUNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXROR0NlbGxMaXN0W1pfRU1fTUFYX05HQ0VMTF9OVU1dOyAvKkdTTcHax/jB0LHto6ywtFJTU0m008e/tb3I9cXF0PKjrMr91+kwzqrX7se/0KHH+CovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJOR0NlbGxSc3NpTGlzdFtaX0VNX01BWF9OR0NFTExfTlVNXTsvKkdTTcHax/hSU1NJ1rWjrLrNYXROR0NlbGxMaXN01tDQocf40rvSu7bU06YqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTkdDZWxsTWluUnhsZXZMaXN0W1pfRU1fTUFYX05HQ0VMTF9OVU1dOy8qR1NNwdrH+Nfu0KG908rVtefGvda1o6y6zWF0TkdDZWxsTGlzdNbQ0KHH+NK70ru21NOmoaMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyPTO3s/g06bPtc2z0MXPoqOs1PLWtc6qMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFRfel9MdGVDZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TkxDZWxsTGlzdFtaX0VNX01BWF9OTENFTExfTlVNXTsgLypMVEXB2sf4wdCx7aOssLRSU1JQtNPHv7W9yPXFxdDyo6zK/dfpMM6q1+7Hv9Chx/gqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTkxDZWxsUnNycExpc3RbWl9FTV9NQVhfTkxDRUxMX05VTV07LypMVEXB2sf4UlNSUNa1o6y6zWF0TkxDZWxsTGlzdNbQ0KHH+NK70ru21NOmKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5MQ2VsbFJzcnFMaXN0W1pfRU1fTUFYX05MQ0VMTF9OVU1dOy8qTFRFwdrH+FJTUnHWtaOsus1hdE5MQ2VsbExpc3TW0NChx/jSu9K7ttTTpiovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJEZXRldEZsZ1taX0VNX01BWF9OTENFTExfTlVNXTsvKtfUvOzQocf4serKtqOsus1hdE5MQ2VsbExpc3TW0NChx/jSu9K7ttTTpqOsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMih1rUxse3KvsrH19S8urzssuKz9rXE0KHH+KOsyKHWtTCx7cq+ysfN+LLgz8K3orXE0KHH+CovICAgIAotfVRfek1taWFBc19FTV9VQ2VsbEluZm9fSW5kOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julJSX0VNX0NFTExfSU5GT19JTkQKLSDLtcP3o7pHUlK3osvNuPhNTUlBtcRHU03Qocf40MXPoqOoveG5uc2sMke1xHlQRGVmX1JSX0VNX0NFTExfSU5GT19JTkSjqQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7ICAvKiDUtMv30v0gKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAvKiDEv7XEy/fS/SovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nMFsyXTsKLS8qzfjC59DFz6IqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q2VsbElkOyAgICAgIC8qz7XNs9DFz6LW0LnjsqW1xENJKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmFjOyAgICAgICAgICAvKsK308nH+CovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmcxOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdMYWM7ICAgICAgICAgIC8qzrvWw8f4Ki8KLSAgICBUX3pfUGxtbklkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UGxtbklkOyAgICAgICAvKrWxx7DXpMH0tcRwbG1uaWQqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nMjsKLS8qt/7O8dChx/jQxc+iKi8KLSAgICBUX3pfQ2VsbEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U0NlbGw7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlN1Yk1vZGU7ICAgICAgLyq1scew19PEo8q9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXR0OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJObW87ICAgICAgICAgIC8qTmV0d29yayBtb2RlKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUnNzaTsgICAgICAgICAvKrf+zvHQocf40MW6xdbKwb+jrFRE0KHH+M6qUlNDUKOsR1NN0KHH+M6qUlNTSSBMVEXOqlJTUlAqLwotCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1QzMjEyOyAgCi0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0RjaEFyZmNuOyAgICAgLypHU021scewxrW14yovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkxpbmtUaW1lT3V0Oy8qzt7P38G0wrfKp7DcvMbK/cb3Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmczWzNdOwotCi0vKkdTTbf+zvHQocf4uL2809DFz6IsvfbU2rf+zvHQocf41sbKvc6qR1NNyrHT0NCnKi8KLSAgICBTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQzE7ICAgICAgICAgICAvKiDCt762y/C6xCovCi0gICAgU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0MyOwotICAgIFNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNDMzE7Ci0gICAgU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0MzMjsKLSAgICAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3VwR3ByczsgICAgICAvKiDQocf4yse38dans9ZHUFJTKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3VwRHR4Rmc7ICAgICAvKiDQocf4yse38dans9ZEVFgqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdXBIb3A7ICAgICAgIC8qINChx/jKx7fx1qez1sz4xrUqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJUYXY7ICAgICAgICAgIC8qIMqxvOTM4cewwb8qLwotCi0vKsHax/jQxc+iKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTlRDZWxsTnVtOyAgICAvKsq1vMrJz7GoVETB2sf4yv2jrL/J0tTOqjAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOR0NlbGxOdW07ICAgIC8qyrW8ysnPsahHU03B2sf4yv0sv8nS1M6qMCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5MQ2VsbE51bTsgICAgLyrKtbzKyc+xqExURcHax/jK/Sy/ydLUzqowKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzQ7Ci0KLSAgICBUX3pfVGRDZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE5UQ2VsbExpc3RbWl9FTV9NQVhfTlRDRUxMX05VTV07IC8qVETB2sf4wdCx7aOssLRSU0NQtNPHv7W9yPXFxdDyo6zK/dfpMM6q1+7Hv9Chx/gqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTlRDZWxsUnNjcExpc3RbWl9FTV9NQVhfTlRDRUxMX05VTV07LypURMHax/hSU0NQ1rWjrLrNYXROVENlbGxMaXN01tDQocf40rvSu7bU06YqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzVbMl07Ci0KLSAgICBUX3pfTkdjZWxsX2luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTkdjZWxsSW5mb1taX0VNX01BWF9OR0NFTExfTlVNXTsvKkdTTcHax/jQxc+io6ywtFJTU0m008e/tb3I9cXF0PKjrMr91+kwzqrX7se/0KHH+CovCi0gICAgCi0gICAgVF96X0x0ZUNlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXROTENlbGxMaXN0W1pfRU1fTUFYX05MQ0VMTF9OVU1dOyAvKkxURcHax/jB0LHto6ywtFJTUlC008e/tb3I9cXF0PKjrMr91+kwzqrX7se/0KHH+CovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJOTENlbGxSc3JwTGlzdFtaX0VNX01BWF9OTENFTExfTlVNXTsvKkxURcHax/hSU1JQ1rWjrLrNYXROTENlbGxMaXN01tDQocf40rvSu7bU06YqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTkxDZWxsUnNycUxpc3RbWl9FTV9NQVhfTkxDRUxMX05VTV07LypMVEXB2sf4UlNScda1o6y6zWF0TkxDZWxsTGlzdNbQ0KHH+NK70ru21NOmKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYkRldGV0RmxnW1pfRU1fTUFYX05MQ0VMTF9OVU1dOy8q19S87NChx/ix6sq2o6y6zWF0TkxDZWxsTGlzdNbQ0KHH+NK70ru21NOmo6wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKHWtTGx7cq+ysfX1Ly6vOyy4rP2tcTQocf4o6zIoda1MLHtyr7Kx834suDPwreitcTQocf4Ki8KLX1UX3pNbWlhQXNfRU1fR0NlbGxJbmZvX0luZDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSDUrdPvo7paX01taWFBc19FTV9FVUNlbGxJbmZvSW5kX0V2Ci0gy7XD96O6uaSzzMSjyr3PwkVVTUNS1tzG2tDUyc+xqFVUUkFO0KHH+NDFz6KjqNbcxtrU3baozqoxc6OpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmcwWzJdOwotLyrN+MLn0MXPoiovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDZWxsSWQ7ICAgICAgLyrPtc2z0MXPotbQueOypbXEQ0kqLwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdUYWM7ICAgIAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZzFbMl07Ci0gICAgVF96X1BsbW5JZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFBsbW5JZDsgICAgICAgLyq1scew16TB9LXEcGxtbmlkKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzI7Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3VWxGZGRBcmZjbjsgICAvKkZERC1MVEXPws6qyc/Q0Ma1teMqLyAgCi0vKrf+zvHQocf40MXPoiovCi0gICAgVF96X0NlbGxJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFNDZWxsOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSc3JwOyAgICAgICAgIC8qt/7O8dChx/jQxbrF1srBv6OsVETQocf4zqpSU0NQo6xHU03Qocf4zqpSU1NJIExURc6qUlNSUCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJzcnE7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhbmQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc0OwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q3NnSWQ7ICAgICAgIC8quaS+39Kqx/PP1Mq+Q1NHSUSjrMirRs6qzt7Qp9a1Ki8KLS8qwdrH+NDFz6IqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOVENlbGxOdW07ICAgIC8qyrW8ysnPsahURMHax/jK/aOsv8nS1M6qMCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5HQ2VsbE51bTsgICAgLyrKtbzKyc+xqEdTTcHax/jK/Sy/ydLUzqowKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTkxDZWxsTnVtOyAgICAvKsq1vMrJz7GoTFRFwdrH+Mr9LL/J0tTOqjAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nNTsKLQotICAgIFRfel9UZENlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TlRDZWxsTGlzdFtaX0VNX01BWF9OVENFTExfTlVNXTsgLypURMHax/jB0LHto6ywtFJTQ1C008e/tb3I9cXF0PKjrMr91+kwzqrX7se/0KHH+CovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJOVENlbGxSc2NwTGlzdFtaX0VNX01BWF9OVENFTExfTlVNXTsvKlREwdrH+FJTQ1DWtaOsus1hdE5UQ2VsbExpc3TW0NChx/jSu9K7ttTTpiovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nNlsyXTsKLQotICAgIFRfel9Hc21DZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TkdDZWxsTGlzdFtaX0VNX01BWF9OR0NFTExfTlVNXTsgLypHU03B2sf4wdCx7aOssLRSU1NJtNPHv7W9yPXFxdDyo6zK/dfpMM6q1+7Hv9Chx/gqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiTkdDZWxsUnNzaUxpc3RbWl9FTV9NQVhfTkdDRUxMX05VTV07LypHU03B2sf4UlNTSda1o6y6zWF0TkdDZWxsTGlzdNbQ0KHH+NK70ru21NOmKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5HQ2VsbE1pblJ4bGV2TGlzdFtaX0VNX01BWF9OR0NFTExfTlVNXTsvKkdTTcHax/jX7tChvdPK1bXnxr3WtaOsus1hdE5HQ2VsbExpc3TW0NChx/jSu9K7ttTTpqGjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMj0zt7P4NOmz7XNs9DFz6KjrNTy1rXOqjAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBUX3pfTHRlQ2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE5MQ2VsbExpc3RbWl9FTV9NQVhfTkxDRUxMX05VTV07IC8qTFRFwdrH+MHQse2jrLC0UlNSULTTx7+1vcj1xcXQ8qOsyv3X6TDOqtfux7/Qocf4Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYk5MQ2VsbFJzcnBMaXN0W1pfRU1fTUFYX05MQ0VMTF9OVU1dOy8qTFRFwdrH+FJTUlDWtaOsus1hdE5MQ2VsbExpc3TW0NChx/jSu9K7ttTTpiovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJOTENlbGxSc3JxTGlzdFtaX0VNX01BWF9OTENFTExfTlVNXTsvKkxURcHax/hSU1Jx1rWjrLrNYXROTENlbGxMaXN01tDQocf40rvSu7bU06YqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiRGV0ZXRGbGdbWl9FTV9NQVhfTkxDRUxMX05VTV07LyrX1Lzs0KHH+LHqyrajrLrNYXROTENlbGxMaXN01tDQocf40rvSu7bU06ajrAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIoda1MbHtyr7Kx9fUvLq87LLis/a1xNChx/ijrMih1rUwse3KvsrHzfiy4M/Ct6K1xNChx/gqLwotfVRfek1taWFBc19FTV9FVUNlbGxJbmZvX0luZDsKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0g1K3T76O6Wl9NbWlhQXNfRU1fSG9JbmZvUmVxX0V2ICggTU1JQS0+VVJCQyApCi0gICAgICAgUlJfRU1fSE9fSU5GT19SRVEgKE1NSUEtPkdSUkMpCi0gy7XD96O6zajWqlVSQkMvR1JSQ7Tyv6q78tXfudix1cfQu7vQxc+itcTW97avyc+xqAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWN0aW9uOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOwotfVRfek1taWFBc19FTV9Ib0luZm9fUmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotINSt0++julpfTW1pYUFzX0VNX1VIb0luZm9JbmRfRXYKLSDLtcP3o7pVUkJD1ve2r8nPsahVVFJBTs/gudjH0Lu70MXPogotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLSAgICAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSGFyZEhvU3VjY0NudDsgICAgICAvKiBURNOyx9C7u7PJuaa0zsr9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmF0b25Ib1N1Y2NDbnQ7ICAgICAvKiBURL3TwabH0Lu7s8m5prTOyv0qLwotCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhhcmRIb0ZhaWxDbnQ7ICAgICAgLyogVETTssfQu7vKp7DctM7K/SovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhdG9uSG9GYWlsQ250OyAgICAgLyogVES908Gmx9C7u8qnsNy0zsr9Ki8KLSAgICAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGRIb0dzbVN1Y2NDbnQ7ICAgICAvKiBURMfQu7u1vUdTTbPJuaa49sr9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVGRIb0dzbUZhaWxDbnQ7ICAgICAvKiBURMfQu7u1vUdTTcqnsNy0zsr9Ki8KLX1UX3pNbWlhQXNfRU1fVUhvSW5mb19JbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0g1K3T76O6UlJfRU1fSE9fSU5GT19JTkQgKEdSUkMtPk1NSUEpCi0gy7XD96O6R1JSQ9b3tq/Jz7GoR1NNz+C52MfQu7vQxc+io6i94bm5zawyR7XEeVBEZWZfUlJfRU1fSE9fSU5GT19JTkSjqQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsgIC8qIMS/tcTL99L9Ki8KLQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTeW5jSG9TdWNjQ250OyAgICAgIC8qIEdTTc2ssr3H0Lu7s8m5prj2yv0qLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBc3luY0hvU3VjY0NudDsgICAgIC8qIEdTTdLssr3H0Lu7s8m5prj2yv0qLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQcmVIb1N1Y2NDbnQ7ICAgICAgIC8qIEdTTdSkx9C7u7PJuaa0zsr9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHNldWRvSG9TdWNjQ250OyAgICAvKiBHU03OscfQu7uzybmmtM7K/SovCi0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0hvRmFpbENudDsgICAgICAvKiBHU03NrLK9x9C7u8qnsNy49sr9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQXN5bmNIb0ZhaWxDbnQ7ICAgICAvKiBHU03S7LK9x9C7u8qnsNy49sr9Ki8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJlSG9GYWlsQ250OyAgICAgICAvKiBHU03UpMfQu7vKp7DctM7K/SovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBzZXVkb0hvRmFpbENudDsgICAgLyogR1NNzrHH0Lu7yqew3LTOyv0qLwotCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkdzbUhvVGRTdWNjQ250OyAgICAgLyogR1NNx9C7u7W9VEQs07LH0Lu7s8m5prTOyv0qLwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHc21Ib0ZhaWxDbnQ7ICAgICAgIC8qIEdTTcfQu7u1vVRELNOyx9C7u8qnsNy0zsr9Ki8KLX1UX3pNbWlhQXNfRU1fR0hvSW5mb19JbmQ7Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSDUrdPvo7paX01taWFFdXNpcl9FVFdTUHJpbWFyeV9JbmRfRXYgKEVVU0lSLT5NTUlBKQotIMu1w/c6IEVVU0lStsHIobW9U0lCMTDW0EVUV1PK19KquOa+r9DFz6KjrNb3tq/Jz7GouPhNTUlBCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3V2FybmluZ01zZ0lkOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTZXJpYWxOdW07Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1dhcm5pbmdUeXBlOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZWNJbmZvUHJlc2VudDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlNlY2luZm9bNTBdOwotfVRfek1taWFFdXNpcl9FVFdTUHJpbWFyeV9JbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0g1K3T76O6Wl9NbWlhRXVzaXJfRVRXU1NlY29uZGFyeV9JbmRfRXYgKEVVU0lSLT5NTUlBKQotIMu1w/c6IEVVU0lStsHIobW9U0lCMTHW0EVUV1O0ztKquOa+r9DFz6KjrNb3tq/Jz7GouPhNTUlBCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3V2FybmluZ01zZ0lkOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTZXJpYWxOdW07Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1dhcm5pbmdNc2dMZW47Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGJXYXJuaW5nTXNnOwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEYXRhQ29kaW5nU2NoZW1lUHJlc2VudDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGF0YUNvZGluZ1NjaGVtZTsKLX1UX3pNbWlhRXVzaXJfRVRXU1NlY29uZGFyeV9JbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0g1K3T76O6TU1JQV9BU19FTV9DRUxMUkVTT1JDQ09DT1VOVF9SRVFfRVYgKE1NSUEtPlVDU1IsR1JSKQotIMu1w/ejurmks8zEo8q9z8JNTUlBzajWqlVDU1K/qsb0oaK52LHV1ve2r8nPsajW2NGhoaJDQ0+0zsr90MXPogotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWN0aW9uOyAgICAgICAvKjE6tPK/qtChx/jW2NGhoaK/59bGyr1DQ0+0zsr9zbO8xtb3tq/Jz7Goo6wwOrnYsdXQocf41tjRoaGiv+fWxsq9Q0NPtM7K/c2zvMbW97avyc+xqCovCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzNdOwotfVRfel9NbWlhQXNfRU1fQ2VsbHJlc09yQ2NvQ291bnRfUmVxOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3A4NDNtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdHsKLSAgICBCWVRFICBiU3JjSW5kZXg7ICAgIC8qINS0y/fS/SAqLwotICAgIEJZVEUgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SovCi0gICAgQllURSAgYkFjdGlvbjsKLSAgICBCWVRFICBiUGFkZGluZzsKLX1UX3pNbWlhRXVjc3JfTHRlSW5mb19SZXE7Ci0KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAvKiDUtMv30v0gKi8KLSAgICBCWVRFICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SovCi0gICAgQllURSAgICBiU3ViRnJtQXNzaWduVHlwZTsKLSAgICBCWVRFICAgIGJTcGNsU3ViRnJtUGF0dDsKLX1UX3pNbWlhRXVjc3JfTHRlSW5mb19JbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0g1K3T76O6TU1JQV9BU0NfTFRFX0xPU1RDT1ZFUkFHRV9JTkRfRVYgKEVVQ1NSLT5BVEkpCi0gy7XD96O6zajWqkFUScnPsagrWkxURU5PQ0VMTAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0ewotICAgIEJZVEUgICAgYlNyY0luZGV4OyAgICAvKiDUtMv30v0gKi8KLSAgICBCWVRFICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SovCi0gICAgQllURSAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFFdWNzcl9MdGVMb3N0Q292ZXJhZ2VfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++julpfUlJNSV9JTlRFUl9SQVRfTkNFTExfSU5EX0VWIChHUlItPk1NSUEpDQotIMu1w/ejus2o1qpNTUlBIFREL0xURcHax/i3osn6seS7rw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgIGJTcmNJbmRleDsgICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9Ki8NCi0gICAgQllURSAgICBiTHRlTnVtOyAgLy8gTFRFwdrH+LXEuPbK/QotICAgIEJZVEUgICAgYlRkTnVtOyAgIC8vIFREwdrH+LXEuPbK/QotICAgIEJZVEUgICAgYWJQYWRkaW5nWzJdOwotICAgIFdPUkQgICAgd0VhcmZjbltaX01BWF9TVE9SRURfRUZSUUVfTlVNXTsgLy9MVEXB2sf4Ci0gICAgV09SRCAgICB3VWFyZmNuW1pfTUFYX1NUT1JFRF9GUlFFX05VTV07ICAvL1REwdrH+AotfVRfel9SUk1JX0lOVEVSX1JBVF9OQ0VMTF9JTkQ7Ci0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLdSt0++jukFUX01NSUFfTDFFX1pFUENHX1JFUQotuabE3KO6zai5/UFUw/zB7tDeuMQvsunRr87vwO2y48Xk1sOyzsr9Ci221NOmQVTD/MHuo7orWkVQQ0cKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgICAgICAgICBiU3JjSW5kZXg7ICAgLyog1LTL99L9ICovCi0gICAgQllURSAgICAgICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SAqLwotICAgIEJZVEUgICAgICAgICBiQ21kOyAgICAgICAgLyrD/MHuusWjrLbU06ayu82stcTO78DtsuO5psTcKi8KLSAgICBCWVRFICAgICAgICAgYk1vZGU7ICAgICAgIC8qMLHtyr7J6NbDo6wxse3KvrLp0a8qLwotICAgIEJZVEUgICAgICAgICBiVmFsMUZnOyAgICAgLyqx7cq+VmFsMS9WYWwyyse38bTm1NqjrDCx7cq+sru05tTao6wxse3KvrTm1NoqLwotICAgIEJZVEUgICAgICAgICBiVmFsMkZnOwotICAgIEJZVEUgICAgICAgICBhYlBhZGRpbmdbMl07Ci0gICAgRFdPUkQgICAgICAgIGR3VmFsMTsgICAgIC8qss7K/TEvss7K/TKjrNDeuMQvtsHIobXEzu/A7bLjss7K/aOsss7K/cq1vMq6rNLl08nO78DtsuO4+LP2Ki8KLSAgICBEV09SRCAgICAgICAgZHdWYWwyOwotfVRfek1taWFMMUVfWmVwY2dfUmVxOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgot1K3T76O6TU1JQV9MMUVfWkVQQ0dfQ05GCi25psTco7q21M2ouf1BVMP8we7Q3rjEL7bByKHO78DtsuPF5NbDss7K/c/s06YKLbbU06ZBVMP8we6jugotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSAgICAgICAgIGJTcmNJbmRleDsgICAvKiDUtMv30v0gKi8KLSAgICBCWVRFICAgICAgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9ICovCi0gICAgQllURSAgICAgICAgIGJDbWQ7ICAgICAgICAvKsP8we66xaOsttTTprK7zay1xM7vwO2y47mmxNwqLwotICAgIEJZVEUgICAgICAgICBiTW9kZTsgICAgICAgLyowse3Kvsno1sO21NOmtcTP7NOmo6y0y8qxo6y689D4ss7K/WJSc2x009DQp6OsYlZhbDJGZ6OsYlZhbDGjrGJWYWwyvvnO3tCnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxse3KvrLp0a+21NOmtcTP7NOmo6y0y8qxo6y689D4ss7K/WJSc2x0zt7Qp6OsYlZhbDJGZ6OsYlZhbDGjrGJWYWwyvvnT0NCnKi8KLQotICAgIEJZVEUgICAgICAgICBiUnNsdDsgICAgICAgLyqx7cq+yejWw73hufujrFpfVFJVRcno1sOzybmmo6xaX0ZBTFNFyejWw8qnsNwsYk1vZGU9MMqx09DQpyovICAgIAotICAgIEJZVEUgICAgICAgICBiVmFsMUZnW1pfWkVQQ0dfUEFSQU1fTlVNQkVSXTsgIC8qsLTV1c/Cseq6zWR3VmFs1tDWtdK70ru21NOmo6xiVmFsMUZnWzBdse3KvmR3VmFsWzBdyse38bTm1Nos0sC0zsDgzcajrDCx7cq+sru05tTao6wxse3KvrTm1NoqLwotICAgIEJZVEUgICAgICAgICBhYlBhZGRpbmcyWzJdOyANCi0gICAgTE9ORyAgICAgICAgZHdWYWxbWl9aRVBDR19QQVJBTV9OVU1CRVJdOyAgICAvKrLOyv0xL7LOyv0yoa2jrNDeuMQvtsHIobXEzu/A7bLjss7K/aOsss7K/cq1vMq6rNLl08nO78DtsuO4+LP2Ki8KLX1UX3pNbWlhTDFFX1plcGNnX0NuZjsKLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0++juk1NSUFfQVNfQjM5X0lORk9fSU5EX0VWIChVTUNSLT5BVEkgICBFVU1DUi0+QVRJKQoty7XD96O6VU1DUi4gRVVNQ1LNqNaqQVRJIMrHt/HT0EIzObP2z9YgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgICAgICAgICBiU3JjSW5kZXg7ICAgLyog1LTL99L9ICovCi0gICAgQllURSAgICAgICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SAqLwotICAgIEJZVEUgICAgICAgICBiQmFuZDM5SW5mbzsgLyogyKHWtTCx7cq+w7vT0EJBTkQzOS4gMbHtyr7T0EJBTkQzOSovCi0gICAgQllURSAgICAgICAgIGJQYWRkaW5nOwotfVRfek1taWFBc19CYW5kMzlfSW5mb19JbmQ7Ci0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvo7pNTUlBX0FTX0IzOV9JTkZPX1JFUV9FViAoQVRJLT5HUlIpCi3LtcP3o7pBVEm9q73TyOuy48nPsai1xEJBTkQzOdDFz6LNuLSrtb1HU03Su7T9tcRHUlIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICBiQmFuZDM5SW5mbzsgIC8qyKHWtTCx7cq+w7vT0EJBTkQzOS4gMbHtyr7T0EJBTkQzOSovCi19IFRfek1taWFBc19CYW5kMzlfSW5mb19SZXE7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfUlNTSV9RVUVSWV9SRVFfRVYoQVRJLT5FVU1DUikKLSAgICAgICAgICAgICAgTU1JQV9BU19TSU5SX1FVRVJZX1JFUV9FVihBVEktPkVVTUNSKQotICAgICAgICAgICAgICBSUkFUX1JYU1RBVF9SRVEoQVRJLT5HUlIpCi0gICAgICAgICAgICAgIE1NSUFfQVNfUVVFUllfUlhMRVZfUkVRX0VWKEFUSS0+TUNSL1dNQ1IvRVVNQ1IpCi3LtcP3OkFUSbeiy82y6dGvx+vH87vxyKHQxbrFx7+2yNa4yr7WtQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgYkRlc0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICBhYlBhZGRpbmdbMl07Ci19VF96TW1pYUFzX1Jzc2lfUXJ5X1JlcSwgVF96TW1pYUFzX1NpbnJfUXJ5X1JlcSwgCi1UX3pNbWlhQXNfQ2VsbEluZm9fUXJ5X1JlcTsKLQ0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGJBdFR5cGU7DQotICAgIEJZVEUgICAgICAgICAgICBiUGFkZGluZzsNCi19VF96TW1pYUFzX0NzcV9RcnlfUmVxOw0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIENIQVIgICAgICBjU2luckludDsgICAgICAgICAgICAgICAvKsih1rW3ts6nIC0yMH40MCovCi0gICAgQllURSAgICAgIGJTaW5yRGVjOyAgICAgICAgICAgICAgIC8qyKHWtbe2zqcgMH45Ki8KLSAgICBCWVRFICAgICAgYWJQYWRkaW5nWzJdOwotfVRfek1taWFBc19MVEVfUF9TaW5yOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgU0hPUlQgICAgIHNSc3NpSW50OyAgICAgICAgICAgICAgIC8qyKHWtbe2zqcgLTEyOX4tNCovCi0gICAgQllURSAgICAgIGJSc3NpRGVjOyAgICAgICAgICAgICAgIC8qyKHWtbe2zqcgMH45Ki8KLSAgICBCWVRFICAgICAgYlBhZGRpbmc7Ci19VF96TW1pYUFzX0xURV9QX1Jzc2k7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfUlNTSV9RVUVSWV9DTkZfRVYoRVVNQ1ItPkFUSSkKLcu1w/c6QVRJt6LLzbLp0a/H68fzu/HIoUxURbXE0MW6xce/tsjWuMq+1rUKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEJZVEUgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgYWJQYWRkaW5nWzJdOwotICAgIFRfek1taWFBc19MVEVfUF9Sc3NpICAgICB0UnNzaVtNTUlBX0FTX0xURV9NQVhfUlNTSV9OVU1dOwotfVRfek1taWFBc19Sc3NpX1FyeV9DbmY7Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX1NJTlJfUVVFUllfQ05GX0VWKEVVTUNSLT5BVEkpCi3LtcP3OkFUSbeiy82y6dGvx+vH87vxyKFMVEW1xNDFusXHv7bI1rjKvta1Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgIGFiUGFkZGluZ1syXTsKLSAgICBUX3pNbWlhQXNfTFRFX1BfU2luciAgICAgdFNpbnJbTU1JQV9BU19MVEVfTUFYX1NJTlJfTlVNXTsKLX1UX3pNbWlhQXNfU2lucl9RcnlfQ25mOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkFzQ2VsbEluZm9GZzsvKrvxyKGzybmmserWvs67LDDKp7DcLDGzybmmKi8NCi0gICAgVF96X1RBQyAgICAgICAgICAgICAgICAgICAgICAgICB0VGFjOyAgLypUQUMqLw0KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U2NlbGxJZDsgLypDRUxMSUQqLw0KLSAgICBUX3pfUGxtbklkICAgICAgICAgICAgICAgICAgICAgIHRjZWxsUHJpbWFyeVBsbW5JZDsvKlBMTU5JRCovDQotfVRfek1taWFBc19DZWxsSW5mbzsNCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfVE1HSV9BQ1RJVkFURV9SRVFfRVYoQVRJLT5FQ0VSKQoty7XD9zpBVEnNqNaqUlJDvKS77tK7uPZUTUdJt/7O8QotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7ICAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXNzaW9uSWRGZzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTZXNzaW9uSWQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07Ci0gICAgVF96TWJtc19UbWdpICAgICAgICAgICAgICAgICAgICB0VG1naTsKLX1UX3pBdGlBc19NYm1zX1NlcnZpY2VfSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiUGFkZGluZ1syXTsKLSAgICBUX3pBdGlBc19NYm1zX1NlcnZpY2VfSW5mbyAgICAgIHRUbWdpQWN0SW5mbzsKLX1UX3pBdGlBc19UbWdpX0FjdGl2YXRlX1JlcTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19UTUdJX0FDVElWQVRFX0NORl9FVihFQ0VSLT5BVEkpCi3LtcP3OlJSQ8/s06ZBVEm1xFRNR0m3/s7xvKS77sfrx/MKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY3RTdGF0dXM7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7Ci0gICAgVF96QXRpQXNfTWJtc19TZXJ2aWNlX0luZm8gICAgICB0VG1naUFjdEluZm87Ci19VF96QXRpQXNfVG1naV9BY3RpdmF0ZV9DbmY7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfVE1HSV9ERUFDVElWQVRFX1JFUV9FVihBVEktPkVDRVIpCi3LtcP3OkFUSc2o1qpSUkPIpbyku+7Su7j2VE1HSbf+zvEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEZWFjdEFsbDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOwotICAgIFRfekF0aUFzX01ibXNfU2VydmljZV9JbmZvICAgICAgdFRtZ2lEZWFjdEluZm87Ci19VF96QXRpQXNfVG1naV9EZWFjdGl2YXRlX1JlcTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19UTUdJX0RFQUNUSVZBVEVfQ05GX0VWKEVDRVItPkFUSSkKLcu1w/c6UlJDz+zTpkFUSbXEVE1HSbf+zvHIpbyku+7H68fzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVhY3RTdGF0dXM7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7Ci0gICAgVF96QXRpQXNfTWJtc19TZXJ2aWNlX0luZm8gICAgICB0VG1naURlYWN0SW5mbzsKLX1UX3pBdGlBc19UbWdpX0RlYWN0aXZhdGVfQ25mOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX1NBSV9MSVNUX1FVRVJZX1JFUV9FVihBVEktPkVDRVIpCi3LtcP3OkFUScfrx/NSUkO78cihtbHHsL/Ju/G1w7XEU0FJIExpc3S3/s7xCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlBhZGRpbmdbMl07Ci19VF96QXRpQXNfU2FpTGlzdFF1ZXJ5UmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX1NBSV9MSVNUX1FVRVJZX1JFU1BfRVYoRUNFUi0+QVRJKQoty7XD9zpSUkPP7NOmQVRJtcRTQUkgTGlzdLLp0a8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19TQUlfTElTVF9JTkRfRVYoRUNFUi0+QVRJKQoty7XD9zq1sdDo0qrW97avyc+xqMqxo6xFVVJSQ9Chx/jXpMH0oaLW2NGhoaLH0Lu7oaJTSUIxNbj80MK1yMfpv/bPwqOsRVVTSVK2wbW9U0lCMTW688Giv8zJz7GouMPP+8+iLsnPsai1scewzqrM4bmpTUJNU7f+zvG/ydLUu/HIobW9tcRTQUnB0LHtCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICBiSXNTZXJ2RnJlcTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTYWlOdW07IAotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOwotICAgIFdPUkQgICAgICAgICAgICAgICAgYXdTYWlbWl9NQVhfU0FJX05VTV9QRVJfRlJFUV07Ci0gICAgRFdPUkQgICAgICAgICAgICAgICBkd0ZyZXE7Ci19VF96QXRpQXNfU3BlY19GcmVxX1NhaV9MaXN0X0luZm87Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OyAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRnJlcU51bTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUGFkZGluZzsKLSAgICBUX3pBdGlBc19TcGVjX0ZyZXFfU2FpX0xpc3RfSW5mbyAgICBhdFNwZWNGcmVxU2FpTGlzdEluZm9bWl9NQVhfTFRFX0ZSRVFfTlVNXTsKLX1UX3pBdGlBc19TYWlMaXN0UXVlcnlSZXNwLFRfekF0aUFzX1NhaUxpc3RJbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfVE1HSV9MSVNUX1FVRVJZX1JFUV9FVihBVEktPkVDRVIpCi3LtcP3OkFUScfrx/NSUkO78cihtbHHsL/Ju/G1w7XEVE1HSSBMaXN0t/7O8QotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYkRlc0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYlRtZ2lMaXN0VHlwZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOwotfVRfekF0aUFzX1RtZ2lMaXN0UXVlcnlSZXE7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfVE1HSV9MSVNUX1FVRVJZX1JFU1BfRVYoRUNFUi0+QVRJKQoty7XD9zq1scnPsuOy6dGvyrGjrMnPsahSUkO1scewvKS77rXEVE1HSbvyv8m78bXDtcRUTUdJIExpc3S3/s7xCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfVE1HSV9MSVNUX0lORF9FVihFQ0VSLT5BVEkpCi3LtcP3OsnPsahSUkO1scewvKS77rXEVE1HSbvyv8m78bXDtcRUTUdJICBMaXN0t/7O8QotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlRtZ2lMaXN0VHlwZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYldhcm5SZWFzb25GZzsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYldhcm5SZWFzb247Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3VG1naU51bTsKLSAgICAvL1RfekF0aUFzX01ibXNfU2VydmljZV9JbmZvICBhdFRtZ2lMaXN0W1pfTUFYX1RNR0lfTlVNX0lOX01CU0ZOX0FSRUEgKiBaX01BWF9NQlNGTl9BUkVBX05VTV9JTl9DRUxMXTsvKji49m1ic2ZuYXJlYSovCi0gICAgVF96QXRpQXNfTWJtc19TZXJ2aWNlX0luZm8gIGF0VG1naUxpc3RbWl9NQVhfTUJNU19UTUdJX0xJU1RfTlVNXTsKLX1UX3pBdGlBc19UbWdpTGlzdFF1ZXJ5UmVzcCxUX3pBdGlBc19UbWdpTGlzdEluZDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19UTUdJX0xJU1RfU0VUX1JFUV9FVihBVEktPkVDRVIpCi3LtcP3OkFQz8K3orjQ0MvIpLXEVE1HSSBMaXN0t/7O8aOo06a4w8r009rNrNK7TUJTRk4gQXJlYaOpCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgIAotICAgIFRfek1ibXNfVG1naSAgICAgICAgICAgICAgICAgICAgICAgIHRUbWdpOwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTYWlOdW07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZyZXFOdW07Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdTYWlbWl9NQVhfU0FJX05VTV9QRVJfVE1HSV07Ci0gICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR3RnJlcVtaX01BWF9MVEVfRlJFUV9OVU1dOwotfVRfekF0aUFzX0ludGVyZXN0X1RtZ2lfSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgICAgIHdUbWdpTnVtOwotICAgIFRfekF0aUFzX0ludGVyZXN0X1RtZ2lfSW5mbyBhdFRtZ2lMaXN0W1pfTUFYX1RNR0lfTlVNX0lOX01CU0ZOX0FSRUFdOwotfVRfekF0aUFzX1RtZ2lMaXN0UmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX01CTVNfUFJFRkVSRU5DRV9SRVFfRVYoQVRJLT5FQ0VSKQoty7XD9zpBVEnNqNaqQVOjrLj8x+PP8tPa08PExNbWt73Kvb3TytVNQk1Tt/7O8aOsdW5pY2FzdCBvciBtdWx0aWNhc3QKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJNYm1zUHJlZmVyZW5jZTsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJQYWRkaW5nOwotfVRfekF0aUFzX01ibXNQcmVmZXJlbmNlUmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX1RNR0lfTElTVF9SRVBPUlRfUkVRX0VWKEFUSS0+RUNFUikKLcu1w/c6QVRJzajWqkFTo6zKx7fx1ve2r7j80MLJz7GoVE1HSSBMaXN0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICBiRGVzSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICBiVG1naUxpc3RSZXBvcnQ7Ci0gICAgQllURSAgICAgICAgICAgICAgICBiUGFkZGluZzsKLX1UX3pBdGlBc19UbWdpTGlzdFJlcG9ydFJlcTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19TQUlfTElTVF9SRVBPUlRfUkVRX0VWKEFUSS0+RUNFUikKLcu1w/c6QVRJzajWqkFTo6zKx7fx1ve2r7j80MLJz7GoU0FJIExpc3QKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGJTYWlMaXN0UmVwb3J0OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYlBhZGRpbmc7Ci19VF96QXRpQXNfU2FpTGlzdFJlcG9ydFJlcTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19NQk1TX1NFUlZJQ0VfU1VTUEVORF9JTkRfRVYoRUNFUi0+QVRJKQoty7XD9zpBU82o1qpBVEnQ6NKqudLG8LXEVE1HSSBMaXN0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3VG1naU51bTsKLSAgICBUX3pBdGlBc19NYm1zX1NlcnZpY2VfSW5mbyAgYXRUbWdpTGlzdFtaX01BWF9UTUdJX05VTV9JTl9NQlNGTl9BUkVBXTsKLX1UX3pBdGlBc19NYm1zU2VydmljZVN1c3BlbmRJbmQ7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci3UrdPvOk1NSUFfQVNfTUJNU19TRVJWSUNFX1JFU1VNRV9JTkRfRVYoRUNFUi0+QVRJKQoty7XD9zpBU82o1qpBVEnQ6NKqu9a4tLXEVE1HSSBMaXN0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXR5cGVkZWYgc3RydWN0IHsgCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgICAgICB3VG1naU51bTsKLSAgICBUX3pBdGlBc19NYm1zX1NlcnZpY2VfSW5mbyAgYXRUbWdpTGlzdFtaX01BWF9UTUdJX05VTV9JTl9NQlNGTl9BUkVBXTsKLX1UX3pBdGlBc19NYm1zU2VydmljZVJlc3VtZUluZDsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLdSt0+86TU1JQV9BU19DT01NT05fQ0ZHX0NORl9FVihFQ0VSLT5BVEkpCi3LtcP3OkFTzajWqkFUScfrx/O1xMXk1sPS0b6tyfrQp6Os0ruw49PD09q0v8Xk1sOyu7vhyqew3LXEx+vH8wotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICAgICAgd1BhZGRpbmc7Ci19VF96QXRpQXNfQ29tbW9uQ2ZnQ25mOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX05XX1RJTUVfUVVFUllfUkVRX0VWKEFUSS0+RUNTUikKLcu1w/c6QVRJx+vH81JSQ7vxyKG1scewU0lCMTbW0LXEVVRDyrG85AotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4OwotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJQYWRkaW5nWzJdOwotfVRfekF0aUFzX053VGltZVF1ZXJ5UmVxOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpNTUlBX0FTX05XX1RJTUVfUVVFUllfUkVTUF9FVihFQ1NSLT5BVEkpCi3LtcP3OkFTzajWqkFUSbbByKFTSUIxNrXEveG5+wotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7IAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3JjSW5kZXg7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsKLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlBhZGRpbmc7Ci0gICAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgIHVVdGNUaW1lSW5mbzsKLX1UX3pBdGlBc19Od1RpbWVRdWVyeVJlc3A7Ci0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9BU19RVUVSWV9DRVNRX1JFUV9FVi9NTUlBX0FTX1FVRVJZX1pDU1FfUkVRX0VWIChBVEktPkFTKQ0KLcu1w/c6QVRJt6LLzbLp0a/H68fzu/HIobWxx7DWxsq9z8K1xNDFusXP4LnYtcTWtQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGFiUGFkZGluZ1syXTsNCi19IFRfek1taWFBc19DZXNxX1FyeV9SZXEsVF96TW1pYUFzX1pjc3FfUXJ5X1JlcTsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9BU19TQUlfTElTVF9SRVBPUlRfUkVRX0VWKEFTLT5BVEkpDQoty7XD9zpBU7e1u9i1xENFU1Gy6dGvveG5+9a1DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotIHR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGJEZXNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgIGJBY3Q7ICAgLyq1scew1sbKvaO6MHgwNC1HU02hojB4MDEtVERTQ0RNQaGiMHgwMi1XQ0RNQaGiMHgxMC1MVEWhosbky/vWtbGjwfQqLw0KLSAgICBCWVRFICAgICAgICAgICAgYlJzc2k7ICAvKkdTTdbGyr3PwrTLss7K/bTm1NqjrM7e0KfWtTk5Ki8NCi0gICAgQllURSAgICAgICAgICAgIGJCZXI7ICAgLypHU03Wxsq9z8K0y7LOyv205tTao6zO3tCn1rU5OSovDQotICAgIEJZVEUgICAgICAgICAgICBiUnNjcDsgIC8qVES78lfWxsq9z8K0y7LOyv205tTao6zO3tCn1rUyNTUqLw0KLSAgICBCWVRFICAgICAgICAgICAgYkVjbm87ICAvKlfWxsq9z8K0y7LOyv205tTao6wgIM7e0KfWtTI1NSovDQotICAgIEJZVEUgICAgICAgICAgICBiUnNycTsgIC8qTFRF1sbKvc/CtMuyzsr9tObU2qOszt7Qp9a1MjU1Ki8NCi0gICAgQllURSAgICAgICAgICAgIGJSc3JwOyAgLypMVEXWxsq9z8K0y7LOyv205tTao6zO3tCn1rUyNTUqLw0KLSAgICBCWVRFICAgICAgICAgICAgYWJwYWRkaW5nWzNdOw0KLX0gVF96TW1pYUFzX0Nlc3FfUXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9BU19RVUVSWV9aQ1NRX0NORl9FVihBUy0+QVRJKQ0KLcu1w/c6QVO3tbvYtcRDRVNRsunRr73hufvWtQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSB0eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBiQWN0OyAgIC8qtbHHsNbGyr2jujB4MDQtR1NNoaIweDAxLVREU0NETUGhojB4MDItV0NETUGhojB4MTAtTFRFoaLG5Mv71rWxo8H0Ki8NCi0gICAgQllURSAgICAgICAgICAgIGJSc3NpOyAgLyq497j21sbKvc/CtcRSU1NJKFREz8LJz7GoUlNDUCmjrM7e0KfWtTk5KExURc/Czt7Qp9XfMjU1KSovDQotICAgIEJZVEUgICAgICAgICAgICBiQmVyOyAgIC8qR1NN1sbKvc/CtMuyzsr9tObU2qOszt7Qp9a1OTkqLw0KLSAgICBCWVRFICAgICAgICAgICAgYWJwYWRkaW5nWzNdOw0KLX0gVF96TW1pYUFzX1pjc3FfUXJ5X0NuZjsNCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSDUrdPvo7pNTUlBX0FTX0VNX0xURV9IT19TRVRfUkVRX0VWICggQVRJLT5FVUNFUiApDQotICAgICAgIE1NSUFfQVNfRU1fTFRFX0hPX1NFVF9RVUVSWV9DTkZfRVYoIEVVQ0VSLT5BVEkpDQotIMu1w/ejus2o1qq08r+qu/LV37nYsdXH0Lu70MXPorXE1ve2r8nPsagNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0ew0KLSAgICBCWVRFICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgYkRlc0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgYkFjdGlvbjsvKsfQu7vQxc+itcTJz7Gov6q52KOsMDq52LHVo6wxOrTyv6oqLw0KLSAgICBCWVRFICAgICAgICAgICAgYlBhZGRpbmc7DQotfVRfek1taWFBc19FTV9MdGVIb1NldF9SZXEsVF96TW1pYUFzX0VNX0x0ZUhvU2V0X1FyeV9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9BU19FTV9MVEVfSE9fU0VUX1FVRVJZX1JFUV9FViAoIEFUSS0+RVVDRVIgKQ0KLSDLtcP3o7qy6dGvx9C7u9DFz6K1xNb3tq/Jz7GotcS/qrnY1rXH68fzz/vPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotfVRfek1taWFBc19FTV9MdGVIb1NldF9RcnlfUmVxOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotINSt0++juk1NSUFfQVNfRU1fTFRFX0hPX0lORk9fSU5EX0VWICggRVVDRVItPkFUSSkNCi0gy7XD96O61ve2r8nPsajH0Lu70MXPog0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3R7DQotICAgIEJZVEUgICAgICAgICAgICBiU3JjSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgICAgICAgICBhYlBhZGRpbmdbMl07DQotICAgIERXT1JEICAgICAgICAgICBkd1RvdGFsSG9Db3VudDsNCi0gICAgRFdPUkQgICAgICAgICAgIGR3U3VjY0hvQ291bnQ7DQotfVRfek1taWFBc19FTV9MdGVIb19JbmZvX0luZDsNCi0NCi0jaWZkZWYgQlRSVU5LX1NVUFBPUlQNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot1K3T7zpBVElfRVVDU1JfSElHSFRfQ0FMTF9JTkRfRVYoRVVDU1ItPkFUSSkKLcu1w/c6zajWqrjf08XPyLy2uvS90AotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsgICAgICAgICAgIAotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiRGVzSW5kZXg7ICAgICAgICAgICAvKsS/tcTL99L9ucy2qMzus8kyNTW8tL/JKi8KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkNhbGxtb2RlOyAgICAgICAgICAgLyq1pbr0o6zX6br0LLDry6u5pLWluvQqLyAgICAgCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTbjsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJDYWxsUHJpTGV2ZWw7DQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBhYnBhZGRpbmdbM107Ci0gICAgVF96QXRpVHNtX0JDRE51bWJlciAgICAgICAgICAgICB0Q2FsbGVkTlVtYmVyOyAgICAgIC8qtaW69MrH1ve90E5VTUJFUizX6br0ysfWuNfpttTTprXETlVNQkVSKi8NCi19VF96QXRpQXNfSGlnaHRfQ2FsbF9JbmQ7DQotDQotI2RlZmluZSBUX3pBdGlBc19CdXN5X0FsZXJ0aW5nX0luZCAgVF96QXRpVHNtX0J1c3lfQWxlcnRpbmdfSW5kDQotI2VuZGlmDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfVU1NX1hDRUxMSU5GT19SRVFfRVYoQVRJLT5VTU0pDQoty7XD9zq0pbeiwdrH+NDFz6K78cihwfezzA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSBiU3JjSW5kZXg7IC8vINS0y/fS/Q0KLSAgICBCWVRFIGJEZXNJbmRleDsgLy8gxL+1xMv30v0NCi0gICAgQllURSBhYlBhZGRpbmdbMl07DQotfSBUX3pNbWlhVW1tX1hDZWxsSW5mb19SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfVU1NX1hDRUxMSU5GT19DTkZfRVYoVU1NLT5BVEkpDQoty7XD9zrB2sf40MXPorvxyKHB97PMtcS94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFIGJTcmNJbmRleDsgLy8g1LTL99L9DQotICAgIEJZVEUgYkRlc0luZGV4OyAvLyDEv7XEy/fS/Q0KLSAgICBCWVRFIGJHc21OdW07ICAgLy8gR1NN0KHH+Lj2yv0NCi0gICAgQllURSBiVXRyYW5OdW07IC8vIFVUUkFO0KHH+Lj2yv0NCi0gICAgQllURSBiTHRlTnVtOyAgIC8vIExURdChx/i49sr9DQotICAgIFRfekdzbV9YQ2VsbEluZm8gYXRHQ2VsbFtaX05BU19NQVhfR1NNX1hDRUxMX05VTV07ICAgICAgLy8gR1NN0KHH+NDFz6INCi0gICAgVF96VXRyYW5fWENlbGxJbmZvIGF0VUNlbGxbWl9OQVNfTUFYX1VUUkFOX1hDRUxMX05VTV07ICAvLyBVVFJBTtChx/jQxc+iDQotICAgIFRfekx0ZV9YQ2VsbEluZm8gYXRMdGVDZWxsW1pfTkFTX01BWF9MVEVfWENFTExfTlVNXTsgICAgLy8gTFRF0KHH+NDFz6INCi19IFRfek1taWFVbW1fWENlbGxJbmZvX0NuZjsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi3UrdPvo7pNTUlBX0wxVF9aVFBDR19SRVFfRVYvTU1JQV9MMVdfWldQQ0dfUkVRX0VWDQotuabE3KO6zai5/UFUw/zB7tDeuMQvsunRr1REL1fO78DtsuPF5NbDss7K/Q0KLbbU06ZBVMP8we6juitaVFBDR6OsK1pXUENHDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgYlNyY0luZGV4OyAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICBiQ21kOyAgICAgICAgLyrD/MHuusWjrLbU06ayu82stcTO78DtsuO5psTcKi8NCi0gICAgQllURSAgICAgICAgIGJQYWRkaW5nOw0KLSAgICBCWVRFICAgICAgICAgYWJWYWxGZ1taX1pVUENHX1ZBTEZHX05VTUJFUl07ICAgICAvKrHtyr5kd1ZhbMrHt/G05tTao6wwse3KvrK7tObU2qOsMbHtyr605tTaKi8NCi0gICAgRFdPUkQgICAgICAgIGFkd1ZhbFtaX1pVUENHX1ZBTEZHX05VTUJFUl07ICAgICAvKrLOyv3B0LHto6zQ3rjEL7bByKG1xM7vwO2y47LOyv2jrLLOyv3KtbzKuqzS5dPJzu/A7bLjuPiz9iovDQotfVRfek1taWFMMVRfWnRwY2dfUmVxLCBUX3pNbWlhTDFXX1p3cGNnX1JlcTsNCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi3UrdPvo7pNTUlBX0wxVF9aVFBDR19DTkZfRVYvTU1JQV9MMVdfWldQQ0dfQ05GX0VWDQotuabE3KO6ttTNqLn9QVTD/MHu0N64xC+2wcihVEQvV87vwO2y48Xk1sOyzsr9z+zTpg0KLbbU06ZBVMP8we6jug0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgIGJTcmNJbmRleDsgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkNtZDsgICAgICAgIC8qw/zB7rrFo6y21NOmsrvNrLXEzu/A7bLjuabE3CovDQotICAgIEJZVEUgICAgICAgICBiUnNsdDsgICAgICAgLyqx7cq+yejWw73hufujrFpfVFJVRcno1sOzybmmo6xaX0ZBTFNFyejWw8qnsNyjrGJDbWTOqsno1sPD/MHuyrHT0NCnKi8gICAgDQotICAgIEJZVEUgICAgICAgICBhYlZhbEZnW1pfWlVQQ0dfUEFSQU1fTlVNQkVSXTsgIC8qsLTV1c/Cseq6zWR3VmFs1tDWtdK70ru21NOmo6xiVmFsMUZnWzBdse3KvmR3VmFsWzBdyse38bTm1Nos0sC0zsDgzcajrDCx7cq+sru05tTao6wxse3KvrTm1NoqLw0KLSAgICBCWVRFICAgICAgICAgYWJQYWRkaW5nWzNdOyANCi0gICAgTE9ORyAgICAgICAgIGFsVmFsW1pfWlVQQ0dfUEFSQU1fTlVNQkVSXTsgICAgLyqyzsr9MS+yzsr9MqGto6zQ3rjEL7bByKG1xM7vwO2y47LOyv2jrLLOyv3KtbzKuqzS5dPJzu/A7bLjuPiz9iovDQotfVRfek1taWFMMVRfWnRwY2dfQ25mLFRfek1taWFMMVdfWndwY2dfQ25mOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLdSt0++juk1NSUFfR1JSX1pHUENHX1JFUV9FVg0KLbmmxNyjus2ouf1BVMP8we7Q3rjEL7Lp0a9HU03O78DtsuPF5NbDss7K/Q0KLbbU06ZBVMP8we6juitaR1BDRw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgIGJTcmNJbmRleDsgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkNtZDsgICAgICAgIC8qw/zB7rrFo6y21NOmsrvNrLXEzu/A7bLjuabE3CovDQotICAgIEJZVEUgICAgICAgICBiVmFsMUZnOyAgICAgLyqx7cq+VmFsMS9WYWwyyse38bTm1NqjrDCx7cq+sru05tTao6wxse3KvrTm1NoqLw0KLSAgICBCWVRFICAgICAgICAgYlZhbDJGZzsNCi0gICAgQllURSAgICAgICAgIGFiUGFkZGluZ1szXTsNCi0gICAgRFdPUkQgICAgICAgIGR3VmFsMTsgICAgIC8qss7K/TEvss7K/TKjrNDeuMQvtsHIobXEzu/A7bLjss7K/aOsss7K/cq1vMq6rNLl08nO78DtsuO4+LP2Ki8NCi0gICAgRFdPUkQgICAgICAgIGR3VmFsMjsNCi19VF96TW1pYUdycl9aZ3BjZ19SZXE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQot1K3T76O6TU1JQV9HUlJfWkdQQ0dfQ05GX0VWDQotuabE3KO6ttTNqLn9QVTD/MHu0N64xC+2wcihR1NNzu/A7bLjxeTWw7LOyv3P7NOmDQotttTTpkFUw/zB7qO6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgYlNyY0luZGV4OyAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgICAgICBiQ21kOyAgICAgICAgLyrD/MHuusWjrLbU06ayu82stcTO78DtsuO5psTcKi8NCi0gICAgQllURSAgICAgICAgIGJSc2x0OyAgICAgICAvKrHtyr7J6NbDveG5+6OsWl9UUlVFyejWw7PJuaajrFpfRkFMU0XJ6NbDyqew3KOsYkNtZM6qyejWw8P8we7KsdPQ0KcqLyAgICANCi0gICAgQllURSAgICAgICAgIGFiVmFsRmdbWl9aR1BDR19QQVJBTV9OVU1CRVJdOyAgLyqwtNXVz8Kx6rrNZHdWYWzW0Na10rvSu7bU06ajrGJWYWwxRmdbMF2x7cq+ZHdWYWxbMF3Kx7fxtObU2izSwLTOwODNxqOsMLHtyr6yu7Tm1NqjrDGx7cq+tObU2iovDQotICAgIEJZVEUgICAgICAgICBhYlBhZGRpbmcyWzNdOyANCi0gICAgTE9ORyAgICAgICAgIGFsVmFsW1pfWkdQQ0dfUEFSQU1fTlVNQkVSXTsgICAgLyqyzsr9MS+yzsr9MqGto6zQ3rjEL7bByKG1xM7vwO2y47LOyv2jrLLOyv3KtbzKuqzS5dPJzu/A7bLjuPiz9iovDQotfVRfek1taWFHcnJfWmdwY2dfQ25mOw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLdSt0++juk1NSUFfQVNfTEJTX1JFUV9FVg0KLbmmxNyjurLp0a9MQlPQxc+iDQotttTTpkFUw/zB7qO6K1pMQlMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCB7DQotICAgIEJZVEUgICAgICAgICBiU3JjSW5kZXg7ICAgLyog1LTL99L9ICovDQotICAgIEJZVEUgICAgICAgICBiRGVzSW5kZXg7ICAgLyogxL+1xMv30v0gKi8NCi0gICAgV09SRCAgICAgICAgd1JzcFRpbWU7ICAvKkxCU7Lp0a/H68fztcTX7rTzz+zTpsqxs6SjrLWlzrs6w+sqLw0KLX1UX3pNbWlhQXNfTEJTX1JlcTsNCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi3UrdPvo7pNTUlBX0FTX0xCU19DTkZfRVYNCi25psTco7pMQlPQxc+iyc+xqA0KLbbU06ZBVMP8we6juitaTEJTDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgYlNyY0luZGV4OyAgIC8qINS0y/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkRlc0luZGV4OyAgIC8qIMS/tcTL99L9ICovDQotICAgIEJZVEUgICAgYkFjdDsgLyog1sbKvdDFz6LIoda1OlpfTFRFX0FDVC4uLiovDQotICAgIEJZVEUgICAgYkNlbGxOdW07DQotICAgIFRfekxCU19DZWxsSW5mbyAgICBhdExic0NlbGxbWl9NQVhfTEJTX0NFTExfTlVNXTsvKrf+zvHQocf41Nq12jDOu9bDKi8NCi19VF96TW1pYUFzX0xCU19DbmY7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKtSt0+86IE1NSUFfQVNfSU1TX0RBVEFfREVMRVRFX1JFUV9FVg0KLSq5psTcOiDNqNaqRVBEQ1DJvrP9ttTTpkNJRLXEyv2+3Q0KLSq21NOmw/zB7jorWklNU0RBVEFERUwNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgIGJTcmNJbmRleDsgICAvKiDUtMv30v0gKi8NCi0gICAgQllURSAgICAgICAgIGJEZXNJbmRleDsgICAvKiDEv7XEy/fS/SAqLw0KLSAgICBCWVRFICAgICAgICAgYkNpZDsNCi0gICAgQllURSAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhRXBkY3BfRGF0YURlbF9SZXE7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICBiQWN0Ow0KLSAgICBUX3pfTEFDICAgICAgdExhYzsNCi0gICAgVF96X0NlbGxJZCAgICB0Q2VsbElkOw0KLSAgICBUX3pfUGxtbklkICAgdFBsbW47DQotfVRfek1taWFOYXNfQ2VsbEluZm87DQotDQotDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0g1K3T76O6TU1JQV9BU19VTF9QQVJBTV9JTkRfRVYNCi0gy7XD96O6DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0vKiBBU1lOQyAtLT4gQVRJICAqLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICBiRGVzSW5kZXg7DQotICAgIEJZVEUgICAgIGFiUGFkZGluZ1syXTsNCi0NCi0gICAgRFdPUkQgICAgIGR3TUNTOyAvL3NhdmUgbmV3IHZhbHVlLCByZXBvcnQgbmV3IHZhbHVlDQotICAgIERXT1JEICAgICBkd0Fja0NudDsgIC8vc2F2ZSB0b3RhbCBjbnQsICwgcmVwb3J0IGF2ZWFyYWdlIHZhbHVlDQotICAgIERXT1JEICAgICBkd05hY2tDbnQ7IC8vc2F2ZSB0b3RhbCBjbnQscmVwb3J0IGF2ZWFyYWdlIHZhbHVlDQotICAgIERXT1JEICAgICBkd0JTUjsgICAvL3NhdmUgbmV3IHZhbHVlLCAsIHJlcG9ydCBuZXcgdmFsdWUNCi0gICAgRFdPUkQgICAgIGR3VEJTOyAgIC8vc2F2ZSB0b3RhbCBjbnQsIHJlcG9ydCBhdmVhcmFnZSB2YWx1ZQ0KLX1UX3pBdGlBc19VbFBhcmFtSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLdSt0+86TU1JQV9BU19DQVJEX1NXSVRDSF9SRVFfRVYNCi3LtcP3OkFQz8K3orXEx9C/qMfrx/MoK1pDQVJEU1dJVENIUkVRKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTaW0xQWN0Oy8qMC3IpbvuLDEtvKS77iovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU2ltMkFjdDsvKjAtyKW77iwxLbyku+4qLw0KLX1UX3pNbWlhQXNfQ2FyZFN3aXRjaF9SZXE7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpNTUlBX0FTX0NBUkRfU1dJVENIX0NORl9FVg0KLcu1w/c6x9C/qMfrx/PP7NOmDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlJlc3VsdDsvKjAtWl9TVUNDLDEtWl9GQUlMKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJQYWRkaW5nOw0KLX1UX3pNbWlhQXNfQ2FyZFN3aXRjaF9DbmY7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQot1K3T7zpNTUlBX0FTX0NBUkRfU1dJVENIX0lORF9FVg0KLcu1w/c6zajWqkVVQ0VS0rXO8dLyx9C/qNK1zvHQ6NKqudLG8Lvy1d+71ri0DQot16LKzTq4w8/7z6Kyu9Do0qq72Li0DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLXR5cGVkZWYgc3RydWN0IHsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTcmNJbmRleDsNCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJEZXNJbmRleDsNCi0NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJBY3RTdGF0Oy8qMC250sbwLDEtu9a4tCovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiSXNSZUVzdDsvKjAtsrvW2L2oLDHW2L2oKi8NCi19VF96TW1pYUFzX0NhcmRTd2l0Y2hfSW5kOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi3UrdPvOk1NSUFfVU1NX0NBUkRTV0lUQ0hfUkVRX0lORF9FVg0KLcu1w/c6VU1NtKW3orXEx9C/qMfrx/PW97avyc+xqA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotdHlwZWRlZiBzdHJ1Y3Qgew0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNyY0luZGV4Ow0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYkRlc0luZGV4Ow0KLQ0KLSAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgYlNpbTFBY3Q7LyowLcilu+4sMS28pLvuKi8NCi0gICAgQllURSAgICAgICAgICAgICAgICAgICAgICAgIGJTaW0yQWN0Oy8qMC3IpbvuLDEtvKS77iovDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICAgICBiU3dpdGNoU3RhdDsvKjAt0rXO8b+qyrzH68fztcTH0L+oLDEt0rXO8b3hyvi72M3L17TMrLXEx9C/qCovDQotfVRfek1taWFVbW1fQ2FyZFN3aXRjaFJlcV9JbmQ7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09uq/K/cn5w/c9PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6IHpVbW1fSXNTYW1lT3BlclBsbW4NCi26r8r9uabE3DogxdC2z8G9uPbN+MLnyse38crHzazSu7j21MvTqsnMzfjC5w0KLcrkICDI6zogcHRQbG1uSWQxLHB0UGxtbklkMizQ6NKqsci9z7XEwb249lBMTU5JRA0KLSAgICAgICAgICAgICAgICAgYkluc05vLLT9u/qy4Na4yr4wse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotyuQgILP2OiANCi23tSAgu9g6IFpfVkFMSUTNrNK71MvTqsnMLFpfSU5WQUxJRLK7zazUy9OqycwNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotZXh0ZXJuIEJZVEUgekF0aV9Jc1NhbWVPcGVyUGxtbihUX3pfUGxtbklkICpwdFBsbW5JZDEsIFRfel9QbG1uSWQgKnB0UGxtbklkMiwgQllURSBiSW5zTm8pOw0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6QXRpX0lzQ21jY1BsbW5JZA0KLbqvyv25psTcOiDF0LbPzfjC58rHt/HOqtbQ0sbN+A0KLcrkICDI6zogcHRQbG1uSWQs0OjSqsXQts+1xFBMTU5JRA0KLSAgICAgICAgICAgICAgICAgYkluc05vLLT9u/qy4Na4yr4wse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotyuQgILP2OiANCi23tSAgu9g6IFpfVkFMSUTW0NLGLFpfSU5WQUxJRLfH1tDSxg0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1leHRlcm4gQllURSB6QXRpX0lzQ21jY1BsbW5JZChUX3pfUGxtbklkICpwdFBsbW5JZCwgQllURSBiSW5zTm8pOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8Y6ekF0aV9Jc0NUUGxtbklkDQotKrqvyv25psTcOsXQts9QTE1OSUTKx7fxzqq159DFzfjC5w0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4gQllURSB6QXRpX0lzQ1RQbG1uSWQoVF96X1BsbW5JZCAqcHRQbG1uSWQsIEJZVEUgYkluc05vKTsNCi0NCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogekF0aV9HZXRPcGVyQnlQbG1uSWQNCi26r8r9uabE3DoguPm+3c34wufF0LbP1MvTqsnMDQotyuQgIMjrOiBwdFBsbW5JZCzQ6NKqxdC2z7XEUExNTklEDQotICAgICAgICAgICAgICAgICBiSW5zTm8stP27+rLg1rjKvjCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi3K5CAgs/Y6IA0KLbe1ICC72DogMNLGtq8xtefQxTLBqs2oM8bky/sNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovDQotQllURSB6QXRpX0dldE9wZXJCeVBsbW5JZChUX3pfUGxtbklkICpwdFBsbW5JZCwgQllURSBiSW5zTm8pOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6ekF0aV9HZXRBcHBvaW50ZWRPcGVyUGxtbmJ5T3BlclBsbW5JZA0KLbqvyv25psTcOrj5vt3Su7j2UExNTklEu/HIoc2syvTSu7j21MvTqsnMtcRQTE1OSUQNCi3K5CAgyOs6IHB0UGxtbklky/m4+b7dtcRQTE1OSUQNCi0gICAgICAgICAgICAgICAgIGJJbnNObyy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi0gICAgICAgICAgICAgICAgIHBWYWwsu/HIobXEzazSu9TL06rJzLXEUExNTklEyv2+3SzTybX308PV38nqx+vE2rTmDQotyuQgILP2OiANCi23tSAgu9g6IFpfVkFMSUSzybmmLFpfSU5WQUxJRMqnsNwNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gQllURSB6QXRpX0dldEFwcG9pbnRlZE9wZXJQbG1uQnlPcGVyUGxtbklkKFRfel9QbG1uSWQgKnB0UGxtbklkLCBCWVRFICpwVmFsLCBCWVRFIGJJbnNObyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6QXRpX0dldEFwcG9pbnRlZE9wZXJQbG1uQnlPcGVyTmFtZQ0KLbqvyv25psTcOrj5vt3Uy9OqyczD+7PGu/HIoc2syvTSu7j21MvTqsnMtcRQTE1OSUQNCi3K5CAgyOs6IGJOYW1lRmcsw/uzxsDg0M3WuMq+MLOkw/sxtszD+w0KLSAgICAgICAgICAgICAgICAgcE5hbWXUy9OqyczD+7PG19a3+7SuDQotICAgICAgICAgICAgICAgICBiSW5zTm8stP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotICAgICAgICAgICAgICAgICBwVmFsLLvxyKG1xM2s0rvUy9Oqycy1xFBMTU5JRMr9vt0s08m199PD1d/J6sfrxNq05g0KLcrkICCz9jogDQott7UgILvYOiBaX1ZBTElEs8m5pixaX0lOVkFMSUTKp7DcDQot16IgIMrNOg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIEJZVEUgekF0aV9HZXRBcHBvaW50ZWRPcGVyUGxtbkJ5T3Blck5hbWUoQllURSBiTmFtZUZnLCBCWVRFICpwTmFtZSwgQllURSAqcFZhbCwgQllURSBiSW5zTm8pOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpBdGlfR2V0RHVhbENhcmRTdGF0DQotuq/K/bmmxNw6u/HIocq1zOW/qLrN1Ma/qLWxx7C1xNe0zKwNCi23tbvY1rU6IA0KLSpwYlNpbTFTdGF0Osq1zOW/qLXE17TMrDAtyKW77jEtvKS77g0KLSpwYlNpbTJTdGF0OtTGv6i1xNe0zKwwLcilu+4xLbyku+4NCi0qcGJJc0NhcmRTd2l0Y2hpbmc6y6u/qMrHt/HU2sfQu7u5/bPM1tAwLbK71NosMS3U2sfQv6gNCi0q16LKzTrI57n7tbHHsNTax9C/qLn9s8zW0CxwYlNpbTFTdGF0L3BiU2ltMlN0YXTKx7jDtM7H0L+ox7C1xNe0zKwNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIEJZVEUgekF0aV9HZXREdWFsQ2FyZFN0YXQoUEJZVEUgcGJTaW0xU3RhdCwgUEJZVEUgcGJTaW0yU3RhdCwgUEJZVEUgcGJJc0NhcmRTd2l0Y2hpbmcpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpBdF9Jc0JlZXBDYWxsTnVtDQotuq/K/bmmxNw6xdC2z8rHt/HK9NPatPPNqLXERUNBTEy6xcLrDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBCWVRFIHpBdF9Jc0JlZXBDYWxsTnVtKFRfel9DYWxsTnVtICpwdENoZWNrZWROdW0pOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elVtbV9Jc090aGVyUHNTcHRTcnZNb3ZlDQotuq/K/bmmxNw6xdC2z8Ht0ru0/bv6suDKx7fx1qez1tK1zvGw4ceoDQotyuQgIMjrOiBiSW5zSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogDQott7UgILvYOiBaX1ZBTElE1qez1ixaX0lOVkFMSUSyu9ans9YNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0jaWZkZWYgWl9EVUFMU1RBTkRCWQ0KLWV4dGVybiBCWVRFIHpVbW1fSXNPdGhlclBzU3B0U3J2TW92ZShCWVRFIGJJbnNJZHgpOw0KLSNlbmRpZg0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elVtbV9Jc1BsbW5JZEVxdWFsDQotuq/K/bmmxNw6xdC2z8G9uPZQTE1OSUTKx7fxz+DNrA0KLcrkICDI6zogcHRGc3RQbG1uLHB0U25kUGxtbrT9sci9z7XEwb249lBMTU5JRA0KLcrkICCz9jogDQott7UgILvYOiBaX1ZBTElEz+DNrCxaX0lOVkFMSUSyu8/gzawNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gQllURSB6VW1tX0lzUGxtbklkRXF1YWwoVF96X1BsbW5JZCogcHRGc3RQbG1uLCBUX3pfUGxtbklkKiBwdFNuZFBsbW4sIEJZVEUgYlBzSWQpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elVtbV9HZXRDdXJBY3RfTmFzQ29tX0J5SW5kZXgNCi26r8r9uabE3Dq78cihtbHHsNbGyr3Qxc+iDQotyuQgIMjrOiBiSW5zSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogDQott7UgILvYOiCyzrz7YXRpcHNjb20uaChaX05PX0FDVC9aX1REX0FDVC9aX1dfQUNUL1pfR1NNX0FDVC9aX0xURV9BQ1QvWl9HU01fQ09NUEFDVF9BQ1QpDQot16IgIMrNOg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIEJZVEUgX19wc19zdGF0aWNfZnVuYyB6VW1tX0dldEN1ckFjdF9OYXNDb21fQnlJbmRleChCWVRFIGJJbnNJZHgpOw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAguq/K/cP7ICAgICAgo7p6VW1tX0lzU3lzY29uZmlnU3B0U3BlY0FjdA0KLSogICAguabE3CAgICAgICAgo7pTeXNjb25maWfKx7fx1qez1s/s06a1xNbGyr0NCi0qICAgIMrkyOuyzsr9ICAgIKO6zt4NCi0qICAgIMrks/ayzsr9ICAgIKO6zt4NCi0qICAgILe1u9jWtcu1w/cgIFpfVkFMSURcWl9JTlZBTElEDQotKiAgICDG5Mv7y7XD9yAgICCjus7eDQotKiAgICBsaW5zaGVuZ3dlaQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgelVtbV9Jc1N5c2NvbmZpZ1NwdFNwZWNBY3QoQllURSBiQWN0LCBCWVRFIGJDdXJQc0lkKTsNCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjogelVtbV9Jc05lZWRDaGFuZ2VDZmcNCi26r8r9uabE3Dogy6u/qMurtP3F0LbPwb3Vxb+oyse38dDo0qq9u7u7v6iy2w0KLcrkICDI6zogDQotyuQgILP2OiANCi23tSAgu9g6IFpfTk9fTkVFRF9DSEFOR0Wyu9Do0qq9u7u7L1pfTkVFRF9DSEFOR0XQ6NKqvbu7uy9aX05FRURfVVNFUl9ERUNJREXTydPDu6e+9raoDQot16IgIMrNOiANCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCi1CWVRFIHpVbW1fSXNOZWVkQ2hhbmdlQ2ZnKFZPSUQpOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgILqvyv3D+yAgICAgIDogelVtbV9Jc0NzZmJQcm9jDQotICogICAguabE3CAgICAgICAgo7q1scewyse38bSm09pDc0Ziuf2zzA0KLSAqICAgIMrkyOuyzsr9ICAgIKO6DQotICogICAgyuSz9rLOyv0gICAgo7oNCi0gKiAgICC3tbvY1rXLtcP3ICCjulpfVkFMSUQgysdDU0ZCuf2zzCAvIFpfSU5WQUxJRKO6srvKx0NTRkK5/bPMDQotICogICAgxuTL+8u1w/cgICAgo7rO3g0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4gQllURSB6VW1tX0lzQ3NmYlByb2MoQllURSBiQ3VySW5zRGV4KTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICC6r8r9w/sgICAgICA6IHpVbW1fSXNJbnRlclJhdENoZw0KLSAqICAgILmmxNwgICAgICAgIKO6tbHHsMrHt/G0ptPav+fWxsq9uf2zzA0KLSAqICAgIMrkyOuyzsr9ICAgIKO6DQotICogICAgyuSz9rLOyv0gICAgo7oNCi0gKiAgICC3tbvY1rXLtcP3ICCjulpfVkFMSUQgyse/59bGyr25/bPM1tAgLyBaX0lOVkFMSUSjurK7yse/59bGyr25/bPMDQotICogICAgxuTL+8u1w/cgICAgo7rO3g0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1leHRlcm4gQllURSB6VW1tX0lzSW50ZXJSYXRDaGcoQllURSBiQ3VySW5zRGV4KTsNCi0NCi1leHRlcm4gQllURSB6VW1tX0dldEVudmVsb3BMb2NpKFRfek1taWFOYXNfQ2VsbEluZm8qIHB0TG9jYXRpb24pOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6U21fSXNEZWZQZHBDb250ZXh0VXNpbmcNCi26r8r9uabE3DrF0LbPQ0lEyse38dTayrnTww0KLcrkICDI6zogYkNpZCy0/cXQts+1xENJRA0KLSAgICAgICAgICAgICAgICAgYkluc05vLLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogDQott7UgILvYOiBaX1NVQ0PU2sq508MsWl9GQUlMzrTU2sq508MNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gQllURSB6U21fSXNEZWZQZHBDb250ZXh0VXNpbmcoQllURSBiSW5zTm8sIEJZVEUgYkNpZCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpFc21fSXNEZWZQZHBDb250ZXh0VXNpbmcNCi26r8r9uabE3DrF0LbPQ0lEyse38dTayrnTww0KLcrkICDI6zogYkNpZCy0/cXQts+1xENJRA0KLSAgICAgICAgICAgICAgICAgYkluc05vLLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogDQott7UgILvYOiBaX1NVQ0PU2sq508MsWl9GQUlMzrTU2sq508MNCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gIEJZVEUgekVzbV9Jc0RlZlBkcENvbnRleHRVc2luZyhCWVRFIGJJbnNObywgQllURSBiQ2lkKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elNtX0dldFBkcEluZm9CeUNpZA0KLbqvyv25psTcOsXQts9DSUTKx7fxvKS77rKiu/HIobyku+7Qxc+iDQotyuQgIMjrOiBiQ2lkLLT9xdC2z7XEQ0lEDQotICAgICAgICAgICAgICAgICBiSW5zTm8stP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotyuQgILP2OiBwdFNhdmVBZGRyvKS77rXEtdjWt9DFz6Is08m199PD1d/J6sfrxNq05g0KLSAgICAgICAgICAgICAgICAgcHRQY29PdXS8pLvutcRQQ0/Qxc+iLNPJtffTw9XfyerH68TatOYNCi23tSAgu9g6IFpfU1VDQ9LRvq28pLvuLFpfRkFJTM60vKS77g0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBCWVRFIHpTbV9HZXRQZHBJbmZvQnlDaWQoQllURSBiSW5zTm8sIEJZVEUgYkNpZCwgVF96TW1pYVNtX1BkcEFkZHIgKnB0U2F2ZUFkZHIsIFRfek1taWFTbV9QY29JbmZvICpwdFBjb091dCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpFc21fR2V0UGRwSW5mb0J5Q2lkDQotuq/K/bmmxNw6xdC2z0NJRMrHt/G8pLvusqK78cihvKS77tDFz6INCi3K5CAgyOs6IGJDaWQstP3F0LbPtcRDSUQNCi0gICAgICAgICAgICAgICAgIGJJbnNObyy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi3K5CAgs/Y6IHB0TW1pYVBkcEFkZHK8pLvutcS12Na30MXPoizTybX308PV38nqx+vE2rTmDQotICAgICAgICAgICAgICAgICBwdE1taWFQY29JbmZvvKS77rXEUENP0MXPoizTybX308PV38nqx+vE2rTmDQott7UgILvYOiBaX1NVQ0PS0b6tvKS77ixaX0ZBSUzOtLyku+4NCi3XoiAgys06DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gIEJZVEUgekVzbV9HZXRQZHBJbmZvQnlDaWQoQllURSBiSW5zTm8sIEJZVEUgYkNpZCwgVF96TW1pYVNtX1BkcEFkZHIgKnB0TW1pYVBkcEFkZHIsIFRfek1taWFTbV9QY29JbmZvICpwdE1taWFQY29JbmZvKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpFc21fU2VuZEVzbUFUQ29tbWFuZA0KLbqvyv25psTcOsXQts+1scewz/vPosrHt/G3orj4NEfEo7/pDQotyuQgIMjrOiBiSW5zTm8stP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotyuQgILP2OiANCi23tSAgu9g6IFpfVkFMSUTKxyxaX0lOVkFMSUS38Q0KLdeiICDKzToNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gIEJZVEUgekVzbV9TZW5kRXNtQVRDb21tYW5kKEJZVEUgYkluc05vKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpFc21fSXNJbXNCZWFyZXINCi26r8r9uabE3DrF0LbP1ri2qENpZMrHt/HKx0lNU7PQ1NgNCi3K5CAgyOs6IGJDaWQNCi0gICAgICAgIGJJbnNObyC0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi3K5CAgs/Y6IA0KLbe1ICC72DogWl9WQUxJRMrHLFpfSU5WQUxJRLfxDQot16IgIMrNOg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBCWVRFIHpFc21fSXNJbXNCZWFyZXIoQllURSBiQ2lkLCBCWVRFIGJJbnNObyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6U3RtX0NhcmRMb3N0SW5kDQotuq/K/bmmxNw6zajWqrWxx7DS0b6tsM6/qA0KLcrkICDI6zogdFRhc2tJZHgstP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bV9DYXJkTG9zdEluZChUX3pTdG1fVGFza0lkeCB0VGFza0lkeCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9TZXRNb2RlDQotuq/K/bmmxNw6zajWqsrHt/HOqk1UTkVUILLiytTEo8q9DQotyuQgIMjrOiBpc01UTmV0VGVzdCwxyscsMLfxDQotICAgICAgICAgICAgICAgICB0VGFza0lkeCy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gVk9JRCB6U3RtUGJfU2V0TW9kZShCT09MIGlzTVROZXRUZXN0LCBUX3pTdG1fVGFza0lkeCBiSW5kZXgpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elN0bV9NbWlhU21zX0NtZ2xSZXFfUHJvYw0KLbqvyv25psTcOrbM0MXB0LHtx+vH8w0KLcrkICDI6zogbXNnRGF0YSzH68fzz/vPosTayN0sss68+1RfekFwTW1pYV9MaXN0U21fUmVxLNPJtffTw9XfyerH68TatOYNCi0gICAgICAgICAgICAgICAgIG1zZ0xlbizH68fzz/vPorOktsgNCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBWT0lEIHpTdG1fTW1pYVNtc19DbWdsUmVxX1Byb2MoY29uc3QgVk9JRCAqbXNnRGF0YSwgVUlOVDE2IG1zZ0xlbixUX3pTdG1fVGFza0lkeCB0VGFza0lkeCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6U3RtX01taWFQYl9BZGRVc2VyRW5fUHJvYw0KLbqvyv25psTcOtT2vNO99LyxusXC6w0KLcrkICDI6zogbXNnRGF0YSzH68fzz/vPosTayN0sss68+1RfWkF0aV9FbWVyTnVtX1JlcSzTybX308PV38nqx+vE2rTmDQotICAgICAgICAgICAgICAgICBtc2dMZW4sx+vH88/7z6KzpLbIDQotICAgICAgICAgICAgICAgICB0VGFza0lkeCy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gVk9JRCB6U3RtX01taWFQYl9BZGRVc2VyRW5fUHJvYyhjb25zdCBWT0lEICptc2dEYXRhLCBVSU5UMTYgbXNnTGVuLFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1fQXRpU21zX0NtZ2RUZXN0X1Byb2MNCi26r8r9uabE3Dq2zNDFsuLK1MP8we7H68fzDQotyuQgIMjrOiBtc2dEYXRhLMfrx/PP+8+ixNrI3Syyzrz7VF96QXBNbWlhX0xpc3RTbV9SZXEs08m199PD1d/J6sfrxNq05g0KLSAgICAgICAgICAgICAgICAgbXNnTGVuLMfrx/PP+8+is6S2yA0KLSAgICAgICAgICAgICAgICAgdFRhc2tJZHgstP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bV9BdGlTbXNfQ21nZFRlc3RfUHJvYyhjb25zdCBWT0lEICptc2dEYXRhLCBVSU5UMTYgbXNnTGVuLFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9DcGJyU3luSGFuZGxlDQotuq/K/bmmxNw6tee7sLG+tsHIocfrx/MNCi3K5CAgyOs6IHBDcGJyUmVxLMfrx/PP+8+ixNrI3SzTybX308PV38nqx+vE2rTmsqLM7tC0x+vH88TayN0NCi0gICAgICAgICAgICAgICAgIHBDcGJyQ25mLLbByKG1xL3hufss08m199PD1d/J6sfrxNq05rKis/XKvLuvDQotICAgICAgICAgICAgICAgICB0VGFza0lkeCy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi3K5CAgs/Y6IHBDcGJyQ25mLLbByKG1xL3hufsNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gVk9JRCB6U3RtUGJfQ3BiclN5bkhhbmRsZShjb25zdCBUX3pTdG1fQ3Bicl9SZXEgKnBDcGJyUmVxLCBUX3pTdG1fQ3Bicl9DbmYgKnBDcGJyQ25mLFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9GaW5kTnVtQnlOYW1lDQotuq/K/bmmxNw6zai5/cP7s8ay6dXStee7sLG+1tDL+bbU06a1xLrFwusNCi3K5CAgyOs6IHB0UGhvbmVUZXh0LMP7s8bX1rf7LNPJtffTw9XfyerH68TatOayoszu0LTE2sjdDQotICAgICAgICAgICAgICAgICBwdFFyeVBiUmVzdWx0LLX308PV38nqx+vE2rTmLLG7tffTw9XfzO7QtLLp1dK1xMTayN0NCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogcHRRcnlQYlJlc3VsdCyy6dXStcS94bn7DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bVBiX0ZpbmROdW1CeU5hbWUoY29uc3QgVF96QXBNbWlhX1Bob25lVGV4dCAqcHRQaG9uZVRleHQsVF96QXBNbWlhX1FyeVBob25lUmVzdWx0ICpwdFFyeVBiUmVzdWx0LFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiB6U3RtU21zX010U21TdHJnRnVsbEhhbmRsZQ0KLSoguabE3MPoyvY6ILTmtKJTTbTmtKLG99P2wvq1xMfpv/a0psDtDQotKiCyzsr9y7XD9zogKElOKQ0KLSogICAgICAgICAgIChPVVQpDQotKiC3tSC72CDWtTogDQotKiDG5Mv8y7XD9zogzOG5qbj4QVRJtcS907/ao6xNVD0yLEFQwvqjrENTTVM9MMqxo6zNqNaqzfiy4LK7v8nTw6OsDQotKiAgICAgICAgICAgICAgICAgICAgU1RN1sNNQ0VORg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLWV4dGVybiBWT0lEIHpTdG1TbXNfTXRTdHJnRnVsbEhhbmRsZShUX3pTdG1fVGFza0lkeCB0VGFza0lkeCk7DQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6U3RtU21zX0dldE1lbVN0YXR1cw0KLbqvyv25psTcOiCy6dGvtszP+8+itOa0osb317TMrA0KLcrkICDI6zogYk1lbTogtOa0osb3SUQNCi3K5CAgs/Y6IHB3TWVtQ2FwYWNpdHk6ILTmtKLG98jdwb8NCi0gICAgICAgICAgICAgICAgIHB3TWVtVXNlZDog0tHTw7TmtKLG97/VvOQNCi0gt7Ugu9gg1rU6IM7eDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bVNtc19HZXRNZW1TdGF0dXMoQllURSBiTWVtLCBXT1JEICpwd01lbUNhcGFjaXR5LCBXT1JEICpwd01lbVVzZWQsVF96U3RtX1Rhc2tJZHggdFRhc2tJZHgpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9RdWVyeU51bVR5cGUNCi26r8r9uabE3DogsunRr7Wxx7C6xcLryse38c6qvfS8sbrFwusNCi3K5CAgyOs6IHB0QmNkTnVtOiC6xcLrLNPJtffTw9XfyerH68TatOayoszu0LQNCi0gICAgICAgICAgICAgICAgIHRQbG1uQWN0OrWxx7DXpMH0tcRQTE1OSUQNCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogcHROdW1UeXBlOiC78cihtcS6xcLrwODQzSxaX0FQTU1JQV9OVU1UWVBFX0VDQ0NBTEy1yLrq1rW2qNLlss68+2F0aXBzaW50LmgNCi23tSC72CDWtTogzt4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBWT0lEIHpTdG1QYl9RdWVyeU51bVR5cGUoY29uc3QgVF96X0NhbGxOdW0gICpwdEJjZE51bSwgVF96QXBNbWlhX051bVR5cGUgKnB0TnVtVHlwZSwgVF96UFNfUGxtbklkIHRQbG1uQWN0LCBUX3pTdG1fVGFza0lkeCB0VGFza0lkeCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6U3RtUGJfRmluZE51bUJ5SW5kZXgNCi26r8r9uabE3Dogzai5/cv30v3WtbLp1dK157uwsb7W0LXEusXC6w0KLcrkICDI6zogcHRJbmRleFJlcTogy/fS/da1LNPJtffTw9XfyerH68TatOayoszu0LQNCi0gICAgICAgICAgICAgICAgIHB0UXJ5UGJSZXN1bHQssunRr7XEveG5+yzTybX308PV38nqx+vE2rTmsqKz9cq8u68NCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogcHRRcnlQYlJlc3VsdDogsunV0rXEveG5+yzTybG7tffTw7XE0ru3vczu0LQNCi0gt7Ugu9gg1rU6IM7eDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bVBiX0ZpbmROdW1CeUluZGV4KGNvbnN0IFRfekFwTW1pYV9QYkZpbmRJbmRleCAqcHRJbmRleFJlcSwgVF96QXBNbWlhX1FyeVBob25lUmVzdWx0ICpwdFFyeVBiUmVzdWx0LFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9GaW5kTmFtZUJ5TnVtDQotuq/K/bmmxNw6IM2ouf26xcLrsunRr7Xnu7CxvsDvtcTD+7PGDQotyuQgIMjrOiBUX3pfQ2FsbE51bTogy/fS/da1LNPJtffTw9XfyerH68TatOayoszu0LQNCi0gICAgICAgICAgICAgICAgIHB0UXJ5UGJSZXN1bHQssunRr7XEveG5+yzTybX308PV38nqx+vE2rTmsqKz9cq8u68NCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogcHRRcnlQYlJlc3VsdDogsunV0rXEveG5+yzTybG7tffTw7XE0ru3vczu0LQNCi0gt7Ugu9gg1rU6IM7eDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFZPSUQgelN0bVBiX0ZpbmROYW1lQnlOdW0oY29uc3QgVF96X0NhbGxOdW0gKnB0QmNkTnVtLCBUX3pBcE1taWFfUXJ5UGhvbmVSZXN1bHQgKnB0UXJ5UGJSZXN1bHQsVF96U3RtX1Rhc2tJZHggdFRhc2tJZHgpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elN0bVBiX0dldEVjY051bQ0KLbqvyv25psTcOiC78cihvfS8sbrFwuvB0LHtDQotyuQgIMjrOiBwRW1lck51bUxpc3Q6ILLp0a+1xL3hufss08m199PD1d/J6sfrxNq05rKis/XKvLuvDQotICAgICAgICAgICAgICAgICB0VGFza0lkeCy0/bv6suDWuMq+LDCx7cq+tP27+rLgMSwxse3KvrT9u/qy4DINCi3K5CAgs/Y6IHBFbWVyTnVtTGlzdDogsunV0rXEveG5+yzTybG7tffTw7XE0ru3vczu0LSy6dXSveG5+w0KLSC3tSC72CDWtTogzt4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gVk9JRCB6U3RtUGJfR2V0RWNjTnVtKFRfekFwTW1pYV9FbWVyTnVtTGlzdCAqcEVtZXJOdW1MaXN0LFRfelN0bV9UYXNrSWR4IHRUYXNrSWR4KTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpTdG1QYl9FbWVyTnVtTGlzdEluZF9Qcm9jDQotuq/K/bmmxNw6ILGjtOa99LyxusXC68HQse0NCi3K5CAgyOs6IGVtZXJOdW1MaXN0X0luZDogvfS8sbrFwuvB0LHtLNPJtffTw9XfyerH68TatOayoszu0LQNCi0gICAgICAgICAgICAgICAgIHRUYXNrSWR4LLT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogzt4NCi23tSC72CDWtTogVFJVRSy6xcLrsaO05rPJuaayotDo0qrP8kFQsuDJz7GovfS8sbrFwusNCi0gICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSyyu9Do0qrJz7GovfS8sbrFwusNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gQk9PTCB6U3RtUGJfRW1lck51bUxpc3RJbmRfUHJvYyhUX3pBcE1taWFfUGJFbWVyTnVtTGlzdF9JbmQgZW1lck51bUxpc3RfSW5kLCBUX3pTdG1fVGFza0lkeCB0VGFza0lkeCk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6RXVjc3JfR2V0QmFuZEluZm8NCi26r8r9uabE3Dq78cihtbHHsExURdbGyr3XpMH0tcTGtbbODQotyuQgIMjrOiBwYkJhbmQs16TB9Ma1ts4s08m199PD1d/J6sfrxNq05rKis/XKvLuvDQotyuQgILP2OiBwYkJhbmQstbHHsNekwfS1xMa1ts4s08mxu7X308PV38zu0LQNCi23tSC72CDWtTogzt4NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gVk9JRCB6RXVjc3JfR2V0QmFuZEluZm8oUEJZVEUgcGJCYW5kKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6elVyYmNfR2V0QmFuZEluZm8NCi26r8r9uabE3Dq78cihVETWxsq9z8KjrNb3xrW6zbioxrW21NOmtcTGtbbO0MXPog0KLcrkICDI6zogzt4NCi3K5CAgs/Y6IHBiUHJpQmFuZDrW98a1tePL+cr0xrW2zta41eujrHBiU3VwQmFuZDq4qMa1tePL+cr0xrW2zta41esNCi23tSC72CDWtTrO3g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBWT0lEIHpVcmJjX0dldEJhbmRJbmZvKFBCWVRFIHBiUHJpQmFuZCwgUEJZVEUgcGJTdXBCYW5kKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6eldyYmNfR2V0QmFuZEluZm8NCi26r8r9uabE3Dq78cihV9bGyr3PwrWxx7DXpMH0tcTGtbbODQotyuQgIMjrOiDO3g0KLcrkICCz9jogcGJQcmlCYW5kOsa1tePL+cr0xrW2zta41esNCi23tbvY1rXLtcP3ICCjus7eDQotxuTL+8u1w/cgICAgo7rO3g0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNpZmRlZiBQU19SQVRfRkREDQotZXh0ZXJuIFZPSUQgeldyYmNfR2V0QmFuZEluZm8oUEJZVEUgcGJQcmlCYW5kKTsNCi0jZW5kaWYNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi26r8r9w/uzxjp6RXVjZXJfR2V0UnJjU3RhdGVGb3JNbWlhDQotuq/K/bmmxNw6u/HIoVJSQ9e0zKwNCi3K5CAgyOs6IGJJbnNOb7T9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICCz9jogzt4NCi23tSC72CDWtToxIC0gUlJDIElkbGUNCi0gICAgICAgICAgICAgICAgICAgICAgMy0gUlJDIENvbm5lY3RlZA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLWV4dGVybiBCWVRFIHpFdWNlcl9HZXRScmNTdGF0ZUZvck1taWEoQllURSBiSW5zTm8pOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOnpFbW1fR2V0Q3VyU3RhdGUNCi26r8r9uabE3Dq78cihRU1N17TMrA0KLcrkICDI6zogzt4NCi3K5CAgs/Y6IM7eDQott7Ugu9gg1rU6DQotMCAtIEVNTS1OVUxMDQotMSAtIEVNTS1ERVJFR0lTVEVSRUQNCi0yIC0gRU1NLSBFTU0tUkVHSVNURVJFRCANCi0zIC0gRU1NLSBSRUdJU1RFUkVELUlOSVRJQVRFRA0KLTQgLSBFTU0tIFRSQUNLSU5HLUFSRUEtVVBEQVRJTkctSU5JVElBVEVEDQotNSAtIEVNTS0gU0VSVklDRS1SRVFVRVNULUlOSVRJQVRFRA0KLTYgLSBFTU0tIERFUkVHSVNURVJFRC1JTklUSUFURUQNCi03IC0gRU1NLSBNVERFUkVHSVNURVJFRC1JTklUQVRFRA0KLTggLSBFTU0tIEVYVEVORC1TRVJWSUNFLVJFUVVFU1QgLUlOSVRBVEVEDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIEJZVEUgekVtbV9HZXRDdXJTdGF0ZShCWVRFIGJJbnNObyk7DQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6ekNjX0Nic3RDaGVjaw0KLbqvyv25psTcOrzssukrQ0JTVLj3w/zB7rLOyv21xLrPt6jQ1A0KLcrkICDI6zpwU3BlZWQgICAgo63L2cLKDQotICAgICAgICAgICAgICAgICBwTmFtZSAgICAgo63NrLK9L9Lssr0NCi0gICAgICAgICAgICAgICAgIHBDZSAgICAgICCjrc24w/cvt8fNuMP3DQotyuQgILP2OiDO3g0KLbe1ILvYINa1OlpfRkFJTCyyzsr9t8e3qA0KLSAgICAgICAgICAgICAgICAgICAgICBaX1NVQ0Msss7K/brPt6gNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi1leHRlcm4gQllURSB6Q2NfQ2JzdENoZWNrKFBCWVRFIHBTcGVlZCwgUEJZVEUgcE5hbWUsIFBCWVRFIHBDZSk7DQotZXh0ZXJuIEJZVEUgekNjX0dldENhbGxTdGF0ZShCWVRFIGJJbnNJZHgpOw0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7ICAgICA6IHpFdXNpcl9HZXRBdGlMYXN0Q2VsbFNJQkluZm8NCi26r8r9uabE3Dq3tbvY1+6689K7tM62wcihU0lCMbPJuaa689Chx/jQxc+iLLmpQVRJtffTww0KLcrkICDI6zogYkluc05vtP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQott7Ugu9gg1rU6DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIFRfek1taWFBc19DZWxsSW5mbyB6RXVzaXJfR2V0QXRpTGFzdENlbGxTSUJJbmZvKEJZVEUgYkluc05vKTsNCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLbqvyv3D+7PGOiB6QXBNbWlhX1Ntc0xpc3RNc2dDb252ZXJzaW9uDQotuq/K/bmmxNw6IL2rUEK1xMHQvtm2zNDFu9jTprXEveG5uczl16q7u86qQVRJtKbA7bXEveG5uczlDQotyuQgICAgyOs6IHB0TGlzdFNtUmx0wdC+2bbM0MXIt8jPtcTP+8+iveG5uczlDQotICAgICAgICAgICAgICAgICAgIGJJbnN0YW5jZbT9u/qy4Na4yr4sMLHtyr60/bv6suAxLDGx7cq+tP27+rLgMg0KLcrkICAgILP2OiBwU21zTXNnQ29udGVudNequ7u687XEz/vPotPrveG5uczlDQott7W72CAg1rU6INequ7u94bn7o7oNCi0gICAgICAgICAgICBaX0FQTU1JQV9PUEVSQVRJT05fRkFJTFVSRQ0KLSAgICAgICAgICAgIFpfQVBNTUlBX09QRVJBVElPTl9TVUNDRVNTDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQotZXh0ZXJuIEJZVEUgekFwTW1pYV9TbXNMaXN0TXNnQ29udmVyc2lvbihUX3pBcE1taWFfTGlzdFNtUmx0ICpwdExpc3RTbVJsdCwgVF96QXBNbWlhX1Ntc01zZ0NvbnRlbnQgKnB0U21zTXNnQ29udGVudCwgQllURSBiSW5zdGFuY2UpOw0KLQ0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotuq/K/cP7s8Y6ekF0X0dldFpjd2FTZXRGbGcNCi26r8r9uabE3Dq78cihtbHHsFpDV0HJ6NbDtcTWtQ0KLcrkICDI6zogYkluc05vtP27+rLg1rjKviwwse3KvrT9u/qy4DEsMbHtyr60/bv6suAyDQotyuQgILP2OiANCi23tSC72CDWtTogMDrK1bW9d2FpdGluZyBjYWxsyrHWsb3Tvty++LK7yc+xqKOsMTrV/bOjyc+xqA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLWV4dGVybiBCWVRFIHpBdF9HZXRaY3dhU2V0RmxnKEJZVEUgYkluc05vKTsNCi0jZW5kaWYNCi1leHRlcm4gVUlOVDE2IHpBdDJfVXRpbE5wN2JpdFRvQXNjaWkoIGNvbnN0IFVJTlQ4ICpwU3RyN2JpdFB0ciwgVUlOVDggKnBBc2NpaVN0clB0ciwgVUlOVDE2IGk3Yml0TGVuZ3RoKTsNCi1leHRlcm4gVF96X1BsbW5JZCB6QXRpX0dldEN1cnJQbG1uKEJZVEUgYkluc0lkeCk7DQotZXh0ZXJuIGludCBnZXRfY2lkX3N0YXRlKHVuc2lnbmVkIGNoYXIgY2lkKTsNCi1leHRlcm4gQllURSB6QXRpX0dldFMwVmFsdWUoVk9JRCk7DQotZXh0ZXJuIERXT1JEIHpBdGlfR2V0VWxSYXRlSW5kVGltZXJWYWwoQllURSBiSW5zSWR4KTsNCi0jZW5kaWYNCi0NCmRpZmYgLS1naXQgYS9VYm9vdC9jcC9wcy9tb2RlbS9wcy9zcmMvbmFzL2F0aS9zcmMvemF0aV9mbmMuYyBiL1Vib290L2NwL3BzL21vZGVtL3BzL3NyYy9uYXMvYXRpL3NyYy96YXRpX2ZuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYjNhMDNmLi4wMDAwMDAwCi0tLSBhL1Vib290L2NwL3BzL21vZGVtL3BzL3NyYy9uYXMvYXRpL3NyYy96YXRpX2ZuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qDQotKiAgICAgICAgICAgICBQcm90b2NvbCBTdGFjayBBZGFwdGVyIExheWVyIFRlbGVwaG9uZSBJbnRlcmZhY2UNCi0qDQotKiAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBaVEUgQ29ycG9yYXRpb24uDQotKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoNCi0qICAgsOaxvsv509AgOiDW0NDLzajRtrnJt93T0M/euavLviDK1rv6ysLStbK/IMa9zKi83Lm5sr8NCi0qICAgxKMgv+kgw/sgOiBBVEkyxKO/6cq1z9bOxLz+DQotKiAgIM7EILz+IMP7IDogemF0aTJfZm5jLmMNCi0qICAgzsS8/rHqyrYgOiANCi0qICAgz+C52M7EvP4gOiANCi0qICAgyrXP1rmmxNwgOiAgIA0KLSogICDX9yAgICDV3yA6IENoZW5ZdW4NCi0qICAgsOYgICAgsb4gOiAyLjANCi0qICAgzeqzycjVxtogOiAyMDA4LzAyLzI1DQotKiAgIMbky/zLtcP3IDogDQotKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoNCi0qICAgzsS8/sPoyvYNCi0qICAgLS0tLS0tLS0tLS0tLS0tLQ0KLSogICBBVEkyuabE3Mq1z9YNCi0qDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICDNt87EvP6w/LqsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2luY2x1ZGUgInBzL3NyYy9uYXMvYXRpL2luYy96YXRfY29tLmgiDQotI2luY2x1ZGUgInBzL3NyYy9uYXMvYXRpL2luYy96YXRpX2NzZF9mbmMuaCINCi0jaW5jbHVkZSAicHMvc3JjL25hcy9hdGkvaW5jL3phdGlfcGRpX2ZuYy5oIg0KLSNpbmNsdWRlICJwcy9zcmMvbmFzL2F0aS9pbmMvemF0X2ZuYy5oIg0KLSNpbmNsdWRlICJwcy9zcmMvbmFzL2F0aS9pbmMvemF0aV9jb20uaCINCi0jaW5jbHVkZSAicHMvc3JjL25hcy9hdGkvaW5jL3phdGlfb3Roci5oIiANCi0jaW5jbHVkZSAicHMvc3JjL25hcy9hdGkvaW5jL3phdF9leHRfZm5jLmgiDQotI2luY2x1ZGUgInBzL3NyYy9uYXMvYXRpL2luYy96YXRpX3NtLmgiIA0KLQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSNpZm5kZWYgX09TX1dJTg0KLSNpbmNsdWRlICJkcnZzX3ZvbHRlLmgiDQotI2VuZGlmDQotI2VuZGlmDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICCzo8G/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jZGVmaW5lIFpBVEkyX0lOVkFMX0lOREVYICAgICAgICAgICAgICAweGZmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICC66iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICC+1rK/uq/K/cnqw/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIEJZVEUgekF0aV9DaGVja1JlY3ZNc2coVUlOVDMyIGlFdklkLCBVSU5UOCAqcERhdGFQdHIsIFVJTlQxNiBpRGF0YUxlbik7DQotLy8tLXN0YXRpYyBWT0lEIHpBdGlfSGFuZGxlU21PcGVuQ2hJbmQoVk9JRCAqcEJ1ZmYpOw0KLXN0YXRpYyBWT0lEIHpBdGlfSGFuZGxlU21HZXRQY29JbmQoVk9JRCAqcEJ1ZmYpOw0KLXN0YXRpYyBCT09MIHpBdGlfSGFuZGxlU21BY3RDbmZFeHQoVk9JRCAqcERhdGFQdHIpOw0KLXN0YXRpYyBEV09SRCB6QXRpX0hhbmRsZVNtQWN0Q25mKFZPSUQqIHBCdWZmLCBEV09SRCAqIHBkd0NoYW5nZWRNc2dJZCwgVF9aQXRpX0NoYW5uZWxJbmZvICAqcENobmVsTm9kZSk7DQotLy9zdGF0aWMgVk9JRCB6QXRpX0hhbmRsZVNtQ2xvc2VDaEluZChWT0lEICpwQnVmZik7DQotc3RhdGljIFZPSUQgekF0aV9IYW5kbGVabWVuYUNuZihWT0lEICpwRGF0YVB0cik7DQotc3RhdGljIEJPT0wgekF0aV9Jc05vT2NjdXB5ZWRDaWQoUEJZVEUgcEV4aXN0ZWRFeENpZCwgQllURSBiQ2lkKTsNCi1zdGF0aWMgQk9PTCB6QXRpX0dldER1YWxTdGFja0V4Q2lkKFBCWVRFIHBFeGlzdGVkRXhDaWQsUEJZVEUgcEV4Q2lkKTsNCi1zdGF0aWMgQk9PTCB6QXRpX0hhbmRsZVNtRGVBY3RDaWQoVUlOVDggYkNpZCk7DQotc3RhdGljIEJPT0wgekF0aV9IYW5kbGVTbUNsZWFuRXhDaWRJbmZvKFRfek1taWFTbV9QZHBBY3RfQ25mICogcFNtQWN0RGVhY0NuZik7DQotc3RhdGljIEJPT0wgekF0aV9IYW5kbGVTbUFjdEZhaWxlZEV4Q2lkKFRfek1taWFTbV9QZHBBY3RfQ25mICogcFNtQWN0RGVhY0NuZiwgVUlOVDgqIHBEZXN0KTsNCi1zdGF0aWMgIFRfWkF0aV9DaGFubmVsSW5mbyAqIHpBdGlfR2V0Q2huZWxOb2RlKFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4pOw0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLXN0YXRpYyBWT0lEIHpBdGlfSGFuZGxlQ2NEaXNjSW5kKCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpOw0KLSNlbmRpZg0KLURXT1JEIHpBdGlfSGFuZGxlQ2dhdHRTZXRSZXFDbmYoVk9JRCogcEJ1ZmYsIERXT1JEICogcGR3Q2hhbmdlZE1zZ0lkLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKTsNCi1zdGF0aWMgU0lOVDMyIHpBdGlfQ2hhbmdlQ2huZWxOb2RlVG9EYXRhKFRfWkF0aV9EYXRhVHlwZSBkYXRhVHlwZSwgQ0hBUiAqcEVuY29kZUNtZCwgVUlOVDE2IGlFbmNvZGVDbWRMZW4sIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSk7DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotc3RhdGljIFZPSUQgekF0aV9TZW5kQ29ubkluZChVSU5UOCAqcERhdGFQdHIsIENIQVIgKnBFbmNvZGVDbWQsIFVJTlQxNiBpRW5jb2RlQ21kTGVuLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpOw0KLSNlbmRpZg0KLXN0YXRpYyBTSU5UMzIgekF0aV9TZW5kU21Db25uZWN0SW5kKFVJTlQ4ICpwRGF0YVB0ciwgQ0hBUiAqcEVuY29kZUNtZCwgVUlOVDE2IGlFbmNvZGVDbWRMZW4sIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSk7DQotc3RhdGljIFZPSUQgekF0aV9IYW5kbGVaZ2FjdENuZk1zZyhUX3pNbWlhU21fUGRwQWN0X0NuZiAqcFNtQ2dhY3RDbmYsICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpOw0KLXN0YXRpYyBCT09MIHpBdGlfSGFuZGxlQ25mTXNnQmVmb3JlRW5jQ21kKFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4sICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpOw0KLXN0YXRpYyBWT0lEIHpBdGlfQ3BickhhbmRsZShUX3pBcE1taWFfQ3BiclNldF9SZXEqIHBDcGJyUmVxLCBVSU5UMTYgaVN0YXJ0UmVjLCBUX3pTdG1QYl9TdG9yYWdlSWQgcmVhZFN0b3JhZ2UsIFRfelN0bV9DcGJyX0NuZiAqcENwYnJTdG1DbmYpOw0KLXN0YXRpYyBCT09MICB6QXRpX0dldERlc3RUYXNrQnlNc2dJRChVSU5UMzIgbXNnSWQsIFVJTlQ4ICpkZXN0VGFzayk7DQotc3RhdGljIFZPSUQgekF0aV9TYXZlT25seUNpZFRhYihVSU5UOCBpQ2lkLCBCWVRFIGJFeENpZCwgQllURSBiRXhQZHBUeXBlKTsNCi0NCi1zdGF0aWMgVk9JRCB6QXRpX0VVbWNyQmFuZDM5SW5mb0luZChWT0lEKiBwQnVmZik7DQotDQotc3RhdGljIEJZVEUgekF0aV9Db252ZXJ0VHNrSWRUb1NiTWRsKEJZVEUgZGVzdFRhc2spOw0KLXN0YXRpYyBWT0lEIHpBdGlfQ3BickNuZihVSU5UOCAqcERhdGFQdHIpOw0KLXN0YXRpYyBWT0lEIHpBdGlfU3RtTGlzdEluZChVSU5UOCAqcERhdGFQdHIpOw0KLS8vILfHyc+xqNbQ1ve/2M/7z6INCi0jaWZkZWYgWl9EVUFMU1RBTkRCWQ0KLXN0YXRpYyBWT0lEIHpBdGlfUmVjdkdyck5DZWxsQ2huZ0luZChWT0lEICpwQnVmZik7DQotI2VuZGlmDQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotc3RhdGljIFZPSUQgekF0aV9EcnZfZHRtZnJ4X1JlcG9ydChjaGFyICpkdG1mLCB1bnNpZ25lZCBjaGFyIGR0bWZMZW4pOw0KLSNpZm5kZWYgX09TX1dJTg0KLXN0YXRpYyBWT0lEIHpBdGlfUmVnRHRtZkNhbGxCYWNrKCk7DQotI2VuZGlmDQotI2VuZGlmDQotc3RhdGljIFZPSUQgekF0aV9Ob3RpZnlBcE1vZGVtUmVhZHkoVk9JRCk7IC8qIDYxNzAwMTU5MTQxMSChvtbHxNy7+tDox/Ohvy0g1sfE3Lv60OjH81YzsOaxvs2ssr3Ktc/WKi8NCi1zdGF0aWMgRFdPUkQgekF0aV9QcmVVaWNjU2xvdEluZChWT0lEICpwYk1zZ0RhdGEsIERXT1JEICogcGR3Q2hhbmdlZE1zZ0lkLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKTsNCi1zdGF0aWMgRFdPUkQgekF0aV9IYW5kbGVVc2VyRGVhY3RDbmZNc2coIFZPSUQqIHBCdWZmLCBEV09SRCAqcGR3Q2hhbmdlZE1zZ0lkLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKTsNCi1zdGF0aWMgRFdPUkQgekF0aV9IYW5kbGVQcHBDb21tb25DbmYoVk9JRCogcEJ1ZmYsIERXT1JEICpwZHdDaGFuZ2VkTXNnSWQsIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpOw0KLQ0KLVZPSUQgekF0aV9SZW1vdmVBTExDbWQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKTsNCi1WT0lEIHpBdGlfSGFuZGxlUHBwUHJvY0NtZEVycm9yKFZPSUQpOw0KLUJZVEUgekF0aV9QcHBHZXRDaWQoQllURSAgYkNobmVsSWQpOw0KLSNpZmRlZiBaX0RVQUxTVEFOREJZDQotVk9JRCB6QXRpX0NzQ2FsbFN0YXJ0SW5kKFZPSUQgKnBEYXRhUHRyKTsNCi1WT0lEIHpBdGlfQ3NDYWxsRW5kSW5kKFZPSUQgKnBEYXRhUHRyKTsNCi0jZW5kaWYNCi1WT0lEIHpBdGlfQ2xlYXJQY29DaGFwKFZPSUQpOw0KLVZPSUQgekF0aV9HZXRFbUluZm9NdXRleChCWVRFIGJJbnNJZHgpOw0KLVZPSUQgekF0aV9QdXRFbUluZm9NdXRleChCWVRFIGJJbnNJZHgpOw0KLVZPSUQgekF0aV9EZWNyZWFzZVJlcUNvdW50QW5kUmVsTXV0ZXhTZW1hcGhvcmUoVk9JRCk7DQotVk9JRCB6QXRpX0VNQ2VsbEluZm9SZXEoVk9JRCk7DQotQk9PTCB6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZChXT1JEIHdJZCk7DQotc3RhdGljIFZPSUQgekF0aV9UcmFuc2Zvcm0gKFVJTlQzMiAqYnVmLCBVSU5UMzIgKmluKTsNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rHkwb8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1jb25zdCBUX1pBdGlfTXNnVHJuc3BybmN5IGdfVGFza01zZ01hcFtdID0NCi17DQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKipDQyBNYXNzYWdlKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICB7TU1JQV9DQ19BTlNfTU9ERV9SRVFfRVYsICAgICAgICAgICBaX0FUSV9UQVNLSURfQ0MgfSwNCi0gICAge01NSUFfQ0NfU1RBVEVfUVVFUllfUkVRX0VWLCAgICAgICAgWl9BVElfVEFTS0lEX0NDIH0sDQotICAgIHtNTUlBX0NDX0RJU19NT0RFX1JFUV9FViwgICAgICAgICAgIFpfQVRJX1RBU0tJRF9DQyB9LA0KLSAgICB7TU1JQV9DQ19NT0RJRllfUkVRX0VWLCAgICAgICAgICAgICBaX0FUSV9UQVNLSURfQ0MgfSwNCi0gICAge01NSUFfQ0NfQ0hMRF9SRVFfRVYsICAgICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9DQ30sDQotICAgIHtNTUlBX0NDX0NTVEFfU0VUX1JFUV9FViwgICAgICAgICAgICAgICAgWl9BVElfVEFTS0lEX0NDICB9LA0KLSAgICB7TU1JQV9DQ19DU1RBX1FVRVJZX1JFUV9FViwgICAgICAgICAgICAgICAgWl9BVElfVEFTS0lEX0NDICB9LA0KLSAgICB7TU1JQV9DQ19EVE1GX1JFUV9FViwgICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9DQyAgfSwNCi0gICAge01NSUFfQ0NfTVRDX1JTUF9FViwgICAgICAgICAgICAgICAgWl9BVElfVEFTS0lEX0NDICB9LA0KLSAgICB7TU1JQV9DQ19NT0NfUkVRX0VWLCAgICAgICAgICAgWl9BVElfVEFTS0lEX0NDfSwNCi0gICAge01NSUFfQ0NfVDlUSU1FUl9TRVRfUkVRX0VWLCAgICAgICAgIFpfQVRJX1RBU0tJRF9DQ30sDQotICAgIHtNTUlBX0NDX1Q5VElNRVJfUVJZX1JFUV9FViwgICAgICAgICBaX0FUSV9UQVNLSURfQ0N9LA0KLSAgICB7TU1JQV9DQ19TVEFURV9SRVFfRVYsICAgICAgICBaX0FUSV9UQVNLSURfQ0N9LA0KLSAgICB7TU1JQV9DQ19PUEVOX1ZPSUNFQ0hOTF9SRVFfRVYsICAgICBaX0FUSV9UQVNLSURfQ0N9LA0KLSAgICB7TU1JQV9DQ19TUlZDQ19OT1RPUEVOX1ZPSUNFQ0hOTF9SRVFfRVYsICAgWl9BVElfVEFTS0lEX0NDfSwNCi0gICAge01NSUFfQ0NfVk9JQ0VNT0RFX1FSWV9SRVFfRVYsICAgICBaX0FUSV9UQVNLSURfQ0N9LA0KLSAgICB7TU1JQV9DQ19SRVNFVElWU19SRVFfRVYsICAgWl9BVElfVEFTS0lEX0NDfSwNCi0jZW5kaWYNCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKkVTTSBNYXNzYWdlKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICB7TU1JQV9FU01fRVBTX1FPU19RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FU00gICB9LA0KLQ0KLSAgICANCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKlNNIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqLw0KLSNpZiBkZWZpbmVkIChQU19SQVRfR1NNKSB8fCBkZWZpbmVkIChQU19SQVRfVEREKSB8fCBkZWZpbmVkIChQU19SQVRfRkREKQ0KLSAgICB7TU1JQV9TTV9ORUdfUU9TX1FVRVJZX1JFUV9FViAgICAsWl9BVElfVEFTS0lEX1NNfSwNCi0gICAge01NSUFfU01fTkVHX0VRT1NfUVVFUllfUkVRX0VWICAgICxaX0FUSV9UQVNLSURfU019LA0KLSNlbmRpZg0KLSNpZmRlZiBDWFRfTU9WDQotICAgIHtNTUlBX1NNX0NPTlRFWFRfUkVRX0VWLCBaX0FUSV9UQVNLSURfU019LA0KLSNlbmRpZg0KLSAgICAvL3tNTUlBX1NNX0RJU0NPTk5FQ1RfUkVRX0VWICAgICxaX0FUSV9UQVNLSURfU019LA0KLQ0KLQ0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqU00gYW5kIEVTTSBNYXNzYWdlKioqKioqKioqKioqKioqKioqKi8NCi0gICAge01NSUFfU01fSURMRV9DSE5MX1FVRVJZX1JTUF9FViAgICAsWl9BVElfVEFTS0lEX1NNfSwNCi0gICAge01NSUFfU01fUERQX1NUQVRVU19RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FU00gICAgfSwNCi0gICAge01NSUFfU01fQUNUSVZBVEVEX0NJRF9RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FU019LA0KLSAgICB7TU1JQV9TTV9EQVRBX1NUQVRFX1JFUV9FViwgWl9BVElfVEFTS0lEX0VTTSB9LA0KLSAgICB7TU1JQV9TTV9QRFBfQUREUl9RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FU00gfSwNCi0gICAge01NSUFfU01fUERQX01PRElGWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FU00gfSwNCi0gICAge01NSUFfU01fQ0dDT05UUkRQX1JFUV9FViwgWl9BVElfVEFTS0lEX0VTTSAgIH0sDQotICAgIHtNTUlBX1NNX0NHU0NPTlRSRFBfUkVRX0VWLCBaX0FUSV9UQVNLSURfRVNNIH0sDQotICAgIHtNTUlBX1NNX0NHVEZUUkRQX1JFUV9FViwgWl9BVElfVEFTS0lEX0VTTSAgICB9LA0KLSAgICB7TU1JQV9TTV9HRVRfUENPX1JTUF9FViwgWl9BVElfVEFTS0lEX0VTTX0sDQotICAgIHtNTUlBX1NNX0lQX1BEUF9BQ1RfUkVRX0VWLCBaX0FUSV9UQVNLSURfRVNNfSwNCi0NCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKlVJQ0MgTWFzc2FnZSoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAge0FQX1VJQ0NfSU5JVF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDICB9LA0KLSAgICB7QVBfVUlDQ19QSU5fUkVNQUlOX05VTV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDICAgfSwNCi0gICAge0FQX1VJQ0NfUElOX1NUQVRfUVVFUllfUkVRX0VWLCBaX0FUSV9UQVNLSURfVUlDQ30sDQotICAgIHtBUF9VSUNDX1BJTl9BUFBMX1NFVF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDfSwNCi0gICAge0FQX1VJQ0NfUElOX0FQUExfUkVBRF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDfSwNCi0gICAge0FQX1VJQ0NfQ0FSRF9NT0RFX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0N9LA0KLSAgICB7QVBfVUlDQ19SRUFEX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfWlBVS19SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDIH0sDQotICAgIHtBUF9VSUNDX0FVVEhfUkVRX0VWLCBaX0FUSV9UQVNLSURfVUlDQyB9LA0KLSAgICB7QVBfVUlDQ19SRUZSRVNIX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfVVNBVF9FTlZFTE9QX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfVVNBVF9URVJNTkxfUlNQX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfVVNBVF9URVJNTkxfUFJPRl9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDIH0sDQotICAgIHtBUF9VSUNDX1RPX1JFQURfQ0FSRF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDIH0sDQotICAgIHtBUF9VSUNDX0NTSU1fUkVRX0VWLCBaX0FUSV9UQVNLSURfVUlDQyB9LA0KLSAgICB7QVBfVUlDQ19DQ0hPX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfQ0NIQ19SRVFfRVYsIFpfQVRJX1RBU0tJRF9VSUNDIH0sDQotICAgIHtBUF9VSUNDX0NHTEFfUkVRX0VWLCBaX0FUSV9UQVNLSURfVUlDQyB9LA0KLSAgICB7QVBfVUlDQ19DUlNNX1JFUV9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfQUlSX0FVVEhfUlNQX0lORF9FViwgWl9BVElfVEFTS0lEX1VJQ0MgfSwNCi0gICAge0FQX1VJQ0NfUkVBRF9FSURfUkVRX0VWLCBaX0FUSV9UQVNLSURfVUlDQyB9LA0KLQ0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqVU1NIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIHtNTUlBX1VNTV9DR0FUVF9RVUVSWV9SRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTX0sDQotICAgIHtNTUlBX1VNTV9BQ1RJVkVfUkVRX0VWICAsIFpfQVRJX1RBU0tJRF9VTU0gIH0sDQotICAgIHtNTUlBX1VNTV9aQVRUX1FVRVJZX1JFUV9FViAgLCBaX0FUSV9UQVNLSURfVU1NfSwNCi0gICAge01NSUFfVU1NX1NZU0NPTkZJR19SRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTSAgfSwNCi0gICAge01NSUFfVU1NX1NZU0NPTkZJR19RVUVSWV9SRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fVk9JQ0VfTU9ERV9TRVRfUkVRX0VWICAsIFpfQVRJX1RBU0tJRF9VTU0gfSwNCi0gICAge01NSUFfVU1NX1ZPSUNFX01PREVfUVVFUllfUkVRX0VWICAsIFpfQVRJX1RBU0tJRF9VTU0gfSwNCi0gICAge01NSUFfVU1NX1NNU09WRVJJUE5FVF9TRVRSRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fQ1NHX1NFTF9SRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fQ1VSUkVOVF9DU0dfUVVFUllfUkVRX0VWICAsIFpfQVRJX1RBU0tJRF9VTU0gfSwNCi0gICAge01NSUFfVU1NX0NTR19MSVNUX1JFUV9FViAgLCBaX0FUSV9UQVNLSURfVU1NIH0sDQotICAgIHtNTUlBX1VNTV9FUFNfTU9ERV9RVUVSWV9SRVFfRVYgICwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fRVBTX01PREVfU0VUX1JFUV9FViAgLCBaX0FUSV9UQVNLSURfVU1NIH0sDQotICAgIHtNTUlBX1VNTV9QTE1OX0xJU1RfUkVRX0VWICAsIFpfQVRJX1RBU0tJRF9VTU0gfSwNCi0gICAge01NSUFfVU1NX1NFVF9MVEVfQUNUX1JFUV9FViwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fQ1NfU1JWX0NORl9FViwgWl9BVElfVEFTS0lEX1VNTSB9LA0KLSAgICB7TU1JQV9VTU1fSU1TX1JFR0lTVEVSX1NUQVRFU19FViwgWl9BVElfVEFTS0lEX1VNTX0sDQotICAgIHtNTUlBX1VNTV9YQ0VMTElORk9fUkVRX0VWLCBaX0FUSV9UQVNLSURfVU1NfSwNCi0gICAge01NSUFfVU1NX0NTVk9JQ0VfUVVFUllfUkVRX0VWLCBaX0FUSV9UQVNLSURfVU1NfSwNCi0jaWZkZWYgRUNBTExfU1VQUE9SVA0KLSAgICB7TU1JQV9VTU1fRUNBTExTUFRfUVVFUllfUkVRX0VWLCBaX0FUSV9UQVNLSURfVU1NfSwNCi0gICAge01NSUFfVU1NX0VDQUxMT05MWV9RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9VTU19LA0KLSNlbmRpZg0KLQ0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqU1MgTWFzc2FnZSoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0gICAge01NSUFfU1NfQ0xJUF9SRUFEX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9TUyB9LA0KLSAgICB7TU1JQV9TU19DTElSX1JFQURfUkVRX0VWICwgWl9BVElfVEFTS0lEX1NTIH0sDQotICAgIHtNTUlBX1NTX0NDRkNfU0VUX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9TUyB9LA0KLSAgICB7TU1JQV9TU19DQ1dBX1NFVF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfU1MgfSwNCi0gICAge01NSUFfU1NfQ09MUl9SRUFEX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9TUyB9LA0KLSAgICB7TU1JQV9TU19DTkFQX1JFQURfUkVRX0VWICwgWl9BVElfVEFTS0lEX1NTIH0sDQotICAgIHtNTUlBX1NTX0NPTFBfUkVBRF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfU1MgfSwNCi0jZW5kaWYNCi0jaWZkZWYgX1VTRV9MUFBfRUNJRA0KLSAgICB7TU1JQV9TU19NVExSX0FOU19SRVFfRVYgLCBaX0FUSV9UQVNLSURfU1N9LA0KLSNlbmRpZg0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqU01TIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIHtNTUlBX1NNU19SRUNfUlNQX1JFUV9FViAgLFpfQVRJX1RBU0tJRF9TTVMgfSwNCi0gICAge01NSUFfU01TX01FTV9BVkFJTF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9TTVN9LA0KLQ0KLSAgICAgICAgDQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKipQQiBNYXNzYWdlKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICB7QVBfTU1JQV9QQl9TVE9SQUdFX1NUQVRVU19SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfRURJVF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfQ1BCV19RVUVSWV9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAgLy8tLXtBUF9NTUlBX1BCX0ZJTkRfSU5ERVhfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1BCX0ZJTkRfVEVYVF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfU1RPX1NFVF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfU19GSU5EX0lOREVYX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9QQiB9LA0KLSAgICB7QVBfTU1JQV9QQl9TQ1BCUl9URVNUX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9QQiB9LA0KLSAgICB7QVBfTU1JQV9QQl9TX0VESVRfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1BCX1NDUEJXX1RFU1RfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1BCX0NfTlVNX1JFUSAsIFpfQVRJX1RBU0tJRF9QQiB9LA0KLSAgICB7QVBfTU1JQV9QQl9SRUFEX0NBUEFfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1BCX1JFQURfU0VUX05VTV9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfUFJFRl9NU0dfU1RPX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9QQiB9LA0KLSAgICB7QVBfTU1JQV9QQl9QUkVGX01TR19TVE9fVEVTVF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfUEJfUVVFUllfU01TX01BWF9JTkRFWF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfU01fUkVBRF9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfU01fU0FWRV9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEJ9LA0KLSAgICB7QVBfTU1JQV9TTV9ERUxFVEVfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1NNX1JFQURfUkVRX0VWICwgWl9BVElfVEFTS0lEX1BCIH0sDQotICAgIHtBUF9NTUlBX1BCX01FTV9DQVBBX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9QQiB9LA0KLSAgICB7QVBfTU1JQV9QQl9SRUFEX0xBU1RfRVhUX0VSUl9SRVFfRVYgLCBaX0FUSV9UQVNLSURfUEIgfSwNCi0gICAge0FQX01NSUFfU01fTUVNX0FWQUlMX1JTUF9FViwgICAgIFpfQVRJX1RBU0tJRF9QQiB9LCAgIA0KLQ0KLQ0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqQ0JTIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIHsgTU1JQV9DQlNfQUNUSVZBVEVfUkVRX0VWICwgWl9BVElfVEFTS0lEX0NCUyB9LA0KLSAgICANCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKkFTIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIHsgTU1JQV9FVUNTUl9MVEVJTkZPX1JFUV9FViAsIFpfQVRJX1RBU0tJRF9FVUNTUiB9LA0KLSAgICB7IE1NSUFfQVNfUlNTSV9RVUVSWV9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FVU1DUn0sDQotICAgIHsgTU1JQV9BU19TSU5SX1FVRVJZX1JFUV9FViwgWl9BVElfVEFTS0lEX0VVTUNSfSwNCi0gICAgeyBNTUlBX0FTX1NBSV9MSVNUX1FVRVJZX1JFUV9FViwgWl9BVElfVEFTS0lEX0VVQ0VSfSwNCi0gICAgeyBNTUlBX0FTX1NBSV9MSVNUX1JFUE9SVF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FVUNFUn0sDQotICAgIHsgTU1JQV9BU19UTUdJX0xJU1RfUVVFUllfUkVRX0VWLCBaX0FUSV9UQVNLSURfRVVDRVJ9LA0KLSAgICB7IE1NSUFfQVNfVE1HSV9MSVNUX1JFUE9SVF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FVUNFUn0sDQotICAgIHsgTU1JQV9BU19UTUdJX0xJU1RfUkVRX0VWLCBaX0FUSV9UQVNLSURfRVVDRVJ9LA0KLSAgICB7IE1NSUFfQVNfTUJNU19QUkVGRVJFTkNFX1JFUV9FViwgWl9BVElfVEFTS0lEX0VVQ0VSfSwNCi0gICAgeyBNTUlBX0FTX05XX1RJTUVfUVVFUllfUkVRX0VWLCBaX0FUSV9UQVNLSURfRVVDU1J9LA0KLSAgICB7IE1NSUFfQVNfRU1fTFRFX0hPX1NFVF9SRVFfRVYsIFpfQVRJX1RBU0tJRF9FVUNFUn0sDQotICAgIHsgTU1JQV9BU19FTV9MVEVfSE9fU0VUX1FVRVJZX1JFUV9FViwgWl9BVElfVEFTS0lEX0VVQ0VSfSwNCi0gICAgeyBNTUlBX0dSUl9aR1BDR19SRVFfRVYsIFpfQVRJX1RBU0tJRF9HUlJ9LA0KLSAgICB7IE1NSUFfTDFUX1pUUENHX1JFUV9FViwgWl9BVElfVEFTS0lEX0wxVH0sDQotICAgIHsgTU1JQV9MMVdfWldQQ0dfUkVRX0VWLCBaX0FUSV9UQVNLSURfTDFXfSwNCi0NCi0gICAgLyoqKioqKioqKioqKioqKioqKioqIExURSBHb1RhxKO/6SAqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKipUU00gTWFzc2FnZSoqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgQlRSVU5LX1NVUFBPUlQNCi0gICAgeyBBVElfVFNNX1JFR19SRVFfRVYgLCAgICAgICAgICAgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fQ0FMTF9SRVFfRVYgLCAgICAgICAgICAgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9DQUxMQ09ORklSTV9SRVFfRVYgLCAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0gICAgeyBBVElfVFNNX0NBTExDT05ORUNUX1JFUV9FViAsICAgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fQ0FMTFJMU19SRVFfRVYgLCAgICAgICAgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9GTE9PUl9SRVFfRVYgLCAgICAgICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0gICAgeyBBVElfVFNNX0ZMT09SUkxTX1JFUV9FViAsICAgICAgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fU1RVTklORk9fUVVFUllfUkVRX0VWICwgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9HUk9VUElORk9fUVVFUllfUkVRX0VWICwgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0gICAgeyBBVElfVFNNX1NDQU5HUk9VUElORk9fUkVRX0VWICwgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fU0NBTlNXSVRDSF9SRVFfRVYgLCAgICAgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9TSEFLRUhBTkRfUkVRX0VWICwgICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0gICAgeyBBVElfVFNNX1NIT1JUX0RBVEFfUkVRX0VWICwgICAgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fTE9DQVRJTkZPX1JFUV9FViAsICAgICAgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9TRVRBQklMSVRZX1JFUV9FViAsICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0gICAgeyBBVElfVFNNX0NBTExGT1JXQVJEX1JFUV9FViAsICAgICAgICAgICAgWl9BVElfVEFTS0lEX1RTTSB9LA0KLSAgICB7IEFUSV9UU01fQ0FMTE1PRElGWV9SU1BfRVYgLCAgICAgICAgICAgICBaX0FUSV9UQVNLSURfVFNNIH0sDQotICAgIHsgQVRJX1RTTV9DQUxMTU9ESUZZX1JFSl9FViAsICAgICAgICAgICAgIFpfQVRJX1RBU0tJRF9UU00gfSwNCi0NCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqRVNNIE1hc3NhZ2UqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICB7IFBUVF9NTUlBX0VTTV9UQVVUWVBFX1JFUV9FViAsICAgICAgICAgICBaX0FUSV9UQVNLSURfRVNNIH0sDQotI2VuZGlmDQotfTsNCi0NCi0vL9PJIFBfQXRpUHJvY0Z1bmMgYXRpT3V0ZXJNc2dNYXBbMjJdW1pfQVRJX1BST0NGVU5DX05VTV0g0N64xA0KLVRfekF0aV9QcmVPdXRlck1zZ1RhYiAgYXRQcmVPdXRlck1zZ1tdID0gew0KLQ0KLSAgICAgICAgLyoqKioqKioqKioqKioqU01TKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgICAgIHtNTUlBX1NNU19NU0dfU0VORF9DTkZfRVYsICAgICB6QXRpX1Ntc01zZ1NlbmRDbmZ9LA0KLSAgICAgICAge01NSUFfU01TX0RFTElWRVJfUkVDX0lORF9FViwgIHpBdGlfU21zRGVsaXZlclJlY0luZH0sDQotICAgICAgICB7TU1JQV9TTVNfU1RBVFVTX1JFQ19JTkRfRVYsICAgekF0aV9TbXNTdGF0dXNSZWNJbmR9LA0KLSAgICAgICAge01NSUFfU01TX1JFQ19SU1BfQ05GX0VWLHpBdF9TbXNSZWNSc3BDbmZ9LA0KLQ0KLSAgICAgICAgLyoqKioqKioqKioqKioqQ0JTKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAgICAgIHtNTUlBX0NCU19EQVRBX0lORF9FViwgICAgICAgICB6QXRpX0Nic19EYXRhSW5kfSwNCi0gICAgICAgIA0KLSAgICAgICAgLyoqKioqKioqKioqKioqKlVJQ0MqKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICAge0FQX1VJQ0NfSU5JVF9DTkZfRVYgLCAgICAgICB6QXRpX1VpY2NJbml0Q25mfSwNCi0gICAgICAgIHtBUF9VSUNDX0lOSVRfSU5EX0VWLCAgICAgICB6QXRpX1VpY2NadXN0c3RJbmR9LA0KLSAgICAgICAge0FQX1VJQ0NfU0xPVF9JTkRfRVYsICAgICAgICB6QXRpX1ByZVVpY2NTbG90SW5kfSwNCi0gICAgICAgIHtBUF9VSUNDX1VJQ0NPS19JTkRfRVYsICAgICAgekF0aV9VaWNjT2tJbmR9LA0KLSAgICAgICAge0FQX1VJQ0NfUkVBRF9DTkZfRVYsICAgICAgICB6QXRpX1VpY2NSZWFkQ25mfSwNCi0gICAgICAgIHtBUF9VSUNDX1VQREFURV9DTkZfRVYsICAgICAgekF0aV9VaWNjVXBkYXRlQ25mfSwNCi0gICAgICAgIHtBUF9VSUNDX0FVVEhfUlNQX0VWLCAgICAgICAgekF0aV9VaWNjQXV0aFJzcH0sDQotICAgICAgICB7QVBfVUlDQ19BVVRIX0ZBSUxfSU5EX0VWLCAgIHpBdGlfVWljY0F1dGhGYWlsSW5kfSwgICAgICAgIA0KLSAgICAgICAge0FQX1VJQ0NfVVBEQVRFX0lURU1fQ05GX0VWLCB6QXRpX1VpY2NVcGRhdGVJdGVtQ25mfSwNCi0gICAgICAgIHtBUF9VSUNDX1ZFUklGWV9QSU4yX0NORl9FViwgekF0aV9WZXJpZnlQaW4yQ25mfSwNCi0gICAgICAgIHtBUF9VSUNDX0NPTU1PTl9DTkZfRVYsICAgICAgekF0aV9VaWNjQ29tbW9uQ25mfSwNCi0NCi0gICAgICAgIC8qKioqKioqKioqKioqKipVTU0qKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICAge01NSUFfVU1NX1BMTU5fSU5GT19JTkRfRVYsICB6QXRpX1BsbW5JbmZvfSwNCi0gICAgICAgIHtNTUlBX1VNTV9QTE1OX0xJU1RfQ05GX0VWLCAgekF0aV9QbG1uTGlzdH0sDQotICAgICAgICB7TU1JQV9VTU1fTU1fSU5GT19JTkRfRVYsICAgIHpBdGlfTW1pbmZvfSwNCi0gICAgICAgIHtNTUlBX1VNTV9SRl9DVFJMX0NORl9FViwgICAgekF0aV9SZkNvbnRyb2x9LA0KLSAgICAgICAge01NSUFfVU1NX1NFQVJDSF9QTE1OX0NORl9FVix6QXRpX1VtbVNlYXJjaFBsbW5DbmZ9LA0KLSAgICAgICAge01NSUFfVU1NX0FDVElWRV9DTkZfRVYsICAgICB6QXRpX0hhbmRsZUNnYXR0U2V0UmVxQ25mfSwNCi0gICAgICAgIHtNTUlBX1VNTV9DT01NT05fQ05GX0VWLCAgICB6QXRpX1VtbUNvbW1vbkNuZn0sDQotICAgICAgICB7TU1JQV9VTU1fQ1NfU1JWX0lORF9FdiwgICAgekF0aV9VbW1Dc1NydkluZH0sDQotDQotICAgICAgICAvKioqKioqKioqKioqKioqU00qKioqKioqKioqKioqKioqKioqKioqLw0KLSAgICAgICAvLyB7TU1JQV9TTV9DT05ORUNUX0lORF9FViwgICAgIHpBdGlfU21Db25uZWN0SW5kfSwNCi0gICAgICAgIHtNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVYsekF0aV9IYW5kbGVTbUFjdENuZiB9LA0KLSAgICAgICAge01NSUFfU01fUERQX0RFQUNUSVZBVEVfQ05GX0VWLCB6QXRpX0hhbmRsZVVzZXJEZWFjdENuZk1zZ30sDQotICAgICAgLy8gIHtNTUlBX1NNX1BEUF9BQ1RJVkFURV9JTkRfRVYsIHpBdGlfU21NdEFjdGl2YXRlSW5kfSwNCi0gICAgICAgIHtNTUlBX1NNX0NHRVZfSU5EX0VWLCB6QXRpX1NtTXRDZ2V2SW5kfSwNCi0gICAgICAgIHtNTUlBX1NNX0NPTU1PTl9DTkZfRVYsIHpBdGlfSGFuZGxlUHBwQ29tbW9uQ25mfSwNCi0gICAgICAgIHtNTUlBX1NNX05PX0NBUlJJRVJfQ05GX0VWLCAgekF0aV9IYW5kbGVTbU5vQ2FycmllckNuZn0sDQotICAgICAgICB7TU1JQV9TTV9QRFBfQ0FVU0VfUVVFUllfQ05GX0VWLCB6QXRpX0huYWRsZVBkcENhdXNlUXVlcnlDbmZ9LA0KLQ0KLSAgICAgICAgLyoqKioqKioqKioqKioqKkVTTSoqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgICANCi0gICAgICAgIC8qKioqKioqKioqKioqKipDQyoqKioqKioqKioqKioqKioqKioqKiovDQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotICAgICAgICB7TU1JQV9DQ19NT0NfQ05GX0VWLCAgICAgICAgIHpBdGlfQ2NNb2NDbmZ9LA0KLSAgICAgICAge01NSUFfQ0NfTVRDX0lORF9FViwgICAgICAgICB6QXRpX0NjTXRjSW5kfSwNCi0gICAgICAgIHtNTUlBX0NDX0FOU19NT0RFX0NORl9FViwgICAgekF0aV9DY0Fuc01vZENuZn0sDQotICAgICAgICB7TU1JQV9DQ19NT0RJRllfQ05GX0VWLCAgICAgIHpBdGlfQ2NNb2RpZnlDbmZ9LA0KLSAgICAgICAge01NSUFfQ0NfRElTQ19JTkRfRVYsICAgICAgICB6QXRpX0NjRGlzY0luZH0sDQotICAgICAgICB7TU1JQV9DQ19TU19OT1RJRllfSU5EX0VWLCAgIHpBdGlfQ2NTc05vdGlmeUluZH0sDQotICAgICAgICB7TU1JQV9DQ19QUk9DX0lORk9fSU5EX0VWLCAgIHpBdGlfUHJvY0luZm9JbmR9LA0KLSAgICAgICAge01NSUFfQ0NfQ0NNX1FVRVJZX0NORl9FViwgICB6QXRpX0NjbVF1ZXJ5Q25mfSwNCi0gICAgICAgIHtNTUlBX0NDX0RJU0NfQ05GX0VWLCAgICAgICAgekF0aV9DY0RpY3NDbmZ9LA0KLSAgICAgICAge01NSUFfQ0NfRFRNRl9DTkZfRVYsICAgICAgekF0aV9DY0R0bWZDbmZ9LA0KLSNlbmRpZg0KLSAgICAgICAgLyoqKioqKioqKioqKioqKlNTKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0gICAgICAgIC8qKioqKioqKioqKioqKipQQioqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgICB7QVBfTU1JQV9TTV9TQVZFX0NORl9FViwgICAgICAgICAgIHpBdGlfUGJTYXZlU21DbmZ9LA0KLSAgICAgICAge0FQX01NSUFfU01fUkVBRF9DTkZfRVYsICAgICAgICAgICB6QXRpX1BiUmVhZFNtQ25mfSwNCi0gICAgICAgIHtBUF9NTUlBX1NNX0RFTEVURV9DTkZfRVYsICAgICAgICAgekF0aV9QYkRlbGV0ZVNtQ25mfSwNCi0NCi0gICAgICAgIHtBUF9NTUlBX1NNX01FTV9BVkFJTF9JTkRfRVYsICAgICAgekF0aV9QYlNtTWVtQXZhaWx9LA0KLSAgICAgICAge0FQX01NSUFfUEJfU1RPUkFHRV9TVEFUVVNfQ05GX0VWLCB6QXRpX1BiUEJNZW1TdGF0dXNDbmZ9LA0KLSAgICAgICAge0FQX01NSUFfUEJfSU5JVF9DT01QX0lORF9FViwgICAgICB6QXRpX1BiSW5pdENtcGx0SW5kfSwNCi0jaWZkZWYgQ1hUX01PVg0KLSAgICAgICAge01NSUFfU01fQ09OVEVYVF9DTkZfRVYsICB6QXRpX1NtQ29udGV4dENuZn0sDQotICAgICAgICB7TU1JQV9VTU1fUFNfQ09OVEVYVF9DTkZfRVYsIHpBdGlfVW1tUHNDb250ZXh0Q25mfSwNCi0jZW5kaWYNCi0jaWZkZWYgRFNEU19WU0lNDQotICAgICAgICB7TU1JQV9BU19DQVJEX1NXSVRDSF9DTkZfRVYsIHpBdGlfQ2FyZFN3aXRjaENuZn0sDQotI2VuZGlmDQotfTsNCi0NCi0NCi1jb25zdCBUX3pBdGlfTm9uUmVwb3J0TXNnIGdfekF0aV9Ob25SZXBvcnRNc2dUYWJsZVtdICA9DQotew0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICB7TU1JQV9DQ19OT1RJRllfQU9DX1RJTUVSX0lORF9FVix6QXRfTm90aWZ5QW9jVGltZXJJbmR9LA0KLSNlbmRpZg0KLSAgICB7UlJfRU1fSE9fSU5GT19JTkQsekF0X0VNX0dycmNIb0luZm9JbmR9LA0KLSAgICB7TU1JQV9BU19FTV9VSE9fSU5GT19JTkRfRVYsekF0X0VNX1VycmNIb0luZm9JbmR9LA0KLSAgICB7TVNHVFJBQ0VQU19DRUxMX0RJU1BMQVlfUkVRX0VWLHpBdF9UcmFjZVBzQ2VsbERpc3BsYXlSZXF9LA0KLSAgICB7TU1JQV9VTU1fU1VCTU9ERV9JTkRfRVYsekF0X0hzcGFJbmR9LA0KLSAgICB7TU1JQV9VTU1fVVBEQVRFX0RVQUxQU1NZU0NPTkZJR19JTkRfRVYsekF0X1VwZHREdWFsUHNBZHB0Q2hnVmFyfSwNCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0gICAge01NSUFfQ0NfRFVBTFBTQ0ZHX0lORF9FViwgekF0X1VwZHRDY0R1YWxQc0luZH0sDQotI2VuZGlmDQotICAgIHtNTUlBX1NNU19NTVNfRElTQUJMRV9JTkRfRVYsekF0X1Ntc0Rpc2FibGVJbmR9LA0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICB7TU1JQV9DQ19PUEVOX1ZPSUNFX0NITkxfSU5EX0VWLHpBdF9DY09wZW5Wb2ljZUNobmxJbmR9LA0KLSAgICB7TU1JQV9DQ19DTE9TRV9WT0lDRV9DSE5MX0lORF9FVix6QXRfQ2NDbG9zZVZvaWNlQ2hubEluZH0sDQotI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi0gICAge01NSUFfQ0NfQ0FMTEJBQ0tfRVZFTlRfRVYsekF0X0NjQ2FsbEJhY2tJbmR9LA0KLSNlbmRpZg0KLSNlbmRpZg0KLSAgICB7TVNHVFJBQ0VQU19DRUxMUkVTT1JDQ09DT1VOVF9SRVFfRVYsIHpBdGlfQ2VsbHJlc09yQ2NvQ291bnRSZXF9LA0KLSAgICB7Uk9BRFRFU1RfVUVJTkZPX1JFUV9FViwgekF0aV9Sb2FkVGVzdF9RdWVyeVVlSW5mb1JlcX0sDQotICAgIHtNTUlBX0FTX0IzOV9JTkZPX0lORF9FViwgekF0aV9FVW1jckJhbmQzOUluZm9JbmR9LA0KLSAgICB7TU1JQV9VTU1fSU1TTk9UU1VQUE9SVF9JTkRfRVYsIHpBdGlfSW1zTm90U3VwcG9ydEluZH0sDQotI2lmZGVmIFpfRFVBTFNUQU5EQlkNCi0gICAge01NSUFfVU1NX0NTX0NBTExfU1RBUlRfSU5EX0VWLHpBdGlfQ3NDYWxsU3RhcnRJbmR9LA0KLSAgICB7TU1JQV9VTU1fQ1NfQ0FMTF9FTkRfSU5EX0VWLHpBdGlfQ3NDYWxsRW5kSW5kfSwNCi0jZW5kaWYNCi0gICAge01NSUFfQVNDX0xURV9MT1NUQ09WRVJBR0VfSU5EX0VWLCB6QXRpX0x0ZU5vQ2VsbEluZH0sDQotDQotICAgIC8vINSt1ve/2NbQtcTP+8+iDQotI2lmZGVmIFpfRFVBTFNUQU5EQlkNCi0gICAgIHtaX1JSTUlfSU5URVJfUkFUX05DRUxMX0lORF9FViwgekF0aV9SZWN2R3JyTkNlbGxDaG5nSW5kfSwNCi0jZW5kaWYNCi0NCi0gICAgLy/UrbHtZ196QXRpX0hhbmRsZU1taWFNc2dXaXRob3V0Q2huZWxOb2Rl1tDP+8+iDQotICAgIHtNTUlBX1NNX0NJRF9ERUFDVF9JTkRfRVYsICAgICAgIHpBdGlfU21EZWFjdGl2YXRlSW5kfSwvL8O709DUtMS/tcTL99L9DQotICAgIHtNTUlBX1NNX0dFVF9QQ09fSU5EX0VWLCAgICAgICAgIHpBdGlfSGFuZGxlU21HZXRQY29JbmR9LA0KLSAgICB7TU1JQV9TTVNfTUVNX0FWQUlMX0NORl9FViwgICAgICB6QXRpX0hhbmRsZVptZW5hQ25mfSwNCi0gICAge01NSUFfU01fSURMRV9DSE5MX1FVRVJZX0lORF9FViwgekF0aV9Vc2JTaW9TbU10UXVlcnlJZGxlQ2hJbmR9LA0KLSAgICB7TU1JQV9TTV9NU0lTRE5fSU5EX0VWLCAgICAgICAgICB6QXRpX1NtTXNpc2RuSW5kfSwNCi0NCi0gICAgLyoqKioqKioqKioqKioqKkFTKioqKioqKioqKioqKioqKioqKioqKi8NCi0gICAge01NSUFfQVNfUlBUX1JYTEVWX0lORF9FViAsICB6QXRpX01jclJwdFJ4bGV2SW5kfSwNCi0gICAge01NSUFfQVNfUVVFUllfUlhMRVZfSU5EX0VWLCB6QXRpX01jclJwdFJ4bGV2Q25mfSwNCi0gICAge1JSTUlfUlhTVEFUX0lORCwgICAgICAgICAgICB6QXRpX0dyclJwdFJ4bGV2SW5kfSwNCi0gICAge1JSQVRfUlhTVEFUX0lORCwgICAgICAgICAgICB6QXRpX0dyclJwdFJ4bGV2Q25mfSwNCi0gICAge01NSUFfQVNfVUxfUEFSQU1fSU5EX0VWLCAgICB6QXRpX0hhbmRsZVVsUGFyYUluZH0sDQotfTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3UrdDNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc05lZWRDYXJkSW5pdChWT0lEKQ0KLXsNCi0gICAgIHJldHVybiAoQllURSkoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0uYkNhcmRJbml0aWF0ZWRGbGFnID09IFpfQVRJX0NBUkRJTklUX05PVCAgJiYgWl9JTlZBTElEID09IHpEZXZfR2V0Q2Z1bkZsYWcoKSk7DQotfQ0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzU2luZ2xlQ2FyZEZvclR3b1N0YW5kYnkoKQ0KLXsNCi0gICAgcmV0dXJuICh6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMCkgPT0gekRldl9HZXRUYXNrSWQoWl9BVElfVEFTS0lEX1VJQ0MsIDEpKTsNCi19DQotDQotQk9PTCB6QXRpX0lzTHRlU3RhbmRCeShCWVRFIGJJbnNObykNCi17IA0KLSAgICBpZih6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfRVNNLCBiSW5zTm8pICE9IFpPU1NfSU5WQUxJRF9UQVNLX0lEKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzU2luZ2xlQ2FyZEZvck9uZVN0YW5kYnkoVk9JRCkNCi17DQotICAgIHJldHVybiAoKCh6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMCkgPT0gWk9TU19JTlZBTElEX1RBU0tfSUQpICYmICh6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMSkgIT0gWk9TU19JTlZBTElEX1RBU0tfSUQpKQ0KLSAgICAgICAgfHwoKHpEZXZfR2V0VGFza0lkKFpfQVRJX1RBU0tJRF9VSUNDLCAwKSAhPSBaT1NTX0lOVkFMSURfVEFTS19JRCkgJiYgKHpEZXZfR2V0VGFza0lkKFpfQVRJX1RBU0tJRF9VSUNDLCAxKSA9PSBaT1NTX0lOVkFMSURfVEFTS19JRCApKSk7IA0KLX0NCi0NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc1JpZ2h0U3RhbmRBdENtZChVSU5UOCBpQ2hhbm5lbCkNCi17DQotICAgIEJZVEUgYkluc05vID0gekF0aV9HZXRUYXNrSW5zdGFudEJ5Q2hubElkKGlDaGFubmVsKTsNCi0NCi0gICAgaWYoekRldl9HZXRUYXNrSWQoWl9BVElfVEFTS0lEX1VNTSwgYkluc05vKSA9PSBaT1NTX0lOVkFMSURfVEFTS19JRCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0jaWZkZWYgWl9EVUFMQ0FSRF9BREFQVA0KLUJPT0wgekF0aV9Jc0R1YWxDYXJkU2VsZkFkYXB0Q2hhbmdpbmcoVk9JRCkNCi17DQotICAgIGlmKGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS5Jc0NmZ0NoZ2luZyB8fA0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLklzQ2ZnQ2hnaW5nKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8Y6ekF0aV9Jc0NtZENobmVsSWRJZGVsDQotKrqvyv25psTcOsXQts/NqLXAyse38bSm09q/1c/Q17TMrA0KLSrF0LbPuebU8joNCi0qMSnD/MHuzKy1xM2otcDDu9PQw/zB7tTatKbA7Q0KLSoyKcP8we7MrLXEzai1wMO709C0ptPatszP+8+ixNrI3crkyOvMrA0KLSozKc2otcC1xL3ateO++c6qv9UNCi0qNCnNqLXA1tDD/MHuu7q05s6qv9UNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIHpBdGlfSXNDbWRDaG5lbElkSWRlbChCWVRFIGJJbnNObykNCi17DQotICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSA9IHpBdGlfR2V0Rmlyc3RDaGFubmVsTm9kZVB0ckJ5SW5zdGFuY2UoYkluc05vKTsNCi0gICAgQllURSBiTWF4Q2hubElkID0gKChiSW5zTm8gPT0gWl9BVElfSU5TTk9fMik/IFpfQVRJX0lOU1RBTkNFX1RXT19DSE5MX01BWCA6IFpfQVRJX0lOU1RBTkNFX09ORV9DSE5MX01BWCk7DQotDQotICAgIHdoaWxlKHBDaG5lbE5vZGUgIT0gTlVMTCAmJiBwQ2huZWxOb2RlLT5pQ2huZWxJZCA8PSBiTWF4Q2hubElkKQ0KLSAgICB7DQotICAgICAgICBpZihwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8uY21kSW5wdXRTdGF0ID09IFpBVDJfU01TX0VESVQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOy8qtbHHsLbM0MW3osvNw/zB7tLRvq3KzbfFtavE2sjdu7nOtL3TytW94cr4Ki8NCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYocENobmVsTm9kZS0+Y21kSW5wdXRJbmZvLmNtZElucHV0U3RhdCA9PSBaQVQyX0FUQ01EKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFpBVDJfTk9fQ09NTUFORCAhPSBwQ2huZWxOb2RlLT5jbWRfaWQgJiYgWkFUMl9DT19JTlZBTElEICE9IHBDaG5lbE5vZGUtPmNtZF9vcCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsvKrWxx7C7udPQw/zB7tX91Nq0psDtKi8NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihwQ2huZWxOb2RlLT5hdEJ1ZmYuaUxlbmd0aCAhPSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOy8qzai1wNbQu7nT0M60zOHIob3izva1xMP8we4qLw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKHpBdGlfSGFzTW9yZUNtZChwQ2huZWxOb2RlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsvKs2otcC92rXj1tC7udPQw/zB7iovDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcENobmVsTm9kZSA9IHBDaG5lbE5vZGUtPnBOZXh0Q25Ob2RlOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0jZW5kaWYNCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc1NpbmdsZUNhcmQoKQ0KLXsNCi0gICAgcmV0dXJuICh6QXRpX0lzU2luZ2xlQ2FyZEZvck9uZVN0YW5kYnkoKSB8fCB6QXRpX0lzU2luZ2xlQ2FyZEZvclR3b1N0YW5kYnkoKSk7DQotfQ0KLQ0KLUJZVEUgX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQoQllURSBiQ2hubElkKQ0KLXsNCi0gICAgcmV0dXJuIChiQ2hubElkID4gWl9BVElfSU5TVEFOQ0VfT05FX0NITkxfTUFYKSA/IFpfQVRJX0lOU05PXzIgOiBaX0FUSV9JTlNOT18xOw0KLX0NCi0NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRJbnN0YW50Rm9yU2luZ2xlQ2FyZE9uZVN0YW5kYnkoKQ0KLXsNCi0gICAgcmV0dXJuICh6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMCkgPT0gWk9TU19JTlZBTElEX1RBU0tfSUQpID8gWl9BVElfSU5TTk9fMiA6IFpfQVRJX0lOU05PXzE7DQotfQ0KLQ0KLUJZVEUgX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldEluc3RhbnRieURlc0luZGV4KEJZVEUgYkNobmxJZCkNCi17DQotICAgIGlmKFpBVEkyX0NIQU5ORUxfSURfTlVNMjUxID09IGJDaG5sSWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0FUSV9JTlNOT18xOw0KLSAgICB9DQotICAgIGVsc2UgaWYoWkFUSTJfQ0hBTk5FTF9JRF9OVU0yNTIgPT0gYkNobmxJZCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0lOU05PXzI7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gekF0aV9HZXRUYXNrSW5zdGFudEJ5Q2hubElkKGJDaG5sSWQpOw0KLSAgICB9DQotfQ0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzVWljY0V2KFVJTlQzMiBpRXZJZCkNCi17DQotICAgIHJldHVybiAoKGlFdklkID49IEFQX1VJQ0NfRVZFTlRfQkFTRSAmJiBpRXZJZCA8PSBBUF9VSUNDX0VWRU5UX0VORCkgfHwNCi0gICAgICAgIChpRXZJZCA+PSBBUF9NTUlBX0VWRU5UX1VJQ0NfQkFTRSAmJiBpRXZJZCA8PSBBUF9NTUlBX0VWRU5UX1VJQ0NfRU5EKSk7DQotfQ0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzU3RtRXYoVUlOVDMyIGlFdklkKQ0KLXsNCi0gICAgcmV0dXJuICgoaUV2SWQgPj0gQVBfTU1JQV9QQl9SU1BfRVZFTlQgJiYgaUV2SWQgPD0gQVBfTU1JQV9FVkVOVF9QQl9FTkQpIHx8IGlFdklkID09IEFQX01NSUFfWlBCSUNfSU5EX0VWKTsNCi19DQotDQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNMb2dUcmFjZU1zZ0FuZEdldFRhc2tJbmRleChVSU5UMzIgaUV2SWQsIFVJTlQ4ICpwRGF0YVB0ciwgUEJZVEUgcGJJbnNObykNCi17DQotICAgIFRfekF0aV9SVFVlSW5mb19SZXEgKnB0VWVJbmZvUmVxID0gWk9TU19OVUxMOw0KLSAgICBUX3pfTXNndHJhY2VQc19DZWxscmVzT3JDY29Db3VudF9SZXEgKnB0Q2VsbHJlc09yQ2NvQ291bnRSZXEgPSBaT1NTX05VTEw7DQotICAgIFRfek1zZ3RyYWNlUHNfQ2VsbERpc3BsYXlfUmVxICpwdE1zZ1RyYWNlUmVxID0gWk9TU19OVUxMOw0KLQ0KLSAgICBzd2l0Y2goaUV2SWQpDQotICAgIHsNCi0gICAgICAgIGNhc2UgUk9BRFRFU1RfVUVJTkZPX1JFUV9FVjoNCi0gICAgICAgICAgICBwdFVlSW5mb1JlcSA9IChUX3pBdGlfUlRVZUluZm9fUmVxKilwRGF0YVB0cjsNCi0gICAgICAgICAgICAqcGJJbnNObyA9IHB0VWVJbmZvUmVxLT5iU3RhY2tJbmRleCAtIDE7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBjYXNlIE1TR1RSQUNFUFNfQ0VMTFJFU09SQ0NPQ09VTlRfUkVRX0VWOg0KLSAgICAgICAgICAgIHB0Q2VsbHJlc09yQ2NvQ291bnRSZXEgPSAoVF96X01zZ3RyYWNlUHNfQ2VsbHJlc09yQ2NvQ291bnRfUmVxKilwRGF0YVB0cjsNCi0gICAgICAgICAgICAqcGJJbnNObyA9IHB0Q2VsbHJlc09yQ2NvQ291bnRSZXEtPmJTdGFja0luZGV4IC0gMTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIGNhc2UgTVNHVFJBQ0VQU19DRUxMX0RJU1BMQVlfUkVRX0VWOg0KLSAgICAgICAgICAgIHB0TXNnVHJhY2VSZXEgPSAoVF96TXNndHJhY2VQc19DZWxsRGlzcGxheV9SZXEqKXBEYXRhUHRyOw0KLSAgICAgICAgICAgICpwYkluc05vID0gcHRNc2dUcmFjZVJlcS0+YlN0YWNrSW5kZXggLSAxOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi19DQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNTZWxmRXhwaXJ5TXNnKFVJTlQzMiBpRXZJZCkNCi17DQotICAgIHN3aXRjaChpRXZJZCkNCi0gICAgew0KLSAgICAgICAgY2FzZSBNTUlBX0VNX0hPX0lORk9fRVhQSVJZX0VWOg0KLSNpZmRlZiBaX1NFTExfU1RBVF9TVVBQT1JUDQotICAgICAgICBjYXNlIE1NSUFfU0VMTF9TVEFUX1JFR19FWFBJUllfRVY6DQotICAgICAgICBjYXNlIE1NSUFfU0VMTF9TVEFUX1NVTV9QRFBfRVhQSVJZX0VWOg0KLSAgICAgICAgY2FzZSBNTUlBX1NFTExfU1RBVF9PTkVfUERQX0VYUElSWV9FVjoNCi0jZW5kaWYNCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0gICAgICAgIGNhc2UgTU1JQV9BT0NfRVhQSVJZX0VWOg0KLSNlbmRpZg0KLSAgICAgICAgY2FzZSBNTUlBX1pHRFRfRVhQSVJZX0VWOg0KLSAgICAgICAgY2FzZSBFVl9aQVRJMl9URVNUX1NFTkRfQ1NfREFUQToNCi0gICAgICAgIGNhc2UgTU1JQV9aVUxSVElORF9FWFBJUllfRVY6DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLX0NCi0NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc0FzTXNnKFVJTlQzMiBpRXZJZCkNCi17IC8qus/I60VNQk1TyrG0y7Sm0rLSqtT2vNPP4LnYz/vPoiovDQotICAgIGlmKGlFdklkID09IEFTX0VNX0NFTExfSU5GT19JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gUlJfRU1fQ0VMTF9JTkZPX0lORCB8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19FTV9VQ0VMTF9JTkZPX0lORF9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19FTV9FVUNFTExfSU5GT19JTkRfRVYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfRU1fVUhPX0lORk9fSU5EX0VWIHx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0VVQ1NSX0xURUlORk9fSU5EX0VWIHx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0wxRV9aRVBDR19DTkYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfUlNTSV9RVUVSWV9DTkZfRVYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfU0lOUl9RVUVSWV9DTkZfRVYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfRVVTSVJfRVRXU19QUklNQVJZX0lORF9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9FVVNJUl9FVFdTX1NFQ09OREFSWV9JTkRfRVYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfUlBUX1JYTEVWX0lORF9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19RVUVSWV9SWExFVl9JTkRfRVYgfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfQjM5X0lORk9fSU5EX0VWIHx8DQotICAgICAgICBpRXZJZCA9PSBSUl9FTV9IT19JTkZPX0lORCB8fA0KLSAgICAgICAgaUV2SWQgPT0gUlJBVF9SWFNUQVRfSU5EIHx8DQotICAgICAgICBpRXZJZCA9PSBSUk1JX1JYU1RBVF9JTkQgfHwNCi0gICAgICAgIGlFdklkID09IFpfUlJNSV9JTlRFUl9SQVRfTkNFTExfSU5EX0VWIHx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX1FVRVJZX0VNX1VDRUxMX0lORk9fQ05GX0VWIHx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX1FVRVJZX0VNX0VVQ0VMTF9JTkZPX0NORl9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gUlJfUVVFUllfRU1fQ0VMTF9JTkZPX0NORl9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gQVNfUVVFUllfRU1fQ0VMTF9JTkZPX0NORl9FVnx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX1RNR0lfQUNUSVZBVEVfQ05GX0VWfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfVE1HSV9ERUFDVElWQVRFX0NORl9FVnx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX1NBSV9MSVNUX1FVRVJZX1JFU1BfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19TQUlfTElTVF9JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19UTUdJX0xJU1RfUVVFUllfUkVTUF9FVnx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX1RNR0lfTElTVF9JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19NQk1TX1NFUlZJQ0VfU1VTUEVORF9JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19NQk1TX1NFUlZJQ0VfUkVTVU1FX0lORF9FVnx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0FTX0NPTU1PTl9DRkdfQ05GX0VWfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfTldfVElNRV9RVUVSWV9SRVNQX0VWfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNDX0xURV9MT1NUQ09WRVJBR0VfSU5EX0VWfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfQVNfRU1fTFRFX0hPX1NFVF9RVUVSWV9DTkZfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19FTV9MVEVfSE9fSU5GT19JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9HUlJfWkdQQ0dfQ05GX0VWfHwNCi0gICAgICAgIGlFdklkID09IE1NSUFfTDFUX1pUUENHX0NORl9FVnx8DQotICAgICAgICBpRXZJZCA9PSBNTUlBX0wxV19aV1BDR19DTkZfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19VTF9QQVJBTV9JTkRfRVZ8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9BU19DQVJEX1NXSVRDSF9DTkZfRVYpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0VGFza0luc3RhbnRJbmRleEJ5VGFza0lkKFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBaT1NTX1RBU0tfSUQgdFNlbmRUYXNrSWQpDQotew0KLSAgICBCWVRFIGJTdWJNb2QgPSAwOw0KLSAgICBCWVRFIGJUYXNrSW5kZXggPSBaX0FUSV9JTlZBTElEX0JZVEU7DQotDQotICAgIGlmKGlFdklkID09IEVWX1pBVEkyX1JFQ1ZfQ09NTUFORF9JTkQpDQotICAgIHsNCi0gICAgICAgIFRfWkF0aV9DaGFubmVsRGF0YUJ1ZiAqcmVjdkNtZEluZCA9IChUX1pBdGlfQ2hhbm5lbERhdGFCdWYgKilwRGF0YVB0cjsNCi0gICAgICAgIHJldHVybiB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocmVjdkNtZEluZC0+aUNoYW5uZWwpOw0KLSAgICB9DQotDQotICAgIGlmIChpRXZJZCA9PSBFVl9aQVRJMl9aRU1DRUxMSU5GT19SRVEpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoKFRfWkF0aV9FTUNlbGxJbmZvX1JlcSAqKXBEYXRhUHRyKS0+Ykluc3RhbmNlOw0KLSAgICB9DQotDQotICAgIGlmKHpBdGlfSXNBc01zZyhpRXZJZCkpIC8quPm+3cv30v26xcXQts9BU8/7z6LL+cr0tP27+rLgKi8NCi0gICAgew0KLSAgICAgICAgaWYoaUV2SWQgPT0gQVNfUVVFUllfRU1fQ0VMTF9JTkZPX0NORl9FViB8fA0KLSAgICAgICAgICAgIGlFdklkID09IEFTX0VNX0NFTExfSU5GT19JTkRfRVYpDQotICAgICAgICB7DQotICAgICAgICAgICAgVF96RU1fRW1JbmZvX0luZCAqcEVtSW5mb0luZCA9IChUX3pFTV9FbUluZm9fSW5kKilwRGF0YVB0cjsNCi0gICAgICAgICAgICByZXR1cm4gekF0aV9HZXRJbnN0YW50YnlEZXNJbmRleChwRW1JbmZvSW5kLT5iRGVzSW5kZXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB6QXRpX0dldEluc3RhbnRieURlc0luZGV4KCoocERhdGFQdHIgKyAxKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoaUV2SWQgPT0gTU1JQV9MMUVfWkVQQ0dfQ05GICkvKkwxRbXEyM7O8c7et6jTyXpPc3NfU2VuZGVyKCm78cihKi8NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHpBdGlfR2V0VGFza0luc3RhbnRCeUNobmxJZCgqKHBEYXRhUHRyICsgMSkpOw0KLSAgICB9DQotDQotICAgIGlmKHpBdGlfSXNTZWxmRXhwaXJ5TXNnKGlFdklkKSkvKraoyrHG98/7z6IqLw0KLSAgICB7DQotICAgICAgICByZXR1cm4gKnBEYXRhUHRyOw0KLSAgICB9DQotDQotICAgIGlmKHpBdGlfSXNMb2dUcmFjZU1zZ0FuZEdldFRhc2tJbmRleChpRXZJZCwgcERhdGFQdHIsICZiVGFza0luZGV4KSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGJUYXNrSW5kZXg7DQotICAgIH0NCi0NCi0gICAgaWYoaUV2SWQgPT0gRVZfWkFUSTJfQ1BCUl9DTkYpLyq0y8/7z6K1xMS/tcTL99L9sci9z9L+sc4qLw0KLSAgICB7DQotICAgICAgICBUX3pTdG1fQ3Bicl9DbmYgKnBDcGJyU3RtQ25mID0gKCBUX3pTdG1fQ3Bicl9DbmYgKilwRGF0YVB0cjsNCi0gICAgICAgIHJldHVybiB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocENwYnJTdG1DbmYtPmNwYnJTZXRDbmYuYkRlc0luZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBpZih6QXRpX0lzU2luZ2xlQ2FyZEZvck9uZVN0YW5kYnkoKSYmICh6QXRpX0lzVWljY0V2KGlFdklkKSB8fCB6QXRpX0lzU3RtRXYoaUV2SWQpKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHpBdGlfR2V0SW5zdGFudEZvclNpbmdsZUNhcmRPbmVTdGFuZGJ5KCk7Lyq1pb+otaW0/cqxuPm+3cjOzvFJRLj80MLKtcD9usUqLw0KLSAgICB9DQotICAgIGVsc2UgaWYgKHpBdGlfSXNTaW5nbGVDYXJkRm9yVHdvU3RhbmRieSgpICYmICh6QXRpX0lzVWljY0V2KGlFdklkKSB8fCB6QXRpX0lzU3RtRXYoaUV2SWQpKSkNCi0gICAgew0KLSAgICAgICAgLyq1pb+oy6u0/cqx1ve2r8nPsajP+8+izt63qMf4t9bKtcD9usUNCi0gICAgICAgICC3tbvYyM7Su7T9u/qy4ry0v8mjrNOwz+zW97avyc+xqLP2tO3KsbXE0uyzo7nbsuwNCi0gICAgICAgICDQ3rjEvc/Oqri01NPH0rK707DP7M7KzOK31s72LCCyu9f20N64xCAyMDEzLjEwLjMwIGJ5IGh5YyovDQotICAgICAgICByZXR1cm4gekF0aV9HZXRJbnN0YW50YnlEZXNJbmRleCgqKHBEYXRhUHRyICsgMSkpOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKChaX1ZBTElEID09IHpBdGlfSXNEdWFsUHNEdWFsVWljYygpKSAmJiAoKGlFdklkID09IEFQX1VJQ0NfVVNBVF9QUk9WX0NNRF9JTkRfRVYpIHx8IChpRXZJZCA9PSBBUF9VSUNDX05PX1BST0NfTk9USUZZX0lORF9FVikpKQ0KLSAgICB7DQotICAgICAgICAvKsurv6jLq7T9yrHW97avyc+xqM/7z6LO3reox/i31sq1wP26xSovDQotICAgICAgICByZXR1cm4gekF0aV9HZXRJbnN0YW50YnlEZXNJbmRleCgqKHBEYXRhUHRyICsgMSkpOw0KLSAgICB9DQotDQotICAgIGlmICh0U2VuZFRhc2tJZCA9PSBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSkvKtfUytXX1Leiz/vPoiovDQotICAgIHsNCi0gICAgICAgIHJldHVybiB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQoKihwRGF0YVB0ciArIDEpKTsNCi0gICAgfQ0KLQ0KLSAgICBmb3IgKGJTdWJNb2QgPSAwOyBiU3ViTW9kIDwgWl9TVUJNRExfTlVNOyBiU3ViTW9kKyspDQotICAgIHsNCi0gICAgICAgIGlmICh0U2VuZFRhc2tJZCA9PSB6RGV2X0dldFRhc2tJZChiU3ViTW9kLCAwKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gWl9BVElfSU5TTk9fMTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0U2VuZFRhc2tJZCA9PSB6RGV2X0dldFRhc2tJZChiU3ViTW9kLCAxKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gWl9BVElfSU5TTk9fMjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gWl9BVElfSU5WQUxJRF9CWVRFOw0KLX0NCi0NCi1UX1pBdGlfQ2hhbm5lbEluZm8gKiB6QXRpX0dldEZpcnN0Q2hhbm5lbE5vZGVQdHJCeUluc3RhbmNlIChCWVRFIGJJbnN0YW5jZSkNCi17DQotICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSA9IGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5wQ2huZWxOb2RlOw0KLQ0KLSAgICBpZiAocENobmVsTm9kZSA9PSBOVUxMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWk9TU19OVUxMOw0KLSAgICB9DQotDQotICAgIGlmIChiSW5zdGFuY2UpDQotICAgIHsNCi0gICAgICAgIHdoaWxlKHBDaG5lbE5vZGUgJiYgcENobmVsTm9kZS0+aUNobmVsSWQgPD0gWl9BVElfSU5TVEFOQ0VfT05FX0NITkxfTUFYKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBDaG5lbE5vZGUgPSBwQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBwQ2huZWxOb2RlOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKHBDaG5lbE5vZGUtPmlDaG5lbElkIDw9IFpfQVRJX0lOU1RBTkNFX09ORV9DSE5MX01BWCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHBDaG5lbE5vZGU7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWk9TU19OVUxMOw0KLSAgICB9DQotfQ0KLQ0KLSNpZmRlZiBaX0RVQUxTVEFOREJZDQotVk9JRCB6QXRpX1JlY3ZHcnJOQ2VsbENobmdJbmQoVk9JRCAqcEJ1ZmYpDQotew0KLSAgICBUX3pfUlJNSV9JTlRFUl9SQVRfTkNFTExfSU5EICpwdE5DZWxsSW5kID0gKFRfel9SUk1JX0lOVEVSX1JBVF9OQ0VMTF9JTkQgKilwQnVmZjsNCi0gICAgVF96TW1pYVVtbV9EdWFsUHNUTE5DZWxsICpwdE5vdGlmeVVtbSA9IChUX3pNbWlhVW1tX0R1YWxQc1RMTkNlbGwgKil6QXRpX0dldFVCKHNpemVvZihUX3pNbWlhVW1tX0R1YWxQc1RMTkNlbGwpKTsNCi0NCi0gICAgek9zc19NZW1jcHkocHROb3RpZnlVbW0sIHB0TkNlbGxJbmQsIHNpemVvZihUX3pNbWlhVW1tX0R1YWxQc1RMTkNlbGwpKTsNCi0gICAgZ196QXRpX0N1ckluc3RhbmNlID0gZ196QXRpX0N1ckluc3RhbmNlID09IDA/IDE6IDA7DQotICAgIA0KLSAgICB6QXRpX01zZ1NlbmQoWl9URF9MVEVfQ0VMTF9JTkRfRVYsIChQQllURSlwdE5vdGlmeVVtbSwgc2l6ZW9mKFRfek1taWFVbW1fRHVhbFBzVExOQ2VsbCksIFpfQVRJX1RBU0tJRF9VTU0pOw0KLQ0KLSAgICBnX3pBdGlfQ3VySW5zdGFuY2UgPSBnX3pBdGlfQ3VySW5zdGFuY2UgPT0gMD8gMTogMDsNCi19DQotI2VuZGlmDQotDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSW5zZXJ0Tm9kZUluU29ydGluZ0FzY2VuZCAoVF9aQXRpX0NoYW5uZWxJbmZvICpwdE5ld0NobmxOb2RlKQ0KLXsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwdFByZXZOb2RlID0gWk9TU19OVUxMOw0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnB0Tm9kZSA9IGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5wQ2huZWxOb2RlOw0KLQ0KLSAgICB3aGlsZShwdE5vZGUgJiYgcHROb2RlLT5pQ2huZWxJZCA8IHB0TmV3Q2hubE5vZGUtPmlDaG5lbElkKQ0KLSAgICB7DQotICAgICAgICBwdFByZXZOb2RlID0gcHROb2RlOw0KLSAgICAgICAgcHROb2RlID0gcHROb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoIXB0UHJldk5vZGUpDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5wQ2huZWxOb2RlID0gcHROZXdDaG5sTm9kZTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0UHJldk5vZGUtPnBOZXh0Q25Ob2RlID0gcHROZXdDaG5sTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICBwdE5ld0NobmxOb2RlLT5wTmV4dENuTm9kZSA9IHB0Tm9kZTsNCi0gICAgZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LmlDb3VudCsrOw0KLSAgICByZXR1cm47DQotfQ0KLQ0KLVNJTlQzMiB6QXRpX0F0UmVjdk51bGxGdW5jKFVJTlQ4IGNoYW5uZWxJZCwgVUlOVDgqIHBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4sIFRfekF0aTJfQ3RybUNoSW5kIGlGbGFnKQ0KLXsNCi0gICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLX0NCi0NCi1WT0lEIHpBdGlfSW5pdFpnZGF0YXRlc3RHbG9iYWxWYXIoVk9JRCkNCi17DQotICAgIFRfekF0aV9Qc0RhdGFUZXN0X0luZm8gKnBEYXRhVHN0SW5mbyA9IFpPU1NfTlVMTDsNCi0gICAgVF96QXRpX0NzRGF0YVRlc3RfSW5mbyAqcFZ0RGF0YVRzdCA9IFpPU1NfTlVMTDsNCi0gICAgcERhdGFUc3RJbmZvID0gJmdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnREYXRhVGVzdEluZm8udFBzRGF0YVRlc3RJbmZvOw0KLSAgICBwVnREYXRhVHN0ID0gJmdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnREYXRhVGVzdEluZm8udENzRGF0YVRlc3RJbmZvOw0KLQ0KLSAgICBpZihwRGF0YVRzdEluZm8tPnBUaW1ySWRaZ2R0ICE9IFpPU1NfSU5WQUxJRF9USU1FUl9JRCkNCi0gICAgew0KLSAgICAgICAgekF0aV9IbmFkbGVaZ2RhdGF0ZXN0Q25mKHBEYXRhVHN0SW5mby0+dFBzWmdkdEluZm8uaVNyY0luZGV4LCBwRGF0YVRzdEluZm8tPnRQc1pnZHRJbmZvLmlEZXN0SW5kZXgsIEZBTFNFKTsNCi0gICAgICAgIHpBdGlfS2lsbFRpbWVyKCZwRGF0YVRzdEluZm8tPnBUaW1ySWRaZ2R0KTsNCi0gICAgICAgIHpPc3NfTWVtc2V0KHBEYXRhVHN0SW5mbywgMCwgc2l6ZW9mKFRfekF0aV9Qc0RhdGFUZXN0X0luZm8pKTsNCi0gICAgfQ0KLQ0KLSAgICBpZihwVnREYXRhVHN0LT50aW1lclNlbmRDc0RhdGEgIT0gWk9TU19JTlZBTElEX1RJTUVSX0lEKQ0KLSAgICB7DQotICAgICAgICB6QXRpX0huYWRsZVpnZGF0YXRlc3RDbmYocFZ0RGF0YVRzdC0+elRlc3QuaVNyY0luZGV4LCBwVnREYXRhVHN0LT56VGVzdC5pRGVzdEluZGV4LCBGQUxTRSk7DQotICAgICAgICB6QXRpX0tpbGxUaW1lcigmcFZ0RGF0YVRzdC0+dGltZXJTZW5kQ3NEYXRhKTsNCi0gICAgICAgIHpPc3NfTWVtc2V0KHBWdERhdGFUc3QsIDAsIHNpemVvZihUX3pBdGlfQ3NEYXRhVGVzdF9JbmZvKSk7DQotICAgIH0NCi19DQotVk9JRCB6QXRpX0luaXRDaG5lbE5vZGUoQllURSBiQ3VyQ2huZWxJZCkNCi17DQotICAgIEJZVEUgYk1heENobmxJZCA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPyBaX0FUSV9JTlNUQU5DRV9UV09fQ0hOTF9NQVggOiBaX0FUSV9JTlNUQU5DRV9PTkVfQ0hOTF9NQVgpOw0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBUZW1wQ2huZWxOb2RlID0gekF0aV9HZXRGaXJzdENoYW5uZWxOb2RlUHRyQnlJbnN0YW5jZShnX3pBdGlfQ3VySW5zdGFuY2UpOyAgDQotDQotICAgIHdoaWxlKE5VTEwgIT0gcFRlbXBDaG5lbE5vZGUgJiYgcFRlbXBDaG5lbE5vZGUtPmlDaG5lbElkIDw9IGJNYXhDaG5sSWQpDQotICAgIHsNCi0gICAgICAgIGlmKHBUZW1wQ2huZWxOb2RlLT5pQ2huZWxJZCAhPSBiQ3VyQ2huZWxJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoWkFUMl9OT19DT01NQU5EICE9IHBUZW1wQ2huZWxOb2RlLT5jbWRfaWQpIHx8IChaQVQyX0NPX0lOVkFMSUQgIT0gcFRlbXBDaG5lbE5vZGUtPmNtZF9vcCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwVGVtcENobmVsTm9kZS0+Y21kX2lkID0gWkFUMl9OT19DT01NQU5EOw0KLSAgICAgICAgICAgICAgICBwVGVtcENobmVsTm9kZS0+Y21kX29wID0gWkFUMl9DT19JTlZBTElEOw0KLSAgICAgICAgICAgICAgICBwVGVtcENobmVsTm9kZS0+YklzQ2FyZEluaXRpbmcgPSBGQUxTRTsNCi0gICAgICAgICAgICAgICAgekF0aV9Jbml0X0NtZEluZm8oJnBUZW1wQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8pOw0KLSAgICAgICAgICAgICAgICB6QXRpX1JlbW92ZU9uZUNtZChwVGVtcENobmVsTm9kZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHBUZW1wQ2huZWxOb2RlLT5Jc1BwcCA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCAhPSBwVGVtcENobmVsTm9kZS0+c2VydmVyX21vZGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcFRlbXBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlID0gWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRDsNCi0gICAgICAgICAgICBwVGVtcENobmVsTm9kZS0+ZGF0YVR5cGUgPSBaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9JTlZBTDsgLyogu7nUrSAqLw0KLSAgICAgICAgICAgIHpBdGlfU2VuZEZuYyhwVGVtcENobmVsTm9kZS0+aUNobmVsSWQsIE5VTEwsIDAsIFpBVEkyX0NISU5EX1RVUk5fQVQpOyAvKiDH0Lu7zai1wCAqLw0KLSAgICAgICAgICAgIHpBdGlfUmVtb3ZlQUxMQ21kKHBUZW1wQ2huZWxOb2RlKTsgLy8gx+W/1XBwcLKmusW686OsvfjI68r9vt3MrNLU1sHDu9PQz+zTprXEw/zB7g0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcFRlbXBDaG5lbE5vZGUgPSBwVGVtcENobmVsTm9kZS0+cE5leHRDbk5vZGU7DQotICAgIH0NCi0NCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfU3RvcFRhc2sNCi0qILmmxNzD6Mr2o7ogzaPWucjOzvENCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiCzybmmt7W72FRSVUUsyqew3Le1u9hGQUxTRTsNCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfU3RvcFRhc2soVk9JRCkNCi17DQotI2lmbmRlZiBDT05GSUdfU0lOR0xFQ09SRQ0KLSAgICB6QXRpX0NzZENhbGxFbmQoWl9BVElfSU5TTk9fMSk7DQotICAgIHpBdGlfQ3NkQ2FsbEVuZChaX0FUSV9JTlNOT18yKTsNCi0jZW5kaWYNCi0gICAgek9zc19NZW1zZXQoKFVJTlQ4ICopZ196QXRpX1NtQ29udGV4dCwgMCwgc2l6ZW9mKFRfWkF0aV9TbUNvbnRleHQpICogWl9BVElfSU5TVEFOQ0VfTUFYX05VTSk7DQotICAgIHpPc3NfTWVtc2V0KChVSU5UOCAqKSZnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udENjTWFuLCAwLCBzaXplb2YoVF9aQXRpX0NhbGxDb250cm9sTWFuYWdlbWVudCkpOw0KLSAgICB6T3NzX01lbXNldCgoVUlOVDggKikmZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLnRDY01hbiwgMCwgc2l6ZW9mKFRfWkF0aV9DYWxsQ29udHJvbE1hbmFnZW1lbnQpKTsNCi0NCi0gICAgZ196QXRpX0NvbnRleHQudGFza1N0YXR1cyA9IFpBVEkyX1RBU0tfU1RBVFVTX05VTEw7DQotICAgIGdfekF0aV9Db250ZXh0LmlUYXNrSW5pdFRpbWVzID0gMDsgLyogyM7O8bP1yry7r7TOyv0gKi8NCi0gICAgZ196QXRpX0NvbnRleHQuc2VuZEZuYyA9IE5VTEw7DQotDQotICAgIGlmKE5VTEwgIT0gZ196QXRpX0NvbnRleHQudGFza0lkTXkpDQotICAgIHsNCi0gICAgICAgIHpPc3NfRGVsZXRlVGFzayhnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgICAgICBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSA9IE5VTEw7DQotICAgIH0NCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIL7Wsr+6r8r91K3QzSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfVGFza0VudHJ5DQotKiC5psTcw+jK9qO6IEFUSTLIzs7xyOu/2rqvyv0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBzdGF0ZSAgICAgICAgICDXtMysDQotKiAgICAgICAgICAgIGlFdklkICAgICAgICAgIM/7z6JJRA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIDQotKiAgICAgICAgICAgIHBQcml2YXRlRGF0YSAgIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogvdPK1c2otcC3osC0tcTD/MHuL8r9vt2jrL3izva687eiy824+Lf+zvGy4w0KLSogICAgICAgICAgICC908rVt/7O8bLjt6LAtLXEz/vPoi/K/b7do6yx4MLruvO3osvNuPjNqLXADQotKiAgICAgICAgICAgIL6yzKzG9LavQVRJMsjOzvG1xNW7v9W85NDo0qrOqjEwMjQqNTAgICAgDQotKiAgICAgICAgICAgIHsxLCJ0YXNrX3phdGkyIix6QXRpX1Rhc2tFbnRyeSwyMCwxMDI0KjUwLDAsMCwwfQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1Rhc2tFbnRyeShVSU5UOCBpU3RhdGUsIFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4sIFVJTlQ4ICpwUHJpdmF0ZURhdGEpDQotew0KLSAgICBzd2l0Y2goaVN0YXRlKQ0KLSAgICB7DQotICAgIGNhc2UgWk9TU19TVEFUVVNfSU5JVDoNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1Rhc2tJbml0KGlFdklkLCBwRGF0YVB0ciwgaURhdGFMZW4sIHBQcml2YXRlRGF0YSk7DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgICAgIA0KLSAgICBjYXNlIFpPU1NfU1RBVFVTX1dPUks6DQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9UYXNrV29yayhpRXZJZCwgcERhdGFQdHIsIGlEYXRhTGVuLCBwUHJpdmF0ZURhdGEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgICANCi0gICAgZGVmYXVsdDogDQotICAgICAgICBicmVhazsNCi0gICAgfSAgIA0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9UYXNrSW5pdA0KLSoguabE3MPoyvajuiDIzs7xtKbT2rP1yry7r9e0zKy1xLSmwO26r8r9DQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgaUV2SWQgICAgICAgICAgz/vPoklEDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsgNCi0qICAgICAgICAgICAgcFByaXZhdGVEYXRhICAgDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1Rhc2tJbml0KFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4sIFVJTlQ4ICpwUHJpdmF0ZURhdGEpDQotew0KLSAgICBzd2l0Y2goaUV2SWQpDQotICAgIHsNCi0gICAgY2FzZSBFVl9JTklUOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGdfekF0aV9wdERhdGEgPSAoVF96QXRpX0RhdGEgKil6QXRpX0dldFVCKHNpemVvZihUX3pBdGlfRGF0YSkpOw0KLSAgICAgICAgICAgIHpBdGlfSW5pdCgpOw0KLSAgICAgICAgICAgIHpBdGlfSW5pdEdsb2JhbFZhckJ5SW5zdE5vKFpfQVRJX0lOU05PXzEpOw0KLSAgICAgICAgICAgIC8vekF0aV9Jbml0R2xvYmFsVmFyQnlJbnN0Tm8oWl9BVElfSU5TTk9fMik7DQotICAgICAgICAgICAgekF0aV9Jbml0T3BsUG5uSW5mbyhaX0FUSV9JTlNOT18xKTsNCi0gICAgICAgICAgICAvL3pBdGlfSW5pdE9wbFBubkluZm8oWl9BVElfSU5TTk9fMik7DQotICAgICAgICAgICAgekF0aV9Jbml0Q2Vlckdsb2JhbFZhckJ5SW5zdE5vKFpfQVRJX0lOU05PXzEpOw0KLSAgICAgICAgICAgIC8vekF0aV9Jbml0Q2Vlckdsb2JhbFZhckJ5SW5zdE5vKFpfQVRJX0lOU05PXzIpOw0KLSAgICAgICAgICAgICNpZiBkZWZpbmVkIChEVUFMX0NBUkRfRFVBTF9TVEFOREJZKSB8fCBkZWZpbmVkIChfT1NfV0lOKQ0KLSAgICAgICAgICAgIHpBdGlfSW5pdEdsb2JhbFZhckJ5SW5zdE5vKFpfQVRJX0lOU05PXzIpOw0KLSAgICAgICAgICAgIHpBdGlfSW5pdE9wbFBubkluZm8oWl9BVElfSU5TTk9fMik7DQotICAgICAgICAgICAgekF0aV9Jbml0Q2Vlckdsb2JhbFZhckJ5SW5zdE5vKFpfQVRJX0lOU05PXzIpOw0KLSAgICAgICAgICAgICNlbmRpZg0KLSAgICAgICAgICAgIHpBdGlfUmFuZG9taXplKCk7Ly+y+sn6y+a7+sr91tbX0w0KLSAgICAgICAgfQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtc2V0KChVSU5UOCAqKSZnX3pBdGlfQ29udGV4dCwgMCwgc2l6ZW9mKFRfWkF0aV9Db250ZXh0KSk7IC8qILP1yry7r7LOyv0gKi8NCi0gICAgICAgICAgICB6T3NzX01lbXNldCgoVUlOVDggKilnX3pBdGlfU21Db250ZXh0LCAwLCBzaXplb2YoVF9aQXRpX1NtQ29udGV4dCkgKiBaX0FUSV9JTlNUQU5DRV9NQVhfTlVNKTsNCi0gICAgICAgICAgICBnX3pBdGlfQ29udGV4dC5zZW5kRm5jID0gekF0aV9BdFJlY3ZOdWxsRnVuYzsgICAgICAgICAgICANCi0gICAgICAgICAgICBnX3pBdGlfQ29udGV4dC5wVXNvbENoYW5uZWxGdW5jID0gTlVMTDsNCi0gICAgICAgICAgICBnX3pBdGlfQ29udGV4dC5wQWx3YXlzUmVwb3J0Q2huZWwgPSBOVUxMOw0KLSAgICAgICAgICAgICNpZm5kZWYgQ09ORklHX1NJTkdMRUNPUkUNCi0gICAgICAgICAgICB6QXRpX0NzZFF1ZXVlSW5pdChaX0FUSV9JTlNOT18xKTsNCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgICAgICAvL3pBdGlfQ3NkUXVldWVJbml0KFpfQVRJX0lOU05PXzIpOw0KLSAgICAgICAgICAgIHpPc3NfTWVtc2V0KGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS5hYlBjb0F1dGhDaGtGYWlsQ291bnQsIDAsIFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pOw0KLSAgICAgICAgICAgIC8vek9zc19NZW1zZXQoZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLmFiUGNvQXV0aENoa0ZhaWxDb3VudCwgMCwgWkFUSTJfU01fTUFYX1NNQ0lEX05VTSk7DQotICAgICAgICAgICAgekF0aV9DbGVhclBjb0NoYXAoKTsNCi0gICAgICAgICAgICB6QXRpX0luaXRFbUluZm9CeUluc3RObyhaX0FUSV9JTlNOT18xKTsNCi0gICAgICAgICAgICAvL3pBdGlfSW5pdEVtSW5mb0J5SW5zdE5vKFpfQVRJX0lOU05PXzIpOw0KLSAgICAgICAgICAgICNpZiBkZWZpbmVkIChEVUFMX0NBUkRfRFVBTF9TVEFOREJZKSB8fCBkZWZpbmVkIChfT1NfV0lOKQ0KLSAgICAgICAgICAgICNpZm5kZWYgQ09ORklHX1NJTkdMRUNPUkUNCi0gICAgICAgICAgICB6QXRpX0NzZFF1ZXVlSW5pdChaX0FUSV9JTlNOT18yKTsNCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgICAgICB6T3NzX01lbXNldChnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl0uYWJQY29BdXRoQ2hrRmFpbENvdW50LCAwLCBaQVRJMl9TTV9NQVhfU01DSURfTlVNKTsNCi0gICAgICAgICAgICB6QXRpX0luaXRFbUluZm9CeUluc3RObyhaX0FUSV9JTlNOT18yKTsNCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLSAgICAgICAgDQotICAgIGNhc2UgRVZfUE9XRVJPTjoNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6T3NzX1NldFN0YXRlKFpPU1NfU1RBVFVTX1dPUkspOyAvKiDJ6NbDyM7O8bXEuaTX99e0zKwgKi8NCi0NCi0gICAgICAgICAgICBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSA9IHpPc3NfR2V0VGFza0lEKFBTX1RBU0tfSURfWkFUSSk7ICAgIA0KLSAgICAgICAgICAgIGdfekF0aV9Db250ZXh0Lm11dGV4R2V0T3BsUG5uID0gek9zc19DcmVhdGVNdXRleCgiWkFUSTJfR0VUX09QTFBOTiIsIFpPU1NfTk9fSU5IRVJJVCk7DQotICAgICAgICAgICAgZ196QXRpX0NvbnRleHQubXV0ZXhPcGVuQ2huZWwgPSB6T3NzX0NyZWF0ZU11dGV4KCJaQVRJMl9PUEVOX0NIQU5ORUwiLCBaT1NTX05PX0lOSEVSSVQpOyAvKiC0tL2otci0/UROU7XY1rfQxbrFwb8gKi8NCi0gICAgICAgICAgICAjaWZkZWYgRFNEU19WU0lNDQotICAgICAgICAgICAgZ196QXRpX0NvbnRleHQubXV0ZXhDcmRTdGF0ID0gek9zc19DcmVhdGVNdXRleCgiWkFUSTJfRFVBTENBUkRTVEFUIiwgWk9TU19OT19JTkhFUklUKTsNCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgICAgICBnX3pBdGlfQ29udGV4dC50YXNrU3RhdHVzID0gWkFUSTJfVEFTS19TVEFUVVNfUkVBRFk7Ly/Su7ao0qrXotLiyejWw9e0zKwNCi0gICAgICAgICAgICBnX3pBdGlfRW1JbmZvTXV0ZXhbWl9BVElfSU5TTk9fMV0ubXV0ZXhFbUluZm8gPSB6T3NzX0NyZWF0ZU11dGV4KCJaQVRJX1pFTUNFTExfTVVURVhfMSIsIFpPU1NfTk9fSU5IRVJJVCk7DQotICAgICAgICAgICAgLy9nX3pBdGlfRW1JbmZvTXV0ZXhbWl9BVElfSU5TTk9fMl0ubXV0ZXhFbUluZm8gPSB6T3NzX0NyZWF0ZU11dGV4KCJaQVRJX1pFTUNFTExfTVVURVhfMiIsIFpPU1NfTk9fSU5IRVJJVCk7DQotICAgICAgICAgICAgZ196QXRpX0VtSW5mb1NlbWFwaG9yZVtaX0FUSV9JTlNOT18xXS5zZW1hcGhvcmVFbUluZm8gPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiWkFUSV9aRU1DRUxMX1NFTUFQXzEiLCAwKTsNCi0gICAgICAgICAgICAvL2dfekF0aV9FbUluZm9TZW1hcGhvcmVbWl9BVElfSU5TTk9fMl0uc2VtYXBob3JlRW1JbmZvID0gek9zc19DcmVhdGVTZW1hcGhvcmUoIlpBVElfWkVNQ0VMTF9TRU1BUF8yIiwgMCk7DQotICAgICAgICAgICAjaWYgZGVmaW5lZCAoRFVBTF9DQVJEX0RVQUxfU1RBTkRCWSkgfHwgZGVmaW5lZCAoX09TX1dJTikNCi0gICAgICAgICAgICBnX3pBdGlfRW1JbmZvTXV0ZXhbWl9BVElfSU5TTk9fMl0ubXV0ZXhFbUluZm8gPSB6T3NzX0NyZWF0ZU11dGV4KCJaQVRJX1pFTUNFTExfTVVURVhfMiIsIFpPU1NfTk9fSU5IRVJJVCk7DQotICAgICAgICAgICAgZ196QXRpX0VtSW5mb1NlbWFwaG9yZVtaX0FUSV9JTlNOT18yXS5zZW1hcGhvcmVFbUluZm8gPSB6T3NzX0NyZWF0ZVNlbWFwaG9yZSgiWkFUSV9aRU1DRUxMX1NFTUFQXzIiLCAwKTsNCi0gICAgICAgICAgICAjZW5kaWYNCi0gICAgICAgICAgICB6QXRpX05vdGlmeUFwTW9kZW1SZWFkeSgpOyAgLyogNjE3MDAxNTkxNDExIKG+1sfE3Lv60OjH86G/LSDWx8Tcu/rQ6MfzVjOw5rG+zayyvcq1z9YqLw0KLSAgICAgICAgICAgICNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICAgICAgICAgICNpZm5kZWYgX09TX1dJTiANCi0gICAgICAgICAgICB6QXRpX1JlZ0R0bWZDYWxsQmFjaygpOy8q16Ky4dPv0vTH/bavtcREVE1GIEtFWda1yc+xqLXEvdO/2rqvyv0qLw0KLSAgICAgICAgICAgICNlbmRpZg0KLSAgICAgICAgICAgICNlbmRpZg0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgICBicmVhazsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KLQ0KLSNpZmRlZiBfVVNFX0dMT0JBTF9UUkFDRQ0KLVZPSUQgekF0aV9HZXRHdmFyIChWT0lEKQ0KLXsNCi0gICAgVF96X01zZ0luZm8gdE1zZ0luZm8gPSB7IDAgfTsNCi0NCi0gICAgaWYoIXpBdGlfSXNTaW5nbGVDYXJkRm9yT25lU3RhbmRieSgpKQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IDA7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IGdfekF0aV9DdXJJbnN0YW5jZSArIDE7DQotICAgIH0NCi0gICAgdE1zZ0luZm8uZHdNc2dJZCA9IEdWQVJfTU1JQV9HRVRfQ05GX0VWOw0KLSAgICBnX3pBdGlfR2xvYkRhdGEucHRTaW5nbGVEYXRhID0gZ196QXRpX3B0RGF0YTsNCi0gICAgZ196QXRpX0dsb2JEYXRhLnB0RHVhbERhdGFbWl9BVElfSU5TTk9fMV0gPSAmZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdOw0KLSAgICBnX3pBdGlfR2xvYkRhdGEucHREdWFsRGF0YVtaX0FUSV9JTlNOT18yXSA9ICZnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl07DQotICAgIHRNc2dJbmZvLndNc2dMZW4gPSBzaXplb2YoVF96QXRpX0dvbGJhbF9EYXRhKTsNCi0gICAgdE1zZ0luZm8ucE1zZyA9IChQQllURSkoJmdfekF0aV9HbG9iRGF0YSk7DQotDQotICAgIHRNc2dJbmZvLmJTcmNNb2QgPSBTVUJNRExfWl9BVEk7DQotICAgIHRNc2dJbmZvLnRTcmNUYXNrID0gekRldl9HZXRUYXNrSWQoWl9BVElfVEFTS0lEX0FUSSwgMCk7DQotDQotICAgIHRNc2dJbmZvLmJEZXN0TW9kID0gU1VCTURMX1pfRVhUTU9EOw0KLSAgICB0TXNnSW5mby50RGVzdFRhc2sgPSB6T3NzX1NlbmRlcigpOw0KLQ0KLSAgICB6U2VuZE1zZygmdE1zZ0luZm8sICZnX3pBdGlfcHREYXRhLT5kd0ZhaWxDYXVzZSk7DQotICAgIHJldHVybiA7DQotfQ0KLQ0KLVZPSUQgekF0aV9HZXRHbG9iQXRNZW1WYXIgKFZPSUQpDQotew0KLSAgICBUX3pfTXNnSW5mbyB0TXNnSW5mbyA9IHswfTsNCi0NCi0gICAgaWYoIXpBdGlfSXNTaW5nbGVDYXJkRm9yT25lU3RhbmRieSgpKQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IDA7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IGdfekF0aV9DdXJJbnN0YW5jZSArIDE7DQotICAgIH0NCi0gICAgdE1zZ0luZm8uZHdNc2dJZCA9IEdWQVJfQVRNRU1fREVWX0dFVF9DTkZfRVY7DQotICAgIGdfekF0aV9BdG1lbS5wdEF0TWVtW1pfQVRJX0lOU05PXzFdID0gKFRfekRldl9BdE1lbSopekRldl9HZXRBdE1lbURhdGEoWl9BVElfSU5TTk9fMSk7DQotICAgIGdfekF0aV9BdG1lbS5wdEF0TWVtW1pfQVRJX0lOU05PXzJdID0gKFRfekRldl9BdE1lbSopekRldl9HZXRBdE1lbURhdGEoWl9BVElfSU5TTk9fMik7DQotICAgIHRNc2dJbmZvLndNc2dMZW4gPSBzaXplb2YoVF96QXRpX0F0bWVtRGF0YSk7DQotICAgIHRNc2dJbmZvLnBNc2cgPSAoUEJZVEUpKCZnX3pBdGlfQXRtZW0pOw0KLQ0KLSAgICB0TXNnSW5mby5iU3JjTW9kID0gU1VCTURMX1pfQVRJOw0KLSAgICB0TXNnSW5mby50U3JjVGFzayA9IHpEZXZfR2V0VGFza0lkKFpfQVRJX1RBU0tJRF9BVEksIDApOw0KLQ0KLSAgICB0TXNnSW5mby5iRGVzdE1vZCA9IFNVQk1ETF9aX0VYVE1PRDsNCi0gICAgdE1zZ0luZm8udERlc3RUYXNrID0gek9zc19TZW5kZXIoKTsNCi0NCi0gICAgelNlbmRNc2coJnRNc2dJbmZvLCAmZ196QXRpX3B0RGF0YS0+ZHdGYWlsQ2F1c2UpOyAgDQotICAgIHJldHVybiA7DQotfQ0KLQ0KLVZPSUQgekF0aV9HZXRHbG9iTnZWYXIgKFZPSUQpDQotew0KLSAgICBUX3pfTXNnSW5mbyB0TXNnSW5mbyA9IHswfTsNCi0NCi0gICAgaWYoIXpBdGlfSXNTaW5nbGVDYXJkRm9yT25lU3RhbmRieSgpKQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IDA7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICB0TXNnSW5mby5iU3RhY2tJbmRleCA9IGdfekF0aV9DdXJJbnN0YW5jZSArIDE7DQotICAgIH0NCi0gICAgdE1zZ0luZm8uZHdNc2dJZCA9IEdWQVJfTlZfREVWX0dFVF9DTkZfRVY7DQotICAgIHRNc2dJbmZvLndNc2dMZW4gPSB6RGV2X0dldE52RGF0YVNpemUoKTsNCi0gICAgdE1zZ0luZm8ucE1zZyA9IHpEZXZfR2V0TnZEYXRhKCk7DQotICAgIA0KLSAgICB0TXNnSW5mby5iU3JjTW9kID0gU1VCTURMX1pfQVRJOw0KLSAgICB0TXNnSW5mby50U3JjVGFzayA9IHpEZXZfR2V0VGFza0lkKFpfQVRJX1RBU0tJRF9BVEksIDApOw0KLSAgICANCi0gICAgdE1zZ0luZm8uYkRlc3RNb2QgPSBTVUJNRExfWl9FWFRNT0Q7DQotICAgIHRNc2dJbmZvLnREZXN0VGFzayA9IHpPc3NfU2VuZGVyKCk7DQotICAgIA0KLSAgICB6U2VuZE1zZygmdE1zZ0luZm8sICZnX3pBdGlfcHREYXRhLT5kd0ZhaWxDYXVzZSk7IA0KLSAgICByZXR1cm4gOw0KLX0NCi0NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9FbnF1aXJlR2xvYmFsVmFyKERXT1JEIGR3TXNnSWQpDQotew0KLSAgICBpZiAoR1ZBUl9NTUlBX0dFVF9SRVFfRVYgPT0gZHdNc2dJZCkNCi0gICAgew0KLSAgICAgICAgekF0aV9HZXRHdmFyICgpOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKEdWQVJfQVRNRU1fREVWX0dFVF9SRVFfRVYgPT0gZHdNc2dJZCkNCi0gICAgew0KLSAgICAgICAgekF0aV9HZXRHbG9iQXRNZW1WYXIoKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmIChHVkFSX05WX0RFVl9HRVRfUkVRX0VWID09IGR3TXNnSWQpDQotICAgIHsNCi0gICAgICAgIHpBdGlfR2V0R2xvYk52VmFyKCk7DQotICAgIH0NCi0gICAgZWxzZSANCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfRkFJTDsNCi0gICAgfQ0KLSAgICANCi0gICAgcmV0dXJuIFpfU1VDQzsNCi19DQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfTXNnU2lnVHJhY2UNCi0qILmmxNzD6Mr2o7ogytW1vc/7z6K688/ydHJhY2W3osvNz/vPog0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIGlFdklkICAgICAgICAgIM/7z6JJRA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Nc2dTaWdUcmFjZShVSU5UMzIgaUV2SWQsIFVJTlQ4ICpwRGF0YVB0ciwgVUlOVDE2IGlEYXRhTGVuKQ0KLXsNCi0gICAgaWYgKHpBdGlfSXNTaW5nbGVDYXJkRm9yVHdvU3RhbmRieSgpICYmIA0KLSAgICAgICAgKHpBdGlfSXNVaWNjRXYoaUV2SWQpIHx8IHpBdGlfSXNTdG1FdihpRXZJZCkpKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRJbmZvMk1zZ1RyYWNlIChwRGF0YVB0ciwgaURhdGFMZW4sIGlFdklkLCBaX0FUSV9JTlNOT18xKTsNCi0gICAgICAgIHpBdGlfU2VuZEluZm8yTXNnVHJhY2UgKHBEYXRhUHRyLCBpRGF0YUxlbiwgaUV2SWQsIFpfQVRJX0lOU05PXzIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kSW5mbzJNc2dUcmFjZSAocERhdGFQdHIsIGlEYXRhTGVuLCBpRXZJZCwgZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8Y6ekF0aV9SZWNSY3ZNc2cNCi0quq/K/bmmxNw6vMfCvMrVtb21xM/7z6LTw9PaR1ZBUl9NTUlBX0dFVF9SRVFfRVa1xLLp0a8NCi0qxuTL+8u1w/c6yP3M9bmkvt+0pbeitcSy6dGvz/vPos7e0Ou8x8K8DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1JlY1Jjdk1zZyhVSU5UMzIgaUV2SWQpDQotew0KLSAgICBpZihpRXZJZCAhPSBHVkFSX01NSUFfR0VUX1JFUV9FViAmJg0KLSAgICAgICAgaUV2SWQgIT0gR1ZBUl9BVE1FTV9ERVZfR0VUX1JFUV9FViAmJg0KLSAgICAgICAgaUV2SWQgIT0gR1ZBUl9OVl9ERVZfR0VUX1JFUV9FVikNCi0gICAgew0KLSAgICAgICAgZ196QXRpX3B0RGF0YS0+ZHdSY3ZNc2cgPSBpRXZJZDsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX0NwYnJDbmYNCi0qILmmxNzD6Mr2o7ogILSmwO2157uwsb7B0LHtDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogILfWzPXIoaOsyOe5+9axvdPRrbu3tKbA7aOsv8nE3M7et6i0psDtxuTL+8/7z6INCi0qICAgICAgICAgICAgICAgICAgICAgICAgyerH67XExNq05tTa1+6688rNt8UNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfQ3BickNuZihVSU5UOCAqcERhdGFQdHIpDQotew0KLSAgICBUX3pTdG1fQ3Bicl9DbmYgKnBDcGJyU3RtQ25mID0gKCBUX3pTdG1fQ3Bicl9DbmYgKilwRGF0YVB0cjsNCi0gICAgaWYocENwYnJTdG1DbmYtPmNuZk1zZ0lkID09IEFQX01NSUFfQ1BCUl9FWEVfQ05GX0VWKQ0KLSAgICB7DQotICAgICAgICBUX3pBcE1taWFfQ3BiclNldF9DbmYgKiBwQ3BiclNldENuZiA9IChUX3pBcE1taWFfQ3BiclNldF9DbmYgKil6QXRpX0dldFVCKHNpemVvZihUX3pBcE1taWFfQ3BiclNldF9DbmYpKTsNCi0gICAgICAgICgqcENwYnJTZXRDbmYpID0gcENwYnJTdG1DbmYtPmNwYnJTZXRDbmY7DQotICAgICAgICB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKHBDcGJyU3RtQ25mLT5jbmZNc2dJZCwgKFVJTlQ4ICopcENwYnJTZXRDbmYsIHNpemVvZihUX3pBcE1taWFfQ3BiclNldF9DbmYpKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKHBDcGJyU3RtQ25mLT5jbmZNc2dJZCA9PSBBUF9NTUlBX0NQQlJfU0VUX0VORF9DTkZfRVYpDQotICAgIHsNCi0gICAgICAgIFRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZiAqIHBDcGJyU2V0RW5kQ25mID0gKFRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZiAqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZikpOw0KLSAgICAgICAgKCpwQ3BiclNldEVuZENuZikgPSBwQ3BiclN0bUNuZi0+Q3BiclNldEVuZENuZjsNCi0gICAgICAgIHpBdGlfUmVjdlNlcnZlckhhbmRsZXJTbGF2ZXIocENwYnJTdG1DbmYtPmNuZk1zZ0lkLCAoVUlOVDggKilwQ3BiclNldEVuZENuZiwgc2l6ZW9mKFRfekFwTW1pYV9DcGJyU2V0RW5kX0NuZikpOw0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcENwYnJTdG1DbmYpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgLyogRVJST1IqLw0KLSAgICB9DQotICAgIHpBdGlfQ3BickhhbmRsZSgmKHBDcGJyU3RtQ25mLT5jcGJyU2V0UmVxKSwgKFVJTlQxNikocENwYnJTdG1DbmYtPmNwYnJTZXRDbmYud0luZGV4KzEpLCBwQ3BiclN0bUNuZi0+cmVhZFN0b3JhZ2UsIHBDcGJyU3RtQ25mKTsNCi0gICAgcmV0dXJuOw0KLX0NCi1WT0lEIHpBdGlfSGFuZGxlT3BsUG5uQ25mKFRfekF0aV9Db3BuUXJ5X0NuZiAqcENvcG5DbmYpDQotew0KLSAgICBCWVRFIGJJbnNObyA9IGdfekF0aV9DdXJJbnN0YW5jZTsNCi0gICAgVF96QXRpX0NvcG5fRXhlX0NuZiAqcEV4ZUNuZiA9IE5VTEw7DQotDQotICAgIHpBdGlfR2V0UmVhZENhcmRNdXRleCgpOw0KLSAgICBpZihnX3pBdGlfYXREYXRhRXhbYkluc05vXS50Q3JkUG5uT3BsLmJSZWNOdW0gIT0gcENvcG5DbmYtPmJPcGxQbm5Ub3RhbE51bSkNCi0gICAgew0KLSAgICAgICAgcENvcG5DbmYtPmJPcGxQbm5DdXJyTnVtID0gcENvcG5DbmYtPmJPcGxQbm5Ub3RhbE51bTsvKtbQvOSz9s/Wzt6/qLXI0uyzo77NsrvU2cnPsagqLw0KLSAgICAgICAgek9zc19UYXNrU2VuZERhdGEoRVZfWkFUSTJfQ09QTl9DTkYsIChWT0lEICopcENvcG5DbmYsIHNpemVvZihUX3pBdGlfQ29wblFyeV9DbmYpLCBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgICAgICB6QXRpX1B1dFJlYWRDYXJkTXV0ZXgoKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB6QXRpX1B1dFJlYWRDYXJkTXV0ZXgoKTsNCi0gICAgcEV4ZUNuZiA9IChUX3pBdGlfQ29wbl9FeGVfQ25mKil6QXRpX0dldFVCKHNpemVvZihUX3pBdGlfQ29wbl9FeGVfQ25mKSk7DQotICAgIHBFeGVDbmYtPmJEZXNJbmRleCA9IHBDb3BuQ25mLT5iRGVzSW5kZXg7DQotICAgIHBFeGVDbmYtPmJTcmNJbmRleCA9IHBDb3BuQ25mLT5iU3JjSW5kZXg7DQotICAgIHBFeGVDbmYtPmJNZW0gPSBaX0FUSV9PUExQTk47DQotICAgIHBFeGVDbmYtPndUb3RhbE51bSA9IChXT1JEKXBDb3BuQ25mLT5iT3BsUG5uVG90YWxOdW07DQotICAgIHBFeGVDbmYtPndDdXJyTnVtID0gKFdPUkQpcENvcG5DbmYtPmJPcGxQbm5DdXJyTnVtOw0KLSAgICBpZigocENvcG5DbmYtPmJPcGxQbm5Ub3RhbE51bSAtIHBDb3BuQ25mLT5iT3BsUG5uQ3Vyck51bSkvWl9BVElfSU5EX05VTSAhPSAwKQ0KLSAgICB7DQotICAgICAgICBwRXhlQ25mLT5iSW5kTnVtID0gWl9BVElfSU5EX05VTTsNCi0gICAgICAgIHBDb3BuQ25mLT5iT3BsUG5uQ3Vyck51bSArPSBaX0FUSV9JTkRfTlVNOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcEV4ZUNuZi0+YkluZE51bSA9IHBDb3BuQ25mLT5iT3BsUG5uVG90YWxOdW0gLSBwQ29wbkNuZi0+Yk9wbFBubkN1cnJOdW07DQotICAgICAgICBwQ29wbkNuZi0+Yk9wbFBubkN1cnJOdW0gPSBwQ29wbkNuZi0+Yk9wbFBublRvdGFsTnVtOw0KLSAgICB9DQotICAgIHpBdGlfUmVjdlNlcnZlckhhbmRsZXJTbGF2ZXIoQVBfTU1JQV9DT1BOX0VYRV9DTkYsIChCWVRFKilwRXhlQ25mLCBzaXplb2YoVF96QXRpX0NvcG5fRXhlX0NuZikpOw0KLQ0KLSAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9DT1BOX0NORiwgKFZPSUQgKilwQ29wbkNuZiwgc2l6ZW9mKFRfekF0aV9Db3BuUXJ5X0NuZiksIGdfekF0aV9Db250ZXh0LnRhc2tJZE15KTsNCi0gICAgcmV0dXJuOw0KLX0NCi1WT0lEIHpBdGlfSGFuZGxlTmV0Q25mKFRfekF0aV9Db3BuUXJ5X0NuZiAqcENvcG5DbmYpDQotew0KLSAgICBUX3pBdGlfQ29wbl9FeGVfQ25mICpwRXhlQ25mID0gTlVMTDsNCi0NCi0gICAgcEV4ZUNuZiA9IChUX3pBdGlfQ29wbl9FeGVfQ25mKil6QXRpX0dldFVCKHNpemVvZihUX3pBdGlfQ29wbl9FeGVfQ25mKSk7DQotICAgIHBFeGVDbmYtPmJEZXNJbmRleCA9IHBDb3BuQ25mLT5iRGVzSW5kZXg7DQotICAgIHBFeGVDbmYtPmJTcmNJbmRleCA9IHBDb3BuQ25mLT5iU3JjSW5kZXg7DQotICAgIHBFeGVDbmYtPmJNZW0gPSBaX0FUSV9ORVQ7DQotICAgIHBFeGVDbmYtPndUb3RhbE51bSA9IChXT1JEKXBDb3BuQ25mLT5iTmV0VG90YWxOdW07DQotICAgIHBFeGVDbmYtPndDdXJyTnVtID0gKFdPUkQpcENvcG5DbmYtPmJOZXRDdXJyTnVtOw0KLSAgICBpZigocENvcG5DbmYtPmJOZXRUb3RhbE51bSAtIHBDb3BuQ25mLT5iTmV0Q3Vyck51bSkvWl9BVElfSU5EX05VTSAhPSAwKQ0KLSAgICB7DQotICAgICAgICBwRXhlQ25mLT5iSW5kTnVtID0gWl9BVElfSU5EX05VTTsNCi0gICAgICAgIHBDb3BuQ25mLT5iTmV0Q3Vyck51bSArPSBaX0FUSV9JTkRfTlVNOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcEV4ZUNuZi0+YkluZE51bSA9IHBDb3BuQ25mLT5iTmV0VG90YWxOdW0gLSBwQ29wbkNuZi0+Yk5ldEN1cnJOdW07DQotICAgICAgICBwQ29wbkNuZi0+Yk5ldEN1cnJOdW0gPSBwQ29wbkNuZi0+Yk5ldFRvdGFsTnVtOw0KLSAgICB9DQotICAgIHpBdGlfUmVjdlNlcnZlckhhbmRsZXJTbGF2ZXIoQVBfTU1JQV9DT1BOX0VYRV9DTkYsIChCWVRFKilwRXhlQ25mLCBzaXplb2YoVF96QXRpX0NvcG5fRXhlX0NuZikpOw0KLSAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9DT1BOX0NORiwgKFZPSUQgKilwQ29wbkNuZiwgc2l6ZW9mKFRfekF0aV9Db3BuUXJ5X0NuZiksIGdfekF0aV9Db250ZXh0LnRhc2tJZE15KTsNCi0gICAgcmV0dXJuOw0KLX0NCi1WT0lEIHpBdGlfSGFuZGxlTWVDbmYoVF96QXRpX0NvcG5RcnlfQ25mICpwQ29wbkNuZikNCi17DQotICAgIFRfekF0aV9Db3BuX0V4ZV9DbmYgKnBFeGVDbmYgPSBOVUxMOw0KLQ0KLSAgICBwRXhlQ25mID0gKFRfekF0aV9Db3BuX0V4ZV9DbmYqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekF0aV9Db3BuX0V4ZV9DbmYpKTsNCi0gICAgcEV4ZUNuZi0+YkRlc0luZGV4ID0gcENvcG5DbmYtPmJEZXNJbmRleDsNCi0gICAgcEV4ZUNuZi0+YlNyY0luZGV4ID0gcENvcG5DbmYtPmJTcmNJbmRleDsNCi0gICAgcEV4ZUNuZi0+Yk1lbSA9IFpfQVRJX01FOw0KLSAgICBwRXhlQ25mLT53VG90YWxOdW0gPSAoV09SRClwQ29wbkNuZi0+Yk1lVG90YWxOdW07DQotICAgIHBFeGVDbmYtPndDdXJyTnVtID0gKFdPUkQpcENvcG5DbmYtPmJNZUN1cnJOdW07DQotICAgIGlmKChwQ29wbkNuZi0+Yk1lVG90YWxOdW0gLSBwQ29wbkNuZi0+Yk1lQ3Vyck51bSkvWl9BVElfSU5EX05VTSAhPSAwKQ0KLSAgICB7DQotICAgICAgICBwRXhlQ25mLT5iSW5kTnVtID0gWl9BVElfSU5EX05VTTsNCi0gICAgICAgIHBDb3BuQ25mLT5iTWVDdXJyTnVtICs9IFpfQVRJX0lORF9OVU07DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwRXhlQ25mLT5iSW5kTnVtID0gcENvcG5DbmYtPmJNZVRvdGFsTnVtIC0gcENvcG5DbmYtPmJNZUN1cnJOdW07DQotICAgICAgICBwQ29wbkNuZi0+Yk1lQ3Vyck51bSA9IHBDb3BuQ25mLT5iTWVUb3RhbE51bTsNCi0gICAgfQ0KLSAgICB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKEFQX01NSUFfQ09QTl9FWEVfQ05GLCAoQllURSopcEV4ZUNuZiwgc2l6ZW9mKFRfekF0aV9Db3BuX0V4ZV9DbmYpKTsNCi0gICAgek9zc19UYXNrU2VuZERhdGEoRVZfWkFUSTJfQ09QTl9DTkYsIChWT0lEICopcENvcG5DbmYsIHNpemVvZihUX3pBdGlfQ29wblFyeV9DbmYpLCBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgIHJldHVybjsNCi19DQotVk9JRCB6QXRpX0hhbmRsZUdsb0JhbENuZihUX3pBdGlfQ29wblFyeV9DbmYgKnBDb3BuQ25mKQ0KLXsNCi0gICAgVF96QXRpX0NvcG5fRXhlX0NuZiAqcEV4ZUNuZiA9IE5VTEw7DQotDQotICAgIHBFeGVDbmYgPSAoVF96QXRpX0NvcG5fRXhlX0NuZiopekF0aV9HZXRVQihzaXplb2YoVF96QXRpX0NvcG5fRXhlX0NuZikpOw0KLSAgICBwRXhlQ25mLT5iRGVzSW5kZXggPSBwQ29wbkNuZi0+YkRlc0luZGV4Ow0KLSAgICBwRXhlQ25mLT5iU3JjSW5kZXggPSBwQ29wbkNuZi0+YlNyY0luZGV4Ow0KLSAgICBwRXhlQ25mLT5iTWVtID0gWl9BVElfR0xPQkFMOw0KLSAgICBwRXhlQ25mLT53VG90YWxOdW0gPSAoV09SRClwQ29wbkNuZi0+d0dsb0JhbFRvdGFsTnVtOw0KLSAgICBwRXhlQ25mLT53Q3Vyck51bSA9IChXT1JEKXBDb3BuQ25mLT53R2xvQmFsQ3Vyck51bTsNCi0gICAgaWYoKHBDb3BuQ25mLT53R2xvQmFsVG90YWxOdW0gLSBwQ29wbkNuZi0+d0dsb0JhbEN1cnJOdW0pL1pfQVRJX0lORF9OVU0gIT0gMCkNCi0gICAgew0KLSAgICAgICAgcEV4ZUNuZi0+YkluZE51bSA9IFpfQVRJX0lORF9OVU07DQotICAgICAgICBwQ29wbkNuZi0+d0dsb0JhbEN1cnJOdW0gKz0gWl9BVElfSU5EX05VTTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHBFeGVDbmYtPmJJbmROdW0gPSAoQllURSkocENvcG5DbmYtPndHbG9CYWxUb3RhbE51bSAtIHBDb3BuQ25mLT53R2xvQmFsQ3Vyck51bSk7DQotICAgICAgICBwQ29wbkNuZi0+d0dsb0JhbEN1cnJOdW0gPSBwQ29wbkNuZi0+d0dsb0JhbFRvdGFsTnVtOw0KLSAgICB9DQotICAgIHpBdGlfUmVjdlNlcnZlckhhbmRsZXJTbGF2ZXIoQVBfTU1JQV9DT1BOX0VYRV9DTkYsIChCWVRFKilwRXhlQ25mLCBzaXplb2YoVF96QXRpX0NvcG5fRXhlX0NuZikpOw0KLSAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9DT1BOX0NORiwgKFZPSUQgKilwQ29wbkNuZiwgc2l6ZW9mKFRfekF0aV9Db3BuUXJ5X0NuZiksIGdfekF0aV9Db250ZXh0LnRhc2tJZE15KTsNCi0gICAgcmV0dXJuOw0KLX0NCi1WT0lEIHpBdGlfQ29wbkNuZihVSU5UOCAqcERhdGFQdHIpDQotew0KLSAgICBUX3pBdGlfQ29wblFyeV9DbmYgKnBDb3BuQ25mID0gKFRfekF0aV9Db3BuUXJ5X0NuZiopcERhdGFQdHI7DQotDQotICAgIGlmKHBDb3BuQ25mLT53TXNnSWQgPT0gQVBfTU1JQV9DT1BOX0VYRV9DTkYpDQotICAgIHsNCi0gICAgICAgIGlmKHBDb3BuQ25mLT5iT3BsUG5uVG90YWxOdW0gPiBwQ29wbkNuZi0+Yk9wbFBubkN1cnJOdW0pDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9IYW5kbGVPcGxQbm5DbmYocENvcG5DbmYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihwQ29wbkNuZi0+Yk5ldFRvdGFsTnVtID4gcENvcG5DbmYtPmJOZXRDdXJyTnVtKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfSGFuZGxlTmV0Q25mKHBDb3BuQ25mKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYocENvcG5DbmYtPmJNZVRvdGFsTnVtID4gcENvcG5DbmYtPmJNZUN1cnJOdW0pDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9IYW5kbGVNZUNuZihwQ29wbkNuZik7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHBDb3BuQ25mLT53R2xvQmFsVG90YWxOdW0gPiBwQ29wbkNuZi0+d0dsb0JhbEN1cnJOdW0pDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9IYW5kbGVHbG9CYWxDbmYocENvcG5DbmYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBDb3BuQ25mLT53TXNnSWQgPSBBUF9NTUlBX0NPUE5fRU5EX0NORjsNCi0gICAgICAgICAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9DT1BOX0NORiwgKFZPSUQgKilwQ29wbkNuZiwgc2l6ZW9mKFRfekF0aV9Db3BuUXJ5X0NuZiksIGdfekF0aV9Db250ZXh0LnRhc2tJZE15KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlLy9BUF9NTUlBX0NPUE5fRU5EX0NORg0KLSAgICB7DQotICAgICAgICBUX3pBdGlfQ29wbl9FbmRfQ25mICpwRW5kQ25mID0gKFRfekF0aV9Db3BuX0VuZF9DbmYqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekF0aV9Db3BuX0VuZF9DbmYpKTsNCi0gICAgICAgIHBFbmRDbmYtPmJEZXNJbmRleCA9IHBDb3BuQ25mLT5iRGVzSW5kZXg7DQotICAgICAgICBwRW5kQ25mLT5iU3JjSW5kZXggPSBwQ29wbkNuZi0+YlNyY0luZGV4Ow0KLSAgICAgICAgekF0aV9SZWN2U2VydmVySGFuZGxlclNsYXZlcihBUF9NTUlBX0NPUE5fRU5EX0NORiwgKEJZVEUqKXBFbmRDbmYsIHNpemVvZihUX3pBdGlfQ29wbl9FbmRfQ25mKSk7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnBDb3BuQ25mKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1N0bUxpc3RJbmQNCi0qILmmxNzD6Mr2o7ogILSmwO22zNDFwdCx7Q0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6ILfWzPXIoaOsyOe5+9axvdPRrbu3tKbA7aOsv8nE3M7et6i0psDtxuTL+8/7z6INCi0qICAgICAgICAgICAgICAgICAgICAgICAgyerH67XExNq05tTa1+6688rNt8UNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfU3RtTGlzdEluZChVSU5UOCAqcERhdGFQdHIpDQotew0KLSAgICBUX1pBdGlfU3RtTGlzdF9JbmQgKnB0U3RtSW5kID0gKFRfWkF0aV9TdG1MaXN0X0luZCAqKXBEYXRhUHRyOw0KLSAgICBUX1pPc3NfTGlzdCAqcExpc3QgPSBaT1NTX05VTEw7DQotICAgIFRfWkF0aV9MaXN0Rm9yU3RtICpwTGlzdEZvclN0bSA9IE5VTEw7DQotDQotICAgIGlmIChwdFN0bUluZCA9PSBOVUxMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgDQotICAgIGdfekF0aV9DdXJJbnN0YW5jZSA9IHB0U3RtSW5kLT5pU3RhY2tJZDsNCi0gICAgcExpc3QgPSBwdFN0bUluZC0+cFN0bU1zZ0xpc3Q7DQotICAgIGlmKHBMaXN0ICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHBMaXN0Rm9yU3RtID0gKFRfWkF0aV9MaXN0Rm9yU3RtICopek9zc19MaXN0Rmlyc3QocExpc3QpOw0KLSAgICAgICAgaWYocExpc3RGb3JTdG0gIT0gTlVMTCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKHBMaXN0Rm9yU3RtLT5pRXZJZCwgcExpc3RGb3JTdG0tPnBEYXRhUHRyLCBwTGlzdEZvclN0bS0+aURhdGFMZW4pOw0KLSAgICAgICAgICAgIHpPc3NfTGlzdERlbGV0ZShwTGlzdCwoVF9aT3NzX05vZGUgKilwTGlzdEZvclN0bSk7DQotICAgICAgICAgICAgek9zc19GcmVlKHBMaXN0Rm9yU3RtKTsNCi0gICAgICAgICAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9TVE1MSVNUX0lORCwgcHRTdG1JbmQsIHNpemVvZihUX1pBdGlfU3RtTGlzdF9JbmQpLCBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19GcmVlKHBMaXN0KTsNCi0gICAgICAgICAgICB6T3NzX1JldFVCKHB0U3RtSW5kKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1Byb2NUaW1lckV4cGlyeQ0KLSoguabE3MPoyvajuiC0psDttqjKscb3s6zKsc/7z6INCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogtqjKsbOsyrHP+8+it7W72FpfU1VDQ6OsxuTL+1pfRkFJTA0KLSogxuTL/Mu1w/ejuiCyu9Do0qrKzbfFxNq05g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgX19wc19zdGF0aWNfZnVuYyB6QXRpX1Byb2NUaW1lckV4cGlyeShVSU5UMzIgaUV2SWQsIFVJTlQ4ICpwRGF0YVB0cikNCi17DQotICAgIGlmKCBpRXZJZCA9PU1NSUFfRU1fSE9fSU5GT19FWFBJUllfRVYpDQotICAgIHsNCi0gICAgICAgIHpBdGlfRU1fSG9JbmZvSW5kKHBEYXRhUHRyKTsNCi0gICAgfQ0KLSNpZmRlZiBaX1NFTExfU1RBVF9TVVBQT1JUDQotICAgIGVsc2UgaWYoaUV2SWQgPT0gTU1JQV9TRUxMX1NUQVRfUkVHX0VYUElSWV9FVikNCi0gICAgew0KLSAgICAgICAgIHpBdGlfRG9SZWdUaW1lckV4cGlyKHBEYXRhUHRyKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKGlFdklkID09TU1JQV9TRUxMX1NUQVRfU1VNX1BEUF9FWFBJUllfRVYpDQotICAgIHsNCi0gICAgICAgIHpBdGlfRG9TdW1QZHBUaW1lckV4cGlyKHBEYXRhUHRyKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKGlFdklkID09TU1JQV9TRUxMX1NUQVRfT05FX1BEUF9FWFBJUllfRVYpDQotICAgIHsNCi0gICAgICAgIHpBdGlfRG9PbmVQZHBUaW1lckV4cGlyKHBEYXRhUHRyKTsNCi0gICAgfQ0KLSNlbmRpZg0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICBlbHNlIGlmKGlFdklkID09IE1NSUFfQU9DX0VYUElSWV9FVikNCi0gICAgew0KLSAgICAgICAgIC8qIDYxNzAwMTU0NTE5NCAgICArQ0NDTbXEyc+xqNPQzsrM4iovDQotICAgICAgICB6QXRpX0FvY1RpbWVyRXhwaXIocERhdGFQdHIpOw0KLSAgICB9DQotI2VuZGlmDQotICAgIGVsc2UgaWYoaUV2SWQgPT1FVl9aQVRJMl9aTVNSSV9JTkRfRVhQSVJZX0VWKQ0KLSAgICB7ICAgIC8qIDYxNzAwMTU5MTQxMSChvtbHxNy7+tDox/Ohvy0g1sfE3Lv60OjH81YzsOaxvs2ssr3Ktc/WKi8NCi0gICAgICAgIHpBdGlfTm90aWZ5QXBNb2RlbVJlYWR5KCk7DQotICAgIH0NCi0gICAgZWxzZSBpZihpRXZJZCA9PSBNTUlBX1pHRFRfRVhQSVJZX0VWKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1pnZGF0YVRlc3RTZW5kUHNEYXRhKCk7DQotICAgIH0NCi0gICAgZWxzZSBpZihpRXZJZCA9PSBNTUlBX1NPRlRSRVNFVF9FWFBJUllfRVYpDQotICAgIHsNCi0gICAgICAgIHpBdGlfUmVzZXRUaW1lckV4cGlyKCk7DQotICAgIH0NCi0gICAgZWxzZSBpZihpRXZJZCA9PSBNTUlBX1pVTFJUSU5EX0VYUElSWV9FVikNCi0gICAgew0KLSAgICAgICAgekF0aV9adWxydGluZFRpbWVyRXhwaXIoKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0ZBSUw7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpfU1VDQzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfVGFza1dvcmsNCi0qILmmxNzD6Mr2o7ogyM7O8bSm09q5pNf317TMrLXEtKbA7bqvyv0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yA0KLSogICAgICAgICAgICBwUHJpdmF0ZURhdGEgICANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IA0KLSogICAgICAgICAgICC499bWz/vPorXEysrF5NTa1eLA783qs8kNCi0qICAgICAgICAgICAgsLTA4LfWx+Wz/sTE0rvW1s/7z6LTw9PaxMTSu7e9w+a/2NbGDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfVGFza1dvcmsoVUlOVDMyIGlFdklkLCBVSU5UOCAqcERhdGFQdHIsIFVJTlQxNiBpRGF0YUxlbiwgVUlOVDggKnBQcml2YXRlRGF0YSkNCi17DQotICAgIEJZVEUgYkluc3RhbmNlID0gekF0aV9HZXRUYXNrSW5zdGFudEluZGV4QnlUYXNrSWQoaUV2SWQsIHBEYXRhUHRyLCB6T3NzX1NlbmRlcigpKTsNCi0gICAgaWYgKGJJbnN0YW5jZSAhPSBaX0FUSV9JTlZBTElEX0JZVEUpDQotICAgIHsNCi0gICAgICAgICNpZiBkZWZpbmVkIChEVUFMX0NBUkRfRFVBTF9TVEFOREJZKSB8fCBkZWZpbmVkIChfT1NfV0lOKQ0KLSAgICAgICAgZ196QXRpX0N1ckluc3RhbmNlID0gYkluc3RhbmNlOw0KLSAgICAgICAgI2Vsc2UNCi0gICAgICAgIGdfekF0aV9DdXJJbnN0YW5jZSA9IFpfQVRJX0lOU05PXzE7DQotICAgICAgICAjZW5kaWYNCi0gICAgfQ0KLQ0KLSAgICB6QXRpX1JlY1Jjdk1zZyhpRXZJZCk7DQotDQotI2lmZGVmIF9VU0VfU0lHX1RSQUNFDQotICAgIHpBdGlfTXNnU2lnVHJhY2UoaUV2SWQsIHBEYXRhUHRyLCBpRGF0YUxlbik7DQotI2VuZGlmDQotDQotI2lmZGVmIF9VU0VfR0xPQkFMX1RSQUNFDQotICAgIGlmICh6QXRpX0VucXVpcmVHbG9iYWxWYXIoaUV2SWQpID09IFpfU1VDQykgIC8qIM6qRUM2MTcwMDE0MjYyODO2+NT2vNMqLw0KLSAgICB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgLy8gILSmwO22qMqxxvezrMqxz/vPoqOssrvQ6NKqys23xcTatOYNCi0gICAgaWYoekF0aV9Qcm9jVGltZXJFeHBpcnkoaUV2SWQsIHBEYXRhUHRyKSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBzd2l0Y2goaUV2SWQpDQotICAgIHsNCi0gICAgY2FzZSBFVl9QT1dFUk9GRjoNCi0gICAgICAgIHpBdGlfU3RvcFRhc2soKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIEVWX1pBVEkyX1JFQ1ZfQ09NTUFORF9JTkQ6ICAgICAvKiDK1bW9QVQyxNy5u7SmwO21xEFUw/zB7iAgKi8NCi0gICAgICAgIHpBdGlfUmVjdkNvbW1hbmRJbmQocERhdGFQdHIsIGlEYXRhTGVuKTsNCi0gICAgICAgIGJyZWFrOw0KLSNpZm5kZWYgQ09ORklHX1NJTkdMRUNPUkUNCi0gICAgICAgIC8vLi4uIDQuMTnPwsPmyP249tTdyrG3xdTatMu0piy689D4v7zCx9PFu6+3vbC4DQotICAgIGNhc2UgRVZfWkFUSTJfVEVTVF9TRU5EX0NTX0RBVEE6ICAgIC8qIEdDRrLiytTQ6NKqtcRDU0TEo8Tiyv2+3SAqLw0KLSAgICAgICAgekF0aV9aZ2RhdGFUZXN0U2VuZENzRGF0YSgpOw0KLSAgICAgICAgYnJlYWs7DQotI2VuZGlmDQotICAgIGNhc2UgRVZfWkFUSTJfU1RNTElTVF9JTkQ6DQotICAgICAgICB6QXRpX1N0bUxpc3RJbmQocERhdGFQdHIpOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgICBjYXNlIEVWX1pBVEkyX0NQQlJfQ05GOg0KLSAgICAgICAgekF0aV9DcGJyQ25mKHBEYXRhUHRyKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgY2FzZSBFVl9aQVRJMl9DT1BOX0NORjoNCi0gICAgICAgIHpBdGlfQ29wbkNuZihwRGF0YVB0cik7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBFVl9aQVRJMl9aRU1DRUxMSU5GT19SRVE6DQotICAgICAgICB6QXRpX0VNQ2VsbEluZm9SZXEoKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgICAgekF0aV9SZWN2U2VydmVySGFuZGxlclNsYXZlcihpRXZJZCwgcERhdGFQdHIsIGlEYXRhTGVuKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgICNpZmRlZiBaX0RVQUxDQVJEX0FEQVBUIA0KLSAgICAvKsurv6jLq7T919TKysXkKi8NCi0gICAgaWYoWl9WQUxJRCA9PSB6QXRpX0lzRHVhbFBzRHVhbFVpY2MoKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9IYW5kbGVEdWFsQ2FyZFNlbGZBZGFwdCgpOw0KLSAgICB9DQotICAgICNlbmRpZg0KLSAgICByZXR1cm47DQotfQ0KLQ0KLQ0KLQ0KLQ0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAgKi0tLS0tLS0tLS0t0MLU9rSmwO26r8r9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSBEV09SRCB6QXRpX1ByZVVpY2NTbG90SW5kKFZPSUQgKnBiTXNnRGF0YSwgRFdPUkQgKiBwZHdDaGFuZ2VkTXNnSWQsIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpDQotew0KLSAgICAvKjYxNzAwMTg2MTM3NNbHxNy7+sjIsuWwztDox/MqLw0KLSAgICBUX3pBcFVpY2NfQ2FyZF9JbmQgKiBwWnVzbG90Q25mID0gKFRfekFwVWljY19DYXJkX0luZCAqKXBiTXNnRGF0YTsNCi0gICAgQllURSBiYWtJbml0RmxhZyA9IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLmJDYXJkSW5pdGlhdGVkRmxhZzsNCi0gICAgDQotICAgIGlmIChwWnVzbG90Q25mLT5iU2xvdFN0YXRlID09IFpfQVBVSUNDX0VWVUxTSU9OX0NBUkQpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2V0Q2FyZFN0YXRlKGdfekF0aV9DdXJJbnN0YW5jZSwgWl9DQVJEX0lOSVRfRVJSKTsNCi0gICAgICAgIC8vekF0aV9SZXRVYkNhcmRQbG1uSW5mbygpOw0KLSAgICAgICAgLy96T3NzX01lbXNldCgmZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udFN0VXBNZW51LCAwLCBzaXplb2YoVF96QXRpX1NldFVwTWVtbnUpKTsNCi0gICAgICAgIHpBdGlfQ2FyZE9mZkluaXRHbG9iYWxWYXJCeUluc3RObyhnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICAgICAgelN0bV9DYXJkTG9zdEluZCgoVF96U3RtX1Rhc2tJZHgpZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYoWl9BVElfQ0FSRElOSVRfSU5HID09IGJha0luaXRGbGFnKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfQ2FyZEluaXRGbGdDbHJfU2lnQ2QoZ196QXRpX0N1ckluc3RhbmNlLCBaX0FUSV9DQVJESU5JVF9GSU5JU0gpOw0KLSAgICAgICAgICAgIHpBdGlfSGFuZGxlTXNnQnVmZiAoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHpBdGlfSGFuZGxlQXV0b1N0YXJ0KCk7DQotICAgIH0NCi0gICAgZWxzZSBpZiAocFp1c2xvdENuZi0+YlNsb3RTdGF0ZSA9PSBaX0FQVUlDQ19JTlNFUlRfQ0FSRCkNCi0gICAgew0KLSNpZiBkZWZpbmVkIChEVUFMX0NBUkRfRFVBTF9TVEFOREJZKSB8fCBkZWZpbmVkIChfT1NfV0lOKQ0KLSAgICAgICAgQllURSBiU3JjSW5kZXggICAgPSAoZ196QXRpX0N1ckluc3RhbmNlID09IDAgPyBaQVRJMl9DSEFOTkVMX0lEX05VTTI1MSA6IFpBVEkyX0NIQU5ORUxfSURfTlVNMjUyKTsNCi0jZWxzZQ0KLSAgICAgICAgQllURSBiU3JjSW5kZXggICAgPSBaQVRJMl9DSEFOTkVMX0lEX05VTTI1MTsNCi0jZW5kaWYNCi0gICAgICAgIHpBdGlfSW5pdENhcmQoYlNyY0luZGV4LCBaX0FUSV9JTlZBTElEX0JZVEUpOw0KLSAgICAgICAgekF0aV9DYXJkSW5pdEZsZ0Nscl9TaWdDZChnX3pBdGlfQ3VySW5zdGFuY2UsIFpfQVRJX0NBUkRJTklUX0lORyk7DQotICAgIH0NCi0gICAgLy8gzt6x5LuvDQotICAgICogcGR3Q2hhbmdlZE1zZ0lkID0gQVBfVUlDQ19TTE9UX0lORF9FVjsNCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PUkVTVUxUOw0KLX0NCi0vLy0tLS0tLS0tLS0tLS0tLS0tc3RhcnQtLS0tLS0tLS0tLS0tDQotDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfQWRkT25lQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSwgQllURSAqIHBiQ21kU3RyKQ0KLXsNCi0gICAgVF96QXRpX0FUQ21kTm9kZSAqIHB0VGVtcEF0Q21kTm9kZSA9IHBDaG5lbE5vZGUtPnRBdENtZExpc3QucHRBdENtZE5vZGU7DQotDQotICAgIGlmKHB0VGVtcEF0Q21kTm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICB3aGlsZShwdFRlbXBBdENtZE5vZGUtPnB0TmV4dCAhPSBOVUxMKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB0VGVtcEF0Q21kTm9kZSA9IHB0VGVtcEF0Q21kTm9kZS0+cHROZXh0Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHRUZW1wQXRDbWROb2RlLT5wdE5leHQgPSAoVF96QXRpX0FUQ21kTm9kZSAqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekF0aV9BVENtZE5vZGUpKTsNCi0gICAgICAgIHB0VGVtcEF0Q21kTm9kZS0+cHROZXh0LT5wYkF0Q21kID0gKEJZVEUgKil6QXRpX0dldFVCKHN0cmxlbigoY29uc3QgY2hhciAqKXBiQ21kU3RyKSsxKTsNCi0gICAgICAgIHpPc3NfTWVtY3B5KHB0VGVtcEF0Q21kTm9kZS0+cHROZXh0LT5wYkF0Q21kLCBwYkNtZFN0ciwgc3RybGVuKChjb25zdCBjaGFyICopcGJDbWRTdHIpKzEpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcENobmVsTm9kZS0+dEF0Q21kTGlzdC5wdEF0Q21kTm9kZSA9IChUX3pBdGlfQVRDbWROb2RlICopekF0aV9HZXRVQihzaXplb2YoVF96QXRpX0FUQ21kTm9kZSkpOw0KLSAgICAgICAgcENobmVsTm9kZS0+dEF0Q21kTGlzdC5wdEF0Q21kTm9kZS0+cGJBdENtZCA9IChCWVRFICopekF0aV9HZXRVQihzdHJsZW4oKGNvbnN0IGNoYXIgKilwYkNtZFN0cikrMSk7DQotICAgICAgICB6T3NzX01lbWNweShwQ2huZWxOb2RlLT50QXRDbWRMaXN0LnB0QXRDbWROb2RlLT5wYkF0Q21kLCBwYkNtZFN0ciwgc3RybGVuKChjb25zdCBjaGFyICopcGJDbWRTdHIpKzEpOw0KLSAgICB9DQotDQotICAgIHBDaG5lbE5vZGUtPnRBdENtZExpc3QuYkF0Q21kTnVtICs9IDE7DQotICAgIHJldHVybjsNCi19DQotDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUmVtb3ZlT25lQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIFRfekF0aV9BVENtZE5vZGUgKiBwdFRlbXBBdENtZE5vZGUgPSBwQ2huZWxOb2RlLT50QXRDbWRMaXN0LnB0QXRDbWROb2RlOw0KLQ0KLSAgICBpZihwdFRlbXBBdENtZE5vZGUgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgcENobmVsTm9kZS0+dEF0Q21kTGlzdC5wdEF0Q21kTm9kZSA9IHB0VGVtcEF0Q21kTm9kZS0+cHROZXh0Ow0KLQ0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcHRUZW1wQXRDbWROb2RlLT5wYkF0Q21kKTsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0VGVtcEF0Q21kTm9kZSk7DQotICAgIH0NCi0NCi0gICAgcENobmVsTm9kZS0+Y21kX2lkID0gWkFUMl9OT19DT01NQU5EOyAvKiA9IC0xOyAqLw0KLSAgICBwQ2huZWxOb2RlLT5jbWRfb3AgPSBaQVQyX0NPX0lOVkFMSUQ7IC8qID0gLTE7ICovDQotICAgIHBDaG5lbE5vZGUtPmlFdklkID0gWkFUSTJfSU5WQUxfRVZJRDsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1WT0lEIHpBdGlfUmVtb3ZlQUxMQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIHdoaWxlKHBDaG5lbE5vZGUtPnRBdENtZExpc3QucHRBdENtZE5vZGUgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgekF0aV9SZW1vdmVPbmVDbWQocENobmVsTm9kZSk7DQotICAgIH0NCi0gICAgcENobmVsTm9kZS0+dEF0Q21kTGlzdC5iQXRDbWROdW0gPSAwOw0KLQ0KLSAgICBwQ2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX05PX0NPTU1BTkQ7DQotICAgIHBDaG5lbE5vZGUtPmNtZF9vcCA9IFpBVDJfQ09fSU5WQUxJRDsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Jc011bHRpQ21kDQotKiC5psTcw+jK9qO6IMXQts/Kx7fxyse24Mz1w/zB7g0KLSogss7K/cu1w/ejuiAoSU4pOg0KLSogICAgICAgICAgICAgcENobmVsTm9kZTogICAgICAgzai1wL3atePWuNXrICAgICAgICAgICANCi0qICAgICAgICAgICAgKE9VVCk6zt4NCi0qILe1ILvYINa1o7ogVFJVRaOsIEZBTFNFDQotKiDG5Mv8y7XD96O6zt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc011bHRpQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIHJldHVybiAgKHBDaG5lbE5vZGUtPnRBdENtZExpc3QuYkF0Q21kTnVtID4gMSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX0hhc01vcmVDbWQNCi0qILmmxNzD6Mr2o7ogxdC2z8rHt/G7udPQxuTL+7T9veLC67XEw/zB7g0KLSogss7K/cu1w/ejuiAoSU4pOg0KLSogICAgICAgICAgICAgcENobmVsTm9kZTogICAgICAgzai1wL3atePWuNXrICAgICAgICAgICANCi0qICAgICAgICAgICAgKE9VVCk6zt4NCi0qILe1ILvYINa1o7ogVFJVRaOsIEZBTFNFDQotKiDG5Mv8y7XD96O6zt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9IYXNNb3JlQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIHJldHVybiAocENobmVsTm9kZS0+dEF0Q21kTGlzdC5wdEF0Q21kTm9kZSAhPSBOVUxMKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfSXNMYXN0Q21kDQotKiC5psTcw+jK9qO6IMXQts/V/dTatKbA7bXEw/zB7srHt/HOqtfuuvPSu8z1tcTD/MHuDQotKiCyzsr9y7XD96O6IChJTik6DQotKiAgICAgICAgICAgICBwQ2huZWxOb2RlOiAgICAgICDNqLXAvdq149a41esgICAgICAgICAgIA0KLSogICAgICAgICAgICAoT1VUKTrO3g0KLSogt7Ugu9gg1rWjuiBUUlVFo6wgRkFMU0UNCi0qIMbky/zLtcP3o7rO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzTGFzdENtZChUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICAgLy8gcENobmVsTm9kZS0+dEF0Q21kTGlzdC5wdEF0Q21kTm9kZdTatMuyu7vhyse/1Q0KLSAgICAgcmV0dXJuIChwQ2huZWxOb2RlLT50QXRDbWRMaXN0LnB0QXRDbWROb2RlLT5wdE5leHQgPT0gTlVMTCk7DQotfQ0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzSW50ZXJtZWRpYXRlTXNnKERXT1JEIGR3TXNnSWQsIFZPSUQqIHBCdWZmKQ0KLXsNCi0gICAgLypDUEJSL1NDUEJStcTW0Lzkz/vPoiovDQotICAgIGlmKEFQX01NSUFfQ1BCUl9FWEVfQ05GX0VWID09IGR3TXNnSWQgDQotICAgICAgICB8fEFQX01NSUFfUEJfU19GSU5EX0lOREVYX0NORl9FViA9PSBkd01zZ0lkDQotICAgICAgICB8fEFQX01NSUFfQ09QTl9FWEVfQ05GID09IGR3TXNnSWQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotDQotICAgIGlmKHBCdWZmID09IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLQ0KLSAgICAvKrbM0MXB0LHttcTW0Lzkz/vPoiovDQotICAgIHN3aXRjaChkd01zZ0lkKQ0KLSAgICB7DQotICAgICAgICBjYXNlIEFQX01NSUFfU01TX1BDTUdMX0NORl9FVjoNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUX3pBcE1taWFfU21zUGNtZ2xfQ25mICpwUGNtZ2xDbmYgPSAoVF96QXBNbWlhX1Ntc1BjbWdsX0NuZiopcEJ1ZmY7DQotICAgICAgICAgICAgaWYocFBjbWdsQ25mLT53VG90YWxOdW0gIT0gMCAmJiBwUGNtZ2xDbmYtPldDdXJOdW0gIT0gcFBjbWdsQ25mLT53VG90YWxOdW0pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBjYXNlIEFQX01NSUFfU01TX1RERUxJX0xJU1RfQ05GX0VWOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRfekFwTW1pYV9TbXNUZGVsaUxpc3RfQ25mICpwVGNtZ2xEZWxpQ25mID0gKFRfekFwTW1pYV9TbXNUZGVsaUxpc3RfQ25mKilwQnVmZjsNCi0gICAgICAgICAgICBpZihwVGNtZ2xEZWxpQ25mLT53VG90YWxOdW0gIT0gMCYmcFRjbWdsRGVsaUNuZi0+d0N1ck51bSAhPSBwVGNtZ2xEZWxpQ25mLT53VG90YWxOdW0pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBjYXNlIEFQX01NSUFfU01TX1RTVUJfTElTVF9DTkZfRVY6DQotICAgICAgICB7DQotICAgICAgICAgICAgVF96QXBNbWlhX1Ntc1RzdWJMaXN0X0NuZiAqcFRjbWdsU3ViQ25mID0gKFRfekFwTW1pYV9TbXNUc3ViTGlzdF9DbmYqKXBCdWZmOw0KLSAgICAgICAgICAgIGlmKHBUY21nbFN1YkNuZi0+d1RvdGFsTnVtICE9IDAmJnBUY21nbFN1YkNuZi0+d0N1ck51bSAhPSBwVGNtZ2xTdWJDbmYtPndUb3RhbE51bSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhc2UgQVBfTU1JQV9TTVNfVFNUQVRfTElTVF9DTkZfRVY6DQotICAgICAgICB7DQotICAgICAgICAgICAgVF96QXBNbWlhX1Ntc1RzdGF0TGlzdF9DbmYgKnBUY21nbFN0YXRDbmYgPSAoVF96QXBNbWlhX1Ntc1RzdGF0TGlzdF9DbmYqKXBCdWZmOw0KLSAgICAgICAgICAgIGlmKHBUY21nbFN0YXRDbmYtPndUb3RhbE51bSAhPSAwJiZwVGNtZ2xTdGF0Q25mLT53Q3VyTnVtICE9IHBUY21nbFN0YXRDbmYtPndUb3RhbE51bSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhc2UgQVBfTU1JQV9TTVNfVENPTV9MSVNUX0NORl9FVjoNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUX3pBcE1taWFfU21zVGNvbUxpc3RfQ25mICpwVGNtZ2xDb21DbmYgPSAoVF96QXBNbWlhX1Ntc1Rjb21MaXN0X0NuZiopcEJ1ZmY7DQotICAgICAgICAgICAgaWYocFRjbWdsQ29tQ25mLT53VG90YWxOdW0gIT0gMCYmcFRjbWdsQ29tQ25mLT53Q3VyTnVtICE9IHBUY21nbENvbUNuZi0+d1RvdGFsTnVtKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2FzZSBBUF9NTUlBX0NCU19UQ0JNX0xJU1RfQ05GX0VWOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRfekFwTW1pYV9DYnNfVGNibUxpc3RfQ25mICpwVGNtZ2xDYm1DbmYgPSAoVF96QXBNbWlhX0Nic19UY2JtTGlzdF9DbmYqKXBCdWZmOw0KLSAgICAgICAgICAgIGlmKHBUY21nbENibUNuZi0+YlRvdGFsUGFnZSAhPSAwJiYgcFRjbWdsQ2JtQ25mLT5iQ3VyUGFnZSAhPSBwVGNtZ2xDYm1DbmYtPmJUb3RhbFBhZ2UpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBjYXNlIEFQX01NSUFfQ0JTX1BDQk1fTElTVF9DTkZfRVY6DQotICAgICAgICB7DQotICAgICAgICAgICAgVF96QXBNbWlhX0Nic19QY2JtTGlzdF9DbmYgKnBQY2JtY21nbENuZiA9IChUX3pBcE1taWFfQ2JzX1BjYm1MaXN0X0NuZiopcEJ1ZmY7DQotICAgICAgICAgICAgaWYocFBjYm1jbWdsQ25mLT5iTGlzdEVuZEZnICE9IDEpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfR2V0Rmlyc3RDbWQNCi0qILmmxNzD6Mr2o7ogu/HIobXa0rvM9cP8we7X1rf7tK4NCi0qILLOyv3LtcP3o7ogKElOKToNCi0qICAgICAgICAgICAgIHBDaG5lbE5vZGU6ICAgICAgIM2otcC92rXj1rjV6yAgICAgICAgICAgDQotKiAgICAgICAgICAgIChPVVQpOs7eDQotKiC3tSC72CDWtaO6IMP8we7X1rf7tK7K17XY1rcNCi0qIMbky/zLtcP3o7rO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgKiBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Rmlyc3RDbWQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgcmV0dXJuIHBDaG5lbE5vZGUtPnRBdENtZExpc3QucHRBdENtZE5vZGUtPnBiQXRDbWQ7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1NlbmRFbmNEYXRhDQotKiC5psTcw+jK9qO6IMnPsaix4MLrveG5+w0KLSogss7K/cu1w/ejuiAoSU4pOg0KLSogICAgICAgICAgICAgcENobmVsTm9kZTogICAgICAgzai1wL3atePWuNXrIA0KLSogICAgICAgICAgICAgcFN0ckNtZDogICAgICAgICAgILHgwuu687XE19a3+7SuDQotKiAgICAgICAgICAgIChPVVQpOs7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6zt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9TZW5kRW5jRGF0YShUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUsIEJZVEUqIHBTdHJDbWQsIERXT1JEIGR3TXNnSWQsIFZPSUQqIHBCdWZmKQ0KLXsNCi0gICAgQ0hBUiAgIFpBVEkyX0VOQ19FUlJfU1RSW10gPSB7IkVSUk9SIn07DQotICAgIFdPUkQgIHdTdHJMZW4gPSAoV09SRClzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RyQ21kKTsNCi0NCi0gICAgLyogICC1pcz1w/zB7qOs09BPSyAsILK7yKWz/aOsw7tPSyCyu9T2vNMNCi0gICAgICogICC24Mz1w/zB7qOs09BPSywgyKWz/aOs1NnX7rrzsrm3ok9LDQotICAgICAqLyAgICAgIA0KLSAgICBpZihzdHJzdHIoKGNvbnN0IGNoYXIgKilwU3RyQ21kLChjaGFyICopZ196QXRfT0spICE9IE5VTEwpIA0KLSAgICB7DQotICAgICAgICBpZiAoekF0aV9Jc011bHRpQ21kKHBDaG5lbE5vZGUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHdTdHJMZW4gIC09IChXT1JEKXN0cmxlbigoY29uc3QgY2hhciAqKWdfekF0X09LKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlIGlmKHN0cnN0cigoY29uc3QgY2hhciAqKXBTdHJDbWQsKGNoYXIgKilaQVRJMl9FTkNfRVJSX1NUUikgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgekF0aV9SZW1vdmVBTExDbWQocENobmVsTm9kZSk7DQotICAgICAgICB6QXRpX1NlbmRGbmMocENobmVsTm9kZS0+aUNobmVsSWQsIHBTdHJDbWQsIHdTdHJMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgIHpBdGlfU2VuZFJzcENtZFN0cjJUcmFjZShwQ2huZWxOb2RlLT5pQ2huZWxJZCwgd1N0ckxlbiwgKENIQVIgKilwU3RyQ21kKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBpZiAod1N0ckxlbiA+IDApDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEZuYyhwQ2huZWxOb2RlLT5pQ2huZWxJZCwgcFN0ckNtZCwgd1N0ckxlbiwgWkFUSTJfQ0hJTkRfQVQpOw0KLSAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKHBDaG5lbE5vZGUtPmlDaG5lbElkLCB3U3RyTGVuLCAoQ0hBUiAqKXBTdHJDbWQpOw0KLSAgICB9DQotDQotICAgIC8qILbgzPXD/MHutcTX7rrz0rvM9cP8we6jrLK5t6JPSyovDQotICAgIGlmKHpBdGlfSXNNdWx0aUNtZChwQ2huZWxOb2RlKSkNCi0gICAgew0KLSAgICAgICAgaWYoekF0aV9Jc0xhc3RDbWQocENobmVsTm9kZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoIXpBdGlfSXNJbnRlcm1lZGlhdGVNc2coZHdNc2dJZCwgcEJ1ZmYpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9TZW5kRm5jKHBDaG5lbE5vZGUtPmlDaG5lbElkLCAoQllURSAqKWdfekF0X09LLCAoV09SRClzdHJsZW4oKGNvbnN0IGNoYXIgKilnX3pBdF9PSyksIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgICAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKHBDaG5lbE5vZGUtPmlDaG5lbElkLCAoV09SRClzdHJsZW4oKGNvbnN0IGNoYXIgKilnX3pBdF9PSyksIChDSEFSICopZ196QXRfT0spOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQ2huZWxOb2RlLT50QXRDbWRMaXN0LmJBdENtZE51bSA9IDA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwQ2huZWxOb2RlLT50QXRDbWRMaXN0LmJBdENtZE51bSA9IDA7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9SZXBseU9LDQotKiC5psTcw+jK9qO6IMnPsaix4MLrveG5+w0KLSogss7K/cu1w/ejuiAoSU4pOg0KLSogICAgICAgICAgICAgcENobmVsTm9kZTogICAgICAgzai1wL3atePWuNXrIA0KLSogICAgICAgICAgICAoT1VUKTrO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejus7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUmVwbHlPSyhUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICB6QXRpX1NlbmRFbmNEYXRhKHBDaG5lbE5vZGUsIChCWVRFICopZ196QXRfT0ssIFpBVElfSU5WQUxJRF9NU0dJRCwgTlVMTCk7DQotICAgIHJldHVybjsNCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0RXJyb3JSZXBseQ0KLSoguabE3MPoyvYgOiC78cihyqew3NDFz6INCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIHpBdGlfR2V0RXJyb3JSZXBseVN0cihDSEFSICogcGJFcnJvclN0ciwgVF9aQXQyX0RlY1JzbHRUeXBlICBiRGVjUnNsdFR5cGUpDQotew0KLSAgICBEV09SRCBkd0Vycm9yQ29kZVtdID0gew0KLSAgICAgICAgKERXT1JEKVpBVDJfQ01EX0lOVkFMSURfUlNMVCwgLy9aQVQyX0NNRF9QQVJTRV9PSywgICAgICAgICAgLyogveLO9rPJuaYgKi8NCi0gICAgICAgIChEV09SRClaQVQyX0NNRF9JTlZBTElEX1JTTFQsIC8vWkFUMl9DTURfUkVQTFlfRElSRUNULCAgICAgIC8qIL3izvazybmmx9LWsb3Tu9i4tMP8we4gKi8NCi0gICAgICAgIChEV09SRClaQVQyX0NNRF9JTlZBTElEX1JTTFQsIC8vIFpBVDJfQ01EX05PVF9FTkRfUkVQTFksICAgICAvKiDD/MHuzrS94cr41rG907vYuLTM4cq+ICovDQotICAgICAgICAoRFdPUkQpWkFUMl9DTURfSU5WQUxJRF9SU0xULCAvLyBaQVQyX0NNRF9OT1RfRU5ELCAgICAgICAgICAgLyogw/zB7s60veHK+CAqLw0KLSAgICAgICAgWkFUMl9DTUVFX0NNRFVOUkVDLCAgIC8vICBaQVQyX0NNRF9VTlJFQywgICAgICAgICAgICAgLyogzt63qMq2sfC1xMP8we4gKi8NCi0gICAgICAgIFpBVDJfQ01FRV9TWU5UQVhfRVJSLCAgLy8gIFpBVDJfQ01EX1NZTlRBWF9FUlIsICAgICAgICAvKiDT77eotO3O8yAqLw0KLSAgICAgICAgWkFUMl9DTUVFX1NZTlRBWF9FUlIsICAvLyBaQVQyX0NNRF9QQVJBTV9FUlIsICAgICAgICAgLyogss7K/bTtzvMgKi8NCi0gICAgICAgIChEV09SRClaQVQyX0NNRF9JTlZBTElEX1JTTFQsIC8vIFpBVDJfQ01EX0NBTkNFTEVELCAgICAgICAgICAvKiDD/MHuyKHP+yAqLw0KLSAgICAgICAgKERXT1JEKVpBVDJfQ01FRV9DTURDT05GTElDVCwgLy8gWkFUMl9DTURfQ09ORkxJQ1QsICAgICAgICAgIC8qILWlzai1wL3iwuuz5c27ICovDQotICAgICAgICAoRFdPUkQpWkFUMl9DTURfSU5WQUxJRF9SU0xULCAvLyBaQVQyX0lOUFVUX0lMTEVHQUwsICAgICAgICAgLyogyOuyzrfHt6ggKi8NCi0gICAgICAgIChEV09SRClaQVQyX0NNRF9JTlZBTElEX1JTTFQsIC8vIFpBVDJfTUVNT1JZX0VSUiwgICAgICAgICAgICAgLyogxNq05rTtzvMgKi8NCi0gICAgICAgIFpfQVBNTUlBX05WRkFJTFVSRV9FUlIsIC8vIFpBVDJfTlZGQUlMVVJFX0VSUiAsDQotICAgICAgICBaX0FQTU1JQV9PUFROT1RBTFdfRVJSLCAvLyBaQVQyX09QVE5PVEFMV19FUlIsDQotICAgICAgICBaX0FQTU1JQV9DTVNOT0NOTUFBQ0tfRVJSLCAvLyBaQVQyX0NNU05PQ05NQUFDS19FUlIsDQotICAgICAgICBaX0FQTU1JQV9DTVNNRU1GQUlMX0VSUiwgLy8gWkFUMl9DTVNJTlZBTElEVEVYVFBBUkFfRVJSLCAvLyA9IEVSUl9NTUlBX0NNU0lOVkFMSURURVhUUEFSQQ0KLSAgICAgICAgWkFUMl9DTUVFX1ZBTFVFX0VSUiwgLy8gWkFUMl9DTURfVkFMVUVfRVJSDQotICAgICAgICBaQVQyX0NNRUVfRFVBTENBUkRBRFBUX0VSUiwNCi0gICAgICAgIFpBVDJfQ01FRV9DTURPVkVSRkxPVywgLy8gWkFUMl9DTURfT1ZFUkZMT1cNCi0gICAgICAgIFpBVDJfQ01FRV9EVUFMQ0FSRENJRF9FUlIsIC8vWkFUMl9DTURfRFVBTENBUkRFUlINCi0gICAgfTsNCi0NCi0gICAgaWYoYkRlY1JzbHRUeXBlID09IFpBVDJfTlZGQUlMVVJFX0VSUiAmJiBnX3pBdGlfcHREYXRhLT5iRU1vZGVUeXBlID09IDApDQotICAgIHsNCi0gICAgICAgIGR3RXJyb3JDb2RlW2JEZWNSc2x0VHlwZV0gPSBaX0FQTU1JQV9PUFROT1RBTFdfRVJSOw0KLSAgICB9DQotDQotICAgIGlmKGJEZWNSc2x0VHlwZSA9PSBaQVQyX0NNU05PQ05NQUFDS19FUlIgfHwgYkRlY1JzbHRUeXBlID09IFpBVDJfQ01TSU5WQUxJRFRFWFRQQVJBX0VSUikNCi0gICAgew0KLSAgICAgICAgekF0X0VuY0Vycm9yQ29kZShwYkVycm9yU3RyLCBaQVQyX1NNU19DTk1BLCBkd0Vycm9yQ29kZVtiRGVjUnNsdFR5cGVdKTsNCi0gICAgfQ0KLQ0KLSAgICBpZihiRGVjUnNsdFR5cGUgPD0gWkFUMl9DTUVFX0RVQUxDQVJEQ0lEX0VSUiAmJiBkd0Vycm9yQ29kZVtiRGVjUnNsdFR5cGVdICE9IChEV09SRClaQVQyX0NNRF9JTlZBTElEX1JTTFQpDQotICAgIHsNCi0gICAgICAgIHpBdF9FbmNFcnJvckNvZGUocGJFcnJvclN0ciwgWkFUMl9DRkdfQ01FRSwgZHdFcnJvckNvZGVbYkRlY1JzbHRUeXBlXSk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9DbWREaXJlY3RSZXBseQ0KLSoguabE3MPoyvYgOiDD/MHuveLO9s3quvPWsb3Tu9i4tKOsv8nE3NX9yLejrNKyv8nE3LTtzvMNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9DbWREaXJlY3RSZXBseShUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUsIFRfWkF0Ml9EZWNSc2x0VHlwZSAgYkRlY1JzbHRUeXBlKQ0KLXsNCi0gICAgQ0hBUiBaQVQyX0VOQ19TTVNfSU5QVVRfSU5EX1NUUlsyMF0gPSB7IlxyXG4+ICJ9Ow0KLQ0KLSAgICBpZihiRGVjUnNsdFR5cGUgPT0gWkFUMl9DTURfTk9UX0VORF9SRVBMWSkgDQotICAgIHsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmNtZElucHV0SW5mby5jbWRJbnB1dFN0YXQgPSBaQVQyX1NNU19FRElUOw0KLSAgICAgICAgek9zc19NZW1jcHkoZ196QXRfRW5jQnVmLCBaQVQyX0VOQ19TTVNfSU5QVVRfSU5EX1NUUiwgc3RybGVuKChjb25zdCBjaGFyICopWkFUMl9FTkNfU01TX0lOUFVUX0lORF9TVFIpKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKGJEZWNSc2x0VHlwZSA9PSBaQVQyX0NNRF9SRVBMWV9ESVJFQ1QpDQotICAgIHsNCi0gICAgICAgIC8vINLRvq29q9DFz6K05sjrZ196QXRfRW5jQnVmINbQo6xkbyBub3RoaW5nDQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICB6QXRpX0dldEVycm9yUmVwbHlTdHIoZ196QXRfRW5jQnVmLCBiRGVjUnNsdFR5cGUpOw0KLSAgICB9DQotDQotICAgIC8qIDEsIM2otcCz5c27o6yw/LqsRXJyb3IgLCDWsb3Tu9i4tKOssrvH5cbky/vD/MHuDQotICAgICAgIDIsIMP8we6zrLOko6y7ucO709C/qsq8veLO9qOssrvQ6NKqx+W/1cbky/vD/MHuDQotICAgICAqLw0KLSAgICBpZihiRGVjUnNsdFR5cGUgPT0gWkFUMl9DTURfQ09ORkxJQ1QgfHwgYkRlY1JzbHRUeXBlID09IFpBVDJfQ01EX09WRVJGTE9XKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRGbmMocENobmVsTm9kZS0+aUNobmVsSWQsIChCWVRFICopZ196QXRfRW5jQnVmLCAoV09SRClzdHJsZW4oKGNvbnN0IGNoYXIgKilnX3pBdF9FbmNCdWYpLCBaQVRJMl9DSElORF9BVCk7DQotICAgICAgICB6QXRpX1NlbmRSc3BDbWRTdHIyVHJhY2UocENobmVsTm9kZS0+aUNobmVsSWQsIChXT1JEKXN0cmxlbigoY29uc3QgY2hhciAqKWdfekF0X0VuY0J1ZiksIChDSEFSICopZ196QXRfRW5jQnVmKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEVuY0RhdGEocENobmVsTm9kZSwgKEJZVEUgKilnX3pBdF9FbmNCdWYsIFpBVElfSU5WQUxJRF9NU0dJRCwgTlVMTCk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Qcm9jRXJyb3INCi0qILmmxNzD6Mr2IDogtKbA7cP8we7P+8+iyqew3A0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBDaG5lbE5vZGUgICAgICDNqLXAvdq14w0KLSogICAgICAgICAgICBkd0Vycm9yICAgICAgILTtzvPC6w0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi12b2lkIHpBdGlfUHJvY0Vycm9yKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSwgRFdPUkQgZHdFcnJvckNhdXNlKQ0KLXsNCi0gICAgaWYgKGR3RXJyb3JDYXVzZSA9PSBaX0FQTU1JQV9OVkZBSUxVUkVfRVJSICYmIGdfekF0aV9wdERhdGEtPmJFTW9kZVR5cGUgPT0gMCkNCi0gICAgeyAgICAgDQotICAgICAgICBkd0Vycm9yQ2F1c2UgID0gWl9BUE1NSUFfT1BUTk9UQUxXX0VSUjsgIC8vIDMNCi0gICAgfQ0KLSAgICANCi0gICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICB6QXRfRW5jRXJyb3JDb2RlKGdfekF0X0VuY0J1ZiwgcENobmVsTm9kZS0+Y21kX2lkLCBkd0Vycm9yQ2F1c2UpOw0KLSAgICAgICAgekF0aV9TZW5kRW5jRGF0YShwQ2huZWxOb2RlLCAoQllURSAqKWdfekF0X0VuY0J1ZiwgWkFUSV9JTlZBTElEX01TR0lELCBOVUxMKTsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldERpc3RyaWJ1dGVNc2dJZHgNCi0qILmmxNzD6Mr2IDogu/HIobfWt6LP+8+iz8Kx6g0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIGR3TXNnSWQgICAgICDP+8+iusUNCi0qICAgICAgICAgICAgKE9VVCmjug0KLSogICAgICAgICAgICAgcE1zZ0lkeCAgIDogt9a3os/7z6LK/dfp1tC1xM/CseoNCi0qILe1ILvYINa1o7og1dK1vbe1u9haX1NVQ0MsICDDu9PQ1dK1vbe1u9haX0ZBSUwNCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXREaXN0cmlidXRlTXNnSWR4KERXT1JEIGR3TXNnSWQsIFdPUkQgKnBNc2dJZHgpDQotew0KLSAgICBXT1JEIHdUYWJJZHggPSAwOw0KLSAgICBmb3IgKHdUYWJJZHggPSAwOyB3VGFiSWR4IDwgKHNpemVvZihnX2F0RGlzdHJpYnV0ZU1zZ01hcCkgLyBzaXplb2YoZ19hdERpc3RyaWJ1dGVNc2dNYXBbMF0pKTsgd1RhYklkeCsrKQ0KLSAgICB7DQotICAgICAgICBpZihnX2F0RGlzdHJpYnV0ZU1zZ01hcFt3VGFiSWR4XS5kd01zZ0lkID09IGR3TXNnSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBNc2dJZHggPSB3VGFiSWR4Ow0KLSAgICAgICAgICAgIHJldHVybiBaX1NVQ0M7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFpfRkFJTDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfUHJvY0Rpc3RyaWJ1dGVNc2cNCi0qILmmxNzD6Mr2IDogtKbA7bfWt6LP+8+iDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgd0Rpc3RyaWJ1dGVNc2dJZHg6ICAgICAgz/vPos/CseoNCi0qICAgICAgICAgICAgcGJNc2dCb2R5ICAgICAgICAgICA6ICAgICDP+8+izOUNCi0gKiAgICAgICAgICAgd01zZ0xlbiAgICAgICAgICAgICAgOiAgICAgz/vPorOktsgNCi0qICAgICAgICAgICAgcENobmVsTm9kZSAgICAgICAgICA6ICAgICDNqLXAvdq149a41esNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6ILTtzvPC6w0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLURXT1JEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Qcm9jRGlzdHJpYnV0ZU1zZyhXT1JEIHdEaXN0cmlidXRlTXNnSWR4LCBCWVRFICpwYk1zZ0JvZHksIFdPUkQgd01zZ0xlbiwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsgDQotICAgIHJldHVybiBnX2F0RGlzdHJpYnV0ZU1zZ01hcFt3RGlzdHJpYnV0ZU1zZ0lkeF0ucEhhbmRsZU1zZygoVk9JRCAqKXBiTXNnQm9keSk7ICANCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfUHJvY0Vycm9yDQotKiC5psTcw+jK9iA6ILvxyKHXqreiz/vPos/CseoNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBkd01zZ0lkICAgICAgz/vPorrFDQotKiAgICAgICAgICAgIChPVVQpo7oNCi0qICAgICAgICAgICAgIHBNc2dJZHggICA6ILfWt6LP+8+iyv3X6dbQtcTPwrHqDQotKiC3tSC72CDWtaO6INXStb23tbvYWl9TVUNDLCAgw7vT0NXStb23tbvYWl9GQUlMDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0VHJhbnNtaXRNc2dUYXNrSWQoRFdPUkQgZHdNc2dJZCwgQllURSAqcGJUYXNrSWQpDQotew0KLSAgICBpZih6QXRpX0dldERlc3RUYXNrQnlNc2dJRChkd01zZ0lkLCBwYlRhc2tJZCkpDQotICAgICAgICByZXR1cm4gWl9TVUNDOw0KLSAgICBlbHNlDQotICAgICAgICByZXR1cm4gWl9GQUlMOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Scm9jVHJhbnNtaXRNc2cNCi0qILmmxNzD6Mr2IDogtKbA7bfWt6LP+8+iDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgd0Rpc3RyaWJ1dGVNc2dJZHg6ICAgICAgz/vPos/CseoNCi0qICAgICAgICAgICAgcGJNc2dCb2R5ICAgICAgICAgICA6ICAgICDP+8+izOUNCi0gKiAgICAgICAgICAgd01zZ0xlbiAgICAgICAgICAgICAgOiAgICAgz/vPorOktsgNCi0qICAgICAgICAgICAgcENobmVsTm9kZSAgICAgICAgICA6ICAgICDNqLXAvdq149a41esNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6ICC07c7zwusNCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1EV09SRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUnJvY1RyYW5zbWl0TXNnKERXT1JEIGR3TXNnSWQsIEJZVEUgKnBiTXNnQm9keSwgV09SRCB3TXNnTGVuLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUsICBCWVRFIGJUYXNrSWQpDQotew0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICBpZihkd01zZ0lkID09IE1NSUFfQ0NfRElTX01PREVfUkVRX0VWKSAvKiC0y7SmvMfCvM/s06bKx0NPTU1PTl9DTka1xMfrx/PP+8+iICovDQotICAgIHsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmlFdklkID0gZHdNc2dJZDsNCi0gICAgICAgIGlmKFpBVDJfQ0NfQ0hVUCA9PSBwQ2huZWxOb2RlLT5jbWRfaWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgKihwYk1zZ0JvZHkgKyAxKSA9IDB4ZmY7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgaWYoZHdNc2dJZCA9PSBNTUlBX0NDX0FOU19NT0RFX1JFUV9FVikNCi0gICAgew0KLSAgICAgICAgaWYoKHBiTXNnQm9keSAhPSBaT1NTX05VTEwpICYmICgoKihwYk1zZ0JvZHkgKyAxKSkgPT0gWkFUSTJfSU5WQUxfTU1JQV9JTkRFWCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpfQVBNTUlBX09QVE5PVEFMV19FUlI7DQotICAgICAgICB9DQotICAgIH0NCi0jZW5kaWYNCi0gICAgekF0aV9NYXJrSW5kZXgocGJNc2dCb2R5LCB6QXRpX0NvbnZlcnRUc2tJZFRvU2JNZGwoYlRhc2tJZCkpOw0KLSAgICBpZiAoYlRhc2tJZCA9PSBaX0FUSV9UQVNLSURfQVRJKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfT1BUTk9UQUxXX0VSUjsNCi0gICAgfQ0KLSAgICAvKiNpZm5kZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0gICAgZWxzZSBpZihiVGFza0lkID09IFpfQVRJX1RBU0tJRF9DQ3x8YlRhc2tJZCA9PSBaX0FUSV9UQVNLSURfU1MpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgcmV0dXJuIFpfQVBNTUlBX09QVE5PVEFMV19FUlI7DQotICAgIH0NCi0gICAgI2VuZGlmKi8NCi0gICAgZWxzZSBpZiggWl9TVUNDICE9IHpBdGlfTXNnRm9yd2FyZChkd01zZ0lkLCAoVUlOVDggKilwYk1zZ0JvZHksIHdNc2dMZW4sYlRhc2tJZCkpDQotICAgIHsNCi0gICAgICAgIC8vINeqt6LP+8+io6zKp7DcuvOyu8rNt8XE2rTmo6zU2s3isuPNs9K7ys23xQ0KLSAgICAgICAgcmV0dXJuIFpfQVBNTUlBX09QVE5PVEFMV19FUlI7DQotICAgIH0NCi0gICAgZWxzZSANCi0gICAgew0KLSAgICAgICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi0gICAgfQ0KLX0NCi0NCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tt9a47s/fIC0tLS0tLS0tLS0tLQ0KLQ0KLURXT1JEIHpBdGlfUHJvY0NwYnIoVk9JRCAqcGJNc2dEYXRhKQ0KLXsNCi0gICAgekF0aV9DcGJySGFuZGxlKChUX3pBcE1taWFfQ3BiclNldF9SZXEqKXBiTXNnRGF0YSwwLFpTVE1fU1RPUkFHRV9JRF9QQk1BWCxOVUxMKTsNCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PUkVTVUxUOw0KLX0NCi1EV09SRCB6QXRpX1Byb2NTbXNDbWdsUmVxKFZPSUQgKnBiTXNnRGF0YSkNCi17DQotICAgIHpTdG1fTW1pYVNtc19DbWdsUmVxX1Byb2MoKEJZVEUgKilwYk1zZ0RhdGEsIChXT1JEKXNpemVvZihUX3pBcE1taWFfTGlzdFNtX1JlcSksIChUX3pTdG1fVGFza0lkeClnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotfQ0KLURXT1JEIHpBdGlfUHJvY1BiQWRkVXNlckVuKFZPSUQgKnBiTXNnRGF0YSkNCi17DQotICAgIHpTdG1fTW1pYVBiX0FkZFVzZXJFbl9Qcm9jKChCWVRFICopcGJNc2dEYXRhLCAoV09SRClzaXplb2YoVF9aQXRpX0VtZXJOdW1fUmVxKSwgKFRfelN0bV9UYXNrSWR4KWdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotRFdPUkQgekF0aV9Qcm9jU21zQ21nZFRlc3QoVk9JRCAqcGJNc2dEYXRhKQ0KLXsNCi0gICAgelN0bV9BdGlTbXNfQ21nZFRlc3RfUHJvYygoQllURSAqKXBiTXNnRGF0YSwgKFdPUkQpc2l6ZW9mKFRfekFwTW1pYV9MaXN0U21fUmVxKSwgKFRfelN0bV9UYXNrSWR4KWdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotDQotRFdPUkQgekF0aV9Qcm9jRHRtZlJlcShWT0lEKnBiTXNnQm9keSkNCi17DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotICAgIFRfWkF0aV9EdG1mX1JlcSAgICAgICAgICAgICpwdFZ0c1JlcSA9IChUX1pBdGlfRHRtZl9SZXEqKXBiTXNnQm9keTsgLy9wYk1zZ0JvZHkgDQotICAgIFRfekRldl9BdE1lbV9NbWlhX1ByaXZhdGVNZW0gdEF0RGF0YSA9IHswfTsNCi0gICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuYkN1cm51bSA9IDA7DQotICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnREdG1mLmJUb3RhbE51bSA9IHB0VnRzUmVxLT5iRHRtZkxlbjsNCi0gICAgek9zc19NZW1jcHkoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuYkR0bWYsIHB0VnRzUmVxLT5iRHRtZiwgcHRWdHNSZXEtPmJEdG1mTGVuKTsNCi0gDQotICAgIGlmKHB0VnRzUmVxLT5iRHVyYXRpb25GZyA9PSBaX0FQTU1JQV9JTlZBTElEKQ0KLSAgICB7DQotICAgICAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9NbWlhUHJ2dE1lbSwgMCwgKFBCWVRFKSZ0QXREYXRhLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuZHdEdXJhdGlvbiA9IHRBdERhdGEuZHdEdXJhdGlvbjsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnREdG1mLmR3RHVyYXRpb24gPSBwdFZ0c1JlcS0+ZHdEdXJhdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gekF0aV9IYW5kbGVWdHNGb3JDbWNjKHB0VnRzUmVxLT5iU3JjSW5kZXgsIHB0VnRzUmVxLT5pRGVzdEluZGV4KTsNCi0jZWxzZQ0KLSAgICByZXR1cm4gWl9BUE1NSUFfT1BUTk9UQUxXX0VSUjsNCi0jZW5kaWYNCi19DQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLbfWuO7P3y0tLS0tLS0tLS0tLS0tLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1Byb2NDbWRFbmQNCi0qILmmxNzD6Mr2o7ogtKbA7cP8we7Kx7fxyse38b3hyvgNCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIHJlY3ZDbWRJbmQgICAgICAgytW1vUFUw/zB7rXEveG5uczlDQotKiAgICAgICAgICAgIGNobmVsTm9kZSAgICAgICAgzai1wL3hteMNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaYvyqew3A0KLSogxuTL/Mu1w/ejuiCxo7TmuvPU8rvhwaK/zL3iwusNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Qcm9jQ21kRW5kKFRfWkF0aV9CdWZmZXIgICpwdEJ1ZmYpDQotew0KLSAgICBVSU5UMTYgaSA9IDA7DQotICAgIFVJTlQxNiBiVmFsaWROdW0gPSAwOw0KLQ0KLSAgICBCWVRFICpwYlN0ckFUQ21kID0gKEJZVEUgKil6QXRpX0dldFVCKFpBVF9MT05HX0NNRF9MRU4pOw0KLQ0KLSAgICB3aGlsZSAocHRCdWZmLT5hcnJEYXRhW2ldID09IGdfekF0aV9wdERhdGEtPmJDdXJTM1ZhbHVlIHx8IHB0QnVmZi0+YXJyRGF0YVtpXSA9PSBnX3pBdGlfcHREYXRhLT5iQ3VyUzRWYWx1ZSkNCi0gICAgew0KLSAgICAgICAgaSsrOw0KLSAgICB9DQotICAgIHdoaWxlKGkgPCBwdEJ1ZmYtPmlMZW5ndGgpDQotICAgIHsNCi0gICAgICAgIGlmKHB0QnVmZi0+YXJyRGF0YVtpXSA9PSBnX3pBdGlfcHREYXRhLT5iQ3VyUzVWYWx1ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihiVmFsaWROdW0gPiAwKQ0KLSAgICAgICAgICAgICAgICBwYlN0ckFUQ21kWy0tYlZhbGlkTnVtXSA9IFpBVDJfTlVMTF9DSEFSOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSAgaWYoKHB0QnVmZi0+YXJyRGF0YVtpXSA9PSBnX3pBdGlfcHREYXRhLT5iQ3VyUzNWYWx1ZSkgfHwgKHB0QnVmZi0+YXJyRGF0YVtpXSA9PSBnX3pBdGlfcHREYXRhLT5iQ3VyUzRWYWx1ZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHRCdWZmLT5pTGVuZ3RoID0gYlZhbGlkTnVtOw0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHB0QnVmZi0+YXJyRGF0YSwgcGJTdHJBVENtZCwgYlZhbGlkTnVtKTsvKiC9q8rVtb21xGFyckRhdGGxo7Tmtb27urTmICovDQotICAgICAgICAgICAgcHRCdWZmLT5hcnJEYXRhW2JWYWxpZE51bV0gPSBaQVQyX05VTExfQ0hBUjsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnBiU3RyQVRDbWQpOw0KLSAgICAgICAgICAgIHJldHVybiBaX1NVQ0M7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChwdEJ1ZmYtPmFyckRhdGFbaV0gIT0gZ196QXRpX3B0RGF0YS0+YkN1clM0VmFsdWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgcGJTdHJBVENtZFtiVmFsaWROdW0rK10gPSBwdEJ1ZmYtPmFyckRhdGFbaV07DQotICAgICAgICB9DQotDQotICAgICAgICBpKys7DQotICAgIH0NCi0gICAgDQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcGJTdHJBVENtZCk7DQotICAgIHJldHVybiBaX0ZBSUw7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1Byb2NTbXNEYXRhRW5kDQotKiC5psTcw+jK9qO6ILSmwO22zM/7z6LE2sjdyse38b3hyvjKx7fxyse38b3hyvgNCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIHJlY3ZDbWRJbmQgICAgICAgytW1vUFUw/zB7rXEveG5uczlDQotKiAgICAgICAgICAgIGNobmVsTm9kZSAgICAgICAgzai1wL3hteMNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaYvyqew3A0KLSogxuTL/Mu1w/ejuiCxo7TmuvPU8rvhwaK/zL3iwusNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIHpBdGlfUHJvY1Ntc0RhdGFFbmQoVF9aQXRpX0J1ZmZlciAgKnB0QnVmZikNCi17DQotICAgIFVJTlQxNiBpID0gMDsNCi0gICAgVUlOVDE2IGJWYWxpZE51bSA9IDA7DQotICAgIA0KLSAgICBCWVRFICpwYlNNU0RhdGEgPSAoQllURSAqKXpBdGlfR2V0VUIoWkFUX0xPTkdfQ01EX0xFTik7DQotICAgIA0KLSAgICB3aGlsZShpIDwgcHRCdWZmLT5pTGVuZ3RoKQ0KLSAgICB7DQotICAgICAgICBpZihwdEJ1ZmYtPmFyckRhdGFbaV0gPT0gZ196QXRpX3B0RGF0YS0+YkN1clM1VmFsdWUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoYlZhbGlkTnVtID4gMCkNCi0gICAgICAgICAgICAgICAgcGJTTVNEYXRhWy0tYlZhbGlkTnVtXSA9IFpBVDJfTlVMTF9DSEFSOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSAgaWYocHRCdWZmLT5hcnJEYXRhW2ldID09IFpBVDJfRVNDX0NIQVIgfHwgcHRCdWZmLT5hcnJEYXRhW2ldID09IFpBVDJfQ1RSTF9aX0NIQVIpIA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmICgocHRCdWZmLT5hcnJEYXRhW2ldID09IFpBVDJfRVNDX0NIQVIpICYmIChnX3pBdGlfcHREYXRhLT5wdENtZElucHV0SW5mbyAhPSBOVUxMKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdfekF0aV9wdERhdGEtPnB0Q21kSW5wdXRJbmZvLT5iU21zRXNjID0gWl9WQUxJRDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcHRCdWZmLT5pTGVuZ3RoID0gYlZhbGlkTnVtOw0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHB0QnVmZi0+YXJyRGF0YSwgcGJTTVNEYXRhLCBiVmFsaWROdW0pOyAgIC8qIL2rytW1vbXEYXJyRGF0YbGjtOa1vbu6tOYgKi8NCi0gICAgICAgICAgICBwdEJ1ZmYtPmFyckRhdGFbYlZhbGlkTnVtXSA9IFpBVDJfTlVMTF9DSEFSOw0KLSAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcGJTTVNEYXRhKTsNCi0gICAgICAgICAgICByZXR1cm4gWl9TVUNDOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAocHRCdWZmLT5hcnJEYXRhW2ldID09IGdfekF0aV9wdERhdGEtPmJDdXJTM1ZhbHVlIHx8IHB0QnVmZi0+YXJyRGF0YVtpXSA9PSBaQVQyX05VTExfQ0hBUikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyBkbyBOb3RoaW5nICwgvLTM+Ln9IHMzDQotICAgICAgICB9DQotICAgICAgICBlbHNlIA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBiU01TRGF0YVtiVmFsaWROdW0rK10gPSBwdEJ1ZmYtPmFyckRhdGFbaV07DQotICAgICAgICB9DQotICAgICAgICBpKys7DQotICAgIH0NCi0gICAgekF0aV9SZXRVQigoVk9JRCoqKSZwYlNNU0RhdGEpOw0KLSAgICByZXR1cm4gWl9GQUlMOw0KLX0NCi0NCi0NCi1WT0lEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9QdXREYXRhVG9DaG5lbChjb25zdCBUX1pBdGlfQ2hhbm5lbERhdGFCdWYgKnJlY3ZDbWRJbmQsIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIC8vekF0aV9TZW5kUmVjdkNtZFN0cjJUcmFjZShyZWN2Q21kSW5kLT5pQ2hhbm5lbCwgcmVjdkNtZEluZC0+aURhdGFMZW4sIChDSEFSICopcmVjdkNtZEluZC0+c3RyRGF0YSk7DQotICAgIA0KLSAgICBpZiAocmVjdkNtZEluZC0+aURhdGFMZW4gKyBwQ2huZWxOb2RlLT5hdEJ1ZmYuaUxlbmd0aCA+PSBaQVRJMl9CVUZGRVJfTEVOR1RIKQ0KLSAgICB7DQotICAgICAgICAvKiDI9LOss/a7urTms6S2yNTyx+W/1bu6tOYgKi8NCi0gICAgICAgIHpPc3NfTWVtc2V0KHBDaG5lbE5vZGUtPmF0QnVmZi5hcnJEYXRhLCAwLCBaQVRJMl9CVUZGRVJfTEVOR1RIKTsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmF0QnVmZi5pTGVuZ3RoID0gMDsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmNoZWNrQXRPdXRMaW1pdCA9IFRSVUU7DQotICAgIH0NCi0NCi0gICAgLyogU1RFUDAwMi3M7bzTtb221NOmzai1wLXEu7qz5cf4ICovICAgIA0KLSAgICB6T3NzX01lbWNweShwQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YSArIHBDaG5lbE5vZGUtPmF0QnVmZi5pTGVuZ3RoLCAoY2hhciAqKXJlY3ZDbWRJbmQtPnN0ckRhdGEsIHJlY3ZDbWRJbmQtPmlEYXRhTGVuKTsvKiC9q8rVtb21xGFyckRhdGGxo7Tmtb27urTmICovDQotICAgIHBDaG5lbE5vZGUtPmF0QnVmZi5pTGVuZ3RoID0gcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggKyByZWN2Q21kSW5kLT5pRGF0YUxlbjsgLyogs6S2yLzTyc8gKi8NCi0gICAgLy9wQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YVtwQ2huZWxOb2RlLT5hdEJ1ZmYuaUxlbmd0aF0gPSAwOyAgICAgICAgLyq1sWF0QnVmZi5pTGVuZ3RoyscxMDI0yrHUvb3no6y0y7SmsrvU2bzTXDAsuvPD5rGjtObK/b7dyrG74bzTKi8NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Qcm9jQXRCdWZMaW1pdA0KLSoguabE3MPoyvajuiC0psDtQVQgILu6s+XH+Mrcz97H6b/2DQotKiCyzsr9y7XD96O6IChJTimjuiDO3g0KLSogICAgICAgICAgICByZWN2Q21kSW5kICAgICAgIMrVtb1BVMP8we61xL3hubnM5Q0KLSogt7Ugu9gg1rUgOiCzybmmL8qnsNwNCi0qIMbky/zLtcP3o7ogsaO05rrz1PK74cGiv8y94sLrDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUHJvY0F0QnVmTGltaXQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgaWYocENobmVsTm9kZS0+Y2hlY2tBdE91dExpbWl0KQ0KLSAgICB7DQotICAgICAgICAvKiDP+8+iu/HIobOss6SjrLfWxeTWsb3Tt7W72LTtzvO94bn7ICovDQotICAgICAgICB6QXRpX0NtZERpcmVjdFJlcGx5KHBDaG5lbE5vZGUsIFpBVDJfQ01EX09WRVJGTE9XKTsNCi0NCi0gICAgICAgICB6T3NzX01lbXNldChwQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YSwgMCwgWkFUSTJfQlVGRkVSX0xFTkdUSCk7DQotICAgICAgICAgcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggPSAwOw0KLSAgICAgICAgIHBDaG5lbE5vZGUtPmNoZWNrQXRPdXRMaW1pdCA9IEZBTFNFOw0KLQ0KLSAgICAgICAgIHJldHVybiBaX0ZBSUw7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpfU1VDQzsNCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfU3RvcmVBdENtZA0KLSoguabE3MPoyvajuiC9q8rVtb21xEFUw/zB7rGjtOa1vUFUSbXEu7q05sDvw+YNCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIHJlY3ZDbWRJbmQgICAgICAgytW1vUFUw/zB7rXEveG5uczlDQotKiAgICAgICAgICAgIGNobmVsTm9kZSAgICAgICAgzai1wL3hteMNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaYvyqew3A0KLSogxuTL/Mu1w/ejuiCxo7TmuvPU8rvhwaK/zL3iwusNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9TdG9yZUF0Q21kKGNvbnN0IFRfWkF0aV9DaGFubmVsRGF0YUJ1ZiAqcmVjdkNtZEluZCwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgQllURSAqIHBBVERUU3RyID0gTlVMTDsNCi0gICAgekF0aV9QdXREYXRhVG9DaG5lbChyZWN2Q21kSW5kLCBwQ2huZWxOb2RlKTsNCi0NCi0gICAgaWYoekF0aV9Qcm9jQ21kRW5kKCZwQ2huZWxOb2RlLT5hdEJ1ZmYpID09IFpfRkFJTCkNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsgLy+2qM67zsrM4tPDo6zD/MHuw7vT0L3hyvi3+w0KLSAgICAgICAgcmV0dXJuIFpfRkFJTDsNCi0gICAgfQ0KLQ0KLSAgICBpZih6QXRpX1Byb2NBdEJ1ZkxpbWl0KHBDaG5lbE5vZGUpID09IFpfRkFJTCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfRkFJTDsNCi0gICAgfQ0KLQ0KLSAgICAvLyC0psDtQVREVA0KLSAgICBwQVREVFN0ciA9IChCWVRFICopc3Ryc3RyKChjaGFyICopcENobmVsTm9kZS0+YXRCdWZmLmFyckRhdGEsICJBVERUKiIpOw0KLSAgICBpZihwQVREVFN0ciAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBwQVREVFN0ciArPSAzOyAvLyAquvPD5tfWvdq1xM671sMNCi0gICAgICAgIHdoaWxlKCpwQVREVFN0cisrICE9ICdcMCcpDQotICAgICAgICAgICAgKihwQVREVFN0ciAtMSk9ICpwQVREVFN0cjsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmF0QnVmZi5pTGVuZ3RoIC09IDE7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpfU1VDQzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfU3RvcmVTbXNEYXRhDQotKiC5psTcw+jK9qO6IL2rytW1vbXEtszP+8+ixNrI3bGjtOa1vUFUSbXEu7q05sDvw+YNCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIHJlY3ZDbWRJbmQgICAgICAgytW1vUFUw/zB7rXEveG5uczlDQotKiAgICAgICAgICAgIGNobmVsTm9kZSAgICAgICAgzai1wL3hteMNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaYvyqew3A0KLSogxuTL/Mu1w/ejuiCxo7TmuvPU8rvhwaK/zL3iwusNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIHpBdGlfU3RvcmVTbXNEYXRhKGNvbnN0IFRfWkF0aV9DaGFubmVsRGF0YUJ1ZiAqcmVjdkNtZEluZCwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgekF0aV9QdXREYXRhVG9DaG5lbChyZWN2Q21kSW5kLCBwQ2huZWxOb2RlKTsNCi0gICAgaWYoekF0aV9Qcm9jU21zRGF0YUVuZCgmcENobmVsTm9kZS0+YXRCdWZmKSA9PSBaX0ZBSUwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0ZBSUw7DQotICAgIH0NCi0gICAgcmV0dXJuIHpBdGlfUHJvY0F0QnVmTGltaXQocENobmVsTm9kZSk7DQotfQ0KLQ0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX0luaXRfQ21kSW5mbyhUX1pBdDJfQ21kSW5wdXRJbmZvICogcENtZElucHV0SW5mbykNCi17DQotICAgIHBDbWRJbnB1dEluZm8tPmNtZElucHV0U3RhdCA9IFpBVDJfQVRDTUQ7DQotICAgIHBDbWRJbnB1dEluZm8tPmlTbXNDckNudCA9IDA7DQotICAgIHBDbWRJbnB1dEluZm8tPnNtc0lucHV0VHlwZSA9IFpBVDJfTk9fU01TX0lOUFVUOw0KLSAgICBwQ21kSW5wdXRJbmZvLT5wU21zSW5wdXRNc2cgPSBOVUxMOw0KLSAgICBwQ21kSW5wdXRJbmZvLT5iU21zRXNjID0gWl9JTlZBTElEOw0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldENtZExlbg0KLSoguabE3MPoyvYgOiC78cihw/zB7rSus6S2yLrNt9a6xc671sMNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwYlNyY1N0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIHB3U3JjU3RyTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICBwcENtZEVuZCAgILfWusXOu9bDDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiANCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRDbWRMZW4oQllURSAqcGJTcmNTdHIsIFdPUkQgKnB3U3JjU3RyTGVuLCBCWVRFICoqcHBDbWRFbmQpDQotew0KLSAgICBCWVRFICpwU3RyU3RhcnQgICAgPSBwYlNyY1N0cjsNCi0gICAgQllURSAqcFN0ckVuZCAgICAgID0gTlVMTDsNCi0gICAgQllURSAqcFN0clBvcyAgICAgID0gTlVMTDsNCi0gICAgV09SRCB3Q2hhck51bSAgICAgID0gMDsNCi0gICAgQllURSBiQ291bnQgICAgICAgID0gMDsNCi0gICAgcFN0ckVuZCA9IChCWVRFICopc3Ryc3RyKChjaGFyICopcGJTcmNTdHIsICI7Iik7DQotICAgICpwcENtZEVuZCA9IHBTdHJFbmQ7DQotDQotICAgIHdoaWxlIChwU3RyRW5kICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIGJDb3VudCA9IDA7DQotICAgICAgICBwU3RyUG9zID0gKEJZVEUgKilzdHJzdHIoKGNoYXIgKilwU3RyU3RhcnQsICJcIiIpOw0KLSAgICAgICAgaWYgKChwU3RyUG9zID09IE5VTEwpIHx8KHBTdHJQb3MgPiBwU3RyRW5kKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAqcHdTcmNTdHJMZW4gPSAoV09SRCkocFN0ckVuZCAtIHBiU3JjU3RyKTsNCi0gICAgICAgICAgICByZXR1cm4gOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yICh3Q2hhck51bT0wOyB3Q2hhck51bSA8IHBTdHJFbmQgLSBwU3RyUG9zOyB3Q2hhck51bSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChwU3RyUG9zW3dDaGFyTnVtXSA9PSAnXCInKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYkNvdW50Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKChiQ291bnQgJSAyKSAhPSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBTdHJTdGFydCA9IHBTdHJFbmQ7DQotICAgICAgICAgICAgcFN0clBvcyA9IChCWVRFICopc3Ryc3RyKChjaGFyICopcFN0clN0YXJ0LCAiXCIiKTsNCi0gICAgICAgICAgICBpZiAocFN0clBvcyA9PSBOVUxMKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKnB3U3JjU3RyTGVuID0gKFdPUkQpKHBTdHJFbmQgLSBwYlNyY1N0cik7DQotICAgICAgICAgICAgICAgIHJldHVybiA7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBTdHJTdGFydCA9IHBTdHJQb3MgKyAxOw0KLSAgICAgICAgICAgIHBTdHJFbmQgPSAoQllURSAqKXN0cnN0cigoY2hhciAqKXBTdHJTdGFydCwgIjsiKTsNCi0gICAgICAgICAgICAqcHBDbWRFbmQgPSBwU3RyRW5kOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICpwd1NyY1N0ckxlbiA9IChXT1JEKShwU3RyRW5kIC0gcGJTcmNTdHIpOw0KLSAgICAgICAgICAgIHJldHVybiA7DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgDQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0Q21kU3RyDQotKiC5psTcw+jK9iA6INPDOyC21LbgzPXD/MHuvfjQ0LfWuO4NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogWl9TVUNDIKGiDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Q21kU3RyKEJZVEUgKiBwYk9uZUNtZFN0ciwgVF9aQXRpX0J1ZmZlciAgKnB0QnVmZiwgV09SRCAqIHB3T2Zmc2V0KQ0KLXsNCi0gICAgQllURSAqIHBDbWRTdGFydCAgICAgPSBwdEJ1ZmYtPmFyckRhdGErKCpwd09mZnNldCk7DQotICAgIEJZVEUgKiBwQ21kRW5kICAgICAgID0gTlVMTDsNCi0gICAgV09SRCAgd0NtZExlbiAgICAgICA9IDA7DQotDQotICAgIHdDbWRMZW4gPSBwdEJ1ZmYtPmlMZW5ndGggLSAoKnB3T2Zmc2V0KTsNCi0gICAgekF0aV9HZXRDbWRMZW4ocENtZFN0YXJ0LCAmd0NtZExlbiwgJnBDbWRFbmQpOw0KLQ0KLSAgICBpZihwQ21kRW5kID09IE5VTEwpDQotICAgIHsNCi0gICAgICAgIC8qINfuuvPSu8z1w/zB7iovDQotICAgICAgICB3Q21kTGVuID0gcHRCdWZmLT5pTGVuZ3RoIC0gKCpwd09mZnNldCk7DQotICAgICAgICB6T3NzX01lbWNweShwYk9uZUNtZFN0ciwgcENtZFN0YXJ0LCB3Q21kTGVuKTsNCi0gICAgfQ0KLSAgICBlbHNlIA0KLSAgICB7DQotICAgICAgICAvKiC1sbXa0ru49tfWt/vKxyI7IiDKsSwgv9XD/MHuLLC01dUiQVQiICDD/MHutKbA7SovDQotICAgICAgICBpZih3Q21kTGVuID4gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6T3NzX01lbWNweShwYk9uZUNtZFN0ciwgcENtZFN0YXJ0LCB3Q21kTGVuKTsNCi0gICAgICAgICAgICBwYk9uZUNtZFN0cltaQVRfTE9OR19DTURfTEVOIC0gM10gPSAnXDAnOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQVREIG9yIEFUK1pSRURJQUwgw/zB7rrzv8nS1Lj60ru49jsgusUgICAgIGZvciBWb0xURQ0KLSAgICAgICAgaWYocENtZEVuZFsxXSA9PSAnOycgfHwgcENtZEVuZFsxXSA9PSAnXDAnKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHBiT25lQ21kU3RyWzBdID09ICdEJyB8fCBzdHJzdHIoKGNoYXIgKilwYk9uZUNtZFN0ciwgIlpSRURJQUwiKSkgLy8gLi4uLtT2vNPF0LbPo6yywbP9uvPQ+MP8we4NCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHBiT25lQ21kU3RyW3dDbWRMZW4rK10gPSAnOyc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAqKHBiT25lQ21kU3RyICsgd0NtZExlbikgPSAnXDAnOw0KLSAgICAqcHdPZmZzZXQgKz0gd0NtZExlbisxOw0KLSAgICByZXR1cm47DQotfQ0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1NraXBMYXN0Q29tbWEoQllURSAqcGJBdENtZCkNCi17DQotICAgIFdPUkQgd0NtZFN0ckxlbiA9IChXT1JEKXN0cmxlbigoY29uc3QgY2hhciAqKXBiQXRDbWQpOw0KLSAgICBXT1JEIHdMZW4gPSB3Q21kU3RyTGVuOw0KLQ0KLSAgICBmb3IgKHdMZW4gPSB3Q21kU3RyTGVuOyB3TGVuID4gMDsgd0xlbi0tKQ0KLSAgICB7DQotICAgICAgICBpZiAoKihwYkF0Q21kICsgd0xlbikgPT0gJ1wwJyAmJiAoKihwYkF0Q21kICsgd0xlbiAtIDEpID09ICcsJykpDQotICAgICAgICB7DQotICAgICAgICAgICAgKihwYkF0Q21kICsgd0xlbiAtIDEpID0gJ1wwJzsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0RlcGFydEF0Q21kDQotKiC5psTcw+jK9iA6ILfWwOvD/MHuDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yCANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfRGVwYXJ0QXRDbWQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgQllURSAqcGJBdENtZCA9IChCWVRFICopekF0aV9HZXRVQihaQVRfTE9OR19DTURfTEVOKTsNCi0gICAgV09SRCB3T2Zmc2V0ICAgICAgICAgICA9IDA7ICAgICAgIC8vIM/gttTT2nBDaG5lbE5vZGUtPmF0QnVmZi5hcnJEYXRhIL+qzbe1xMar0sbBv6Ost9bA69fWt/u0rrXEv6rKvM671sMNCi0gICAgc3RyY3B5KChjaGFyKilwYkF0Q21kLCAiQVQiKTsvKrfWwOu687XEw7/M9cP8we7HsLa809AiQVQiIMew17oqLw0KLSAgICANCi0gICAgLy8gz8K3orXEw/zB7rSu06a4w9LUIkFUIr+qzbejrLfx1PKxqLTtDQotICAgIGlmKFpBVDJfVVBDQVNFKHBDaG5lbE5vZGUtPmF0QnVmZi5hcnJEYXRhWzBdKSA9PSAnQScgJiYgWkFUMl9VUENBU0UocENobmVsTm9kZS0+YXRCdWZmLmFyckRhdGFbMV0pID09ICdUJykNCi0gICAgew0KLSAgICAgICAgd09mZnNldCArPSAyOw0KLSAgICAgICAgaWYocENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggPT0gMikgLy8gtaUiQVQiIMP8we4NCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX0FkZE9uZUNtZChwQ2huZWxOb2RlLCBwYkF0Q21kKTsgDQotICAgICAgICAgICAgcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggPSAwOw0KLSAgICAgICAgICAgIHpPc3NfTWVtc2V0KHBDaG5lbE5vZGUtPmF0QnVmZi5hcnJEYXRhLCAwLCBaQVRJMl9CVUZGRVJfTEVOR1RIKTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnBiQXRDbWQpOw0KLSAgICAgICAgICAgIHJldHVybiBaX1NVQ0M7DQotICAgICAgICB9DQotDQotICAgICAgICB3aGlsZSh3T2Zmc2V0IDwgcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGgpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9HZXRDbWRTdHIocGJBdENtZCsyLCAmKHBDaG5lbE5vZGUtPmF0QnVmZiksICZ3T2Zmc2V0KTsNCi0gICAgICAgICAgICB6QXRpX1NraXBMYXN0Q29tbWEocGJBdENtZCk7DQotICAgICAgICAgICAgekF0aV9BZGRPbmVDbWQocENobmVsTm9kZSwgcGJBdENtZCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwQ2huZWxOb2RlLT5hdEJ1ZmYuaUxlbmd0aCA9IDA7DQotICAgICAgICB6T3NzX01lbXNldChwQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YSwgMCwgWkFUSTJfQlVGRkVSX0xFTkdUSCk7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnBiQXRDbWQpOw0KLSAgICAgICAgcmV0dXJuIFpfU1VDQzsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHpBdGlfQ21kRGlyZWN0UmVwbHkocENobmVsTm9kZSwgWkFUMl9DTURfU1lOVEFYX0VSUik7DQotICAgICAgICANCi0gICAgICAgIHBDaG5lbE5vZGUtPmF0QnVmZi5pTGVuZ3RoID0gMDsNCi0gICAgICAgIHpPc3NfTWVtc2V0KHBDaG5lbE5vZGUtPmF0QnVmZi5hcnJEYXRhLCAwLCBaQVRJMl9CVUZGRVJfTEVOR1RIKTsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcGJBdENtZCk7DQotICAgICAgICByZXR1cm4gWl9GQUlMOw0KLSAgICB9DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRfSXNBYm9ydENtZE1zZw0KLSoguabE3MPoyvYgOiDF0LbPyse38crHv8nW0LbPz/vPog0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIENtZElkIDogICAgICAgDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgekF0aV9Jc0Fib3J0Q21kTXNnKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIFRfWkF0Ml9DbWRJZFR5cGUgQ21kSWQgPSBwQ2huZWxOb2RlLT5jbWRfaWQ7DQotICAgIGlmICgoWkFUMl9NTV9DT1BTID09IENtZElkKSB8fCAoWkFUMl9DQ19EID09IENtZElkKSB8fCAoWkFUMl9DQ19BID09IENtZElkKSB8fCAoWkFUMl9TTV9EID09IENtZElkKSANCi0gICAgICAgIHx8IChaQVQyX1NNX0EgPT0gQ21kSWQpIHx8IChaQVQyX1NNX0NHQUNUID09IENtZElkKSB8fCAoWkFUMl9TTV9DR0RBVEEgPT0gQ21kSWQpIA0KLSAgICAgICAgfHwgKFpBVDJfU01fQ0dBTlMgPT0gQ21kSWQpIHx8IChaQVQyX1NNU19DTUdTID09IENtZElkKSB8fCAoWkFUMl9TTVNfQ01HQyA9PSBDbWRJZCkgDQotICAgICAgICB8fCAoWkFUMl9TTVNfQ01TUyA9PSBDbWRJZCkgfHwgKFpBVDJfU1NfQ0NXQSA9PSBDbWRJZHx8WkFUMl9TTVNfWk1HUyA9PSBDbWRJZCkNCi0gICAgICAgIHx8IChaQVQyX0xURV9aR0FDVD09IENtZElkKSB8fCAoWkFUMl9NTV9CR0xURVBMTU4gPT0gQ21kSWR8fFpBVDJfU01TX1NNUlM9PUNtZElkKQ0KLSAgICAgICAgfHwgKFpBVDJfU1NfQ0xDSyA9PSBDbWRJZCAmJiBwQ2huZWxOb2RlLT5pRXZJZCA9PSBBVElfRElTVFJJQlVURV9GVU5DX0NMQ0tfU0VUX1JFUV9FVikNCi0gICAgICAgIHx8IChaQVQyX01NX1pQTE1OQkFORD09IENtZElkKSB8fCAoWkFUMl9NTV9aTkNFTExJTkZPPT0gQ21kSWQpIHx8IChaQVQyX01NX1pDT1BTPT0gQ21kSWQpDQotICAgICAgICB8fCAoWkFUMl9NTV9aU0NBTiA9PSBDbWRJZCkgfHwgKFpBVDJfTU1fWlNDSVNDQU4gPT0gQ21kSWQpIHx8IChaQVQyX01NX1pORUNRID09IENtZElkKSkNCi0gICAgew0KLSAgICAgICAgcENobmVsTm9kZS0+aUV2SWQgPSBaQVRJMl9JTlZBTF9FVklEOyAvKiC7udStICovDQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9BdENtZEFib3J0UmVxDQotKiC5psTcw+jK9iA6INbQts/P+8+itKbA7aOssrvU2b340NC31reio6y1pbbAtKbA7Q0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIENtZElkIDogICAgICAgDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9BdENtZEFib3J0UmVxKFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIEJZVEUgYkRlc01kbCA9IDB4RkY7DQotICAgIERXT1JEIGJBYm9ydE1zZ0luZm8gW11bMl0gPSB7DQotICAgICAgICB7TU1JQV9DQ19BQk9SVF9SRVFfRVYsICAgICAgICAgWl9BVElfVEFTS0lEX0NDfSwgICAgIC8vWl9QU01ETF9DQyAxDQotICAgICAgICB7TU1JQV9TTVNfQUJPUlRfTU9fUkVRX0VWLCAgICAgWl9BVElfVEFTS0lEX1NNU30sICAgLy8gWl9QU01ETF9TTVMgMg0KLSAgICAgICAge01NSUFfU1NfQUJPUlRfUkVRX0VWLCAgICAgICAgIFpfQVRJX1RBU0tJRF9TU30sICAgICAvLyBaX1BTTURMX1NTIDMNCi0gICAgICAgIHtNTUlBX1NNX0FCT1JUX1JFUV9FViwgICAgICAgICBaX0FUSV9UQVNLSURfU019LCAgICAvLyBaX1BTTURMX1NNIDQNCi0gICAgICAgIHtNTUlBX1VNTV9BQk9SVF9SRVFfRVYsICAgICAgICBaX0FUSV9UQVNLSURfVU1NfSwgIC8vIFpfUFNNRExfVU1NIDUNCi0gICAgICAgIHtNTUlBX1NNX0FCT1JUX1JFUV9FViwgICAgICAgICBaX0FUSV9UQVNLSURfRVNNfSwgIC8vIFpfUFNNRExfRVNNIDYNCi0gICAgfTsNCi0NCi0gICAgVF96QXBNbWlhX0Fib3J0X1JlcSAgKnB0QXBSZXEgICA9IChUX3pBcE1taWFfQWJvcnRfUmVxKil6QXRpX0dldFVCKHNpemVvZihUX3pBcE1taWFfQWJvcnRfUmVxKSk7DQotICAgIHB0QXBSZXEtPmJTcmNJbmRleCAgPSBwQ2huZWxOb2RlLT5pU3JjSW5kZXg7DQotICAgIHB0QXBSZXEtPmJEZXNJbmRleCA9IHBDaG5lbE5vZGUtPmlEZXN0SW5kZXg7DQotDQotICAgIGlmICgweGZmID09IHB0QXBSZXEtPmJEZXNJbmRleCkNCi0gICAgew0KLSAgICAgICAgaWYocENobmVsTm9kZS0+Y21kX2lkID09IFpBVDJfU01TX0NNU1MgJiYgZ196QXRpX3B0RGF0YS0+YWJDaE1kbFRhYmxlW3B0QXBSZXEtPmJTcmNJbmRleF0gIT0gWl9QU01ETF9TTVMpDQotICAgICAgICB7DQotICAgICAgICAgICAgZ196QXRpX3B0RGF0YS0+YWJDaE1kbFRhYmxlW3B0QXBSZXEtPmJTcmNJbmRleF0gPSBaX1BTTURMX1BCOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYkRlc01kbCA9IGdfekF0aV9wdERhdGEtPmFiQ2hNZGxUYWJsZVtwdEFwUmVxLT5iU3JjSW5kZXhdOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgYkRlc01kbCAgID0gKHB0QXBSZXEtPmJEZXNJbmRleCAmIDB4ZjApID4+IDQ7DQotICAgIH0NCi0NCi0gICAgaWYoYkRlc01kbCA8IFpfUFNNRExfQ0MgfHwgYkRlc01kbCA+IFpfUFNNRExfRVNNKQ0KLSAgICB7DQotICAgICAgICAvLyCyu9f2xuTL+7SmwO0NCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0QXBSZXEpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgLy8gyqew3LrzxNq05tTaekF0aV9Nc2dTZW5kxNrKzbfFDQotICAgICAgICB6QXRpX01zZ1NlbmQoYkFib3J0TXNnSW5mb1tiRGVzTWRsLTFdWzBdLCAgKFBCWVRFKXB0QXBSZXEsIHNpemVvZihUX3pBcE1taWFfQWJvcnRfUmVxKSwgKEJZVEUpIGJBYm9ydE1zZ0luZm9bYkRlc01kbC0xXVsxXSk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Qcm9jQ2huZWxDb25mbGljdA0KLSoguabE3MPoyvYgOiDNqLXAs+XNu7SmwO0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfUHJvY0NobmVsQ29uZmxpY3QoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgLyogtuDM9cP8we6z5c27tKbA7dPQzsrM4qOs1rG907vYuLQ2MDAwLCANCi0gICAgICAgILWlzPXD/MHu1tC3x7/J1tC2z8P8we6jrNaxvdO72Li0NjAwMCwNCi0gICAgICAgILWlzPXD/MHu1tC/ydbQts/D/MHuo6y3osbw1tC2z8frx/MqLw0KLSAgICBpZiAoekF0aV9Jc011bHRpQ21kKHBDaG5lbE5vZGUpICB8fCAoIXpBdGlfSXNBYm9ydENtZE1zZyhwQ2huZWxOb2RlKSkgKQ0KLSAgICB7DQotICAgICAgICB6QXRpX0NtZERpcmVjdFJlcGx5KHBDaG5lbE5vZGUsIFpBVDJfQ01EX0NPTkZMSUNUKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgekF0aV9BdENtZEFib3J0UmVxKHBDaG5lbE5vZGUpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfSXNEaXJlY3RSZXBseUNtZA0KLSoguabE3MPoyvYgOiC78cihyqew3NDFz6INCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogVFJVRSAsIEZBTFNFDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNEaXJlY3RSZXBseUNtZChDSEFSICogcGJTdHJDbWQpDQoteyAgICANCi0gICAgcmV0dXJuIChzdHJjbXAoKGNvbnN0IGNoYXIgKilwYlN0ckNtZCwgIkFUIikgPT0gMCB8fA0KLSAgICAgICAgc3RyY21wKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVFEwRTBWMSIpID09IDAgfHwNCi0gICAgICAgIC8vc3RyY21wKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVFMwPTAiKSA9PSAwIHx8DQotICAgICAgICBzdHJjbXAoKGNvbnN0IGNoYXIgKilwYlN0ckNtZCwgIkFUSCBFMSIpID09IDAgfHwNCi0gICAgICAgIHN0cmNtcCgoY29uc3QgY2hhciAqKXBiU3RyQ21kLCAiQVRFMFYxIikgPT0gMCB8fA0KLSAgICAgICAgc3RyY21wKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVEUwUTBWMSIpID09IDAgKTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0RGlzdHJpYnV0ZU1zZ0lkeA0KLSoguabE3MPoyvYgOiC78cihveLC67LOyv26r8r9tcTPwrHqDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERlY0NtZEluZm8gIDogveLC69DFz6INCi0qICAgICAgICAgICAgKE9VVCmjug0KLSogICAgICAgICAgICAgcE1zZ0lkeCAgIDogveLC67LOyv26r8r9yv3X6dbQtcTPwrHqDQotKiC3tSC72CDWtaO6INXStb23tbvYWl9TVUNDLCAgw7vT0NXStb23tbvYWl9GQUlMDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Q21kMk1zZ0lkeChUX1pBdF9EZWNDbWRJbmZvICpwRGVjQ21kSW5mbywgV09SRCAqcENtZDJNc2dJZHgpDQotew0KLSAgICBXT1JEIHdUYWJJZHggPSAwOw0KLSAgICBXT1JEIHdUYWJMZW4gPSBnX3pBdF9DbWQyTXNnVGFibGVfTGVuOyAvL3NpemVvZihnX3pBdF9DbWQyTXNnVGFibGUpIC8gc2l6ZW9mKFRfWkF0X0NtZDJNc2dUYWIpOw0KLSAgDQotICAgIGZvciAod1RhYklkeCA9IDA7IHdUYWJJZHggPCB3VGFiTGVuOyB3VGFiSWR4KyspDQotICAgIHsNCi0gICAgICAgIGlmICgoZ196QXRfQ21kMk1zZ1RhYmxlW3dUYWJJZHhdLmNtZElkID09IHBEZWNDbWRJbmZvLT5jdXJDbWRJZCkgJiYNCi0gICAgICAgICAgICAoZ196QXRfQ21kMk1zZ1RhYmxlW3dUYWJJZHhdLmNtZE9wID09IHBEZWNDbWRJbmZvLT5jdXJDbWRPcCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBDbWQyTXNnSWR4ID0gd1RhYklkeDsNCi0gICAgICAgICAgICByZXR1cm4gWl9TVUNDOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHJldHVybiBaX0ZBSUw7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0RlY0NtZDJNc2cNCi0qILmmxNzD6Mr2IDogveLC68P8we6yzsr9o6y9q73iwuu687XEveG5+7TmtKLU2r3hubnM5dbQDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERlY0NtZEluZm8gIDogveLC69DFz6LWuNXrDQotKiAgICAgICAgICAgIHdDbWQyTXNnSWR4ICCjur3iwuu6r8r9y/fS/Q0KLSogt7Ugu9gg1rWjuiBUX1pBdF9QYXJzZUNtZDJNc2dSc2x0IA0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfWkF0X1BhcnNlQ21kMk1zZ1JzbHQgX19wc19zdGF0aWNfZnVuYyB6QXRpX0RlY0NtZDJNc2coVF9aQXRfRGVjQ21kSW5mbyAqcERlY0NtZEluZm8sIFdPUkQgd0NtZDJNc2dJZHgpDQotew0KLSAgICBUX1pBdF9QYXJzZUNtZDJNc2dSc2x0IHByc0NtZDJNc2dSc2x0ID0gezB9Ow0KLSAgICBpZiAoZ196QXRfQ21kMk1zZ1RhYmxlW3dDbWQyTXNnSWR4XS5wRGVjRm5jICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHByc0NtZDJNc2dSc2x0ID0gZ196QXRfQ21kMk1zZ1RhYmxlW3dDbWQyTXNnSWR4XS5wRGVjRm5jKHBEZWNDbWRJbmZvKTsNCi0NCi0gICAgICAgIGlmICgocERlY0NtZEluZm8tPmN1ckNtZElkID09IFpBVDJfU01fQ0dEQVRBKSAmJiAoZ196QXRpX3B0RGF0YS0+YlNtT25seUwyUEZsYWcgPT0gVFJVRSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJzQ21kMk1zZ1JzbHQuaU1zZ0lkID0gMDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcnNDbWQyTXNnUnNsdC5pTXNnSWQgPSBnX3pBdF9DbWQyTXNnVGFibGVbd0NtZDJNc2dJZHhdLmlNc2dJZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICgocERlY0NtZEluZm8tPmN1ckNtZElkID09IFpBVDJfU01TX0NOTUEpJiYgKHpBdF9HZXRTbXNDbWdmVHlwZSgpID09IFpBVDJfQ01HRl9URVhUKQ0KLSAgICAgICAgICAgICYmIChwRGVjQ21kSW5mby0+Y3VyQ21kT3AgIT0gWkFUMl9DT19URVNUX1JFUSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcHJzQ21kMk1zZ1JzbHQuaU1zZ0lkID0gTU1JQV9TTVNfUkVDX1JTUF9SRVFfRVY7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwcnNDbWQyTXNnUnNsdC5kZWNSc2x0Mm5kID0gWkFUMl9DTURfVU5SRUM7DQotICAgIH0NCi0gICAgcmV0dXJuIHByc0NtZDJNc2dSc2x0Ow0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9EZWNUZXN0Q21kDQotKiC5psTcw+jK9iA6IL3iwuuy4srUw/zB7g0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEZWNDbWRJbmZvICA6IL3iwuvQxc+i1rjV6w0KLSogt7Ugu9gg1rWjuiBUX1pBdF9QYXJzZUNtZDJNc2dSc2x0IA0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfWkF0X1BhcnNlQ21kMk1zZ1JzbHQgekF0aV9EZWNUZXN0Q21kKFRfWkF0X0RlY0NtZEluZm8gKnBEZWNDbWRJbmZvKQ0KLXsNCi0gICAgVF9aQXRfUGFyc2VDbWQyTXNnUnNsdCBwcnNDbWQyTXNnUnNsdCA9IHswfTsNCi0gICAgDQotICAgIGlmIChwRGVjQ21kSW5mby0+Y3VyQ21kT3AgPT0gWkFUMl9DT19URVNUX1JFUSkvL3Rlc3TD/MHutcS0psDtDQotICAgIHsNCi0gICAgICAgIFVJTlQxNiBpSW5kZXggPSB6QXQyX0ZpbmRUZXN0SW5mbyhwRGVjQ21kSW5mby0+Y3VyQ21kSWQpOw0KLSAgICAgICAgaWYgKGdfekF0X0NtZEhkMklkVGFibGVbaUluZGV4XS5zdHJUZXN0SW5mb1swXSAhPSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNwcmludGYoKGNoYXIgKilnX3pBdF9FbmNCdWYsICIlcyVzJXMlcyIsIGdfekF0X0NSTEYsIGdfekF0X0NtZEhkMklkVGFibGVbaUluZGV4XS5zdHJUZXN0SW5mbywgZ196QXRfQ1JMRiwgZ196QXRfT0spOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KGdfekF0X0VuY0J1ZiwgZ196QXRfT0ssIHN0cmxlbigoY29uc3QgY2hhciAqKWdfekF0X09LKSk7DQotICAgICAgICB9DQotICAgICAgICBwcnNDbWQyTXNnUnNsdC5kZWNSc2x0Mm5kID0gWkFUMl9DTURfUkVQTFlfRElSRUNUOw0KLSAgICAgICAgaWYgKHN0cmxlbigoY29uc3QgY2hhciAqKXBEZWNDbWRJbmZvLT5zdHJQYXJhbSkgIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6T3NzX01lbXNldChnX3pBdF9FbmNCdWYsIDAsIFpBVF9MT05HX0NNRF9MRU4pOyANCi0gICAgICAgICAgICBwcnNDbWQyTXNnUnNsdC5kZWNSc2x0Mm5kID0gWkFUMl9DTURfU1lOVEFYX0VSUjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHByc0NtZDJNc2dSc2x0LmRlY1JzbHQybmQgPSBaQVQyX0NNRF9VTlJFQzsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gcHJzQ21kMk1zZ1JzbHQ7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldE1zZ0luZm8NCi0qILmmxNzD6Mr2IDogu/HIoc/7z6K1xMP7s8ahor3hubnM5SANCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1UX1pBdF9QYXJzZUNtZDJNc2dSc2x0IF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRNc2dJbmZvKFRfWkF0X0RlY0NtZEluZm8gKnBEZWNDbWRJbmZvKQ0KLXsNCi0gICAgLyogyPS12jGyvb3izvbV/ci3o6zU8rj5vt21w7W9tcRjbWRJZLrNY21kT3Cy6dXSttTTprXEbXNnSWQssqK199PDveLC67SmwO3X07qvyv0gKi8NCi0gICAgV09SRCB3Q21kMk1zZ0lkeCA9IDA7DQotICAgIGlmKHpBdGlfR2V0Q21kMk1zZ0lkeChwRGVjQ21kSW5mbywgJndDbWQyTXNnSWR4KSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB6QXRpX0RlY0NtZDJNc2cocERlY0NtZEluZm8sIHdDbWQyTXNnSWR4KTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHJldHVybiB6QXRpX0RlY1Rlc3RDbWQocERlY0NtZEluZm8pOw0KLSAgICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTFRFIEdvVGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Jc0dvdGFSZXBseU9LDQotKiC5psTcw+jK9iA6IMXQts/Kx7fxyse3os/7z6KzybmmuvPQ6NKq1rG907vYuLRPS7XEz/vPog0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiB0cnVlLGZhbHNlDQotKiDG5Mv8y7XD96O6ILyvyLq66tTauq/K/cTa08MNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc0dvdGFSZXBseU9LKERXT1JEIGR3TXNnSWQpDQotew0KLSAgICAvL9Ta1eLA77zTvK/Iurrqv9jWxg0KLSNpZmRlZiBCVFJVTktfU1VQUE9SVA0KLQ0KLSAgICBpZiAoZHdNc2dJZCA9PSBBVElfVFNNX1JFR19SRVFfRVYgfHxkd01zZ0lkID09IEFUSV9UU01fQ0FMTF9SRVFfRVYNCi0gICAgICAgIHx8ZHdNc2dJZCA9PSBBVElfVFNNX0NBTExDT05GSVJNX1JFUV9FViB8fGR3TXNnSWQgPT0gQVRJX1RTTV9DQUxMQ09OTkVDVF9SRVFfRVYNCi0gICAgICAgIHx8ZHdNc2dJZCA9PSBBVElfVFNNX0NBTExSTFNfUkVRX0VWIHx8ZHdNc2dJZCA9PSBBVElfVFNNX0ZMT09SX1JFUV9FVg0KLSAgICAgICAgfHxkd01zZ0lkID09IEFUSV9UU01fRkxPT1JSTFNfUkVRX0VWIHx8ZHdNc2dJZCA9PSBBVElfVFNNX1NDQU5HUk9VUElORk9fUkVRX0VWDQotICAgICAgICB8fGR3TXNnSWQgPT0gQVRJX1RTTV9TQ0FOU1dJVENIX1JFUV9FViB8fGR3TXNnSWQgPT0gQVRJX1RTTV9TSEFLRUhBTkRfUkVRX0VWDQotICAgICAgICB8fGR3TXNnSWQgPT0gQVRJX1RTTV9TSE9SVF9EQVRBX1JFUV9FViB8fGR3TXNnSWQgPT0gQVRJX1RTTV9MT0NBVElORk9fUkVRX0VWDQotICAgICAgICB8fGR3TXNnSWQgPT0gQVRJX1RTTV9TRVRBQklMSVRZX1JFUV9FViB8fGR3TXNnSWQgPT0gQVRJX1RTTV9TVFVOSU5GT19RVUVSWV9SRVFfRVYNCi0gICAgICAgIHx8ZHdNc2dJZCA9PSBBVElfVFNNX0dST1VQSU5GT19RVUVSWV9SRVFfRVYgfHxkd01zZ0lkID09IEFUSV9UU01fQ0FMTEZPUldBUkRfUkVRX0VWDQotICAgICAgICB8fGR3TXNnSWQgPT0gUFRUX01NSUFfRVNNX1RBVVRZUEVfUkVRX0VWIHx8ZHdNc2dJZCA9PSBBVElfVFNNX0NBTExNT0RJRllfUlNQX0VWDQotICAgICAgICB8fGR3TXNnSWQgPT0gQVRJX1RTTV9DQUxMTU9ESUZZX1JFSl9FVikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Qcm9jQ21kTXNnDQotKiC5psTcw+jK9iA6ILSmwO3Su8z1w/zB7r3iwuu687XEz/vPog0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsggDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfekF0aV9EZWNSZXN1bHRUeXBlIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Qcm9jQ21kTXNnKERXT1JEIGR3TXNnSWQsIEJZVEUgKnBiTXNnQm9keSwgV09SRCB3TXNnTGVuLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICBCWVRFICAgICAgICAgIGRlc3RUYXNrICAgID0gMDsNCi0gICAgV09SRCAgICAgICAgICB3SWR4ICAgICAgICA9IDA7DQotICAgIERXT1JEICAgICAgICAgZHdSZXN1bHQgICAgPSBaX0FQTU1JQV9PUFROT1RTUFRfRVJSOw0KLSAgICB6QXRpX0dldFNlcnZlckluZGV4KGR3TXNnSWQsIChCWVRFICopcGJNc2dCb2R5LCBwQ2huZWxOb2RlKTsNCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0gICAgaWYoIXpBdGlfQ2NNc2dQcm9jKCZkd01zZ0lkLCBwYk1zZ0JvZHksICZ3TXNnTGVuLCBwQ2huZWxOb2RlKSkgLyoguPm+3c2otcDRodTx1LShosS/tcTL99L9usUgKi8NCi0gICAgew0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGJNc2dCb2R5KTsNCi0gICAgICAgIHJldHVybiBaQVRJX0RFQ19FUlJPUjsNCi0gICAgfQ0KLSNlbmRpZg0KLSAgICAvLyC31sDgtKbA7c/7z6INCi0gICAgaWYgKHpBdGlfR2V0QXRNZW1Nc2dJZHgoZHdNc2dJZCAsICZ3SWR4KSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIGR3UmVzdWx0ID0gekF0aV9Qcm9jQXRNZW1Nc2cod0lkeCAsIHBiTXNnQm9keSwgd01zZ0xlbiwgcENobmVsTm9kZSk7DQotICAgICAgICBpZihkd1Jlc3VsdCA9PSBaX0FQTU1JQV9OT1JFU1VMVCApDQotICAgICAgICB7DQotICAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiAqKSAmcGJNc2dCb2R5KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlIGlmICh6QXRpX0dldERpc3RyaWJ1dGVNc2dJZHgoZHdNc2dJZCAsICZ3SWR4KSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIGR3UmVzdWx0ID0gekF0aV9Qcm9jRGlzdHJpYnV0ZU1zZyh3SWR4ICwgcGJNc2dCb2R5LCB3TXNnTGVuLCBwQ2huZWxOb2RlKTsNCi0gICAgICAgIC8vz/LPwreiy821xM/7z6KjrNDo0qrW2NDCyerH67/VvOQNCi0gICAgICAgIC8vt6LLzbPJuaa687TLtKbM7bzTIHBiTXNnQm9keSDKzbfFtPrC66OsIA0KLSAgICAgICAgaWYoZHdSZXN1bHQgPT0gWl9BUE1NSUFfTk9SRVNVTFQgKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEICogKikgJnBiTXNnQm9keSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZSBpZiAoekF0aV9HZXRUcmFuc21pdE1zZ1Rhc2tJZChkd01zZ0lkICwgJmRlc3RUYXNrKSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIGR3UmVzdWx0ID0gekF0aV9Scm9jVHJhbnNtaXRNc2coZHdNc2dJZCAsIHBiTXNnQm9keSwgd01zZ0xlbiwgcENobmVsTm9kZSwgZGVzdFRhc2spOw0KLQ0KLSNpZmRlZiBDWFRfTU9WDQotICAgICAgICBpZihkd1Jlc3VsdCAhPSBaX0FQTU1JQV9OT1JFU1VMVCAmJiBkd01zZ0lkID09IE1NSUFfU01fQ09OVEVYVF9SRVFfRVYpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gy6u0/bDhx6jI57n7t6LLzcqnsNwsx+W/1c/gudjIq77WDQotICAgICAgICAgICAgekF0aV9DbGVhclBzTW92U3RhdCgpOw0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICB9DQotDQotICAgIC8vILSmwO23tbvY1rUNCi0gICAgaWYoIGR3UmVzdWx0ID09IFpfQVBNTUlBX05PRVJST1JfRVJSKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwYk1zZ0JvZHkpOw0KLSAgICAgICAgaWYoZHdNc2dJZCAhPUFQX01NSUFfQ1BPTF9RVUVSWV9SRVFfRVYgJiYgZHdNc2dJZCAhPSBBUF9NTUlBX0ZQTE1OX1FVRVJZX1JFUV9FVg0KLSAgICAgICAgICAgICYmIChkd01zZ0lkICE9IEFQX01NSUFfWk9QRVJMVEVCQU5EX1FVRVJZX1JFUV9FVikpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9DbWREaXJlY3RSZXBseShwQ2huZWxOb2RlLCBaQVQyX0NNRF9SRVBMWV9ESVJFQ1QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFpBVElfREVDX0lOTkVSX09LOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKCBkd1Jlc3VsdCA9PSBaX0FQTU1JQV9OT1JFU1VMVCApDQotICAgIHsgIA0KLSAgICAgICAgLy8gz8K3orPJuaa686Os1rG907vYuLRPSw0KLSAgICAgICAgaWYgKGR3TXNnSWQgPT0gTU1JQV9FVUNTUl9MVEVJTkZPX1JFUV9FViB8fCBkd01zZ0lkID09IE1NSUFfVU1NX0NTX1NSVl9DTkZfRVYgfHwgDQotICAgICAgICAgICAgZHdNc2dJZCA9PSBNTUlBX0NDX0FOU19NT0RFX1JFUV9FViB8fCBkd01zZ0lkID09IE1NSUFfQ0NfRElTX01PREVfUkVRX0VWIA0KLSAgICAgICAgICAgIHx8ZHdNc2dJZCA9PSBNTUlBX1VNTV9JTVNfUkVHSVNURVJfU1RBVEVTX0VWIHx8IGR3TXNnSWQgPT0gTU1JQV9DQ19TVEFURV9SRVFfRVYNCi0gICAgICAgICAgICB8fGR3TXNnSWQgPT0gQVBfVUlDQ19BSVJfQVVUSF9SU1BfSU5EX0VWDQotICAgICAgICAgICAgfHwgZHdNc2dJZCA9PSBNTUlBX0NDX09QRU5fVk9JQ0VDSE5MX1JFUV9FVg0KLSAgICAgICAgICAgIHx8IGR3TXNnSWQgPT0gTU1JQV9DQ19TUlZDQ19OT1RPUEVOX1ZPSUNFQ0hOTF9SRVFfRVYNCi0gICAgICAgICAgICB8fCBkd01zZ0lkID09IE1NSUFfQVNfRU1fTFRFX0hPX1NFVF9SRVFfRVYNCi0gICAgICAgICAgICB8fCBkd01zZ0lkID09IE1NSUFfQ0NfTU9DX1JFUV9FVg0KLSAgICAgICAvKioqKioqKioqKioqKiogTFRFIEdvVGHEo7/pIM/Ct6KzybmmuvOjrNaxvdO72Li0T0sqKioqKioqKioqKioqKioqKioqKiovDQotICAgICAgICB8fHpBdGlfSXNHb3RhUmVwbHlPSyhkd01zZ0lkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1JlcGx5T0socENobmVsTm9kZSk7DQotICAgICAgICAgICAgcmV0dXJuIFpBVElfREVDX0lOTkVSX09LOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIFpBVElfREVDX09VVEVSX09LOw0KLSAgICB9DQotICAgIGVsc2UgIC8vILTtzvO0psDtDQotICAgIHsgICAgICAgICANCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnBiTXNnQm9keSk7DQotICAgICAgICB6QXRpX1Byb2NFcnJvcihwQ2huZWxOb2RlLCBkd1Jlc3VsdCk7DQotICAgICAgICByZXR1cm4gWkFUSV9ERUNfRVJST1I7DQotICAgIH0NCi19DQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfRGVjQ21kDQotKiC5psTcw+jK9iA6ILSmwO3Su8z1w/zB7g0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsggDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfekF0aV9EZWNSZXN1bHRUeXBlIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9EZWNDbWQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgVF9aQXRfRGVjQ21kSW5mbyAqcGRlY0NtZEluZm8gPSBaT1NTX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VkIHRvIHN0b3JlIGluZm8gb2YgdGhlIDFzdC1zdGVwLXBhcnNpbmcgKi8NCi0gICAgVF9aQXRfUGFyc2VDbWQyTXNnUnNsdCBwcnNDbWQyTXNnUnNsdCA9IHswfTsgLyogVXNlZCB0byBzdG9yZSBpbmZvIG9mIHRoZSAybmQtc3RlcC1wYXJzaW5nICovDQotDQotICAgIEJZVEUgKnBiU3RyQ21kID0gekF0aV9HZXRGaXJzdENtZChwQ2huZWxOb2RlKTsNCi0gICAgaWYoekF0aV9Jc0RpcmVjdFJlcGx5Q21kKChDSEFSICopcGJTdHJDbWQpKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFbmNEYXRhKHBDaG5lbE5vZGUsIChCWVRFICopZ196QXRfT0ssIFpBVElfSU5WQUxJRF9NU0dJRCwgTlVMTCk7ICAgICAgICANCi0gICAgICAgIHJldHVybiBaQVRJX0RFQ19JTk5FUl9PSzsNCi0gICAgfQ0KLQ0KLSAgICBnX3pBdGlfcHREYXRhLT5wdENtZElucHV0SW5mbyA9ICZwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm87DQotICAgIHpPc3NfTWVtc2V0KGdfekF0X0VuY0J1ZiwgMCwgWkFUX0xPTkdfQ01EX0xFTik7DQotDQotICAgIHBkZWNDbWRJbmZvID0gKFRfWkF0X0RlY0NtZEluZm8gKil6QXRpX0dldFVCKHNpemVvZihUX1pBdF9EZWNDbWRJbmZvKSk7DQotDQotICAgIC8qILXaMbK9OiC94s72w/zB7s23o6yy2df3t73KvaOsyLe2qLbU06a1xM/7z6Kx6sq2ICovDQotICAgIHpBdF9QYXJzZUNtZFN0cihwQ2huZWxOb2RlLT5jbWRfaWQsIHBDaG5lbE5vZGUtPmNtZF9vcCwgcENobmVsTm9kZS0+aUNobmVsSWQsIChDSEFSICopcGJTdHJDbWQsIHBkZWNDbWRJbmZvKTsNCi0gICAgaWYgKFpBVDJfQ01EX1BBUlNFX09LID09IHBkZWNDbWRJbmZvLT5kZWNSc2x0MXN0KQ0KLSAgICB7DQotICAgICAgICAvKiC12jKyvToguPm+3bXa0ruyvb3izva94bn7o6y1w7W9z/vPorXEw/uzxqGiveG5uczlICovDQotICAgICAgICBwcnNDbWQyTXNnUnNsdCA9IHpBdGlfR2V0TXNnSW5mbyhwZGVjQ21kSW5mbyk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwcnNDbWQyTXNnUnNsdC5kZWNSc2x0Mm5kID0gcGRlY0NtZEluZm8tPmRlY1JzbHQxc3Q7DQotICAgIH0NCi0NCi0gICAgaWYgKFpBVDJfQ01EX1BBUlNFX09LID09IHByc0NtZDJNc2dSc2x0LmRlY1JzbHQybmQpDQotICAgIHsNCi0gICAgICAgIC8qIL3iwuuzybmmo6y0q7P2z/vPoklEvLCzpLbIo6y4/NDCzai1wNe0zKwgKi8NCi0gICAgICAgIHBDaG5lbE5vZGUtPmNtZF9pZCA9IHBkZWNDbWRJbmZvLT5jdXJDbWRJZDsNCi0gICAgICAgIHBDaG5lbE5vZGUtPmNtZF9vcCA9IHBkZWNDbWRJbmZvLT5jdXJDbWRPcDsNCi0gICAgICAgIA0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGRlY0NtZEluZm8pOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gekF0aV9Qcm9jQ21kTXNnKHByc0NtZDJNc2dSc2x0LmlNc2dJZCwgKEJZVEUgKilwcnNDbWQyTXNnUnNsdC5wTXNnQm9keSwgIHByc0NtZDJNc2dSc2x0LmlNc2dMZW4sIHBDaG5lbE5vZGUpOyAgDQotICAgIH0gDQotICAgIGVsc2UgaWYgKFpBVDJfQ01EX1JFUExZX0RJUkVDVCA9PSBwcnNDbWQyTXNnUnNsdC5kZWNSc2x0Mm5kKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1JldFVCKCZwcnNDbWQyTXNnUnNsdC5wTXNnQm9keSk7DQotICAgICAgICB6QXRpX0NtZERpcmVjdFJlcGx5KHBDaG5lbE5vZGUsIHByc0NtZDJNc2dSc2x0LmRlY1JzbHQybmQpOw0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGRlY0NtZEluZm8pOw0KLSAgICAgICAgcmV0dXJuIFpBVElfREVDX0lOTkVSX09LOw0KLSAgICB9DQotICAgIGVsc2UgIC8vILTtzvO0psDtDQotICAgIHsNCi0gICAgICAgIHpBdGlfUmV0VUIoJnByc0NtZDJNc2dSc2x0LnBNc2dCb2R5KTsNCi0gICAgICAgIHpBdGlfQ21kRGlyZWN0UmVwbHkocENobmVsTm9kZSwgcHJzQ21kMk1zZ1JzbHQuZGVjUnNsdDJuZCk7DQotDQotICAgICAgICAvL0FURLSlt6K1xFBQULKmusWjrMG9uPbD/MHu0rvG8LeiyrGjrNPQ0ru49rTtzvOjrNKqvavHsMPmsqa6xcfltfQNCi0gICAgICAgIGlmIChwZGVjQ21kSW5mby0+Y3VyQ21kSWQgPT0gWkFUMl9TTV9aR1BDT0FVVEgNCi0gICAgICAgICAgICB8fCBwZGVjQ21kSW5mby0+Y3VyQ21kSWQgPT0gWkFUMl9TTV9DR0FDVCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX0hhbmRsZVBwcFByb2NDbWRFcnJvcigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGRlY0NtZEluZm8pOw0KLSAgICAgICAgcmV0dXJuIFpBVElfREVDX0VSUk9SOw0KLSAgICB9DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0RlY011bHRpQ21kDQotKiC5psTcw+jK9iA6ILSmwO224Mz1w/zB7g0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsggDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX0RlY011bHRpQ21kKFRfWkF0aV9DaGFubmVsSW5mbyAqIHBDaG5lbE5vZGUpDQotew0KLSAgICBUX3pBdGlfRGVjUmVzdWx0VHlwZSAgZURlY1JsdFR5cGUgPSBaQVRJX0RFQ19FUlJPUjsNCi0NCi0gICAgDQotICAgIHdoaWxlKHpBdGlfSGFzTW9yZUNtZChwQ2huZWxOb2RlKSkNCi0gICAgew0KLSAgICAgICAgLyog1Nq/qsq8veLC68ewo6zNqLXA06a4w8rHv9W1xCzWrsewu7q05rXExNrI3dKy06a0psDtzeqxzyAqLw0KLSAgICAgICAgcENobmVsTm9kZS0+Y21kX2lkID0gWkFUMl9OT19DT01NQU5EOw0KLSAgICAgICAgcENobmVsTm9kZS0+Y21kX29wID0gWkFUMl9DT19JTlZBTElEOw0KLQ0KLSAgICAgICAgZURlY1JsdFR5cGUgPSB6QXRpX0RlY0NtZChwQ2huZWxOb2RlKTsNCi0gICAgICAgIGlmKGVEZWNSbHRUeXBlID09IFpBVElfREVDX0lOTkVSX09LKQ0KLSAgICAgICAgeyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHpBdGlfUmVtb3ZlT25lQ21kKHBDaG5lbE5vZGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihlRGVjUmx0VHlwZSA9PSBaQVRJX0RFQ19PVVRFUl9PSykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgIC8vIFpBVElfREVDX0VSUk9SDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9SZW1vdmVBTExDbWQocENobmVsTm9kZSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc09ubHlSZWZDbWQoQ0hBUiAqIHBiU3RyQ21kKQ0KLXsNCi0gICAgaWYoc3Ryc3RyKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVCtaQ09OU1RBVCIpICE9IE5VTEwNCi0gICAgICAgIHx8IHN0cnN0cigoY29uc3QgY2hhciAqKXBiU3RyQ21kLCAiQVQrWlNFVD1cIlNUQU5ETU9ERVwiIikgIT0gTlVMTA0KLSAgICAgICB8fHN0cnN0cigoY29uc3QgY2hhciAqKXBiU3RyQ21kLCAiQVQrQ0ZVTj0wIikgIT0gTlVMTA0KLSAgICAgICB8fHN0cnN0cigoY29uc3QgY2hhciAqKXBiU3RyQ21kLCAiQVQrQ0dTTj0iKSAhPSBOVUxMDQotICAgICAgIHx8c3Ryc3RyKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVCtDRlVOPTEsMSIpICE9IE5VTEwNCi0gICAgICAgfHxzdHJzdHIoKGNvbnN0IGNoYXIgKilwYlN0ckNtZCwgIkFUK1pDSE5FTFNFVCIpICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotI2lmZGVmIERTRFNfVlNJTQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzVnNpbUR1YWxDYXJkSW5pdChDSEFSICogcGJTdHJDbWQpDQotew0KLSAgICBpZigoZ196QXRpX0N1ckluc3RhbmNlID09IFpfQVRJX0lOU05PXzIgJiYgc3Ryc3RyKChjb25zdCBjaGFyICopcGJTdHJDbWQsICJBVCtDRlVOPTEiKSAhPSBOVUxMIA0KLSAgICAgICAmJiBzdHJzdHIoKGNvbnN0IGNoYXIgKilwYlN0ckNtZCwgIkFUK0NGVU49MSwxIikgPT0gTlVMTCkgfHwgKGdfekF0aV9DdXJJbnN0YW5jZSA9PSBaX0FUSV9JTlNOT18xKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Qcm9jZXNzUHNNb3ZTdGF0Q21kDQotKiC5psTcw+jK9iA6ILSmwO3U2rDhx6i5/bPM1tDJz7Ljt6LLzbXEw/zB7g0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgICAgICAgIHBDaG5lbE5vZGUgICAgzai1wL3ateMNCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgQ1hUX01PVg0KLVZPSUQgekF0aV9Qcm9jZXNzQ21kSW5Qc01vdlN0YXQoVF9aQXRpX0NoYW5uZWxEYXRhQnVmICpyZWN2Q21kSW5kLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICBpZiAoKFpBVDJfTk9fQ09NTUFORCAhPSBwQ2huZWxOb2RlLT5jbWRfaWQgJiYgWkFUMl9DT19JTlZBTElEICE9IHBDaG5lbE5vZGUtPmNtZF9vcCkNCi0gICAgICAgIHx8cENobmVsTm9kZS0+SXNDbWRTdG9yZWQpLyq1scewzai1wLK7v9XP0Lvy1d/S0b6tu7q05iovDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsNCi0gICAgICAgIHpBdGlfQ21kRGlyZWN0UmVwbHkocENobmVsTm9kZSwgWkFUMl9DTURfQ09ORkxJQ1QpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8qIL2rQVTD/MHusaO05rW9QVRJu7q05tbQyKUsyPTUvb3n1PLWsb3Tt7W72CJFUlJPUiIgKi8gDQotICAgIGlmKHpBdGlfU3RvcmVBdENtZChyZWN2Q21kSW5kLCBwQ2huZWxOb2RlKSA9PSBaX0ZBSUwpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBpZih6QXRpX0RlcGFydEF0Q21kKHBDaG5lbE5vZGUpID09IFpfRkFJTCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIHBDaG5lbE5vZGUtPklzQ21kU3RvcmVkID0gVFJVRTsNCi0gICAgcmV0dXJuOw0KLX0NCi0jZW5kaWYNCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9acmVkaWFsSGFuZGxlKFRfWkF0aV9DaGFubmVsRGF0YUJ1ZiAqcmVjdkNtZEluZCwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgLyrD/MHuuvPD5tKq0K+0+LrFwuvH0rK7v7zCx7TtzvO1xMP8we7X1rf7tK61xMfpv/YqLw0KLSAgICBCWVRFICogcFpyZWRpYWwgPSAoQllURSAqKXN0cnN0cigoY2hhciAqKXJlY3ZDbWRJbmQtPnN0ckRhdGEsICJBVCtaUkVESUFMPSIpOw0KLSAgICAvKs2otcCyu7/Vz9DKsdaxvdO72Li0Q0VORCovDQotICAgIGlmIChOVUxMICE9IHBacmVkaWFsKQ0KLSAgICB7DQotICAgICAgICBpZihnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS5iQ2FyZEluaXRpYXRlZEZsYWcgPT0gWl9BVElfQ0FSRElOSVRfSU5HICB8fA0KLSAgICAgICAgICAgKFpBVDJfTk9fQ09NTUFORCAhPSBwQ2huZWxOb2RlLT5jbWRfaWQgJiYgWkFUMl9DT19JTlZBTElEICE9IHBDaG5lbE5vZGUtPmNtZF9vcCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9EZWxpdmVyQ2VuZEluZCgpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotI2VuZGlmDQotDQotVUlOVDMyIF9fcHNfc3RhdGljX2Z1bmMgekF0X0F1dG9UZXN0SW5pdChWT0lEKQ0KLXsNCi0gICAgaWYgKDAhPSAoek9zc19HZXRMdGVGbGFnSW5mbygpICYgMHg4KSkNCi0gICAgew0KLSAgICAgICAgY2hhciBwRGF0YVB0cltdID0gIkFUK0FVVE9TVEFSVD0xXHJcbiI7DQotDQotICAgICAgICB3aGlsZSAoekF0aTJfT3Blbig3MykgIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6T3NzX1NsZWVwKDEwMCk7DQotICAgICAgICB9DQotICAgICAgICB6QXRpMl9TZW5kKDczLCAoVUlOVDggKilwRGF0YVB0ciwgc3RybGVuKHBEYXRhUHRyKSwgWkFUSTJfQ0hJTkRfQVQpOw0KLSAgICB9DQotDQotICAgIHJldHVybiBaT1NTX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX1Byb2Nlc3NDbWQNCi0qILmmxNzD6Mr2IDogtKbA7cnPsuO3osC0tcTD/MHuDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yCANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUHJvY2Vzc0NtZChUX1pBdGlfQ2hhbm5lbERhdGFCdWYgICAgICAqcmVjdkNtZEluZCAsIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIC8vIHBDaG5lbE5vZGUgzqq1pc/utffTw6Os0ru2qLK7zqq/1aOsv8lhc3NlcnQNCi0gICAgLy8gzai1wNe0zKyyu86qv9XX9s2otcCz5c27ILSmwO0NCi0gICAgLy+12tK7zPXD/MHu0v23orXEv6iz9cq81f3U2r340NCjrLTLyrHNqLXA1tDO3sP8we6jrNaxvdO72Li0NjAwMCANCi0NCi0gICAgaWYgKGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLmJDYXJkSW5pdGlhdGVkRmxhZyA9PSBaX0FUSV9DQVJESU5JVF9JTkcgKQ0KLSAgICB7DQotICAgICAgICBpZihwQ2huZWxOb2RlLT5iSXNDYXJkSW5pdGluZyA9PSBUUlVFKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfQ21kRGlyZWN0UmVwbHkocENobmVsTm9kZSwgWkFUMl9DTURfQ09ORkxJQ1QpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZiAoIFpBVDJfTk9fQ09NTUFORCAhPSBwQ2huZWxOb2RlLT5jbWRfaWQgJiYgWkFUMl9DT19JTlZBTElEICE9IHBDaG5lbE5vZGUtPmNtZF9vcCkNCi0gICAgew0KLSAgICAgICAgekF0aV9Qcm9jQ2huZWxDb25mbGljdChwQ2huZWxOb2RlKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKiC9q0FUw/zB7rGjtOa1vUFUSbu6tObW0MilLMj01L2959Ty1rG907e1u9giRVJST1IiICovIA0KLSAgICBpZih6QXRpX1N0b3JlQXRDbWQocmVjdkNtZEluZCwgcENobmVsTm9kZSkgPT0gWl9GQUlMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgaWYoekF0aV9EZXBhcnRBdENtZChwQ2huZWxOb2RlKSA9PSBaX0ZBSUwpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBpZighekF0aV9Jc0RpcmVjdFJlcGx5Q21kKChDSEFSICopekF0aV9HZXRGaXJzdENtZChwQ2huZWxOb2RlKSkNCi0gICAgICAgICYmICF6QXRpX0lzT25seVJlZkNtZCgoQ0hBUiAqKXpBdGlfR2V0Rmlyc3RDbWQocENobmVsTm9kZSkpDQotICAgICAgICAmJiB6QXRpX0lzTmVlZENhcmRJbml0KCkNCi0gICAgICAgICNpZmRlZiBEU0RTX1ZTSU0NCi0gICAgICAgICYmIHpBdGlfSXNWc2ltRHVhbENhcmRJbml0KChDSEFSICopekF0aV9HZXRGaXJzdENtZChwQ2huZWxOb2RlKSkNCi0gICAgICAgICNlbmRpZg0KLSAgICAgICAgKQ0KLSAgICB7DQotICAgICAgICAvLyDU2srVtb2/qLP1yry7r8i3yM/P+8+iuvOjrNDo0qq9+NDQtuDM9cP8we60psDtDQotICAgICAgICBCWVRFIGJJbnNObyA9IDA7DQotICAgICAgICBCWVRFIGJTcmNJbmRleCAgICA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPT0gMCA/IFpBVEkyX0NIQU5ORUxfSURfTlVNMjUxIDogWkFUSTJfQ0hBTk5FTF9JRF9OVU0yNTIpOw0KLQ0KLSAgICAgICAgYkluc05vID0gKChnX3pBdGlfQ3VySW5zdGFuY2UgPT0gWl9BVElfSU5TTk9fMSk/IFpfQVRJX0lOU05PXzEgOiBaX0FUSV9JTlNOT18yKTsNCi0gICAgICAgIHpBdGlfSW5pdENhcmQoYlNyY0luZGV4LCBaX0FUSV9JTlZBTElEX0JZVEUpOw0KLSAgICAgICAgekF0aV9DYXJkSW5pdEZsZ0Nscl9TaWdDZChiSW5zTm8sIFpfQVRJX0NBUkRJTklUX0lORyk7DQotICAgICAgICBnX3pBdGlfYXREYXRhRXhbYkluc05vXS5wdENhcmRJbml0Q2hubE9mRmlyc3RDbWQgPSBwQ2huZWxOb2RlOw0KLQ0KLSAgICAgICAgcENobmVsTm9kZS0+YklzQ2FyZEluaXRpbmcgPSBUUlVFOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIHpBdGlfRGVjTXVsdGlDbWQocENobmVsTm9kZSk7DQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfUHJvY2Vzc1NNU0RhdGENCi0qILmmxNzD6Mr2IDogtKbA7cnPsuO3osC0tcS2zM/7z6LE2sjdDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yCANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX1Byb2Nlc3NTTVNEYXRhKFRfWkF0aV9DaGFubmVsRGF0YUJ1ZiAgICAgICpyZWN2Q21kSW5kICwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgV09SRCAgICAgICAgICAgICAgIHdNc2dMZW4gPSAwOyANCi0gICAgV09SRCAgICAgICAgICAgICAgd0RhdGFMZW4gPSAwOw0KLSAgICBXT1JEICAgICAgICAgICAgd01zZ0xlblJldCA9IDA7DQotICAgIFVJTlQzMiAgICAgICAgICAgICBkd01zZ0lkID0gMDsNCi0gICAgVk9JRCAgICAgICAgICAgICogcE1zZ0JvZHkgPSBOVUxMOyAgICAgDQotICAgIC8vLS1UX1pBdDJfRGVjUnNsdFR5cGUgcnNsdFRtcCA9IFpBVDJfQ01EX1BBUlNFX09LOw0KLQ0KLSAgICBpZih6QXRpX1N0b3JlU21zRGF0YShyZWN2Q21kSW5kLCBwQ2huZWxOb2RlKSA9PSBaX0ZBSUwpLyogsaO05rbMz/vPosTayN0syPTOtL3hyvi78tS9vefU8taxvdO3tbvYKi8gDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfSANCi0gICAgLyrK1bW9RVNDyrHWsb3Tu9i4tE9LLLK7t6LLzbbMz/vPoiAqLw0KLSAgICBpZiAoKGdfekF0aV9wdERhdGEtPnB0Q21kSW5wdXRJbmZvICE9IE5VTEwpICYmIChnX3pBdGlfcHREYXRhLT5wdENtZElucHV0SW5mby0+YlNtc0VzYyA9PSBaX1ZBTElEKSkNCi0gICAgew0KLSAgICAgICAgc3ByaW50ZigoY2hhciAqKWdfekF0X0VuY0J1ZiwgIiVzIiwgIGdfekF0X09LKTsNCi0gICAgICAgIHpBdGlfU2VuZEVuY0RhdGEocENobmVsTm9kZSwgKEJZVEUgKilnX3pBdF9FbmNCdWYsIFpBVElfSU5WQUxJRF9NU0dJRCwgTlVMTCk7DQotDQotICAgICAgICAvKiDKzbfFzai1wNbQu7q05s/7z6LE2sjdtcTE2rTmtdjWt6OsvatzbXNJbnB1dFR5cGW7udStICovDQotICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8ucFNtc0lucHV0TXNnKTsNCi0NCi0gICAgICAgIC8qILi0zru2zM/7z6LK5Mjr17TMrCAqLw0KLSAgICAgICAgcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggPSAwOw0KLSAgICAgICAgek9zc19NZW1zZXQocENobmVsTm9kZS0+YXRCdWZmLmFyckRhdGEsIDAsIFpBVEkyX0JVRkZFUl9MRU5HVEgpOyAgICAgICAgDQotICAgICAgICB6QXRpX0luaXRfQ21kSW5mbygmcENobmVsTm9kZS0+Y21kSW5wdXRJbmZvKTsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0gICAgDQotICAgIHdEYXRhTGVuID0gKFVJTlQxNilzdHJsZW4oKGNvbnN0IGNoYXIgKilwQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YSk7DQotICAgIC8qILvxyKG2zM/7z6LE2sjds8m5pqOs1rG9073izva3tbvY1q7HsLGjtOa1xM/7z6LE2sjdICovDQotICAgIHdNc2dMZW5SZXQgPSB6QXRfRGVjU21zQ29udGVudCgmZHdNc2dJZCwgcENobmVsTm9kZSwgd0RhdGFMZW4pOw0KLSAgICANCi0gICAgaWYgKHdNc2dMZW5SZXQgPT0gMCkNCi0gICAgew0KLSAgICAgICAgLyogxNrI3b3izvbKp7DcLLfWxeTWsb3Tt7W72LbMz/vPosTayN3K5MjrtO3O873hufsgKi8NCi0gICAgICAgIHpBdF9FbmNFcnJvckNvZGUoZ196QXRfRW5jQnVmLCBaQVQyX0NGR19DTUVFLCBaQVQyX0NNRUVfU01TQ09OVEVOVF9FUlIpOyANCi0gICAgICAgIHpBdGlfU2VuZEVuY0RhdGEocENobmVsTm9kZSwgKEJZVEUgKilnX3pBdF9FbmNCdWYsIFpBVElfSU5WQUxJRF9NU0dJRCwgTlVMTCk7DQotICAgICAgICANCi0gICAgICAgIC8qIMrNt8XNqLXA1tC7urTmz/vPosTayN21xMTatOa12Na3o6y9q3Ntc0lucHV0VHlwZbu51K0gKi8NCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnBDaG5lbE5vZGUtPmNtZElucHV0SW5mby5wU21zSW5wdXRNc2cpOw0KLQ0KLSAgICAgICAgLyoguLTOu7bMz/vPosrkyOvXtMysICovDQotICAgICAgICBwQ2huZWxOb2RlLT5hdEJ1ZmYuaUxlbmd0aCA9IDA7DQotICAgICAgICB6T3NzX01lbXNldChwQ2huZWxOb2RlLT5hdEJ1ZmYuYXJyRGF0YSwgMCwgWkFUSTJfQlVGRkVSX0xFTkdUSCk7ICAgICAgICANCi0gICAgICAgIHpBdGlfSW5pdF9DbWRJbmZvKCZwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8pOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgLyogxNrI3b3izvazybmmLCC9q82otcDW0Lu6tObP+8+ixNrI3bXExNq05rXY1re9u7j4cE1zZ0JvZHksvatzbXNJbnB1dFR5cGW7udStICovDQotICAgICAgICBwTXNnQm9keSA9IHBDaG5lbE5vZGUtPmNtZElucHV0SW5mby5wU21zSW5wdXRNc2c7DQotICAgICAgICBwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8ucFNtc0lucHV0TXNnID0gTlVMTDsNCi0gICAgICAgIHdNc2dMZW4gPSB3TXNnTGVuUmV0Ow0KLSAgICAgICAgDQotICAgICAgICAvKiC8x8K8zai1wNe0zKxjbWRJZCxjbWRPcCAqLw0KLSAgICAgICAgcENobmVsTm9kZS0+Y21kX29wID0gWkFUMl9DT19TRVRfUkVROw0KLSAgICAgICAgc3dpdGNoIChwQ2huZWxOb2RlLT5jbWRJbnB1dEluZm8uc21zSW5wdXRUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgY2FzZSBaQVQyX0NNR0NfUERVOg0KLSAgICAgICAgY2FzZSBaQVQyX0NNR0NfVEVYVDoNCi0gICAgICAgICAgICBwQ2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX1NNU19DTUdDOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBaQVQyX0NNR1NfUERVOg0KLSAgICAgICAgY2FzZSBaQVQyX0NNR1NfVEVYVDoNCi0gICAgICAgICAgICBwQ2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX1NNU19DTUdTOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBaQVQyX0NNR1dfUERVOg0KLSAgICAgICAgY2FzZSBaQVQyX0NNR1dfVEVYVDoNCi0gICAgICAgICAgICBwQ2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX1NNU19DTUdXOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgY2FzZSBaQVQyX0NOTUFfUERVOg0KLSAgICAgICAgICAgIHBDaG5lbE5vZGUtPmNtZF9pZCA9IFpBVDJfU01TX0NOTUE7DQotICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIC8vLS1yc2x0VG1wID0gWkFUMl9DTURfVU5SRUM7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qILi0zru2zM/7z6LK5Mjr17TMrCAqLw0KLSAgICAgICAgcENobmVsTm9kZS0+YXRCdWZmLmlMZW5ndGggPSAwOw0KLSAgICAgICAgek9zc19NZW1zZXQocENobmVsTm9kZS0+YXRCdWZmLmFyckRhdGEsIDAsIFpBVEkyX0JVRkZFUl9MRU5HVEgpOw0KLSAgICAgICAgDQotICAgICAgICB6QXRpX0luaXRfQ21kSW5mbygmcENobmVsTm9kZS0+Y21kSW5wdXRJbmZvKTsNCi0gICAgICAgIHpBdGlfUHJvY0NtZE1zZyhkd01zZ0lkLCAoQllURSAqKXBNc2dCb2R5LCB3TXNnTGVuLCBwQ2huZWxOb2RlKTsNCi0gICAgIH0gICANCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9SZWN2Q29tbWFuZEluZA0KLSoguabE3MPoyvYgOiC908rVtb3Jz7Goz/vPorSmwO26r8r9DQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yCANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfUmVjdkNvbW1hbmRJbmQoVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4pDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbERhdGFCdWYgICAgICAqcmVjdkNtZEluZCA9IChUX1pBdGlfQ2hhbm5lbERhdGFCdWYgKilwRGF0YVB0cjsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICAgICAgICAgKnBDaG5lbE5vZGUgPSBOVUxMOw0KLQ0KLSAgICBnX3pBdGlfcHREYXRhLT5iUG93ZXJJbmRGbGFnID0gRkFMU0U7DQotDQotICAgIGlmKCAoTlVMTCA9PSBwRGF0YVB0cikgfHwgKDAgPT0gaURhdGFMZW4pICB8fChOVUxMID09IChwQ2huZWxOb2RlID0gekF0aV9HZXRDaGFubmVsTm9kZVB0cihyZWN2Q21kSW5kLT5pQ2hhbm5lbCkpKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIHpPc3NfTWVtc2V0KGdfekF0X0VuY0J1ZiwgMCwgWkFUX0xPTkdfQ01EX0xFTik7DQotICAgIHpBdGlfU2VuZFJlY3ZDbWRTdHIyVHJhY2UocmVjdkNtZEluZC0+aUNoYW5uZWwsIHJlY3ZDbWRJbmQtPmlEYXRhTGVuLCAoQ0hBUiAqKXJlY3ZDbWRJbmQtPnN0ckRhdGEpOw0KLQ0KLSAgICBpZighekF0aV9Jc1JpZ2h0U3RhbmRBdENtZChyZWN2Q21kSW5kLT5pQ2hhbm5lbCkpLyrDu8b0tq+0/bv6suC1xMP8we6y2df3srvUytDtKi8NCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZE1zZywgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgekF0aV9DbWREaXJlY3RSZXBseShwQ2huZWxOb2RlLCBaQVQyX09QVE5PVEFMV19FUlIpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIGlmKHBDaG5lbE5vZGUtPmNtZElucHV0SW5mby5jbWRJbnB1dFN0YXQgPT0gWkFUMl9BVENNRCkNCi0gICAgew0KLSAgICAgICAgekF0aV9VcENhc2VSZWN2Q21kKHJlY3ZDbWRJbmQtPnN0ckRhdGEsIHJlY3ZDbWRJbmQtPmlEYXRhTGVuKTsNCi0gICAgICAgICNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICAgICAgaWYoekF0aV9acmVkaWFsSGFuZGxlKHJlY3ZDbWRJbmQsIHBDaG5lbE5vZGUpKS8vZm9yIFZPTFRFDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZE1zZywgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgI2VuZGlmDQotI2lmZGVmIFpfRFVBTENBUkRfQURBUFQNCi0gICAgICAgIGlmKHpBdGlfSXNEdWFsQ2FyZFNlbGZBZGFwdENoYW5naW5nKCkpLyrX1MrKxeS5/bPMsruy2df3yM66zsP8we4qLw0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsNCi0gICAgICAgICAgICB6QXRpX0NtZERpcmVjdFJlcGx5KHBDaG5lbE5vZGUsIFpBVDJfRFVBTENBUkRBRFBUX0VSUik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLSNpZmRlZiBDWFRfTU9WDQotICAgICAgICBpZihaX0FUSV9QU19NT1ZFX09SSUdJTiAhPSB6QXRpX0dldFBzTW92U3RhdCgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfUHJvY2Vzc0NtZEluUHNNb3ZTdGF0KHJlY3ZDbWRJbmQsIHBDaG5lbE5vZGUpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0jZW5kaWYNCi0gICAgICAgIHpBdGlfUHJvY2Vzc0NtZChyZWN2Q21kSW5kLCBwQ2huZWxOb2RlKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIC8vIFpBVDJfU01TX0VESVQgICAvKiC2zM/7z6LE2sjdyuTI69e0zKwgo6ywtLbMz/vPosTayN20psDtKi8NCi0gICAgICAgIHpBdGlfUHJvY2Vzc1NNU0RhdGEocmVjdkNtZEluZCwgcENobmVsTm9kZSk7DQotICAgIH0gICAgDQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfT3Blbg0KLSoguabE3MPoyvYgOiC08r+qzai1wA0KLSogss7K/cu1w/cgOiAoSU4po7oNCi0qICAgICAgICAgICAgaUNobmVsSWQgICAgIM2otcBJRA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9haQVRJMl9TVUNDRVNTo7vKp7Dct7W72LTtzvPA4NDNo7sNCi0qIMbky/zLtcP3IDogyM7O8b7N0Pe687LFxNy9+NDQzai1wLLZ1/ejuw0KLSogICAgICAgICAgICDNrNK7uPbNqLXAo6yyu8TctPK/qsG9tM6jrNDo0qq52LHVuvOyxcTctPK/qg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0lzVmFsaWRDaG5lbElkKFVJTlQ4IGlDaG5lbElkKQ0KLXsNCi0gICAgIHJldHVybiAoIGlDaG5lbElkID49IFpBVEkyX0NIQU5ORUxfSURfTlVNX1NUQVJUICYmIGlDaG5lbElkIDw9IFpBVEkyX0NIQU5ORUxfSURfTlVNX0VORCk7DQotfQ0KLQ0KLVNJTlQzMiBfX3BzX3N0YXRpY19mdW5jIHpBdGkyX09wZW4oVUlOVDggaUNobmVsSWQpDQotew0KLSAgICBpZiggZ196QXRpX0NvbnRleHQudGFza1N0YXR1cyAhPSBaQVRJMl9UQVNLX1NUQVRVU19SRUFEWQ0KLSAgICAgICAgfHwgIXpBdGlfSXNWYWxpZENobmVsSWQoaUNobmVsSWQpIA0KLSAgICAgICAgfHwgWkFUSTJfU1VDQ0VTUyA9PSB6QXRpX0dldENoYW5uZWxOb2RlKGlDaG5lbElkKSAgICAgICAvLyC4w82otcDS0b6ttPK/qiANCi0gICAgICAgIHx8IGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5pQ291bnQgPiBaQVRJMl9DSEFOTkVMX0lEX05VTUNPVU5UDQotICAgICAgICB8fCBOVUxMID09IGdfekF0aV9Db250ZXh0Lm11dGV4T3BlbkNobmVsDQotICAgICAgICApDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaQVRJMl9GQUxTRTsNCi0gICAgfQ0KLQ0KLSAgICBpZihaT1NTX1NVQ0NFU1MgPT0gek9zc19HZXRNdXRleChnX3pBdGlfQ29udGV4dC5tdXRleE9wZW5DaG5lbCwgWk9TU19XQUlUX0ZPUkVWRVIpKSANCi0gICAgew0KLSAgICAgICAgekF0aV9BZGRDaGFubmVsVG9MaXN0KGlDaG5lbElkKTsNCi0gICAgICAgIGlmKFpPU1NfU1VDQ0VTUyA9PSB6T3NzX1B1dE11dGV4KGdfekF0aV9Db250ZXh0Lm11dGV4T3BlbkNobmVsKSkvKiDKzbfFu6Wz4sG/ICovDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7ICAgICAgICAgICAgIA0KLSAgICAgICAgfSANCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gWkFUSTJfRkFMU0U7ICAgICAgICAgIA0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9HZXRDaGFubmVsTm9kZQ0KLSoguabE3MPoyvYgOiC78cih0+vNqLXAusXP4M2stcS94bXjDQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICBpQ2huZWxJZCAgICAg0OjSqrLp1dK1xMS/serNqLXASUQNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaa3tbvYWkFUSTJfU1VDQ0VTU6O7yqew3Le1u9haQVRJMl9GQUxTRaO7DQotKiDG5Mv8y7XD9yA6ILLp1dLNqLXAusWjrA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Q2hhbm5lbE5vZGUoVUlOVDggaUNobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSBnX3pBdGlfcHREYXRhLT50QXRDaG5lbExpc3QucENobmVsTm9kZTsNCi0gICAgDQotICAgIHdoaWxlKE5VTEwgIT0gcENobmVsTm9kZSkNCi0gICAgew0KLSAgICAgICAgaWYoaUNobmVsSWQgPT0gcENobmVsTm9kZS0+aUNobmVsSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHBDaG5lbE5vZGUgPSBwQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldENoYW5uZWxOb2RlUHRyDQotKiC5psTcw+jK9iA6ILvxyKHT682otcC6xc/gzay1xL3hteOjrM2syrG3tbvYveG149a41esNCi0qILLOyv3LtcP3IDogKElOKaO6DQotKiAgICAgICAgICAgIGlDaG5lbElkICAgICDQ6NKqsunV0rXExL+x6s2otcBJRA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9i4w73htePWuNXro6zKp7Dct7W72E5VTEwNCi0qIMbky/zLtcP3IDogsunV0s2otcC6xaOssqK3tbvYxuTU2sG0se3W0LXEveG149a41esNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1UX1pBdGlfQ2hhbm5lbEluZm8gKiBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoVUlOVDggaUNobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSBOVUxMOw0KLSAgICANCi0gICAgaWYoZ196QXRpX0NvbnRleHQudGFza1N0YXR1cyAhPSBaQVRJMl9UQVNLX1NUQVRVU19SRUFEWSB8fCAhekF0aV9Jc1ZhbGlkQ2huZWxJZChpQ2huZWxJZCkpIA0KLSAgICB7DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLQ0KLSAgICBwQ2huZWxOb2RlID0gZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LnBDaG5lbE5vZGU7DQotICAgIHdoaWxlKE5VTEwgIT0gcENobmVsTm9kZSkNCi0gICAgew0KLSAgICAgICAgaWYoaUNobmVsSWQgPT0gcENobmVsTm9kZS0+aUNobmVsSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHBDaG5lbE5vZGU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHBDaG5lbE5vZGUgPSBwQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHJCeU1taWFEZXN0SW5kZXgNCi0qILmmxNzD6Mr2IDogu/HIodPrzai1wLrFz+DNrLXEveG146OszazKsbe1u9i94bXj1rjV6yzNqLn9TU1JQbXExL+1xMv30v29+NDQsunV0rXEDQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICBpTW1pYURlc3RDaG5lbElkICAgICDQ6NKqsunV0rXETU1JQbXExL+1xMv30v0NCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaa3tbvYveG149a41euju8qnsNy3tbvYTlVMTKO7DQotKiDG5Mv8y7XD9yA6ILLp1dLNqLXAusWjrLKit7W72Mbk1NrBtLHt1tC1xL3htePWuNXrDQotKiAgICAgICAgICAgIMjrss6yu8Tczqq/1bvy1d8yNTUNCi0qICAgICAgICAgICAgxuTEv7XEy/fS/c/gtbHT2kFUSTK1xM2otcC6xQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfWkF0aV9DaGFubmVsSW5mbyAqIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRDaGFubmVsTm9kZVB0ckJ5TW1pYURlc3RJbmRleChCWVRFIGlNbWlhRGVzdENobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSBOVUxMOw0KLSAgICANCi0gICAgaWYoZ196QXRpX0NvbnRleHQudGFza1N0YXR1cyAhPSBaQVRJMl9UQVNLX1NUQVRVU19SRUFEWSkgDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGVsc2UgaWYoISgoaU1taWFEZXN0Q2huZWxJZCA+PSBaQVRJMl9DSEFOTkVMX0lEX05VTV9TVEFSVCkgJiYgKGlNbWlhRGVzdENobmVsSWQgPD0gWkFUSTJfQ0hBTk5FTF9JRF9OVU1fRU5EKSkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotICAgIGVsc2UvLyBpZihpTW1pYURlc3RDaG5lbElkID09IFpBVEkyX0lOVkFMX0lOREVYKQ0KLSAgICB7DQotICAgICAgICBwQ2huZWxOb2RlID0gZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LnBDaG5lbE5vZGU7DQotICAgICAgICB3aGlsZShOVUxMICE9IHBDaG5lbE5vZGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoaU1taWFEZXN0Q2huZWxJZCA9PSBwQ2huZWxOb2RlLT5pU3JjSW5kZXgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwQ2huZWxOb2RlID0gcENobmVsTm9kZTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBDaG5lbE5vZGU7DQotICAgICAgICAgICAgfQ0KLSAgICANCi0gICAgICAgICAgICBwQ2huZWxOb2RlID0gcENobmVsTm9kZS0+cE5leHRDbk5vZGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgfQ0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9HZXRDaGFubmVsTm9kZVB0ckJ5TW1pYVNyY0luZGV4DQotKiC5psTcw+jK9iA6ILvxyKHT682otcC6xc/gzay1xL3hteOjrM2syrG3tbvYveG149a41eujrM2ouf1NTUlBtcTUtMv30v29+NDQsunV0rXEDQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICBpTW1pYVNyY0NobmVsSWQgICAgINDo0qqy6dXStcRNTUlBtcTUtMv30v0NCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaa3tbvYveG149a41euju8qnsNy3tbvYTlVMTKO7DQotKiDG5Mv8y7XD9yA6ILLp1dLNqLXAusWjrLKit7W72Mbk1NrBtLHt1tC1xL3htePWuNXrDQotKiAgICAgICAgICAgINK7sOPAtMu1o6zNqLn9TU1JQbXExL+1xMv30v26xbLp1dKyu7W9wcujrLLFtfe4w7qvyv29+NDQsunV0g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVRfWkF0aV9DaGFubmVsSW5mbyAqIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRDaGFubmVsTm9kZVB0ckJ5TW1pYVNyY0luZGV4KFVJTlQxNiBpTW1pYVNyY0NobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSBOVUxMOw0KLSAgICANCi0gICAgaWYoZ196QXRpX0NvbnRleHQudGFza1N0YXR1cyAhPSBaQVRJMl9UQVNLX1NUQVRVU19SRUFEWSkgDQotICAgIHsNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotDQotICAgIHBDaG5lbE5vZGUgPSBnX3pBdGlfcHREYXRhLT50QXRDaG5lbExpc3QucENobmVsTm9kZTsgICAgDQotICAgIHdoaWxlKE5VTEwgIT0gcENobmVsTm9kZSkNCi0gICAgew0KLSAgICAgICAgaWYoaU1taWFTcmNDaG5lbElkID09IHBDaG5lbE5vZGUtPmlEZXN0SW5kZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgcENobmVsTm9kZSA9IHBDaG5lbE5vZGU7DQotICAgICAgICAgICAgcmV0dXJuIHBDaG5lbE5vZGU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHBDaG5lbE5vZGUgPSBwQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHJCeXN0YXRlDQotKiC5psTcw+jK9iA6ILLp1dLT682otcC6xc/gzay1xL3hteOjrM2syrG3tbvYveG149a41eujrM2ouf3NqLXA17TMrLLp1dINCi0qILLOyv3LtcP3IDogKElOKaO6DQotKiAgICAgICAgICAgIGlDaG5lbElkICAgICDQ6NKqsunV0rXExL+x6s2otcBJRA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9i4w73htePWuNXro6zKp7Dct7W72E5VTEwNCi0qIMbky/zLtcP3IDogsunV0s2otcC6xaOssqK3tbvYxuTU2sG0se3W0LXEveG149a41esNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1UX1pBdGlfQ2hhbm5lbEluZm8gKiB6QXRpX0dldENoYW5uZWxOb2RlUHRyQnlTdGF0ZShUX1pBdGlfRGF0YVR5cGUgZGF0YVR5cGUpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSBOVUxMOyAgDQotICAgIA0KLSAgICBpZihnX3pBdGlfQ29udGV4dC50YXNrU3RhdHVzICE9IFpBVEkyX1RBU0tfU1RBVFVTX1JFQURZKSANCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0gICAgZWxzZSBpZighKChkYXRhVHlwZSA+IFpBVEkyX0NIQU5ORUxfREFUQV9UWVBFX0lOVkFMKSAmJiAoZGF0YVR5cGUgPCBaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9DT1VOVFQpKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0NCi0gICAgcENobmVsTm9kZSA9IGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5wQ2huZWxOb2RlOw0KLSAgICANCi0gICAgd2hpbGUoTlVMTCAhPSBwQ2huZWxOb2RlKQ0KLSAgICB7DQotICAgICAgICBpZigoWkFUSTJfQ0hBTk5FTF9NT0RFX0RBVEEgPT0gcENobmVsTm9kZS0+c2VydmVyX21vZGUpICYmIChkYXRhVHlwZSA9PSBwQ2huZWxOb2RlLT5kYXRhVHlwZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIHBDaG5lbE5vZGU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHBDaG5lbE5vZGUgPSBwQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfQWRkQ2hhbm5lbFRvTGlzdA0KLSoguabE3MPoyvYgOiC52LHVzai1wA0KLSogss7K/cu1w/cgOiAoSU4po7oNCi0qICAgICAgICAgICAgaUNobmVsSWQgICAgINDo0qrU9rzTtcTEv7Hqzai1wElEDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rUgOiCzybmmt7W72FpBVEkyX1NVQ0NFU1Oju8qnsNy3tbvYWkFUSTJfRkFMU0Wjuw0KLSogxuTL/Mu1w/cgOiCy6dXSzai1wLrFo6wNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgX19wc19zdGF0aWNfZnVuYyB6QXRpX0FkZENoYW5uZWxUb0xpc3QoVUlOVDggaUNobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBOZXdDaG5lbE5vZGUgPSAoVF9aQXRpX0NoYW5uZWxJbmZvICopek9zc19NYWxsb2Moc2l6ZW9mKFRfWkF0aV9DaGFubmVsSW5mbykpOw0KLSAgICBpZihwTmV3Q2huZWxOb2RlID09IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaQVRJMl9GQUxTRTsNCi0gICAgfQ0KLSAgICAvKiDQwr3hteMgKi8NCi0gICAgek9zc19NZW1zZXQoKFVJTlQ4ICopcE5ld0NobmVsTm9kZSwgMCwgc2l6ZW9mKFRfWkF0aV9DaGFubmVsSW5mbykpOw0KLQ0KLSAgICBwTmV3Q2huZWxOb2RlLT5pQ2huZWxJZCA9IGlDaG5lbElkOw0KLSAgICBwTmV3Q2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX05PX0NPTU1BTkQ7IC8qID0gLTE7ICovDQotICAgIHBOZXdDaG5lbE5vZGUtPmNtZF9vcCA9IFpBVDJfQ09fSU5WQUxJRDsgLyogPSAtMTsgKi8NCi0gICAgekF0aV9Jbml0X0NtZEluZm8oJnBOZXdDaG5lbE5vZGUtPmNtZElucHV0SW5mbyk7DQotICAgIHBOZXdDaG5lbE5vZGUtPmlFdklkID0gWkFUSTJfSU5WQUxfRVZJRDsNCi0gICAgcE5ld0NobmVsTm9kZS0+c2VydmVyX21vZGUgPSBaQVRJMl9DSEFOTkVMX01PREVfQ01EOw0KLSAgICBwTmV3Q2huZWxOb2RlLT5pU3JjSW5kZXggPSBpQ2huZWxJZDsgLyogQVRJMtS0y/fS/brFo6zIoc2otcC6xSAqLw0KLSAgICBwTmV3Q2huZWxOb2RlLT5pRGVzdEluZGV4ID0gWkFUSTJfSU5WQUxfTU1JQV9JTkRFWDsNCi0gICAgcE5ld0NobmVsTm9kZS0+c2VydmVyX2lkID0gaUNobmVsSWQ7DQotICAgIHBOZXdDaG5lbE5vZGUtPnBOZXh0Q25Ob2RlID0gTlVMTDsNCi0gICAgcE5ld0NobmVsTm9kZS0+YklzQ2FyZEluaXRpbmcgPSBGQUxTRTsNCi0gICAgcE5ld0NobmVsTm9kZS0+SXNQcHAgPSBGQUxTRTsNCi0gICAgcE5ld0NobmVsTm9kZS0+SXNDbWRTdG9yZWQgPSBGQUxTRTsNCi0gICAgDQotICAgIHpBdGlfSW5zZXJ0Tm9kZUluU29ydGluZ0FzY2VuZChwTmV3Q2huZWxOb2RlKTsNCi0gICAgDQotICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9DbG9zZQ0KLSoguabE3MPoyvYgOiC52LHVzai1wA0KLSogss7K/cu1w/cgOiAoSU4po7oNCi0qICAgICAgICAgICAgaUNobmVsSWQgICAgIM2otcBJRA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9haQVRJMl9TVUNDRVNTo7vKp7Dct7W72FpBVEkyX0ZBTFNFo7sNCi0qIMbky/zLtcP3IDogDQotKiAgICAgICAgICAgIMzhuam4+NPDu6e3vb3Tv9oNCi0qICAgICAgICAgICAgyM7O8b7N0PfHsKGiuvO++b/JvfjQ0M2otcCy2df3o7vG5MS/tcTKx7nYsdXNqLXADQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIHpBdGkyX0Nsb3NlKFVJTlQ4IGlDaG5lbElkKQ0KLXsNCi0gICAgaWYoIGdfekF0aV9Db250ZXh0LnRhc2tTdGF0dXMgIT0gWkFUSTJfVEFTS19TVEFUVVNfUkVBRFkNCi0gICAgICAgIHx8ICF6QXRpX0lzVmFsaWRDaG5lbElkKGlDaG5lbElkKSANCi0gICAgICAgIHx8IFpBVEkyX1NVQ0NFU1MgIT0gekF0aV9HZXRDaGFubmVsTm9kZShpQ2huZWxJZCkgICAgICAgLy8guMPNqLXAzrS08r+qIA0KLSAgICAgICAgfHwgZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LmlDb3VudCA9PSAwDQotICAgICAgICB8fCBnX3pBdGlfQ29udGV4dC5tdXRleE9wZW5DaG5lbCA9PSBOVUxMDQotICAgICAgICApDQotICAgIHsNCi0gICAgICAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotICAgIH0NCi0NCi0gICAgaWYoWk9TU19TVUNDRVNTID09IHpPc3NfR2V0TXV0ZXgoZ196QXRpX0NvbnRleHQubXV0ZXhPcGVuQ2huZWwsIFpPU1NfV0FJVF9GT1JFVkVSKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9EZWxDaGFubmVsSW5MaXN0KGlDaG5lbElkKTsNCi0gICAgICAgIGlmKFpPU1NfU1VDQ0VTUyA9PSB6T3NzX1B1dE11dGV4KGdfekF0aV9Db250ZXh0Lm11dGV4T3BlbkNobmVsKSkvKiDKzbfFu6Wz4sG/ICovDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpPU1NfU1VDQ0VTUzsNCi0gICAgICAgIH0gIA0KLSAgICB9ICAgICAgIA0KLQ0KLSAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0RlbENoYW5uZWxJbkxpc3QNCi0qILmmxNzD6Mr2IDogtNPNqLXAwbSx7dbQyb6z/b3hteMNCi0qILLOyv3LtcP3IDogKElOKaO6DQotKiAgICAgICAgICAgIGlDaG5lbElkICAgICDQ6NKqyb6z/bXExL+x6s2otcBJRA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9haQVRJMl9TVUNDRVNTo7vKp7Dct7W72FpBVEkyX0ZBTFNFo7sNCi0qIMbky/zLtcP3IDogsunV0s2otcC6xaOssqLJvrP9o6y52LHVzai1wMqxyrnTww0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6QXRpX0RlbENoYW5uZWxJbkxpc3QoVUlOVDggaUNobmVsSWQpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBUYXJnZXRDaG5lbE5vZGUgPSBOVUxMOyAvKiDQwr3hteMgKi8NCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwVGVtcENobmVsTm9kZSA9IE5VTEw7IC8qINDCveG14yAqLyAgIA0KLQ0KLSAgICBwVGVtcENobmVsTm9kZSA9IE5VTEw7IC8qILXa0ru0zrfWxeQgKi8NCi0gICAgcFRhcmdldENobmVsTm9kZSA9IGdfekF0aV9wdERhdGEtPnRBdENobmVsTGlzdC5wQ2huZWxOb2RlOw0KLSAgICANCi0gICAgd2hpbGUocFRhcmdldENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBpZihwVGFyZ2V0Q2huZWxOb2RlLT5pQ2huZWxJZCA9PSBpQ2huZWxJZCkgLyog1dK1vb3hteMgKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihOVUxMID09IHBUZW1wQ2huZWxOb2RlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LnBDaG5lbE5vZGUgPSBwVGFyZ2V0Q2huZWxOb2RlLT5wTmV4dENuTm9kZTsgLyogwbSx7bXEtdrSu7j2veG14yAqLw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwVGVtcENobmVsTm9kZS0+cE5leHRDbk5vZGUgPSBwVGFyZ2V0Q2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICANCi0NCi0gICAgICAgICAgICBnX3pBdGlfcHREYXRhLT50QXRDaG5lbExpc3QuaUNvdW50ID0gZ196QXRpX3B0RGF0YS0+dEF0Q2huZWxMaXN0LmlDb3VudCAtIDE7DQotICAgICAgICAgICANCi0gICAgICAgICAgICB6T3NzX0ZyZWUocFRhcmdldENobmVsTm9kZSk7DQotICAgICAgICAgICAgcFRhcmdldENobmVsTm9kZSA9IE5VTEw7DQotICAgICAgICAgICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7DQotICAgICAgICB9DQotDQotICAgICAgICBwVGVtcENobmVsTm9kZSA9IHBUYXJnZXRDaG5lbE5vZGU7DQotICAgICAgICBwVGFyZ2V0Q2huZWxOb2RlID0gcFRhcmdldENobmVsTm9kZS0+cE5leHRDbk5vZGU7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9SZWdSZWN2Q2INCi0qILmmxNzD6Mr2IDog16Ky4bvYtfe6r8r9DQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICByZWN2RnVuYyAgICAgu9i197qvyv0NCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaa3tbvYWkFUSTJfU1VDQ0VTU6O7yqew3Le1u9i07c7z1K3S8qO7DQotKiDG5Mv8y7XD9yA6IMzhuam4+NPDu6e3vbqvyv2907/aDQotKiAgICAgICAgICAgIMjrss7WuNXrwODQzXR5cGVkZWYgU0lOVDMyICgqVF9aQXRpMl9BdFJlY3ZGdW5jKShVSU5UOCBjaGFubmVsSWQsDQotKiAgICAgICAgICAgIFVJTlQ4KiBwRGF0YVB0ciwgVUlOVDE2IGlEYXRhTGVuLCBVSU5UOCBpRmxhZyk7DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIF9fcHNfc3RhdGljX2Z1bmMgekF0aTJfUmVnUmVjdkNiKFRfWkF0aTJfQXRSZWN2RnVuYyByZWN2RnVuYykNCi17DQotICAgIGlmKE5VTEwgPT0gcmVjdkZ1bmMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaQVRJMl9GQUxTRTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9Db250ZXh0LnNlbmRGbmMgPSByZWN2RnVuYzsNCi0gICAgICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLSAgICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpMl9BdENoYW5uZWxGdW5jDQotKiC5psTcw+jK9iA6INeisuG72LX3uq/K/Q0KLSogss7K/cu1w/cgOiAoSU4po7oNCi0qICAgICAgICAgICAgcmVjdkZ1bmMgICAgILvYtfe6r8r9DQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rUgOiCzybmmt7W72FpBVEkyX1NVQ0NFU1Oju8qnsNy3tbvYtO3O89St0vKjuw0KLSogxuTL/Mu1w/cgOiDM4bmpuPjTw7unt726r8r9vdO/2g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6QXRpMl9BdENoYW5uZWxGdW5jKFRfekF0aV9BdENoYW5uZWxGdW5jIHBDaGFubmVsRnVuYykNCi17DQotICAgIGdfekF0aV9Db250ZXh0LnBVc29sQ2hhbm5lbEZ1bmMgPSBwQ2hhbm5lbEZ1bmM7DQotICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aTJfU2V0QWx3YXlzQXRSZXBvcnRDaGFubmVsDQotKiC5psTcw+jK9iA6IMq81tXJz7GoQVTD/MHutcTNqLXA16Ky4bvYtfe6r8r9o6y72LX3uq/K/be1u9jXqNPDzai1wLrFoaMNCi0qICAgICAgICAgICC1sdeo08PNqLXAusXT0NCnyrGjrNb3tq/Jz7Gow/zB7rK7ytzKx7fxutrGwS/BwcbB07DP7KOstrzU2rTLzai1wMnPsaihow0KLSogss7K/cu1w/cgOiAoSU4po7oNCi0qICAgICAgICAgICAgcENoYW5uZWxGdW5jIC0gu9i197qvyv2jrLvYtfe6r8r9t7W72Neo08PNqLXAusWhoyAgICAgIA0KLSogt7Ugu9gg1rUgOg0KLSogxuTL/Mu1w/cgOiDM4bmpuPiyzr+8yei8xrXEuq/K/b3Tv9oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekF0aTJfU2V0QWx3YXlzQXRSZXBvcnRDaGFubmVsKFRfekF0aV9BdENoYW5uZWxGdW5jIHBDaGFubmVsRnVuYykNCi17DQotICAgIGdfekF0aV9Db250ZXh0LnBBbHdheXNSZXBvcnRDaG5lbCA9IHBDaGFubmVsRnVuYzsNCi0gICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX1N3aXRjaA0KLSoguabE3MPoyvYgOiDH0Lu7zai1wNe0zKyjrNPJQ1PK/b7dzKzH0Lu7zqrD/MHuzKwNCi0qILLOyv3LtcP3IDogKElOKaO6DQotKiAgICAgICAgICAgIGlDaG5lbElkICAgICDNqLXASUQNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6ILPJuaa3tbvYWkFUSTJfU1VDQ0VTU6O7yqew3Le1u9haQVRJMl9GQUxTRaO7DQotKiDG5Mv8y7XD9yA6IMzhuam4+NPDu6e3vb3Tv9osvfbWp7PWQ1PK/b7dzKzH0Lu7DQotKiAgICAgICAgICAgIMjOzvG+zdD3uvOyxcTcvfjQ0M2otcCy2df3o7sNCi0qICAgICAgICAgICAgzazSu7j2zai1wKOssrvE3LnYsdXBvbTODQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotU0lOVDMyIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Td2l0Y2goIFRfWkF0aV9DaGFubmVsSW5mbyAqcENoYW5uZWxOb2RlLCBUX3pBdGkyX0N0cm1DaEluZCBpRmxhZykNCi17DQotICAgIGlmKGlGbGFnID09IFpBVEkyX0NISU5EX1RVUk5fQVQpDQotICAgIHsNCi0vKiAgICAgICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0RBVEEgPT0gcENoYW5uZWxOb2RlLT5zZXJ2ZXJfbW9kZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwQ2hhbm5lbE5vZGUtPnNlcnZlcl9tb2RlID0gWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRDsNCi0gICAgICAgICAgICBwQ2hhbm5lbE5vZGUtPmRhdGFUeXBlID0gWkFUSTJfQ0hBTk5FTF9EQVRBX1RZUEVfSU5WQUw7IA0KLSAgICAgICAgfSAqLw0KLSAgICAgICAgekF0aV9Vc2JTaW9EZWFjdGl2ZUJ5QXRpUmVxKHBDaGFubmVsTm9kZS0+aUNobmVsSWQpOw0KLSAgICAgICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7DQotICAgIH0NCi0gICAgZWxzZSBpZihpRmxhZyA9PSBaQVRJMl9DSElORF9UVVJOX1BTRCkNCi0gICAgew0KLSAgICAgICAgcENoYW5uZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9IFpBVEkyX0NIQU5ORUxfTU9ERV9EQVRBOw0KLSAgICAgICAgcENoYW5uZWxOb2RlLT5kYXRhVHlwZSA9IFpBVEkyX0NIQU5ORUxfREFUQV9UWVBFX1BTOyANCi0gICAgICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLSAgICB9DQotICAgIGVsc2UgaWYoaUZsYWcgPT0gWkFUSTJfQ0hJTkRfVFVSTl9DU0QpDQotICAgIHsNCi0gICAgICAgIHBDaGFubmVsTm9kZS0+c2VydmVyX21vZGUgPSBaQVRJMl9DSEFOTkVMX01PREVfREFUQTsNCi0gICAgICAgIHBDaGFubmVsTm9kZS0+ZGF0YVR5cGUgPSBaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9DU0Q7IA0KLSAgICAgICAgcmV0dXJuIFpBVEkyX1NVQ0NFU1M7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotICAgIH0NCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfU2VuZA0KLSoguabE3MPoyvYgOiDNqLn9zai1wLeiy81BVMP8we6jrLvy1d/K/b7dDQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICBpQ2huZWxJZCAgICAgu9i197qvyv0NCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICDK/b7d1rjV6w0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgIMr9vt2zpLbIDQotKiAgICAgICAgICAgIGlGbGFnICAgICAgICAgDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rUgOiCzybmmt7W72FpBVEkyX1NVQ0NFU1Oju8qnsNy3tbvYtO3O89St0vKjuw0KLSogxuTL/Mu1w/cgOiDM4bmpuPjTw7unt726r8r9vdO/2g0KLSogICAgICAgICAgICC21NPaQVRJyrGjrNDozOG5qbjDvdO/2g0KLSogICAgICAgICAgICC21NPatK6/2ihNVVgpxKPKvc/Co6zQ6NKq08O72LX3uq/K/dDOyr2jrNei0uLH+LHw0+u07sXkIA0KLSogICAgICAgICAgICA2MTYwMDAyNzAwODKyprrFu/LV37bPv6qyprrFuf2zzNbQs/bP1sLSwusNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgX19wc19zdGF0aWNfZnVuYyB6QXRpMl9TZW5kKFVJTlQ4IGlDaG5lbElkLCBVSU5UOCAqcERhdGFQdHIsIFVJTlQxNiBpRGF0YUxlbiwgVF96QXRpMl9DdHJtQ2hJbmQgaUZsYWcpDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUgPSB6QXRpX0dldENoYW5uZWxOb2RlUHRyKGlDaG5lbElkKTsgICAgIA0KLSAgICBpZihOVUxMID09IHBDaG5lbE5vZGUpIC8qILjDzai1wMO709C08r+qICovDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaQVRJMl9DSEFOTkVMX0lEX0VSUk9SOw0KLSAgICB9DQotDQotICAgIGlmKGlGbGFnID49IFpBVEkyX0NISU5EX1RVUk5fQVQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiB6QXRpX1N3aXRjaChwQ2huZWxOb2RlLCBpRmxhZyk7DQotICAgIH0NCi0NCi0gICAgaWYoKE5VTEwgPT0gcERhdGFQdHIpIHx8ICgwID09IGlEYXRhTGVuKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLSAgICB9DQotDQotICAgIGlmKChaQVRJMl9DSEFOTkVMX01PREVfQ01EID09IHBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlKSAmJiANCi0gICAgICAgIChaQVRJMl9DSElORF9QU0QgPT0gaUZsYWcgfHwgWkFUSTJfQ0hJTkRfUFNEVjYgPT0gaUZsYWcgfHxaQVRJMl9DSElORF9DU0QgPT0gaUZsYWcpKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWkFUSTJfRkFMU0U7LyrTyb/Y1sa53MDtys23xSovDQotICAgIH0NCi0NCi0gICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0RBVEEgPT0gcENobmVsTm9kZS0+c2VydmVyX21vZGUgJiYgWkFUSTJfQ0hJTkRfQVQgPT0gaUZsYWcpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsgDQotICAgICAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotICAgIH0NCi0NCi0gICAgaWYoKFpBVEkyX0NIQU5ORUxfTU9ERV9DTUQgPT0gcENobmVsTm9kZS0+c2VydmVyX21vZGUpICYmIChpRGF0YUxlbiA8PSBaQVRJMl9CVUZGRVJfTEVOR1RIKSkgLyogw/zB7te0zKwgKi8NCi0gICAgew0KLSAgICAgICAgVF9aQXRpX0NoYW5uZWxEYXRhQnVmICpwcmVjdkNtZEluZCA9IChUX1pBdGlfQ2hhbm5lbERhdGFCdWYgKil6QXRpX0dldFVCKHNpemVvZihUX1pBdGlfQ2hhbm5lbERhdGFCdWYpKTsNCi0gICAgICAgIHByZWN2Q21kSW5kLT5pQ2hhbm5lbCA9IGlDaG5lbElkOw0KLSAgICAgICAgcHJlY3ZDbWRJbmQtPmlEYXRhTGVuID0gaURhdGFMZW47DQotICAgICAgICB6T3NzX01lbWNweShwcmVjdkNtZEluZC0+c3RyRGF0YSwgcERhdGFQdHIsIGlEYXRhTGVuKTsNCi0NCi0gICAgICAgIHpPc3NfVGFza1NlbmQoRVZfWkFUSTJfUkVDVl9DT01NQU5EX0lORCwgcHJlY3ZDbWRJbmQsIHNpemVvZihUX1pBdGlfQ2hhbm5lbERhdGFCdWYpLCBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnByZWN2Q21kSW5kKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKFpBVEkyX0NIQU5ORUxfTU9ERV9EQVRBID09IHBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlKQ0KLSAgICB7DQotICAgICAgICBpZihaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9DU0QgPT0gcENobmVsTm9kZS0+ZGF0YVR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgI2lmbmRlZiBDT05GSUdfU0lOR0xFQ09SRQ0KLSAgICAgICAgICAgIC8qICC3osvNtb1DU0QgKi8NCi0gICAgICAgICAgICB6QXRpX0NzZFVwRGF0YVJlY3YoaUNobmVsSWQsIGlEYXRhTGVuLCBwRGF0YVB0cik7DQotICAgICAgICAgICAgI2VuZGlmDQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKFpBVEkyX0NIQU5ORUxfREFUQV9UWVBFX1BTID09IHBDaG5lbE5vZGUtPmRhdGFUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8qILeiy821vVBTRCAqLw0KLSAgICAgICAgICAgIHpBdGlfUHNpRGF0YVJlcVByb2MoaUNobmVsSWQsIHBEYXRhUHRyLCBpRGF0YUxlbiwgKEJPT0wpKGlGbGFnID09IFpBVEkyX0NISU5EX1BTRFY2KSk7IC8qILfi17Czyc/7z6KjrLeiy821vVRBRi9QREnIzs7xICovDQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLSAgICB9DQotDQotICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLX0NCi0jaWZkZWYgVVNFX1ZPSUNFX1NVUFBPUlQNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9HZXRDYWxsQ29udHJvbE1zZw0KLSoguabE3MPoyvajuiDF0LbPtbHHsMrHt/HOqkNDuvS90M/gudjP+8+iDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgaUV2SWQgICAgICAgICAgz/vPoklEDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDI9MrHQ0PP+8+it7W72FRSVUWjrMbky/u3tbvYRkFMU0U7DQotKiDG5Mv8y7XD96O6IM2z0ru53MDtQ0PP4LnYz/vPoqOst8DWudCt0unVu9DeuMRDQ8/7z6LWtbb41dKyu7W9uMPP+8+ioaMNCi0qICAgICAgICAgICAgaWYoKGlFdklkID49IFpQU19BcE1taWFfQ2NTZXR1cENuZl9FdikgJiYgDQotKiAgICAgICAgICAgICAgIChpRXZJZCA8PSBaUFNfQXBNbWlhX0NjUHJvY0luZm9JbmRfRXYpKSCyu7/JyKENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRDYWxsQ29udHJvbE1zZyhVSU5UMzIgaUV2SWQpDQotew0KLSAgICBzd2l0Y2goaUV2SWQpDQotICAgIHsNCi0gICAgICAgIGNhc2UgTU1JQV9DQ19BTlNfTU9ERV9SRVFfRVY6ICAgICAgICAgICAgDQotICAgICAgICBjYXNlIE1NSUFfQ0NfTU9ESUZZX1JFUV9FVjogICAgICAgICAgICANCi0gICAgICAgIGNhc2UgTU1JQV9DQ19ESVNfTU9ERV9SRVFfRVY6ICAgICAgICAgICAgICANCi0gICAgICAgIGNhc2UgRVZfWkFUSTJfRFRNRl9SRVE6DQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgIH0NCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfR2V0Q2FsbENvbnRyb2xDaGFubmVsSWQNCi0qILmmxNzD6Mr2IDogzai5/cv30v26xbvxtcPNqLXAusUNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1IDogs8m5pre1u9jNqLXAusWju8qnsNy3tbvYtO3O88Dg0M2juyANCi0qIMbky/zLtcP3IDogMSkg0OjSqsa9zKhBVEmxo9akzai1wMq508O1xNX9yLfQ1CAgDQotKiAgICAgICAgICAgIDIpILe1u9jNqLXAusWjrNXStb2+zbe1u9jT0NCnzai1wLrFo6y38dTyzqrO3tCnzai1wLrFIA0KLSogICAgICAgICAgICAzKSBNTUlBtcTUtMv30v26xb/JxNy3tbvYzt7Qp9a1MHhmZqOs1NpDQ8/7z6Kyzsr9s/a07cqxDQotKiAgICAgICAgICAgIDQpIFBTX0NDtcTUtMv30v26xbKisrvKx7nMtqjTs8nko6yyorK7ysewtMuz0PLRodTx1LTL99L9usW1xA0KLSogICAgICAgICAgICA1KSCyu9Do0qq21E1NSUG3osC0tcTUtMv30v3T0NCn0NS9+NDQxdC2z6Os0vK1sbLOyv3T0M7zo6zG5Le1u9gweGZm1/fOqtS0y/fS/Q0KLSogICAgICAgICAgICA2KSC9082ouvOjrLLF0+tNTUlBtcTUtC/Ev7XEy/fS/brFvajBornYz7Uot723qDEpDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVF9aQXRpX0NoYW5uZWxJZCB6QXRpX0dldENhbGxDb250cm9sQ2hhbm5lbElkKFVJTlQ4ICpwRGF0YVB0ciwgVUlOVDE2IGlEYXRhTGVuKQ0KLXsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaUNjTnVtID0gMDsNCi0gICAgQk9PTCAgICAgICAgICAgICAgICAgICAgIGJTdWNjZXNzRmluZCA9IEZBTFNFOw0KLSAgICBUX3pNbWlhQ2NfQ2FsbFN0YXRlSW5kICAqcHRBcEluZCA9IChUX3pNbWlhQ2NfQ2FsbFN0YXRlSW5kICopcERhdGFQdHI7DQotICAgIA0KLSAgICBmb3IoaUNjTnVtID0gMDsgaUNjTnVtIDwgWkFUSTJfTUFYX0NBTExfTlVNOyBpQ2NOdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVhpZCA9PSBwdEFwSW5kLT5iQ2FsbElkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKHB0QXBJbmQtPmJDYWxsU3RhdGUgPT0gIFpBVEkyX0NBTExfU1RBVEVfTlVMTCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlTcmNJbmRleCA9IFpBVEkyX0lOVkFMX01NSUFfSU5ERVg7DQotICAgICAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlEZXN0SW5kZXggPSBaQVRJMl9JTlZBTF9NTUlBX0lOREVYOw0KLSAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUgPSBaQVRJMl9DQUxMX1NUQVRFX05VTEw7DQotICAgICAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlYaWQgPSBaQVRJMl9JTlZBTF9NTUlBX0lOREVYOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pU3JjSW5kZXggPSBwdEFwSW5kLT5iRGVzSW5kZXg7DQotICAgICAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlEZXN0SW5kZXggPSBwdEFwSW5kLT5iU3JjSW5kZXg7DQotICAgICAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmNhbGxTdGF0ZSA9IHB0QXBJbmQtPmJDYWxsU3RhdGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJTdWNjZXNzRmluZCA9IFRSVUU7DQotICAgICAgICAgICAgYnJlYWs7ICAvKiBTRVRVUF9DTkbWu8TcttTTprW90ru49tS0oaLEv7XEy/fS/brFo6y5ymJyZWFrICovDQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoIWJTdWNjZXNzRmluZCkNCi0gICAgew0KLSAgICAgICAgZm9yKGlDY051bSA9IDA7IGlDY051bSA8IFpBVEkyX01BWF9DQUxMX05VTTsgaUNjTnVtKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVhpZCA9PSBaQVRJMl9JTlZBTF9NTUlBX0lOREVYKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVNyY0luZGV4ID0gcHRBcEluZC0+YkRlc0luZGV4Ow0KLSAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pRGVzdEluZGV4ID0gcHRBcEluZC0+YlNyY0luZGV4Ow0KLSAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUgPSBwdEFwSW5kLT5iQ2FsbFN0YXRlOw0KLSAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pWGlkID0gcHRBcEluZC0+YkNhbGxJZDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBTRVRVUF9DTkbWu8TcttTTprW90ru49tS0oaLEv7XEy/fS/brFo6y5ymJyZWFrICovDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHJldHVybiAoVF9aQXRpX0NoYW5uZWxJZClwdEFwSW5kLT5iRGVzSW5kZXg7DQotfQ0KLSNlbmRpZg0KLS8vLy0tLS0tLS0tLS0tLS0tLcrVtb3G5Mv7xKO/6SDP+8+itKbA7Q0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldE5vblJlcG9ydE1zZ0lkeA0KLSoguabE3MPoyvYgOiC78ciht8fJz7Goz/vPos/CseoNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBkd01zZ0lkICAgICAgz/vPorrFDQotKiAgICAgICAgICAgIChPVVQpo7oNCi0qICAgICAgICAgICAgIHBNc2dJZHggICA6INSktKbA7c/7z6LK/dfp1tC1xM/CseoNCi0qILe1ILvYINa1o7og1dK1vbe1u9haX1NVQ0MsICDDu9PQ1dK1vbe1u9haX0ZBSUwNCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXROb25SZXBvcnRNc2dJZHgoRFdPUkQgZHdNc2dJZCwgV09SRCAqcE1zZ0lkeCkNCi17DQotICAgIFdPUkQgd1RhYklkeCA9IDA7DQotDQotICAgIGZvciAod1RhYklkeCA9IDA7IHdUYWJJZHggPCAoc2l6ZW9mKGdfekF0aV9Ob25SZXBvcnRNc2dUYWJsZSkgLyBzaXplb2YoVF96QXRpX05vblJlcG9ydE1zZykpOyB3VGFiSWR4KyspDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9Ob25SZXBvcnRNc2dUYWJsZVt3VGFiSWR4XS5pTXNnSWQgPT0gZHdNc2dJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAqcE1zZ0lkeCA9IHdUYWJJZHg7DQotICAgICAgICAgICAgcmV0dXJuIFpfU1VDQzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gWl9GQUlMOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9QcmVQcm9jTXNnDQotKiC5psTcw+jK9iA6ILj5vt3PwrHqtKbA7bfHyc+xqM/7z6IsIA0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHdBdE1lbUNuZk1zZ0lkeDogICAgICDP+8+iz8Kx6g0KLSogICAgICAgICAgICBwYk1zZ0JvZHkgICAgICAgICAgIDogICAgIM/7z6LM5Q0KLSAqICAgICAgICAgICB3TXNnTGVuICAgICAgICAgICAgICA6ICAgICDP+8+is6S2yA0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1Byb2NOb25SZXBvcnRNc2coV09SRCB3QXRNZW1DbmZNc2dJZHgsIEJZVEUgKnBiTXNnQm9keSwgV09SRCB3TXNnTGVuKQ0KLXsNCi0gICAgZ196QXRpX05vblJlcG9ydE1zZ1RhYmxlW3dBdE1lbUNuZk1zZ0lkeF0ucEVuZEZuYyhwYk1zZ0JvZHkpIDsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9HZXRQcmVNc2dJZHgNCi0qILmmxNzD6Mr2IDogu/HIodSktKbA7c/7z6LPwrHqDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgZHdNc2dJZCAgICAgIM/7z6K6xQ0KLSogICAgICAgICAgICAoT1VUKaO6DQotKiAgICAgICAgICAgICBwTXNnSWR4ICAgOiDUpLSmwO3P+8+iyv3X6dbQtcTPwrHqDQotKiC3tSC72CDWtaO6INXStb23tbvYWl9TVUNDLCAgw7vT0NXStb23tbvYWl9GQUlMDQotKiDG5Mv8y7XD96O6IM7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0UHJlTXNnSWR4KERXT1JEIGR3TXNnSWQsIFdPUkQgKnBNc2dJZHgpDQotew0KLSAgICBXT1JEIHdUYWJJZHggPSAwOyAgICANCi0gICAgZm9yICh3VGFiSWR4ID0gMDsgd1RhYklkeCA8IHNpemVvZihhdFByZU91dGVyTXNnKSAvIHNpemVvZihUX3pBdGlfUHJlT3V0ZXJNc2dUYWIpOyB3VGFiSWR4KyspDQotICAgIHsNCi0gICAgICAgIGlmKGF0UHJlT3V0ZXJNc2dbd1RhYklkeF0uZHdNc2dJZD09IGR3TXNnSWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBNc2dJZHggPSB3VGFiSWR4Ow0KLSAgICAgICAgICAgIHJldHVybiBaX1NVQ0M7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFpfRkFJTDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfUHJlUHJvY01zZw0KLSoguabE3MPoyvYgOiC4+b7dz8Kx6tSktKbA7c/7z6IsIA0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHdEaXN0cmlidXRlTXNnSWR4OiAgICAgIM/7z6LPwrHqDQotKiAgICAgICAgICAgIHBiTXNnQm9keSAgICAgICAgICAgOiAgICAgz/vPoszlDQotICogICAgICAgICAgIHdNc2dMZW4gICAgICAgICAgICAgIDogICAgIM/7z6KzpLbIDQotKiAgICAgICAgICAgIChPVVQpo7pwZHdDaGFuZ2VkTXNnSWQgIDog0N64xLrztcRtc2dJRA0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1ByZVByb2NNc2coV09SRCB3UHJlTXNnSWR4LCBCWVRFICpwYk1zZywgV09SRCB3TXNnTGVuLCBEV09SRCAqIHBkd0NoYW5nZWRNc2dJZCwgIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpDQoteyAgICANCi0gICAgRFdPUkQgZHdFcnJvclR5cGUgPSBhdFByZU91dGVyTXNnW3dQcmVNc2dJZHhdLnBQcmVIYW5kbGVNc2cocGJNc2csIHBkd0NoYW5nZWRNc2dJZCwgcENobmVsTm9kZSk7DQotICAgIGlmICggZHdFcnJvclR5cGUgPT0gWl9BUE1NSUFfTk9SRVNVTFQgKQ0KLSAgICB7DQotICAgICAgICAgLy8g1KS0psDts8m5pqOs0OjSqr340ruyvbSmwO2jrLTLtKbKssO0tryyu9f2DQotICAgIH0NCi0gICAgZWxzZSBpZiggZHdFcnJvclR5cGUgPT0gWl9BUE1NSUFfTk9FUlJPUl9FUlIpDQotICAgIHsNCi0gICAgICAgIC8vILSmwO2zybmmo6zWsb3Tu9i4tE9LDQotICAgICAgICAvLyC4w7fW1qfTps6qY29uZmlybSDP+8+iDQotICAgICAgICBpZihwQ2huZWxOb2RlICE9IE5VTEwpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9SZXBseU9LKCBwQ2huZWxOb2RlKTsNCi0gICAgICAgICAgICB6QXRpX1JlbW92ZU9uZUNtZChwQ2huZWxOb2RlKTsgDQotICAgICAgICAgICAgekF0aV9EZWNNdWx0aUNtZChwQ2huZWxOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIC8vILTtzvO0psDtIA0KLSAgICAgICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfUHJvY0Vycm9yKHBDaG5lbE5vZGUsIGR3RXJyb3JUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTFRFIEdvVGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Jc0FscmVhZHlSZXBseQ0KLSoguabE3MPoyvYgOiDF0LbPyse38crH0tG+rdaxvdO72Li0uf21xM/s06bP+8+iDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IHRydWUsZmFsc2UNCi0qIMbky/zLtcP3o7ogvK/Iurrq1Nq6r8r9xNrTwyy21NLRvq272Li0uf21xM/7z6INCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgINTZytW1vc/s06bKsdTazeLD5r7NsrvSqtTZx+XNqLXAwcsNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Jc0FscmVhZHlSZXBseShEV09SRCBkd01zZ0lkKQ0KLXsNCi0gICAgLyrH68fz0tG+rbvYuLS5/U9LKi8NCi0gICAgc3dpdGNoIChkd01zZ0lkKQ0KLSAgICB7DQotICAgIGNhc2UgTU1JQV9DQ19ESVNDX0NORl9FVjoNCi0gICAgY2FzZSBNTUlBX0NDX0FOU19NT0RFX0NORl9FVjoNCi0gICAgY2FzZSBNTUlBX0NDX01PQ19DTkZfRVY6DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIA0KLSAgICByZXR1cm4gRkFMU0U7DQotDQotfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLVZPSUQgekF0aV9EZWxpdmVyWnJlZGlhbEVuZEluZChCWVRFIGJDYWxsSWQpDQotew0KLSAgICBVSU5UMTYgIHN0ckxlbj0wOw0KLSAgICBDSEFSICpwU3RyQ21kID0gTlVMTDsNCi0NCi0gICAgcFN0ckNtZCA9IChDSEFSICopekF0aV9HZXRVQihaQVQyX1NIT1JUX0NNRF9MRU4pOw0KLQ0KLSAgICAvKitaUkVESUFMRU5EOiA8Y2FsbGlkPiovDQotICAgIHNwcmludGYoKGNoYXIgKilwU3RyQ21kLCAiJXMrWlJFRElBTEVORDogJWQlcyIsIGdfekF0X0NSTEYsIGJDYWxsSWQsIGdfekF0X0NSTEYpOw0KLSAgICBzdHJMZW4gPSAoVUlOVDE2KXN0cmxlbigoY29uc3QgY2hhciAqKXBTdHJDbWQpOw0KLQ0KLSAgICB6QXRpX0RlbGl2ZXJBbGxNc2coQVBfTU1JQV9SRURJQUxFTkRfSU5EX0VWLCBwU3RyQ21kLCBzdHJMZW4pOw0KLQ0KLSAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwU3RyQ21kKTsNCi0gICAgcmV0dXJuOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Qcm9jUmVwb3J0TXNnDQotKiC5psTcw+jK9qO6ILSmwO20+NPQyc+xqLXE0ruw48/7z6K6r8r9o6wgaW5ku/JjbmYNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9Qcm9jUmVwb3J0TXNnKERXT1JEIGR3TXNnSWQsIEJZVEUgKnBiTXNnQm9keSwgV09SRCB3TXNnTGVuLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgQ0hBUiAgICAgICAgICAgICAgICAgICAgKnBFbmNvZGVDbWQgPSBOVUxMOw0KLSAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBpRW5jb2RlQ21kTGVuID0gMDsNCi0gICAgVF9aQXQyX0NtZElkVHlwZSAgICAgICAgICAgICBjbWRfaWQgPSBaQVQyX05PX0NPTU1BTkQ7ICAgICAgICAgLyogtbHHsLXEw/zB7iAgICovDQotICAgIFRfWkF0Ml9DbWRPcFR5cGUgICAgICAgICAgICAgY21kX29wID0gWkFUMl9DT19JTlZBTElEOyAgICAgICAgIC8qILLZ1/fXtMysICAgICAqLw0KLSAgICANCi0gICAgLyogIDEsILfHv9XNqLXAo6zS0b6tu9i4tLn9tcTQxdSqo6zWsb3Tt7W72A0KLSAgICAgICAgIDIsICC/1c2otcCjrLfH1ve2r8nPsajP+8+io6zWsb3Tt7W72A0KLSAgICAgICovDQotICAgICBpZihwQ2huZWxOb2RlICE9IE5VTEwpDQotICAgICB7DQotICAgICAgICAgaWYoIXpBdGlfSGFuZGxlQ25mTXNnQmVmb3JlRW5jQ21kKGR3TXNnSWQsIHBiTXNnQm9keSwgd01zZ0xlbiwgcENobmVsTm9kZSkpDQotICAgICAgICAgew0KLSAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgfQ0KLSAgICAgICAgIGNtZF9pZCA9IHBDaG5lbE5vZGUtPmNtZF9pZDsNCi0gICAgICAgICBjbWRfb3AgPSBwQ2huZWxOb2RlLT5jbWRfb3A7DQotICAgICB9DQotDQotICAgIC8vIC4uLiDQ6L+8wsfNqLXA1NrKssO0yrG68sflv9UNCi0gICAgaUVuY29kZUNtZExlbiA9IHpBdF9FbmNDbWQoZHdNc2dJZCwgcGJNc2dCb2R5LCAmcEVuY29kZUNtZCwgJmNtZF9pZCwgJmNtZF9vcCk7DQotICAgIGlmKGlFbmNvZGVDbWRMZW4gPT0gMCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIGlmKGR3TXNnSWQgPT0gQVBfTU1JQV9TTV9DT05ORUNUX0lORF9FViAgJiYgcENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICAvLyBzbb34yOvK/b7dzKyjrLWlzai1wMnPsaijrLKix9DI68r9vt3MrA0KLSAgICAgICAgekF0aV9TZW5kU21Db25uZWN0SW5kKHBiTXNnQm9keSxwRW5jb2RlQ21kLCBpRW5jb2RlQ21kTGVuLCBwQ2huZWxOb2RlKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKHpBdGlfSXNJbmRpQ2F0ZUNuZk1zZyhkd01zZ0lkLCBwYk1zZ0JvZHkpIHx8ekF0aV9Jc0RlbGl2ZXJBbGxNc2coZHdNc2dJZCkpIC8vKFpBVEkyX0NIQU5ORUxfSURfTlVNQUxMID09IGNoYW5uZWxJZCkgLyogyLq3oiAqLw0KLSAgICB7DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotICAgICAgICBpZihkd01zZ0lkID09IEFQX01NSUFfQ0VORF9JTkRfRVYgJiYgcENobmVsTm9kZSAhPSBOVUxMKSAgDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gzrS9qMGiyv2+3dK1zvHHsKOszai1wL/JxNzOqr/Vo6zV4sqxsrvTw8fQu7vNqLXADQotICAgICAgICAgICAgLy+50rbPtee7sKOsz8jH0M2otcC1vcP8we7MrKOs1NnJz7GoDQotICAgICAgICAgICAgekF0aV9IYW5kbGVDY0Rpc2NJbmQocENobmVsTm9kZSk7DQotICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICB6QXRpX0RlbGl2ZXJBbGxNc2coZHdNc2dJZCwgcEVuY29kZUNtZCwgaUVuY29kZUNtZExlbik7ICAgDQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotICAgICAgICBpZiggZHdNc2dJZCA9PSBBUF9NTUlBX0NPTk5fSU5EX0VWICYmIHBDaG5lbE5vZGUgIT0gTlVMTCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyC9082otee7sKOsz8jJz7Goo6zU2cfQtb3K/b7dzKwNCi0gICAgICAgICAgICB6QXRpX1NlbmRDb25uSW5kKHBiTXNnQm9keSwgcEVuY29kZUNtZCwgaUVuY29kZUNtZExlbiwgcENobmVsTm9kZSk7Ly82MTcwMDE3NzYwMjMgbHhoIDEwLjA5DQotICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICBpZihkd01zZ0lkID09IE1NSUFfU01fUERQX0FDVElWQVRFX0lORF9FVikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyDPyMnPsaijrLrzt6LP+8+iDQotICAgICAgICAgICAgVF96RGV2X0F0TWVtX1NNX0F1dG9Sc3AgdEF0RGF0YSAgICA9IHswfTsNCi0gICAgICAgICAgICBUX3pBcE1taWFfU21NdEFjdEFuc19SZXEgdEFwQW5zUmVxID0gezB9Ow0KLSAgICAgICAgICAgIFRfek1taWFTbV9QZHBBY3RfSW5kICpwU21NdEFjdEluZCA9IChUX3pNbWlhU21fUGRwQWN0X0luZCopcGJNc2dCb2R5Ow0KLSAgICAgICAgICAgIHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX0F1dG9Sc3AsIDAsIChQQllURSkmdEF0RGF0YSwgZ196QXRpX0N1ckluc3RhbmNlKTsgICAgDQotICAgICAgICAgICAgaWYoekF0aV9HZXRNdEF1dG9BbnNNc2cocFNtTXRBY3RJbmQtPnRQZHBBZGRyLmJQZHBUeXBlLCAoUEJZVEUpJnRBdERhdGEsICZ0QXBBbnNSZXEpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9TZW5kU21BbnNSZXEoJnRBcEFuc1JlcSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICAgICAgaWYgKGR3TXNnSWQgPT0gTU1JQV9DQ19DQUxMX1NUQVRFX0lORF9FVikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUX3pNbWlhQ2NfQ2FsbFN0YXRlSW5kICpwRHNjaUluZCA9IChUX3pNbWlhQ2NfQ2FsbFN0YXRlSW5kKilwYk1zZ0JvZHk7DQotICAgICAgICAgICAgaWYgKChwRHNjaUluZC0+YkNhbGxTdGF0ZSA9PSBaX01NSUFDQ19DQUxMX1NUQVRFX0VORCkgJiYgKHBEc2NpSW5kLT5iUmVpYWxGbGFnID09IDEpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9EZWxpdmVyWnJlZGlhbEVuZEluZChwRHNjaUluZC0+YkNhbGxJZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgLyogzai1wM6qv9W78rraxsHPwrK70OjSqtb3tq/Jz7GotcTP+8+iLLaqxvouILTLtKbWu7SmwO1jbmbP+8+iKi8NCi0gICAgICAgIGlmKCEocENobmVsTm9kZSA9PSBOVUxMIHx8IHpBdGlfSXNEZWxpdmVyTXNnQnlQb3dlcihkd01zZ0lkKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZW5kRW5jRGF0YShwQ2huZWxOb2RlLCAoQllURSAqKXBFbmNvZGVDbWQsIGR3TXNnSWQsIHBiTXNnQm9keSk7DQotDQotICAgICAgICAgICAgLyrT9rW91tC85M/7z6LKsbK71/a0psDttcjK1bW91+7W1c/7z6LKsdTZtKbA7SovDQotICAgICAgICAgICAgaWYoISh6QXRpX0lzSW50ZXJtZWRpYXRlTXNnKGR3TXNnSWQsIHBiTXNnQm9keSkgfHwgekF0aV9Jc0FscmVhZHlSZXBseShkd01zZ0lkKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwQ2huZWxOb2RlLT5jbWRfaWQgPSBaQVQyX05PX0NPTU1BTkQ7DQotICAgICAgICAgICAgICAgIHBDaG5lbE5vZGUtPmNtZF9vcCA9IFpBVDJfQ09fSU5WQUxJRDsNCi0gICAgICAgICAgICAgICAgekF0aV9SZW1vdmVPbmVDbWQocENobmVsTm9kZSk7DQotICAgICAgICAgICAgICAgIHpBdGlfRGVjTXVsdGlDbWQocENobmVsTm9kZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnBFbmNvZGVDbWQpOyANCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9DaGVja1JlY3ZNc2cNCi0qILmmxNzD6Mr2o7ogttTK1bW9tcTP+8+ivfjQ0LP1sr287LLpDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgaUV2SWQgICAgICAgICAgz/vPoklEDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6ILrPt6i3tbvYWl9TVUNDo6y38dTyt7W72FpfRkFJTA0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBCWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9DaGVja1JlY3ZNc2coVUlOVDMyIGlFdklkLCBVSU5UOCAqcERhdGFQdHIsIFVJTlQxNiBpRGF0YUxlbikNCi17DQotICAgIGlmKFpBVEkyX1RBU0tfU1RBVFVTX1JFQURZICE9IGdfekF0aV9Db250ZXh0LnRhc2tTdGF0dXMpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0ZBSUw7IC8qIEFUSTLOtL7N0Pehorvy1d/Izs7xsbu52LHVo6zU8rK7xNzN+c/CtKbA7SAqLw0KLSAgICB9DQotDQotICAgIC8qIChTTSlNVMfrx/O8pLvux7C3osbwo6zOqr/Vz/vPoiAqLw0KLSAgICAvKiA2MTcwMDI0NzY3NzIgttS/1c/7z6K0psDt0sXCqcHLTU1JQV9DQ19DTE9TRV9WT0lDRV9DSE5MX0lORF9FVi0taHljLS0gKi8NCi0gICAgLyogNjE3MDAyNDg3MzkzLSDLq7T9VUW1xNChx/jS1Lyw1tjRoUNDT9DFz6K0pbeiyc+xqKOszbPSu7C01dVaQ0FUvdO/2sq1z9YtLWh5Yy0tICovDQotDQotICAgIGlmKGlFdklkID09IE1NSUFfU01fSURMRV9DSE5MX1FVRVJZX0lORF9FViAgfHwNCi0gICAgICAgaUV2SWQgPT0gTU1JQV9VTU1fVVBEQVRFX0RVQUxQU1NZU0NPTkZJR19JTkRfRVYgfHwNCi0gICAgICAgaUV2SWQgPT0gTU1JQV9DQ19EVUFMUFNDRkdfSU5EX0VWIHx8DQotICAgICAgIGlFdklkID09IE1NSUFfVU1NX0lNU05PVFNVUFBPUlRfSU5EX0VWIHx8DQotICAgICAgIGlFdklkID09IE1NSUFfVU1NX0NTX0NBTExfU1RBUlRfSU5EX0VWIHx8DQotICAgICAgIGlFdklkID09IE1NSUFfVU1NX0NTX0NBTExfRU5EX0lORF9FVikNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfU1VDQzsNCi0gICAgfQ0KLSAgICBpZigoTlVMTCA9PSBwRGF0YVB0cikgfHwgKDAgPT0gaURhdGFMZW4pKSAvKiDQrdLp1bvP7NOmz/vPorK7xNzOqr/VICovDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0ZBSUw7DQotICAgIH0NCi0gICAgcmV0dXJuIFpfU1VDQzsNCi19DQotDQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNQcmVQcm9jSW5kTXNnKFVJTlQzMiBpRXZJZCkNCi17DQotICAgIC8qINDo0qrUpLSmwO21xNb3tq/Jz7Goz/vPoiovDQotICAgIHN3aXRjaChpRXZJZCkNCi0gICAgeyAgDQotICAgIGNhc2UgTU1JQV9VTU1fUExNTl9JTkZPX0lORF9FVjoNCi0gICAgY2FzZSBNTUlBX0NDX01UQ19JTkRfRVY6DQotICAgIGNhc2UgQVBfTU1JQV9TTV9NRU1fQVZBSUxfSU5EX0VWOg0KLSANCi0gICAgY2FzZSBNTUlBX1NNX0NPTk5FQ1RfSU5EX0VWOg0KLSAgICBjYXNlIEFQX1VJQ0NfVUlDQ09LX0lORF9FVjoNCi0gICAgY2FzZSBNTUlBX0NCU19EQVRBX0lORF9FVjoNCi0gICAgY2FzZSBNTUlBX1NNU19ERUxJVkVSX1JFQ19JTkRfRVY6DQotICAgIGNhc2UgTU1JQV9TTVNfU1RBVFVTX1JFQ19JTkRfRVY6DQotICAgIGNhc2UgTU1JQV9DQ19TU19OT1RJRllfSU5EX0VWOiANCi0gICAgY2FzZSBNTUlBX0NDX0RJU0NfSU5EX0VWOg0KLSAgICBjYXNlIE1NSUFfQ0NfUFJPQ19JTkZPX0lORF9FVjoNCi0gICAgY2FzZSBBUF9NTUlBX1BCX0lOSVRfQ09NUF9JTkRfRVY6DQotDQotICAgIC8qIM/Cw+bBvbj2z/vPosvkyLvU2npBdGlfSXNEZWxpdmVyQWxsTXNn1tDT0Cy1q8rHzqrBy7K7ytxnX1pBdGlfUG93ZXJJbmRGbGFntcTTsM/sLMjU0qrF0CovDQotICAgIGNhc2UgQVBfVUlDQ19TTE9UX0lORF9FVjoNCi0gICAgY2FzZSBNTUlBX1VNTV9NTV9JTkZPX0lORF9FVjoNCi0NCi0gICAgY2FzZSBBUF9NTUlBX1NNX1NBVkVfQ05GX0VWOg0KLSAgICBjYXNlIEFQX1VJQ0NfSU5JVF9DTkZfRVY6DQotICAgIGNhc2UgQVBfVUlDQ19JTklUX0lORF9FVjoNCi0gICAgY2FzZSBBUF9VSUNDX0NPTU1PTl9DTkZfRVY6DQotICAgIGNhc2UgTU1JQV9VTU1fUkZfQ1RSTF9DTkZfRVY6DQotICAgIGNhc2UgTU1JQV9MMUVfWkVQQ0dfQ05GOg0KLSAgICBjYXNlIE1NSUFfQVNfTEJTX0NORl9FVjoNCi0gICAgY2FzZSBNTUlBX0NDX0RJU0NfQ05GX0VWOg0KLSAgICBjYXNlIE1NSUFfQ0NfQU5TX01PREVfQ05GX0VWOg0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotDQotICAgIGRlZmF1bHQ6DQotICAgICAgICBicmVhazsNCi0gICAgfSAgICANCi0gICAgDQotICAgIHJldHVybiBGQUxTRTsNCi19DQotDQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfRW1JbmZvUXJ5Q25mRGVzSW5kZXhJc0ludmFpbGRQcm9jKERXT1JEIGR3TXNnSWQsIEJZVEUgKnBiTXNnQm9keSkNCi17DQotICAgIC8quaSzzMSjyr2y6dGvx+vH88S/tcTL99L9zqrO3tCnMLvy1d8yNTXLtcP3yse199PDuq/K/b3Tv9q0pbeitcS78cihKi8NCi0gICAgaWYgKChBU19RVUVSWV9FTV9DRUxMX0lORk9fQ05GX0VWID09IGR3TXNnSWQpICYmICgoKChUX3pFTV9FbUluZm9fSW5kKilwYk1zZ0JvZHkpLT5iRGVzSW5kZXggPT0gMCkgfHwgKCgoVF96RU1fRW1JbmZvX0luZCopcGJNc2dCb2R5KS0+YkRlc0luZGV4ID09IDB4ZmYpKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9HZXRFbUluZm9NdXRleChnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLQ0KLSAgICAgICAgaWYgKGdfekF0aV9FbUluZm9bZ196QXRpX0N1ckluc3RhbmNlXS5wdEVtSW5mbyAhPSBaT1NTX05VTEwpDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19NZW1jcHkoZ196QXRpX0VtSW5mb1tnX3pBdGlfQ3VySW5zdGFuY2VdLnB0RW1JbmZvLCBwYk1zZ0JvZHksIHNpemVvZihUX3pFTV9FbUluZm9fSW5kKSk7DQotICAgICAgICB9DQotDQotICAgICAgICB6QXRpX0RlY3JlYXNlUmVxQ291bnRBbmRSZWxNdXRleFNlbWFwaG9yZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9SZWN2U2VydmVySGFuZGxlclNsYXZlcg0KLSoguabE3MPoyvajuiDX986qQVRJMijQrdLp1bu3vbXEQVRJKaOsvdPK1c/7z6K0psDtuq/K/Q0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIGlFdklkICAgICAgICAgIM/7z6JJRA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiDO3g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKERXT1JEIGR3TXNnSWQsIEJZVEUgKnBiTXNnQm9keSwgV09SRCB3TXNnTGVuKQ0KLXsNCi0gICAgV09SRCAgICB3SWR4ICA9IDA7ICAgLy8gu/HIobXEz/vPosv30v0NCi0gICAgaWYoekF0aV9DaGVja1JlY3ZNc2coZHdNc2dJZCxwYk1zZ0JvZHksIHdNc2dMZW4pID09IFpfRkFJTCkNCi0gICAgew0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGJNc2dCb2R5KTsgDQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgaWYgKHpBdGlfRW1JbmZvUXJ5Q25mRGVzSW5kZXhJc0ludmFpbGRQcm9jKGR3TXNnSWQsIHBiTXNnQm9keSkpDQotICAgIHsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnBiTXNnQm9keSk7DQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0gICAgLy8gu/HIoc2otcDKp7Dco6zWsb3Tt7W72KOsDQotICAgIC8vILfHyc+xqM/7z6K0psDto6yw/MCotOZBVG1lbaGitPK/qs2otcCjrLeiy83P+8+itcgNCi0gICAgaWYgKHpBdGlfR2V0Tm9uUmVwb3J0TXNnSWR4KGR3TXNnSWQgLCAmd0lkeCkgPT0gWl9TVUNDKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1Byb2NOb25SZXBvcnRNc2cod0lkeCAsIHBiTXNnQm9keSwgd01zZ0xlbik7DQotICAgIH0NCi0gICAgZWxzZSAvLyDJz7Goz/vPog0KLSAgICB7DQotICAgICAgICBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlID0gekF0aV9HZXRDaG5lbE5vZGUoZHdNc2dJZCxwYk1zZ0JvZHksIHdNc2dMZW4pOw0KLSAgICAgICAgaWYocENobmVsTm9kZSA9PSBOVUxMICYmICF6QXRpX0lzRGVsaXZlckFsbE1zZyhkd01zZ0lkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoIXpBdGlfSXNQcmVQcm9jSW5kTXNnKGR3TXNnSWQpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogNjE3MDAyNDg3NDE0IFtWMy4zLjEwQjAyXSBBVEm21E1NSUFfU01TX1JFQ19SU1BfQ05GX0VWtKbA7c60ys23xcTatOYqLw0KLSAgICAgICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGJNc2dCb2R5KTsNCi0gICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoekF0aV9HZXRQcmVNc2dJZHgoZHdNc2dJZCAsICZ3SWR4KSA9PSBaX1NVQ0MpDQotICAgICAgICB7DQotICAgICAgICAgICAgRFdPUkQgZHdDaGFuZ2VkTXNnSWQgPSBaQVRJX0lOVkFMSURfTVNHSUQ7DQotICAgICAgICAgICAgekF0aV9QcmVQcm9jTXNnKHdJZHggLCBwYk1zZ0JvZHksIHdNc2dMZW4sICZkd0NoYW5nZWRNc2dJZCwgcENobmVsTm9kZSk7DQotICAgICAgICAgICAgZHdNc2dJZCA9IGR3Q2hhbmdlZE1zZ0lkOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyogILK70OjSqtSktKbA7bvy1KS0psDts8m5prrz0OjSqr340ruyvbSmwO0qLw0KLSAgICAgICAgaWYoZHdNc2dJZCAhPSBaQVRJX0lOVkFMSURfTVNHSUQpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9Qcm9jUmVwb3J0TXNnKGR3TXNnSWQscGJNc2dCb2R5LCB3TXNnTGVuLCBwQ2huZWxOb2RlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvLyDP+8+iys23xaOs1ru0y9K7tKYNCi0gICAgekF0aV9SZXRVQigoVk9JRCAqKikmcGJNc2dCb2R5KTsNCi0gICAgcmV0dXJuOw0KLX0NCi0jaWZkZWYgWl9EVUFMQ0FSRF9BREFQVA0KLVZPSUQgekF0aV9DbGVhclNlbGZBZGFwdEdsb2JWYXIoQllURSBiSW5zTm8pDQotew0KLSAgICBnX3pBdGlfYXREYXRhRXhbYkluc05vXS5Jc0NmZ0NoZ2luZyA9IEZBTFNFOw0KLSAgICBnX3pBdGlfYXREYXRhRXhbYkluc05vXS5Jc0ZseW1vZGUgPSBGQUxTRTsNCi0gICAgZ196QXRpX2F0RGF0YUV4W2JJbnNOb10uSXNOZWVkT3V0Rmx5bW9kZSA9IEZBTFNFOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX0lzQ3VyclN0YWNrSW5GbHltb2RlDQotKrqvyv25psTcOsXQts+1scewyse38c60v6rJ5Ma1DQotKsbky/vLtcP3Os7eDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIHpBdGlfSXNTdGFja0luUmZDbG9zZShCWVRFIGJJbnNObykNCi17DQotICAgIGlmKFpfQVBNTUlBX0NGVU5GVU5fRElTQk9USFJGID09IGdfekF0aV9hdERhdGFFeFtiSW5zTm9dLnRGdW4uYlJmVmFsIHx8DQotICAgICAgICAgICAgWl9BUE1NSUFfQ0ZVTkZVTl9NSU5JRlVOID09IGdfekF0aV9hdERhdGFFeFtiSW5zTm9dLnRGdW4uYlJmVmFsKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLSNpZmRlZiBaX0RVQUxDQVJEX0FEQVBUIA0KLVZPSUQgekF0aV9HZXRTdGFja0ludG9GbHltb2RlKEJZVEUgYkluc05vKQ0KLXsNCi0gICAgaWYoekF0aV9Jc1N0YWNrSW5SZkNsb3NlKGJJbnNObykpLyrS0b6tyse52MnkxrXXtMysKi8NCi0gICAgew0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W2JJbnNOb10uSXNGbHltb2RlID0gVFJVRTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZENmdW5TZXRSZXEoWl9BUE1NSUFfQ0ZVTkZVTl9ESVNCT1RIUkYsIGJJbnNObyk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX05lZWRDaGFuZ2VJbk5vQ2hhbmdlDQotKrqvyv25psTcOtTaw7vT0MrKxeTKscrVtb3Q6NKqysrF5A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX05lZWRDaGFuZ2VJbk5vQ2hhbmdlKFZPSUQpDQotew0KLSAgICBpZih6QXRpX0lzQ21kQ2huZWxJZElkZWwoWl9BVElfSU5TTk9fMSkpDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS5Jc0NmZ0NoZ2luZyA9IFRSVUU7DQotICAgICAgICAvKtDo0qrWw7vYs/XKvMys0tTH+LfW0MK1xMrKxeTXtMysKi8NCi0gICAgICAgIHpBdGlfSW5kaWNhdENmZ1N0YXJ0KCk7IC8qyc+xqCtaUFNDRkdTVEFSVCovDQotICAgICAgICB6TmFzX1NldEV2ZW50U3RhcnQoWl9BVElfSU5TTk9fMSwgWl9BVElfRVZFTlRfQ0FSRF9DT05GSUcpOw0KLSAgICAgICAgekF0aV9HZXRTdGFja0ludG9GbHltb2RlKFpfQVRJX0lOU05PXzEpOw0KLSAgICB9DQotDQotICAgIGlmKHpBdGlfSXNDbWRDaG5lbElkSWRlbChaX0FUSV9JTlNOT18yKSkNCi0gICAgew0KLSAgICAgICAgLyrQ6NKq1sO72LP1yrzMrNLUx/i31tDCtcTKysXk17TMrCovDQotICAgICAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl0uSXNDZmdDaGdpbmcgPSBUUlVFOw0KLSANCi0gICAgICAgIGlmKCFnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNDZmdDaGdpbmcpIC8qsdzD4tbYuLTJz7GoKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX0luZGljYXRDZmdTdGFydCgpOw0KLSAgICAgICAgICAgIHpOYXNfU2V0RXZlbnRTdGFydChaX0FUSV9JTlNOT18yLCBaX0FUSV9FVkVOVF9DQVJEX0NPTkZJRyk7DQotICAgICAgICB9DQotDQotICAgICAgICB6QXRpX0dldFN0YWNrSW50b0ZseW1vZGUoWl9BVElfSU5TTk9fMik7DQotICAgIH0NCi0gICAgLyrBvbT9zrS/qsnkxrW/ydLU1rG909bYyeheU1lTQ09ORklHKi8NCi0gICAgaWYoZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLklzRmx5bW9kZSAmJiANCi0gICAgICAgIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS5Jc0ZseW1vZGUpDQotICAgIHsNCi0gICAgICAgIHpBdGlfRXhjaGFuZ2VTeXNjb25maWcoKTsNCi0gICAgICAgIHpBdGlfSW5kaWNhdENmZ0VuZCgpOyAvKsnPsagrWlBTQ0ZHRU5EKi8NCi0gICAgICAgIGdfekF0aV9wdERhdGEtPmJOZWVkQ2hnRmcgPSBaX05PX05FRURfQ0hBTkdFOw0KLSAgICAgICAgekF0aV9DbGVhclNlbGZBZGFwdEdsb2JWYXIoWl9BVElfSU5TTk9fMSk7ICAvKsfls/3Iq77WKi8NCi0gICAgICAgIHpBdGlfQ2xlYXJTZWxmQWRhcHRHbG9iVmFyKFpfQVRJX0lOU05PXzIpOyAgLyrH5bP9yKu+1iovDQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX05lZWRDaGFuZ2VJblNpbmdsZUNmZ0NoYW5naW5nDQotKrqvyv25psTcOsXQts+0psDtyse38bu509DS8s2otcCyu7/Vz9C2+MO7ysrF5LXEx+m/9g0KLSrG5Mv7y7XD9zq0y7qvyv3Kx7SmwO3Su7T9zai1wL/Vz9C2+MHt0ru0/bK7v9XP0NLUvLANCi0q1Nm0zsrVtb1ORUVEQ0ZHtcTH6b/2yrHSu7T9ysrF5NbQ0ru0/bu5w7vT0MrKxeS1xMfpv/YNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9OZWVkQ2hhbmdlSW5TaW5nbGVDZmdDaGFuZ2luZyhWT0lEKQ0KLXsNCi0gICAgaWYoekF0aV9Jc0NtZENobmVsSWRJZGVsKFpfQVRJX0lOU05PXzEpICYmIA0KLSAgICAhZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLklzQ2ZnQ2hnaW5nKQ0KLSAgICB7DQotICAgICAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNDZmdDaGdpbmcgPSBUUlVFOw0KLSAgICAgICAgekF0aV9HZXRTdGFja0ludG9GbHltb2RlKFpfQVRJX0lOU05PXzEpOw0KLSAgICB9DQotDQotICAgIGlmKHpBdGlfSXNDbWRDaG5lbElkSWRlbChaX0FUSV9JTlNOT18yKSAmJg0KLSAgICAhZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLklzQ2ZnQ2hnaW5nKQ0KLSAgICB7DQotICAgICAgIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS5Jc0NmZ0NoZ2luZyA9IFRSVUU7DQotICAgICAgIHpBdGlfR2V0U3RhY2tJbnRvRmx5bW9kZShaX0FUSV9JTlNOT18yKTsNCi0gICAgfQ0KLQ0KLSAgICAvKsG9tP3OtL+qyeTGtb/J0tTWsb3T1tjJ6F5TWVNDT05GSUcqLw0KLSAgICBpZihnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNGbHltb2RlICYmIA0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLklzRmx5bW9kZSkNCi0gICAgew0KLSAgICAgICAgekF0aV9FeGNoYW5nZVN5c2NvbmZpZygpOw0KLSAgICAgICAgekF0aV9JbmRpY2F0Q2ZnRW5kKCk7IC8qyc+xqCtaUFNDRkdFTkQqLw0KLSAgICAgICAgZ196QXRpX3B0RGF0YS0+Yk5lZWRDaGdGZyA9IFpfTk9fTkVFRF9DSEFOR0U7DQotICAgICAgICB6QXRpX0NsZWFyU2VsZkFkYXB0R2xvYlZhcihaX0FUSV9JTlNOT18xKTsgIC8qx+Wz/cirvtYqLw0KLSAgICAgICAgekF0aV9DbGVhclNlbGZBZGFwdEdsb2JWYXIoWl9BVElfSU5TTk9fMik7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX05vTmVlZENoYW5nZUluU2luZ2xlQ2ZnQ2hhbmdpbmcNCi0quq/K/bmmxNw6vfbT0NK7uPa0/bv6suDU2srKxeTKscrVtb1OT05FRURDRkcNCi0qtKbA7dSt1PI6tbHHsFNZU0NPTkZJR7/PtqjDu9PQysrF5MXQts/Kx7fx0OjSqg0KLSqz9rfJ0NDEo8q9LNDo0qrU8rP2LLfx1PLKysXkveHK+A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9Ob05lZWRDaGFuZ2VJblNpbmdsZUNmZ0NoYW5naW5nKFZPSUQpDQotew0KLSAgICBCWVRFIGJJbnNObyA9IDA7DQotICAgIGlmKGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS5Jc0NmZ0NoZ2luZykNCi0gICAgew0KLSAgICAgICAgYkluc05vID0gWl9BVElfSU5TTk9fMTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGJJbnNObz0gWl9BVElfSU5TTk9fMjsNCi0gICAgfQ0KLQ0KLSAgICBpZihnX3pBdGlfYXREYXRhRXhbYkluc05vXS5Jc0ZseW1vZGUpDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9hdERhdGFFeFtiSW5zTm9dLklzTmVlZE91dEZseW1vZGUpLyrTyUFUSbSlt6K9+MjrtcS3ydDQxKPKvSovDQotICAgICAgICB7DQotICAgICAgICAgICAgZ196QXRpX3B0RGF0YS0+SXNPdXRGbHltb2RlSW5nID0gVFJVRTsNCi0gICAgICAgICAgICB6QXRpX1NlbmRDZnVuU2V0UmVxKFpfQVBNTUlBX0NGVU5GVU5fRlVMTEZVTiwgYkluc05vKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgLyrOtL+qyeTGtSovDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9DbGVhclNlbGZBZGFwdEdsb2JWYXIoWl9BVElfSU5TTk9fMSk7ICAvKsfls/3Iq77WKi8NCi0gICAgICAgICAgICB6QXRpX0NsZWFyU2VsZkFkYXB0R2xvYlZhcihaX0FUSV9JTlNOT18yKTsNCi0gICAgICAgICAgICB6QXRpX0luZGljYXRDZmdFbmQoKTsgLyrJz7GoK1pQU0NGR0VORCovDQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrqvyv3D+7PGOnpBdGlfTm9OZWVkQ2hhbmdlSW5EdWFsQ2hhbmdpbmcNCi0quq/K/bmmxNw61NrBvbT9vvnU2srKxeTW0MrVtb1OT05FRURDRke1xLSmwO0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9Ob05lZWRDaGFuZ2VJbkR1YWxDaGFuZ2luZyhWT0lEKQ0KLXsNCi0gICAgQllURSBiQW5vdGhJbnNObyA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPT0gWl9BVElfSU5TTk9fMSk/IFpfQVRJX0lOU05PXzI6IFpfQVRJX0lOU05PXzE7DQotDQotICAgIGlmKGdfekF0aV9hdERhdGFFeFtiQW5vdGhJbnNOb10uSXNGbHltb2RlICYmIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLklzRmx5bW9kZSkNCi0gICAgew0KLSAgICAgICAgekF0aV9PdXRGbHltb2RlSW5TZWxmQWRhcHQoKTsvKrXIwb20/b75vfjI67fJ0NDEo8q91Nm0psDtKi8NCi0gICAgICAgIGdfekF0aV9wdERhdGEtPklzT3V0Rmx5bW9kZUluZyA9IFRSVUU7Lyq0y8qx1sHJ2dPQ0ru0/dDo0qqz9rfJ0NDEo8q9Ki8NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8Y6ekF0aV9OZWVkQ2hhbmdlSW5EdWFsQ2hhbmdpbmcNCi0quq/K/bmmxNw6tcjBvbT9vvm9+Mjrt8nQ0MSjyr2687P2t8nQ0MSjyr0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9OZWVkQ2hhbmdlSW5EdWFsQ2hhbmdpbmcoVk9JRCkNCi17DQotICAgIEJZVEUgYkFub3RoSW5zTm8gPSAoZ196QXRpX0N1ckluc3RhbmNlID09IFpfQVRJX0lOU05PXzEpPyBaX0FUSV9JTlNOT18yOiBaX0FUSV9JTlNOT18xOw0KLQ0KLSAgICBpZihnX3pBdGlfYXREYXRhRXhbYkFub3RoSW5zTm9dLklzRmx5bW9kZSAmJiBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS5Jc0ZseW1vZGUpDQotICAgIHsNCi0gICAgICAgIHpBdGlfRXhjaGFuZ2VTeXNjb25maWcoKTsNCi0gICAgICAgIHpBdGlfT3V0Rmx5bW9kZUluU2VsZkFkYXB0KCk7DQotICAgICAgICBnX3pBdGlfcHREYXRhLT5iTmVlZENoZ0ZnID0gWl9OT19ORUVEX0NIQU5HRTsNCi0gICAgICAgIGdfekF0aV9wdERhdGEtPklzT3V0Rmx5bW9kZUluZyA9IFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrqvyv3D+7PGOnpBdGlfSGFuZGxlRHVhbENhcmRDaGFuZ2UNCi0quq/K/bmmxNw6y6u/qMurtP3Eo8q9z8LLq7+o19TKytOmDQotKrSmwO3UrdTyOg0KLSogMSnI57n7wb20/ba8w7vT0NTaysrF5NbQ1Nm0zsrVtb1ORUVEQ0ZH1PLV/bOjtKbA7by0v8kNCi0qIDIpyOe5+8G9tP22vMO709DU2srKxeTW0NTZtM7K1bW9Tk9ORUVEQ0ZHy7XD98O709DKysXk0rLO3tDrtKbA7Q0KLSogMynU2bTOytW1vU5PTkVFRENGR8fSvfbSu7T9tKbT2srKxeTW0CzI59LRvq29+Mjrt8nQ0MSjyr3U8taxvdO4+b7dx+m/9rP2t8nQ0MSjyr294cr4ysrF5CwNCi0qICAgICDI57n7w7vT0L34yOu3ydDQxKPKvcu1w/fV/dTavfjI67fJ0NDEo8q91PLU2srVtb3P7NOm1sO9+Mjrt8nQ0MSjyr2689TatMu0psDtDQotKjQp1Nm0zsrVtb1ORUVEQ0ZHx9K99tK7tP20ptPaysrF5NbQLNPJ09pTWVNDT05GSUe7uc60z8K3oiy8zND4tKbA7by0v8kNCi0qNSnI57n7tbHHsNX9tKbT2rP2t8nQ0MSjyr25/bPM1tDK1bW9yM66zk5FRURDRke1xLHq1r62vL32vMfCvNK7z8IstP2z9s3qt8nQ0MSjyr2689TZtKbA7Q0KLSo2KcjnufvBvbT9trzU2srKxeTW0NTZtM7K1bW9TkVFRENGR8fSzrTU2rP2t8nQ0MSjyr3W0CzLtcP3tbHHsNbBydnT0NK7tP3V/bSm09q9+Mjrt8nQ0MSjyr0NCi0qICAgILXEuf2zzNbQLLWxx7BTWVNDT05GSUfSssO709C0psDtLLzM0Pi0psDtvLS/yS4NCi0qNynI57n7wb20/ba81NrKysXk1tDU2bTOytW1vU5PTkVFRENGR8fSzrTU2rP2t8nQ0MSjyr3W0CzLtcP31sHJ2dPQ0ru0/dX91Nq0ptPavfjI67fJ0NDEo8q9DQotKiAgICC1xLn9s8zW0Cy1yMG9tP2++b34yOu3ydDQxKPKvbrzsrvU2b27u7tTWVNDT05GSUcs1rG907P2t8nQ0MSjyr0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICovDQotVk9JRCB6QXRpX0hhbmRsZUR1YWxDYXJkU2VsZkFkYXB0KFZPSUQpDQotew0KLSAgICBpZihnX3pBdGlfcHREYXRhLT5Jc091dEZseW1vZGVJbmcpDQotICAgIHsNCi0gICAgICAgIHJldHVybjsvKrP2t8nQ0MSjyr25/bPM1tCyu9f2yM66zrSmwO0qLw0KLSAgICB9DQotICAgIC8qw7vT0MrKxeS1q9Do0qrKysXkKi8NCi0gICAgaWYoWl9ORUVEX0NIQU5HRSA9PSBnX3pBdGlfcHREYXRhLT5iTmVlZENoZ0ZnICYmDQotICAgICFnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNDZmdDaGdpbmcgJiYgIWdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS5Jc0NmZ0NoZ2luZykNCi0gICAgew0KLSAgICAgICAgekF0aV9OZWVkQ2hhbmdlSW5Ob0NoYW5nZSgpOw0KLSAgICB9DQotICAgIC8q1rvT0NK7tP20ptPaysrF5NbQwe3Su7T90vLNqLXAsru/1c/QtvjDu9PQysrF5A0KLSAgICAgICAg1rvT0NK7tP20ptPaysrF5NbQ1Nm0zsrVtb3Q6NKqysrF5CovDQotICAgIGVsc2UgaWYoWl9ORUVEX0NIQU5HRSA9PSBnX3pBdGlfcHREYXRhLT5iTmVlZENoZ0ZnICYmIA0KLSAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNDZmdDaGdpbmcgIT0gZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLklzQ2ZnQ2hnaW5nKQ0KLSAgICB7DQotICAgICAgICB6QXRpX05lZWRDaGFuZ2VJblNpbmdsZUNmZ0NoYW5naW5nKCk7DQotICAgIH0NCi0gICAgLyrWu9PQ0ru0/bSm09rKysXk1tDK1bW9zt7Q68rKxeQqLw0KLSAgICBlbHNlIGlmKFpfTk9fTkVFRF9DSEFOR0UgPT0gZ196QXRpX3B0RGF0YS0+Yk5lZWRDaGdGZyAmJg0KLSAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0uSXNDZmdDaGdpbmcgIT0gZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLklzQ2ZnQ2hnaW5nKQ0KLSAgICB7DQotICAgICAgICB6QXRpX05vTmVlZENoYW5nZUluU2luZ2xlQ2ZnQ2hhbmdpbmcoKTsNCi0gICAgfQ0KLSAgICAvKsG9tP2++dTaysrF5NbQytW1vc7e0OvKysXkKi8NCi0gICAgZWxzZSBpZihaX05PX05FRURfQ0hBTkdFID09IGdfekF0aV9wdERhdGEtPmJOZWVkQ2hnRmcgJiYNCi0gICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLklzQ2ZnQ2hnaW5nICYmIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS5Jc0NmZ0NoZ2luZykNCi0gICAgew0KLSAgICAgICAgekF0aV9Ob05lZWRDaGFuZ2VJbkR1YWxDaGFuZ2luZygpOw0KLSAgICB9DQotICAgIC8qwb20/b751NrKysXk1tC1yMirsr+9+NDQt8nQ0MSjyr268727u7tTWVNDT05GSUez9rfJ0NDEo8q9Ki8NCi0gICAgZWxzZSBpZihaX05FRURfQ0hBTkdFID09IGdfekF0aV9wdERhdGEtPmJOZWVkQ2hnRmcgJiYgDQotICAgIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS5Jc0NmZ0NoZ2luZyAmJiBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl0uSXNDZmdDaGdpbmcpDQotICAgIHsNCi0gICAgICAgIHpBdGlfTmVlZENoYW5nZUluRHVhbENoYW5naW5nKCk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLQ0KLX0NCi0jZW5kaWYNCi1WT0lEIHpBdGlfRW5jT0tFcnJvcihCT09MIGJSZXN1bHQpDQotew0KLSAgICBpZiAoYlJlc3VsdCkNCi0gICAgew0KLSAgICAgICAgc3ByaW50ZigoY2hhciAqKWdfekF0X0VuY0J1ZiwgIiVzIiwgIGdfekF0X09LKTsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHNwcmludGYoKGNoYXIgKilnX3pBdF9FbmNCdWYsICIlc0VSUk9SJXMiLCBnX3pBdF9DUkxGLGdfekF0X0NSTEYpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfWnBvZHdSZXFQcm9jDQotKiC5psTcw+jK9qO6INPDu6e3osvNQVQrWlBPRFcNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6ICtaUE9EVzogPGJSZXN1bHQ+IChpbmNsdWRpbmcgdHdvIHJlYXNvbnMpDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICANCi1EV09SRCB6QXRpX1pwb2R3UmVxUHJvYyhWT0lEICpwRGF0YVB0cikNCi17DQotICAgIHpBdGlfRW5jT0tFcnJvcigoQk9PTCkoRFJWX1NVQ0NFU1MgPT0gekRydl9TaHV0RG93bigpKSk7DQotICAgIHJldHVybiBaX0FQTU1JQV9OT0VSUk9SX0VSUjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfQm9hcmRudW1SZXFQcm9jDQotKiC5psTcw+jK9qO6INPDu6e3osvNQVQrQk9BUkROVU0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6ICtCT0FSRE5VTTogPGJSZXN1bHQ+IChpbmNsdWRpbmcgdHdvIHJlYXNvbnMpDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICANCi1EV09SRCB6QXRpX0JvYXJkbnVtUmVxUHJvYyhWT0lEICpwRGF0YVB0cikNCi17DQotICAgIFRfWkF0aV9Cb2FyZG51bVNldFJlcSAgICAgICpwdGJvYXJkbnVtUmVxID0gKFRfWkF0aV9Cb2FyZG51bVNldFJlcSopcERhdGFQdHI7DQotICAgIHpBdGlfRW5jT0tFcnJvcigoQk9PTCkoWk9TU19TVUNDRVNTID09IHpQU19OdkFNVEl0ZW1Xcml0ZShBQkJPUkROVW1fTlZQQVJBTSwgcHRib2FyZG51bVJlcS0+YWJOdW0sIFpBVDJfTUFYX0JPUkROQU1FX0xFTikpKTsNCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PRVJST1JfRVJSOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Cb2FyZG51bVF1ZXJ5UmVxUHJvYw0KLSoguabE3MPoyvajuiDTw7unt6LLzUFUK0JPQVJETlVNx+vH88no1sMNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6ICtCT0FSRE5VTTogPE5VTT4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLURXT1JEIHpBdGlfQm9hcmRudW1RdWVyeVJlcVByb2MoVk9JRCAqcERhdGFQdHIpDQotew0KLSAgICBDSEFSICpwU3RyV2FsayA9IGdfekF0X0VuY0J1ZjsNCi0gICAgI2lmICFkZWZpbmVkKF9DSElQX1pYMjk3NTEwKSAmJiAhZGVmaW5lZChfQ0hJUF9aWDI5NzUyMF9MQVRFUikNCi0gICAgQllURSAgaSA9IDA7DQotICAgIEJZVEUgIGlhZGRyVG1wID0gMDsNCi0gICAgI2VuZGlmDQotICAgIEJZVEUgIGFiTnVtW1pBVDJfTUFYX0JPUkROQU1FX0xFTisxXSA9IHswfTsNCi0NCi0gICAgaWYgKFpPU1NfU1VDQ0VTUyA9PSB6UFNfTnZBTVRJdGVtUmVhZChBQkJPUkROVW1fTlZQQVJBTSwgYWJOdW0sIFpBVDJfTUFYX0JPUkROQU1FX0xFTikpDQotICAgIHsNCi0gICAgDQotICAgICAgICBwU3RyV2FsayArPSBzcHJpbnRmKChjaGFyICopcFN0cldhbGssICIlcytCT0FSRE5VTTogIiwgZ196QXRfQ1JMRik7DQotDQotICAgICAgICANCi0gICAgICAgICNpZiAhZGVmaW5lZChfQ0hJUF9aWDI5NzUxMCkgJiYgIWRlZmluZWQoX0NISVBfWlgyOTc1MjBfTEFURVIpDQotDQotICAgICAgICBmb3IgKGkgPSAwO2kgPCBaQVQyX01BWF9CT1JETkFNRV9MRU47aSsrLCBwU3RyV2FsayArPSAyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlhZGRyVG1wID0gKFVJTlQ4KSgoYWJOdW1baV0gPDwgNCkgfCAoYWJOdW1baV0gPj4gNCkpOw0KLSAgICAgICAgICAgIHNwcmludGYoKGNoYXIgKilwU3RyV2FsaywgIiUwMlgiLCBpYWRkclRtcCk7DQotICAgICAgICB9DQotICAgICAgICAjZWxzZQ0KLSAgICAgICAgc25wcmludGYoKGNoYXIgKilwU3RyV2FsaywgWkFUMl9NQVhfQk9SRE5BTUVfTEVOLCAiJXMiLCBhYk51bSk7DQotICAgICAgICBwU3RyV2FsayArPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RyV2Fsayk7DQotICAgICAgICAjZW5kaWYNCi0gICAgICAgIHNwcmludGYoKGNoYXIgKilwU3RyV2FsaywgIiVzJXMiLCBnX3pBdF9DUkxGLCBnX3pBdF9PSyk7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzcHJpbnRmKChjaGFyICopZ196QXRfRW5jQnVmLCAiJXNFUlJPUiVzIiwgZ196QXRfQ1JMRixnX3pBdF9DUkxGKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9FUlJPUl9FUlI7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1Byb2R0ZXN0UmVxUHJvYw0KLSoguabE3MPoyvajuiDTw7unt6LLzUFUK1BST0RURVNUx+vH88no1sMNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6SWYgdGhlcmUgaXMgbm8gPGJiPiwrUFJPRFRFU1Q6PGl2YWx1ZT4gSWYgdGhlcmUgaXMgPGJiPiwgT0sNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLURXT1JEIHpBdGlfUHJvZHRlc3RSZXFQcm9jKFZPSUQgKnBEYXRhUHRyKQ0KLXsNCi0gICAgVF9aQXRpX1Byb2R0ZXN0UmVxICpwdHByb2R0ZXN0UmVxID0gKFRfWkF0aV9Qcm9kdGVzdFJlcSopcERhdGFQdHI7DQotDQotICAgIEJZVEUgYlZhbHVlID0gMDsNCi0gICAgQllURSAgICBiUmVzdWx0ID0gKFpBVDJfQ09fU0VUX1JFUSA9PSBwdHByb2R0ZXN0UmVxLT5iQ29tbWFuZE9wKT8gDQotICAgICAgICAoWk9TU19TVUNDRVNTID09IHpQU19OdkFNVEZsYWdzSXRlbVdyaXRlKChOdlBhcmFtX0FNVEZsYWdzKXB0cHJvZHRlc3RSZXEtPmlUZXN0VmFsdWUsJnB0cHJvZHRlc3RSZXEtPmlSZXN1bHQpKSA6IA0KLSAgICAgICAgKFpPU1NfU1VDQ0VTUyA9PSB6UFNfTnZBTUZsYWdzVEl0ZW1SZWFkKChOdlBhcmFtX0FNVEZsYWdzKXB0cHJvZHRlc3RSZXEtPmlUZXN0VmFsdWUsICZiVmFsdWUpKTsNCi0NCi0gICAgaWYgKGJSZXN1bHQgPT0gVFJVRSkNCi0gICAgew0KLSAgICAgICAgaWYgKFpBVDJfQ09fU0VUX1JFUSA9PSBwdHByb2R0ZXN0UmVxLT5iQ29tbWFuZE9wKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHNwcmludGYoKGNoYXIgKilnX3pBdF9FbmNCdWYsICIlcyIsICBnX3pBdF9PSyk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgc3ByaW50ZigoY2hhciAqKWdfekF0X0VuY0J1ZiwgIiVzK1BST0RURVNUOiAlYyVzJXMiLCBnX3pBdF9DUkxGLGJWYWx1ZSwgZ196QXRfQ1JMRiwgZ196QXRfT0spOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgc3ByaW50ZigoY2hhciAqKWdfekF0X0VuY0J1ZiwgIiVzRVJST1IlcyIsIGdfekF0X0NSTEYsZ196QXRfQ1JMRik7DQotICAgIH0NCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PRVJST1JfRVJSOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9aZmxhZ1NldFJlcVByb2MNCi0qILmmxNzD6Mr2o7og08O7p7eiy81BVCtaRkxBR8frx/PJ6NbDz+DTprXEyeixuMrHt/G08r+qDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgveG5uczl1rjV6w0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICC94bm5zOWzpLbIDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuitaRkxBRz08ZGV2PlssPG4+XSAgICBPSy9FUlJPUg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotRFdPUkQgekF0aV9aZmxhZ1NldFJlcVByb2MoVk9JRCAqcERhdGFQdHIpDQotew0KLSAgICBUX1pBdGlfWmZsYWdfUmVxICAgICAgICAgICAqcHR6ZmxhZ3NldFJlcSA9IChUX1pBdGlfWmZsYWdfUmVxKilwRGF0YVB0cjsNCi0gICAgQllURSAgICBiUmVzdWx0ID0gRkFMU0U7DQotDQotICAgIHpBdGlfWmZsYWdTZXRSZXFQcm9jQ29udGVudCgmYlJlc3VsdCwgcHR6ZmxhZ3NldFJlcS0+YkZhYywgcHR6ZmxhZ3NldFJlcS0+YlZhbHVlKTsNCi0gICAgekF0aV9FbmNPS0Vycm9yKGJSZXN1bHQpOyAgICANCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PRVJST1JfRVJSOw0KLX0NCi0NCi1WT0lEIHpBdGlfWmZsYWdTZXRSZXFQcm9jQ29udGVudChQQllURSBwYlJlc3VsdCwgQllURSBiRmFjLCBCWVRFICBiVmFsdWUpDQotew0KLSAgICBpZihaQVQyX0ZBQ19CT09UID09IGJGYWMpDQotICAgIHsNCi0gICAgICAgICAqcGJSZXN1bHQgPSAoelN5c19OdlNldEJvb3RGbGFnKChiVmFsdWU/T0ZGX1NUQVRFOk9OX1NUQVRFKSkgPT0gWk9TU19TVUNDRVNTKTsgICAgICAgICAgDQotICAgIH0NCi0gICAgZWxzZSBpZihaQVQyX0ZBQ19NVVRJX0FNVCA9PSBiRmFjKQ0KLSAgICB7DQotICAgICAgICAqcGJSZXN1bHQgPSAoelN5c19OdlNldENkcm9tRmxhZygoYlZhbHVlP09OX1NUQVRFOk9GRl9TVEFURSkpID09IFpPU1NfU1VDQ0VTUyk7ICAgICAgICAgICAgICAgICAgDQotICAgIH0NCi0gICAgZWxzZSBpZihaQVQyX0ZBQ19TVE0gPT0gYkZhYykNCi0gICAgew0KLSAgICAgICAgelN0bVBiX1NldE1vZGUoYlZhbHVlLCAoVF96U3RtX1Rhc2tJZHgpZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgICpwYlJlc3VsdCA9IFRSVUU7DQotICAgIH0NCi0gICAgI2lmICFkZWZpbmVkKF9DSElQX1pYMjk3NTEwKSAmJiAhZGVmaW5lZChfQ0hJUF9aWDI5NzUyMF9MQVRFUikNCi0gICAgZWxzZSBpZihaQVQyX0ZBQ19ETF9JTlRFUlZBTCA9PSBiRmFjKQ0KLSAgICB7DQotICAgICAgICAqcGJSZXN1bHQgPSAoelN5c19OdlNldERMSW50ZXJ2YWxGbGFnKGJWYWx1ZT9MT05HX0lOVEVSVkFMOlNIT1JUX0lOVEVSVkFMKSA9PSBaT1NTX1NVQ0NFU1MpOyAgICAgICAgICAgICAgICAgIA0KLSAgICB9DQotICAgICNlbmRpZg0KLSAgICByZXR1cm47DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1pmbGFnUXVlcnlSZXFQcm9jDQotKiC5psTcw+jK9qO6INPDu6e3osvNQVQrWkZMQUfH68fzsunRr8/g06a1xMnosbjKx7fxtPK/qg0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIL3hubnM5da41esNCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgveG5uczls6S2yA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogDQotKiAgICAgICAgICAgINei0uKw/LXEuPHKvaOsveLC69auuvO1xKOsVF9aQXRpX1pmbGFnUXVlcnlSZXENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLURXT1JEIHpBdGlfWmZsYWdRdWVyeVJlcVByb2MoVk9JRCAqcERhdGFQdHIpDQotew0KLSAgICBUX1pBdGlfRmFjICAgICAgICAgICAgICAgICAgdEZhY1taQVQyX01BWF9GQUNfTlVNXSA9IHswfTsgICAgICAgICAgICAgIC8qIFRoZSBEVE1GIGNoYXIgKi8NCi0gICAgQllURSBiRmFjTnVtID0gMDsNCi0gICAgQllURSBpID0gMDsNCi0gICAgQ0hBUiAqcFN0cldhbGsgPSBnX3pBdF9FbmNCdWY7DQotICAgIA0KLSAgICB0RmFjWzBdLmJGYWMgPSBaQVQyX0ZBQ19CT09UOw0KLSAgICB0RmFjWzFdLmJGYWMgPSBaQVQyX0ZBQ19NVVRJX0FNVDsgDQotI2lmIGRlZmluZWQoX0NISVBfWlgyOTc1MTApIHx8IGRlZmluZWQoX0NISVBfWlgyOTc1MjBfTEFURVIpIHx8IGRlZmluZWQoX0NISVBfWlgyODA0KQ0KLSAgICBiRmFjTnVtID0gMjsNCi0gICAgdEZhY1swXS5iVmFsdWUgPSAoT05fU1RBVEUgPT0gelN5c19OdkdldEJvb3RGbGFnKCkgPyAwIDogMSk7DQotICAgIHRGYWNbMV0uYlZhbHVlID0gKE9OX1NUQVRFID09IHpTeXNfTnZHZXRDZHJvbUZsYWcoKT8gMSA6IDApOw0KLSNlbHNlDQotICAgIGJGYWNOdW0gPSBaQVQyX01BWF9GQUNfTlVNOw0KLSAgICB0RmFjWzJdLmJGYWMgPSBaQVQyX0ZBQ19ETF9JTlRFUlZBTDsgDQotICAgIHRGYWNbMF0uYlZhbHVlID0gKE9OX1NUQVRFID09IHpTeXNfTnZHZXRCb290RmxhZygpID8gMCA6IDEpOw0KLSAgICB0RmFjWzFdLmJWYWx1ZSA9IChPTl9TVEFURSA9PSB6U3lzX052R2V0Q2Ryb21GbGFnKCk/IDEgOiAwKTsNCi0gICAgdEZhY1syXS5iVmFsdWUgPSAoTE9OR19JTlRFUlZBTCA9PSB6U3lzX052R2V0RExJbnRlcnZhbEZsYWcoKT8gMSA6IDApOw0KLSNlbmRpZg0KLQ0KLSAgICBwU3RyV2FsayArPSBzcHJpbnRmKChjaGFyICopcFN0cldhbGssICIlcytaRkxBRzogIiwgZ196QXRfQ1JMRik7DQotDQotICAgIGZvcihpID0gMDtpIDwgYkZhY051bTtpKyspDQotICAgIHsNCi0gICAgICAgIHBTdHJXYWxrICs9IHNwcmludGYoKGNoYXIgKilwU3RyV2FsaywgIlwiJXNcIiwlZCwiLCBaQVRfRkFDX1RZUEVbdEZhY1tpXS5iRmFjXSwgdEZhY1tpXS5iVmFsdWUpOw0KLSAgICB9DQotICAgIHBTdHJXYWxrLS07DQotICAgIHNwcmludGYoKGNoYXIgKilwU3RyV2FsaywgIiVzJXMiLCBnX3pBdF9DUkxGLCBnX3pBdF9PSyk7DQotICAgIA0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9FUlJPUl9FUlI7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1ptb2Rlc3dpdGNoU2V0UmVxUHJvYw0KLSoguabE3MPoyvajuiDTw7unt6LLzUFUK1pNT0RFU1dJVENIx+vH88no1sO1scewsOaxvsSjyr0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotRFdPUkQgekF0aV9abW9kZXN3aXRjaFNldFJlcVByb2MoVk9JRCAqcERhdGFQdHIpDQotew0KLSAgICBCWVRFIGJNb2RlID0gMDsNCi0NCi0gICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgIGlBZGRyID0gT1NfRkxBU0hfQVRJX1JXX05PTkZBQ19PRkZTRVRfRlJPTV9OViArMHgwM0UyOw0KLQ0KLSAgICBUX1pBdGlfWm1vZGVzd2l0Y2hfUmVxICAgICAqcHR6TW9kZXN3aXRjaFJlcSA9IChUX1pBdGlfWm1vZGVzd2l0Y2hfUmVxKilwRGF0YVB0cjsNCi0NCi0gICAgaWYoWk9TU19FUlJPUiA9PSB6T3NzX052SXRlbVJlYWQoaUFkZHIsICZiTW9kZSwgMSkgfHxwdHpNb2Rlc3dpdGNoUmVxLT5iTW9kZSAhPSBiTW9kZSkNCi0gICAgew0KLSAgICAgICAgekF0aV9FbmNPS0Vycm9yKChCT09MKShaT1NTX1NVQ0NFU1MgPT0gek9zc19Odkl0ZW1Xcml0ZShpQWRkciwgKFVJTlQ4ICopJnB0ek1vZGVzd2l0Y2hSZXEtPmJNb2RlLCAxKSkpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgekF0aV9FbmNPS0Vycm9yKFRSVUUpOw0KLSAgICB9DQotICAgIHJldHVybiBaX0FQTU1JQV9OT0VSUk9SX0VSUjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfWnNldFNldFJlcVByb2MNCi0qILmmxNzD6Mr2o7og08O7p7eiy81BVCtaU0VUx+vH88no1sO1scewsOaxvsSjyr0NCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICC94bm5zOXWuNXrDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIL3hubnM5bOktsgNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotRFdPUkQgekF0aV9ac2V0U2V0UmVxUHJvYyhWT0lEICpwRGF0YVB0cikNCi17DQotICAgIFRfWkF0aV9ac2V0X1JlcSAgICAgICAgICpwdHpTZXRSZXEgPSAoVF9aQXRpX1pzZXRfUmVxKilwRGF0YVB0cjsNCi0gICAgekF0aV9ac2V0U2VuZENuZihwdHpTZXRSZXEpOw0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9FUlJPUl9FUlI7DQotfQ0KLQ0KLVZPSUQgekF0aV9ac2V0U2VuZENuZihUX1pBdGlfWnNldF9SZXEgKiBwWlNldFJlcSkNCi17DQotICAgIENIQVIgKnBTdHJXYWxrID0gZ196QXRfRW5jQnVmOw0KLSAgICBpZihwWlNldFJlcS0+YkNvbW1hbmRPcCA9PSBaQVQyX0NPX1NFVF9SRVEpDQotICAgIHsNCi0gICAgICAgIEJPT0wgYlJlc3VsdCA9IChCT09MKShaT1NTX1NVQ0NFU1MgPT0gek9zc19BdENmZ1NldChwWlNldFJlcS0+Y21kLCAmKHBaU2V0UmVxLT5pUGFyYW0pLGdfekF0aV9DdXJJbnN0YW5jZSkpOw0KLSAgICAgICAgekF0aV9FbmNPS0Vycm9yKGJSZXN1bHQpOw0KLQ0KLSAgICAgICAgaWYoYlJlc3VsdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZigoc3RyY21wKChjb25zdCBjaGFyICopcFpTZXRSZXEtPmNtZCwgICJGUkVRX1NDQU4iKSA9PSAwKSB8fCAoc3RyY21wKChjb25zdCBjaGFyICopcFpTZXRSZXEtPmNtZCwgICJTTEVFUF9GUkVRX1NDQU4iKSA9PSAwKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGlmKFpfU1VDQyAhPSB6QXRpX01zZ1NlbmQoTU1JQV9VTU1fRlJFUV9TQ0FOX1JFUV9FViwgWk9TU19OVUxMLCAgMCwgIFpfQVRJX1RBU0tJRF9VTU0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYoc3RyY21wKChjb25zdCBjaGFyICopcFpTZXRSZXEtPmNtZCwgICJGQVNUX0ZSRVFfU0NBTiIpID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZihaX1NVQ0MgIT0gekF0aV9Nc2dTZW5kKE1NSUFfVU1NX0ZBU1RfRlJFUV9TQ0FOX1JFUV9FViwgWk9TU19OVUxMLCAgMCwgIFpfQVRJX1RBU0tJRF9VTU0pKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UgaWYocFpTZXRSZXEtPmJDb21tYW5kT3AgPT0gWkFUMl9DT19RVUVSWV9SRVEpDQotICAgIHsNCi0gICAgICAgIHBaU2V0UmVxLT5pUGFyYW0gPSB6T3NzX0F0Q2ZnR2V0KHBaU2V0UmVxLT5jbWQpOw0KLSAgICAgICAgaWYgKHBaU2V0UmVxLT5pUGFyYW0ucmVzdWx0ID09IFpPU1NfU1VDQ0VTUykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwU3RyV2FsayArPSBzcHJpbnRmKChjaGFyICopcFN0cldhbGssICIlcytaU0VUOiBcIiVzXCIiLCBnX3pBdF9DUkxGLHBaU2V0UmVxLT5jbWQpOw0KLSAgICAgICAgICAgIHpBdF9Qc0VuY1pzZXRRdWVyeUNuZkNvbnRlbnQoJnBTdHJXYWxrLCBwWlNldFJlcSk7DQotICAgICAgICAgICAgc3ByaW50ZigoY2hhciAqKXBTdHJXYWxrLCAiJXMlcyIsIGdfekF0X0NSTEYsIGdfekF0X09LKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX0VuY09LRXJyb3IoRkFMU0UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfQ2NNc2dQcm9jKERXT1JEICpwRXZJZCwgVUlOVDggKnBFdkRhdGEsIFdPUkQgKnBEYXRhTGVuLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICBpZih6QXRpX0dldENhbGxDb250cm9sTXNnKCpwRXZJZCkpIC8qICgoaUV2SWQgPj0gWlBTX0FwTW1pYV9DY1NldHVwUmVxX0V2KSAmJiAoaUV2SWQgPD0gWlBTX0FwTW1pYV9FdGJtUXVlcnlSZXFfRXYpKSAqLw0KLSAgICB7DQotICAgICAgICBpZihaQVRJMl9TVUNDRVNTICE9IHpBdGlfVXNiU2lvR2V0Q2NNYW5JbmRleCgqcEV2SWQsIHBFdkRhdGErMSwgcENobmVsTm9kZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9HZXRTZXJ2ZXJJbmRleA0KLSoguabE3MPoyvYgOiDNqLn9zai1wLrFu/HIoc/7z6K1xMv30v26xQ0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIGlFdklkICAgICAgICAgIM/7z6JJRA0KLSogICAgICAgICAgICBwRXZEYXRhICAgICAgICDP+8+izOUNCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgIM/7z6LM5bOktsgNCi0qICAgICAgICAgICAgY2huZWxOb2RlICAgICAgICDNqLXAusW94bXjDQotKiAgICAgICAgICAgIChPVVQpo7oNCi0qICAgICAgICAgICAgcEV2RGF0YSAgICAgICAgz/vPoszlDQotKiAgICAgICAgICAgIGNobmVsTm9kZSAgICAgICAgzai1wLrFveG14w0KLSogt7Ugu9gg1rUgOiCzybmmt7W72FpBVEkyX1NVQ0NFU1Oju8qnsNy3tbvYtO3O88Dg0M2juw0KLSogxuTL/Mu1w/cgOiDQ6NKqt/7O8bLjsaPWpMv30v26xbXE1f3It9DUICANCi0qICAgICAgICAgICAgQVRJMi0tLT5NTUlBINa709BYWFhfUkVRICDH68fzz/vPoiAgDQotKiAgICAgICAgICAgILG+yM7O8dOmuMPU2srVtb1DQ82ou7C94cr4oaJTTb3hyvjKscrNt8Uox+W/1SnNqLXAaURlc3RJbmRleD8NCi02MTcwMDE3Mzg3NTggW2F0aV1BVMH3s8zV+7rP0N64xLXjDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0U2VydmVySW5kZXgoVUlOVDMyIGlFdklkLCBVSU5UOCAqcEV2RGF0YSwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgaWYgKGlFdklkID09IE1NSUFfRVVDU1JfTFRFSU5GT19SRVFfRVYpDQotICAgIHsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0gICAgek9zc19NZW1jcHkocEV2RGF0YSwgJnBDaG5lbE5vZGUtPmlTcmNJbmRleCwgc2l6ZW9mKFVJTlQ4KSk7Ly9BVEkyIFNyY0luZGV41Nq12tK7DQotICAgIHpPc3NfTWVtY3B5KHBFdkRhdGEgKyAxLCAmcENobmVsTm9kZS0+aURlc3RJbmRleCwgc2l6ZW9mKFVJTlQ4KSk7Ly9BVEkyIERlc3RJbmRleNTatdq2/g0KLSAgIA0KLSAgICBpZihNTUlBX1VNTV9BQ1RJVkVfUkVRX0VWID09IGlFdklkKQ0KLSAgICB7DQotICAgICAgICBUX3pNbWlhVW1tX0FjdGl2ZV9SZXEgKnBDZ2F0dFNldFJlcSA9IChUX3pNbWlhVW1tX0FjdGl2ZV9SZXEgKilwRXZEYXRhOw0KLSAgICAgICAgaWYoKHBDZ2F0dFNldFJlcS0+YkFjdGl2ZVZhbHVlID09IFpfUHNEb21haW4pICYmIChwQ2dhdHRTZXRSZXEtPmJBY3RpdmVUeXBlID09IDEpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBDaG5lbE5vZGUtPmlFdklkID0gaUV2SWQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZSBpZihaQVQyX1NTX0NMQ0s9PXBDaG5lbE5vZGUtPmNtZF9pZCAmJiBBVElfRElTVFJJQlVURV9GVU5DX0NMQ0tfU0VUX1JFUV9FViA9PSBpRXZJZCkvL7fA1rnO89bQts8NCi0gICAgew0KLSAgICAgICAgVF96QXBNbWlhX0NsY2tTZXRfUmVxICpwQ2xja1NldFJlcSA9IChUX3pBcE1taWFfQ2xja1NldF9SZXEqKXBFdkRhdGE7DQotICAgICAgICBpZihaX0FQTU1JQV9GQUNWQUxVRV9TQyAhPXBDbGNrU2V0UmVxLT5iRmFjICYmIFpfQVBNTUlBX0ZBQ1ZBTFVFX0ZEICE9cENsY2tTZXRSZXEtPmJGYWMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcENobmVsTm9kZS0+aUV2SWQgPSBpRXZJZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldENoYW5uZWxJZEJ5SW5kZXgNCi0qILmmxNzD6Mr2IDogzai5/cv30v26xbvxtcPNqLXAusUNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgaU1taWFTcmNJbmRleCAgICAgICBtbWlhyM7O8bXE1LTL99L9DQotKiAgICAgICAgICAgIGlNbWlhRGVzdEluZGV4ICAgICAgbW1pYcjOzvG1xMS/tcTL99L9DQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogICAgICAgICAgICBwQ2hhbm5lbElkICAgICAgICAgy/nV0rW9tcTNqLXAusUNCi0qILe1ILvYINa1IDogs8m5pre1u9jNqLXAveG149a41eujrMqnsNy3tbvYTlVMTA0KLSogxuTL/Mu1w/cgOiAxKSDQ6NKqxr3MqEFUSbGj1qTNqLXAyrnTw7XE1f3It9DUICANCi0qICAgICAgICAgICAgMikgt7W72M2otcC6xaOs1dK1vb7Nt7W72NPQ0KfNqLXAusWjrLfx1PLOqs7e0KfNqLXAusUgDQotKiAgICAgICAgICAgIDMpIE1NSUG1xNS0y/fS/brFv8nE3Le1u9jO3tCn1rUweGZmo6zU2kNDz/vPorLOyv2z9rTtyrENCi0qICAgICAgICAgICAgNCkgUFNfQ0O1xNS0y/fS/brFsqKyu8rHucy2qNOzyeSjrLKisrvKx7C0y7PQ8tGh1PHUtMv30v26xbXEDQotKiAgICAgICAgICAgIDUpILK70OjSqrbUTU1JQbeiwLS1xNS0y/fS/dPQ0KfQ1L340NDF0LbPo6zS8rWxss7K/dPQzvOjrMbkt7W72DB4ZmbX986q1LTL99L9DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVF9aQXRpX0NoYW5uZWxJbmZvICogX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldENoYW5uZWxJZEJ5SW5kZXgoVUlOVDMyIGlFdklkLCBjb25zdCBCWVRFIGlNbWlhU3JjSW5kZXgsIEJZVEUgaU1taWFEZXN0SW5kZXgsIFVJTlQ4ICpwQ2hhbm5lbElkKQ0KLXsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlID0gTlVMTDsgLyogyrnTw9a41eu94bXjICovDQotICAgIA0KLSAgICBpZihaQVRJMl9JTlZBTF9NTUlBX0lOREVYICE9IGlNbWlhRGVzdEluZGV4KSAgLyogv8nE3Lvhs/bP1s7e0Ke1xMfpv/ajrLWr07PJ5LHt1tDItNLRvq231sXky/fS/brFo6zU8rGotO0gKi8NCi0gICAgew0KLSAgICAgICAgcENobmVsTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHJCeU1taWFEZXN0SW5kZXgoaU1taWFEZXN0SW5kZXgpOw0KLSAgICB9DQotICAgIGVsc2UgLyogzt7Qp9a1ICovDQotICAgIHsgICAgLyogyPTS0b6t09DL99L9usWjrNTysLTL99L9usWjrM7ey/fS/brFsLTNqNaqz/vPorSmwO2jrMj0ysfP7NOmzt7L99L9usWjrNTysai07SAqLw0KLSAgICAgICAgLyogy7XD986q0ru49s2o1qrP+8+io6zU8tDo0qrIpdGw1dLNqLXAysrF5Cwgu/HWqsrHxMTW1tK1zvGjrNOmzfnExLj2zai1wLeiICovDQotICAgICAgICBwQ2huZWxOb2RlID0gekF0aV9HZXRDaGFubmVsTm9kZVB0ckJ5TW1pYVNyY0luZGV4KGlNbWlhU3JjSW5kZXgpOw0KLSAgICB9DQotDQotICAgIGlmKE5VTEwgPT0gcENobmVsTm9kZSkNCi0gICAgeyAgICAgICAgDQotICAgICAgICAqcENoYW5uZWxJZCA9IHpBdGlfSXNEZWxpdmVyQWxsTXNnKGlFdklkKT9aQVRJMl9DSEFOTkVMX0lEX05VTUFMTCA6IFpBVEkyX0NIQU5ORUxfSURfSU5WQUxJRDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgICpwQ2hhbm5lbElkID0gcENobmVsTm9kZS0+aUNobmVsSWQ7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICByZXR1cm4gcENobmVsTm9kZTsNCi19DQotDQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfVXNiU2lvR2V0Q2NNYW5JbmRleA0KLSoguabE3MPoyvYgOiBVU0LXqrSuv9rEo8q9z8KjrM2ouf3NqLXAusW78cihuvS90L/Y1sbP4LnYz/vPosv30v26xQ0KLSogss7K/cu1w/ejuiAoSU4po7ogDQotKiAgICAgICAgICAgIGlTcmNJbmRleCAgICAgINS0y/fS/brFo6y8tM2otcC6xQ0KLSogICAgICAgICAgICBpRXZJZCAgICAgICAgICDP+8+iSUQNCi0qICAgICAgICAgICAgcEV2RGF0YSAgICAgICAgz/vPoszlDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgICDP+8+izOWzpLbIDQotKiAgICAgICAgICAgIHBDaG5lbE5vZGUgICAgICDNqLXAvdq14w0KLSogICAgICAgICAgICAoT1VUKaO6DQotKiAgICAgICAgICAgIHBEZXN0SW5kZXggICAgIMS/tcTL99L9usUNCi0qICAgICAgICAgICAgcFNyY0NjTWFuSW5kZXggICAgIENDtcTL99L9usUNCi0qILe1ILvYINa1IDogs8m5pre1u9haQVRJMl9TVUNDRVNTo7vKp7Dct7W72LTtzvPA4NDNo7sNCi0qIMbky/zLtcP3IDogDQotKiAgICAgICAgICAgINei0uK24MK3yrG1xMrKxeQNCi0qICAgICAgICAgICAgMaOst7W72FpBVEkyX1NVQ0NFU1OjrLLFv8nS1LzM0PjWtNDQo6zP+8+it6K1vdCt0unVu6OsDQotKiAgICAgICAgICAgIDKjrMj0t7W72FpBVEkyX0ZBTFNF1PLTptbV1rm4w8/7z6K8zND4zfnQrdLp1bu3osvNDQotKiAgICAgICAgICAgIDOjrCBwQ2huZWxOb2RltcTKudPDvfbP3tPaxuTW0LXEY21kX2lkttRhYm9ydLXE07DP7A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVNJTlQzMiB6QXRpX1VzYlNpb0dldENjTWFuSW5kZXgoY29uc3QgVUlOVDMyIGlFdklkLCBVSU5UOCAqcERlc3RJbmRleCwgY29uc3QgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgVUlOVDggaUNjTnVtID0gMDsNCi0NCi0gICAgaWYoTlVMTCA9PSBwRGVzdEluZGV4KQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWkFUSTJfRkFMU0U7DQotICAgIH0NCi0NCi0gICAgc3dpdGNoKGlFdklkKQ0KLSAgICB7DQotICAgIGNhc2UgTU1JQV9DQ19BTlNfTU9ERV9SRVFfRVY6DQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKGlDY051bSA9IDA7IGlDY051bSA8IFpBVEkyX01BWF9DQUxMX05VTTsgaUNjTnVtKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZigoWkFUSTJfQ0FMTF9TVEFURV9JTkNPTUlORyA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUpDQotICAgICAgICAgICAgICAgICAgICB8fChaQVRJMl9DQUxMX1NUQVRFX1dBSVRJTkc9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUpDQotICAgICAgICAgICAgICAgICAgICB8fChaQVRJMl9DQUxMX1NUQVRFX0FDVElWRSA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUpKQ0KLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAqcERlc3RJbmRleCA9IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlEZXN0SW5kZXg7DQotICAgICAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pU3JjSW5kZXggPSBwQ2huZWxOb2RlLT5pU3JjSW5kZXg7IC8qILGjtObTs8nkudjPtSAqLw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qINXStb3Su8K3wLS156Os1PLM+LP2ICovDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBicmVhazsNCi0gICAgICAgIA0KLSAgICBjYXNlIE1NSUFfQ0NfTU9ESUZZX1JFUV9FVjogICAgICAgIA0KLSAgICAgICAgZm9yKGlDY051bSA9IDA7IGlDY051bSA8IFpBVEkyX01BWF9DQUxMX05VTTsgaUNjTnVtKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoWkFUSTJfQ0FMTF9TVEFURV9BQ1RJVkUgPT0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uY2FsbFN0YXRlDQotICAgICAgICAgICAgICAgICYmIHBDaG5lbE5vZGUtPmlTcmNJbmRleCA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pU3JjSW5kZXgpDQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICpwRGVzdEluZGV4ID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaURlc3RJbmRleDsNCi0gICAgICAgICAgICAgICAgYnJlYWs7IC8qINXStb3Su8K3wLS156Os1PLM+LP2ICovDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgICAgICANCi0gICAgY2FzZSBNTUlBX0NDX0RJU19NT0RFX1JFUV9FVjoNCi0gICAgICAgIHsgICAgICAgICANCi0gICAgICAgICAgICBmb3IoaUNjTnVtID0gMDsgaUNjTnVtIDwgWkFUSTJfTUFYX0NBTExfTlVNOyBpQ2NOdW0rKykgDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZigoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uY2FsbFN0YXRlID09IFpBVEkyX0NBTExfU1RBVEVfQUNUSVZFKQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDaG5lbE5vZGUtPmlTcmNJbmRleCA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pU3JjSW5kZXgpKQ0KLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICpwRGVzdEluZGV4ID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaURlc3RJbmRleDsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOyANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IoaUNjTnVtID0gMDsgaUNjTnVtIDwgWkFUSTJfTUFYX0NBTExfTlVNOyBpQ2NOdW0rKykgDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZigoWkFUSTJfQ0FMTF9TVEFURV9JTkNPTUlORyA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5jYWxsU3RhdGUpDQotICAgICAgICAgICAgICAgICAgIHx8KFpBVEkyX0NBTExfU1RBVEVfV0FJVElORz09IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmNhbGxTdGF0ZSkpLyogudK2z8C0tecqLyANCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgKnBEZXN0SW5kZXggPSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pRGVzdEluZGV4Ow0KLSAgICAgICAgICAgICAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVNyY0luZGV4ID0gcENobmVsTm9kZS0+aVNyY0luZGV4OyANCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOyANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBmb3IoaUNjTnVtID0gMDsgaUNjTnVtIDwgWkFUSTJfTUFYX0NBTExfTlVNOyBpQ2NOdW0rKykgDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZigoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVhpZCAhPSBaQVRJMl9JTlZBTF9NTUlBX0lOREVYKQ0KLSAgICAgICAgICAgICAgICAgICAgJiYgKHBDaG5lbE5vZGUtPmlTcmNJbmRleCA9PSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2NNYW4uY2FsbEluZm9baUNjTnVtXS5pU3JjSW5kZXgpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAqcERlc3RJbmRleCA9IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlEZXN0SW5kZXg7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWkFUSTJfU1VDQ0VTUzsgDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgKnBEZXN0SW5kZXggPSBaQVRJMl9DSEFOTkVMX0lEX0NDX01POy8qINCt0unVu0NDtaXNqLXAsaO7pCovIA0KLSAgICAgICAgfQ0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgRVZfWkFUSTJfRFRNRl9SRVE6DQotICAgICAgICB7DQotICAgICAgICAgICAgZm9yKGlDY051bSA9IDA7IGlDY051bSA8IFpBVEkyX01BWF9DQUxMX05VTTsgaUNjTnVtKyspICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoKGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmNhbGxTdGF0ZSA9PSBaQVRJMl9DQUxMX1NUQVRFX0FDVElWRSkNCi0gICAgICAgICAgICAgICAgICAgICYmIChwQ2huZWxOb2RlLT5pU3JjSW5kZXggPT0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVNyY0luZGV4KSkNCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAqcERlc3RJbmRleCA9IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmlEZXN0SW5kZXg7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsgDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy9pZihwQ2huZWxOb2RlLT5pU3JjSW5kZXggPT0gWkFUSTJfRFRNRl9TUkNJTkRFWCkNCi0gICAgICAgICAgICAvL3sNCi0gICAgICAgICAgICBmb3IoaUNjTnVtID0gMDsgaUNjTnVtIDwgWkFUSTJfTUFYX0NBTExfTlVNOyBpQ2NOdW0rKykgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZigoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uY2FsbFN0YXRlID09IFpBVEkyX0NBTExfU1RBVEVfRElBTElORykNCi0gICAgICAgICAgICAgICAgICAgIHx8KGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmNhbGxTdGF0ZSA9PSBaQVRJMl9DQUxMX1NUQVRFX0FMRVJUSU5HKQ0KLSAgICAgICAgICAgICAgICAgICAgfHwoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uY2FsbFN0YXRlID09IFpBVEkyX0NBTExfU1RBVEVfQUNUSVZFKSkNCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICpwRGVzdEluZGV4ID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaURlc3RJbmRleDsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvL30NCi0gICAgICAgIH0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBkZWZhdWx0OiAvKiDG5Mv71d+jrLK70sDAtcrHt/HT0LXnu7AgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIGlmKCgqcERlc3RJbmRleCkgPT0gMCkNCi0gICAgew0KLSAgICAgICAgKnBEZXN0SW5kZXggPSBaQVRJMl9JTlZBTF9NTUlBX0lOREVYOw0KLSAgICB9DQotDQotICAgIHJldHVybiBaQVRJMl9TVUNDRVNTOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Vc2JTaW9HZXRDaGFuZ2UNCi0qILmmxNzD6Mr2o7ogteO31jjOu0lQtdjWt7jxyr27r86qMzLOu7XY1rcNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwU3JjQWRkciAgICAgICA4zru48cq9yv2+3Q0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogMzLOu7jxyr3K/da1DQotKiDG5Mv8y7XD96O6IA0KLSogICAgICAgICAgICDQ6NKq16LS4g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotVUlOVDE2IF9fcHNfNGdfZnVuYyB6QXRpX1VzYlNpb0dldENoYW5nZShVSU5UOCAqcFNyY0FkZHIpDQotew0KLSAgICByZXR1cm4gKCAocFNyY0FkZHJbMF0gPDwgOCkgfChwU3JjQWRkclsxXSkpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfR2V0SXBjcE9wdGlvbnNJbmZvDQotuq/K/bmmxNw6zO7QtElQQ1DQrdLptcRQQ0/Qxc+iNjE3MDAyMTkwNTY0DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEICBfX3BzXzRnX2Z1bmMgekF0aV9HZXRJcGNwT3B0aW9uc0luZm8oVF9aQXRpX1Byb3RvY29sQ2ZnT3B0ICogcElwY3BPcHRpb25zLCBVSU5UMTYgSXBjcExlbikNCi17DQotICAgIHpPc3NfTWVtc2V0KChVSU5UOCAqKXBJcGNwT3B0aW9ucywgMCwgSXBjcExlbik7DQotICAgIHBJcGNwT3B0aW9ucy0+aUNvZGVGaWxlID0gMTsgLyogQ29uZmlndXJlLVJlcXVlc3QgKi8NCi0gICAgcElwY3BPcHRpb25zLT5pcHJvdG9jb2xJZCA9IDE7IC8qICAqLw0KLSAgICBwSXBjcE9wdGlvbnMtPmlDb250ZW50TGVuID0gekF0aV9Vc2JTaW9HZXRDaGFuZ2UoKFVJTlQ4ICopJklwY3BMZW4pOy8vaXBjcE9wdGlvbnMuaUNvbnRlbnRMZW4gPSBpTGVuUGNwT3B0aW9uczsNCi0gICAgcElwY3BPcHRpb25zLT5QcmlEbnNBZGRyLmlUeXBlID0gMHg4MTsNCi0gICAgcElwY3BPcHRpb25zLT5QcmlEbnNBZGRyLmlMZW4gPSA2Ow0KLSAgICBwSXBjcE9wdGlvbnMtPlNlY0Ruc0FkZHIuaVR5cGUgPSAweDgzOw0KLSAgICBwSXBjcE9wdGlvbnMtPlNlY0Ruc0FkZHIuaUxlbiA9IDY7DQotICAgIHJldHVybjsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0dldElwY3BQY29JbmZvDQotuq/K/bmmxNw6ubnU7ElQQ1DQrdLptcRQQ0/C68H3NjE3MDAyMTkwNTY0DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0dldElwY3BQY29JbmZvKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGJOdW0sIFRfWkF0aV9Qcm90b2NvbENmZ09wdCAqIHBJcGNwT3B0aW9ucywNCi0gICAgICAgICAgICBVSU5UMTYgSXBjcExlbixUX3pNbWlhU21fR2V0UGNvX1JzcCAgICpwU21HZXRQY29Sc3ApDQotew0KLSAgICBpZihwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNFY2IHx8cHRTbURhdGEtPnRQZHBDb250ZXh0LmJQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQpDQotICAgIHsNCi0gICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmJQcm90TnVtID0gMTsNCi0gICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbMF0ud0lkID0gMHg4MDIxOw0KLSAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFswXS5iTGVuID0gKFVJTlQ4KUlwY3BMZW47DQotICAgICAgICB6T3NzX01lbWNweSgoVUlOVDggKilwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WzBdLmFiQnVmLCAoVUlOVDggKilwSXBjcE9wdGlvbnMsIElwY3BMZW4pOw0KLSAgICB9DQotICAgIGlmKHB0U21EYXRhLT50UGRwQ29udGV4dC5iUGRwVHlwZSA9PSBaX0FQTU1JQV9TTV9JUFY0VjYgfHxwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNikNCi0gICAgew0KLSAgICAgICAgaWYgKHpBdGlfUGNvSXRlbUlzVmFsaWRCeVBjb0lkKDMpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmJBZGRQYXJhTnVtID0gMTsNCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdEFkZFBhcmFMaXN0WzBdLndJZCA9IDM7DQotICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRBZGRQYXJhTGlzdFswXS5iTGVuID0gMDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0dldFBhcFBjb0luZm8NCi26r8r9uabE3Dq4+b7dQVRNRU3A77XEvPjIqLLOyv25udTsvPjIqMDg0M3OqlBBULXEUENPwuvB9w0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgwuvB98TayN3Oqs23sr8oNEJZVEUpK9PDu6fD+yvD3MLrNjE3MDAyMTkwNTY0DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfR2V0UGFwUGNvSW5mbyhUX3pEZXZfQXRNZW1fU21DaWREYXRhKiBwdFNtRGF0YSwgQllURSBiTnVtLFRfek1taWFTbV9HZXRQY29fUnNwICAgKnBTbUdldFBjb1JzcCwgUEJZVEUgcGJJbmRleCkNCi17DQotICAgIEJZVEUgYlBzc1dkTGVuID0gcHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5iUGFzc1dvcmRMZW47DQotICAgIEJZVEUgYlVyTm1MZW4gPSAgcHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5iVXNlck5hbWVMZW47DQotDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmJQcm90TnVtID0gKnBiSW5kZXggKyAxOw0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS53SWQgPSAweEMwMjM7DQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmJMZW4gPSAoQllURSkoYlBzc1dkTGVuK2JVck5tTGVuKzIrWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4pOw0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZlswXSA9IDB4MDE7Ly9BdXRoZW50aWNhdGUtUmVxdWVzdA0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZlsxXSA9IDB4MDE7Ly9JZGVudGlmaWVyDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmWzNdID0gcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYkxlbjsvL0xlbmd0aA0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1Zls0XSA9IGJVck5tTGVuOw0KLSAgICB6T3NzX01lbWNweShwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZitaX0FUSV9QQVBDSEFQRE5TSVBfVkFMX0xFTisxLCBwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmFiVXNlck5hbWUsIGJVck5tTGVuKTsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWZbWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMStiVXJObUxlbl0gPSBiUHNzV2RMZW47DQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmKw0KLSAgICBaX0FUSV9QQVBDSEFQRE5TSVBfVkFMX0xFTisyK2JVck5tTGVuLCBwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmFiUGFzc1dvcmQsIGJQc3NXZExlbik7DQotICAgICgqcGJJbmRleCkrKzsNCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0dldENoYXBQY29JbmZvICAgICAgIDYxNzAwMjE5MDU2NA0KLbqvyv25psTcOrj5vt1BVE1FTcDvtcS8+Mioss7K/bm51OxDSEFQwODQzbXEUENPwuvB9w0KLbG416I6Y2hhcMLrwfe1xMTayN3OqsG9zPWjrMzu0LS1xMTayN2yu9K70fkNCi1jaGFwMTogIM23sr8oNEJZVEUpK8vmu/rK/SsgTVQgTkFNRSAgICAgY2hhcDI6ICDNt7K/KDRCWVRFKStoYXNoICsgdXNlcm5hbWUNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX0dldENoYXBQY29JbmZvKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGJOdW0sVF96TW1pYVNtX0dldFBjb19Sc3AgICAqcFNtR2V0UGNvUnNwLCBQQllURSBwYkluZGV4KQ0KLXsNCi0gICAgQllURSBiVXJObUxlbiA9ICBwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmJVc2VyTmFtZUxlbjsNCi0NCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YlByb3ROdW0gPSAqcGJJbmRleCArIDE7DQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLndJZCA9IDB4QzIyMzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYkxlbiA9ICAoQllURSkoWl9ERVZfQXRNZW1fTUFYX0NIQUxMRU5HRV9MRU4rYlVyTm1MZW4rWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMSk7LyrL5rv6yv2zpCtNVCBOQU1FK8vmu/rK/bOktsjX1r3aKi8NCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWZbMF0gPSAweDAxOy8vQXV0aGVudGljYXRlLVJlcXVlc3QNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWZbMV0gPSAweDAwOy8vSWRlbnRpZmllcg0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZlszXSA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmJMZW47Ly9MZW5ndGgNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWZbNF0gPSBaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTjsvL8vmu/rK/bOktsgNCi0gICAgek9zc19NZW1jcHkocFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWYrDQotICAgIFpfQVRJX1BBUENIQVBETlNJUF9WQUxfTEVOKzEscHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5hYkNoYWxsZW5nZSxaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTik7DQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmK1pfQVRJX1BBUENIQVBETlNJUF9WQUxfTEVOKzErWl9ERVZfQXRNZW1fTUFYX0NIQUxMRU5HRV9MRU4sDQotICAgICAgICBwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmFiVXNlck5hbWUsYlVyTm1MZW4pOw0KLQ0KLSAgICAoKnBiSW5kZXgpKys7DQotDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmJQcm90TnVtID0gKnBiSW5kZXggKyAxOw0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS53SWQgPSAweEMyMjM7DQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmJMZW4gPSAgKEJZVEUpKFpfREVWX0F0TWVtX01BWF9IQVNIX0xFTiArIFpfQVRJX1BBUENIQVBETlNJUF9WQUxfTEVOKzErYlVyTm1MZW4pOw0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZlswXSA9IDB4MDI7Ly9BdXRoZW50aWNhdGUtUmVxdWVzdA0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0WypwYkluZGV4XS5hYkJ1ZlsxXSA9IDB4MDA7Ly9JZGVudGlmaWVyDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmWzNdID0gcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYkxlbjsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFsqcGJJbmRleF0uYWJCdWZbNF0gPSBaX0RFVl9BdE1lbV9NQVhfSEFTSF9MRU47LypIQVNIIExFTiovDQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmKw0KLSAgICAgICAgWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMSxwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmFiSGFzaFJzcCxaX0RFVl9BdE1lbV9NQVhfSEFTSF9MRU4pOy8qSEFTSCovDQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbKnBiSW5kZXhdLmFiQnVmKw0KLSAgICAgICAgWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMStaX0RFVl9BdE1lbV9NQVhfSEFTSF9MRU4scHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5hYlVzZXJOYW1lLGJVck5tTGVuKTsNCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9uabE3Dq78cihQVBOvPjIqNDFz6INCi26r8r9w/uzxjp6QXRpX0dldFBhcENoYXBQY29JbmZvDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9HZXRQYXBDaGFwUGNvSW5mbyhUX3pEZXZfQXRNZW1fU21DaWREYXRhKiBwdFNtRGF0YSxCWVRFIGlDaWROdW0sVF96TW1pYVNtX0dldFBjb19Sc3AgICAqcFNtR2V0UGNvUnNwKQ0KLXsNCi0gICAgaWYoWl9BVElfUERQX0RlZmluZSA9PSBwdFNtRGF0YS0+YlBjb0F1dGhGZykNCi0gICAgew0KLSAgICAgICAgQllURSBiSW5kZXggPSBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5iUHJvdE51bTsNCi0gICAgICAgIGlmKFpfTU1JQVNNX1BEUF9BVVRIX1RZUEVfUEFQID09IHB0U21EYXRhLT50UGNvQXV0aC5iQXV0aFR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9HZXRQYXBQY29JbmZvKHB0U21EYXRhLCBpQ2lkTnVtLHBTbUdldFBjb1JzcCwmYkluZGV4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKFpfTU1JQVNNX1BEUF9BVVRIX1RZUEVfQ0hBUCA9PSBwdFNtRGF0YS0+dFBjb0F1dGguYkF1dGhUeXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfR2V0Q2hhcFBjb0luZm8ocHRTbURhdGEsIGlDaWROdW0scFNtR2V0UGNvUnNwLCZiSW5kZXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoWl9NTUlBU01fUERQX0FVVEhfVFlQRV9QQVBDSEFQID09IHB0U21EYXRhLT50UGNvQXV0aC5iQXV0aFR5cGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9HZXRQYXBQY29JbmZvKHB0U21EYXRhLCBpQ2lkTnVtLHBTbUdldFBjb1JzcCwmYkluZGV4KTsNCi0gICAgICAgICAgICB6QXRpX0dldENoYXBQY29JbmZvKHB0U21EYXRhLCBpQ2lkTnVtLHBTbUdldFBjb1JzcCwmYkluZGV4KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/bmmxNw6u/HIoVAtQ1NDRiBBZGRyZXNzIFJlcXVlc3TQxc+iDQotuq/K/cP7s8Y6ekF0aV9HZXRQY3NmUGNvSW5mbw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9HZXRQY3NjZlBjb0luZm8oVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSogcHRTbURhdGEsIEJZVEUgaUNpZE51bSwgVF96TW1pYVNtX0dldFBjb19Sc3AqIHBTbUdldFBjb1JzcCkNCi17DQotICAgIEJZVEUgYkluZGV4ID0gcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW07DQotDQotICAgIGlmKFpfQVBNTUlBX1BSRUZFUl9QQ1NDRl9USFJPVUdIX05BU19TSUdOQUwgPT0gcHRTbURhdGEtPnRQZHBDb250ZXh0LmJQQ3NjZkRpc2MpDQotICAgIHsNCi0gICAgICAgIGlmKHB0U21EYXRhLT50UGRwQ29udGV4dC5iUGRwVHlwZSA9PSBaX0FQTU1JQV9TTV9JUFY0VjYgfHxwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoekF0aV9QY29JdGVtSXNWYWxpZEJ5UGNvSWQoMTIpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YXRBZGRQYXJhTGlzdFtiSW5kZXhdLndJZCA9IDB4MDAwQzsNCi0gICAgICAgICAgICAgICAgYkluZGV4Kys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgDQotICAgICAgICBpZihwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNFY2IHx8cHRTbURhdGEtPnRQZHBDb250ZXh0LmJQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjYpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKHpBdGlfUGNvSXRlbUlzVmFsaWRCeVBjb0lkKDEpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YXRBZGRQYXJhTGlzdFtiSW5kZXhdLndJZCA9IDB4MDAwMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv25psTcOrvxyKFJTSBDTtDFz6INCi26r8r9w/uzxjp6QXRpX0dldEltY25QY29JbmZvDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0dldEltY25QY29JbmZvKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGlDaWROdW0sIFRfek1taWFTbV9HZXRQY29fUnNwKiBwU21HZXRQY29Sc3ApDQotew0KLSAgICBCWVRFIGJJbmRleCA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmJBZGRQYXJhTnVtOw0KLQ0KLSAgICBpZihaX0FQTU1JQV9QRFBDT05UX0lTX0ZPUl9JTUNOID09IHB0U21EYXRhLT50UGRwQ29udGV4dC5iSW1jblNpZ25JbmQpDQotICAgIHsNCi0gICAgICAgIGlmICh6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZCgyKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5iQWRkUGFyYU51bSsrOw0KLSAgICAgICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmF0QWRkUGFyYUxpc3RbYkluZGV4XS53SWQgPSAweDAwMDI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv25psTcOrj5vt1JUHY0QWRkckFsbG9j1eK49tfWts7AtMzu0LRQQ0+4vbzTss7K/c/uDQotuq/K/cP7s8Y6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0dldElQdjRBZGRyQWxsb2NQY29JbmZvKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGlDaWROdW0sIFRfek1taWFTbV9HZXRQY29fUnNwKiBwU21HZXRQY29Sc3ApDQotew0KLSAgICBCWVRFIGJJbmRleCA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmJBZGRQYXJhTnVtOw0KLQ0KLSAgICBpZihaX0FQTU1JQV9JUFY0QUREUl9BTExPQ19USFJPVUdIX1NJR05BTCA9PSBwdFNtRGF0YS0+dFBkcENvbnRleHQuYklQdjRBZGRyQWxsb2MpDQotICAgIHsNCi0gICAgICAgIGlmICh6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZCgxMCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5hdEFkZFBhcmFMaXN0W2JJbmRleF0ud0lkID0gMHgwMDBBOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UgaWYoWl9BUE1NSUFfSVBWNEFERFJfQUxMT0NfVEhST1VHSF9ESENQID09IHB0U21EYXRhLT50UGRwQ29udGV4dC5iSVB2NEFkZHJBbGxvYykNCi0gICAgew0KLSAgICAgICAgaWYgKHpBdGlfUGNvSXRlbUlzVmFsaWRCeVBjb0lkKDExKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5iQWRkUGFyYU51bSsrOw0KLSAgICAgICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmF0QWRkUGFyYUxpc3RbYkluZGV4XS53SWQgPSAweDAwMEI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0dldElwdjRpbmZvKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGlDaWROdW0sIFRfek1taWFTbV9HZXRQY29fUnNwKiBwU21HZXRQY29Sc3ApDQotew0KLSAgICBCWVRFIGJJbmRleCA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmJBZGRQYXJhTnVtOw0KLQ0KLSAgICBpZihwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNFY2IHx8cHRTbURhdGEtPnRQZHBDb250ZXh0LmJQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQpDQotICAgIHsNCi0gICAgICAgIGlmICh6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZCgxMykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5hdEFkZFBhcmFMaXN0W2JJbmRleF0ud0lkID0gMHgwMDBEOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotDQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9HZXRNc2lzZG5JbmZvKEJZVEUgaUNpZE51bSwgVF96TW1pYVNtX0dldFBjb19Sc3AqIHBTbUdldFBjb1JzcCkNCi17DQotICAgIFRfekF0aV9OVl9Nc2lzZG4gIHROdk1zaXNkbiA9IHswfTsNCi0gICAgQllURSBiSW5kZXggPSBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5iQWRkUGFyYU51bTsNCi0gICAgQllURSBiTnZJdGVtSWQgPSAoZ196QXRpX0N1ckluc3RhbmNlID8gWl9BVElfTlZfTXNpc2RuMiA6IFpfQVRJX05WX01zaXNkbjEpOw0KLQ0KLSAgICB6RGV2X05WX0F0aVJlYWRJdGVtKGJOdkl0ZW1JZCwgKEJZVEUqKSZ0TnZNc2lzZG4pOw0KLQ0KLSAgICBpZih6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZCgxNCkgJiYgdE52TXNpc2RuLmJOdW1MZW4gPT0gMCkNCi0gICAgew0KLSAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmF0QWRkUGFyYUxpc3RbYkluZGV4XS53SWQgPSAweDAwMEU7DQotICAgIH0NCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfVXNiU2lvU21aZ2lwZG5zSW5kDQotKiC5psTcw+jK9qO6IL3izvaz9klQL0ROU7XY1rejrLeiy83NqNaq1rjKvs/7z6INCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIGlBdGlJbmRleCAgICAgICBBVEkyy/fS/brFDQotKiAgICAgICAgICAgIGlNbWlhSW5kZXggICAgICAgTU1JQcv30v26xSANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IA0KLSogICAgICAgICAgICDU2s/s06ZDT05ORUNU1q7HsL340NCy2df3DQotKiAgICAgICAgICAgINPDu6fW97avvKS77rrzssXQ6NKqtffTw6OsyPTOqkFUSTLW97avvKS77qOs1PKyu9Do0qq199PDDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgDQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9Vc2JTaW9TbVpnaXBkbnNJbmQoVF96TW1pYVNtX1BkcEFjdF9DbmYgKiBwU21BY3REZWFjQ25mLCBVSU5UOCogcFNyYykNCi17DQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgIGlDaWROdW0gICAgICAgICAgPSAwOw0KLSAgICBUX1pBdGlfU21aZ2lwZG5zSW5kICpwU21aZ2lwZG5zSW5kID0gKFRfWkF0aV9TbVpnaXBkbnNJbmQgKil6QXRpX0dldFVCKHNpemVvZihUX1pBdGlfU21aZ2lwZG5zSW5kKSk7DQotICAgIA0KLSAgICBwU21aZ2lwZG5zSW5kLT5pRGVzdEluZGV4ID0gcFNtQWN0RGVhY0NuZi0+YkRlc0luZGV4Ow0KLSAgICBwU21aZ2lwZG5zSW5kLT5pU3JjSW5kZXggPSBwU21BY3REZWFjQ25mLT5iU3JjSW5kZXg7DQotICAgIGZvcihpQ2lkTnVtID0gMDsgaUNpZE51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGlDaWROdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbaUNpZE51bV0uaXNVc2VkICYmDQotICAgICAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbaUNpZE51bV0uaUNpZCAhPSBwU3JjW2dfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2lDaWROdW1dLmlDaWQgLTFdDQotICAgICAgICAgICAgJiYgekF0aV9TbUdldFBkcEFkZHJCeUNpZChnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltpQ2lkTnVtXS5pQ2lkLCAmKHBTbVpnaXBkbnNJbmQtPnNtSXBEbnNJbmZvW3BTbVpnaXBkbnNJbmQtPmlDaWROdW1dKSwgDQotICAgICAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbaUNpZE51bV0uZXh0QWN0Q2lkLCBnX3pBdGlfQ3VySW5zdGFuY2UpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBTbVpnaXBkbnNJbmQtPmlDaWROdW0rKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB6T3NzX1Rhc2tTZW5kRGF0YShFVl9aQVRJMl9TTV9aR0lQRE5TX0lORCwgKFZPSUQgKilwU21aZ2lwZG5zSW5kLCBzaXplb2YoVF9aQXRpX1NtWmdpcGRuc0luZCksIGdfekF0aV9Db250ZXh0LnRhc2tJZE15KTsNCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9HZXRJZGVsQ2lkDQotuq/K/bmmxNw6u/HIobf7us/A4NDNtcRDSUQNCi3RsNXSuebU8joNCi0xKcO709CyprrFtcRJUMDg0M21xENJRA0KLTIpw7vT0LKmusW1xFBQUMDg0M21xENJRA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIHpBdGlfR2V0TW9JZGVsQ2lkKFRfekFwTW1pYV9TbUFjdERlYWN0X1JlcSogcEFjdCwgUEJZVEUgcGJQZHBUeXBlKQ0KLXsNCi0gICAgQllURSBiQ2lkID0gMDsNCi0gICAgQllURSBiRnN0Q2lkID0gWl9ERVZfQXRNZW1fTUlOSU5VTV9DSUQ7DQotICAgIEJZVEUgYkxzdENpZCA9IFpfREVWX0F0TWVtX01BWElOVU1fQ0lEOw0KLQ0KLSNpZmRlZiBEVUFMX0NBUkRfRFVBTF9TVEFOREJZDQotICAgIGlmKGdfekF0aV9DdXJJbnN0YW5jZSA9PSBaX0FUSV9JTlNOT18xKQ0KLSAgICB7DQotICAgICAgICBiTHN0Q2lkID0gNDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGJGc3RDaWQgPSA1Ow0KLSAgICB9DQotI2VuZGlmDQotDQotICAgIGZvciAoYkNpZCA9IGJGc3RDaWQ7IGJDaWQgPD0gYkxzdENpZDsgYkNpZCsrKQ0KLSAgICB7DQotICAgICAgICBpZih6QXRpX0NoZWFrQ2lkQW5kR2V0UGRwVHlwZShiQ2lkLCBwYlBkcFR5cGUpICYmICpwYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwQWN0LT5hYkNpZFswXT1iQ2lkOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGZvciAoYkNpZCA9IGJGc3RDaWQ7IGJDaWQgPD0gYkxzdENpZDtiQ2lkKyspDQotICAgIHsNCi0gICAgICAgIGlmKHpBdGlfQ2hlYWtDaWRBbmRHZXRQZHBUeXBlKGJDaWQsIHBiUGRwVHlwZSkgJiYgKnBiUGRwVHlwZSA9PSBaX0FQTU1JQV9TTV9QUFApDQotICAgICAgICB7DQotICAgICAgICAgICAgcEFjdC0+YWJDaWRbMF09YkNpZDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfR2V0SWRlbENpZA0KLbqvyv25psTcOrvxyKG3+7rPwODQzbXEQ0lEDQot0bDV0rnm1PI6DQotMSnRsNXSw7vT0Lyku+61xMDg0M3GpcXktcTS0bao0uVDSUQNCi0yKdGw1dLDu9PQvKS77rXEw7vT0Lao0uW1xL/Vz9BDSUQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIHpBdGlfR2V0TXRJZGxlQ2lkKEJZVEUgYlR5cGUsIFBCWVRFIHBiQ2lkKQ0KLXsNCi0gICAgQllURSBpID0gMDsNCi0gICAgQllURSBiRnN0Q2lkID0gWl9ERVZfQXRNZW1fTUlOSU5VTV9DSUQ7DQotICAgIEJZVEUgYkxzdENpZCA9IFpfREVWX0F0TWVtX01BWElOVU1fQ0lEOw0KLSAgICBUX3pNbWlhU21fUGRwQWRkciAgICAgICpwdFBkcEFkZHIgPSAoVF96TW1pYVNtX1BkcEFkZHIqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9QZHBBZGRyKSk7ICANCi0gICAgVF96TW1pYVNtX1Bjb0luZm8gICAgICAqcHRQY29JbmZvID0gKFRfek1taWFTbV9QY29JbmZvKil6QXRpX0dldFVCKHNpemVvZihUX3pNbWlhU21fUGNvSW5mbykpOw0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhICpwdFNtRGF0YSA9IChUX3pEZXZfQXRNZW1fU21DaWREYXRhKil6QXRpX0dldFVCKHNpemVvZihUX3pEZXZfQXRNZW1fU21DaWREYXRhKSk7DQotDQotI2lmZGVmIERVQUxfQ0FSRF9EVUFMX1NUQU5EQlkNCi0gICAgaWYoZ196QXRpX0N1ckluc3RhbmNlID09IFpfQVRJX0lOU05PXzEpDQotICAgIHsNCi0gICAgICAgIGJMc3RDaWQgPSA0Ow0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgYkZzdENpZCA9IDU7DQotICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgZm9yIChpID0gYkZzdENpZDsgaSA8PSBiTHN0Q2lkOyBpKyspDQotICAgIHsNCi0gICAgICAgIHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX1NtQ2lkRGF0YSwgaSwgKFBCWVRFKXB0U21EYXRhLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICAgICAgaWYocHRTbURhdGEtPmJQZHBJbmZvRmc9PVpfQVRJX1BEUF9EZWZpbmUmJnB0U21EYXRhLT5iQ29udEZsYWcgPT0gWl9BVElfQ09OVFhUX0ZpcnN0DQotICAgICAgICAgICAgJiZwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGU9PWJUeXBlJiYgKDAgPT0gZ2V0X2NpZF9zdGF0ZShpKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBiQ2lkID0gaTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGRwQWRkcik7DQotICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFBjb0luZm8pOw0KLSAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGZvciAoaSA9IGJGc3RDaWQ7IGkgPD0gYkxzdENpZDsgaSsrKQ0KLSAgICB7DQotICAgICAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9TbUNpZERhdGEsIGksIChQQllURSlwdFNtRGF0YSwgZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgIGlmKHB0U21EYXRhLT5iUGRwSW5mb0ZnPT1aX0FUSV9QRFBfTm90RGVmaW5lICYmICgwID09IGdldF9jaWRfc3RhdGUoaSkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICpwYkNpZCA9IGk7DQotICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFBkcEFkZHIpOw0KLSAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQY29JbmZvKTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0U21EYXRhKTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGRwQWRkcik7DQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQY29JbmZvKTsNCi0gICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFNtRGF0YSk7DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9QcHBUcmFuc0NpZA0KLbqvyv25psTcOr2rQVREL0NHREFUQdCvtPhDSUTXqru7tb1DR0FDVL3Tv9rW0MilDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCB6QXRpX1BwcFRyYW5zQ2lkKFRfekFwTW1pYV9TbUFjdERlYWN0X1JlcSogcEFjdCwgDQotVF96TW1pYVNtX0RhdGFTdGF0ZV9SZXEqIHBEYXRhU3RhdGVSZXEsIFBCWVRFIHBiUGRwVHlwZSkNCi17DQotICAgIHBBY3QtPmJTcmNJbmRleCA9IHBEYXRhU3RhdGVSZXEtPmJTcmNJbmRleDsNCi0gICAgcEFjdC0+YkRlc0luZGV4ID0gcERhdGFTdGF0ZVJlcS0+YkRlc0luZGV4Ow0KLSAgICBwQWN0LT5iVHlwZUZsZyA9IFpfQVBNTUlBX1ZBTElEOw0KLSAgICBwQWN0LT5iVHlwZSA9IFpfQVBNTUlBX1NNX1BEUF9BQ1RJVkU7DQotICAgIHBBY3QtPmJDaWROdW0gPSAxOw0KLQ0KLSAgICAvKrbguPZDSUTKsda70aHU8bXa0ru49kNJRL340NC8pLvuKi8NCi0gICAgaWYocERhdGFTdGF0ZVJlcS0+YkNpZE51bSA+IDAmJg0KLSAgICAgICAgekF0aV9DaGVha0NpZEFuZEdldFBkcFR5cGUocERhdGFTdGF0ZVJlcS0+YWJDaWRbMF0sIHBiUGRwVHlwZSkpDQotICAgIHsNCi0gICAgICAgIHBBY3QtPmFiQ2lkWzBdPXBEYXRhU3RhdGVSZXEtPmFiQ2lkWzBdOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0NCi0gICAgaWYocERhdGFTdGF0ZVJlcS0+YkNpZE51bSA9PSAwKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gekF0aV9HZXRNb0lkZWxDaWQocEFjdCwgcGJQZHBUeXBlKTsNCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9IYW5kbGVDb25uSW5kDQotuq/K/bmmxNw6yc+xqENPTk5FQ1Qgx9C7u82otcANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgekF0aV9IYW5kbGVDb25uSW5kKEJZVEUgYlNvdXJjZUluZGV4LCBCWVRFIGJEZXN0SW5kZXgpDQotew0KLSAgICBUX3pBcE1taWFfU21Db25uZWN0X0luZCAgICAgICpwdEFwQ29ubmVjdEluZCA9IFpPU1NfTlVMTDsNCi0gICAgVF96RGV2X0F0TWVtX01taWFfUHJpdmF0ZU1lbSB0QXREYXRhICAgICAgID0gezB9Ow0KLSAgICANCi0gICAgLy9pZiAoWl9GQUlMID09IHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX01taWFQcnZ0TWVtLCAwLCAoUEJZVEUpJnRBdERhdGEpKQ0KLSAgICAvL3sgICAgICAgICAgICAgICANCi0gICAgLy8gICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfTnZGYWlsdXJlLCAgVFJBQ0VfRVJSX0xFVkVMX1NFVkVSRSwiIik7DQotICAgIC8vfQ0KLSAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9NbWlhUHJ2dE1lbSwgMCwgKFBCWVRFKSZ0QXREYXRhLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICBpZiAoWl9BUE1NSUFfQ1JfRU5BQkxFID09IHRBdERhdGEuYkNyU2V0KQ0KLSAgICB7DQotICAgICAgICAvKiBjcsnPsajPyNPaY29ubmVjdEluZCAqLw0KLSAgICAgICAgekF0aV9DckluZCAoYlNvdXJjZUluZGV4LCBiRGVzdEluZGV4LCBaX0FQTU1JQV9DUlNFUlZfR1BSUywgMCk7DQotICAgIH0NCi0gICAgcHRBcENvbm5lY3RJbmQgPSAoVF96QXBNbWlhX1NtQ29ubmVjdF9JbmQqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekFwTW1pYV9TbUNvbm5lY3RfSW5kKSk7DQotICAgIHB0QXBDb25uZWN0SW5kLT5iU3JjSW5kZXggPSBiU291cmNlSW5kZXg7DQotICAgIHB0QXBDb25uZWN0SW5kLT5iRGVzSW5kZXggPSBiRGVzdEluZGV4Ow0KLQ0KLSAgICB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKEFQX01NSUFfU01fQ09OTkVDVF9JTkRfRVYsIChVSU5UOCAqKXB0QXBDb25uZWN0SW5kLCBzaXplb2YoVF96QXBNbWlhX1NtQ29ubmVjdF9JbmQpKTsNCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0hhbmRsZU5vQ2FycmllckNuZg0KLbqvyv25psTcOsnPsahOT0NBUlJJRVIgx9C7u82otcANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX0hhbmRsZU5vQ2FycmllckNuZihCWVRFIGJTcmNJbmRleCwgQllURSBiRGVzSW5kZXgpDQotew0KLSAgICBUX3pNbWlhU21fTm9DYXJyaWVyX0NuZiAqcE5vQ2FycmllckNuZiA9IChUX3pNbWlhU21fTm9DYXJyaWVyX0NuZiAqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9Ob0NhcnJpZXJfQ25mKSk7DQotICAgIHBOb0NhcnJpZXJDbmYtPmJTcmNJbmRleCA9IGJTcmNJbmRleDsNCi0gICAgcE5vQ2FycmllckNuZi0+YkRlc0luZGV4ID0gYkRlc0luZGV4Ow0KLSAgICB6QXRpX1JlY3ZTZXJ2ZXJIYW5kbGVyU2xhdmVyKE1NSUFfU01fTk9fQ0FSUklFUl9DTkZfRVYsIChVSU5UOCAqKXBOb0NhcnJpZXJDbmYsIHNpemVvZihUX3pNbWlhU21fTm9DYXJyaWVyX0NuZikpOw0KLSAgICByZXR1cm47DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0lzRGF0YVN0YXR1cw0KLbqvyv25psTcOsXQts9DSUTKx7fx0tG+rbKmusUNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJPT0wgX19wc180Z19mdW5jIHpBdGlfSXNEYXRhU3RhdHVzKEJZVEUgYkNpZCkNCi17DQotICAgIEJZVEUgYk51bSA9IDA7DQotDQotICAgIC8qsrvUytDt1ti4tLKmusUqLw0KLSAgICBmb3IoYk51bSA9IDA7IGJOdW08WkFUSTJfU01fTUFYX1NNQ0lEX05VTTsgYk51bSsrKQ0KLSAgICB7DQotICAgICAgICBpZigoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYk51bV0uaUNpZCA9PSBiQ2lkDQotICAgICAgICB8fGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JOdW1dLmV4dEFjdENpZCA9PSBiQ2lkKQ0KLSAgICAgICAgJiYoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYk51bV0uaXNOZGlzDQotICAgICAgICB8fGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JOdW1dLmlzUHBwKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLS8qu/HIoUFUTUVN1tC2qNLltcRDSUTA4NDNKi8NCi1CT09MIHpBdGlfR2V0QXRtZW1QZHBUeXBlKFBCWVRFIHBBdE1lbUJ1ZiwgUEJZVEUgcGJQZHBUeXBlKQ0KLXsNCi0gICAgVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSAqcHRlbXBTbURhdGEgPSBaT1NTX05VTEw7DQotICAgIFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHBTbURhdGEgPSAoVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSAqKXBBdE1lbUJ1ZjsNCi0NCi0gICAgaWYocEF0TWVtQnVmID09IFpPU1NfTlVMTHx8cGJQZHBUeXBlID09IFpPU1NfTlVMTCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotDQotICAgIGlmKHBTbURhdGEtPmJQZHBJbmZvRmcgPT0gWl9BVElfUERQX0RlZmluZQ0KLSAgICAgICAgJiZwU21EYXRhLT5iQ29udEZsYWcgPT0gWl9BVElfQ09OVFhUX0ZpcnN0KQ0KLSAgICB7DQotICAgICAgICAqcGJQZHBUeXBlID0gcFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGU7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLQ0KLSAgICBpZihwU21EYXRhLT5iUGRwSW5mb0ZnID09IFpfQVRJX1BEUF9EZWZpbmUNCi0gICAgICAgICYmcFNtRGF0YS0+YkNvbnRGbGFnID09IFpfQVRJX0NPTlRYVF9TZWNuZCApDQotICAgIHsNCi0gICAgICAgIHB0ZW1wU21EYXRhID0gKFRfekRldl9BdE1lbV9TbUNpZERhdGEqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfekRldl9BdE1lbV9TbUNpZERhdGEpKTsNCi0gICAgICAgIHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX1NtQ2lkRGF0YSwgcFNtRGF0YS0+YlByZUNpZCwoUEJZVEUpcHRlbXBTbURhdGEsIGdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgICAgICAqcGJQZHBUeXBlID0gcHRlbXBTbURhdGEtPnRQZHBDb250ZXh0LmJQZHBUeXBlOw0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdGVtcFNtRGF0YSk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfR2V0UGRwVHlwZQ0KLbqvyv25psTcOrvxyKG9+NDQTU8gUFBQsqa6xbXEQ0lEwODQzQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCB6QXRpX0dldENpZFBkcFR5cGUoUEJZVEUgcEF0TWVtQnVmLCBCWVRFIGJDaWQsIFBCWVRFIHBiUGRwVHlwZSkNCi17IA0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhKiBwU21EYXRhID0gKFRfekRldl9BdE1lbV9TbUNpZERhdGEgKilwQXRNZW1CdWY7DQotDQotICAgIGlmKHBiUGRwVHlwZSA9PSBaT1NTX05VTEx8fHBBdE1lbUJ1ZiA9PSBaT1NTX05VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyrX37Lp0N64xM6qOta7u/HIodLRvq22qNLltcRDSUTA4NDNo6zWu9KqtqjS5c6qVjRWNr7NsrvUytDtsqa6xSovDQotICAgIA0KLSAgICBpZiAocFNtRGF0YS0+YlBkcEluZm9GZyA9PSBaX0FUSV9QRFBfRGVmaW5lICYmIHpBdGlfR2V0QXRtZW1QZHBUeXBlKHBBdE1lbUJ1ZiwgcGJQZHBUeXBlKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0NoZWFrQW5kR2V0UGRwVHlwZQ0KLbqvyv25psTcOrzssumyorvxyKHA4NDNDQot16LKzTrEv8ewvfbWp7PWSVBWNCC8sFBQUMDg0M0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIHpBdGlfQ2hlYWtBbmRHZXRQZHBUeXBlKFBCWVRFIHBBdE1lbUJ1ZiwgQllURSBiQ2lkLCBQQllURSBwYlBkcFR5cGUpDQotew0KLSAgICBpZighekF0aV9HZXRDaWRQZHBUeXBlKHBBdE1lbUJ1ZiwgYkNpZCwgcGJQZHBUeXBlKQ0KLSAgICAgICAgfHwoKnBiUGRwVHlwZSAhPSBaX01NSUFTTV9JUFY0ICYmICpwYlBkcFR5cGUgIT0gWl9NTUlBU01fUFBQKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfQ2hlYWtDaWRBbmRHZXRQZHBUeXBlDQotuq/K/bmmxNw6vOyy6bWxx7BDSUTKx7fxt/u6z7eixvBNTyBQUFCyprrFtcTM9bz+DQotvOyy6bnm1PI6xL/HsL321qez1klQVjS8sFBQUMDg0M0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJPT0wgekF0aV9DaGVha0NpZEFuZEdldFBkcFR5cGUoQllURSBiQ2lkLCBQQllURSBwYlBkcFR5cGUpDQotew0KLSAgICBCWVRFIGJNYXN0Q2lkID0gMDsNCi0gICAgQllURSBiRXhDaWQgPSAwOw0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhICpwdFNtRGF0YSA9IChUX3pEZXZfQXRNZW1fU21DaWREYXRhKil6QXRpX0dldFVCKHNpemVvZihUX3pEZXZfQXRNZW1fU21DaWREYXRhKSk7DQotDQotICAgIHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX1NtQ2lkRGF0YSxiQ2lkLChQQllURSlwdFNtRGF0YSwgZ196QXRpX0N1ckluc3RhbmNlKTsNCi0NCi0gICAgaWYoekF0aV9Jc0V4Q2lkKGJDaWQsICZiTWFzdENpZCl8fCh6QXRpX0lzTWFzdENpZChiQ2lkLCAmYkV4Q2lkKSAmJiAoYkV4Q2lkICE9IDApKSB8fHpBdGlfSXNEYXRhU3RhdHVzKGJDaWQpDQotICAgICAgICB8fCF6QXRpX0NoZWFrQW5kR2V0UGRwVHlwZSgoUEJZVEUpcHRTbURhdGEsIGJDaWQsIHBiUGRwVHlwZSkpDQotICAgIHsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICByZXR1cm4gVFJVRTsNCi19DQotDQotDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfVXNiU2lvU21EYXRhU3RhdGVSZXENCi0qILmmxNzD6Mr2o7ogvfjI68r9vt3MrMfrx/OjrMq508NBVCtDR0RBVEHD/MHuDQotKiCyzsr9y7XD96O6IChJTimjuiDO3g0KLSogICAgICAgICAgICBwRGF0YVB0ciAgICAgICDK/b7dDQotKiAgICAgICAgICAgIGlEYXRhTGVuICAgICAgIMr9vt2zpLbIIA0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogzt4NCi0qIMbky/zLtcP3o7ogDQotKiAgICAgICAgICAgINTaz+zTpkNPTk5FQ1TWrsewvfjQ0LLZ1/ejrNDo0qq87LLptbHHsMrHt/HS0b6tvKS77g0KLSogICAgICAgICAgICC94bm5elBTX0FwTW1pYV9TbURhdGFTdGF0ZV9SZXENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLS8qIC8vLS0NCi1CT09MIHpBdGlfVXNiU2lvU21EYXRhU3RhdGVSZXEoVUlOVDggKnBEYXRhUHRyKQ0KLXsNCi0gICAgVF96TW1pYVNtX0RhdGFTdGF0ZV9SZXEgKnBEYXRhU3RhdGVSZXEgPSAoVF96TW1pYVNtX0RhdGFTdGF0ZV9SZXEgKilwRGF0YVB0cjsNCi0gICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLkRhdGFSZXFjaG5lbElkID0gcERhdGFTdGF0ZVJlcS0+YlNyY0luZGV4Ow0KLSAgICBpZihwRGF0YVN0YXRlUmVxLT5iQ2lkTnVtID4gMCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHpBdGlfU2F2ZUxhc3RDaWRUYWIocERhdGFTdGF0ZVJlcS0+YWJDaWRbMF0sIHBEYXRhU3RhdGVSZXEtPmJTcmNJbmRleCk7DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLSovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfVXNiU2lvU21NdEFjdEFuc1JlcQ0KLSoguabE3MPoyvajuiBBVCtDR0FOU9OmtPBNVLXEUERQvKS77sfrx/MNCi0qILLOyv3LtcP3o7ogKElOKaO6IM7eDQotKiAgICAgICAgICAgIHBEYXRhUHRyICAgICAgIMr9vt0NCi0qICAgICAgICAgICAgaURhdGFMZW4gICAgICAgyv2+3bOktsggDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiANCi0qICAgICAgICAgICAg16LS4kNJRLXE07PJ5LnYz7WjrL3hublUX3pQU19BcE1taWFfU21NdEFjdEFuc19SZXENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLUJPT0wgekF0aV9Vc2JTaW9TbU10QWN0QW5zUmVxKFZPSUQqIHBEYXRhUHRyKQ0KLXsNCi0gICAgQllURSBiQ2lkID0gMDsNCi0gICAgVF96RGV2X0F0TWVtX1NNX0F1dG9Sc3AgdEF0RGF0YSAgICA9IHswfTsNCi0gICAgVF96QXBNbWlhX1NtTXRBY3RBbnNfUmVxICpwQW5zUmVxID0gKFRfekFwTW1pYV9TbU10QWN0QW5zX1JlcSAqKXBEYXRhUHRyOw0KLSAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9BdXRvUnNwLCAwLCAoUEJZVEUpJnRBdERhdGEsIGdfekF0aV9DdXJJbnN0YW5jZSk7DQotDQotICAgIGlmKHRBdERhdGEuYkNnYXV0byAhPSBaX0FQTU1JQV9UVVJOX09GRl9SU1BfUFNET01BSU4NCi0gICAgICAgIHx8Z196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0uYk10QWRyclR5cGUgPT0gMCkvL7fHyta2r7fH0ru0zk1UyrGxqLTtDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLSAgICBpZihwQW5zUmVxLT5iQ2lkTnVtID09IDAmJlpfQVBNTUlBX1NNX01UX0FDVF9BQ0MgPT0gcEFuc1JlcS0+YkFuc1R5cGUpDQotICAgIHsNCi0gICAgICAgIGlmKHpBdGlfR2V0TXRJZGxlQ2lkKGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLmJNdEFkcnJUeXBlLCAmYkNpZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcEFuc1JlcS0+YWJDaWRbMF0gPSBiQ2lkOw0KLSAgICAgICAgICAgIHBBbnNSZXEtPmJDaWROdW0gPSAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKFpfQVBNTUlBX1NNX01UX0FDVF9BQ0MgPT0gcEFuc1JlcS0+YkFuc1R5cGUNCi0gICAgICAgICYmcEFuc1JlcS0+YkNpZE51bSA9PSAwKQ0KLSAgICB7DQotICAgICAgICBwQW5zUmVxLT5iQW5zVHlwZSA9IFpfQVBNTUlBX1NNX01UX0FDVF9SRUo7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICB9DQotDQotICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLmJNdEFkcnJUeXBlID0gMDsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1VzYlNpb1NtTXRRdWVyeUlkbGVDaEluZA0KLSoguabE3MPoyvajuiBTTS9NTUlBtb1BVEkysunRr82otcDXtMys1rjKvrSmwO26r8r9DQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgcERhdGFQdHIgICAgICAgyv2+3Q0KLSogICAgICAgICAgICBpRGF0YUxlbiAgICAgICDK/b7ds6S2yCANCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6IA0KLSogICAgICAgICAgICDSu7DjwLTLtaOstbHN+MLnKE1UKcfrx/O8pLvuyrGjrLLFu+HT0LTLz/vPosnPsagNCi0qICAgICAgICAgICAgWlBTX0FwTW1pYV9TbVF1ZXJ5SWRsZUNoSW5kX0V2zqq/1c/7z6INCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLVZPSUQgekF0aV9Vc2JTaW9TbU10UXVlcnlJZGxlQ2hJbmQoVk9JRCAqcERhdGFQdHIpIC8qIDAxMDcgKi8NCi17ICAgICAgICANCi0gICAgVUlOVDggICAgICAgIGRlc3RUYXNrICAgID0gMDsNCi0gICAgVUlOVDggICAgICAgIGlTZW5kQ291bnQgPSAwOw0KLSAgICBVSU5UMTYgICAgICBpTGVuUXVlcnlJZGxlQ2hSc3AgPSBzaXplb2YoVF96TW1pYVNtX1F1ZXJ5SWRsZUNoX1JzcCk7DQotICAgIFRfek1taWFTbV9RdWVyeUlkbGVDaF9Sc3AgICpwUXVlcnlJZGxlQ2hSc3AgPSBOVUxMOw0KLSAgICBUX1pBdGlfQ2hhbm5lbEluZm8gICAgICAgICAgICAgKnBDaG5lbE5vZGVEZWxpdmVyQWxsID0gekF0aV9HZXRGaXJzdENoYW5uZWxOb2RlUHRyQnlJbnN0YW5jZShnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLQ0KLSAgICBCWVRFIGJNYXhDaG5sSWQgPSAoZ196QXRpX0N1ckluc3RhbmNlID8gWl9BVElfSU5TVEFOQ0VfVFdPX0NITkxfTUFYIDogWl9BVElfSU5TVEFOQ0VfT05FX0NITkxfTUFYKTsNCi0NCi0gICAgaWYgKCF6QXRpX0dldERlc3RUYXNrQnlNc2dJRChNTUlBX1NNX0lETEVfQ0hOTF9RVUVSWV9SU1BfRVYsJmRlc3RUYXNrKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIDsNCi0gICAgfQ0KLSAgICBwUXVlcnlJZGxlQ2hSc3A9IChUX3pNbWlhU21fUXVlcnlJZGxlQ2hfUnNwICopekF0aV9HZXRVQihpTGVuUXVlcnlJZGxlQ2hSc3ApOw0KLSAgICANCi0gICAgd2hpbGUoTlVMTCAhPSBwQ2huZWxOb2RlRGVsaXZlckFsbCAmJiBwQ2huZWxOb2RlRGVsaXZlckFsbC0+aUNobmVsSWQgPD0gYk1heENobmxJZCkNCi0gICAgew0KLSAgICAgICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCA9PSBwQ2huZWxOb2RlRGVsaXZlckFsbC0+c2VydmVyX21vZGUpIC8qINGh1PHD/MHuzai1wCAqLw0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlTZW5kQ291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcENobmVsTm9kZURlbGl2ZXJBbGwgPSBwQ2huZWxOb2RlRGVsaXZlckFsbC0+cE5leHRDbk5vZGU7DQotICAgIH0NCi0gICAgDQotICAgIGlmKGlTZW5kQ291bnQgPD0gMSkgLyog1rvT0DG49qOsu/IwuPbD/MHuzai1wMqxo6zKp7DcICovDQotICAgIHsNCi0gICAgICAgIHBRdWVyeUlkbGVDaFJzcC0+YlJlc3VsdCA9IFpfQVBNTUlBX1NNX0NIX0JVU1k7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwUXVlcnlJZGxlQ2hSc3AtPmJSZXN1bHQgPSBaX0FQTU1JQV9TTV9DSF9JRExFOw0KLSAgICB9DQotICAgIA0KLSAgICB6QXRpX01zZ1NlbmQoTU1JQV9TTV9JRExFX0NITkxfUVVFUllfUlNQX0VWLCAoUEJZVEUpcFF1ZXJ5SWRsZUNoUnNwLCBpTGVuUXVlcnlJZGxlQ2hSc3AsZGVzdFRhc2spOw0KLSAgICByZXR1cm47DQotfQ0KLQ0KLVZPSUQgekF0aV9TbU1zaXNkbkluZChWT0lEICpwRGF0YVB0cikNCi17DQotICAgIFRfek1taWFTbV9Nc2lzZG5fSW5kICpwdE1zaXNkbiA9IChUX3pNbWlhU21fTXNpc2RuX0luZCopcERhdGFQdHI7DQotICAgIFRfekF0aV9OVl9Nc2lzZG4gdE52TXNpc2RuID0gezB9Ow0KLSAgICBUX3pBdGlfTlZfTXNpc2RuIHRUZW1wTXNpc2RuID0gezB9Ow0KLSAgICBCWVRFIGJOdkl0ZW1JZCA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPyBaX0FUSV9OVl9Nc2lzZG4yIDogWl9BVElfTlZfTXNpc2RuMSk7DQotDQotICAgIGlmKHB0TXNpc2RuLT5iTnVtTGVuID4gMCAmJiBwdE1zaXNkbi0+YWJNc2lzZG5OdW1bMF0gIT0gMHhGRikvL9PQ0KfQ1LzssukNCi0gICAgew0KLSAgICAgICAgaWYocHRNc2lzZG4tPmJOdW1MZW4gPiBaX0RFVl9NQVhfTVNJU0ROX05VTSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdE1zaXNkbi0+Yk51bUxlbiA9IFpfREVWX01BWF9NU0lTRE5fTlVNOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgekRldl9OVl9BdGlSZWFkSXRlbShiTnZJdGVtSWQsIChCWVRFKikmdE52TXNpc2RuKTsNCi0gICAgICAgIHpPc3NfTWVtY3B5KCZ0VGVtcE1zaXNkbiwgJnROdk1zaXNkbiwgc2l6ZW9mKFRfekF0aV9OVl9Nc2lzZG4pKTsNCi0NCi0gICAgICAgIHROdk1zaXNkbi5iTnVtTGVuID0gcHRNc2lzZG4tPmJOdW1MZW47DQotICAgICAgICB6T3NzX01lbXNldCh0TnZNc2lzZG4uYWJNc2lzZG5OdW0sIDAsIFpfREVWX01BWF9NU0lTRE5fTlVNKTsNCi0gICAgICAgIHpPc3NfTWVtY3B5KHROdk1zaXNkbi5hYk1zaXNkbk51bSwgcHRNc2lzZG4tPmFiTXNpc2RuTnVtLCBwdE1zaXNkbi0+Yk51bUxlbik7DQotDQotICAgICAgICBpZigwICE9IG1lbWNtcCgmdE52TXNpc2RuLCAmdFRlbXBNc2lzZG4sIHNpemVvZihUX3pBdGlfTlZfTXNpc2RuKSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekRldl9OVl9BdGlXcml0ZUl0ZW0oYk52SXRlbUlkLCAoUEJZVEUpJnROdk1zaXNkbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogekF0aV9Vc2JTaW9EZWFjdGl2ZUJ5QXRpUmVxDQotKiC5psTcw+jK9qO6ILj5vt3NqLXAusXTyUFUSTK3osbwyKW8pLvuwfezzKGjDQotKiCyzsr9y7XD96O6IChJTimjuiDO3g0KLSogICAgICAgICAgICBpQ2huZWxJZCAgICAgzai1wElEDQotKiAgICAgICAgICAgIChPVVQpo7rO3g0KLSogt7Ugu9gg1rWjuiDO3g0KLSogxuTL/Mu1w/ejuiANCi0qICAgICAgICAgICAg1rvTw9Pas8m5pr34yOvK/b7dzKy686Osts+/qrHku9jD/MHuzKy1xMilvKS77rLZ1/ejrNPrzai1wLrFz+C52A0KLSogICAgICAgICAgICDXotLisPy1xLjxyr2jrL3iwuvWrrrztcSjrFRfelBTX0FwTW1pYV9TbUFjdERlYWN0X1JlcQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfVXNiU2lvRGVhY3RpdmVCeUF0aVJlcShVSU5UOCBpQ2huZWxJZCkNCi17DQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBpQXRpQ2lkTnVtID0gMDsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICAgICAgICAgKnBDaG5lbE5vZGUgPSBOVUxMOw0KLSAgICBUX3pBcE1taWFfU21BY3REZWFjdF9SZXEgdEFjdCA9IHswfTsNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQoaUNobmVsSWQpOw0KLQ0KLSNpZmRlZiBDWFRfTU9WDQotICAgIGlmKFpfQVRJX1BTX01PVkVfSU5fUFJPQ0VTUyA9PSB6QXRpX0dldFBzTW92U3RhdCgpfHwNCi0gICAgICAgIFpfQVRJX1BTX01PVkVfSU5TRVJUX1VTRVJfRElTQ09OTkVDVCA9PSB6QXRpX0dldFBzTW92U3RhdCgpKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NldFBzTW92U3RhdChaX0FUSV9QU19NT1ZFX0lOU0VSVF9VU0VSX0RJU0NPTk5FQ1QpOw0KLSAgICAgICAgekF0aV9TZXRDaG5sV2hlblVzZXJEaXNDb25uKGlDaG5lbElkKTsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSNlbmRpZg0KLQ0KLSAgICBwQ2huZWxOb2RlID0gekF0aV9HZXRDaGFubmVsTm9kZVB0cihpQ2huZWxJZCk7DQotICAgIA0KLSAgICBpZihOVUxMID09IHBDaG5lbE5vZGUpIC8qILjDzai1wMO709C08r+qICovDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICBmb3IoaUF0aUNpZE51bSA9IDA7IGlBdGlDaWROdW0gPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBpQXRpQ2lkTnVtKyspDQotICAgIHsNCi0gICAgICAgIGlmKChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5jaG5lbElkID09IHBDaG5lbE5vZGUtPmlDaG5lbElkKQ0KLSAgICAgICAgJiYgKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmV4dEFjdENpZCA+PSAxKSANCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5leHRBY3RDaWQgPD0gWkFUSTJfU01fTUFYX1NNQ0lEX05VTSkgJiYgKHRBY3QuYkNpZE51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRBY3QuYWJDaWRbdEFjdC5iQ2lkTnVtKytdPWdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmV4dEFjdENpZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmKChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5jaG5lbElkID09IHBDaG5lbE5vZGUtPmlDaG5lbElkKQ0KLSAgICAgICAgJiYgKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmlDaWQgPj0gMSkNCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5pQ2lkIDw9IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pICYmICh0QWN0LmJDaWROdW0gPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0QWN0LmFiQ2lkW3RBY3QuYkNpZE51bSsrXT1nX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5pQ2lkOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHRBY3QuYkNpZE51bSA9PSBaQVRJMl9TTV9NQVhfU01DSURfTlVNKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIGlmKHRBY3QuYkNpZE51bT4wKQ0KLSAgICB7DQotICAgICAgICB0QWN0LmJJc0Rpc2Nvbm5lY3QgPSBUUlVFOw0KLSAgICAgICAgdEFjdC5iU3JjSW5kZXggPSBpQ2huZWxJZDsNCi0gICAgICAgIHRBY3QuYkRlc0luZGV4ID0gMHhmZjsNCi0gICAgICAgIHRBY3QuYlR5cGVGbGcgPSBaX0FQTU1JQV9WQUxJRDsNCi0gICAgICAgIHRBY3QuYlR5cGUgPSBaX0FQTU1JQV9TTV9QRFBfSU5BQ1RJVkU7DQotICAgICAgICB6QXRpX1NlbmRDZ2FjdERlYWN0UmVxKCZ0QWN0LCBiSW5zdGFuY2UpOyAgICAgICANCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiB6QXRpX1VzYlNpb0dldEFkZHINCi0qILmmxNzD6Mr2o7ogteO31jjOu0lQtdjWt7jxyr27r86qMzLOu7XY1rcNCi0qILLOyv3LtcP3o7ogKElOKaO6IA0KLSogICAgICAgICAgICBwU3JjQWRkciAgICAgICA4zru48cq9yv2+3Q0KLSogICAgICAgICAgICAoT1VUKaO6zt4NCi0qILe1ILvYINa1o7ogMzLOu7jxyr3K/da1DQotKiDG5Mv8y7XD96O6IA0KLSogICAgICAgICAgICDQ6NKq16LS4g0KLSogICAgICAgICAgICC4w7qvyv3Wu9TatK6/2sSjyr3PwrX308MNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIA0KLVVJTlQzMiB6QXRpX1VzYlNpb0dldEFkZHIoVUlOVDggKnBTcmNBZGRyKQ0KLXsgICAgDQotICAgIHJldHVybiAoKHBTcmNBZGRyWzNdIDw8IDI0KSB8IChwU3JjQWRkclsyXSA8PCAxNikgfCAocFNyY0FkZHJbMV0gPDwgOCkgfCAocFNyY0FkZHJbMF0pKTsNCi19DQotDQotVk9JRCB6QXRpX0x0ZVpjb25zdGF0SW5kKFVJTlQ4IGlSZXN1bHQsVUlOVDggY2hhbm5lbElkKQ0KLXsNCi0gICAgQllURSBiQXRpTnVtICAgPSAwOw0KLSAgICBCWVRFIGJJbnN0YW5jZSA9IHpBdGlfR2V0VGFza0luc3RhbnRCeUNobmxJZChjaGFubmVsSWQpOw0KLSAgICBUX1pBdGlfWmNvbnN0YXRJbmQgKnBaY29uc3RhdEluZCA9IChUX1pBdGlfWmNvbnN0YXRJbmQgKil6QXRpX0dldFVCKHNpemVvZihUX1pBdGlfWmNvbnN0YXRJbmQpKTsNCi0gIA0KLSAgICBmb3IoYkF0aU51bSA9IDA7IGJBdGlOdW0gPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBiQXRpTnVtKyspDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JBdGlOdW1dLmNobmVsSWQgPT0gY2hhbm5lbElkKSAvKiDV0rW9ICovDQotICAgICAgICB7DQotICAgICAgICAgICAgcFpjb25zdGF0SW5kLT5pQ2lkID0gZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uaUNpZDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwWmNvbnN0YXRJbmQtPmlSZXN1bHQgPSBpUmVzdWx0Ow0KLSAgICBwWmNvbnN0YXRJbmQtPmlEZXN0SW5kZXggPSBjaGFubmVsSWQ7DQotICAgIHBaY29uc3RhdEluZC0+aVNyY0luZGV4ID0gMHhmZjsNCi0NCi0gICAgek9zc19UYXNrU2VuZERhdGEoRVZfWkFUSTJfTFRFX1pDT05TVEFUX0lORCwgKFZPSUQgKilwWmNvbnN0YXRJbmQsIHNpemVvZihUX1pBdGlfWmNvbnN0YXRJbmQpLCBnX3pBdGlfQ29udGV4dC50YXNrSWRNeSk7DQotICAgIHJldHVybjsNCi19DQotDQotLyogNjE3MDAxNTkxNDExIKG+1sfE3Lv60OjH86G/LSDWx8Tcu/rQ6MfzVjOw5rG+zayyvcq1z9YqLw0KLVZPSUQgX19wc19zdGF0aWNfZnVuYyB6QXRpX05vdGlmeUFwTW9kZW1SZWFkeSgpDQotew0KLSAgICBpZiAoZ196QXRpX0NvbnRleHQuc2VuZEZuYyA9PSB6QXRpX0F0UmVjdk51bGxGdW5jKQ0KLSAgICB7DQotICAgICAgICB6T3NzX1NldFJlbGF0aXZlVGltZXIoMTAwMCwgRVZfWkFUSTJfWk1TUklfSU5EX0VYUElSWV9FViwgMCk7DQotICAgICAgICByZXR1cm4gOw0KLSAgICB9DQotDQotICAgIHNwcmludGYoKGNoYXIgKilnX3pBdF9FbmNCdWYsICIlcytaTVNSSSVzIiwgZ196QXRfQ1JMRiwgZ196QXRfQ1JMRik7DQotICAgIHpBdGlfRGVsaXZlckFsbE1zZyhFVl9aQVRJMl9aTVNSSV9JTkQsIGdfekF0X0VuY0J1ZiwgKFdPUkQpc3RybGVuKChjb25zdCBjaGFyICopZ196QXRfRW5jQnVmKSk7DQotICAgIHJldHVybjsNCi19DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9uabE3DrT79L0x/22r8/C0NBEVE1GIEtFWda1yc+xqA0KLSrG5Mv7OtPrx/22r8i3yM9kdG1mTGVus6S2yLnMtqjOqjENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX0Rydl9kdG1mcnhfUmVwb3J0KGNoYXIgKmR0bWYsIHVuc2lnbmVkIGNoYXIgZHRtZkxlbikNCi17DQotICAgIEJZVEUgaSA9IDA7DQotICAgIEJZVEUgaUNjTnVtID0gMDsNCi0gICAgQllURSBiQ2FsbElkID0gMDsNCi0gICAgQllURSBiVGVtcE5vID0gMDsNCi0gICAgQ0hBUiBhYlN0clszMF0gPSB7MH07DQotDQotICAgIHpPc3NfTWVtc2V0KGFiU3RyLCAwLCAzMCk7DQotICAgIGJUZW1wTm8gPSBnX3pBdGlfQ3VySW5zdGFuY2U7DQotDQotICAgIGdfekF0aV9DdXJJbnN0YW5jZSA9IFpfQVRJX0lOU05PXzE7Lyq5zLao1Nq0/THJz7GoKi8NCi0NCi0gICAgZm9yKGlDY051bSA9IDA7IGlDY051bSA8IFpBVEkyX01BWF9DQUxMX05VTTsgaUNjTnVtKyspDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDY01hbi5jYWxsSW5mb1tpQ2NOdW1dLmNhbGxTdGF0ZSA9PSBaQVRJMl9DQUxMX1NUQVRFX0FDVElWRSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiQ2FsbElkID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENjTWFuLmNhbGxJbmZvW2lDY051bV0uaVhpZDsNCi0NCi0gICAgICAgICAgICBzcHJpbnRmKChjaGFyICopYWJTdHIsICIlcytJTVNEVE1GOiAlZCwlYyVzIiwgZ196QXRfQ1JMRiwgYkNhbGxJZCwgKCpkdG1mKSwgZ196QXRfQ1JMRik7DQotICAgICAgICAgICAgekF0aV9EZWxpdmVyQWxsTXNnKEVWX1pBVEkyX1pEVE1GX0lORCwgYWJTdHIsIChXT1JEKXN0cmxlbigoY29uc3QgY2hhciAqKWFiU3RyKSk7DQotDQotICAgICAgICAgICAgZ196QXRpX0N1ckluc3RhbmNlID0gYlRlbXBObzsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgZ196QXRpX0N1ckluc3RhbmNlID0gYlRlbXBObzsNCi0gICAgcmV0dXJuOw0KLX0NCi0jaWZuZGVmIF9PU19XSU4NCi1WT0lEIHpBdGlfUmVnRHRtZkNhbGxCYWNrKCkNCi17DQotICAgIFRfRHJ2RHRtZl9EZXRlY3RfT3B0ICBkdG1mcng7DQotDQotICAgIGR0bWZyeC5kcnZfZHRtZnJ4X3JlcG9ydF9jYiA9IHpBdGlfRHJ2X2R0bWZyeF9SZXBvcnQ7DQotICAgIGR0bWZyeC5kcnZfZHRtZnR4X3JlcG9ydF9jYiA9IE5VTEw7DQotDQotICAgIHpEcnZEdG1mX0RldGVjdF9SZWdDYWxsYmFja3MoZHRtZnJ4KTsNCi19DQotI2VuZGlmDQotI2VuZGlmDQotQk9PTCBfX3BzXzRnX2Z1bmMgekF0aV9HZXRQZHBJbmZvQnlDaWQoVUlOVDggYkNpZCxUX3pNbWlhU21fUGRwQWRkciAqIHBQZHBBZGRyLFRfek1taWFTbV9QY29JbmZvICogcFBjb0luZm8sIEJZVEUgYkluc05vKQ0KLXsNCi0jaWYgZGVmaW5lZCAoUFNfUkFUX0dTTSkgfHwgZGVmaW5lZCAoUFNfUkFUX1RERCkgfHwgZGVmaW5lZCAoUFNfUkFUX0ZERCkNCi0gICAgaWYoelNtX0dldFBkcEluZm9CeUNpZChiSW5zTm8sIGJDaWQsIHBQZHBBZGRyLCBwUGNvSW5mbykgPT0gWl9TVUNDKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSNlbmRpZg0KLSNpZmRlZiBQU19SQVRfTFRFDQotICAgIGlmKHpFc21fR2V0UGRwSW5mb0J5Q2lkKGJJbnNObywgYkNpZCwgcFBkcEFkZHIsIHBQY29JbmZvKSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotI2VuZGlmDQotICAgIHJldHVybiBGQUxTRTsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9Jc1RoZUNpZEFjdGl2ZWQNCi26r8r9uabE3DrF0LbPzNi2qLXEQ0lE1NrM2LaotcS0/bv6suDW0MrHt/G8pLvuDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJPT0wgekF0aV9Jc1RoZUNpZEFjdGl2ZWQoVUlOVDggYkluc05vLCBVSU5UOCBiQ2lkKQ0KLXsNCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICAgICAgICAgICAgICAgICAgICB0UGRwQWRkciA9IHswfTsgIA0KLSAgICBUX3pNbWlhU21fUGNvSW5mbyAgICpwdFBjb0luZm8gPSAoVF96TW1pYVNtX1Bjb0luZm8qKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9QY29JbmZvKSk7DQotDQotI2lmIGRlZmluZWQgKFBTX1JBVF9HU00pIHx8IGRlZmluZWQgKFBTX1JBVF9UREQpIHx8IGRlZmluZWQgKFBTX1JBVF9GREQpDQotICAgIGlmKHpTbV9HZXRQZHBJbmZvQnlDaWQoYkluc05vLCBiQ2lkLCAmdFBkcEFkZHIsIHB0UGNvSW5mbykgPT0gWl9TVUNDKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwdFBjb0luZm8pOw0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0jZW5kaWYNCi0jaWZkZWYgUFNfUkFUX0xURQ0KLSAgICBpZih6RXNtX0dldFBkcEluZm9CeUNpZChiSW5zTm8sIGJDaWQsICZ0UGRwQWRkciwgcHRQY29JbmZvKSA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0UGNvSW5mbyk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSNlbmRpZg0KLSAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwdFBjb0luZm8pOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9Jc0NpZEFjdGl2ZWRTdGFuZA0KLbqvyv25psTcOsXQts+21NOmtP27+rLgyse38dPQyc/Pws7EvKS77g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCB6QXRpX0lzQ2lkQWN0aXZlZFN0YW5kKEJZVEUgYkluc05vKQ0KLXsNCi0gICAgQllURSBiQ2lkID0gMDsNCi0gICAgQllURSBiSXNBY3QgPSAwOw0KLSAgICBUX3pNbWlhU21fUGRwQWRkciAgKnB0UGRwQWRkciA9IChUX3pNbWlhU21fUGRwQWRkciopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1BkcEFkZHIpKTsNCi0gICAgVF96TW1pYVNtX1Bjb0luZm8gKnB0UGNvSW5mbyA9IChUX3pNbWlhU21fUGNvSW5mbyopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1Bjb0luZm8pKTsNCi0NCi0gICAgZm9yKGJDaWQgPSBaX0RFVl9BdE1lbV9NSU5JTlVNX0NJRDsgYkNpZCA8PSBaX0RFVl9BdE1lbV9NQVhJTlVNX0NJRDsgYkNpZCsrKQ0KLSAgICB7DQotICAgICAgICAjaWYgZGVmaW5lZCAoUFNfUkFUX0dTTSkgfHwgZGVmaW5lZCAoUFNfUkFUX1RERCkgfHwgZGVmaW5lZCAoUFNfUkFUX0ZERCkNCi0gICAgICAgIGlmKHpTbV9HZXRQZHBJbmZvQnlDaWQoYkluc05vLCBiQ2lkLCBwdFBkcEFkZHIsIHB0UGNvSW5mbykgPT0gWl9TVUNDKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJJc0FjdCA9IDE7DQotICAgICAgICB9DQotICAgICAgICAjZW5kaWYNCi0gICAgICAgICNpZmRlZiBQU19SQVRfTFRFDQotICAgICAgICBpZih6RXNtX0dldFBkcEluZm9CeUNpZChiSW5zTm8sIGJDaWQsIHB0UGRwQWRkciwgcHRQY29JbmZvKSA9PSBaX1NVQ0MpDQotICAgICAgICB7DQotICAgICAgICAgICAgYklzQWN0ID0gMTsNCi0gICAgICAgIH0NCi0gICAgICAgICNlbmRpZg0KLQ0KLSAgICAgICAgaWYoYklzQWN0ID09IDEpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcHRQZHBBZGRyKTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwdFBjb0luZm8pOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0UGRwQWRkcik7DQotICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0UGNvSW5mbyk7DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotI2lmZGVmIFpfU0VMTF9TVEFUX1NVUFBPUlQNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfU2VsbFN0YXRGb3JQcHBBY3QNCi26r8r9uabE3DpQUFCyprrFs8m5prrzt6LG8M/6wb/Ns7zGDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfU2VsbFN0YXRGb3JQcHBBY3QoVF96QXRpX0NJREluZm8gKnBDaWRJbmZvLCBUX3pNbWlhU21fUGRwQWN0UmVzICpwdEFjdFJlcykNCi17DQotICAgIEJZVEUgICAgYkNpZEluZGV4ID0gMDsNCi0NCi0gICAgaWYgKFpfU1VDQyA9PSB6QXRpX0dldENpZGluZm9Gcm9tU20ocENpZEluZm8sIHB0QWN0UmVzKSkNCi0gICAgew0KLSAgICAgICAgI2lmZGVmIERVQUxfQ0FSRF9EVUFMX1NUQU5EQlkNCi0gICAgICAgIGlmKFpfVkFMSUQgPT0gekF0aV9Jc0R1YWxQc0R1YWxVaWNjKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZWxsU3RhdF9QZHBBY3RDbmZTZW5kdG9QZGkocHRBY3RSZXMtPmJDaWQsIHBDaWRJbmZvLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgI2VuZGlmDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZWxsU3RhdF9QZHBBY3RDbmZTZW5kdG9QZGkocHRBY3RSZXMtPmJDaWQsIHBDaWRJbmZvLCBaX0FUSV9JTlNOT18xKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsgICAgDQotICAgICAgICBiQ2lkSW5kZXggPSBwdEFjdFJlcy0+YkNpZCAtIFpfREVWX0F0TWVtX01JTklOVU1fQ0lEOw0KLSAgICAgICAgI2lmZGVmIERVQUxfQ0FSRF9EVUFMX1NUQU5EQlkNCi0gICAgICAgIGlmKFpfVkFMSUQgPT0gekF0aV9Jc0R1YWxQc0R1YWxVaWNjKCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19NZW1zZXQoZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENJREluZm8gKyBiQ2lkSW5kZXgsIDAsIHNpemVvZihUX3pBdGlfQ0lESW5mbykpOw0KLSAgICAgICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDSURJbmZvW2JDaWRJbmRleF0uYlBkcEFjdEZnID0gWl9BVElfQ0lESU5GT19QRFBERUFDVDsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgICNlbmRpZg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtc2V0KGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS50Q0lESW5mbyArIGJDaWRJbmRleCwgMCwgc2l6ZW9mKFRfekF0aV9DSURJbmZvKSk7DQotICAgICAgICAgICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLnRDSURJbmZvW2JDaWRJbmRleF0uYlBkcEFjdEZnID0gWl9BVElfQ0lESU5GT19QRFBERUFDVDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLSNlbmRpZg0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfSGFuZGxlUHBwQWN0Q25mDQotuq/K/bmmxNw6UFBQvKS77rvy1d+yprrFz+zTprXEtKbA7Q0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBWT0lEIHpBdGlfSGFuZGxlUHBwQWN0Q25mKFRfek1taWFTbV9QZHBBY3RfQ25mICogcEFjdENuZiwgVF9aQXRpX0NoYW5uZWxJbmZvKiBwQ2huZWxOb2RlKQ0KLXsNCi0gICAgVF96QXBNbWlhX1NtWmdhY3RfUmVxIHRaYWN0ID0gezB9Ow0KLSNpZmRlZiBaX1NFTExfU1RBVF9TVVBQT1JUDQotICAgIFRfekF0aV9DSURJbmZvICAgdENpZGluZm8gPSB7MH07DQotI2VuZGlmDQotICAgDQotICAgIGlmKHBBY3RDbmYtPmJSZXN1bHQgPT0gWl9TVUNDKQ0KLSAgICB7DQotICAgICAgICBpZihwQWN0Q25mLT5iQXRUeXBlPT1aX01NSUFTTV9BVENNRF9DR0FDVCkgICAgLyq8pLvus8m5preixvCyprrFKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0WmFjdC5iU3JjSW5kZXggPSBwQWN0Q25mLT5iRGVzSW5kZXg7DQotICAgICAgICAgICAgdFphY3QuYkRzdEluZGV4ID0gcEFjdENuZi0+YlNyY0luZGV4Ow0KLSAgICAgICAgICAgIHRaYWN0LmJTdGF0ZSA9IFpfQVBNTUlBX1NNX1BEUF9BQ1RJVkFURTsNCi0gICAgICAgICAgICB0WmFjdC5iQ2lkID0gcEFjdENuZi0+YXRSZXN1bHRbMF0uYkNpZDsNCi0gICAgICAgICAgICB6QXRpX1NlbmRTbVpnYWN0UmVxKCZ0WmFjdCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHBBY3RDbmYtPmJBdFR5cGU9PVpfTU1JQVNNX0FUQ01EX1pHQUNUKSAgICAvKrKmusWzybmmtcS0psDtKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9PSBaQVRJMl9DSEFOTkVMX01PREVfQ01EKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9IYW5kbGVDb25uSW5kKHBBY3RDbmYtPmJTcmNJbmRleCxwQWN0Q25mLT5iRGVzSW5kZXgpOw0KLSAgICAgICAgICAgIH0NCi0jaWZkZWYgWl9TRUxMX1NUQVRfU1VQUE9SVA0KLSAgICAgICAgICAgIHpBdGlfU2VsbFN0YXRGb3JQcHBBY3QoJnRDaWRpbmZvLCAmcEFjdENuZi0+YXRSZXN1bHRbMF0pOy8vz/rBv82zvMYNCi0jZW5kaWYNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICB9DQotICAgIGVsc2UgIC8qvKS77rvy1d+yprrFyqew3LXEtKbA7SovDQotICAgIHsNCi0gICAgICAgIHpBdGlfQ2xlYXJDaWRJbmZvYnlDaG5lbChwQWN0Q25mLT5iRGVzSW5kZXgpOw0KLSAgICAgICAgcENobmVsTm9kZS0+SXNQcHAgPSBGQUxTRTsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLUJPT0wgekF0aV9Jc0xhc3RDaWRPZkNobm5lbChCWVRFIGJDaWQsIEJZVEUgaUNobmVsSWQpDQotew0KLSAgICBVSU5UOCAgaUF0aU51bSA9IDA7DQotDQotICAgIGZvcihpQXRpTnVtID0gMDsgaUF0aU51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGlBdGlOdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbaUF0aU51bV0uaUNpZCAhPSBiQ2lkDQotICAgICAgICAmJmdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlOdW1dLmNobmVsSWQ9PWlDaG5lbElkDQotICAgICAgICAmJmdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlOdW1dLmlzVXNlZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLQ0KLUJPT0wgX19wc180Z19mdW5jIHpBdGkyX0lzRXhDaWQoQllURSBleHRBY3RDaWQsUEJZVEUgcGJDaWQpDQotew0KLSAgICBCWVRFIGkgPSAwOw0KLQ0KLSAgICBmb3IoaT0wOyBpPFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGkrKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFswXS5sYXN0Q2lkVGFiW2ldLmV4dEFjdENpZCA9PSBleHRBY3RDaWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBiQ2lkID0gZ196QXRpX1NtQ29udGV4dFswXS5sYXN0Q2lkVGFiW2ldLmlDaWQ7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9Jc0V4Q2lkDQotuq/K/bmmxNw6xdC2z0NJRMrHt/HOqrioQ0lEsqK78cihz+DTprXE1vdDSUQNCi278cihuebU8jrU2mxhc3RDaWRUYWKx7bjx1tDRsNXSDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfNGdfZnVuYyB6QXRpX0lzRXhDaWQoQllURSBleHRBY3RDaWQsUEJZVEUgcGJDaWQpDQotew0KLSAgICBCWVRFIGkgPSAwOw0KLSAgICANCi0gICAgZm9yKGk9MDsgaTxaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBpKyspDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2ldLmV4dEFjdENpZCA9PSBleHRBY3RDaWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgKnBiQ2lkID0gZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbaV0uaUNpZDsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0lzQWxsRXhDaWQNCi26r8r9uabE3DrF0LbPvdO/2tbQyse38b75zqq4qENJRA0KLbvxyKG55tTyOtTabGFzdENpZFRhYrHtuPHW0NGw1dINCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCBfX3BzXzRnX2Z1bmMgekF0aV9Jc0FsbEV4Q2lkKFRfek1taWFTbV9QZHBBY3RfQ25mICogcFNtQWN0RGVhY0NuZikNCi17DQotICAgIEJZVEUgaSA9IDA7DQotICAgIEJZVEUgYk1hc3RjaWQgPSAwOw0KLQ0KLSAgICBmb3IoaSA9IDA7IGk8cFNtQWN0RGVhY0NuZi0+YkNpZE51bTsgaSsrKQ0KLSAgICB7DQotICAgICAgICBpZighekF0aV9Jc0V4Q2lkKHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJDaWQsICZiTWFzdGNpZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9Jc01hc3RDaWQNCi26r8r9uabE3DrF0LbPQ0lEyse38c6q1vdDSUSyorvxyKHP4NOmtcS4qENJRCi0y8qxtcS4qENJRL/JzqowKQ0KLbvxyKG55tTyOtTabGFzdENpZFRhYrHtuPHW0NGw1dINCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQk9PTCBfX3BzXzRnX2Z1bmMgekF0aV9Jc01hc3RDaWQoQllURSBiTWFzdENpZCxQQllURSBwYkV4dENpZCkNCi17DQotICAgIGlmKGJNYXN0Q2lkID4gMCAmJiBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiTWFzdENpZC0xXS5pQ2lkID4gMA0KLSAgICAgICAgJiYgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYk1hc3RDaWQtMV0uaXNVc2VkKQ0KLSAgICB7DQotICAgICAgICAqcGJFeHRDaWQgPSBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiTWFzdENpZC0xXS5leHRBY3RDaWQ7DQotICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9Jc09jY3VweWVkQ2lkDQotuq/K/bmmxNw6xdC2z7TLQ0lEyse38dLRvq2xu7HwtcTW90NJRNW808MNCi2yzsr9y7XD9zoNCi0gICAgICAoSU4pICAgICAgICBwRXhpc3RlZEV4Q2lkINLRvq2xu8q508O1xLioQ0lEILXEyv3X6da41esNCi0gICAgICAgICAgICAgICAgICAgICAgYkNpZCCxu7HIvc+1xENJRA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgQk9PTCB6QXRpX0lzTm9PY2N1cHllZENpZChQQllURSBwRXhpc3RlZEV4Q2lkLCBCWVRFIGJDaWQpDQotew0KLSAgICBCWVRFIGkgPSAwOw0KLQ0KLSAgICBmb3IoaSA9IDA7IGkgPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBpKyspDQotICAgIHsNCi0gICAgICAgIGlmKGJDaWQgPT0gcEV4aXN0ZWRFeENpZFtpXSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfR2V0RHVhbFN0YWNrRXhDaWQNCi26r8r9uabE3DrRsNXSv8nKudPDtcS4qENJRA0KLbvxyKG55tTyOiDPyNGw1dLOtMq508PH0s60tqjS5bXEQ0lEIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICDG5LTO0bDV0tLRvq22qNLlwODQzcalxeS1q8rHzrTKudPDtcRDSUQNCi2yzsr9y7XD9zoNCi0gICAgICAoSU4pICAgICAgICAgICAgIGJQZHBUeXBlICAgICAgIMv50Oi4qENJRLXEwODQzQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFeGlzdGVkRXhDaWQgINLRvq2xu9W808O1xL/Vz9BDSUTK/dfp1rjV6w0KLSAgICAgKE9VVCkgICAgICAgICAgcEV4Q2lkICAgICAgICAgICAgILioQ0lE1rjV6w0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBCT09MIHpBdGlfR2V0RHVhbFN0YWNrRXhDaWQoUEJZVEUgcEV4aXN0ZWRFeENpZCxQQllURSBwRXhDaWQpDQotew0KLSAgICBCWVRFIGJDaWQgPSAwOw0KLSAgICBCWVRFIGJGc3RDaWQgPSBaX0RFVl9BdE1lbV9NSU5JTlVNX0NJRDsNCi0gICAgQllURSBiTHN0Q2lkID0gWkFUSTJfU01fTUFYX1NNQ0lEX05VTTsNCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICAgICAqcHRQZHBBZGRyID0gKFRfek1taWFTbV9QZHBBZGRyKil6QXRpX0dldFVCKHNpemVvZihUX3pNbWlhU21fUGRwQWRkcikpOyAgDQotICAgIFRfek1taWFTbV9QY29JbmZvICAgICAgKnB0UGNvSW5mbyA9IChUX3pNbWlhU21fUGNvSW5mbyopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1Bjb0luZm8pKTsNCi0gICAgVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSAqcHRTbURhdGEgPSAoVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSopekF0aV9HZXRVQihzaXplb2YoVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSkpOw0KLQ0KLSNpZmRlZiBEVUFMX0NBUkRfRFVBTF9TVEFOREJZDQotICAgIGlmKGdfekF0aV9DdXJJbnN0YW5jZSA9PSBaX0FUSV9JTlNOT18xKQ0KLSAgICB7DQotICAgICAgICBiTHN0Q2lkID0gNDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGJGc3RDaWQgPSA1Ow0KLSAgICB9DQotI2VuZGlmDQotDQotICAgIC8q0bDV0s60yrnTw8fSzrS2qNLltcRDSUQqLw0KLSAgICBmb3IoYkNpZCA9IGJGc3RDaWQ7IGJDaWQgPD0gYkxzdENpZDsgYkNpZCsrKQ0KLSAgICB7DQotICAgICAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9TbUNpZERhdGEsIGJDaWQsIChQQllURSlwdFNtRGF0YSwgZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgIGlmKCF6QXRpX0lzQ2lkVXNlZChiQ2lkKSAmJiAhekF0aV9HZXRQZHBJbmZvQnlDaWQoYkNpZCwgcHRQZHBBZGRyLCBwdFBjb0luZm8sIGdfekF0aV9DdXJJbnN0YW5jZSkNCi0gICAgICAgICYmWl9BVElfUERQX05vdERlZmluZSA9PSBwdFNtRGF0YS0+YlBkcEluZm9GZyAmJiB6QXRpX0lzTm9PY2N1cHllZENpZChwRXhpc3RlZEV4Q2lkLGJDaWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICpwRXhDaWQgPSBiQ2lkOw0KLSAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQZHBBZGRyKTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGNvSW5mbyk7DQotICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFNtRGF0YSk7DQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFBkcEFkZHIpOw0KLSAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGNvSW5mbyk7DQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLQ0KLVZPSUQgekF0aV9HZXRDaGFsbGVuZ2VBbmRIYXNoKFRfekRldl9BdE1lbV9TbUNpZERhdGEqIHB0U21EYXRhLCBCWVRFIGJDaWQpDQotew0KLSAgICBCWVRFIGkgPSAwOw0KLSAgICBCWVRFIGFiQ2hhbGxlbmdlMVtaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTi8yKzFdID0gezB9Ow0KLSAgICBCWVRFIGFiQ2hhbGxlbmdlMltaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTi8yKzFdID0gezB9Ow0KLQ0KLSAgICBpZihaX1ZBTElEID09IHB0U21EYXRhLT5iUGNvQXV0aEZnKQ0KLSAgICB7DQotICAgICAgICBEV09SRCBkd1JhbmQgPSAoRFdPUkQpcmFuZCgpOy8vyKHL5rv6yv0NCi0gICAgICAgIEJZVEUgIGJSYW5kICA9IDA7DQotICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspLy/XqrPJ19a3+7SuDQotICAgICAgICB7DQotICAgICAgICAgICAgYlJhbmQgPSAoQllURSkoZHdSYW5kPj4oOCppKSk7DQotICAgICAgICAgICAgaXRvYShiUmFuZCwgKGNoYXIqKSZhYkNoYWxsZW5nZTFbaSoyXSwgMTYpOw0KLSAgICAgICAgICAgIGl0b2EoYlJhbmQsIChjaGFyKikmYWJDaGFsbGVuZ2UyW2kqMl0sIDE2KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHpPc3NfTWVtY3B5KHB0U21EYXRhLT50UGNvQXV0aC50UGFwQ2hhcEluZm8uYWJDaGFsbGVuZ2UsIGFiQ2hhbGxlbmdlMSwgWl9ERVZfQXRNZW1fTUFYX0NIQUxMRU5HRV9MRU4vMik7DQotICAgICAgICB6T3NzX01lbWNweSgmcHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5hYkNoYWxsZW5nZVs4XSwgYWJDaGFsbGVuZ2UyLCBaX0RFVl9BdE1lbV9NQVhfQ0hBTExFTkdFX0xFTi8yKTsNCi0NCi0gICAgICAgIHpBdGlfR2V0TWQ1SGFzaCgwLCAoQ0hBUiopcHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5hYlBhc3NXb3JkLCBwdFNtRGF0YS0+dFBjb0F1dGgudFBhcENoYXBJbmZvLmJQYXNzV29yZExlbiwgDQotICAgICAgICAgICAgKENIQVIqKXB0U21EYXRhLT50UGNvQXV0aC50UGFwQ2hhcEluZm8uYWJDaGFsbGVuZ2UsIFpfREVWX0F0TWVtX01BWF9DSEFMTEVOR0VfTEVOLCAoQ0hBUiopcHRTbURhdGEtPnRQY29BdXRoLnRQYXBDaGFwSW5mby5hYkhhc2hSc3ApOy8vu/HIoUhBU0gNCi0gICAgICAgIHpEZXZfQXRNZW1Xcml0ZUl0ZW0oWl9BdE1lbV9JRF9TbUNpZERhdGEsIGJDaWQsKFBCWVRFKXB0U21EYXRhLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9HZXRaZ3Bjb0NoYXBJbmZvICAgICAgIDYxNzAwMjE5MDU2NA0KLbqvyv25psTcOrj5vt1aR1BDT0NIQVDJ6NbDtcTWtbm51OxDSEFQwODQzbXEUENPwuvB9w0KLbG416I6Y2hhcMLrwfe1xMTayN3OqsG9zPWjrMzu0LS1xMTayN2yu9K70fkNCi1jaGFwMTogIM23sr8oNEJZVEUpK8vmu/rK/SsgTVQgTkFNRSAgICAgY2hhcDI6ICDNt7K/KDRCWVRFKStoYXNoICsgdXNlcm5hbWUNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX0dldFpncGNvQ2hhcEluZm8oQllURSBiTnVtLEJZVEUgYkNpZCxUX3pNbWlhU21fR2V0UGNvX1JzcCAqcFNtR2V0UGNvUnNwKQ0KLXsNCi0gICAgQllURSBiSW5kZXggICA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmJQcm90TnVtOw0KLSAgICBCWVRFIGJVck5tTGVuID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udFBjb0NoYXBBdXRoW2JDaWQtMV0uYlVzZXJOYW1lTGVuOyAgICANCi0gICAgQllURSBiQ2hhbGxlbmdlTGVuID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udFBjb0NoYXBBdXRoW2JDaWQtMV0uYkNoYWxsZW5nZUxlbjsNCi0gICAgQllURSBiSGFzaFJzcExlbiAgID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udFBjb0NoYXBBdXRoW2JDaWQtMV0uYkhhc2hSc3BMZW47DQotICAgIEJZVEUgYWJVc2VyTmFtZVtaX0RFVl9BdE1lbV9NQVhfU1RSX0xFTisxXSA9IHswfTsvKtPDu6fD+yovDQotICAgIEJZVEUgYWJIYXNoUnNwW1pfREVWX0F0TWVtX01BWF9IQVNIX0xFTl0gPSB7MH07LypIQVNIKi8NCi0gICAgQllURSBhYkNoYWxsZW5nZVtaX0FUSV9aR1BDT0NIQVBfQ0hBTExFTkdFX01BWExFTl0gPSB7MH07LyrL5rv6yv0qLw0KLSAgICANCi0gICAgek9zc19NZW1jcHkoYWJVc2VyTmFtZSxnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50UGNvQ2hhcEF1dGhbYkNpZC0xXS5hYlVzZXJOYW1lLGJVck5tTGVuKzEpOw0KLSAgICB6T3NzX01lbWNweShhYkNoYWxsZW5nZSxnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50UGNvQ2hhcEF1dGhbYkNpZC0xXS5hYkNoYWxsZW5nZSxaX0FUSV9aR1BDT0NIQVBfQ0hBTExFTkdFX01BWExFTik7DQotICAgIHpPc3NfTWVtY3B5KGFiSGFzaFJzcCxnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50UGNvQ2hhcEF1dGhbYkNpZC0xXS5hYkhhc2hSc3AsWl9ERVZfQXRNZW1fTUFYX0hBU0hfTEVOKTsNCi0NCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YlByb3ROdW0rKzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLndJZCA9IDB4QzIyMzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLmJMZW4gPSAgKEJZVEUpKGJDaGFsbGVuZ2VMZW4rYlVyTm1MZW4rWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMSk7LyrL5rv6yv2zpCtNVCBOQU1FK8vmu/rK/bOktsjX1r3aKi8NCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLmFiQnVmWzBdID0gMHgwMTsvL0F1dGhlbnRpY2F0ZS1SZXF1ZXN0DQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1ZlsxXSA9IDB4MDA7Ly9JZGVudGlmaWVyDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1ZlszXSA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5iTGVuOy8vTGVuZ3RoDQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1Zls0XSA9IGJDaGFsbGVuZ2VMZW47Ly/L5rv6yv2zpLbIDQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1ZisNCi0gICAgWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMSxhYkNoYWxsZW5nZSxiQ2hhbGxlbmdlTGVuKTsNCi0gICAgek9zc19NZW1jcHkocFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLmFiQnVmK1pfQVRJX1BBUENIQVBETlNJUF9WQUxfTEVOKzErYkNoYWxsZW5nZUxlbiwNCi0gICAgICAgIGFiVXNlck5hbWUsYlVyTm1MZW4pOw0KLQ0KLSAgICBiSW5kZXgrKzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YlByb3ROdW0rKzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLndJZCA9IDB4QzIyMzsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLmJMZW4gPSAgKEJZVEUpKGJIYXNoUnNwTGVuICsgWl9BVElfUEFQQ0hBUEROU0lQX1ZBTF9MRU4rMStiVXJObUxlbik7DQotICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1ZlswXSA9IDB4MDI7Ly9BdXRoZW50aWNhdGUtUmVxdWVzdA0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0W2JJbmRleF0uYWJCdWZbMV0gPSAweDAwOy8vSWRlbnRpZmllcg0KLSAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0W2JJbmRleF0uYWJCdWZbM10gPSBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0W2JJbmRleF0uYkxlbjsNCi0gICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tiTnVtXS5wdFBjby0+YXRQcm90TGlzdFtiSW5kZXhdLmFiQnVmWzRdID0gYkhhc2hSc3BMZW47LypIQVNIIExFTiovDQotICAgIHpPc3NfTWVtY3B5KHBTbUdldFBjb1JzcC0+YXRDaWRQY29bYk51bV0ucHRQY28tPmF0UHJvdExpc3RbYkluZGV4XS5hYkJ1ZisNCi0gICAgICAgIFpfQVRJX1BBUENIQVBETlNJUF9WQUxfTEVOKzEsYWJIYXNoUnNwLGJIYXNoUnNwTGVuKTsvKkhBU0gqLw0KLSAgICB6T3NzX01lbWNweShwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2JOdW1dLnB0UGNvLT5hdFByb3RMaXN0W2JJbmRleF0uYWJCdWYrDQotICAgICAgICBaX0FUSV9QQVBDSEFQRE5TSVBfVkFMX0xFTisxK2JIYXNoUnNwTGVuLGFiVXNlck5hbWUsYlVyTm1MZW4pOw0KLSAgICByZXR1cm47DQotfQ0KLVdPUkQgX19wc180Z19mdW5jIHpBdGlfR2V0UGNvSWRCeU52UGNvQml0KEJZVEUgYk52UGNvQml0KQ0KLXsNCi0gICAgYk52UGNvQml0Kys7DQotICAgIHN3aXRjaCAoYk52UGNvQml0KQ0KLSAgICB7DQotICAgIGNhc2UgMToNCi0gICAgICAgIHJldHVybiBaX0FUSV9BRERQQVJBX0lEX1BDU0NGX0lQVjZBRERSOw0KLSAgICBjYXNlIDI6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9JTVNfU0lHTkFMX0ZMRzsNCi0gICAgY2FzZSAzOg0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfRE5TX1NSVl9JUFY2QUREUjsNCi0gICAgY2FzZSA0Og0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfUkVTRVJWRUQ0Ow0KLSAgICBjYXNlIDU6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9TVVBQT1JUX0JDX0lORElDQVRPUjsNCi0gICAgY2FzZSA2Og0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfUkVTRVJWRUQ2Ow0KLSAgICBjYXNlIDc6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9EU01JUFY2X0hBX0FERFI7DQotICAgIGNhc2UgODoNCi0gICAgICAgIHJldHVybiBaX0FUSV9BRERQQVJBX0lEX0RTTUlQVjZfSE5fUFJFRjsNCi0gICAgY2FzZSA5Og0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfRFNNSVBWNlY0X0hBX0FERFI7DQotICAgIGNhc2UgMTA6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9JUEFERFJfVklBX05BU19TSUdOQUw7DQotICAgIGNhc2UgMTE6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9JUFY0QUREUl9WSUFfREhDUFY0Ow0KLSAgICBjYXNlIDEyOg0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfUENTQ0ZfSVBWNF9BRERSOw0KLSAgICBjYXNlIDEzOg0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfRE5TX1NSVl9JUFY0X0FERFI7DQotICAgIGNhc2UgMTQ6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9NU0lTRE47DQotICAgIGNhc2UgMTU6DQotICAgICAgICByZXR1cm4gWl9BVElfQUREUEFSQV9JRF9JRk9NOw0KLSAgICBjYXNlIDE2Og0KLSAgICAgICAgcmV0dXJuIFpfQVRJX0FERFBBUkFfSURfSVBWNE1UVTsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIA0KLSAgICByZXR1cm4gKFdPUkQpYk52UGNvQml0Ow0KLX0NCi0NCi1CWVRFIF9fcHNfNGdfZnVuYyB6QXRpX0dldE52UGNvQml0QnlQY29JZChXT1JEIHdJZCkNCi17DQotICAgIHN3aXRjaCAod0lkKQ0KLSAgICB7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9QQ1NDRl9JUFY2QUREUjoNCi0gICAgICAgIHJldHVybiAxOw0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfSU1TX1NJR05BTF9GTEc6DQotICAgICAgICByZXR1cm4gMjsNCi0gICAgY2FzZSBaX0FUSV9BRERQQVJBX0lEX0ROU19TUlZfSVBWNkFERFI6DQotICAgICAgICByZXR1cm4gMzsNCi0gICAgY2FzZSBaX0FUSV9BRERQQVJBX0lEX1JFU0VSVkVENDoNCi0gICAgICAgIHJldHVybiA0Ow0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfU1VQUE9SVF9CQ19JTkRJQ0FUT1I6DQotICAgICAgICByZXR1cm4gNTsNCi0gICAgY2FzZSBaX0FUSV9BRERQQVJBX0lEX1JFU0VSVkVENjoNCi0gICAgICAgIHJldHVybiA2Ow0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfRFNNSVBWNl9IQV9BRERSOg0KLSAgICAgICAgcmV0dXJuIDc7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9EU01JUFY2X0hOX1BSRUY6DQotICAgICAgICByZXR1cm4gODsNCi0gICAgY2FzZSBaX0FUSV9BRERQQVJBX0lEX0RTTUlQVjZWNF9IQV9BRERSOg0KLSAgICAgICAgcmV0dXJuIDk7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9JUEFERFJfVklBX05BU19TSUdOQUw6DQotICAgICAgICByZXR1cm4gMTA7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9JUFY0QUREUl9WSUFfREhDUFY0Og0KLSAgICAgICAgcmV0dXJuIDExOw0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfUENTQ0ZfSVBWNF9BRERSOg0KLSAgICAgICAgcmV0dXJuIDEyOw0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfRE5TX1NSVl9JUFY0X0FERFI6DQotICAgICAgICByZXR1cm4gMTM7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9NU0lTRE46DQotICAgICAgICByZXR1cm4gMTQ7DQotICAgIGNhc2UgWl9BVElfQUREUEFSQV9JRF9JRk9NOg0KLSAgICAgICAgcmV0dXJuIDE1Ow0KLSAgICBjYXNlIFpfQVRJX0FERFBBUkFfSURfSVBWNE1UVToNCi0gICAgICAgIHJldHVybiAxNjsNCi0gICAgZGVmYXVsdDoNCi0gICAgICAgIGJyZWFrOw0KLSAgICB9DQotICAgIA0KLSAgICByZXR1cm4gKEJZVEUpd0lkOw0KLX0NCi1CT09MIF9fcHNfNGdfZnVuYyB6QXRpX1Bjb0l0ZW1Jc1ZhbGlkQnlQY29JZChXT1JEIHdJZCkNCi17DQotICAgIEJZVEUgYlBjb0JpdEluZGV4ID0gMDsNCi0gICAgRFdPUkQgZHdQY29JbmZvID0gek9zc19HZXRQY29JdGVtSW5mbygpOw0KLQ0KLSAgICBpZiAod0lkID09IDApDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRQYXJhLCAgVFJBQ0VfRVJSX0xFVkVMX1NFVkVSRSwiIik7Ly9wY28gaWQgZXJyb3INCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIGJQY29CaXRJbmRleCA9IHpBdGlfR2V0TnZQY29CaXRCeVBjb0lkKHdJZCk7DQotICAgIHJldHVybiAoQk9PTCkoKGR3UGNvSW5mbyA+PiAoYlBjb0JpdEluZGV4IC0gMSkpICYgMHgwMDAwMDAwMSk7DQotfQ0KLQ0KLUJPT0wgekF0aV9Jc0V4aXN0QWRkUGFyYShXT1JEIHdJZCwgQllURSBpQ2lkTnVtLCBUX3pNbWlhU21fR2V0UGNvX1JzcCAqcFNtR2V0UGNvUnNwKQ0KLXsNCi0gICAgQllURSBiSW5kZXggPSAwOw0KLQ0KLSAgICBmb3IgKGJJbmRleD0wOyBiSW5kZXggPCBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5iQWRkUGFyYU51bTsgYkluZGV4KyspDQotICAgIHsNCi0gICAgICAgIGlmIChwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvLT5hdEFkZFBhcmFMaXN0W2JJbmRleF0ud0lkID09IHdJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0dldE5WUGNvSXRlbUluZm8oQllURSBpQ2lkTnVtLCBUX3pNbWlhU21fR2V0UGNvX1JzcCogcFNtR2V0UGNvUnNwKQ0KLXsNCi0gICAgQllURSBiSW5kZXggPSAwOw0KLSAgICBCWVRFIGJQY29CaXRJbmRleCA9IDA7DQotICAgIFdPUkQgd1Bjb0lkID0gMDsNCi0gICAgRFdPUkQgZHdQY29JbmZvID0gek9zc19HZXRQY29JdGVtSW5mbygpOw0KLQ0KLSAgICAvKsS/x7BOVtbQ1+624LTmMzK49iovDQotICAgIGZvciAoYlBjb0JpdEluZGV4PTA7IGJQY29CaXRJbmRleCA8IDMyOyBiUGNvQml0SW5kZXgrKykNCi0gICAgew0KLSAgICAgICAgaWYgKHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmJBZGRQYXJhTnVtID49IFpfTU1JQVNNX1BDT19QQVJBX0lURU1fTUFYX05VTSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICgoZHdQY29JbmZvID4+IGJQY29CaXRJbmRleCkgJiAweDAwMDAwMDAxKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHdQY29JZCA9IHpBdGlfR2V0UGNvSWRCeU52UGNvQml0KGJQY29CaXRJbmRleCk7DQotICAgICAgICAgICAgLypQY29JZM6qMSwyLDMsQSxCLEMsRLXE0tG+rbj5vt21scewQ0lEtcTQxc+itKbA7bn9o6zV4sDv1rG908z4uf0qLw0KLSAgICAgICAgICAgIGlmICgod1Bjb0lkID09IDEpIHx8ICh3UGNvSWQgPT0gMikgfHwgKHdQY29JZCA9PSAzKSB8fCAod1Bjb0lkID09IDB4MDAwQSkgDQotICAgICAgICAgICAgICAgIHx8ICh3UGNvSWQgPT0gMHgwMDBCKSB8fCAod1Bjb0lkID09IDB4MDAwQykgfHwgKHdQY29JZCA9PSAweDAwMEQpIHx8ICh3UGNvSWQgPT0gMHgwMDBFKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvKtLRvq205tTayrGjrNaxvdPV0s/C0ru49iovDQotICAgICAgICAgICAgaWYgKHpBdGlfSXNFeGlzdEFkZFBhcmEod1Bjb0lkLCBpQ2lkTnVtLCBwU21HZXRQY29Sc3ApKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGJJbmRleCA9IHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmJBZGRQYXJhTnVtOw0KLSAgICAgICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0ucHRQY28tPmF0QWRkUGFyYUxpc3RbYkluZGV4XS53SWQgPSB3UGNvSWQ7DQotICAgICAgICAgICAgcFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjby0+YkFkZFBhcmFOdW0rKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZVNtR2V0UGNvSW5kKFZPSUQgKnBCdWZmKQ0KLXsNCi0gICAgVUlOVDggIGRlc3RUYXNrID0gMDsNCi0gICAgVUlOVDE2IGlMZW5QY3BPcHRpb25zID0gc2l6ZW9mKFRfWkF0aV9Qcm90b2NvbENmZ09wdCk7DQotICAgIFRfek1taWFTbV9HZXRQY29fUnNwICAgKnBTbUdldFBjb1JzcCAgID0gTlVMTDsNCi0gICAgVF96TW1pYVNtX0dldFBjb19JbmQgICAqcHRTbUdldFBjb0luZCAgID0gKFRfek1taWFTbV9HZXRQY29fSW5kKilwQnVmZjsvLyA9IChUX3pQU19BcE1taWFfU21HZXRQY29fSW5kICopcERhdGFQdHI7DQotICAgIFRfekRldl9BdE1lbV9TbUNpZERhdGEgKnB0U21EYXRhICAgPSAoVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSopekF0aV9HZXRVQihzaXplb2YoVF96RGV2X0F0TWVtX1NtQ2lkRGF0YSkpOw0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhICpwdFByZVNtRGF0YSA9IChUX3pEZXZfQXRNZW1fU21DaWREYXRhKil6QXRpX0dldFVCKHNpemVvZihUX3pEZXZfQXRNZW1fU21DaWREYXRhKSk7DQotICAgIFRfWkF0aV9Qcm90b2NvbENmZ09wdCAgaXBjcE9wdGlvbnMgICA9IHswfTsNCi0gICAgQllURSAgICBiQ2lkID0gMDsNCi0gICAgQllURSAgICBiSXNaZ3Bjb2F1dGhjaGFwID0gWl9JTlZBTElEOw0KLQ0KLSAgICBpZiAoIXpBdGlfR2V0RGVzdFRhc2tCeU1zZ0lEKE1NSUFfU01fR0VUX1BDT19SU1BfRVYsJmRlc3RUYXNrKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFNtRGF0YSk7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UHJlU21EYXRhKTsNCi0gICAgICAgIHJldHVybiA7DQotICAgIH0NCi0NCi0gICAgcFNtR2V0UGNvUnNwID0gKFRfek1taWFTbV9HZXRQY29fUnNwICopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX0dldFBjb19Sc3ApKTsNCi0gICAgekF0aV9HZXRJcGNwT3B0aW9uc0luZm8oJmlwY3BPcHRpb25zLCBpTGVuUGNwT3B0aW9ucyk7DQotDQotICAgIGlmKChwdFNtR2V0UGNvSW5kLT5iQ2lkTnVtID4gMCkgJiYgKHB0U21HZXRQY29JbmQtPmJDaWROdW0gPD0gWl9BUE1NSUFfU01fTUFYX0NJRF9OVU0pKQ0KLSAgICB7DQotICAgICAgICBVSU5UOCBpQ2lkTnVtID0gMDsNCi0NCi0gICAgICAgIHBTbUdldFBjb1JzcC0+YkNpZE51bSA9IHB0U21HZXRQY29JbmQtPmJDaWROdW07DQotDQotICAgICAgICBmb3IoaUNpZE51bSA9IDA7IGlDaWROdW0gPCBwdFNtR2V0UGNvSW5kLT5iQ2lkTnVtOyBpQ2lkTnVtKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgYkNpZCA9IHB0U21HZXRQY29JbmQtPmFiQ2lkW2lDaWROdW1dOw0KLSAgICAgICAgICAgIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0uYkNpZCA9IHB0U21HZXRQY29JbmQtPmFiQ2lkW2lDaWROdW1dOw0KLSAgICAgICAgICAgIHpEZXZfQXRNZW1SZWFkSXRlbShaX0F0TWVtX0lEX1NtQ2lkRGF0YSwgcHRTbUdldFBjb0luZC0+YWJDaWRbaUNpZE51bV0sKFBCWVRFKXB0U21EYXRhLCBnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICAgICAgICAgIGlmKFpfVkFMSUQgPT0gcHRTbURhdGEtPmJQY29BdXRoRmcpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB6QXRpX0dldENoYWxsZW5nZUFuZEhhc2gocHRTbURhdGEsIHBTbUdldFBjb1JzcC0+YXRDaWRQY29baUNpZE51bV0uYkNpZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKChiQ2lkICE9IDApICYmIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRQY29DaGFwQXV0aFtiQ2lkLTFdLmJJc1NldENoYXAgPT0gWl9WQUxJRCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGJJc1pncGNvYXV0aGNoYXAgPSBaX1ZBTElEOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwU21HZXRQY29Sc3AtPmF0Q2lkUGNvW2lDaWROdW1dLnB0UGNvID0gKFRfek1taWFTbV9QY29JbmZvICopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1Bjb0luZm8pKTsNCi0gICAgICAgICAgICBpZiAocFNtR2V0UGNvUnNwLT5hdENpZFBjb1tpQ2lkTnVtXS5wdFBjbyA9PSBaT1NTX05VTEwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9OdkZhaWx1cmUsICBUUkFDRV9FUlJfTEVWRUxfU0VWRVJFLCIiKTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChaX0FUSV9QRFBfRGVmaW5lID09IHB0U21EYXRhLT5iUGRwSW5mb0ZnICYmIHB0U21EYXRhLT5iQ29udEZsYWcgPT0gWl9BVElfQ09OVFhUX0ZpcnN0KSANCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfR2V0SXBjcFBjb0luZm8ocHRTbURhdGEsIGlDaWROdW0sICZpcGNwT3B0aW9ucywgaUxlblBjcE9wdGlvbnMscFNtR2V0UGNvUnNwKTsNCi0gICAgICAgICAgICAgICAgaWYgKGJJc1pncGNvYXV0aGNoYXAgPT0gWl9JTlZBTElEKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB6QXRpX0dldFBhcENoYXBQY29JbmZvKHB0U21EYXRhLCBpQ2lkTnVtLCBwU21HZXRQY29Sc3ApOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9HZXRaZ3Bjb0NoYXBJbmZvKGlDaWROdW0sIGJDaWQsIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgekF0aV9HZXRQY3NjZlBjb0luZm8ocHRTbURhdGEsIGlDaWROdW0sIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIHpBdGlfR2V0SW1jblBjb0luZm8ocHRTbURhdGEsIGlDaWROdW0sIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIHpBdGlfR2V0SVB2NEFkZHJBbGxvY1Bjb0luZm8ocHRTbURhdGEsIGlDaWROdW0sIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIHpBdGlfR2V0SXB2NGluZm8ocHRTbURhdGEsIGlDaWROdW0sIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIHpBdGlfR2V0TXNpc2RuSW5mbyhpQ2lkTnVtLCBwU21HZXRQY29Sc3ApOw0KLSAgICAgICAgICAgICAgICB6QXRpX0dldE5WUGNvSXRlbUluZm8oaUNpZE51bSwgcFNtR2V0UGNvUnNwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYocHRTbURhdGEtPmJDb250RmxhZyA9PSBaX0FUSV9DT05UWFRfU2VjbmQgKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekRldl9BdE1lbVJlYWRJdGVtKFpfQXRNZW1fSURfU21DaWREYXRhLCBwdFNtRGF0YS0+YlByZUNpZCwoUEJZVEUpcHRQcmVTbURhdGEsIGdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgICAgICAgICAgICAgIGlmKFpfQVRJX1BEUF9EZWZpbmUgPT0gcHRQcmVTbURhdGEtPmJQZHBJbmZvRmcpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHpBdGlfR2V0SW1jblBjb0luZm8ocHRTbURhdGEsIGlDaWROdW0sIHBTbUdldFBjb1JzcCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwU21HZXRQY29Sc3AtPmJDaWROdW0gPSAwOw0KLSAgICB9DQotDQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UHJlU21EYXRhKTsNCi0gICAgekF0aV9Nc2dTZW5kKE1NSUFfU01fR0VUX1BDT19SU1BfRVYsKFBCWVRFKXBTbUdldFBjb1JzcCwgc2l6ZW9mKFRfek1taWFTbV9HZXRQY29fUnNwKSxkZXN0VGFzayk7DQotICAgIHJldHVybjsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9DaGVja0R1YWxTdGFja1BhcmENCi26r8r9uabE3Dq87LLpyse38cL61+PLq9W7yN207bXEzPW8/g0KLbzssum55tTyOjEpzfiy4Le1u9g1MrrF1K3S8sfStqjS5c6qy6vVu8Dg0M23tbvYtaXVu8Dg0M0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAyKbzmyN1SOCC1xMfpv/YNCi0qRUMgNjE2MDAwNTMxMzI1IE5TLUlPVLLiytQ3LjIuNS4y08PA/aOsQ0lEyejWw86qSVBWNFY2o6zSx7Htvfa31sXkSVBWNLXY1rejrMO709DQr7T41K3S8qOsDQotKlVFtKW3osHLy6vVu8jdtO3B97PMo6y1vNbC08PA/cqnsNyhow0KLSpTTbXE09DQrdLp0sC+3aOsRVNNtcTQrdLpysdSOL+qyry1xKOsw7vT0GNhdXNlIDC1xMu1w/ejrA0KLSrS8rTLxdC2z7WxY2F1c2U9MMfSt8dMVEXU2df2y6vVu8jdtO0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBCT09MIF9fcHNfNGdfZnVuYyB6QXRpX0NoZWNrRHVhbFN0YWNrUGFyYShUX3pNbWlhU21fUGRwQWN0UmVzICpwU21BY3RSZXMsUEJZVEUgcEF0TWVtQnVmKQ0KLXsNCi0gICAgQllURSBiRXhDaWQgPSAwOw0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhKiBwU21EYXRhID0gKFRfekRldl9BdE1lbV9TbUNpZERhdGEgKilwQXRNZW1CdWY7DQotICAgIEJZVEUgYkR1YWxTdGFja0NhdXNlRmxhZyA9IFpfSU5WQUxJRDsNCi0gICAgQllURSBiQ3VyQWN0ID0gekF0aV9HZXRDdXJBY3RfQnlJbmRleChnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLQ0KLSAgICBpZiAocFNtQWN0UmVzLT5iQ2F1c2UgPT0gWl9NTUlBU01fUERQX0FDVF9DQVVTRV9TSU5HTEVfQUREUl9PTkxZX0FMTE9XRUQpDQotICAgIHsNCi0gICAgICAgIGJEdWFsU3RhY2tDYXVzZUZsYWcgPSBaX1ZBTElEOw0KLSAgICB9DQotICAgIGVsc2UgaWYgKHBTbUFjdFJlcy0+YkNhdXNlID09IDApDQotICAgIHsNCi0gICAgICAgIGlmIChaX0xURV9BQ1QgPT0gYkN1ckFjdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiRHVhbFN0YWNrQ2F1c2VGbGFnID0gWl9JTlZBTElEOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJEdWFsU3RhY2tDYXVzZUZsYWcgPSBaX1ZBTElEOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmKChaX1ZBTElEID09IGJEdWFsU3RhY2tDYXVzZUZsYWcpJiYocFNtQWN0UmVzLT5iSGFuZGxlUmVzdWx0ID09IFpfU1VDQykNCi0gICAgICAgICYmKFpfTU1JQVNNX0lQVjQgPT0gcFNtQWN0UmVzLT50UGRwQWRkci5iUGRwVHlwZSB8fFpfTU1JQVNNX0lQVjYgPT0gcFNtQWN0UmVzLT50UGRwQWRkci5iUGRwVHlwZSkNCi0gICAgICAgICYmKFpfQVRJX1BEUF9EZWZpbmUgPT0gcFNtRGF0YS0+YlBkcEluZm9GZyAmJnBTbURhdGEtPnRQZHBDb250ZXh0LmJQZHBUeXBlID09IFpfTU1JQVNNX0lQVjRWNg0KLSAgICAgICAgJiZwU21EYXRhLT5iQ29udEZsYWcgPT0gWl9BVElfQ09OVFhUX0ZpcnN0KSYmICghekF0aV9Jc01hc3RDaWQocFNtQWN0UmVzLT5iQ2lkLCZiRXhDaWQpfHwNCi0gICAgICAgICh6QXRpX0lzTWFzdENpZChwU21BY3RSZXMtPmJDaWQsJmJFeENpZCkgJiYgYkV4Q2lkID09IDApKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFRSVUU7DQotICAgIH0NCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi1zdGF0aWMgQk9PTCBfX3BzXzRnX2Z1bmMgekF0aV9IYW5kbGVTbUFjdENuZkV4dChWT0lEICpwRGF0YVB0cikNCi17DQotICAgIEJZVEUgaSA9IDA7DQotICAgIEJZVEUgYk51bSA9IDA7DQotICAgIEJZVEUgYWJFeFBkcFR5cGVbWl9NTUlBU01fTUFYX0NJRF9OVU1dID0gezB9Ow0KLSAgICBCWVRFIGFiRXhDaWRbWl9NTUlBU01fTUFYX0NJRF9OVU1dID0gezB9Ow0KLSAgICBUX3pEZXZfQXRNZW1fU21DaWREYXRhICpwdFNtRGF0YSA9IChUX3pEZXZfQXRNZW1fU21DaWREYXRhKil6QXRpX0dldFVCKHNpemVvZihUX3pEZXZfQXRNZW1fU21DaWREYXRhKSk7DQotICAgIFRfekFwTW1pYV9TbUFjdERlYWN0X1JlcSB0QWN0ID0gezB9Ow0KLSAgICBUX3pNbWlhU21fUGRwQWN0X0NuZiAqIHBTbUFjdERlYWNDbmYgPSAoVF96TW1pYVNtX1BkcEFjdF9DbmYgKilwRGF0YVB0cjsNCi0gICAgQllURSBiUGRwVHlwZSA9IDA7DQotICAgIEJZVEUgYk1hc3RDaWQgPSAwOw0KLSAgICBCWVRFIGJFeENpZCA9IDA7DQotDQotICAgIC8qsenA+tGw1dLQ6NKqy6vVu8jdtO21xENJRCovDQotICAgIGZvcihpID0gMDsgaTxwU21BY3REZWFjQ25mLT5iQ2lkTnVtOyBpKysgKQ0KLSAgICB7DQotICAgICAgICB6RGV2X0F0TWVtUmVhZEl0ZW0oWl9BdE1lbV9JRF9TbUNpZERhdGEsIHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJDaWQgLChQQllURSlwdFNtRGF0YSwgZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgIGlmKHpBdGlfQ2hlY2tEdWFsU3RhY2tQYXJhKCZwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXSwoUEJZVEUpcHRTbURhdGEpKQ0KLSAgICAgICAgeyAgLyq78cihuKhDSUQqLw0KLSAgICAgICAgICAgIGJQZHBUeXBlID0gKHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLnRQZHBBZGRyLmJQZHBUeXBlPT1aX01NSUFTTV9JUFY0KT8gWl9NTUlBU01fSVBWNiA6IFpfTU1JQVNNX0lQVjQ7DQotICAgICAgICAgICAgaWYoekF0aV9HZXREdWFsU3RhY2tFeENpZChhYkV4Q2lkLCAmdEFjdC5hYkNpZFtiTnVtXSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwdFNtRGF0YS0+dFBkcENvbnRleHQuYlBkcFR5cGUgPSBiUGRwVHlwZTsNCi0gICAgICAgICAgICAgICAgYWJFeENpZFtwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iQ2lkIC0gMV09dEFjdC5hYkNpZFtiTnVtXTsNCi0gICAgICAgICAgICAgICAgYWJFeFBkcFR5cGVbcFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCAtIDFdPXB0U21EYXRhLT50UGRwQ29udGV4dC5iUGRwVHlwZTsNCi0gICAgICAgICAgICAgICAgekRldl9BdE1lbVdyaXRlSXRlbShaX0F0TWVtX0lEX1NtQ2lkRGF0YSwgKEJZVEUpdEFjdC5hYkNpZFtiTnVtKytdLCAoUEJZVEUpcHRTbURhdGEsIGdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRTbURhdGEpOw0KLSAgICANCi0gICAgaWYoYk51bSA+IDApLy+3osbwuKhDSUS1xLyku+6yor2r1ve4qNDFz6K05sjryKu+1g0KLSAgICB7DQotICAgICAgICB0QWN0LmJTcmNJbmRleCA9IHBTbUFjdERlYWNDbmYtPmJEZXNJbmRleDsNCi0gICAgICAgIHRBY3QuYkRlc0luZGV4ID0gMHhGRjsNCi0gICAgICAgIHRBY3QuYkNpZE51bSA9IGJOdW07DQotICAgICAgICB0QWN0LmJUeXBlRmxnID0gWl9BUE1NSUFfVkFMSUQ7DQotICAgICAgICB0QWN0LmJUeXBlID0gWl9BUE1NSUFfU01fUERQX0FDVElWQVRFOw0KLSAgICAgICAgaWYoekF0aV9TbUNnYWN0UmVxKCZ0QWN0KSA9PSBaX0FQTU1JQV9OT1JFU1VMVCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0uYkR1YWxTdGFja0FjdFJlc3VsdCA9IHBTbUFjdERlYWNDbmYtPmJSZXN1bHQ7Ly/Oqrrz0Pi4qENJRLGjtOa94bn7wusNCi0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU21BY3REZWFjQ25mLT5iQ2lkTnVtOyBpKyspDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKtDo0qqxo7TmOjEsw7vT0LGjtOa5/aOsvLS8yLK7ysfW99KysrvKx7ioyrGxo7TmzqrW98fSw7vT0LbU06a1xLioo7sNCi0gICAgICAgICAgICAgICAgMqOsuMNDSUTWrsew0tG+rbGjtObOqtb3x9KxvrTO0OjSqsur1bu8pLvuuKhDSUSjrNKqsaO05rjD1vdDSUS6zbbU06a1xLioQ0lEKi8NCi0gICAgICAgICAgICAgICAgaWYocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCAhPSAwICYmIHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJIYW5kbGVSZXN1bHQgPT0gWl9TVUNDIA0KLSAgICAgICAgICAgICAgICAgICAgJiYgIXpBdGlfSXNFeENpZChwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iQ2lkLCAmYk1hc3RDaWQpICYmICghekF0aV9Jc01hc3RDaWQocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCwgJmJFeENpZCkNCi0gICAgICAgICAgICAgICAgICAgIHx8IChhYkV4Q2lkW3BTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJDaWQtMV0gIT0gMCkpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB6QXRpX1NhdmVPbmx5Q2lkVGFiKHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJDaWQsIGFiRXhDaWRbcFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZC0xXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBhYkV4UGRwVHlwZVtwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iQ2lkLTFdKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXN0YXRpYyBWT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZVpnYWN0Q25mKFRfek1taWFTbV9QZHBBY3RfQ25mICpwU21aZ2FjdENuZiwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsgICAgDQotICAgIGlmIChwU21aZ2FjdENuZi0+YlJlc3VsdCA9PSBaX1NVQ0MpDQotICAgIHsNCi0gICAgICAgIHpBdGlfSGFuZGxlWmdhY3RDbmZNc2cocFNtWmdhY3RDbmYsIHBDaG5lbE5vZGUpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9IYW5kbGVBVERJcFBwcEFjdENuZg0KLbqvyv25psTcOlBQULyku+678tXfsqa6xc/s06a1xLSmwO0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZUFURElwUHBwQWN0Q25mKFRfek1taWFTbV9QZHBBY3RfQ25mICogcEFjdENuZiwgQllURSAqcGJJc05lZWRDbmYpDQotew0KLSAgICBUX3pBcE1taWFfU21aZ2FjdF9SZXEgdFphY3QgPSB7MH07DQotICAgIC8vVF96QXRpX0NJREluZm8gICB0Q2lkaW5mbyA9IHswfTsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlID0gTlVMTDsNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocEFjdENuZi0+YkRlc0luZGV4KTsNCi0gICAgQllURSBiQ2lkSW5kZXggPSAwOw0KLSAgICBCWVRFIGJDaG5lbElkID0gMHhmZjsNCi0gICAgDQotICAgIGlmICgocEFjdENuZi0+YXRSZXN1bHRbMF0uYkNpZCA8IDEpIHx8IChwQWN0Q25mLT5hdFJlc3VsdFswXS5iQ2lkID4gWl9NTUlBU01fTUFYX0NJRF9OVU0pKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOy8vQ0lEIGlzIDANCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLQ0KLSAgICBiQ2lkSW5kZXggPSBwQWN0Q25mLT5hdFJlc3VsdFswXS5iQ2lkLTE7DQotICAgIGlmICgoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pQ2lkID09IHBBY3RDbmYtPmF0UmVzdWx0WzBdLmJDaWQpDQotICAgICAgICAmJmdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uaXNQcHAgPT0gVFJVRSANCi0gICAgICAgICYmIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uaXNQcHBBY3RDbXBsZXRlID09IEZBTFNFKQ0KLSAgICB7DQotICAgICAgICBiQ2huZWxJZCA9IGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZDsNCi0gICAgICAgIHBDaG5lbE5vZGUgPSB6QXRpX0dldENoYW5uZWxOb2RlUHRyKGJDaG5lbElkKTsNCi0gICAgICAgIGlmIChwQ2huZWxOb2RlID09IE5VTEwpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsvL2dldCBjaG5lbCBmYWlsDQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYocEFjdENuZi0+YlJlc3VsdCA9PSBaX1NVQ0MpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocEFjdENuZi0+YkF0VHlwZT09Wl9NTUlBU01fQVRDTURfQ0dBQ1QpICAgIC8qvKS77rPJuaa3osbwsqa6xSovDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0WmFjdC5iU3JjSW5kZXggPSBwQWN0Q25mLT5iRGVzSW5kZXg7DQotICAgICAgICAgICAgICAgIHRaYWN0LmJEc3RJbmRleCA9IHBBY3RDbmYtPmJTcmNJbmRleDsNCi0gICAgICAgICAgICAgICAgdFphY3QuYlN0YXRlID0gWl9BUE1NSUFfU01fUERQX0FDVElWQVRFOw0KLSAgICAgICAgICAgICAgICB0WmFjdC5iQ2lkID0gcEFjdENuZi0+YXRSZXN1bHRbMF0uYkNpZDsNCi0gICAgICAgICAgICAgICAgekF0aV9TZW5kU21aZ2FjdFJlcSgmdFphY3QpOw0KLSAgICAgICAgICAgICAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmlzVXNlZCA9IFRSVUU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYocEFjdENuZi0+YkF0VHlwZT09Wl9NTUlBU01fQVRDTURfWkdBQ1QpICAgIC8qsqa6xbPJuaa1xLSmwO0qLw0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYocENobmVsTm9kZS0+c2VydmVyX21vZGUgPT0gWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9IYW5kbGVDb25uSW5kKHBBY3RDbmYtPmJTcmNJbmRleCxiQ2huZWxJZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy96QXRpX1NlbGxTdGF0Rm9yUHBwQWN0KCZ0Q2lkaW5mbywgJnBBY3RDbmYtPmF0UmVzdWx0WzBdKTsvL8/6wb/Ns7zGDQotICAgICAgICAgICAgICAgIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uaXNQcHBBY3RDbXBsZXRlID0gVFJVRTsNCi0gICAgICAgICAgICAgICAgKnBiSXNOZWVkQ25mID0gWl9WQUxJRDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlLyq8pLvuu/LV37KmusXKp7DctcS0psDtKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9PSBaQVRJMl9DSEFOTkVMX01PREVfREFUQSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfSGFuZGxlTm9DYXJyaWVyQ25mKHBBY3RDbmYtPmJTcmNJbmRleCwgYkNobmVsSWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB6QXRpX0NsZWFyQ2lkSW5mb2J5Q2huZWwoYkNobmVsSWQpOw0KLSAgICAgICAgICAgICpwYklzTmVlZENuZiA9IFpfVkFMSUQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLURXT1JEIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZVNtQWN0Q25mKFZPSUQqIHBCdWZmLCBEV09SRCAqcGR3Q2hhbmdlZE1zZ0lkLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgVF96TW1pYVNtX1BkcEFjdF9DbmYgKnBTbUFjdERlYWNDbmYgPSAoVF96TW1pYVNtX1BkcEFjdF9DbmYgKilwQnVmZjsNCi0gICAgVUlOVDggaSA9IDA7DQotICAgIEJZVEUgYkNpZD0wOw0KLSAgICBVSU5UOCBhYkRlYWN0Q2lkW1pfTU1JQVNNX01BWF9DSURfTlVNXSA9IHswfTsNCi0gICAgQllURSBiSXNOZWVkQ25mID0gWl9JTlZBTElEOy8vyse38dDo0qrJz7GoveG5+w0KLQ0KLSAgICAvKlBQULKmusW0psDtKi8NCi0gICAgaWYocENobmVsTm9kZSAhPSBOVUxMICYmIHBDaG5lbE5vZGUtPklzUHBwKQ0KLSAgICB7DQotICAgICAgICB6QXRpX0hhbmRsZVBwcEFjdENuZihwU21BY3REZWFjQ25mLHBDaG5lbE5vZGUpOw0KLSAgICAgICAgaWYocFNtQWN0RGVhY0NuZi0+YlJlc3VsdCA9PSBaX0ZBSUwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYocENobmVsTm9kZS0+c2VydmVyX21vZGUgPT0gWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVY7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfSGFuZGxlTm9DYXJyaWVyQ25mKHBTbUFjdERlYWNDbmYtPmJTcmNJbmRleCwgcFNtQWN0RGVhY0NuZi0+YkRlc0luZGV4KTsNCi0gICAgICAgICAgICAgICAgLy8qcGR3Q2hhbmdlZE1zZ0lkID0gTU1JQV9TTV9OT19DQVJSSUVSX0NORl9FVjsgIC8vIL3hubnM5bK70rvWwqOssru5/bK70OjSqg0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi0gICAgfQ0KLSAgICANCi0gICAgLypaR0FDVCC1xM/s06bU2rTLtKbA7SovDQotICAgIGlmIChwQ2huZWxOb2RlICE9IE5VTEwgJiYgcENobmVsTm9kZS0+Y21kX2lkID09IFpBVDJfTFRFX1pHQUNUKQ0KLSAgICB7DQotICAgICAgICB6QXRpX0hhbmRsZVpnYWN0Q25mKHBTbUFjdERlYWNDbmYsIHBDaG5lbE5vZGUpOw0KLSAgICAgICAgKnBkd0NoYW5nZWRNc2dJZCA9IE1NSUFfU01fUERQX0FDVElWQVRFX0NORl9FVjsNCi0gICAgICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsgICAgDQotICAgIH0NCi0NCi0gICAgLypBVEQqOTi0pbeitcTA4NDNzqpJUFY0tcRQUFCyprrFLNTaytW1vUNHQUNUvKS77s/s06bKsbXEtKbA7SovDQotICAgIGlmICh6QXRpX0hhbmRsZUFURElwUHBwQWN0Q25mKHBTbUFjdERlYWNDbmYsICZiSXNOZWVkQ25mKSkNCi0gICAgew0KLSAgICAgICAgaWYgKGJJc05lZWRDbmYgPT0gWl9WQUxJRCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1VzYlNpb1NtWmdpcGRuc0luZChwU21BY3REZWFjQ25mLGFiRGVhY3RDaWQpOw0KLSAgICAgICAgICAgICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVY7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotICAgIH0NCi0NCi0gICAgLyrF0LbPyse38beixvDLq9W7vKS77iovDQotICAgIGlmKHpBdGlfSGFuZGxlU21BY3RDbmZFeHQocEJ1ZmYpKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotICAgIH0NCi0gICAvKsur1bu4qENJRLXEtKbA7SovDQotICAgIGlmKHpBdGlfSXNBbGxFeENpZChwU21BY3REZWFjQ25mKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9IYW5kbGVTbUFjdEZhaWxlZEV4Q2lkKHBTbUFjdERlYWNDbmYsIGFiRGVhY3RDaWQpOy8vtKbA7cqnsNzH6b/2DQotICAgICAgICB6QXRpX0hhbmRsZVNtQ2xlYW5FeENpZEluZm8ocFNtQWN0RGVhY0NuZik7Ly/H5bP9yqew3LXEuKhDSUTQxc+iIA0KLSAgICAgICAgekF0aV9Vc2JTaW9TbVpnaXBkbnNJbmQocFNtQWN0RGVhY0NuZixhYkRlYWN0Q2lkKTsNCi0gICAgICAgICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVY7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotICAgIH0NCi0NCi0gICAgLyq05rSit8fLq9W7tcRDSUTH0s6qQ0dBQ1S8pLvutcTKsbryKi8NCi0gICAgZm9yKGkgPSAwOyBpIDwgcFNtQWN0RGVhY0NuZi0+YkNpZE51bTsgaSsrKQ0KLSAgICB7DQotICAgICAgICBpZihwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iQ2lkICE9IDAgJiYgcFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkhhbmRsZVJlc3VsdCA9PSBaX1NVQ0MNCi0gICAgICAgICYmICF6QXRpX0lzRXhDaWQocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCwgJmJDaWQpJiYhekF0aV9Jc01hc3RDaWQocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCwgJmJDaWQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfU2F2ZU9ubHlDaWRUYWIocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCwwLDApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHpBdGlfVXNiU2lvU21aZ2lwZG5zSW5kKHBTbUFjdERlYWNDbmYsYWJEZWFjdENpZCk7IC8qILeiy81JUC9ETlO12Na3ICovDQotICAgICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX1BEUF9BQ1RJVkFURV9DTkZfRVY7DQotDQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotLyogLy8tLS0NCi1WT0lEIHpBdGlfSGFuZGxlU21DbG9zZUNoSW5kKFZPSUQgKnBCdWZmKQ0KLXsNCi0gICAgVF96TW1pYVNtX0Nsb3NlQ2hfSW5kICpwU21DbG9zZUNoSW5kID0gKFRfek1taWFTbV9DbG9zZUNoX0luZCAqKXBCdWZmOw0KLQ0KLSAgICBpZigocFNtQ2xvc2VDaEluZC0+YkNpZE51bSA+IDApICYmIChwU21DbG9zZUNoSW5kLT5iQ2lkTnVtIDw9IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKQ0KLSAgICB7DQotICAgICAgICBVSU5UOCBpU21DaWROdW0gPSAwOw0KLSAgICAgICAgDQotICAgICAgICBmb3IoaVNtQ2lkTnVtID0gMDsgaVNtQ2lkTnVtIDwgcFNtQ2xvc2VDaEluZC0+YkNpZE51bTsgaVNtQ2lkTnVtKyspDQotICAgICAgICB7ICAgICAgICAgICANCi0gICAgICAgICAgICBpZihwU21DbG9zZUNoSW5kLT5hYkNpZFtpU21DaWROdW1dID09IGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW3BTbUNsb3NlQ2hJbmQtPmFiQ2lkW2lTbUNpZE51bV0tMV0uaUNpZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoKFVJTlQ4KWdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW3BTbUNsb3NlQ2hJbmQtPmFiQ2lkW2lTbUNpZE51bV0tMV0uY2huZWxJZCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBpZihOVUxMID09IHBDaG5lbE5vZGUpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0NtZChwQ2huZWxOb2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gLy9mb3IoaVNtQ2lkTnVtID0gMDsgaVNtQ2lkTnVtIDwgU21DbG9zZUNoSW5kLmJDaWROdW07IGlTbUNpZE51bSsrKQ0KLSAgICB9DQotfQ0KLSovDQotVk9JRCB6QXRpX0hhbmRsZVptZW5hQ25mKFZPSUQgKnBEYXRhUHRyKQ0KLXsNCi0gICAgVF96TW1pYVNtc19NZW1BdmFpbF9DbmYgICpwdFNtc0NuZiA9IChUX3pNbWlhU21zX01lbUF2YWlsX0NuZiopcERhdGFQdHI7DQotICAgIFVJTlQ4IGRlc3RUYXNrID0gMDsNCi0NCi0gICAgaWYgKHpBdGlfR2V0RGVzdFRhc2tCeU1zZ0lEKEFQX01NSUFfU01fTUVNX0FWQUlMX1JTUF9FViwmZGVzdFRhc2spKQ0KLSAgICB7DQotICAgICAgICBUX3pBcE1taWFfTWVtQXZhaWxfUnNwICAgKnB0UGJSc3AgPSAoVF96QXBNbWlhX01lbUF2YWlsX1JzcCopekF0aV9HZXRVQihzaXplb2YoVF96QXBNbWlhX01lbUF2YWlsX1JzcCkpOyAgICANCi0gICAgICAgIHB0UGJSc3AtPmJTcmNJbmRleCA9IHB0U21zQ25mLT5iRGVzdEluZGV4OyAgLyogwLTX1FNNU8/7z6KjrNTZt6K4+FBCo6zSqrW51sMqLw0KLSAgICAgICAgcHRQYlJzcC0+YkRlc0luZGV4ID0gcHRTbXNDbmYtPmJTcmNJbmRleDsNCi0gICAgICAgIHB0UGJSc3AtPmJSZXN1bHQgPSAoWl9NTUlBU01TX1JFU1VMVF9PSyA9PSBwdFNtc0NuZi0+YlJlc3VsdCk/Wl9BUE1NSUFfT1BFUkFUSU9OX1NVQ0NFU1M6IFpfQVBNTUlBX09QRVJBVElPTl9GQUlMVVJFOw0KLSAgICAgICAgcHRQYlJzcC0+ZHdSZWFzb24gPSBwdFNtc0NuZi0+ZHdDYXVzZTsNCi0gICAgICAgIHpBdGlfTXNnU2VuZChBUF9NTUlBX1NNX01FTV9BVkFJTF9SU1BfRVYsIChQQllURSlwdFBiUnNwLCBzaXplb2YoVF96QXBNbWlhX01lbUF2YWlsX1JzcCksZGVzdFRhc2spOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfQ2xlYXJDaWRJbmZvYnlDaG5lbA0KLbqvyv25psTcOrj5vt3NqLXAx+Wz/cirvtax5MG/wO/D5rXEQ0lE0MXPog0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1WT0lEIHpBdGlfQ2xlYXJDaWRJbmZvYnlDaG5lbChVSU5UOCBDaG5lbElkKQ0KLXsNCi0gICAgQllURSBpPTA7DQotICAgIEJZVEUgYkluc3RhbmNlID0gekF0aV9HZXRUYXNrSW5zdGFudEJ5Q2hubElkKENobmVsSWQpOw0KLQ0KLSAgICBmb3IoaSA9IDA7IGk8Wl9NTUlBU01fTUFYX0NJRF9OVU07IGkrKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaV0uY2huZWxJZD09Q2huZWxJZCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6T3NzX01lbXNldCgmZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaV0sMCxzaXplb2YoVF9aQXRpX0xhc3RDaWRUYWIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfSGFuZGxlU21DbGVhbkV4Q2lkSW5mbw0KLbqvyv25psTcOsfls/3Iq77WseTBv8Dvw+a1xLioQ0lEvM3CvA0KLbqvyv2yzsr9Og0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIEJPT0wgekF0aV9IYW5kbGVTbUNsZWFuRXhDaWRJbmZvKFRfek1taWFTbV9QZHBBY3RfQ25mICogcFNtQWN0RGVhY0NuZikNCi17DQotICAgIEJZVEUgaSA9IDA7DQotICAgIEJZVEUgYk1hc3RDaWQgPSAwOw0KLQ0KLSAgICBmb3IoaT0wOyBpPHBTbUFjdERlYWNDbmYtPmJDaWROdW07IGkrKykNCi0gICAgew0KLSAgICAgICAgaWYoekF0aV9Jc0V4Q2lkKHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJDaWQsJmJNYXN0Q2lkKSAmJiBwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iSGFuZGxlUmVzdWx0ICE9IFpfU1VDQykNCi0gICAgICAgIHsgICAgICAgICAgIA0KLSAgICAgICAgICAgIGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JNYXN0Q2lkLTFdLmV4dEFjdENpZCA9IDA7DQotICAgICAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYk1hc3RDaWQtMV0uZXh0UGRwVHlwZSA9IDA7DQotICAgICAgICAgICAgekF0X1NtVW5kZWZpbmVQZHBDb250SW5BdE1lbShwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5iQ2lkKTsvL8ils/24qENJRLao0uUgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9IYW5kbGVTbURlQWN0QWJvcnRlZEV4DQotuq/K/bmmxNw6yOe5+7ioQ0lEsbtBQk9SVNTyt6LG8Nb3Q0lEtcTIpbvuo6wNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICDI57n7vfbKx7yku+7Kp7Dc1PKxo8H01vdDSUQNCi26r8r9ss7K/Tq4qENJRLG7QUJPUlTU8rGjwfTW90NJRC0tLTIzLTAzLTI5DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgQk9PTCB6QXRpX0hhbmRsZVNtQWN0RmFpbGVkRXhDaWQoVF96TW1pYVNtX1BkcEFjdF9DbmYgKiBwU21BY3REZWFjQ25mLCBVSU5UOCogcERlc3QpDQotew0KLSNpZiAwDQotICAgIEJZVEUgaSA9IDA7DQotICAgIEJZVEUgYkNpZCA9IDA7DQotICAgIFRfekFwTW1pYV9TbUFjdERlYWN0X1JlcSAgc21DZ2FjdFJlcSA9IHswfTsNCi0gICAgDQotICAgIGZvcihpID0gMDsgaTxwU21BY3REZWFjQ25mLT5iQ2lkTnVtOyBpKyspDQotICAgIHsNCi0gICAgICAgIGlmKHBTbUFjdERlYWNDbmYtPmF0UmVzdWx0W2ldLmJIYW5kbGVSZXN1bHQgIT0gWl9TVUNDJiYNCi0gICAgICAgICAgICBwU21BY3REZWFjQ25mLT5hdFJlc3VsdFtpXS5kd1JlYXNvbiA9PSBaX01NSUFTTV9QRFBfSEFORExFX0FCT1JUDQotICAgICAgICAgICAgJiZ6QXRpX0lzRXhDaWQocFNtQWN0RGVhY0NuZi0+YXRSZXN1bHRbaV0uYkNpZCwmYkNpZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgc21DZ2FjdFJlcS5hYkNpZFtzbUNnYWN0UmVxLmJDaWROdW0rK10gPSBiQ2lkOw0KLSAgICAgICAgICAgIHBEZXN0W2JDaWQgLSAxXSA9IGJDaWQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGlmKHNtQ2dhY3RSZXEuYkNpZE51bSA+IDApDQotICAgIHsNCi0gICAgICAgIHNtQ2dhY3RSZXEuYlNyY0luZGV4ID0gWkFUSTJfQ0hBTk5FTF9JRF9OVU1fRU5EICsgMTsNCi0gICAgICAgIHNtQ2dhY3RSZXEuYkRlc0luZGV4ID0gMHhGRjsNCi0gICAgICAgIHNtQ2dhY3RSZXEuYlR5cGUgPSBaX0FQTU1JQV9TTV9QRFBfSU5BQ1RJVkU7DQotICAgICAgICBzbUNnYWN0UmVxLmJUeXBlRmxnPVpfQVBNTUlBX1ZBTElEOw0KLSAgICAgICAgDQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0uYkR1YWxTdGFja0FjdFJlc3VsdCA9IFpfU1VDQzsvL8fls/0NCi0NCi0gICAgICAgIHJldHVybiB6QXRpX1NtQ2dhY3RSZXEoJnNtQ2dhY3RSZXEpID09IFpfQVBNTUlBX05PUkVTVUxUOw0KLSAgICB9DQotI2VuZGlmDQotICAgIC8vt8dBQk9SVMqxveG5+8LrtcTJz7Go0OjSqtPr1vdDSUS1xLGjs9bSu9bCDQotICAgIHBTbUFjdERlYWNDbmYtPmJSZXN1bHQgPSBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0uYkR1YWxTdGFja0FjdFJlc3VsdDsNCi0gICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmJEdWFsU3RhY2tBY3RSZXN1bHQgPSBaX1NVQ0M7Ly/H5bP9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0hhbmRsZVNtRGVBY3RDaWQNCi26r8r9uabE3Dq4+b7dQ0lEwLTIpbvuo6zTw9Pa1ve4qL750qrIpbvutcTH6b/2DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBCT09MIHpBdGlfSGFuZGxlU21EZUFjdENpZChVSU5UOCBiQ2lkKQ0KLXsNCi0gICAgVF96QXBNbWlhX1NtWmdhY3RfUmVxIHRBY3QgPSB7MH07DQotICAgIA0KLSAgICB0QWN0LmJTcmNJbmRleCA9IFpBVEkyX0NIQU5ORUxfSURfTlVNX0VORCArIDE7DQotICAgIHRBY3QuYkRzdEluZGV4ID0gMHhGRjsNCi0gICAgdEFjdC5iU3RhdGUgICAgPSBaX0FQTU1JQV9TTV9QRFBfREVBQ1RJVkFURTsNCi0gICAgdEFjdC5iQ2lkICAgICAgPSBiQ2lkOw0KLSAgICANCi0gICAgcmV0dXJuIHpBdGlfU2VuZFNtWmdhY3RSZXEoJnRBY3QpID09IFpfQVBNTUlBX05PUkVTVUxUOw0KLX0NCi0NCi1CT09MIHpBdGlfU2VuZERlQWN0UmVxKEJZVEUgYkNpZCwgQllURSBiU3JjSW5kZXgpDQotew0KLSAgICBUX3pBcE1taWFfU21BY3REZWFjdF9SZXEgIHRDZ2FjdFJlcSA9IHswfTsNCi0gICAgQllURSBiTWFzdENpZCA9IDA7DQotICAgIEJZVEUgYkJhY2t1cENpZCA9IGJDaWQ7DQotDQotICAgIGlmICgoYkNpZCA8IFpfREVWX0F0TWVtX01JTklOVU1fQ0lEKSB8fCAoYkNpZCA+IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOy8vY2lkIGVycm9yDQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgYk1hc3RDaWQgPSBiQ2lkOw0KLSAgICBpZiAoekF0aV9Jc0V4Q2lkKGJCYWNrdXBDaWQsICZiTWFzdENpZCkpDQotICAgIHsNCi0gICAgICAgIGlmICgoYk1hc3RDaWQgPCBaX0RFVl9BdE1lbV9NSU5JTlVNX0NJRCkgfHwgKGJNYXN0Q2lkID4gWkFUSTJfU01fTUFYX1NNQ0lEX05VTSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsvL2NpZCBlcnJvcg0KLSAgICAgICAgICAgIGJNYXN0Q2lkID0gYkNpZDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgaWYgKGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JNYXN0Q2lkIC0xXS5pQ2lkID09IGJNYXN0Q2lkDQotICAgICAgICAmJiBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiTWFzdENpZCAtMV0uaXNVc2VkKQ0KLSAgICB7DQotICAgICAgICB0Q2dhY3RSZXEuYkNpZE51bSA9IDE7DQotICAgICAgICB0Q2dhY3RSZXEuYWJDaWRbMF0gPSBiQ2lkOw0KLSAgICAgICAgdENnYWN0UmVxLmJTcmNJbmRleCA9IGJTcmNJbmRleDsNCi0gICAgICAgIHRDZ2FjdFJlcS5iRGVzSW5kZXggPSAweEZGOw0KLSAgICAgICAgdENnYWN0UmVxLmJUeXBlID0gWl9BUE1NSUFfU01fUERQX0lOQUNUSVZFOw0KLSAgICAgICAgdENnYWN0UmVxLmJUeXBlRmxnPVpfQVBNTUlBX1ZBTElEOw0KLQ0KLSAgICAgICAgcmV0dXJuIHpBdGlfU21DZ2FjdFJlcSgmdENnYWN0UmVxKSA9PSBaX0FQTU1JQV9OT1JFU1VMVDsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gRkFMU0U7DQotfQ0KLXN0YXRpYyBWT0lEIHpBdGlfSGFuZGxlUHBwU21EZUFjdEluZChCWVRFIGJDaWQpDQoteyAgICANCi0gICAgQllURSBiQ2lkSW5kZXggPSBiQ2lkLTE7DQotICAgIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUgPSB6QXRpX0dldENoYW5uZWxOb2RlUHRyKGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZCk7DQotICAgIGlmKHBDaG5lbE5vZGUgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgQllURSBpQ2huZWxJZCA9IGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZDsgICAgICAgIA0KLSAgICAgICAgaWYoekF0aV9Jc0xhc3RDaWRPZkNobm5lbChiQ2lkLGlDaG5lbElkKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihaQVRJMl9DSEFOTkVMX01PREVfREFUQSA9PXBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9IYW5kbGVOb0NhcnJpZXJDbmYoMHhmZiwgaUNobmVsSWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwQ2huZWxOb2RlLT5Jc1BwcCA9IEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHpPc3NfTWVtc2V0KCZnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLCAwLCBzaXplb2YoVF9aQXRpX0xhc3RDaWRUYWIpKTsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZVNtRGVBY3RJbmQoVF96TW1pYVNtX0NpZERlYWN0X0luZCAqcHREZWFjdEluZCkNCi17DQotICAgIEJZVEUgYkNpZCAgICAgID0gMDsNCi0gICAgQllURSBiQ2lkSW5kZXggPSBwdERlYWN0SW5kLT5iQ2lkLTE7Ly+8x8K8Q0lE1NpsYXN0Q2lkVGFiW13W0LbU06a1xM/CseoNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlID0gTlVMTDsNCi0gICAgQllURSBiU3JjSW5kZXggPSAwOw0KLSAgICBCT09MIGJJc0V4Q2lkID0gRkFMU0U7DQotICAgIEJZVEUgYk1hc3RDaWQgPSAwOw0KLQ0KLSAgIC8vUFBQsqa6xbSmwO0ssrvE3LTm1NrLq9W7vKS77rXEx+m/9g0KLSAgICBpZihnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmlDaWQgPT0gcHREZWFjdEluZC0+YkNpZA0KLSAgICAgICAgICAgICYmZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pc1BwcCkNCi0gICAgew0KLSAgICAgICAgekF0aV9IYW5kbGVQcHBTbURlQWN0SW5kKHB0RGVhY3RJbmQtPmJDaWQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotICAgIA0KLSAgICBpZiAoekF0aV9Jc0V4Q2lkKHB0RGVhY3RJbmQtPmJDaWQsICZiQ2lkKSkNCi0gICAgew0KLSAgICAgICAgYklzRXhDaWQgPSBUUlVFOw0KLSAgICAgICAgYk1hc3RDaWQgPSBiQ2lkOw0KLSAgICB9DQotICAgIA0KLSAgICAvKlpHQUNUyrGyu8rHyKW8pLvuo6zWu9f2sqa6xc/gudi1xMrCo6y8pLvuz+C52LXEyKu+1rK70qrH5SovDQotICAgIGlmIChwdERlYWN0SW5kLT5iQXRUeXBlID09IFpfTU1JQVNNX0FUQ01EX1pHQUNUKQ0KLSAgICB7DQotICAgICAgICBpZiAoYklzRXhDaWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKChiTWFzdENpZCA+PSBaX0RFVl9BdE1lbV9NSU5JTlVNX0NJRCkgJiYgKGJNYXN0Q2lkIDw9IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYkNpZEluZGV4ID0gYk1hc3RDaWQgLTE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRQYXJhLCAgVFJBQ0VfRVJSX0xFVkVMX05PUk1BTCwiIik7Ly9EZWFjdEluZCBjaWQgZXJyb3INCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZiAoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pc05kaXMpDQotICAgICAgICB7DQotICAgICAgICAgICAgcENobmVsTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoKFVJTlQ4KWdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZCk7DQotICAgICAgICAgICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0NtZChwQ2huZWxOb2RlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pc05kaXMgPSBGQUxTRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKrioQ0lEyKW77tTyyKW2qNLluKhDSUQqLw0KLSAgICBpZihiSXNFeENpZCAmJiAoKGJNYXN0Q2lkID49IDEpICYmIChiTWFzdENpZCA8PSBaQVRJMl9TTV9NQVhfU01DSURfTlVNKSkpDQotICAgIHsNCi0gICAgICAgIGJDaWRJbmRleCA9IGJNYXN0Q2lkIC0xOw0KLSAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5leHRBY3RDaWQgPSAwOyAgDQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmV4dFBkcFR5cGUgPSAwOw0KLSAgICAgICAgekF0X1NtVW5kZWZpbmVQZHBDb250SW5BdE1lbShwdERlYWN0SW5kLT5iQ2lkKTsvL8iltqjS5bioQ0lEDQotDQotICAgICAgICAvKru5w7vT0MrVtb3W90NJRCC1xERlQWN0SW5kKi8NCi0gICAgICAgIGlmIChnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmJNYXN0Q2lkU3RhdGUgPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvKtPJ09qyu9aqtcC1scewtcTIpbvuzajWqsrH1ve2r8ilu+67ucrHsbu2r8ilu+6jrNDo0qrIpbvu1vdDSUSjuw0KLSAgICAgICAgICAgICrV4rTOtcTIpbvux+vH87/JxNy74crH1ti4tLXEKi8NCi0gICAgICAgICAgICBiU3JjSW5kZXggPSBaQVRJMl9DSEFOTkVMX0lEX05VTV9FTkQgKyAxOw0KLSAgICAgICAgICAgIHpBdGlfU2VuZERlQWN0UmVxKGJNYXN0Q2lkLCBiU3JjSW5kZXgpOy8q1eK49sfrx/O1xM/s06ayu9PDtKbA7aOs08PO3tCny/fS/SovDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLyrG5Mv7x+m/9su1w/fHsMPm0tG+rcrVtb3W90NJRMilu+6jrNXitM7T1srVtb24qENJRMilu+6jrNLRvq3K1cbryKW77s2o1qoqLw0KLSAgICB9DQotICAgIA0KLSAgICAvKtb3Q0lEyKW77tTyxdC2z8rHt/G7udPQuKhDSUSjrMjnufvDu9PQ1PLH0Lu7zai1wKOsDQotICAgICoxo6y3x8ur1bu1xENJRMilu+6jrDKjrMur1bvIpbvuo6zW96GiuKhDSUS1xMilu+7S0b6tytXG6yovDQotICAgIGlmICghZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5leHRBY3RDaWQpDQotICAgIHsNCi0gICAgICAgIHBDaG5lbE5vZGUgPSB6QXRpX0dldENoYW5uZWxOb2RlUHRyKChVSU5UOClnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmNobmVsSWQpOw0KLSAgICAgICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfQ2hhbmdlQ2huZWxOb2RlVG9DbWQocENobmVsTm9kZSk7DQotICAgICAgICB9DQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmlzVXNlZCA9IEZBTFNFOw0KLSAgICAgICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pc05kaXMgPSBGQUxTRTsNCi0gICAgICAgIGlmIChnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmJNYXN0Q2lkU3RhdGUgPT0gMSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmJNYXN0Q2lkU3RhdGUgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UvL7u509C4qENJRA0KLSAgICB7DQotICAgICAgICAvKtPJ09qyu9aqtcC1scewtcTIpbvuzajWqsrH1ve2r8ilu+67ucrHsbu2r8ilu+6jrNDo0qrIpbvuuKhDSUSjuw0KLSAgICAgICAgKtXitM61xMilu+7H68fzv8nE3LvhysfW2Li0tcQqLw0KLSAgICAgICAgYlNyY0luZGV4ID0gWkFUSTJfQ0hBTk5FTF9JRF9OVU1fRU5EICsgMTsNCi0gICAgICAgIHpBdGlfU2VuZERlQWN0UmVxKGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uZXh0QWN0Q2lkLCBiU3JjSW5kZXgpOy8q1eK49sfrx/O1xM/s06ayu9PDtKbA7aOs08PO3tCny/fS/SovDQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmJNYXN0Q2lkU3RhdGUgPSAxOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotDQotDQotDQotc3RhdGljICBUX1pBdGlfQ2hhbm5lbEluZm8gKiBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0Q2huZWxOb2RlKFVJTlQzMiBpRXZJZCwgVUlOVDggKnBEYXRhUHRyLCBVSU5UMTYgaURhdGFMZW4pDQotew0KLSAgICBUX1pBdGlfQ2hhbm5lbElkICAgICAgIGNoYW5uZWxJZCA9IFpBVEkyX0NIQU5ORUxfSURfSU5WQUxJRDsgDQotDQotICAgIGlmICh6QXRpX0lzV2l0aE91dEluZGV4RGVsaXZJbmQoaUV2SWQsIHBEYXRhUHRyKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIH0NCi0NCi0gICAgaWYoQVNfUVVFUllfRU1fQ0VMTF9JTkZPX0NORl9FViA9PSBpRXZJZCkNCi0gICAgew0KLSAgICAgICAgVF96RU1fRW1JbmZvX0luZCogcEx0ZVplbWNpSW5kID0gKFRfekVNX0VtSW5mb19JbmQqKXBEYXRhUHRyOw0KLSAgICAgICAgcmV0dXJuIHpBdGlfR2V0Q2hhbm5lbElkQnlJbmRleChpRXZJZCwgcEx0ZVplbWNpSW5kLT5iU3JjSW5kZXgsIHBMdGVaZW1jaUluZC0+YkRlc0luZGV4LCAoVUlOVDggKikmY2hhbm5lbElkKTsNCi0gICAgfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLSAgICBlbHNlIGlmKE1NSUFfQ0NfQ0FMTF9TVEFURV9JTkRfRVYgPT0gaUV2SWQpDQotICAgIHsNCi0gICAgICAgY2hhbm5lbElkID0gekF0aV9HZXRDYWxsQ29udHJvbENoYW5uZWxJZChwRGF0YVB0ciwgaURhdGFMZW4pOw0KLQ0KLSAgICAgICAgaWYoKGNoYW5uZWxJZCA+IFpBVEkyX0NIQU5ORUxfSURfSU5WQUxJRCkgJiYgKGNoYW5uZWxJZCA8PSBaQVRJMl9DSEFOTkVMX0lEX05VTUNPVU5UKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gekF0aV9HZXRDaGFubmVsTm9kZVB0cigoVUlOVDgpY2hhbm5lbElkKTsgLyoguPm+3c2otcC6xbvxyKG94bXjICovICAgICAgICAgICANCi0gICAgICAgIH0vLzYxNzAwMTczODc1OCBbYXRpXUFUwfezzNX7us/Q3rjEteOyu7fWU1RBVEWjrL75yc+xqERTQ0kNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICB9DQotI2VuZGlmDQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHpBdGlfR2V0Q2hhbm5lbElkQnlJbmRleChpRXZJZCwgKnBEYXRhUHRyLCAqKHBEYXRhUHRyICsgMSksIChVSU5UOCAqKSZjaGFubmVsSWQpOw0KLSAgICB9DQotfQ0KLQ0KLS8qDQotICAgIMXQts+1scewzai1wMrHt/HK9NPatbHHsMq1wP0NCi0gKi8NCi1zdGF0aWMgQk9PTCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNDdXJJbnN0YW5jZUNobmxOb2RlKEJZVEUgYkluc3RhbmNlLCBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICBpZihwQ2huZWxOb2RlLT5pQ2huZWxJZCA8PSBaX0FUSV9JTlNUQU5DRV9PTkVfQ0hOTF9NQVgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAoYkluc3RhbmNlID09IDApOw0KLSAgICB9DQotICAgIGVsc2UgaWYocENobmVsTm9kZS0+aUNobmVsSWQgPD0gWl9BVElfSU5TVEFOQ0VfVFdPX0NITkxfTUFYKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGJJbnN0YW5jZSA9PSAxKTsNCi0gICAgfQ0KLSAgICBlbHNlIC8vIM2otcC6xT4gMTgwICDE2rK/yrnTw6OssrvK9NPayM66ztK7uPbKtcD9DQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLX0NCi0NCi0vKiANCi0gICAgu/HIodb3tq/Jz7Gozai1wA0KLSAgICBQc0lkINCt0unVu8q1wP26xaOsyKHWtc6qMaGiMg0KLSovDQotc3RhdGljIEJZVEUgX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldFVuc29sQ2hhbm5lbChCWVRFIGJQc0lkKQ0KLXsNCi0gICAgaWYoZ196QXRpX0NvbnRleHQucFVzb2xDaGFubmVsRnVuYyA9PSBOVUxMKSAgICAgICAvLyC3x9bHxNy7+s2otcANCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfQVRJX1VOT1NMX0NIQU5ORUxfQUxMX0ZSRUU7DQotICAgIH0NCi0gICAgZWxzZSAvLyDWx8Tcu/rNqLXAo6zIoda108myzr+8yei8xr72tqgNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdfekF0aV9Db250ZXh0LnBVc29sQ2hhbm5lbEZ1bmMoYlBzSWQpOw0KLSAgICB9DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8YgOiB6QXRpX0dldEFsd2F5c1JlcG9ydENobmVsDQotKiC5psTcw+jK9iA6ILvxyKGyu8rcyse38braxsEvwcHGwdOwz+yjrLa8yc+xqLXEzai1wA0KLSogss7K/cu1w/cgOiANCi0qICAgICAgICAgICAgYlBzSWQgICA6ICDQrdLp1bu6xaOsyKHWtc6qMbvy1d8yDQotKiC3tSC72CDWtSA6ILK7ytzKx7fxutrGwS/BwcbB07DP7KOstrzJz7GotcTNqLXAusUNCi0qIMbky/zLtcP3IDogzOG5qbj408O7p7e9uq/K/b3Tv9oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRBbHdheXNSZXBvcnRDaG5lbChCWVRFIGJQc0lkKQ0KLXsNCi0gICAgaWYoZ196QXRpX0NvbnRleHQucEFsd2F5c1JlcG9ydENobmVsID09IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAwWEZGOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGdfekF0aV9Db250ZXh0LnBBbHdheXNSZXBvcnRDaG5lbChiUHNJZCk7DQotICAgIH0NCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrqvyv3D+7PGOnpBdGlfR2V0Q2huZWxJbmRTdGF0ZQ0KLSq6r8r9uabE3Dq4+b7dzai1wLrFu/HIoc2otcDKx7fx0qrW97avyc+xqA0KLSq3tbvY1rU6ICBaX1ZBTElEOtb3tq/Jz7GoyrHSqsnPsaijrFpfSU5WQUxJRDrW97avyc+xqMqxsrvJz7GoDQotKsbky/vLtcP3Og0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldENobmVsSW5kU3RhdGUoQllURSBiQ2huZWxJZCkNCi17DQotICAgIEJZVEUgYkFycnlOdW0gPSAwOw0KLSAgICBCWVRFIGJCaXROdW0gPSAwOw0KLSAgICBpZiAoYkNobmVsSWQgPT0gMCkNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZE1zZywgVFJBQ0VfRVJSX0xFVkVMX05PUk1BTCwiIik7Ly9jaG5lbElEIGVycg0KLSAgICAgICAgcmV0dXJuIFpfVkFMSUQ7DQotICAgIH0NCi0gICAgYkFycnlOdW0gPSAoKGJDaG5lbElkLTEpIC8gMzIpICUgODsvL7fA1rmz9rTtyrHK/dfp1L295w0KLSAgICBiQml0TnVtID0gKGJDaG5lbElkLTEpICUgMzI7DQotICAgIHJldHVybiAoQllURSkoKGdfekF0aV9wdERhdGEtPmFkd0luZENobmVsW2JBcnJ5TnVtXSA+PiBiQml0TnVtKSAmIDB4MDAwMDAwMDEpOw0KLX0NCi0NCi0vKnpBdGlfRGVsaXZlckFsbE1zZw0KLSogIMi6t6LJz7GotKbA7Q0KLSovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfRGVsaXZlckFsbE1zZyhVSU5UMzIgaUV2SWQsIENIQVIgKnBFbmNvZGVDbWQsIFVJTlQxNiBpRW5jb2RlQ21kTGVuKQ0KLXsNCi0gICAgVUlOVDggICAgICAgICAgICAgICAgICAgaVNlbmRDb3VudCA9IDA7DQotICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcFRlbXBDaG5lbE5vZGUgPSBnX3pBdGlfcHREYXRhLT50QXRDaG5lbExpc3QucENobmVsTm9kZTsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwRGF0YUNobmVsTm9kZSAgPSBOVUxMOw0KLSAgICBCT09MICAgICAgICAgICAgICAgICAgICBiSXNBbGxDaG5sRGVsaXZlciA9IEZBTFNFOyAgLy90cnVlIMirzai1wLeiy82jrGZhbHNlINTyx/i31sq1wP26xbeiy80gDQotICAgIEJZVEUgICAgICAgICAgICAgICAgICAgICBiQ2huZWxJZCA9IHpBdGlfR2V0VW5zb2xDaGFubmVsKChCWVRFKShnX3pBdGlfQ3VySW5zdGFuY2UrMSkpOw0KLSAgICBCWVRFIGJDdXJyUmVwb3J0Q2huZWwgPSB6QXRpX0dldEFsd2F5c1JlcG9ydENobmVsKChCWVRFKShnX3pBdGlfQ3VySW5zdGFuY2UrMSkpOw0KLQ0KLSAgICBpZiAoKHpBdGlfSXNTaW5nbGVDYXJkRm9yVHdvU3RhbmRieSgpICYmICh6QXRpX0lzVWljY0V2KGlFdklkKSB8fCB6QXRpX0lzU3RtRXYoaUV2SWQpKSl8fA0KLSAgICAgICAgKGlFdklkID09IEVWX1pBVEkyX1pNU1JJX0lORCl8fChpRXZJZCA9PSBBUF9NTUlBX1BTQ0ZHU1RBUlRfSU5EX0VWKXx8KGlFdklkID09QVBfTU1JQV9QU0NGR0VORF9JTkRfRVYgKQ0KLSAgICAgICAgI2lmZGVmIERTRFNfVlNJTQ0KLSAgICAgICAgfHwoaUV2SWQgPT0gTU1JQV9VTU1fQ0FSRFNXSVRDSF9SRVFfSU5EX0VWKSB8fCAoaUV2SWQgPT0gTU1JQV9TTV9DR0VWX0lORF9FVikNCi0gICAgICAgICNlbmRpZg0KLSAgICAgICAgKQ0KLSAgICB7DQotICAgICAgICAvKsv509C/1c/Qzai1wL75yc+xqCovDQotICAgICAgICBiSXNBbGxDaG5sRGVsaXZlciA9IFRSVUU7DQotICAgIH0NCi0NCi0gICAgaWYoaUV2SWQgPT0gQVBfTU1JQV9TTVNfWkNNVElORF9FVikNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKDcyLCBpRW5jb2RlQ21kTGVuLCBwRW5jb2RlQ21kKTsNCi0gICAgICAgIHpBdGlfU2VuZEZuYyg3MiwgKFVJTlQ4ICopcEVuY29kZUNtZCwgaUVuY29kZUNtZExlbiwgWkFUSTJfQ0hJTkRfQVQpOw0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8qIMXQts/W97avyc+xqM2otcDKx7fxzqrWx8Tcu/oqLw0KLSAgICBpZiAoYkNobmVsSWQgIT0gWl9BVElfVU5PU0xfQ0hBTk5FTF9BTExfRlJFRSApDQotICAgIHsNCi0gICAgICAgIGlmIChaX1ZBTElEID09IHpBdGlfR2V0Q2huZWxJbmRTdGF0ZShiQ2huZWxJZCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKGJDaG5lbElkLCBpRW5jb2RlQ21kTGVuLCBwRW5jb2RlQ21kKTsNCi0gICAgICAgICAgICB6QXRpX1NlbmRGbmMoYkNobmVsSWQsIChVSU5UOCAqKXBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIDYxNzAwMjQ4OTc0NiDU2rvxyKG1vc2otcDKsVVJQ0O6zVNUTc/gudjW97avyc+xqM/7z6LU2rWlv6jLq7T9x+m/9s/Cwb249rT9u/qy4La8yc+xqCAgLS1oeWMtLSAqLw0KLSAgICAgICAgaWYoYklzQWxsQ2hubERlbGl2ZXIpDQotICAgICAgICB7DQotICAgICAgICAgICAgQllURSAgICBiSW5zdGFuY2VObyA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPT0gMSA/IFpfQVRJX0lOU05PXzEgOiBaX0FUSV9JTlNOT18yKTsNCi0gICAgICAgICAgICBiQ2huZWxJZCA9IHpBdGlfR2V0VW5zb2xDaGFubmVsKChCWVRFKShiSW5zdGFuY2VObysxKSk7DQotICAgICAgICAgICAgaWYgKGJDaG5lbElkICE9IFpfQVRJX1VOT1NMX0NIQU5ORUxfQUxMX0ZSRUUgJiYgKFpfVkFMSUQgPT0gekF0aV9HZXRDaG5lbEluZFN0YXRlKGJDaG5lbElkKSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB6QXRpX1NlbmRSc3BDbWRTdHIyVHJhY2UoYkNobmVsSWQsIGlFbmNvZGVDbWRMZW4sIHBFbmNvZGVDbWQpOw0KLSAgICAgICAgICAgICAgICB6QXRpX1NlbmRGbmMoYkNobmVsSWQsIChVSU5UOCAqKXBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm47DQotICAgIH0NCi0NCi0gICAgaWYgKHpBdGlfSXNCbGFja1NjcmVlblJlcG9ydE1zZyhpRXZJZCkpDQotICAgIHsNCi0gICAgICAgIGlmIChiQ3VyclJlcG9ydENobmVsICE9IDBYRkYpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKFpfVkFMSUQgPT0gekF0aV9HZXRDaG5lbEluZFN0YXRlKGJDdXJyUmVwb3J0Q2huZWwpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKGJDdXJyUmVwb3J0Q2huZWwsIGlFbmNvZGVDbWRMZW4sIHBFbmNvZGVDbWQpOw0KLSAgICAgICAgICAgICAgICB6QXRpX1NlbmRGbmMoYkN1cnJSZXBvcnRDaG5lbCwgKFVJTlQ4ICopcEVuY29kZUNtZCwgaUVuY29kZUNtZExlbiwgWkFUSTJfQ0hJTkRfQVQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvKiA2MTcwMDI0ODk3NDYg1Nq78cihtb3NqLXAyrFVSUNDus1TVE3P4LnY1ve2r8nPsajP+8+i1Nq1pb+oy6u0/cfpv/bPwsG9uPa0/bv6suC2vMnPsaggIC0taHljLS0gKi8NCi0gICAgICAgICAgICBpZihiSXNBbGxDaG5sRGVsaXZlcikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIEJZVEUgYkluc3RhbmNlTm8gPSAoZ196QXRpX0N1ckluc3RhbmNlID09IDEgPyBaX0FUSV9JTlNOT18xIDogWl9BVElfSU5TTk9fMik7DQotICAgICAgICAgICAgICAgIGJDdXJyUmVwb3J0Q2huZWwgPSB6QXRpX0dldEFsd2F5c1JlcG9ydENobmVsKChCWVRFKShiSW5zdGFuY2VObysxKSk7DQotICAgICAgICAgICAgICAgIGlmIChiQ3VyclJlcG9ydENobmVsICE9IDBYRkYgJiYgKFpfVkFMSUQgPT0gekF0aV9HZXRDaG5lbEluZFN0YXRlKGJDdXJyUmVwb3J0Q2huZWwpKSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9TZW5kUnNwQ21kU3RyMlRyYWNlKGJDdXJyUmVwb3J0Q2huZWwsIGlFbmNvZGVDbWRMZW4sIHBFbmNvZGVDbWQpOw0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9TZW5kRm5jKGJDdXJyUmVwb3J0Q2huZWwsIChVSU5UOCAqKXBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICB3aGlsZShOVUxMICE9IHBUZW1wQ2huZWxOb2RlKQ0KLSAgICB7DQotICAgICAgICAvLyDQ6NKqx/i31sq1wP26xcnPsaijrLTLzai1wLK7yvTT2rWxx7DKtcD9usW3ts6nDQotICAgICAgICBpZighYklzQWxsQ2hubERlbGl2ZXIgJiYgIXpBdGlfSXNDdXJJbnN0YW5jZUNobmxOb2RlKGdfekF0aV9DdXJJbnN0YW5jZSwgcFRlbXBDaG5lbE5vZGUpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHBUZW1wQ2huZWxOb2RlID0gcFRlbXBDaG5lbE5vZGUtPnBOZXh0Q25Ob2RlOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCA9PSBwVGVtcENobmVsTm9kZS0+c2VydmVyX21vZGUgJiYgKFpfVkFMSUQgPT0gekF0aV9HZXRDaG5lbEluZFN0YXRlKHBUZW1wQ2huZWxOb2RlLT5pQ2huZWxJZCkpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlTZW5kQ291bnQrKzsNCi0gICAgICAgICAgICBpZihaQVQyX1NNX0QgPT0gcFRlbXBDaG5lbE5vZGUtPmNtZF9pZCkvKiAgQVREKnh4eHjWrsDgtcSyu8nPsaggICovDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwVGVtcENobmVsTm9kZSA9IHBUZW1wQ2huZWxOb2RlLT5wTmV4dENuTm9kZTsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHpBdGlfU2VuZFJzcENtZFN0cjJUcmFjZShwVGVtcENobmVsTm9kZS0+aUNobmVsSWQsIGlFbmNvZGVDbWRMZW4sIHBFbmNvZGVDbWQpOw0KLSAgICAgICAgICAgIHpBdGlfU2VuZEZuYyhwVGVtcENobmVsTm9kZS0+aUNobmVsSWQsIChVSU5UOCAqKXBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgDQotICAgICAgICB7DQotICAgICAgICAgICAgcERhdGFDaG5lbE5vZGUgPSBwVGVtcENobmVsTm9kZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHBUZW1wQ2huZWxOb2RlID0gcFRlbXBDaG5lbE5vZGUtPnBOZXh0Q25Ob2RlOw0KLSAgICB9DQotDQotICAgIGlmKGlTZW5kQ291bnQgPT0gMCAmJiBwRGF0YUNobmVsTm9kZSAhPSBOVUxMICYmIChaX1ZBTElEID09IHpBdGlfR2V0Q2huZWxJbmRTdGF0ZShwRGF0YUNobmVsTm9kZS0+aUNobmVsSWQpKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0NtZChwRGF0YUNobmVsTm9kZSk7DQotICAgICAgICB6QXRpX1NlbmRSc3BDbWRTdHIyVHJhY2UocERhdGFDaG5lbE5vZGUtPmlDaG5lbElkLCBpRW5jb2RlQ21kTGVuLCBwRW5jb2RlQ21kKTsNCi0gICAgICAgIHpBdGlfU2VuZEZuYyhwRGF0YUNobmVsTm9kZS0+aUNobmVsSWQsIChVSU5UOCAqKXBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIFpBVEkyX0NISU5EX0FUKTsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLVZPSUQgekF0aV9EZWxpdmVyQ2VuZEluZChWT0lEKQ0KLXsNCi0gICAgVUlOVDE2ICBzdHJMZW49MDsNCi0gICAgQ0hBUiAqcFN0ckNtZCA9IE5VTEw7DQotDQotICAgIHBTdHJDbWQgPSAoQ0hBUiAqKXpBdGlfR2V0VUIoWkFUMl9TSE9SVF9DTURfTEVOKTsNCi0NCi0gICAgLypeQ0VORDogPENhbGxfWD4sW3Jlc2VydmVdLDxlbmRzdGF0dXM+Ki8NCi0gICAgc3ByaW50ZigoY2hhciAqKXBTdHJDbWQsICIlc15DRU5EOiAxLCwyOSVzIiwgZ196QXRfQ1JMRiwgZ196QXRfQ1JMRik7LypDYWxsX1i5zLaozqoxKi8NCi0gICAgc3RyTGVuID0gKFVJTlQxNilzdHJsZW4oKGNvbnN0IGNoYXIgKilwU3RyQ21kKTsNCi0NCi0gICAgekF0aV9EZWxpdmVyQWxsTXNnKEFQX01NSUFfQ0VORF9JTkRfRVYsIHBTdHJDbWQsIHN0ckxlbik7DQotDQotICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnBTdHJDbWQpOw0KLSAgICByZXR1cm47DQotfQ0KLSNlbmRpZg0KLVZPSUQgX19wc180Z19mdW5jIHpBdGlfQ2hhbmdlQ2huZWxOb2RlVG9DbWQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgaWYocENobmVsTm9kZSAhPSBOVUxMICYmIHBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlID09IFpBVEkyX0NIQU5ORUxfTU9ERV9EQVRBKQ0KLSAgICB7DQotICAgICAgICBwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9IFpBVEkyX0NIQU5ORUxfTU9ERV9DTUQ7DQotICAgICAgICBwQ2huZWxOb2RlLT5kYXRhVHlwZSA9IFpBVEkyX0NIQU5ORUxfREFUQV9UWVBFX0lOVkFMOyAvKiC7udStICovDQotICAgICAgICB6QXRpX1NlbmRGbmMocENobmVsTm9kZS0+aUNobmVsSWQsIE5VTEwsIDAsIFpBVEkyX0NISU5EX1RVUk5fQVQpOyAvKiDH0Lu7zai1wCAqLw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotDQotRFdPUkQgekF0aV9IYW5kbGVTbU5vQ2FycmllckNuZihWT0lEKiBwQnVmZiwgRFdPUkQgKiBwZHdDaGFuZ2VkTXNnSWQsIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpDQotew0KLSAgICB6QXRpX0NoYW5nZUNobmVsTm9kZVRvQ21kKHBDaG5lbE5vZGUpOw0KLSAgICAqcGR3Q2hhbmdlZE1zZ0lkID0gTU1JQV9TTV9OT19DQVJSSUVSX0NORl9FVjsNCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PUkVTVUxUOw0KLX0NCi0NCi1EV09SRCB6QXRpX0huYWRsZVBkcENhdXNlUXVlcnlDbmYoVk9JRCogcEJ1ZmYsIERXT1JEICogcGR3Q2hhbmdlZE1zZ0lkLCBUX1pBdGlfQ2hhbm5lbEluZm8gICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgWk9TU19UQVNLX0lEIHRUYXNrSWQgPSB6T3NzX1NlbmRlcigpOw0KLSAgICBUX3pNbWlhU21fUXVlcnlQZHBDYXVzZV9DbmYgKnBDZWVyQ25mID0gKFRfek1taWFTbV9RdWVyeVBkcENhdXNlX0NuZiopcEJ1ZmY7DQotDQotICAgIGlmKHRUYXNrSWQgPT0gekRldl9HZXRUYXNrSWQoWl9BVElfVEFTS0lEX1NNLCAwKSB8fCANCi0gICAgICAgdFRhc2tJZCA9PSB6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfU00sIDEpKQ0KLSAgICB7DQotICAgICAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2VlckluZm8uZHdTbUNhdXNlICAgICAgID0gcENlZXJDbmYtPmR3Q2F1c2U7IA0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENlZXJJbmZvLmJTbUNhdXNlRmcgICAgICA9IHBDZWVyQ25mLT5iQ2F1c2VGZzsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRDZWVySW5mby5kd0VzbUNhdXNlICAgICAgID0gcENlZXJDbmYtPmR3Q2F1c2U7IA0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENlZXJJbmZvLmJFc21DYXVzZUZnICAgICAgPSBwQ2VlckNuZi0+YkNhdXNlRmc7DQotICAgIH0NCi0gICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENlZXJJbmZvLmJCa09mZlRpbWVGZyAgICAgID0gcENlZXJDbmYtPmJCa09mZlRpbWVGZzsNCi0gICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udENlZXJJbmZvLmR3QmtPZmZUaW1lICAgICAgID0gcENlZXJDbmYtPmR3QmtPZmZUaW1lOw0KLSAgICBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50Q2VlckluZm8uYlNtQ2F1c2VScHRlZCAgPSBaX1ZBTElEOw0KLQ0KLSAgICAqcGR3Q2hhbmdlZE1zZ0lkID0gTU1JQV9TTV9QRFBfQ0FVU0VfUVVFUllfQ05GX0VWOw0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLVZPSUQgekF0aV9IYW5kbGVDY0Rpc2NJbmQoVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0NtZChwQ2huZWxOb2RlKTsNCi0gICAgcmV0dXJuOw0KLX0NCi0jZW5kaWYNCi1EV09SRCB6QXRpX0hhbmRsZUNnYXR0U2V0UmVxQ25mKFZPSUQqIHBCdWZmLCBEV09SRCAqIHBkd0NoYW5nZWRNc2dJZCwgVF9aQXRpX0NoYW5uZWxJbmZvICAqcENobmVsTm9kZSkNCi17DQotICAgIEJZVEUgYkluc3RhbmNlID0gMDsNCi0gICAgVF96TW1pYVVtbV9BY3RpdmVfQ25mICpwQ25mID0gKFRfek1taWFVbW1fQWN0aXZlX0NuZiAqKXBCdWZmOw0KLSAgICBVSU5UOCAgaUF0aUNpZE51bSA9IDA7DQotDQotICAgIGlmKHBDaG5lbE5vZGUgPT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgKnBkd0NoYW5nZWRNc2dJZCA9IE1NSUFfVU1NX0FDVElWRV9DTkZfRVY7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotICAgIH0NCi0gICAgYkluc3RhbmNlID0gekF0aV9HZXRUYXNrSW5zdGFudEJ5Q2hubElkKHBDaG5lbE5vZGUtPmlDaG5lbElkKTsNCi0gICAgaWYoWl9TVUNDID09IHBDbmYtPmJSZXN1bHQgJiYgKHBDaG5lbE5vZGUtPmlFdklkID09IE1NSUFfVU1NX0FDVElWRV9SRVFfRVYgfHwgcENobmVsTm9kZS0+Y21kX2lkID09IFpBVDJfTU1fQ09QUykpLyogyKW4vdfFs8m5piAqLw0KLSAgICB7DQotICAgICAgICBwQ2huZWxOb2RlLT5pRXZJZCA9IFpBVEkyX0lOVkFMX0VWSUQ7DQotICAgICAgICBmb3IoaUF0aUNpZE51bSA9IDA7IGlBdGlDaWROdW0gPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBpQXRpQ2lkTnVtKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaUF0aUNpZE51bV0uaUNpZCA+IDAgJiYgDQotICAgICAgICAgICAgICAgIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmlDaWQgPD0gWkFUSTJfU01fTUFYX1NNQ0lEX05VTSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENoTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoKFVJTlQ4KWdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmNobmVsSWQpOw0KLSAgICAgICAgICAgICAgICBpZihwQ2hOb2RlICE9IE5VTEwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmlzUHBwDQotICAgICAgICAgICAgICAgICAgICAmJihaQVRJMl9DSEFOTkVMX01PREVfREFUQSA9PSBwQ2hOb2RlLT5zZXJ2ZXJfbW9kZSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgekF0aV9IYW5kbGVOb0NhcnJpZXJDbmYoMHhmZixwQ2hOb2RlLT5pQ2huZWxJZCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0NtZChwQ2hOb2RlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gDQotICAgIH0NCi0gICAgKnBkd0NoYW5nZWRNc2dJZCA9IE1NSUFfVU1NX0FDVElWRV9DTkZfRVY7DQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotI2lmZGVmIFVTRV9WT0lDRV9TVVBQT1JUDQotRFdPUkQgekF0aV9IYW5kbGVWdHNGb3JDbWNjKEJZVEUgYlNvdXJjZUluZGV4LCBCWVRFIGJEZXN0SW5kZXgpDQotew0KLSAgICBUX3pNbWlhQ2NfRHRtZl9SZXEgKnBEZWNFdkJvZHkgPSBOVUxMOw0KLSAgICBVSU5UOCBkZXN0VGFzayA9IDA7DQotDQotICAgIGlmKCAhekF0aV9HZXREZXN0VGFza0J5TXNnSUQoTU1JQV9DQ19EVE1GX1JFUV9FViwmZGVzdFRhc2spKSAvKjYxNzAwMTk0MTc3MiovIA0KLSAgICB7DQotICAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZE1zZywgVFJBQ0VfRVJSX0xFVkVMX05PUk1BTCwiIik7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfT1BUTk9UQUxXX0VSUjsNCi0gICAgfQ0KLSAgICBwRGVjRXZCb2R5ID0gKFRfek1taWFDY19EdG1mX1JlcSAqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFDY19EdG1mX1JlcSkpOw0KLSAgICBwRGVjRXZCb2R5LT5iU3JjSW5kZXggPSBiU291cmNlSW5kZXg7DQotICAgIHBEZWNFdkJvZHktPmJEZXNJbmRleCA9IGJEZXN0SW5kZXg7DQotICAgIHBEZWNFdkJvZHktPmJEdG1mID0gZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuYkR0bWZbZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuYkN1cm51bSsrXTsNCi0gICAgcERlY0V2Qm9keS0+ZHdEdXJhdGlvbiAgPSBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50RHRtZi5kd0R1cmF0aW9uOw0KLQ0KLSAgICBpZihnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50RHRtZi5iQ3VybnVtID09IGdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnREdG1mLmJUb3RhbE51bSkNCi0gICAgew0KLSAgICAgICAgZ196QXRpX2F0RGF0YUV4W2dfekF0aV9DdXJJbnN0YW5jZV0udER0bWYuYlRvdGFsTnVtID0gMDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoICBaX1NVQ0MgIT0gekF0aV9Nc2dTZW5kKE1NSUFfQ0NfRFRNRl9SRVFfRVYsIChQQllURSlwRGVjRXZCb2R5LCBzaXplb2YoVF96TW1pYUNjX0R0bWZfUmVxKSxkZXN0VGFzaykpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0FQTU1JQV9PUFROT1RBTFdfRVJSOw0KLSAgICB9ICAgDQotICAgIA0KLSAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotfQ0KLSNlbmRpZg0KLXN0YXRpYyBTSU5UMzIgekF0aV9DaGFuZ2VDaG5lbE5vZGVUb0RhdGEoVF9aQXRpX0RhdGFUeXBlIGRhdGFUeXBlLCBDSEFSICpwRW5jb2RlQ21kLCBVSU5UMTYgaUVuY29kZUNtZExlbiwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgVF96QXRpMl9DdHJtQ2hJbmQgaUZsYWcgPSBaQVRJMl9DSElORF9UVVJOX0NTRDsNCi0gICAgcENobmVsTm9kZS0+c2VydmVyX21vZGUgPSBaQVRJMl9DSEFOTkVMX01PREVfREFUQTsNCi0gICAgcENobmVsTm9kZS0+ZGF0YVR5cGUgPSBkYXRhVHlwZTsNCi0gICAgaWYoZGF0YVR5cGUgPT0gWkFUSTJfQ0hBTk5FTF9EQVRBX1RZUEVfQ1NEKQ0KLSAgICB7DQotICAgICAgICBpRmxhZyA9IFpBVEkyX0NISU5EX1RVUk5fQ1NEOw0KLSAgICB9DQotICAgIGVsc2UgLy9pZihkYXRhVHlwZSA9PSBaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9QUykNCi0gICAgew0KLSAgICAgICAgaUZsYWcgPSBaQVRJMl9DSElORF9UVVJOX1BTRDsNCi0gICAgfQ0KLSAgICByZXR1cm4gekF0aV9TZW5kRm5jKHBDaG5lbE5vZGUtPmlDaG5lbElkLCAoVUlOVDggKilwRW5jb2RlQ21kLCBpRW5jb2RlQ21kTGVuLCBpRmxhZyk7DQotfQ0KLSNpZmRlZiBVU0VfVk9JQ0VfU1VQUE9SVA0KLS8qNjE3MDAxODQwMzEzQVRJttTT2rr0vdDXtMystuDJz7Go0ru0zl5DT05OKi8NCi1zdGF0aWMgVk9JRCB6QXRpX1NlbmRDb25uSW5kKFVJTlQ4ICpwRGF0YVB0ciwgQ0hBUiAqcEVuY29kZUNtZCwgVUlOVDE2IGlFbmNvZGVDbWRMZW4sIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIFRfekFwTW1pYV9Db25uX0luZCAgICAgICAqcENjQ29ubkluZCA9IChUX3pBcE1taWFfQ29ubl9JbmQgKilwRGF0YVB0cjsNCi0gICAgDQotICAgIGlmKChaX0FQTU1JQV9DQUxMVFlQRV9EQVRBID09IHBDY0Nvbm5JbmQtPmJDYWxsVHlwZSkgfHwgKFpfQVBNTUlBX0NBTExUWVBFX1BTX0RBVEEgPT0gcENjQ29ubkluZC0+YkNhbGxUeXBlKSkgLyogY29ubmVjdCC9+Mjryv2+3cysICovDQotICAgIHsNCi0gICAgICAgICB6QXRpX0NoYW5nZUNobmVsTm9kZVRvRGF0YShaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9DU0QsIHBFbmNvZGVDbWQsIGlFbmNvZGVDbWRMZW4sIHBDaG5lbE5vZGUpOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotI2VuZGlmDQotc3RhdGljIFNJTlQzMiB6QXRpX1NlbmRTbUNvbm5lY3RJbmQoVUlOVDggKnBEYXRhUHRyLCBDSEFSICpwRW5jb2RlQ21kLCBVSU5UMTYgaUVuY29kZUNtZExlbiwgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlKQ0KLXsNCi0gICAgekF0aV9TZW5kRm5jKHBDaG5lbE5vZGUtPmlDaG5lbElkLCAoVUlOVDggKilwRW5jb2RlQ21kLCBpRW5jb2RlQ21kTGVuLCBaQVRJMl9DSElORF9BVCk7DQotICAgIHpBdGlfU2VuZFJzcENtZFN0cjJUcmFjZShwQ2huZWxOb2RlLT5pQ2huZWxJZCwgaUVuY29kZUNtZExlbiwgcEVuY29kZUNtZCk7DQotICAgIHJldHVybiB6QXRpX0NoYW5nZUNobmVsTm9kZVRvRGF0YShaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9QUywgcEVuY29kZUNtZCwgaUVuY29kZUNtZExlbiwgcENobmVsTm9kZSk7DQotfQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9HZXRVbW1Qc0NvbnRleHQNCi26r8r9uabE3DrP8lVNTcfrx/NQU9Py16Ky4de0zKzQxc+iDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZkZWYgQ1hUX01PVg0KLVZPSUQgekF0aV9HZXRVbW1Qc0NvbnRleHQoVF96TW1pYVNtX0NvbnRleHRfQ25mICAqcHRDb250ZXh0Q25mKQ0KLXsNCi0gICAgVF96TW1pYVVtbV9Qc0NvbnRleHRfUmVxKiBwdFVtbUNvbnRleHRSZXEgPSBaT1NTX05VTEw7DQotDQotICAgIHB0VW1tQ29udGV4dFJlcSA9IChUX3pNbWlhVW1tX1BzQ29udGV4dF9SZXEqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFVbW1fUHNDb250ZXh0X1JlcSkpOw0KLQ0KLSAgICBwdFVtbUNvbnRleHRSZXEtPmJTcmNJbmRleCA9IHB0Q29udGV4dENuZi0+YkRlc0luZGV4Ow0KLSAgICBwdFVtbUNvbnRleHRSZXEtPmJEZXNJbmRleCA9IHB0Q29udGV4dENuZi0+YlNyY0luZGV4Ow0KLQ0KLSAgICB6QXRpX01zZ1NlbmQoTU1JQV9VTU1fUFNfQ09OVEVYVF9SRVFfRVYsKFBCWVRFKXB0VW1tQ29udGV4dFJlcSwNCi0gICAgc2l6ZW9mKFRfek1taWFVbW1fUHNDb250ZXh0X1JlcSksWl9BVElfVEFTS0lEX1VNTSk7DQotDQotICAgIHJldHVybjsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9TZW5kQ29udGV4dEluZA0KLbqvyv25psTcOs/yU00vRVNNt6LLzbDhx6jWuMq+DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotRFdPUkQgekF0aV9TZW5kQ29udGV4dEluZChUX3pNbWlhU21fQ29udGV4dF9DbmYqIHB0Q29udGV4dENuZiwgQllURSBiSW5zTm8pDQotew0KLSAgICBCWVRFIGJNb2QgPSAgekF0aV9HZXRUYXNrSW5kZXgoYkluc05vKTsNCi0gICAgQllURSBiUmV0ID0gMDsNCi0gICAgVF96TW1pYVNtX0NvbnRleHRfSW5kICpwdENvbnRldEluZCA9IFpPU1NfTlVMTDsNCi0gICAgQllURSBiVGVtcEluc05vID0gZ196QXRpX0N1ckluc3RhbmNlOyAgICANCi0NCi0gICAgaWYoYk1vZCA9PSBaX0FUSV9UQVNLSURfQVRJKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOy8vbW9kIGVycm9yDQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfT1BUTk9UQUxXX0VSUjsNCi0gICAgfQ0KLQ0KLSAgICBwdENvbnRldEluZCA9IChUX3pNbWlhU21fQ29udGV4dF9JbmQqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9Db250ZXh0X0luZCkpOw0KLSAgICAvKrTLyrHKx8/ywe3Su7T9t6LLzc/7z6KjrMv30v3WtdDo0qrGq9LGKi8NCi0gICAgek9zc19NZW1jcHkocHRDb250ZXRJbmQsIHB0Q29udGV4dENuZiwgc2l6ZW9mKFRfek1taWFTbV9Db250ZXh0X0NuZikpOw0KLSAgICANCi0gICAgaWYoWl9BVElfSU5TTk9fMSA9PSBiSW5zTm8pDQotICAgIHsNCi0gICAgICAgIHB0Q29udGV0SW5kLT5iU3JjSW5kZXggPSBwdENvbnRleHRDbmYtPmJEZXNJbmRleCAtIFpfQVRJX0lOU1RBTkNFX09ORV9DSE5MX01BWDsNCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHB0Q29udGV0SW5kLT5iU3JjSW5kZXggPSBwdENvbnRleHRDbmYtPmJEZXNJbmRleCArIFpfQVRJX0lOU1RBTkNFX09ORV9DSE5MX01BWDsNCi0gICAgfQ0KLSAgICBwdENvbnRldEluZC0+YkRlc0luZGV4ID0gcHRDb250ZXh0Q25mLT5iU3JjSW5kZXg7DQotDQotICAgIGdfekF0aV9DdXJJbnN0YW5jZSA9IGJJbnNObzsNCi0gICAgYlJldCA9IHpBdGlfTXNnU2VuZChNTUlBX1NNX0NPTlRFWFRfSU5EX0VWLChQQllURSlwdENvbnRldEluZCwgc2l6ZW9mKFRfek1taWFTbV9Db250ZXh0X0luZCksYk1vZCk7DQotICAgIGdfekF0aV9DdXJJbnN0YW5jZSA9IGJUZW1wSW5zTm87DQotDQotICAgIGlmKFpfRkFJTD09IGJSZXQpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRNc2csICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsvL3NlbmQgZXJyb3INCi0gICAgICAgIHJldHVybiBaX0FQTU1JQV9PUFROT1RBTFdfRVJSOw0KLSAgICB9DQotDQotICAgIHpBdGlfR2V0VW1tUHNDb250ZXh0KHB0Q29udGV4dENuZik7DQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfU2VuZENnYWN0RGVhY3RSZXENCi26r8r9uabE3Dq3osbwsqa6xbnSts8NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfU2VuZENnYWN0RGVhY3RSZXEoVF96QXBNbWlhX1NtQWN0RGVhY3RfUmVxICpwdERlYWN0UmVxLCBCWVRFIGJJbnNObykNCi17DQotICAgIEJZVEUgYk1vZCA9IDA7DQotICAgIEJZVEUgYlRlbXBJbnNObyA9IGdfekF0aV9DdXJJbnN0YW5jZTsNCi0gICAgVF96TW1pYVNtX1BkcERlYWN0X1JlcSAgICAgICAqcHRTbURlYWN0UmVxID0gWk9TU19OVUxMOw0KLSAgICANCi0NCi0gICAgYk1vZCA9IHpBdGlfR2V0VGFza0luZGV4KGJJbnNObyk7DQotDQotICAgIGlmKGJNb2QgPT0gWl9BVElfVEFTS0lEX0FUSSkNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsvL21vZCBlcnJvcg0KLSAgICAgICAgcmV0dXJuIDsNCi0gICAgfQ0KLQ0KLSAgICBwdFNtRGVhY3RSZXEgPSAoVF96TW1pYVNtX1BkcERlYWN0X1JlcSopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1BkcERlYWN0X1JlcSkpOw0KLQ0KLSAgICBwdFNtRGVhY3RSZXEtPmJTcmNJbmRleCA9IHB0RGVhY3RSZXEtPmJTcmNJbmRleDsNCi0gICAgcHRTbURlYWN0UmVxLT5iRGVzSW5kZXggPSBwdERlYWN0UmVxLT5iRGVzSW5kZXg7DQotICAgIHB0U21EZWFjdFJlcS0+YkNpZE51bSAgID0gcHREZWFjdFJlcS0+YkNpZE51bTsNCi0gICAgcHRTbURlYWN0UmVxLT5iQXRUeXBlID0gWl9NTUlBU01fQVRDTURfQ0dBQ1Q7DQotICAgIHpPc3NfTWVtY3B5KHB0U21EZWFjdFJlcS0+YWJDaWQscHREZWFjdFJlcS0+YWJDaWQsWl9BUE1NSUFfU01fTUFYX0NJRF9OVU0pOw0KLSAgICBwdFNtRGVhY3RSZXEtPmJJc0Rpc2Nvbm5lY3QgPSBwdERlYWN0UmVxLT5iSXNEaXNjb25uZWN0Ow0KLQ0KLSAgICBnX3pBdGlfQ3VySW5zdGFuY2UgPSBiSW5zTm87DQotICAgIHpBdGlfTXNnU2VuZChNTUlBX1NNX1BEUF9ERUFDVElWQVRFX1JFUV9FViwgKFBCWVRFKXB0U21EZWFjdFJlcSwgc2l6ZW9mKFRfek1taWFTbV9QZHBEZWFjdF9SZXEpLCBiTW9kKTsNCi0gICAgZ196QXRpX0N1ckluc3RhbmNlID0gYlRlbXBJbnNObzsNCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9TZW5kWmdhY3REZWFjdFJlcQ0KLbqvyv25psTcOreixvCyprrFudK2z6OsyrnTw87e0KfL99L9DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBWT0lEIHpBdGlfU2VuZFpnYWN0RGVhY3RSZXEoVF96TW1pYVNtX1BkcERlYWN0X1JlcSAqcHREZWFjdFJlcSkNCi17DQotICAgIEJZVEUgYk1vZCA9IDA7DQotICAgIFRfek1taWFTbV9QZHBEZWFjdF9SZXEgICAgICAgKnB0U21EZWFjdFJlcSA9IFpPU1NfTlVMTDsNCi0gICAgDQotICAgIGJNb2QgPSB6QXRpX0dldFRhc2tJbmRleChnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSAgICBpZihiTW9kID09IFpfQVRJX1RBU0tJRF9BVEkpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU2VuZEV4cHQyVHJhY2VBZ3QoRVJSX0ludmFsaWRQYXJhLCAgVFJBQ0VfRVJSX0xFVkVMX05PUk1BTCwiIik7Ly9tb2QgZXJyb3INCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBwdFNtRGVhY3RSZXEgPSAoVF96TW1pYVNtX1BkcERlYWN0X1JlcSopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1BkcERlYWN0X1JlcSkpOw0KLQ0KLSAgICBwdFNtRGVhY3RSZXEtPmJEZXNJbmRleCA9IHB0RGVhY3RSZXEtPmJEZXNJbmRleDsNCi0gICAgcHRTbURlYWN0UmVxLT5iU3JjSW5kZXggPSBwdERlYWN0UmVxLT5iU3JjSW5kZXg7DQotICAgIHB0U21EZWFjdFJlcS0+YkF0VHlwZSA9IFpfTU1JQVNNX0FUQ01EX1pHQUNUOw0KLSAgICB6T3NzX01lbWNweShwdFNtRGVhY3RSZXEtPmFiQ2lkLHB0RGVhY3RSZXEtPmFiQ2lkLHB0RGVhY3RSZXEtPmJDaWROdW0pOw0KLSAgICBwdFNtRGVhY3RSZXEtPmJDaWROdW0gPSBwdERlYWN0UmVxLT5iQ2lkTnVtOw0KLQ0KLSAgICB6QXRpX01zZ1NlbmQoTU1JQV9TTV9QRFBfREVBQ1RJVkFURV9SRVFfRVYsKFBCWVRFKXB0U21EZWFjdFJlcSwgc2l6ZW9mKFRfek1taWFTbV9QZHBEZWFjdF9SZXEpLCBiTW9kKTsNCi0gICAgcmV0dXJuOw0KLX0NCi1CT09MIHpBdGlfSGFuZGxlQVRESXBQcHBDb21tb25DbmYoVF96TW1pYVNtX0NvbW1vbl9DbmYgKnBDbmYpDQotew0KLSAgICBCWVRFICBiQXRpTnVtID0gMDsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlID0gTlVMTDsNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocENuZi0+YkRlc0luZGV4KTsNCi0gICAgQllURSBiQ2huZWxJZCA9IDB4ZmY7DQotDQotICAgIGZvcihiQXRpTnVtID0gMDsgYkF0aU51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGJBdGlOdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uaUNpZCAhPSAwDQotICAgICAgICAmJiBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQXRpTnVtXS5pc1BwcA0KLSAgICAgICAgJiYgIWdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JBdGlOdW1dLmlzUHBwQWN0Q21wbGV0ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiQ2huZWxJZCA9IGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JBdGlOdW1dLmNobmVsSWQ7DQotICAgICAgICAgICAgcENobmVsTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoYkNobmVsSWQpOw0KLSAgICAgICAgICAgIGlmIChwQ2huZWxOb2RlID09IE5VTEwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOy8vZ2V0IGNobmVsIGZhaWwNCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZihwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9PSBaQVRJMl9DSEFOTkVMX01PREVfREFUQSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfSGFuZGxlTm9DYXJyaWVyQ25mKHBDbmYtPmJTcmNJbmRleCwgYkNobmVsSWQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB6QXRpX0NsZWFyQ2lkSW5mb2J5Q2huZWwoYkNobmVsSWQpOw0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOnpBdGlfSGFuZGxlUHBwQ29tbW9uQ25mDQotuq/K/bmmxNw6tKbA7VBQULKmusXB97PMwO/K1bW9tcRTTV9DT01NT05fQ05GDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgRFdPUkQgekF0aV9IYW5kbGVQcHBDb21tb25DbmYoVk9JRCogcEJ1ZmYsIERXT1JEICpwZHdDaGFuZ2VkTXNnSWQsIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpDQotew0KLSAgICBUX3pNbWlhU21fQ29tbW9uX0NuZiAqcENuZiA9IChUX3pNbWlhU21fQ29tbW9uX0NuZiopcEJ1ZmY7DQotDQotICAgICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX0NPTU1PTl9DTkZfRVY7DQotICAgIGlmKHBDaG5lbE5vZGUgIT0gTlVMTCAmJiBwQ2huZWxOb2RlLT5Jc1BwcCkNCi0gICAgew0KLSAgICAgICAgIHpBdGlfQ2xlYXJDaWRJbmZvYnlDaG5lbChwQ25mLT5iRGVzSW5kZXgpOw0KLSAgICAgICAgcENobmVsTm9kZS0+SXNQcHAgPSBGQUxTRTsNCi0gICAgICAgIGlmKHBDaG5lbE5vZGUtPnNlcnZlcl9tb2RlID09IFpBVEkyX0NIQU5ORUxfTU9ERV9EQVRBKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfSGFuZGxlTm9DYXJyaWVyQ25mKHBDbmYtPmJTcmNJbmRleCwgcENuZi0+YkRlc0luZGV4KTsNCi0gICAgICAgICAgIC8vICpwZHdDaGFuZ2VkTXNnSWQgPSBNTUlBX1NNX05PX0NBUlJJRVJfQ05GX0VWOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHpBdGlfSGFuZGxlQVRESXBQcHBDb21tb25DbmYocENuZik7DQotICAgDQotICAgIHJldHVybiBaX0FQTU1JQV9OT1JFU1VMVDsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxiA6IHpBdGlfUHBwR2V0Q2lkDQotKiC5psTcw+jK9iA6ILj5vt3NqLXAusW3tbvYQ0lEDQotKiCyzsr9y7XD96O6IChJTimjuiANCi0qICAgICAgICAgICAgaUNobmVsSWQgICAgIM2otcBJRLrFDQotKiC3tSC72CDWtaO6ILPJuaa3tbvYQ0lEo6zKp7Dct7W72DANCi0qIMbky/zLtcP3o7ogzt4NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIHpBdGlfUHBwR2V0Q2lkKEJZVEUgIGJDaG5lbElkKQ0KLXsNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQoYkNobmVsSWQpOw0KLSAgICBCWVRFIGJBdGlDaWROdW0gPSAwOw0KLSAgICANCi0gICAgZm9yKGJBdGlDaWROdW0gPSAwOyBiQXRpQ2lkTnVtIDwgWkFUSTJfU01fTUFYX1NNQ0lEX05VTTsgYkF0aUNpZE51bSsrKQ0KLSAgICB7DQotICAgICAgICBpZigoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aUNpZE51bV0uY2huZWxJZCA9PSBiQ2huZWxJZCkNCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQXRpQ2lkTnVtXS5pc1BwcCkNCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQXRpQ2lkTnVtXS5pQ2lkID49IDEpIC8qIMih1rUxfjQgKi8NCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQXRpQ2lkTnVtXS5pQ2lkIDw9IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKSANCi0gICAgICAgIHsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aUNpZE51bV0uaUNpZDsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gMDsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9IYW5kbGVVc2VyRGVhY3RDbmZNc2cNCi26r8r9uabE3Dq0psDt08O7p7nSts/P7NOmDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIERXT1JEIF9fcHNfNGdfZnVuYyB6QXRpX0hhbmRsZVVzZXJEZWFjdENuZk1zZyggVk9JRCogcEJ1ZmYsIERXT1JEICpwZHdDaGFuZ2VkTXNnSWQsIFRfWkF0aV9DaGFubmVsSW5mbyAgKnBDaG5lbE5vZGUpDQotew0KLSAgICBUX3pNbWlhU21fUGRwRGVhY3RfUmVxIHRTbURlYWN0ID0gezB9Ow0KLSAgICBUX3pNbWlhU21fUGRwRGVhY3RfQ25mICpwRGVhY3RDbmYgPSAoVF96TW1pYVNtX1BkcERlYWN0X0NuZiopcEJ1ZmY7DQotICAgICAgICANCi0gICAgQllURSBiTnVtID0gMDsNCi0gICAgQllURSBpID0gMDsNCi0gICAgQllURSBiSW5zdGFuY2UgPSAwOw0KLSAgICBCWVRFIGJDaWQgPSAwOw0KLQ0KLSAgICBpZighcERlYWN0Q25mLT5iSXNEaXNjb25uZWN0KQ0KLSAgICB7DQotICAgICAgICAqcGR3Q2hhbmdlZE1zZ0lkID0gTU1JQV9TTV9QRFBfREVBQ1RJVkFURV9DTkZfRVY7DQotICAgICAgICByZXR1cm4gWl9BUE1NSUFfTk9SRVNVTFQ7DQotICAgIH0NCi0NCi0gICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocENobmVsTm9kZS0+aUNobmVsSWQpOw0KLSAgICAgICAgYkNpZCA9IHpBdGlfUHBwR2V0Q2lkKHBDaG5lbE5vZGUtPmlDaG5lbElkKTsNCi0gICAgICAgIC8qUFBQsqa6xbK7udyzybmmyqew3La80qrJz7GoTk9DQVJSSUVSKi8NCi0gICAgICAgIGlmKHBDaG5lbE5vZGUtPklzUHBwIHx8IChiQ2lkICE9IDAgJiYgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZC0xXS5pc1BwcCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgcENobmVsTm9kZS0+SXNQcHAgPSBGQUxTRTsNCi0gICAgICAgICAgICBpZihwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9PSBaQVRJMl9DSEFOTkVMX01PREVfREFUQSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfSGFuZGxlTm9DYXJyaWVyQ25mKHBEZWFjdENuZi0+YlNyY0luZGV4LHBEZWFjdENuZi0+YkRlc0luZGV4KTsNCi0gICAgICAgICAgICAgICAgLy8qcGR3Q2hhbmdlZE1zZ0lkID0gTU1JQV9TTV9OT19DQVJSSUVSX0NORl9FVjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgekF0aV9DbGVhckNpZEluZm9ieUNobmVsKHBDaG5lbE5vZGUtPmlDaG5lbElkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKtPDu6e50rbPyqew3LK7udzKx1BQULu5ysdSTkRJU7a80qrU2bTOt6LG8FpHQUNUudK2zyovDQotICAgIGlmKFpfU1VDQyAhPSBwRGVhY3RDbmYtPmJSZXN1bHQpDQotICAgIHsNCi0gICAgICAgIGZvcihpID0gMDsgaTxaX01NSUFTTV9NQVhfQ0lEX05VTTsgaSsrKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmKFpfU1VDQyAhPSBwRGVhY3RDbmYtPmF0UmVzdWx0W2ldLmJIYW5kbGVSZXN1bHQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0U21EZWFjdC5hYkNpZFtiTnVtKytdPXBEZWFjdENuZi0+YXRSZXN1bHRbaV0uYkNpZDsNCi0gICAgICAgICAgICAgICAgdFNtRGVhY3QuYkNpZE51bSsrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHRTbURlYWN0LmJEZXNJbmRleCA9IDB4ZmY7DQotICAgICAgICB0U21EZWFjdC5iU3JjSW5kZXggPSBaQVRJMl9DSEFOTkVMX0lEX05VTV9FTkQgKyAxOw0KLSAgICAgICAgaWYodFNtRGVhY3QuYkNpZE51bT4wKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfU2VuZFpnYWN0RGVhY3RSZXEoJnRTbURlYWN0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcmV0dXJuIFpfQVBNTUlBX05PUkVTVUxUOw0KLX0NCi1zdGF0aWMgVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9IYW5kbGVaZ2FjdENuZk1zZyhUX3pNbWlhU21fUGRwQWN0X0NuZiAqcFNtQ2dhY3RDbmYsICBUX1pBdGlfQ2hhbm5lbEluZm8gKnBDaG5lbE5vZGUpDQotew0KLSAgICBCWVRFIGJBdGlOdW0gPSAwOw0KLSAgICBCWVRFIGJNYXN0Q2lkID0gMDsNCi0gICAgQllURSBiQ2lkSW5kZXggPSBwU21DZ2FjdENuZi0+YXRSZXN1bHRbMF0uYkNpZCAtIDE7Ly+8x8K8Q0lE1NpsYXN0Q2lkVGFiW13W0LbU06a1xM/CseoNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQocENobmVsTm9kZS0+aUNobmVsSWQpOw0KLSAgICAvKtLyzqrW97iozai1wM/gzayjrMv50tTF0LbP0ru49r7N1+O5u8HLDQotICAgICAgIMfls/3WrsewyKWyprrFtcTNqLXAusWjrLfA1rnSu7j2zai1wLbU06a24Lj2Y2lkx+m/9iovDQotICAgIGZvcihiQXRpTnVtID0gMDsgYkF0aU51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGJBdGlOdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uY2huZWxJZCA9PSBwU21DZ2FjdENuZi0+YkRlc0luZGV4DQotICAgICAgICAgICAgJiYgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uaUNpZCAhPSBwU21DZ2FjdENuZi0+YXRSZXN1bHRbMF0uYkNpZA0KLSAgICAgICAgICAgICYmZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uZXh0QWN0Q2lkIT0gcFNtQ2dhY3RDbmYtPmF0UmVzdWx0WzBdLmJDaWQpDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19NZW1zZXQoJmdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JBdGlOdW1dLCAwLCBzaXplb2YoVF9aQXRpX0xhc3RDaWRUYWIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgKFZPSUQpekF0aV9Jc0V4Q2lkKHBTbUNnYWN0Q25mLT5hdFJlc3VsdFswXS5iQ2lkLCAmYk1hc3RDaWQpOyAgLy8gIMjnufvKx7ioQ0lEIKOs1PLV0rW9INb3Q0lEDQotICAgIGlmIChiTWFzdENpZCA+IDApDQotICAgIHsNCi0gICAgICAgIGJDaWRJbmRleCA9IC0tYk1hc3RDaWQ7DQotICAgIH0NCi0gICAgDQotICAgIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZCA9IHBTbUNnYWN0Q25mLT5iRGVzSW5kZXg7DQotDQotICAgIC8vIE10ILyku+61xENpZCwgQVRpIMO709DU2sirvtbQxc+i1tC8x8K8Q2lkoaMNCi0gICAgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5pQ2lkID0gYkNpZEluZGV4ICsgMTsNCi0gICAgaWYoekF0aV9TZW5kRm5jKHBTbUNnYWN0Q25mLT5iRGVzSW5kZXgsIE5VTEwsIDAsIFpBVEkyX0NISU5EX1RVUk5fUFNEKSA9PSBaQVRJMl9TVUNDRVNTKQ0KLSAgICB7DQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmlzTmRpcyA9IFRSVUU7DQotICAgICAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkSW5kZXhdLmlzVXNlZCA9IFRSVUU7DQotICAgICAgICBwQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSA9IFpBVEkyX0NIQU5ORUxfTU9ERV9EQVRBOw0KLSAgICAgICAgcENobmVsTm9kZS0+ZGF0YVR5cGUgPSBaQVRJMl9DSEFOTkVMX0RBVEFfVFlQRV9QUzsNCi0gICAgICAgIHBTbUNnYWN0Q25mLT5iUmVzdWx0ID0gWl9TVUNDOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5jaG5lbElkID0gMDsNCi0gICAgICAgIHpBdGlfSGFuZGxlU21EZUFjdENpZChwU21DZ2FjdENuZi0+YXRSZXN1bHRbMF0uYkNpZCk7DQotICAgICAgICBwU21DZ2FjdENuZi0+YlJlc3VsdCA9IFpfRkFJTDsNCi0gICAgfQ0KLSAgICByZXR1cm47DQotfQ0KLQ0KLXN0YXRpYyBCT09MIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9IYW5kbGVDbmZNc2dCZWZvcmVFbmNDbWQoVUlOVDMyIGlFdklkLCBVSU5UOCAqcERhdGFQdHIsIFVJTlQxNiBpRGF0YUxlbiwgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSkNCi17DQotICAgIGlmIChwQ2huZWxOb2RlLT5jbWRfaWQgPT0gWkFUMl9OT19DT01NQU5EICYmIChpRXZJZCA9PSBBUF9NTUlBX0NPTU1PTl9DTkZfRVYgfHwgDQotICAgICAgICBpRXZJZCA9PSBNTUlBX1NNU19DT01NT05fQ05GX0VWIHx8IGlFdklkID09IE1NSUFfU1NfQ09NTU9OX0NORl9FViB8fA0KLSAgICAgICAgaUV2SWQgPT0gTU1JQV9VTU1fQ09NTU9OX0NORl9FViB8fCBpRXZJZCA9PSBNTUlBX1NNX0NPTU1PTl9DTkZfRVZ8fCANCi0gICAgICAgIGlFdklkID09IEFQX1VJQ0NfVVNBVF9DT01NT05fQ05GX0VWIHx8IGlFdklkID09IEFQX1VJQ0NfQ09NTU9OX0NORl9FViB8fCANCi0gICAgICAgIGlFdklkID09IEFQX01NSUFfUEJfQ09NTU9OX0NORl9FVnx8IGlFdklkID09IE1NSUFfQ0NfQ09NTU9OX0NORl9FVikpDQotICAgIHsvKjYxNzAwMTczODc1OCBBVCDB97PM0N64xKOsxsGxzsv509C12rb+zPW72Li0z/vPoiAqLw0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotICAgIHJldHVybiBUUlVFOw0KLX0NCi1zdGF0aWMgVk9JRCB6QXRpX0NwYnJIYW5kbGUoVF96QXBNbWlhX0NwYnJTZXRfUmVxICpwQ3BiclJlcSwgVUlOVDE2IGlTdGFydFJlYywgVF96U3RtUGJfU3RvcmFnZUlkIHJlYWRTdG9yYWdlLCBUX3pTdG1fQ3Bicl9DbmYgKnBDcGJyU3RtQ25mKQ0KLXsNCi0gICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIGlMZW4gPSBzaXplb2YoVF96U3RtX0NwYnJfQ25mKTsNCi0gICAgVF96U3RtX0NwYnJfQ25mICAgICAgICAgICAgICpwQ25mID0gTlVMTDsNCi0gICAgVF96U3RtX0NwYnJfUmVxICAgICAgICAgICAgIGNwYnJTdG1SZXE7DQotICAgIHpPc3NfTWVtc2V0KCZjcGJyU3RtUmVxLCAwLCBzaXplb2YoVF96U3RtX0NwYnJfUmVxKSk7DQotICAgIGNwYnJTdG1SZXEuY3BiclNldFJlcSA9ICpwQ3BiclJlcTsNCi0gICAgY3BiclN0bVJlcS5pU3RhcnRSZWMgPSBpU3RhcnRSZWM7DQotICAgIGNwYnJTdG1SZXEucmVhZFN0b3JhZ2UgPSByZWFkU3RvcmFnZTsNCi0gICAgaWYoTlVMTCA9PSBwQ3BiclN0bUNuZikNCi0gICAgew0KLSAgICAgICAgcENuZiA9IChUX3pTdG1fQ3Bicl9DbmYgKil6QXRpX0dldFVCKGlMZW4pOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcENuZiA9IHBDcGJyU3RtQ25mOw0KLSAgICB9DQotICAgIHpTdG1QYl9DcGJyU3luSGFuZGxlKCZjcGJyU3RtUmVxLCBwQ25mLCAoVF96U3RtX1Rhc2tJZHgpZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgek9zc19UYXNrU2VuZERhdGEoRVZfWkFUSTJfQ1BCUl9DTkYsIChWT0lEICopcENuZiwgaUxlbiwgZ196QXRpX0NvbnRleHQudGFza0lkTXkpOw0KLX0NCi0NCi1CT09MIHpBdGlfU21JcFBkcEFjdFJlcShVSU5UOCBpQ2huZWxJZCwgVF9aQXRpX1NtSXBEbnNJbmZvKiBwQWRkcikNCi17DQotICAgIFVJTlQ4IGlBdGlDaWROdW0gPSAwOw0KLSAgICBCWVRFIGJJbnN0YW5jZSA9IHpBdGlfR2V0VGFza0luc3RhbnRCeUNobmxJZChpQ2huZWxJZCk7DQotICAgIFRfWkF0aV9DaGFubmVsSW5mbyAqcENobmVsTm9kZSA9IHpBdGlfR2V0Q2hhbm5lbE5vZGVQdHIoaUNobmVsSWQpOw0KLSAgICANCi0gICAgaWYoTlVMTCA9PSBwQ2huZWxOb2RlKSAvKiC4w82otcDDu9PQtPK/qiAqLw0KLSAgICB7DQotICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgIH0NCi0gICAgZm9yKGlBdGlDaWROdW0gPSAwOyBpQXRpQ2lkTnVtIDwgWkFUSTJfU01fTUFYX1NNQ0lEX05VTTsgaUF0aUNpZE51bSsrKQ0KLSAgICB7DQotICAgICAgICBpZigoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaUF0aUNpZE51bV0uY2huZWxJZCA9PSBwQ2huZWxOb2RlLT5pQ2huZWxJZCkNCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5pQ2lkID49IDEpIC8qIMih1rUxfjQgKi8NCi0gICAgICAgICYmIChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5pQ2lkIDw9IFpBVEkyX1NNX01BWF9TTUNJRF9OVU0pKSANCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gekF0aV9TbUdldFBkcEFkZHJCeUNpZChnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQXRpQ2lkTnVtXS5pQ2lkLCBwQWRkciwgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaUF0aUNpZE51bV0uZXh0QWN0Q2lkLCBiSW5zdGFuY2UpOw0KLSAgICAgICAgICAgLy8gew0KLSAgICAgICAgICAgIC8vICAgIHJldHVybiBUUlVFOw0KLSAgICAgICAgICAgIC8vfQ0KLSAgICAgICAgICAgIC8vekF0aV9Vc2JTaW9TbUlwUGRwQWN0UmVxKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lBdGlDaWROdW1dLmlDaWQpOw0KLSAgICAgICAgICAgIC8vcmV0dXJuIEZBTFNFOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpBdGlfR2V0RGVzdFRhc2tCeU1zZ0lEDQotKiC5psTcw+jK9qO6IA0KLSogss7K/cu1w/ejuiANCi0qICAgICAgICAgICAgDQotKiC3tSC72CDWtaO6DQotKiDG5Mv8y7XD96O6IA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJPT0wgX19wc19zdGF0aWNfZnVuYyB6QXRpX0dldERlc3RUYXNrQnlNc2dJRChVSU5UMzIgbXNnSWQsIFVJTlQ4ICpkZXN0VGFzaykNCi17DQotICAgIFVJTlQxNiBpVGFza01zZ01hcCA9IDA7DQotICAgIA0KLSAgICBmb3IoaVRhc2tNc2dNYXAgPSAwOyBpVGFza01zZ01hcCA8IHNpemVvZihnX1Rhc2tNc2dNYXApL3NpemVvZihUX1pBdGlfTXNnVHJuc3BybmN5KTtpVGFza01zZ01hcCsrICkNCi0gICAgew0KLSAgICAgICAgaWYobXNnSWQgPT0gZ19UYXNrTXNnTWFwW2lUYXNrTXNnTWFwXS5kd01zZ0lkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgICpkZXN0VGFzayA9IGdfVGFza01zZ01hcFtpVGFza01zZ01hcF0uYkRlc3RUYWs7DQotICAgICAgICAgICAgaWYoZ19UYXNrTXNnTWFwW2lUYXNrTXNnTWFwXS5iRGVzdFRhayA9PSBaX0FUSV9UQVNLSURfU00NCi0gICAgICAgICAgICAgICAgfHwgZ19UYXNrTXNnTWFwW2lUYXNrTXNnTWFwXS5iRGVzdFRhayA9PSBaX0FUSV9UQVNLSURfRVNNKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgKmRlc3RUYXNrID0gekF0aV9HZXRUYXNrSW5kZXgoZ196QXRpX0N1ckluc3RhbmNlKTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsgIA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfQ29udmVydFRza0lkVG9TYk1kbChCWVRFIGRlc3RUYXNrKQ0KLXsNCi0gICAgc3dpdGNoIChkZXN0VGFzaykNCi0gICAgew0KLSAgICAgICAgY2FzZSBaX0FUSV9UQVNLSURfQ0M6DQotICAgICAgICAgICAgcmV0dXJuIFpfUFNNRExfQ0M7DQotICAgICAgICBjYXNlIFpfQVRJX1RBU0tJRF9TUzoNCi0gICAgICAgICAgICByZXR1cm4gWl9QU01ETF9TUzsNCi0gICAgICAgIGNhc2UgWl9BVElfVEFTS0lEX1NNOg0KLSAgICAgICAgICAgIHJldHVybiBaX1BTTURMX1NNOw0KLSAgICAgICAgY2FzZSBaX0FUSV9UQVNLSURfU01TOg0KLSAgICAgICAgICAgIHJldHVybiBaX1BTTURMX1NNUzsNCi0gICAgICAgIGNhc2UgWl9BVElfVEFTS0lEX1VNTToNCi0gICAgICAgICAgICByZXR1cm4gWl9QU01ETF9VTU07DQotICAgICAgICBjYXNlIFpfQVRJX1RBU0tJRF9FU006DQotICAgICAgICAgICByZXR1cm4gWl9QU01ETF9FU007ICAgIA0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgIHJldHVybiAweGZmOw0KLSAgICB9DQotfQ0KLQ0KLUJPT0wgekF0aV9TYXZlTGFzdENpZFRhYihVSU5UOCBpQ2lkLCBVSU5UOCBjaG5lbElkKQ0KLXsNCi0gICAgQllURSBpID0gMDsNCi0gICAgQllURSBiSW5zdGFuY2UgPSB6QXRpX0dldFRhc2tJbnN0YW50QnlDaG5sSWQoY2huZWxJZCk7DQotDQotICAgIGlmKGlDaWQgPT0gMCB8fCBjaG5lbElkID09IDApDQotICAgIHsNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLQ0KLSAgICBmb3IoaSA9IDA7IGkgPCBaQVRJMl9TTV9NQVhfU01DSURfTlVNOyBpKyspDQotICAgIHsNCi0gICAgICAgIGlmKGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2ldLmNobmVsSWQgPT0gY2huZWxJZA0KLSAgICAgICAgICAgIHx8Z196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaV0uaUNpZCA9PSBpQ2lkKSAvKiDV0rW90tTHsLXEICovDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaV0uaXNOZGlzICYmIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2ldLmlzVXNlZCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgek9zc19NZW1zZXQoJmdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2ldLCAwLCBzaXplb2YoVF9aQXRpX0xhc3RDaWRUYWIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgZ196QXRpX1NtQ29udGV4dFtiSW5zdGFuY2VdLmxhc3RDaWRUYWJbaUNpZCAtIDFdLmNobmVsSWQgPSBjaG5lbElkOw0KLSAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQ2lkIC0gMV0uaUNpZCA9IGlDaWQ7DQotICAgIGdfekF0aV9TbUNvbnRleHRbYkluc3RhbmNlXS5sYXN0Q2lkVGFiW2lDaWQgLSAxXS5pc1VzZWQgPSBUUlVFOw0KLSAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQ2lkIC0gMV0uaXNQcHAgPSBUUlVFOw0KLSAgICBnX3pBdGlfU21Db250ZXh0W2JJbnN0YW5jZV0ubGFzdENpZFRhYltpQ2lkIC0gMV0uaXNQcHBBY3RDbXBsZXRlID0gVFJVRTsNCi0gICAgcmV0dXJuIFRSVUU7DQotfQ0KLQ0KLQ0KLXN0YXRpYyBWT0lEIF9fcHNfNGdfZnVuYyB6QXRpX1NhdmVPbmx5Q2lkVGFiKEJZVEUgYkNpZCwgQllURSBiRXhDaWQsIEJZVEUgYkV4UGRwVHlwZSkNCi17ICAgIA0KLSAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkIC0gMV0uaUNpZCA9IGJDaWQ7DQotICAgIGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWQgLSAxXS5leHRBY3RDaWQgPSBiRXhDaWQ7DQotICAgIGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWQgLSAxXS5leHRQZHBUeXBlID0gYkV4UGRwVHlwZTsgICAgICAgICAgIA0KLSAgICBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQ2lkIC0gMV0uaXNVc2VkID0gVFJVRTsNCi0gICAgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZCAtIDFdLmlzTmRpcyA9IEZBTFNFOw0KLSAgICByZXR1cm47DQotfQ0KLQ0KLQ0KLS8qIDYxNzAwMTU5MTQxMSChvtbHxNy7+tDox/Ohvy0g1sfE3Lv60OjH81YzsOaxvs2ssr3Ktc/WKi8NCi1VSU5UOCB6QXRpMl9CbEdldENobmxTcnZNb2RlKFVJTlQ4IGlDaG5lbElkKQ0KLXsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwdENobmxOb2RlID0gekF0aV9HZXRDaGFubmVsTm9kZVB0cihpQ2huZWxJZCk7DQotDQotICAgIGlmICghcHRDaG5sTm9kZSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0NIQU5ORUxfU1JWX01PREVfSU5WQUw7DQotICAgIH0NCi0gICAgZWxzZSBpZiAocHRDaG5sTm9kZS0+c2VydmVyX21vZGUgPT0gWkFUSTJfQ0hBTk5FTF9NT0RFX0NNRCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0NIQU5ORUxfU1JWX01PREVfQ01EOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0NIQU5ORUxfU1JWX01PREVfREFUQTsNCi0gICAgfQ0KLX0NCi0NCi0vKiA2MTcwMDE1OTE0MTEgob7Wx8Tcu/rQ6Mfzob8tINbHxNy7+tDox/NWM7Dmsb7NrLK9yrXP1iovDQotLy8gNjE3MDAyNTMyNDEwo7pbNzUxMMqhteddelBTX3VtbV9Jc0xvc3NPZkNvdmVyYWdlus16QXRpMl9Qc0lzSW5GbHlNb2RlvdO/2rHkuPwNCi1CT09MIHpBdGkyX1BzSXNJbkZseU1vZGUoVk9JRCkNCi17DQotICAgIGlmKHpBdGlfSXNTaW5nbGVDYXJkRm9yT25lU3RhbmRieSgpKQ0KLSAgICB7DQotICAgICAgICAvL3JldHVybiBnX3pBdGlfYXREYXRhRXhbZ196QXRpX0N1ckluc3RhbmNlXS50RnVuLmJGdW5WYWwgPT0gWl9BUE1NSUFfQ0ZVTkZVTl9ESVNCT1RIUkY7DQotICAgICAgICBpZih6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMCkgIT0gWk9TU19JTlZBTElEX1RBU0tfSUQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS50RnVuLmJGdW5WYWwgPT0gWl9BUE1NSUFfQ0ZVTkZVTl9ESVNCT1RIUkY7ICANCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLnRGdW4uYkZ1blZhbCA9PSBaX0FQTU1JQV9DRlVORlVOX0RJU0JPVEhSRjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0jaWYgZGVmaW5lZCAoRFVBTF9DQVJEX0RVQUxfU1RBTkRCWSkgfHwgZGVmaW5lZCAoX09TX1dJTikNCi0gICAgICAgIHJldHVybiAoZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLnRGdW4uYkZ1blZhbCA9PSBaX0FQTU1JQV9DRlVORlVOX0RJU0JPVEhSRiAmJiANCi0gICAgICAgICAgICAgICAgICAgICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLnRGdW4uYkZ1blZhbCA9PSBaX0FQTU1JQV9DRlVORlVOX0RJU0JPVEhSRikgDQotICAgICAgICAgICAgICAgIHx8IChnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udEZ1bi5iRnVuVmFsID09IFpfQVBNTUlBX0NGVU5GVU5fRElTQk9USFJGICYmIA0KLSAgICAgICAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl0udEZ1bi5iRnVuVmFsID09IFpfQVBNTUlBX0NGVU5GVU5fTUlOSUZVTikgDQotICAgICAgICAgICAgICAgIHx8IChnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMl0udEZ1bi5iRnVuVmFsID09IFpfQVBNTUlBX0NGVU5GVU5fRElTQk9USFJGICYmIA0KLSAgICAgICAgICAgICAgICAgICAgICBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udEZ1bi5iRnVuVmFsID09IFpfQVBNTUlBX0NGVU5GVU5fTUlOSUZVTik7DQotI2Vsc2UNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0jZW5kaWYNCi0gICAgfSAgICANCi19DQotLy8gNjE2MDAwNTA1NDIxo7rKobXn0OjH86OszOG5qcO7v6rJ5Ma1vdO/2g0KLUJPT0wgekF0aTJfUHNSZk5vdE9wZW4oVk9JRCkNCi17DQotICAgIGlmKHpBdGlfSXNTaW5nbGVDYXJkRm9yT25lU3RhbmRieSgpKQ0KLSAgICB7DQotICAgICAgICBpZih6RGV2X0dldFRhc2tJZChaX0FUSV9UQVNLSURfVUlDQywgMCkgIT0gWk9TU19JTlZBTElEX1RBU0tfSUQpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18xXS50RnVuLmJGdW5WYWwgPT0gWl9BUE1NSUFfQ0ZVTkZVTl9NSU5JRlVOOyAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS50RnVuLmJGdW5WYWwgPT0gWl9BUE1NSUFfQ0ZVTkZVTl9NSU5JRlVOOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIChnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udEZ1bi5iRnVuVmFsID09IFpfQVBNTUlBX0NGVU5GVU5fTUlOSUZVTiAmJiANCi0gICAgICAgICAgICAgICAgZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLnRGdW4uYkZ1blZhbCA9PSBaX0FQTU1JQV9DRlVORlVOX01JTklGVU4pOw0KLSAgICB9ICAgIA0KLX0NCi0NCi1WT0lEIF9fcHNfNGdfZnVuYyB6QXRpX1NtR2V0SXBEbnNBZGRyKEJZVEUgYkRuc0FkZHJUeXBlLCBCWVRFIGJEbnNBZGRybGVuLEJZVEUgYkJ1ZkxlbiwgUEJZVEUgcGJQcm90QnVmLCBQQllURSBwYkRuc0FkZHIpDQotew0KLSAgICBCWVRFICBiUHJvdENvbklkeCAgID0gMDsNCi0gICAgQllURSAgYlByb3RDb24gICAgICAgICAgPSAwOw0KLSAgICBCWVRFICBiRG5zRmllbGRMZW4gICAgPTA7DQotICAgIA0KLSAgICBmb3IoYlByb3RDb25JZHggPSA0OyBiUHJvdENvbklkeCA8IGJCdWZMZW47KQ0KLSAgICB7DQotICAgICAgICBiUHJvdENvbiA9ICoocGJQcm90QnVmICsgYlByb3RDb25JZHgpOw0KLSAgICAgICAgYkRuc0ZpZWxkTGVuID0gKihwYlByb3RCdWYgKyBiUHJvdENvbklkeCArIDEpOw0KLSAgICAgICAgaWYoYkRuc0ZpZWxkTGVuIDwgMikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpZiAoKGJQcm90Q29uID09IGJEbnNBZGRyVHlwZSkgJiYgKGJCdWZMZW4gPj0gYkRuc0ZpZWxkTGVuICsgNCkNCi0gICAgICAgICAgICAmJihiRG5zRmllbGRMZW4gPj0gYkRuc0FkZHJsZW4gKzIpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHBiRG5zQWRkciwgcGJQcm90QnVmICsgYlByb3RDb25JZHggKyAyLCBiRG5zQWRkcmxlbik7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYlByb3RDb25JZHggKz0gYkRuc0ZpZWxkTGVuOw0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9TbUdldElwRG5zRnJvbVBjb1Byb3RMaXN0KFRfWkF0aV9TbUlwRG5zSW5mbyogcGJEbnNJbmZvLCBUX3pNbWlhU21fUGNvSW5mbyAqcGNvSW5mbywgQllURSBQZHBUeXBlKQ0KLXsNCi0gICAgQllURSBiUHJvdElkeCA9IDA7DQotICAgIFRfek1taWFTbV9Db250YWluZXIgKnB0UHJvdExpc3QgICAgICAgPSBaT1NTX05VTEw7DQotICAgIEJZVEUgYklzUHJpbWFyeURucyA9IFpfSU5WQUxJRDsNCi0NCi0gICAgZm9yKGJQcm90SWR4ID0gMDtiUHJvdElkeCA8IFpfTU1JQVNNX1BDT19QUk9UX0lURU1fTUFYX05VTTsgYlByb3RJZHgrKykNCi0gICAgew0KLSAgICAgICAgcHRQcm90TGlzdCA9IHBjb0luZm8tPmF0UHJvdExpc3QgKyBiUHJvdElkeDsNCi0gICAgICAgIGlmKFBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNCAmJiBwdFByb3RMaXN0LT53SWQgPT0gWl9BVElfUFJPVE9DT0xJRF9JUENQKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfU21HZXRJcERuc0FkZHIoWl9BVElfUFJJTUROU1NFUl9BRERSLFpBVEkyX1NNX0lQVjRfUERQQUREUl9MRU4scGNvSW5mby0+YXRQcm90TGlzdFtiUHJvdElkeF0uYkxlbixwY29JbmZvLT5hdFByb3RMaXN0W2JQcm90SWR4XS5hYkJ1ZixwYkRuc0luZm8tPmlQcmltYXJ5RG5zKTsNCi0gICAgICAgICAgICB6QXRpX1NtR2V0SXBEbnNBZGRyKFpfQVRJX1NFQ01ETlNTRVJfQUREUixaQVRJMl9TTV9JUFY0X1BEUEFERFJfTEVOLHBjb0luZm8tPmF0UHJvdExpc3RbYlByb3RJZHhdLmJMZW4scGNvSW5mby0+YXRQcm90TGlzdFtiUHJvdElkeF0uYWJCdWYscGJEbnNJbmZvLT5pU2Vjb25kYXJ5RG5zKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBmb3IoYlByb3RJZHggPSAwO2JQcm90SWR4IDwgWl9NTUlBU01fUENPX1BBUkFfSVRFTV9NQVhfTlVNOyBiUHJvdElkeCsrKQ0KLSAgICB7DQotICAgICAgICBwdFByb3RMaXN0ID0gcGNvSW5mby0+YXRBZGRQYXJhTGlzdCArIGJQcm90SWR4Ow0KLSAgICAgICAgDQotICAgICAgICBpZihQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQgJiYgcHRQcm90TGlzdC0+d0lkID09IDEzICYmIChiSXNQcmltYXJ5RG5zID09IFpfSU5WQUxJRCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgek9zc19NZW1jcHkocGJEbnNJbmZvLT5pUHJpbWFyeURucywgcGNvSW5mby0+YXRBZGRQYXJhTGlzdFtiUHJvdElkeF0uYWJCdWYsIFpBVEkyX1NNX0lQVjRfUERQQUREUl9MRU4pOw0KLSAgICAgICAgICAgIGJJc1ByaW1hcnlEbnMgPSBaX1ZBTElEOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZihQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQgJiYgcHRQcm90TGlzdC0+d0lkID09IDEzICYmIChiSXNQcmltYXJ5RG5zID09IFpfVkFMSUQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHBiRG5zSW5mby0+aVNlY29uZGFyeURucywgcGNvSW5mby0+YXRBZGRQYXJhTGlzdFtiUHJvdElkeF0uYWJCdWYsIFpBVEkyX1NNX0lQVjRfUERQQUREUl9MRU4pOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybjsNCi19DQotc3RhdGljIFZPSUQgX19wc180Z19mdW5jIHpBdGlfU21TYXZlSXB2NEFkZHIoVF9aQXRpX1NtSXBEbnNJbmZvKiBwQWRkciwgVF96TW1pYVNtX1BkcEFkZHIgKnBkcEFkZHIsIFRfek1taWFTbV9QY29JbmZvICpwY29JbmZvKQ0KLXsNCi0gICAgek9zc19NZW1zZXQocEFkZHItPmlHYXRlV2F5LCAwLCBaQVRJMl9TTV9NQVhfUERQQUREUl9MRU4pOw0KLSAgICB6T3NzX01lbWNweShwQWRkci0+aVBkcEFkZHIsIHBkcEFkZHItPmFiSVB2NEFkZHIsIFpBVEkyX1NNX0lQVjRfUERQQUREUl9MRU4pOw0KLSAgICB6QXRpX1NtR2V0SXBEbnNGcm9tUGNvUHJvdExpc3QocEFkZHIsIHBjb0luZm8sWl9BUE1NSUFfU01fSVBWNCk7DQotICAgIHJldHVybjsNCi19DQotDQotVk9JRCB6QXRpX1NtU2F2ZUlwdjZEbnNBZGRyKFRfWkF0aV9TbUlwRG5zSW5mbyogcEFkZHIsIFRfek1taWFTbV9QZHBBZGRyICpwZHBBZGRyLFRfek1taWFTbV9QY29JbmZvICpwY29JbmZvLCBCT09MIGJOZWVkQWRkSXB2NCkNCi17DQotICAgIEJZVEUgYklkeCA9IDA7DQotICAgIEJZVEUgYklzUHJpbWFyeURucyA9IFpfSU5WQUxJRDsNCi0gICAgQllURSBiT2ZmU2V0ID0gKGJOZWVkQWRkSXB2NCA9PSBUUlVFKT8gWkFUSTJfU01fSVBWNF9QRFBBRERSX0xFTiA6IDA7DQotICAgIA0KLSAgICB6T3NzX01lbWNweShwQWRkci0+aVBkcEFkZHIgKyBiT2ZmU2V0LCBwZHBBZGRyLT5hYklQdjZBZGRyLCBaX01NSUFTTV9JUFY2X0FERFJfTUFYX0xFTik7DQotDQotICAgIGZvciAoYklkeCA9IDA7IGJJZHggPCBaX01NSUFTTV9QQ09fUFJPVF9JVEVNX01BWF9OVU07IGJJZHgrKykNCi0gICAgew0KLSAgICAgICAgaWYocGNvSW5mby0+YXRQcm90TGlzdFtiSWR4XS53SWQgPT0gMHg4MDU3KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpBdGlfU21HZXRJcERuc0FkZHIoWl9BVElfUFJJTUROU1NFUl9BRERSLFpBVEkyX1NNX0lQVjZfUERQQUREUl9MRU4scGNvSW5mby0+YXRQcm90TGlzdFtiSWR4XS5iTGVuLHBjb0luZm8tPmF0UHJvdExpc3RbYklkeF0uYWJCdWYscEFkZHItPmlQcmltYXJ5RG5zK2JPZmZTZXQpOw0KLSAgICAgICAgICAgIHpBdGlfU21HZXRJcERuc0FkZHIoWl9BVElfU0VDTUROU1NFUl9BRERSLFpBVEkyX1NNX0lQVjZfUERQQUREUl9MRU4scGNvSW5mby0+YXRQcm90TGlzdFtiSWR4XS5iTGVuLHBjb0luZm8tPmF0UHJvdExpc3RbYklkeF0uYWJCdWYscEFkZHItPmlTZWNvbmRhcnlEbnMrYk9mZlNldCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGZvciAoYklkeCA9IDA7IGJJZHggPCBaX01NSUFTTV9QQ09fUEFSQV9JVEVNX01BWF9OVU07IGJJZHgrKykNCi0gICAgew0KLSAgICAgICAgaWYoKHBjb0luZm8tPmF0QWRkUGFyYUxpc3RbYklkeF0ud0lkID09IFpfQVRJX0FERFBBUkFJRF9JUFY2RE5TKSAmJiAoYklzUHJpbWFyeURucyA9PSBaX0lOVkFMSUQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHBBZGRyLT5pUHJpbWFyeURucyArIGJPZmZTZXQsIHBjb0luZm8tPmF0QWRkUGFyYUxpc3RbYklkeF0uYWJCdWYsIFpBVEkyX1NNX0lQVjZfUERQQUREUl9MRU4pOw0KLSAgICAgICAgICAgIGJJc1ByaW1hcnlEbnMgPSBaX1ZBTElEOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZigocGNvSW5mby0+YXRBZGRQYXJhTGlzdFtiSWR4XS53SWQgPT0gWl9BVElfQUREUEFSQUlEX0lQVjZETlMpICYmIChiSXNQcmltYXJ5RG5zID09IFpfVkFMSUQpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHpPc3NfTWVtY3B5KHBBZGRyLT5pU2Vjb25kYXJ5RG5zICsgYk9mZlNldCwgcGNvSW5mby0+YXRBZGRQYXJhTGlzdFtiSWR4XS5hYkJ1ZiwgWkFUSTJfU01fSVBWNl9QRFBBRERSX0xFTik7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi1zdGF0aWMgVk9JRCB6QXRpX1NtU2F2ZUlwdjZBZGRyQWZ0ZXJJcHY0KFRfWkF0aV9TbUlwRG5zSW5mbyogcEFkZHIsIFRfek1taWFTbV9QZHBBZGRyICpwZHBBZGRyLCBUX3pNbWlhU21fUGNvSW5mbyAqcGNvSW5mbykNCi17DQotICAgIHpBdGlfU21TYXZlSXB2NkRuc0FkZHIocEFkZHIsIHBkcEFkZHIscGNvSW5mbywgVFJVRSk7DQotICAgIHJldHVybjsNCi19DQotDQotVk9JRCBfX3BzXzRnX2Z1bmMgekF0aV9TbVNhdmVJcEFkZHIoVF9aQXRpX1NtSXBEbnNJbmZvKiBwQWRkciwgVF96TW1pYVNtX1BkcEFkZHIgKnBkcEFkZHIsIFRfek1taWFTbV9QY29JbmZvICpwY29JbmZvKQ0KLXsNCi0gICAgaWYocEFkZHItPmlQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQpDQotICAgIHsNCi0gICAgICAgIHpBdGlfU21TYXZlSXB2NEFkZHIocEFkZHIsIHBkcEFkZHIsIHBjb0luZm8pOw0KLSAgICB9DQotICAgIGVsc2UgaWYocEFkZHItPmlQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjRWNikNCi0gICAgew0KLSAgICAgICAgekF0aV9TbVNhdmVJcHY0QWRkcihwQWRkciwgcGRwQWRkciwgcGNvSW5mbyk7DQotICAgICAgICB6QXRpX1NtU2F2ZUlwdjZBZGRyQWZ0ZXJJcHY0KHBBZGRyLCBwZHBBZGRyLCBwY29JbmZvKTsNCi0gICAgfQ0KLSAgICBlbHNlIGlmKHBBZGRyLT5pUGRwVHlwZSA9PSBaX0FQTU1JQV9TTV9JUFY2KQ0KLSAgICB7DQotICAgICAgICB6T3NzX01lbXNldChwQWRkci0+aUdhdGVXYXksIDAsIFpBVEkyX1NNX01BWF9QRFBBRERSX0xFTik7DQotICAgICAgICAvKrvxyKFJUFY2tcRETlMqLw0KLSAgICAgICAgekF0aV9TbVNhdmVJcHY2RG5zQWRkcihwQWRkciwgcGRwQWRkcixwY29JbmZvLCBGQUxTRSk7DQotICAgIH0NCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1CT09MIF9fcHNfNGdfZnVuYyB6QXRpX1NtR2V0UGRwQWRkckJ5Q2lkKFVJTlQ4IGlDaWQsIFRfWkF0aV9TbUlwRG5zSW5mbyogcEFkZHIsIEJZVEUgYkV4dEFjdENpZCwgQllURSBiSW5zTm8pDQotew0KLSAgICBUX3pNbWlhU21fUGRwQWRkciAgICAgICpwdFBkcEFkZHIgPSAoVF96TW1pYVNtX1BkcEFkZHIqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9QZHBBZGRyKSk7ICANCi0gICAgVF96TW1pYVNtX1Bjb0luZm8gICAgICAqcHRQY29JbmZvID0gKFRfek1taWFTbV9QY29JbmZvKil6QXRpX0dldFVCKHNpemVvZihUX3pNbWlhU21fUGNvSW5mbykpOw0KLQ0KLSAgICBpZihiRXh0QWN0Q2lkKQ0KLSAgICB7DQotICAgICAgICBUX3pNbWlhU21fUGRwQWRkciAgICAgICAgICAgICAgICAgICAgIHRQZHBBZGRyRXh0ID0gezB9OyAgDQotICAgICAgICBUX3pNbWlhU21fUGNvSW5mbyAgICpwdFBjb0luZm9FeHQgPSAoVF96TW1pYVNtX1Bjb0luZm8qKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9QY29JbmZvKSk7DQotDQotICAgICAgICBpZih6QXRpX0dldFBkcEluZm9CeUNpZChpQ2lkLCBwdFBkcEFkZHIsIHB0UGNvSW5mbywgYkluc05vKSAmJiB6QXRpX0dldFBkcEluZm9CeUNpZCgoVUlOVDgpYkV4dEFjdENpZCwgJnRQZHBBZGRyRXh0LCBwdFBjb0luZm9FeHQsIGJJbnNObykpDQotICAgICAgICB7DQotICAgICAgICAgICAgcEFkZHItPmlQZHBUeXBlID0gWl9BUE1NSUFfU01fSVBWNFY2Ow0KLSAgICAgICAgICAgIHBBZGRyLT5pQ2lkID0gaUNpZDsNCi0gICAgICAgICAgICBpZihwdFBkcEFkZHItPmJQZHBUeXBlID09IFpfQVBNTUlBX1NNX0lQVjQgJiYgdFBkcEFkZHJFeHQuYlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfU21TYXZlSXB2NEFkZHIocEFkZHIsIHB0UGRwQWRkciwgcHRQY29JbmZvKTsNCi0gICAgICAgICAgICAgICAgekF0aV9TbVNhdmVJcHY2QWRkckFmdGVySXB2NChwQWRkciwgJnRQZHBBZGRyRXh0LCBwdFBjb0luZm9FeHQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmKHB0UGRwQWRkci0+YlBkcFR5cGUgPT0gWl9BUE1NSUFfU01fSVBWNiAmJiB0UGRwQWRkckV4dC5iUGRwVHlwZSA9PSBaX0FQTU1JQV9TTV9JUFY0KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgekF0aV9TbVNhdmVJcHY0QWRkcihwQWRkciwgJnRQZHBBZGRyRXh0LCBwdFBjb0luZm9FeHQpOw0KLSAgICAgICAgICAgICAgICB6QXRpX1NtU2F2ZUlwdjZBZGRyQWZ0ZXJJcHY0KHBBZGRyLCBwdFBkcEFkZHIsIHB0UGNvSW5mbyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQZHBBZGRyKTsNCi0gICAgICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFBjb0luZm8pOw0KLSAgICAgICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZwdFBjb0luZm9FeHQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQZHBBZGRyKTsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGNvSW5mbyk7DQotICAgICAgICAgICAgekF0aV9SZXRVQigoVk9JRCAqKikmcHRQY29JbmZvRXh0KTsNCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgICAgIH0NCi0gICAgICAgIHpBdGlfUmV0VUIoKFZPSUQgKiopJnB0UGNvSW5mb0V4dCk7DQotICAgIH0NCi0gICAgaWYoekF0aV9HZXRQZHBJbmZvQnlDaWQoaUNpZCwgcHRQZHBBZGRyLCBwdFBjb0luZm8sIGJJbnNObykpIC8qINLRvq28pLvuKi8NCi0gICAgew0KLSAgICAgICAgcEFkZHItPmlQZHBUeXBlID0gcHRQZHBBZGRyLT5iUGRwVHlwZTsNCi0gICAgICAgIHBBZGRyLT5pQ2lkID0gaUNpZDsNCi0gICAgICAgIHpBdGlfU21TYXZlSXBBZGRyKHBBZGRyLCBwdFBkcEFkZHIsIHB0UGNvSW5mbyk7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGRwQWRkcik7DQotICAgICAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGNvSW5mbyk7DQotICAgICAgICByZXR1cm4gVFJVRTsNCi0gICAgfQ0KLSAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGRwQWRkcik7DQotICAgIHpBdGlfUmV0VUIoKFZPSUQqKikmcHRQY29JbmZvKTsNCi0gICAgcmV0dXJuIEZBTFNFOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9Jc0F0Q2hSZWFkeQ0KLSoguabE3MPoyvYgOiDIt8jP1ri2qM2otcDXtMysDQotKiCyzsr9y7XD9yA6IChJTimjug0KLSogICAgICAgICAgICBjaElEICAgICDNqLXASUQNCi0qICAgICAgICAgICAgKE9VVCmjus7eDQotKiC3tSC72CDWtSA6IM2otcC/ydPDt7W72E9LLLfx1PK3tbvYRkFMU0UNCi0qIMbky/zLtcP3IDogzOG5qbj408O7p7e9uq/K/b3Tv9oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CT09MICB6QXRpMl9Jc0F0Q2hSZWFkeShVSU5UOCBjaElEKQ0KLXsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICpwQ2huZWxOb2RlID0gekF0aV9HZXRDaGFubmVsTm9kZVB0cihjaElEKTsNCi0gICAgaWYocENobmVsTm9kZSAhPSBOVUxMIA0KLSAgICAgICAgJiYgcENobmVsTm9kZS0+Y21kX2lkID09IFpBVDJfTk9fQ09NTUFORCANCi0gICAgICAgICYmIHBDaG5lbE5vZGUtPmNtZF9vcCA9PSBaQVQyX0NPX0lOVkFMSUQpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBUUlVFOw0KLSAgICB9DQotICAgIHJldHVybiBGQUxTRTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGOiB6QXRpX0VVbWNyQmFuZDM5SW5mb0luZA0KLbqvyv25psTcOiANCi0gICAgICAgICAgVU1DUi9FVU1DUs2o1qpBVEnKx7fx09BCMzmz9s/WDQotyuQgICAgyOs6IHBCdWZmLA0KLcrkICAgILP2o7rO3g0KLbe1ICAgILvYo7rO3g0KLdeiICAgIMrNo7oNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi3Q3rjEyNXG2iAgICAgICAgsOaxviAgICAgICAg0N64xMjLICAgICAgICDQ3rjE1K3S8rywxNrI3SAgICAgDQotMDkuMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCB6QXRpX0VVbWNyQmFuZDM5SW5mb0luZChWT0lEKiBwQnVmZikNCi17DQotICAgIEJZVEUgYkluc0N1ck5vID0gZ196QXRpX0N1ckluc3RhbmNlOw0KLSAgICBUX3pNbWlhQXNfQmFuZDM5X0luZm9fSW5kICAqcHRCYW5kMzlJbmZvSW5kID0gKFRfek1taWFBc19CYW5kMzlfSW5mb19JbmQqKXBCdWZmOw0KLSAgICBUX3pNbWlhQXNfQmFuZDM5X0luZm9fUmVxICpwdEJhbmQzOUluZm9SZXEgPSAoVF96TW1pYUFzX0JhbmQzOV9JbmZvX1JlcSopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYUFzX0JhbmQzOV9JbmZvX1JlcSkpOw0KLQ0KLSAgICBwdEJhbmQzOUluZm9SZXEtPmJCYW5kMzlJbmZvID0gcHRCYW5kMzlJbmZvSW5kLT5iQmFuZDM5SW5mbzsNCi0NCi0gICAgZ196QXRpX0N1ckluc3RhbmNlID0gKGdfekF0aV9DdXJJbnN0YW5jZSA9PSBaX0FUSV9JTlNOT18xKT8gMSA6IDA7DQotICAgIHpBdGlfTXNnU2VuZChNTUlBX0FTX0IzOV9JTkZPX1JFUV9FViwgKFBCWVRFKXB0QmFuZDM5SW5mb1JlcSwgc2l6ZW9mKFRfek1taWFBc19CYW5kMzlfSW5mb19SZXEpLCBaX0FUSV9UQVNLSURfR1JSKTsNCi0gICAgZ196QXRpX0N1ckluc3RhbmNlID0gYkluc0N1ck5vOw0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8YgICAgOnpBdGlfQ2hhbmdlU3ViQWN0TWFjcm8NCi0quq/K/bmmxNwgICAgOrD+wOvQrdLp1bvIq77W0+vN4rK/vdO/2re1u9jWtdauvOQNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILXEudjPtbz1ydnx7rrPDQotKsbky/vLtcP3ICAgIDo2MTcwMDI4MDU5MjcvNjE2MDAwMjM3NzExzfjC57HqyrZIK7XEz9TKvtans9YNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgekF0aV9DaGFuZ2VTdWJBY3RNYWNybyhCWVRFIGJTdWJNb2RlKQ0KLXsNCi0gICAgQllURSBiUmV0dXJuU3ViQWN0ID0gMHhmZjsNCi0NCi0gICAgc3dpdGNoKGJTdWJNb2RlKQ0KLSAgICB7DQotICAgICAgICBjYXNlIFpfU1VCTU9ERV9OT1NFUlZFOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSAwOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfR1NNOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSAxOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfR1BSUzoNCi0gICAgICAgICAgICBiUmV0dXJuU3ViQWN0ID0gMjsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWl9TVUJNT0RFX0VER0U6DQotICAgICAgICAgICAgYlJldHVyblN1YkFjdCA9IDM7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFpfU1VCTU9ERV9XQ0RNQToNCi0gICAgICAgICAgICBiUmV0dXJuU3ViQWN0ID0gNDsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgWl9TVUJNT0RFX0hTRFBBOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSA1Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfSFNVUEE6DQotICAgICAgICAgICAgYlJldHVyblN1YkFjdCA9IDY7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFpfU1VCTU9ERV9EUEFfVVBBOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSA3Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfVEQ6DQotICAgICAgICAgICAgYlJldHVyblN1YkFjdCA9IDg7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFpfU1VCTU9ERV9MVEVfVEREOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSA5Ow0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfTFRFX0ZERDoNCi0gICAgICAgICAgICBiUmV0dXJuU3ViQWN0ID0gMTA7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFpfU1VCTU9ERV9MVEU6DQotICAgICAgICAgICAgYlJldHVyblN1YkFjdCA9IDExOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfRFBBT1JVUEE6DQotICAgICAgICAgICAgYlJldHVyblN1YkFjdCA9IDEyOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSBaX1NVQk1PREVfSFNQQV9QTFVTOg0KLSAgICAgICAgICAgIGJSZXR1cm5TdWJBY3QgPSAxMzsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgYnJlYWs7DQotICAgIH0NCi0gICAgcmV0dXJuIGJSZXR1cm5TdWJBY3Q7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLbqvyv3D+7PGICAgICAgOnpBdF9HZXRDdXJybnRBY3QNCi26r8r9uabE3CAgICAgIDrM4bmpuPiy+sa3z9+78cih0K3S6dW7tbHHsNbGyr0NCi3K5Mjrss7K/SAgICAgIDrO3g0KLcrks/ayzsr9ICAgICAgOs7eDQott7W72CDWtSAgICAgIDpCWVRFIC21scew0K3S6dW719PWxsq9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMCAgICDO3rf+zvEgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMSAgICBHU03Eo8q9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTIgICAgR1BSU8Sjyr0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpMyAgICBFREdFxKPKvSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk0ICAgIFdDRE1BxKPKvSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk1ICAgIEhTRFBBxKPKvSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk2ICAgIEhTVVBBxKPKvSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSk3ICAgIEhTVVBBus1IU0RQQcSjyr0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOCAgICBURF9TQ0RNQcSjyr0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJZVEUpOSAgICBMVEXEo8q9VEREIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCWVRFKTEwICAgTFRFxKPKvSBGREQNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMSAgIExURcSjyr0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQllURSkxMiAgICBIU0RQQbvy1d9IU1VQQcSjyr0gDQotNjE3MDAxODI2NTQ1TFRFILL6xrfP39Dox/MNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIHpBdF9HZXRDdXJybnRBY3QoVk9JRCkNCi17DQotICAgIEJZVEUgYlN1Yk1vZGUgPSAweGZmOw0KLSAgICAvKrK71qez1sG9tP22vNPQsqa6xbXEx+m/9iovDQotICAgIGlmKHpBdGlfSXNDaWRBY3RpdmVkU3RhbmQoWl9BVElfSU5TTk9fMSkpDQotICAgIHsNCi0gICAgICAgIGJTdWJNb2RlID0gZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzFdLnRDdXJyUGxtblBhcmEuYlN1Yk1vZGU7DQotICAgIH0NCi0gICAgZWxzZSBpZih6QXRpX0lzQ2lkQWN0aXZlZFN0YW5kKFpfQVRJX0lOU05PXzIpKQ0KLSAgICB7DQotICAgICAgICBiU3ViTW9kZSA9IGdfekF0aV9hdERhdGFFeFtaX0FUSV9JTlNOT18yXS50Q3VyclBsbW5QYXJhLmJTdWJNb2RlOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgYlN1Yk1vZGUgPSBnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udEN1cnJQbG1uUGFyYS5iU3ViTW9kZTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gekF0aV9DaGFuZ2VTdWJBY3RNYWNybyhiU3ViTW9kZSk7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0quq/K/cP7s8Y6ekF0aV9Jc1NhbWVPcGVyUGxtbg0KLSq6r8r9uabE3DrF0LbPyse38c6qzazSu9TL06rJzLXEUExNTklEDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLUJZVEUgekF0aV9Jc1NhbWVPcGVyUGxtbihUX3pfUGxtbklkICpwdFBsbW5JZDEsIFRfel9QbG1uSWQgKnB0UGxtbklkMiwgQllURSBiSW5zTm8pDQotew0KLSAgICBUX3pBcE1taWFfTmV0TmFtZSB0UGxtbklkMUZ1bGwgPSB7MH07DQotICAgIFRfekFwTW1pYV9OZXROYW1lIHRQbG1uSWQyRnVsbCA9IHswfTsNCi0gICAgVF96QXBNbWlhX05ldE5hbWUgdFBsbW5JZDFTaG9ydCA9IHswfTsNCi0gICAgVF96QXBNbWlhX05ldE5hbWUgdFBsbW5JZDJTaG9ydCA9IHswfTsNCi0NCi0gICAgaWYoWl9JTlZBTElEID09IHpBdGlfSXNQbG1uSWRWYWxpZChwdFBsbW5JZDEpIHx8IFpfSU5WQUxJRCA9PSB6QXRpX0lzUGxtbklkVmFsaWQocHRQbG1uSWQyKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfSU5WQUxJRDsNCi0gICAgfQ0KLSAgICAvKrbMw/vP4LXI1PLIz86qysfNrNK71MvTqsnMKi8NCi0gICAgaWYoekF0X0dldE9wZXJOYW1lKFpfQVRJX09QRVJfTlVNVE9TSE9SVCwgcHRQbG1uSWQxLCAoVk9JRCopJnRQbG1uSWQxU2hvcnQsIGJJbnNObykgJiYNCi0gICAgICAgIHpBdF9HZXRPcGVyTmFtZShaX0FUSV9PUEVSX05VTVRPU0hPUlQsIHB0UGxtbklkMiwgKFZPSUQqKSZ0UGxtbklkMlNob3J0LCBiSW5zTm8pKQ0KLSAgICB7DQotICAgICAgICBpZih0UGxtbklkMVNob3J0LmJMZW4gPT0gdFBsbW5JZDJTaG9ydC5iTGVuICYmDQotICAgICAgICAgICAgekF0aV9NZW1jbXBTdHIodFBsbW5JZDFTaG9ydC5hYk5hbWUsIHRQbG1uSWQyU2hvcnQuYWJOYW1lLCB0UGxtbklkMlNob3J0LmJMZW4pKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiBaX1ZBTElEOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qs6TD+8/gtcjU8sjPzqrKx82s0rvUy9OqycwqLw0KLSAgICBpZih6QXRfR2V0T3Blck5hbWUoWl9BVElfT1BFUl9OVU1UT0xPTkcsIHB0UGxtbklkMSwgKFZPSUQqKSZ0UGxtbklkMUZ1bGwsIGJJbnNObykgJiYNCi0gICAgICAgIHpBdF9HZXRPcGVyTmFtZShaX0FUSV9PUEVSX05VTVRPTE9ORywgcHRQbG1uSWQyLCAoVk9JRCopJnRQbG1uSWQyRnVsbCwgYkluc05vKSkNCi0gICAgew0KLSAgICAgICAgaWYodFBsbW5JZDFGdWxsLmJMZW4gPT0gdFBsbW5JZDJGdWxsLmJMZW4gJiYNCi0gICAgICAgICAgICB6QXRpX01lbWNtcFN0cih0UGxtbklkMUZ1bGwuYWJOYW1lLCB0UGxtbklkMkZ1bGwuYWJOYW1lLCB0UGxtbklkMkZ1bGwuYkxlbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpfVkFMSUQ7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpfSU5WQUxJRDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX0lzQ21jY1BsbW5JZA0KLSq6r8r9uabE3DrF0LbPUExNTklEyse38c6q1tDSxs34wucNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNDbWNjUGxtbklkKFRfel9QbG1uSWQgKnB0UGxtbklkLCBCWVRFIGJJbnNObykNCi17DQotICAgIGlmKFpfT1BFUl9DTUNDID09IHpBdGlfR2V0T3BlckJ5UGxtbklkKHB0UGxtbklkLCBiSW5zTm8pKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWl9WQUxJRDsNCi0gICAgfQ0KLSAgICByZXR1cm4gWl9JTlZBTElEOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKrqvyv3D+7PGOnpBdGlfSXNDVFBsbW5JZA0KLSq6r8r9uabE3DrF0LbPUExNTklEyse38c6qtefQxc34wucNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfSXNDVFBsbW5JZChUX3pfUGxtbklkICpwdFBsbW5JZCwgQllURSBiSW5zTm8pDQotew0KLSAgICBpZihaX09QRVJfQ1RDQyA9PSB6QXRpX0dldE9wZXJCeVBsbW5JZChwdFBsbW5JZCwgYkluc05vKSkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfVkFMSUQ7DQotICAgIH0NCi0gICAgcmV0dXJuIFpfSU5WQUxJRDsNCi19DQotDQotQllURSBfX3BzX3N0YXRpY19mdW5jIHpBdGlfR2V0T3BlckJ5UGxtbklkKFRfel9QbG1uSWQgKnB0UGxtbklkLCBCWVRFIGJJbnNObykNCi17DQotICAgIFRfekFwTW1pYV9OZXROYW1lIHRTaG9ydE5hbWUgPSB7MH07DQotICAgIEJZVEUgYWJDbWNjW10gPSB7J0MnLCdNJywnQycsJ0MnfTsNCi0gICAgQllURSBhYkN0Y2NbXSA9IHsnQycsJ1QnfTsNCi0gICAgQllURSBhYlVuaWNvbVtdID0geydVJywnTicsJ0knLCdDJywnTycsJ00nfTsNCi0NCi0gICAgaWYoWl9JTlZBTElEID09IHpBdGlfSXNQbG1uSWRWYWxpZChwdFBsbW5JZCkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX09QRVJfT1RIRVI7DQotICAgIH0NCi0NCi0gICAgaWYoekF0X0dldE9wZXJOYW1lKFpfQVRJX09QRVJfTlVNVE9TSE9SVCwgcHRQbG1uSWQsIChWT0lEKikmdFNob3J0TmFtZSwgYkluc05vKSkNCi0gICAgew0KLSAgICAgICAgaWYodFNob3J0TmFtZS5iTGVuID09IHNpemVvZihhYkNtY2MpICYmDQotICAgICAgICAgICAgekF0aV9NZW1jbXBTdHIoYWJDbWNjLCB0U2hvcnROYW1lLmFiTmFtZSwgdFNob3J0TmFtZS5iTGVuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gWl9PUEVSX0NNQ0M7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHRTaG9ydE5hbWUuYkxlbiA9PSBzaXplb2YoYWJDdGNjKSAmJg0KLSAgICAgICAgICAgIHpBdGlfTWVtY21wU3RyKGFiQ3RjYywgdFNob3J0TmFtZS5hYk5hbWUsIHRTaG9ydE5hbWUuYkxlbikpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIFpfT1BFUl9DVENDOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZih0U2hvcnROYW1lLmJMZW4gPT0gc2l6ZW9mKGFiVW5pY29tKSAmJg0KLSAgICAgICAgICAgIHpBdGlfTWVtY21wU3RyKGFiVW5pY29tLCB0U2hvcnROYW1lLmFiTmFtZSwgdFNob3J0TmFtZS5iTGVuKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gWl9PUEVSX1VOSUNPTTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICByZXR1cm4gWl9PUEVSX09USEVSOw0KLX0NCi0NCi1CWVRFIHpBdGlfR2V0QXBwb2ludGVkT3BlclBsbW5CeU9wZXJOYW1lKEJZVEUgYk5hbWVGZywgQllURSAqcE5hbWUsIEJZVEUgKnBWYWwsIEJZVEUgYkluc05vKQ0KLXsNCi0gICAgVF96TW1pYVVtbV9PcGVyUGxtbiAqcHRQbG1uID0gKFRfek1taWFVbW1fT3BlclBsbW4qKXBWYWw7DQotICAgIHpPc3NfTWVtc2V0KHB0UGxtbiwgMHhmZiwgc2l6ZW9mKFRfek1taWFVbW1fT3BlclBsbW4pKTsNCi0gICAgcHRQbG1uLT5iTnVtID0gMDsNCi0NCi0gICAgaWYoc3RybGVuKChjb25zdCBjaGFyKilwTmFtZSkgPT0gMCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpfSU5WQUxJRDsNCi0gICAgfQ0KLQ0KLSAgICBzd2l0Y2goYk5hbWVGZykNCi0gICAgew0KLSAgICAgICAgY2FzZSBaX0FUSV9MT05HX05BTUU6DQotICAgICAgICAgICAgekF0aV9HZXRBcHBvaW50ZWRQbG1uSWRieUZ1bGxOYW1lKHBOYW1lLCBwdFBsbW4sIGJJbnNObyk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBjYXNlIFpfQVRJX1NIT1JUX05BTUU6DQotICAgICAgICAgICAgekF0aV9HZXRBcHBvaW50ZWRQbG1uSWRieVNob3J0TmFtZShwTmFtZSwgcHRQbG1uLCBiSW5zTm8pOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgfQ0KLQ0KLSAgICBpZihwdFBsbW4tPmJOdW0gPT0gMCB8fCBwdFBsbW4tPmJOdW0gPiBaX01BWF9PUEVSQVRFX1BMTU5OVU0pDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaX0lOVkFMSUQ7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIFpfVkFMSUQ7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSq6r8r9w/uzxjp6QXRpX0dldEFwcG9pbnRlZE9wZXJQbG1uYnlPcGVyUGxtbklkDQotKrqvyv25psTcOrj5vt3Su7j2UExNTklEu/HIoc2syvTSu7j21MvTqsnMtcRQTE1OSUQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1CWVRFIF9fcHNfc3RhdGljX2Z1bmMgekF0aV9HZXRBcHBvaW50ZWRPcGVyUGxtbkJ5T3BlclBsbW5JZChUX3pfUGxtbklkICpwdFBsbW5JZCwgQllURSAqcFZhbCwgQllURSBiSW5zTm8pDQotew0KLSAgICBCWVRFIGkgPSAwOw0KLSAgICBUX3pBcE1taWFfTmV0TmFtZSB0RnVsbE5hbWU7DQotICAgIFRfekFwTW1pYV9OZXROYW1lIHRTaG9ydE5hbWU7DQotICAgIFRfek1taWFVbW1fT3BlclBsbW4gKnB0UGxtbiA9IChUX3pNbWlhVW1tX09wZXJQbG1uKilwVmFsOw0KLQ0KLSAgICB6T3NzX01lbXNldCgmdEZ1bGxOYW1lLCAwLCBzaXplb2YoVF96QXBNbWlhX05ldE5hbWUpKTsNCi0gICAgek9zc19NZW1zZXQoJnRTaG9ydE5hbWUsIDAsIHNpemVvZihUX3pBcE1taWFfTmV0TmFtZSkpOw0KLSAgICB6T3NzX01lbXNldChwdFBsbW4sIDB4ZmYsIHNpemVvZihUX3pNbWlhVW1tX09wZXJQbG1uKSk7DQotICAgIHB0UGxtbi0+Yk51bSA9IDA7DQotDQotICAgIGlmKFpfSU5WQUxJRCA9PSB6QXRpX0lzUGxtbklkVmFsaWQocHRQbG1uSWQpKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWl9JTlZBTElEOw0KLSAgICB9DQotDQotICAgIHpBdGlfR2V0Q2FyZFBsbW5JbmZvKGJJbnNObyk7DQotICAgIC8qz8i78cihtszD+yy4+b7dtszD+7vxyKHNrNK71MvTqsnMtcRQTE1OSUQqLw0KLSAgICBpZih6QXRfR2V0T3Blck5hbWUoWl9BVElfT1BFUl9OVU1UT1NIT1JULCBwdFBsbW5JZCwgKFZPSUQqKSZ0U2hvcnROYW1lLCBiSW5zTm8pKQ0KLSAgICB7DQotICAgICAgICB6QXRpX0dldEFwcG9pbnRlZFBsbW5JZGJ5U2hvcnROYW1lKHRTaG9ydE5hbWUuYWJOYW1lLCBwdFBsbW4sIGJJbnNObyk7DQotICAgIH0NCi0NCi0gICAgaWYocHRQbG1uLT5iTnVtIDwgWl9NQVhfT1BFUkFURV9QTE1OTlVNKQ0KLSAgICB7DQotICAgICAgICBpZih6QXRfR2V0T3Blck5hbWUoWl9BVElfT1BFUl9OVU1UT0xPTkcsIHB0UGxtbklkLCAoVk9JRCopJnRGdWxsTmFtZSwgYkluc05vKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX0dldEFwcG9pbnRlZFBsbW5JZGJ5RnVsbE5hbWUodEZ1bGxOYW1lLmFiTmFtZSwgcHRQbG1uLCBiSW5zTm8pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qsenA+lVNTczhuam1xFBMTU5JRMrHt/HS0b6t1dK1vSzI57n7w7vV0rW9t8XU2r/Vz9C0piwNCi0gICAgICAgIMO709C/1c/QtcS+zbiyuMfX7rrz0ru49iovDQotICAgIGZvcihpID0gMDsgaSA8IHB0UGxtbi0+Yk51bTsgaSsrKQ0KLSAgICB7DQotICAgICAgICBpZihaX1ZBTElEID09IHpVbW1fSXNQbG1uSWRFcXVhbChwdFBsbW5JZCwgJnB0UGxtbi0+YWJPcGVyYXRlUGxtbltpXSwgYkluc05vKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gWl9WQUxJRDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBpZihwdFBsbW4tPmJOdW0gPCBaX01BWF9PUEVSQVRFX1BMTU5OVU0pDQotICAgIHsNCi0gICAgICAgIHB0UGxtbi0+YWJPcGVyYXRlUGxtbltwdFBsbW4tPmJOdW1dID0gKnB0UGxtbklkOw0KLSAgICAgICAgcHRQbG1uLT5iTnVtKys7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBwdFBsbW4tPmFiT3BlcmF0ZVBsbW5bWl9NQVhfT1BFUkFURV9QTE1OTlVNLTFdID0gKnB0UGxtbklkOw0KLSAgICB9DQotDQotICAgIHJldHVybiBaX1ZBTElEOw0KLX0NCi0NCi1WT0lEIHpBdGlfSGFuZGxlUHBwUHJvY0NtZEVycm9yKFZPSUQpDQoteyAgICANCi0gICAgQllURSBiQ2lkSW5kZXggPSAwOw0KLSAgICBCWVRFICBiQXRpTnVtID0gMDsNCi0gICAgVF9aQXRpX0NoYW5uZWxJbmZvICAqcENobmVsTm9kZSA9IE5VTEw7DQotDQotICAgIGZvcihiQXRpTnVtID0gMDsgYkF0aU51bSA8IFpBVEkyX1NNX01BWF9TTUNJRF9OVU07IGJBdGlOdW0rKykNCi0gICAgew0KLSAgICAgICAgaWYoZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkF0aU51bV0uaUNpZCAhPSAwDQotICAgICAgICAmJiBnX3pBdGlfU21Db250ZXh0W2dfekF0aV9DdXJJbnN0YW5jZV0ubGFzdENpZFRhYltiQXRpTnVtXS5pc1BwcA0KLSAgICAgICAgJiYgIWdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JBdGlOdW1dLmlzUHBwQWN0Q21wbGV0ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBiQ2lkSW5kZXggPSBiQXRpTnVtOw0KLSAgICAgICAgICAgIHBDaG5lbE5vZGUgPSB6QXRpX0dldENoYW5uZWxOb2RlUHRyKGdfekF0aV9TbUNvbnRleHRbZ196QXRpX0N1ckluc3RhbmNlXS5sYXN0Q2lkVGFiW2JDaWRJbmRleF0uY2huZWxJZCk7DQotICAgICAgICAgICAgaWYocENobmVsTm9kZSAhPSBOVUxMKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYoWkFUSTJfQ0hBTk5FTF9NT0RFX0RBVEEgPT1wQ2huZWxOb2RlLT5zZXJ2ZXJfbW9kZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgekF0aV9IYW5kbGVOb0NhcnJpZXJDbmYoMHhmZiwgZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XS5jaG5lbElkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB6T3NzX01lbXNldCgmZ196QXRpX1NtQ29udGV4dFtnX3pBdGlfQ3VySW5zdGFuY2VdLmxhc3RDaWRUYWJbYkNpZEluZGV4XSwgMCwgc2l6ZW9mKFRfWkF0aV9MYXN0Q2lkVGFiKSk7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLSNpZmRlZiBaX0RVQUxTVEFOREJZDQotVk9JRCB6QXRpX0NzQ2FsbFN0YXJ0SW5kKFZPSUQgKnBEYXRhUHRyKQ0KLXsNCi0gICAgaWYgKFpfVkFMSUQgPT0gekF0aV9Jc0R1YWxQc0R1YWxVaWNjKCkpDQotICAgIHsNCi0gICAgI2lmZGVmIFpfU0lOR0xFQU5URU5OQQ0KLSAgICAgICAgZ196QXRpX0N1ckluc3RhbmNlID0gZ196QXRpX0N1ckluc3RhbmNlID09IDA/IDE6IDA7DQotICAgIA0KLSAgICAgICAgekF0aV9Nc2dTZW5kKE1NSUFfVU1NX0NTX0NBTExfU1RBUlRfSU5EX0VWLCBaT1NTX05VTEwsIDAsIFpfQVRJX1RBU0tJRF9VTU0pOw0KLSAgICAgICAgDQotICAgICAgICBnX3pBdGlfQ3VySW5zdGFuY2UgPSBnX3pBdGlfQ3VySW5zdGFuY2UgPT0gMD8gMTogMDsNCi0gICAgI2VuZGlmDQotICAgIH0NCi19DQotI2VuZGlmDQotDQotI2lmZGVmIFpfRFVBTFNUQU5EQlkNCi1WT0lEIHpBdGlfQ3NDYWxsRW5kSW5kKFZPSUQgKnBEYXRhUHRyKQ0KLXsNCi0gICAgaWYgKFpfVkFMSUQgPT0gekF0aV9Jc0R1YWxQc0R1YWxVaWNjKCkpDQotICAgIHsNCi0gICAgI2lmZGVmIFpfU0lOR0xFQU5URU5OQQ0KLSAgICAgICAgZ196QXRpX0N1ckluc3RhbmNlID0gZ196QXRpX0N1ckluc3RhbmNlID09IDA/IDE6IDA7DQotICAgIA0KLSAgICAgICAgekF0aV9Nc2dTZW5kKE1NSUFfVU1NX0NTX0NBTExfRU5EX0lORF9FViwgWk9TU19OVUxMLCAwLCBaX0FUSV9UQVNLSURfVU1NKTsNCi0gICAgICAgIA0KLSAgICAgICAgZ196QXRpX0N1ckluc3RhbmNlID0gZ196QXRpX0N1ckluc3RhbmNlID09IDA/IDE6IDA7IA0KLSAgICAjZW5kaWYNCi0gICAgfQ0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotuq/K/cP7s8Y6ekF0aV9DbGVhclBjb0NoYXANCi26r8r9uabE3DrH5bP9yKu+1rHkwb/A78PmtcRDSEFQvPjIqNDFz6INCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBfX3BzX3N0YXRpY19mdW5jIHpBdGlfQ2xlYXJQY29DaGFwKFZPSUQpDQotew0KLSAgICB6T3NzX01lbXNldChnX3pBdGlfYXREYXRhRXhbWl9BVElfSU5TTk9fMV0udFBjb0NoYXBBdXRoLDAsWkFUSTJfU01fTUFYX1NNQ0lEX05VTSAqIHNpemVvZihUX1pBdGlfUGNvQ2hhcEluZm8pKTsNCi0gICAgek9zc19NZW1zZXQoZ196QXRpX2F0RGF0YUV4W1pfQVRJX0lOU05PXzJdLnRQY29DaGFwQXV0aCwwLFpBVEkyX1NNX01BWF9TTUNJRF9OVU0gKiBzaXplb2YoVF9aQXRpX1Bjb0NoYXBJbmZvKSk7DQotfQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi26r8r9w/uzxjp6QXRpX0NsZWFyUGNvQ2hhcEJ5Q2lkDQotuq/K/bmmxNw6x+Wz/cirvtax5MG/wO/D5rXEQ0hBULz4yKjQxc+iDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVZPSUQgX19wc180Z19mdW5jIHpBdGlfQ2xlYXJQY29DaGFwQnlDaWQoQllURSBiQ2lkKQ0KLXsNCi0gICAgaWYgKGJDaWQgPiAwICYmIGJDaWQgPD0gWkFUSTJfU01fTUFYX1NNQ0lEX05VTSkNCi0gICAgew0KLSAgICAgICAgek9zc19NZW1zZXQoJmdfekF0aV9hdERhdGFFeFtnX3pBdGlfQ3VySW5zdGFuY2VdLnRQY29DaGFwQXV0aFtiQ2lkLTFdLCAwLCBzaXplb2YoVF9aQXRpX1Bjb0NoYXBJbmZvKSk7DQotICAgIH0NCi19DQotDQotVk9JRCB6QXRpX0dldEVtSW5mb011dGV4KEJZVEUgYkluc0lkeCkNCi17DQotICAgIHpPc3NfR2V0TXV0ZXgoZ196QXRpX0VtSW5mb011dGV4W2JJbnNJZHhdLm11dGV4RW1JbmZvLCBaT1NTX1dBSVRfRk9SRVZFUik7DQotfQ0KLQ0KLVZPSUQgekF0aV9QdXRFbUluZm9NdXRleChCWVRFIGJJbnNJZHgpDQotew0KLSAgICBpZiAoZ196QXRpX0VtSW5mb011dGV4W2JJbnNJZHhdLm11dGV4RW1JbmZvICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHpPc3NfUHV0TXV0ZXgoZ196QXRpX0VtSW5mb011dGV4W2JJbnNJZHhdLm11dGV4RW1JbmZvKTsNCi0gICAgfQ0KLX0NCi0NCi1WT0lEIHpBdGlfRGVjcmVhc2VSZXFDb3VudEFuZFJlbE11dGV4U2VtYXBob3JlKFZPSUQpDQotew0KLSAgICBpZiAoZ196QXRpX0VtSW5mb1tnX3pBdGlfQ3VySW5zdGFuY2VdLmR3UmVxQ291bnQgPiAwKQ0KLSAgICB7DQotICAgICAgICBnX3pBdGlfRW1JbmZvW2dfekF0aV9DdXJJbnN0YW5jZV0uZHdSZXFDb3VudC0tOw0KLSAgICB9DQotDQotICAgIC8qu6Wz4sG/08PN6r7Nys23xaOssqLH0tKq1NrKzbfF0MW6xcG/x7DKzbfFKi8NCi0gICAgekF0aV9QdXRFbUluZm9NdXRleChnX3pBdGlfQ3VySW5zdGFuY2UpOw0KLSANCi0gICAgaWYgKGdfekF0aV9FbUluZm9TZW1hcGhvcmVbZ196QXRpX0N1ckluc3RhbmNlXS5zZW1hcGhvcmVFbUluZm8gIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgek9zc19QdXRTZW1hcGhvcmUoZ196QXRpX0VtSW5mb1NlbWFwaG9yZVtnX3pBdGlfQ3VySW5zdGFuY2VdLnNlbWFwaG9yZUVtSW5mbyk7DQotICAgIH0NCi19DQotVk9JRCB6QXRpX0VNQ2VsbEluZm9SZXEoVk9JRCkNCi17DQotICAgIFRfek1taWFBc19DZWxsSW5mb19RcnlfUmVxIHRDZWxsSW5mb1FyeVJlcSA9IHswfTsNCi0jaWYgZGVmaW5lZCAoRFVBTF9DQVJEX0RVQUxfU1RBTkRCWSkgfHwgZGVmaW5lZCAoX09TX1dJTikNCi0gICAgdENlbGxJbmZvUXJ5UmVxLmJTcmNJbmRleCA9IChnX3pBdGlfQ3VySW5zdGFuY2UgPT0gMCkgPyAwIDogMjU1Oy8q08PO3tCnzai1wLrFo6zKtcD9MdPDMKOsyrXA/TLTwzI1NSovDQotI2Vsc2UNCi0gICAgdENlbGxJbmZvUXJ5UmVxLmJTcmNJbmRleCA9IDA7LyrKtcD9MdPDMCovDQotI2VuZGlmDQotICAgIHRDZWxsSW5mb1FyeVJlcS5iRGVzSW5kZXggPSAweGZmOw0KLQ0KLSAgICAvKsrVtb3H68fzLLj2yv2+zbzT0rsqLw0KLSAgICB6QXRpX0dldEVtSW5mb011dGV4KGdfekF0aV9DdXJJbnN0YW5jZSk7DQotICAgIGdfekF0aV9FbUluZm9bZ196QXRpX0N1ckluc3RhbmNlXS5kd1JlcUNvdW50Kys7DQotICAgIA0KLSAgICBpZiAoWl9BUE1NSUFfTk9SRVNVTFQgIT0gekF0aV9FTV9DZWxsSW5mb1FyeVJlcSgmdENlbGxJbmZvUXJ5UmVxKSkNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsNCi0gICAgICAgIC8qsb60zsfrx/PKp7Dcx+vH87j2yv3Q6NKqu9a4tNStwLS1xKOssqLH0tKqys23xbuls+LBv7rNsb60zrXE0MW6xcG/Ki8NCi0gICAgICAgIHpBdGlfRGVjcmVhc2VSZXFDb3VudEFuZFJlbE11dGV4U2VtYXBob3JlKCk7DQotICAgICAgICByZXR1cm4gOw0KLSAgICB9DQotDQotICAgIGlmICgoZ196QXRpX0VtSW5mb1tnX3pBdGlfQ3VySW5zdGFuY2VdLnB0RW1JbmZvID09IFpPU1NfTlVMTCkpDQotICAgIHsNCi0gICAgICAgIGdfekF0aV9FbUluZm9bZ196QXRpX0N1ckluc3RhbmNlXS5wdEVtSW5mbyA9IChUX3pFTV9FbUluZm9fSW5kICopek9zc19HZXRVQihzaXplb2YoVF96RU1fRW1JbmZvX0luZCkpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoZ196QXRpX0VtSW5mb1tnX3pBdGlfQ3VySW5zdGFuY2VdLnB0RW1JbmZvID09IFpPU1NfTlVMTCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9OdkZhaWx1cmUsICBUUkFDRV9FUlJfTEVWRUxfU0VWRVJFLCIiKTsNCi0gICAgICAgICAgICAvKrG+tM7H68fzyqew3Mfrx/O49sr90OjSqrvWuLTUrcC0tcSjrLKix9LSqsrNt8W7pbPiwb+6zbG+tM61xNDFusXBvyovDQotICAgICAgICAgICAgekF0aV9EZWNyZWFzZVJlcUNvdW50QW5kUmVsTXV0ZXhTZW1hcGhvcmUoKTsNCi0gICAgICAgICAgICByZXR1cm4gOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIC8qu6Wz4sG/08PN6r7Nys23xSovDQotICAgIHpBdGlfUHV0RW1JbmZvTXV0ZXgoZ196QXRpX0N1ckluc3RhbmNlKTsNCi0NCi0gICAgcmV0dXJuOw0KLX0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGIDogekF0aV9HZXRFTUNlbGxJbmZvDQotKiC5psTcw+jK9iA6ILvxyKG5pLPMxKPKvdChx/jQxc+iDQotKiCyzsr9y7XD9yA6IHBFbUluZm86IL3hubnTw1RfekVNX0VtSW5mb19JbmQNCi0qICAgICAgICAgICAgYkluc3RhbmNlSWR4OiC0/bv6suDKtcD9y/fS/brFLDCx7cq+tP27+rLgMaO7MbHtyr60/bv6suAyDQotKiAgICAgICAgICAgICAgICAgICAgICAgICC1pbT9sOaxvszuMKO7y6u0/bDmsb64+b7dyrW8yrT9u/qy4Mzu0LQwu/LV3zENCi0qILe1ILvYINa1IDogs8m5pre1u9haQVRJMl9TVUNDRVNTICgwKQ0KLSogxuTL/Mu1w/cgOiDM4bmpuPjTw7unt726r8r9vdO/2qOst7W72MqnsNzLtcP31N3KscO709C78cihtb0NCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1TSU5UMzIgekF0aV9HZXRFTUNlbGxJbmZvKFVJTlQ4ICpwRW1JbmZvLCBVSU5UOCBiSW5zdGFuY2VJZHgpDQotew0KLSAgICBUX1pBdGlfRU1DZWxsSW5mb19SZXEgdEVNQ2VsbEluZm8gPSB7MH07DQotDQotICAgIGlmIChwRW1JbmZvID09IFpPU1NfTlVMTCB8fCAoYkluc3RhbmNlSWR4ICE9IDAgJiYgYkluc3RhbmNlSWR4ICE9IDEpKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLSAgICB9DQotDQotICAgIGJJbnN0YW5jZUlkeCA9ICgoYkluc3RhbmNlSWR4ID09IFpfQVRJX0lOU05PXzEpPyBaX0FUSV9JTlNOT18xIDogWl9BVElfSU5TTk9fMik7DQotICAgIHRFTUNlbGxJbmZvLmJJbnN0YW5jZSA9IGJJbnN0YW5jZUlkeDsNCi0NCi0gICAgaWYgKFpPU1NfU1VDQ0VTUyAhPSB6T3NzX1Rhc2tTZW5kKEVWX1pBVEkyX1pFTUNFTExJTkZPX1JFUSwgJnRFTUNlbGxJbmZvLCBzaXplb2YoVF9aQXRpX0VNQ2VsbEluZm9fUmVxKSwgZ196QXRpX0NvbnRleHQudGFza0lkTXkpKQ0KLSAgICB7DQotICAgICAgICB6QXRpX1NlbmRFeHB0MlRyYWNlQWd0KEVSUl9JbnZhbGlkUGFyYSwgIFRSQUNFX0VSUl9MRVZFTF9OT1JNQUwsIiIpOw0KLSAgICAgICAgcmV0dXJuIFpBVEkyX0ZBTFNFOw0KLSAgICB9DQotDQotICAgIHpPc3NfR2V0U2VtYXBob3JlKGdfekF0aV9FbUluZm9TZW1hcGhvcmVbYkluc3RhbmNlSWR4XS5zZW1hcGhvcmVFbUluZm8sIFpPU1NfV0FJVF9GT1JFVkVSKTsNCi0NCi0gICAgekF0aV9HZXRFbUluZm9NdXRleChiSW5zdGFuY2VJZHgpOw0KLSAgICANCi0gICAgaWYgKGdfekF0aV9FbUluZm9bYkluc3RhbmNlSWR4XS5wdEVtSW5mbyAhPSBaT1NTX05VTEwpDQotICAgIHsNCi0gICAgICAgIHpPc3NfTWVtY3B5KHBFbUluZm8sIGdfekF0aV9FbUluZm9bYkluc3RhbmNlSWR4XS5wdEVtSW5mbywgc2l6ZW9mKFRfekVNX0VtSW5mb19JbmQpKTsNCi0gICAgICAgIC8qtry0psDtzerBy6OsssXKzbfFxNq05iovDQotICAgICAgICBpZiAoZ196QXRpX0VtSW5mb1tiSW5zdGFuY2VJZHhdLmR3UmVxQ291bnQgPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB6QXRpX1JldFVCKChWT0lEICoqKSZnX3pBdGlfRW1JbmZvW2JJbnN0YW5jZUlkeF0ucHRFbUluZm8pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgekF0aV9QdXRFbUluZm9NdXRleChiSW5zdGFuY2VJZHgpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgekF0aV9TZW5kRXhwdDJUcmFjZUFndChFUlJfSW52YWxpZFBhcmEsICBUUkFDRV9FUlJfTEVWRUxfTk9STUFMLCIiKTsNCi0gICAgICAgIHpBdGlfUHV0RW1JbmZvTXV0ZXgoYkluc3RhbmNlSWR4KTsNCi0gICAgICAgIHJldHVybiBaQVRJMl9GQUxTRTsNCi0gICAgfQ0KLQ0KLSAgICByZXR1cm4gWkFUSTJfU1VDQ0VTUzsNCi19DQotDQotc3RhdGljIFVJTlQ4IFBBRERJTkdbNjRdID0gew0KLSAgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQotICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDANCi19Ow0KLQ0KLS8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMgKi8NCi0jZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKCh+eCkgJiAoeikpKQ0KLSNkZWZpbmUgRyh4LCB5LCB6KSAoKCh4KSAmICh6KSkgfCAoKHkpICYgKH56KSkpDQotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpDQotI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgKH56KSkpDQotDQotLyogUk9UQVRFX0xFRlQgcm90YXRlcyB4IGxlZnQgbiBiaXRzICovDQotI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzItKG4pKSkpDQotDQotLyogRkYsIEdHLCBISCwgYW5kIElJIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIsIDMsIGFuZCA0ICovDQotLyogUm90YXRpb24gaXMgc2VwYXJhdGUgZnJvbSBhZGRpdGlvbiB0byBwcmV2ZW50IHJlY29tcHV0YXRpb24gKi8NCi0jZGVmaW5lIEZGKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSBcDQotICB7KGEpICs9IEYgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcDQotICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXA0KLSAgIChhKSArPSAoYik7IFwNCi0gIH0NCi0jZGVmaW5lIEdHKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSBcDQotICB7KGEpICs9IEcgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcDQotICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXA0KLSAgIChhKSArPSAoYik7IFwNCi0gIH0NCi0jZGVmaW5lIEhIKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSBcDQotICB7KGEpICs9IEggKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcDQotICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXA0KLSAgIChhKSArPSAoYik7IFwNCi0gIH0NCi0jZGVmaW5lIElJKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSBcDQotICB7KGEpICs9IEkgKChiKSwgKGMpLCAoZCkpICsgKHgpICsgKFVJTlQzMikoYWMpOyBcDQotICAgKGEpID0gUk9UQVRFX0xFRlQgKChhKSwgKHMpKTsgXA0KLSAgIChhKSArPSAoYik7IFwNCi0gIH0NCi0NCi0jaWZkZWYgX19TVERDX18NCi0jZGVmaW5lIFVMKHgpICAgeCMjVUwNCi0jZWxzZQ0KLSNpZmRlZiBXSU4zMg0KLSNkZWZpbmUgVUwoeCkgICB4IyNVTA0KLSNlbHNlDQotI2RlZmluZSBVTCh4KSAgIHgNCi0jZW5kaWYNCi0jZW5kaWYNCi1WT0lEIHpBdGlfTUQ1SW5pdCAoVF96QXRpX01kNUN0eCAqbWRDb250ZXh0KQ0KLXsNCi0gIG1kQ29udGV4dC0+aVswXSA9IG1kQ29udGV4dC0+aVsxXSA9IChVSU5UMzIpMDsNCi0NCi0gIC8qIExvYWQgbWFnaWMgaW5pdGlhbGl6YXRpb24gY29uc3RhbnRzLg0KLSAgICovDQotICBtZENvbnRleHQtPmJ1ZlswXSA9IChVSU5UMzIpMHg2NzQ1MjMwMVVMOw0KLSAgbWRDb250ZXh0LT5idWZbMV0gPSAoVUlOVDMyKTB4ZWZjZGFiODlVTDsNCi0gIG1kQ29udGV4dC0+YnVmWzJdID0gKFVJTlQzMikweDk4YmFkY2ZlVUw7DQotICBtZENvbnRleHQtPmJ1ZlszXSA9IChVSU5UMzIpMHgxMDMyNTQ3NlVMOw0KLSAgcmV0dXJuOw0KLX0NCi0NCi0vKiBUaGUgcm91dGluZSBNRDVVcGRhdGUgdXBkYXRlcyB0aGUgbWVzc2FnZS1kaWdlc3QgY29udGV4dCB0bw0KLSAgIGFjY291bnQgZm9yIHRoZSBwcmVzZW5jZSBvZiBlYWNoIG9mIHRoZSBjaGFyYWN0ZXJzIGluQnVmWzAuLmluTGVuLTFdDQotICAgaW4gdGhlIG1lc3NhZ2Ugd2hvc2UgZGlnZXN0IGlzIGJlaW5nIGNvbXB1dGVkLg0KLSAqLw0KLVZPSUQgekF0aV9NRDVVcGRhdGUoVF96QXRpX01kNUN0eCAqbWRDb250ZXh0LCBVSU5UOCAqaW5CdWYsIFVJTlQzMiBpbkxlbikNCi17DQotICBVSU5UMzIgaW5bMTZdOw0KLSAgU0lOVDMyIG1kaTsNCi0gIFVJTlQzMiBpLCBpaTsNCi0gDQotICAvKiBjb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8NCi0gIG1kaSA9IChTSU5UMzIpKChtZENvbnRleHQtPmlbMF0gPj4gMykgJiAweDNGKTsNCi0NCi0gIC8qIHVwZGF0ZSBudW1iZXIgb2YgYml0cyAqLw0KLSAgaWYgKChtZENvbnRleHQtPmlbMF0gKyAoKFVJTlQzMilpbkxlbiA8PCAzKSkgPCBtZENvbnRleHQtPmlbMF0pDQotICAgIG1kQ29udGV4dC0+aVsxXSsrOw0KLSAgbWRDb250ZXh0LT5pWzBdICs9ICgoVUlOVDMyKWluTGVuIDw8IDMpOw0KLSAgbWRDb250ZXh0LT5pWzFdICs9ICgoVUlOVDMyKWluTGVuID4+IDI5KTsNCi0NCi0gIHdoaWxlIChpbkxlbi0tKSB7DQotICAgIC8qIGFkZCBuZXcgY2hhcmFjdGVyIHRvIGJ1ZmZlciwgaW5jcmVtZW50IG1kaSAqLw0KLSAgICBtZENvbnRleHQtPmluW21kaSsrXSA9ICppbkJ1ZisrOw0KLQ0KLSAgICAvKiB0cmFuc2Zvcm0gaWYgbmVjZXNzYXJ5ICovDQotICAgIGlmIChtZGkgPT0gMHg0MCkgew0KLSAgICAgIGZvciAoaSA9IDAsIGlpID0gMDsgaSA8IDE2OyBpKyssIGlpICs9IDQpDQotICAgICAgICBpbltpXSA9ICgoKFVJTlQzMiltZENvbnRleHQtPmluW2lpKzNdKSA8PCAyNCkgfA0KLSAgICAgICAgICAgICAgICAoKChVSU5UMzIpbWRDb250ZXh0LT5pbltpaSsyXSkgPDwgMTYpIHwNCi0gICAgICAgICAgICAgICAgKCgoVUlOVDMyKW1kQ29udGV4dC0+aW5baWkrMV0pIDw8IDgpIHwNCi0gICAgICAgICAgICAgICAgKChVSU5UMzIpbWRDb250ZXh0LT5pbltpaV0pOw0KLSAgICAgIHpBdGlfVHJhbnNmb3JtIChtZENvbnRleHQtPmJ1ZiwgaW4pOw0KLSAgICAgIG1kaSA9IDA7DQotICAgIH0NCi0gIH0NCi0gIHJldHVybjsNCi19DQotDQotLyogVGhlIHJvdXRpbmUgTUQ1RmluYWwgdGVybWluYXRlcyB0aGUgbWVzc2FnZS1kaWdlc3QgY29tcHV0YXRpb24gYW5kDQotICAgZW5kcyB3aXRoIHRoZSBkZXNpcmVkIG1lc3NhZ2UgZGlnZXN0IGluIG1kQ29udGV4dC0+ZGlnZXN0WzAuLi4xNV0uDQotICovDQotVk9JRCB6QXRpX01ENUZpbmFsIChVSU5UOCBoYXNoW10sIFRfekF0aV9NZDVDdHggKm1kQ29udGV4dCkNCi17DQotICBVSU5UMzIgaW5bMTZdOw0KLSAgU0lOVDMyIG1kaTsNCi0gIFVJTlQzMiBpLCBpaTsNCi0gIFVJTlQzMiBwYWRMZW47DQotDQotICAvKiBzYXZlIG51bWJlciBvZiBiaXRzICovDQotICBpblsxNF0gPSBtZENvbnRleHQtPmlbMF07DQotICBpblsxNV0gPSBtZENvbnRleHQtPmlbMV07DQotDQotICAvKiBjb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgNjQgKi8NCi0gIG1kaSA9IChTSU5UMzIpKChtZENvbnRleHQtPmlbMF0gPj4gMykgJiAweDNGKTsNCi0NCi0gIC8qIHBhZCBvdXQgdG8gNTYgbW9kIDY0ICovDQotICBwYWRMZW4gPSAoVUlOVDMyKSgobWRpIDwgNTYpID8gKDU2IC0gbWRpKSA6ICgxMjAgLSBtZGkpKTsNCi0gIHpBdGlfTUQ1VXBkYXRlIChtZENvbnRleHQsIFBBRERJTkcsIHBhZExlbik7DQotDQotICAvKiBhcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLw0KLSAgZm9yIChpID0gMCwgaWkgPSAwOyBpIDwgMTQ7IGkrKywgaWkgKz0gNCkNCi0gICAgaW5baV0gPSAoKChVSU5UMzIpbWRDb250ZXh0LT5pbltpaSszXSkgPDwgMjQpIHwNCi0gICAgICAgICAgICAoKChVSU5UMzIpbWRDb250ZXh0LT5pbltpaSsyXSkgPDwgMTYpIHwNCi0gICAgICAgICAgICAoKChVSU5UMzIpbWRDb250ZXh0LT5pbltpaSsxXSkgPDwgOCkgfA0KLSAgICAgICAgICAgICgoVUlOVDMyKW1kQ29udGV4dC0+aW5baWldKTsNCi0gIHpBdGlfVHJhbnNmb3JtIChtZENvbnRleHQtPmJ1ZiwgaW4pOw0KLQ0KLSAgLyogc3RvcmUgYnVmZmVyIGluIGRpZ2VzdCAqLw0KLSAgZm9yIChpID0gMCwgaWkgPSAwOyBpIDwgNDsgaSsrLCBpaSArPSA0KSB7DQotICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpXSA9IChVSU5UOCkobWRDb250ZXh0LT5idWZbaV0gJiAweEZGKTsNCi0gICAgbWRDb250ZXh0LT5kaWdlc3RbaWkrMV0gPQ0KLSAgICAgIChVSU5UOCkoKG1kQ29udGV4dC0+YnVmW2ldID4+IDgpICYgMHhGRik7DQotICAgIG1kQ29udGV4dC0+ZGlnZXN0W2lpKzJdID0NCi0gICAgICAoVUlOVDgpKChtZENvbnRleHQtPmJ1ZltpXSA+PiAxNikgJiAweEZGKTsNCi0gICAgbWRDb250ZXh0LT5kaWdlc3RbaWkrM10gPQ0KLSAgICAgIChVSU5UOCkoKG1kQ29udGV4dC0+YnVmW2ldID4+IDI0KSAmIDB4RkYpOw0KLSAgfQ0KLSAgek9zc19NZW1jcHkoaGFzaCwgbWRDb250ZXh0LT5kaWdlc3QsIDE2KTsNCi0gIHJldHVybjsNCi19DQotDQotLyogQmFzaWMgTUQ1IHN0ZXAuIFRyYW5zZm9ybXMgYnVmIGJhc2VkIG9uIGluLg0KLSAqLw0KLXN0YXRpYyBWT0lEIHpBdGlfVHJhbnNmb3JtIChVSU5UMzIgKmJ1ZiwgVUlOVDMyICppbikNCi17DQotICBVSU5UMzIgYSA9IGJ1ZlswXSwgYiA9IGJ1ZlsxXSwgYyA9IGJ1ZlsyXSwgZCA9IGJ1ZlszXTsNCi0NCi0gIC8qIFJvdW5kIDEgKi8NCi0jZGVmaW5lIFpBVElfUzExIDcNCi0jZGVmaW5lIFpBVElfUzEyIDEyDQotI2RlZmluZSBaQVRJX1MxMyAxNw0KLSNkZWZpbmUgWkFUSV9TMTQgMjINCi0gIEZGICggYSwgYiwgYywgZCwgaW5bIDBdLCBaQVRJX1MxMSwgVUwoMzYxNDA5MDM2MCkpOyAvKiAxICovDQotICBGRiAoIGQsIGEsIGIsIGMsIGluWyAxXSwgWkFUSV9TMTIsIFVMKDM5MDU0MDI3MTApKTsgLyogMiAqLw0KLSAgRkYgKCBjLCBkLCBhLCBiLCBpblsgMl0sIFpBVElfUzEzLCBVTCggNjA2MTA1ODE5KSk7IC8qIDMgKi8NCi0gIEZGICggYiwgYywgZCwgYSwgaW5bIDNdLCBaQVRJX1MxNCwgVUwoMzI1MDQ0MTk2NikpOyAvKiA0ICovDQotICBGRiAoIGEsIGIsIGMsIGQsIGluWyA0XSwgWkFUSV9TMTEsIFVMKDQxMTg1NDgzOTkpKTsgLyogNSAqLw0KLSAgRkYgKCBkLCBhLCBiLCBjLCBpblsgNV0sIFpBVElfUzEyLCBVTCgxMjAwMDgwNDI2KSk7IC8qIDYgKi8NCi0gIEZGICggYywgZCwgYSwgYiwgaW5bIDZdLCBaQVRJX1MxMywgVUwoMjgyMTczNTk1NSkpOyAvKiA3ICovDQotICBGRiAoIGIsIGMsIGQsIGEsIGluWyA3XSwgWkFUSV9TMTQsIFVMKDQyNDkyNjEzMTMpKTsgLyogOCAqLw0KLSAgRkYgKCBhLCBiLCBjLCBkLCBpblsgOF0sIFpBVElfUzExLCBVTCgxNzcwMDM1NDE2KSk7IC8qIDkgKi8NCi0gIEZGICggZCwgYSwgYiwgYywgaW5bIDldLCBaQVRJX1MxMiwgVUwoMjMzNjU1Mjg3OSkpOyAvKiAxMCAqLw0KLSAgRkYgKCBjLCBkLCBhLCBiLCBpblsxMF0sIFpBVElfUzEzLCBVTCg0Mjk0OTI1MjMzKSk7IC8qIDExICovDQotICBGRiAoIGIsIGMsIGQsIGEsIGluWzExXSwgWkFUSV9TMTQsIFVMKDIzMDQ1NjMxMzQpKTsgLyogMTIgKi8NCi0gIEZGICggYSwgYiwgYywgZCwgaW5bMTJdLCBaQVRJX1MxMSwgVUwoMTgwNDYwMzY4MikpOyAvKiAxMyAqLw0KLSAgRkYgKCBkLCBhLCBiLCBjLCBpblsxM10sIFpBVElfUzEyLCBVTCg0MjU0NjI2MTk1KSk7IC8qIDE0ICovDQotICBGRiAoIGMsIGQsIGEsIGIsIGluWzE0XSwgWkFUSV9TMTMsIFVMKDI3OTI5NjUwMDYpKTsgLyogMTUgKi8NCi0gIEZGICggYiwgYywgZCwgYSwgaW5bMTVdLCBaQVRJX1MxNCwgVUwoMTIzNjUzNTMyOSkpOyAvKiAxNiAqLw0KLQ0KLSAgLyogUm91bmQgMiAqLw0KLSNkZWZpbmUgWkFUSV9TMjEgNQ0KLSNkZWZpbmUgWkFUSV9TMjIgOQ0KLSNkZWZpbmUgWkFUSV9TMjMgMTQNCi0jZGVmaW5lIFpBVElfUzI0IDIwDQotICBHRyAoIGEsIGIsIGMsIGQsIGluWyAxXSwgWkFUSV9TMjEsIFVMKDQxMjkxNzA3ODYpKTsgLyogMTcgKi8NCi0gIEdHICggZCwgYSwgYiwgYywgaW5bIDZdLCBaQVRJX1MyMiwgVUwoMzIyNTQ2NTY2NCkpOyAvKiAxOCAqLw0KLSAgR0cgKCBjLCBkLCBhLCBiLCBpblsxMV0sIFpBVElfUzIzLCBVTCggNjQzNzE3NzEzKSk7IC8qIDE5ICovDQotICBHRyAoIGIsIGMsIGQsIGEsIGluWyAwXSwgWkFUSV9TMjQsIFVMKDM5MjEwNjk5OTQpKTsgLyogMjAgKi8NCi0gIEdHICggYSwgYiwgYywgZCwgaW5bIDVdLCBaQVRJX1MyMSwgVUwoMzU5MzQwODYwNSkpOyAvKiAyMSAqLw0KLSAgR0cgKCBkLCBhLCBiLCBjLCBpblsxMF0sIFpBVElfUzIyLCBVTCggIDM4MDE2MDgzKSk7IC8qIDIyICovDQotICBHRyAoIGMsIGQsIGEsIGIsIGluWzE1XSwgWkFUSV9TMjMsIFVMKDM2MzQ0ODg5NjEpKTsgLyogMjMgKi8NCi0gIEdHICggYiwgYywgZCwgYSwgaW5bIDRdLCBaQVRJX1MyNCwgVUwoMzg4OTQyOTQ0OCkpOyAvKiAyNCAqLw0KLSAgR0cgKCBhLCBiLCBjLCBkLCBpblsgOV0sIFpBVElfUzIxLCBVTCggNTY4NDQ2NDM4KSk7IC8qIDI1ICovDQotICBHRyAoIGQsIGEsIGIsIGMsIGluWzE0XSwgWkFUSV9TMjIsIFVMKDMyNzUxNjM2MDYpKTsgLyogMjYgKi8NCi0gIEdHICggYywgZCwgYSwgYiwgaW5bIDNdLCBaQVRJX1MyMywgVUwoNDEwNzYwMzMzNSkpOyAvKiAyNyAqLw0KLSAgR0cgKCBiLCBjLCBkLCBhLCBpblsgOF0sIFpBVElfUzI0LCBVTCgxMTYzNTMxNTAxKSk7IC8qIDI4ICovDQotICBHRyAoIGEsIGIsIGMsIGQsIGluWzEzXSwgWkFUSV9TMjEsIFVMKDI4NTAyODU4MjkpKTsgLyogMjkgKi8NCi0gIEdHICggZCwgYSwgYiwgYywgaW5bIDJdLCBaQVRJX1MyMiwgVUwoNDI0MzU2MzUxMikpOyAvKiAzMCAqLw0KLSAgR0cgKCBjLCBkLCBhLCBiLCBpblsgN10sIFpBVElfUzIzLCBVTCgxNzM1MzI4NDczKSk7IC8qIDMxICovDQotICBHRyAoIGIsIGMsIGQsIGEsIGluWzEyXSwgWkFUSV9TMjQsIFVMKDIzNjgzNTk1NjIpKTsgLyogMzIgKi8NCi0NCi0gIC8qIFJvdW5kIDMgKi8NCi0jZGVmaW5lIFpBVElfUzMxIDQNCi0jZGVmaW5lIFpBVElfUzMyIDExDQotI2RlZmluZSBaQVRJX1MzMyAxNg0KLSNkZWZpbmUgWkFUSV9TMzQgMjMNCi0gIEhIICggYSwgYiwgYywgZCwgaW5bIDVdLCBaQVRJX1MzMSwgVUwoNDI5NDU4ODczOCkpOyAvKiAzMyAqLw0KLSAgSEggKCBkLCBhLCBiLCBjLCBpblsgOF0sIFpBVElfUzMyLCBVTCgyMjcyMzkyODMzKSk7IC8qIDM0ICovDQotICBISCAoIGMsIGQsIGEsIGIsIGluWzExXSwgWkFUSV9TMzMsIFVMKDE4MzkwMzA1NjIpKTsgLyogMzUgKi8NCi0gIEhIICggYiwgYywgZCwgYSwgaW5bMTRdLCBaQVRJX1MzNCwgVUwoNDI1OTY1Nzc0MCkpOyAvKiAzNiAqLw0KLSAgSEggKCBhLCBiLCBjLCBkLCBpblsgMV0sIFpBVElfUzMxLCBVTCgyNzYzOTc1MjM2KSk7IC8qIDM3ICovDQotICBISCAoIGQsIGEsIGIsIGMsIGluWyA0XSwgWkFUSV9TMzIsIFVMKDEyNzI4OTMzNTMpKTsgLyogMzggKi8NCi0gIEhIICggYywgZCwgYSwgYiwgaW5bIDddLCBaQVRJX1MzMywgVUwoNDEzOTQ2OTY2NCkpOyAvKiAzOSAqLw0KLSAgSEggKCBiLCBjLCBkLCBhLCBpblsxMF0sIFpBVElfUzM0LCBVTCgzMjAwMjM2NjU2KSk7IC8qIDQwICovDQotICBISCAoIGEsIGIsIGMsIGQsIGluWzEzXSwgWkFUSV9TMzEsIFVMKCA2ODEyNzkxNzQpKTsgLyogNDEgKi8NCi0gIEhIICggZCwgYSwgYiwgYywgaW5bIDBdLCBaQVRJX1MzMiwgVUwoMzkzNjQzMDA3NCkpOyAvKiA0MiAqLw0KLSAgSEggKCBjLCBkLCBhLCBiLCBpblsgM10sIFpBVElfUzMzLCBVTCgzNTcyNDQ1MzE3KSk7IC8qIDQzICovDQotICBISCAoIGIsIGMsIGQsIGEsIGluWyA2XSwgWkFUSV9TMzQsIFVMKCAgNzYwMjkxODkpKTsgLyogNDQgKi8NCi0gIEhIICggYSwgYiwgYywgZCwgaW5bIDldLCBaQVRJX1MzMSwgVUwoMzY1NDYwMjgwOSkpOyAvKiA0NSAqLw0KLSAgSEggKCBkLCBhLCBiLCBjLCBpblsxMl0sIFpBVElfUzMyLCBVTCgzODczMTUxNDYxKSk7IC8qIDQ2ICovDQotICBISCAoIGMsIGQsIGEsIGIsIGluWzE1XSwgWkFUSV9TMzMsIFVMKCA1MzA3NDI1MjApKTsgLyogNDcgKi8NCi0gIEhIICggYiwgYywgZCwgYSwgaW5bIDJdLCBaQVRJX1MzNCwgVUwoMzI5OTYyODY0NSkpOyAvKiA0OCAqLw0KLQ0KLSAgLyogUm91bmQgNCAqLw0KLSNkZWZpbmUgWkFUSV9TNDEgNg0KLSNkZWZpbmUgWkFUSV9TNDIgMTANCi0jZGVmaW5lIFpBVElfUzQzIDE1DQotI2RlZmluZSBaQVRJX1M0NCAyMQ0KLSAgSUkgKCBhLCBiLCBjLCBkLCBpblsgMF0sIFpBVElfUzQxLCBVTCg0MDk2MzM2NDUyKSk7IC8qIDQ5ICovDQotICBJSSAoIGQsIGEsIGIsIGMsIGluWyA3XSwgWkFUSV9TNDIsIFVMKDExMjY4OTE0MTUpKTsgLyogNTAgKi8NCi0gIElJICggYywgZCwgYSwgYiwgaW5bMTRdLCBaQVRJX1M0MywgVUwoMjg3ODYxMjM5MSkpOyAvKiA1MSAqLw0KLSAgSUkgKCBiLCBjLCBkLCBhLCBpblsgNV0sIFpBVElfUzQ0LCBVTCg0MjM3NTMzMjQxKSk7IC8qIDUyICovDQotICBJSSAoIGEsIGIsIGMsIGQsIGluWzEyXSwgWkFUSV9TNDEsIFVMKDE3MDA0ODU1NzEpKTsgLyogNTMgKi8NCi0gIElJICggZCwgYSwgYiwgYywgaW5bIDNdLCBaQVRJX1M0MiwgVUwoMjM5OTk4MDY5MCkpOyAvKiA1NCAqLw0KLSAgSUkgKCBjLCBkLCBhLCBiLCBpblsxMF0sIFpBVElfUzQzLCBVTCg0MjkzOTE1NzczKSk7IC8qIDU1ICovDQotICBJSSAoIGIsIGMsIGQsIGEsIGluWyAxXSwgWkFUSV9TNDQsIFVMKDIyNDAwNDQ0OTcpKTsgLyogNTYgKi8NCi0gIElJICggYSwgYiwgYywgZCwgaW5bIDhdLCBaQVRJX1M0MSwgVUwoMTg3MzMxMzM1OSkpOyAvKiA1NyAqLw0KLSAgSUkgKCBkLCBhLCBiLCBjLCBpblsxNV0sIFpBVElfUzQyLCBVTCg0MjY0MzU1NTUyKSk7IC8qIDU4ICovDQotICBJSSAoIGMsIGQsIGEsIGIsIGluWyA2XSwgWkFUSV9TNDMsIFVMKDI3MzQ3Njg5MTYpKTsgLyogNTkgKi8NCi0gIElJICggYiwgYywgZCwgYSwgaW5bMTNdLCBaQVRJX1M0NCwgVUwoMTMwOTE1MTY0OSkpOyAvKiA2MCAqLw0KLSAgSUkgKCBhLCBiLCBjLCBkLCBpblsgNF0sIFpBVElfUzQxLCBVTCg0MTQ5NDQ0MjI2KSk7IC8qIDYxICovDQotICBJSSAoIGQsIGEsIGIsIGMsIGluWzExXSwgWkFUSV9TNDIsIFVMKDMxNzQ3NTY5MTcpKTsgLyogNjIgKi8NCi0gIElJICggYywgZCwgYSwgYiwgaW5bIDJdLCBaQVRJX1M0MywgVUwoIDcxODc4NzI1OSkpOyAvKiA2MyAqLw0KLSAgSUkgKCBiLCBjLCBkLCBhLCBpblsgOV0sIFpBVElfUzQ0LCBVTCgzOTUxNDgxNzQ1KSk7IC8qIDY0ICovDQotDQotICBidWZbMF0gKz0gYTsNCi0gIGJ1ZlsxXSArPSBiOw0KLSAgYnVmWzJdICs9IGM7DQotICBidWZbM10gKz0gZDsNCi0gIHJldHVybjsNCi19DQotDQotVk9JRCB6QXRpX0dldE1kNUhhc2goQ0hBUiBpZCwgQ0hBUiogc2VjcmV0LCBVSU5UOCBzZWNyZXRMZW4sIENIQVIqIGNoYWxsZW5nZSwgVUlOVDggY2hhbGxlbmdlTGVuLCBDSEFSKiBoYXNoT3V0KQ0KLXsNCi0gICAgVF96QXRpX01kNUN0eCBtZENvbnRleHQgPSB7MH07DQotICAgIA0KLSAgICBpZihzZWNyZXQgPT0gTlVMTCB8fCBjaGFsbGVuZ2UgPT0gTlVMTCB8fCBoYXNoT3V0ID09IE5VTEwgfHwgc2VjcmV0TGVuID09IDAgfHwgY2hhbGxlbmdlTGVuID09IDApDQotICAgIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLSAgICB6QXRpX01ENUluaXQoJm1kQ29udGV4dCk7DQotICAgIHpBdGlfTUQ1VXBkYXRlKCZtZENvbnRleHQsIChVSU5UOCAqKSZpZCwgMSk7DQotICAgIHpBdGlfTUQ1VXBkYXRlKCZtZENvbnRleHQsIChVSU5UOCAqKXNlY3JldCwgKFVJTlQzMilzZWNyZXRMZW4pOw0KLSAgICB6QXRpX01ENVVwZGF0ZSgmbWRDb250ZXh0LCAoVUlOVDggKiljaGFsbGVuZ2UsIChVSU5UMzIpY2hhbGxlbmdlTGVuKTsNCi0gICAgekF0aV9NRDVGaW5hbCgoVUlOVDggKiloYXNoT3V0LCAmbWRDb250ZXh0KTsgDQotICAgIHJldHVybjsNCi19DQotVF96X1BsbW5JZCB6QXRpX0dldEN1cnJQbG1uKEJZVEUgYkluc0lkeCkNCi17DQotICAgIHJldHVybiBnX3pBdGlfYXREYXRhRXhbYkluc0lkeF0udEN1cnJQbG1uUGFyYS50UGxtbklkOw0KLX0NCi0NCi0NCi1CT09MIF9fcHNfNGdfZnVuYyB6QXRpX0NpZElzVXNlZChCWVRFIGJDaWQpDQotew0KLSAgICBCT09MIGJSZXN1bHQgPSBGQUxTRTsNCi0gICAgVF96TW1pYVNtX1BkcEFkZHIgICpwdFBkcEFkZHIgPSAoVF96TW1pYVNtX1BkcEFkZHIqKXpBdGlfR2V0VUIoc2l6ZW9mKFRfek1taWFTbV9QZHBBZGRyKSk7DQotICAgIFRfek1taWFTbV9QY29JbmZvICAgKnB0UGNvSW5mbyA9IChUX3pNbWlhU21fUGNvSW5mbyopekF0aV9HZXRVQihzaXplb2YoVF96TW1pYVNtX1Bjb0luZm8pKTsNCi0gICAgDQotICAgIGlmICh6QXRpX0lzQ2lkVXNlZChiQ2lkKSB8fCB6QXRpX0dldFBkcEluZm9CeUNpZChiQ2lkLCBwdFBkcEFkZHIsIHB0UGNvSW5mbywgZ196QXRpX0N1ckluc3RhbmNlKSkNCi0gICAgew0KLSAgICAgICAgYlJlc3VsdCA9IFRSVUU7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBiUmVzdWx0ID0gRkFMU0U7DQotICAgIH0NCi0gICAgekF0aV9SZXRVQigoVk9JRCoqKSZwdFBkcEFkZHIpOw0KLSAgICB6QXRpX1JldFVCKChWT0lEKiopJnB0UGNvSW5mbyk7DQotICAgIHJldHVybiBiUmVzdWx0Ow0KLX0NCmRpZmYgLS1naXQgYS9VYm9vdC9jcC9wcy9wbGF0L2luYy9vc3Mvb3NzX3N1cC5oIGIvVWJvb3QvY3AvcHMvcGxhdC9pbmMvb3NzL29zc19zdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjg2YzMxOC4uMDAwMDAwMAotLS0gYS9VYm9vdC9jcC9wcy9wbGF0L2luYy9vc3Mvb3NzX3N1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcxICswLDAgQEAKLS8qKg0KLSAqIEBmaWxlIG9zc19zdXAuaA0KLSAqIEBicmllZiBvc3PEo7/puL2807mmxNwNCi0gKg0KLSAqIENvcHlyaWdodCAoQykgMjAxNyBTYW5lY2hpcHMgVGVjaG5vbG9neSBDby4sIEx0ZC4NCi0gKiANCi0gKiANCi0gKi8NCi0NCi0jaWZuZGVmIF9PU1NfU1VQX0gNCi0jZGVmaW5lIF9PU1NfU1VQX0gNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBoZWFkZXIgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaW5jbHVkZSAicmFtZHVtcC5oIg0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyINCi17DQotI2VuZGlmDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMNCi0vKiDJ6NbDu/K78cihysK8/sr00NQgKi8NCi0jZGVmaW5lIFpPU1NfRVZFTlRTX09SICAgICAgICAgICAgICAweDAwDQotI2RlZmluZSBaT1NTX0VWRU5UU19BTkQgICAgICAgICAgICAgMHgwMQ0KLSNkZWZpbmUgWk9TU19FVkVOVFNfT1JfQ0xFQVIgICAgICAgIDB4MDINCi0jZGVmaW5lIFpPU1NfRVZFTlRTX0FORF9DTEVBUiAgICAgICAweDAzDQotDQotLyogyejWw7vYtfe6r8r9wODQzSAqLw0KLSNkZWZpbmUgWk9TU19TRVRIT09LRkxBR19NT05JICAgICAgIDB4MDEgICAgICAgICAvKiDP+8+ivOC/2CAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfU0VUSE9PS0ZMQUdfVFJBQ0sgICAgICAweDAyICAgICAgICAgLyogz9/Q1Lj619kgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBaT1NTX1NFVEhPT0tGTEFHX0lOVEVSICAgICAgMHgwMyAgICAgICAgIC8qIM/7z6K92LvxICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgWk9TU19TRVRIT09LX1NFTkQgICAgICAgICAgIDB4MDEgICAgICAgICAvKiB6T3NzX1NlbmRNc2fP+8+iwKnVuSAgICAgKi8NCi0jZGVmaW5lIFpPU1NfU0VUSE9PS19TRU5EX0RBVEEgICAgICAweDAyICAgICAgICAgLyogek9zc19TZW5kTXNnz/vPosCp1bkgICAgICovDQotI2RlZmluZSBaT1NTX1NFVEhPT0tfR0VUX0FMTF9JRCAgICAgMHgwMyAgICAgICAgIC8qIHpPc3NfR2V0QWxsVGFza0lEwKnVuSAgICAqLw0KLSNkZWZpbmUgWk9TU19TRVRIT09LX0dFVF9JRCAgICAgICAgIDB4MDQgICAgICAgICAvKiB6T3NzX0dldFRhc2tJRMCp1bkgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfU0VUSE9PS19HRVRfTkFNRSAgICAgICAweDA1ICAgICAgICAgLyogek9zc19HZXRUYXNrTmFtZcCp1bkgICAgICovDQotDQotLyogyM7O8c/7z6LXtMysICovDQotI2RlZmluZSBaT1NTX01TR1NFTkRUWVBFX01TRyAgICAgICAgMHgwMSAgICAgICAgIC8qILeiy83P+8+iICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgWk9TU19NU0dTRU5EVFlQRV9EQVRBICAgICAgIDB4MDIgICAgICAgICAvKiC3osvNyv2+3SAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfTVNHU0VORFRZUEVfSU5URVIgICAgICAweDAzICAgICAgICAgLyog1NrW0LbP1tC3osvNICAgICAgICAgICAgICovDQotI2RlZmluZSBaT1NTX01TR1NFTkRUWVBFX1RJTUVSICAgICAgMHgwNCAgICAgICAgIC8qILaoyrHG98/7z6IgICAgICAgICAgICAgICAqLw0KLQ0KLS8qIMjOzvHXtMysu/ogKi8NCi0jZGVmaW5lIFpPU1NfU1RBVFVTX0lOSVQgICAgICAgICAgICAweDAxICAgICAgICAgLyogs/XKvMysICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBaT1NTX1NUQVRVU19XT1JLICAgICAgICAgICAgMHgwMiAgICAgICAgIC8qILmk1/fMrCAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgWk9TU19TVEFUVVNfSURMRSAgICAgICAgICAgIDB4MDMgICAgICAgICAvKiC/1c/QzKwgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfU1RBVFVTX1VTRVJCQVNFICAgICAgICAweDA0ICAgICAgICAgLyog08O7p9e0zKzX1Lao0uUgICAgICAgICAgICovDQotDQotLyogyM7O8dTL0NDXtMysICovDQotI2RlZmluZSBaT1NTX1NUQVRFX1NUT1BQRUQgICAgICAgICAgMHgwMSAgICAgICAgIC8qIMjOzvHU3c2jICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgWk9TU19TVEFURV9JRExFICAgICAgICAgICAgIDB4MDIgICAgICAgICAvKiDIzs7xv9XP0CAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfU1RBVEVfUkVBRFkgICAgICAgICAgICAweDAzICAgICAgICAgLyogyM7O8b7N0PcgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBaT1NTX1NUQVRFX1JVTiAgICAgICAgICAgICAgMHgwNCAgICAgICAgIC8qIMjOzvHUy9DQICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qIM/7z6Kytrvxt73P8iAqLw0KLSNkZWZpbmUgWk9TU19NU0dESVJFX0lOICAgICAgICAgICAgIDB4MDEgICAgICAgICAvKiDK5Mjrz/vPorK2u/EgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFpPU1NfTVNHRElSRV9PVVQgICAgICAgICAgICAweDAyICAgICAgICAgLyogyuSz9s/7z6KytrvxICAgICAgICAgICAgICovDQotI2RlZmluZSBaT1NTX01TR0RJUkVfSU5PVVQgICAgICAgICAgMHgwMyAgICAgICAgIC8qIMurz/KytrvxICAgICAgICAgICAgICAgICAqLw0KLQ0KLS8qIM/7z6K3osvN08XPyLy2ICovDQotI2RlZmluZSBaT1NTX1FVRVVFX01TR19QUklfTk9STUFMICAgMHgwMCAgICAgICAgIC8qIG5vcm1hbCBwcmlvcml0eSBtZXNzYWdlo6y8tLfFtb3P+8+ittPB0M6yICovDQotI2RlZmluZSBaT1NTX1FVRVVFX01TR19QUklfVVJHRU5UICAgMHgwMSAgICAgICAgIC8qIHVyZ2VudCBwcmlvcml0eSBtZXNzYWdlo6y8tLfFtb3P+8+ittPB0MrXICovDQotDQotLyogxeTWw7LOyv3X7rTzs6S2yCAqLw0KLSNkZWZpbmUgTUFYX0VWRU5UTkFNRV9MRU4gICAgICAgICAgIDYzICAgICAgICAgIC8qIMrCvP7X6cP7s8bX7rTzs6S2yCAgICAgICAqLw0KLSNkZWZpbmUgTUFYX1FVRVVFTkFNRV9MRU4gICAgICAgICAgIDYzICAgICAgICAgIC8qINfutPPP+8+ittPB0MP7s6S2yCAgICAgICAqLyANCi0jZGVmaW5lIFpPU1NfTUFYX1RBU0tOQU1FX0xFTiAgICAgICA2MyAgICAgICAgICAvKiDIzs7xw/uzpLbIICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFNIRUxMX0NNRF9MRU5HVEggICAgICAgICAgICAzMSAgICAgICAgICAvKiBzaGVsbMP8we61xNfutPOzpLbIICAgICAgKi8NCi0jZGVmaW5lIFNIRUxMX0NNRF9QQVJBTV9OVU0gICAgICAgICAxMiAgICAgICAgICAvKiBzaGVsbMP8we6yzsr9tcTX7rTzuPbK/SAgKi8NCi0jZGVmaW5lIFNIRUxMX0NNRF9QQVJBTV9MRU5HVEggICAgICAyMyAgICAgICAgICAvKiBzaGVsbMP8we6yzsr9tcTX7rTzs6S2yCAgKi8NCi0NCi0vKiC08tOhICovDQotI2RlZmluZSB6T3NzX1ByaW50ZiAgICAgICAgICAgICAgICAgelRvb2xzX1ByaW50Zg0KLSNkZWZpbmUgUFJJTlRfTEVWRUxfQUxMV0FZUyAgICAgICAgIDB4MDAgICAgICAgIC8qILG+vLax8Nfcyse08tOhICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBQUklOVF9MRVZFTF9ERUJVRyAgICAgICAgICAgMHgwMSAgICAgICAgLyogtffK1Ly2sfAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFBSSU5UX0xFVkVMX05PUk1BTCAgICAgICAgICAweDAyICAgICAgICAvKiDG1c2ovLax8CAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSNkZWZpbmUgUFJJTlRfTEVWRUxfU0VWRVJFICAgICAgICAgIDB4MDMgICAgICAgIC8qINHP1ti8trHwICAgICAgICAgICAgICAgICAgICAgICAgICovDQotI2RlZmluZSBQUklOVF9MRVZFTF9BQk5PUk1BTCAgICAgICAgMHgwNCAgICAgICAgLyog0uyzo7y2sfAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0jZGVmaW5lIFBSSU5UX0xFVkVMX1JBTSAgICAgICAgICAgICAweDA1ICAgICAgICAvKiC08tOhtb3E2rTmLL321Nq08tOhtPrA7dbQyrnTwyAgICAqLw0KLSNkZWZpbmUgUFJJTlRfTEVWRUxfRk9SQklEICAgICAgICAgIDB4ZmYgICAgICAgIC8qILK7tPLToSAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotLyogTlYgRUNDKi8NCi0jZGVmaW5lIFpPU1NfTlZfRUNDX0xPR19OUiAgICAgICAgICAoNikNCi0jZGVmaW5lIFpPU1NfTlZfRUNDX1dPUksgICAgICAgICAgICAoMSkNCi0jZGVmaW5lIFpPU1NfTlZfRUNDX0JBQ0tVUCAgICAgICAgICAoMikNCi0jZGVmaW5lIFpPU1NfTlZfRUNDX0JPVEggICAgICAgICAgICAoMykNCi0jZW5kaWYgLy8jaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZm5kZWYgRE9YWUdFTl9TSE9VTERfU0tJUF9USElTDQotLyogy6vP8sG0se3Eo7/pICovDQotdHlwZWRlZiBzdHJ1Y3QgdGFnX05PREUgICAgICAgIA0KLXsNCi0gICAgc3RydWN0IHRhZ19OT0RFICpuZXh0OyAgICAgIA0KLSAgICBzdHJ1Y3QgdGFnX05PREUgKnByZXZpb3VzOyAgDQotfVRfWk9zc19Ob2RlOw0KLQ0KLXR5cGVkZWYgc3RydWN0ICAgICAgICAgICAgICANCi17DQotICAgIFNJTlQzMiAgICAgIGNvdW50OyAgICAgICAgICAgICANCi0gICAgVF9aT3NzX05vZGUgKkhFQUQ7DQotICAgIFRfWk9zc19Ob2RlICpUQUlMOw0KLX1UX1pPc3NfTGlzdDsNCi0NCi0vKiC7t9DOu7qz5cSjv+kgKi8NCi10eXBlZGVmIHN0cnVjdCAgICAgDQotew0KLSAgICBTSU5UMzIgIHBUb0J1ZjsgICAgIC8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGJ1ZmZlciB3aGVyZSB0byB3cml0ZSBuZXh0ICAqLw0KLSAgICBTSU5UMzIgIHBGcm9tQnVmOyAgIC8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGJ1ZmZlciB3aGVyZSB0byByZWFkIG5leHQgICAqLw0KLSAgICBTSU5UMzIgIGJ1ZlNpemU7ICAgIC8qIHNpemUgb2YgcmluZyBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBDSEFSICAgICpidWY7ICAgICAgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX1UX1pPc3NfUmluZywgKlRfWk9zc19SaW5nSWQ7DQotDQotLyogtqjKscb3udzA7cSjv+kgMjAxMzA0MTXSxtbBb3NhLmgqLw0KLQ0KLS8qIElUQ8Sjv+kgMjAxMzA1MjMgyb6z/SovDQotDQotLyogcmFtZHVtcCC50r3Tuq/K/cDg0M0gKi8NCi10eXBlZGVmIFZPSUQgKCpUX3pPc3NfUmFtZHVtcEhvb2tGdW5jKShWT0lEKTsgDQotDQotLyogz/vPorncwO3Eo7/pICovDQotdHlwZWRlZiBzdHJ1Y3QNCi17DQotICAgIFRfWk9zc19Ob2RlICAgICBub2RlOw0KLSAgICBaT1NTX1RBU0tfSUQgICAgdF90YXNrX2lkOyAgICAgIC8qIMS/serIzs7xSUQgICAqLw0KLSAgICBaT1NTX1RBU0tfSUQgICAgc190YXNrX2lkOyAgICAgIC8qINS0yM7O8UlEICAgICAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgbXNnSUQ7ICAgICAgICAgIC8qIM/7z6JJRCAgICAgICAqLw0KLSAgICBVSU5UMTYgICAgICAgICAgbXNnTGVuOyAgICAgICAgIC8qIM/7z6LM5bOktsggICAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgc2VuZF9zdGF0ZTsgICAgIC8qIM/7z6K3osvN17TMrCAqLw0KLX1UX1pPc3NfVGFza01zZ0hlYWQ7ICAgICAgICAgICAgICAgIC8qIM/7z6LNtyAgICAgICAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBWT0lEICAgICptc2didWY7DQotICAgIFVJTlQxNiAgbXNnTGVuRVg7DQotfVRfWk9zc19UYXNrTXNnOyAgICAgICAgLyogz/vPoszlICovDQotDQotdHlwZWRlZiBVSU5UMzIgKCpUQVNLX1NFTkRfSE9PSykoVF9aT3NzX1Rhc2tNc2dIZWFkICpidWYsIFVJTlQ4IGRpcmUpOw0KLQ0KLS8qIMjOzvG53MDtxKO/6SAqLyAgICAgICAgICAgICAgICAgICAgDQotdHlwZWRlZiBWT0lEICgqRlVOQ19UQVNLRU5UUlkpKFVJTlQ4IHN0YXRlLCBVSU5UMzIgbXNnX2lkLCBVSU5UOCAqYnVmLCBVSU5UMTYgbXNnX2xlbiwgVUlOVDggKnByaXZhdGVfZGF0YSk7DQotDQotdHlwZWRlZiBzdHJ1Y3Qgc3RydVRDQg0KLXsNCi0gICAgVF9aT3NzX05vZGUgICAgIG5vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDLq8/ywbSx7b3hteMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogx/i31srHt/FTREzIzs7xICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMjOzvHWtNDQtcS0zsr9ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgQ0hBUiAgICAgICAgICAgIHRhc2tfbmFtZVtaT1NTX01BWF9UQVNLTkFNRV9MRU4gKyAxXTsgICAvKiDIzs7xw/sss6S2yNfutPM2MyAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEZVTkNfVEFTS0VOVFJZICB0YXNrRW50cnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogyM7O8cjrv9ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBUQVNLX1NFTkRfSE9PSyAgSG9va0VudHJ5WzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qILvYtfe6r8r9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgWk9TU19UQVNLX0lEICAgIHRhc2tfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7xSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFpPU1NfVEFTS19JRCAgICBzZW5kZXJfdGFza19pZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogz/vPotS0yM7O8UlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBaT1NTX1RIUkVBRF9JRCAgdGhyZWFkX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMv51NrP37PMSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVF9aT3NzX0xpc3QgICAgIG1zZ19xdWV1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7xz/vPorbTwdDBtLHtICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICBzdGFja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogttHVu7Tz0KEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgcHJpb3JpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMjOzvHTxc/IvLYoMC0zMSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICAgICAgICAgIHByaXZhdGVfZGF0YV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiDLvdPQyv2+3bOktsggICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICB0aW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogyM7O8bS0vajKsbzkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgc3RhY2tfdXNlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qINLR08O20dW7tPPQoSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICAgICAgICAgIHRhc2tfdGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7xv6rKvMqxvOQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICBtc2dfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogtbHHsMjOzvHP+8+iSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgZGlyZVs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIM/7z6Kytrvxt73P8iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDggICAgICAgICAgIHRocmVhZF9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDP37PMusUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQ4ICAgICAgICAgICBydW5fc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyog1MvQ0Ne0v/YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMjOzvHXtMysICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDggICAgICAgICAgICp0YXNrRGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7xyv2+3cf41rjV6yAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIHN0cnVjdCBzdHJ1VENCICAqbmV4dDsNCi0gICAgVUlOVDMyICAgICAgICAgIGNwdXRpbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7x1MvQ0GNwdcqxvOQgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIEZMT0FUICAgICAgICAgICBjcHVwZXJjZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogyM7O8WNwddW808PCyiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgICAgICAgICAgcnVudGltZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMjOzvHUy9DQyrG85CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICAgICAgICAgIG1hbGxvY19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiDIzs7xy/nTw21hbGxvY7Tz0KEgICAgICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICB1Yl9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogyM7O8cv508PE2rTms9i089ChICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgcmVzZXJ2ZWRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qILGjwfTOu6OstdrSu7j219a92s6qz7XNs76yzKzIzs7xserWvs67ICAgKi8NCi19VF9aT3NzX1RDQjsgICAgICAgICAgICAgICAgICAgICAgLyogyM7O8b/Y1sa/6SAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgVUlOVDggICAgICAgICAgIGlzX3VzZTsNCi0gICAgQ0hBUiAgICAgICAgICAgIHRhc2tfbmFtZVtaT1NTX01BWF9UQVNLTkFNRV9MRU4gKyAxXTsNCi0gICAgRlVOQ19UQVNLRU5UUlkgIHRhc2tfZW50cnk7DQotICAgIFVJTlQzMiAgICAgICAgICBwcmlvcml0eTsNCi0gICAgVUlOVDMyICAgICAgICAgIHN0YWNrX3NpemU7DQotICAgIFVJTlQzMiAgICAgICAgICBwcml2YXRlX2RhdGFfbGVuOw0KLSAgICBVSU5UOCAgICAgICAgICAgcHJvY2Vzc19ubzsNCi0gICAgVUlOVDggICAgICAgICAgIGFja19mbGFnOw0KLSNpZmRlZiBfVVNFX0hBTF9IUkRUU1QNCi0gICAgQk9PTCAgICAgICAgICAgIGhhcmRUZXN0RmxhZzsNCi0jZW5kaWYNCi19VF9aT3NzX1Rhc2tUYWJJdGVtOyAgICAvKiDIzs7xtce8x7HtICovDQotDQotLyogU0RMyM7O8SAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgVF9aT3NzX05vZGUgICAgIG5vZGU7ICAgICAgICAgICAvKiCxo8H0ICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogx/i31srHt/FTREzIzs7xICAqLw0KLSAgICBTSU5UMzIgICAgICAgICAgaW5kZXg7ICAgICAgICAgIC8qIMv30v0gICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICAgICAgICAgIHNlbGZfaWQ7DQotICAgIFpPU1NfVEhSRUFEX0lEICB0aHJlYWRfaWQ7ICAgICAgLyogy/nU2s/fs8xJRCAgICAgICAqLw0KLSAgICBWT0lEICAgICAgICAgICAgKnNlbGY7DQotICAgIFRBU0tfU0VORF9IT09LICBIb29rRW50cnlbM107ICAgLyogu9i197qvyv0gICAgICAgICAqLw0KLSAgICBVSU5UOCAgICAgICAgICAgZGlyZVs0XTsgICAgICAgIC8qIM/7z6Kytrvxt73P8iAgICAgKi8NCi19VF9aT3NzX1NETFRDQjsgICAgICAgICAgICAgICAgICAgICAvKiBTREzIzs7xv9jWxr/pICAgICovICAgIA0KLQ0KLXR5cGVkZWYgc3RydWN0IHNpZ25hbGNvZGVfZGVzYyANCi17DQotICAgIFVJTlQzMiAgc2VsZmlkOw0KLSAgICBDSEFSICAgIHRhc2tfbmFtZVtaT1NTX01BWF9UQVNLTkFNRV9MRU4gKyAxXTsNCi19IFRfWk9zc19TaWduYWxDb2RlX0Rlc2M7DQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBVSU5UMzIgICAgICAgICAgc2VsZmlkOw0KLSAgICBaT1NTX1RBU0tfSUQgICAgdGFza19pZDsNCi19dGFza3NkbF9kZXNjOw0KLS8qIHNoZWxsw/zB7iAqLw0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQ0hBUiAgICBjbWRbU0hFTExfQ01EX0xFTkdUSCArIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIMP8we7X1rf7tK6zpLbIICAgICAgICovDQotICAgIENIQVIgICAgcGFyYVtTSEVMTF9DTURfUEFSQU1fTlVNXVtTSEVMTF9DTURfUEFSQU1fTEVOR1RIICsgMV07ICAvKiCyzsr9ICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgIHBhcmFDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogss7K/bj2yv0gICAgICAgICAgICAgKi8NCi19VF9TaGVsbF9Db21tYW5kTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlaGxsw/zB7s/7z6K94bm5zOUgICovDQotDQotdHlwZWRlZiBWT0lEICgqU2hlbGxfRnVuYykoVF9TaGVsbF9Db21tYW5kTWVzc2FnZSAqQ21kTXNnKTsgICAgICAgICAvKiBzaGVsbMP8we7Ktc/Wuq/K/da41esgKi8NCi0NCi0vKiC2r8ysxeTWw8Dg0M22qNLlICovDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBVSU5UOCAoKnBQcmlvTWFwKVszMl07DQotfVRfT1NBX1BBUkFNOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgVUlOVDMyICAgICAgICAgIHViX3Bvb2xfbnVtOyAgICAvKiDE2rTms9i49sr9LCDX7rTzsrvE3LOsuf0yNTUgICovDQotICAgIFRfWk9zc19VQlBPT0wgICAqVUJQb29sOyAgICAgICAgLyogxNq05rPYxeTWw7Ht1rjV6yAgICAgICAgICAgICAqLw0KLX1UX01FTV9QQVJBTTsgICAgICAgICAgICAgICAgICAgICAgIC8qIMTatObEo7/pICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIFVJTlQzMiAgbWF4X3Rhc2tfbnVtOyAgICAgICAgICAgLyog1+6088jOzvHK/SAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgIG1heF9zY2h0aHJlYWRfbnVtOyAgICAgIC8qILX3tsjP37PMyv2jrNfutuAxMCAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICBtYXhfbXNnX3F1ZXVlX2xlbjsgICAgICAvKiDIzs7xz/vPorbTwdCzpLbIICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgZGVhZGxvb3BfdGltZTsgICAgICAgICAgLyogy8DRrbu3xdC2z8qxvOQsILWlzrtzICAgICAgICAqLw0KLX1UX1RBU0tfUEFSQU07ICAgICAgICAgICAgICAgICAgICAgIC8qIMjOzvHEo7/pICAgICAgICAgICAgICAgICAgICAgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIFVJTlQzMiAgU2NoUHJpbzsgICAgICAgICAgICAgICAgLyogtqjKscb3tfe2yM/fs8zTxc/IvLYwLTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICBDYWxsQmFja1N0YWNrOyAgICAgICAgICAvKiC2qMqxxve72LX3uq/K/c/fs8y20dW7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLSAgICBVSU5UMzIgIENhbGxCYWNrUHJpbzsgICAgICAgICAgIC8qILaoyrHG97vYtfe6r8r9z9+zzNPFz8i8tqOssdjQ67XN09q197bIz9+zzNPFz8i8tqOs0ruw486qU2NoUHJpbysxICAgICovDQotICAgIFVJTlQzMiAgTWluVGltZUxlbjsgICAgICAgICAgICAgLyogtqjKscb31+7QobXEs6zKscqxvOQstaXOu7rBw+sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICBNYXhUaW1lTnVtOyAgICAgICAgICAgICAvKiDX7rTztqjKscb3uPbK/SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLX1UX1RJTUVSX1BBUkFNOyAgICAgICAgICAgICAgICAgICAgIC8qILaoyrHG98Sjv+kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBVSU5UMzIgIERlYWRMb29wQ2hlY2tUaW1lOyAgICAgIC8qIMvA0a27t7zssunKsbzkICAgICAgICAgICAgICAgICAgICovDQotICAgIFVJTlQzMiAgVXBkYXRlQ1BVVGltZTsgICAgICAgICAgLyogy6LQwkNQVcq508PCysqxvOQgICAgICAgICAgICAgICAgKi8NCi0gICAgVUlOVDMyICBEZWFtb25TdGFydFRpbWU7ICAgICAgICAvKiDPtc2zs/XKvLuvuvNFeGNlcMjOzvHG9LavtcTKsbzkICAqLw0KLX1UX0VYQ0VQX1BBUkFNOyAgICAgICAgICAgICAgICAgICAgIC8qINLss6PEo7/pICAgICAgICAgICAgICAgICAgICAgICAgICovDQotDQotdHlwZWRlZiBzdHJ1Y3QgDQotew0KLSAgICBUX1pPc3NfVGFza1RhYkl0ZW0gICpwU3lzbV9UYXNrSXRlbVRhYjsNCi0gICAgVUlOVDMyICAgICAgICAgICAgICB0YXNrX251bTsNCi19VF9TWVNNX1BBUkFNOyAgLyogc3lzbcSjv+kgKi8NCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIFVJTlQzMiAgKnBOdkFkZHJDZmc7DQotICAgIFVJTlQzMiAgYWRkckNmZ051bTsNCi0gICAgVk9JRCAgICAqcFJldk52Q2ZnOw0KLSAgICBVSU5UMzIgIHJldk52Q2ZnTnVtOw0KLSAgICBVSU5UMzIgIE5WX1dvcmtfQXJlYV9CYXNlX0FkZHI7ICAgICAgIC8qIE5WuaTX98f4u/m12Na3ICAgICAgICovDQotICAgIFVJTlQzMiAgTlZfU3RhcnRfQmFja3VwX0Jhc2VfQWRkcjsgICAgLyogsbi33b/ptcTG8Mq8tdjWtyAgICAgKi8NCi0gICAgVUlOVDMyICBOVl9CYWNrdXBfQXJlYV9CYXNlX0FkZHI7ICAgICAvKiBOVrG4t93H+Lv5tdjWtyAgICAgICAqLyAgICANCi0gICAgVUlOVDMyICBOVl9CYWNrdXBfQXJlYV9TaXplOyAgICAgICAgICAvKiBOVrG4t93H+LTz0KEgICAgICAgICAqLw0KLSAgICBVSU5UMzIgIE5WX0ZhY3RvcnlfQXJlYV9CYXNlX0FkZHI7ICAgIC8qIE5Ws/azp8f4u/m12Na3ICAgICAgICovDQotICAgIFVJTlQzMiAgTlZfRmFjdG9yeV9BcmVhX1NpemU7ICAgICAgICAgLyogTlaz9rOnx/i089ChICAgICAgICAgKi8NCi0gICAgVUlOVDMyICBOVl9Xb3JrX0FyZWFfU3ltYm9sX0FkZHI7ICAgICAvKiC5pNf3x/jQtLHq1r7Ou7XY1rcgICAqLw0KLSAgICBVSU5UMzIgIE5WX0JhY2t1cF9BcmVhX1N5bWJvbF9BZGRyOyAgIC8qILG4t93H+NC0serWvs67tdjWtyAgICovDQotICAgIFVJTlQzMiAgTlZfRmFjdG9yeV9BcmVhX1N5bWJvbF9BZGRyOyAgLyogs/azp8f4serWvs67tdjWtyAgICAgKi8NCi0gICAgVUlOVDMyICBOVl9SZXNldF9GYWN0b3J5X1N5bWJvbF9BZGRyOyAvKiC71ri0s/azp8no1sOx6ta+tdjWtyAqLw0KLSAgICBVSU5UMzIgIE5WX0VjY19sb2dfQWRkcjsgICAgICAgICAgICAgIC8qIEVjYyBMb2e5pNf3x/i12Na3ICAgICovDQotICAgIFVJTlQzMiAgTlZfQmxvY2tfU2l6ZTsgICAgICAgICAgICAgICAgLyogv+m089ChICAgICAgICAgICAgICAgKi8NCi19VF9OVlJBTV9QQVJBTTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOVlJBTcf40/K12Na30MXPoiAgICAqLw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBVSU5UOCAgY291bnQ7DQotICAgIFVJTlQ4ICBpbmRleDsNCi0gICAgVUlOVDggIHR5cGVbWk9TU19OVl9FQ0NfTE9HX05SXTsNCi0gICAgVUlOVDMyIHRpY2tbWk9TU19OVl9FQ0NfTE9HX05SXTsNCi0gICAgVUlOVDMyIGFkZHJbWk9TU19OVl9FQ0NfTE9HX05SXTsNCi19VF9aT3NzX052RWNjTG9nOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBVSU5UMzIgIFdvcmtfQXJlYV9CYXNlX0FkZHI7ICAgICAgIC8qIHZTSU25pNf3x/i7+bXY1rcgICAqLw0KLSAgICBVSU5UMzIgIEJhY2t1cF9BcmVhX0Jhc2VfQWRkcjsgICAgIC8qIHZTSU2xuLfdx/i7+bXY1rcgICAqLyAgICANCi0gICAgVUlOVDMyICBGYWN0b3J5X0FyZWFfQmFzZV9BZGRyOyAgICAvKiB2U0lNs/azp8f4u/m12Na3ICAgKi8NCi0gICAgVUlOVDMyICBBcmVhX1NpemU7ICAgICAgICAgICAgICAgICAvKiB2U0lNtaW49sf4tPPQoSAgICAgKi8NCi0gICAgVUlOVDMyICBXb3JrX0FyZWFfU3ltYm9sX0FkZHI7ICAgICAvKiC5pNf3x/jQtLHq1r7Ou7XY1rcgKi8NCi0gICAgVUlOVDMyICBCYWNrdXBfQXJlYV9TeW1ib2xfQWRkcjsgICAvKiCxuLfdx/jQtLHq1r7Ou7XY1rcgKi8NCi0gICAgVUlOVDMyICBGYWN0b3J5X0FyZWFfU3ltYm9sX0FkZHI7ICAvKiCz9rOnx/ix6ta+zru12Na3ICAgKi8NCi19VF92U0lNX1BBUkFNOw0KLQ0KLXR5cGVkZWYgc3RydWN0IA0KLXsNCi0gICAgQ0hBUiAgICBXaW5EaXNrWzRdOyAgICAvKiB3aW5kb3dzxcy3+yAgICAgICovDQotICAgIENIQVIgICAgTGludXhQYXRoWzIwXTsgLyogwOBsaW51eMnosbjD+yAgICAqLw0KLSAgICBDSEFSICAgIEZvcm1hdFsyMF07ICAgIC8qIM7EvP7Ptc2zwODQzSAgICAgKi8NCi0gICAgQ0hBUiAgICBEZXZpY2VbMjBdOyAgICAvKiDJ6LG4w/sgICAgICAgICAgICovDQotICAgIENIQVIgICAgUGFyYW1zWzEwMF07ICAgLyogz+C52LLOyv0gICAgICAgICAqLw0KLSAgICBDSEFSICAgIE1hbmFnZXJbNDBdOyAgIC8qILncwO3P37PMw/sgICAgICAgKi8NCi19VF9PU0FfRElTS01BUDsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIFRfT1NBX0RJU0tNQVAgICAqZGlza01hcDsNCi0gICAgVUlOVDMyICAgICAgICAgIGRpc2tOdW07DQotfVRfRElTS19QQVJBTTsNCi0NCi10eXBlZGVmIFZPSUQgKCpyYW1kdW1wX0hvb2spKFZPSUQpOw0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICByYW1kdW1wX0hvb2sgcmFtZHVtcF9Qcm9jZXNzX1ByZUhvb2s7DQotICAgIHJhbWR1bXBfSG9vayByYW1kdW1wX1Byb2Nlc3NfQWZ0SG9vazsNCi19VF96T3NzX1JhbWR1bXBPcHQ7DQotDQotDQotdHlwZWRlZiBWT0lEICgqcmFtZHVtcF9Jb0luaXQpKFZPSUQpOw0KLXR5cGVkZWYgVk9JRCAoKnJhbWR1bXBfSW9SZWFkRGF0YSkoVUlOVDggKmJ1ZmZlciwgVUlOVDMyIHNpemUpOw0KLXR5cGVkZWYgVk9JRCAoKnJhbWR1bXBfSW9Xcml0ZURhdGEpKFVJTlQ4ICpidWZmZXIsIFVJTlQzMiBzaXplKTsNCi10eXBlZGVmIFZPSUQgKCpyYW1kdW1wX0lvRmluaXNoKShWT0lEKTsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgcmFtZHVtcF9Jb0luaXQgICAgICBpbml0Ow0KLSAgICByYW1kdW1wX0lvUmVhZERhdGEgIHJlYWQ7DQotICAgIHJhbWR1bXBfSW9Xcml0ZURhdGEgd3JpdGU7DQotICAgIHJhbWR1bXBfSW9GaW5pc2ggICAgZmluaXNoOw0KLX0gVF96T3NzX1JhbWR1bXBJb09wdDsNCi0NCi10eXBlZGVmIHN0cnVjdA0KLXsNCi0gICAgVUlOVDMyICBiYXNlRm9yU2VydmVyOw0KLSAgICBVSU5UMzIgIGJhc2VGb3JTZWxmOw0KLSAgICBVSU5UMzIgIGJhc2VGb3JDb3B5Ow0KLSAgICBVSU5UMzIgIHNpemU7DQotfSBUX3pPc3NfUmFtZHVtcFJlZ2lvbjsNCi0NCi10eXBlZGVmIHN0cnVjdCANCi17DQotICAgIFRfT1NBX1BBUkFNICAgICBPc2FDZmc7ICAgICAvKiBvc2HF5NbDICAgICAgICAgICAgICAqLw0KLSAgICBUX0RJU0tfUEFSQU0gICAgRGlza01hcDsgICAgLyogtMXFzNOzyeTF5NbDICAgICAgICAgKi8NCi0gICAgVF9NRU1fUEFSQU0gICAgIE1lbUNmZzsgICAgIC8qIMTatObF5NbDICAgICAgICAgICAgICovDQotICAgIFRfVEFTS19QQVJBTSAgICBUYXNrQ2ZnOyAgICAvKiDIzs7xxeTWwyAgICAgICAgICAgICAqLw0KLSAgICBUX1RJTUVSX1BBUkFNICAgVGltZXJDZmc7ICAgLyogtqjKscb3xeTWwyAgICAgICAgICAgKi8NCi0gICAgVF9FWENFUF9QQVJBTSAgIEV4Y2VwQ2ZnOyAgIC8qINLss6PF5NbDICAgICAgICAgICAgICovDQotICAgIFRfU1lTTV9QQVJBTSAgICBTeXNtQ2ZnOyAgICAvKiBzeXNtdMXk1sMgICAgICAgICAgICAqLw0KLSAgICBUX05WUkFNX1BBUkFNICAgTnZyYW1DZmc7ICAgLyogTnbF5NbDICAgICAgICAgICAgICAgKi8NCi0gICAgVF92U0lNX1BBUkFNICAgIHZTSU1DZmc7ICAgIC8qIHZTaW3F5NbDICAgICAgICAgICAgICovDQotI2lmZGVmIF9VU0VfUFNNDQotI2lmZGVmIF9VU0VfUFNNX05FV19GUkFNRVdPUksNCi0gICAgVF96UHNtX1BhcmFtICAgIFBzbUNmZzsgICAgIC8qIFBzbcXk1sMgICAgICAgICAgICAgICovDQotI2Vsc2UNCi0gICAgVF9QU01fUEFSQU0gICAgIFBzbUNmZzsgICAgIC8qIFBzbcXk1sMgICAgICAgICAgICAgICovDQotI2VuZGlmDQotI2VuZGlmDQotfVRfT1NTX1BBUkFNOyAgICAgICAgICAgICAgICAgICAvKiDV+7j2T1NTtq/MrMXk1sPA4NDNICAqLw0KLQ0KLXR5cGVkZWYgZW51bSANCi17DQotICAgIFNZU19SRVNFVF9UT19OT1JNQUwsDQotICAgIFNZU19SRVNFVF9UT19DSEFSR0VSLA0KLSAgICBTWVNfUkVTRVRfVE9fQUxSQU0sDQotICAgIFNZU19SRVNFVF9UT19FWENFUFRSRVNFVCwNCi0gICAgU1lTX01BWF9SRVNFVF9UWVBFLA0KLX0gVF9aT3NzU3lzX1JFU0VUX1RZUEU7DQotI2VuZGlmIC8vI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUw0KLS8qIE9TQcSjv+mz9cq8u68gKi8NCi1VSU5UMzIgT1NBX0luaXQoVk9JRCk7DQotDQotLyogz7XNs7ncwO3Eo7/pICovDQotVUlOVDMyIHpPc3NfSW5pdChWT0lEKTsNCi1VSU5UMzIgek9zc19UYXNrSW5pdChWT0lEKTsNCi1VSU5UMzIgek9zc19TdGFydChWT0lEKTsNCi1WT0lEIHpPc3NfVGFza1N0YXJ0T0soVk9JRCk7DQotVUlOVDMyIHpPc3NfU3lzUG93ZXJkb3duKFZPSUQpOw0KLVZPSUQgek9zc19TeXNTb2Z0UmVzZXQoVF9aT3NzU3lzX1JFU0VUX1RZUEUgdHlwZSk7DQotVF9PU1NfUEFSQU0gKnpPc3NfR2V0T3NzQ2ZnKFZPSUQpOw0KLQ0KLS8qIMjOzvG53MDtxKO/6SAqLw0KLVVJTlQzMiB6T3NzX1Rhc2tfSG9va1NldChVSU5UOCB0eXBlLCBWT0lEICpIb29rRnVuYyk7DQotWk9TU19UQVNLX0lEIHpPc3NfQ3JlYXRlVGFzayhjb25zdCBDSEFSICp0YXNrX25hbWUsIEZVTkNfVEFTS0VOVFJZIHRhc2tfZW50cnksIFVJTlQzMiBzdGFja19zaXplLCBVSU5UMzIgcHJpb3JpdHksIFVJTlQzMiBwcml2YXRlX2RhdGFfbGVuLCBVSU5UOCBwbm8pOw0KLVVJTlQzMiB6T3NzX0RlbGV0ZVRhc2soWk9TU19UQVNLX0lEIHRhc2tfaWQpOw0KLVVJTlQzMiB6T3NzX0dldFRhc2tJbmZvKFpPU1NfVEFTS19JRCB0YXNrX2lkLCBUX1pPc3NfVENCICp0YXNrX2luZm8pOw0KLUNIQVIgKnpPc3NfR2V0VGFza05hbWUoWk9TU19UQVNLX0lEIHRhc2tfaWQpOw0KLVVJTlQzMiB6T3NzX0dldEFsbFRhc2tJRChaT1NTX1RBU0tfSUQgKnRhc2tfaWRfYXJyKTsNCi1aT1NTX1RBU0tfSUQgek9zc19HZXRUYXNrSUQoY29uc3QgQ0hBUiAqdGFza19uYW1lKTsNCi1aT1NTX1RBU0tfSUQgek9zc19HZXRTZWxmVGFza0lEKFZPSUQpOw0KLVVJTlQzMiB6T3NzX1NldFN0YXRlKFVJTlQ4IG5leHRfc3RhdGUpOw0KLVVJTlQzMiB6T3NzX1JlZ1Rhc2tTZW5kSG9vayhaT1NTX1RBU0tfSUQgdGFza19pZCwgVUlOVDggaG9va3R5cGUsIFVJTlQ4IGRpcmUsIFRBU0tfU0VORF9IT09LIGludGVyY2VwdF9FbnRyeSk7DQotVUlOVDMyIHpPc3NfVGFza1NlbmQoVUlOVDMyIG1zZ19pZCwgY29uc3QgVk9JRCAqbXNnX2J1ZiwgVUlOVDE2IG1zZ19sZW4sIFpPU1NfVEFTS19JRCB0YXNrX2lkKTsNCi1VSU5UMzIgek9zc19UYXNrU2VuZERhdGEoVUlOVDMyIG1zZ19pZCwgVk9JRCAqYnVmLCBVSU5UMTYgbXNnX2xlbiwgWk9TU19UQVNLX0lEIHRhc2tfaWQpOw0KLVpPU1NfVEFTS19JRCB6T3NzX1NlbmRlcihWT0lEKTsNCi0NCi0vKiByYW1kdW1wICovDQotI2lmZGVmIF9VU0VfTVVMVElfQ09SRV9SQU1EVU1QDQotVk9JRCB6T3NzX1JhbWR1bXBTZXRPcGVyYXRpb24oVF96T3NzX1JhbWR1bXBPcHQgKmZ1bmNPYmpQdHIpOw0KLVZPSUQgek9zc19SYW1kdW1wQ29uZmlndXJlTWVtKFRfek9zc19SYW1kdW1wUmVnaW9uICpyZWdpb25JbmZvKTsNCi0jZWxzZQ0KLVZPSUQgek9zc19SYW1kdW1wQ29uZmlndXJlTWVtKFVJTlQzMiBiYXNlLCBVSU5UMzIgc2l6ZSwgVUlOVDMyIG1hcF9iYXNlLCBVSU5UMzIgY29weV9iYXNlKTsNCi1WT0lEIHpPc3NfUmFtZHVtcEhvb2tJbnN0YWxsKFRfek9zc19SYW1kdW1wSG9va0Z1bmMgaG9vayk7DQotI2VuZGlmDQotVk9JRCB6T3NzX1JhbWR1bXBTZXRJb09wdChUX3pPc3NfUmFtZHVtcElvT3B0IGhvb2spOw0KLQ0KLS8qIE5WstnX973Tv9ogKi8NCi1VSU5UMzIgek9zc19Odkl0ZW1Xcml0ZShVSU5UMzIgTnZJdGVtSUQsIFVJTlQ4ICpOdkl0ZW1EYXRhLCBVSU5UMzIgTnZJdGVtTGVuKTsNCi1VSU5UMzIgek9zc19Odkl0ZW1SZWFkKFVJTlQzMiBOdkl0ZW1JRCwgVUlOVDggKk52SXRlbURhdGEsIFVJTlQzMiBOdkl0ZW1MZW4pOw0KLVVJTlQzMiB6T3NzX1Jlc2V0TlZGYWN0b3J5KFZPSUQpOw0KLVVJTlQzMiB6T3NzX052cmFtRmx1c2goVk9JRCk7DQotVk9JRCB6T3NzX052U2V0RXJyb3JBZGRyKFVJTlQzMiBhZGRyKTsNCi1CT09MIHpPc3NfTnZJblJlc3VtZShWT0lEKTsNCi1WT0lEIHpPc3NfTnZDaGVjayhWT0lEKTsNCi1WT0lEIHpPc3NfTnZXcml0ZUZhY3RvcnkoVk9JRCk7DQotVk9JRCB6T3NzX052U2NhbkJhY2tVcEFyZWEoVk9JRCk7DQotVUlOVDMyIHpPc3NfTnZHZXRFY2NMb2dJbmZvKFRfWk9zc19OdkVjY0xvZyAqbG9nSW5mbyk7DQotVUlOVDMyIHpPc3NfQ2hhbmdlTnZyb0F0dHIoaW50IHdyaXRhYmxlKTsNCi1VSU5UMzIgTnZyYW1fRmx1c2goVk9JRCk7DQotVUlOVDMyIE52cmFtX0ZpbmlzaChWT0lEKTsNCi0NCi0vKiBWU0lNstnX973Tv9ogKi8NCi1VSU5UMzIgek9zc192U0lNSW5pdChWT0lEKTsNCi1VSU5UMzIgek9zc192U0lNRGF0YVJlYWQoVUlOVDMyIGFkZHIsIFZPSUQgKmRhdGEsIFVJTlQzMiBsZW4pOw0KLVVJTlQzMiB6T3NzX3ZTSU1EYXRhV3JpdGUoVUlOVDMyIGFkZHIsIFZPSUQgKmRhdGEsIFVJTlQzMiBsZW4pOw0KLVVJTlQzMiB6T3NzX3ZTSU1GYWNXcml0ZShWT0lEICpkYXRhLCBVSU5UMzIgbGVuKTsNCi1VSU5UMzIgek9zc192U0lNUmVjb3ZlcnkoVk9JRCk7DQotDQotLyogtPLToSAqLw0KLVVJTlQzMiB6VG9vbHNfUHJpbnRmKFVJTlQzMiBuTW9kTm8sIFVJTlQ4IG5QcmludExldmVsLCBjb25zdCBWT0lEICpwRm9ybWF0LCAuLi4pOw0KLVZPSUQgek9zc19SYW1Mb2coQ0hBUiAqcmFtYnVmLCBVSU5UMzIgcmVzdHJpY3QpOw0KLVZPSUQgek9zc19SYW1QcmludGYoVk9JRCk7DQotDQotLyogzqyy4iAqLw0KLVVJTlQzMiB6T3NzX0RlYnVnSW5mb1JlY29yZChVSU5UMzIgaWQsIGNvbnN0IFZPSUQgKnBGb3JtYXQsIC4uLik7DQotDQotLyogc2hlbGzEo7/pICovDQotVUlOVDMyIHpPc3NfQWRkU2hlbGxDbWQoY29uc3QgQ0hBUiAqY21kX25hbWUsIGNvbnN0IFNoZWxsX0Z1bmMgZnVuYywgY29uc3QgQ0hBUiAqZGVzY3JpcHRpb24pOw0KLQ0KLS8qIL+0w8W5tyAqLw0KLVZPSUQgek9zc19XYXRjaERvZ0VuYWJsZShCT09MIGVuYWJsZSk7DQotDQotLyogQ1JD0KPR6SAqLw0KLVVJTlQ4IENvbW1fQ3JjQ2FsYyhjb25zdCBVSU5UOCAqYnVmLCBVSU5UOCBsZW4pOw0KLVNJTlQzMiBDb21tX0NyY0NoZWNrKFVJTlQ4ICpidWYsIFVJTlQ4IGxlbiwgVUlOVDggY3JjKTsNCi0NCi0vKiC147XGxKO/6SAqLw0KLVZPSUQgek9zc19TZXRUcmFuc0RhdGFGbGFnKFZPSUQpOw0KLUJPT0wgek9zc19HZXRUcmFuc0RhdGFGbGFnKFZPSUQpOw0KLQ0KLS8qIMrCvP7X6SAqLw0KLVpPU1NfRVZFTlRfSUQgek9zc19DcmVhdGVFdmVudChjb25zdCBDSEFSICpuYW1lKTsNCi1VSU5UMzIgek9zc19HZXRFdmVudChaT1NTX0VWRU5UX0lEIGV2ZW50SWQsIFVJTlQzMiBldmVudHMsIFVJTlQzMiBnZXRPcHRpb25zLCBVSU5UMzIgKnBFdmVudHNSZWNlaXZlZCwgVUlOVDMyIHRpbWVvdXQpOw0KLVVJTlQzMiB6T3NzX1NldEV2ZW50KFpPU1NfRVZFTlRfSUQgZXZlbnRJZCwgVUlOVDMyIGV2ZW50cywgVUlOVDMyIHNldE9wdGlvbnMpOw0KLVVJTlQzMiB6T3NzX0RlbGV0ZUV2ZW50KFpPU1NfRVZFTlRfSUQgZXZlbnRJZCk7DQotVUlOVDMyIHpPc3NfUXVlcnlFdmVudChaT1NTX0VWRU5UX0lEIGV2ZW50SWQpOw0KLUJPT0wgICB6T3NzX1dhaXRpbmdFdmVudChaT1NTX0VWRU5UX0lEIGV2ZW50SWQpOw0KLQ0KLS8qILu30M67urPlICovIA0KLUJPT0wgek9zc19SaW5nSXNFbXB0eShUX1pPc3NfUmluZ0lkIHJpbmdfaWQpOyANCi1CT09MIHpPc3NfUmluZ0lzRnVsbChUX1pPc3NfUmluZ0lkIHJpbmdfaWQpOw0KLVRfWk9zc19SaW5nSWQgek9zc19SaW5nQ3JlYXRlKFNJTlQzMiBuYnl0ZXMpOyANCi1TSU5UMzIgek9zc19SaW5nQnVmR2V0KFRfWk9zc19SaW5nSWQgcmluZ19pZCwgQ0hBUiAqYnVmZmVyLCBTSU5UMzIgbWF4Ynl0ZXMpOyANCi1TSU5UMzIgek9zc19SaW5nQnVmUHV0KFRfWk9zc19SaW5nSWQgcmluZ19pZCwgQ0hBUiAqYnVmZmVyLCBTSU5UMzIgbmJ5dGVzKTsNCi1TSU5UMzIgek9zc19SaW5nRnJlZUJ5dGVzKFRfWk9zc19SaW5nSWQgcmluZ19pZCk7DQotU0lOVDMyIHpPc3NfUmluZ05CeXRlcyhUX1pPc3NfUmluZ0lkIHJpbmdfaWQpOw0KLVZPSUQgek9zc19SaW5nRGVsZXRlKFRfWk9zc19SaW5nSWQgcmluZ19pZCk7DQotVk9JRCB6T3NzX1JpbmdGbHVzaChUX1pPc3NfUmluZ0lkIHJpbmdfaWQpOw0KLVZPSUQgek9zc19SaW5nTW92ZUFoZWFkKFRfWk9zc19SaW5nSWQgcmluZ19pZCwgU0lOVDMyIG4pOw0KLVZPSUQgek9zc19SaW5nUHV0QWhlYWQoVF9aT3NzX1JpbmdJZCByaW5nX2lkLCBDSEFSIGJ5dGUsIFNJTlQzMiBvZmZzZXQpOw0KLQ0KLS8qIM/7z6K208HQICovDQotWk9TU19RVUVVRV9JRCB6T3NzX1F1ZXVlQ3JlYXRlKGNvbnN0IENIQVIgKnF1ZXVlX25hbWUsIFVJTlQzMiBtYXhNc2dzLCBVSU5UMzIgbWF4TXNnTGVuKTsNCi1VSU5UMzIgek9zc19RdWV1ZVNlbmQoWk9TU19RVUVVRV9JRCBxdWV1ZV9pZCwgVk9JRCAqbXNnX3B0ciwgVUlOVDMyIHNpemUsIFVJTlQzMiB0aW1lb3V0LCBVSU5UMzIgcHJpb3JpdHkpOw0KLVVJTlQzMiB6T3NzX1F1ZXVlUmVjdihaT1NTX1FVRVVFX0lEIHF1ZXVlX2lkLCBWT0lEICpidWZmZXIsIFVJTlQzMiBtYXhzaXplLCBVSU5UMzIgdGltZW91dCk7DQotVUlOVDMyIHpPc3NfUXVldWVGcmVlQ291bnQoWk9TU19RVUVVRV9JRCBxdWV1ZV9pZCk7DQotVUlOVDMyIHpPc3NfUXVldWVEZWxldGUoWk9TU19RVUVVRV9JRCBxdWV1ZV9pZCk7DQotDQotLyogudy1wCAqLw0KLVVJTlQzMiB6T3NzX1BpcGVEZXZDcmVhdGUoY29uc3QgQ0hBUiAqbmFtZSwgU0lOVDMyIG5CeXRlcyk7DQotVUlOVDMyIHpPc3NfUGlwZURldkRlbGV0ZShjb25zdCBDSEFSICpuYW1lLCBCT09MIGZvcmNlKTsNCi0NCi0vKiBDYWhjZb3Tv9ogKi8NCi1WT0lEIHpPc3NfQ2FjaGVDbGVhblJhbmdlKFVJTlQzMiBiYXNlLCBVSU5UMzIgc2l6ZSk7DQotVk9JRCB6T3NzX0NhY2hlSW52YWxpZGF0ZVJhbmdlKFVJTlQzMiBiYXNlLCBVSU5UMzIgc2l6ZSk7DQotVk9JRCB6T3NzX0NhY2hlQ2xlYW5SYW5nZUZhc3QoVUlOVDMyIGJhc2UsIFVJTlQzMiBzaXplKTsNCi1WT0lEIHpPc3NfQ2FjaGVJbnZhbGlkYXRlUmFuZ2VGYXN0KFVJTlQzMiBiYXNlLCBVSU5UMzIgc2l6ZSk7DQotVk9JRCB6T3NzX0lvUmVtYXBQYWdlcyhWT0lEICpiYXNlLCBVSU5UMzIgc2l6ZSk7DQotDQotLyogc3bJ6NbDu/HIob3Tv9ogKi8NCi1VSU5UOCB6T3NzX0dldFN2Q29uZmlnKFZPSUQpOw0KLVZPSUQgek9zc19TZXRTdkNvbmZpZyhVSU5UOCBzdik7DQotDQotLyogtqjKscb3udzA7cSjv+kgKi8NCi0jaWZkZWYgX1VTRV9QU00NCi1WT0lEIHpPc3NfU2V0VGltZXJfUHNtRmxhZyhaT1NTX1RJTUVSX0lEIHRpbWVfaWQsIEJPT0wgRmxhZyk7DQotVUlOVDMyIHpPc3NfR2V0UHNfU2xlZXBUaW1lcihWT0lEKTsNCi0jZW5kaWYNCi0NCi0jZW5kaWYgLy8jaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUw0KLQ0KLS8qKg0KLSAqIEBicmllZiDJ6NbDt8fW3Mba0NTIzs7xtqjKscb3DQotICogQHBhcmFtIHRpbWVfbGVuICDI67LOo6zKsbOko6y1pc67o7ptcw0KLSAqIEBwYXJhbSBtc2dfaWQgICAgyOuyzqOstqjKsbW9uvMst6LLzbj4yejWw7aoyrHG98jOzvG1xM/7z6JpZA0KLSAqIEBwYXJhbSBhcmcgICAgICAgyOuyzqOsuL2807LOyv0stqi0q7XduPjIzs7xyOu/2rqvyv21xGJ1ZtDOss60y8qxbXNnX2xlbta1zqo0KHNpemVvZihVSU5UMzIvYXJnKSkNCi0gKiBAcmV0dXJuILPJuaY6z+DTprXEtqjKscb3serKtjsgyqew3DpaT1NTX0lOVkFMSURfVElNRVJfSUQNCi0gKiBAcmV0dmFsIFpPU1NfVElNRVJfSUTA4NDNtcSx6sq2ICAgILPJuaYNCi0gKiBAcmV0dmFsIFpPU1NfSU5WQUxJRF9USU1FUl9JRCAgICAgIMqnsNwNCi0gKiBAbm90ZSAgyejWw8qxv8zOqrLOv7y14yy+rbn91ri2qMqxvOS68ywgz/LJ6NbDtqjKscb3tcTIzs7xt6LLzda4tqjP+8+isqLX1Lavys23xbaoyrHG98v51bzXytS0DQotICogQHdhcm5pbmcgILHY0OjU2sjOzvHE2rX308MNCi0gKi8NCi1aT1NTX1RJTUVSX0lEIHpPc3NfU2V0UmVsYXRpdmVUaW1lcihVSU5UMzIgdGltZV9sZW4sIFVJTlQzMiBtc2dfaWQsIFVJTlQzMiBhcmcpOw0KLQ0KLS8qKg0KLSAqIEBicmllZiDJ6NbDt8fW3Mba0NTIzs7xtqjKscb3z/LEv7HqyM7O8beiy83P+8+iDQotICogQHBhcmFtIHRpbWVfbGVuICAgICAgIMjrss6jrMqxs6SjrLWlzrujum1zDQotICogQHBhcmFtIG1zZ19pZCAgICAgICAgIMjrss6jrLaoyrG1vbrzLLeiy824+Mno1sO2qMqxxvfIzs7xtcTP+8+iaWQNCi0gKiBAcGFyYW0gYXJnICAgICAgICAgICAgyOuyzqOsuL2807LOyv0stqi0q7XduPjIzs7xyOu/2rqvyv21xGJ1ZtDOss60y8qxbXNnX2xlbta1zqo0KHNpemVvZihVSU5UMzIvYXJnKSkNCi0gKiBAcGFyYW0gZGVza190YXNrX2lkICAgyOuyzqOs1ri2qMS/serIzs7xo6zI57n7xL+x6sjOzvHOqr/VyrGjrL2rt6LLzcno1sO2qMqxxve1xMjOzvENCi0gKiBAcmV0dXJuILPJuaY6z+DTprXEtqjKscb3serKtjsgyqew3DpaT1NTX0lOVkFMSURfVElNRVJfSUQNCi0gKiBAcmV0dmFsIFpPU1NfVElNRVJfSUTA4NDNtcSx6sq2ICAgILPJuaYNCi0gKiBAcmV0dmFsIFpPU1NfSU5WQUxJRF9USU1FUl9JRCAgICAgIMqnsNwNCi0gKiBAbm90ZSANCi0gKiBAd2FybmluZyANCi0gKi8NCi1aT1NTX1RJTUVSX0lEIHpPc3NfU2V0UmVsYXRpdmVUaW1lckJ5VGFza0lkKFVJTlQzMiB0aW1lX2xlbiwgVUlOVDMyIG1zZ19pZCwgVUlOVDMyIGFyZywgWk9TU19UQVNLX0lEIGRlc2tfdGFza19pZCk7DQotDQotLyoqDQotICogQGJyaWVmIMno1sPW3Mba0NTIzs7xtqjKscb3DQotICogQHBhcmFtIHRpbWVfbGVuICDI67LOo6zKsbOko6y1pc67o7ptcw0KLSAqIEBwYXJhbSBtc2dfaWQgICAgyOuyzqOstqjKsbW9uvMst6LLzbj4yejWw7aoyrHG98jOzvG1xM/7z6JpZA0KLSAqIEBwYXJhbSBhcmcgICAgICAgyOuyzqOsuL2807LOyv0stqi0q7XduPjIzs7xyOu/2rqvyv21xGJ1ZtDOss60y8qxbXNnX2xlbta1zqo0KHNpemVvZihVSU5UMzIvYXJnKSkNCi0gKiBAcmV0dXJuILPJuaY6z+DTprXEtqjKscb3serKtjsgyqew3DpaT1NTX0lOVkFMSURfVElNRVJfSUQNCi0gKiBAcmV0dmFsIFpPU1NfVElNRVJfSUTA4NDNtcSx6sq2ICAgILPJuaYNCi0gKiBAcmV0dmFsIFpPU1NfSU5WQUxJRF9USU1FUl9JRCAgICAgIMqnsNwNCi0gKiBAbm90ZSAgyejWw8qxv8zOqrLOv7y14yy+rbn91ri2qMqxvOS68ywgz/LJ6NbDtqjKscb3tcTIzs7xt6LLzda4tqjP+8+isqLX1Lavys23xbaoyrHG98v51bzXytS0DQotICogQHdhcm5pbmcgsdjQ6NTayM7O8cTatffTww0KLSAqLw0KLVpPU1NfVElNRVJfSUQgek9zc19TZXRMb29wVGltZXIoVUlOVDMyIHRpbWVfbGVuLCBVSU5UMzIgbXNnX2lkLCBVSU5UMzIgYXJnKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgyejWw9bcxtrQ1MjOzvG2qMqxxvfP8sS/serIzs7xt6LLzc/7z6INCi0gKiBAcGFyYW0gdGltZV9sZW4gICAgICAgyOuyzqOsyrGzpKOstaXOu6O6bXMNCi0gKiBAcGFyYW0gbXNnX2lkICAgICAgICAgyOuyzqOstqjKsbW9uvMst6LLzbj4yejWw7aoyrHG98jOzvG1xM/7z6JpZA0KLSAqIEBwYXJhbSBhcmcgICAgICAgICAgICDI67LOo6y4vbzTss7K/Sy2qLSrtd24+MjOzvHI67/auq/K/bXEYnVm0M6yzrTLyrFtc2dfbGVu1rXOqjQoc2l6ZW9mKFVJTlQzMi9hcmcpKQ0KLSAqIEBwYXJhbSBkZXNrX3Rhc2tfaWQgICDI67LOo6zWuLaoxL+x6sjOzvGjrMjnufvEv7HqyM7O8c6qv9XKsaOsvau3osvNyejWw7aoyrHG97XEyM7O8Q0KLSAqIEByZXR1cm4gs8m5pjrP4NOmtcS2qMqxxvex6sq2OyDKp7DcOlpPU1NfSU5WQUxJRF9USU1FUl9JRA0KLSAqIEByZXR2YWwgWk9TU19USU1FUl9JRMDg0M21xLHqyrYgICAgs8m5pg0KLSAqIEByZXR2YWwgWk9TU19JTlZBTElEX1RJTUVSX0lEICAgICAgyqew3A0KLSAqIEBub3RlICANCi0gKiBAd2FybmluZyANCi0gKi8NCi1aT1NTX1RJTUVSX0lEIHpPc3NfU2V0TG9vcFRpbWVyQnlUYXNrSWQoVUlOVDMyIHRpbWVfbGVuLCBVSU5UMzIgbXNnX2lkLCBVSU5UMzIgYXJnLCBaT1NTX1RBU0tfSUQgZGVza190YXNrX2lkKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgtLS9qLaoyrHG97qvyv0NCi0gKiBAcGFyYW0gdG1fbmFtZSAgICAgICAgyOuyzqOstqjKscb3w/uzxg0KLSAqIEBwYXJhbSB0bV9jYWxsYmFjayAgICDI67LOo6y2qMqxtb2689Do0qq199PDtcS72LX3uq/K/Q0KLSAqIEBwYXJhbSB0bV9wYXJhbSAgICAgICDI67LOo6y72LX3uq/K/bXEyOuyzg0KLSAqIEBwYXJhbSBiUGVyaW9kICAgICAgICDI67LOo6xUUlVFo7rW3Mba0NS2qMqxxveju0ZBTFNFo7q3x9bcxtrQ1LaoyrHG9w0KLSAqIEByZXR1cm4gs8m5pjrP4NOmtcS2qMqxxvex6sq2OyDKp7DcOlpPU1NfSU5WQUxJRF9USU1FUl9JRA0KLSAqIEByZXR2YWwgWk9TU19USU1FUl9JRMDg0M21xLHqyrYgICAgs8m5pg0KLSAqIEByZXR2YWwgWk9TU19JTlZBTElEX1RJTUVSX0lEICAgICAgyqew3A0KLSAqIEBub3RlICC0tL2ousPWrrrzv8nS1LX308N6T3NzX1N0YXJ0VGltZXIoKcb0tq+2qMqxxvcNCi0gKiBAd2FybmluZyANCi0gKi8NCi1aT1NTX1RJTUVSX0lEIHpPc3NfQ3JlYXRlVGltZXIoY29uc3QgQ0hBUiAqdG1fbmFtZSwgWk9TU19USU1FUl9GVU4gdG1fY2FsbGJhY2ssIFNJTlQzMiB0bV9wYXJhbSwgQk9PTCBiUGVyaW9kKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgxvS2r7aoyrHG97qvyv0sxvS2r8qxv8zOqrLOv7y14yy+rbn91ri2qMqxvOS68yy199PDu9i197qvyv0NCi0gKiBAcGFyYW0gdGltZXJfaWQgICAgICAgIMjrss6jrLaoyrHG92lkDQotICogQHBhcmFtIHRpbWVfbGVuICAgICAgICDI67LOo6y2qMqxxvfKsbOko6y1pc67o7ptcw0KLSAqIEBwYXJhbSB0bV9jYWxsYmFjayAgICAgyOuyzqOstqjKsbW9uvPSqrX308O1xLvYtfe6r8r9DQotICogQHBhcmFtIHRtX3BhcmFtICAgICAgICDI67LOo6y72LX3uq/K/bXEyOuyzg0KLSAqIEByZXR1cm4gs8m5pjpaT1NTX1NVQ0NFU1M7yqew3FpPU1NfRVJST1INCi0gKiBAcmV0dmFsIFpPU1NfU1VDQ0VTUyAgICCzybmmDQotICogQHJldHZhbCBaT1NTX0VSUk9SICAgICAgyqew3A0KLSAqIEBub3RlDQotICogQHdhcm5pbmcgIMjnufu72LX3uq/K/da00NDKsbzktPPT2raoyrHG98qxs6Qsv8nE3Lvh1OyzybTtzvO78raoyrHG97K7sbvV/ci3tfe2yA0KLSAqLw0KLVVJTlQzMiB6T3NzX1N0YXJ0VGltZXIoWk9TU19USU1FUl9JRCB0aW1lcl9pZCwgVUlOVDMyIHRpbWVfbGVuLCBaT1NTX1RJTUVSX0ZVTiB0bV9jYWxsYmFjaywgU0lOVDMyIHRtX3BhcmFtKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgzaPWubaoyrHG97zGyrG6r8r9DQotICogQHBhcmFtIHRpbWVyX2lkICAgICAgICDI67LOo6y2qMqxxvdpZA0KLSAqIEByZXR1cm4gs8m5pjpaT1NTX1NVQ0NFU1M7yqew3FpPU1NfRVJST1INCi0gKiBAcmV0dmFsIFpPU1NfU1VDQ0VTUyAgICCzybmmDQotICogQHJldHZhbCBaT1NTX0VSUk9SICAgICAgyqew3A0KLSAqIEBub3RlIA0KLSAqIEB3YXJuaW5nIA0KLSAqLw0KLVVJTlQzMiB6T3NzX1N0b3BUaW1lcihaT1NTX1RJTUVSX0lEIHRpbWVyX2lkKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYg1N3No9a4tqi2qMqxxve1xLzGyrENCi0gKiBAcGFyYW0gdGltZXJfaWQgICAgICAgIMjrss6jrLaoyrHG92lkDQotICogQHJldHVybiCzybmmOlpPU1NfU1VDQ0VTUzvKp7DcWk9TU19FUlJPUg0KLSAqIEByZXR2YWwgWk9TU19TVUNDRVNTICAgILPJuaYNCi0gKiBAcmV0dmFsIFpPU1NfRVJST1IgICAgICDKp7DcDQotICogQG5vdGUgINTdzaO1xM2syrG8x8K8z8LKo9PgtcTP4LbUyrG85KOstffTw3pPc3NfUmVzdW1lVGltZSgpuq/K/brzvMzQ+LzGyrGjuw0KLSAgICAgICAgICAgICAgICDI57n7tqjKscb31f3U2rG7tfe2yCzU8ta00NDN6rWxx7C197bIuvPU3c2jvMbKsaGjDQotICogQHdhcm5pbmcgDQotICovDQotVUlOVDMyIHpPc3NfUGF1c2VUaW1lcihaT1NTX1RJTUVSX0lEIHRpbWVyX2lkKTsNCi0NCi0vKioNCi0gKiBAYnJpZWYgyrnU3c2jtcS2qMqxxve8zND4vMbKsQ0KLSAqIEBwYXJhbSB0aW1lcl9pZCAgICAgICAgyOuyzqOstqjKscb3aWQNCi0gKiBAcmV0dXJuILPJuaY6Wk9TU19TVUNDRVNTO8qnsNxaT1NTX0VSUk9SDQotICogQHJldHZhbCBaT1NTX1NVQ0NFU1MgICAgs8m5pg0KLSAqIEByZXR2YWwgWk9TU19FUlJPUiAgICAgIMqnsNwNCi0gKiBAbm90ZSAgDQotICogQHdhcm5pbmcgDQotICovDQotVUlOVDMyIHpPc3NfUmVzdW1lVGltZXIoWk9TU19USU1FUl9JRCB0aW1lcl9pZCk7DQotDQotLyoqDQotICogQGJyaWVmIMm+s/3WuLaotcS2qMqxxvcNCi0gKiBAcGFyYW0gdGltZXJfaWQgICAgICAgIMjrss6jrLaoyrHG92lkDQotICogQHJldHVybiCzybmmOlpPU1NfU1VDQ0VTUzvKp7DcWk9TU19FUlJPUg0KLSAqIEByZXR2YWwgWk9TU19TVUNDRVNTICAgILPJuaYNCi0gKiBAcmV0dmFsIFpPU1NfRVJST1IgICAgICDKp7DcDQotICogQG5vdGUgIA0KLSAqIEB3YXJuaW5nIA0KLSAqLw0KLVVJTlQzMiB6T3NzX0tpbGxUaW1lcihaT1NTX1RJTUVSX0lEIHRpbWVyX2lkKTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgIElubGluZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWZuZGVmIERPWFlHRU5fU0hPVUxEX1NLSVBfVEhJUw0KLS8qIMurz/LBtLHtICovDQotI2lmIGRlZmluZWQgKF9PU19UT1MpIHx8IGRlZmluZWQgKF9PU19MSU5VWCkNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiAgek9zc19MaXN0SW5pdA0KLSoguabE3MPoyvY6ICCz9cq8u6/Lq8/ywbSx7Q0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgICAoSU4pDQotICAgICAgICAgICAgICAgIHBMaXN0OsG0se3WuNXrDQotICAgICAgICAgICAgIChPVVQpDQotKiC3tSC72CDWtToNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgaW5saW5lIFZPSUQgek9zc19MaXN0SW5pdChUX1pPc3NfTGlzdCAqcExpc3QpDQotew0KLSAgICB6T3NzX0Fzc2VydEV4TihwTGlzdCAhPSBOVUxMKTsNCi0NCi0gICAgcExpc3QtPkhFQUQgID0gTlVMTDsNCi0gICAgcExpc3QtPlRBSUwgID0gTlVMTDsNCi0gICAgcExpc3QtPmNvdW50ID0gMDsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxjogIHpPc3NfTGlzdENvdW50DQotKiC5psTcw+jK9jogILvxyKHBtLHtz8LX3LmytcS92rXjyv0NCi0qILLOyv3LtcP3o7oNCi0gICAgICAgICAgICAgKElOKQ0KLSAgICAgICAgICAgICAgICBwTGlzdDrBtLHt1rjV6w0KLSAgICAgICAgICAgICAoT1VUKQ0KLSogt7Ugu9gg1rU6ICC92rXjuPbK/Q0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBpbmxpbmUgU0lOVDMyIHpPc3NfTGlzdENvdW50KFRfWk9zc19MaXN0ICpwTGlzdCkNCi17DQotICAgIHJldHVybiAocExpc3QtPmNvdW50KTsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxjogek9zc19MaXN0RGVsZXRlDQotKiC5psTcw+jK9jog0saz/cG0se3W0Na4tqi1xL3ateMNCi0qILLOyv3LtcP3o7oNCi0gICAgICAgICAgICAoSU4pDQotICAgICAgICAgICAgICAgIHBMaXN0OsG0se3WuNXrDQotICAgICAgICAgICAgICAgIHBOb2RlOrT9yb6z/b3atePWuNXrDQotICAgICAgICAgICAgKE9VVCkNCi0qILe1ILvYINa1Og0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBpbmxpbmUgVk9JRCB6T3NzX0xpc3REZWxldGUoVF9aT3NzX0xpc3QgKnBMaXN0LCBUX1pPc3NfTm9kZSAqcE5vZGUpDQotew0KLSAgICBpZiAocE5vZGUtPnByZXZpb3VzICE9IE5VTEwpDQotICAgIHsNCi0gICAgICAgIHBOb2RlLT5wcmV2aW91cy0+bmV4dCA9IHBOb2RlLT5uZXh0Ow0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcExpc3QtPkhFQUQgPSBwTm9kZS0+bmV4dDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAocE5vZGUtPm5leHQgIT0gTlVMTCkNCi0gICAgew0KLSAgICAgICAgcE5vZGUtPm5leHQtPnByZXZpb3VzID0gcE5vZGUtPnByZXZpb3VzOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcExpc3QtPlRBSUwgPSBwTm9kZS0+cHJldmlvdXM7DQotICAgIH0NCi0NCi0gICAgLyogdXBkYXRlIG5vZGUgY291bnQgKi8NCi0gICAgcExpc3QtPmNvdW50LS07DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8Y6IHpPc3NfTGlzdEZpcnN0DQotKiC5psTcw+jK9jogu/HIocG0se21xMrXvdq14w0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgIChJTikNCi0gICAgICAgICAgICAgICAgcExpc3Q6wbSx7da41esNCi0gICAgICAgICAgICAoT1VUKQ0KLSogt7Ugu9gg1rU6IL3atePWuNXrKLWxwbSx7dbQw7vT0L3atePKsaOst7W72L/VKQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBpbmxpbmUgVF9aT3NzX05vZGUqIHpPc3NfTGlzdEZpcnN0KFRfWk9zc19MaXN0ICpwTGlzdCkNCi17DQotICAgIHJldHVybiAocExpc3QtPkhFQUQpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiB6T3NzX0xpc3RJbnNlcnQNCi0qILmmxNzD6Mr2OiDP8sG0se3WuLaotcS92rXjuvOy5cjrvdq14w0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgIChJTikNCi0gICAgICAgICAgICAgICAgcExpc3Q6wbSx7da41esNCi0gICAgICAgICAgICAgICAgcFByZXY6suXI67Xjvdq149a41eujrLWxcFByZXbOqr/VyrGjrLHtyr6y5cjrtb3BtLHtytfOu9bDDQotICAgICAgICAgICAgICAgIHBOb2RlOrT9suXI67XEvdq149a41esNCi0gICAgICAgICAgICAoT1VUKQ0KLSogt7Ugu9gg1rU6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIGlubGluZSBWT0lEIHpPc3NfTGlzdEluc2VydCAoVF9aT3NzX0xpc3QgKnBMaXN0LCBUX1pPc3NfTm9kZSAqcFByZXYsIFRfWk9zc19Ob2RlICpwTm9kZSkNCi17DQotICAgIFRfWk9zc19Ob2RlICpwTmV4dCA9IE5VTEw7DQotDQotICAgIGlmIChwUHJldiAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICBwTmV4dCA9IHBQcmV2LT5uZXh0OyAgICAvKiBtYWtlIHByZXYgbm9kZSBwb2ludCBmd2QgdG8gbmV3ICovDQotICAgICAgICBwUHJldi0+bmV4dCA9IHBOb2RlOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgCXBOZXh0ID0gcExpc3QtPkhFQUQ7ICAgIC8qIG5ldyBub2RlIGlzIHRvIGJlIGZpcnN0IGluIGxpc3QgKi8NCi0gICAgCXBMaXN0LT5IRUFEID0gcE5vZGU7DQotICAgIH0NCi0NCi0gICAgaWYgKHBOZXh0ICE9IE5VTEwpDQotICAgIHsgICAgCQ0KLSAgICAgICBwTmV4dC0+cHJldmlvdXMgPSBwTm9kZTsgLyogbWFrZSBuZXh0IG5vZGUgcG9pbnQgYmFjayB0byBuZXcgKi8NCi0gICAgfQ0KLSAgICBlbHNlDQotICAgIHsNCi0gICAgICAgIHBMaXN0LT5UQUlMID0gcE5vZGU7ICAgIC8qIG5ldyBub2RlIGlzIHRvIGJlIGxhc3QgaW4gbGlzdCAqLw0KLSAgICB9DQotDQotICAgIC8qIHNldCBwb2ludGVycyBpbiBuZXcgbm9kZSwgYW5kIHVwZGF0ZSBub2RlIGNvdW50ICovDQotICAgIHBOb2RlLT5uZXh0ICAgICA9IHBOZXh0Ow0KLSAgICBwTm9kZS0+cHJldmlvdXMgPSBwUHJldjsNCi0NCi0gICAgcExpc3QtPmNvdW50Kys7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8Y6IHpPc3NfTGlzdEFkZA0KLSoguabE3MPoyvY6IM/ywbSx7c6yzO28073ateMNCi0qILLOyv3LtcP3o7oNCi0gICAgICAgICAgICAoSU4pDQotICAgICAgICAgICAgICAgIHBMaXN0OsG0se3WuNXrDQotICAgICAgICAgICAgICAgIHBOb2RlOrT9zO28073atePWuNXrDQotICAgICAgICAgICAgKE9VVCkNCi0qILe1ILvYINa1Og0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBpbmxpbmUgVk9JRCB6T3NzX0xpc3RBZGQgKFRfWk9zc19MaXN0ICpwTGlzdCwgVF9aT3NzX05vZGUgKnBOb2RlKQ0KLXsNCi0gICAgek9zc19MaXN0SW5zZXJ0KHBMaXN0LCBwTGlzdC0+VEFJTCwgcE5vZGUpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiB6T3NzX0xpc3RMYXN0DQotKiC5psTcw+jK9jogu/HIoda4tqi92rXjtcS689K7vdq14w0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgIChJTikNCi0gICAgICAgICAgICAgICAgcE5vZGU61ri2qL3atePWuNXrDQotICAgICAgICAgICAgKE9VVCkNCi0qILe1ILvYINa1OiC92rXj1rjV6yi1scG0se3W0MO709C92rXjyrGjrLe1u9i/1SkNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgaW5saW5lIFRfWk9zc19Ob2RlKiB6T3NzX0xpc3RMYXN0KFRfWk9zc19MaXN0ICpwTGlzdCkNCi17DQotICAgIHJldHVybiAocExpc3QtPlRBSUwpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiB6T3NzX0xpc3ROZXh0DQotKiC5psTcw+jK9jogu/HIoda4tqi92rXjtcTHsNK7vdq14w0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgIChJTikNCi0gICAgICAgICAgICAgICAgcE5vZGU6vdq149a41esNCi0gICAgICAgICAgICAoT1VUKQ0KLSogt7Ugu9gg1rU6IL3atePWuNXrKLWxtKvI673atePKx8G0se3X7rrz0ru49r3atePKsaOst7W72L/VKQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBpbmxpbmUgVF9aT3NzX05vZGUqIHpPc3NfTGlzdE5leHQoVF9aT3NzX05vZGUgKnBOb2RlKQ0KLXsNCi0gICAgcmV0dXJuIChwTm9kZS0+bmV4dCk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8Y6IHpPc3NfTGlzdFByZXZpb3VzDQotKiC5psTcw+jK9jogu/HIoda4tqi92rXjtcTHsNK7vdq14w0KLSogss7K/cu1w/ejug0KLSAgICAgICAgICAgIChJTikNCi0gICAgICAgICAgICAgICAgcE5vZGU61ri2qL3atePWuNXrDQotICAgICAgICAgICAgKE9VVCkNCi0qILe1ILvYINa1OiC92rXj1rjV6yi1sbSryOu92rXjysfBtLHttdrSu7j2vdq148qxo6y3tbvYv9UpDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIGlubGluZSBUX1pPc3NfTm9kZSAqek9zc19MaXN0UHJldmlvdXMoVF9aT3NzX05vZGUgKnBOb2RlKQ0KLXsNCi0gICAgcmV0dXJuIChwTm9kZS0+cHJldmlvdXMpOw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGOiB6T3NzX0xpc3ROU3RlcA0KLSoguabE3MPoyvY6ILvxyKHT69a4tqi92rXjvOS49G5TdGVwtcS92rXjDQotKiCyzsr9y7XD96O6DQotICAgICAgICAgICAgKElOKQ0KLSAgICAgICAgICAgICAgICBwTm9kZTq92rXj1rjV6w0KLSAgICAgICAgICAgICAgICBuU3RlcDq85Lj0yv0uINX9yv06sunV0m5leHS92rXjo6y4usr9sunV0nByZXZpb3Vzvdq14w0KLSAgICAgICAgICAgIChPVVQpDQotKiC3tSC72CDWtTogvdq149a41esotbHU2rzkuPRuU3RlcMTatb2078G0se3Ossqxo6y3tbvYv9UpDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIGlubGluZSBUX1pPc3NfTm9kZSAqek9zc19MaXN0TlN0ZXAoVF9aT3NzX05vZGUgKnBOb2RlLCBTSU5UMzIgblN0ZXApDQotew0KLSAgICBpbnQgaSAgICAgICA9IDA7DQotICAgIA0KLSAgICBpZiAoblN0ZXAgPiAwKQ0KLSAgICB7DQotICAgICAgICBmb3IgKGkgPSBuU3RlcDsgaSA+IDA7IGktLSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwTm9kZSA9IHBOb2RlLT5uZXh0Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmIChwTm9kZSA9PSBOVUxMKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgZm9yIChpID0gblN0ZXA7IGkgPCAwOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgcE5vZGUgPSBwTm9kZS0+cHJldmlvdXM7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHBOb2RlID09IE5VTEwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcmV0dXJuIChwTm9kZSk7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8Y6IHpPc3NfTGlzdEZpbmQNCi0qILmmxNzD6Mr2OiCy6dXSwbSx7dbQtcS92rXjDQotKiCyzsr9y7XD96O6DQotICAgICAgICAgICAgKElOKQ0KLSAgICAgICAgICAgICAgICBwTGlzdDrBtLHt1rjV6w0KLSAgICAgICAgICAgICAgICBwTm9kZTq0/bLp1dK92rXj1rjV6w0KLSAgICAgICAgICAgIChPVVQpDQotKiC3tSC72CDWtTogwbSx7dbQ09DWuLaovdq14zq92rXj1NrBtLHt1tC1xMv30v0otNMxv6rKvCmjrA0KLSAgICAgICAgICAgICAgICAgICAgICAgIMG0se3W0M7e1ri2qL3ateM6LTENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgaW5saW5lIFNJTlQzMiB6T3NzX0xpc3RGaW5kIChUX1pPc3NfTGlzdCAqcExpc3QsIFRfWk9zc19Ob2RlICpwTm9kZSkNCi17DQotICAgIFRfWk9zc19Ob2RlICpwTmV4dE5vZGUgICAgICA9IE5VTEw7DQotICAgIGludCAgICAgICAgIGlOb2RlUG9zaXRpb24gICA9IDE7DQotDQotICAgIHBOZXh0Tm9kZSA9IHpPc3NfTGlzdEZpcnN0IChwTGlzdCk7DQotDQotICAgIHdoaWxlICgocE5leHROb2RlICE9IE5VTEwpICYmIChwTmV4dE5vZGUgIT0gcE5vZGUpKQ0KLSAgICB7DQotICAgICAgICBpTm9kZVBvc2l0aW9uKys7DQotICAgICAgICANCi0gICAgICAgIHBOZXh0Tm9kZSA9IHpPc3NfTGlzdE5leHQgKHBOZXh0Tm9kZSk7DQotICAgIH0NCi0NCi0gICAgaWYgKHBOZXh0Tm9kZSAhPSBOVUxMKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gKGlOb2RlUG9zaXRpb24pOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICgtMSk7DQotICAgIH0NCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxjogek9zc19MaXN0Q29ubmVjdA0KLSoguabE3MPoyvY6IL2rwb249sG0se3BtL3T1NrSu8bwDQotKiCyzsr9y7XD96O6DQotICAgICAgICAgICAgKElOKQ0KLSAgICAgICAgICAgICAgICBwTGlzdDE6IMG0se0xDQotICAgICAgICAgICAgICAgIHBMaXN0MjogwbSx7TINCi0gICAgICAgICAgICAoT1VUKQ0KLSogt7W72Na1Og0KLSogy7XD96O6ICAgIL2rcExpc3QywbS907W9cExpc3QxzrKyv6O7cExpc3QytcTBtLHtzbfE2sjdsru74bjEseQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgaW5saW5lIFZPSUQgek9zc19MaXN0Q29ubmVjdChUX1pPc3NfTGlzdCAqcExpc3QxLCBUX1pPc3NfTGlzdCAqcExpc3QyKQ0KLXsNCi0gICAgaWYgKHBMaXN0MS0+Y291bnQgPT0gMCkNCi0gICAgew0KLSAgICAgICAgcExpc3QxLT5IRUFEICAgID0gcExpc3QyLT5IRUFEOw0KLSAgICAgICAgcExpc3QxLT5UQUlMICAgID0gcExpc3QyLT5UQUlMOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgaWYgKHBMaXN0Mi0+Y291bnQgIT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwTGlzdDEtPlRBSUwgLT5uZXh0ICAgICA9IHBMaXN0Mi0+SEVBRDsNCi0gICAgICAgICAgICBwTGlzdDItPkhFQUQtPnByZXZpb3VzICA9IHBMaXN0MS0+VEFJTDsNCi0gICAgICAgICAgICBwTGlzdDEtPlRBSUwgICAgICAgICAgICA9IHBMaXN0Mi0+VEFJTDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwTGlzdDEtPmNvdW50ICs9IHBMaXN0Mi0+Y291bnQ7DQotfQ0KLSNlbHNlDQotVk9JRCB6T3NzX0xpc3RJbml0KFRfWk9zc19MaXN0ICpwTGlzdCk7DQotVF9aT3NzX05vZGUgKnpPc3NfTGlzdEZpcnN0KFRfWk9zc19MaXN0ICpwTGlzdCk7DQotVF9aT3NzX05vZGUgKnpPc3NfTGlzdExhc3QoVF9aT3NzX0xpc3QgKnBMaXN0KTsNCi1UX1pPc3NfTm9kZSAqek9zc19MaXN0TmV4dChUX1pPc3NfTm9kZSAqcE5vZGUpOw0KLVRfWk9zc19Ob2RlICp6T3NzX0xpc3RQcmV2aW91cyhUX1pPc3NfTm9kZSAqcE5vZGUpOw0KLVRfWk9zc19Ob2RlICp6T3NzX0xpc3ROU3RlcChUX1pPc3NfTm9kZSAqcE5vZGUsIFNJTlQzMiBuU3RlcCk7IA0KLVNJTlQzMiB6T3NzX0xpc3RDb3VudChUX1pPc3NfTGlzdCAqcExpc3QpOyANCi1TSU5UMzIgek9zc19MaXN0RmluZChUX1pPc3NfTGlzdCAqcExpc3QsIFRfWk9zc19Ob2RlICpwTm9kZSk7DQotVk9JRCB6T3NzX0xpc3RBZGQoVF9aT3NzX0xpc3QgKnBMaXN0LCBUX1pPc3NfTm9kZSAqcE5vZGUpOw0KLVZPSUQgek9zc19MaXN0RGVsZXRlKFRfWk9zc19MaXN0ICpwTGlzdCwgVF9aT3NzX05vZGUgKnBOb2RlKTsNCi1WT0lEIHpPc3NfTGlzdEluc2VydChUX1pPc3NfTGlzdCAqcExpc3QsIFRfWk9zc19Ob2RlICpwUHJldiwgVF9aT3NzX05vZGUgKnBOb2RlKTsNCi1WT0lEIHpPc3NfTGlzdENvbm5lY3QoVF9aT3NzX0xpc3QgKnBMaXN0MSwgVF9aT3NzX0xpc3QgKnBMaXN0Mik7DQotI2VuZGlmDQotDQotI2VuZGlmIC8vI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMNCi0NCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotI2VuZGlmICAvLyAjaWZuZGVmIF9PU1NfU1VQX0gNCmRpZmYgLS1naXQgYS9VYm9vdC9jcC9wcy9wbGF0L3NyYy9vc3Mvc3VwL3NyYy9zdXBfZXhjZXB0LmMgYi9VYm9vdC9jcC9wcy9wbGF0L3NyYy9vc3Mvc3VwL3NyYy9zdXBfZXhjZXB0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkMzU1YjIuLjAwMDAwMDAKLS0tIGEvVWJvb3QvY3AvcHMvcGxhdC9zcmMvb3NzL3N1cC9zcmMvc3VwX2V4Y2VwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoNCi0qICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEyIFpURSBDb3Jwb3JhdGlvbi4NCi0qDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiDEoyC/6SDD+yA6IA0KLSogzsQgvP4gw/sgOiBzdXBfZXhjZXB0LmMNCi0qIM/gudjOxLz+IDogDQotKiDKtc/WuabE3CA6INLss6O53MDtxKO/6Q0KLSog1/cgICAg1d8gOiDPxNDCufoNCi0qILDmICAgILG+IDogVjEuMA0KLSogzeqzycjVxtogOiAyMDA3LzA4LzAxDQotKiDG5Mv8y7XD9yA6IA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSog0N64xLzHwrwNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qINDeuMSx4LrFIDogMDAwMQ0KLSog0N4guMQgyMsgOiDW3Ln6xsINCi0qILDmILG+ILrFIDogVjEuMQ0KLSog0N64xMjVxtogOiAyMDA3LzA5LzAzDQotKiDQ3rjExNrI3SA6INT2vNO907/auq/K/cq1z9YNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qINDeuMSx4LrFIDogMDAwMg0KLSog0N4guMQgyMsgOiBkZW5nbmluZ2t1bg0KLSog0N64xMjVxtogOiAyMDEyLzkvMjcNCi0qINDeuMTE2sjdIDoguPHKvbnmt7a6zVBDLUxJTlS87LLpICBFQzo2MTcwMDE3ODIxNjkNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qINDeuMSx4LrFIDogMDAwMw0KLSog0N4guMQgyMsgOiBkZW5nbmluZ2t1bg0KLSog0N64xMjVxtogOiAyMDEyLzEwLzEwDQotKiDQ3rjExNrI3SA6ILT6wuvX37LpICAgICAgICAgICAgICAgRUM6NjE3MDAxNzgyMjA1DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAjaW5jbHVkZcf4DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2luY2x1ZGUgIm9zc19hcGkuaCINCi0jaW5jbHVkZSAib3NhLmgiDQotI2luY2x1ZGUgInN1cC5oIg0KLSNpbmNsdWRlICJzdXBfZXhjZXB0LmgiDQotI2luY2x1ZGUgIlRocmVhZFByaW9yaXR5LmgiDQotI2lmZGVmIF9VU0VfV0RUX1JTVA0KLSNpbmNsdWRlICJkcnZzX3dkdC5oIg0KLSNpbmNsdWRlICJzeXNfZnVuY19hdGNmZy5oIg0KLSNlbmRpZg0KLQ0KLSNpZmRlZiBfX2NwbHVzcGx1cw0KLWV4dGVybiAiQyINCi17DQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiDN4rK/uq/K/cn5w/fH+A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZmRlZiBfT1NfVE9TDQotZXh0ZXJuIEZMT0FUIE9zYV9HZXRQcm9jZXNzQ1BVKFpPU1NfVEhSRUFEX0lEIHRocmVhZF9pZCk7DQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC66rao0uXH+A0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZmRlZiBfVVNFX1dEVF9SU1QNCi0jZGVmaW5lIFRSQUNFX1dBVENIRE9HX0ZFRURfUEVSSU9EICAgICAgICAgIDEwMDANCi0jZGVmaW5lIFRSQUNFX1dBVENIRE9HX0ZFRURfVkFMVUUgICAgICAgICAgIDUwMDANCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIMr9vt294bm5tqjS5cf4DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotIA0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogvtayv7qvyv3UrdDNDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmbmRlZiBfVVNFX1BTTQ0KLSNpZiBkZWZpbmVkIChfT1NfV0lOKSB8fCBkZWZpbmVkIChfT1NfT1NFKQ0KLXN0YXRpYyBWT0lEIEV4Y2VwX0lkbGVUaHJlYWQoU0lOVDMyIGluZ29yZSk7DQotI2VuZGlmDQotI2VuZGlmDQotI2lmZGVmIF9VU0VfV0RUX1JTVA0KLXN0YXRpYyBWT0lEIEV4Y2VwX1dhdGNoRG9nQ2FsbEJhY2soU0lOVDMyIGFyZ3MpOw0KLSNlbmRpZg0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogyKu+1rOjwb8vseTBvw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVpPU1NfVEFTS19JRCBnRXhjZXBfRGFlbW9uVGFzayA9IFpPU1NfSU5WQUxJRF9UQVNLX0lEOw0KLQ0KLXN0YXRpYyBUX0VYQ0VQX1BBUkFNICAgICAgICAgICAgICAgICpnRXhjZXBfUGFyYW0gICA9IE5VTEw7DQotDQotI2lmZGVmIF9VU0VfV0RUX1JTVA0KLXN0YXRpYyBaT1NTX1RJTUVSX0lEICAgICAgICAgICAgICAgIGdUcmFjZV9XYXRjaERvZ1RpbWVySUQgICAgICA9IE5VTEw7DQotI2VuZGlmDQotLyog0sbWsiAqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogvtayv7qvyv3Ktc/WDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyog0sYg1rIgKi8NCi0jaWZuZGVmIF9VU0VfUFNNDQotI2lmIGRlZmluZWQgKF9PU19XSU4pIHx8IGRlZmluZWQgKF9PU19PU0UpDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IEV4Y2VwX0lkbGVUaHJlYWQNCi0qILmmxNzD6Mr2o7ogDQotKiCyzsr9y7XD96O6IA0KLSogt7Ugu9gg1rWjuiANCi0qIMbky/zLtcP3o7oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgVk9JRCBFeGNlcF9JZGxlVGhyZWFkKFNJTlQzMiBpbmdvcmUpDQotew0KLSNpZmRlZiBfT1NfT1NFDQotICAgIFVJTlQzMiBkd1plcm89MDsNCi0gICAgU0lOVDMyIGkgPSAwOw0KLQ0KLSAgICBmb3IoOzspDQotICAgIHsNCi0gICAgICAgIGkrKzsNCi0gICAgICAgIGlmICghKGklMzAwMDAwMCkpDQotICAgICAgICB7DQotICAgICAgICAgICAgU1lTVElNRV9Jbml0KCk7DQotICAgICAgICB9DQotICAgIH0NCi0jZWxpZiBkZWZpbmVkIChfT1NfVE9TKQ0KLSAgICAgZm9yKDs7KQ0KLSAgICAgICAgOw0KLSNlbGlmIGRlZmluZWQgKF9PU19MSU5VWCkNCi0gICAgIGZvcig7OykNCi0gICAgICAgIDsNCi0jZW5kaWYNCi19DQotI2VuZGlmDQotI2VuZGlmDQotI2lmZGVmIF9VU0VfV0RUX1JTVA0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiBFeGNlcF9XYXRjaERvZ0NhbGxCYWNrDQotKiC5psTcw+jK9qO6ILaoyrHG9865ube72LX3uq/K/Q0KLSogss7K/cu1w/ejuiBhcmdzOiAgtqjKscb3ss7K/Q0KLSogt7Ugu9gg1rWjuiBWT0lEDQotKiDG5Mv8y7XD96O6IFZPSUQNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgVk9JRCBFeGNlcF9XYXRjaERvZ0NhbGxCYWNrKFNJTlQzMiBhcmdzKQ0KLXsNCi0gICAgekRydldkdF9GZWVkRG9nKFRSQUNFX1dBVENIRE9HX0ZFRURfVkFMVUUpOw0KLX0NCi0jZW5kaWYNCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIMirvta6r8r9yrXP1g0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiBFeGNlcF9Jbml0DQotKiC5psTcw+jK9qO6INLss6PEo7/ps/XKvLuvDQotKiCyzsr9y7XD96O6IM7eDQotKiC3tSC72CDWtaO6ILPJuaa3tbvYWk9TU19TVUNDRVNTo6zKp7Dct7W72FpPU1NfRVJST1INCi0qIMbky/zLtcP3o7oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1VSU5UMzIgRVhDRVBfSW5pdChWT0lEKQ0KLXsNCi0jaWYgZGVmaW5lZChfVVNFX1dEVF9SU1QpDQotICAgIFVJTlQzMiAgICAgICAgICBuUmV0ICAgID0gWk9TU19FUlJPUjsNCi0gICAgVUlOVDMyICAgICAgICAgIGZsYWcgICAgPSAwOw0KLQ0KLSAgICBmbGFnID0gek9zc19HZXRFeGNlcHRSZXNldEZsYWcoKTsNCi0gICAgaWYgKGZsYWcgPT0gRVhDRVBUX1JFU0VUX0VOQUJMRSkNCi0gICAgew0KLSAgICAgICAgZ1RyYWNlX1dhdGNoRG9nVGltZXJJRCA9IHpPc3NfQ3JlYXRlVGltZXIoIldhdGNoRG9nVGltZXIiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFpPU1NfVElNRVJfRlVOKUV4Y2VwX1dhdGNoRG9nQ2FsbEJhY2ssDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0lOVDMyKTAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsNCi0gICAgICAgIHpPc3NfQXNzZXJ0RXgoTlVMTCAhPSBnVHJhY2VfV2F0Y2hEb2dUaW1lcklELCBaT1NTX0VSUk9SKTsNCi0NCi0gICAgICAgIG5SZXQgPSB6T3NzX1N0YXJ0VGltZXIoZ1RyYWNlX1dhdGNoRG9nVGltZXJJRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfV0FUQ0hET0dfRkVFRF9QRVJJT0QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwX1dhdGNoRG9nQ2FsbEJhY2ssDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOw0KLSAgICAgICAgek9zc19Bc3NlcnRFeChaT1NTX0VSUk9SICE9IG5SZXQsIFpPU1NfRVJST1IpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgekRydldkdF9TdG9wKCk7DQotICAgIH0NCi0jZW5kaWYNCi0NCi0gICAgcmV0dXJuIFpPU1NfU1VDQ0VTUzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IEVYQ0VQX1N0YXJ0RGFlbW9uVGFzaw0KLSoguabE3MPoyvajuiDG9LavyM7O8cvA0a27t7zgsuINCi0qILLOyv3LtcP3o7ogzt4NCi0qILe1ILvYINa1o7ogs8m5pre1u9haT1NTX1NVQ0NFU1OjrMqnsNy3tbvYWk9TU19FUlJPUg0KLSogxuTL/Mu1w/ejug0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVVJTlQzMiBFWENFUF9TdGFydERhZW1vblRhc2soVk9JRCkNCi17DQotICAgIFRfT1NTX1BBUkFNICAgICAqb3NzY2ZnID0gTlVMTDsNCi0NCi0gICAgaWYoVEhSMV9QUkkgPCAxKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gWk9TU19FUlJPUjsNCi0gICAgfQ0KLQ0KLSAgICBvc3NjZmcgPSB6T3NzX0dldE9zc0NmZygpOw0KLSAgICBnRXhjZXBfUGFyYW0gPSAmKG9zc2NmZy0+RXhjZXBDZmcpOw0KLSAgICBnRXhjZXBfRGFlbW9uVGFzayA9IHpPc3NfQ3JlYXRlVGFzayhFWENFUF9EQUVNT05UQVNLTkFNRSwgRXhjZXBfRGFlbW9uVGFzaywgNCAqIDEwMjQsIFRIUjFfUFJJIC0gMSwgMjA0OCwgMCk7DQotICAgIGlmIChaT1NTX0lOVkFMSURfVEFTS19JRCA9PSBnRXhjZXBfRGFlbW9uVGFzaykNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIFpPU1NfRVJST1I7DQotICAgIH0NCi0gICAgaWYgKFpPU1NfRVJST1IgPT0gek9zc19UYXNrU2VuZChFVl9QT1dFUk9OLCBOVUxMLCAwLCBnRXhjZXBfRGFlbW9uVGFzaykpDQotICAgIHsNCi0gICAgICAgIHJldHVybiBaT1NTX0VSUk9SOw0KLSAgICB9DQotDQotICAgIHJldHVybiBaT1NTX1NVQ0NFU1M7DQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSoguq/K/cP7s8ajuiBFeGNlcF9EYWVtb25UYXNrDQotKiC5psTcw+jK9qO6INLss6PEo7/pyti7pMjOzvENCi0qILLOyv3LtcP3o7ogc3RhdGU6yM7O8de0zKwNCi0gICAgICBtc2dfaWQ6z/vPoklEDQotICAgICAgYnVmOs/7z6LM5da41esNCi0gICAgICBtc2dfbGVuOs/7z6KzpLbIDQotICAgICAgcHJpdmF0ZV9kYXRhOsu909DK/b7dDQotKiC3tSC72CDWtaO6IM7eDQotKiDG5Mv8y7XD96O6DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotVk9JRCBFeGNlcF9EYWVtb25UYXNrKFVJTlQ4IHN0YXRlLCBVSU5UMzIgbXNnX2lkLCBVSU5UOCAqYnVmLCBVSU5UMTYgbXNnX2xlbiwgVUlOVDggKnByaXZhdGVfZGF0YSkNCi17DQotICAgIFpPU1NfVElNRVJfSUQgICB0aWQgICAgICAgICA9IFpPU1NfSU5WQUxJRF9USU1FUl9JRDsNCi0gICAgWk9TU19UQVNLX0lEICAgICp0YXNrX2lkcyAgID0gKFpPU1NfVEFTS19JRCAqKXByaXZhdGVfZGF0YTsNCi0gICAgDQotICAgIHN3aXRjaCAoc3RhdGUpDQotICAgIHsNCi0gICAgY2FzZSBaT1NTX1NUQVRVU19JTklUOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAobXNnX2lkKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICBjYXNlIEVWX0lOSVQ6DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgY2FzZSBFVl9QT1dFUk9OOg0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aWQgPSB6T3NzX1NldFJlbGF0aXZlVGltZXIoZ0V4Y2VwX1BhcmFtLT5EZWFtb25TdGFydFRpbWUsIEVWX1pPU1NfRVhDRVBfV0RUX1NFVCwgMCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoWk9TU19JTlZBTElEX1RJTUVSX0lEID09IHRpZCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB6T3NzX0FTU0VSVCgwKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChaT1NTX0VSUk9SID09IHpPc3NfU2V0U3RhdGUoWk9TU19TVEFUVVNfV09SSykpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgek9zc19BU1NFUlQoMCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICBjYXNlIFpPU1NfU1RBVFVTX1dPUks6DQotICAgICAgICB7DQotICAgICAgICAgICAgc3dpdGNoIChtc2dfaWQpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgIGNhc2UgRVZfWk9TU19FWENFUF9XRFRfU0VUOg0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAvKiDJ6NbDy8DRrbu3vOyy4raoyrHG9yAqLw0KLSAgICAgICAgICAgICAgICAgICAgdGlkID0gek9zc19TZXRMb29wVGltZXIoZ0V4Y2VwX1BhcmFtLT5EZWFkTG9vcENoZWNrVGltZSwgRVZfWk9TU19FWENFUF9ERUFETE9PUENIRUNLLCAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChaT1NTX0lOVkFMSURfVElNRVJfSUQgPT0gdGlkKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHpPc3NfQVNTRVJUKDApOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSNpZm5kZWYgX1VTRV9QU00NCi0jaWYgZGVmaW5lZCAoX09TX1dJTikgfHwgZGVmaW5lZCAoX09TX09TRSkNCi0gICAgICAgICAgICAgICAgICAgIGlmIChaT1NTX0lOVkFMSURfVEhSRUFEX0lEID09IHpPc3NfQ3JlYXRlVGhyZWFkKEVYQ0VQX0lETEVUSFJFQUROQU1FLCBFeGNlcF9JZGxlVGhyZWFkLCAwLCAxMDI0LCAzMSwgMSwgMSkpDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgek9zc19BU1NFUlQoMCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotI2VuZGlmDQotI2VuZGlmDQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgRVZfWk9TU19FWENFUF9ERUFETE9PUENIRUNLOg0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbnVtID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpID0gMDsNCi0gICAgICAgICAgICAgICAgICAgIFRfWk9zc19UQ0IgKnRpbmZvID0gTlVMTDsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgbnVtID0gU2NoZV9EZWFkTG9vcCh0YXNrX2lkcyk7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoWk9TU19JTlZBTElEX1RBU0tfSUQgIT0gdGFza19pZHNbaV0gJiYgaSA8IG51bSkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBPU1NfRGVsZXRlVGFzayh0YXNrX2lkc1tpXSk7ICovDQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGluZm8pDQotICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW5mbyA9IChUX1pPc3NfVENCICopek9zc19NYWxsb2Moc2l6ZW9mKFRfWk9zc19UQ0IpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gdGluZm8pDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpPc3NfQXNzZXJ0RXhOKE5VTEwgIT0gdGluZm8pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChaT1NTX0VSUk9SID09IHpPc3NfR2V0VGFza0luZm8odGFza19pZHNbaV0sIHRpbmZvKSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbmZvLT50YXNrX25hbWVbMF0gPSAnXDAnOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB6T3NzX1ByaW50ZihTVUJNRExfRVhDRVAsIFBSSU5UX0xFVkVMX0FCTk9STUFMLCAiZGVhZCB0YXNrIGZvdW5kOiVwLG5hbWU6JXNcclxuIiwgdGFza19pZHNbaV0sIHRpbmZvLT50YXNrX25hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHRpbmZvKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHpPc3NfRnJlZSh0aW5mbyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSAgIC8qIGVuZCBzd2l0Y2gobXNnX2lkKSAqLw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgICAgeyAgDQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0gICAvKiBlbmQgc3dpdGNoKHN0YXRlKSAqLw0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILqvyv3D+7PGo7ogek9zc19HZXRDUFUNCi0qILmmxNzD6Mr2o7ogtcO1vUNQVbXEyrnTw8LKDQotKiCyzsr9y7XD96O6IM7eDQotKiC3tSC72CDWtaO6IENQVbXEyrnTw8LKKDAtMTAwKQ0KLSogxuTL/Mu1w/ejug0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLVVJTlQ4IHpPc3NfR2V0Q1BVKFZPSUQpDQotew0KLSNpZmRlZiBfT1NfT1NFDQotICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgIHJhdGUgPSAwOw0KLSAgICBaT1NTX1RIUkVBRF9JRCAgICAgICAgICB0X2lkID0gWk9TU19JTlZBTElEX1RIUkVBRF9JRDsNCi0gICAgVF9aT3NhX1RocmVhZFVzZXJBcmVhICAgKnBVYSA9IE5VTEw7DQotDQotICAgIHRfaWQgICAgPSB6T3NzX0dldFRocmVhZElEQnlOYW1lKEVYQ0VQX0lETEVUSFJFQUROQU1FKTsNCi0gICAgcFVhICAgICA9IE9zYV9HZXRUaHJlYWRVc2VyQXJlYSh0X2lkLCBGQUxTRSk7DQotICAgIHJhdGUgICAgPSAoVUlOVDgpcFVhLT5jcHVwZXJjZW50Ow0KLSAgICBpZiAocmF0ZSA+IDEwMCkNCi0gICAgew0KLSAgICAgICAgcmF0ZSA9IDA7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuICgxMDAgLSByYXRlKTsNCi0jZWxpZiBkZWZpbmVkIChfT1NfVE9TKQ0KLSAgICByZXR1cm4gKFVJTlQ4KSgxMDAgLSBPc2FfR2V0UHJvY2Vzc0NQVSh6T3NzX0dldFRocmVhZElEQnlOYW1lKEVYQ0VQX0lETEVUSFJFQUROQU1FKSkpOw0KLSNlbHNlDQotICAgIHJldHVybiAwOw0KLSNlbmRpZg0KLX0NCi0NCi0jaWZkZWYgX1VTRV9ERUJVR19JTkZPDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiC6r8r9w/uzxqO6IHpPc3NfRGVidWdJbmZvUmVjb3JkDQotKiC5psTcw+jK9qO6IE1vZGVtsuC1xM+1zbPOrLLi0MXPorzHwry907/aDQotKiCyzsr9y7XD96O6IGlkOiDEo7/pSUQNCi0qICAgICAgICAgICAgcEZvcm1hdDogtP208tOhtcTX1rf7tK4NCi0qILe1ILvYINa1o7ogs8m5pjog0LTI67Oktsg7IMqnsNw6IFpPU1NfRVJST1INCi0qIMbky/zLtcP3o7oNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1VSU5UMzIgek9zc19EZWJ1Z0luZm9SZWNvcmQoVUlOVDMyIGlkLCBjb25zdCBWT0lEICpwRm9ybWF0LCAuLi4pDQotew0KLSNpZmRlZiBfT1NfV0lODQotICAgIHJldHVybiBaT1NTX0VSUk9SOw0KLSNlbHNlDQotICAgIHZhX2xpc3QgYXJnczsNCi0JaW50IHI7DQotDQotCXZhX3N0YXJ0KGFyZ3MsIHBGb3JtYXQpOw0KLQlyID0gc2NfZGVidWdfaW5mb192cmVjb3JkKGlkLCBwRm9ybWF0LCBhcmdzKTsNCi0JdmFfZW5kKGFyZ3MpOw0KLQ0KLSAgICByZXR1cm4gcjsNCi0jZW5kaWYNCi19DQotI2Vsc2UNCi1VSU5UMzIgek9zc19EZWJ1Z0luZm9SZWNvcmQoVUlOVDMyIGlkLCBjb25zdCBWT0lEICpwRm9ybWF0LCAuLi4pDQotew0KLSAgICByZXR1cm4gWk9TU19TVUNDRVNTOw0KLX0NCi0jZW5kaWYNCi0NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi19DQotI2VuZGlmDQotDQotDQpkaWZmIC0tZ2l0IGEvVWJvb3QvcHViL2luY2x1ZGUvaW5mcmEvcHViX2RlYnVnX2luZm8uaCBiL1Vib290L3B1Yi9pbmNsdWRlL2luZnJhL3B1Yl9kZWJ1Z19pbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwMzU3YWEuLjAwMDAwMDAKLS0tIGEvVWJvb3QvcHViL2luY2x1ZGUvaW5mcmEvcHViX2RlYnVnX2luZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSNpZm5kZWYgX1BVQl9ERUJVR19JTkZPX0hfCi0jZGVmaW5lIF9QVUJfREVCVUdfSU5GT19IXwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNkZWZpbmUgREVCVUdfSU5GT19ERVZfUEFUSCAiL2Rldi9kZWJ1Z19pbmZvIgotCi0vKiBBULLgus1DQVCy4LXEUFNcS0VSTkVMXERSSVZFUlxGU1xBUFAgINLUU1RBUlR+RU5EzqrH+Lzko6y497K/t9bUpMH0wcsxMDC49klEICovCi0jZGVmaW5lIE1PRFVMRV9JRF9QU19TVEFSVAkJCSgxKQotI2RlZmluZSBNT0RVTEVfSURfUFNfTkFTCQkJKDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9QU19SUkMJCQkoMikKLSNkZWZpbmUgTU9EVUxFX0lEX1BTX0wyCQkJCSgzKQotI2RlZmluZSBNT0RVTEVfSURfUFNfVUlDQwkJCSg5OSkKLSNkZWZpbmUgTU9EVUxFX0lEX1BTX0VORAkJCSgxMDApCi0KLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0tFUk5FTF9TVEFSVAkoMTAxKQotI2RlZmluZSBNT0RVTEVfSURfQVBfS0VSTkVMX0VORAkJKDIwMCkKLQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0tFUk5FTF9TVEFSVAkoMjAxKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0tFUk5FTF9FTkQJKDMwMCkKLQotI2RlZmluZSBNT0RVTEVfSURfQVBfRFJJVkVTX1NUQVJUCSgzMDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9VU0IJCQkoMzAxKQotI2RlZmluZSBNT0RVTEVfSURfQVBfUkVCT09UCQkJKDMwMikKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX1RTQwkJCSgzMDMpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9QU00JCQkoMzA0KQotI2RlZmluZSBNT0RVTEVfSURfQVBfTkFORAkJCSgzMDUpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9NTUMJCQkoMzA2KQotI2RlZmluZSBNT0RVTEVfSURfQVBfV0lGSQkJCSgzMDcpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9EUklWRVNfRU5ECQkoNDAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfRFJJVkVTX1NUQVJUCSg0MDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfVVNCCQkJKDQwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9UU0MJCQkoNDAyKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX1BTTQkJCSg0MDMpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfTkFORAkJCSg0MDQpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfU1BJCQkJKDQwNSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9NTUMJCQkoNDA2KQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX1VBUlQJCQkoNDA3KQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0RSSVZFU19FTkQJKDUwMCkKLQotI2RlZmluZSBNT0RVTEVfSURfQVBfRlNfU1RBUlQJCSg1MDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9KRkZTMgkJCSg1MDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9GU19FTkQJCQkoNjAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfRlNfU1RBUlQJCSg2MDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfRlNfRU5ECQkoNzAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9BUFBfU1RBUlQJCSg3MDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9GT1RBCQkJKDcwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0ZTX0NIRUNLCQkoNzAyKQotI2RlZmluZSBNT0RVTEVfSURfQVBfQVBQX0VORAkJKDgwMCkKLQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0FQUF9TVEFSVAkJKDgwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9GT1RBCQkJKDgwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9GU19DSEVDSwkJKDgwMikKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9BUFBfRU5ECQkoOTAwKQotCi0jaWYgZGVmaW5lZChfVVNFX1pYSUNfREVCVUdfSU5GTykgJiYgIWRlZmluZWQoQ09ORklHX1NZU1RFTV9SRUNPVkVSWSkKLWludCBzY19kZWJ1Z19pbmZvX3ZyZWNvcmQodW5zaWduZWQgaW50IGlkLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7Ci1pbnQgc2NfZGVidWdfaW5mb19yZWNvcmQodW5zaWduZWQgaW50IGlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc2NfZGVidWdfaW5mb192cmVjb3JkKHVuc2lnbmVkIGludCBpZCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHNjX2RlYnVnX2luZm9fcmVjb3JkKHVuc2lnbmVkIGludCBpZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pIHsgcmV0dXJuIDA7IH0KLSNlbmRpZgotCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9VYm9vdC9wdWIvcHJvamVjdC96eDI5NzUyMHYzL2luY2x1ZGUvZHJ2L052UGFyYW1fZHJ2LmggYi9VYm9vdC9wdWIvcHJvamVjdC96eDI5NzUyMHYzL2luY2x1ZGUvZHJ2L052UGFyYW1fZHJ2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2YzZmNmQuLjAwMDAwMDAKLS0tIGEvVWJvb3QvcHViL3Byb2plY3QvengyOTc1MjB2My9pbmNsdWRlL2Rydi9OdlBhcmFtX2Rydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogQ29weXJpZ2h0IChDKSAyMDE2LCBaVEUgQ29ycG9yYXRpb24uDQotKg0KLSogRmlsZSBOYW1lOiAgbnZwYXJhbV9kcnYuaA0KLSogRmlsZSBNYXJrOg0KLSogRGVzY3JpcHRpb246ICANCi0qIE90aGVyczoNCi0qIFZlcnNpb246ICAgdjEuMA0KLSogQXV0aG9yOiAgIHdhbmd4aWENCi0qIERhdGU6ICAgICAgICAgMjAxNi0wMy0xMg0KLSoNCi0qIEhpc3RvcnkgMToNCi0qICAgICBEYXRlOg0KLSogICAgIFZlcnNpb246DQotKiAgICAgQXV0aG9yOg0KLSogICAgIE1vZGlmaWNhdGlvbjoNCi0qIEhpc3RvcnkgMjoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZm5kZWYgTlZQQVJBTV9EUlZfSA0KLSNkZWZpbmUgTlZQQVJBTV9EUlZfSA0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaW5jbHVkZSAiUldOdkNvbmZpZy5oIg0KLSNpbmNsdWRlICJOdlBhcmFtX3RzYy5oIg0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jZGVmaW5lCURSVl9OVl9BRERSCQkJCQlPU19GTEFTSF9EUlZfUldfTk9ORkFDX0JBU0VfQUREUg0KLSNkZWZpbmUJRFJWX05WX1NJWkUJCQkJCU9TX0ZMQVNIX0RSVl9SV19OT05GQUNfU0laRQkvKjE2SyovDQotDQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfA0KLXwgIHB1YmxpYygyNTZCKSAgfCAgICBzeXN0ZW0oM0spICB8ICBwbGF0Zm9yKDNLKSAgfCBoaWdoc3BlZWQoNEspfCBwZXJpcGhlcmFsKDNLKSB8IAlhdWRpbygxSykgCXwgcmVzZXJ2ZWQoMS43NUspIHwNCi18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfA0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8NCi0NCi0jZGVmaW5lCURSVl9QVUJfTlZfQUREUgkJCQlEUlZfTlZfQUREUg0KLSNkZWZpbmUJRFJWX1BVQl9OVl9TSVpFCQkJCSgyNTYpDQotI2RlZmluZQlEUlZfU1lTX05WX0FERFIJCQkJKERSVl9QVUJfTlZfQUREUiArIERSVl9QVUJfTlZfU0laRSkNCi0jZGVmaW5lCURSVl9TWVNfTlZfU0laRQkJCQkoMyAqIDEwMjQpDQotI2RlZmluZQlEUlZfUExBVF9OVl9BRERSCQkJKERSVl9TWVNfTlZfQUREUiArIERSVl9TWVNfTlZfU0laRSkNCi0jZGVmaW5lCURSVl9QTEFUX05WX1NJWkUJCQkoMyAqIDEwMjQpDQotI2RlZmluZQlEUlZfSFNfUEVSSV9OVl9BRERSCQkJKERSVl9QTEFUX05WX0FERFIgKyBEUlZfUExBVF9OVl9TSVpFKQ0KLSNkZWZpbmUJRFJWX0hTX1BFUklfTlZfU0laRQkJCSg0ICogMTAyNCkNCi0jZGVmaW5lCURSVl9QRVJJX05WX0FERFIJCQkoRFJWX0hTX1BFUklfTlZfQUREUiArIERSVl9IU19QRVJJX05WX1NJWkUpDQotI2RlZmluZQlEUlZfUEVSSV9OVl9TSVpFCQkJKDMgKiAxMDI0KQ0KLSNkZWZpbmUJRFJWX0FVRElPX05WX0FERFIJCQkoRFJWX1BFUklfTlZfQUREUiArIERSVl9QRVJJX05WX1NJWkUpDQotI2RlZmluZQlEUlZfQVVESU9fTlZfU0laRQkJCSgxICogMTAyNCkNCi0jZGVmaW5lCURSVl9SU1ZEX05WX0FERFIJCQkoRFJWX0FVRElPX05WX0FERFIgKyBEUlZfQVVESU9fTlZfU0laRSkNCi0jZGVmaW5lCURSVl9SU1ZEX05WX1NJWkUJCQkoMSAqIDEwMjQgKyA3NjgpDQotDQotI2RlZmluZQlEUlZfVE9UQUxfTlZfU0laRQkJCShEUlZfUFVCX05WX1NJWkUrRFJWX1NZU19OVl9TSVpFK0RSVl9QTEFUX05WX1NJWkUrRFJWX0hTX1BFUklfTlZfU0laRStEUlZfUEVSSV9OVl9TSVpFK0RSVl9BVURJT19OVl9TSVpFK0RSVl9SU1ZEX05WX1NJWkUpDQotDQotLyogdXNlciBpbnRlcmZhY2UgKi8NCi0jZGVmaW5lIERSVl9QVUJfTlZfSVRFTV9BRERSKHgpIAkoRFJWX1BVQl9OVl9BRERSICsgKFVJTlQzMikoJigoKFRfWkRydk52X1B1YkRhdGEqKSgweDApKS0+eCkpKQ0KLSNkZWZpbmUgRFJWX1BVQl9OVl9JVEVNX1NJWkUoeCkgCShzaXplb2YoKChUX1pEcnZOdl9QdWJEYXRhKikoMHgwKSktPngpKQ0KLQ0KLSNkZWZpbmUgRFJWX1NZU19OVl9JVEVNX0FERFIoeCkgCShEUlZfU1lTX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfU3lzRGF0YSopKDB4MCkpLT54KSkpDQotI2RlZmluZSBEUlZfU1lTX05WX0lURU1fU0laRSh4KSAJKHNpemVvZigoKFRfWkRydk52X1N5c0RhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBEUlZfUExBVF9OVl9JVEVNX0FERFIoeCkgCShEUlZfUExBVF9OVl9BRERSICsgKFVJTlQzMikoJigoKFRfWkRydk52X1BsYXREYXRhKikoMHgwKSktPngpKSkNCi0jZGVmaW5lIERSVl9QTEFUX05WX0lURU1fU0laRSh4KSAJKHNpemVvZigoKFRfWkRydk52X1BsYXREYXRhKikoMHgwKSktPngpKQ0KLQ0KLSNkZWZpbmUgRFJWX0hTX1BFUklfTlZfSVRFTV9BRERSKHgpIChEUlZfSFNfUEVSSV9OVl9BRERSICsgKFVJTlQzMikoJigoKFRfWkRydk52X0hTUGVyaURhdGEqKSgweDApKS0+eCkpKQ0KLSNkZWZpbmUgRERSVl9IU19QRVJfTlZfSVRFTV9TSVpFKHgpIChzaXplb2YoKChUX1pEcnZOdl9IU1BlcmlEYXRhKikoMHgwKSktPngpKQ0KLQ0KLSNkZWZpbmUgRFJWX1BFUl9OVl9JVEVNX0FERFIoeCkgCShEUlZfUEVSSV9OVl9BRERSICsgKFVJTlQzMikoJigoKFRfWkRydk52X1BlcmlEYXRhKikoMHgwKSktPngpKSkNCi0jZGVmaW5lIERSVl9QRVJfTlZfSVRFTV9TSVpFKHgpIAkoc2l6ZW9mKCgoVF9aRHJ2TnZfUGVyaURhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBEUlZfQVVESU9fTlZfSVRFTV9BRERSKHgpIAkoRFJWX0FVRElPX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfQXVkaW9EYXRhKikoMHgwKSktPngpKSkNCi0jZGVmaW5lIERSVl9BVURJT19OVl9JVEVNX1NJWkUoeCkgCShzaXplb2YoKChUX1pEcnZOdl9BdWRpb0RhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBPU19GTEFTSF9WT0lDRV9EUlZfUldfTk9ORkFDX0JBU0VfQUREUiAgICAgICAgIChPU19GTEFTSF9EUlZfUldfTk9ORkFDX0JBU0VfQUREUiArIDE1MzYwKQ0KLSNkZWZpbmUgT1NfRkxBU0hfVk9JQ0VfRFJWX05PTkZBQ19TSVpFICAgICAxMDI0DQotDQotI2lmIERSVl9UT1RBTF9OVl9TSVpFID4gKE9TX0ZMQVNIX0RSVl9SV19OT05GQUNfU0laRSkNCi0jZXJyb3IgImVycm9yIGRydiBudiBjb25maWchISEiDQotI2VuZGlmDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAkgICAgICAgICBEcnYgTlYgQ29uZmlnDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTEuIHB1YmxpYyBudl9kYXRhDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IF9UX1pEcnZOdl9QdWJEYXRhDQotew0KLQkvKiAweDAwICovIAlDSEFSICAJY2hpcE5hbWVbMTZdOw0KLQkvKiAweDEwICovIAlDSEFSCXByak5hbWVbMTZdOw0KLQkvKiAweDIwICovIAlDSEFSIAlleHRlcm5hbFZlclsxNl07DQotCS8qIDB4MzAgKi8gCUNIQVIgCWludGVybmFsVmVyWzE2XTsNCi0JLyogMHg0MCAqLyAJQ0hBUiAJcmVsZWFzZVRpbWVbMTZdOw0KLQkvKiAweDUwICovIAlVSU5UOCAJcHJvZHVjdFR5cGU7DQotCS8qIDB4NTEgKi8gCVVJTlQ4IAlyZXNlcnZlZFtEUlZfUFVCX05WX1NJWkUgLSAweDUxXTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9QdWJEYXRhOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTIuIHN5c3RlbSBncm91cCBudl9kYXRhDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IF9UX1pEcnZOdl9TeXNEYXRhDQotew0KLQkvKiAweDAwMCAqLwlUX1NZU19OVl9UU0NfQ09ORklHIHRzY19jb25maWc7DQotCQkJCVVJTlQ4IHJlc2VydmVkMFsxMl07DQotCS8qIDB4NzAgKi8JVUlOVDMyIGJ1Y2sxT25vZmZGbGFnOw0KLQkvKiAweDc0ICAqLwlVSU5UMzIgd2R0U3dpdGNoOw0KLQkvKiAweDc4ICAqLwlVSU5UMzIgd2R0UHJpb3JpdHk7DQotCS8qIDB4N0MgKi8JVUlOVDggdWljY21vZGVTd2l0Y2g7DQotCS8qIDB4N0QgKi8JVUlOVDggdWljY1ByZVN3aXRjaDsgDQotCS8qIDB4N0UgKi8JVUlOVDggdWljYzFtb2RlU3dpdGNoOw0KLQkvKiAweDdGICovCVVJTlQ4IHVpY2MxUHJlU3dpdGNoOyANCi0JLyogMHg4MCAqLwlVSU5UOCBpc2hwbm90c3VwcG9ydGVkOw0KLSAgICAgICAgICAgICAgVUlOVDggcmVzZXJ2ZWRbRFJWX1NZU19OVl9TSVpFIC0gMTI5XTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9TeXNEYXRhOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTMuIHBsYXRmb3JtIGdyb3VwIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydk52X1BsYXREYXRhDQotew0KLQlVSU5UOCByZXNlcnZlZFtEUlZfUExBVF9OVl9TSVpFXTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9QbGF0RGF0YTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi00LiBoaWduLXNwZWVkIHBlcmlwaGVyYWwgZ3JvdXAgbnZfZGF0YQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCBfVF9aRHJ2TnZfSFNQZXJpRGF0YQ0KLXsNCi0JVUlOVDggcmVzZXJ2ZWRbRFJWX0hTX1BFUklfTlZfU0laRV07DQotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgVF9aRHJ2TnZfSFNQZXJpRGF0YTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi01LiBjb21tb24gcGVyaXBoZXJhbCBncm91cCBudl9kYXRhDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IF9UX1pEcnZOdl9QZXJpRGF0YQ0KLXsNCi0gICAgVUlOVDggYmF0X2RldDsNCi0gICAgVUlOVDggcmVzZXJ2ZWRbRFJWX1BFUklfTlZfU0laRS0xXTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9QZXJpRGF0YTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi02LiBhdWRpbyBncm91cCBudl9kYXRhDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IF9UX1pEcnZOdl9BdWRpb0RhdGENCi17DQotICAgIFVJTlQ4IHJlc2VydmVkW0RSVl9BVURJT19OVl9TSVpFXTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9BdWRpb0RhdGE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotNy4gYWxsIGRyaXZlcl91c2VkIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydl9OdkRhdGENCi17DQotCS8qIDB4MDAwMCAqLwlUX1pEcnZOdl9QdWJEYXRhCXB1YkRhdGE7DQotCS8qIDB4MDEwMCAqLwlUX1pEcnZOdl9TeXNEYXRhCXN5c0RhdGE7DQotCS8qIDB4MEQwMCAqLwlUX1pEcnZOdl9QbGF0RGF0YQlwbGF0RGF0YTsNCi0JLyogMHgxOTAwICovCVRfWkRydk52X0hTUGVyaURhdGEJSFNQZXJpRGF0YTsNCi0JLyogMHgyOTAwICovCVRfWkRydk52X1BlcmlEYXRhCXBlcmlEYXRhOw0KLQkvKiAweDM1MDAgKi8JVF9aRHJ2TnZfQXVkaW9EYXRhCWF1ZGlvRGF0YTsNCi0JLyogMHgzOTAwICovCVVJTlQ4CQkJCXJlc2VydmVkW0RSVl9SU1ZEX05WX1NJWkVdOw0KLX0gVF9aRHJ2X052RGF0YTsNCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJY2hlY2sgc3RydWN0IHNpemUNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotc3RhdGljIGlubGluZSBDSEFSIHpEcnZOdl9DaGVja1R5cGVTaXplKHZvaWQpDQoteyBcDQotCUNIQVIgX19kdW1teTFbKHNpemVvZihUX1pEcnZfTnZEYXRhKT09RFJWX05WX1NJWkUpPzE6LTFdPXswfTsgXA0KLQlDSEFSIF9fZHVtbXkyWyhzaXplb2YoVF9aRHJ2TnZfUHViRGF0YSk9PURSVl9QVUJfTlZfU0laRSk/MTotMV09ezB9OyBcDQotCUNIQVIgX19kdW1teTNbKHNpemVvZihUX1pEcnZOdl9TeXNEYXRhKT09RFJWX1NZU19OVl9TSVpFKT8xOi0xXT17MH07IFwNCi0JQ0hBUiBfX2R1bW15NFsoc2l6ZW9mKFRfWkRydk52X1BsYXREYXRhKT09RFJWX1BMQVRfTlZfU0laRSk/MTotMV09ezB9OyBcDQotCUNIQVIgX19kdW1teTVbKHNpemVvZihUX1pEcnZOdl9IU1BlcmlEYXRhKT09RFJWX0hTX1BFUklfTlZfU0laRSk/MTotMV09ezB9OyBcDQotCUNIQVIgX19kdW1teTZbKHNpemVvZihUX1pEcnZOdl9QZXJpRGF0YSk9PURSVl9QRVJJX05WX1NJWkUpPzE6LTFdPXswfTsgXA0KLQlDSEFSIF9fZHVtbXk3WyhzaXplb2YoVF9aRHJ2TnZfQXVkaW9EYXRhKT09RFJWX0FVRElPX05WX1NJWkUpPzE6LTFdPXswfTsgXA0KLQlyZXR1cm4gKF9fZHVtbXkxWzBdK19fZHVtbXkyWzBdK19fZHVtbXkzWzBdK19fZHVtbXk0WzBdK19fZHVtbXk1WzBdK19fZHVtbXk2WzBdK19fZHVtbXk3WzBdKTsgXA0KLX0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAJb2xkIHN0cnVjdA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0jaWYgMA0KLXR5cGVkZWYgc3RydWN0IF9UX1N5c19EcnZfTnZfRGF0YQ0KLXsNCi0JVF9TWVNfTlZfVFNDX0NPTkZJRyB0c2NfY29uZmlnOw0KLQlVSU5UOCByZXNlcnZlZFs2XTsNCi0JVUlOVDMyIHdkdFN3aXRjaDsNCi19VF9TeXNfRHJ2X052X0RhdGE7DQotI2VuZGlmDQotdHlwZWRlZiBzdHJ1Y3QgX1RfRHJ2X052X0RhdGENCi17DQotCVVJTlQzMiBWcERhdGFbMTAyNF07Ly9hZGQgYnkgbHZ3ZW5odWEgZm9yIHZvaWNlIDIwMTMuMTIuNg0KLX1UX0Rydl9Odl9EYXRhOw0KLQ0KLSNkZWZpbmUgRFJWX05WX0lURU1fQUREUkVTUyh4KSAoRFJWX0FVRElPX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9EcnZfTnZfRGF0YSopKDB4MCkpLT54KSkpDQotLy9mbGFnIHVzZSAzMmJ5dGUNCi10eXBlZGVmIHN0cnVjdCBfVF9BdWRpb19OdkZsYWcNCi17DQotICAgIFVJTlQ4ICAgICAgICAgICBpc1ZwQ29uZmlnSW5pdE9uOw0KLSAgICBVSU5UOCAgICAgICAgICAgaXNWcFBhcmFtSW5OdjsNCi0gICAgVUlOVDggICAgICAgICAgIGlzVXNlU2xpY0NvZGVjOw0KLSAgICBVSU5UOCAgICAgICAgICAgaXNVc2VWb2ljZVByb2M7Ly80IFVJTlQ4ICAgICAgICAgICBpc1VzZU5YUDsNCi0gICAgVUlOVDggICAgICAgICAgIGlzVXNlQ29kZWNEc3A7CQ0KLQlVSU5UOAkJCWlzVXNlTnZXcml0ZTsNCi0JVUlOVDgJCQlpc0Nsb3NlVnBCdWZmZXJCYWs7DQotCVVJTlQ4CQkJaXNVc2VUZG07Ly84DQotCVVJTlQ4CQkJaXNVc2VSeER0bWZEZXQ7DQotCVVJTlQ4CQkJaXNVc2VUeER0bWZEZXQ7ICAgICANCi0gICAgVUlOVDgJCQlpc1VzZVJ4TWl4RGF0YTsNCi0JVUlOVDgJCQlpc1VzZVR4TWl4RGF0YTsvLzEyDQotCVVJTlQ4CQkJaXNVc2VFY2FsbDsNCi0gICAgVUlOVDggICAgICAgICAgIHJlc2VydmVkWzE5XTsvLzMyLTEzDQotCQ0KLX0gIFRfQXVkaW9fTnZGbGFnOw0KLQ0KLSNlbmRpZg0KLQ0KZGlmZiAtLWdpdCBhL1Vib290L3B1Yi9wcm9qZWN0L3p4Mjk3NTIwdjMvaW5jbHVkZS9pbmZyYS9yYW1fYmFzZV9jb25maWdfNzUyMHYzLmggYi9VYm9vdC9wdWIvcHJvamVjdC96eDI5NzUyMHYzL2luY2x1ZGUvaW5mcmEvcmFtX2Jhc2VfY29uZmlnXzc1MjB2My5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YTE2MjZkLi4wMDAwMDAwCi0tLSBhL1Vib290L3B1Yi9wcm9qZWN0L3p4Mjk3NTIwdjMvaW5jbHVkZS9pbmZyYS9yYW1fYmFzZV9jb25maWdfNzUyMHYzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qILDmyKjL+dPQIChDKTIwMTUsINbQ0MvNqNG2ucm33dPQz965q8u+oaMNCi0qIA0KLSogzsS8/sP7s8Y6ICAgICByYW1fY29uZmlnXzc1MjB2My5oDQotKiDOxLz+serKtjogICAgIHJhbV9jb25maWdfNzUyMHYzLmgNCi0qIMTayN3VqtKqOiAgICAgengyOTc1MjB2M9C+xqzGvcyotOa0orXY1rfF5NbDzbfOxLz+DQotKiDKudPDt723qDogICAgICNpbmNsdWRlICJyYW1fY29uZmlnLmgiDQotKiANCi0qINDeuMTI1cbaICAgICAgICCw5rG+usUgICAgICDQ3rjEseq8xyAgICAgICAg0N64xMjLICAgICAgICAgINDeuMTE2sjdDQotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0qIDIwMTUvMDYvMDggICAgICBWMS4wICAgICAgICBDcmVhdGUgICAgICAgICAgwfXRx8TPICAgICAgICAgILS0vagNCi0qIA0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2lmbmRlZiBfUkFNX0JBU0VfQ09ORklHXzc1MjBWMw0KLSNkZWZpbmUgX1JBTV9CQVNFX0NPTkZJR183NTIwVjMNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIM23zsS8/iAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrqtqjS5SAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0vKiBJUkFNMLv5tdjWtyAqLw0KLSNpZmRlZiBERFJfQkFTRV9BRERSX0xJTlVYX1ZBDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykoWlhfSVJBTTBfQkFTRSkpDQotI2Vsc2UNCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSICAgICAgICAgICAgICAgICAgKDB4ODIwMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbmRpZg0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTiAgICAgICAgICAgICAgICAgICAoMHgwMDAxMDAwMFVMPj5DUFVfU0hJRlQpDQotDQotLyogMUssINLss6PP8sG/se06IDB4ODIwMDAwMDAvMHg0MTAwMDAwMCAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfVkVDVE9SICAgICAgICAgICAoSVJBTV9CQVNFX0FERFIpIA0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9WRUNUT1IgICAgICAgICAgICAoKDEgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBPVFBfU0VDVVJFX1BVS19CQVNFICAgICAgICAgICAgICBJUkFNX0JBU0VfQUREUl9WRUNUT1IgKyAweDQNCi0NCi0vKiAxMkujrMf9tq+6y7zkzajRtiAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfRFJWICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfVkVDVE9SICsgSVJBTV9CQVNFX0xFTl9WRUNUT1IpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX0RSViAgICAgICAgICAgICAgICgoMTIgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMUujrMqhtefD/MHuvbu7pSAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfUFNNICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfRFJWICsgSVJBTV9CQVNFX0xFTl9EUlYpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1BTTSAgICAgICAgICAgICAgICgoMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiA0S6OsUFPT61BIWdDFz6K9u7ulo6y5q7my0rXO8SAgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1BVQiAgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1BTTSArIElSQU1fQkFTRV9MRU5fUFNNKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9QVUIgICAgICAgICAgICAgICAoKDQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogNTEyQqOsUFPT61BIWdDFz6K9u7ulo6zJ5Ma1uau5stK1zvEgICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9QVUJfUkYgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9QVUIpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1BVQl9SRiAgICAgICAgICAgICg1MTJVTD4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDMyQqOsuKjEo8q9QUZDu7q05sr9vt2/1bzkICAgICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9TTEFWRV9BRkMgICAgICAgIChJUkFNX0JBU0VfQUREUl9QVUJfUkYgKyBJUkFNX0JBU0VfTEVOX1BVQl9SRikNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fU0xBVkVfQUZDICAgICAgICAgKDMyVUw+PkNQVV9TSElGVCkNCi0NCi0vKiAxS6OszsK/2Mr9vt205rfFICAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfVFBDICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfUFVCICsgSVJBTV9CQVNFX0xFTl9QVUIpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1RQQyAgICAgICAgICAgICAgICgoMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAyS6Os1tC2z8/fs8y57LyjtOa3xSAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDICAgICAoSVJBTV9CQVNFX0FERFJfVFBDICsgSVJBTV9CQVNFX0xFTl9UUEMpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQyAgICAgICgoMiAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAxSyzPtc2zuPrX2bzHwrwgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSAgICAgICAgKElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQyArIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9TWVNfVFJBQ0UgICAgICAgICAoKDEgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogSVJBTSBJQ1C12Na3ICAgICAqLw0KLSNkZWZpbmUgSUNQX0NNRF9CQVNFX0FERFIgICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFIpDQotI2RlZmluZSBJQ1BfRFJWX0JBU0VfQUREUiAgICAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9EUlYpDQotI2RlZmluZSBEVUFMX1NUQU5EQllfSU5URVJGX0dTTV9VU0VfSU5GT19CQVNFX0FERFIgIChJUkFNX0JBU0VfQUREUl9HU00pDQotDQotLyoguPe6y0lSQU257LyjtdjWtyAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVICAgKElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQykNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX1BTQ1BVICAgICgweDIwMFVMPj5DUFVfU0hJRlQpDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfUEhZQ1BVICAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BTQ1BVICsgSVJBTV9CQVNFX0xFTl9PU19TVEFUSVNUSUNfUFNDUFUpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19QSFlDUFUgICAoMHgyMDBVTD4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX0FQQ1BVICAgKElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQ19QSFlDUFUgKyBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19QSFlDUFUpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19BUENQVSAgICAoMHg0MDBVTD4+Q1BVX1NISUZUKQ0KLQ0KLS8qILj3ustJUkFNuPrX2bXY1rcgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRV9STUNQVSAgICAgIChJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UpDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0VfQVBDUFUgICAgICAoSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICsgKDB4MTA+PkNQVV9TSElGVCkpDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0VfUFNDUFUgICAgICAoSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICsgKDB4MjA+PkNQVV9TSElGVCkpDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0VfUEhZQ1BVICAgICAoSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICsgKDB4MzA+PkNQVV9TSElGVCkpDQotDQotLyogcGh5IGxvZ9PFu6+3vbC4uLTTwyBJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UguvM1MTLX1r3av9W85CAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfWkNBVF9QSFlfTE9HICAgICAgICAgKElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSArICgweDIwMD4+Q1BVX1NISUZUKSkNCi0NCi0vKiBwaHkgbG9ntqrKp7j619m3vbC4uLTTwyBJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UguvM2NNfWvdq/1bzkICovDQotI2RlZmluZSBJUkFNX0JBU0VfUEhZX0xPR19EUk9QX1RSQUNFICAgIAkoSVJBTV9CQVNFX0FERFJfWkNBVF9QSFlfTE9HICsgKDB4MjAwPj5DUFVfU0hJRlQpIC0gKDB4NDA+PkNQVV9TSElGVCkpDQotDQotLyogvMfCvHJhbWR1bXDEo8q9OiA019a92r/VvOQqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfUkFNRFVNUF9NT0RFICAgICAgICAgKElSQU1fQkFTRV9QSFlfTE9HX0RST1BfVFJBQ0UgLSAoMHgwND4+Q1BVX1NISUZUKSkNCi0NCi0vKiC8x8K8U0hNIGJ1ZmZlcrXY1rc6IDE219a92r/VvOQqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfU0hNX1JFTU9URV9SRUdJT04gICAgKElSQU1fQkFTRV9BRERSX1JBTURVTVBfTU9ERSAtICgweDEwPj5DUFVfU0hJRlQpKQ0KLQ0KLS8qILzHwrx6Y2F0xKPKvTogNNfWvdq/1bzkKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1pDQVRfTU9ERSAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9TSE1fUkVNT1RFX1JFR0lPTiAtICgweDA0Pj5DUFVfU0hJRlQpKQ0KLQ0KLS8qILi008O57LyjtcTHsDS49tfWvdq8x8K8Ym9vdLSrtd21xEREUiBzaXpl0MXPoiAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfQk9PVF9ERFIgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX0RSViAtICgweDA0Pj5DUFVfU0hJRlQpKQ0KLQ0KLS8qIElSQU0xu/m12Na3ICovDQotI2lmZGVmICBERFJfQkFTRV9BRERSX0xJTlVYX1ZBDQotI2RlZmluZSBJUkFNMV9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpKFpYX0lSQU0xX0JBU0UpKQ0KLSNlbHNlDQotI2RlZmluZSBJUkFNMV9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAoMHgwMDEwMDAwMD4+Q1BVX1NISUZUKQ0KLSNlbmRpZg0KLSNkZWZpbmUgSVJBTTFfQkFTRV9MRU4gICAgICAgICAgICAgICAgICAgKDB4MDAwMDMwMDA+PkNQVV9TSElGVCkNCi0NCi0NCi0jZGVmaW5lIEREUl9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAgKDB4MjAwMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDNNo6zO78DtsuOw5rG+o6zTyVBTvNPU2CAgKi8NCi0vKiA3NTIwtcRaU1DF5NbDzqq3x0NhY2hlx/ijrNa7xNzF5NbDNLj2ts6jrMfSw7+49rbOtdjWt7u509DM2Lao0qrH86OsuMO12Na3seS2r9Do0+vO78DtsuPIt8jPICovDQotI2lmZGVmICBERFJfQkFTRV9BRERSX0xJTlVYX1ZBDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1BIWSAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykoWlhfRERSX1BIWUNPREVfQkFTRSkpDQotI2Vsc2UNCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUEhZICAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFIpDQotI2VuZGlmDQotDQotI2lmZGVmIF9VU0VfTFRFX09OTFkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QSFkgICAgICAgICAgICAgICAgKDB4MDAyMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbHNlDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUEhZICAgICAgICAgICAgICAgICgweDAwMzAwMDAwVUw+PkNQVV9TSElGVCkNCi0jZW5kaWYNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9QSFkgICAgICAgICAgICAgICAgKDApDQotDQotLyogMS41TaOszu/A7bLjREFUQS9IQVJRL0NSQyAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QSFlfREFUQSAgICAgICAgICAoRERSX0JBU0VfQUREUl9QSFkgKyBERFJfQkFTRV9MRU5fUEhZKQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1BIWV9EQVRBICAgICAgICAgICAoMHgwMDE4MDAwMFVMPj5DUFVfU0hJRlQpDQotI2RlZmluZSBERFJfQkFTRV9PRkZfUEhZX0RBVEEgICAgICAgICAgIChERFJfQkFTRV9PRkZfUEhZICsgRERSX0JBU0VfTEVOX1BIWSkNCi0NCi0vKiAxLjBNo6zQrdLp1bvT687vwO2y4727u6UgKi8gDQotI2RlZmluZSBERFJfQkFTRV9BRERSX0xURV9EQVRBICAgICAgICAgIChERFJfQkFTRV9BRERSX1BIWSArIEREUl9CQVNFX0xFTl9QSFkpIC8vRERSX0JBU0VfTEVOX1BIWV9OVg0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX0xURV9EQVRBICAgICAgICAgICAoMHgwMDEwMDAwMFVMPj5DUFVfU0hJRlQpDQotI2RlZmluZSBERFJfQkFTRV9PRkZfTFRFX0RBVEEgICAgICAgICAgIChERFJfQkFTRV9PRkZfUEhZICsgRERSX0JBU0VfTEVOX1BIWSkNCi0NCi0vKiAwLjI1TaOs1qezxbW8s/ZSYW1kdW1wICAgICAgICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1JBTURVTVAgICAgICAgICAgIChERFJfQkFTRV9BRERSX0xURV9EQVRBICsgRERSX0JBU0VfTEVOX0xURV9EQVRBKQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1JBTURVTVAgICAgICAgICAgICAoMHgwMDA0MDAwMFVMPj5DUFVfU0hJRlQpDQotI2RlZmluZSBERFJfQkFTRV9PRkZfUkFNRFVNUCAgICAgICAgICAgIChERFJfQkFTRV9PRkZfTFRFX0RBVEEgKyBERFJfQkFTRV9MRU5fTFRFX0RBVEEpDQotDQotI2lmZGVmIF9VU0VfVkVISUNMRV9EQyAvKiCztdTYy6u6y0xpbnV4ICovDQotLyogMzcuNzVNo6xBULmyusuw5rG+KLTLtPPQocrHsLTV1bqsQ0FQusu1xDY0TcTatObF5NbDtqjS5aOsuMO66rHwtKayu7vhsbvKudPDKSAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9BUCAgICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9SQU1EVU1QICsgRERSX0JBU0VfTEVOX1JBTURVTVApDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQVAgICAgICAgICAgICAgICAgICgweDAyNUMwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9BUCAgICAgICAgICAgICAgICAgKEREUl9CQVNFX09GRl9SQU1EVU1QICsgRERSX0JBU0VfTEVOX1JBTURVTVApDQotDQotLyogMk0sIHNoYXJlIG1lbW9yeSBiZXR3ZWVuIGFwIGFuZCBjYXAgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfQ0FQX0JVRiAgICAgICAgICAgKEREUl9CQVNFX0FERFJfQVAgKyBERFJfQkFTRV9MRU5fQVApDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQ0FQX0JVRiAgICAgICAgICAgICgweDAwMjAwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9DQVBfQlVGICAgICAgICAgICAgKEREUl9CQVNFX09GRl9BUCArIEREUl9CQVNFX0xFTl9BUCkNCi0NCi0vKiA4NE0vMjEyTSwgY2FwsOaxviAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9DQVAgICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9DQVBfQlVGICsgRERSX0JBU0VfTEVOX0NBUF9CVUYpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQ0FQICAgICAgICAgICAgICAgICgweDA1NDAwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9DQVAgICAgICAgICAgICAgICAgKEREUl9CQVNFX09GRl9DQVBfQlVGICsgRERSX0JBU0VfTEVOX0NBUF9CVUYpDQotDQotLyogY2Fwusu1xGR0YrXY1re5qXVib290ustjYXAga2VybmVsyrnTwyAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQ0FQX0RUQl9BRERSICAgICAgICAgICAoRERSX0JBU0VfQUREUl9DQVBfQlVGICsgKDB4MDAxMDAwMDBVTD4+Q1BVX1NISUZUKSkNCi0jZWxzZQ0KLS8qIDQyLjc1TaOsQVC5srrLsOaxvii0y7Tz0KHKx7C01dW6rENBULrLtcQ2NE3E2rTmxeTWw7ao0uWjrLjDuuqx8LSmsru74bG7yrnTwykgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfQVAgICAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfUkFNRFVNUCArIEREUl9CQVNFX0xFTl9SQU1EVU1QKQ0KLSNpZmRlZiBfVVNFX0xURV9PTkxZDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQVAgICAgICAgICAgICAgICAgICgweDAyQkMwMDAwVUw+PkNQVV9TSElGVCkNCi0jZWxzZQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX0FQICAgICAgICAgICAgICAgICAoMHgwMkFDMDAwMFVMPj5DUFVfU0hJRlQpDQotI2VuZGlmDQotI2RlZmluZSBERFJfQkFTRV9PRkZfQVAgICAgICAgICAgICAgICAgIChERFJfQkFTRV9PRkZfUkFNRFVNUCArIEREUl9CQVNFX0xFTl9SQU1EVU1QKQ0KLQ0KLS8qIDFNLCBzaGFyZSBtZW1vcnkgYmV0d2VlbiBhcCBhbmQgY2FwICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX0NBUF9CVUYgICAgICAgICAgIChERFJfQkFTRV9BRERSX0FQICsgRERSX0JBU0VfTEVOX0FQKQ0KLSNpZm5kZWYgRERSX0JBU0VfTEVOX0NBUF9CVUYNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9DQVBfQlVGICAgICAgICAgICAgKDB4MDAxMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbmRpZg0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX0NBUF9CVUYgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX0FQICsgRERSX0JBU0VfTEVOX0FQKQ0KLQ0KLS8qIDE2TSwgY2FwsOaxviAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9DQVAgICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9DQVBfQlVGICsgRERSX0JBU0VfTEVOX0NBUF9CVUYpDQotI2lmbmRlZiBERFJfQkFTRV9MRU5fQ0FQDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQ0FQICAgICAgICAgICAgICAgICgweDAxMDAwMDAwVUw+PkNQVV9TSElGVCkNCi0jZW5kaWYNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9DQVAgICAgICAgICAgICAgICAgKEREUl9CQVNFX09GRl9DQVBfQlVGICsgRERSX0JBU0VfTEVOX0NBUF9CVUYpDQotI2VuZGlmDQotDQotI2RlZmluZSBERFJfQkFTRV9QSFlDT0RFX0FERFJfUEEgICAgIAkoRERSX0JBU0VfQUREUikNCi0jZGVmaW5lIEREUl9CQVNFX01PREVNX0FERFJfUEEgICAgICAgCShERFJfQkFTRV9QSFlDT0RFX0FERFJfUEEgKyBERFJfQkFTRV9MRU5fUEhZKQ0KLSNkZWZpbmUgRERSX0JBU0VfTU9ERU1fU0laRSAgICAgICAgICAJKEREUl9CQVNFX0xFTl9MVEVfREFUQSArIEREUl9CQVNFX0xFTl9SQU1EVU1QKQ0KLSNkZWZpbmUgRERSX0JBU0VfQVBfQUREUl9QQSAgICAgICAgICAgICAoRERSX0JBU0VfTU9ERU1fQUREUl9QQSArIEREUl9CQVNFX01PREVNX1NJWkUpDQotDQotI2RlZmluZSBERFJfQkFTRV9DQVBCVUZfQUREUl9QQSAgICAgICAgIChERFJfQkFTRV9BUF9BRERSX1BBICsgRERSX0JBU0VfTEVOX0FQKQ0KLSNkZWZpbmUgRERSX0JBU0VfQ0FQX0FERFJfUEEgICAgICAgICAgICAoRERSX0JBU0VfQ0FQQlVGX0FERFJfUEEgKyBERFJfQkFTRV9MRU5fQ0FQX0JVRikNCi0NCi0NCi0vKiAxTaOszu/A7bLjTlYgICAgIL/VvOS4tNPDICAgICAgICAgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUEhZX05WICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfTFRFX0RBVEEpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUEhZX05WICAgICAgICAgICAgICgweDAwMTAwMDAwVUw+PkNQVV9TSElGVCkNCi0NCi0vKiAwLjM3NU2jrMf9tq/KobXnt/7Tw1BTPC0+UEhZvbu7pb/VvOQgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUFNNICAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfTFRFX0RBVEEpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUFNNICAgICAgICAgICAgICAgICgweDAwMDYwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9QU00gICAgICAgICAgICAgICAgKEREUl9CQVNFX09GRl9SQU1EVU1QKQ0KLQ0KLS8qIDFNo6zQrdLp1bvT687vwO2y4727u6UgIL/VvOS4tNPDICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1dDRE1BX0RBVEEgICAgICAgIChERFJfQkFTRV9BRERSX0xURV9EQVRBKQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1dDRE1BX0RBVEEgICAgICAgICAoRERSX0JBU0VfTEVOX0xURV9EQVRBKQ0KLQ0KLSNpZiAwDQotLyogUHNCdWZmZXK7+da3ICovDQotI2RlZmluZSBQU19CVUZfQkFTRV9BRERSICAgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX1BTQlVGKQ0KLSNlbmRpZg0KLQ0KLS8qIElDULv51rcgICAgICAqLw0KLSNkZWZpbmUgSUNQX0RBVEFfQkFTRV9BRERSICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9MVEVfREFUQSkNCi0NCi0vKiBXQ0RNQbv51rcgICAgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfRk9SX1cgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfV0NETUFfREFUQSkNCi0NCi0vKiC5pL7ftPrA7bv51rcgKi8NCi0vKiAjZGVmaW5lIFRPT0xfQUdFTlRfQkFTRV9BRERSICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfVE9PTF9BR0VOVCkgKi8NCi0NCi0jaWYgMA0KLS8qIFBQULv51rcgICAgICAqLw0KLSNkZWZpbmUgUExBVF9QUFBfQkFTRV9BRERSICAgICAgICAgICAgICAoUFNfQlVGX0JBU0VfQUREUikNCi0jZW5kaWYNCi0NCi0vKiovDQotI2RlZmluZSBTSEFSRV9CVUZfQVBfQ1BfQkFTRV9BRERSICAgICAgIChERFJfQkFTRV9BRERSX0FQX0NQX1NIQVJFQlVGKQ0KLQ0KLSNpZiBkZWZpbmVkKF9VU0VfQ0FQX1NZUykgfHwgZGVmaW5lZChfVVNFX1ZFSElDTEVfREMpDQotI2RlZmluZSBJQ1BfQ0FQX0JVRl9BRERSICAgICAgICAgICAgICAgIEREUl9CQVNFX0FERFJfQ0FQX0JVRg0KLSNkZWZpbmUgSUNQX0NBUF9CVUZfTEVOICAgICAgICAgICAgICAgICAoKDkyNCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0jZGVmaW5lIFRPT0xfQ0FQX0JVRl9BRERSICAgICAgICAgICAgICAgKElDUF9DQVBfQlVGX0FERFIgKyBJQ1BfQ0FQX0JVRl9MRU4pDQotI2RlZmluZSBUT09MX0NBUF9CVUZfTEVOICAgICAgICAgICAgICAgICgoNjAgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBSSU5HQlVGX0NBUF9UT19BUF9BRERSICAgICAgICAgIChUT09MX0NBUF9CVUZfQUREUiArIFRPT0xfQ0FQX0JVRl9MRU4pDQotI2RlZmluZSBSSU5HQlVGX0NBUF9UT19BUF9MRU4gICAgICAgICAgICgoMzIgICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgQURCX0NBUF9CVUZfQUREUiAgICAgICAgICAgICAgICAoUklOR0JVRl9DQVBfVE9fQVBfQUREUiArIFJJTkdCVUZfQ0FQX1RPX0FQX0xFTikNCi0jZGVmaW5lIEFEQl9DQVBfQlVGX0xFTiAgICAgICAgICAgICAgICAgKCg0ICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgUkFNRFVNUF9DQVBfQ01NX0JVRl9BRERSICAgICAgICAoQURCX0NBUF9CVUZfQUREUiArIEFEQl9DQVBfQlVGX0xFTikNCi0jZGVmaW5lIFJBTURVTVBfQ0FQX0NNTV9CVUZfTEVOICAgICAgICAgKCg0ICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgUklOR0JVRl9BUF9UT19DQVBfQUREUiAgICAgICAgICAoUkFNRFVNUF9DQVBfQ01NX0JVRl9BRERSICsgUkFNRFVNUF9DQVBfQ01NX0JVRl9MRU4pDQotI2RlZmluZSBSSU5HQlVGX0FQX1RPX0NBUF9MRU4gICAgICAgICAgICgoMTI4ICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgVE9PTF9aU1BfVE9fQ0FQX0xPR19BRERSICAgICAgICAoUklOR0JVRl9BUF9UT19DQVBfQUREUiArIFJJTkdCVUZfQVBfVE9fQ0FQX0xFTikNCi0jZGVmaW5lIFRPT0xfWlNQX1RPX0NBUF9MT0dfTEVOICAgICAgICAgKCgzODQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBSQU1EVU1QX0FQX1RPX0NBUF9CVUZfQUREUiAgICAgIChUT09MX1pTUF9UT19DQVBfTE9HX0FERFIgKyBUT09MX1pTUF9UT19DQVBfTE9HX0xFTikNCi0jZGVmaW5lIFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9MRU4gICAgICAgKCgxMjggKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBURUVfU0hBUkVfQlVGX0FERFIgICAgICAgICAgICAgIChSQU1EVU1QX0FQX1RPX0NBUF9CVUZfQUREUiArIFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9MRU4pDQotI2RlZmluZSBURUVfU0hBUkVfQlVGX0xFTiAgICAgICAgICAgICAgICgoMzg0ICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLSNkZWZpbmUgSUNQX0NBUF9CVUZfQUREUl9QQSAgICAgICAgICAgICBERFJfQkFTRV9DQVBCVUZfQUREUl9QQQ0KLSNkZWZpbmUgVE9PTF9DQVBfQlVGX0FERFJfUEEgICAgICAgICAgICAoSUNQX0NBUF9CVUZfQUREUl9QQSArIElDUF9DQVBfQlVGX0xFTikNCi0jZGVmaW5lIFJJTkdCVUZfQ0FQX1RPX0FQX0FERFJfUEEgICAgICAgKFRPT0xfQ0FQX0JVRl9BRERSX1BBICsgVE9PTF9DQVBfQlVGX0xFTikNCi0jZGVmaW5lIEFEQl9DQVBfQlVGX0FERFJfUEEgICAgICAgICAgICAgKFJJTkdCVUZfQ0FQX1RPX0FQX0FERFJfUEEgKyBSSU5HQlVGX0NBUF9UT19BUF9MRU4pDQotI2RlZmluZSBSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFJfUEEgICAgIChBREJfQ0FQX0JVRl9BRERSX1BBICsgQURCX0NBUF9CVUZfTEVOKQ0KLSNkZWZpbmUgUklOR0JVRl9BUF9UT19DQVBfQUREUl9QQSAgICAgICAoUkFNRFVNUF9DQVBfQ01NX0JVRl9BRERSX1BBICsgUkFNRFVNUF9DQVBfQ01NX0JVRl9MRU4pDQotI2RlZmluZSBUT09MX1pTUF9UT19DQVBfTE9HX0FERFJfUEEgICAgIChSSU5HQlVGX0FQX1RPX0NBUF9BRERSX1BBICsgUklOR0JVRl9BUF9UT19DQVBfTEVOKQ0KLSNkZWZpbmUgUkFNRFVNUF9BUF9UT19DQVBfQlVGX0FERFJfUEEgICAoVE9PTF9aU1BfVE9fQ0FQX0xPR19BRERSX1BBICsgVE9PTF9aU1BfVE9fQ0FQX0xPR19MRU4pDQotI2RlZmluZSBURUVfU0hBUkVfQlVGX0FERFJfUEEgICAgICAgICAgIChSQU1EVU1QX0FQX1RPX0NBUF9CVUZfQUREUl9QQSArIFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9MRU4pDQotI2VuZGlmDQotDQotLyogNzUyMFYz0L7GrElSQU0w0bnL9aOs0K3S6dW7zu/A7bLjvbu7pb/VvOTSxravtb1ERFKjrLi008NSYW1kdW1wv9W85CAqLw0KLS8qIDM0S6OsUFPT61BIWdDFz6K9u7ulo6xMVEXStc7xICovDQotLyogI2RlZmluZSBJUkFNX0JBU0VfQUREUl9MVEUgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX1JBTURVTVApICovDQotLyogMTBLo6xQU9PrUEhZ0MXPor27u6WjrExURdK1zvEgyrnTw0lSQU0wo6y5prrE08W7ryA3SyszSywgM2sgZm9yIGVtYm1zKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX0xURSAgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSArIElSQU1fQkFTRV9MRU5fU1lTX1RSQUNFKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9MVEUgICAgICAgICAgICAgICAoKDEwICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDI0S6OsUFPT61BIWbXESUNQvbu7paOsyrnTw0lSQU0qLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfUFNfUEhZX1NIQVJFQlVGICAgIChJUkFNX0JBU0VfQUREUl9MVEUgKyBJUkFNX0JBU0VfTEVOX0xURSkNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fUFNfUEhZX1NIQVJFQlVGICAgICgoMjQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMjIxS6OsUFPT61BIWbXESUNQvbu7paOsyrnTw0REUiwguLTTw1JBTURVTVAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QU19QSFlfU0hBUkVCVUYgICAgKEREUl9CQVNFX0FERFJfUkFNRFVNUCkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QU19QSFlfU0hBUkVCVUYgICAgKCgyMjEgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMmujrHpzcCBSQU1EVU1QKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUEhZX1JBTURVTVAgICAgICAgIChERFJfQkFTRV9BRERSX1BTX1BIWV9TSEFSRUJVRiArIEREUl9CQVNFX0xFTl9QU19QSFlfU0hBUkVCVUYpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUEhZX1JBTURVTVAgICAgICAgICgoMiAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAxS6OsUFPT61BIWdDFz6K9u7ulo6xURNK1zvEgyrnTw0REUiovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9URCAgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX1BIWV9SQU1EVU1QICsgRERSX0JBU0VfTEVOX1BIWV9SQU1EVU1QKQ0KLS8qICNkZWZpbmUgSVJBTV9CQVNFX0xFTl9URCAgICAgICAgICAgICAgICAoKDI1ICogMTAyNFVMKT4+Q1BVX1NISUZUKSAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9URCAgICAgICAgICAgICAgICAoKDEgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMTJLo6xQU9PrUEhZ0MXPor27u6WjrFfStc7xIMq508NERFIqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfV0NETUEgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfVEQgKyBJUkFNX0JBU0VfTEVOX1REKQ0KLS8qICNkZWZpbmUgSVJBTV9CQVNFX0xFTl9XQ0RNQSAgICAgICAgICAgICAoKDQ4ICogMTAyNFVMKT4+Q1BVX1NISUZUKSAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9XQ0RNQSAgICAgICAgICAgICAoKDEyICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDIwS6OsVyBVUEEgv9W85CAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9XVVBBX0RBVEEgICAgICAgICAoSVJBTV9CQVNFX0FERFJfV0NETUEgKyBJUkFNX0JBU0VfTEVOX1dDRE1BKQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1dVUEFfREFUQSAgICAgICAgICAoKDIwICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIElSQU0gV0NETUG7+da3ICAgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX0ZPUl9XICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1dDRE1BKQ0KLQ0KLS8qIERQUkFNu/nWtyAgICAgICAgKi8NCi0jZGVmaW5lIERQUkFNX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1REKQ0KLQ0KLS8qIERQUkFNIEREUrv51rcgICAgKi8NCi0jZGVmaW5lIERQUkFNX01FTV9CQVNFX0FERFIgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1REKQ0KLQ0KLS8qIFBTIHRjbSBjb25maWcgZm9yIHJhbWR1bXAgKi8NCi0jZGVmaW5lIFJBTURVTVBfUFNfSVRDTV9CQVNFX0VYVEVSICAgICAgKDB4MCkNCi0jZGVmaW5lIFJBTURVTVBfUFNfSVRDTV9CQVNFX0lOVEVSICAgICAgKDB4MCkNCi0jZGVmaW5lIFJBTURVTVBfUFNfSVRDTV9TSVpFICAgICAgICAgICAgKDB4MCkNCi0jZGVmaW5lIFJBTURVTVBfUFNfRFRDTV9CQVNFX0VYVEVSICAgICAgKDB4MCkNCi0jZGVmaW5lIFJBTURVTVBfUFNfRFRDTV9CQVNFX0lOVEVSICAgICAgKDB4MCkNCi0jZGVmaW5lIFJBTURVTVBfUFNfRFRDTV9TSVpFICAgICAgICAgICAgKDB4MCkNCi0NCi0vKiBaU1AgUmFtZHVtcCAqLw0KLS8qICNpZmRlZiBfVVNFX1pTUF9SQU1EVU1QICovDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfSVRDTV9CQVNFICAgICAgICAgICgweDgxMDQwMDAwVUwpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfSVRDTV9TSVpFICAgICAgICAgICgweDAwMDEwMDAwVUwpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfRFRDTV9CQVNFICAgICAgICAgICgweDgxMDAwMDAwVUwpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfRFRDTV9TSVpFICAgICAgICAgICgweDAwMDEwMDAwVUwpDQotDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfQ09ERV9TSVpFICAgICAgICAgICgweDFiMDAwMD4+Q1BVX1NISUZUKQ0KLSMgZGVmaW5lIFJBTURVTVBfWlNQX0lERFJfQkFTRSAgICAgICAgICAoRERSX0JBU0VfQUREUl9QSFkpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfSUREUl9TSVpFICAgICAgICAgIChSQU1EVU1QX1pTUF9DT0RFX1NJWkUpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfREREUl9CQVNFICAgICAgICAgIChSQU1EVU1QX1pTUF9JRERSX0JBU0UgKyBSQU1EVU1QX1pTUF9DT0RFX1NJWkUpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfREREUl9TSVpFICAgICAgICAgIChERFJfQkFTRV9MRU5fUEhZIC0gUkFNRFVNUF9aU1BfQ09ERV9TSVpFKQ0KLQ0KLSMgZGVmaW5lIFJBTURVTVBfWlNQX0lUQ01fU0VMRl9CQVNFICAgICAoMHgwKQ0KLSMgZGVmaW5lIFJBTURVTVBfWlNQX0RUQ01fU0VMRl9CQVNFICAgICAoMHgxMDAwMFVMKQ0KLS8qICNlbmRpZiAqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyv2+3cDg0M22qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rHkwb/J+cP3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyKu+1rqvyv3J+cP3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNlbmRpZiAgLy8gI2lmbmRlZiBfUkFNX0JBU0VfQ09ORklHXzc1MjBWMw0KLQ0KZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvYWxsYmluc19kY19yZWYvUmVmX252cndfMHgyNkMwMC5iaW4gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2FsbGJpbnNfZGNfcmVmL1JlZl9udnJ3XzB4MjZDMDAuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTM2OTkxLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvYWxsYmluc19kY19yZWYvUmVmX252cndfMHgyNkMwMC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9hcHN0YV9kZW1vIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvYXBzdGFfZGVtbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBmZjhkMy4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9hcHN0YV9kZW1vCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvYnNwX3Rlc3QgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9ic3BfdGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZhMTMwMS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9ic3BfdGVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2J1c3lib3guc3VpZCBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2J1c3lib3guc3VpZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg0MTk4Ny4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9idXN5Ym94LnN1aWQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9kbnNtYXNxIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvZG5zbWFzcQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDBiYjNiYy4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9kbnNtYXNxCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGQtMi4zMS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xkLTIuMzEuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZiMGFmZWMuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGQtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYlNlZ0ZhdWx0LnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGliU2VnRmF1bHQuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZjI0NTQuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGliU2VnRmF1bHQuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJhbmwtMi4zMS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYmFubC0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZGIxZTIyLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYmFubC0yLjMxLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGliYy0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGliYy0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZTdlNDgxLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYmMtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYmRlYnVnX2luZm8uc28gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJkZWJ1Z19pbmZvLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzBiZThmLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYmRlYnVnX2luZm8uc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJkbC0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGliZGwtMi4zMS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTllYWFjMi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJkbC0yLjMxLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibS0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibS0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MDg3MzZmLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm0tMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm1lbXVzYWdlLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibWVtdXNhZ2Uuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDczOGZlMzIuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibWVtdXNhZ2Uuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJtdGQuc28gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJtdGQuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0OTgxZDIuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibXRkLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNsLTIuMzEuc28gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc2wtMi4zMS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjcwZGJlOS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc2wtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19jb21wYXQtMi4zMS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19jb21wYXQtMi4zMS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM2N2YwZC4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc3NfY29tcGF0LTIuMzEuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc3NfZGItMi4zMS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19kYi0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NmM5NWFhLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19kYi0yLjMxLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNzX2Rucy0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNzX2Rucy0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Nzg0MmYwLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19kbnMtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYm5zc19maWxlcy0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNzX2ZpbGVzLTIuMzEuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4NGRiMTUuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNzX2ZpbGVzLTIuMzEuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc3NfaGVzaW9kLTIuMzEuc28gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJuc3NfaGVzaW9kLTIuMzEuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1ZThjMWUuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlibnNzX2hlc2lvZC0yLjMxLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicHRocmVhZC0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicHRocmVhZC0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZWJjZTViLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnB0aHJlYWQtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnJlc29sdi0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicmVzb2x2LTIuMzEuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNiNzdlZGYuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicmVzb2x2LTIuMzEuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJyaWx1dGlscy5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnJpbHV0aWxzLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMGI1NGRiLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnJpbHV0aWxzLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicnQtMi4zMS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnJ0LTIuMzEuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4Mjc2M2YuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlicnQtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnNkLWRhZW1vbi5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnNkLWRhZW1vbi5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDI1Yzg2MS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJzZC1kYWVtb24uc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJzZWxpbnV4LnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlic2VsaW51eC5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTI5N2YyYy4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJzZWxpbnV4LnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlic2VsaW51eC5zby4xIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlic2VsaW51eC5zby4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMjk3ZjJjLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnNlbGludXguc28uMQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnNxbGl0ZS5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnNxbGl0ZS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTU5OWI0MS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJzcWxpdGUuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJ0aHJlYWRfZGItMS4wLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlidGhyZWFkX2RiLTEuMC5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDM2MDVmNC4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9saWJ0aHJlYWRfZGItMS4wLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlidXRpbC0yLjMxLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvbGlidXRpbC0yLjMxLnNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzUxZTU4Li4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL2xpYnV0aWwtMi4zMS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL29wdGVlX2V4YW1wbGVfYWVzIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvb3B0ZWVfZXhhbXBsZV9hZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5OTVjYTkuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvb3B0ZWVfZXhhbXBsZV9hZXMKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX2VjZHNhIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvb3B0ZWVfZXhhbXBsZV9lY2RzYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTI2N2Y3My4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX2VjZHNhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvb3B0ZWVfZXhhbXBsZV9yc2EgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3JzYQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkxYmM4NS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3JzYQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL29wdGVlX2V4YW1wbGVfc2VjdXJlX3N0b3JhZ2UgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3NlY3VyZV9zdG9yYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjkwZjBjLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL29wdGVlX2V4YW1wbGVfc2VjdXJlX3N0b3JhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3NtMiBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL29wdGVlX2V4YW1wbGVfc20yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmZiYzRiLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL29wdGVlX2V4YW1wbGVfc20yCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvb3B0ZWVfZXhhbXBsZV9zbTQgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3NtNApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA0ODI2My4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9vcHRlZV9leGFtcGxlX3NtNAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3JhZHZkIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvcmFkdmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3ZmE3NTIuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvcmFkdmQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC9yYWR2ZHVtcCBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3JhZHZkdW1wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MDIxNWE3Li4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3JhZHZkdW1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvc2Nfc2htX3Bvc2l4IGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvc2Nfc2htX3Bvc2l4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MTgxMDQ3Li4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3NjX3NobV9wb3NpeAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3RlZS1zdXBwbGljYW50IGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvdGVlLXN1cHBsaWNhbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkOGExMjguLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvdGVlLXN1cHBsaWNhbnQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC90ZXN0X3NwaWRldl91c2VkX2dwaW9fY3RybCBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3Rlc3Rfc3BpZGV2X3VzZWRfZ3Bpb19jdHJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYWViMzIzLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3Rlc3Rfc3BpZGV2X3VzZWRfZ3Bpb19jdHJsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvdWFydHRlc3QgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC91YXJ0dGVzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk5ZDEwZi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC91YXJ0dGVzdAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3ZvaWNlX2RlbW8gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC92b2ljZV9kZW1vCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZmZkY2Y5Li4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9jYXAvbm9ybWFsL3ZvaWNlX2RlbW8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC93aWZpX2RlbW8gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvY2FwL25vcm1hbC93aWZpX2RlbW8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc1ZjUyMDIuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2NhcC9ub3JtYWwvd2lmaV9kZW1vCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2V2Yl9jcHVwaHlfb3V0Ljd6IGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL2V2Yl9jcHVwaHlfb3V0Ljd6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NmFjODdlLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ldmJfY3B1cGh5X291dC43egorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL2FkYmQuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvYWRiZC5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlOGJkOTcuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvYWRiZC5lbGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9ob3N0YXBkXzJfMTAuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvaG9zdGFwZF8yXzEwLmVsZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjEwZDdhOS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9ob3N0YXBkXzJfMTAuZWxmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlibnZyYW0uc28gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9saWJudnJhbS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTUwZTRkNi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9saWJudnJhbS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL2xpYm52cmFtX3NjLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlibnZyYW1fc2Muc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYzNTIyNDYuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlibnZyYW1fc2Muc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9saWJzb2Z0X3RpbWVyLnNvIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlic29mdF90aW1lci5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDc5ZTg3OS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9saWJzb2Z0X3RpbWVyLnNvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlic29mdF90aW1lcl9zYy5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL2xpYnNvZnRfdGltZXJfc2Muc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2NTg1ZjAuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvbGlic29mdF90aW1lcl9zYy5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL2xpYnVwaV9hYi5zbyBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL2xpYnVwaV9hYi5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTg1MWQ0Yi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9saWJ1cGlfYWIuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9yYWR2ZC5lbGYgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy9yYWR2ZC5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0MDc5YTUuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvcmFkdmQuZWxmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvd3BhX3N1cHBsaWNhbnRfMl8xMC5lbGYgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy93cGFfc3VwcGxpY2FudF8yXzEwLmVsZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThkZWIzYi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy93cGFfc3VwcGxpY2FudF8yXzEwLmVsZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL3p0ZV9iaXAuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX2JpcC5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0Nzc3YzcuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX2JpcC5lbGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy96dGVfaXB2Nl9hZGRyX2NvbGxlY3QuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX2lwdjZfYWRkcl9jb2xsZWN0LmVsZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTUxMGRkNi4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy96dGVfaXB2Nl9hZGRyX2NvbGxlY3QuZWxmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX2lwdjZfc2xhYWMuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX2lwdjZfc2xhYWMuZWxmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OTc2ZWY3Li4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL3p0ZV9pcHY2X3NsYWFjLmVsZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvZWxmX2RjX3JlZi9ub3JtYWxlbGZzL3p0ZV9uZHAuZWxmIGIvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX25kcC5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4N2Y2ODQuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX25kcC5lbGYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy96dGVfdm9sdGVfbWFpbi5lbGYgYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL2VsZl9kY19yZWYvbm9ybWFsZWxmcy96dGVfdm9sdGVfbWFpbi5lbGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhMjk0NzYuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9lbGZfZGNfcmVmL25vcm1hbGVsZnMvenRlX3ZvbHRlX21haW4uZWxmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9udi9SZWZfbnZyd18weDI2QzAwLmJpbiBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnYvUmVmX252cndfMHgyNkMwMC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ2YWU4NzMuLjAwMDAwMDAKLS0tIGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9udi9SZWZfbnZyd18weDI2QzAwLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGMvUmVmX252cndfMHgyNkMwMC5iaW4gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL252X2RjL1JlZl9udnJ3XzB4MjZDMDAuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNTY5NzYyLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGMvUmVmX252cndfMHgyNkMwMC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL252X2RjXzRHYi9SZWZfbnZyd18weDI2QzAwLmJpbiBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGNfNEdiL1JlZl9udnJ3XzB4MjZDMDAuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZTBiNzczLi4wMDAwMDAwCi0tLSBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGNfNEdiL1JlZl9udnJ3XzB4MjZDMDAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9fcGFja2FnZV90b29sL2FsbGJpbnMvengyOTc1MjB2My9wcmpfdmVoaWNsZS9udl9kY19yZWYvUmVmX252cndfMHgyNkMwMC5iaW4gYi9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL252X2RjX3JlZi9SZWZfbnZyd18weDI2QzAwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzUzNjk5MS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL252X2RjX3JlZi9SZWZfbnZyd18weDI2QzAwLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGNfc3lzdGVtZC9SZWZfbnZyd18weDI2QzAwLmJpbiBiL2RvX3BhY2thZ2VfdG9vbC9hbGxiaW5zL3p4Mjk3NTIwdjMvcHJqX3ZlaGljbGUvbnZfZGNfc3lzdGVtZC9SZWZfbnZyd18weDI2QzAwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDIwYmRlNS4uMDAwMDAwMAotLS0gYS9kb19wYWNrYWdlX3Rvb2wvYWxsYmlucy96eDI5NzUyMHYzL3Byal92ZWhpY2xlL252X2RjX3N5c3RlbWQvUmVmX252cndfMHgyNkMwMC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfc3lzIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kYy9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjM2Y2VkZC4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfc3lzCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLQotIyMjIyMjU09GVEFQ16jTwyBTVEFSVCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1jaGVja19yb2FtPXllcwotZ3NtX3NpZ25hbGJhcjBfbG93PTAKLWdzbV9zaWduYWxiYXIwX2hpZ2g9MAotZ3NtX3NpZ25hbGJhcjFfbG93PTEKLWdzbV9zaWduYWxiYXIxX2hpZ2g9MgotZ3NtX3NpZ25hbGJhcjJfbG93PTMKLWdzbV9zaWduYWxiYXIyX2hpZ2g9NgotZ3NtX3NpZ25hbGJhcjNfbG93PTcKLWdzbV9zaWduYWxiYXIzX2hpZ2g9OQotZ3NtX3NpZ25hbGJhcjRfbG93PTEwCi1nc21fc2lnbmFsYmFyNF9oaWdoPTEyCi1nc21fc2lnbmFsYmFyNV9sb3c9MTMKLWdzbV9zaWduYWxiYXI1X2hpZ2g9MzEKLXdjZG1hX3NpZ25hbGJhcjBfbG93PTAKLXdjZG1hX3NpZ25hbGJhcjBfaGlnaD0wCi13Y2RtYV9zaWduYWxiYXIxX2xvdz0xCi13Y2RtYV9zaWduYWxiYXIxX2hpZ2g9OAotd2NkbWFfc2lnbmFsYmFyMl9sb3c9OQotd2NkbWFfc2lnbmFsYmFyMl9oaWdoPTE2Ci13Y2RtYV9zaWduYWxiYXIzX2xvdz0xNwotd2NkbWFfc2lnbmFsYmFyM19oaWdoPTIyCi13Y2RtYV9zaWduYWxiYXI0X2xvdz0yMwotd2NkbWFfc2lnbmFsYmFyNF9oaWdoPTI4Ci13Y2RtYV9zaWduYWxiYXI1X2xvdz0yOQotd2NkbWFfc2lnbmFsYmFyNV9oaWdoPTkxCi10ZHNfc2lnbmFsYmFyMF9sb3c9MAotdGRzX3NpZ25hbGJhcjBfaGlnaD0wCi10ZHNfc2lnbmFsYmFyMV9sb3c9MQotdGRzX3NpZ25hbGJhcjFfaGlnaD04Ci10ZHNfc2lnbmFsYmFyMl9sb3c9OQotdGRzX3NpZ25hbGJhcjJfaGlnaD0xNgotdGRzX3NpZ25hbGJhcjNfbG93PTE3Ci10ZHNfc2lnbmFsYmFyM19oaWdoPTIyCi10ZHNfc2lnbmFsYmFyNF9sb3c9MjMKLXRkc19zaWduYWxiYXI0X2hpZ2g9MjgKLXRkc19zaWduYWxiYXI1X2xvdz0yOQotdGRzX3NpZ25hbGJhcjVfaGlnaD05MQotbHRlX3NpZ25hbGJhcjBfbG93PTAKLWx0ZV9zaWduYWxiYXIwX2hpZ2g9MAotbHRlX3NpZ25hbGJhcjFfbG93PTEKLWx0ZV9zaWduYWxiYXIxX2hpZ2g9MjUKLWx0ZV9zaWduYWxiYXIyX2xvdz0yNgotbHRlX3NpZ25hbGJhcjJfaGlnaD0zMgotbHRlX3NpZ25hbGJhcjNfbG93PTMzCi1sdGVfc2lnbmFsYmFyM19oaWdoPTM4Ci1sdGVfc2lnbmFsYmFyNF9sb3c9MzkKLWx0ZV9zaWduYWxiYXI0X2hpZ2g9NDQKLWx0ZV9zaWduYWxiYXI1X2xvdz00NQotbHRlX3NpZ25hbGJhcjVfaGlnaD05NwotbmVlZF9jb3BzX251bWJlcl9mb3JtYXQ9eWVzCi1uZWVkX2Rpc3BsYXlfc2VhcmNoaW5nX3N0YXR1cz15ZXMKLW5lZWRfcmVzdGFydF93aGVuX3NpbV9pbnNlcnQ9bm8KLW5lZWRfc3VwcG9ydF9wYj1ubwotbmVlZF9zdXBwb3J0X3Ntcz1ubwotbmV0d29ya19uZWVkX2dzbT15ZXMKLW5ldHdvcmtfbmVlZF90ZHM9eWVzCi1wcm9kdWN0X21vZGVsPU1GOTEwVwotcm9hbV9zZXR0aW5nX29wdGlvbj1vbgotdXNlX2xvY2tfbmV0PW5vCi1uZXR3b3JrX2NhdGVnb3J5X2Jhc2VkX29uPWFjdAotYWRtaW5fdXNlcj1hZG1pbgotYXBwS2V5TW9iaWxlPUExMDAwMDA4NTMKLUJyYW5kPURFTU8KLWhvc3ROYW1lPWRtLndvLmNvbS5jbgotSW50eXBlPURFTU8KLU1hbnVmPQotTW9kZWw9Ci1wb3J0TnVtPTYwMDEKLXJlZ2lzdGVyRG1UeXBlPTAKLXNlY3NUaW1lPTEKLXZlcnNpb25QcmV2aW91cz0KLXdhX3ZlcnNpb249Ci1PU1ZlcnNpb249MQotT1M9VE9TCi11cmxNb2JpbGU9Ci1ETlNfcHJveHk9Ci1kbnNtYXNxZmlsZT0vbW50L3VzZXJkYXRhL2xvZy9kbnNtYXNxLmxvZwotZG5zbWFzcWZpbGVTaXplPTEwMjQKLWxhbl9kb21haW5fRW5hYmxlZD0xCi1hdXRvX2Nvbm5lY3Rfd2hlbl9saW1pdGVkPW5vCi1pc190cmFmZmljX2FsaW5lX29uPW5vCi1pc190cmFmZmljX2FsaW5pbmc9bm8KLWlzX3RyYWZmaWNfbGltaXRfb249bm8KLWtlZXBfb25saW5lX3doZW5fbGltaXRlZD1ubwotdHJhZmZpY19zbXNfbnVtYmVyPTAKLXVwZGF0ZV90eXBlPW1pZmlfZm90YQotCi1mb3RhX2RldmljZV90eXBlPW1kbAotZm90YV9tb2RlbHM9WlRFNzUyMFYzCi1mb3RhX29lbT1aVEUKLWZvdGFfcGxhdGZvcm09WlgyOTc1MjAKLWZvdGFfZG1fdmVuZG9yPXJzCi1mb3RhX3Rva2VuX3JzPThtc2d6ZHh4ZnRydHlzMGlybnVpZmg3bwotZm90YV9wcm9kdWN0X2lkPTE1NTM3NDIwNDEKLWZvdGFfcHJvZHVjdF9zZWNyZXQ9MjNiM2ZhZjJkYWZiNDJkZmIzMzgyYzBkN2Q2NjMxNWIKLWZvdGFfYXBwX3ZlcnNpb249MgotZm90YV9uZXR3b3JrX3R5cGU9V0lGSQotZm90YV90b2tlbl96eD03Q0JFMDE2NDAwRjY1NjIxNzQwQTA0RTc0MkU2RkIxMgotZm90YV9kbF91cmxfeng9Ci1mb3RhX2Noa191cmxfeng9Ci1mb3RhX3JlZ191cmxfeng9Ci1mb3RhX3JlcG9ydF9kbHJfdXJsX3p4PQotZm90YV9yZXBvcnRfdXBncl91cmxfeng9Ci1mb3RhX3JlcG9ydF9zYWxlc191cmxfeng9Ci1mb3RhX3Rva2VuX2dzPTk3YTUzZWU5ZjQ1YWRmZTUzYzc2MmE3MmY4M2Y2ZjQzCi1mb3RhX2RsX3VybF9ncz0KLWZvdGFfY2hrX3VybF9ncz0KLWZvdGFfcmVnX3VybF9ncz0KLWZvdGFfcmVwb3J0X2Rscl91cmxfZ3M9Ci1mb3RhX3JlcG9ydF91cGdyX3VybF9ncz0KLWZvdGFfcmVwb3J0X3NhbGVzX3VybF9ncz0KLWZvdGFfdXBkYXRlX3NwYWNlX3RocmVzaG9sZD04MDAKLWZvdGFfYWJfdXBncmFkZV9zdGF0dXM9NgotZm90YV9hYl91cGdyYWRlX3RvdGFsX3NpemU9MAotZm90YV9hYl91cGdyYWRlX3VwZGF0ZWRfc2l6ZT0wCi1mb3RhX2FiX2FhX3N5bmNfc3RhdHVzPTIKLWZvdGFfYWJfbG9nX3BhdGg9L21udC91c2VyZGF0YS96dGVfZm90YV9hYi91cGlfYWIubG9nCi1mb3RhX2FhX2F1dG9fc3luYz0wCi1Mb2dpbj1hZG1pbgotUGFzc3dvcmQ9Ci1zbnRwX3NlcnZlcl9jb3VudD0zCi1NQVhfU3RhdGlvbl9udW09MzIKLU1BWF9TdGF0aW9uX251bV9iYWs9MAotTUFYX0FjY2Vzc19udW1fYmJhaz0wCi1NQVhfQ2hpcF9DYXBhYmlsaXR5PTMyCi13aWZpX2tleV9nZW5fdHlwZT1NQUMKLXdpZmlfa2V5X2xlbj04Ci13aWZpX2tleV9vbmx5X2RpZ2l0PXkKLXdpZmlfbHRlX2ludHI9MQotd2lmaV9zc2lkX2dlbl93aXRoX21hY19sYXN0Ynl0ZT02Ci13aWZpX2tleV9nZW5fd2l0aF9tYWNfbGFzdGJ5dGU9OAotd2lmaV9tYWNfbnVtPTIKLXdpZml3YW49d2xhbjAtdnhkCi13aWZpd2FuX21vZGU9ZGhjcAotaWRsZV90aW1lPSI2MDAiCi1wcm9kdWN0X3R5cGU9MQotZXJybm9maWxlPS91c3IvbmV0bG9nL2Vycm5vLmxvZwotZXJybm9maWxlU2l6ZT0xMDI0Ci1ob3RwbHVnZmlsZT0vdXNyL25ldGxvZy9ob3RwbHVnLmxvZwotaG90cGx1Z2ZpbGVTaXplPTEwMjQKLW15bmV0bGlua2ZpbGU9L3Vzci9uZXRsb2cvbXluZXRsaW5rLmxvZwotbXluZXRsaW5rZmlsZVNpemU9MTAyNAotdGVsbmV0ZF9lbmFibGU9bgotCi0jc3lzbG9nZM/gudjF5NbDCi1zeXNsb2dfZmlsZV9zaXplPTEKLXN5c2xvZ19maWxlX251bT01Ci1wcmludF9sZXZlbD0yCi1zeXNsb2dfbGV2ZWw9NAotCi1za2JfZGVidWc9Ci1zZWNsb2dfc3dpdGNoPQotIyMjIyMjIyMjIyMjIyMjI1NPRlRBUNeo08MgRU5EIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyMjIyNVU0K2y7/axeTWwyMjIyMjIyMKLQotIyMjIyMjIyMjI3VzYi9yajQ1tcjIyLDOsuXP4LnYwre+tiMjIyMjIyMjIyMjIyMjCi0jcmo0NbP1yrzXtMyswre+tgotcmo0NV9wbHVnc3RhdGVfcGF0aD0vc3lzL2tlcm5lbC9ldGhfZGVidWcvZXRoX3N0YXRlCi0jdXNizfi/2sP7wre+tgotdXNiX25hbWVfcGF0aD0vc3lzL2R3Y191c2IvdXNiY29uZmlnL25ldG5hbWUKLSN1c2K49834v9rXtMyswre+tgotdXNiX3BsdWdzdGF0ZV9wYXRoPS9zeXMvZHdjX3VzYi91c2Jjb25maWcvCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI82ouf1ncGlvvOyy4rLlsM6jrNPD09rX1Lavu6+198rUCi11c2JfZ3Bpb19kZXRlY3Q9MQotCi0jxeTWw8rHt/HT0LnixcwKLWNkcm9tX3N0YXRlPTAKLQotI2Nkcm9ttdq2/r3Xts7Dtr7Zo7owzqqyu9Do0qrDtr7Zo6wxzqrQ6NKqw7a+2cfS0OjSqrnS1Ni96dbKo6wyzqqyu9Do0qq50tTYvenWyiMKLW5lZWRfc3VwcG9ydF9jZHJvbV9zdGVwMj0wCi0jxeTWw1dpbmRvd3PPws34v6jA4NDNCi1zZWxlY3RfdHlwZT1zZWxlY3Rfcm5kaXMKLQotIyMjIwotI8Xk1sPR0LeixKPKvXVzYsnosbi2y7/a1+m6zwotdXNiX2RldmljZXNfZGVidWc9ZGlhZyxhZGIsc2VyaWFsLGFjbQotCi0KLSPF5NbD08O7p8Sjyr3Kx7fxyrnTw834v6gKLXVzYl92bmljX3VzZXI9b24KLQotI8Xk1sPTw7unxKPKvXVzYsnosbi2y7/a1+m6zwotdXNiX2RldmljZXNfdXNlcj1hZGIsYWNtCi0KLSPF5NbDyfqy+sSjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX2ZhY3Rvcnk9c2VyaWFsLGRpYWcKLQotI8Xk1sNBTVTEo8q9dXNiyeixuLbLv9rX6brPCi11c2JfZGV2aWNlc19hbXQ9c2VyaWFsLGRpYWcKLQotI8Xk1sPR0LeixKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV9kZWJ1Zz0xCi0KLSPF5NbD0dC3osSjyr1zZXJpYWy0rr/auPbK/QotdXNiX3NlcmlhbF9udW1fZGVidWc9MQotCi0jxeTWw9PDu6fEo8q9YWNttK6/2rj2yv0KLXVzYl9hY21fbnVtX3VzZXI9MQotCi0jxeTWw9PDu6fEo8q9c2VyaWFstK6/2rj2yv0KLXVzYl9zZXJpYWxfbnVtX3VzZXI9MAotCi0jxeTWw8n6svrEo8q9YWNttK6/2rj2yv0KLXVzYl9hY21fbnVtX2ZhY3Rvcnk9MAotCi0jxeTWw8n6svrEo8q9c2VyaWFstK6/2rj2yv0KLXVzYl9zZXJpYWxfbnVtX2ZhY3Rvcnk9MQotCi0jxeTWw0FNVMSjyr1hY220rr/auPbK/QotdXNiX2FjbV9udW1fYW10PTAKLQotI8Xk1sNBTVTEo8q9c2VyaWFstK6/2rj2yv0KLXVzYl9zZXJpYWxfbnVtX2FtdD0yCi0KLSN3YW5nemhlbgotI8Xk1sNkZWJ1Z8Sjyr1tYXNzX3N0b3JhZ2W1xGx1brXExKPKvQotdXNiX2x1bl90eXBlX2RlYnVnPU1NQwotCi0jxeTWw3VzZXLEo8q9bWFzc19zdG9yYWdltcRsdW61xMSjyr0KLXVzYl9sdW5fdHlwZV91c2VyPU1NQwotCi0jxeTWw2Nkcm9txKPKvW1hc3Nfc3RvcmFnZbXEbHVutcTEo8q9Ci11c2JfbHVuX3R5cGVfY2Ryb209TU1DCi0jIyMKLQotI8Xk1sPR0LeixKPKvc34v9rOqk5ESVPKscnosbi1xFBJRAotUElEX1RTUF9ORElTPTA1ODIKLSMjIwotCi0jxeTWw9HQt6LEo8q9zfi/2s6qUk5ESVPKscnosbi1xFBJRAotUElEX1RTUF9STkRJUz0wNTgyCi0KLSPF5NbD0dC3osSjyr3N+L/azqpFQ03Kscnosbi1xFBJRAotUElEX1RTUF9FQ009MDU4MgotCi0jxeTWw9HQt6LEo8q90uyzo8qxyeixuLXEUElECi1QSURfVEVTVD1mZjAwCi0KLSPF5NbD0dvNvMSjyr3Kscnosbi1xFBJRAotUElEX1lUPTA1ODAKLQotI8Xk1sPR0LeixKPKvbnixcxDRFJPTbXEUElECi1QSURfVFNQX0NEUk9NPTA1NDgKLQotIyMjIyMKLQotI8Xk1sPTw7unxKPKvcSjyr254sXMQ0RST021xFBJRAotUElEX1VTRVJfQ0RST009MTIyNQotCi0jIyMjIwotIyMjIyMjIwotI8Xk1sPTw7unxKPKvc34v9rOqlJORElTyrHJ6LG4tcRQSUQKLVBJRF9VU0VSX1JORElTPTA1ODUKLQotI8Xk1sPTw7unxKPKvc34v9rOqkVDTcqxyeixuLXEUElECi1QSURfVVNFUl9FQ009MDU4NQotCi0jxeTWw9PDu6fEo8q9zfi/2s6qTkRJU8qxyeixuLXEUElECi1QSURfVVNFUl9ORElTPTA1ODMKLQotI8Xk1sPTw7unxKPKvcO709DN+L/ayrHJ6LG4tcRQSUQKLVBJRF9VU0VSX05PVk5JQz0wNTg2Ci0jIyMjIyMKLQotI8Xk1sPLwLv6dHJhcMqxyeixuLXEUElECi1QSURfVFJBUD0wMTk3Ci0KLSPF5NbDyfqy+sSjyr3Kscnosbi1xFBJRAotUElEX0ZBQ1RPUlk9MDUzNAotCi0jxeTWw0FNVMSjyr3Kscnosbi1xFBJRAotUElEX0FNVD0wMjAxCi0KLSPF5NbDudi7+rPktefKscnosbi1xFBJRAotUElEX0ZBU1RQT1dFUk9GRj0yMDA0Ci0KLSPF5NbDyeixuLXEVklECi1WSURfVFNQPTE5RDIKLQotI8Xk1sPKx7fx08NjaGlwaWTX986qyeixuLXEaVNlcmlhbNfWt/u0rgotdXNiX3Nlcm51bV9jaGlwaWQ9MAotCi0jxeTWw8nosbi1xGlTZXJpYWzX1rf7tK4KLVNFUklBTF9UU1A9MTIzNDU2Nzg5MEFCQ0RFRgotCi0jxeTWw9HQt6LEo8q9yeixuLXEUmVsZWFzZUlECi1SRUxFQVNFSURfVFNQPTAxMDAKLQotI8Xk1sPTw7unxKPKvcnosbi1xFJlbGVhc2VJRAotUkVMRUFTRUlEX1VTRVI9MDEwMQotCi0jxeTWw8nosbi1xG1hbnVmYWN0dXJlctfWt/u0rgotTUFOVUZBQ1RVUkVSX1RTUD1ERU1PLEluY29ycG9yYXRlZAotCi0jxeTWw8nosbi1xHByb2R1Y3TX1rf7tK4KLVBST0RVQ1RfVFNQPURFTU8gTW9iaWxlIEJvYXJkYmFuZAotCi0jxeTWw8nosbi1xGNvbmZpZ9fWt/u0rgotQ09ORklHX1RTUD1ERU1PIENvbmZpZ3VyYXRpb24KLQotI2Nkcm9tIGx1brXEdmVuZG9y19a3+7SuCi1WRU5ET1JfTVNfQ0RST009REVNTwotCi0jY2Ryb20gbHVutcRwcm9kdWN019a3+7SuCi1QUk9EVUNUX01TX0NEUk9NPVVTQiBTQ1NJIENELVJPTQotCi0jY2Ryb20gbHVutcRyZWxlYXNl19a3+7SuCi1SRUxFQVNFX01TX0NEUk9NPTIuMzEKLQotI2Nkcm9tIGx1brXEaW5xdWlyedfWt/u0rgotSU5RVUlSWV9NU19DRFJPTT1ERU1PIFVTQiBTQ1NJIENELVJPTSAyLjMxCi0jbW1jIGx1brXEdmVuZG9y19a3+7SuCi1WRU5ET1JfTVNfTU1DPURFTU8KLQotI21tYyBsdW61xHByb2R1Y3TX1rf7tK4KLVBST0RVQ1RfTVNfTU1DPU1NQyBTdG9yYWdlCi0KLSNtbWMgbHVutcRyZWxlYXNl19a3+7SuCi1SRUxFQVNFX01TX01NQz0yLjMxCi0KLSNTRL3p1srCt762Ci11c2JfdGNhcmRfbHVuX3BhdGg9L2Rldi9tbWNibGswCi0KLSNtbWMgbHVutcRpbnF1aXJ519a3+7SuCi1JTlFVSVJZX01TX01NQz1ERU1PIE1NQyBTdG9yYWdlIDIuMzEKLQotI8Xk1sNFQ03N+L+ouPbK/QotRUNNX05VTT0xCi0KLSPF5NbDUk5ESVPN+L+o1+6089fpsPzK/QotUk5ESVNfUEtUX05VTT0xMAotCi0KLSMjI7KozNjCytfUysrTpr+qudgjIyMKLXNlbGZfYWRhcHRpb25fcG9ydD0KLSMjI8Sz0Km2y7/asrvQ6NKqz/LTptPDyc+xqLbLv9rXvLG4usPP+8+iIyMjCi1ub3RpZnlfZm9yYmlkZW5fcG9ydHM9Ci0KLSMjI2FkYsSsyM+50tTYusssMDphcDsxOmNhcCMjIwotYWRiX2NvcmVfaWQ9MQotIyMjIyMjVVNCtsu/2sXk1sNFTkQjIyMjIyMjCi0KLSMjIyMjI0NQsuBOVsXk1sPQxc+iIyMjIyMjIwotI8Tasr/I7bz+sOaxvrrFCi16dmVyc2lvbj1LMzE4VjEuMC4wQjAzCi0jzeKyv8jtvP6w5rG+usUKLXpjZ21yPURFTU9fVjEuMC4wQjAzCi0j07K8/rDmsb66xQotemh2ZXI9VjAuMQotI8Tasr+7+tDNCi16Y2dtbT1LMzE4Ci0jzeKyv7v60M0KLXpjZ213PUszMTgKLSOzp8nM0MXPogotemNnbWk9REVNTwotI1NTSUS6xQotenNzaWQ9MAotI1dpZmlLZXm1xNa1Ci16d2lmaWtleT0wCi0jy/jN+NfutPO94sv4tM7K/aOsy/jN+MSjv+nKudPDCi16dW5sb2NrdGltZXM9MAotI7Dmsb7Eo8q9wODQzaOs1f2zo7Dmsb4vudKy4LDmsb4KLXp2ZXJzaW9ubW9kZT0wCi0j1sfE3LbM0MW5psTcv6q52AotemlzbXM9MAotI0RNuabE3L+qudgsMDq52LHVo6wx0sa2r6OsMsGqzaijrDO159DFCi16ZG1yZWc9MAotI8GqzahETSDXorLhv6q7+rXItP3KsbzkLCAxfjYwINPQ0KejrLWlzru31tbTo6zG5Mv7yv3WtTogzt7Qp9a1Ci16ZG1yZWd0aW1lPTAKLQotI7mkvt96bG9nX2FnZW50tObIoQotemNhdF9tb2RlPUNQVVNCCi16bG9nX251bT0xMAotemxvZ19zaXplPTEwMAotemxvZ19wYXRoPS9tbnQvdXNlcmRhdGEvemNhdAotcnVsZV9maWxlPS9ldGNfcm8vbG9ncnVsZS9hdGlfc3RkLnJ1bGUKLQotI3JhbWR1bXC05rSixKPKvQotI25vLGF1dG8seWVzCi1yYW1kdW1wX2V4cG9ydD1ubwotI1VTQiBvciBDQVBFTU1DIG9yIENBUEZMQVNICi1yYW1kdW1wX21vZGU9VVNCCi1yYW1kdW1wX2VtbWNfZGV2aWNlPS9kZXYvbW1jYmxrMXAxCi1yYW1kdW1wX2ZsYXNoX2RldmljZT0vZGV2L210ZDE3Ci1yYW1kdW1wX3BhdGg9L21udC9vZW1kYXRhCi0KLSPV1c/gu/rNvMast9ax5sLKz9TKvr/Y1sYKLXpjYW1lcmFfaW50ZXJwcm9sYXRpb249MQotI9fUtq/L0c34t73Kvc34wue908jrtM7Q8gotYXV0b19hY3FvcmRlcj0xMgotIyMjIyMjQ1Cy4E5WxeTWw9DFz6JFTkQjIyMjIyMjCi0jZm9yIHZvbHRlCi1NVE5FVF9URVNUPTAKLU5TSU9UX1RFU1Q9MAotYW1ydz0xCi1jdm1vZF9pbXM9MwotRU1fQ0FMTF9TVVBQT1JUPTAKLUVNQ0FMTF9UT19OT1JNQUw9MAotSU1TX0FQTj0KLUlNU19DT05GVVJJPQotSU1TX0NDX1VSSV9UWVBFPTAKLUlNU19TTVNfVVJJX1RZUEU9MAotSU1TX1JFR19FWFBJUkVTPTYwMDAwMAotSU1TX1JFR19TVUJfRVhQSVJFUz02MDAwMDAKLU5FVF9JTVNfQ0FQPTAKLVVEUF9USFJFU0g9MTMwMAotSVBTRUNfRElTQUJMRT0wCi1QUkVDT05EVElPTl9OT1RfU1VQUE9SVD0wCi1XQUlUX1JQVF9USU1FPTEwMDAKLU9DVF9BTEdOX0FNUj0wCi1TTVNfT1ZFUl9JUD0xCi1JTVNfVVNFUl9BR0VOVD0KLUJTRl9QT1JUPTgwODAKLVhDQVBfUE9SVD04MAotVVRfQVBOPQotMzgwX1RIRU5fQ1NGQj0wCi1EVE1GX1JGQzQ3MzM9MAotRElBTE9HX0ZPUks9MAotREFUQV9DRU5UUklDPTAKLW5vdF9zdXBwX2htYWNfc2hhMV85Nj0wCi1ub3Rfc3VwcF9obWFjX21kNV85Nj0wCi1ub3Rfc3VwcF9kZXNfZWRlM19jYmM9MAotbm90X3N1cHBfYWVzX2NiYz0wCi1JTVNfUENTQ0ZfUE9SVD01MDYwCi1HX0lNU19DTUdGPTAKLUVDQUxMX01UVEVTVD0wCi1QT1dFUl9DT05UUk9MPTAKLU5PVF9LRUVQX1RDUF9DT05OPTEKLVQzMzk2X1NVUFBPUlQ9MAotVDMzOTZfQ0FVU0VfUkVBU09OPTgsMjcsMzIsMzMKLVQzMzk2X0RVUkFUSU9OPTcyMAotVDMzOTZfQ09VTlRTPTMKLUVDQUxMX1QyX1RJTUVSPTM2MDAKLU5HRUNBTExfRk9SVEVTVD0wCi1DVVNUT01FUl9GTEFHPTAKLSNmb3Igdm9sdGUgZW5kCi1ERUJVR19JTkZPX0RJU0FCTEU9MAotREVCVUdfSU5GT19GSUxFX1BBVEg9L21udC91c2VyZGF0YQotREVCVUdfSU5GT19GSUxFX05VTT0yCi1ERUJVR19JTkZPX0ZJTEVfVE9UQUxfU0laRT0xCi0jZGVidWcgaW5mbyBlbmQKZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGMvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kYy9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3VzZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4MzkyNjIuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kYy9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3VzZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0OTYgKzAsMCBAQAotYXBuX2F1dG9fY29uZmlnPUNNQ0MoJCljbW5ldCgkKW1hbnVhbCgkKSo5OSMoJClwYXAoJCkoJCkoJClJUCgkKWF1dG8oJCkoJClhdXRvKCQpKCQpCi1BUE5fY29uZmlnMD1EZWZhdWx0KCQpRGVmYXVsdCgkKW1hbnVhbCgkKSgkKSgkKSgkKSgkKUlQKCQpYXV0bygkKSgkKWF1dG8oJCkoJCkKLUFQTl9jb25maWcxPQotQVBOX2NvbmZpZzI9Ci1BUE5fY29uZmlnMz0KLUFQTl9jb25maWc0PQotQVBOX2NvbmZpZzU9Ci1BUE5fY29uZmlnNj0KLUFQTl9jb25maWc3PQotQVBOX2NvbmZpZzg9Ci1BUE5fY29uZmlnOT0KLWFwbl9pbmRleD0wCi1hcG5fbW9kZT1hdXRvCi1hdF9zbmFwX2ZsYWc9MwotYXRfd2lmaV9tYWM9MAotYXV0b19hcG5faW5kZXg9MAotY2lkX3Jlc2VydmVkPTEKLWNsZWFyX3BiX3doZW5fcmVzdG9yZT1ubwotY2xlYXJfc21zX3doZW5fcmVzdG9yZT1ubwotZGVmYXVsdF9hcG49M2duZXQKLWlwdjZfQVBOX2NvbmZpZzE9Ci1pcHY2X0FQTl9jb25maWcyPQotaXB2Nl9BUE5fY29uZmlnMz0KLWlwdjZfQVBOX2NvbmZpZzQ9Ci1pcHY2X0FQTl9jb25maWc1PQotaXB2Nl9BUE5fY29uZmlnNj0KLWlwdjZfQVBOX2NvbmZpZzc9Ci1pcHY2X0FQTl9jb25maWc4PQotaXB2Nl9BUE5fY29uZmlnOT0KLW1fcHJvZmlsZV9uYW1lPUludGVybnV4Ci1uZWVkX2luaXRfbW9kZW09bm8KLW5ldF9zZWxlY3Q9TkVUV09SS19hdXRvCi1wZHBfdHlwZT1JUAotcHBwX2Fwbj0KLW1heF9yZWNvbm5lY3RfdGltZT0zMDAwMDAwCi1wcHBkX2F1dGg9bm9hdXRoCi1wcHBfYXV0aF9tb2RlPW5vbmUKLXBwcF9wYXNzd2Q9Ci1wcHBfcGRwX3R5cGU9Ci1wcHBfdXNlcm5hbWU9Ci1pcHY2X3BwcF9hdXRoX21vZGU9bm9uZQotaXB2Nl9wcHBfcGFzc3dkPQotaXB2Nl9wcHBfdXNlcm5hbWU9Ci1wcmVfbW9kZT0KLXByZWZlcl9kbnNfbWFudWFsPTAuMC4wLjAKLXN0YW5kYnlfZG5zX21hbnVhbD0wLjAuMC4wCi13YW5fYXBuPWludGVybmV0Ci13YW5fZGlhbD0KLWN0YV90ZXN0PTAKLXNhZmVjYXJlX2VuYmFsZT0xCi1zYWZlY2FyZV9ob3N0bmFtZT1tb2IuM2djYXJlLmNuCi1zYWZlY2FyZV9yZWdpc3RlZF9pbWVpPQotc2FmZWNhcmVfcmVnaXN0ZWRfaWNjaWQ9Ci1zYWZlY2FyZV9jb250aW1lc3RhcnQxPQotc2FmZWNhcmVfY29udGltZXN0YXJ0Mj0KLXNhZmVjYXJlX2NvbnRpbWVzdGFydDM9Ci1zYWZlY2FyZV9jb250aW1lc3RvcDE9Ci1zYWZlY2FyZV9jb250aW1lc3RvcDI9Ci1zYWZlY2FyZV9jb250aW1lc3RvcDM9Ci1zYWZlY2FyZV9jb250aW1laW50ZXJ2YWw9Ci1zYWZlY2FyZV9tb2JzaXRlPWh0dHA6Ly9tb2IuM2djYXJlLmNuCi1zYWZlY2FyZV9jaGF0c2l0ZT0KLXNhZmVjYXJlX3BsYXRubz0KLXNhZmVjYXJlX21vYmlsZW51bWJlcj0KLXNhZmVjYXJlX3ZlcnNpb249Ci1ldGh3YW5fZG5zX21vZGU9YXV0bwotcHN3YW5fZG5zX21vZGU9YXV0bwotd2lmaXdhbl9kbnNfbW9kZT1hdXRvCi1ldGh3YW5faXB2Nl9kbnNfbW9kZT1hdXRvCi13aWZpd2FuX2lwdjZfZG5zX21vZGU9YXV0bwotcHN3YW5faXB2Nl9kbnNfbW9kZT1hdXRvCi1hZG1pbl9QYXNzd29yZD1QYXNzMTIzNAotcHN3X2NoYW5nZWQ9MQotYWxnX2Z0cF9lbmFibGU9MAotYWxnX3NpcF9lbmFibGU9MAotYmxjX3dhbl9hdXRvX21vZGU9QVVUT19QUFAKLWJsY193YW5fbW9kZT1BVVRPCi1icl9pcGNoYW5nZV9mbGFnPQotYnJfbm9kZT11c2JsYW4wK3p2bmV0MAotYnJfbm9kZV9jYXA9enZuZXQwCi1jbGF0X2Zha2Vfc3VibmV0PTE5Mi4wLjE2OC4wCi1jbGF0X2ZyYWdfY29sbGVjdF90aW1lb3V0PTMwMAotY2xhdF9sb2NhbF9tYXBwaW5nX3RpbWVvdXQ9MzAwCi1jbGF0X21hcHBpbmdfcmVjb3JkX3RpbWVvdXQ9MzAwMAotY2xhdF9xdWVyeV9zZXJ2ZXJfcG9ydD0xNDY0Ci1EZWZhdWx0RmlyZXdhbGxQb2xpY3k9MAotZGV2X2NvZXhpc3Q9MAotZGhjcERucz0xOTIuMTY4LjAuMQotZGhjcEVuYWJsZWQ9MQotZGhjcEVuZD0xOTIuMTY4LjAuMjAwCi1kaGNwTGVhc2VfaG91cj0yNAotZGhjcFN0YXJ0PTE5Mi4xNjguMC4xMDAKLWRoY3B2NnN0YXRlRW5hYmxlZD0wCi1kaGNwdjZzdGF0ZWxlc3NFbmFibGVkPTEKLWRoY3B2NnN0YXRlUGRFbmFibGVkPTAKLWRpYWxfbW9kZT1hdXRvX2RpYWwKLURNWkVuYWJsZT0wCi1ETVpJUEFkZHJlc3M9Ci1kbnNfZXh0ZXJuPQotaXB2Nl9kbnNfZXh0ZXJuPQotZXRoX2FjdF90eXBlPQotZXRoX3R5cGU9bGFuCi1ldGhsYW49Ci1ldGh3YW49Ci1ldGh3YW5fZGlhbG1vZGU9YXV0bwotZXRod2FuX21vZGU9YXV0bwotZXRod2FuX3ByaW9yaXR5PTMKLWZhc3RfdXNiPXVzYmxhbjAKLWZhc3RuYXRfbGV2ZWw9MgotZmFzdGJyX2xldmVsPTEKLUlQUG9ydEZpbHRlckVuYWJsZT0wCi1JUFBvcnRGaWx0ZXJSdWxlc18wPQotSVBQb3J0RmlsdGVyUnVsZXNfMT0KLUlQUG9ydEZpbHRlclJ1bGVzXzI9Ci1JUFBvcnRGaWx0ZXJSdWxlc18zPQotSVBQb3J0RmlsdGVyUnVsZXNfND0KLUlQUG9ydEZpbHRlclJ1bGVzXzU9Ci1JUFBvcnRGaWx0ZXJSdWxlc182PQotSVBQb3J0RmlsdGVyUnVsZXNfNz0KLUlQUG9ydEZpbHRlclJ1bGVzXzg9Ci1JUFBvcnRGaWx0ZXJSdWxlc185PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl8wPQotSVBQb3J0RmlsdGVyUnVsZXN2Nl8xPQotSVBQb3J0RmlsdGVyUnVsZXN2Nl8yPQotSVBQb3J0RmlsdGVyUnVsZXN2Nl8zPQotSVBQb3J0RmlsdGVyUnVsZXN2Nl80PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl81PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl82PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl83PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl84PQotSVBQb3J0RmlsdGVyUnVsZXN2Nl85PQotaXB2NF9mYWtlX3N1Ym5ldD0xOTIuMC4wLjAKLWlwdjZfZmFrZV9zdWJuZXQ9MjAxNjo6MQotbGFuX2lwYWRkcj0xOTIuMTY4LjAuMQotd2VidjZfZW5hYmxlPTEKLWxhbl9pcHY2YWRkcj1mZTgwOjoxCi1sYW5fbmFtZT1icjAKLWxhbl9uZXRtYXNrPTI1NS4yNTUuMjU1LjAKLUxhbkVuYWJsZT0xCi1kaGNwRG5zX2NhcD0xOTIuMTY4LjAuMgotbGFuX2lwdjZhZGRyX2NhcD1mZTgwOjoyCi1sYW5faXBhZGRyX2NhcD0xOTIuMTY4LjAuMgotbGFuX25hbWVfY2FwPWJyMAotbGFuX25ldG1hc2tfY2FwPTI1NS4yNTUuMjU1LjAKLUxhbkVuYWJsZV9jYXA9MQotbWFjX2lwX2xpc3Q9Ci1tZ210X3F1aWNrZW5fcG93ZXJfb249MAotbXR1PTE0MDAKLW5hdGVuYWJsZT0KLWRvc2VuYWJsZT0wCi1uZWVkX2ppbGlhbj0xCi1ub2Zhc3RfcG9ydD0yMSsyMisyMysyNSs1Mys2Nys2OCs2OSsxMTArMTE1KzEyMys0NDMrNTAwKzEzNTIrMTcyMysxOTkwKzE5OTErMTk5MisxOTkzKzE5OTQrMTk5NSsxOTk2KzE5OTcrMTk5OCs0NTAwKzUwNjAKLW52X3NhdmVfaW50ZXJ2YWw9MzAwCi1wYXRoX2NvbmY9L2V0Y19ydwotcGF0aF9ybz0vZXRjX3JvCi1wYXRoX2xvZz0vdG1wLwotbmV0bG9nX2xpbWl0PXllcwotcGF0aF9zaD0vc2JpbgotcGF0aF90bXA9L3RtcAotcGVybWl0X2d3PQotcGVybWl0X2lwNj0KLXBlcm1pdF9ubT0yNTUuMjU1LjI1NS4wCi1Qb3J0Rm9yd2FyZEVuYWJsZT0wCi1Qb3J0Rm9yd2FyZFJ1bGVzXzA9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzE9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzI9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzM9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzQ9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzU9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzY9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzc9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzg9Ci1Qb3J0Rm9yd2FyZFJ1bGVzXzk9Ci1Qb3J0TWFwRW5hYmxlPTAKLVBvcnRNYXBSdWxlc18wPQotUG9ydE1hcFJ1bGVzXzE9Ci1Qb3J0TWFwUnVsZXNfMj0KLVBvcnRNYXBSdWxlc18zPQotUG9ydE1hcFJ1bGVzXzQ9Ci1Qb3J0TWFwUnVsZXNfNT0KLVBvcnRNYXBSdWxlc182PQotUG9ydE1hcFJ1bGVzXzc9Ci1Qb3J0TWFwUnVsZXNfOD0KLVBvcnRNYXBSdWxlc185PQotcHBwX25hbWU9cHBwMAotcHBwb2VfcGFzc3dvcmQ9Ci1wcHBvZV91c2VybmFtZT0KLXBzX2V4dDE9enZuZXQxCi1wc19leHQyPXp2bmV0MgotcHNfZXh0Mz16dm5ldDMKLXBzX2V4dDQ9enZuZXQ0Ci1wc19leHQ1PXp2bmV0NQotcHNfZXh0Nj16dm5ldDYKLXBzX2V4dDc9enZuZXQ3Ci1wc19leHQ4PXp2bmV0OAotcHN3YW49d2FuCi1wc3dhbl9tb2RlPXBkcAotcHN3YW5fcHJpb3JpdHk9MQotcHN3YW5fY2FwPXp2bmV0Ci1SZW1vdGVNYW5hZ2VtZW50PTAKLXJvb3RkZXZfZnJpZW5kbHluYW1lPURFTU8tVVBuUAotcm9vdGRldl9tYW51ZmFjdHVyZXI9REVNTwotcm9vdGRldl9tb2RlbGRlcz1YWFgKLXJvb3RkZXZfbW9kZWxuYW1lPVhYWAotb3NfdXJsPWh0dHA6Ly93d3cuZGVtby5jb20KLXNlcmlhbG51bWJlcj1TZWUtSU1FSQotc3RhdGljX2RoY3BfZW5hYmxlPTEKLXN0YXRpY19ldGh3YW5fZ3c9Ci1zdGF0aWNfZXRod2FuX2lwPQotc3RhdGljX2V0aHdhbl9ubT0KLXN0YXRpY19ldGh3YW5fcHJpZG5zPQotc3RhdGljX2V0aHdhbl9zZWNkbnM9Ci1zdGF0aWNfd2lmaXdhbl9pcGFkZHI9Ci1zdGF0aWNfd2lmaXdhbl9uZXRtYXNrPQotc3RhdGljX3dpZml3YW5fZ2F0ZXdheT0KLXdpZml3YW5fcHJpZG5zX21hbnVhbD0KLXdpZml3YW5fc2VjZG5zX21hbnVhbD0KLXN0YXRpY193YW5fZ2F0ZXdheT0wLjAuMC4wCi1zdGF0aWNfd2FuX2lwYWRkcj0wLjAuMC4wCi1zdGF0aWNfd2FuX25ldG1hc2s9MC4wLjAuMAotc3RhdGljX3dhbl9wcmltYXJ5X2Rucz0wLjAuMC4wCi1zdGF0aWNfd2FuX3NlY29uZGFyeV9kbnM9MC4wLjAuMAotc3dsYW5zdHI9c3cwX2xhbgotc3d2bGFuPXN3MAotc3d3YW5zdHI9c3cwX3dhbgotdGNfZG93bmxpbms9Ci10Y191cGxpbms9Ci10Y19sb2NhbD0xMzEwNzIwCi10Y19lbmFibGU9MAotdGltZV9saW1pdGVkPQotdGltZV90b18yMDAwX3doZW5fcmVzdG9yZT15ZXMKLXVwbnBFbmFibGVkPTAKLXVzYmxhbj11c2JsYW4wCi1XQU5QaW5nRmlsdGVyPTAKLXdlYnNVUkxGaWx0ZXJzPQotd2lmaXdhbl9wcmlvcml0eT0yCi1ERE5TPQotREROU19FbmFibGU9MAotREROU0FjY291bnQ9Ci1ERE5TUGFzc3dvcmQ9Ci1ERE5TUHJvdmlkZXI9Ci1pY2NpZFByZXZpb3VzPQotaW1laVByZXZpb3VzPQotcmVnaXN0ZXJGbGFnPTAKLXJlZ2lzdGVyZWRSb3VuZD0KLXNlY3NFdmVyeVJvdW5kPTEKLXNlY3NFdmVyeVRpbWU9MQotcmVndmVyPTQuMAotbWVpZD0KLXVldHlwZT0xCi1Mb2NhbERvbWFpbj1tLmhvbWUKLWRhdGFfdm9sdW1lX2FsZXJ0X3BlcmNlbnQ9Ci1kYXRhX3ZvbHVtZV9saW1pdF9zaXplPQotZGF0YV92b2x1bWVfbGltaXRfc3dpdGNoPTAKLWRhdGFfdm9sdW1lX2xpbWl0X3VuaXQ9MAotZmx1eF9kYXlfdG90YWw9MAotZmx1eF9sYXN0X2RheT0KLWZsdXhfbGFzdF9tb250aD0KLWZsdXhfbGFzdF95ZWFyPQotZmx1eF9tb250aF90b3RhbD0wCi1mbHV4X3NldF9kYXk9Ci1mbHV4X3NldF9tb250aD0KLWZsdXhfc2V0X3llYXI9Ci1tb250aGx5X3J4X2J5dGVzPTAKLW1vbnRobHlfdGltZT0wCi1tb250aGx5X3R4X2J5dGVzPTAKLU1vbnRobHlDb25UaW1lX0xhc3Q9Ci1kbV9uZXh0cG9sbGluZ3RpbWU9Ci1mb3RhX2FsbG93Um9hbWluZ1VwZGF0ZT0wCi1mb3RhX2RsX3BrZ19zaXplPTAKLWZvdGFfdXBkYXRlX2ZsYWc9Ci1mb3RhX3VwZGF0ZUludGVydmFsRGF5PTE1Ci1mb3RhX3VwZ3JhZGVfcmVzdWx0PQotZm90YV92ZXJzaW9uX2RlbHRhX2lkPQotZm90YV92ZXJzaW9uX2RlbHRhX3VybD0KLWZvdGFfcGtnX3RvdGFsX3NpemU9MAotZm90YV92ZXJzaW9uX2ZpbGVfc2l6ZT0KLWZvdGFfdmVyc2lvbl9tZDVzdW09Ci1mb3RhX3ZlcnNpb25fbmFtZT0KLWZvdGFfbmVlZF91c2VyX2NvbmZpcm1fdXBkYXRlPTAKLWZvdGFfbmVlZF91c2VyX2NvbmZpcm1fZG93bmxvYWQ9MAotZm90YV92ZXJzaW9uX2ZvcmNlX2luc3RhbGw9MAotcG9sbGluZ19uZXh0dGltZT0wCi1wd3Jvbl9hdXRvX2NoZWNrPTAKLWZvdGFfdXBkYXRlTW9kZT0wCi1mb3RhX3Rlc3RfbW9kZT0wCi1mb3RhX3BrZ19kb3dubG9hZGVkPTAKLWZvdGFfdXBncmFkZV9yZXN1bHRfaW50ZXJuYWw9Ci1tbWlfYmF0dGVyeV92b2x0YWdlX2xpbmU9MzA5MCszMzAwKzM0NTArMzQ5MCszNTEwKzM1NDArMzU1MCszNTcwKzM1ODArMzYwMCszNjIwKzM2NTArMzY3MCszNzEwKzM3NDArMzc4MCszODUwKzM5MDArMzk1MCs0MDAwKzQwNjAKLW1taV9mYXN0X3Bvd2Vyb249Ci1tbWlfbGVkX21vZGU9c2xlZXBfbW9kZQotbW1pX25ld19zbXNfYmxpbmtfZmxhZz0xCi1tbWlfc2hvd19wYWdldGFiPXBhZ2UxK3BhZ2UyK3BhZ2UzCi1tbWlfc2hvd21vZGU9bGVkCi1tbWlfdGFza190YWI9Y3RybF90YXNrK2tleV90YXNrCi1tbWlfdGVtcF92b2x0YWdlX2xpbmU9OTUxKzEyMDErMTY5MisxNzM2Ci1tbWlfdXNlX3Byb3RlY3Q9Ci1tbWlfdXNlX3dpZmlfdXNlcm51bT0xCi1sZWFrX2Z1bGxfcGFuaWM9Ci1sZWFrX2xpc3RfbWF4PQotbGVha19zZXRfZmxhZz0KLW1vbml0b3JfcGVyaW9kPTMwMAotbmV0aW5mX2ZsYWc9Ci1za2JfYWxsX21heD0KLXNrYl9kYXRhX21heD0KLXNrYl9mcm9tY3BfbWF4PQotc2tiX21heF9mYWlsPQotc2tiX21heF9wYW5pYz0KLXNrYl9zaXplX21heD0KLXNrYl90b2NwX21heD0KLXNudHBfZGVmYXVsdF9pcD0xMzQuMTcwLjE4NS4yMTE7MTMxLjEwNy4xMy4xMDA7MjAyLjExMi4zMS4xOTc7MjAyLjExMi4yOS44MjsyMDIuMTEyLjEwLjM2O250cC5nd2FkYXIuY247bnRwLXN6LmNobC5sYTtkbnMuc2p0dS5lZHUuY247bmV3cy5uZXUuZWR1LmNuO2RuczEuc3luZXQuZWR1LmNuO3RpbWUtbncubmlzdC5nb3Y7cG9vbC5udHAub3JnO2V1cm9wZS5wb29sLm50cC5vcmcKLXNudHBfZHN0X2VuYWJsZT0wCi1zbnRwX290aGVyX3NlcnZlcjA9Ci1zbnRwX290aGVyX3NlcnZlcjE9Ci1zbnRwX290aGVyX3NlcnZlcjI9Ci1zbnRwX3NlcnZlcjA9dGltZS1udy5uaXN0Lmdvdgotc250cF9zZXJ2ZXIxPXBvb2wubnRwLm9yZwotc250cF9zZXJ2ZXIyPWV1cm9wZS5wb29sLm50cC5vcmcKLXNudHBfc3luY19zZWxlY3RfaW50ZXJ2YWxfdGltZT0zMAotc250cF90aW1lX3NldF9tb2RlPWF1dG8KLXNudHBfdGltZXpvbmU9Q1NULTgKLXNudHBfdGltZXpvbmVfaW5kZXg9MAotYXNzZXJ0X2Vycm5vPQotY29tbV9sb2dzaXplPTE2Mzg0Ci1jcl9pbm5lcl92ZXJzaW9uPVYxLjAuMEIwOAotY3JfdmVyc2lvbj1WMS4wLjBCMDEKLWh3X3ZlcnNpb249UENCTUYyOVMyVjEuMC4wCi1UVVJOT0ZGX0NIUl9OVU09Ci13YXRjaGRvZ19hcHA9MAotSFRUUF9TSEFSRV9GSUxFPQotSFRUUF9TSEFSRV9TVEFUVVM9Ci1IVFRQX1NIQVJFX1dSX0FVVEg9cmVhZFdyaXRlCi1pcHY2X3BkcF90eXBlPQotaXB2Nl93YW5fYXBuPQotTGFuZ3VhZ2U9emgtY24KLW1hbnVhbF90aW1lX2RheT0KLW1hbnVhbF90aW1lX2hvdXI9Ci1tYW51YWxfdGltZV9taW51dGU9Ci1tYW51YWxfdGltZV9tb250aD0KLW1hbnVhbF90aW1lX3NlY29uZD0KLW1hbnVhbF90aW1lX3llYXI9Ci1zZGNhcmRfbW9kZV9vcHRpb249MAotQWNjZXNzQ29udHJvbExpc3QwPQotQWNjZXNzUG9saWN5MD0wCi1BQ0xfbW9kZT0wCi1BdXRoTW9kZT1XUEEyUFNLCi1DaGFubmVsPTAKLXdpZmlfYWNzX251bT01Ci1jbG9zZUVuYWJsZT0wCi1jbG9zZVRpbWU9Ci1Db3VudHJ5Q29kZT1DTgotRGVmYXVsdEtleUlEPTAKLUR0aW1QZXJpb2Q9MQotRW5jcnlwVHlwZT1BRVMKLUVYX0FQTElTVD0KLUVYX0FQTElTVDE9Ci1FWF9BdXRoTW9kZT0KLUVYX0RlZmF1bHRLZXlJRD0KLUVYX0VuY3J5cFR5cGU9Ci1FWF9tYWM9Ci1FWF9TU0lEMT1VZmlfCi1FWF9XRVBLRVk9Ci1FWF93aWZpX3Byb2ZpbGU9Ci1FWF9XUEFQU0sxPQotRnJhZ1RocmVzaG9sZD0yMzQ2Ci1IaWRlU1NJRD0wCi1IVF9HST0xCi1LZXkxU3RyMT0xMjM0NQotS2V5MlN0cjE9Ci1LZXkzU3RyMT0KLUtleTRTdHIxPQotS2V5MVR5cGU9MQotS2V5MlR5cGU9Ci1LZXkzVHlwZT0KLUtleTRUeXBlPQotbV9BdXRoTW9kZT1XUEEyUFNLCi1tX0RlZmF1bHRLZXlJRD0KLW1fRW5jcnlwVHlwZT1BRVMKLW1fSGlkZVNTSUQ9MAotbV9LZXkxU3RyMT0xMjM0Ci1tX0tleTJTdHIxPQotbV9LZXkzU3RyMT0KLW1fS2V5NFN0cjE9Ci1tX0tleTFUeXBlPTEKLW1fS2V5MlR5cGU9Ci1tX0tleTNUeXBlPQotbV9LZXk0VHlwZT0KLW1fTUFYX0FjY2Vzc19udW09MAotbV9Ob0ZvcndhcmRpbmc9Ci1tX3Nob3dfcXJjb2RlX2ZsYWc9MAotbV9TU0lEPVVmaV8KLW1fc3NpZF9lbmFibGU9MAotbV93YXBpVHlwZT0KLW1fd2lmaV9tYWM9OTAxRDQ1NjkyQTVDCi1tX1dQQVBTSzFfYWVzPQotbV9XUEFQU0sxX2VuY29kZT1NVEl6TkRVMk56Zz0KLU1BWF9BY2Nlc3NfbnVtPTMyCi1NQVhfQWNjZXNzX251bV9iYWs9MzIKLU5vRm9yd2FyZGluZz0wCi1vcGVuRW5hYmxlPTAKLW9wZW5UaW1lPQotb3BlcmF0ZXJfYXA9Ci1SZWtleUludGVydmFsPTM2MDAKLVJUU1RocmVzaG9sZD0yMzQ3Ci1zaG93X3FyY29kZV9mbGFnPTAKLVNsZWVwX2ludGVydmFsPTEwCi1zc2lkX3dyaXRlX2ZsYWc9MAotU1NJRDE9VWZpXwotdHN3X3NsZWVwX3RpbWVfaG91cj0KLXRzd19zbGVlcF90aW1lX21pbj0KLXRzd193YWtlX3RpbWVfaG91cj0KLXRzd193YWtlX3RpbWVfbWluPQotd2FwaVR5cGU9Ci13aWZpX2ZvcmNlXzQwbT0xCi13aWZpXzExbl9jYXA9MQotd2lmaV9iYW5kPWIKLXdpZmlfY292ZXJhZ2U9bG9uZ19tb2RlCi13aWZpX2hvc3RuYW1lX2JsYWNrX2xpc3Q9Ci13aWZpX2hvc3RuYW1lX3doaXRlX2xpc3Q9Ci13aWZpX21hYz05MDFENDU2OTJBNUIKLXdpZmlfbWFjX2JsYWNrX2xpc3Q9Ci13aWZpX21hY193aGl0ZV9saXN0PQotd2lmaV9wcm9maWxlPQotd2lmaV9wcm9maWxlMT0KLXdpZmlfcHJvZmlsZTI9Ci13aWZpX3Byb2ZpbGUzPQotd2lmaV9wcm9maWxlND0KLXdpZmlfcHJvZmlsZTU9Ci13aWZpX3Byb2ZpbGU2PQotd2lmaV9wcm9maWxlNz0KLXdpZmlfcHJvZmlsZTg9Ci13aWZpX3Byb2ZpbGU5PQotd2lmaV9wcm9maWxlX251bT0wCi13aWZpX3Jvb3RfZGlyPQotd2lmaV9zdGFfY29ubmVjdGlvbj0wCi13aWZpX3dwc19pbmRleD0xCi13aWZpRW5hYmxlZD0xCi13aWZpbGFuPXdsYW4wLXZhMAotd2lmaWxhbjI9d2xhbjAtdmExCi1XaXJlbGVzc01vZGU9NgotV1BBUFNLMV9hZXM9Ci1XUEFQU0sxX2VuY29kZT1NVEl6TkRVMk56Zz0KLXdwc19tb2RlPQotV1BTX1NTSUQ9Ci1Xc2NNb2RlT3B0aW9uPTAKLW1vbml0b3JfYXBwcz0KLWF0X25ldGRvZz0KLWF1dG9yc3BjaGFubmVsX2xpc3Q9YWxsCi1zb2N0aW1lX3N3aXRjaD0wCi11YXJ0X2NvbnRyb2w9MQotdWFydF9jdHN0cnNfZW5hYmxlPQotdWFydF9zb2Z0Y29udHJvbF9lbmFibGU9Ci11YXJ0X3dha2V1cF9lbmFibGU9MQotdWFydF9jb25zb2xlX2NvcmVpZD0xCi11YXJ0X2FwcF9jdHJsPTUKLXNwZWNpYWxfY21kX2xpc3Q9JE1ZTkVUUkVBRAotcmFfbXR1X2VuYWJsZT0KLSMj5Li65YWl572R5YWl5bqT6Iqv54mH6K6k6K+B54mI5pys5re75YqgIGJlZ2luCi1hdGNtZF9zdHJlYW0xPUFUK1pTRVQ9IndfaW5zdHJ1bWVudCIsMQotYXRjbWRfc3RyZWFtMj1BVF5TWVNDT05GSUc9MjQsMCwxLDIKLWF0Y21kX3N0cmVhbTM9QVQrWlNFVD0iY3NpaW90IiwyCi1hdGNtZF9zdHJlYW00PUFUK1pTRVQ9ImRscGFyYWZsZyIsMAotYXRjbWRfc3RyZWFtNT1BVCtaU0VUPSJNVE5FVF9URVNUIiwxO0FUK1pHQUFUPTA7QVQrWlNFVD0iQ01DQ19URVNUIiwxO0FUK1pTRVQ9IkxURV9JTkZPIiw2MzQ4O0FUK1pTRVQ9IlZPSUNFX1NVUFBPUlQiLDE7QVQrWlNFVD0iRkREX1JFTEVBU0UiLDc7QVQrWlNFVD0iTFRFX1JFTEVBU0UiLDE7QVQrWlNFVD0iVUVfUFNfUkVMRUFTRSIsNTtBVCtaU0VUPSJRT1NfUkVMRUFTRSIsNDtBVCtaU0VUPSJURUJTX1RIUkVTSE9MRCIsMAotYXRjbWRfc3RyZWFtNj1BVCtaU0VUPSJNVE5FVF9URVNUIiwxO0FUK1pHQUFUPTA7QVQrWlNFVD0iTFRFX0lORk8iLDYzNDg7QVQrWlNFVD0iVk9JQ0VfU1VQUE9SVCIsMTtBVCtaU0VUPSJGRERfUkVMRUFTRSIsNztBVCtaU0VUPSJMVEVfUkVMRUFTRSIsMTtBVCtaU0VUPSJVRV9QU19SRUxFQVNFIiw1O0FUK1pTRVQ9IlFPU19SRUxFQVNFIiw0O0FUK1pTRVQ9IlRFQlNfVEhSRVNIT0xEIiwwO0FUK1pTRVQ9IklHTk9SRV9TRUNVUklUWV9TVVBQT1JUIiwwO0FUK1pTRVQ9ImNzaWZpbHRlciIsMDtBVCtaU0VUPSJjc3Job2JhbmRmbGciLDA7QVQrWlNFVD0iZGxwYXJhZmxnIiwxO0FUK1pTRVQ9ImNzaXVwIiwxO0FUK1pTRVQ9InJmcGFyYWZsYWciLDAsMCwxLDA7QVQrWlNFVD0iY3NpaW90IiwxO0FUK1pTRVQ9IkVYQ0VQVF9SRVNFVCIsMDtBVCtaU0VUPSJJU0lNX1NVUFBPUlQiLDE7QVQrWklNU1RFU1Q9Ik1UTkVUX1RFU1QiLDE7QVQrWlNFVD0iTUFOVUFMX1NFQVJDSCIsMAotIyPkuLrlhaXnvZHlhaXlupPoiq/niYforqTor4HniYjmnKzmt7vliqAgZW5kCi0jZm9yIGF1ZGlvIGN0cmwgCi1hdWRpb19wcmlvcml0eT0wMTIzCi1jdXN0b21lcl90eXBlPQotZGVidWdfbW9kZT0KLWNwSW5kQ21kTGlzdD0rWk1NSStaVVJEWStaVVNMT1QrWklDQ0lEXk1PREUrWlBCSUMrWk1TUkkrQ1JFRytDRVJFRytDR1JFRytDR0VWCi16ZXBoeXJfZmlsdGVyX2lwPQotd2FpdF90aW1lb3V0PTIKLXNudHBfc3luY190aW1lPTEKLXNudHBfc3RhdGljX3NlcnZlcjA9dGltZS1udy5uaXN0Lmdvdgotc250cF9zdGF0aWNfc2VydmVyMT1wb29sLm50cC5vcmcKLXNudHBfc3RhdGljX3NlcnZlcjI9ZXVyb3BlLnBvb2wubnRwLm9yZwotdnNpbV9iaW5fcGF0aD0vbW50L3VzZXJkYXRhL3ZTaW0uYmluCi1hdF9zZWxlY3RfdGltZW91dD0KLW10bmV0X3Rlc3RfbWNjPSswMDErMDAyKzAwMyswMDQKLWF0X2F0dj0KLWF0X2F0cT0KLWF0X2F0X2Q9Ci1hdF9wdHNudW09Ci1xdWlja19kaWFsPTEKLWNhcF9wb3J0X25hbWU9L2Rldi90dHlHUzAKLWN1c3RvbUluZENtZExpc3Q9Ci1kZWZydF9jaWQ9MQotTWF4UnRyQWR2SW50ZXJ2YWw9MTgwMAotZGhjcHNfaW5fY2FwPTEKLWd3X2luX2NhcD0wCi0jeWVzLW9uICBuby1vZmYKLWNjX2F0X2RlYnVnPW5vCi14bGF0X2VuYWJsZT0wCi1lY2FsbG1vZGU9MgotdGVsb2dfcGF0aF9jYXA9Ci10ZWxvZ19wYXRoPQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY180R2IvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl9zeXMgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjXzRHYi9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTdjMWFkNy4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjXzRHYi9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0KLSMjIyMjI1NPRlRBUNeo08MgU1RBUlQjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2hlY2tfcm9hbT15ZXMKLWdzbV9zaWduYWxiYXIwX2xvdz0wCi1nc21fc2lnbmFsYmFyMF9oaWdoPTAKLWdzbV9zaWduYWxiYXIxX2xvdz0xCi1nc21fc2lnbmFsYmFyMV9oaWdoPTIKLWdzbV9zaWduYWxiYXIyX2xvdz0zCi1nc21fc2lnbmFsYmFyMl9oaWdoPTYKLWdzbV9zaWduYWxiYXIzX2xvdz03Ci1nc21fc2lnbmFsYmFyM19oaWdoPTkKLWdzbV9zaWduYWxiYXI0X2xvdz0xMAotZ3NtX3NpZ25hbGJhcjRfaGlnaD0xMgotZ3NtX3NpZ25hbGJhcjVfbG93PTEzCi1nc21fc2lnbmFsYmFyNV9oaWdoPTMxCi13Y2RtYV9zaWduYWxiYXIwX2xvdz0wCi13Y2RtYV9zaWduYWxiYXIwX2hpZ2g9MAotd2NkbWFfc2lnbmFsYmFyMV9sb3c9MQotd2NkbWFfc2lnbmFsYmFyMV9oaWdoPTgKLXdjZG1hX3NpZ25hbGJhcjJfbG93PTkKLXdjZG1hX3NpZ25hbGJhcjJfaGlnaD0xNgotd2NkbWFfc2lnbmFsYmFyM19sb3c9MTcKLXdjZG1hX3NpZ25hbGJhcjNfaGlnaD0yMgotd2NkbWFfc2lnbmFsYmFyNF9sb3c9MjMKLXdjZG1hX3NpZ25hbGJhcjRfaGlnaD0yOAotd2NkbWFfc2lnbmFsYmFyNV9sb3c9MjkKLXdjZG1hX3NpZ25hbGJhcjVfaGlnaD05MQotdGRzX3NpZ25hbGJhcjBfbG93PTAKLXRkc19zaWduYWxiYXIwX2hpZ2g9MAotdGRzX3NpZ25hbGJhcjFfbG93PTEKLXRkc19zaWduYWxiYXIxX2hpZ2g9OAotdGRzX3NpZ25hbGJhcjJfbG93PTkKLXRkc19zaWduYWxiYXIyX2hpZ2g9MTYKLXRkc19zaWduYWxiYXIzX2xvdz0xNwotdGRzX3NpZ25hbGJhcjNfaGlnaD0yMgotdGRzX3NpZ25hbGJhcjRfbG93PTIzCi10ZHNfc2lnbmFsYmFyNF9oaWdoPTI4Ci10ZHNfc2lnbmFsYmFyNV9sb3c9MjkKLXRkc19zaWduYWxiYXI1X2hpZ2g9OTEKLWx0ZV9zaWduYWxiYXIwX2xvdz0wCi1sdGVfc2lnbmFsYmFyMF9oaWdoPTAKLWx0ZV9zaWduYWxiYXIxX2xvdz0xCi1sdGVfc2lnbmFsYmFyMV9oaWdoPTI1Ci1sdGVfc2lnbmFsYmFyMl9sb3c9MjYKLWx0ZV9zaWduYWxiYXIyX2hpZ2g9MzIKLWx0ZV9zaWduYWxiYXIzX2xvdz0zMwotbHRlX3NpZ25hbGJhcjNfaGlnaD0zOAotbHRlX3NpZ25hbGJhcjRfbG93PTM5Ci1sdGVfc2lnbmFsYmFyNF9oaWdoPTQ0Ci1sdGVfc2lnbmFsYmFyNV9sb3c9NDUKLWx0ZV9zaWduYWxiYXI1X2hpZ2g9OTcKLW5lZWRfY29wc19udW1iZXJfZm9ybWF0PXllcwotbmVlZF9kaXNwbGF5X3NlYXJjaGluZ19zdGF0dXM9eWVzCi1uZWVkX3Jlc3RhcnRfd2hlbl9zaW1faW5zZXJ0PW5vCi1uZWVkX3N1cHBvcnRfcGI9bm8KLW5lZWRfc3VwcG9ydF9zbXM9bm8KLW5ldHdvcmtfbmVlZF9nc209eWVzCi1uZXR3b3JrX25lZWRfdGRzPXllcwotcHJvZHVjdF9tb2RlbD1NRjkxMFcKLXJvYW1fc2V0dGluZ19vcHRpb249b24KLXVzZV9sb2NrX25ldD1ubwotbmV0d29ya19jYXRlZ29yeV9iYXNlZF9vbj1hY3QKLWFkbWluX3VzZXI9YWRtaW4KLWFwcEtleU1vYmlsZT1BMTAwMDAwODUzCi1CcmFuZD1ERU1PCi1ob3N0TmFtZT1kbS53by5jb20uY24KLUludHlwZT1ERU1PCi1NYW51Zj0KLU1vZGVsPQotcG9ydE51bT02MDAxCi1yZWdpc3RlckRtVHlwZT0wCi1zZWNzVGltZT0xCi12ZXJzaW9uUHJldmlvdXM9Ci13YV92ZXJzaW9uPQotT1NWZXJzaW9uPTEKLU9TPVRPUwotdXJsTW9iaWxlPQotRE5TX3Byb3h5PQotZG5zbWFzcWZpbGU9L21udC91c2VyZGF0YS9sb2cvZG5zbWFzcS5sb2cKLWRuc21hc3FmaWxlU2l6ZT0xMDI0Ci1sYW5fZG9tYWluX0VuYWJsZWQ9MQotYXV0b19jb25uZWN0X3doZW5fbGltaXRlZD1ubwotaXNfdHJhZmZpY19hbGluZV9vbj1ubwotaXNfdHJhZmZpY19hbGluaW5nPW5vCi1pc190cmFmZmljX2xpbWl0X29uPW5vCi1rZWVwX29ubGluZV93aGVuX2xpbWl0ZWQ9bm8KLXRyYWZmaWNfc21zX251bWJlcj0wCi11cGRhdGVfdHlwZT1taWZpX2ZvdGEKLQotZm90YV9kZXZpY2VfdHlwZT1tZGwKLWZvdGFfbW9kZWxzPVpURTc1MjBWMwotZm90YV9vZW09WlRFCi1mb3RhX3BsYXRmb3JtPVpYMjk3NTIwCi1mb3RhX2RtX3ZlbmRvcj1ycwotZm90YV90b2tlbl9ycz04bXNnemR4eGZ0cnR5czBpcm51aWZoN28KLWZvdGFfcHJvZHVjdF9pZD0xNTUzNzQyMDQxCi1mb3RhX3Byb2R1Y3Rfc2VjcmV0PTIzYjNmYWYyZGFmYjQyZGZiMzM4MmMwZDdkNjYzMTViCi1mb3RhX2FwcF92ZXJzaW9uPTIKLWZvdGFfbmV0d29ya190eXBlPVdJRkkKLWZvdGFfdG9rZW5feng9N0NCRTAxNjQwMEY2NTYyMTc0MEEwNEU3NDJFNkZCMTIKLWZvdGFfZGxfdXJsX3p4PQotZm90YV9jaGtfdXJsX3p4PQotZm90YV9yZWdfdXJsX3p4PQotZm90YV9yZXBvcnRfZGxyX3VybF96eD0KLWZvdGFfcmVwb3J0X3VwZ3JfdXJsX3p4PQotZm90YV9yZXBvcnRfc2FsZXNfdXJsX3p4PQotZm90YV90b2tlbl9ncz05N2E1M2VlOWY0NWFkZmU1M2M3NjJhNzJmODNmNmY0MwotZm90YV9kbF91cmxfZ3M9Ci1mb3RhX2Noa191cmxfZ3M9Ci1mb3RhX3JlZ191cmxfZ3M9Ci1mb3RhX3JlcG9ydF9kbHJfdXJsX2dzPQotZm90YV9yZXBvcnRfdXBncl91cmxfZ3M9Ci1mb3RhX3JlcG9ydF9zYWxlc191cmxfZ3M9Ci1mb3RhX3VwZGF0ZV9zcGFjZV90aHJlc2hvbGQ9ODAwCi1mb3RhX2FiX3VwZ3JhZGVfc3RhdHVzPTYKLWZvdGFfYWJfdXBncmFkZV90b3RhbF9zaXplPTAKLWZvdGFfYWJfdXBncmFkZV91cGRhdGVkX3NpemU9MAotZm90YV9hYl9hYV9zeW5jX3N0YXR1cz0yCi1mb3RhX2FiX2xvZ19wYXRoPS9tbnQvdXNlcmRhdGEvenRlX2ZvdGFfYWIvdXBpX2FiLmxvZwotZm90YV9hYV9hdXRvX3N5bmM9MAotTG9naW49YWRtaW4KLVBhc3N3b3JkPQotc250cF9zZXJ2ZXJfY291bnQ9MwotTUFYX1N0YXRpb25fbnVtPTMyCi1NQVhfU3RhdGlvbl9udW1fYmFrPTAKLU1BWF9BY2Nlc3NfbnVtX2JiYWs9MAotTUFYX0NoaXBfQ2FwYWJpbGl0eT0zMgotd2lmaV9rZXlfZ2VuX3R5cGU9TUFDCi13aWZpX2tleV9sZW49OAotd2lmaV9rZXlfb25seV9kaWdpdD15Ci13aWZpX2x0ZV9pbnRyPTEKLXdpZmlfc3NpZF9nZW5fd2l0aF9tYWNfbGFzdGJ5dGU9Ngotd2lmaV9rZXlfZ2VuX3dpdGhfbWFjX2xhc3RieXRlPTgKLXdpZmlfbWFjX251bT0yCi13aWZpd2FuPXdsYW4wLXZ4ZAotd2lmaXdhbl9tb2RlPWRoY3AKLWlkbGVfdGltZT0iNjAwIgotcHJvZHVjdF90eXBlPTEKLWVycm5vZmlsZT0vdXNyL25ldGxvZy9lcnJuby5sb2cKLWVycm5vZmlsZVNpemU9MTAyNAotaG90cGx1Z2ZpbGU9L3Vzci9uZXRsb2cvaG90cGx1Zy5sb2cKLWhvdHBsdWdmaWxlU2l6ZT0xMDI0Ci1teW5ldGxpbmtmaWxlPS91c3IvbmV0bG9nL215bmV0bGluay5sb2cKLW15bmV0bGlua2ZpbGVTaXplPTEwMjQKLXRlbG5ldGRfZW5hYmxlPW4KLQotI3N5c2xvZ2TP4LnYxeTWwwotc3lzbG9nX2ZpbGVfc2l6ZT0xCi1zeXNsb2dfZmlsZV9udW09NQotcHJpbnRfbGV2ZWw9Mgotc3lzbG9nX2xldmVsPTQKLQotc2tiX2RlYnVnPQotc2VjbG9nX3N3aXRjaD0KLSMjIyMjIyMjIyMjIyMjIyNTT0ZUQVDXqNPDIEVORCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjVVNCtsu/2sXk1sMjIyMjIyMjCi0KLSMjIyMjIyMjIyN1c2Ivcmo0NbXIyMiwzrLlz+C52MK3vrYjIyMjIyMjIyMjIyMjIwotI3JqNDWz9cq817TMrMK3vrYKLXJqNDVfcGx1Z3N0YXRlX3BhdGg9L3N5cy9rZXJuZWwvZXRoX2RlYnVnL2V0aF9zdGF0ZQotI3VzYs34v9rD+8K3vrYKLXVzYl9uYW1lX3BhdGg9L3N5cy9kd2NfdXNiL3VzYmNvbmZpZy9uZXRuYW1lCi0jdXNiuPfN+L/a17TMrMK3vrYKLXVzYl9wbHVnc3RhdGVfcGF0aD0vc3lzL2R3Y191c2IvdXNiY29uZmlnLwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSPNqLn9Z3Bpb7zssuKy5bDOo6zTw9Pa19S2r7uvtffK1AotdXNiX2dwaW9fZGV0ZWN0PTEKLQotI8Xk1sPKx7fx09C54sXMCi1jZHJvbV9zdGF0ZT0wCi0KLSNjZHJvbbXatv6917bOw7a+2aO6MM6qsrvQ6NKqw7a+2aOsMc6q0OjSqsO2vtnH0tDo0qq50tTYvenWyqOsMs6qsrvQ6NKqudLU2L3p1sojCi1uZWVkX3N1cHBvcnRfY2Ryb21fc3RlcDI9MAotI8Xk1sNXaW5kb3dzz8LN+L+owODQzQotc2VsZWN0X3R5cGU9c2VsZWN0X3JuZGlzCi0KLSMjIyMKLSPF5NbD0dC3osSjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX2RlYnVnPWRpYWcsYWRiLHNlcmlhbCxhY20KLQotCi0jxeTWw9PDu6fEo8q9yse38cq508PN+L+oCi11c2Jfdm5pY191c2VyPW9uCi0KLSPF5NbD08O7p8Sjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX3VzZXI9YWRiLGFjbQotCi0jxeTWw8n6svrEo8q9dXNiyeixuLbLv9rX6brPCi11c2JfZGV2aWNlc19mYWN0b3J5PXNlcmlhbCxkaWFnCi0KLSPF5NbDQU1UxKPKvXVzYsnosbi2y7/a1+m6zwotdXNiX2RldmljZXNfYW10PXNlcmlhbCxkaWFnCi0KLSPF5NbD0dC3osSjyr1hY220rr/auPbK/QotdXNiX2FjbV9udW1fZGVidWc9MQotCi0jxeTWw9HQt6LEo8q9c2VyaWFstK6/2rj2yv0KLXVzYl9zZXJpYWxfbnVtX2RlYnVnPTEKLQotI8Xk1sPTw7unxKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV91c2VyPTEKLQotI8Xk1sPTw7unxKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV91c2VyPTAKLQotI8Xk1sPJ+rL6xKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV9mYWN0b3J5PTAKLQotI8Xk1sPJ+rL6xKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV9mYWN0b3J5PTEKLQotI8Xk1sNBTVTEo8q9YWNttK6/2rj2yv0KLXVzYl9hY21fbnVtX2FtdD0wCi0KLSPF5NbDQU1UxKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV9hbXQ9MgotCi0jd2FuZ3poZW4KLSPF5NbDZGVidWfEo8q9bWFzc19zdG9yYWdltcRsdW61xMSjyr0KLXVzYl9sdW5fdHlwZV9kZWJ1Zz1NTUMKLQotI8Xk1sN1c2VyxKPKvW1hc3Nfc3RvcmFnZbXEbHVutcTEo8q9Ci11c2JfbHVuX3R5cGVfdXNlcj1NTUMKLQotI8Xk1sNjZHJvbcSjyr1tYXNzX3N0b3JhZ2W1xGx1brXExKPKvQotdXNiX2x1bl90eXBlX2Nkcm9tPU1NQwotIyMjCi0KLSPF5NbD0dC3osSjyr3N+L/azqpORElTyrHJ6LG4tcRQSUQKLVBJRF9UU1BfTkRJUz0wNTgyCi0jIyMKLQotI8Xk1sPR0LeixKPKvc34v9rOqlJORElTyrHJ6LG4tcRQSUQKLVBJRF9UU1BfUk5ESVM9MDU4MgotCi0jxeTWw9HQt6LEo8q9zfi/2s6qRUNNyrHJ6LG4tcRQSUQKLVBJRF9UU1BfRUNNPTA1ODIKLQotI8Xk1sPR0LeixKPKvdLss6PKscnosbi1xFBJRAotUElEX1RFU1Q9ZmYwMAotCi0jxeTWw9HbzbzEo8q9yrHJ6LG4tcRQSUQKLVBJRF9ZVD0wNTgwCi0KLSPF5NbD0dC3osSjyr254sXMQ0RST021xFBJRAotUElEX1RTUF9DRFJPTT0wNTQ4Ci0KLSMjIyMjCi0KLSPF5NbD08O7p8Sjyr3Eo8q9ueLFzENEUk9NtcRQSUQKLVBJRF9VU0VSX0NEUk9NPTEyMjUKLQotIyMjIyMKLSMjIyMjIyMKLSPF5NbD08O7p8Sjyr3N+L/azqpSTkRJU8qxyeixuLXEUElECi1QSURfVVNFUl9STkRJUz0wNTg1Ci0KLSPF5NbD08O7p8Sjyr3N+L/azqpFQ03Kscnosbi1xFBJRAotUElEX1VTRVJfRUNNPTA1ODUKLQotI8Xk1sPTw7unxKPKvc34v9rOqk5ESVPKscnosbi1xFBJRAotUElEX1VTRVJfTkRJUz0wNTgzCi0KLSPF5NbD08O7p8Sjyr3Du9PQzfi/2sqxyeixuLXEUElECi1QSURfVVNFUl9OT1ZOSUM9MDU4NgotIyMjIyMjCi0KLSPF5NbDy8C7+nRyYXDKscnosbi1xFBJRAotUElEX1RSQVA9MDE5NwotCi0jxeTWw8n6svrEo8q9yrHJ6LG4tcRQSUQKLVBJRF9GQUNUT1JZPTA1MzQKLQotI8Xk1sNBTVTEo8q9yrHJ6LG4tcRQSUQKLVBJRF9BTVQ9MDIwMQotCi0jxeTWw7nYu/qz5LXnyrHJ6LG4tcRQSUQKLVBJRF9GQVNUUE9XRVJPRkY9MjAwNAotCi0jxeTWw8nosbi1xFZJRAotVklEX1RTUD0xOUQyCi0KLSPF5NbDyse38dPDY2hpcGlk1/fOqsnosbi1xGlTZXJpYWzX1rf7tK4KLXVzYl9zZXJudW1fY2hpcGlkPTAKLQotI8Xk1sPJ6LG4tcRpU2VyaWFs19a3+7SuCi1TRVJJQUxfVFNQPTEyMzQ1Njc4OTBBQkNERUYKLQotI8Xk1sPR0LeixKPKvcnosbi1xFJlbGVhc2VJRAotUkVMRUFTRUlEX1RTUD0wMTAwCi0KLSPF5NbD08O7p8Sjyr3J6LG4tcRSZWxlYXNlSUQKLVJFTEVBU0VJRF9VU0VSPTAxMDEKLQotI8Xk1sPJ6LG4tcRtYW51ZmFjdHVyZXLX1rf7tK4KLU1BTlVGQUNUVVJFUl9UU1A9REVNTyxJbmNvcnBvcmF0ZWQKLQotI8Xk1sPJ6LG4tcRwcm9kdWN019a3+7SuCi1QUk9EVUNUX1RTUD1ERU1PIE1vYmlsZSBCb2FyZGJhbmQKLQotI8Xk1sPJ6LG4tcRjb25maWfX1rf7tK4KLUNPTkZJR19UU1A9REVNTyBDb25maWd1cmF0aW9uCi0KLSNjZHJvbSBsdW61xHZlbmRvctfWt/u0rgotVkVORE9SX01TX0NEUk9NPURFTU8KLQotI2Nkcm9tIGx1brXEcHJvZHVjdNfWt/u0rgotUFJPRFVDVF9NU19DRFJPTT1VU0IgU0NTSSBDRC1ST00KLQotI2Nkcm9tIGx1brXEcmVsZWFzZdfWt/u0rgotUkVMRUFTRV9NU19DRFJPTT0yLjMxCi0KLSNjZHJvbSBsdW61xGlucXVpcnnX1rf7tK4KLUlOUVVJUllfTVNfQ0RST009REVNTyBVU0IgU0NTSSBDRC1ST00gMi4zMQotI21tYyBsdW61xHZlbmRvctfWt/u0rgotVkVORE9SX01TX01NQz1ERU1PCi0KLSNtbWMgbHVutcRwcm9kdWN019a3+7SuCi1QUk9EVUNUX01TX01NQz1NTUMgU3RvcmFnZQotCi0jbW1jIGx1brXEcmVsZWFzZdfWt/u0rgotUkVMRUFTRV9NU19NTUM9Mi4zMQotCi0jU0S96dbKwre+tgotdXNiX3RjYXJkX2x1bl9wYXRoPS9kZXYvbW1jYmxrMAotCi0jbW1jIGx1brXEaW5xdWlyedfWt/u0rgotSU5RVUlSWV9NU19NTUM9REVNTyBNTUMgU3RvcmFnZSAyLjMxCi0KLSPF5NbDRUNNzfi/qLj2yv0KLUVDTV9OVU09MQotCi0jxeTWw1JORElTzfi/qNfutPPX6bD8yv0KLVJORElTX1BLVF9OVU09MTAKLQotCi0jIyOyqMzYwsrX1MrK06a/qrnYIyMjCi1zZWxmX2FkYXB0aW9uX3BvcnQ9Ci0jIyPEs9Cptsu/2rK70OjSqs/y06bTw8nPsai2y7/a17yxuLrDz/vPoiMjIwotbm90aWZ5X2ZvcmJpZGVuX3BvcnRzPQotCi0jIyNhZGLErMjPudLU2LrLLDA6YXA7MTpjYXAjIyMKLWFkYl9jb3JlX2lkPTEKLSMjIyMjI1VTQrbLv9rF5NbDRU5EIyMjIyMjIwotCi0jIyMjIyNDULLgTlbF5NbD0MXPoiMjIyMjIyMKLSPE2rK/yO28/rDmsb66xQotenZlcnNpb249SzMxOFYxLjAuMEIwMwotI83isr/I7bz+sOaxvrrFCi16Y2dtcj1ERU1PX1YxLjAuMEIwMwotI9OyvP6w5rG+usUKLXpodmVyPVYwLjEKLSPE2rK/u/rQzQotemNnbW09SzMxOAotI83isr+7+tDNCi16Y2dtdz1LMzE4Ci0js6fJzNDFz6IKLXpjZ21pPURFTU8KLSNTU0lEusUKLXpzc2lkPTAKLSNXaWZpS2V5tcTWtQotendpZmlrZXk9MAotI8v4zfjX7rTzveLL+LTOyv2jrMv4zfjEo7/pyrnTwwotenVubG9ja3RpbWVzPTAKLSOw5rG+xKPKvcDg0M2jrNX9s6Ow5rG+L7nSsuCw5rG+Ci16dmVyc2lvbm1vZGU9MAotI9bHxNy2zNDFuabE3L+qudgKLXppc21zPTAKLSNETbmmxNy/qrnYLDA6udix1aOsMdLGtq+jrDLBqs2oo6wztefQxQotemRtcmVnPTAKLSPBqs2oRE0g16Ky4b+qu/q1yLT9yrG85CwgMX42MCDT0NCno6y1pc67t9bW06OsxuTL+8r91rU6IM7e0KfWtQotemRtcmVndGltZT0wCi0KLSO5pL7femxvZ19hZ2VudLTmyKEKLXpjYXRfbW9kZT1DUFVTQgotemxvZ19udW09MTAKLXpsb2dfc2l6ZT0xMDAKLXpsb2dfcGF0aD0vbW50L3VzZXJkYXRhL3pjYXQKLXJ1bGVfZmlsZT0vZXRjX3JvL2xvZ3J1bGUvYXRpX3N0ZC5ydWxlCi0KLSNyYW1kdW1wtOa0osSjyr0KLSNubyxhdXRvLHllcwotcmFtZHVtcF9leHBvcnQ9bm8KLSNVU0Igb3IgQ0FQRU1NQyBvciBDQVBGTEFTSAotcmFtZHVtcF9tb2RlPVVTQgotcmFtZHVtcF9lbW1jX2RldmljZT0vZGV2L21tY2JsazFwMQotcmFtZHVtcF9mbGFzaF9kZXZpY2U9L2Rldi9tdGQxNwotcmFtZHVtcF9wYXRoPS9tbnQvb2VtZGF0YQotCi0j1dXP4Lv6zbzGrLfWsebCys/Uyr6/2NbGCi16Y2FtZXJhX2ludGVycHJvbGF0aW9uPTEKLSPX1Lavy9HN+Le9yr3N+MLnvdPI67TO0PIKLWF1dG9fYWNxb3JkZXI9MTIKLSMjIyMjI0NQsuBOVsXk1sPQxc+iRU5EIyMjIyMjIwotI2ZvciB2b2x0ZQotTVRORVRfVEVTVD0wCi1OU0lPVF9URVNUPTAKLWFtcnc9MQotY3Ztb2RfaW1zPTMKLUVNX0NBTExfU1VQUE9SVD0wCi1FTUNBTExfVE9fTk9STUFMPTAKLUlNU19BUE49Ci1JTVNfQ09ORlVSST0KLUlNU19DQ19VUklfVFlQRT0wCi1JTVNfU01TX1VSSV9UWVBFPTAKLUlNU19SRUdfRVhQSVJFUz02MDAwMDAKLUlNU19SRUdfU1VCX0VYUElSRVM9NjAwMDAwCi1ORVRfSU1TX0NBUD0wCi1VRFBfVEhSRVNIPTEzMDAKLUlQU0VDX0RJU0FCTEU9MAotUFJFQ09ORFRJT05fTk9UX1NVUFBPUlQ9MAotV0FJVF9SUFRfVElNRT0xMDAwCi1PQ1RfQUxHTl9BTVI9MAotU01TX09WRVJfSVA9MQotSU1TX1VTRVJfQUdFTlQ9Ci1CU0ZfUE9SVD04MDgwCi1YQ0FQX1BPUlQ9ODAKLVVUX0FQTj0KLTM4MF9USEVOX0NTRkI9MAotRFRNRl9SRkM0NzMzPTAKLURJQUxPR19GT1JLPTAKLURBVEFfQ0VOVFJJQz0wCi1ub3Rfc3VwcF9obWFjX3NoYTFfOTY9MAotbm90X3N1cHBfaG1hY19tZDVfOTY9MAotbm90X3N1cHBfZGVzX2VkZTNfY2JjPTAKLW5vdF9zdXBwX2Flc19jYmM9MAotSU1TX1BDU0NGX1BPUlQ9NTA2MAotR19JTVNfQ01HRj0wCi1FQ0FMTF9NVFRFU1Q9MAotUE9XRVJfQ09OVFJPTD0wCi1OT1RfS0VFUF9UQ1BfQ09OTj0xCi1UMzM5Nl9TVVBQT1JUPTAKLVQzMzk2X0NBVVNFX1JFQVNPTj04LDI3LDMyLDMzCi1UMzM5Nl9EVVJBVElPTj03MjAKLVQzMzk2X0NPVU5UUz0zCi1FQ0FMTF9UMl9USU1FUj0zNjAwCi1OR0VDQUxMX0ZPUlRFU1Q9MAotQ1VTVE9NRVJfRkxBRz0wCi0jZm9yIHZvbHRlIGVuZAotREVCVUdfSU5GT19ESVNBQkxFPTAKLURFQlVHX0lORk9fRklMRV9QQVRIPS9tbnQvdXNlcmRhdGEKLURFQlVHX0lORk9fRklMRV9OVU09MgotREVCVUdfSU5GT19GSUxFX1RPVEFMX1NJWkU9MQotI2RlYnVnIGluZm8gZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY180R2IvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY180R2IvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl91c2VyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzAzNzA2Li4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfNEdiL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfdXNlcgorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi1hcG5fYXV0b19jb25maWc9Q01DQygkKWNtbmV0KCQpbWFudWFsKCQpKjk5IygkKXBhcCgkKSgkKSgkKUlQKCQpYXV0bygkKSgkKWF1dG8oJCkoJCkKLUFQTl9jb25maWcwPURlZmF1bHQoJClEZWZhdWx0KCQpbWFudWFsKCQpKCQpKCQpKCQpKCQpSVAoJClhdXRvKCQpKCQpYXV0bygkKSgkKQotQVBOX2NvbmZpZzE9Ci1BUE5fY29uZmlnMj0KLUFQTl9jb25maWczPQotQVBOX2NvbmZpZzQ9Ci1BUE5fY29uZmlnNT0KLUFQTl9jb25maWc2PQotQVBOX2NvbmZpZzc9Ci1BUE5fY29uZmlnOD0KLUFQTl9jb25maWc5PQotYXBuX2luZGV4PTAKLWFwbl9tb2RlPWF1dG8KLWF0X3NuYXBfZmxhZz0zCi1hdF93aWZpX21hYz0wCi1hdXRvX2Fwbl9pbmRleD0wCi1jaWRfcmVzZXJ2ZWQ9MQotY2xlYXJfcGJfd2hlbl9yZXN0b3JlPW5vCi1jbGVhcl9zbXNfd2hlbl9yZXN0b3JlPW5vCi1kZWZhdWx0X2Fwbj0zZ25ldAotaXB2Nl9BUE5fY29uZmlnMT0KLWlwdjZfQVBOX2NvbmZpZzI9Ci1pcHY2X0FQTl9jb25maWczPQotaXB2Nl9BUE5fY29uZmlnND0KLWlwdjZfQVBOX2NvbmZpZzU9Ci1pcHY2X0FQTl9jb25maWc2PQotaXB2Nl9BUE5fY29uZmlnNz0KLWlwdjZfQVBOX2NvbmZpZzg9Ci1pcHY2X0FQTl9jb25maWc5PQotbV9wcm9maWxlX25hbWU9SW50ZXJudXgKLW5lZWRfaW5pdF9tb2RlbT1ubwotbmV0X3NlbGVjdD1ORVRXT1JLX2F1dG8KLXBkcF90eXBlPUlQCi1wcHBfYXBuPQotbWF4X3JlY29ubmVjdF90aW1lPTMwMDAwMDAKLXBwcGRfYXV0aD1ub2F1dGgKLXBwcF9hdXRoX21vZGU9bm9uZQotcHBwX3Bhc3N3ZD0KLXBwcF9wZHBfdHlwZT0KLXBwcF91c2VybmFtZT0KLWlwdjZfcHBwX2F1dGhfbW9kZT1ub25lCi1pcHY2X3BwcF9wYXNzd2Q9Ci1pcHY2X3BwcF91c2VybmFtZT0KLXByZV9tb2RlPQotcHJlZmVyX2Ruc19tYW51YWw9MC4wLjAuMAotc3RhbmRieV9kbnNfbWFudWFsPTAuMC4wLjAKLXdhbl9hcG49aW50ZXJuZXQKLXdhbl9kaWFsPQotY3RhX3Rlc3Q9MAotc2FmZWNhcmVfZW5iYWxlPTEKLXNhZmVjYXJlX2hvc3RuYW1lPW1vYi4zZ2NhcmUuY24KLXNhZmVjYXJlX3JlZ2lzdGVkX2ltZWk9Ci1zYWZlY2FyZV9yZWdpc3RlZF9pY2NpZD0KLXNhZmVjYXJlX2NvbnRpbWVzdGFydDE9Ci1zYWZlY2FyZV9jb250aW1lc3RhcnQyPQotc2FmZWNhcmVfY29udGltZXN0YXJ0Mz0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMT0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMj0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMz0KLXNhZmVjYXJlX2NvbnRpbWVpbnRlcnZhbD0KLXNhZmVjYXJlX21vYnNpdGU9aHR0cDovL21vYi4zZ2NhcmUuY24KLXNhZmVjYXJlX2NoYXRzaXRlPQotc2FmZWNhcmVfcGxhdG5vPQotc2FmZWNhcmVfbW9iaWxlbnVtYmVyPQotc2FmZWNhcmVfdmVyc2lvbj0KLWV0aHdhbl9kbnNfbW9kZT1hdXRvCi1wc3dhbl9kbnNfbW9kZT1hdXRvCi13aWZpd2FuX2Ruc19tb2RlPWF1dG8KLWV0aHdhbl9pcHY2X2Ruc19tb2RlPWF1dG8KLXdpZml3YW5faXB2Nl9kbnNfbW9kZT1hdXRvCi1wc3dhbl9pcHY2X2Ruc19tb2RlPWF1dG8KLWFkbWluX1Bhc3N3b3JkPVBhc3MxMjM0Ci1wc3dfY2hhbmdlZD0xCi1hbGdfZnRwX2VuYWJsZT0wCi1hbGdfc2lwX2VuYWJsZT0wCi1ibGNfd2FuX2F1dG9fbW9kZT1BVVRPX1BQUAotYmxjX3dhbl9tb2RlPUFVVE8KLWJyX2lwY2hhbmdlX2ZsYWc9Ci1icl9ub2RlPXVzYmxhbjArenZuZXQwCi1icl9ub2RlX2NhcD16dm5ldDAKLWNsYXRfZmFrZV9zdWJuZXQ9MTkyLjAuMTY4LjAKLWNsYXRfZnJhZ19jb2xsZWN0X3RpbWVvdXQ9MzAwCi1jbGF0X2xvY2FsX21hcHBpbmdfdGltZW91dD0zMDAKLWNsYXRfbWFwcGluZ19yZWNvcmRfdGltZW91dD0zMDAwCi1jbGF0X3F1ZXJ5X3NlcnZlcl9wb3J0PTE0NjQKLURlZmF1bHRGaXJld2FsbFBvbGljeT0wCi1kZXZfY29leGlzdD0wCi1kaGNwRG5zPTE5Mi4xNjguMC4xCi1kaGNwRW5hYmxlZD0xCi1kaGNwRW5kPTE5Mi4xNjguMC4yMDAKLWRoY3BMZWFzZV9ob3VyPTI0Ci1kaGNwU3RhcnQ9MTkyLjE2OC4wLjEwMAotZGhjcHY2c3RhdGVFbmFibGVkPTAKLWRoY3B2NnN0YXRlbGVzc0VuYWJsZWQ9MQotZGhjcHY2c3RhdGVQZEVuYWJsZWQ9MAotZGlhbF9tb2RlPWF1dG9fZGlhbAotRE1aRW5hYmxlPTAKLURNWklQQWRkcmVzcz0KLWRuc19leHRlcm49Ci1pcHY2X2Ruc19leHRlcm49Ci1ldGhfYWN0X3R5cGU9Ci1ldGhfdHlwZT1sYW4KLWV0aGxhbj0KLWV0aHdhbj0KLWV0aHdhbl9kaWFsbW9kZT1hdXRvCi1ldGh3YW5fbW9kZT1hdXRvCi1ldGh3YW5fcHJpb3JpdHk9MwotZmFzdF91c2I9dXNibGFuMAotZmFzdG5hdF9sZXZlbD0yCi1mYXN0YnJfbGV2ZWw9MQotSVBQb3J0RmlsdGVyRW5hYmxlPTAKLUlQUG9ydEZpbHRlclJ1bGVzXzA9Ci1JUFBvcnRGaWx0ZXJSdWxlc18xPQotSVBQb3J0RmlsdGVyUnVsZXNfMj0KLUlQUG9ydEZpbHRlclJ1bGVzXzM9Ci1JUFBvcnRGaWx0ZXJSdWxlc180PQotSVBQb3J0RmlsdGVyUnVsZXNfNT0KLUlQUG9ydEZpbHRlclJ1bGVzXzY9Ci1JUFBvcnRGaWx0ZXJSdWxlc183PQotSVBQb3J0RmlsdGVyUnVsZXNfOD0KLUlQUG9ydEZpbHRlclJ1bGVzXzk9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzA9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzE9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzI9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzM9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzQ9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzU9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzY9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzc9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzg9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzk9Ci1pcHY0X2Zha2Vfc3VibmV0PTE5Mi4wLjAuMAotaXB2Nl9mYWtlX3N1Ym5ldD0yMDE2OjoxCi1sYW5faXBhZGRyPTE5Mi4xNjguMC4xCi13ZWJ2Nl9lbmFibGU9MQotbGFuX2lwdjZhZGRyPWZlODA6OjEKLWxhbl9uYW1lPWJyMAotbGFuX25ldG1hc2s9MjU1LjI1NS4yNTUuMAotTGFuRW5hYmxlPTEKLWRoY3BEbnNfY2FwPTE5Mi4xNjguMC4yCi1sYW5faXB2NmFkZHJfY2FwPWZlODA6OjIKLWxhbl9pcGFkZHJfY2FwPTE5Mi4xNjguMC4yCi1sYW5fbmFtZV9jYXA9YnIwCi1sYW5fbmV0bWFza19jYXA9MjU1LjI1NS4yNTUuMAotTGFuRW5hYmxlX2NhcD0xCi1tYWNfaXBfbGlzdD0KLW1nbXRfcXVpY2tlbl9wb3dlcl9vbj0wCi1tdHU9MTQwMAotbmF0ZW5hYmxlPQotZG9zZW5hYmxlPTAKLW5lZWRfamlsaWFuPTEKLW5vZmFzdF9wb3J0PTIxKzIyKzIzKzI1KzUzKzY3KzY4KzY5KzExMCsxMTUrMTIzKzQ0Mys1MDArMTM1MisxNzIzKzE5OTArMTk5MSsxOTkyKzE5OTMrMTk5NCsxOTk1KzE5OTYrMTk5NysxOTk4KzQ1MDArNTA2MAotbnZfc2F2ZV9pbnRlcnZhbD0zMDAKLXBhdGhfY29uZj0vZXRjX3J3Ci1wYXRoX3JvPS9ldGNfcm8KLXBhdGhfbG9nPS90bXAvCi1uZXRsb2dfbGltaXQ9eWVzCi1wYXRoX3NoPS9zYmluCi1wYXRoX3RtcD0vdG1wCi1wZXJtaXRfZ3c9Ci1wZXJtaXRfaXA2PQotcGVybWl0X25tPTI1NS4yNTUuMjU1LjAKLVBvcnRGb3J3YXJkRW5hYmxlPTAKLVBvcnRGb3J3YXJkUnVsZXNfMD0KLVBvcnRGb3J3YXJkUnVsZXNfMT0KLVBvcnRGb3J3YXJkUnVsZXNfMj0KLVBvcnRGb3J3YXJkUnVsZXNfMz0KLVBvcnRGb3J3YXJkUnVsZXNfND0KLVBvcnRGb3J3YXJkUnVsZXNfNT0KLVBvcnRGb3J3YXJkUnVsZXNfNj0KLVBvcnRGb3J3YXJkUnVsZXNfNz0KLVBvcnRGb3J3YXJkUnVsZXNfOD0KLVBvcnRGb3J3YXJkUnVsZXNfOT0KLVBvcnRNYXBFbmFibGU9MAotUG9ydE1hcFJ1bGVzXzA9Ci1Qb3J0TWFwUnVsZXNfMT0KLVBvcnRNYXBSdWxlc18yPQotUG9ydE1hcFJ1bGVzXzM9Ci1Qb3J0TWFwUnVsZXNfND0KLVBvcnRNYXBSdWxlc181PQotUG9ydE1hcFJ1bGVzXzY9Ci1Qb3J0TWFwUnVsZXNfNz0KLVBvcnRNYXBSdWxlc184PQotUG9ydE1hcFJ1bGVzXzk9Ci1wcHBfbmFtZT1wcHAwCi1wcHBvZV9wYXNzd29yZD0KLXBwcG9lX3VzZXJuYW1lPQotcHNfZXh0MT16dm5ldDEKLXBzX2V4dDI9enZuZXQyCi1wc19leHQzPXp2bmV0MwotcHNfZXh0ND16dm5ldDQKLXBzX2V4dDU9enZuZXQ1Ci1wc19leHQ2PXp2bmV0NgotcHNfZXh0Nz16dm5ldDcKLXBzX2V4dDg9enZuZXQ4Ci1wc3dhbj13YW4KLXBzd2FuX21vZGU9cGRwCi1wc3dhbl9wcmlvcml0eT0xCi1wc3dhbl9jYXA9enZuZXQKLVJlbW90ZU1hbmFnZW1lbnQ9MAotcm9vdGRldl9mcmllbmRseW5hbWU9REVNTy1VUG5QCi1yb290ZGV2X21hbnVmYWN0dXJlcj1ERU1PCi1yb290ZGV2X21vZGVsZGVzPVhYWAotcm9vdGRldl9tb2RlbG5hbWU9WFhYCi1vc191cmw9aHR0cDovL3d3dy5kZW1vLmNvbQotc2VyaWFsbnVtYmVyPVNlZS1JTUVJCi1zdGF0aWNfZGhjcF9lbmFibGU9MQotc3RhdGljX2V0aHdhbl9ndz0KLXN0YXRpY19ldGh3YW5faXA9Ci1zdGF0aWNfZXRod2FuX25tPQotc3RhdGljX2V0aHdhbl9wcmlkbnM9Ci1zdGF0aWNfZXRod2FuX3NlY2Rucz0KLXN0YXRpY193aWZpd2FuX2lwYWRkcj0KLXN0YXRpY193aWZpd2FuX25ldG1hc2s9Ci1zdGF0aWNfd2lmaXdhbl9nYXRld2F5PQotd2lmaXdhbl9wcmlkbnNfbWFudWFsPQotd2lmaXdhbl9zZWNkbnNfbWFudWFsPQotc3RhdGljX3dhbl9nYXRld2F5PTAuMC4wLjAKLXN0YXRpY193YW5faXBhZGRyPTAuMC4wLjAKLXN0YXRpY193YW5fbmV0bWFzaz0wLjAuMC4wCi1zdGF0aWNfd2FuX3ByaW1hcnlfZG5zPTAuMC4wLjAKLXN0YXRpY193YW5fc2Vjb25kYXJ5X2Rucz0wLjAuMC4wCi1zd2xhbnN0cj1zdzBfbGFuCi1zd3ZsYW49c3cwCi1zd3dhbnN0cj1zdzBfd2FuCi10Y19kb3dubGluaz0KLXRjX3VwbGluaz0KLXRjX2xvY2FsPTEzMTA3MjAKLXRjX2VuYWJsZT0wCi10aW1lX2xpbWl0ZWQ9Ci10aW1lX3RvXzIwMDBfd2hlbl9yZXN0b3JlPXllcwotdXBucEVuYWJsZWQ9MAotdXNibGFuPXVzYmxhbjAKLVdBTlBpbmdGaWx0ZXI9MAotd2Vic1VSTEZpbHRlcnM9Ci13aWZpd2FuX3ByaW9yaXR5PTIKLURETlM9Ci1ERE5TX0VuYWJsZT0wCi1ERE5TQWNjb3VudD0KLURETlNQYXNzd29yZD0KLURETlNQcm92aWRlcj0KLWljY2lkUHJldmlvdXM9Ci1pbWVpUHJldmlvdXM9Ci1yZWdpc3RlckZsYWc9MAotcmVnaXN0ZXJlZFJvdW5kPQotc2Vjc0V2ZXJ5Um91bmQ9MQotc2Vjc0V2ZXJ5VGltZT0xCi1yZWd2ZXI9NC4wCi1tZWlkPQotdWV0eXBlPTEKLUxvY2FsRG9tYWluPW0uaG9tZQotZGF0YV92b2x1bWVfYWxlcnRfcGVyY2VudD0KLWRhdGFfdm9sdW1lX2xpbWl0X3NpemU9Ci1kYXRhX3ZvbHVtZV9saW1pdF9zd2l0Y2g9MAotZGF0YV92b2x1bWVfbGltaXRfdW5pdD0wCi1mbHV4X2RheV90b3RhbD0wCi1mbHV4X2xhc3RfZGF5PQotZmx1eF9sYXN0X21vbnRoPQotZmx1eF9sYXN0X3llYXI9Ci1mbHV4X21vbnRoX3RvdGFsPTAKLWZsdXhfc2V0X2RheT0KLWZsdXhfc2V0X21vbnRoPQotZmx1eF9zZXRfeWVhcj0KLW1vbnRobHlfcnhfYnl0ZXM9MAotbW9udGhseV90aW1lPTAKLW1vbnRobHlfdHhfYnl0ZXM9MAotTW9udGhseUNvblRpbWVfTGFzdD0KLWRtX25leHRwb2xsaW5ndGltZT0KLWZvdGFfYWxsb3dSb2FtaW5nVXBkYXRlPTAKLWZvdGFfZGxfcGtnX3NpemU9MAotZm90YV91cGRhdGVfZmxhZz0KLWZvdGFfdXBkYXRlSW50ZXJ2YWxEYXk9MTUKLWZvdGFfdXBncmFkZV9yZXN1bHQ9Ci1mb3RhX3ZlcnNpb25fZGVsdGFfaWQ9Ci1mb3RhX3ZlcnNpb25fZGVsdGFfdXJsPQotZm90YV9wa2dfdG90YWxfc2l6ZT0wCi1mb3RhX3ZlcnNpb25fZmlsZV9zaXplPQotZm90YV92ZXJzaW9uX21kNXN1bT0KLWZvdGFfdmVyc2lvbl9uYW1lPQotZm90YV9uZWVkX3VzZXJfY29uZmlybV91cGRhdGU9MAotZm90YV9uZWVkX3VzZXJfY29uZmlybV9kb3dubG9hZD0wCi1mb3RhX3ZlcnNpb25fZm9yY2VfaW5zdGFsbD0wCi1wb2xsaW5nX25leHR0aW1lPTAKLXB3cm9uX2F1dG9fY2hlY2s9MAotZm90YV91cGRhdGVNb2RlPTAKLWZvdGFfdGVzdF9tb2RlPTAKLWZvdGFfcGtnX2Rvd25sb2FkZWQ9MAotZm90YV91cGdyYWRlX3Jlc3VsdF9pbnRlcm5hbD0KLW1taV9iYXR0ZXJ5X3ZvbHRhZ2VfbGluZT0zMDkwKzMzMDArMzQ1MCszNDkwKzM1MTArMzU0MCszNTUwKzM1NzArMzU4MCszNjAwKzM2MjArMzY1MCszNjcwKzM3MTArMzc0MCszNzgwKzM4NTArMzkwMCszOTUwKzQwMDArNDA2MAotbW1pX2Zhc3RfcG93ZXJvbj0KLW1taV9sZWRfbW9kZT1zbGVlcF9tb2RlCi1tbWlfbmV3X3Ntc19ibGlua19mbGFnPTEKLW1taV9zaG93X3BhZ2V0YWI9cGFnZTErcGFnZTIrcGFnZTMKLW1taV9zaG93bW9kZT1sZWQKLW1taV90YXNrX3RhYj1jdHJsX3Rhc2sra2V5X3Rhc2sKLW1taV90ZW1wX3ZvbHRhZ2VfbGluZT05NTErMTIwMSsxNjkyKzE3MzYKLW1taV91c2VfcHJvdGVjdD0KLW1taV91c2Vfd2lmaV91c2VybnVtPTEKLWxlYWtfZnVsbF9wYW5pYz0KLWxlYWtfbGlzdF9tYXg9Ci1sZWFrX3NldF9mbGFnPQotbW9uaXRvcl9wZXJpb2Q9MzAwCi1uZXRpbmZfZmxhZz0KLXNrYl9hbGxfbWF4PQotc2tiX2RhdGFfbWF4PQotc2tiX2Zyb21jcF9tYXg9Ci1za2JfbWF4X2ZhaWw9Ci1za2JfbWF4X3BhbmljPQotc2tiX3NpemVfbWF4PQotc2tiX3RvY3BfbWF4PQotc250cF9kZWZhdWx0X2lwPTEzNC4xNzAuMTg1LjIxMTsxMzEuMTA3LjEzLjEwMDsyMDIuMTEyLjMxLjE5NzsyMDIuMTEyLjI5LjgyOzIwMi4xMTIuMTAuMzY7bnRwLmd3YWRhci5jbjtudHAtc3ouY2hsLmxhO2Rucy5zanR1LmVkdS5jbjtuZXdzLm5ldS5lZHUuY247ZG5zMS5zeW5ldC5lZHUuY247dGltZS1udy5uaXN0Lmdvdjtwb29sLm50cC5vcmc7ZXVyb3BlLnBvb2wubnRwLm9yZwotc250cF9kc3RfZW5hYmxlPTAKLXNudHBfb3RoZXJfc2VydmVyMD0KLXNudHBfb3RoZXJfc2VydmVyMT0KLXNudHBfb3RoZXJfc2VydmVyMj0KLXNudHBfc2VydmVyMD10aW1lLW53Lm5pc3QuZ292Ci1zbnRwX3NlcnZlcjE9cG9vbC5udHAub3JnCi1zbnRwX3NlcnZlcjI9ZXVyb3BlLnBvb2wubnRwLm9yZwotc250cF9zeW5jX3NlbGVjdF9pbnRlcnZhbF90aW1lPTMwCi1zbnRwX3RpbWVfc2V0X21vZGU9YXV0bwotc250cF90aW1lem9uZT1DU1QtOAotc250cF90aW1lem9uZV9pbmRleD0wCi1hc3NlcnRfZXJybm89Ci1jb21tX2xvZ3NpemU9MTYzODQKLWNyX2lubmVyX3ZlcnNpb249VjEuMC4wQjA4Ci1jcl92ZXJzaW9uPVYxLjAuMEIwMQotaHdfdmVyc2lvbj1QQ0JNRjI5UzJWMS4wLjAKLVRVUk5PRkZfQ0hSX05VTT0KLXdhdGNoZG9nX2FwcD0wCi1IVFRQX1NIQVJFX0ZJTEU9Ci1IVFRQX1NIQVJFX1NUQVRVUz0KLUhUVFBfU0hBUkVfV1JfQVVUSD1yZWFkV3JpdGUKLWlwdjZfcGRwX3R5cGU9Ci1pcHY2X3dhbl9hcG49Ci1MYW5ndWFnZT16aC1jbgotbWFudWFsX3RpbWVfZGF5PQotbWFudWFsX3RpbWVfaG91cj0KLW1hbnVhbF90aW1lX21pbnV0ZT0KLW1hbnVhbF90aW1lX21vbnRoPQotbWFudWFsX3RpbWVfc2Vjb25kPQotbWFudWFsX3RpbWVfeWVhcj0KLXNkY2FyZF9tb2RlX29wdGlvbj0wCi1BY2Nlc3NDb250cm9sTGlzdDA9Ci1BY2Nlc3NQb2xpY3kwPTAKLUFDTF9tb2RlPTAKLUF1dGhNb2RlPVdQQTJQU0sKLUNoYW5uZWw9MAotd2lmaV9hY3NfbnVtPTUKLWNsb3NlRW5hYmxlPTAKLWNsb3NlVGltZT0KLUNvdW50cnlDb2RlPUNOCi1EZWZhdWx0S2V5SUQ9MAotRHRpbVBlcmlvZD0xCi1FbmNyeXBUeXBlPUFFUwotRVhfQVBMSVNUPQotRVhfQVBMSVNUMT0KLUVYX0F1dGhNb2RlPQotRVhfRGVmYXVsdEtleUlEPQotRVhfRW5jcnlwVHlwZT0KLUVYX21hYz0KLUVYX1NTSUQxPVVmaV8KLUVYX1dFUEtFWT0KLUVYX3dpZmlfcHJvZmlsZT0KLUVYX1dQQVBTSzE9Ci1GcmFnVGhyZXNob2xkPTIzNDYKLUhpZGVTU0lEPTAKLUhUX0dJPTEKLUtleTFTdHIxPTEyMzQ1Ci1LZXkyU3RyMT0KLUtleTNTdHIxPQotS2V5NFN0cjE9Ci1LZXkxVHlwZT0xCi1LZXkyVHlwZT0KLUtleTNUeXBlPQotS2V5NFR5cGU9Ci1tX0F1dGhNb2RlPVdQQTJQU0sKLW1fRGVmYXVsdEtleUlEPQotbV9FbmNyeXBUeXBlPUFFUwotbV9IaWRlU1NJRD0wCi1tX0tleTFTdHIxPTEyMzQKLW1fS2V5MlN0cjE9Ci1tX0tleTNTdHIxPQotbV9LZXk0U3RyMT0KLW1fS2V5MVR5cGU9MQotbV9LZXkyVHlwZT0KLW1fS2V5M1R5cGU9Ci1tX0tleTRUeXBlPQotbV9NQVhfQWNjZXNzX251bT0wCi1tX05vRm9yd2FyZGluZz0KLW1fc2hvd19xcmNvZGVfZmxhZz0wCi1tX1NTSUQ9VWZpXwotbV9zc2lkX2VuYWJsZT0wCi1tX3dhcGlUeXBlPQotbV93aWZpX21hYz05MDFENDU2OTJBNUMKLW1fV1BBUFNLMV9hZXM9Ci1tX1dQQVBTSzFfZW5jb2RlPU1USXpORFUyTnpnPQotTUFYX0FjY2Vzc19udW09MzIKLU1BWF9BY2Nlc3NfbnVtX2Jhaz0zMgotTm9Gb3J3YXJkaW5nPTAKLW9wZW5FbmFibGU9MAotb3BlblRpbWU9Ci1vcGVyYXRlcl9hcD0KLVJla2V5SW50ZXJ2YWw9MzYwMAotUlRTVGhyZXNob2xkPTIzNDcKLXNob3dfcXJjb2RlX2ZsYWc9MAotU2xlZXBfaW50ZXJ2YWw9MTAKLXNzaWRfd3JpdGVfZmxhZz0wCi1TU0lEMT1VZmlfCi10c3dfc2xlZXBfdGltZV9ob3VyPQotdHN3X3NsZWVwX3RpbWVfbWluPQotdHN3X3dha2VfdGltZV9ob3VyPQotdHN3X3dha2VfdGltZV9taW49Ci13YXBpVHlwZT0KLXdpZmlfZm9yY2VfNDBtPTEKLXdpZmlfMTFuX2NhcD0xCi13aWZpX2JhbmQ9Ygotd2lmaV9jb3ZlcmFnZT1sb25nX21vZGUKLXdpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdD0KLXdpZmlfaG9zdG5hbWVfd2hpdGVfbGlzdD0KLXdpZmlfbWFjPTkwMUQ0NTY5MkE1Qgotd2lmaV9tYWNfYmxhY2tfbGlzdD0KLXdpZmlfbWFjX3doaXRlX2xpc3Q9Ci13aWZpX3Byb2ZpbGU9Ci13aWZpX3Byb2ZpbGUxPQotd2lmaV9wcm9maWxlMj0KLXdpZmlfcHJvZmlsZTM9Ci13aWZpX3Byb2ZpbGU0PQotd2lmaV9wcm9maWxlNT0KLXdpZmlfcHJvZmlsZTY9Ci13aWZpX3Byb2ZpbGU3PQotd2lmaV9wcm9maWxlOD0KLXdpZmlfcHJvZmlsZTk9Ci13aWZpX3Byb2ZpbGVfbnVtPTAKLXdpZmlfcm9vdF9kaXI9Ci13aWZpX3N0YV9jb25uZWN0aW9uPTAKLXdpZmlfd3BzX2luZGV4PTEKLXdpZmlFbmFibGVkPTEKLXdpZmlsYW49d2xhbjAtdmEwCi13aWZpbGFuMj13bGFuMC12YTEKLVdpcmVsZXNzTW9kZT02Ci1XUEFQU0sxX2Flcz0KLVdQQVBTSzFfZW5jb2RlPU1USXpORFUyTnpnPQotd3BzX21vZGU9Ci1XUFNfU1NJRD0KLVdzY01vZGVPcHRpb249MAotbW9uaXRvcl9hcHBzPQotYXRfbmV0ZG9nPQotYXV0b3JzcGNoYW5uZWxfbGlzdD1hbGwKLXNvY3RpbWVfc3dpdGNoPTAKLXVhcnRfY29udHJvbD0xCi11YXJ0X2N0c3Ryc19lbmFibGU9Ci11YXJ0X3NvZnRjb250cm9sX2VuYWJsZT0KLXVhcnRfd2FrZXVwX2VuYWJsZT0xCi11YXJ0X2NvbnNvbGVfY29yZWlkPTEKLXVhcnRfYXBwX2N0cmw9NQotc3BlY2lhbF9jbWRfbGlzdD0kTVlORVRSRUFECi1yYV9tdHVfZW5hYmxlPQotIyPkuLrlhaXnvZHlhaXlupPoiq/niYforqTor4HniYjmnKzmt7vliqAgYmVnaW4KLWF0Y21kX3N0cmVhbTE9QVQrWlNFVD0id19pbnN0cnVtZW50IiwxCi1hdGNtZF9zdHJlYW0yPUFUXlNZU0NPTkZJRz0yNCwwLDEsMgotYXRjbWRfc3RyZWFtMz1BVCtaU0VUPSJjc2lpb3QiLDIKLWF0Y21kX3N0cmVhbTQ9QVQrWlNFVD0iZGxwYXJhZmxnIiwwCi1hdGNtZF9zdHJlYW01PUFUK1pTRVQ9Ik1UTkVUX1RFU1QiLDE7QVQrWkdBQVQ9MDtBVCtaU0VUPSJDTUNDX1RFU1QiLDE7QVQrWlNFVD0iTFRFX0lORk8iLDYzNDg7QVQrWlNFVD0iVk9JQ0VfU1VQUE9SVCIsMTtBVCtaU0VUPSJGRERfUkVMRUFTRSIsNztBVCtaU0VUPSJMVEVfUkVMRUFTRSIsMTtBVCtaU0VUPSJVRV9QU19SRUxFQVNFIiw1O0FUK1pTRVQ9IlFPU19SRUxFQVNFIiw0O0FUK1pTRVQ9IlRFQlNfVEhSRVNIT0xEIiwwCi1hdGNtZF9zdHJlYW02PUFUK1pTRVQ9Ik1UTkVUX1RFU1QiLDE7QVQrWkdBQVQ9MDtBVCtaU0VUPSJMVEVfSU5GTyIsNjM0ODtBVCtaU0VUPSJWT0lDRV9TVVBQT1JUIiwxO0FUK1pTRVQ9IkZERF9SRUxFQVNFIiw3O0FUK1pTRVQ9IkxURV9SRUxFQVNFIiwxO0FUK1pTRVQ9IlVFX1BTX1JFTEVBU0UiLDU7QVQrWlNFVD0iUU9TX1JFTEVBU0UiLDQ7QVQrWlNFVD0iVEVCU19USFJFU0hPTEQiLDA7QVQrWlNFVD0iSUdOT1JFX1NFQ1VSSVRZX1NVUFBPUlQiLDA7QVQrWlNFVD0iY3NpZmlsdGVyIiwwO0FUK1pTRVQ9ImNzcmhvYmFuZGZsZyIsMDtBVCtaU0VUPSJkbHBhcmFmbGciLDE7QVQrWlNFVD0iY3NpdXAiLDE7QVQrWlNFVD0icmZwYXJhZmxhZyIsMCwwLDEsMDtBVCtaU0VUPSJjc2lpb3QiLDE7QVQrWlNFVD0iRVhDRVBUX1JFU0VUIiwwO0FUK1pTRVQ9IklTSU1fU1VQUE9SVCIsMTtBVCtaSU1TVEVTVD0iTVRORVRfVEVTVCIsMTtBVCtaU0VUPSJNQU5VQUxfU0VBUkNIIiwwCi0jI+S4uuWFpee9keWFpeW6k+iKr+eJh+iupOivgeeJiOacrOa3u+WKoCBlbmQKLSNmb3IgYXVkaW8gY3RybCAKLWF1ZGlvX3ByaW9yaXR5PTAxMjMKLWN1c3RvbWVyX3R5cGU9Ci1kZWJ1Z19tb2RlPQotY3BJbmRDbWRMaXN0PStaTU1JK1pVUkRZK1pVU0xPVCtaSUNDSUReTU9ERStaUEJJQytaTVNSSStDUkVHK0NFUkVHK0NHUkVHK0NHRVYKLXplcGh5cl9maWx0ZXJfaXA9Ci13YWl0X3RpbWVvdXQ9Mgotc250cF9zeW5jX3RpbWU9MQotc250cF9zdGF0aWNfc2VydmVyMD10aW1lLW53Lm5pc3QuZ292Ci1zbnRwX3N0YXRpY19zZXJ2ZXIxPXBvb2wubnRwLm9yZwotc250cF9zdGF0aWNfc2VydmVyMj1ldXJvcGUucG9vbC5udHAub3JnCi12c2ltX2Jpbl9wYXRoPS9tbnQvdXNlcmRhdGEvdlNpbS5iaW4KLWF0X3NlbGVjdF90aW1lb3V0PQotbXRuZXRfdGVzdF9tY2M9KzAwMSswMDIrMDAzKzAwNAotYXRfYXR2PQotYXRfYXRxPQotYXRfYXRfZD0KLWF0X3B0c251bT0KLXF1aWNrX2RpYWw9MQotY2FwX3BvcnRfbmFtZT0vZGV2L3R0eUdTMAotY3VzdG9tSW5kQ21kTGlzdD0KLWRlZnJ0X2NpZD0xCi1NYXhSdHJBZHZJbnRlcnZhbD0xODAwCi1kaGNwc19pbl9jYXA9MQotZ3dfaW5fY2FwPTAKLSN5ZXMtb24gIG5vLW9mZgotY2NfYXRfZGVidWc9bm8KLXhsYXRfZW5hYmxlPTAKLXRlbG9nX3BhdGhfY2FwPQotdGVsb2dfcGF0aD0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2luaXQuZC9yY1MgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9pbml0LmQvcmNTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNzk1OWZlLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2luaXQuZC9yY1MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBTdGFydCBhbGwgaW5pdCBzY3JpcHRzIGluIC9ldGMvcmNTLmQgYW5kIC9ldGMvcmM1LmQKLSMgZXhlY3V0aW5nIHRoZW0gaW4gbnVtZXJpY2FsIG9yZGVyLgotIwotCi0uICAvZXRjL2luaXQuZC9maXJzdC5zaAotCi1zaCAvZXRjL2luaXQuZC9lbnRlcl9hbXQuc2gKLWlmIFsgJD8gLWVxIDAgXTsgdGhlbgotICAgIGVjaG8gImVudGVyIGludG8gYW10IG1vZGUiCi0gICAgZXhpdCAwCi1maQotCi1mb3IgaSBpbiAvZXRjL3JjUy5kL1M/PyogO2RvCi0KLSAgICAgIyBJZ25vcmUgZGFuZ2xpbmcgc3ltbGlua3MgKGlmIGFueSkuCi0gICAgIFsgISAtZiAiJGkiIF0gJiYgY29udGludWUKLQotICAgICBjYXNlICIkaSIgaW4KLQkqLnNoKQotCSAgICAjIFNvdXJjZSBzaGVsbCBzY3JpcHQgZm9yIHNwZWVkLgotCSAgICAoCi0JCXRyYXAgLSBJTlQgUVVJVCBUU1RQCi0JCXNldCBzdGFydAotCQkuICRpCi0JICAgICkKLQkgICAgOzsKLQkqKQotCSAgICAjIE5vIHNoIGV4dGVuc2lvbiwgc28gZm9yayBzdWJwcm9jZXNzLgotCSAgICAkaSBzdGFydAotCSAgICA7OwotICAgIGVzYWMKLWRvbmUKLQotLiAgL2V0Yy9yYy5sb2NhbAotCi1leGl0IDAKLQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvaW5pdC5kL3pjYXRsb2dfY29uZmlnLnNoIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGMvaW5pdC5kL3pjYXRsb2dfY29uZmlnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzY2NDhmLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL2luaXQuZC96Y2F0bG9nX2NvbmZpZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMhL2Jpbi9zaAotCi1yYW1kdW1wX21vZGU9YG52IGdldCByYW1kdW1wX21vZGVgCi0KLWlmIFsgLWUgL3Byb2Mvc3lzL3JhbWR1bXBfYXAvcmFtZHVtcF9zdGFydF9hZGRyIF07IHRoZW4KLSAgaWYgWyAiJHJhbWR1bXBfbW9kZSIgPT0gIkNBUEVNTUMiIF07IHRoZW4KLSAgICByYW1kdW1wX2Rldj1gbnYgZ2V0IHJhbWR1bXBfZW1tY19kZXZpY2VgCi0gICAgaWYgWyAtYiAkcmFtZHVtcF9kZXYgXTsgdGhlbgotICAgICAgIHJhbWR1bXBfc3RhcnQ9YGZkaXNrIC1sIHwgZ3JlcCAkcmFtZHVtcF9kZXYgfCBhd2sgJ3sgcHJpbnQgJDQgfSdgCi0gICAgICAgcmFtZHVtcF9zYXZlX3NpemU9YGZkaXNrIC1sIHwgZ3JlcCAkcmFtZHVtcF9kZXYgfCBhd2sgJ3sgcHJpbnQgJDYgfSdgCi0gICAgICAgZWNobyAkcmFtZHVtcF9zdGFydCA+IC9wcm9jL3N5cy9yYW1kdW1wX2FwL3JhbWR1bXBfc3RhcnRfYWRkcgotICAgICAgIGVjaG8gJHJhbWR1bXBfc2F2ZV9zaXplID4gL3Byb2Mvc3lzL3JhbWR1bXBfYXAvcmFtZHVtcF9lbW1jX3NpemUKLSAgICBlbHNlCi0gICAgICAgZWNobyAiW3p4aWNfcmFtZHVtcF0kcmFtZHVtcF9kZXYgaXMgbm90IGV4aXN0ISIKLSAgICBmaQotICBlbHNlCi0gICAgaWYgWyAtYiAkcmFtZHVtcF9kZXYgXTsgdGhlbgotICAgICAgZWNobyAwID4gL3Byb2Mvc3lzL3JhbWR1bXBfYXAvcmFtZHVtcF9zdGFydF9hZGRyCi0gICAgZmkKLSAgZmkKLWZpCi0jIDAgZm9yIHVzYiwgMSBmb3IgbmV0Ci1pZiBbIC1lIC9wcm9jL3N5cy96Y2F0a2Vybi9sb2dfY29tX21vZGUgXTsgdGhlbgotICB6Y2F0X2NvbV9tb2RlPWBudiBnZXQgemNhdF9tb2RlYAotICBpZiBbICIkemNhdF9jb21fbW9kZSIgPT0gIm5ldCIgXTsgdGhlbgotICAgIGVjaG8gMSA+IC9wcm9jL3N5cy96Y2F0a2Vybi9sb2dfY29tX21vZGUKLSAgZWxzZQotICAgIGVjaG8gMCA+IC9wcm9jL3N5cy96Y2F0a2Vybi9sb2dfY29tX21vZGUKLSAgZmkKLSMgIHNoIC9ldGMvemNhdGxvZ19tb25pdG9yLnNoICYKLWZpCi0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL3Byb2ZpbGUgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Yy9wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOGNiZmRmLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfcmVmL2ZzL25vcm1hbC9yb290ZnMvZXRjL3Byb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotUEFUSD0iL3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW46L21udC9vZW0vYmluIgpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9ldGNfcm8vZGVmYXVsdC9kZWZhdWx0X3BhcmFtZXRlcl9zeXMgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGE3Y2VkNC4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cworKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0KLSMjIyMjI1NPRlRBUNeo08MgU1RBUlQjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2hlY2tfcm9hbT15ZXMKLWdzbV9zaWduYWxiYXIwX2xvdz0wCi1nc21fc2lnbmFsYmFyMF9oaWdoPTAKLWdzbV9zaWduYWxiYXIxX2xvdz0xCi1nc21fc2lnbmFsYmFyMV9oaWdoPTIKLWdzbV9zaWduYWxiYXIyX2xvdz0zCi1nc21fc2lnbmFsYmFyMl9oaWdoPTYKLWdzbV9zaWduYWxiYXIzX2xvdz03Ci1nc21fc2lnbmFsYmFyM19oaWdoPTkKLWdzbV9zaWduYWxiYXI0X2xvdz0xMAotZ3NtX3NpZ25hbGJhcjRfaGlnaD0xMgotZ3NtX3NpZ25hbGJhcjVfbG93PTEzCi1nc21fc2lnbmFsYmFyNV9oaWdoPTMxCi13Y2RtYV9zaWduYWxiYXIwX2xvdz0wCi13Y2RtYV9zaWduYWxiYXIwX2hpZ2g9MAotd2NkbWFfc2lnbmFsYmFyMV9sb3c9MQotd2NkbWFfc2lnbmFsYmFyMV9oaWdoPTgKLXdjZG1hX3NpZ25hbGJhcjJfbG93PTkKLXdjZG1hX3NpZ25hbGJhcjJfaGlnaD0xNgotd2NkbWFfc2lnbmFsYmFyM19sb3c9MTcKLXdjZG1hX3NpZ25hbGJhcjNfaGlnaD0yMgotd2NkbWFfc2lnbmFsYmFyNF9sb3c9MjMKLXdjZG1hX3NpZ25hbGJhcjRfaGlnaD0yOAotd2NkbWFfc2lnbmFsYmFyNV9sb3c9MjkKLXdjZG1hX3NpZ25hbGJhcjVfaGlnaD05MQotdGRzX3NpZ25hbGJhcjBfbG93PTAKLXRkc19zaWduYWxiYXIwX2hpZ2g9MAotdGRzX3NpZ25hbGJhcjFfbG93PTEKLXRkc19zaWduYWxiYXIxX2hpZ2g9OAotdGRzX3NpZ25hbGJhcjJfbG93PTkKLXRkc19zaWduYWxiYXIyX2hpZ2g9MTYKLXRkc19zaWduYWxiYXIzX2xvdz0xNwotdGRzX3NpZ25hbGJhcjNfaGlnaD0yMgotdGRzX3NpZ25hbGJhcjRfbG93PTIzCi10ZHNfc2lnbmFsYmFyNF9oaWdoPTI4Ci10ZHNfc2lnbmFsYmFyNV9sb3c9MjkKLXRkc19zaWduYWxiYXI1X2hpZ2g9OTEKLWx0ZV9zaWduYWxiYXIwX2xvdz0wCi1sdGVfc2lnbmFsYmFyMF9oaWdoPTAKLWx0ZV9zaWduYWxiYXIxX2xvdz0xCi1sdGVfc2lnbmFsYmFyMV9oaWdoPTI1Ci1sdGVfc2lnbmFsYmFyMl9sb3c9MjYKLWx0ZV9zaWduYWxiYXIyX2hpZ2g9MzIKLWx0ZV9zaWduYWxiYXIzX2xvdz0zMwotbHRlX3NpZ25hbGJhcjNfaGlnaD0zOAotbHRlX3NpZ25hbGJhcjRfbG93PTM5Ci1sdGVfc2lnbmFsYmFyNF9oaWdoPTQ0Ci1sdGVfc2lnbmFsYmFyNV9sb3c9NDUKLWx0ZV9zaWduYWxiYXI1X2hpZ2g9OTcKLW5lZWRfY29wc19udW1iZXJfZm9ybWF0PXllcwotbmVlZF9kaXNwbGF5X3NlYXJjaGluZ19zdGF0dXM9eWVzCi1uZWVkX3Jlc3RhcnRfd2hlbl9zaW1faW5zZXJ0PW5vCi1uZWVkX3N1cHBvcnRfcGI9bm8KLW5lZWRfc3VwcG9ydF9zbXM9bm8KLW5ldHdvcmtfbmVlZF9nc209eWVzCi1uZXR3b3JrX25lZWRfdGRzPXllcwotcHJvZHVjdF9tb2RlbD1NRjkxMFcKLXJvYW1fc2V0dGluZ19vcHRpb249b24KLXVzZV9sb2NrX25ldD1ubwotbmV0d29ya19jYXRlZ29yeV9iYXNlZF9vbj1hY3QKLWFkbWluX3VzZXI9YWRtaW4KLWFwcEtleU1vYmlsZT1BMTAwMDAwODUzCi1CcmFuZD1ERU1PCi1ob3N0TmFtZT1kbS53by5jb20uY24KLUludHlwZT1ERU1PCi1NYW51Zj0KLU1vZGVsPQotcG9ydE51bT02MDAxCi1yZWdpc3RlckRtVHlwZT0wCi1zZWNzVGltZT0xCi12ZXJzaW9uUHJldmlvdXM9Ci13YV92ZXJzaW9uPQotT1NWZXJzaW9uPTEKLU9TPVRPUwotdXJsTW9iaWxlPQotRE5TX3Byb3h5PQotI2wueWFuZyBtb2RpZnkgZm90IFQxMDZCVUctMzg3IHN0YXJ0IAotZG5zbWFzcWZpbGU9L21udC91c2VyZGF0YS9sb2cvZG5zbWFzcS5sb2cKLSNsLnlhbmcgbW9kaWZ5IGZvdCBUMTA2QlVHLTM4NyBlbmQKLWRuc21hc3FmaWxlU2l6ZT0xMDI0Ci1sYW5fZG9tYWluX0VuYWJsZWQ9MQotYXV0b19jb25uZWN0X3doZW5fbGltaXRlZD1ubwotaXNfdHJhZmZpY19hbGluZV9vbj1ubwotaXNfdHJhZmZpY19hbGluaW5nPW5vCi1pc190cmFmZmljX2xpbWl0X29uPW5vCi1rZWVwX29ubGluZV93aGVuX2xpbWl0ZWQ9bm8KLXRyYWZmaWNfc21zX251bWJlcj0wCi11cGRhdGVfdHlwZT1taWZpX2ZvdGEKLQotZm90YV9kZXZpY2VfdHlwZT1tZGwKLWZvdGFfbW9kZWxzPVpURTc1MjBWMwotZm90YV9vZW09WlRFCi1mb3RhX3BsYXRmb3JtPVpYMjk3NTIwCi1mb3RhX2RtX3ZlbmRvcj1ycwotZm90YV90b2tlbl9ycz04bXNnemR4eGZ0cnR5czBpcm51aWZoN28KLWZvdGFfcHJvZHVjdF9pZD0xNTUzNzQyMDQxCi1mb3RhX3Byb2R1Y3Rfc2VjcmV0PTIzYjNmYWYyZGFmYjQyZGZiMzM4MmMwZDdkNjYzMTViCi1mb3RhX2FwcF92ZXJzaW9uPTIKLWZvdGFfbmV0d29ya190eXBlPVdJRkkKLWZvdGFfdG9rZW5feng9N0NCRTAxNjQwMEY2NTYyMTc0MEEwNEU3NDJFNkZCMTIKLWZvdGFfZGxfdXJsX3p4PQotZm90YV9jaGtfdXJsX3p4PQotZm90YV9yZWdfdXJsX3p4PQotZm90YV9yZXBvcnRfZGxyX3VybF96eD0KLWZvdGFfcmVwb3J0X3VwZ3JfdXJsX3p4PQotZm90YV9yZXBvcnRfc2FsZXNfdXJsX3p4PQotZm90YV90b2tlbl9ncz05N2E1M2VlOWY0NWFkZmU1M2M3NjJhNzJmODNmNmY0MwotZm90YV9kbF91cmxfZ3M9Ci1mb3RhX2Noa191cmxfZ3M9Ci1mb3RhX3JlZ191cmxfZ3M9Ci1mb3RhX3JlcG9ydF9kbHJfdXJsX2dzPQotZm90YV9yZXBvcnRfdXBncl91cmxfZ3M9Ci1mb3RhX3JlcG9ydF9zYWxlc191cmxfZ3M9Ci1mb3RhX3VwZGF0ZV9zcGFjZV90aHJlc2hvbGQ9ODAwCi1mb3RhX2FiX3VwZ3JhZGVfc3RhdHVzPTYKLWZvdGFfYWJfdXBncmFkZV90b3RhbF9zaXplPTAKLWZvdGFfYWJfdXBncmFkZV91cGRhdGVkX3NpemU9MAotZm90YV9hYl9hYV9zeW5jX3N0YXR1cz0yCi0jbC55YW5nIG1vZGlmeSBmb3QgVDEwNkJVRy0zODcgc3RhcnQKLWZvdGFfYWJfbG9nX3BhdGg9L21udC91c2VyZGF0YS96dGVfZm90YV9hYi91cGlfYWIubG9nCi0jbC55YW5nIG1vZGlmeSBmb3QgVDEwNkJVRy0zODcgZW5kCi1mb3RhX2FhX2F1dG9fc3luYz0wCi1Mb2dpbj1hZG1pbgotUGFzc3dvcmQ9Ci1zbnRwX3NlcnZlcl9jb3VudD0zCi1NQVhfU3RhdGlvbl9udW09MzIKLU1BWF9TdGF0aW9uX251bV9iYWs9MAotTUFYX0FjY2Vzc19udW1fYmJhaz0wCi1NQVhfQ2hpcF9DYXBhYmlsaXR5PTMyCi13aWZpX2tleV9nZW5fdHlwZT1NQUMKLXdpZmlfa2V5X2xlbj04Ci13aWZpX2tleV9vbmx5X2RpZ2l0PXkKLXdpZmlfbHRlX2ludHI9MQotd2lmaV9zc2lkX2dlbl93aXRoX21hY19sYXN0Ynl0ZT02Ci13aWZpX2tleV9nZW5fd2l0aF9tYWNfbGFzdGJ5dGU9OAotd2lmaV9tYWNfbnVtPTIKLXdpZml3YW49d2xhbjAtdnhkCi13aWZpd2FuX21vZGU9ZGhjcAotaWRsZV90aW1lPSI2MDAiCi1wcm9kdWN0X3R5cGU9MQotZXJybm9maWxlPS91c3IvbmV0bG9nL2Vycm5vLmxvZwotZXJybm9maWxlU2l6ZT0xMDI0Ci1ob3RwbHVnZmlsZT0vdXNyL25ldGxvZy9ob3RwbHVnLmxvZwotaG90cGx1Z2ZpbGVTaXplPTEwMjQKLW15bmV0bGlua2ZpbGU9L3Vzci9uZXRsb2cvbXluZXRsaW5rLmxvZwotbXluZXRsaW5rZmlsZVNpemU9MTAyNAotdGVsbmV0ZF9lbmFibGU9bgotCi0jc3lzbG9nZM/gudjF5NbDCi1zeXNsb2dfZmlsZV9zaXplPTEKLXN5c2xvZ19maWxlX251bT01Ci0jamIucWkgY2hhbmdlIGZvciBsb2cgb24gMjAyNDAxMTAgc3RhcnQKLXByaW50X2xldmVsPTEKLXN5c2xvZ19sZXZlbD0xCi0jamIucWkgY2hhbmdlIGZvciBsb2cgb24gMjAyNDAxMTAgZW5kCi0KLXNrYl9kZWJ1Zz0KLXNlY2xvZ19zd2l0Y2g9Ci0jIyMjIyMjIyMjIyMjIyMjU09GVEFQ16jTwyBFTkQjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjI1VTQrbLv9rF5NbDIyMjIyMjIwotCi0jIyMjIyMjIyMjdXNiL3JqNDW1yMjIsM6y5c/gudjCt762IyMjIyMjIyMjIyMjIyMKLSNyajQ1s/XKvNe0zKzCt762Ci1yajQ1X3BsdWdzdGF0ZV9wYXRoPS9zeXMva2VybmVsL2V0aF9kZWJ1Zy9ldGhfc3RhdGUKLSN1c2LN+L/aw/vCt762Ci11c2JfbmFtZV9wYXRoPS9zeXMvZHdjX3VzYi91c2Jjb25maWcvbmV0bmFtZQotI3VzYrj3zfi/2te0zKzCt762Ci11c2JfcGx1Z3N0YXRlX3BhdGg9L3N5cy9kd2NfdXNiL3VzYmNvbmZpZy8KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jzai5/WdwaW+87LLisuWwzqOs08PT2tfUtq+7r7X3ytQKLXVzYl9ncGlvX2RldGVjdD0xCi0KLSPF5NbDyse38dPQueLFzAotY2Ryb21fc3RhdGU9MAotCi0jY2Ryb2212rb+vde2zsO2vtmjujDOqrK70OjSqsO2vtmjrDHOqtDo0qrDtr7Zx9LQ6NKqudLU2L3p1sqjrDLOqrK70OjSqrnS1Ni96dbKIwotbmVlZF9zdXBwb3J0X2Nkcm9tX3N0ZXAyPTAKLSPF5NbDV2luZG93c8/Czfi/qMDg0M0KLXNlbGVjdF90eXBlPXNlbGVjdF9ybmRpcwotCi0jIyMjCi0jxeTWw9HQt6LEo8q9dXNiyeixuLbLv9rX6brPCi11c2JfZGV2aWNlc19kZWJ1Zz1kaWFnLGFkYixzZXJpYWwsYWNtCi0KLQotI8Xk1sPTw7unxKPKvcrHt/HKudPDzfi/qAotdXNiX3ZuaWNfdXNlcj1vbgotCi0jxeTWw9PDu6fEo8q9dXNiyeixuLbLv9rX6brPCi11c2JfZGV2aWNlc191c2VyPWFkYixhY20KLQotI8Xk1sPJ+rL6xKPKvXVzYsnosbi2y7/a1+m6zwotdXNiX2RldmljZXNfZmFjdG9yeT1zZXJpYWwsZGlhZwotCi0jxeTWw0FNVMSjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX2FtdD1zZXJpYWwsZGlhZwotCi0jxeTWw9HQt6LEo8q9YWNttK6/2rj2yv0KLXVzYl9hY21fbnVtX2RlYnVnPTEKLQotI8Xk1sPR0LeixKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV9kZWJ1Zz0xCi0KLSPF5NbD08O7p8Sjyr1hY220rr/auPbK/QotdXNiX2FjbV9udW1fdXNlcj0xCi0KLSPF5NbD08O7p8Sjyr1zZXJpYWy0rr/auPbK/QotdXNiX3NlcmlhbF9udW1fdXNlcj0wCi0KLSPF5NbDyfqy+sSjyr1hY220rr/auPbK/QotdXNiX2FjbV9udW1fZmFjdG9yeT0wCi0KLSPF5NbDyfqy+sSjyr1zZXJpYWy0rr/auPbK/QotdXNiX3NlcmlhbF9udW1fZmFjdG9yeT0xCi0KLSPF5NbDQU1UxKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV9hbXQ9MAotCi0jxeTWw0FNVMSjyr1zZXJpYWy0rr/auPbK/QotdXNiX3NlcmlhbF9udW1fYW10PTIKLQotI3dhbmd6aGVuCi0jxeTWw2RlYnVnxKPKvW1hc3Nfc3RvcmFnZbXEbHVutcTEo8q9Ci11c2JfbHVuX3R5cGVfZGVidWc9TU1DCi0KLSPF5NbDdXNlcsSjyr1tYXNzX3N0b3JhZ2W1xGx1brXExKPKvQotdXNiX2x1bl90eXBlX3VzZXI9TU1DCi0KLSPF5NbDY2Ryb23Eo8q9bWFzc19zdG9yYWdltcRsdW61xMSjyr0KLXVzYl9sdW5fdHlwZV9jZHJvbT1NTUMKLSMjIwotCi0jxeTWw9HQt6LEo8q9zfi/2s6qTkRJU8qxyeixuLXEUElECi1QSURfVFNQX05ESVM9MDU4MgotIyMjCi0KLSPF5NbD0dC3osSjyr3N+L/azqpSTkRJU8qxyeixuLXEUElECi1QSURfVFNQX1JORElTPTA1ODIKLQotI8Xk1sPR0LeixKPKvc34v9rOqkVDTcqxyeixuLXEUElECi1QSURfVFNQX0VDTT0wNTgyCi0KLSPF5NbD0dC3osSjyr3S7LOjyrHJ6LG4tcRQSUQKLVBJRF9URVNUPWZmMDAKLQotI8Xk1sPR2828xKPKvcqxyeixuLXEUElECi1QSURfWVQ9MDU4MAotCi0jxeTWw9HQt6LEo8q9ueLFzENEUk9NtcRQSUQKLVBJRF9UU1BfQ0RST009MDU0OAotCi0jIyMjIwotCi0jxeTWw9PDu6fEo8q9xKPKvbnixcxDRFJPTbXEUElECi1QSURfVVNFUl9DRFJPTT0xMjI1Ci0KLSMjIyMjCi0jIyMjIyMjCi0jxeTWw9PDu6fEo8q9zfi/2s6qUk5ESVPKscnosbi1xFBJRAotUElEX1VTRVJfUk5ESVM9MDU4NQotCi0jxeTWw9PDu6fEo8q9zfi/2s6qRUNNyrHJ6LG4tcRQSUQKLVBJRF9VU0VSX0VDTT0wNTg1Ci0KLSPF5NbD08O7p8Sjyr3N+L/azqpORElTyrHJ6LG4tcRQSUQKLVBJRF9VU0VSX05ESVM9MDU4MwotCi0jxeTWw9PDu6fEo8q9w7vT0M34v9rKscnosbi1xFBJRAotUElEX1VTRVJfTk9WTklDPTA1ODYKLSMjIyMjIwotCi0jxeTWw8vAu/p0cmFwyrHJ6LG4tcRQSUQKLVBJRF9UUkFQPTAxOTcKLQotI8Xk1sPJ+rL6xKPKvcqxyeixuLXEUElECi1QSURfRkFDVE9SWT0wNTM0Ci0KLSPF5NbDQU1UxKPKvcqxyeixuLXEUElECi1QSURfQU1UPTAyMDEKLQotI8Xk1sO52Lv6s+S158qxyeixuLXEUElECi1QSURfRkFTVFBPV0VST0ZGPTIwMDQKLQotI8Xk1sPJ6LG4tcRWSUQKLVZJRF9UU1A9MTlEMgotCi0jxeTWw8rHt/HTw2NoaXBpZNf3zqrJ6LG4tcRpU2VyaWFs19a3+7SuCi11c2Jfc2VybnVtX2NoaXBpZD0wCi0KLSPF5NbDyeixuLXEaVNlcmlhbNfWt/u0rgotU0VSSUFMX1RTUD0xMjM0NTY3ODkwQUJDREVGCi0KLSPF5NbD0dC3osSjyr3J6LG4tcRSZWxlYXNlSUQKLVJFTEVBU0VJRF9UU1A9MDEwMAotCi0jxeTWw9PDu6fEo8q9yeixuLXEUmVsZWFzZUlECi1SRUxFQVNFSURfVVNFUj0wMTAxCi0KLSPF5NbDyeixuLXEbWFudWZhY3R1cmVy19a3+7SuCi1NQU5VRkFDVFVSRVJfVFNQPURFTU8sSW5jb3Jwb3JhdGVkCi0KLSPF5NbDyeixuLXEcHJvZHVjdNfWt/u0rgotUFJPRFVDVF9UU1A9REVNTyBNb2JpbGUgQm9hcmRiYW5kCi0KLSPF5NbDyeixuLXEY29uZmln19a3+7SuCi1DT05GSUdfVFNQPURFTU8gQ29uZmlndXJhdGlvbgotCi0jY2Ryb20gbHVutcR2ZW5kb3LX1rf7tK4KLVZFTkRPUl9NU19DRFJPTT1ERU1PCi0KLSNjZHJvbSBsdW61xHByb2R1Y3TX1rf7tK4KLVBST0RVQ1RfTVNfQ0RST009VVNCIFNDU0kgQ0QtUk9NCi0KLSNjZHJvbSBsdW61xHJlbGVhc2XX1rf7tK4KLVJFTEVBU0VfTVNfQ0RST009Mi4zMQotCi0jY2Ryb20gbHVutcRpbnF1aXJ519a3+7SuCi1JTlFVSVJZX01TX0NEUk9NPURFTU8gVVNCIFNDU0kgQ0QtUk9NIDIuMzEKLSNtbWMgbHVutcR2ZW5kb3LX1rf7tK4KLVZFTkRPUl9NU19NTUM9REVNTwotCi0jbW1jIGx1brXEcHJvZHVjdNfWt/u0rgotUFJPRFVDVF9NU19NTUM9TU1DIFN0b3JhZ2UKLQotI21tYyBsdW61xHJlbGVhc2XX1rf7tK4KLVJFTEVBU0VfTVNfTU1DPTIuMzEKLQotI1NEvenWysK3vrYKLXVzYl90Y2FyZF9sdW5fcGF0aD0vZGV2L21tY2JsazAKLQotI21tYyBsdW61xGlucXVpcnnX1rf7tK4KLUlOUVVJUllfTVNfTU1DPURFTU8gTU1DIFN0b3JhZ2UgMi4zMQotCi0jxeTWw0VDTc34v6i49sr9Ci1FQ01fTlVNPTEKLQotI8Xk1sNSTkRJU834v6jX7rTz1+mw/Mr9Ci1STkRJU19QS1RfTlVNPTEwCi0KLQotIyMjsqjM2MLK19TKytOmv6q52CMjIwotc2VsZl9hZGFwdGlvbl9wb3J0PQotIyMjxLPQqbbLv9qyu9Do0qrP8tOm08PJz7Gotsu/2te8sbi6w8/7z6IjIyMKLSN4Zi5saSBtb2RpZnkgZm9yIG9wZW4gdWFydDEKLW5vdGlmeV9mb3JiaWRlbl9wb3J0cz0vZGV2L3R0eVMwCi0jeGYubGkgbW9kaWZ5IGZvciBvcGVuIHVhcnQxCi0KLSMjI2FkYsSsyM+50tTYusssMDphcDsxOmNhcCMjIwotYWRiX2NvcmVfaWQ9MQotIyMjIyMjVVNCtsu/2sXk1sNFTkQjIyMjIyMjCi0KLSMjIyMjI0NQsuBOVsXk1sPQxc+iIyMjIyMjIwotI8Tasr/I7bz+sOaxvrrFCi16dmVyc2lvbj1LMzE4VjEuMC4wQjAzCi0jzeKyv8jtvP6w5rG+usUKLXpjZ21yPURFTU9fVjEuMC4wQjAzCi0j07K8/rDmsb66xQotemh2ZXI9VjAuMQotI8Tasr+7+tDNCi16Y2dtbT1LMzE4Ci0jzeKyv7v60M0KLXpjZ213PUszMTgKLSOzp8nM0MXPogotemNnbWk9REVNTwotI1NTSUS6xQotenNzaWQ9MAotI1dpZmlLZXm1xNa1Ci16d2lmaWtleT0wCi0jy/jN+NfutPO94sv4tM7K/aOsy/jN+MSjv+nKudPDCi16dW5sb2NrdGltZXM9MAotI7Dmsb7Eo8q9wODQzaOs1f2zo7Dmsb4vudKy4LDmsb4KLXp2ZXJzaW9ubW9kZT0wCi0j1sfE3LbM0MW5psTcv6q52AotemlzbXM9MAotI0RNuabE3L+qudgsMDq52LHVo6wx0sa2r6OsMsGqzaijrDO159DFCi16ZG1yZWc9MAotI8GqzahETSDXorLhv6q7+rXItP3KsbzkLCAxfjYwINPQ0KejrLWlzru31tbTo6zG5Mv7yv3WtTogzt7Qp9a1Ci16ZG1yZWd0aW1lPTAKLQotI7mkvt96bG9nX2FnZW50tObIoQotemNhdF9tb2RlPUNQVVNCCi16bG9nX251bT0xMAotemxvZ19zaXplPTEwMAotI2piLnFpIGNoYW5nZSBmb3IgbnZfbG9nIG9uIDIwMjQwMTEwIHN0YXJ0Ci16bG9nX3BhdGg9L21udC9vZW1kYXRhL3pjYXQKLXJ1bGVfZmlsZT0vZXRjX3JvL2xvZ3J1bGUvYWxsXzMucnVsZQotI2piLnFpIGNoYW5nZSBmb3IgbnZfbG9nIG9uIDIwMjQwMTEwIGVuZAotCi0jcmFtZHVtcLTmtKLEo8q9Ci0jbm8sYXV0byx5ZXMKLXJhbWR1bXBfZXhwb3J0PW5vCi0jVVNCIG9yIENBUEVNTUMgb3IgQ0FQRkxBU0gKLXJhbWR1bXBfbW9kZT1VU0IKLXJhbWR1bXBfZW1tY19kZXZpY2U9L2Rldi9tbWNibGsxcDEKLXJhbWR1bXBfZmxhc2hfZGV2aWNlPS9kZXYvbXRkMTcKLXJhbWR1bXBfcGF0aD0vbW50L29lbWRhdGEKLQotI9XVz+C7+s28xqy31rHmwsrP1Mq+v9jWxgotemNhbWVyYV9pbnRlcnByb2xhdGlvbj0xCi0j19S2r8vRzfi3vcq9zfjC573TyOu0ztDyCi1hdXRvX2FjcW9yZGVyPTEyCi0jIyMjIyNDULLgTlbF5NbD0MXPokVORCMjIyMjIyMKLSNmb3Igdm9sdGUKLU1UTkVUX1RFU1Q9MAotTlNJT1RfVEVTVD0wCi1hbXJ3PTEKLWN2bW9kX2ltcz0zCi1FTV9DQUxMX1NVUFBPUlQ9MAotRU1DQUxMX1RPX05PUk1BTD0wCi1JTVNfQVBOPQotSU1TX0NPTkZVUkk9Ci1JTVNfQ0NfVVJJX1RZUEU9MAotSU1TX1NNU19VUklfVFlQRT0wCi1JTVNfUkVHX0VYUElSRVM9NjAwMDAwCi1JTVNfUkVHX1NVQl9FWFBJUkVTPTYwMDAwMAotTkVUX0lNU19DQVA9MAotVURQX1RIUkVTSD0xMzAwCi1JUFNFQ19ESVNBQkxFPTAKLVBSRUNPTkRUSU9OX05PVF9TVVBQT1JUPTAKLVdBSVRfUlBUX1RJTUU9MTAwMAotT0NUX0FMR05fQU1SPTAKLVNNU19PVkVSX0lQPTEKLUlNU19VU0VSX0FHRU5UPQotQlNGX1BPUlQ9ODA4MAotWENBUF9QT1JUPTgwCi1VVF9BUE49Ci0zODBfVEhFTl9DU0ZCPTAKLURUTUZfUkZDNDczMz0wCi1ESUFMT0dfRk9SSz0wCi1EQVRBX0NFTlRSSUM9MAotbm90X3N1cHBfaG1hY19zaGExXzk2PTAKLW5vdF9zdXBwX2htYWNfbWQ1Xzk2PTAKLW5vdF9zdXBwX2Rlc19lZGUzX2NiYz0wCi1ub3Rfc3VwcF9hZXNfY2JjPTAKLUlNU19QQ1NDRl9QT1JUPTUwNjAKLUdfSU1TX0NNR0Y9MAotRUNBTExfTVRURVNUPTAKLSNqYi5xaSBjaGFuZ2UgZm9yIFQxMDZCVUctNjU1IHN0YXJ0Ci1QT1dFUl9DT05UUk9MPTEKLSNqYi5xaSBjaGFuZ2UgZm9yIFQxMDZCVUctNjU1IGVuZAotTk9UX0tFRVBfVENQX0NPTk49MQotVDMzOTZfU1VQUE9SVD0wCi1UMzM5Nl9DQVVTRV9SRUFTT049OCwyNywzMiwzMwotVDMzOTZfRFVSQVRJT049NzIwCi1UMzM5Nl9DT1VOVFM9MwotRUNBTExfVDJfVElNRVI9MzYwMAotTkdFQ0FMTF9GT1JURVNUPTAKLUNVU1RPTUVSX0ZMQUc9MAotI2ZvciB2b2x0ZSBlbmQKLURFQlVHX0lORk9fRElTQUJMRT0wCi1ERUJVR19JTkZPX0ZJTEVfUEFUSD0vbW50L3VzZXJkYXRhCi1ERUJVR19JTkZPX0ZJTEVfTlVNPTIKLURFQlVHX0lORk9fRklMRV9UT1RBTF9TSVpFPTEKLSNkZWJ1ZyBpbmZvIGVuZApkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19yZWYvZnMvbm9ybWFsL3Jvb3Rmcy9zYmluL2ZkaXNrX2VtbWMuc2ggYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL3NiaW4vZmRpc2tfZW1tYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDkyZjkzNC4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtY29yZS9pbWFnZXMvZmlsZXMvengyOTc1MjB2My92ZWhpY2xlX2RjX3JlZi9mcy9ub3JtYWwvcm9vdGZzL3NiaW4vZmRpc2tfZW1tYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMhL2Jpbi9zaAotCi1mZGlzayAvZGV2L21tY2JsazEgPDxFT0YKLWQKLTUKLWQKLTQKLWQKLTMKLWQKLTIKLWQKLTEKLW4KLXAKLTEgCi0KLSsyMDBNCi1uCi1wCi0yCi0KLSsyMDQ4TQotbgotcAotMwotCi0rMjA0OE0KLW4KLWUKLQotCi1uCi0KLQotdwotRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19zeXN0ZW1kL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfc3lzIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19zeXN0ZW1kL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfc3lzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2MxYWQ3Li4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfc3lzdGVtZC9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3N5cworKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0KLSMjIyMjI1NPRlRBUNeo08MgU1RBUlQjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2hlY2tfcm9hbT15ZXMKLWdzbV9zaWduYWxiYXIwX2xvdz0wCi1nc21fc2lnbmFsYmFyMF9oaWdoPTAKLWdzbV9zaWduYWxiYXIxX2xvdz0xCi1nc21fc2lnbmFsYmFyMV9oaWdoPTIKLWdzbV9zaWduYWxiYXIyX2xvdz0zCi1nc21fc2lnbmFsYmFyMl9oaWdoPTYKLWdzbV9zaWduYWxiYXIzX2xvdz03Ci1nc21fc2lnbmFsYmFyM19oaWdoPTkKLWdzbV9zaWduYWxiYXI0X2xvdz0xMAotZ3NtX3NpZ25hbGJhcjRfaGlnaD0xMgotZ3NtX3NpZ25hbGJhcjVfbG93PTEzCi1nc21fc2lnbmFsYmFyNV9oaWdoPTMxCi13Y2RtYV9zaWduYWxiYXIwX2xvdz0wCi13Y2RtYV9zaWduYWxiYXIwX2hpZ2g9MAotd2NkbWFfc2lnbmFsYmFyMV9sb3c9MQotd2NkbWFfc2lnbmFsYmFyMV9oaWdoPTgKLXdjZG1hX3NpZ25hbGJhcjJfbG93PTkKLXdjZG1hX3NpZ25hbGJhcjJfaGlnaD0xNgotd2NkbWFfc2lnbmFsYmFyM19sb3c9MTcKLXdjZG1hX3NpZ25hbGJhcjNfaGlnaD0yMgotd2NkbWFfc2lnbmFsYmFyNF9sb3c9MjMKLXdjZG1hX3NpZ25hbGJhcjRfaGlnaD0yOAotd2NkbWFfc2lnbmFsYmFyNV9sb3c9MjkKLXdjZG1hX3NpZ25hbGJhcjVfaGlnaD05MQotdGRzX3NpZ25hbGJhcjBfbG93PTAKLXRkc19zaWduYWxiYXIwX2hpZ2g9MAotdGRzX3NpZ25hbGJhcjFfbG93PTEKLXRkc19zaWduYWxiYXIxX2hpZ2g9OAotdGRzX3NpZ25hbGJhcjJfbG93PTkKLXRkc19zaWduYWxiYXIyX2hpZ2g9MTYKLXRkc19zaWduYWxiYXIzX2xvdz0xNwotdGRzX3NpZ25hbGJhcjNfaGlnaD0yMgotdGRzX3NpZ25hbGJhcjRfbG93PTIzCi10ZHNfc2lnbmFsYmFyNF9oaWdoPTI4Ci10ZHNfc2lnbmFsYmFyNV9sb3c9MjkKLXRkc19zaWduYWxiYXI1X2hpZ2g9OTEKLWx0ZV9zaWduYWxiYXIwX2xvdz0wCi1sdGVfc2lnbmFsYmFyMF9oaWdoPTAKLWx0ZV9zaWduYWxiYXIxX2xvdz0xCi1sdGVfc2lnbmFsYmFyMV9oaWdoPTI1Ci1sdGVfc2lnbmFsYmFyMl9sb3c9MjYKLWx0ZV9zaWduYWxiYXIyX2hpZ2g9MzIKLWx0ZV9zaWduYWxiYXIzX2xvdz0zMwotbHRlX3NpZ25hbGJhcjNfaGlnaD0zOAotbHRlX3NpZ25hbGJhcjRfbG93PTM5Ci1sdGVfc2lnbmFsYmFyNF9oaWdoPTQ0Ci1sdGVfc2lnbmFsYmFyNV9sb3c9NDUKLWx0ZV9zaWduYWxiYXI1X2hpZ2g9OTcKLW5lZWRfY29wc19udW1iZXJfZm9ybWF0PXllcwotbmVlZF9kaXNwbGF5X3NlYXJjaGluZ19zdGF0dXM9eWVzCi1uZWVkX3Jlc3RhcnRfd2hlbl9zaW1faW5zZXJ0PW5vCi1uZWVkX3N1cHBvcnRfcGI9bm8KLW5lZWRfc3VwcG9ydF9zbXM9bm8KLW5ldHdvcmtfbmVlZF9nc209eWVzCi1uZXR3b3JrX25lZWRfdGRzPXllcwotcHJvZHVjdF9tb2RlbD1NRjkxMFcKLXJvYW1fc2V0dGluZ19vcHRpb249b24KLXVzZV9sb2NrX25ldD1ubwotbmV0d29ya19jYXRlZ29yeV9iYXNlZF9vbj1hY3QKLWFkbWluX3VzZXI9YWRtaW4KLWFwcEtleU1vYmlsZT1BMTAwMDAwODUzCi1CcmFuZD1ERU1PCi1ob3N0TmFtZT1kbS53by5jb20uY24KLUludHlwZT1ERU1PCi1NYW51Zj0KLU1vZGVsPQotcG9ydE51bT02MDAxCi1yZWdpc3RlckRtVHlwZT0wCi1zZWNzVGltZT0xCi12ZXJzaW9uUHJldmlvdXM9Ci13YV92ZXJzaW9uPQotT1NWZXJzaW9uPTEKLU9TPVRPUwotdXJsTW9iaWxlPQotRE5TX3Byb3h5PQotZG5zbWFzcWZpbGU9L21udC91c2VyZGF0YS9sb2cvZG5zbWFzcS5sb2cKLWRuc21hc3FmaWxlU2l6ZT0xMDI0Ci1sYW5fZG9tYWluX0VuYWJsZWQ9MQotYXV0b19jb25uZWN0X3doZW5fbGltaXRlZD1ubwotaXNfdHJhZmZpY19hbGluZV9vbj1ubwotaXNfdHJhZmZpY19hbGluaW5nPW5vCi1pc190cmFmZmljX2xpbWl0X29uPW5vCi1rZWVwX29ubGluZV93aGVuX2xpbWl0ZWQ9bm8KLXRyYWZmaWNfc21zX251bWJlcj0wCi11cGRhdGVfdHlwZT1taWZpX2ZvdGEKLQotZm90YV9kZXZpY2VfdHlwZT1tZGwKLWZvdGFfbW9kZWxzPVpURTc1MjBWMwotZm90YV9vZW09WlRFCi1mb3RhX3BsYXRmb3JtPVpYMjk3NTIwCi1mb3RhX2RtX3ZlbmRvcj1ycwotZm90YV90b2tlbl9ycz04bXNnemR4eGZ0cnR5czBpcm51aWZoN28KLWZvdGFfcHJvZHVjdF9pZD0xNTUzNzQyMDQxCi1mb3RhX3Byb2R1Y3Rfc2VjcmV0PTIzYjNmYWYyZGFmYjQyZGZiMzM4MmMwZDdkNjYzMTViCi1mb3RhX2FwcF92ZXJzaW9uPTIKLWZvdGFfbmV0d29ya190eXBlPVdJRkkKLWZvdGFfdG9rZW5feng9N0NCRTAxNjQwMEY2NTYyMTc0MEEwNEU3NDJFNkZCMTIKLWZvdGFfZGxfdXJsX3p4PQotZm90YV9jaGtfdXJsX3p4PQotZm90YV9yZWdfdXJsX3p4PQotZm90YV9yZXBvcnRfZGxyX3VybF96eD0KLWZvdGFfcmVwb3J0X3VwZ3JfdXJsX3p4PQotZm90YV9yZXBvcnRfc2FsZXNfdXJsX3p4PQotZm90YV90b2tlbl9ncz05N2E1M2VlOWY0NWFkZmU1M2M3NjJhNzJmODNmNmY0MwotZm90YV9kbF91cmxfZ3M9Ci1mb3RhX2Noa191cmxfZ3M9Ci1mb3RhX3JlZ191cmxfZ3M9Ci1mb3RhX3JlcG9ydF9kbHJfdXJsX2dzPQotZm90YV9yZXBvcnRfdXBncl91cmxfZ3M9Ci1mb3RhX3JlcG9ydF9zYWxlc191cmxfZ3M9Ci1mb3RhX3VwZGF0ZV9zcGFjZV90aHJlc2hvbGQ9ODAwCi1mb3RhX2FiX3VwZ3JhZGVfc3RhdHVzPTYKLWZvdGFfYWJfdXBncmFkZV90b3RhbF9zaXplPTAKLWZvdGFfYWJfdXBncmFkZV91cGRhdGVkX3NpemU9MAotZm90YV9hYl9hYV9zeW5jX3N0YXR1cz0yCi1mb3RhX2FiX2xvZ19wYXRoPS9tbnQvdXNlcmRhdGEvenRlX2ZvdGFfYWIvdXBpX2FiLmxvZwotZm90YV9hYV9hdXRvX3N5bmM9MAotTG9naW49YWRtaW4KLVBhc3N3b3JkPQotc250cF9zZXJ2ZXJfY291bnQ9MwotTUFYX1N0YXRpb25fbnVtPTMyCi1NQVhfU3RhdGlvbl9udW1fYmFrPTAKLU1BWF9BY2Nlc3NfbnVtX2JiYWs9MAotTUFYX0NoaXBfQ2FwYWJpbGl0eT0zMgotd2lmaV9rZXlfZ2VuX3R5cGU9TUFDCi13aWZpX2tleV9sZW49OAotd2lmaV9rZXlfb25seV9kaWdpdD15Ci13aWZpX2x0ZV9pbnRyPTEKLXdpZmlfc3NpZF9nZW5fd2l0aF9tYWNfbGFzdGJ5dGU9Ngotd2lmaV9rZXlfZ2VuX3dpdGhfbWFjX2xhc3RieXRlPTgKLXdpZmlfbWFjX251bT0yCi13aWZpd2FuPXdsYW4wLXZ4ZAotd2lmaXdhbl9tb2RlPWRoY3AKLWlkbGVfdGltZT0iNjAwIgotcHJvZHVjdF90eXBlPTEKLWVycm5vZmlsZT0vdXNyL25ldGxvZy9lcnJuby5sb2cKLWVycm5vZmlsZVNpemU9MTAyNAotaG90cGx1Z2ZpbGU9L3Vzci9uZXRsb2cvaG90cGx1Zy5sb2cKLWhvdHBsdWdmaWxlU2l6ZT0xMDI0Ci1teW5ldGxpbmtmaWxlPS91c3IvbmV0bG9nL215bmV0bGluay5sb2cKLW15bmV0bGlua2ZpbGVTaXplPTEwMjQKLXRlbG5ldGRfZW5hYmxlPW4KLQotI3N5c2xvZ2TP4LnYxeTWwwotc3lzbG9nX2ZpbGVfc2l6ZT0xCi1zeXNsb2dfZmlsZV9udW09NQotcHJpbnRfbGV2ZWw9Mgotc3lzbG9nX2xldmVsPTQKLQotc2tiX2RlYnVnPQotc2VjbG9nX3N3aXRjaD0KLSMjIyMjIyMjIyMjIyMjIyNTT0ZUQVDXqNPDIEVORCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjVVNCtsu/2sXk1sMjIyMjIyMjCi0KLSMjIyMjIyMjIyN1c2Ivcmo0NbXIyMiwzrLlz+C52MK3vrYjIyMjIyMjIyMjIyMjIwotI3JqNDWz9cq817TMrMK3vrYKLXJqNDVfcGx1Z3N0YXRlX3BhdGg9L3N5cy9rZXJuZWwvZXRoX2RlYnVnL2V0aF9zdGF0ZQotI3VzYs34v9rD+8K3vrYKLXVzYl9uYW1lX3BhdGg9L3N5cy9kd2NfdXNiL3VzYmNvbmZpZy9uZXRuYW1lCi0jdXNiuPfN+L/a17TMrMK3vrYKLXVzYl9wbHVnc3RhdGVfcGF0aD0vc3lzL2R3Y191c2IvdXNiY29uZmlnLwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSPNqLn9Z3Bpb7zssuKy5bDOo6zTw9Pa19S2r7uvtffK1AotdXNiX2dwaW9fZGV0ZWN0PTEKLQotI8Xk1sPKx7fx09C54sXMCi1jZHJvbV9zdGF0ZT0wCi0KLSNjZHJvbbXatv6917bOw7a+2aO6MM6qsrvQ6NKqw7a+2aOsMc6q0OjSqsO2vtnH0tDo0qq50tTYvenWyqOsMs6qsrvQ6NKqudLU2L3p1sojCi1uZWVkX3N1cHBvcnRfY2Ryb21fc3RlcDI9MAotI8Xk1sNXaW5kb3dzz8LN+L+owODQzQotc2VsZWN0X3R5cGU9c2VsZWN0X3JuZGlzCi0KLSMjIyMKLSPF5NbD0dC3osSjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX2RlYnVnPWRpYWcsYWRiLHNlcmlhbCxhY20KLQotCi0jxeTWw9PDu6fEo8q9yse38cq508PN+L+oCi11c2Jfdm5pY191c2VyPW9uCi0KLSPF5NbD08O7p8Sjyr11c2LJ6LG4tsu/2tfpus8KLXVzYl9kZXZpY2VzX3VzZXI9YWRiLGFjbQotCi0jxeTWw8n6svrEo8q9dXNiyeixuLbLv9rX6brPCi11c2JfZGV2aWNlc19mYWN0b3J5PXNlcmlhbCxkaWFnCi0KLSPF5NbDQU1UxKPKvXVzYsnosbi2y7/a1+m6zwotdXNiX2RldmljZXNfYW10PXNlcmlhbCxkaWFnCi0KLSPF5NbD0dC3osSjyr1hY220rr/auPbK/QotdXNiX2FjbV9udW1fZGVidWc9MQotCi0jxeTWw9HQt6LEo8q9c2VyaWFstK6/2rj2yv0KLXVzYl9zZXJpYWxfbnVtX2RlYnVnPTEKLQotI8Xk1sPTw7unxKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV91c2VyPTEKLQotI8Xk1sPTw7unxKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV91c2VyPTAKLQotI8Xk1sPJ+rL6xKPKvWFjbbSuv9q49sr9Ci11c2JfYWNtX251bV9mYWN0b3J5PTAKLQotI8Xk1sPJ+rL6xKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV9mYWN0b3J5PTEKLQotI8Xk1sNBTVTEo8q9YWNttK6/2rj2yv0KLXVzYl9hY21fbnVtX2FtdD0wCi0KLSPF5NbDQU1UxKPKvXNlcmlhbLSuv9q49sr9Ci11c2Jfc2VyaWFsX251bV9hbXQ9MgotCi0jd2FuZ3poZW4KLSPF5NbDZGVidWfEo8q9bWFzc19zdG9yYWdltcRsdW61xMSjyr0KLXVzYl9sdW5fdHlwZV9kZWJ1Zz1NTUMKLQotI8Xk1sN1c2VyxKPKvW1hc3Nfc3RvcmFnZbXEbHVutcTEo8q9Ci11c2JfbHVuX3R5cGVfdXNlcj1NTUMKLQotI8Xk1sNjZHJvbcSjyr1tYXNzX3N0b3JhZ2W1xGx1brXExKPKvQotdXNiX2x1bl90eXBlX2Nkcm9tPU1NQwotIyMjCi0KLSPF5NbD0dC3osSjyr3N+L/azqpORElTyrHJ6LG4tcRQSUQKLVBJRF9UU1BfTkRJUz0wNTgyCi0jIyMKLQotI8Xk1sPR0LeixKPKvc34v9rOqlJORElTyrHJ6LG4tcRQSUQKLVBJRF9UU1BfUk5ESVM9MDU4MgotCi0jxeTWw9HQt6LEo8q9zfi/2s6qRUNNyrHJ6LG4tcRQSUQKLVBJRF9UU1BfRUNNPTA1ODIKLQotI8Xk1sPR0LeixKPKvdLss6PKscnosbi1xFBJRAotUElEX1RFU1Q9ZmYwMAotCi0jxeTWw9HbzbzEo8q9yrHJ6LG4tcRQSUQKLVBJRF9ZVD0wNTgwCi0KLSPF5NbD0dC3osSjyr254sXMQ0RST021xFBJRAotUElEX1RTUF9DRFJPTT0wNTQ4Ci0KLSMjIyMjCi0KLSPF5NbD08O7p8Sjyr3Eo8q9ueLFzENEUk9NtcRQSUQKLVBJRF9VU0VSX0NEUk9NPTEyMjUKLQotIyMjIyMKLSMjIyMjIyMKLSPF5NbD08O7p8Sjyr3N+L/azqpSTkRJU8qxyeixuLXEUElECi1QSURfVVNFUl9STkRJUz0wNTg1Ci0KLSPF5NbD08O7p8Sjyr3N+L/azqpFQ03Kscnosbi1xFBJRAotUElEX1VTRVJfRUNNPTA1ODUKLQotI8Xk1sPTw7unxKPKvc34v9rOqk5ESVPKscnosbi1xFBJRAotUElEX1VTRVJfTkRJUz0wNTgzCi0KLSPF5NbD08O7p8Sjyr3Du9PQzfi/2sqxyeixuLXEUElECi1QSURfVVNFUl9OT1ZOSUM9MDU4NgotIyMjIyMjCi0KLSPF5NbDy8C7+nRyYXDKscnosbi1xFBJRAotUElEX1RSQVA9MDE5NwotCi0jxeTWw8n6svrEo8q9yrHJ6LG4tcRQSUQKLVBJRF9GQUNUT1JZPTA1MzQKLQotI8Xk1sNBTVTEo8q9yrHJ6LG4tcRQSUQKLVBJRF9BTVQ9MDIwMQotCi0jxeTWw7nYu/qz5LXnyrHJ6LG4tcRQSUQKLVBJRF9GQVNUUE9XRVJPRkY9MjAwNAotCi0jxeTWw8nosbi1xFZJRAotVklEX1RTUD0xOUQyCi0KLSPF5NbDyse38dPDY2hpcGlk1/fOqsnosbi1xGlTZXJpYWzX1rf7tK4KLXVzYl9zZXJudW1fY2hpcGlkPTAKLQotI8Xk1sPJ6LG4tcRpU2VyaWFs19a3+7SuCi1TRVJJQUxfVFNQPTEyMzQ1Njc4OTBBQkNERUYKLQotI8Xk1sPR0LeixKPKvcnosbi1xFJlbGVhc2VJRAotUkVMRUFTRUlEX1RTUD0wMTAwCi0KLSPF5NbD08O7p8Sjyr3J6LG4tcRSZWxlYXNlSUQKLVJFTEVBU0VJRF9VU0VSPTAxMDEKLQotI8Xk1sPJ6LG4tcRtYW51ZmFjdHVyZXLX1rf7tK4KLU1BTlVGQUNUVVJFUl9UU1A9REVNTyxJbmNvcnBvcmF0ZWQKLQotI8Xk1sPJ6LG4tcRwcm9kdWN019a3+7SuCi1QUk9EVUNUX1RTUD1ERU1PIE1vYmlsZSBCb2FyZGJhbmQKLQotI8Xk1sPJ6LG4tcRjb25maWfX1rf7tK4KLUNPTkZJR19UU1A9REVNTyBDb25maWd1cmF0aW9uCi0KLSNjZHJvbSBsdW61xHZlbmRvctfWt/u0rgotVkVORE9SX01TX0NEUk9NPURFTU8KLQotI2Nkcm9tIGx1brXEcHJvZHVjdNfWt/u0rgotUFJPRFVDVF9NU19DRFJPTT1VU0IgU0NTSSBDRC1ST00KLQotI2Nkcm9tIGx1brXEcmVsZWFzZdfWt/u0rgotUkVMRUFTRV9NU19DRFJPTT0yLjMxCi0KLSNjZHJvbSBsdW61xGlucXVpcnnX1rf7tK4KLUlOUVVJUllfTVNfQ0RST009REVNTyBVU0IgU0NTSSBDRC1ST00gMi4zMQotI21tYyBsdW61xHZlbmRvctfWt/u0rgotVkVORE9SX01TX01NQz1ERU1PCi0KLSNtbWMgbHVutcRwcm9kdWN019a3+7SuCi1QUk9EVUNUX01TX01NQz1NTUMgU3RvcmFnZQotCi0jbW1jIGx1brXEcmVsZWFzZdfWt/u0rgotUkVMRUFTRV9NU19NTUM9Mi4zMQotCi0jU0S96dbKwre+tgotdXNiX3RjYXJkX2x1bl9wYXRoPS9kZXYvbW1jYmxrMAotCi0jbW1jIGx1brXEaW5xdWlyedfWt/u0rgotSU5RVUlSWV9NU19NTUM9REVNTyBNTUMgU3RvcmFnZSAyLjMxCi0KLSPF5NbDRUNNzfi/qLj2yv0KLUVDTV9OVU09MQotCi0jxeTWw1JORElTzfi/qNfutPPX6bD8yv0KLVJORElTX1BLVF9OVU09MTAKLQotCi0jIyOyqMzYwsrX1MrK06a/qrnYIyMjCi1zZWxmX2FkYXB0aW9uX3BvcnQ9Ci0jIyPEs9Cptsu/2rK70OjSqs/y06bTw8nPsai2y7/a17yxuLrDz/vPoiMjIwotbm90aWZ5X2ZvcmJpZGVuX3BvcnRzPQotCi0jIyNhZGLErMjPudLU2LrLLDA6YXA7MTpjYXAjIyMKLWFkYl9jb3JlX2lkPTEKLSMjIyMjI1VTQrbLv9rF5NbDRU5EIyMjIyMjIwotCi0jIyMjIyNDULLgTlbF5NbD0MXPoiMjIyMjIyMKLSPE2rK/yO28/rDmsb66xQotenZlcnNpb249SzMxOFYxLjAuMEIwMwotI83isr/I7bz+sOaxvrrFCi16Y2dtcj1ERU1PX1YxLjAuMEIwMwotI9OyvP6w5rG+usUKLXpodmVyPVYwLjEKLSPE2rK/u/rQzQotemNnbW09SzMxOAotI83isr+7+tDNCi16Y2dtdz1LMzE4Ci0js6fJzNDFz6IKLXpjZ21pPURFTU8KLSNTU0lEusUKLXpzc2lkPTAKLSNXaWZpS2V5tcTWtQotendpZmlrZXk9MAotI8v4zfjX7rTzveLL+LTOyv2jrMv4zfjEo7/pyrnTwwotenVubG9ja3RpbWVzPTAKLSOw5rG+xKPKvcDg0M2jrNX9s6Ow5rG+L7nSsuCw5rG+Ci16dmVyc2lvbm1vZGU9MAotI9bHxNy2zNDFuabE3L+qudgKLXppc21zPTAKLSNETbmmxNy/qrnYLDA6udix1aOsMdLGtq+jrDLBqs2oo6wztefQxQotemRtcmVnPTAKLSPBqs2oRE0g16Ky4b+qu/q1yLT9yrG85CwgMX42MCDT0NCno6y1pc67t9bW06OsxuTL+8r91rU6IM7e0KfWtQotemRtcmVndGltZT0wCi0KLSO5pL7femxvZ19hZ2VudLTmyKEKLXpjYXRfbW9kZT1DUFVTQgotemxvZ19udW09MTAKLXpsb2dfc2l6ZT0xMDAKLXpsb2dfcGF0aD0vbW50L3VzZXJkYXRhL3pjYXQKLXJ1bGVfZmlsZT0vZXRjX3JvL2xvZ3J1bGUvYXRpX3N0ZC5ydWxlCi0KLSNyYW1kdW1wtOa0osSjyr0KLSNubyxhdXRvLHllcwotcmFtZHVtcF9leHBvcnQ9bm8KLSNVU0Igb3IgQ0FQRU1NQyBvciBDQVBGTEFTSAotcmFtZHVtcF9tb2RlPVVTQgotcmFtZHVtcF9lbW1jX2RldmljZT0vZGV2L21tY2JsazFwMQotcmFtZHVtcF9mbGFzaF9kZXZpY2U9L2Rldi9tdGQxNwotcmFtZHVtcF9wYXRoPS9tbnQvb2VtZGF0YQotCi0j1dXP4Lv6zbzGrLfWsebCys/Uyr6/2NbGCi16Y2FtZXJhX2ludGVycHJvbGF0aW9uPTEKLSPX1Lavy9HN+Le9yr3N+MLnvdPI67TO0PIKLWF1dG9fYWNxb3JkZXI9MTIKLSMjIyMjI0NQsuBOVsXk1sPQxc+iRU5EIyMjIyMjIwotI2ZvciB2b2x0ZQotTVRORVRfVEVTVD0wCi1OU0lPVF9URVNUPTAKLWFtcnc9MQotY3Ztb2RfaW1zPTMKLUVNX0NBTExfU1VQUE9SVD0wCi1FTUNBTExfVE9fTk9STUFMPTAKLUlNU19BUE49Ci1JTVNfQ09ORlVSST0KLUlNU19DQ19VUklfVFlQRT0wCi1JTVNfU01TX1VSSV9UWVBFPTAKLUlNU19SRUdfRVhQSVJFUz02MDAwMDAKLUlNU19SRUdfU1VCX0VYUElSRVM9NjAwMDAwCi1ORVRfSU1TX0NBUD0wCi1VRFBfVEhSRVNIPTEzMDAKLUlQU0VDX0RJU0FCTEU9MAotUFJFQ09ORFRJT05fTk9UX1NVUFBPUlQ9MAotV0FJVF9SUFRfVElNRT0xMDAwCi1PQ1RfQUxHTl9BTVI9MAotU01TX09WRVJfSVA9MQotSU1TX1VTRVJfQUdFTlQ9Ci1CU0ZfUE9SVD04MDgwCi1YQ0FQX1BPUlQ9ODAKLVVUX0FQTj0KLTM4MF9USEVOX0NTRkI9MAotRFRNRl9SRkM0NzMzPTAKLURJQUxPR19GT1JLPTAKLURBVEFfQ0VOVFJJQz0wCi1ub3Rfc3VwcF9obWFjX3NoYTFfOTY9MAotbm90X3N1cHBfaG1hY19tZDVfOTY9MAotbm90X3N1cHBfZGVzX2VkZTNfY2JjPTAKLW5vdF9zdXBwX2Flc19jYmM9MAotSU1TX1BDU0NGX1BPUlQ9NTA2MAotR19JTVNfQ01HRj0wCi1FQ0FMTF9NVFRFU1Q9MAotUE9XRVJfQ09OVFJPTD0wCi1OT1RfS0VFUF9UQ1BfQ09OTj0xCi1UMzM5Nl9TVVBQT1JUPTAKLVQzMzk2X0NBVVNFX1JFQVNPTj04LDI3LDMyLDMzCi1UMzM5Nl9EVVJBVElPTj03MjAKLVQzMzk2X0NPVU5UUz0zCi1FQ0FMTF9UMl9USU1FUj0zNjAwCi1OR0VDQUxMX0ZPUlRFU1Q9MAotQ1VTVE9NRVJfRkxBRz0wCi0jZm9yIHZvbHRlIGVuZAotREVCVUdfSU5GT19ESVNBQkxFPTAKLURFQlVHX0lORk9fRklMRV9QQVRIPS9tbnQvdXNlcmRhdGEKLURFQlVHX0lORk9fRklMRV9OVU09MgotREVCVUdfSU5GT19GSUxFX1RPVEFMX1NJWkU9MQotI2RlYnVnIGluZm8gZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19zeXN0ZW1kL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfdXNlciBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1jb3JlL2ltYWdlcy9maWxlcy96eDI5NzUyMHYzL3ZlaGljbGVfZGNfc3lzdGVtZC9mcy9ub3JtYWwvcm9vdGZzL2V0Y19yby9kZWZhdWx0L2RlZmF1bHRfcGFyYW1ldGVyX3VzZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmYmIwOTYuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWNvcmUvaW1hZ2VzL2ZpbGVzL3p4Mjk3NTIwdjMvdmVoaWNsZV9kY19zeXN0ZW1kL2ZzL25vcm1hbC9yb290ZnMvZXRjX3JvL2RlZmF1bHQvZGVmYXVsdF9wYXJhbWV0ZXJfdXNlcgorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi1hcG5fYXV0b19jb25maWc9Q01DQygkKWNtbmV0KCQpbWFudWFsKCQpKjk5IygkKXBhcCgkKSgkKSgkKUlQKCQpYXV0bygkKSgkKWF1dG8oJCkoJCkKLUFQTl9jb25maWcwPURlZmF1bHQoJClEZWZhdWx0KCQpbWFudWFsKCQpKCQpKCQpKCQpKCQpSVAoJClhdXRvKCQpKCQpYXV0bygkKSgkKQotQVBOX2NvbmZpZzE9Ci1BUE5fY29uZmlnMj0KLUFQTl9jb25maWczPQotQVBOX2NvbmZpZzQ9Ci1BUE5fY29uZmlnNT0KLUFQTl9jb25maWc2PQotQVBOX2NvbmZpZzc9Ci1BUE5fY29uZmlnOD0KLUFQTl9jb25maWc5PQotYXBuX2luZGV4PTAKLWFwbl9tb2RlPWF1dG8KLWF0X3NuYXBfZmxhZz0zCi1hdF93aWZpX21hYz0wCi1hdXRvX2Fwbl9pbmRleD0wCi1jaWRfcmVzZXJ2ZWQ9MQotY2xlYXJfcGJfd2hlbl9yZXN0b3JlPW5vCi1jbGVhcl9zbXNfd2hlbl9yZXN0b3JlPW5vCi1kZWZhdWx0X2Fwbj0zZ25ldAotaXB2Nl9BUE5fY29uZmlnMT0KLWlwdjZfQVBOX2NvbmZpZzI9Ci1pcHY2X0FQTl9jb25maWczPQotaXB2Nl9BUE5fY29uZmlnND0KLWlwdjZfQVBOX2NvbmZpZzU9Ci1pcHY2X0FQTl9jb25maWc2PQotaXB2Nl9BUE5fY29uZmlnNz0KLWlwdjZfQVBOX2NvbmZpZzg9Ci1pcHY2X0FQTl9jb25maWc5PQotbV9wcm9maWxlX25hbWU9SW50ZXJudXgKLW5lZWRfaW5pdF9tb2RlbT1ubwotbmV0X3NlbGVjdD1ORVRXT1JLX2F1dG8KLXBkcF90eXBlPUlQCi1wcHBfYXBuPQotbWF4X3JlY29ubmVjdF90aW1lPTMwMDAwMDAKLXBwcGRfYXV0aD1ub2F1dGgKLXBwcF9hdXRoX21vZGU9bm9uZQotcHBwX3Bhc3N3ZD0KLXBwcF9wZHBfdHlwZT0KLXBwcF91c2VybmFtZT0KLWlwdjZfcHBwX2F1dGhfbW9kZT1ub25lCi1pcHY2X3BwcF9wYXNzd2Q9Ci1pcHY2X3BwcF91c2VybmFtZT0KLXByZV9tb2RlPQotcHJlZmVyX2Ruc19tYW51YWw9MC4wLjAuMAotc3RhbmRieV9kbnNfbWFudWFsPTAuMC4wLjAKLXdhbl9hcG49aW50ZXJuZXQKLXdhbl9kaWFsPQotY3RhX3Rlc3Q9MAotc2FmZWNhcmVfZW5iYWxlPTEKLXNhZmVjYXJlX2hvc3RuYW1lPW1vYi4zZ2NhcmUuY24KLXNhZmVjYXJlX3JlZ2lzdGVkX2ltZWk9Ci1zYWZlY2FyZV9yZWdpc3RlZF9pY2NpZD0KLXNhZmVjYXJlX2NvbnRpbWVzdGFydDE9Ci1zYWZlY2FyZV9jb250aW1lc3RhcnQyPQotc2FmZWNhcmVfY29udGltZXN0YXJ0Mz0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMT0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMj0KLXNhZmVjYXJlX2NvbnRpbWVzdG9wMz0KLXNhZmVjYXJlX2NvbnRpbWVpbnRlcnZhbD0KLXNhZmVjYXJlX21vYnNpdGU9aHR0cDovL21vYi4zZ2NhcmUuY24KLXNhZmVjYXJlX2NoYXRzaXRlPQotc2FmZWNhcmVfcGxhdG5vPQotc2FmZWNhcmVfbW9iaWxlbnVtYmVyPQotc2FmZWNhcmVfdmVyc2lvbj0KLWV0aHdhbl9kbnNfbW9kZT1hdXRvCi1wc3dhbl9kbnNfbW9kZT1hdXRvCi13aWZpd2FuX2Ruc19tb2RlPWF1dG8KLWV0aHdhbl9pcHY2X2Ruc19tb2RlPWF1dG8KLXdpZml3YW5faXB2Nl9kbnNfbW9kZT1hdXRvCi1wc3dhbl9pcHY2X2Ruc19tb2RlPWF1dG8KLWFkbWluX1Bhc3N3b3JkPVBhc3MxMjM0Ci1wc3dfY2hhbmdlZD0xCi1hbGdfZnRwX2VuYWJsZT0wCi1hbGdfc2lwX2VuYWJsZT0wCi1ibGNfd2FuX2F1dG9fbW9kZT1BVVRPX1BQUAotYmxjX3dhbl9tb2RlPUFVVE8KLWJyX2lwY2hhbmdlX2ZsYWc9Ci1icl9ub2RlPXVzYmxhbjArenZuZXQwCi1icl9ub2RlX2NhcD16dm5ldDAKLWNsYXRfZmFrZV9zdWJuZXQ9MTkyLjAuMTY4LjAKLWNsYXRfZnJhZ19jb2xsZWN0X3RpbWVvdXQ9MzAwCi1jbGF0X2xvY2FsX21hcHBpbmdfdGltZW91dD0zMDAKLWNsYXRfbWFwcGluZ19yZWNvcmRfdGltZW91dD0zMDAwCi1jbGF0X3F1ZXJ5X3NlcnZlcl9wb3J0PTE0NjQKLURlZmF1bHRGaXJld2FsbFBvbGljeT0wCi1kZXZfY29leGlzdD0wCi1kaGNwRG5zPTE5Mi4xNjguMC4xCi1kaGNwRW5hYmxlZD0xCi1kaGNwRW5kPTE5Mi4xNjguMC4yMDAKLWRoY3BMZWFzZV9ob3VyPTI0Ci1kaGNwU3RhcnQ9MTkyLjE2OC4wLjEwMAotZGhjcHY2c3RhdGVFbmFibGVkPTAKLWRoY3B2NnN0YXRlbGVzc0VuYWJsZWQ9MQotZGhjcHY2c3RhdGVQZEVuYWJsZWQ9MAotZGlhbF9tb2RlPWF1dG9fZGlhbAotRE1aRW5hYmxlPTAKLURNWklQQWRkcmVzcz0KLWRuc19leHRlcm49Ci1pcHY2X2Ruc19leHRlcm49Ci1ldGhfYWN0X3R5cGU9Ci1ldGhfdHlwZT1sYW4KLWV0aGxhbj0KLWV0aHdhbj0KLWV0aHdhbl9kaWFsbW9kZT1hdXRvCi1ldGh3YW5fbW9kZT1hdXRvCi1ldGh3YW5fcHJpb3JpdHk9MwotZmFzdF91c2I9dXNibGFuMAotZmFzdG5hdF9sZXZlbD0yCi1mYXN0YnJfbGV2ZWw9MQotSVBQb3J0RmlsdGVyRW5hYmxlPTAKLUlQUG9ydEZpbHRlclJ1bGVzXzA9Ci1JUFBvcnRGaWx0ZXJSdWxlc18xPQotSVBQb3J0RmlsdGVyUnVsZXNfMj0KLUlQUG9ydEZpbHRlclJ1bGVzXzM9Ci1JUFBvcnRGaWx0ZXJSdWxlc180PQotSVBQb3J0RmlsdGVyUnVsZXNfNT0KLUlQUG9ydEZpbHRlclJ1bGVzXzY9Ci1JUFBvcnRGaWx0ZXJSdWxlc183PQotSVBQb3J0RmlsdGVyUnVsZXNfOD0KLUlQUG9ydEZpbHRlclJ1bGVzXzk9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzA9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzE9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzI9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzM9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzQ9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzU9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2XzY9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzc9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzg9Ci1JUFBvcnRGaWx0ZXJSdWxlc3Y2Xzk9Ci1pcHY0X2Zha2Vfc3VibmV0PTE5Mi4wLjAuMAotaXB2Nl9mYWtlX3N1Ym5ldD0yMDE2OjoxCi1sYW5faXBhZGRyPTE5Mi4xNjguMC4xCi13ZWJ2Nl9lbmFibGU9MQotbGFuX2lwdjZhZGRyPWZlODA6OjEKLWxhbl9uYW1lPWJyMAotbGFuX25ldG1hc2s9MjU1LjI1NS4yNTUuMAotTGFuRW5hYmxlPTEKLWRoY3BEbnNfY2FwPTE5Mi4xNjguMC4yCi1sYW5faXB2NmFkZHJfY2FwPWZlODA6OjIKLWxhbl9pcGFkZHJfY2FwPTE5Mi4xNjguMC4yCi1sYW5fbmFtZV9jYXA9YnIwCi1sYW5fbmV0bWFza19jYXA9MjU1LjI1NS4yNTUuMAotTGFuRW5hYmxlX2NhcD0xCi1tYWNfaXBfbGlzdD0KLW1nbXRfcXVpY2tlbl9wb3dlcl9vbj0wCi1tdHU9MTQwMAotbmF0ZW5hYmxlPQotZG9zZW5hYmxlPTAKLW5lZWRfamlsaWFuPTEKLW5vZmFzdF9wb3J0PTIxKzIyKzIzKzI1KzUzKzY3KzY4KzY5KzExMCsxMTUrMTIzKzQ0Mys1MDArMTM1MisxNzIzKzE5OTArMTk5MSsxOTkyKzE5OTMrMTk5NCsxOTk1KzE5OTYrMTk5NysxOTk4KzQ1MDArNTA2MAotbnZfc2F2ZV9pbnRlcnZhbD0zMDAKLXBhdGhfY29uZj0vZXRjX3J3Ci1wYXRoX3JvPS9ldGNfcm8KLXBhdGhfbG9nPS90bXAvCi1uZXRsb2dfbGltaXQ9eWVzCi1wYXRoX3NoPS9zYmluCi1wYXRoX3RtcD0vdG1wCi1wZXJtaXRfZ3c9Ci1wZXJtaXRfaXA2PQotcGVybWl0X25tPTI1NS4yNTUuMjU1LjAKLVBvcnRGb3J3YXJkRW5hYmxlPTAKLVBvcnRGb3J3YXJkUnVsZXNfMD0KLVBvcnRGb3J3YXJkUnVsZXNfMT0KLVBvcnRGb3J3YXJkUnVsZXNfMj0KLVBvcnRGb3J3YXJkUnVsZXNfMz0KLVBvcnRGb3J3YXJkUnVsZXNfND0KLVBvcnRGb3J3YXJkUnVsZXNfNT0KLVBvcnRGb3J3YXJkUnVsZXNfNj0KLVBvcnRGb3J3YXJkUnVsZXNfNz0KLVBvcnRGb3J3YXJkUnVsZXNfOD0KLVBvcnRGb3J3YXJkUnVsZXNfOT0KLVBvcnRNYXBFbmFibGU9MAotUG9ydE1hcFJ1bGVzXzA9Ci1Qb3J0TWFwUnVsZXNfMT0KLVBvcnRNYXBSdWxlc18yPQotUG9ydE1hcFJ1bGVzXzM9Ci1Qb3J0TWFwUnVsZXNfND0KLVBvcnRNYXBSdWxlc181PQotUG9ydE1hcFJ1bGVzXzY9Ci1Qb3J0TWFwUnVsZXNfNz0KLVBvcnRNYXBSdWxlc184PQotUG9ydE1hcFJ1bGVzXzk9Ci1wcHBfbmFtZT1wcHAwCi1wcHBvZV9wYXNzd29yZD0KLXBwcG9lX3VzZXJuYW1lPQotcHNfZXh0MT16dm5ldDEKLXBzX2V4dDI9enZuZXQyCi1wc19leHQzPXp2bmV0MwotcHNfZXh0ND16dm5ldDQKLXBzX2V4dDU9enZuZXQ1Ci1wc19leHQ2PXp2bmV0NgotcHNfZXh0Nz16dm5ldDcKLXBzX2V4dDg9enZuZXQ4Ci1wc3dhbj13YW4KLXBzd2FuX21vZGU9cGRwCi1wc3dhbl9wcmlvcml0eT0xCi1wc3dhbl9jYXA9enZuZXQKLVJlbW90ZU1hbmFnZW1lbnQ9MAotcm9vdGRldl9mcmllbmRseW5hbWU9REVNTy1VUG5QCi1yb290ZGV2X21hbnVmYWN0dXJlcj1ERU1PCi1yb290ZGV2X21vZGVsZGVzPVhYWAotcm9vdGRldl9tb2RlbG5hbWU9WFhYCi1vc191cmw9aHR0cDovL3d3dy5kZW1vLmNvbQotc2VyaWFsbnVtYmVyPVNlZS1JTUVJCi1zdGF0aWNfZGhjcF9lbmFibGU9MQotc3RhdGljX2V0aHdhbl9ndz0KLXN0YXRpY19ldGh3YW5faXA9Ci1zdGF0aWNfZXRod2FuX25tPQotc3RhdGljX2V0aHdhbl9wcmlkbnM9Ci1zdGF0aWNfZXRod2FuX3NlY2Rucz0KLXN0YXRpY193aWZpd2FuX2lwYWRkcj0KLXN0YXRpY193aWZpd2FuX25ldG1hc2s9Ci1zdGF0aWNfd2lmaXdhbl9nYXRld2F5PQotd2lmaXdhbl9wcmlkbnNfbWFudWFsPQotd2lmaXdhbl9zZWNkbnNfbWFudWFsPQotc3RhdGljX3dhbl9nYXRld2F5PTAuMC4wLjAKLXN0YXRpY193YW5faXBhZGRyPTAuMC4wLjAKLXN0YXRpY193YW5fbmV0bWFzaz0wLjAuMC4wCi1zdGF0aWNfd2FuX3ByaW1hcnlfZG5zPTAuMC4wLjAKLXN0YXRpY193YW5fc2Vjb25kYXJ5X2Rucz0wLjAuMC4wCi1zd2xhbnN0cj1zdzBfbGFuCi1zd3ZsYW49c3cwCi1zd3dhbnN0cj1zdzBfd2FuCi10Y19kb3dubGluaz0KLXRjX3VwbGluaz0KLXRjX2xvY2FsPTEzMTA3MjAKLXRjX2VuYWJsZT0wCi10aW1lX2xpbWl0ZWQ9Ci10aW1lX3RvXzIwMDBfd2hlbl9yZXN0b3JlPXllcwotdXBucEVuYWJsZWQ9MAotdXNibGFuPXVzYmxhbjAKLVdBTlBpbmdGaWx0ZXI9MAotd2Vic1VSTEZpbHRlcnM9Ci13aWZpd2FuX3ByaW9yaXR5PTIKLURETlM9Ci1ERE5TX0VuYWJsZT0wCi1ERE5TQWNjb3VudD0KLURETlNQYXNzd29yZD0KLURETlNQcm92aWRlcj0KLWljY2lkUHJldmlvdXM9Ci1pbWVpUHJldmlvdXM9Ci1yZWdpc3RlckZsYWc9MAotcmVnaXN0ZXJlZFJvdW5kPQotc2Vjc0V2ZXJ5Um91bmQ9MQotc2Vjc0V2ZXJ5VGltZT0xCi1yZWd2ZXI9NC4wCi1tZWlkPQotdWV0eXBlPTEKLUxvY2FsRG9tYWluPW0uaG9tZQotZGF0YV92b2x1bWVfYWxlcnRfcGVyY2VudD0KLWRhdGFfdm9sdW1lX2xpbWl0X3NpemU9Ci1kYXRhX3ZvbHVtZV9saW1pdF9zd2l0Y2g9MAotZGF0YV92b2x1bWVfbGltaXRfdW5pdD0wCi1mbHV4X2RheV90b3RhbD0wCi1mbHV4X2xhc3RfZGF5PQotZmx1eF9sYXN0X21vbnRoPQotZmx1eF9sYXN0X3llYXI9Ci1mbHV4X21vbnRoX3RvdGFsPTAKLWZsdXhfc2V0X2RheT0KLWZsdXhfc2V0X21vbnRoPQotZmx1eF9zZXRfeWVhcj0KLW1vbnRobHlfcnhfYnl0ZXM9MAotbW9udGhseV90aW1lPTAKLW1vbnRobHlfdHhfYnl0ZXM9MAotTW9udGhseUNvblRpbWVfTGFzdD0KLWRtX25leHRwb2xsaW5ndGltZT0KLWZvdGFfYWxsb3dSb2FtaW5nVXBkYXRlPTAKLWZvdGFfZGxfcGtnX3NpemU9MAotZm90YV91cGRhdGVfZmxhZz0KLWZvdGFfdXBkYXRlSW50ZXJ2YWxEYXk9MTUKLWZvdGFfdXBncmFkZV9yZXN1bHQ9Ci1mb3RhX3ZlcnNpb25fZGVsdGFfaWQ9Ci1mb3RhX3ZlcnNpb25fZGVsdGFfdXJsPQotZm90YV9wa2dfdG90YWxfc2l6ZT0wCi1mb3RhX3ZlcnNpb25fZmlsZV9zaXplPQotZm90YV92ZXJzaW9uX21kNXN1bT0KLWZvdGFfdmVyc2lvbl9uYW1lPQotZm90YV9uZWVkX3VzZXJfY29uZmlybV91cGRhdGU9MAotZm90YV9uZWVkX3VzZXJfY29uZmlybV9kb3dubG9hZD0wCi1mb3RhX3ZlcnNpb25fZm9yY2VfaW5zdGFsbD0wCi1wb2xsaW5nX25leHR0aW1lPTAKLXB3cm9uX2F1dG9fY2hlY2s9MAotZm90YV91cGRhdGVNb2RlPTAKLWZvdGFfdGVzdF9tb2RlPTAKLWZvdGFfcGtnX2Rvd25sb2FkZWQ9MAotZm90YV91cGdyYWRlX3Jlc3VsdF9pbnRlcm5hbD0KLW1taV9iYXR0ZXJ5X3ZvbHRhZ2VfbGluZT0zMDkwKzMzMDArMzQ1MCszNDkwKzM1MTArMzU0MCszNTUwKzM1NzArMzU4MCszNjAwKzM2MjArMzY1MCszNjcwKzM3MTArMzc0MCszNzgwKzM4NTArMzkwMCszOTUwKzQwMDArNDA2MAotbW1pX2Zhc3RfcG93ZXJvbj0KLW1taV9sZWRfbW9kZT1zbGVlcF9tb2RlCi1tbWlfbmV3X3Ntc19ibGlua19mbGFnPTEKLW1taV9zaG93X3BhZ2V0YWI9cGFnZTErcGFnZTIrcGFnZTMKLW1taV9zaG93bW9kZT1sZWQKLW1taV90YXNrX3RhYj1jdHJsX3Rhc2sra2V5X3Rhc2sKLW1taV90ZW1wX3ZvbHRhZ2VfbGluZT05NTErMTIwMSsxNjkyKzE3MzYKLW1taV91c2VfcHJvdGVjdD0KLW1taV91c2Vfd2lmaV91c2VybnVtPTEKLWxlYWtfZnVsbF9wYW5pYz0KLWxlYWtfbGlzdF9tYXg9Ci1sZWFrX3NldF9mbGFnPQotbW9uaXRvcl9wZXJpb2Q9MzAwCi1uZXRpbmZfZmxhZz0KLXNrYl9hbGxfbWF4PQotc2tiX2RhdGFfbWF4PQotc2tiX2Zyb21jcF9tYXg9Ci1za2JfbWF4X2ZhaWw9Ci1za2JfbWF4X3BhbmljPQotc2tiX3NpemVfbWF4PQotc2tiX3RvY3BfbWF4PQotc250cF9kZWZhdWx0X2lwPTEzNC4xNzAuMTg1LjIxMTsxMzEuMTA3LjEzLjEwMDsyMDIuMTEyLjMxLjE5NzsyMDIuMTEyLjI5LjgyOzIwMi4xMTIuMTAuMzY7bnRwLmd3YWRhci5jbjtudHAtc3ouY2hsLmxhO2Rucy5zanR1LmVkdS5jbjtuZXdzLm5ldS5lZHUuY247ZG5zMS5zeW5ldC5lZHUuY247dGltZS1udy5uaXN0Lmdvdjtwb29sLm50cC5vcmc7ZXVyb3BlLnBvb2wubnRwLm9yZwotc250cF9kc3RfZW5hYmxlPTAKLXNudHBfb3RoZXJfc2VydmVyMD0KLXNudHBfb3RoZXJfc2VydmVyMT0KLXNudHBfb3RoZXJfc2VydmVyMj0KLXNudHBfc2VydmVyMD10aW1lLW53Lm5pc3QuZ292Ci1zbnRwX3NlcnZlcjE9cG9vbC5udHAub3JnCi1zbnRwX3NlcnZlcjI9ZXVyb3BlLnBvb2wubnRwLm9yZwotc250cF9zeW5jX3NlbGVjdF9pbnRlcnZhbF90aW1lPTMwCi1zbnRwX3RpbWVfc2V0X21vZGU9YXV0bwotc250cF90aW1lem9uZT1DU1QtOAotc250cF90aW1lem9uZV9pbmRleD0wCi1hc3NlcnRfZXJybm89Ci1jb21tX2xvZ3NpemU9MTYzODQKLWNyX2lubmVyX3ZlcnNpb249VjEuMC4wQjA4Ci1jcl92ZXJzaW9uPVYxLjAuMEIwMQotaHdfdmVyc2lvbj1QQ0JNRjI5UzJWMS4wLjAKLVRVUk5PRkZfQ0hSX05VTT0KLXdhdGNoZG9nX2FwcD0wCi1IVFRQX1NIQVJFX0ZJTEU9Ci1IVFRQX1NIQVJFX1NUQVRVUz0KLUhUVFBfU0hBUkVfV1JfQVVUSD1yZWFkV3JpdGUKLWlwdjZfcGRwX3R5cGU9Ci1pcHY2X3dhbl9hcG49Ci1MYW5ndWFnZT16aC1jbgotbWFudWFsX3RpbWVfZGF5PQotbWFudWFsX3RpbWVfaG91cj0KLW1hbnVhbF90aW1lX21pbnV0ZT0KLW1hbnVhbF90aW1lX21vbnRoPQotbWFudWFsX3RpbWVfc2Vjb25kPQotbWFudWFsX3RpbWVfeWVhcj0KLXNkY2FyZF9tb2RlX29wdGlvbj0wCi1BY2Nlc3NDb250cm9sTGlzdDA9Ci1BY2Nlc3NQb2xpY3kwPTAKLUFDTF9tb2RlPTAKLUF1dGhNb2RlPVdQQTJQU0sKLUNoYW5uZWw9MAotd2lmaV9hY3NfbnVtPTUKLWNsb3NlRW5hYmxlPTAKLWNsb3NlVGltZT0KLUNvdW50cnlDb2RlPUNOCi1EZWZhdWx0S2V5SUQ9MAotRHRpbVBlcmlvZD0xCi1FbmNyeXBUeXBlPUFFUwotRVhfQVBMSVNUPQotRVhfQVBMSVNUMT0KLUVYX0F1dGhNb2RlPQotRVhfRGVmYXVsdEtleUlEPQotRVhfRW5jcnlwVHlwZT0KLUVYX21hYz0KLUVYX1NTSUQxPVVmaV8KLUVYX1dFUEtFWT0KLUVYX3dpZmlfcHJvZmlsZT0KLUVYX1dQQVBTSzE9Ci1GcmFnVGhyZXNob2xkPTIzNDYKLUhpZGVTU0lEPTAKLUhUX0dJPTEKLUtleTFTdHIxPTEyMzQ1Ci1LZXkyU3RyMT0KLUtleTNTdHIxPQotS2V5NFN0cjE9Ci1LZXkxVHlwZT0xCi1LZXkyVHlwZT0KLUtleTNUeXBlPQotS2V5NFR5cGU9Ci1tX0F1dGhNb2RlPVdQQTJQU0sKLW1fRGVmYXVsdEtleUlEPQotbV9FbmNyeXBUeXBlPUFFUwotbV9IaWRlU1NJRD0wCi1tX0tleTFTdHIxPTEyMzQKLW1fS2V5MlN0cjE9Ci1tX0tleTNTdHIxPQotbV9LZXk0U3RyMT0KLW1fS2V5MVR5cGU9MQotbV9LZXkyVHlwZT0KLW1fS2V5M1R5cGU9Ci1tX0tleTRUeXBlPQotbV9NQVhfQWNjZXNzX251bT0wCi1tX05vRm9yd2FyZGluZz0KLW1fc2hvd19xcmNvZGVfZmxhZz0wCi1tX1NTSUQ9VWZpXwotbV9zc2lkX2VuYWJsZT0wCi1tX3dhcGlUeXBlPQotbV93aWZpX21hYz05MDFENDU2OTJBNUMKLW1fV1BBUFNLMV9hZXM9Ci1tX1dQQVBTSzFfZW5jb2RlPU1USXpORFUyTnpnPQotTUFYX0FjY2Vzc19udW09MzIKLU1BWF9BY2Nlc3NfbnVtX2Jhaz0zMgotTm9Gb3J3YXJkaW5nPTAKLW9wZW5FbmFibGU9MAotb3BlblRpbWU9Ci1vcGVyYXRlcl9hcD0KLVJla2V5SW50ZXJ2YWw9MzYwMAotUlRTVGhyZXNob2xkPTIzNDcKLXNob3dfcXJjb2RlX2ZsYWc9MAotU2xlZXBfaW50ZXJ2YWw9MTAKLXNzaWRfd3JpdGVfZmxhZz0wCi1TU0lEMT1VZmlfCi10c3dfc2xlZXBfdGltZV9ob3VyPQotdHN3X3NsZWVwX3RpbWVfbWluPQotdHN3X3dha2VfdGltZV9ob3VyPQotdHN3X3dha2VfdGltZV9taW49Ci13YXBpVHlwZT0KLXdpZmlfZm9yY2VfNDBtPTEKLXdpZmlfMTFuX2NhcD0xCi13aWZpX2JhbmQ9Ygotd2lmaV9jb3ZlcmFnZT1sb25nX21vZGUKLXdpZmlfaG9zdG5hbWVfYmxhY2tfbGlzdD0KLXdpZmlfaG9zdG5hbWVfd2hpdGVfbGlzdD0KLXdpZmlfbWFjPTkwMUQ0NTY5MkE1Qgotd2lmaV9tYWNfYmxhY2tfbGlzdD0KLXdpZmlfbWFjX3doaXRlX2xpc3Q9Ci13aWZpX3Byb2ZpbGU9Ci13aWZpX3Byb2ZpbGUxPQotd2lmaV9wcm9maWxlMj0KLXdpZmlfcHJvZmlsZTM9Ci13aWZpX3Byb2ZpbGU0PQotd2lmaV9wcm9maWxlNT0KLXdpZmlfcHJvZmlsZTY9Ci13aWZpX3Byb2ZpbGU3PQotd2lmaV9wcm9maWxlOD0KLXdpZmlfcHJvZmlsZTk9Ci13aWZpX3Byb2ZpbGVfbnVtPTAKLXdpZmlfcm9vdF9kaXI9Ci13aWZpX3N0YV9jb25uZWN0aW9uPTAKLXdpZmlfd3BzX2luZGV4PTEKLXdpZmlFbmFibGVkPTEKLXdpZmlsYW49d2xhbjAtdmEwCi13aWZpbGFuMj13bGFuMC12YTEKLVdpcmVsZXNzTW9kZT02Ci1XUEFQU0sxX2Flcz0KLVdQQVBTSzFfZW5jb2RlPU1USXpORFUyTnpnPQotd3BzX21vZGU9Ci1XUFNfU1NJRD0KLVdzY01vZGVPcHRpb249MAotbW9uaXRvcl9hcHBzPQotYXRfbmV0ZG9nPQotYXV0b3JzcGNoYW5uZWxfbGlzdD1hbGwKLXNvY3RpbWVfc3dpdGNoPTAKLXVhcnRfY29udHJvbD0xCi11YXJ0X2N0c3Ryc19lbmFibGU9Ci11YXJ0X3NvZnRjb250cm9sX2VuYWJsZT0KLXVhcnRfd2FrZXVwX2VuYWJsZT0xCi11YXJ0X2NvbnNvbGVfY29yZWlkPTEKLXVhcnRfYXBwX2N0cmw9NQotc3BlY2lhbF9jbWRfbGlzdD0kTVlORVRSRUFECi1yYV9tdHVfZW5hYmxlPQotIyPkuLrlhaXnvZHlhaXlupPoiq/niYforqTor4HniYjmnKzmt7vliqAgYmVnaW4KLWF0Y21kX3N0cmVhbTE9QVQrWlNFVD0id19pbnN0cnVtZW50IiwxCi1hdGNtZF9zdHJlYW0yPUFUXlNZU0NPTkZJRz0yNCwwLDEsMgotYXRjbWRfc3RyZWFtMz1BVCtaU0VUPSJjc2lpb3QiLDIKLWF0Y21kX3N0cmVhbTQ9QVQrWlNFVD0iZGxwYXJhZmxnIiwwCi1hdGNtZF9zdHJlYW01PUFUK1pTRVQ9Ik1UTkVUX1RFU1QiLDE7QVQrWkdBQVQ9MDtBVCtaU0VUPSJDTUNDX1RFU1QiLDE7QVQrWlNFVD0iTFRFX0lORk8iLDYzNDg7QVQrWlNFVD0iVk9JQ0VfU1VQUE9SVCIsMTtBVCtaU0VUPSJGRERfUkVMRUFTRSIsNztBVCtaU0VUPSJMVEVfUkVMRUFTRSIsMTtBVCtaU0VUPSJVRV9QU19SRUxFQVNFIiw1O0FUK1pTRVQ9IlFPU19SRUxFQVNFIiw0O0FUK1pTRVQ9IlRFQlNfVEhSRVNIT0xEIiwwCi1hdGNtZF9zdHJlYW02PUFUK1pTRVQ9Ik1UTkVUX1RFU1QiLDE7QVQrWkdBQVQ9MDtBVCtaU0VUPSJMVEVfSU5GTyIsNjM0ODtBVCtaU0VUPSJWT0lDRV9TVVBQT1JUIiwxO0FUK1pTRVQ9IkZERF9SRUxFQVNFIiw3O0FUK1pTRVQ9IkxURV9SRUxFQVNFIiwxO0FUK1pTRVQ9IlVFX1BTX1JFTEVBU0UiLDU7QVQrWlNFVD0iUU9TX1JFTEVBU0UiLDQ7QVQrWlNFVD0iVEVCU19USFJFU0hPTEQiLDA7QVQrWlNFVD0iSUdOT1JFX1NFQ1VSSVRZX1NVUFBPUlQiLDA7QVQrWlNFVD0iY3NpZmlsdGVyIiwwO0FUK1pTRVQ9ImNzcmhvYmFuZGZsZyIsMDtBVCtaU0VUPSJkbHBhcmFmbGciLDE7QVQrWlNFVD0iY3NpdXAiLDE7QVQrWlNFVD0icmZwYXJhZmxhZyIsMCwwLDEsMDtBVCtaU0VUPSJjc2lpb3QiLDE7QVQrWlNFVD0iRVhDRVBUX1JFU0VUIiwwO0FUK1pTRVQ9IklTSU1fU1VQUE9SVCIsMTtBVCtaSU1TVEVTVD0iTVRORVRfVEVTVCIsMTtBVCtaU0VUPSJNQU5VQUxfU0VBUkNIIiwwCi0jI+S4uuWFpee9keWFpeW6k+iKr+eJh+iupOivgeeJiOacrOa3u+WKoCBlbmQKLSNmb3IgYXVkaW8gY3RybCAKLWF1ZGlvX3ByaW9yaXR5PTAxMjMKLWN1c3RvbWVyX3R5cGU9Ci1kZWJ1Z19tb2RlPQotY3BJbmRDbWRMaXN0PStaTU1JK1pVUkRZK1pVU0xPVCtaSUNDSUReTU9ERStaUEJJQytaTVNSSStDUkVHK0NFUkVHK0NHUkVHK0NHRVYKLXplcGh5cl9maWx0ZXJfaXA9Ci13YWl0X3RpbWVvdXQ9Mgotc250cF9zeW5jX3RpbWU9MQotc250cF9zdGF0aWNfc2VydmVyMD10aW1lLW53Lm5pc3QuZ292Ci1zbnRwX3N0YXRpY19zZXJ2ZXIxPXBvb2wubnRwLm9yZwotc250cF9zdGF0aWNfc2VydmVyMj1ldXJvcGUucG9vbC5udHAub3JnCi12c2ltX2Jpbl9wYXRoPS9tbnQvdXNlcmRhdGEvdlNpbS5iaW4KLWF0X3NlbGVjdF90aW1lb3V0PQotbXRuZXRfdGVzdF9tY2M9KzAwMSswMDIrMDAzKzAwNAotYXRfYXR2PQotYXRfYXRxPQotYXRfYXRfZD0KLWF0X3B0c251bT0KLXF1aWNrX2RpYWw9MQotY2FwX3BvcnRfbmFtZT0vZGV2L3R0eUdTMAotY3VzdG9tSW5kQ21kTGlzdD0KLWRlZnJ0X2NpZD0xCi1NYXhSdHJBZHZJbnRlcnZhbD0xODAwCi1kaGNwc19pbl9jYXA9MQotZ3dfaW5fY2FwPTAKLXhsYXRfZW5hYmxlPTAKLXRlbG9nX3BhdGhfY2FwPQotdGVsb2dfcGF0aD0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvTElDRU5TRSBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWIxNWJkMi4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1vcHlyaWdodCBTdGF0ZW1lbnQ6Ci0KLVRoaXMgc29mdHdhcmUvZmlybXdhcmUgYW5kIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiAoIk1vYmlsZVRlayBTb2Z0d2FyZSIpIGFyZQotcHJvdGVjdGVkIHVuZGVyIHJlbGV2YW50IGNvcHlyaWdodCBsYXdzLiBUaGUgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcwotY29uZmlkZW50aWFsIGFuZCBwcm9wcmlldGFyeSB0byBNb2JpbGVUZWsgSW5jLiBhbmQvb3IgaXRzIGxpY2Vuc29ycy4gV2l0aG91dAotdGhlIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNb2JpbGVUZWsgaW5jLiBhbmQvb3IgaXRzIGxpY2Vuc29ycywgYW55Ci1yZXByb2R1Y3Rpb24sIG1vZGlmaWNhdGlvbiwgdXNlIG9yIGRpc2Nsb3N1cmUgb2YgTW9iaWxlVGVrIFNvZnR3YXJlLCBhbmQKLWluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4sIGluIHdob2xlIG9yIGluIHBhcnQsIHNoYWxsIGJlIHN0cmljdGx5Ci1wcm9oaWJpdGVkLgotCi1Nb2JpbGVUZWsgSW5jLiAoQykgMjAxNS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotQlkgT1BFTklORyBUSElTIEZJTEUsIFJFQ0VJVkVSIEhFUkVCWSBVTkVRVUlWT0NBTExZIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTCi1USEFUIFRIRSBTT0ZUV0FSRS9GSVJNV0FSRSBBTkQgSVRTIERPQ1VNRU5UQVRJT05TICgiTW9iaWxlVGVrIFNPRlRXQVJFIikKLVJFQ0VJVkVEIEZST00gTW9iaWxlVGVrIEFORC9PUiBJVFMgUkVQUkVTRU5UQVRJVkVTIEFSRSBQUk9WSURFRCBUTyBSRUNFSVZFUgotT04gQU4gIkFTLUlTIiBCQVNJUyBPTkxZLiBNb2JpbGVUZWsgRVhQUkVTU0xZIERJU0NMQUlNUyBBTlkgQU5EIEFMTAotV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IKLU5PTklORlJJTkdFTUVOVC4gTkVJVEhFUiBET0VTIE1vYmlsZVRlayBQUk9WSURFIEFOWSBXQVJSQU5UWSBXSEFUU09FVkVSIFdJVEgKLVJFU1BFQ1QgVE8gVEhFIFNPRlRXQVJFIE9GIEFOWSBUSElSRCBQQVJUWSBXSElDSCBNQVkgQkUgVVNFRCBCWSwKLUlOQ09SUE9SQVRFRCBJTiwgT1IgU1VQUExJRUQgV0lUSCBUSEUgTW9iaWxlVGVrIFNPRlRXQVJFLCBBTkQgUkVDRUlWRVIgQUdSRUVTCi1UTyBMT09LIE9OTFkgVE8gU1VDSCBUSElSRCBQQVJUWSBGT1IgQU5ZIFdBUlJBTlRZIENMQUlNIFJFTEFUSU5HIFRIRVJFVE8uCi1SRUNFSVZFUiBFWFBSRVNTTFkgQUNLTk9XTEVER0VTIFRIQVQgSVQgSVMgUkVDRUlWRVInUyBTT0xFIFJFU1BPTlNJQklMSVRZIFRPCi1PQlRBSU4gRlJPTSBBTlkgVEhJUkQgUEFSVFkgQUxMIFBST1BFUiBMSUNFTlNFUyBDT05UQUlORUQgSU4gTW9iaWxlVGVrCi1TT0ZUV0FSRS4gTW9iaWxlVGVrIFNIQUxMIEFMU08gTk9UIEJFIFJFU1BPTlNJQkxFIEZPUiBBTlkgTW9iaWxlVGVrIFNPRlRXQVJFCi1SRUxFQVNFUyBNQURFIFRPIFJFQ0VJVkVSJ1MgU1BFQ0lGSUNBVElPTiBPUiBUTyBDT05GT1JNIFRPIEEgUEFSVElDVUxBUgotU1RBTkRBUkQgT1IgT1BFTiBGT1JVTS4gUkVDRUlWRVInUyBTT0xFIEFORCBFWENMVVNJVkUgUkVNRURZIEFORCBNb2JpbGVUZWsnUwotRU5USVJFIEFORCBDVU1VTEFUSVZFIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFIE1vYmlsZVRlayBTT0ZUV0FSRQotUkVMRUFTRUQgSEVSRVVOREVSIFdJTEwgQkUsIEFUIE1vYmlsZVRlaydTIE9QVElPTiwgVE8gUkVWSVNFIE9SIFJFUExBQ0UgVEhFCi1Nb2JpbGVUZWsgU09GVFdBUkUgQVQgSVNTVUUsIE9SIFJFRlVORCBBTlkgU09GVFdBUkUgTElDRU5TRSBGRUVTIE9SIFNFUlZJQ0UKLUNIQVJHRSBQQUlEIEJZIFJFQ0VJVkVSIFRPIE1vYmlsZVRlayBGT1IgU1VDSCBNb2JpbGVUZWsgU09GVFdBUkUgQVQgSVNTVUUuCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL2F1dG9zdXNwZW5kLmMgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL2F1dG9zdXNwZW5kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNjUzZjYuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9hdXRvc3VzcGVuZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFVVE9TVVNQRU5EIgotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPGxpYmxvZy9seW5xX2RlZmxvZy5oPgotCi0jaW5jbHVkZSAiYXV0b3N1c3BlbmQuaCIKLQotI2luY2x1ZGUgImF1dG9zdXNwZW5kX29wcy5oIgotCi1zdGF0aWMgc3RydWN0IGF1dG9zdXNwZW5kX29wcyAqYXV0b3N1c3BlbmRfb3BzOwotc3RhdGljIGJvb2wgYXV0b3N1c3BlbmRfZW5hYmxlZDsKLXN0YXRpYyBib29sIGF1dG9zdXNwZW5kX2luaXRlZDsKLQotc3RhdGljIGludCBhdXRvc3VzcGVuZF9pbml0KHZvaWQpCi17Ci0gICAgaWYgKGF1dG9zdXNwZW5kX2luaXRlZCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBhdXRvc3VzcGVuZF9vcHMgPSBhdXRvc3VzcGVuZF93YWtldXBfY291bnRfaW5pdCgpOwotICAgIGlmIChhdXRvc3VzcGVuZF9vcHMpIHsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgaWYgKCFhdXRvc3VzcGVuZF9vcHMpIHsKLSAgICAgICAgQUxPR0koImZhaWxlZCB0byBpbml0aWFsaXplIGF1dG9zdXNwZW5kXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotb3V0OgotICAgIGF1dG9zdXNwZW5kX2luaXRlZCA9IHRydWU7Ci0KLSAgICBBTE9HSSgiYXV0b3N1c3BlbmQgaW5pdGlhbGl6ZWRcbiIpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXV0b3N1c3BlbmRfZW5hYmxlKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLQotICAgIHJldCA9IGF1dG9zdXNwZW5kX2luaXQoKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgQUxPR0koImF1dG9zdXNwZW5kX2VuYWJsZVxuIik7Ci0KLSAgICBpZiAoYXV0b3N1c3BlbmRfZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXQgPSBhdXRvc3VzcGVuZF9vcHMtPmVuYWJsZSgpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBhdXRvc3VzcGVuZF9lbmFibGVkID0gdHJ1ZTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGF1dG9zdXNwZW5kX2Rpc2FibGUodm9pZCkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gYXV0b3N1c3BlbmRfaW5pdCgpOwotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBBTE9HSSgiYXV0b3N1c3BlbmRfZGlzYWJsZVxuIik7Ci0KLSAgICBpZiAoIWF1dG9zdXNwZW5kX2VuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0ID0gYXV0b3N1c3BlbmRfb3BzLT5kaXNhYmxlKCk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGF1dG9zdXNwZW5kX2VuYWJsZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmQuaCBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTkxODhhOC4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL2F1dG9zdXNwZW5kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU1VTUEVORF9BVVRPU1VTUEVORF9IXwotI2RlZmluZSBfTElCU1VTUEVORF9BVVRPU1VTUEVORF9IXwotCi0jaW5jbHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi1fX0JFR0lOX0RFQ0xTCi0KLS8qCi0gKiBhdXRvc3VzcGVuZF9lbmFibGUKLSAqCi0gKiBUdXJuIG9uIGF1dG9zdXNwZW5kIGluIHRoZSBrZXJuZWwsIGFsbG93aW5nIGl0IHRvIGVudGVyIHN1c3BlbmQgaWYgbm8KLSAqIHdha2Vsb2Nrcy93YWtldXBfc291cmNlcyBhcmUgaGVsZC4KLSAqCi0gKgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiBhdXRvc3VzcGVuZCB3YXMgbm90IGVuYWJsZWQuCi0gKi8KLWludCBhdXRvc3VzcGVuZF9lbmFibGUodm9pZCk7Ci0KLS8qCi0gKiBhdXRvc3VzcGVuZF9kaXNhYmxlCi0gKgotICogVHVybiBvZmYgYXV0b3N1c3BlbmQgaW4gdGhlIGtlcm5lbCwgcHJldmVudGluZyBzdXNwZW5kIGFuZCBzeW5jaHJvbml6aW5nCi0gKiB3aXRoIGFueSBpbi1wcm9ncmVzcyByZXN1bWUuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGlmIGF1dG9zdXNwZW5kIHdhcyBub3QgZGlzYWJsZWQuCi0gKi8KLWludCBhdXRvc3VzcGVuZF9kaXNhYmxlKHZvaWQpOwotCi0vKgotICogc2V0X3dha2V1cF9jYWxsYmFjawotICoKLSAqIFNldCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBlYWNoIHRpbWUgdGhlIGRldmljZSByZXR1cm5zIGZyb20gc3VzcGVuZC4KLSAqIHN1Y2Nlc3MgaXMgdHJ1ZSBpZiB0aGUgc3VzcGVuZCB3YXMgc3VjZXNzZnVsIGFuZCBmYWxzZSBpZiB0aGUgc3VzcGVuZAotICogYWJvcnRlZCBkdWUgdG8gc29tZSByZWFzb24uCi0gKi8KLXZvaWQgc2V0X3dha2V1cF9jYWxsYmFjayh2b2lkICgqZnVuYykoYm9vbCBzdWNjZXNzKSk7Ci0KLV9fRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9hdXRvc3VzcGVuZC5zZXJ2aWNlIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9hdXRvc3VzcGVuZC5zZXJ2aWNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzY2JiNDZjLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmQuc2VydmljZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLVtVbml0XQotRGVzY3JpcHRpb249bHlucS1hdXRvc3VzcGVuZC1zZXJ2aWNlCi0KLVtTZXJ2aWNlXQotRXhlY1N0YXJ0PS91c3IvYmluL2F1dG9zdXNwZW5kCi1UeXBlPXNpbXBsZQotCi1bSW5zdGFsbF0KLVdhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0Ci0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmRfb3BzLmggYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL2F1dG9zdXNwZW5kX29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OThlMjViLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmRfb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU1VTUEVORF9BVVRPU1VTUEVORF9PUFNfSF8KLSNkZWZpbmUgX0xJQlNVU1BFTkRfQVVUT1NVU1BFTkRfT1BTX0hfCi0KLXN0cnVjdCBhdXRvc3VzcGVuZF9vcHMgewotICAgIGludCAoKmVuYWJsZSkodm9pZCk7Ci0gICAgaW50ICgqZGlzYWJsZSkodm9pZCk7Ci19OwotCi1zdHJ1Y3QgYXV0b3N1c3BlbmRfb3BzICphdXRvc3VzcGVuZF9hdXRvc2xlZXBfaW5pdCh2b2lkKTsKLXN0cnVjdCBhdXRvc3VzcGVuZF9vcHMgKmF1dG9zdXNwZW5kX2Vhcmx5c3VzcGVuZF9pbml0KHZvaWQpOwotc3RydWN0IGF1dG9zdXNwZW5kX29wcyAqYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X2luaXQodm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9hdXRvc3VzcGVuZF93YWtldXBfY291bnQuYyBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM3Y2MyNzQuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9hdXRvc3VzcGVuZF93YWtldXBfY291bnQuYworKysgL2Rldi9udWxsCkBAIC0xLDc2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBVVRPU1VTUEVORCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxsaWJzaW0vbHlucV9zaW0uaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0vLyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2RlZmluZSBVU0VSX0xPR19UQUcgIlBNUyIKLSNpbmNsdWRlIDxsaWJsb2cvbHlucV9kZWZsb2cuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL2x5bnFfdWNpLmg+Ci0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiYXV0b3N1c3BlbmRfb3BzLmgiCi0jaW5jbHVkZSA8c2NfbW5ldF93aGl0ZWxpc3QuaD4KLSNpbmNsdWRlIDxzY19hdC5oPgotI2RlZmluZSBTWVNfUE9XRVJfU1RBVEUgIi9zeXMvcG93ZXIvc3RhdGUiCi0KLSNkZWZpbmUgU1lTX1BPV0VSX1dBS0VVUF9DT1VOVCAiL3N5cy9wb3dlci93YWtldXBfY291bnQiCi0jZGVmaW5lIFNZU19QT1dFUl9TUE1fU1VTUEVORF9DUlRMICIvc3lzL3Bvd2VyL3NwbS9zdXNwZW5kX2N0cmwiCi0KLSNkZWZpbmUgQkFTRV9TTEVFUF9USU1FIDEwMDAwMAotI2RlZmluZSBQT1NTSUJMRV9NQVhfU0xFRVBfVElNRSA2MDAwMDAwMAotI2RlZmluZSBMT0dfVUNJX01PRFVMRSAibHlucV9hdXRvc3VzcGVuZCIKLSNkZWZpbmUgTE9HX1VDSV9GSUxFICJseW5xX3VjaSIKLQotc3RhdGljIGludCBzdGF0ZV9mZDsKLXN0YXRpYyBpbnQgd2FrZXVwX2NvdW50X2ZkOwotc3RhdGljIGludCBzdXNwZW5kX2N0cmxfZmQ7Ci1zdGF0aWMgcHRocmVhZF90IHN1c3BlbmRfdGhyZWFkOwotc3RhdGljIHNlbV90IHN1c3BlbmRfbG9ja291dDsKLWV4dGVybiBwdGhyZWFkX2NvbmRfdCBmZWVkYmFja19jb25kOwotZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBmZWVkYmFja19tdXRleDsKLWV4dGVybiBwdGhyZWFkX211dGV4X3QgdGltZV9pbmZvX211dGV4Owotc3RhdGljIGNvbnN0IGNoYXIgKnNsZWVwX3N0YXRlID0gIm1lbSI7Ci0jaWZkZWYgTU9CSUxFVEVLX1NVU1BFTkRfQ0ZHCi1zdGF0aWMgY29uc3QgY2hhciAqcmVnX25ldHN5c1s1XSA9IHsicmVnX25ldHN5c19zcmNjbGtlbmFfbWFza19iIDAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ19uZXRzeXNfaW5mcmFfcmVxX21hc2tfYiAwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdfbmV0c3lzX2Fwc3JjX3JlcV9tYXNrX2IgMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnX25ldHN5c192cmYxOF9yZXFfbWFza19iIDAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ19uZXRzeXNfZGRyX2VuX21hc2tfYiAwIn07Ci0jZW5kaWYKLXN0YXRpYyB2b2lkICgqd2FrZXVwX2Z1bmMpKGJvb2wgc3VjY2VzcykgPSBOVUxMOwotc3RhdGljIGludCBzbGVlcF90aW1lID0gQkFTRV9TTEVFUF9USU1FOwotc3RhdGljIGludCBwb3NzaWJsZV9tYXhfc2xlZXBfdGltZSA9IFBPU1NJQkxFX01BWF9TTEVFUF9USU1FOwotCi1leHRlcm4gaW50IGFkYl9kZWJ1Z19tb2RlOwotCi1zdGF0aWMgbG9uZyBzdGFydF90aW1lOyAgLy8g5Ye66ZSZ54K577yadGltZV9pbmZvX3Qg57uT5p6E5L2T5Lik5Liq5oiQ5ZGY6YO95pivbG9uZ++8jOWboOatpOi/meS4pOS4quWPmOmHj+W/hemhu+aYr2xvbmflnovvvIzkuI3og73lrprkuYnmiJBpbnQKLXN0YXRpYyBsb25nIGVuZF90aW1lOyAKLQotCi0KLSMgZGVmaW5lIFRFTVBfRkFJTFVSRV9SRVRSWShleHByZXNzaW9uKSBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICAoeyBsb25nIGludCBfX3Jlc3VsdDsJCQkJCQkgICAgICBcCi0gICAgICAgZG8gX19yZXN1bHQgPSAobG9uZyBpbnQpIChleHByZXNzaW9uKTsJCQkJICAgICAgXAotICAgICAgIHdoaWxlIChfX3Jlc3VsdCA9PSAtMUwgJiYgZXJybm8gPT0gRUlOVFIpOwkJCSAgICAgIFwKLSAgICAgICBfX3Jlc3VsdDsgfSkpCi0KLQotcGlkX3QgcGlkID0gMDsKLQotZW51bSB7Ci0gICAgUEFSVElBTF9XQUtFX0xPQ0sgPSAxLCAgLy8gdGhlIGNwdSBzdGF5cyBvbiwgYnV0IHRoZSBzY3JlZW4gaXMgb2ZmCi0gICAgRlVMTF9XQUtFX0xPQ0sgPSAyICAgICAgLy8gdGhlIHNjcmVlbiBpcyBhbHNvIG9uCi19OwotCi0vLyB3aGlsZSB5b3UgaGF2ZSBhIGxvY2sgaGVsZCwgdGhlIGRldmljZSB3aWxsIHN0YXkgb24gYXQgbGVhc3QgYXQgdGhlCi0vLyBsZXZlbCB5b3UgcmVxdWVzdC4KLQotc3RydWN0IHRpbWVfaW5mb190Ci17Ci0gICAgbG9uZyBzbGVlcF9zdGFydF90aW1lOwotICAgIGxvbmcgd2FrZXVwX3RpbWU7Ci19OwotCi1leHRlcm4gc3RydWN0IHRpbWVfaW5mb190IHRpbWVfaW5mbzsKLQotc3RydWN0IHRpbWV2YWwgdHY7Ci0KLSNpZmRlZiBNT0JJTEVURUtfU1VTUEVORF9DRkcKLXZvaWQgKmRsSGFuZGxlX3dha2Vsb2NrOwotdm9pZCAqZGxIYW5kbGVfbG9nOwotdm9pZCAqZGxIYW5kbGVfbmV0d29yazsKLXN0YXRpYyB2b2lkKiBkbEhhbmRsZV9zaW07Ci0KLWludCAoKmx5bnFfc2NyZWVuKShpbnQgbnVtKTsKLWludCAoKmx5bnFfc2ltX2luaXQpKGludCB1dG9rZW4pOwotaW50ICgqYWNxdWlyZV93YWtlX2xvY2spKGludCBsb2NrLCBjb25zdCBjaGFyKiBpZCk7Ci1pbnQgKCpyZWxlYXNlX3dha2VfbG9jaykoY29uc3QgY2hhciogaWQpOwotaW50ICgqbHlucV9xdWVyeV9yZWdpc3RyYXRpb25fc3RhdGUpKGNvbnN0IGNoYXIgKnR5cGUsaW50KiByZWdTdGF0ZSxpbnQqIGltc1JlZ1N0YXRlLGNoYXIgKiBMQUMsY2hhciAqIENJRCxpbnQgKgotbmV0VHlwZSxpbnQgKnJhZGlvVGVjaEZhbSxpbnQgKmVycm9yQ29kZSk7Ci1pbnQgKCpseW5xX25ldHdvcmtfaW5pdCkoaW50IHV0b2tlbik7Ci0KLXZvaWQgaW5pdF93YWtlbG9ja19mdW5jKHZvaWQpCi17Ci0gICAgY29uc3QgY2hhciAqbHlucUxpYlBhdGhfV2FrZUxvY2sgPSAiL3Vzci9saWI2NC9saWJwb3dlci5zbyI7Ci0gICAgY29uc3QgY2hhciAqbHlucUxpYlBhdGhfTG9nID0gIi9saWI2NC9saWJseW5xLWxvZy5zbyI7Ci0KLSAgICBkbEhhbmRsZV93YWtlbG9jayA9IGRsb3BlbihseW5xTGliUGF0aF9XYWtlTG9jaywgUlRMRF9OT1cpOwotICAgIGlmIChkbEhhbmRsZV93YWtlbG9jayA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAgIEFMT0dJKCJkbG9wZW4gbHlucUxpYlBhdGhfV2FrZUxvY2sgZmFpbGVkOiAlcyIsIGRsZXJyb3IoKSk7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gICAgZGxIYW5kbGVfbG9nID0gZGxvcGVuKGx5bnFMaWJQYXRoX0xvZywgUlRMRF9OT1cpOwotICAgIGlmIChkbEhhbmRsZV9sb2cgPT0gTlVMTCkgCi0gICAgewotICAgICAgICBBTE9HSSgiZGxvcGVuIGRsSGFuZGxlX2xvZyBmYWlsZWQ6ICVzIiwgZGxlcnJvcigpKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICBhY3F1aXJlX3dha2VfbG9jayA9IChpbnQoKikoaW50LGNvbnN0IGNoYXIqKSlkbHN5bShkbEhhbmRsZV93YWtlbG9jaywgImFjcXVpcmVfd2FrZV9sb2NrIik7Ci0gICAgaWYgKGFjcXVpcmVfd2FrZV9sb2NrID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0koImFjcXVpcmVfd2FrZV9sb2NrIG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzIiwgbHlucUxpYlBhdGhfV2FrZUxvY2spOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAgIHJlbGVhc2Vfd2FrZV9sb2NrID0gKGludCgqKSggY29uc3QgY2hhciopKWRsc3ltKGRsSGFuZGxlX3dha2Vsb2NrLCAicmVsZWFzZV93YWtlX2xvY2siKTsKLSAgICBpZiAocmVsZWFzZV93YWtlX2xvY2sgPT0gTlVMTCkgewotICAgICAgICBBTE9HSSgicmVsZWFzZV93YWtlX2xvY2sgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXMiLCBseW5xTGliUGF0aF9XYWtlTG9jayk7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0gICAgZGxlcnJvcigpOyAvLyBDbGVhciBhbnkgcHJldmlvdXMgZGxlcnJvcgotCi0gIHJldHVybjsKLX0KLQotIHZvaWQgaW5pdF9zaW1fZnVuYygpCi17Ci0gICAgaW50IHJlczsKLSAgICBjb25zdCBjaGFyICpseW5xTGliUGF0aF9TaW0gPSAiL2xpYjY0L2xpYmx5bnEtc2ltLnNvIjsKLQotICAgIHBpZCA9IGdldHBpZCgpOwotICAgIGRsSGFuZGxlX3NpbSA9IGRsb3BlbihseW5xTGliUGF0aF9TaW0sIFJUTERfTk9XKTsKLSAgICBpZiAoZGxIYW5kbGVfc2ltID09IE5VTEwpIAotICAgIHsKLSAgICAgICAgQUxPR0koImRsb3BlbiBseW5xTGliUGF0aF9TaW0gZmFpbGVkOiAlcyIsIGRsZXJyb3IoKSk7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICBseW5xX3NjcmVlbiA9IChpbnQoKikoaW50KSlkbHN5bShkbEhhbmRsZV9zaW0sICJseW5xX3NjcmVlbiIpOwotICAgIGlmIChseW5xX3NjcmVlbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dJKCJseW5xX3NjcmVlbiBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlcyIsIGx5bnFMaWJQYXRoX1NpbSk7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICBseW5xX3NpbV9pbml0ID0gKGludCgqKShpbnQgdXRva2VuKSlkbHN5bShkbEhhbmRsZV9zaW0sImx5bnFfc2ltX2luaXQiKTsKLSAgICBpZiAobHlucV9zaW1faW5pdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dJKCJseW5xX3NpbV9pbml0IG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzIiwgbHlucUxpYlBhdGhfU2ltKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICBkbGVycm9yKCk7IC8vIENsZWFyIGFueSBwcmV2aW91cyBkbGVycm9yCi0KLSAgICByZXMgPSBseW5xX3NpbV9pbml0KChpbnQpcGlkKTsKLSAgICBpZihyZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIEFMT0dJKCJSdW4gbHlucV9zaW1faW5pdFxuIik7Ci0gICAgfWVsc2V7Ci0gICAgICAgIEFMT0dJKCJseW5xIHNpbSBpbml0IGVycm9yXG4iKTsKLSAgICB9Ci0gICAgc2xlZXAoMSk7ICAgIAotCi0gICAgcmV0dXJuOwotfQotCi0KLXZvaWQgaW5pdF9uZXR3b3JrX2Z1bmMoKQotewotICAgIGludCByZXM7Ci0gICAgY29uc3QgY2hhciAqbHlucUxpYlBhdGhfTmV0d29yayA9ICIvbGliNjQvbGlibHlucS1uZXR3b3JrLnNvIjsKLSAgICBkbEhhbmRsZV9uZXR3b3JrID0gZGxvcGVuKGx5bnFMaWJQYXRoX05ldHdvcmssIFJUTERfTk9XKTsKLSAgICBpZiAoZGxIYW5kbGVfbmV0d29yayA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAgIEFMT0dJKCJkbG9wZW4gbHlucUxpYlBhdGhfTmV0d29yayBmYWlsZWQ6ICVzIiwgZGxlcnJvcigpKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLQotICAgIGx5bnFfcXVlcnlfcmVnaXN0cmF0aW9uX3N0YXRlID0gKGludCgqKShjb25zdCBjaGFyKixpbnQqLGludCosY2hhciAqLGNoYXIgKixpbnQgKixpbnQgKixpbnQqKSlkbHN5bSgKLWRsSGFuZGxlX25ldHdvcmssICJseW5xX3F1ZXJ5X3JlZ2lzdHJhdGlvbl9zdGF0ZSIpOwotICAgIGlmIChseW5xX3F1ZXJ5X3JlZ2lzdHJhdGlvbl9zdGF0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dJKCJseW5xX3F1ZXJ5X3JlZ2lzdHJhdGlvbl9zdGF0ZSBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlcyIsIGx5bnFMaWJQYXRoX05ldHdvcmspOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotCi0gICAgbHlucV9uZXR3b3JrX2luaXQgPSAoaW50KCopKGludCkpZGxzeW0oZGxIYW5kbGVfbmV0d29yaywgImx5bnFfbmV0d29ya19pbml0Iik7Ci0gICAgaWYgKGx5bnFfbmV0d29ya19pbml0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0koImx5bnFfbmV0d29ya19pbml0IG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzIiwgbHlucUxpYlBhdGhfTmV0d29yayk7Ci0gICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0KLSAgICBBTE9HSSgic3RhcnQgbHlucV9uZXR3b3JrX2luaXRcbiIpOwotICAgIHByaW50Zigic3RhcnQgbHlucV9uZXR3b3JrX2luaXRcbiIpOwotICAgIHJlcyA9IGx5bnFfbmV0d29ya19pbml0KDIpOwotICAgIHNsZWVwKDEwKTsKLQotICAgIGlmKHJlcyA9PSAwKQotICAgIHsKLSAgICAgICAgQUxPR0koIlJ1biBseW5xX25ldHdvcmtfaW5pdFxuIik7Ci0gICAgICAgIHByaW50ZigiUnVuIGx5bnFfbmV0d29ya19pbml0XG4iKTsKLSAgICB9ZWxzZXsKLSAgICAgICAgQUxPR0koImx5bnFfbmV0d29ya19pbml0IGVycm9yXG4iKTsKLSAgICAgICAgcHJpbnRmKCJseW5xX25ldHdvcmtfaW5pdCBlcnJvclxuIik7Ci0gICAgfSAgICAgICAKLQotICAgIGRsZXJyb3IoKTsgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGRsZXJyb3IKLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2lmZGVmIE1PQklMRVRFS19UQVJHRVRfUExBVEZPUk1fVDEwNgotaW50IHQxMDZfc2V0X2xvd3B3cihpbnQgc3RhdGUpCi17Ci0gICAgaW50IHJldDsKLSAgICBjaGFyIHJzcFsxMjhdOwotICAgIGNoYXIgY21kc3RyWzMyXTsKLSAgICBpZihzdGF0ZSA9PSAwKQotICAgIHsKLSAgICAgICAgc3RyY3B5KGNtZHN0ciwgIkFUK1pMT1dQV1I9MFxyXG4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RyY3B5KGNtZHN0ciwgIkFUK1pMT1dQV1I9MVxyXG4iKTsKLSAgICB9Ci0gICAgcmV0ID0gc2NfYXRfc2VuZCgxLGNtZHN0cixyc3Asc2l6ZW9mKHJzcCkpOwotICAgIHByaW50ZigiQVQrWkxPV1BXUiByZXN1bHQ6JWQgJXNcbiIscmV0LHJzcCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IHQxMDZfc2V0X2JsYWNrbGlzdChpbnQgYmxhY2tsaXN0X3N0YXRlKQotewotICAgIGludCByZXQ7Ci0gICAgY2hhciByc3BbMTI4XTsKLSAgICBjaGFyIGNtZHN0clsxMjhdOwotICAgIGlmKGJsYWNrbGlzdF9zdGF0ZSA9PSAwKQotICAgIHsKLSAgICAgICAgc3RyY3B5KGNtZHN0ciwgIkFUK1NIRUxMPWVjaG8gXCIrQ1JFRzorQ0dSRUc6K0NFUkVHOl5NT0RFOlwiID4gL3N5cy9tb2R1bGUvYXRfaW8vcGFyYW1ldGVycy9hdF9wc21fZmlsdGVyXHJcbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdHJjcHkoY21kc3RyLCAiQVQrU0hFTEw9ZWNobyBcIlwiID4gL3N5cy9tb2R1bGUvYXRfaW8vcGFyYW1ldGVycy9hdF9wc21fZmlsdGVyXHJcbiIpOwotICAgIH0KLSAgICByZXQgPSBzY19hdF9zZW5kKDEsY21kc3RyLHJzcCxzaXplb2YocnNwKSk7Ci0gICAgcHJpbnRmKCJBVCtTSEVMTD1lY2hvIHJlc3VsdDolZCAlc1xuIixyZXQscnNwKTsKLSAgICByZXR1cm4gcmV0OwotCi19Ci1pbnQgdDEwNl9zZXRfd2hpdGVsaXN0KHZvaWQpCi17Ci0gICAgY2hhciB0bXBbOF07Ci0gICAgaW50IHJldDsKLSAgICBseW5xX2dldF92YWx1ZShMT0dfVUNJX0ZJTEUsIExPR19VQ0lfTU9EVUxFLCAid2hpdGVsaXN0X3N0YXRlIiwgdG1wKTsKLSAgICBpZihzdHJsZW4odG1wKSAhPSA0KQotICAgIHsKLSAgICAgICAgUkxPR0QoInRoZSB3aGl0ZWxpc3QgbGVuIGlzIGVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmKHRtcFswXSA9PSAnMScpCi0gICAgewotICAgICAgICByZXQgPSBzY19tbmV0X3doaXRlbGlzdF9hZGQoMSk7Ci0gICAgICAgIGlmKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgUkxPR0QoInNjX21uZXRfd2hpdGVsaXN0X2FkZCAxIGZhaWxcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBzY19tbmV0X3doaXRlbGlzdF9hZGQoNSk7Ci0gICAgICAgIGlmKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgUkxPR0QoInNjX21uZXRfd2hpdGVsaXN0X2FkZCA1IGZhaWxcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZih0bXBbMV0gPT0gJzEnKQotICAgIHsKLSAgICAgICAgcmV0ID0gIHNjX21uZXRfd2hpdGVsaXN0X2FkZCgyKTsKLSAgICAgICAgaWYocmV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBSTE9HRCgic2NfbW5ldF93aGl0ZWxpc3RfYWRkIDIgZmFpbFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHRtcFsyXSA9PSAnMScpCi0gICAgewotICAgICAgICByZXQgPSAgc2NfbW5ldF93aGl0ZWxpc3RfYWRkKDMpOwotICAgICAgICBpZihyZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJMT0dEKCJzY19tbmV0X3doaXRlbGlzdF9hZGQgMyBmYWlsXG4iKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYodG1wWzNdID09ICcxJykKLSAgICB7Ci0gICAgICAgIHJldCA9ICBzY19tbmV0X3doaXRlbGlzdF9hZGQoNCk7Ci0gICAgICAgIGlmKHJldCkKLSAgICAgICAgewotICAgICAgICAgICAgUkxPR0QoInNjX21uZXRfd2hpdGVsaXN0X2FkZCA0IGZhaWxcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotCi19Ci1pbnQgdDEwNl9lYXJseV9zdXNwZW5kKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLQotICAgIFJMT0dEKCJ0MTA2X2Vhcmx5X3N1c3BlbmQgc3RhcnRcbiIpOwotICAgIHJldD1seW5xX3NsZWVwX3N0YXR1cygwKTsKLSAgICBSTE9HRCgibHlucV9nZXRfc2xlZXBfc3RhdHVzIHJldD0lZFxuIiwgcmV0KTsKLSAgICByZXQgPSB0MTA2X3NldF9sb3dwd3IoMSk7Ci0gICAgUkxPR0QoInQxMDZfc2V0X2xvd3B3ciBzdGF0dXMgcmV0PSVkXG4iLCByZXQpOwotICAgIHN5c3RlbSgiemxvZ19udmN0cmwgLW0gMSIpOwotICAgIHJldCA9IHQxMDZfc2V0X3doaXRlbGlzdCgpOwotICAgIGlmKHJldCkKLSAgICB7Ci0gICAgICAgIFJMT0dEKCJ0MTA2X3NldF93aGl0ZWxpc3QgcmV0PSVkXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXQgPSB0MTA2X3NldF9ibGFja2xpc3QoMCk7Ci0gICAgaWYocmV0KQotICAgIHsKLSAgICAgICAgUkxPR0QoInQxMDZfc2V0X2JsYWNrbGlzdCByZXQ9JWRcbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIHQxMDZfZWFybHlfcmVzdW1lKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICBSTE9HRCgidDEwNl9lYXJseV9yZXN1bWUgc3RhcnRcbiIpOwotICAgIHJldCA9IHQxMDZfc2V0X2JsYWNrbGlzdCgxKTsKLSAgICBpZihyZXQpCi0gICAgewotICAgICAgICBSTE9HRCgidDEwNl9zZXRfd2hpdGVsaXN0IHJldD0lZFxuIiwgcmV0KTsKLSAgICB9Ci0gICAgcmV0ID0gc2NfbW5ldF93aGl0ZWxpc3RfY2xlYXIoKTsKLSAgICBpZihyZXQpCi0gICAgewotICAgICAgICBSTE9HRCgic2NfbW5ldF93aGl0ZWxpc3RfY2xlYXIgcmV0PSVkXG4iLCByZXQpOwotICAgIH0KLSAgICBzeXN0ZW0oInpsb2dfbnZjdHJsIC1tIDAiKTsKLSAgICByZXQgPSB0MTA2X3NldF9sb3dwd3IoMCk7Ci0gICAgUkxPR0QoInQxMDZfc2V0X2xvd3B3ciBzdGF0dXMgcmV0PSVkXG4iLCByZXQpOwotICAgIHJldD1seW5xX3NsZWVwX3N0YXR1cygxKTsKLSAgICBSTE9HRCgibHlucV9nZXRfc2xlZXBfc3RhdHVzIHJldD0lZFxuIiwgcmV0KTsKLQotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLSNpZmRlZiBNT0JJTEVURUtfU1VTUEVORF9DRkcKLWludCB0ODAwX2Vhcmx5X3N1c3BlbmQoY2hhciAqd2FrZXVwX2NvdW50LCBpbnQgd2FrZXVwX2NvdW50X2xlbikKLXsKLSAgICBjaGFyIGJ1Zls4MF07Ci0gICAgc3lzdGVtKCJlY2hvIFwiU3lzIHN0YW5kYnkgbW9kZVwiID4vZGV2L2NvbnNvbGUiKTsKLSAgICAvLyBzbGVlcCgxKTsKLSAgICBzeXN0ZW0oImVjaG8gNyB8IGVtZGxvZ2dlcl9jdHJsIik7Ci0gICAgLy8gc2xlZXAoMSk7Ci0KLSAgICBpZiAobHlucV9zY3JlZW4oMCkgIT0gMCkgIC8vbm90aWZ5IHJpbCBmb3Igc2NyZWVuIG9mZgotICAgIHsKLSAgICAgICAgQUxPR0koImx5bnFfc2NyZWVuIG9mZiBmYWlsXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzeXN0ZW0oImVjaG8gbW9kZSA0IDAgPi9zeXMvZGV2aWNlcy9wbGF0Zm9ybS8xMDAwNTAwMC5waW5jdHJsL210X2dwaW8iKTsKLSAgICBzeXN0ZW0oImVjaG8gb3V0IDQgMSA+L3N5cy9kZXZpY2VzL3BsYXRmb3JtLzEwMDA1MDAwLnBpbmN0cmwvbXRfZ3BpbyIpOwotICAgIFJMT0dEKCJyaW5nIEdQSU8gUEFTU1xuIik7Ci0gICAgc3lzdGVtKCJod2Nsb2NrIC13Iik7Ci0gICAgUkxPR0QoIlRJTUU6IHN5cyB0byBydGNcbiIpOwotICAgIGxzZWVrKHdha2V1cF9jb3VudF9mZCwgMCwgU0VFS19TRVQpOwotICAgIHN5c3RlbSgiZWNobyBcImF1dG9zdXNwZW5kOlN5cyBzZWVrXCIgPi9kZXYvY29uc29sZSIpOwotICAgIHdha2V1cF9jb3VudF9sZW4gPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZCh3YWtldXBfY291bnRfZmQsIHdha2V1cF9jb3VudCwKLSAgICAgICAgICAgICAgIDIwMCkpOwotICAgIEFMT0dFKCIlczogJWQsIHdyaXRlICVzIHRvIHdha2V1cF9jb3VudFxuIiwgX19mdW5jX18sIHdha2V1cF9jb3VudF9sZW4sIHdha2V1cF9jb3VudCk7Ci0gICAgaWYgKHdha2V1cF9jb3VudF9sZW4gPCAwKSB7Ci0gICAgICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWFkaW5nIGZyb20gJXM6ICVzXG4iLCBTWVNfUE9XRVJfV0FLRVVQX0NPVU5ULCBidWYpOwotICAgICAgICAgICAgd2FrZXVwX2NvdW50X2xlbiA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLQotICAgIGZvcihpbnQgaSA9IDA7aSA8IDU7aSsrKSAgLy9ub3RpZnkgc3BtIChvdGhlciBjb3JlKSB0byBoYW5kbGUgcHJlLXNsZWVwIGNvbmZpZ3VyYXRpb24KLSAgICB7Ci0gICAgICAgIGlmKFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShzdXNwZW5kX2N0cmxfZmQscmVnX25ldHN5c1tpXSxzdHJsZW4ocmVnX25ldHN5c1tpXSkpKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmVycm9yX3IoZXJybm8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgQUxPR0koIkVycm9yIHdyaXRpbmcgdG8gJXM6ICVzXG4iLCBTWVNfUE9XRVJfU1BNX1NVU1BFTkRfQ1JUTCwgYnVmKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSAgICAKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdDgwMF9lYXJseV9yZXN1bWUoYm9vbCBzdWNjZXNzKQotewotICAgIHN5c3RlbSgiaHdjbG9jayAtcyIpOwotICAgIFJMT0dEKCJUSU1FOiBydGMgdG8gc3lzXG4iKTsKLSAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgewotCi0gICAgICAgc3lzdGVtKCJtZGxvZ2N0bCBzdGFydCIpOwotCi0gICAgICAgc3lzdGVtKCJlY2hvIDggfCBlbWRsb2dnZXJfY3RybCIpOwotICAgIAotICAgICAgIHVzbGVlcCgyMDAwMDApOyAKLSAgICAgICBBTE9HSSgiTG9nIG9uIHdpdGggZmFpbHVyZVxuIik7Ci0gICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGx5bnFfc2NyZWVuKDEpICE9IDApICAvLyBub3RpZnkgcmlsIGZvciBzY3JlZW4gb24KLSAgICB7Ci0gICAgICAgIEFMT0dJKCJseW5xX3NjcmVlbiBvbiBmYWlsXG4iKTsKLSAgICB9Ci0KLSAgICBzeXN0ZW0oIm1kbG9nY3RsIHN0YXJ0Iik7Ci0KLSAgICBzeXN0ZW0oImVjaG8gOCB8IGVtZGxvZ2dlcl9jdHJsIik7Ci0gICAgdXNsZWVwKDMwMDAwMCk7IC8vZGVsYXkgMnMgZm9yIHJpbCBoYW5kbGluZyBzY3JlZW4gb24sYXQgbGVhc3QgNzBtcwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYKLQotCi1zdGF0aWMgaW50IHN1c3BlbmRfY3RybChjaGFyICp3YWtldXBfY291bnQsaW50IHdha2V1cF9jb3VudF9sZW4pCi17Ci0KLQotICAgIGNoYXIgYnVmWzgwXTsKLSAgICBpbnQgcmV0ID0gMDsKLSNpZmRlZiBNT0JJTEVURUtfU1VTUEVORF9DRkcKLSAgICByZXQgPSB0ODAwX2Vhcmx5X3N1c3BlbmQoY2hhciAqd2FrZXVwX2NvdW50LCB3YWtldXBfY291bnRfbGVuKTsKLSAgICBpZihyZXQgIT0gMCkKLSAgICB7Ci0JQUxPR0QoInQ4MDBfZWFybHlfc3VzcGVuZCBmYWlsXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotCi0KLSNpZmRlZiBNT0JJTEVURUtfVEFSR0VUX1BMQVRGT1JNX1QxMDYKLSAgICByZXQgPSB0MTA2X2Vhcmx5X3N1c3BlbmQoKTsKLSAgICBpZihyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAgIEFMT0dEKCJ0MTA2X2Vhcmx5X3N1c3BlbmQgZmFpbFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHN5c3RlbSgiZWNobyBcImF1dG9zdXNwZW5kOlN5cyBzdXNwZW5kXCIgPi9kZXYvY29uc29sZSIpOwotICAgIGlmKFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShzdGF0ZV9mZCwgc2xlZXBfc3RhdGUsIHN0cmxlbihzbGVlcF9zdGF0ZSkpKSA8IDApIC8vZW50ZXIgc3VzcGVuZCBwcm9jZWR1cmVzIGluIGtlcm5lbAotICAgIHsKLSAgICAgICAgc3RyZXJyb3JfcihlcnJubywgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgIEFMT0dJKCJFcnJvciB3cml0aW5nIHRvICVzOiAlc1xuIiwgU1lTX1BPV0VSX1NUQVRFLCBidWYpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCB3YWtldXBfZmVlZGJhY2soYm9vbCBzdWNjZXNzKQotewotCi0gICAgY2hhciBidWZbODBdOwotICAgIGxvbmcgc2xlZXB0aW1lID0gMDsKLQotI2lmZGVmIE1PQklMRVRFS19TVVNQRU5EX0NGRwotICAgIHQ4MDBfZWFybHlfcmVzdW1lKGJvb2wgc3VjY2Vzcyk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgTU9CSUxFVEVLX1RBUkdFVF9QTEFURk9STV9UMTA2Ci0gICAgdDEwNl9lYXJseV9yZXN1bWUoKTsKLSNlbmRpZgotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aW1lX2luZm9fbXV0ZXgpOwotICAgIG1lbXNldCgmdHYsMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LE5VTEwpOwotICAgIC8vIHRpbWVfaW5mby53YWtldXBfdGltZSA9IHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMDsKLSAgICBlbmRfdGltZSA9IHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMDsKLSAgICBBTE9HSSgiJXM6IHdha2UgdXAgdGltZTogJWxkIG1zXG4iLCBfX2Z1bmNfXyxlbmRfdGltZSk7Ci0KLSAgICBtZW1zZXQoJnRpbWVfaW5mbywwLHNpemVvZihzdHJ1Y3QgdGltZV9pbmZvX3QpKTsKLQotICAgIHRpbWVfaW5mby5zbGVlcF9zdGFydF90aW1lID0gc3RhcnRfdGltZTsKLSAgICB0aW1lX2luZm8ud2FrZXVwX3RpbWUgPSBlbmRfdGltZTsKLSAgICBzbGVlcHRpbWUgPSBlbmRfdGltZSAtc3RhcnRfdGltZTsKLSAgICBSTE9HRCgic2xlZXAgdGltZSBpcyAlbGQgbXNcbiIsIHNsZWVwdGltZSk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRpbWVfaW5mb19tdXRleCk7Ci0KLSAgICBpZiAocHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmZmVlZGJhY2tfY29uZCkgIT0gMCkgewotICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIGJyb2FkY2FzdCBjb25kOiAlc1xuIiwgYnVmKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gOwotCi19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9zbGVlcF90aW1lKGJvb2wgc3VjY2VzcykgewotICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIHNsZWVwX3RpbWUgPSBCQVNFX1NMRUVQX1RJTUU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gZG91YmxlIHNsZWVwIHRpbWUgYWZ0ZXIgZWFjaCBmYWlsdXJlIHVwIHRvIG9uZSBtaW51dGUKLSAgICBzbGVlcF90aW1lID0gTUlOKHNsZWVwX3RpbWUgKiAyLCBwb3NzaWJsZV9tYXhfc2xlZXBfdGltZSk7Ci19Ci0KLXN0YXRpYyB2b2lkICpzdXNwZW5kX3RocmVhZF9mdW5jKHZvaWQgKmFyZyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKLXsKLSAgICBjaGFyIGJ1Zls4MF07Ci0gICAgY2hhciB3YWtldXBfY291bnRbMjBdOwotICAgIGludCB3YWtldXBfY291bnRfbGVuOwotICAgIGludCByZXQ7Ci0gICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHVwZGF0ZV9zbGVlcF90aW1lKHN1Y2Nlc3MpOwotICAgICAgICB1c2xlZXAoc2xlZXBfdGltZSk7Ci0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLQotICAgICAgICBBTE9HSSgiJXM6IHdhaXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0ID0gc2VtX3dhaXQoJnN1c3BlbmRfbG9ja291dCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgIEFMT0dJKCJFcnJvciB3YWl0aW5nIG9uIHNlbWFwaG9yZTogJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dWKCIlczogcmVhZCB3YWtldXBfY291bnRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgbHNlZWsod2FrZXVwX2NvdW50X2ZkLCAwLCBTRUVLX1NFVCk7Ci0gICAgICAgIHdha2V1cF9jb3VudF9sZW4gPSBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZCh3YWtldXBfY291bnRfZmQsIHdha2V1cF9jb3VudCwKLSAgICAgICAgICAgICAgICBzaXplb2Yod2FrZXVwX2NvdW50KSkpOwotICAgICAgICBpZiAod2FrZXVwX2NvdW50X2xlbiA8IDApIHsKLSAgICAgICAgICAgIHN0cmVycm9yX3IoZXJybm8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgZnJvbSAlczogJXNcbiIsIFNZU19QT1dFUl9XQUtFVVBfQ09VTlQsIGJ1Zik7Ci0gICAgICAgICAgICB3YWtldXBfY291bnRfbGVuID0gMDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghd2FrZXVwX2NvdW50X2xlbikgewotICAgICAgICAgICAgQUxPR0UoIkVtcHR5IHdha2V1cCBjb3VudFxuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dJKCIlczogc3RhcnQgc3VzcGVuZF9jdHJsXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIG1lbXNldCgmdHYsMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLSAgICAgICAgLy8gbWVtc2V0KCZ0aW1lX2luZm8sMCAsc2l6ZW9mKHN0cnVjdCB0aW1lX2luZm9fdCkpOwotICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LE5VTEwpOwotCi0gICAgICAgIHN0YXJ0X3RpbWUgPSB0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDA7Ci0gICAgICAgIEFMT0dJKCIlczogc3VzcGVuZCBzdGFydCB0aW1lOiAlbGQgbXNcbiIsIF9fZnVuY19fLHN0YXJ0X3RpbWUpOwotICAgICAgICAvLyB0aW1lX2luZm8uc2xlZXBfc3RhcnRfdGltZSA9IHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMDsKLQotICAgICAgICByZXQgPSBzdXNwZW5kX2N0cmwod2FrZXVwX2NvdW50LHdha2V1cF9jb3VudF9sZW4pOwotCi0gICAgICAgIGlmIChyZXQgPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJzdXNwZW5kX2N0cmwgc3VjY2Vzcy5cbiIpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dJKCJzdXNwZW5kX2N0cmwgZmFsc2UuXG4iKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHZvaWQgKCpmdW5jKShib29sIHN1Y2Nlc3MpID0gd2FrZXVwX2Z1bmM7Ci0gICAgICAgICBpZiAoZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKCpmdW5jKShzdWNjZXNzKTsgLy9oYW5kbGluZyByZXN1bWUgZXZlbnQgZm9yIG90aGVyIGxpYnMgL2FwcHMKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgQUxPR0koIiVzOiByZWxlYXNlIHNlbVxuIiwgX19mdW5jX18pOwotICAgICAgICAgcmV0ID0gc2VtX3Bvc3QoJnN1c3BlbmRfbG9ja291dCk7Ci0gICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgc3RyZXJyb3JfcihlcnJubywgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICBBTE9HSSgiRXJyb3IgcmVsZWFzaW5nIHNlbWFwaG9yZTogJXNcbiIsIGJ1Zik7Ci0gICAgICAgICB9IAotCi0gICAgICAgICBpZihhZGJfZGVidWdfbW9kZSA9PSAxKSAvLyBpdCdzIG5lY2Nlc3NhcnkgdG8gd2FpdCBmb3IgYXV0b3N1c3BlbmRfZGlzYWJsZSBmdW5jdGlvbiBjYWxsaW5nIGluIGRlYnVnIG1vZGUgd2hlbiBmaW5pc2ggcmVzdW1lIHByb2NlZHVyZS4KLSAgICAgICAgIHsKLSAgICAgICAgICAgc2xlZXAoNDApOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgQUxPR0koIiVzOiBhZGJfZGVidWcgdW5zdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgQUxPR0koIiVzOiBFTkQgU0xFRVBcbiIsIF9fZnVuY19fKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X2VuYWJsZSh2b2lkKQotewotICAgIGNoYXIgYnVmWzgwXTsKLSAgICBpbnQgcmV0OwotCi0gICAgQUxPR0koImF1dG9zdXNwZW5kX3dha2V1cF9jb3VudF9lbmFibGVcbiIpOwotCi0gICAgcmV0ID0gc2VtX3Bvc3QoJnN1c3BlbmRfbG9ja291dCk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIGNoYW5naW5nIHNlbWFwaG9yZTogJXNcbiIsIGJ1Zik7Ci0gICAgfQotCi0gICAgQUxPR0koImF1dG9zdXNwZW5kX3dha2V1cF9jb3VudF9lbmFibGUgZG9uZVxuIik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGF1dG9zdXNwZW5kX3dha2V1cF9jb3VudF9kaXNhYmxlKHZvaWQpCi17Ci0gICAgY2hhciBidWZbODBdOwotICAgIGludCByZXQ7Ci0KLSAgICBBTE9HSSgiYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X2Rpc2FibGVcbiIpOwotCi0gICAgcmV0ID0gc2VtX3dhaXQoJnN1c3BlbmRfbG9ja291dCk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIGNoYW5naW5nIHNlbWFwaG9yZTogJXNcbiIsIGJ1Zik7Ci0gICAgfQotCi0gICAgQUxPR0koImF1dG9zdXNwZW5kX3dha2V1cF9jb3VudF9kaXNhYmxlIGRvbmVcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBzZXRfd2FrZXVwX2NhbGxiYWNrKHZvaWQgKCpmdW5jKShib29sIHN1Y2Nlc3MpKQotewotICAgIGlmICh3YWtldXBfZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dJKCJEdXBsaWNhdGUgd2FrZXVwIGNhbGxiYWNrIGFwcGxpZWQsIGtlZXBpbmcgb3JpZ2luYWwiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3YWtldXBfZnVuYyA9IGZ1bmM7Ci19Ci0KLXN0cnVjdCBhdXRvc3VzcGVuZF9vcHMgYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X29wcyA9IHsKLSAgICAgICAgLmVuYWJsZSA9IGF1dG9zdXNwZW5kX3dha2V1cF9jb3VudF9lbmFibGUsCi0gICAgICAgIC5kaXNhYmxlID0gYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X2Rpc2FibGUsCi19OwotCi1zdHJ1Y3QgYXV0b3N1c3BlbmRfb3BzICphdXRvc3VzcGVuZF93YWtldXBfY291bnRfaW5pdCh2b2lkKQotewotICAgIGludCByZXQ7Ci0gICAgY2hhciBidWZbODBdOwotICAgIGNoYXIgdGltZW91dF9zdHJbMTAwXT0iMTAwMDAwIjsKLSAgICBwaWQgPSBnZXRwaWQoKTsKLSAgICBjaGFyIGNtZHN0clszMl07Ci0gICAgY2hhciByc3BbMTI4XTsKLSAgICAvL2lmIChwcm9wZXJ0eV9nZXQoInN5cy5hdXRvc3VzcGVuZC50aW1lb3V0IiwgdGltZW91dF9zdHIsIE5VTEwpKQotICAgIHsKLSAgICAgICAgcG9zc2libGVfbWF4X3NsZWVwX3RpbWUgPSBhdG9pKHRpbWVvdXRfc3RyKTsKLSAgICAgICAgQUxPR0koImF1dG9zdXNwZW5kIHRpbWVvdXQgaXMgJWRcbiIsIHBvc3NpYmxlX21heF9zbGVlcF90aW1lKTsKLSAgICB9Ci0KLSAgICBzdGF0ZV9mZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKFNZU19QT1dFUl9TVEFURSwgT19SRFdSKSk7Ci0gICAgaWYgKHN0YXRlX2ZkIDwgMCkgewotICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIG9wZW5pbmcgJXM6ICVzXG4iLCBTWVNfUE9XRVJfU1RBVEUsIGJ1Zik7Ci0gICAgICAgIGdvdG8gZXJyX29wZW5fc3RhdGU7Ci0gICAgfQotCi0gICAgd2FrZXVwX2NvdW50X2ZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oU1lTX1BPV0VSX1dBS0VVUF9DT1VOVCwgT19SRFdSKSk7Ci0gICAgaWYgKHdha2V1cF9jb3VudF9mZCA8IDApIHsKLSAgICAgICAgc3RyZXJyb3JfcihlcnJubywgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgIEFMT0dJKCJFcnJvciBvcGVuaW5nICVzOiAlc1xuIiwgU1lTX1BPV0VSX1dBS0VVUF9DT1VOVCwgYnVmKTsKLSAgICAgICAgZ290byBlcnJfb3Blbl93YWtldXBfY291bnQ7Ci0gICAgfQotI2lmZGVmIE1PQklMRVRFS19TVVNQRU5EX0NGRwotICAgIHN1c3BlbmRfY3RybF9mZCA9IFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKFNZU19QT1dFUl9TUE1fU1VTUEVORF9DUlRMLCBPX1JEV1IpKTsKLSAgICBpZiAoc3VzcGVuZF9jdHJsX2ZkIDwgMCkgewotICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIG9wZW5pbmcgJXM6ICVzXG4iLCBTWVNfUE9XRVJfU1BNX1NVU1BFTkRfQ1JUTCwgYnVmKTsKLSAgICAgICAgZ290byBlcnJfb3Blbl9zdXNwZW5kX2N0cmw7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0ID0gc2VtX2luaXQoJnN1c3BlbmRfbG9ja291dCwgMCwgMCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgc3RyZXJyb3JfcihlcnJubywgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgIEFMT0dJKCJFcnJvciBjcmVhdGluZyBzZW1hcGhvcmU6ICVzXG4iLCBidWYpOwotICAgICAgICBnb3RvIGVycl9zZW1faW5pdDsKLSAgICB9Ci0jaWZkZWYgTU9CSUxFVEVLX1RBUkdFVF9QTEFURk9STV9UMTA2Ci0gICAgaWYoc2NfYXRfaW5pdCgxKSl7Ci0gICAgICAgIEFMT0dEKCJzY19hdF9pbml0IGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RyY3B5KGNtZHN0ciwgIkFUK1pQT1dTVEFUPTFcclxuIik7Ci0gICAgICAgIHByaW50ZigiQVVUT1NVU1BFTkQ6IGNtZDolc1xuIixjbWRzdHIpOwotICAgICAgICByZXQgPSBzY19hdF9zZW5kKDEsY21kc3RyLHJzcCxzaXplb2YocnNwKSk7Ci0gICAgICAgIHByaW50ZigiQVVUT1NVU1BFTkQ6IHNjX2F0X3NlbmQgcmVzdWx0OiVkICVzXG4iLHJldCxyc3ApOwotICAgICAgICAKLSAgICB9Ci0gICAgaWYoc2NfbW5ldF93aGl0ZWxpc3RfaW5pdCgpICE9IDApCi0gICAgewotICAgICAgICBBTE9HRCgic2NfbW5ldF93aGl0ZWxpc3RfaW5pdCBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0ID0gbHlucV9zaW1faW5pdCgoaW50KXBpZCk7Ci0gICAgaWYocmV0ID09IDApCi0gICAgewotICAgICAgICBBTE9HRCgiUnVuIGx5bnFfc2ltX2luaXRcbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnN1c3BlbmRfdGhyZWFkLCBOVUxMLCBzdXNwZW5kX3RocmVhZF9mdW5jLCBOVUxMKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIHN0cmVycm9yX3IocmV0LCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koIkVycm9yIGNyZWF0aW5nIHRocmVhZDogJXNcbiIsIGJ1Zik7Ci0gICAgICAgIGdvdG8gZXJyX3B0aHJlYWRfY3JlYXRlOwotICAgIH0KLQotICAgIEFMT0dJKCJTZWxlY3RlZCB3YWtldXAgY291bnRcbiIpOwotICAgIHJldHVybiAmYXV0b3N1c3BlbmRfd2FrZXVwX2NvdW50X29wczsKLQotZXJyX3B0aHJlYWRfY3JlYXRlOgotICAgIHNlbV9kZXN0cm95KCZzdXNwZW5kX2xvY2tvdXQpOwotZXJyX3NlbV9pbml0OgotICAgIGNsb3NlKHdha2V1cF9jb3VudF9mZCk7Ci1lcnJfb3Blbl93YWtldXBfY291bnQ6Ci0gICAgY2xvc2Uoc3RhdGVfZmQpOwotI2lmZGVmIE1PQklMRVRFS19TVVNQRU5EX0NGRwotZXJyX29wZW5fc3VzcGVuZF9jdHJsOgotICAgIGNsb3NlKHN1c3BlbmRfY3RybF9mZCk7Ci0jZW5kaWYKLWVycl9vcGVuX3N0YXRlOgotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9seW5xLWF1dG9zdXNwZW5kLnNoIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9seW5xLWF1dG9zdXNwZW5kLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTk2ODMxLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvbHlucS1hdXRvc3VzcGVuZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBSdW4gdGhlIGRhZW1vbgotIwotCi1EQUVNT049Imx5bnEtYXV0b3N1c3BlbmQtc2VydmljZSIKLVBJREZJTEU9Ii92YXIvcnVuLyREQUVNT04ucGlkIgotRVhFQz0iL3Vzci9iaW4vYXV0b3N1c3BlbmQiCi1FWEVDX0FSR1M9IiIKLQotCi1zdGFydCgpIHsKLSAgICAgICAgZWNobyAtbiAiU3RhcnRpbmcgJERBRU1PTi4uLiAiCi0gICAgICAgIHN0YXJ0LXN0b3AtZGFlbW9uIC0tbm8tY2xvc2UgLVMgLWIgLW0gLXAgJFBJREZJTEUgLXggJEVYRUMgLS0gJEVYRUNfQVJHUwotICAgICAgICBbICQ/IC1lcSAwIF0gJiYgZWNobyAiT0siIHx8IGVjaG8gIkVSUk9SIgotfQotCi1zdG9wKCkgewotICAgICAgICBlY2hvIC1uICJTdG9wcGluZyAkREFFTU9OLi4uICIKLSAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLUsgLXAgJFBJREZJTEUKLSAgICAgICAgWyAkPyAtZXEgMCBdICYmIGVjaG8gIk9LIiB8fCBlY2hvICJFUlJPUiIKLX0KLQotcmVzdGFydCgpIHsKLSAgICAgICAgc3RvcAotICAgICAgICBzdGFydAotfQotCi1jYXNlICIkMSIgaW4KLSAgc3RhcnR8c3RvcHxyZXN0YXJ0KQotICAgICAgICAiJDEiCi0gICAgICAgIDs7Ci0gICopCi0gICAgICAgIGVjaG8gIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fSIKLSAgICAgICAgZXhpdCAxCi1lc2FjCi0KLWV4aXQgJD8KLQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9maWxlcy9tYWluLmMgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjcwNmM5Zi4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKiAvL2RldmljZS9zeXN0ZW0vcmlsZC9yaWxkLmMKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxsaWJsb2cvbHlucV9kZWZsb2cuaD4KLSNpbmNsdWRlIDxpbmNsdWRlL2x5bnFfdWNpLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy91bi5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0KLSNkZWZpbmUgTE9HX1VDSV9NT0RVTEUgImx5bnFfYXV0b3N1c3BlbmQiCi0jZGVmaW5lIExPR19VQ0lfRklMRSAibHlucV91Y2kiCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVVUT1NVU1BFTkQiCi0KLSNkZWZpbmUgVVNFUl9MT0dfVEFHICJQTVMiCi0KLSNkZWZpbmUgU09DS19QQVRIICAiL3RtcC9hdXRvc3VzcGVuZC5jbWQuc2VydmVyIiAgLy/kuI3og73lnKjlvZPliY3ov5nkuKrnm67lvZXliJvlu7pzb2NrZXTmlofku7bvvIzlkKbliJnmiqXplJnmib7kuI3liLDmlofku7Yo5Y+v6IO95piv5Zug5Li66L+Z5piv5Zyo5YWx5Lqr5paH5Lu25aS55LiL77yM5LiN5pSv5oyB5Yib5bu6c29ja2V05paH5Lu2KQotCi0jZGVmaW5lIFNPQ0tfREFUQV9QQVRIICAiL3RtcC9hdXRvc3VzcGVuZC5kYXRhLnNlcnZlciIKLQotLy8gI2RlZmluZSBMWUlORkxPRyhYLi4uKSAgbHlucV9sb2dfZ2xvYmFsX291dHB1dChMT0dfSU5GTyxYKQotCi0jZGVmaW5lIFRJTUVfT1VUX1RJTUUgMzAKLQotCi0jZGVmaW5lIE1BWF9MSUJfQVJHUyAgICAgICAgMTYKLQotaW50IGFkYl9kZWJ1Z19tb2RlID0gMDsKLQotCi1wdGhyZWFkX2NvbmRfdCBmZWVkYmFja19jb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOwotcHRocmVhZF9tdXRleF90IGZlZWRiYWNrX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLXB0aHJlYWRfbXV0ZXhfdCB0aW1lX2luZm9fbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1leHRlcm4gaW50IGF1dG9zdXNwZW5kX2VuYWJsZSh2b2lkKTsKLWV4dGVybiBpbnQgYXV0b3N1c3BlbmRfZGlzYWJsZSh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfd2FrZWxvY2tfZnVuYyh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfc2ltX2Z1bmMoKTsKLWV4dGVybiB2b2lkIGluaXRfbmV0d29ya19mdW5jKCk7Ci1leHRlcm4gdm9pZCBzZXRfd2FrZXVwX2NhbGxiYWNrKHZvaWQgKCpmdW5jKShib29sIHN1Y2Nlc3MpKTsKLWV4dGVybiB2b2lkIHdha2V1cF9mZWVkYmFjayhib29sIHN1Y2Nlc3MpOwotZXh0ZXJuIGludCAoKmx5bnFfc2NyZWVuKShpbnQgbnVtKTsKLQotc3RydWN0IHRpbWVfaW5mb190Ci17Ci0gICAgbG9uZyBzbGVlcF9zdGFydF90aW1lOwotICAgIGxvbmcgd2FrZXVwX3RpbWU7Ci19OwotCi1zdHJ1Y3QgdGltZV9pbmZvX3QgdGltZV9pbmZvOyAKLQotc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqYXJndjApIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyAtbCA8cG9zc2libGVfbWF4X3NsZWVwX3RpbWU+IFstLSA8YXJncyBmb3IgQXV0b3N1c3BlbmQgU2VydmljZT5dXG4iLCBhcmd2MCk7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi0KLQotc3RhdGljIGludCBtYWtlX2FyZ3YoY2hhciAqIGFyZ3MsIGNoYXIgKiogYXJndikgewotICAgIC8vIE5vdGU6IHJlc2VydmUgYXJndlswXQotICAgIGludCBjb3VudCA9IDE7Ci0gICAgY2hhciAqIHRvazsKLSAgICBjaGFyICogcyA9IGFyZ3M7Ci0KLSAgICB3aGlsZSAoKHRvayA9IHN0cnRvayhzLCAiIFwwIikpKSB7Ci0gICAgICAgIGFyZ3ZbY291bnRdID0gdG9rOwotICAgICAgICBzID0gTlVMTDsKLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IEFjY2VwdChpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciAqc2EsIHNvY2tsZW5fdCAqc2FsZW5wdHIpCi17Ci0gICAgaW50IG47Ci0KLSAgICB3aGlsZSgobiA9IGFjY2VwdChmZCwgc2EsIHNhbGVucHRyKSkgPCAwKQotICAgIHsKLSAgICAgICAgaWYoKGVycm5vID09IEVDT05OQUJPUlRFRCkgfHwgKGVycm5vID09IEVJTlRSKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dJKCJhY2NlcHQgZXJyb3JcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuOwotfQotCi1zdGF0aWMgaW50IEJpbmQoaW50IGZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhLCBzb2NrbGVuX3Qgc2FsZW4pCi17Ci0gICAgaWYoYmluZChmZCwgc2EsIHNhbGVuKSA8IDApCi0gICAgewotICAgICAgICAvLyBBTE9HSSgiYmluZCBlcnJvclxuIik7Ci0gICAgICAgIHBlcnJvcigiYmluZCBlcnJvciIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgU29ja2V0KGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCi17Ci0gICAgaW50IG47Ci0KLSAgICBpZiAoIChuID0gc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG9jb2wpKSA8IDApCi0gICAgewotICAgICAgICBBTE9HSSgic29ja2V0IGVycm9yXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBMaXN0ZW4oaW50IGZkLCBpbnQgYmFja2xvZykKLXsKLSAgICBpZihsaXN0ZW4oZmQsIGJhY2tsb2cpIDwgMCkKLSAgICB7Ci0gICAgICAgIEFMT0dJKCJsaXN0ZW4gZXJyb3JcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgbGlzdGVuX3BvcnQoc3RydWN0IHNvY2thZGRyX3VuICphZGRyLCBjaGFyICpzb2NrcGF0aCkKLXsKLSAgICBpbnQgbGlzdGVuZmQ7Ci0gICAgbGlzdGVuZmQgPSBTb2NrZXQoQUZfVU5JWCxTT0NLX1NUUkVBTSwwKTsKLSAgICBpZihsaXN0ZW5mZCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIG1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKSk7Ci0gICAgYWRkci0+c3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gICAgc3RyY3B5KGFkZHItPnN1bl9wYXRoLHNvY2twYXRoKTsKLSAgICAvLyBpbnQgb3B0ID0gMTsKLQkvLyBpZihzZXRzb2Nrb3B0KGxpc3RlbmZkLCBTT0xfU09DS0VULFNPX1JFVVNFQUREUiwgKGNvbnN0IHZvaWQgKikmb3B0LCBzaXplb2Yob3B0KSkgPT0gLTEpCi0gICAgLy8gewotICAgIC8vICAgICBwZXJyb3IoInNldHNvY2tvcHQgZXJyb3IiKTsKLSAgICAvLyAgICAgcmV0dXJuIC0xOwotICAgIC8vIH0KLQotLy8g5Lul5LiK5pa55rOV5a+56Z2e572R57uc55qE5pys5Zywc29ja2V05peg5pWI77yM5bqU6K+l55SodW5saW5r5Ye95pWw6YG/5YWNQWRkcmVzcyBhbHJlYWR5IGluIHVzZeeahOmUmeivrwotCi0KLSAgICB1bmxpbmsoc29ja3BhdGgpOwotICAgIGlmKEJpbmQobGlzdGVuZmQsKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsc2l6ZW9mKCphZGRyKSkgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmKExpc3RlbihsaXN0ZW5mZCwyMCkgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiBsaXN0ZW5mZDsgCi19Ci0KLXN0YXRpYyBzc2l6ZV90IFJlYWQoaW50IGZkLCB2b2lkICpwdHIsIHNpemVfdCBuYnl0ZXMpCi17Ci0gICAgc3NpemVfdCBuOwotICAgIAotICAgIHdoaWxlKChuID0gcmVhZChmZCwgcHRyLCBuYnl0ZXMpKSA9PSAtMSkKLSAgICB7Ci0gICAgICAgLy9wcmludGYoIlJFQUQsJWRcbiIsZmQpOwotICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0JCXsJCi0JCQlBTE9HSSgicmVhZCBlcnJvciBlaW50clxuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLQkJfQotICAgICAgICBlbHNlIGlmKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0koInJlYWQgdGltZSBvdXRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0koInJlYWQgZXJyb3JcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vc2xlZXAoMik7Ci0gICAgLy9wcmludGYoIlJFQUQxLCVkXG4iLCBmZCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IFdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbmJ5dGVzKQotewotICAgIHNzaXplX3QgbjsKLQotICAgIHdoaWxlKChuID0gd3JpdGUoZmQsIHB0ciwgbmJ5dGVzKSkgPT0gLTEpCi0gICAgewotICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZWxzZSBpZihlcnJubyA9PSBFUElQRSkKLQkJewotCQkJQUxPR0koIndyaXRlIGVycm9yIGVwaXBlXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfSAgCi0JCWVsc2UKLQkJCXJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgQ2xvc2UoaW50IGZkKQotewotICAgIGlmIChjbG9zZShmZCkgPT0gLTEpCi0gICAgewotICAgICAgICBBTE9HSSgiY2xvc2UgZXJyb3JcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCXJldHVybiAwOwotfQotCi0KLXZvaWQgKmRlYWxfYXV0b3N1c3BlbmQodm9pZCAqc29ja2ZkKQotewotICAgIGludCBjb21tZmQgPSAqKChpbnQgKilzb2NrZmQpOwotICAgIGNoYXIgYnVmWzIwXTsKLSAgICBjaGFyIHJlc1sxNV07Ci0KLSAgICB3aGlsZSgxKQotICAgIHsKLSAgICAgICAgbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKLSAgICAgICAgQUxPR0koImRlYWxfYXV0b3N1c3BlbmQgc3RhcnQgdG8gcmVhZC5cbiIpOwotICAgICAgICAvLyDplJnor6/ngrnvvJpyZWFk5Ye95pWw5Zyo5a+556uv5YWz6Zet5ZCO77yM5Lmf5Lya55u05o6l6L+U5ZueMCzkuI3kvJrpmLvloZ7vvIzlm6DmraTopoHliKTmlq3mmK/lkKbov5Tlm54wLOi/lOWbnjDooajnpLrlr7nnq6/lt7Lnu4/lhbPpl63vvIzmraTml7bopoHot7Plh7p3aGlsZeW+queOr+S4jeWGjeebkeWQrAotICAgICAgICAvLyDkuLrku4DkuYjlr7nnq6/kvJrlhbPpl63vvJ/lm6DkuLrlnKjlrqLmiLfnq6/msqHmnInnlKhub2h1cOaWueW8j+aJk+W8gOeahOaDheWGteS4i++8jOezu+e7n+edoeecoOWQjuWuouaIt+err+i/m+ihjOS8muebtOaOpeiiq+adgOatu++8jOWvueerr+S8muWFs+mXre+8jOaJgOS7peS8muWvvOiHtHJlYWTkuI3pmLvloZ7vvIzkuJTmgLvmmK/ov5Tlm54w55qE546w6LGhCi0gICAgICAgIGlmKFJlYWQoY29tbWZkLGJ1ZixzaXplb2YoYnVmKSkgPD0gMCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dJKCJzZXJ2aWNlIHJlY2VpdmUgc3VzcGVuZF9jbWQgZmFpbCBvciBjbGllbnQgaXMgY2xvc2VkLlxuIik7Ci0gICAgICAgICAgICBDbG9zZShjb21tZmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc3RyY21wKGJ1ZiwiZW5hYmxlIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoYXV0b3N1c3BlbmRfZW5hYmxlKCkgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dJKCJhdXRvc3VzcGVuZF9lbmFibGUgZmFpbC5cbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFMT0dJKCJhdXRvc3VzcGVuZF9lbmFibGUgc3VjY2Vzcy5cbiIpOwotICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihzdHJjbXAoYnVmLCJkaXNhYmxlIikgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoYXV0b3N1c3BlbmRfZGlzYWJsZSgpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiYXV0b3N1c3BlbmRfZGlzYWJsZSBmYWlsLlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImF1dG9zdXNwZW5kX2Rpc2FibGUgc3VjY2Vzcy5cbiIpOwotCi0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0koIlVua25vd24gY21kIDogJXNcbiIsYnVmKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLQotfQotCi0jaWZkZWYgR1NXX1NVU1BFTkRfQ0ZHCi0vKmpiLnFpIGFkZCBmb3Igc2VydmljZSBzZW5kIHdoZW4gRFRSIGlzIGxvdyBvbiAyMDIyMTExMSBzdGFydCAqLwotdm9pZCAqZHRyX3dha2V1cCgpCi17Ci0gICAgRklMRSAqZnA7Ci0gICAgaW50IHJldDsKLSAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotICAgIGNoYXIgYnVmWzMwXTsKLSAgICBjaGFyIGR0cl9idWZmZXJbMjVdOwotICAgIFJMT0dEKCJkdHJfd2FrZXVwIHN0YXJ0XG4iKTsKLSAgICB3aGlsZSgxKQotICAgIHsKLSAgICAgICAgZnAgPSBwb3BlbigiY2F0IC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS8xMDAwNTAwMC5waW5jdHJsL210X2dwaW8gfGdyZXAgMDA2OiIsInIiKTsKLSAgICAgICAgZmdldHMoZHRyX2J1ZmZlciwgc2l6ZW9mKGR0cl9idWZmZXIpLCBmcCk7Ci0gICAgICAgIGlmKGR0cl9idWZmZXJbN10gPT0gJzAnKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aW1lX2luZm8uc2xlZXBfc3RhcnRfdGltZSA9IDEyMzsKLSAgICAgICAgICAgIHRpbWVfaW5mby53YWtldXBfdGltZSA9IDEyMzsKLSAgICAgICAgICAgIGlmIChwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZmZWVkYmFja19jb25kKSAhPSAwKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJlcnJvcl9yKGVycm5vLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICBBTE9HSSgiRXJyb3IgYnJvYWRjYXN0IGNvbmQ6ICVzXG4iLCBidWYpOwotICAgICAgICAgICAgfSAgIAotICAgICAgICAgICAgUkxPR0QoImR0cl93YWtldXAgc3VjY2VzcyFcbiIpOwotICAgICAgICAgICAgc2xlZXAoMyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKDUwMCk7Ci0gICAgICAgIHBjbG9zZShmcCk7Ci0gICAgfQotfQotLypqYi5xaSBhZGQgZm9yIHNlcnZpY2Ugc2VuZCB3aGVuIERUUiBpcyBsb3cgb24gMjAyMjExMTEgZW5kICovCi0jZW5kaWYKLQotdm9pZCAqc2VuZF9mZWVkYmFjayh2b2lkICpzb2NrZmQpCi17Ci0gICAgaW50IGNvbW1mZCA9ICooKGludCAqKXNvY2tmZCk7Ci0gICAgY2hhciBidWZbODBdOwotCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICBtZW1zZXQoYnVmLDAsc2l6ZW9mKGJ1ZikpOwotICAgICAgICBBTE9HSSgic2VuZF9mZWVkYmFjayB0aHJlYWQgd2FpdCB0byBzZW5kLlxuIik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZmVlZGJhY2tfbXV0ZXgpOwotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmZmVlZGJhY2tfY29uZCwmZmVlZGJhY2tfbXV0ZXgpOwotCi0gICAgICAgIEFMT0dJKCJzZW5kX2ZlZWRiYWNrIHRocmVhZCBpcyBub3cgc2VuZGluZyB0aGUgZmVlZGJhY2sgdG8gY2xpZW50LlxuIik7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGltZV9pbmZvX211dGV4KTsKLSAgICAgICAgaWYoV3JpdGUoY29tbWZkLCZ0aW1lX2luZm8sc2l6ZW9mKHN0cnVjdCB0aW1lX2luZm9fdCkpIDw9IDApIAotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HSSgic2VydmljZSBzZW5kIHdha2V1cF9mZWVkYmFjayBzdHJ1Y3QgZmFpbC5cbiIpOwotICAgICAgICAgICAgQ2xvc2UoY29tbWZkKTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aW1lX2luZm9fbXV0ZXgpOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZlZWRiYWNrX211dGV4KTsKLSNpZmRlZiBHU1dfU1VTUEVORF9DRkcKLSAgICAgICAgICAgIGNvbnRpbnVlIDsvL2piLnFpIGFkZCBmb3Igc2VydmljZSBzZW5kIHdoZW4gRFRSIGlzIGxvdyBvbiAyMDIyMTExMSAKLSNlbmRpZgotCi0jaWZkZWYgTU9CSUxFVEVLX1NVU1BFTkRfQ0ZHCi0gICAgICAgICAgICBicmVhayA7Ci0jZW5kaWYKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aW1lX2luZm9fbXV0ZXgpOwotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmZWVkYmFja19tdXRleCk7Ci0KLQotCi0gICAgfQotCi19Ci0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0KLQotICAgIC8vIGludCBpID0gMDsKLSAgICAvLyBSTE9HRCgiKipBdXRvc3VzcGVuZCBTZXJ2aWNlIERhZW1vbiBTdGFydGVkKioiKTsKLSAgICAvLyBSTE9HRCgiKipBdXRvc3VzcGVuZCBTZXJ2aWNlIHBhcmFtIGNvdW50PSVkKioiLCBhcmdjKTsKLSAgICBjaGFyIHRtcFsyMF07Ci0KLSAgICBpbnQgY29tbWZkLCBjb21tZmRfZGF0YSwgc2VydmVyX3NvY2ssIHNlcnZlcl9kYXRhX3NvY2ssbGVuLCBsZW5fZGF0YTsKLQotICAgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2ZXJfc29ja2FkZHI7Ci0gICAgc3RydWN0IHNvY2thZGRyX3VuIHNlcnZlcl9kYXRhX3NvY2thZGRyOwotICAgIHN0cnVjdCBzb2NrYWRkcl91biBjbGllbnRfc29ja2FkZHI7Ci0KLSAgICBsZW4gPSBzaXplb2Yoc2VydmVyX3NvY2thZGRyKTsKLQotCi0gICAgcHRocmVhZF90IHRpZDsKLSNpZmRlZiBHU1dfU1VTUEVORF9DRkcKLQlwdGhyZWFkX3QgdGlkXzE7Ly9qYi5xaSBhZGQgZm9yIHNlcnZpY2Ugc2VuZCB3aGVuIERUUiBpcyBsb3cgb24gMjAyMjExMTEgCi0jZW5kaWYKLSAgICAKLSAgICBMWUxPR0VJTklUKFVTRVJfTE9HX1RBRyk7Ci0gICAgTFlMT0dTRVQoTE9HX0RFQlVHKTsgICAgCi0gICAgLy8gTFlMT0dTRVQoTE9HX0VSUk9SKTsKLQotICAgIGludCBhdXRvX2VuYWJsZSA9IDA7Ci0KLSAgICBseW5xX2dldF92YWx1ZShMT0dfVUNJX0ZJTEUsIExPR19VQ0lfTU9EVUxFLCAiZGVidWciLCB0bXApOyAvLyDljbPojrflj5bns7vnu5/lsYLpnaLnmoTnjq/looPlj5jph48KLSAgICBBTE9HSSgiQXV0b3N1c3BlbmQgU2VydmljZSBEYWVtb24uIGRlYnVnICVzXG4iLHRtcCk7Ci0gICAgYWRiX2RlYnVnX21vZGU9YXRvaSh0bXApOwotICAgIGx5bnFfZ2V0X3ZhbHVlKExPR19VQ0lfRklMRSwgTE9HX1VDSV9NT0RVTEUsICJhdXRvX2VuYWJsZSIsIHRtcCk7Ci0gICAgYXV0b19lbmFibGU9YXRvaSh0bXApOwotICAgIEFMT0dJKCJBdXRvc3VzcGVuZCBTZXJ2aWNlIERhZW1vbi4gYXV0b19lbmFibGUgJXNcbiIsdG1wKTsKLSNpZmRlZiBNT0JJTEVURUtfU1VTUEVORF9DRkcKLSAgICBpbml0X3dha2Vsb2NrX2Z1bmMoKTsKLSAgICBpbml0X3NpbV9mdW5jKCk7Ci0jZW5kaWYKLSAgICBzaWduYWwoU0lHUElQRSxTSUdfSUdOKTsgLy8g5b+955WlU0lHUElQReS/oeWPt++8jOmYsuatoueUseS6juWuouaIt+err+WFs+mXre+8jOe7p+e7reW+gOWuouaIt+err3dyaXRl77yM5Lya5a+86Ie05pyN5Yqh56uv5pS25YiwU0lHUElQReS/oeWPt+iAjEJyb2tlbiBwaXBlCi0KLSAgICAKLSAgICAvLyBpbml0X25ldHdvcmtfZnVuYygpOwotCi0gICAgLy8gaWYocHRocmVhZF9jb25kX2luaXQoJmZlZWRiYWNrX2NvbmQsTlVMTCkgIT0gMCkKLSAgICAvLyB7Ci0gICAgLy8gICAgIHN0cmVycm9yX3IoZXJybm8sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgIC8vICAgICBBTE9HSSgiRXJyb3IgY3JlYXRpbmcgY29uZDogJXNcbiIsIGJ1Zik7Ci0gICAgLy8gICAgIHJldHVybiAtMTsKLSAgICAvLyB9Ci0KLSAgICBzZXRfd2FrZXVwX2NhbGxiYWNrKHdha2V1cF9mZWVkYmFjayk7Ci0gICAgLy8g5rOo5YaM5Zue6LCD5Ye95pWwCi0KLSAgIGlmKGF1dG9fZW5hYmxlPT0wKQotICAgewotICAgICAgaWYoYXV0b3N1c3BlbmRfZGlzYWJsZSgpIDwgMCkKLSAgICAgewotICAgICAgIEFMT0dJKCJhdXRvc3VzcGVuZF9kaXNhYmxlIGZhaWwuXG4iKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBBTE9HSSgiYXV0b3N1c3BlbmRfZGlzYWJsZSBzdWNjZXNzLlxuIik7Ci0gICAgIH0KLSAgIH0KLSAgIGlmKGF1dG9fZW5hYmxlPT0xKQotICAgewotICAgICAgaWYoYXV0b3N1c3BlbmRfZW5hYmxlKCkgPCAwKQotICAgICB7Ci0gICAgICAgQUxPR0koImF1dG9zdXNwZW5kX2VuYWJsZSBmYWlsLlxuIik7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgQUxPR0koImF1dG9zdXNwZW5kX2VuYWJsZSBzdWNjZXNzLlxuIik7Ci0gICAgIH0KLSAgIH0KLQotCi0gICAgc2VydmVyX3NvY2sgPSBsaXN0ZW5fcG9ydCgmc2VydmVyX3NvY2thZGRyLFNPQ0tfUEFUSCk7Ci0gICAgaWYoc2VydmVyX3NvY2sgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHNlcnZlcl9kYXRhX3NvY2sgPSBsaXN0ZW5fcG9ydCgmc2VydmVyX2RhdGFfc29ja2FkZHIsU09DS19EQVRBX1BBVEgpOwotICAgIGlmKHNlcnZlcl9kYXRhX3NvY2sgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLSNpZmRlZiBHU1dfU1VTUEVORF9DRkcKLSAgICAvKmpiLnFpIGFkZCBmb3Igc2VydmljZSBzZW5kIHdoZW4gRFRSIGlzIGxvdyBvbiAyMDIyMTExMSBzdGFydCovCi0gICAgcHRocmVhZF9jcmVhdGUoJnRpZF8xLE5VTEwsZHRyX3dha2V1cCxOVUxMKTsKLSAgICBwdGhyZWFkX2RldGFjaCh0aWRfMSk7Ci0gICAgLypqYi5xaSBhZGQgZm9yIHNlcnZpY2Ugc2VuZCB3aGVuIERUUiBpcyBsb3cgb24gMjAyMjExMTEgZW5kKi8KLSNlbmRpZgotCi0gICAgd2hpbGUgKDEpCi0gICAgewotICAgICAgICBBTE9HSSgic2VydmljZSBzb2NrZXQgbGlzdGVuaW5nLi4uXG4iKTsKLSAgICAgICAgY29tbWZkID0gQWNjZXB0KHNlcnZlcl9zb2NrLChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xpZW50X3NvY2thZGRyLCZsZW4pOwotICAgICAgICBpZihjb21tZmQgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZihnZXRwZWVybmFtZShjb21tZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xpZW50X3NvY2thZGRyLCAmbGVuKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR0koIkdFVFBFRVJOQU1FIEVSUk9SLlxuIik7Ci0gICAgICAgICAgICAvLyBDbG9zZShzZXJ2ZXJfc29jayk7Ci0gICAgICAgICAgICBDbG9zZShjb21tZmQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HSSgiQ2xpZW50IHNvY2tldCBmaWxlcGF0aDogJXNcbiIsIGNsaWVudF9zb2NrYWRkci5zdW5fcGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tZmRfZGF0YSA9IEFjY2VwdChzZXJ2ZXJfZGF0YV9zb2NrLE5VTEwsTlVMTCk7Ci0gICAgICAgIGlmKGNvbW1mZF9kYXRhID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0koImRhdGEgY2hhbm5lbCBjb25uZWN0ZWQuXG4iKTsKLSAgICAgICAgCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsTlVMTCxkZWFsX2F1dG9zdXNwZW5kLCh2b2lkKikmY29tbWZkKTsvL+i/memHjOW+iOWuueaYk+mUme+8jOacgOWQjuS4gOS4quWPguaVsOimgeWPluWcsOWdgO+8jOi/meaYr+S4gOS4quaMh+mSiAotICAgICAgICBwdGhyZWFkX2RldGFjaCh0aWQpOyAgIAotCi0gICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWQsTlVMTCxzZW5kX2ZlZWRiYWNrLCh2b2lkKikmY29tbWZkX2RhdGEpOwotICAgICAgICBwdGhyZWFkX2RldGFjaCh0aWQpOyAKLQotCi0gICAgfQotICAgIAotIAotfQotCi1ERUZJTkVfTFlOUV9MSUJfTE9HKExZTlFfQVVUT1NVU1BFTkQpCi0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvbWFrZWZpbGUgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2ZpbGVzL21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYTI2M2JmLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtYXV0b3N1c3BlbmQvZmlsZXMvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1TSEVMTCA9IC9iaW4vc2gKLVJNID0gcm0gLWYKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIFwKLSAgICAgICAgICAgICAgICAtZyAtT3MgXAotICAgICAgICAgICAgICAgIC1mbHRvIFwKLSAgICAgICAgICAgICAgICAtRFJJTF9TSExJQiBcCi0gICAgICAgICAgICAgICAgLURBVENJX1BBUlNFIFwKLSAgICAgICAgICAgICAgICAtREtFRVBfQUxJVkUgXAotICAgICAgICAgICAgICAgIC1EX19MSU5VWF9PU19fIFwKLSAgICAgICAgICAgICAgICAtREVDQUxMX1NVUFBPUlQKLQotCi0KLWlmZXEgKCQoc3RyaXAgJChUQVJHRVRfUExBVEZPUk0pKSwgVDEwNikKLUxPQ0FMX0NGTEFHUyArPSAtREhBVkVfU1lTX1VJT19IIC1EUklMX1RJTUVfQ0IKLWVuZGlmCi0KLWlmZXEgKCQoc3RyaXAgJChUQVJHRVRfUExBVEZPUk0pKSwgVDEwNikKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURNT0JJTEVURUtfVEFSR0VUX1BMQVRGT1JNX1QxMDYKLWVuZGlmCi0KLWlmZXEgKCQoc3RyaXAgJChNT0JJTEVURUtfU1VTUEVORF9DRkcpKSwgR1NXKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREdTV19TVVNQRU5EX0NGRwotCi1lbmRpZgotCi1pZmVxICgkKHN0cmlwICQoTU9CSUxFVEVLX1NVU1BFTkRfQ0ZHKSksIFBMQVRGT1JNKQotICAgIExPQ0FMX0NGTEFHUyArPSAtRE1PQklMRVRFS19TVVNQRU5EX0NGRwotCi1lbmRpZgotCi0KLUxPQ0FMX1BBVEggICA9IC4KLQotTE9DQUxfQ19JTkNMVURFUyA9IFwKLSAgLUkuICAgLUkkKFJPT1QpJChpbmNsdWRlZGlyKS9saWJsb2cgLUkkKFJPT1QpJChpbmNsdWRlZGlyKSBcCi0KLQotCi0KLUxPQ0FMX0xJQlMgOj0gXAotICAgIC1MLiBcCi0gICAgLWxkbCBcCi0gICAgLWxwdGhyZWFkIFwKLSAgICAtbGx5bnEtbG9nIFwKLSAgICAtbGx5bnEtdWNpIFwKLSAgICAtbGxvZyBcCi0gICAgLWxic3AgXAotICAgIC1sc2N0ZWwgXAotICAgIC1sYXR1dGlscyBcCi0gICAgLWxhdHJlZyBcCi0gICAgLWxseW5xLXNpbSBcCi0KLQotU09VUkNFUyA9ICQod2lsZGNhcmQgKi5jICkKLQotRVhFQ1VUQUJMRSA9IGF1dG9zdXNwZW5kCi0KLU9CSkVDVFM9JChTT1VSQ0VTOi5jPS5vKQotYWxsOiAkKEVYRUNVVEFCTEUpCi0KLSQoRVhFQ1VUQUJMRSk6ICQoT0JKRUNUUykKLQkkKENYWCkgJChPQkpFQ1RTKSAkKExPQ0FMX0xJQlMpICQoTE9DQUxfQ0ZMQUdTKSAkKExPQ0FMX0NfSU5DTFVERVMpIC1vICRACi0KLSUubyA6ICUuYwotCSQoQ0MpICQoTE9DQUxfQ19JTkNMVURFUykgJChMT0NBTF9DRkxBR1MpICQoTE9DQUxfTElCUykgLW8gJEAgLWMgJDwKLQotLlBIT05ZOiBjbGVhbgotY2xlYW46Ci0JJChSTSkgJChPQkpFQ1RTKSAkKEVYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2x5bnEtYXV0b3N1c3BlbmQuYmIgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWF1dG9zdXNwZW5kL2x5bnEtYXV0b3N1c3BlbmQuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzZGY2N2YuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1hdXRvc3VzcGVuZC9seW5xLWF1dG9zdXNwZW5kLmJiCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotaW5oZXJpdCBleHRlcm5hbHNyYyBwYWNrYWdlIHN5c3RlbWQKLQotREVTQ1JJUFRJT04gPSAiYXV0b3N1c3BlbmQuc2VydmljZSIKLQotTElDRU5TRSA9ICJNb2JpbGVUZWtQcm9wcmlldGFyeSIKLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7V09SS0RJUn0vTElDRU5TRTttZDU9NDRkOGQyYjYyOTZjYTI0YmNkNDg5NGJiNzE1NWJmMjciCi0KLVNSQ19VUkkgPSAiZmlsZTovL2F1dG9zdXNwZW5kLmMgZmlsZTovL0xJQ0VOU0UgXAotICAgICAgICAgICBmaWxlOi8vYXV0b3N1c3BlbmQuaCBcCi0gICAgICAgICAgIGZpbGU6Ly9hdXRvc3VzcGVuZF9vcHMuaCBcCi0gICAgICAgICAgIGZpbGU6Ly9hdXRvc3VzcGVuZF93YWtldXBfY291bnQuYyBcCi0gICAgICAgICAgIGZpbGU6Ly9tYWluLmMgXAotICAgICAgICAgICBmaWxlOi8vYXV0b3N1c3BlbmQuc2VydmljZSBcCi0gICAgICAgICAgIGZpbGU6Ly9seW5xLWF1dG9zdXNwZW5kLnNoIFwKLSAgICAgICAgICAgZmlsZTovL21ha2VmaWxlIFwKLSIKLQotRVhUUkFfT0VNQUtFID0gIidUQVJHRVRfUExBVEZPUk0gPSAke1RBUkdFVF9QTEFURk9STX0nIgotCi1UQVJHRVRfQ0NfQVJDSCArPSAiJHtMREZMQUdTfSIKLQotTE9DQUxfQ19JTkNMVURFUyA9ICItSS4gIgotCi1ERVBFTkRTID0gImxpYmx5bnEtbG9nIGxpYmx5bnEtdWNpIgotREVQRU5EUyArPSAiJHtAYmIudXRpbHMuY29udGFpbnMoJ1RBUkdFVF9QTEFURk9STScsICdtdDI3MzUnLCAnYXVkaW8tbWl4ZXItY3RybCBzdHJlYW1lcjEuMCcsICcnLCBkKX0gbGlibHlucS1sb2cgbGlibHlucS11Y2kgbGliYnNwIGxpYnNjdGVsIGxpYmF0dXRpbHMgbGliYXRyZWcgbGlibHlucS1zaW0iCi1MT0NBTF9MSUJTID0gIi1MLiAtbGRsIC1sc3RkYysrIC1scHRocmVhZCAtbGxvZyIKLVNPVVJDRVMgPSAiJCh3aWxkY2FyZCAqLmMgKSIKLQotT0JKRUNUUyA9ICIkKFNPVVJDRVM6LmM9Lm8pIgotCi1FWEVDVVRBQkxFID0gImF1dG9zdXNwZW5kIgotUyA9ICIke1dPUktESVJ9IgotVEFSR0VUX0NDX0FSQ0ggKz0gIiR7TERGTEFHU30iCi1TWVNURU1EX1BBQ0tBR0VTID0gIiR7UE59IgotU1lTVEVNRF9TRVJWSUNFXyR7UE59ID0gImF1dG9zdXNwZW5kLnNlcnZpY2UiCi1GSUxFU18ke1BOfSArPSAiJHtzeXN0ZW1kX3VuaXRkaXJ9L3N5c3RlbS9hdXRvc3VzcGVuZC5zZXJ2aWNlIgotI0lOSElCSVRfUEFDS0FHRV9TVFJJUCA9ICIxIgotZG9fY29tcGlsZSAoKSB7Ci0KLQkjJHtDWFh9IC1XYWxsICR7TE9DQUxfQ19JTkNMVURFU30gYXV0b3N1c3BlbmQuYyBhdXRvc3VzcGVuZF93YWtldXBfY291bnQuYyBtYWluLmMgJHtMT0NBTF9MSUJTfSAtbyAke0VYRUNVVEFCTEV9Ci0JaWYgdGVzdCAiJHtQQUNLQUdFX0FSQ0h9IiA9ICJjb3J0ZXhhN2hmLXZmcC12ZnB2NC1uZW9uIiB8fCB0ZXN0ICIke1BBQ0tBR0VfQVJDSH0iID0gImNvcnRleGE3aGYtbmVvbi12ZnB2NCI7IHRoZW4KLQkJb2VfcnVubWFrZSBhbGwgUk9PVD0ke1NUQUdJTkdfRElSX0hPU1R9IE9GTEFHUz0iLS1zeXNyb290PSR7U1RBR0lOR19ESVJfSE9TVH0gLW1oYXJkLWZsb2F0IgotCWVsc2UKLQkJb2VfcnVubWFrZSBhbGwgUk9PVD0ke1NUQUdJTkdfRElSX0hPU1R9IE9GTEFHUz0iLS1zeXNyb290PSR7U1RBR0lOR19ESVJfSE9TVH0iCi0JZmkKLX0KLQotZG9faW5zdGFsbCgpIHsKLQlpbnN0YWxsIC1kICR7RH0ke2JpbmRpcn0vCi0JZWNobyAiSW5zdGFsbGluZyBpbWFnZSBQTiAke1BOfSIKLQllY2hvICJJbnN0YWxsaW5nIGltYWdlIHN5c3RlbWRfdW5pdGRpciAke3N5c3RlbWRfdW5pdGRpcn0iCi0JZWNobyAiSW5zdGFsbGluZyBpbWFnZSBEICR7RH0iCi0JZWNobyAiSW5zdGFsbGluZyBpbWFnZSBCICR7Qn0iCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3RlbWQnLCd0cnVlJywnZmFsc2UnLGQpfTsgdGhlbgotCQlpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtLwotCQlpbnN0YWxsIC1tIDA2NDQgJHtCfS9hdXRvc3VzcGVuZC5zZXJ2aWNlICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtCi0gICAgZWxzZQotCQlpbnN0YWxsIC1kICR7RH0ke3N5c2NvbmZkaXJ9L2luaXQuZAotICAgICAgICBpbnN0YWxsIC1tIDA3NTUgICR7U30vbHlucS1hdXRvc3VzcGVuZC5zaCAke0R9JHtzeXNjb25mZGlyfS9pbml0LmQvCi0gICAgICAgIGluc3RhbGwgLWQgJHtEfSR7c3lzY29uZmRpcn0vcmNTLmQKLSAgICAgICAgbG4gLXMgLi4vaW5pdC5kL2x5bnEtYXV0b3N1c3BlbmQuc2ggJHtEfSR7c3lzY29uZmRpcn0vcmNTLmQvUzgybHlucS1hdXRvc3VzcGVuZC1zZXJ2aWNlCi0JZmkKLQotCWluc3RhbGwgLW0gMDc1NSAke1N9L2F1dG9zdXNwZW5kICR7RH0ke2JpbmRpcn0vCi0JaW5zdGFsbCAtZCAke0R9JHtpbmNsdWRlZGlyfQotfQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9MSUNFTlNFIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9MSUNFTlNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNDg5MzQ4Li4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvZmlsZXMvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLW9weXJpZ2h0IFN0YXRlbWVudDoKLQotVGhpcyBzb2Z0d2FyZS9maXJtd2FyZSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uICgiTW9iaWxlVGVrIFNvZnR3YXJlIikgYXJlCi1wcm90ZWN0ZWQgdW5kZXIgcmVsZXZhbnQgY29weXJpZ2h0IGxhd3MuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCi1jb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IHRvIE1vYmlsZVRlayBJbmMuIGFuZC9vciBpdHMgbGljZW5zb3JzLiBXaXRob3V0Ci10aGUgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1vYmlsZVRlayBpbmMuIGFuZC9vciBpdHMgbGljZW5zb3JzLCBhbnkKLXJlcHJvZHVjdGlvbiwgbW9kaWZpY2F0aW9uLCB1c2Ugb3IgZGlzY2xvc3VyZSBvZiBNb2JpbGVUZWsgU29mdHdhcmUsIGFuZAotaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiwgaW4gd2hvbGUgb3IgaW4gcGFydCwgc2hhbGwgYmUgc3RyaWN0bHkKLXByb2hpYml0ZWQuCi0KLU1vYmlsZXRlayBJbmMuIChDKSAyMDE1LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1CWSBPUEVOSU5HIFRISVMgRklMRSwgUkVDRUlWRVIgSEVSRUJZIFVORVFVSVZPQ0FMTFkgQUNLTk9XTEVER0VTIEFORCBBR1JFRVMKLVRIQVQgVEhFIFNPRlRXQVJFL0ZJUk1XQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTlMgKCJNb2JpbGVUZWsgU09GVFdBUkUiKQotUkVDRUlWRUQgRlJPTSBNb2JpbGVUZWsgQU5EL09SIElUUyBSRVBSRVNFTlRBVElWRVMgQVJFIFBST1ZJREVEIFRPIFJFQ0VJVkVSCi1PTiBBTiAiQVMtSVMiIEJBU0lTIE9OTFkuIE1vYmlsZVRlayBFWFBSRVNTTFkgRElTQ0xBSU1TIEFOWSBBTkQgQUxMCi1XQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUgotTk9OSU5GUklOR0VNRU5ULiBORUlUSEVSIERPRVMgTW9iaWxlVGVrIFBST1ZJREUgQU5ZIFdBUlJBTlRZIFdIQVRTT0VWRVIgV0lUSAotUkVTUEVDVCBUTyBUSEUgU09GVFdBUkUgT0YgQU5ZIFRISVJEIFBBUlRZIFdISUNIIE1BWSBCRSBVU0VEIEJZLAotSU5DT1JQT1JBVEVEIElOLCBPUiBTVVBQTElFRCBXSVRIIFRIRSBNb2JpbGVUZWsgU09GVFdBUkUsIEFORCBSRUNFSVZFUiBBR1JFRVMKLVRPIExPT0sgT05MWSBUTyBTVUNIIFRISVJEIFBBUlRZIEZPUiBBTlkgV0FSUkFOVFkgQ0xBSU0gUkVMQVRJTkcgVEhFUkVUTy4KLVJFQ0VJVkVSIEVYUFJFU1NMWSBBQ0tOT1dMRURHRVMgVEhBVCBJVCBJUyBSRUNFSVZFUidTIFNPTEUgUkVTUE9OU0lCSUxJVFkgVE8KLU9CVEFJTiBGUk9NIEFOWSBUSElSRCBQQVJUWSBBTEwgUFJPUEVSIExJQ0VOU0VTIENPTlRBSU5FRCBJTiBNb2JpbGVUZWsKLVNPRlRXQVJFLiBNb2JpbGVUZWsgU0hBTEwgQUxTTyBOT1QgQkUgUkVTUE9OU0lCTEUgRk9SIEFOWSBNb2JpbGVUZWsgU09GVFdBUkUKLVJFTEVBU0VTIE1BREUgVE8gUkVDRUlWRVInUyBTUEVDSUZJQ0FUSU9OIE9SIFRPIENPTkZPUk0gVE8gQSBQQVJUSUNVTEFSCi1TVEFOREFSRCBPUiBPUEVOIEZPUlVNLiBSRUNFSVZFUidTIFNPTEUgQU5EIEVYQ0xVU0lWRSBSRU1FRFkgQU5EIE1vYmlsZVRlaydTCi1FTlRJUkUgQU5EIENVTVVMQVRJVkUgTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUgTW9iaWxlVGVrIFNPRlRXQVJFCi1SRUxFQVNFRCBIRVJFVU5ERVIgV0lMTCBCRSwgQVQgTW9iaWxlVGVrJ1MgT1BUSU9OLCBUTyBSRVZJU0UgT1IgUkVQTEFDRSBUSEUKLU1vYmlsZVRlayBTT0ZUV0FSRSBBVCBJU1NVRSwgT1IgUkVGVU5EIEFOWSBTT0ZUV0FSRSBMSUNFTlNFIEZFRVMgT1IgU0VSVklDRQotQ0hBUkdFIFBBSUQgQlkgUkVDRUlWRVIgVE8gTW9iaWxlVGVrIEZPUiBTVUNIIE1vYmlsZVRlayBTT0ZUV0FSRSBBVCBJU1NVRS4KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvZmlsZXMvbHlucS1mb3RhLWJhY2t1cC5zZXJ2aWNlIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9seW5xLWZvdGEtYmFja3VwLnNlcnZpY2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4ODUxZmYuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9seW5xLWZvdGEtYmFja3VwLnNlcnZpY2UKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1bVW5pdF0KLURlc2NyaXB0aW9uPWx5bnEtZm90YS1iYWNrdXAtc2VydmljZQotCi1bU2VydmljZV0KLUV4ZWNTdGFydD0vdXNyL2Jpbi9seW5xLWZvdGEtYmFja3VwCi1UeXBlPXNpbXBsZQotCi1bSW5zdGFsbF0KLVdhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0Ci0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvZmlsZXMvbHlucS1mb3RhLWJhY2t1cC5zaCBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvZmlsZXMvbHlucS1mb3RhLWJhY2t1cC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTNlYjIwZi4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLWZvdGEtYmFja3VwL2ZpbGVzL2x5bnEtZm90YS1iYWNrdXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgUnVuIHRoZSBkYWVtb24KLSMKLQotREFFTU9OPSJseW5xLWZvdGEtYmFja3VwLXNlcnZpY2UiCi1QSURGSUxFPSIvdmFyL3J1bi8kREFFTU9OLnBpZCIKLUVYRUM9Ii91c3IvYmluL2x5bnEtZm90YS1iYWNrdXAiCi1FWEVDX0FSR1M9IiIKLQotCi1zdGFydCgpIHsKLSAgICAgICAgZWNobyAtbiAiU3RhcnRpbmcgJERBRU1PTi4uLiAiCi0gICAgICAgIHN0YXJ0LXN0b3AtZGFlbW9uIC0tbm8tY2xvc2UgLVMgLWIgLW0gLXAgJFBJREZJTEUgLXggJEVYRUMgLS0gJEVYRUNfQVJHUwotICAgICAgICBbICQ/IC1lcSAwIF0gJiYgZWNobyAiT0siIHx8IGVjaG8gIkVSUk9SIgotfQotCi1zdG9wKCkgewotICAgICAgICBlY2hvIC1uICJTdG9wcGluZyAkREFFTU9OLi4uICIKLSAgICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLUsgLXAgJFBJREZJTEUKLSAgICAgICAgWyAkPyAtZXEgMCBdICYmIGVjaG8gIk9LIiB8fCBlY2hvICJFUlJPUiIKLX0KLQotcmVzdGFydCgpIHsKLSAgICAgICAgc3RvcAotICAgICAgICBzdGFydAotfQotCi1jYXNlICIkMSIgaW4KLSAgc3RhcnR8c3RvcHxyZXN0YXJ0KQotICAgICAgICAiJDEiCi0gICAgICAgIDs7Ci0gICopCi0gICAgICAgIGVjaG8gIlVzYWdlOiAkMCB7c3RhcnR8c3RvcHxyZXN0YXJ0fSIKLSAgICAgICAgZXhpdCAxCi1lc2FjCi0KLWV4aXQgJD8KLQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9tYWtlZmlsZSBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvZmlsZXMvbWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBhMzQ5ZDMuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9maWxlcy9tYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVNIRUxMID0gL2Jpbi9zaA0KLVJNID0gcm0gLWYNCi0NCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgXA0KLSAgICAgICAgICAgICAgICAtc3RkPWdudSsrMTQgXA0KLSAgICAgICAgICAgICAgICAtZyAtT3MgXA0KLSAgICAgICAgICAgICAgICAtZmx0byBcDQotICAgICAgICAgICAgICAgIC1mUElDIFwNCi0gICAgDQotICAgICAgICAgICAgICAgIA0KLSANCi1pZmVxICgkKHN0cmlwICQoVEFSR0VUX1BMQVRGT1JNKSksIFQxMDYpDQotTE9DQUxfQ0ZMQUdTICs9IC1EQklOREVSX0lQQ18zMkJJVD0xIC1ESEFWRV9FTkRJQU5fSCAtREhBVkVfUFRIUkVBRFMgLURIQVZFX1NZU19VSU9fSCAtREhBVkVfUE9TSVhfRklMRU1BUCAtREhBVkVfU1RSTENQWSAtREhBVkVfUFJDVEwgLURIQVZFX01FTVNFVDE2IC1ESEFWRV9NRU1TRVQzMiAtREFORFJPSURfU01QPTANCi1lbmRpZg0KLQ0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yPWZvcm1hdC1zZWN1cml0eQ0KLQ0KLSQod2FybmluZyAjIyMjIyMjIyMjIyMjIyMjIyByb2NrIFJPT1Q6ICQoUk9PVCksaW5jbHVkZWRpcjokKGluY2x1ZGVkaXIpLCkNCi0NCi1MT0NBTF9QQVRIICAgPSAuDQotDQotTE9DQUxfQ19JTkNMVURFUyA9IFwNCi0gIC1JLiBcDQotICAtSSQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcDQotICAtSSQoUk9PVCkkKGluY2x1ZGVkaXIpL2xvZ2dlciBcDQotICAtSSQoUk9PVCkkKGluY2x1ZGVkaXIpL2xpYmxvZyBcDQotICAtSSQoUk9PVCkkKGluY2x1ZGVkaXIpL2dsaWItMi4wIFwNCi0gIC1JJChST09UKSQobGliZGlyKS9nbGliLTIuMC9pbmNsdWRlIFwNCi0gIC1JJChST09UKSQoaW5jbHVkZWRpcikgIFwNCi0NCi0NCi0NCi1MT0NBTF9MSUJTIDo9IFwNCi0gICAgLUwuIFwNCi0gICAgLWxkbCBcDQotICAgIC1sc3RkYysrIFwNCi0gICAgLWxseW5xLWxvZyBcDQotICAgIC1sbHlucS1mb3RhIFwNCi0NCi1TT1VSQ0VTID0gbHlucS1mb3RhLWJhY2t1cC5jcHANCi0NCi1FWEVDVVRBQkxFID0gbHlucS1mb3RhLWJhY2t1cA0KLQ0KLU9CSkVDVFM9JChTT1VSQ0VTOi5jcHA9Lm8pDQotDQotYWxsOiAkKEVYRUNVVEFCTEUpIA0KLSQoRVhFQ1VUQUJMRSk6ICQoT0JKRUNUUykNCi0JJChDWFgpICQoT0JKRUNUUykgJChMT0NBTF9MSUJTKSAkKExPQ0FMX0NGTEFHUykgJChMT0NBTF9DX0lOQ0xVREVTKSAtbyAkQA0KLQ0KLSUubyA6ICUuY3BwDQotCSQoQ1hYKSAkKExPQ0FMX0NfSU5DTFVERVMpICQoTE9DQUxfQ0ZMQUdTKSAkKExPQ0FMX0xJQlMpIC1vICRAIC1jICQ8IA0KLQ0KLS5QSE9OWTogY2xlYW4NCi1jbGVhbjoNCi0JJChSTSkgJChPQkpFQ1RTKSAkKEVYRUNVVEFCTEUpDQotCSQoUk0pICQoT0JKRUNUU19UT09MKSAkKEVYRUNVVEFCTEUpDQotDQpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9seW5xLWZvdGEtYmFja3VwLmJiIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1mb3RhLWJhY2t1cC9seW5xLWZvdGEtYmFja3VwLmJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODlmN2FiLi4wMDAwMDAwCi0tLSBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZm90YS1iYWNrdXAvbHlucS1mb3RhLWJhY2t1cC5iYgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSNpbmhlcml0IGV4dGVybmFsc3JjIHBhY2thZ2Ugc3lzdGVtZAotCi1ERVNDUklQVElPTiA9ICJseW5xLWZvdGEtYmFja3VwLnNlcnZpY2UiCi0KLUxJQ0VOU0UgPSAiTUlUIgotIyNMaWNlbnNlIGNoZWNrc3VtIGZpbGUgaXMgYWx3YXlzIHJlcXVpcmVkCi1MSUNfRklMRVNfQ0hLU1VNID0gImZpbGU6Ly8ke1dPUktESVJ9L0xJQ0VOU0U7bWQ1PWM3OTRlOGZmMWFjZDNiN2YxNTZhNjQ5N2U3ODBkZDU0IgotCi1TUkNfVVJJID0gImZpbGU6Ly9seW5xLWZvdGEtYmFja3VwLmNwcCBcCi0JICAgZmlsZTovL2x5bnEtZm90YS1iYWNrdXAuc2ggXAotCSAgIGZpbGU6Ly9tYWtlZmlsZSBcCi0JICAgZmlsZTovL2x5bnEtZm90YS1iYWNrdXAuc2VydmljZSBcCi0JICAgZmlsZTovL0xJQ0VOU0UgXAotIgotCi0KLVRBUkdFVF9DQ19BUkNIICs9ICIke0xERkxBR1N9IgotCi0KLURFUEVORFMgKz0gImxpYmx5bnEtbG9nIGxpYmx5bnEtdWNpIGxpYmx5bnEtcXNlci1mb3RhIgotUyA9ICIke1dPUktESVJ9IgotI0lOSElCSVRfUEFDS0FHRV9TVFJJUCA9ICIxIgotZG9fY29tcGlsZSAoKSB7Ci0KLQkKLQlpZiB0ZXN0ICIke1BBQ0tBR0VfQVJDSH0iID0gImNvcnRleGE3aGYtdmZwLXZmcHY0LW5lb24iIHx8IHRlc3QgIiR7UEFDS0FHRV9BUkNIfSIgPSAiY29ydGV4YTdoZi1uZW9uLXZmcHY0IjsgdGhlbgotCQlvZV9ydW5tYWtlIGFsbCBST09UPSR7U1RBR0lOR19ESVJfSE9TVH0gT0ZMQUdTPSItLXN5c3Jvb3Q9JHtTVEFHSU5HX0RJUl9IT1NUfSAtbWhhcmQtZmxvYXQiCi0JZWxzZQotCQlvZV9ydW5tYWtlIGFsbCBST09UPSR7U1RBR0lOR19ESVJfSE9TVH0gT0ZMQUdTPSItLXN5c3Jvb3Q9JHtTVEFHSU5HX0RJUl9IT1NUfSIKLQlmaQotfQotI0lOSElCSVRfUEFDS0FHRV9TVFJJUCA9ICIxIgotCi0KLWRvX2luc3RhbGwoKSB7Ci0JaW5zdGFsbCAtZCAke0R9JHtiaW5kaXJ9LwotCWVjaG8gIkluc3RhbGxpbmcgaW1hZ2UgUE4gJHtQTn0iCi0JZWNobyAiSW5zdGFsbGluZyBpbWFnZSBzeXN0ZW1kX3VuaXRkaXIgJHtzeXN0ZW1kX3VuaXRkaXJ9IgotCWVjaG8gIkluc3RhbGxpbmcgaW1hZ2UgRCAke0R9IgotCWVjaG8gIkluc3RhbGxpbmcgaW1hZ2UgQiAke0J9IgotCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3RlbWQnLCd0cnVlJywnZmFsc2UnLGQpfTsgdGhlbgotCQlpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtLwotCQlpbnN0YWxsIC1tIDA2NDQgJHtCfS9seW5xLWZvdGEtYmFja3VwLnNlcnZpY2UgJHtEfSR7c3lzdGVtZF91bml0ZGlyfS9zeXN0ZW0KLSAgICBlbHNlCi0JCWluc3RhbGwgLWQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kCi0gICAgICAgIAlpbnN0YWxsIC1tIDA3NTUgICR7U30vbHlucS1mb3RhLWJhY2t1cC5zaCAke0R9JHtzeXNjb25mZGlyfS9pbml0LmQvCi0gICAgICAgIAlpbnN0YWxsIC1kICR7RH0ke3N5c2NvbmZkaXJ9L3JjUy5kCi0gICAgICAgIAlsbiAtcyAuLi9pbml0LmQvbHlucS1mb3RhLWJhY2t1cC5zaCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZC9TODJseW5xLWZvdGEtYmFja3VwLXNlcnZpY2UKLQlmaQotCi0JaW5zdGFsbCAtbSAwNzU1ICR7U30vbHlucS1mb3RhLWJhY2t1cCAke0R9JHtiaW5kaXJ9LwotCWluc3RhbGwgLWQgJHtEfSR7aW5jbHVkZWRpcn0KLX0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy1jdXN0b20vcmVjaXBlcy1seW5xL2x5bnEtZ25zcy11cGRhdGUvZmlsZXMvbWFpbi5jIGIvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1nbnNzLXVwZGF0ZS9maWxlcy9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZiOWZkZGQuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1nbnNzLXVwZGF0ZS9maWxlcy9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotI2luY2x1ZGUgImhkODA0MF91cGdyYWRlLmgiDQotI2luY2x1ZGUgInBvcnQuaCINCi0jaW5jbHVkZSA8Z2V0b3B0Lmg+DQotI2luY2x1ZGUgPGluY2x1ZGUvbHlucS1ncGlvLmg+DQotI2RlZmluZSBSRUFEX01BWF9MRU5HVEggMTI4DQotI2RlZmluZSBQT1JUX05BTUUgKCIvZGV2L3R0eVMyIikNCi11aW50OF90IGdfYmluX2J1ZmZbNTAwKjEwMjRdID0gezB9Ow0KLXVpbnQzMl90IGdfYmluX2J1ZmZfc2l6ZSA9IDA7DQotZXh0ZXJuIGludCBnZXRfbW9uX3ZlcihpbnQgdWFydF9mZCx1aW50OF90ICp2ZXJfYnVmLCBpbnQgdmVyX2xlbik7DQotDQotI2RlZmluZSBSRUFEX0xFTl9NQVggMTAyNCAvL0JPT1RfVVBHUkFERV9CVUZGX01BWF8xDQotDQotaW50IHJlYWRfYmluX2ZpbGUodWludDhfdCAqcGF0aCwgdWludDhfdCAqYnVmZikNCi17DQotICAgIGludCBmcCA9IC0xOw0KLSAgICBpbnQgcmV0ID0gMDsNCi0gICAgaW50IGkgPSAwOw0KLSAgICBpbnQgc2l6ZSA9IDA7DQotDQotICAgIGlmIChOVUxMID09IHBhdGggfHwgTlVMTCA9PSBidWZmKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoIlslcyAlZF0gc3RyIGVycm9yIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgZnAgPSBvcGVuKChjaGFyICopcGF0aCwgT19SRE9OTFkpOw0KLSAgICBpZihmcCA8IDApDQotICAgIHsNCi0gICAgICAgIHByaW50ZiggIlslcyAlZF1vcGVuIGZpbGUgZmFpbGVkICEgZXJybm8gaXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGVycm5vKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBzaXplID0gbHNlZWsoZnAsIDB4MDAsIFNFRUtfRU5EKTsNCi0gICAgaWYoc2l6ZSA8PSAwKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoICJbJXMgJWRdZmlsZSBpcyBlbXB0eVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcHJpbnRmKCAiWyVzICVkXWZpbGUgc2l6ZSBpczolZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSk7DQotICAgIGxzZWVrKGZwLCAweDAwLCBTRUVLX1NFVCk7DQotICAgIHdoaWxlKDEpDQotICAgIHsNCi0gICAgICAgIHJldCA9IHJlYWQoZnAsIGJ1ZmYsIFJFQURfTEVOX01BWCk7DQotICAgICAgICBpICs9IHJldDsNCi0gICAgICAgIGlmKHJldCA9PSBSRUFEX0xFTl9NQVgpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnVmZiArPSBSRUFEX0xFTl9NQVg7DQotICAgICAgICB9DQotICAgICAgICBlbHNlDQotICAgICAgICB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpbnRmKCAiWyVzICVkXWZpbGUgc2l6ZSBpczolZCxpOiVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzaXplLCBpKTsNCi0gICAgY2xvc2UoZnApOw0KLSAgICBpZihzaXplICE9IGkpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBnX2Jpbl9idWZmX3NpemUgPSBzaXplOw0KLSAgICByZXR1cm4gMDsNCi19DQotDQotc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2UoY29uc3QgY2hhciAqcHJvZykNCi17DQotICAgIHByaW50ZigiVXNhZ2U6ICVzIFstQlVUVmhdXG4iLCBwcm9nKTsNCi0gICAgcHV0cygiICAtQiAtLWJvb3QgICAgYm9vdCBtb2RlIHNlbGVjdFxuIg0KLSAgICAgICAgICIgIC1VIC0tdXNlciAgdXNlciBtb2RlIHNlbGVjdCBcbiINCi0gICAgICAgICAiICAtVCAtLXVzZXJ0b2Jvb3QgIHVzZXJ0b2Jvb3QgbW9kZSBzZWxlY3QgXG4iDQotICAgICAgICAgIiAgLVYgLS12ZXJzaW9uIGZpcm13YXJlIHZlcnNpb24gZ2V0IFxuIg0KLSAgICAgICAgICIgIC1oIC0taGVscCAgICBoZWxwIG1lc3NhZ2UgcHJpbnQgXG4iKTsNCi0gICAgZXhpdCgxKTsNCi19DQotDQotc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsNCi17ICJuYW1lIiwgMCwgTlVMTCwgJ24nIH0sDQoteyAiYmZfbmFtZSIsIDAsIE5VTEwsICdiJyB9LA0KLXsgImxvdmUiLCAxLCBOVUxMLCAnbCcgfSwNCi17IDAsIDAsIDAsIDB9LA0KLX07DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gbG9wdHNbXSA9IHsNCi17ICJib290IiwJcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdCJyB9LC8vcmVxdWlyZWRfYXJndW1lbnQNCi17ICJ1c2VyIiwJcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdVJyB9LA0KLXsgInVzZXJ0b2Jvb3QiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnIH0sDQoteyAidmVyc2lvbiIsICAgMCwgTlVMTCwgJ1YnIH0sDQoteyAiaGVscCIsCTAsIE5VTEwsICdoJyB9LA0KLXsgMCwgMCwgMCwgMCB9LA0KLX07DQotY2hhciogY29uc3Qgc2hvcnRfb3B0aW9uczEgPSAiQjpVOlQ6VmgiOw0KLQ0KLWludCB3cml0ZV9maWxlKHVpbnQ4X3QgKnBhdGgsIHVpbnQ4X3QgKmJ1ZmYsIGludCBsZW4pDQotew0KLSAgICBpbnQgZnAgPSAtMTsNCi0gICAgaW50IHJldCA9IDA7DQotICAgIGludCBpID0gMDsNCi0gICAgaW50IHNpemUgPSAwOw0KLQ0KLSAgICBpZiAoTlVMTCA9PSBwYXRoIHx8IE5VTEwgPT0gYnVmZikNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJbJXMgJWRdIHN0ciBlcnJvciIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIGZwID0gb3BlbigoY2hhciAqKXBhdGgsIE9fUkRXUiApOw0KLSAgICBpZihmcCA8IDApDQotICAgIHsNCi0gICAgICAgIHByaW50ZiggIlslcyAlZF1vcGVuIGZpbGUgZmFpbGVkICEgZXJybm8gaXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGVycm5vKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBzaXplID0gbHNlZWsoZnAsIDB4MDAsIFNFRUtfRU5EKTsNCi0NCi0gICAgd3JpdGUoZnAsIGJ1ZmYsIGxlbik7DQotDQotICAgIHByaW50ZiggIlslcyAlZF1maWxlIHNpemUgaXM6JWQsaTolZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc2l6ZSwgaSk7DQotICAgIGNsb3NlKGZwKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLQ0KLS8vZXhhbXBsZSAgLy/ljYfnuqfov4fnqIvkuK3vvIznpoHmraLlhbbku5bnqIvluo/mk43kvZzor6XkuLLlj6PvvIznpoHmraLmlq3nlLXlpI3kvY3nrYnmk43kvZwNCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0KLXsNCi0gICAgdWludDhfdCBuZXdWZXJzaW9uQnVmW1JFQURfTUFYX0xFTkdUSF0gPSB7MH07DQotICAgIHVpbnQ4X3QgY2xlaW50SURbUkVBRF9NQVhfTEVOR1RIXSA9ICI5OTk5OTkiOw0KLSAgICBpbnQgZmQgPSAtMTsgLy8gdWFydCBoYW5kbGUNCi0gICAgaW50IHJldCA9IC0xOw0KLSAgICB1aW50OF90IGZpbGVQYXRoWzI1Nl0gPSB7MH07DQotICAgIHVpbnQxNl90IGZpbGVQdGFoTGVuID0gMDsNCi0NCi0gICAgaWYgKGFyZ2MgPT0gMSkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJUaGlzIHByb2dyYW0gbmVlZHMgYXJndW1lbnRzLi4uLlxuXG4iKTsNCi0gICAgICAgIHByaW50X3VzYWdlKGFyZ3ZbMF0pOw0KLSAgICB9DQotDQotICAgIGludCBudW07DQotICAgIHdoaWxlICgobnVtID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgc2hvcnRfb3B0aW9uczEsIGxvcHRzLCBOVUxMKSkgIT0gLTEpDQotICAgIHsNCi0gICAgICAgIHByaW50ZigiZ2V0b3B0X2xvbmcgQzolZFxuIiwgbnVtKTsNCi0gICAgICAgIHN3aXRjaCAobnVtKQ0KLSAgICAgICAgew0KLQ0KLSAgICAgICAgY2FzZSAnQic6DQotICAgICAgICB7DQotICAgICAgICAgICAgcHJpbnRmKCJvcHRhcmc6JXNcbiIsIG9wdGFyZyk7DQotICAgICAgICAgICAgaWYgKCBvcHRhcmcgPT0gTlVMTCApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBvcHRpb24gJ0InIHJlcXVpcmVzIGFyZ3VtZW50Li4uXG4iLCBhcmd2WzBdKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGZpbGVQdGFoTGVuID0gc3RybGVuKG9wdGFyZyk7DQotICAgICAgICAgICAgaWYoZmlsZVB0YWhMZW4gPCBzaXplb2YoZmlsZVBhdGgpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopZmlsZVBhdGgsIG9wdGFyZywgZmlsZVB0YWhMZW4pOw0KLSAgICAgICAgICAgICAgICBnb3RvIEhEX1VQRzsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy9zbGVlcCgxKTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgJ1YnOg0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHByaW50ZigiY2hlY2sgdmVyc2lvblxuIik7DQotICAgICAgICAgICAgZmQgPSBPcGVuVWFydCgoY2hhciAqKVBPUlRfTkFNRSk7DQotICAgICAgICAgICAgaWYgKGZkIDwgMCkNCi0gICAgICAgICAgICB7DQotDQotICAgICAgICAgICAgICAgIHByaW50Zigib3BlbiB1YXJ0IGZhaWxlZCAlZFxuIiwgZmQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGdldF9tb25fdmVyKGZkLCBuZXdWZXJzaW9uQnVmLCBzaXplb2YobmV3VmVyc2lvbkJ1ZikpOw0KLSAgICAgICAgICAgIHByaW50ZigidmVyc2lvbiBpczogJXNcbiIsIG5ld1ZlcnNpb25CdWYpOw0KLSAgICAgICAgICAgIHVhcnRfY2xvc2UoZmQpOw0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwcmludGYoInBsZWFzZSBpbnB1dCBjb3JyZWN0IHBhcmFtZXRlcnNcbiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8v6Iqv54mH5LiK55S1DQotSERfVVBHOg0KLSAgICBmZCA9IE9wZW5VYXJ0KChjaGFyICopUE9SVF9OQU1FKTsNCi0gICAgaWYgKGZkIDwgMCkNCi0gICAgew0KLQ0KLSAgICAgICAgcHJpbnRmKCJvcGVuIHVhcnQgZmFpbGVkICVkXG4iLCBmZCk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcmV0ID0gcmVhZF9iaW5fZmlsZShmaWxlUGF0aCwgZ19iaW5fYnVmZik7DQotICAgIGlmIChyZXQgPCAwKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoIm9wZW4gZmlsZSBmYWlsZWQgJWRcbiIsIGZkKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICAvKmdvIHRvIGJvb3QtbW9kZSBuZWVkIGNoYW5nZSBwaW4gc3RhdHVzKi8NCi0gICAgbHlucV9ncGlvX2luaXQoMTUsMSwwLDApOw0KLSAgICBseW5xX2dwaW9fdmFsdWVfc2V0KDE1LCAwKTsNCi0gICAgdXNsZWVwKDEwMDAwMCk7Ly8xMDBtcw0KLSAgICBseW5xX2dwaW9faW5pdCgxMjYsMSwxLDApOw0KLSAgICBseW5xX2dwaW9fdmFsdWVfc2V0KDEyNiwgMSk7DQotICAgIHVzbGVlcCgxMDAwMDAwKTsvLzFzDQotICAgIGx5bnFfZ3Bpb192YWx1ZV9zZXQoMTI2LCAwKTsNCi0gICAgdXNsZWVwKDEwMDAwMCk7Ly8xMDBtcw0KLSAgICBseW5xX2dwaW9fZGlyZWN0aW9uX3NldCgxNSwgMCk7DQotICAgIGx5bnFfZ3Bpb19wdWxsc2VsX3NldCgxNSwgMCk7DQotICAgIGx5bnFfZ3Bpb19kZWluaXQoMTUpOw0KLSAgICBseW5xX2dwaW9fZGVpbml0KDEyNik7DQotDQotICAgIHJldCA9IGZ3X3VwZGF0ZV9ib290KGZkLCBnX2Jpbl9idWZmLCBnX2Jpbl9idWZmX3NpemUpOw0KLSAgICBpZiAocmV0IDwgMCkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJvcGVuIGZpbGUgZmFpbGVkICVkXG4iLCBmZCk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgc2xlZXAoMSk7DQotICAgIGlmKHJldCA9PSBIREJEX1VQR19TVUNFU1MpDQotICAgIHsNCi0gICAgICAgIHByaW50ZigidXBncmFkZSBzdWNlc3MhXHJcbiIpOw0KLSAgICB9DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJ1cGdyYWRlIEZBSUwsIGZhaWwgc3R5bGU6JWRcclxuIixyZXQpOw0KLSAgICB9DQotICAgIHVhcnRfY2xvc2UoZmQpOw0KLSAgICByZXR1cm4gcmV0Ow0KLX0NCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLXFzZXItdm9pY2UtZGVtby9maWxlcy9seW5xLXFzZXItdm9pY2UtZGVtby5jcHAgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMtY3VzdG9tL3JlY2lwZXMtbHlucS9seW5xLXFzZXItdm9pY2UtZGVtby9maWxlcy9seW5xLXFzZXItdm9pY2UtZGVtby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQxYzVjOTcuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljLWN1c3RvbS9yZWNpcGVzLWx5bnEvbHlucS1xc2VyLXZvaWNlLWRlbW8vZmlsZXMvbHlucS1xc2VyLXZvaWNlLWRlbW8uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLSNpbmNsdWRlIDxzdGRsaWIuaD4NCi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8c3RyaW5nLmg+DQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+DQotI2luY2x1ZGUgPHVuaXN0ZC5oPg0KLSNpbmNsdWRlIDxkbGZjbi5oPg0KLSNpbmNsdWRlIDxzdGRpbnQuaD4NCi0NCi0jaW5jbHVkZSJseW5xLXFzZXItdm9pY2UtZGVtby5oIg0KLQ0KLXR5cGVkZWYgc3RydWN0DQotew0KLSAgICBpbnQgIGNtZElkeDsNCi0gICAgY2hhciAqZnVuY05hbWU7DQotfSBzdF9hcGlfdGVzdF9jYXNlOw0KLSAgICANCi0vL2ZvciBzZXJ2ZXIgdGVzdA0KLXN0X2FwaV90ZXN0X2Nhc2UgYXRfYXBpX3Rlc3RjYXNlc1tdID0gDQotew0KLSAgICB7MCwgICAicHJpbnRfaGVscCJ9LA0KLSAgICB7MSwgICAicXNlcl92b2ljZV9jYWxsX3N0YXJ0In0sDQotICAgIHsyLCAgICJxc2VyX3ZvaWNlX2NhbGxfZW5kIn0sDQotICAgIHszLCAgICJxc2VyX3ZvaWNlX2NhbGxfYW5zd2VyIn0sDQotICAgIHs0LCAgICJxc2VyX3ZvaWNlX3NldF9zcGVlY2hfdm9sdW1lIn0sDQotICAgIHs1LCAgICJxc2VyX3ZvaWNlX2dldF9zcGVlY2hfdm9sdW1lIn0sDQotICAgIHs2LCAgICJxc2VyX3ZvaWNlX3NldF9kdG1mIn0sICAgIA0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotICAgIHs3LCAgICJxc2VyX3ZvaWNlX3NldF90ZXN0X251bSJ9LA0KLSAgICB7OCwgICAicXNlcl92b2ljZV9mYXN0X2VjYWxsIn0sDQotI2VuZGlmDQotICAgIHstMSwgICAgTlVMTH0NCi19Ow0KLQ0KLXR5cGVkZWYgdWludDMyX3Qgdm9pY2VfY2xpZW50X2hhbmRsZV90eXBlOw0KLQ0KLQ0KLWludCAoKnFzZXJfdm9pY2VfY2FsbF9jbGllbnRfaW5pdCkodm9pY2VfY2xpZW50X2hhbmRsZV90eXBlICpwaF92b2ljZSk7DQotaW50ICgqcXNlcl92b2ljZV9jYWxsX2NsaWVudF9kZWluaXQpKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSApOw0KLWludCAoKnFzZXJfdm9pY2VfY2FsbF9hZGRzdGF0ZWhhbmRsZXIpKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSAgaF92b2ljZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU0VSX1ZvaWNlQ2FsbF9TdGF0ZUhhbmRsZXJGdW5jX3QgIGhhbmRsZXJQdHIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dFB0cik7DQotDQotaW50ICgqcXNlcl92b2ljZV9jYWxsX3JlbW92ZXN0YXRlaGFuZGxlKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUgKTsNCi1pbnQgKCpxc2VyX3ZvaWNlX2NhbGxfc3RhcnQpKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSAgaF92b2ljZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVfUVNFUl9WQ0FMTF9JRF9UICAgc2ltSWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGhvbmVfbnVtYmVyLCBpbnQgKmNhbGxfaWQpOyANCi0NCi1pbnQgKCpxc2VyX3ZvaWNlX2NhbGxfZW5kKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUgLGludCApOw0KLWludCAoKnFzZXJfdm9pY2VfY2FsbF9hbnN3ZXIpKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSAsaW50ICApOw0KLWludCAoKnFzZXJfdm9pY2Vfc2V0X3NwZWVjaF92b2x1bWUpKGNvbnN0IGludCB2b2x1bWUpOw0KLWludCAoKnFzZXJfdm9pY2VfZ2V0X3NwZWVjaF92b2x1bWUpKGludCAqdm9sdW1lKTsNCi1pbnQgKCpxc2VyX3ZvaWNlX3NldF9kdG1mKShjb25zdCBjaGFyIGNhbGxudW0pOw0KLQ0KLSNpZmRlZiBFQ0FMTF9TVVBQT1JUDQotaW50ICgqcXNlcl92b2ljZV9zZXRfdGVzdF9udW0pKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSogICAgICAgaF92b2ljZSxFX1FTRVJfVk9JQ0VfRUNBTExfU0VUX1RZUEVfVCB0eXBlLCBjb25zdCBjaGFyICp0ZXN0X251bSwgaW50IHRlc3RfbnVtX2xlbmd0aCk7DQotaW50ICgqcXNlcl92b2ljZV9mYXN0X2VjYWxsKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUqICAgICAgIGhfdm9pY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICpjYWxsX2lkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVfUVNFUl9WT0lDRV9FQ0FMTF9DQVRFR09SWV9UIGNhdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFX1FTRVJfVk9JQ0VfRUNBTExfVkFSSUFOVF9UIHZhcmlhbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJfbGVuZ3RoLCANCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptc2RfZGF0YSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNkX2xlbmd0aCk7IC8vbXNkX2xlbmd0aCBzaG91bGQgPD0gUVNFUl9NU0RfTUFYX0xFTkdUSA0KLWludCAoKnFzZXJfdm9pY2Vfc2V0X21zZCkoaW50IGNhbGxpZCwgY29uc3QgdW5zaWduZWQgY2hhciAqbXNkX2RhdGEsIGludCBtc2RfbGVuZ3RoKTsgLy9tc2RfbGVuZ3RoIHNob3VsZCA8PSBRU0VSX01TRF9NQVhfTEVOR1RIDQotaW50ICgqcXNlcl92b2ljZV9hZGRfZWNhbGxfaW5kaGFuZGxlcikodm9pY2VfY2xpZW50X2hhbmRsZV90eXBlKiAgICAgICAgICBoX3ZvaWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU0VSX0VDYWxsX0luZEhhbmRsZXJGdW5jX3QgICBoYW5kbGVyUHRyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgY29udGV4dFB0cik7DQotDQotc3RhdGljIHZvaWQgeWtfdm9pY2VfZWNhbGxfY2JfZnVuYyhpbnQgICAgICAgICBjYWxsaWQsICBFX1FTRVJfVk9JQ0VfRUNBTExfSU5ESUNBVElPTl9UIGluZCwgdm9pZCogY29udGV4dFB0cikNCi17ICAgDQotICAgIHVuc2lnbmVkIGNoYXIgbXNkX2RhdGFbUVNFUl9NU0RfTUFYX0xFTkdUSF09ezEsMSwyLDIsMywzLDQsNH07DQotDQotICAgIHByaW50ZigiIyMjIyMjIyMjIENhbGwgaWQ9JWQsIGV2ZW50PSVkISAgIyMjIyMjXG4iLCBjYWxsaWQsIGluZCk7DQotICAgIA0KLSAgICBpZihpbmQgPT0gRV9RU0VSX1ZPSUNFX0VDQUxMX0lORF9TRU5ESU5HX1NUQVJUX0lOX1ZPSUNFIHx8IGluZCA9PSBFX1FTRVJfVk9JQ0VfRUNBTExfSU5EX1BTQVBfQ0FMTEJBQ0tfU1RBUlQpDQotICAgIHsNCi0gICAgICAgIC8qY3VzdG9tZXIgc2hvdWxkIGNvbnN0cnVjdCBtc2QgaW5jbHVkaW5nIEdQUyBkYXRhLCBoZXJlIHVzZSBtc2RfZGF0YSBmb3IgaWxsdXN0cmF0ZSwqLw0KLSAgICAgICAgcXNlcl92b2ljZV9zZXRfbXNkKGNhbGxpZCxtc2RfZGF0YSw4KTsgICAgICAgICAgICAgICAgDQotICAgIH0NCi19DQotDQotI2VuZGlmDQotDQotDQotdm9pZCAqZGxIYW5kbGVfY2FsbCA9IE5VTEw7DQotDQotc3RhdGljIHZvaWQgeWtfdm9pY2VfY2FsbF9jYl9mdW5jKGludCAgICAgICAgICAgICAgICAgICAgIGNhbGxfaWQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIHBob25lX251bSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNlcl92b2ljZV9jYWxsX3N0YXRlX3Qgc3RhdGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpjb250ZXh0UHRyKQ0KLXsNCi0gICAgY2hhciAqY2FsbF9zdGF0ZVtdID0geyJJTkNPTUlORyIsICJESUFMSU5HIiwgIkFMRVJUSU5HIiwgIkFDVElWRSIsICJIT0xESU5HIiwgIkVORCIsICJXQUlUSU5HIn07DQotDQotICAgIHByaW50ZigiIyMjIyMjIyMjIENhbGwgaWQ9JWQsIFBob25lTnVtOiVzLCBldmVudD0lcyEgICMjIyMjI1xuIiwgY2FsbF9pZCwgcGhvbmVfbnVtLCBjYWxsX3N0YXRlW3N0YXRlXSk7DQotfQ0KLQ0KLQ0KLQ0KLXZvaWQgcHJpbnRfaGVscCh2b2lkKQ0KLXsNCi0gICAgaW50IGk7DQotICAgIHByaW50ZigiU3VwcG9ydGVkIHRlc3QgY2FzZXM6XG4iKTsNCi0gICAgZm9yKGkgPSAwOyA7IGkrKykNCi0gICAgew0KLSAgICAgICAgaWYoYXRfYXBpX3Rlc3RjYXNlc1tpXS5jbWRJZHggPT0gLTEpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBwcmludGYoIiVkOlx0JXNcbiIsIGF0X2FwaV90ZXN0Y2FzZXNbaV0uY21kSWR4LCBhdF9hcGlfdGVzdGNhc2VzW2ldLmZ1bmNOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi0NCi0NCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciBjb25zdCAqYXJndltdKQ0KLXsNCi0gICAgaW50IGNtZElkeCA9IDA7DQotICAgIGludCByZXQgICAgPSAwOw0KLSAgICBpbnQgIHZvaWNlX2NhbGxfaWQgPSAwOw0KLSAgICB2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUgICAgaF92b2ljZSAgICAgPSAwOw0KLSAgICANCi0gICAgY29uc3QgY2hhciAqbHlucUxpYlBhdGhfQ2FsbCA9ICIvbGliL2xpYmx5bnEtcXNlci12b2ljZS5zbyI7DQotICAgIGRsSGFuZGxlX2NhbGwgPSBkbG9wZW4obHlucUxpYlBhdGhfQ2FsbCwgUlRMRF9OT1cpOw0KLSAgICBpZiAoZGxIYW5kbGVfY2FsbCA9PSBOVUxMKSANCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJkbG9wZW4gZGxIYW5kbGVfY2FsbCBmYWlsZWQ6ICVzXG4iLCBkbGVycm9yKCkpOw0KLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOw0KLSAgICB9DQotICAgIA0KLSAgICBxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2luaXQgPSAoaW50KCopKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSAqcGhfdm9pY2UpKWRsc3ltKGRsSGFuZGxlX2NhbGwsICJxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2luaXQiKTsNCi0gICAgaWYocXNlcl92b2ljZV9jYWxsX2NsaWVudF9pbml0ID09IE5VTEwpIA0KLSAgICB7DQotICAgICAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9jbGllbnRfaW5pdCBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcXNlcl92b2ljZV9jYWxsX2FkZHN0YXRlaGFuZGxlciA9IChpbnQoKikodm9pY2VfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgIGhfdm9pY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU0VSX1ZvaWNlQ2FsbF9TdGF0ZUhhbmRsZXJGdW5jX3QgICAgaGFuZGxlclB0ciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICpjb250ZXh0UHRyKSlkbHN5bShkbEhhbmRsZV9jYWxsLCJxc2VyX3ZvaWNlX2NhbGxfYWRkc3RhdGVoYW5kbGVyIik7DQotICAgIGlmKHFzZXJfdm9pY2VfY2FsbF9hZGRzdGF0ZWhhbmRsZXIgPT0gTlVMTCkgDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9jYWxsX2FkZHN0YXRlaGFuZGxlciBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgDQotICAgIHFzZXJfdm9pY2VfY2FsbF9hbnN3ZXIgPSAoaW50KCopKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSxpbnQgKSlkbHN5bShkbEhhbmRsZV9jYWxsLCJxc2VyX3ZvaWNlX2NhbGxfYW5zd2VyIik7DQotICAgIGlmKHFzZXJfdm9pY2VfY2FsbF9hbnN3ZXIgPT0gTlVMTCkgDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9jYWxsX2Fuc3dlciBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcXNlcl92b2ljZV9jYWxsX3N0YXJ0ID0gKGludCgqKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUgIGhfdm9pY2UsRV9RU0VSX1ZDQUxMX0lEX1QgICBzaW1JZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGhvbmVfbnVtYmVyLCBpbnQgKmNhbGxfaWQpKWRsc3ltKGRsSGFuZGxlX2NhbGwsInFzZXJfdm9pY2VfY2FsbF9zdGFydCIpOw0KLSAgICBpZihxc2VyX3ZvaWNlX2NhbGxfc3RhcnQgPT0gTlVMTCkgDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9jYWxsX3N0YXJ0IG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzXG4iLCBseW5xTGliUGF0aF9DYWxsKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBxc2VyX3ZvaWNlX2NhbGxfZW5kID0gKGludCgqKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUgLGludCkpZGxzeW0oZGxIYW5kbGVfY2FsbCwicXNlcl92b2ljZV9jYWxsX2VuZCIpOw0KLSAgICBpZihxc2VyX3ZvaWNlX2NhbGxfZW5kID09IE5VTEwpIA0KLSAgICB7DQotICAgICAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9lbmQgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXNcbiIsIGx5bnFMaWJQYXRoX0NhbGwpOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotICAgIA0KLQ0KLSAgICBxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdCA9IChpbnQgKCopKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSBoX3ZvaWNlKSlkbHN5bShkbEhhbmRsZV9jYWxsLCJxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdCIpOw0KLSAgICBpZihxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdCA9PSBOVUxMKSANCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdCAgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXNcbiIsIGx5bnFMaWJQYXRoX0NhbGwpOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHFzZXJfdm9pY2VfY2FsbF9yZW1vdmVzdGF0ZWhhbmRsZSA9IChpbnQgKCopKHZvaWNlX2NsaWVudF9oYW5kbGVfdHlwZSkpZGxzeW0oZGxIYW5kbGVfY2FsbCwicXNlcl92b2ljZV9jYWxsX3JlbW92ZXN0YXRlaGFuZGxlIik7DQotICAgIGlmKHFzZXJfdm9pY2VfY2FsbF9yZW1vdmVzdGF0ZWhhbmRsZSA9PSBOVUxMKSANCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX2NhbGxfcmVtb3Zlc3RhdGVoYW5kbGUgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXNcbiIsIGx5bnFMaWJQYXRoX0NhbGwpOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHFzZXJfdm9pY2Vfc2V0X3NwZWVjaF92b2x1bWUgPSAoaW50ICgqKShjb25zdCBpbnQgKSlkbHN5bShkbEhhbmRsZV9jYWxsLCJxc2VyX3ZvaWNlX3NldF9zcGVlY2hfdm9sdW1lIik7DQotICAgIGlmKHFzZXJfdm9pY2Vfc2V0X3NwZWVjaF92b2x1bWUgPT0gTlVMTCkgICAgDQotICAgIHsNCi0gICAgICAgICAgICBwcmludGYoInFzZXJfdm9pY2Vfc2V0X3NwZWVjaF92b2x1bWUgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXNcbiIsIGx5bnFMaWJQYXRoX0NhbGwpOw0KLSAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLQ0KLSAgICBxc2VyX3ZvaWNlX2dldF9zcGVlY2hfdm9sdW1lID0gKGludCAoKikoaW50KiApKWRsc3ltKGRsSGFuZGxlX2NhbGwsInFzZXJfdm9pY2VfZ2V0X3NwZWVjaF92b2x1bWUiKTsNCi0gICAgaWYocXNlcl92b2ljZV9nZXRfc3BlZWNoX3ZvbHVtZSA9PSBOVUxMKSAgICANCi0gICAgew0KLSAgICAgICAgICAgIHByaW50ZigicXNlcl92b2ljZV9nZXRfc3BlZWNoX3ZvbHVtZSBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHFzZXJfdm9pY2Vfc2V0X2R0bWYgPSAoaW50ICgqKShjb25zdCBjaGFyICkpZGxzeW0oZGxIYW5kbGVfY2FsbCwicXNlcl92b2ljZV9zZXRfZHRtZiIpOw0KLSAgICBpZihxc2VyX3ZvaWNlX3NldF9kdG1mID09IE5VTEwpICAgIA0KLSAgICB7DQotICAgICAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX3NldF9kdG1mIG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzXG4iLCBseW5xTGliUGF0aF9DYWxsKTsNCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0jaWZkZWYgRUNBTExfU1VQUE9SVA0KLSAgICBxc2VyX3ZvaWNlX2Zhc3RfZWNhbGwgPSAoaW50ICgqKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUqLCBpbnQqLCBFX1FTRVJfVk9JQ0VfRUNBTExfQ0FURUdPUllfVCwgRV9RU0VSX1ZPSUNFX0VDQUxMX1ZBUklBTlRfVCwgY29uc3QgY2hhciosIGludCwgY29uc3QgdW5zaWduZWQgY2hhciosIGludCkpZGxzeW0oZGxIYW5kbGVfY2FsbCwicXNlcl92b2ljZV9mYXN0X2VjYWxsIik7DQotICAgIGlmKHFzZXJfdm9pY2VfZmFzdF9lY2FsbCA9PSBOVUxMKSAgICANCi0gICAgew0KLSAgICAgICAgICAgIHByaW50ZigicXNlcl92b2ljZV9mYXN0X2VjYWxsIG5vdCBkZWZpbmVkIG9yIGV4cG9ydGVkIGluICVzXG4iLCBseW5xTGliUGF0aF9DYWxsKTsNCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0gICAgcXNlcl92b2ljZV9zZXRfdGVzdF9udW0gPSAoaW50ICgqKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUqLCBFX1FTRVJfVk9JQ0VfRUNBTExfU0VUX1RZUEVfVCwgY29uc3QgY2hhciogLCBpbnQpKWRsc3ltKGRsSGFuZGxlX2NhbGwsInFzZXJfdm9pY2Vfc2V0X3Rlc3RfbnVtIik7DQotICAgIGlmKHFzZXJfdm9pY2Vfc2V0X3Rlc3RfbnVtID09IE5VTEwpICAgIA0KLSAgICB7DQotICAgICAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX3NldF90ZXN0X251bSBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9ICAgIA0KLQ0KLSAgICBxc2VyX3ZvaWNlX3NldF9tc2QgPSAoaW50ICgqKShpbnQgLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCkpZGxzeW0oZGxIYW5kbGVfY2FsbCwicXNlcl92b2ljZV9zZXRfbXNkIik7DQotICAgIGlmKHFzZXJfdm9pY2Vfc2V0X21zZCA9PSBOVUxMKSAgICANCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX3NldF9tc2Qgbm90IGRlZmluZWQgb3IgZXhwb3J0ZWQgaW4gJXNcbiIsIGx5bnFMaWJQYXRoX0NhbGwpOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHFzZXJfdm9pY2VfYWRkX2VjYWxsX2luZGhhbmRsZXIgPSAoaW50ICgqKSh2b2ljZV9jbGllbnRfaGFuZGxlX3R5cGUqIGhfdm9pY2UsIFFTRVJfRUNhbGxfSW5kSGFuZGxlckZ1bmNfdCwgdm9pZCopKWRsc3ltKGRsSGFuZGxlX2NhbGwsInFzZXJfdm9pY2VfYWRkX2VjYWxsX2luZGhhbmRsZXIiKTsNCi0gICAgaWYocXNlcl92b2ljZV9hZGRfZWNhbGxfaW5kaGFuZGxlciA9PSBOVUxMKSAgICANCi0gICAgew0KLSAgICAgICAgICAgIHByaW50ZigicXNlcl92b2ljZV9hZGRfZWNhbGxfaW5kaGFuZGxlciBub3QgZGVmaW5lZCBvciBleHBvcnRlZCBpbiAlc1xuIiwgbHlucUxpYlBhdGhfQ2FsbCk7DQotICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotI2VuZGlmDQotICAgIA0KLSAgICByZXQgPSBxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2luaXQoJmhfdm9pY2UpOw0KLSAgICBpZihyZXQgIT0gMCApDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9jYWxsX2NsaWVudF9pbml0IEZBSUxcbiIpOw0KLSAgICAgICAgcmV0dXJuIC0xOw0KLSAgICB9DQotDQotICAgIHJldCA9IHFzZXJfdm9pY2VfY2FsbF9hZGRzdGF0ZWhhbmRsZXIoaF92b2ljZSwgeWtfdm9pY2VfY2FsbF9jYl9mdW5jLCAmdm9pY2VfY2FsbF9pZCk7DQotICAgIGlmKHJldCAhPSAwKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9hZGRzdGF0ZWhhbmRsZXIgRkFJTFxuIik7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0NCi0jaWZkZWYgRUNBTExfU1VQUE9SVA0KLSAgICByZXQgPSBxc2VyX3ZvaWNlX2FkZF9lY2FsbF9pbmRoYW5kbGVyKCZoX3ZvaWNlLCB5a192b2ljZV9lY2FsbF9jYl9mdW5jLCBOVUxMKTsNCi0gICAgaWYocmV0ICE9IDApDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9hZGRfZWNhbGxfaW5kaGFuZGxlciBGQUlMXG4iKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSNlbmRpZg0KLQ0KLSAgICBwcmludF9oZWxwKCk7DQotICAgIHdoaWxlKDEpDQotICAgIHsNCi0gICAgICAgIHByaW50ZigiXG5wbGVhc2UgaW5wdXQgY21kIGluZGV4KC0xIGV4aXQpOiAiKTsNCi0gICAgICAgIHNjYW5mKCIlZCIsICZjbWRJZHgpOw0KLSAgICAgICAgaWYoY21kSWR4ID09IC0xKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc3dpdGNoKGNtZElkeCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyJwcmludF9oZWxwDQotICAgICAgICAgICAgY2FzZSAwOg0KLSAgICAgICAgICAgICAgICBwcmludF9oZWxwKCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLQ0KLSAgICAgICAgICAgIC8vInFzZXJfdm9pY2VfY2FsbF9zdGFydCINCi0gICAgICAgICAgICBjYXNlIDE6DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjaGFyICAgIFBob25lTnVtWzMyXSA9IHswfTsgDQotDQotICAgICAgICAgICAgICAgIHByaW50ZigicGxlYXNlIGlucHV0IGRlc3QgcGhvbmUgbnVtYmVyOiBcbiIpOw0KLSAgICAgICAgICAgICAgICBzY2FuZigiJXMiLCBQaG9uZU51bSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHJldCA9IHFzZXJfdm9pY2VfY2FsbF9zdGFydChoX3ZvaWNlLCBFX1FTRVJfVkNBTExfRVhURVJOQUxfU0xPVF8xLCBQaG9uZU51bSwgJnZvaWNlX2NhbGxfaWQpOw0KLSAgICAgICAgICAgICAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9zdGFydCByZXQgPSAlZCwgd2l0aCB2b2ljZV9jYWxsX2lkPSVkXG4iLCByZXQsIHZvaWNlX2NhbGxfaWQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgIA0KLSAgICAgICAgICAgIC8vInFzZXJfdm9pY2VfY2FsbF9lbmQiDQotICAgICAgICAgICAgY2FzZSAyOg0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaW50IGNhbGxfaWQgPSAtMTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJwbGVhc2UgaW5wdXQgZW5kIGNhbGwgaWQ6IFxuIik7DQotICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZjYWxsX2lkKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gcXNlcl92b2ljZV9jYWxsX2VuZChoX3ZvaWNlLCBjYWxsX2lkKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcmV0ID0gJWRcbiIsIHJldCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyJxc2VyX3ZvaWNlX2NhbGxfYW5zd2VyIg0KLSAgICAgICAgICAgIGNhc2UgMzoNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGludCBjYWxsX2lkID0gLTE7DQotICAgICAgICAgICAgICAgIHByaW50ZigiIHBsZWFzZSBpbnB1dCBhbnN3ZXIgY2FsbCBpZFxuIik7DQotICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZjYWxsX2lkKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gcXNlcl92b2ljZV9jYWxsX2Fuc3dlcihoX3ZvaWNlLCBjYWxsX2lkKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIgcmV0ID0gJWRcbiIsIHJldCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBjYXNlIDQ6DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lID0gMDsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJQbGVhc2Ugc2V0IHNwZWVjaCB2b2x1bWU6MC01IGxldmVsXG4iKTsNCi0gICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmdm9sdW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gcXNlcl92b2ljZV9zZXRfc3BlZWNoX3ZvbHVtZSh2b2x1bWUpOw0KLSAgICAgICAgICAgICAgICBwcmludGYoInJldCBpcyAlZFxuIixyZXQpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgY2FzZSA1Og0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IC0xOw0KLSAgICAgICAgICAgICAgICBwcmludGYoIkVudGVyIGdldCBzcGVlY2ggdm9sdW1lXG4iKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gcXNlcl92b2ljZV9nZXRfc3BlZWNoX3ZvbHVtZSgmdm9sdW1lKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJyZXQgaXMgJWQsZ2V0IHZvbHVtZSBpcyAlZFxuIixyZXQsdm9sdW1lKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhc2UgNjoNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIGludCByZXQ7DQotICAgICAgICAgICAgICAgY2hhciBpbnB1dENoYXI7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgcHJpbnRmKCJFbnRlciBzZXQgZHRtZlxuIik7DQotICAgICAgICAgICAgICAgc2NhbmYoIiAlYyIsICZpbnB1dENoYXIpOw0KLSAgICAgICAgICAgICAgIHByaW50ZigiaW5wdXRDaGFyIGlzICVjXG4iLCBpbnB1dENoYXIpOw0KLSAgICAgICAgICAgICAgIHJldCA9IHFzZXJfdm9pY2Vfc2V0X2R0bWYoaW5wdXRDaGFyKTsNCi0gICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICBpZiAocmV0ICE9IDApIA0KLSAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgcHJpbnRmKCJxc2VyIHNldCB2b2ljZSBkdG1mIGZhaWxlZFxuIik7DQotICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCi0gICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotI2lmZGVmIEVDQUxMX1NVUFBPUlQNCi0gICAgICAgICAgICBjYXNlIDc6DQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgY2hhciBQaG9uZU51bVszMl0gPSB7MH07ICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJwbGVhc2UgaW5wdXQgdGVzdCBwaG9uZSBudW1iZXI6IFxuIik7DQotICAgICAgICAgICAgICAgIHNjYW5mKCIlcyIsIFBob25lTnVtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHJldCA9IHFzZXJfdm9pY2Vfc2V0X3Rlc3RfbnVtKCZoX3ZvaWNlLCBFX1FTRVJfVk9JQ0VfRUNBTExfU0VUX05VTUJFUiwgUGhvbmVOdW0sIHN0cmxlbihQaG9uZU51bSkrMSk7DQotICAgICAgICAgICAgICAgIHByaW50ZigicXNlcl92b2ljZV9zZXRfdGVzdF9udW0gcmV0ID0gJWRcbiIsIHJldCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgICAgICBjYXNlIDg6DQotICAgICAgICAgICAgeyAgIA0KLSAgICAgICAgICAgICAgICBpbnQgY2FsbF9pZCA9IC0xOw0KLSAgICAgICAgICAgICAgICBpbnQgY2F0Ow0KLSAgICAgICAgICAgICAgICBpbnQgdmFyOw0KLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoOw0KLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBtc2RbUVNFUl9NU0RfTUFYX0xFTkdUSF09ezB9Ow0KLQ0KLSAgICAgICAgICAgICAgICBwcmludGYoInBsZWFzZSBpbnB1dCBlY2FsbCBjYXQ6IDAgbWFudWFsLCAxIGF1dG9cbiIpOw0KLSAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCAmY2F0KTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJwbGVhc2UgaW5wdXQgZWNhbGwgdHlwZTogMCB0ZXN0LCAxIGVtZXJnZW5jeVxuIik7DQotICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZ2YXIpOw0KLSAgICAgICAgICAgICAgICBwcmludGYoInBsZWFzZSBpbnB1dCBtc2QgY29udGVudCBsZW5ndGggKG1heCBsZW5ndGggaXMgMTQwKVxuIik7DQotICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZsZW5ndGgpOw0KLSAgICAgICAgICAgICAgICBwcmludGYoInBsZWFzZSBpbnB1dCAlZCB1bnNpZ25lZCBjaGFyICgwLTI1NSk6XG4iLCBsZW5ndGgpOyAgDQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsgIA0KLSAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVoaHUiLCAmbXNkW2ldKTsgDQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHJldCA9IHFzZXJfdm9pY2VfZmFzdF9lY2FsbCgmaF92b2ljZSwgJmNhbGxfaWQsIChFX1FTRVJfVk9JQ0VfRUNBTExfQ0FURUdPUllfVCkgY2F0LCAoRV9RU0VSX1ZPSUNFX0VDQUxMX1ZBUklBTlRfVCkgdmFyLCAibnVsbCIsNSxtc2QsbGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJxc2VyX3ZvaWNlX2Zhc3RfZWNhbGwgcmV0ID0gJWQsIGNhbGwgaWQgaXMgJWRcbiIsIHJldCwgY2FsbF9pZCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0jZW5kaWYNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBwcmludF9oZWxwKCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICByZXQgPSBxc2VyX3ZvaWNlX2NhbGxfcmVtb3Zlc3RhdGVoYW5kbGUoaF92b2ljZSk7DQotICAgIGlmKHJldCAhPSAwICYmIHJldCAhPSAxKQ0KLSAgICB7DQotICAgICAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9yZW1vdmVzdGF0ZWhhbmRsZSBGQUlMISEhXG4iKTsNCi0gICAgICAgIHJldHVybiAtMTsNCi0gICAgfQ0KLSAgICBwcmludGYoInFzZXJfdm9pY2VfY2FsbF9yZW1vdmVzdGF0ZWhhbmRsZSByZXQgPSAlZFxuIiwgcmV0KTsNCi0gICAgDQotICAgIA0KLSAgICByZXQgPSBxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdChoX3ZvaWNlKTsNCi0gICAgaWYocmV0ICE9IDApDQotICAgIHsNCi0gICAgICAgIHByaW50ZigicXNlcl92b2ljZV9jYWxsX2NsaWVudF9kZWluaXQgRkFJTFxuIik7DQotICAgICAgICByZXR1cm4gLTE7DQotICAgIH0NCi0gICAgcHJpbnRmKCJxc2VyX3ZvaWNlX2NhbGxfY2xpZW50X2RlaW5pdCByZXQgPSAlZCwgd2l0aCBoX3ZvaWNlPSVkXG4iLCByZXQsIGhfdm9pY2UpOw0KLSAgICANCi0gICByZXR1cm4gMDsNCi0NCi0gICAgDQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWFwcC9hdC1jdGwvYXQtY3RsLmJiIGIvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL2F0LWN0bC9hdC1jdGwuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEyZWE1NGIuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL2F0LWN0bC9hdC1jdGwuYmIKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1ERVNDUklQVElPTiA9ICJhdF9jdGwiCi1ERVBFTkRTICAgICA9ICJsaWJudnJhbSBsaWJzb2Z0YXAgbGlic29mdHRpbWVyIGxpYmF0dXRpbHMgc3FsY2lwaGVyIGxpYmF0ZXh0IGxpYm14bWwgbGlidGVsc3ZyIGxpYnNkLWRhZW1vbiIKLVNFQ1RJT04gICAgID0gImFwcCIKLUxJQ0VOU0UgICAgID0gInp0ZSIKLVBWID0gIjEuMC4wIgotUFIgPSAicjAiCi0KLUNMQVNTX0NPTSA9ICIgXAotICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCAncHJvY2QnLCAnb3BlbndydCBvcGVud3J0LXNlcnZpY2VzJywgJycsIGQpfSBcCi0gICAgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsICdzeXN0ZW1kJywgJ3N5c3RlbWQnLCAnJywgZCl9IFwKLSIKLWluaGVyaXQgJHtDTEFTU19DT019Ci0KLQotREVQRU5EUyArPSAiIFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3ZvbHRlJywgJ2xpYnZvaWNlJywgJycsIGQpfSBcCi0gICAgIgotCi0j6YWN572uY29kZei3r+W+hOS/oeaBr+OAggotRklMRVNFWFRSQVBBVEhTX3ByZXBlbmQgOj0iJHtBUFAtT1BFTi1QQVRIfS9wbGF0Zm9ybToiCi1TUkNfVVJJID0gIiBcCi0gICAgICAgICAgZmlsZTovL2F0X2N0bCBcCi0JCSAgJHtAYmIudXRpbHMuY29udGFpbnMoIkRJU1RST19GRUFUVVJFUyIsICJwcm9jZCIsICJmaWxlOi8vYXRfY3RsLmluaXQiLCIiLCBkKX0gXAotCQkgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdGVtZCIsICJmaWxlOi8vYXRfY3RsLnNlcnZpY2UiLCIiLCBkKX0gXAotCQkgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdmluaXQiLCAiZmlsZTovL2F0X2N0bC5zeXN2aW5pdCIsIiIsIGQpfSBcCi0JCSAgZmlsZTovL3ByZWNvbmZpZ3VyZWRfdXJzX3BvbGljeS54bWwgXAotICAgICAgICAgICIKLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7Q09NTU9OX0xJQ0VOU0VfRElSfS96dGU7bWQ1PWMwNzU2ODlkMWQxZTA2ZDRhYjViYmU1MzYyM2E2ODA4IgotUyA9ICIke1dPUktESVJ9IgotU19TUkNfUEFUSCA9ICIke1N9L2F0X2N0bCIKLQotI+W8leeUqOWFrOeUqOWktOaWh+S7tuWSjOe8luivkemAiemhueOAggotaW5jbHVkZSAke0JTUERJUn0vc291cmNlcy9tZXRhLXp4aWMvY29uZi9hcHBfY29tLmluYwotaW5jbHVkZSAke0JTUERJUn0vc291cmNlcy9tZXRhLXp4aWMvY29uZi9wdWIuaW5jCi1DRkxBR1NfYXBwZW5kID0gIi1JICR7QlNQRElSfS96eGljX2NvZGUvenhpY19zb3VyY2UvenhpY19hcHBfb3Blbi9wbGF0Zm9ybS9hdF9jdGwvc3JjL3Bob25lL2luYyIKLUNGTEFHU19hcHBlbmQgKz0gIiR7WlhJQ19FWFRSQV9DRkxBR1N9IgotTERMSUJTX0VYVCA9ICIke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3ZvbHRlJywgJy1sdm9pY2UnLCAnJywgZCl9IgotI2luY2x1ZGUgYXQtY3RsLmluYwotCi0jaW5oZXJpdCBhdXRvdG9vbHMgcGtnY29uZmlnIHN5c3RlbWQKLQotZG9fY29tcGlsZSgpIHsKLQltYWtlIC1DICR7U19TUkNfUEFUSH0gTERMSUJTX0VYVD0ke0xETElCU19FWFR9Ci19Ci0KLWRvX2luc3RhbGwgKCkgewotCWluc3RhbGwgLWQgJHtEfSR7YmluZGlyfS8JCQotCWluc3RhbGwgLW0gMDc1NSAke1NfU1JDX1BBVEh9L2F0X2N0bCAke0R9JHtiaW5kaXJ9LwotCQotCWlmICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCdwcm9jZCcsJ3RydWUnLCdmYWxzZScsZCl9OyB0aGVuCi0JCWluc3RhbGwgLURtIDA3NTUgJHtXT1JLRElSfS9hdF9jdGwuaW5pdCAke0R9JHtzeXNjb25mZGlyfS9pbml0LmQvYXRfY3RsCi0JZmkKLQotCWlmICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCdzeXN0ZW1kJywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJaW5zdGFsbCAtZCAke0R9JHtzeXN0ZW1kX3VuaXRkaXJ9L3N5c3RlbQotCQlpbnN0YWxsIC1tIDA2NDQgJHtXT1JLRElSfS9hdF9jdGwuc2VydmljZSAke0R9JHtzeXN0ZW1kX3VuaXRkaXJ9L3N5c3RlbQotCWZpCi0JCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3Zpbml0JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJaW5zdGFsbCAtRG0gMDc1NSAke1dPUktESVJ9L2F0X2N0bC5zeXN2aW5pdCAke0R9JHtzeXNjb25mZGlyfS9pbml0LmQvYXRfY3RsCi0JCWluc3RhbGwgLWQgJHtEfSR7c3lzY29uZmRpcn0vcmNTLmQKLQkJbG4gLXMgLi4vaW5pdC5kL2F0X2N0bCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZC9TMjBhdF9jdGwKLQkJbG4gLXMgLi4vaW5pdC5kL2F0X2N0bCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZC9LODBhdF9jdGwKLQlmaQotCQotCWluc3RhbGwgLWQgJHtEfS9ldGNfcm8vY29uZmlnLwotCWluc3RhbGwgLW0gMDY0NCAke1dPUktESVJ9L3ByZWNvbmZpZ3VyZWRfdXJzX3BvbGljeS54bWwgJHtEfS9ldGNfcm8vY29uZmlnLwotCi0JI2luc3RhbGwgZWxmcwotCWluc3RhbGwgLWQgJHtFTEZTLVBBVEh9LwotCSNpbnN0YWxsIC1tIDA3NTUgJHtTX1NSQ19QQVRIfS9hdF9jdGwgJHtFTEZTLVBBVEh9LyR7UE59LwotCWluc3RhbGwgLW0gMDc1NSAke1NfU1JDX1BBVEh9L2F0X2N0bCAke0VMRlMtUEFUSH0vCi19Ci0KLWRvX2NsZWFubGlicyAoKSB7Ci0Jcm0gLWZyICR7RUxGUy1QQVRIfS9hdF9jdGwKLX0KLQotYWRkdGFzayAgY2xlYW5saWJzIGFmdGVyIGRvX2NsZWFuICBiZWZvcmUgZG9fY2xlYW5zc3RhdGUKLQotRklMRVNfJHtQTn0gPSAiXAotICAgICR7YmluZGlyfS8gXAotICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAicHJvY2QiLCAiJHtzeXNjb25mZGlyfS9pbml0LmQvYXRfY3RsIiwiIiwgZCl9IFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInN5c3Zpbml0IiwgIiR7c3lzY29uZmRpcn0vIiwiIiwgZCl9IFwKLSAgICBldGNfcm8vIFwKLSAgICAiCi1TWVNURU1EX1NFUlZJQ0VfJHtQTn0gICAgID0gImF0X2N0bC5zZXJ2aWNlIgotU1lTVEVNRF9BVVRPX0VOQUJMRV8ke1BOfSA9ICJlbmFibGUiCi0KLVJERVBFTkRTXyR7UE59ID0gIiBsaWJudnJhbSBsaWJzb2Z0YXAgbGlic29mdHRpbWVyIGxpYmF0dXRpbHMgc3FsY2lwaGVyIGxpYmF0ZXh0IGxpYm14bWwgbGlidm9pY2UgbGlic2QtZGFlbW9uIgpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3NudHAvc250cC5iYiBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWFwcC9zbnRwL3NudHAuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIxZjIwN2UuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3NudHAvc250cC5iYgorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLURFU0NSSVBUSU9OID0gInNudHAiCi0jc250cOS+nei1lmxpYm52cmFt5bqTCi1ERVBFTkRTICAgICA9ICJsaWJudnJhbSBsaWJzb2Z0YXAgbGlic29mdHRpbWVyIgotU0VDVElPTiAgICAgPSAiYXBwIgotTElDRU5TRSAgICAgPSAienRlIgotUFYgPSAiMS4wLjAiCi1QUiA9ICJyMCIKLQotQ0xBU1NfQ09NID0gIiBcCi0gICAgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsICdwcm9jZCcsICdvcGVud3J0IG9wZW53cnQtc2VydmljZXMnLCAnJywgZCl9IFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3N5c3RlbWQnLCAnc3lzdGVtZCcsICcnLCBkKX0gXAotIgotaW5oZXJpdCAke0NMQVNTX0NPTX0KLQotI+mFjee9rmNvZGXot6/lvoTkv6Hmga/jgIIKLUZJTEVTRVhUUkFQQVRIU19wcmVwZW5kIDo9IiR7QVBQLU9QRU4tUEFUSH0vcGxhdGZvcm06IgotU1JDX1VSSSA9ICIgXAotICAgICAgICAgIGZpbGU6Ly9zbnRwIFwKLQkJICAke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInByb2NkIiwgImZpbGU6Ly9zbnRwLmluaXQiLCIiLCBkKX0gXAotCQkgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdGVtZCIsICJmaWxlOi8vc250cC5zZXJ2aWNlIiwiIiwgZCl9IFwKLQkJICAke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInN5c3Zpbml0IiwgImZpbGU6Ly9zbnRwLnN5c3Zpbml0IiwiIiwgZCl9IFwKLSAgICAgICAgICAiCi0KLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7Q09NTU9OX0xJQ0VOU0VfRElSfS96dGU7bWQ1PWMwNzU2ODlkMWQxZTA2ZDRhYjViYmU1MzYyM2E2ODA4IgotUyA9ICIke1dPUktESVJ9IgotCi0j5byV55So5YWs55So5aS05paH5Lu25ZKM57yW6K+R6YCJ6aG544CCCi1pbmNsdWRlICR7QlNQRElSfS9zb3VyY2VzL21ldGEtenhpYy9jb25mL2FwcF9jb20uaW5jCi0KLSPnvJbor5EKLWRvX2NvbXBpbGUoKSB7Ci0JbWFrZSAtQyBzbnRwCi19Ci0KLSPlupPmlofku7bnmoTlronoo4XvvIzlsIHlupPnmoTlro9NS19TREtfVkVSU0lPTgotZG9faW5zdGFsbCAoKSB7Ci0JaW5zdGFsbCAtZCAke0R9JHtiaW5kaXJ9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3NudHAvc250cCAke0R9JHtiaW5kaXJ9LwotCQotCWlmICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCdwcm9jZCcsJ3RydWUnLCdmYWxzZScsZCl9OyB0aGVuCi0JCWluc3RhbGwgLURtIDA3NTUgJHtXT1JLRElSfS9zbnRwLmluaXQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kL3NudHAKLQlmaQotCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3RlbWQnLCd0cnVlJywnZmFsc2UnLGQpfTsgdGhlbgotCQlpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtCi0JCWluc3RhbGwgLW0gMDY0NCAke1dPUktESVJ9L3NudHAuc2VydmljZSAke0R9JHtzeXN0ZW1kX3VuaXRkaXJ9L3N5c3RlbQotCWZpCi0JCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3Zpbml0JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJaW5zdGFsbCAtRG0gMDc1NSAke1dPUktESVJ9L3NudHAuc3lzdmluaXQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kL3NudHAKLQkJaW5zdGFsbCAtZCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZAotCQkjbG4gLXMgLi4vaW5pdC5kL3NudHAgJHtEfSR7c3lzY29uZmRpcn0vcmNTLmQvUzIyc250cAotCWZpCi0JCi0JI2luc3RhbGwgZWxmcwotCWluc3RhbGwgLWQgJHtFTEZTLVBBVEh9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3NudHAvc250cCAke0VMRlMtUEFUSH0vCi19Ci0j5riF5bqTCi1kb19jbGVhbmxpYnMgKCkgewotCXJtIC1mciAke0VMRlMtUEFUSH0vc250cAotfQotCi1hZGR0YXNrICBjbGVhbmxpYnMgYWZ0ZXIgZG9fY2xlYW4gIGJlZm9yZSBkb19jbGVhbnNzdGF0ZQotCi0jcm9vdGZz5YyF5ZCr55qE5paH5Lu2Ci1GSUxFU18ke1BOfSA9ICJcCi0gICAgJHtiaW5kaXJ9LyBcCi0gICAgJHtAYmIudXRpbHMuY29udGFpbnMoIkRJU1RST19GRUFUVVJFUyIsICJwcm9jZCIsICIke3N5c2NvbmZkaXJ9L2luaXQuZC9zbnRwIiwiIiwgZCl9IFwKLQkke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInN5c3Zpbml0IiwgIiR7c3lzY29uZmRpcn0vIiwiIiwgZCl9IFwKLSAgICAiCi1TWVNURU1EX1NFUlZJQ0VfJHtQTn0gICAgID0gInNudHAuc2VydmljZSIKLVNZU1RFTURfQVVUT19FTkFCTEVfJHtQTn0gPSAiZW5hYmxlIgotCi1SREVQRU5EU18ke1BOfSA9ICIgbGlibnZyYW0gbGlic29mdGFwIGxpYnNvZnR0aW1lciIKZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWFwcC93aWZpLWRlbW8vd2lmaS1kZW1vLmJiIGIvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3dpZmktZGVtby93aWZpLWRlbW8uYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU1NjUyMTguLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3dpZmktZGVtby93aWZpLWRlbW8uYmIKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1ERVNDUklQVElPTiA9ICJ3aWZpX2RlbW8iCi1ERVBFTkRTICAgICA9ICJsaWJzY3RlbCIKLVNFQ1RJT04gICAgID0gImFwcCIKLUxJQ0VOU0UgICAgID0gInp0ZSIKLVBWID0gIjEuMC4wIgotUFIgPSAicjAiCi0KLUNMQVNTX0NPTSA9ICIgXAotICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCAncHJvY2QnLCAnb3BlbndydCBvcGVud3J0LXNlcnZpY2VzJywgJycsIGQpfSBcCi0gICAgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsICdzeXN0ZW1kJywgJ3N5c3RlbWQnLCAnJywgZCl9IFwKLSIKLWluaGVyaXQgJHtDTEFTU19DT019Ci0KLSPphY3nva5jb2Rl6Lev5b6E5L+h5oGv44CCCi1GSUxFU0VYVFJBUEFUSFNfcHJlcGVuZCA6PSIke0FQUC1PUEVOLVBBVEh9L3Rlc3Q6IgotU1JDX1VSSSA9ICIgXAotICAgIGZpbGU6Ly93aWZpX2RlbW8gXAkJICAKLSAgICAiCi0KLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7Q09NTU9OX0xJQ0VOU0VfRElSfS96dGU7bWQ1PWMwNzU2ODlkMWQxZTA2ZDRhYjViYmU1MzYyM2E2ODA4IgotUyA9ICIke1dPUktESVJ9IgotCi0j5byV55So5YWs55So5aS05paH5Lu25ZKM57yW6K+R6YCJ6aG544CCCi1pbmNsdWRlICR7QlNQRElSfS9zb3VyY2VzL21ldGEtenhpYy9jb25mL2FwcF9jb20uaW5jCi0KLQotZG9fY29tcGlsZSgpIHsKLQltYWtlIC1DIHdpZmlfZGVtbwotfQotCi1kb19pbnN0YWxsICgpIHsKLQlpbnN0YWxsIC1kICR7RH0ke2JpbmRpcn0vCi0JaW5zdGFsbCAtbSAwNzU1ICR7U30vd2lmaV9kZW1vL3dpZmlfZGVtbyAke0R9JHtiaW5kaXJ9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3dpZmlfZGVtby9hcHN0YV9kZW1vICR7RH0ke2JpbmRpcn0vCi0JCi0JI2luc3RhbGwgZWxmcwotCWluc3RhbGwgLWQgJHtFTEZTLVBBVEh9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3dpZmlfZGVtby93aWZpX2RlbW8gJHtFTEZTLVBBVEh9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3dpZmlfZGVtby9hcHN0YV9kZW1vICR7RUxGUy1QQVRIfS8KLX0KLQotZG9fY2xlYW5saWJzICgpIHsKLQlybSAtZnIgJHtFTEZTLVBBVEh9L3dpZmlfZGVtbwotCXJtIC1mciAke0VMRlMtUEFUSH0vYXBzdGFfZGVtbwotfQotCi1hZGR0YXNrICBjbGVhbmxpYnMgYWZ0ZXIgZG9fY2xlYW4gIGJlZm9yZSBkb19jbGVhbnNzdGF0ZQotCi1GSUxFU18ke1BOfSA9ICJcCi0gICAgJHtiaW5kaXJ9LyBcCi0gICAgIgotCi1SREVQRU5EU18ke1BOfSA9ICIgbGlic2N0ZWwiCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1hcHAvenhpYy1kZWJ1Zy96eGljLWRlYnVnLmJiIGIvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3p4aWMtZGVidWcvenhpYy1kZWJ1Zy5iYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdmODdkMS4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1hcHAvenhpYy1kZWJ1Zy96eGljLWRlYnVnLmJiCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotREVTQ1JJUFRJT04gPSAienhpYy1kZWJ1ZyIKLSN6eGljLWRlYnVn5L6d6LWWbGlibnZyYW3lupMKLURFUEVORFMgICAgID0gImxpYm52cmFtIgotU0VDVElPTiAgICAgPSAiYXBwIgotTElDRU5TRSAgICAgPSAienRlIgotUFYgPSAiMS4wLjAiCi1QUiA9ICJyMCIKLQotQ0xBU1NfQ09NID0gIiBcCi0gICAgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsICdwcm9jZCcsICdvcGVud3J0IG9wZW53cnQtc2VydmljZXMnLCAnJywgZCl9IFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3N5c3RlbWQnLCAnc3lzdGVtZCcsICcnLCBkKX0gXAotIgotaW5oZXJpdCAke0NMQVNTX0NPTX0KLQotI+mFjee9rmNvZGXot6/lvoTkv6Hmga/jgIIKLUZJTEVTRVhUUkFQQVRIU19wcmVwZW5kIDo9IiR7QVBQLU9QRU4tUEFUSH0vcGxhdGZvcm06IgotU1JDX1VSSSA9ICIgXAotICAgIGZpbGU6Ly96eGljX2RlYnVnIFwKLQkke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInN5c3Zpbml0IiwgImZpbGU6Ly96eGljX2RlYnVnLnN5c3Zpbml0IiwiIiwgZCl9IFwKLSAgICAiCi0KLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7Q09NTU9OX0xJQ0VOU0VfRElSfS96dGU7bWQ1PWMwNzU2ODlkMWQxZTA2ZDRhYjViYmU1MzYyM2E2ODA4IgotUyA9ICIke1dPUktESVJ9IgotCi0j5byV55So5YWs55So5aS05paH5Lu25ZKM57yW6K+R6YCJ6aG544CCCi1pbmNsdWRlICR7QlNQRElSfS9zb3VyY2VzL21ldGEtenhpYy9jb25mL2FwcF9jb20uaW5jCi1pbmNsdWRlICR7QlNQRElSfS9zb3VyY2VzL21ldGEtenhpYy9jb25mL3B1Yi5pbmMKLUNGTEFHU19hcHBlbmQgPSAiJHtaWElDX0VYVFJBX0NGTEFHU30iCi0KLSPnvJbor5EKLWRvX2NvbXBpbGUoKSB7Ci0JbWFrZSAtQyB6eGljX2RlYnVnCi19Ci0KLSPlupPmlofku7bnmoTlronoo4UKLWRvX2luc3RhbGwoKSB7Ci0JaW5zdGFsbCAtZCAke0R9JHtiaW5kaXJ9LwotCWluc3RhbGwgLW0gMDc1NSAke1N9L3p4aWNfZGVidWcvenhpY19kZWJ1ZyAke0R9JHtiaW5kaXJ9LwotCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3Zpbml0JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJaW5zdGFsbCAtRG0gMDc1NSAke1dPUktESVJ9L3p4aWNfZGVidWcuc3lzdmluaXQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kL3p4aWNfZGVidWcKLQkJaW5zdGFsbCAtZCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZAotCQlsbiAtcyAuLi9pbml0LmQvenhpY19kZWJ1ZyAke0R9JHtzeXNjb25mZGlyfS9yY1MuZC9TOTB6eGljX2RlYnVnCi0JZmkKLQotCSNpbnN0YWxsIGVsZnMKLQlpbnN0YWxsIC1kICR7RUxGUy1QQVRIfS8KLQlpbnN0YWxsIC1tIDA3NTUgJHtTfS96eGljX2RlYnVnL3p4aWNfZGVidWcgJHtFTEZTLVBBVEh9LwkJCi19Ci0j5riF5bqTCi1kb19jbGVhbmxpYnMgKCkgewotCXJtIC1mciAke0VMRlMtUEFUSH0venhpY19kZWJ1ZwotfQotCi1hZGR0YXNrICBjbGVhbmxpYnMgYWZ0ZXIgZG9fY2xlYW4gIGJlZm9yZSBkb19jbGVhbnNzdGF0ZQotCi0jcm9vdGZz5YyF5ZCr55qE5paH5Lu2Ci1GSUxFU18ke1BOfSA9ICJcCi0gICAgJHtiaW5kaXJ9LyBcCi0JJHtAYmIudXRpbHMuY29udGFpbnMoIkRJU1RST19GRUFUVVJFUyIsICJzeXN2aW5pdCIsICIke3N5c2NvbmZkaXJ9LyIsIiIsIGQpfSBcCi0gICAgIgpkaWZmIC0tZ2l0IGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3p4aWMtbWFpbmN0cmwvenhpYy1tYWluY3RybC5iYiBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWFwcC96eGljLW1haW5jdHJsL3p4aWMtbWFpbmN0cmwuYmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiYTU2NzIuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtYXBwL3p4aWMtbWFpbmN0cmwvenhpYy1tYWluY3RybC5iYgorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLURFU0NSSVBUSU9OID0gInp4aWNfbWFpbmN0cmwiCi1ERVBFTkRTICAgICA9ICJsaWJudnJhbSBsaWJzb2Z0dGltZXIgbGliYXR1dGlscyBsaWJzb2Z0YXAgb3BlbnNzbCBsaWJzY2lwYyBsaWJ1cGktYWIiCi1TRUNUSU9OICAgICA9ICJhcHAiCi1MSUNFTlNFICAgICA9ICJ6dGUiCi1QViA9ICIxLjAuMCIKLVBSID0gInIwIgotCi1DTEFTU19DT00gPSAiIFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywgJ3Byb2NkJywgJ29wZW53cnQgb3BlbndydC1zZXJ2aWNlcycsICcnLCBkKX0gXAotICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCAnc3lzdGVtZCcsICdzeXN0ZW1kJywgJycsIGQpfSBcCi0iCi1pbmhlcml0ICR7Q0xBU1NfQ09NfQotCi0j6YWN572uY29kZei3r+W+hOS/oeaBr+OAggotRklMRVNFWFRSQVBBVEhTX3ByZXBlbmQgOj0iJHtBUFAtT1BFTi1QQVRIfS9wbGF0Zm9ybToiCi1TUkNfVVJJID0gIiBcCi0gICAgICAgICAgZmlsZTovL3p4aWNfbWFpbmN0cmwgXAotCQkgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAicHJvY2QiLCAiZmlsZTovL3p4aWNfbWFpbmN0cmwuaW5pdCIsIiIsIGQpfSBcCi0JCSAgJHtAYmIudXRpbHMuY29udGFpbnMoIkRJU1RST19GRUFUVVJFUyIsICJzeXN0ZW1kIiwgImZpbGU6Ly96eGljX21haW5jdHJsLnNlcnZpY2UiLCIiLCBkKX0gXAotCQkgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdmluaXQiLCAiZmlsZTovL3p4aWNfbWFpbmN0cmwuc3lzdmluaXQiLCIiLCBkKX0gXAotICAgICAgICAgICIKLUxJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovLyR7Q09NTU9OX0xJQ0VOU0VfRElSfS96dGU7bWQ1PWMwNzU2ODlkMWQxZTA2ZDRhYjViYmU1MzYyM2E2ODA4IgotUyA9ICIke1dPUktESVJ9IgotU19TUkNfUEFUSCA9ICIke1N9L3p4aWNfbWFpbmN0cmwiCi0j5byV55So5YWs55So5aS05paH5Lu25ZKM57yW6K+R6YCJ6aG544CCCi1pbmNsdWRlICR7QlNQRElSfS9zb3VyY2VzL21ldGEtenhpYy9jb25mL2FwcF9jb20uaW5jCi0KLSNpbmhlcml0IGF1dG90b29scyBwa2djb25maWcgc3lzdGVtZAotCi1kb19jb21waWxlKCkgewotCSNlY2hvICJUT1BESVIgPSAke1RPUERJUn0iCi0JCi0JbWFrZSAtQyAke1NfU1JDX1BBVEh9Ci19Ci0KLWRvX2luc3RhbGwgKCkgewotCWluc3RhbGwgLWQgJHtEfSR7YmluZGlyfS8KLQlpbnN0YWxsIC1tIDA3NTUgJHtTX1NSQ19QQVRIfS96eGljX21haW5jdHJsICR7RH0ke2JpbmRpcn0vCi0JaW5zdGFsbCAtbSAwNzU1ICR7U19TUkNfUEFUSH0vcm91dGVyX21zZ19wcm94eSAke0R9JHtiaW5kaXJ9LwotCQotCWlmICR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCdwcm9jZCcsJ3RydWUnLCdmYWxzZScsZCl9OyB0aGVuCi0JCWluc3RhbGwgLURtIDA3NTUgJHtXT1JLRElSfS96eGljX21haW5jdHJsLmluaXQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kL3p4aWNfbWFpbmN0cmwKLQlmaQotCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3RlbWQnLCd0cnVlJywnZmFsc2UnLGQpfTsgdGhlbgotCQlpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtCi0JCWluc3RhbGwgLW0gMDY0NCAke1dPUktESVJ9L3p4aWNfbWFpbmN0cmwuc2VydmljZSAke0R9JHtzeXN0ZW1kX3VuaXRkaXJ9L3N5c3RlbQotCWZpCi0JCi0JaWYgJHtAYmIudXRpbHMuY29udGFpbnMoJ0RJU1RST19GRUFUVVJFUycsJ3N5c3Zpbml0JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJaW5zdGFsbCAtRG0gMDc1NSAke1dPUktESVJ9L3p4aWNfbWFpbmN0cmwuc3lzdmluaXQgJHtEfSR7c3lzY29uZmRpcn0vaW5pdC5kL3p4aWNfbWFpbmN0cmwKLQkJaW5zdGFsbCAtZCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZAotCQlsbiAtcyAuLi9pbml0LmQvenhpY19tYWluY3RybCAke0R9JHtzeXNjb25mZGlyfS9yY1MuZC9TNDB6eGljX21haW5jdHJsCi0JZmkKLQotCSNpbnN0YWxsIGVsZnMKLQlpbnN0YWxsIC1kICR7RUxGUy1QQVRIfS8KLQlpbnN0YWxsIC1tIDA3NTUgJHtTX1NSQ19QQVRIfS96eGljX21haW5jdHJsICR7RUxGUy1QQVRIfS8KLQlpbnN0YWxsIC1tIDA3NTUgJHtTX1NSQ19QQVRIfS9yb3V0ZXJfbXNnX3Byb3h5ICR7RUxGUy1QQVRIfS8JCi19Ci0KLWRvX2NsZWFubGlicyAoKSB7Ci0Jcm0gLWZyICR7RUxGUy1QQVRIfS96eGljX21haW5jdHJsCi0Jcm0gLWZyICR7RUxGUy1QQVRIfS9yb3V0ZXJfbXNnX3Byb3h5Ci19Ci0KLWFkZHRhc2sgIGNsZWFubGlicyBhZnRlciBkb19jbGVhbiAgYmVmb3JlIGRvX2NsZWFuc3N0YXRlCi0KLUZJTEVTXyR7UE59ID0gIlwKLSAgICAke2JpbmRpcn0vIFwKLSAgICAke0BiYi51dGlscy5jb250YWlucygiRElTVFJPX0ZFQVRVUkVTIiwgInByb2NkIiwgIiR7c3lzY29uZmRpcn0vaW5pdC5kL3p4aWNfbWFpbmN0cmwiLCIiLCBkKX0gXAotICAgICR7QGJiLnV0aWxzLmNvbnRhaW5zKCJESVNUUk9fRkVBVFVSRVMiLCAic3lzdmluaXQiLCAiJHtzeXNjb25mZGlyfS8iLCIiLCBkKX0gXAotICAgICIKLVNZU1RFTURfU0VSVklDRV8ke1BOfSAgICAgPSAienhpY19tYWluY3RybC5zZXJ2aWNlIgotU1lTVEVNRF9BVVRPX0VOQUJMRV8ke1BOfSA9ICJlbmFibGUiCi0KLVJERVBFTkRTXyR7UE59ID0gIiBsaWJudnJhbSBsaWJzb2Z0dGltZXIgbGliYXR1dGlscyBsaWJzb2Z0YXAgb3BlbnNzbCBsaWJzY2lwYyBsaWJ1cGktYWIiCmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1jb3JlL2dsaWJjL2dsaWJjXyUuYmJhcHBlbmQgYi9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1jb3JlL2dsaWJjL2dsaWJjXyUuYmJhcHBlbmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzMTQ2MDIuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMtY29yZS9nbGliYy9nbGliY18lLmJiYXBwZW5kCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotCi1GSUxFU0VYVFJBUEFUSFNfcHJlcGVuZCA6PSAiJHtUSElTRElSfS9maWxlczoiCi0KLVNSQ19VUkkgKz0gIiBcCi0gICAgICAgICAgIGZpbGU6Ly8wMDAxLXdyaXRlLWxvZy10by16Y2F0LXRvb2wucGF0Y2ggXAotIgotCi1kb19pbnN0YWxsX2FwcGVuZCgpIHsKLSAgICBpbnN0YWxsIC1kICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xkLTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYmMtMi4zMS5zbyAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJ0aHJlYWRfZGItMS4wLnNvICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYnB0aHJlYWQtMi4zMS5zbyAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJtLTIuMzEuc28gJHtFTEZTLVBBVEh9LwotICAgIGNwIC1ydiAke0R9JHtiYXNlX2xpYmRpcn0vbGlibnNzX2hlc2lvZC0yLjMxLnNvICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYm5zc19kYi0yLjMxLnNvICAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJuc3NfZmlsZXMtMi4zMS5zbyAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJuc3NfY29tcGF0LTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYnBjcHJvZmlsZS5zbyAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJuc3NfZG5zLTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYnJ0LTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYmRsLTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYm1lbXVzYWdlLnNvICAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJTZWdGYXVsdC5zbyAgJHtFTEZTLVBBVEh9LwotICAgIGNwIC1ydiAke0R9JHtiYXNlX2xpYmRpcn0vbGlicmVzb2x2LTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYnV0aWwtMi4zMS5zbyAgJHtFTEZTLVBBVEh9LwotICAgIGNwIC1ydiAke0R9JHtiYXNlX2xpYmRpcn0vbGliYW5sLTIuMzEuc28gICR7RUxGUy1QQVRIfS8KLSAgICBjcCAtcnYgJHtEfSR7YmFzZV9saWJkaXJ9L2xpYm5zbC0yLjMxLnNvICAke0VMRlMtUEFUSH0vCi0gICAgY3AgLXJ2ICR7RH0ke2Jhc2VfbGliZGlyfS9saWJCcm9rZW5Mb2NhbGUtMi4zMS5zbyAgJHtFTEZTLVBBVEh9LyAgICAKLX0KLQotZG9fY2xlYW5saWJzICgpIHsKLSAgICBybSAtZnIgJHtFTEZTLVBBVEh9L2xpYmMuc28KLX0KLQotYWRkdGFzayAgY2xlYW5saWJzIGFmdGVyIGRvX2NsZWFuICBiZWZvcmUgZG9fY2xlYW5zc3RhdGUKZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWtlcm5lbC9saW51eC9maWxlcy96eDI5NzUyMHYzL2xpbnV4LTVfMTAtdmVoaWNsZV9kY19yZWYtbm9ybWFsLWRlZmNvbmZpZyBiL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWtlcm5lbC9saW51eC9maWxlcy96eDI5NzUyMHYzL2xpbnV4LTVfMTAtdmVoaWNsZV9kY19yZWYtbm9ybWFsLWRlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWYyMjI0NC4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1rZXJuZWwvbGludXgvZmlsZXMvengyOTc1MjB2My9saW51eC01XzEwLXZlaGljbGVfZGNfcmVmLW5vcm1hbC1kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEyICswLDAgQEAKLSMKLSMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZTsgRE8gTk9UIEVESVQuCi0jIExpbnV4L2FybSA1LjEwLjE1NiBLZXJuZWwgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX0NDX1ZFUlNJT05fVEVYVD0iYXJtLXp4aWMtbGludXgtZ251ZWFiaS1nY2MgKEdDQykgOS4zLjAiCi1DT05GSUdfQ0NfSVNfR0NDPXkKLUNPTkZJR19HQ0NfVkVSU0lPTj05MDMwMAotQ09ORklHX0xEX1ZFUlNJT049MjM0MDAwMDAwCi1DT05GSUdfQ0xBTkdfVkVSU0lPTj0wCi1DT05GSUdfTExEX1ZFUlNJT049MAotQ09ORklHX0NDX0NBTl9MSU5LPXkKLUNPTkZJR19DQ19DQU5fTElOS19TVEFUSUM9eQotQ09ORklHX0NDX0hBU19BU01fR09UTz15Ci1DT05GSUdfQ0NfSEFTX0FTTV9JTkxJTkU9eQotQ09ORklHX0lSUV9XT1JLPXkKLUNPTkZJR19CVUlMRFRJTUVfVEFCTEVfU09SVD15Ci0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotIyBDT05GSUdfQ09NUElMRV9URVNUIGlzIG5vdCBzZXQKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfQlVJTERfU0FMVD0iIgotQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQotQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQotQ09ORklHX0hBVkVfS0VSTkVMX1haPXkKLUNPTkZJR19IQVZFX0tFUk5FTF9MWk89eQotQ09ORklHX0hBVkVfS0VSTkVMX0xaND15Ci1DT05GSUdfS0VSTkVMX0daSVA9eQotIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAotIyBDT05GSUdfS0VSTkVMX1haIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldAotIyBDT05GSUdfS0VSTkVMX0xaNCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JTklUPSIiCi1DT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iKG5vbmUpIgotQ09ORklHX1NXQVA9eQotQ09ORklHX1NZU1ZJUEM9eQotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLUNPTkZJR19QT1NJWF9NUVVFVUU9eQotQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQotIyBDT05GSUdfV0FUQ0hfUVVFVUUgaXMgbm90IHNldAotQ09ORklHX0NST1NTX01FTU9SWV9BVFRBQ0g9eQotIyBDT05GSUdfVVNFTElCIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0FSQ0hfQVVESVRTWVNDQUxMPXkKLQotIwotIyBJUlEgc3Vic3lzdGVtCi0jCi1DT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQotQ09ORklHX0dFTkVSSUNfSVJRX1NIT1c9eQotQ09ORklHX0dFTkVSSUNfSVJRX1NIT1dfTEVWRUw9eQotQ09ORklHX0dFTkVSSUNfSVJRX0VGRkVDVElWRV9BRkZfTUFTSz15Ci1DT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKLUNPTkZJR19JUlFfRE9NQUlOPXkKLUNPTkZJR19JUlFfRE9NQUlOX0hJRVJBUkNIWT15Ci1DT05GSUdfR0VORVJJQ19NU0lfSVJRPXkKLUNPTkZJR19HRU5FUklDX01TSV9JUlFfRE9NQUlOPXkKLUNPTkZJR19IQU5ETEVfRE9NQUlOX0lSUT15Ci1DT05GSUdfSVJRX0ZPUkNFRF9USFJFQURJTkc9eQotQ09ORklHX1NQQVJTRV9JUlE9eQotIyBDT05GSUdfR0VORVJJQ19JUlFfREVCVUdGUyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBJUlEgc3Vic3lzdGVtCi0KLUNPTkZJR19HRU5FUklDX0lSUV9NVUxUSV9IQU5ETEVSPXkKLUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKLQotIwotIyBUaW1lcnMgc3Vic3lzdGVtCi0jCi1DT05GSUdfVElDS19PTkVTSE9UPXkKLUNPTkZJR19OT19IWl9DT01NT049eQotIyBDT05GSUdfSFpfUEVSSU9ESUMgaXMgbm90IHNldAotQ09ORklHX05PX0haX0lETEU9eQotQ09ORklHX05PX0haPXkKLUNPTkZJR19ISUdIX1JFU19USU1FUlM9eQotIyBlbmQgb2YgVGltZXJzIHN1YnN5c3RlbQotCi0jIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAotQ09ORklHX1BSRUVNUFQ9eQotQ09ORklHX1BSRUVNUFRfQ09VTlQ9eQotQ09ORklHX1BSRUVNUFRJT049eQotCi0jCi0jIENQVS9UYXNrIHRpbWUgYW5kIHN0YXRzIGFjY291bnRpbmcKLSMKLUNPTkZJR19USUNLX0NQVV9BQ0NPVU5USU5HPXkKLSMgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkdfR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QU0kgaXMgbm90IHNldAotIyBlbmQgb2YgQ1BVL1Rhc2sgdGltZSBhbmQgc3RhdHMgYWNjb3VudGluZwotCi0jCi0jIFJDVSBTdWJzeXN0ZW0KLSMKLUNPTkZJR19UUkVFX1JDVT15Ci1DT05GSUdfUFJFRU1QVF9SQ1U9eQotIyBDT05GSUdfUkNVX0VYUEVSVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1JDVT15Ci1DT05GSUdfVFJFRV9TUkNVPXkKLUNPTkZJR19UQVNLU19SQ1VfR0VORVJJQz15Ci1DT05GSUdfVEFTS1NfUkNVPXkKLUNPTkZJR19SQ1VfU1RBTExfQ09NTU9OPXkKLUNPTkZJR19SQ1VfTkVFRF9TRUdDQkxJU1Q9eQotIyBlbmQgb2YgUkNVIFN1YnN5c3RlbQotCi0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0hFQURFUlMgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTUKLUNPTkZJR19QUklOVEtfU0FGRV9MT0dfQlVGX1NISUZUPTEzCi1DT05GSUdfR0VORVJJQ19TQ0hFRF9DTE9DSz15Ci0KLSMKLSMgU2NoZWR1bGVyIGZlYXR1cmVzCi0jCi0jIGVuZCBvZiBTY2hlZHVsZXIgZmVhdHVyZXMKLQotIyBDT05GSUdfQ0dST1VQUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkFNRVNQQUNFUz15Ci1DT05GSUdfVVRTX05TPXkKLUNPTkZJR19JUENfTlM9eQotQ09ORklHX1VTRVJfTlM9eQotQ09ORklHX1BJRF9OUz15Ci1DT05GSUdfTkVUX05TPXkKLSMgQ09ORklHX0NIRUNLUE9JTlRfUkVTVE9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAgaXMgbm90IHNldAotIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT09UX0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfUEVSRk9STUFOQ0UgaXMgbm90IHNldAotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19MRF9PUlBIQU5fV0FSTj15Ci1DT05GSUdfU1lTQ1RMPXkKLUNPTkZJR19IQVZFX1VJRDE2PXkKLUNPTkZJR19FWFBFUlQ9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19NVUxUSVVTRVI9eQotIyBDT05GSUdfU0dFVE1BU0tfU1lTQ0FMTCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTRlNfU1lTQ0FMTD15Ci0jIENPTkZJR19GSEFORExFIGlzIG5vdCBzZXQKLUNPTkZJR19QT1NJWF9USU1FUlM9eQotQ09ORklHX1BSSU5USz15Ci1DT05GSUdfUFJJTlRLX05NST15Ci1DT05GSUdfQlVHPXkKLUNPTkZJR19FTEZfQ09SRT15Ci0jIENPTkZJR19CQVNFX0ZVTEwgaXMgbm90IHNldAotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19GVVRFWF9QST15Ci1DT05GSUdfSEFWRV9GVVRFWF9DTVBYQ0hHPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0lHTkFMRkQ9eQotQ09ORklHX1RJTUVSRkQ9eQotQ09ORklHX0VWRU5URkQ9eQotIyBDT05GSUdfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0FJTz15Ci1DT05GSUdfSU9fVVJJTkc9eQotQ09ORklHX0FEVklTRV9TWVNDQUxMUz15Ci1DT05GSUdfTUVNQkFSUklFUj15Ci1DT05GSUdfS0FMTFNZTVM9eQotQ09ORklHX0tBTExTWU1TX0FMTD15Ci1DT05GSUdfS0FMTFNZTVNfQkFTRV9SRUxBVElWRT15Ci0jIENPTkZJR19CUEZfU1lTQ0FMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VSRkFVTFRGRCBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9IQVNfTUVNQkFSUklFUl9TWU5DX0NPUkU9eQotIyBDT05GSUdfS0NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfUlNFUT15Ci0jIENPTkZJR19ERUJVR19SU0VRIGlzIG5vdCBzZXQKLUNPTkZJR19FTUJFRERFRD15Ci1DT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15Ci1DT05GSUdfUEVSRl9VU0VfVk1BTExPQz15Ci0jIENPTkZJR19QQzEwNCBpcyBub3Qgc2V0Ci0KLSMKLSMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKLSMKLSMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCi0KLUNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15Ci1DT05GSUdfU0xVQl9ERUJVRz15Ci1DT05GSUdfQ09NUEFUX0JSSz15Ci0jIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19TTFVCPXkKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAotQ09ORklHX1NMQUJfTUVSR0VfREVGQVVMVD15Ci0jIENPTkZJR19TTEFCX0ZSRUVMSVNUX1JBTkRPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTEFCX0ZSRUVMSVNUX0hBUkRFTkVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIVUZGTEVfUEFHRV9BTExPQ0FUT1IgaXMgbm90IHNldAotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEdlbmVyYWwgc2V0dXAKLQotQ09ORklHX0FSTT15Ci1DT05GSUdfQVJNX0hBU19TR19DSEFJTj15Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQotQ09ORklHX0hBVkVfUFJPQ19DUFU9eQotQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15Ci1DT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKLUNPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKLUNPTkZJR19GSVhfRUFSTFlDT05fTUVNPXkKLUNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQotQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19BUkNIX1NVUFBPUlRTX1VQUk9CRVM9eQotIyBDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVCBpcyBub3Qgc2V0Ci1DT05GSUdfUEhZU19PRkZTRVQ9MHgyMkMwMDAwMAotQ09ORklHX0dFTkVSSUNfQlVHPXkKLUNPTkZJR19QR1RBQkxFX0xFVkVMUz0yCi0KLSMKLSMgU3lzdGVtIFR5cGUKLSMKLUNPTkZJR19NTVU9eQotQ09ORklHX0FSQ0hfTU1BUF9STkRfQklUU19NSU49OAotQ09ORklHX0FSQ0hfTU1BUF9STkRfQklUU19NQVg9MTYKLUNPTkZJR19BUkNIX01VTFRJUExBVEZPUk09eQotIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RPVkUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TQTExMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TM0MyNFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUDEgaXMgbm90IHNldAotCi0jCi0jIE11bHRpcGxlIHBsYXRmb3JtIHNlbGVjdGlvbgotIwotCi0jCi0jIENQVSBDb3JlIGZhbWlseSBzZWxlY3Rpb24KLSMKLSMgQ09ORklHX0FSQ0hfTVVMVElfVjYgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfTVVMVElfVjc9eQotQ09ORklHX0FSQ0hfTVVMVElfVjZfVjc9eQotIyBlbmQgb2YgTXVsdGlwbGUgcGxhdGZvcm0gc2VsZWN0aW9uCi0KLUNPTkZJR19BUkNIX1ZJUlQ9eQotIyBDT05GSUdfQVJDSF9BQ1RJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQUxQSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQVJUUEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQVNQRUVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0JDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0JFUkxJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0RJR0lDT0xPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VYWU5PUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0hJR0hCQU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfSElTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0tFWVNUT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTUVESUFURUsgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9NRVNPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX01JTEJFQVVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTVNUQVJWNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX01WRUJVIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTlBDTSBpcyBub3Qgc2V0Ci0KLSMKLSMgVEkgT01BUC9BTS9ETS9EUkEgRmFtaWx5Ci0jCi0jIENPTkZJR19BUkNIX09NQVAzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfT01BUDQgaXMgbm90IHNldAotIyBDT05GSUdfU09DX09NQVA1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPQ19BTTMzWFggaXMgbm90IHNldAotIyBDT05GSUdfU09DX0FNNDNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TT0NfRFJBN1hYIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFRJIE9NQVAvQU0vRE0vRFJBIEZhbWlseQotCi0jIENPTkZJR19BUkNIX1NJUkYgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9RQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUkVBTFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1JFQUxWSUVXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUk9DS0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9TNVBWMjEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfUkVORVNBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NPQ0ZQR0EgaXMgbm90IHNldAotIyBDT05GSUdfUExBVF9TUEVBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NUSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NUTTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfU1VOWEkgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9UQU5HTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1RFR1JBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfVU5JUEhJRVIgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9VODUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1ZFWFBSRVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfV004ODUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfWlggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9aWU5RIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX1pYMjk3NTIwVjM9eQotCi0jCi0jIFpYMjk3NTIwVjMgQm9hcmQgVHlwZQotIwotIyBDT05GSUdfQVJDSF9aWDI5NzUyMFYzX0VWQiBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9aWDI5NzUyMFYzX01ETD15Ci0jIENPTkZJR19BUkNIX1pYMjk3NTIwVjNfTUlGSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1pYMjk3NTIwVjNfVUZJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfWlgyOTc1MjBWM19QSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1pYMjk3NTIwVjNfRldQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfWlgyOTc1MjBWM19XQVRDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1pYMjk3NTIwVjNfQ1BFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfWlgyOTc1MjBWM19DUEVfU1dJVENIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfWlgyOTc1MjBWM19QT0MgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9aWDI5NzUyMFYzX0ZQR0EgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9aWDI5NzUyMFYzX0NBUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5fVkVSU0lPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5fOE1fVkVSU0lPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfVjc9eQotQ09ORklHX0NQVV9USFVNQl9DQVBBQkxFPXkKLUNPTkZJR19DUFVfMzJ2Nks9eQotQ09ORklHX0NQVV8zMnY3PXkKLUNPTkZJR19DUFVfQUJSVF9FVjc9eQotQ09ORklHX0NQVV9QQUJSVF9WNz15Ci1DT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKLUNPTkZJR19DUFVfQ0FDSEVfVklQVD15Ci1DT05GSUdfQ1BVX0NPUFlfVjY9eQotQ09ORklHX0NQVV9UTEJfVjc9eQotQ09ORklHX0NQVV9IQVNfQVNJRD15Ci1DT05GSUdfQ1BVX0NQMTU9eQotQ09ORklHX0NQVV9DUDE1X01NVT15Ci0KLSMKLSMgUHJvY2Vzc29yIEZlYXR1cmVzCi0jCi0jIENPTkZJR19BUk1fTFBBRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJNX1RIVU1CPXkKLSMgQ09ORklHX0FSTV9USFVNQkVFIGlzIG5vdCBzZXQKLUNPTkZJR19BUk1fVklSVF9FWFQ9eQotIyBDT05GSUdfU1dQX0VNVUxBVEUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRSBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1NQRUNUUkU9eQotQ09ORklHX0hBUkRFTl9CUkFOQ0hfUFJFRElDVE9SPXkKLUNPTkZJR19IQVJERU5fQlJBTkNIX0hJU1RPUlk9eQotQ09ORklHX0tVU0VSX0hFTFBFUlM9eQotIyBDT05GSUdfVkRTTyBpcyBub3Qgc2V0Ci1DT05GSUdfTUlHSFRfSEFWRV9DQUNIRV9MMlgwPXkKLSMgQ09ORklHX0NBQ0hFX0wyWDAgaXMgbm90IHNldAotQ09ORklHX0FSTV9MMV9DQUNIRV9TSElGVF82PXkKLUNPTkZJR19BUk1fTDFfQ0FDSEVfU0hJRlQ9NgotQ09ORklHX0FSTV9ETUFfTUVNX0JVRkZFUkFCTEU9eQotQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTj15Ci1DT05GSUdfREVCVUdfQUxJR05fUk9EQVRBPXkKLSMgQ09ORklHX0FSTV9FUlJBVEFfNDMwOTczIGlzIG5vdCBzZXQKLUNPTkZJR19BUk1fRVJSQVRBXzcyMDc4OT15Ci1DT05GSUdfQVJNX0VSUkFUQV83NTQzMjI9eQotIyBDT05GSUdfQVJNX0VSUkFUQV83NzU0MjAgaXMgbm90IHNldAotIyBDT05GSUdfQVJNX0VSUkFUQV83NzMwMjIgaXMgbm90IHNldAotIyBDT05GSUdfQVJNX0VSUkFUQV84MTgzMjVfODUyNDIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODIxNDIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODI1NjE5IGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODU3MjcxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODUyNDIxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODUyNDIzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9FUlJBVEFfODU3MjcyIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFN5c3RlbSBUeXBlCi0KLSMKLSMgQnVzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0FSTV9FUlJBVEFfODE0MjIwIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEJ1cyBzdXBwb3J0Ci0KLSMKLSMgS2VybmVsIEZlYXR1cmVzCi0jCi1DT05GSUdfSEFWRV9TTVA9eQotIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0FSTV9BUkNIX1RJTUVSPXkKLUNPTkZJR19WTVNQTElUXzNHPXkKLSMgQ09ORklHX1ZNU1BMSVRfM0dfT1BUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAotIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAotQ09ORklHX0FSTV9QU0NJPXkKLUNPTkZJR19BUkNIX05SX0dQSU89MAotQ09ORklHX0haX0ZJWEVEPTAKLUNPTkZJR19IWl8xMDA9eQotIyBDT05GSUdfSFpfMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfNTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAotQ09ORklHX0haPTEwMAotQ09ORklHX1NDSEVEX0hSVElDSz15Ci1DT05GSUdfVEhVTUIyX0tFUk5FTD15Ci1DT05GSUdfQVJNX1BBVENIX0lESVY9eQotQ09ORklHX0FFQUJJPXkKLUNPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15Ci1DT05GSUdfSEFWRV9BUkNIX1BGTl9WQUxJRD15Ci0jIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19DUFVfU1dfRE9NQUlOX1BBTj15Ci1DT05GSUdfQVJDSF9XQU5UX0dFTkVSQUxfSFVHRVRMQj15Ci1DT05GSUdfQVJNX01PRFVMRV9QTFRTPXkKLUNPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTExCi1DT05GSUdfQUxJR05NRU5UX1RSQVA9eQotIyBDT05GSUdfVUFDQ0VTU19XSVRIX01FTUNQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJBVklSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJBVklSVF9USU1FX0FDQ09VTlRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfWEVOIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEtlcm5lbCBGZWF0dXJlcwotCi0jCi0jIEJvb3Qgb3B0aW9ucwotIwotQ09ORklHX1VTRV9PRj15Ci1DT05GSUdfQVRBR1M9eQotIyBDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QgaXMgbm90IHNldAotQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MTAwMDAwMDAKLUNPTkZJR19aQk9PVF9ST01fQlNTPTB4MjAwNDAwMDAKLSMgQ09ORklHX0FSTV9BUFBFTkRFRF9EVEIgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkU9IiIKLSMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAotI0NPTkZJR19BVVRPX1pSRUxBRERSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VGSSBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBCb290IG9wdGlvbnMKLQotIwotIyBDUFUgUG93ZXIgTWFuYWdlbWVudAotIwotCi0jCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZwotIwotQ09ORklHX0NQVV9GUkVRPXkKLUNPTkZJR19DUFVfRlJFUV9HT1ZfQVRUUl9TRVQ9eQotQ09ORklHX0NQVV9GUkVRX0dPVl9DT01NT049eQotQ09ORklHX0NQVV9GUkVRX1NUQVQ9eQotIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0UgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFPXkKLUNPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQotIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT15Ci0KLSMKLSMgQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlcnMKLSMKLSMgQ09ORklHX0NQVUZSRVFfRFQgaXMgbm90IHNldAotQ09ORklHX0FSTV9aWF9DUFVGUkVRPXkKLSMgZW5kIG9mIENQVSBGcmVxdWVuY3kgc2NhbGluZwotCi0jCi0jIENQVSBJZGxlCi0jCi1DT05GSUdfQ1BVX0lETEU9eQotIyBDT05GSUdfQ1BVX0lETEVfR09WX0xBRERFUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX0lETEVfR09WX01FTlU9eQotIyBDT05GSUdfQ1BVX0lETEVfR09WX1RFTyBpcyBub3Qgc2V0Ci0KLSMKLSMgQVJNIENQVSBJZGxlIERyaXZlcnMKLSMKLSMgQ09ORklHX0FSTV9DUFVJRExFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSTV9QU0NJX0NQVUlETEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJNX0hJR0hCQU5LX0NQVUlETEUgaXMgbm90IHNldAotIyBlbmQgb2YgQVJNIENQVSBJZGxlIERyaXZlcnMKLSMgZW5kIG9mIENQVSBJZGxlCi0jIGVuZCBvZiBDUFUgUG93ZXIgTWFuYWdlbWVudAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotQ09ORklHX1NVU1BFTkQ9eQotQ09ORklHX1NVU1BFTkRfRlJFRVpFUj15Ci0jIENPTkZJR19TVVNQRU5EX1NLSVBfU1lOQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0Ci1DT05GSUdfUE1fU0xFRVA9eQotQ09ORklHX1BNX0FVVE9TTEVFUD15Ci1DT05GSUdfUE1fV0FLRUxPQ0tTPXkKLUNPTkZJR19QTV9XQUtFTE9DS1NfTElNSVQ9MTAwCi1DT05GSUdfUE1fV0FLRUxPQ0tTX0dDPXkKLUNPTkZJR19QTT15Ci1DT05GSUdfUE1fREVCVUc9eQotQ09ORklHX1BNX0FEVkFOQ0VEX0RFQlVHPXkKLUNPTkZJR19QTV9TTEVFUF9ERUJVRz15Ci0jIENPTkZJR19BUE1fRU1VTEFUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19QTV9DTEs9eQotIyBDT05GSUdfV1FfUE9XRVJfRUZGSUNJRU5UX0RFRkFVTFQgaXMgbm90IHNldAotQ09ORklHX0NQVV9QTT15Ci1DT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKLUNPTkZJR19BUk1fQ1BVX1NVU1BFTkQ9eQotQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQotQ09ORklHX01GRF9aWDIzNDI5MD15Ci0jIGVuZCBvZiBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKLQotIwotIyBGaXJtd2FyZSBEcml2ZXJzCi0jCi0jIENPTkZJR19BUk1fU0NNSV9QUk9UT0NPTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSVJNV0FSRV9NRU1NQVAgaXMgbm90IHNldAotIyBDT05GSUdfRldfQ0ZHX1NZU0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RSVVNURURfRk9VTkRBVElPTlMgaXMgbm90IHNldAotIyBDT05GSUdfR09PR0xFX0ZJUk1XQVJFIGlzIG5vdCBzZXQKLUNPTkZJR19BUk1fUFNDSV9GVz15Ci1DT05GSUdfSEFWRV9BUk1fU01DQ0M9eQotQ09ORklHX0hBVkVfQVJNX1NNQ0NDX0RJU0NPVkVSWT15Ci1DT05GSUdfQVJNX1NNQ0NDX1NPQ19JRD15Ci0KLSMKLSMgVGVncmEgZmlybXdhcmUgZHJpdmVyCi0jCi0jIGVuZCBvZiBUZWdyYSBmaXJtd2FyZSBkcml2ZXIKLSMgZW5kIG9mIEZpcm13YXJlIERyaXZlcnMKLQotQ09ORklHX0FTX1ZGUF9WTVJTX0ZQSU5TVD15Ci0KLSMKLSMgR2VuZXJhbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG9wdGlvbnMKLSMKLUNPTkZJR19TRVRfRlM9eQotQ09ORklHX0hBVkVfT1BST0ZJTEU9eQotIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KVU1QX0xBQkVMIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTPXkKLUNPTkZJR19BUkNIX1VTRV9CVUlMVElOX0JTV0FQPXkKLUNPTkZJR19IQVZFX0tQUk9CRVM9eQotQ09ORklHX0hBVkVfS1JFVFBST0JFUz15Ci1DT05GSUdfSEFWRV9OTUk9eQotQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQotQ09ORklHX0hBVkVfRE1BX0NPTlRJR1VPVVM9eQotQ09ORklHX0dFTkVSSUNfU01QX0lETEVfVEhSRUFEPXkKLUNPTkZJR19HRU5FUklDX0lETEVfUE9MTF9TRVRVUD15Ci1DT05GSUdfQVJDSF9IQVNfRk9SVElGWV9TT1VSQ0U9eQotQ09ORklHX0FSQ0hfSEFTX0tFRVBJTklUUkQ9eQotQ09ORklHX0FSQ0hfSEFTX1NFVF9NRU1PUlk9eQotQ09ORklHX0hBVkVfQVJDSF9USFJFQURfU1RSVUNUX1dISVRFTElTVD15Ci1DT05GSUdfQVJDSF8zMkJJVF9PRkZfVD15Ci1DT05GSUdfSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJPXkKLUNPTkZJR19IQVZFX1JTRVE9eQotQ09ORklHX0hBVkVfUEVSRl9SRUdTPXkKLUNPTkZJR19IQVZFX1BFUkZfVVNFUl9TVEFDS19EVU1QPXkKLUNPTkZJR19IQVZFX0FSQ0hfSlVNUF9MQUJFTD15Ci1DT05GSUdfQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OPXkKLUNPTkZJR19IQVZFX0FSQ0hfU0VDQ09NUD15Ci1DT05GSUdfSEFWRV9BUkNIX1NFQ0NPTVBfRklMVEVSPXkKLSMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAotQ09ORklHX0hBVkVfU1RBQ0tQUk9URUNUT1I9eQotQ09ORklHX1NUQUNLUFJPVEVDVE9SPXkKLUNPTkZJR19TVEFDS1BST1RFQ1RPUl9TVFJPTkc9eQotQ09ORklHX0hBVkVfQ09OVEVYVF9UUkFDS0lORz15Ci1DT05GSUdfSEFWRV9WSVJUX0NQVV9BQ0NPVU5USU5HX0dFTj15Ci1DT05GSUdfSEFWRV9JUlFfVElNRV9BQ0NPVU5USU5HPXkKLUNPTkZJR19IQVZFX01PRF9BUkNIX1NQRUNJRklDPXkKLUNPTkZJR19NT0RVTEVTX1VTRV9FTEZfUkVMPXkKLUNPTkZJR19BUkNIX0hBU19FTEZfUkFORE9NSVpFPXkKLUNPTkZJR19IQVZFX0FSQ0hfTU1BUF9STkRfQklUUz15Ci1DT05GSUdfSEFWRV9FWElUX1RIUkVBRD15Ci1DT05GSUdfQVJDSF9NTUFQX1JORF9CSVRTPTgKLUNPTkZJR19BUkNIX1dBTlRfREVGQVVMVF9UT1BET1dOX01NQVBfTEFZT1VUPXkKLUNPTkZJR19DTE9ORV9CQUNLV0FSRFM9eQotQ09ORklHX09MRF9TSUdTVVNQRU5EMz15Ci1DT05GSUdfT0xEX1NJR0FDVElPTj15Ci1DT05GSUdfQ09NUEFUXzMyQklUX1RJTUU9eQotQ09ORklHX0FSQ0hfT1BUSU9OQUxfS0VSTkVMX1JXWD15Ci1DT05GSUdfQVJDSF9PUFRJT05BTF9LRVJORUxfUldYX0RFRkFVTFQ9eQotQ09ORklHX0FSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYPXkKLUNPTkZJR19TVFJJQ1RfS0VSTkVMX1JXWD15Ci1DT05GSUdfQVJDSF9IQVNfU1RSSUNUX01PRFVMRV9SV1g9eQotQ09ORklHX1NUUklDVF9NT0RVTEVfUldYPXkKLUNPTkZJR19BUkNIX0hBU19QSFlTX1RPX0RNQT15Ci0jIENPTkZJR19MT0NLX0VWRU5UX0NPVU5UUyBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9XQU5UX0xEX09SUEhBTl9XQVJOPXkKLQotIwotIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKLSMKLSMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0hBU19HQ09WX1BST0ZJTEVfQUxMPXkKLSMgZW5kIG9mIEdDT1YtYmFzZWQga2VybmVsIHByb2ZpbGluZwotCi1DT05GSUdfSEFWRV9HQ0NfUExVR0lOUz15Ci1DT05GSUdfR0NDX1BMVUdJTlM9eQotIyBDT05GSUdfR0NDX1BMVUdJTl9DWUNfQ09NUExFWElUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQ0NfUExVR0lOX0xBVEVOVF9FTlRST1BZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dDQ19QTFVHSU5fUkFORFNUUlVDVCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBHZW5lcmFsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgb3B0aW9ucwotCi1DT05GSUdfUlRfTVVURVhFUz15Ci1DT05GSUdfQkFTRV9TTUFMTD0xCi1DT05GSUdfTU9EVUxFUz15Ci0jIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfTU9EVUxFX1VOTE9BRD15Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX1NJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfQ09NUFJFU1MgaXMgbm90IHNldAotIyBDT05GSUdfTU9EVUxFX0FMTE9XX01JU1NJTkdfTkFNRVNQQUNFX0lNUE9SVFMgaXMgbm90IHNldAotQ09ORklHX1VOVVNFRF9TWU1CT0xTPXkKLUNPTkZJR19CTE9DSz15Ci0jIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0JTR0xJQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1pPTkVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19DTURMSU5FX1BBUlNFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfV0JUIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVCVUdfRlM9eQotIyBDT05GSUdfQkxLX1NFRF9PUEFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19JTkxJTkVfRU5DUllQVElPTiBpcyBub3Qgc2V0Ci0KLSMKLSMgUGFydGl0aW9uIFR5cGVzCi0jCi0jIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX01TRE9TX1BBUlRJVElPTj15Ci1DT05GSUdfRUZJX1BBUlRJVElPTj15Ci0jIGVuZCBvZiBQYXJ0aXRpb24gVHlwZXMKLQotQ09ORklHX0JMS19QTT15Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotIyBDT05GSUdfTVFfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUV9JT1NDSEVEX0tZQkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lPU0NIRURfQkZRIGlzIG5vdCBzZXQKLSMgZW5kIG9mIElPIFNjaGVkdWxlcnMKLQotQ09ORklHX1VOSU5MSU5FX1NQSU5fVU5MT0NLPXkKLUNPTkZJR19BUkNIX1NVUFBPUlRTX0FUT01JQ19STVc9eQotQ09ORklHX0FSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFPXkKLUNPTkZJR19GUkVFWkVSPXkKLQotIwotIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX0VMRl9GRFBJQyBpcyBub3Qgc2V0Ci1DT05GSUdfRUxGQ09SRT15Ci1DT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlM9eQotQ09ORklHX0JJTkZNVF9TQ1JJUFQ9eQotQ09ORklHX0FSQ0hfSEFTX0JJTkZNVF9GTEFUPXkKLSMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKLUNPTkZJR19CSU5GTVRfRkxBVF9BUkdWUF9FTlZQX09OX1NUQUNLPXkKLUNPTkZJR19CSU5GTVRfTUlTQz15Ci1DT05GSUdfQ09SRURVTVA9eQotIyBlbmQgb2YgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKLQotIwotIyBNZW1vcnkgTWFuYWdlbWVudCBvcHRpb25zCi0jCi1DT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15Ci1DT05GSUdfRkxBVE1FTV9NQU5VQUw9eQotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotQ09ORklHX0FSQ0hfS0VFUF9NRU1CTE9DSz15Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX0NPTVBBQ1RJT049eQotIyBDT05GSUdfUEFHRV9SRVBPUlRJTkcgaXMgbm90IHNldAotQ09ORklHX01JR1JBVElPTj15Ci0jIENPTkZJR19LU00gaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2Ci1DT05GSUdfTkVFRF9QRVJfQ1BVX0tNPXkKLSMgQ09ORklHX0NMRUFOQ0FDSEUgaXMgbm90IHNldAotIyBDT05GSUdfRlJPTlRTV0FQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19aUE9PTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19aQlVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1pTTUFMTE9DIGlzIG5vdCBzZXQKLUNPTkZJR19HRU5FUklDX0VBUkxZX0lPUkVNQVA9eQotIyBDT05GSUdfSURMRV9QQUdFX1RSQUNLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BFUkNQVV9TVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HVVBfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKLSMgZW5kIG9mIE1lbW9yeSBNYW5hZ2VtZW50IG9wdGlvbnMKLQotQ09ORklHX05FVD15Ci1DT05GSUdfTkVUX0lOR1JFU1M9eQotQ09ORklHX1NLQl9FWFRFTlNJT05TPXkKLQotIwotIyBOZXR3b3JraW5nIG9wdGlvbnMKLSMKLUNPTkZJR19QQUNLRVQ9eQotIyBDT05GSUdfUEFDS0VUX0RJQUcgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1VOSVhfU0NNPXkKLUNPTkZJR19VTklYX0RJQUc9eQotIyBDT05GSUdfVExTIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19YRlJNX0FMR089eQotIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fSU5URVJGQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAotIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNX0lQQ09NUD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKLSMgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQotIyBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9JUEdSRV9ERU1VWCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX0lQX1RVTk5FTD15Ci1DT05GSUdfSVBfTVJPVVRFX0NPTU1PTj15Ci1DT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfTkVUX0lQVlRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GT1UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0ZPVV9JUF9UVU5ORUxTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotQ09ORklHX0lORVRfVFVOTkVMPXkKLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfSU5FVF9VRFBfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1JBV19ESUFHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfRElBR19ERVNUUk9ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19DVUJJQz15Ci1DT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCi0jIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2PXkKLUNPTkZJR19JUFY2X1JPVVRFUl9QUkVGPXkKLUNPTkZJR19JUFY2X1JPVVRFX0lORk89eQotQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQotIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUNl9JUENPTVA9eQotIyBDT05GSUdfSVBWNl9NSVA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjZfSUxBIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUNl9YRlJNX1RVTk5FTD15Ci1DT05GSUdfSU5FVDZfVFVOTkVMPXkKLSMgQ09ORklHX0lQVjZfVlRJIGlzIG5vdCBzZXQKLUNPTkZJR19JUFY2X1NJVD15Ci0jIENPTkZJR19JUFY2X1NJVF82UkQgaXMgbm90IHNldAotQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQotQ09ORklHX0lQVjZfVFVOTkVMPXkKLUNPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUz15Ci1DT05GSUdfSVBWNl9TVUJUUkVFUz15Ci1DT05GSUdfSVBWNl9NUk9VVEU9eQotQ09ORklHX0lQVjZfTVJPVVRFX01VTFRJUExFX1RBQkxFUz15Ci1DT05GSUdfSVBWNl9QSU1TTV9WMj15Ci0jIENPTkZJR19JUFY2X1NFRzZfTFdUVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9TRUc2X0hNQUMgaXMgbm90IHNldAotIyBDT05GSUdfSVBWNl9SUExfTFdUVU5ORUwgaXMgbm90IHNldAotIyBDT05GSUdfTVBUQ1AgaXMgbm90IHNldAotIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElORyBpcyBub3Qgc2V0Ci1DT05GSUdfRkFTVE5BVF9NT0RVTEU9eQotQ09ORklHX05FVEZJTFRFUj15Ci1DT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEPXkKLUNPTkZJR19CUklER0VfTkVURklMVEVSPXkKLQotIwotIyBDb3JlIE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi1DT05GSUdfTkVURklMVEVSX0lOR1JFU1M9eQotQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LPXkKLUNPTkZJR19ORVRGSUxURVJfRkFNSUxZX0JSSURHRT15Ci1DT05GSUdfTkVURklMVEVSX05FVExJTktfQUNDVD15Ci1DT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9eQotIyBDT05GSUdfTkVURklMVEVSX05FVExJTktfTE9HIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfTkVUTElOS19PU0Y9eQotQ09ORklHX05GX0NPTk5UUkFDSz15Ci0jIENPTkZJR19ORl9MT0dfTkVUREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19aT05FUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUz15Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19USU1FT1VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19USU1FU1RBTVAgaXMgbm90IHNldAotIyBDT05GSUdfTkZfQ09OTlRSQUNLX0xBQkVMUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZfQ1RfUFJPVE9fRENDUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fU0NUUD15Ci1DT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURT15Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19GVFAgaXMgbm90IHNldAotIyBDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZfQ09OTlRSQUNLX0lSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfTkVUQklPU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfU05NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfUFBUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfU0FORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9DT05OVFJBQ0tfU0lQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NPTk5UUkFDS19URlRQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GX0NUX05FVExJTksgaXMgbm90IHNldAotQ09ORklHX05GX05BVD15Ci1DT05GSUdfTkZfTkFUX1JFRElSRUNUPXkKLUNPTkZJR19ORl9OQVRfTUFTUVVFUkFERT15Ci0jIENPTkZJR19ORl9UQUJMRVMgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPXkKLSMgQ09ORklHX0lQQ19TT0NLRVQgaXMgbm90IHNldAotIwotIyBYdGFibGVzIGNvbWJpbmVkIG1vZHVsZXMKLSMKLUNPTkZJR19ORVRGSUxURVJfWFRfTUFSSz15Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfQ09OTk1BUksgaXMgbm90IHNldAotCi0jCi0jIFh0YWJsZXMgdGFyZ2V0cwotIwotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ09OTk1BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1AgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ITCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0hNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJTUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSyBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSX1hUX05BVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORVRNQVA9eQotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9ORkxPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9SRURJUkVDVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVNRVUVSQURFPXkKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVEVFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFBST1hZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BPUFRTVFJJUCBpcyBub3Qgc2V0Ci0KLSMKLSMgWHRhYmxlcyBtYXRjaGVzCi0jCi0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0JQRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ0xVU1RFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTEFCRUwgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ1BVIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ERVZHUk9VUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ITCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9JUFJBTkdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MMlRQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEggaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJTUlUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUMgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUksgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTkZBQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PU0YgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QT0xJQ1kgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BIWVNERVYgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1FVT1RBIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVDRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TT0NLRVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFUSVNUSUMgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfVENQTVNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9USU1FIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzIgaXMgbm90IHNldAotIyBlbmQgb2YgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotCi0jIENPTkZJR19JUF9TRVQgaXMgbm90IHNldAotIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX05GX0RFRlJBR19JUFY0PXkKLUNPTkZJR19ORl9TT0NLRVRfSVBWND15Ci1DT05GSUdfTkZfVFBST1hZX0lQVjQ9eQotIyBDT05GSUdfTkZfRFVQX0lQVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZfTE9HX0FSUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORl9MT0dfSVBWNCBpcyBub3Qgc2V0Ci1DT05GSUdfTkZfUkVKRUNUX0lQVjQ9eQotQ09ORklHX0lQX05GX0lQVEFCTEVTPXkKLSMgQ09ORklHX0lQX05GX01BVENIX0FIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BVENIX0VDTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9SUEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9UVEwgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0ZJTFRFUj15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD15Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfU1lOUFJPWFkgaXMgbm90IHNldAotQ09ORklHX0lQX05GX05BVD15Ci1DT05GSUdfSVBfTkZfVEFSR0VUX01BU1FVRVJBREU9eQotQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9eQotQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVD15Ci1DT05GSUdfSVBfTkZfTUFOR0xFPXkKLSMgQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfVEFSR0VUX0VDTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfVFRMIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9SQVc9eQotIyBDT05GSUdfSVBfTkZfQVJQVEFCTEVTIGlzIG5vdCBzZXQKLSMgZW5kIG9mIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotCi0jCi0jIElQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCi0jCi1DT05GSUdfTkZfU09DS0VUX0lQVjY9eQotQ09ORklHX05GX1RQUk9YWV9JUFY2PXkKLSMgQ09ORklHX05GX0RVUF9JUFY2IGlzIG5vdCBzZXQKLUNPTkZJR19ORl9SRUpFQ1RfSVBWNj15Ci0jIENPTkZJR19ORl9MT0dfSVBWNiBpcyBub3Qgc2V0Ci1DT05GSUdfSVA2X05GX0lQVEFCTEVTPXkKLSMgQ09ORklHX0lQNl9ORl9NQVRDSF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX01BVENIX0ZSQUcgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX01BVENIX09QVFMgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX01BVENIX0hMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQNl9ORl9NQVRDSF9NSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUDZfTkZfTUFUQ0hfUlBGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX01BVENIX1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQNl9ORl9NQVRDSF9TUkggaXMgbm90IHNldAotIyBDT05GSUdfSVA2X05GX1RBUkdFVF9ITCBpcyBub3Qgc2V0Ci1DT05GSUdfSVA2X05GX0ZJTFRFUj15Ci1DT05GSUdfSVA2X05GX1RBUkdFVF9SRUpFQ1Q9eQotIyBDT05GSUdfSVA2X05GX1RBUkdFVF9TWU5QUk9YWSBpcyBub3Qgc2V0Ci1DT05GSUdfSVA2X05GX01BTkdMRT15Ci1DT05GSUdfSVA2X05GX1JBVz15Ci1DT05GSUdfSVA2X05GX05BVD15Ci1DT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPXkKLUNPTkZJR19JUDZfTkZfVEFSR0VUX05QVD15Ci0jIGVuZCBvZiBJUHY2OiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotCi1DT05GSUdfTkZfREVGUkFHX0lQVjY9eQotIyBDT05GSUdfTkZfQ09OTlRSQUNLX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0VfTkZfRUJUQUJMRVMgaXMgbm90IHNldAotIyBDT05GSUdfQlBGSUxURVIgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MMlRQIGlzIG5vdCBzZXQKLUNPTkZJR19TVFA9eQotQ09ORklHX0JSSURHRT15Ci1DT05GSUdfQlJJREdFX0lHTVBfU05PT1BJTkc9eQotQ09ORklHX0JSSURHRV9WTEFOX0ZJTFRFUklORz15Ci0jIENPTkZJR19CUklER0VfTVJQIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX05FVF9EU0E9eQotIyBDT05GSUdfTkVUX0RTQSBpcyBub3Qgc2V0Ci1DT05GSUdfVkxBTl84MDIxUT15Ci0jIENPTkZJR19WTEFOXzgwMjFRX0dWUlAgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUV9NVlJQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci1DT05GSUdfTExDPXkKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBUEIgaXMgbm90IHNldAotIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHXzZMT1dQQU4gaXMgbm90IHNldAotIyBDT05GSUdfSUVFRTgwMjE1NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAotIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ROU19SRVNPTFZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVRNQU5fQURWIGlzIG5vdCBzZXQKLSMgQ09ORklHX09QRU5WU1dJVENIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZTT0NLRVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfRElBRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUExTIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9OU0ggaXMgbm90IHNldAotIyBDT05GSUdfSFNSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9TV0lUQ0hERVYgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0wzX01BU1RFUl9ERVYgaXMgbm90IHNldAotIyBDT05GSUdfUVJUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfTkNTSSBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUX1JYX0JVU1lfUE9MTD15Ci1DT05GSUdfQlFMPXkKLSMgQ09ORklHX0JQRl9KSVQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBOZXR3b3JrIHRlc3RpbmcKLSMgZW5kIG9mIE5ldHdvcmtpbmcgb3B0aW9ucwotCi0jIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DQU4gaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotIyBDT05GSUdfQUZfS0NNIGlzIG5vdCBzZXQKLUNPTkZJR19GSUJfUlVMRVM9eQotQ09ORklHX1dJUkVMRVNTPXkKLSMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKLQotIwotIyBDRkc4MDIxMSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciBNQUM4MDIxMQotIwotQ09ORklHX01BQzgwMjExX1NUQV9IQVNIX01BWF9TSVpFPTAKLSMgQ09ORklHX1dJTUFYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfOVAgaXMgbm90IHNldAotIyBDT05GSUdfQ0FJRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DRVBIX0xJQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORkMgaXMgbm90IHNldAotIyBDT05GSUdfUFNBTVBMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSUZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xXVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19EU1RfQ0FDSEU9eQotQ09ORklHX0dST19DRUxMUz15Ci0jIENPTkZJR19GQUlMT1ZFUiBpcyBub3Qgc2V0Ci1DT05GSUdfRVRIVE9PTF9ORVRMSU5LPXkKLUNPTkZJR19IQVZFX0VCUEZfSklUPXkKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotQ09ORklHX0FSTV9BTUJBPXkKLUNPTkZJR19IQVZFX1BDST15Ci0jIENPTkZJR19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKLQotIwotIyBHZW5lcmljIERyaXZlciBPcHRpb25zCi0jCi0jIENPTkZJR19VRVZFTlRfSEVMUEVSIGlzIG5vdCBzZXQKLUNPTkZJR19ERVZUTVBGUz15Ci0jIENPTkZJR19ERVZUTVBGU19NT1VOVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1RBTkRBTE9ORT15Ci1DT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci0KLSMKLSMgRmlybXdhcmUgbG9hZGVyCi0jCi1DT05GSUdfRldfTE9BREVSPXkKLUNPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgotIyBDT05GSUdfRldfTE9BREVSX1VTRVJfSEVMUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZXX0xPQURFUl9DT01QUkVTUyBpcyBub3Qgc2V0Ci1DT05GSUdfRldfQ0FDSEU9eQotIyBlbmQgb2YgRmlybXdhcmUgbG9hZGVyCi0KLUNPTkZJR19BTExPV19ERVZfQ09SRURVTVA9eQotIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19URVNUX0RSSVZFUl9SRU1PVkUgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9BU1lOQ19EUklWRVJfUFJPQkUgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfQ1BVX0FVVE9QUk9CRT15Ci1DT05GSUdfR0VORVJJQ19DUFVfVlVMTkVSQUJJTElUSUVTPXkKLUNPTkZJR19TT0NfQlVTPXkKLUNPTkZJR19SRUdNQVA9eQotQ09ORklHX1JFR01BUF9JMkM9eQotQ09ORklHX1JFR01BUF9NTUlPPXkKLSMgZW5kIG9mIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLQotIwotIyBCdXMgZGV2aWNlcwotIwotIyBDT05GSUdfQlJDTVNUQl9HSVNCX0FSQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSU1QTEVfUE1fQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZFWFBSRVNTX0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSElfQlVTIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEJ1cyBkZXZpY2VzCi0KLSMgQ09ORklHX0dOU1MgaXMgbm90IHNldAotQ09ORklHX01URD15Ci0jIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBwYXJzZXJzCi0jCi0jIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfQ01ETElORV9QQVJUUz15Ci1DT05GSUdfTVREX09GX1BBUlRTPXkKLSMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAotIyBlbmQgb2YgUGFydGl0aW9uIHBhcnNlcnMKLQotIwotIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycwotIwotQ09ORklHX01URF9CTEtERVZTPXkKLUNPTkZJR19NVERfQkxPQ0s9eQotIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GVEwgaXMgbm90IHNldAotIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAotIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTV9GVEwgaXMgbm90IHNldAotIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1NXQVAgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BBUlRJVElPTkVEX01BU1RFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKLSMKLSMgQ09ORklHX01URF9DRkkgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAotQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKLUNPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15Ci1DT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQotQ09ORklHX01URF9DRklfSTE9eQotQ09ORklHX01URF9DRklfSTI9eQotIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAotIyBlbmQgb2YgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKLQotIwotIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0jCi0jIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCi0KLSMKLSMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAotIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19NVERfRE9DRzMgaXMgbm90IHNldAotIyBlbmQgb2YgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCi0KLSMKLSMgTkFORAotIwotQ09ORklHX01URF9OQU5EX0NPUkU9eQotIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAotIyBDT05GSUdfTVREX1JBV19OQU5EIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfU1BJX05BTkQ9eQotCi0jCi0jIEVDQyBlbmdpbmUgc3VwcG9ydAotIwotIyBlbmQgb2YgRUNDIGVuZ2luZSBzdXBwb3J0Ci0jIGVuZCBvZiBOQU5ECi0KLSMKLSMgTFBERFIgJiBMUEREUjIgUENNIG1lbW9yeSBkcml2ZXJzCi0jCi0jIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAotIyBDT05GSUdfTVREX0xQRERSMl9OVk0gaXMgbm90IHNldAotIyBlbmQgb2YgTFBERFIgJiBMUEREUjIgUENNIG1lbW9yeSBkcml2ZXJzCi0KLSMgQ09ORklHX01URF9TUElfTk9SIGlzIG5vdCBzZXQKLUNPTkZJR19NVERfVUJJPXkKLUNPTkZJR19NVERfVUJJX1dMX1RIUkVTSE9MRD00MDk2Ci1DT05GSUdfTVREX1VCSV9CRUJfTElNSVQ9MjAKLSMgQ09ORklHX01URF9VQklfRkFTVE1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVERfVUJJX0dMVUVCSSBpcyBub3Qgc2V0Ci1DT05GSUdfTVREX1VCSV9CTE9DSz15Ci1DT05GSUdfTVREX1VCSV9FWENFUFRJT049eQotIyBDT05GSUdfTVREX0hZUEVSQlVTIGlzIG5vdCBzZXQKLUNPTkZJR19EVEM9eQotQ09ORklHX09GPXkKLSMgQ09ORklHX09GX1VOSVRURVNUIGlzIG5vdCBzZXQKLUNPTkZJR19PRl9GTEFUVFJFRT15Ci1DT05GSUdfT0ZfRUFSTFlfRkxBVFRSRUU9eQotQ09ORklHX09GX0tPQko9eQotQ09ORklHX09GX0FERFJFU1M9eQotQ09ORklHX09GX0lSUT15Ci1DT05GSUdfT0ZfTkVUPXkKLUNPTkZJR19PRl9SRVNFUlZFRF9NRU09eQotIyBDT05GSUdfT0ZfT1ZFUkxBWSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9NSUdIVF9IQVZFX1BDX1BBUlBPUlQ9eQotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVj15Ci0jIENPTkZJR19CTEtfREVWX05VTExfQkxLIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0xPT1A9eQotQ09ORklHX0JMS19ERVZfTE9PUF9NSU5fQ09VTlQ9OAotIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfRFJCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9SQU09eQotQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2Ci1DT05GSUdfQkxLX0RFVl9SQU1fU0laRT0xNjM4NAotIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQkQgaXMgbm90IHNldAotCi0jCi0jIE5WTUUgU3VwcG9ydAotIwotIyBDT05GSUdfTlZNRV9GQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVk1FX1RDUCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBOVk1FIFN1cHBvcnQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLSMgQ09ORklHX0FENTI1WF9EUE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RVTU1ZX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JQ1M5MzJTNDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUERTOTgwMkFMUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0wyOTAwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JU0wyOTAyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19CSDE3NzAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BUERTOTkwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ITUM2MzUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RTMTY4MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUkFNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hJTElOWF9TREZFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QVlBBTklDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRUVQUk9NIHN1cHBvcnQKLSMKLSMgQ09ORklHX0VFUFJPTV9BVDI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPTV9MRUdBQ1kgaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NX01BWDY4NzUgaXMgbm90IHNldAotIyBDT05GSUdfRUVQUk9NXzkzQ1g2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0VFUFJPTV9JRFRfODlIUEVTWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRVBST01fRUUxMDA0IGlzIG5vdCBzZXQKLSMgZW5kIG9mIEVFUFJPTSBzdXBwb3J0Ci0KLSMKLSMgVGV4YXMgSW5zdHJ1bWVudHMgc2hhcmVkIHRyYW5zcG9ydCBsaW5lIGRpc2NpcGxpbmUKLSMKLSMgZW5kIG9mIFRleGFzIEluc3RydW1lbnRzIHNoYXJlZCB0cmFuc3BvcnQgbGluZSBkaXNjaXBsaW5lCi0KLSMgQ09ORklHX0FMVEVSQV9TVEFQTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ0hPIGlzIG5vdCBzZXQKLSMgZW5kIG9mIE1pc2MgZGV2aWNlcwotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19TQ1NJX01PRD15Ci0jIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotIyBlbmQgb2YgU0NTSSBkZXZpY2Ugc3VwcG9ydAotCi0jIENPTkZJR19BVEEgaXMgbm90IHNldAotIyBDT05GSUdfTUQgaXMgbm90IHNldAotIyBDT05GSUdfVEFSR0VUX0NPUkUgaXMgbm90IHNldAotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX05FVF9DT1JFPXkKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfV0lSRUdVQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JRkIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1RFQU0gaXMgbm90IHNldAotIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFZMQU4gaXMgbm90IHNldAotIyBDT05GSUdfVlhMQU4gaXMgbm90IHNldAotIyBDT05GSUdfR0VORVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBUkVVRFAgaXMgbm90IHNldAotIyBDT05GSUdfR1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ1NFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU5fVk5FVF9DUk9TU19MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MTU9OIGlzIG5vdCBzZXQKLQotIwotIyBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIGRyaXZlcnMKLSMKLSMgZW5kIG9mIERpc3RyaWJ1dGVkIFN3aXRjaCBBcmNoaXRlY3R1cmUgZHJpdmVycwotCi1DT05GSUdfRVRIRVJORVQ9eQotIyBDT05GSUdfTkVUX1ZFTkRPUl9BTEFDUklURUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FMVEVSQV9UU0UgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9BTUFaT04gaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9BUVVBTlRJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0FSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0FVUk9SQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0JST0FEQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfQ0FERU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0NBVklVTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0NJUlJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX0NPUlRJTkEgaXMgbm90IHNldAotIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RORVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9FWkNISVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9GQVJBREFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfR09PR0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfSElTSUxJQ09OIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfSFVBV0VJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfSU5URUwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfTUVMTEFOT1ggaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNST0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNST1NFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfTkVUUk9OT01FIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfTkkgaXMgbm90IHNldAotIyBDT05GSUdfRVRIT0MgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9QRU5TQU5ETyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1FVQUxDT01NIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfUkVORVNBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1JPQ0tFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1NBTVNVTkcgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TRUVRIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfU09MQVJGTEFSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1NNU0MgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TT0NJT05FWFQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9TVE1JQ1JPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfU1lOT1BTWVMgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl9YSUxJTlggaXMgbm90IHNldAotQ09ORklHX05FVF9WRU5ET1JfWlRFPXkKLUNPTkZJR19aWDI5X0dNQUM9eQotIyB6dy53YW5nIG1vZGlmeSBmb3IgVDEwNkJVRy00MjMgMjAyNDAxMTggc3RhcnQKLUNPTkZJR19CT09UX1dJVEhPVVRfTE9DSz15Ci0jIHp3LndhbmcgbW9kaWZ5IGZvciBUMTA2QlVHLTQyMyAyMDI0MDExOCAgZW5kCi1DT05GSUdfUEhZTElCPXkKLUNPTkZJR19TV1BIWT15Ci1DT05GSUdfRklYRURfUEhZPXkKLQotIwotIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19BTURfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FESU5fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FRVUFOVElBX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BWDg4Nzk2Ql9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JDTTU0MTQwX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQ003WFhYX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQ004NDg4MV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQkNNODdYWF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT1JUSU5BX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0Ci1DT05GSUdfSUNQTFVTX1BIWT15Ci0jIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOVEVMX1hXQVlfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTSV9FVDEwMTFDX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQVJWRUxMXzEwR19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTUlDUkVMX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSUNST0NISVBfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JQ1JPQ0hJUF9UMV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfTUlDUk9TRU1JX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQVRJT05BTF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFQUxURUtfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFTkVTQVNfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPQ0tDSElQX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVNDX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVEUxMFhQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFUkFORVRJQ1NfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RQODM4MjJfUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RQODNUQzgxMV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfRFA4Mzg0OF9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfRFA4Mzg2N19QSFkgaXMgbm90IHNldAotIyBDT05GSUdfRFA4Mzg2OV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfVklURVNTRV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfWElMSU5YX0dNSUkyUkdNSUkgaXMgbm90IHNldAotIyBDT05GSUdfTUlDUkVMX0tTODk5NU1BIGlzIG5vdCBzZXQKLUNPTkZJR19KTFNFTUlfUEhZPXkKLUNPTkZJR19NRElPX0RFVklDRT15Ci1DT05GSUdfTURJT19CVVM9eQotQ09ORklHX09GX01ESU89eQotQ09ORklHX01ESU9fREVWUkVTPXkKLSMgencud2FuZyBDdXN0b21lciBjaG9vc2VzIHBoeSBjMjIvYzQ1IGlzc3VlcyBvbiAyMDI0MDMwMSBzdGFydAotQ09ORklHX01ESU9fQzQ1PXkKLSMgencud2FuZyBDdXN0b21lciBjaG9vc2VzIHBoeSBjMjIvYzQ1IGlzc3VlcyBvbiAyMDI0MDMwMSBlbmQKLSMgQ09ORklHX01ESU9fQklUQkFORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRElPX0JDTV9VTklNQUMgaXMgbm90IHNldAotIyBDT05GSUdfTURJT19ISVNJX0ZFTUFDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ESU9fTVNDQ19NSUlNIGlzIG5vdCBzZXQKLSMgQ09ORklHX01ESU9fSVBRNDAxOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRElPX0lQUTgwNjQgaXMgbm90IHNldAotCi0jCi0jIE1ESU8gTXVsdGlwbGV4ZXJzCi0jCi0jIENPTkZJR19NRElPX0JVU19NVVhfR1BJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRElPX0JVU19NVVhfTVVMVElQTEVYRVIgaXMgbm90IHNldAotIyBDT05GSUdfTURJT19CVVNfTVVYX01NSU9SRUcgaXMgbm90IHNldAotCi0jCi0jIFBDUyBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfUENTX1hQQ1MgaXMgbm90IHNldAotIyBlbmQgb2YgUENTIGRldmljZSBkcml2ZXJzCi0KLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLQotIwotIyBIb3N0LXNpZGUgVVNCIHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTmV0d29yayBBZGFwdGVyIHN1cHBvcnQKLSMKLUNPTkZJR19XTEFOPXkKLSMgQ09ORklHX1dJUkVMRVNTX1dEUyBpcyBub3Qgc2V0Ci1DT05GSUdfV0xBTl9WRU5ET1JfQURNVEVLPXkKLUNPTkZJR19XTEFOX1ZFTkRPUl9BVEg9eQotIyBDT05GSUdfQVRIX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19XTEFOX1ZFTkRPUl9BVE1FTD15Ci1DT05GSUdfV0xBTl9WRU5ET1JfQlJPQURDT009eQotQ09ORklHX1dMQU5fVkVORE9SX0NJU0NPPXkKLUNPTkZJR19XTEFOX1ZFTkRPUl9JTlRFTD15Ci1DT05GSUdfV0xBTl9WRU5ET1JfSU5URVJTSUw9eQotIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKLUNPTkZJR19XTEFOX1ZFTkRPUl9NQVJWRUxMPXkKLUNPTkZJR19XTEFOX1ZFTkRPUl9NRURJQVRFSz15Ci1DT05GSUdfV0xBTl9WRU5ET1JfTUlDUk9DSElQPXkKLUNPTkZJR19XTEFOX1ZFTkRPUl9SQUxJTks9eQotQ09ORklHX1dMQU5fVkVORE9SX1JFQUxURUs9eQotQ09ORklHX1dMQU5fVkVORE9SX1JTST15Ci1DT05GSUdfV0xBTl9WRU5ET1JfU1Q9eQotQ09ORklHX1dMQU5fVkVORE9SX1RJPXkKLUNPTkZJR19XTEFOX1ZFTkRPUl9aWURBUz15Ci1DT05GSUdfV0xBTl9WRU5ET1JfUVVBTlRFTk5BPXkKLQotIwotIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWU0lNIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9GQUlMT1ZFUiBpcyBub3Qgc2V0Ci1DT05GSUdfWlZfTkVUPXkKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi1DT05GSUdfSU5QVVQ9eQotQ09ORklHX0tFWUJPQVJEX1pYMjk9eQotQ09ORklHX0lOUFVUX0VWREVWPXkKLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBIYXJkd2FyZSBJL08gcG9ydHMKLSMgZW5kIG9mIElucHV0IGRldmljZSBzdXBwb3J0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLUNPTkZJR19UVFk9eQotIyBDT05GSUdfVlQgaXMgbm90IHNldAotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0wCi1DT05GSUdfTERJU0NfQVVUT0xPQUQ9eQotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMX0VBUkxZQ09OPXkKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi0jIENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9FQVJMWUNPTl9BUk1fU0VNSUhPU1QgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1VBUlRMSVRFIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJQUxfQ09SRT15Ci1DT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15Ci0jIENPTkZJR19TRVJJQUxfU0lGSVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9TQ0NOWFAgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1NDMTZJUzdYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQkNNNjNYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfQUxURVJBX0pUQUdVQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9BTFRFUkFfVUFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfWElMSU5YX1BTX1VBUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX0FSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfRlNMX0xQVUFSVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfRlNMX0xJTkZMRVhVQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9DT05FWEFOVF9ESUdJQ09MT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMX1NUX0FTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfU1BSRCBpcyBub3Qgc2V0Ci1DT05GSUdfU0VSSUFMX1pYMjlfVUFSVD15Ci1DT05GSUdfU0VSSUFMX1pYMjlfVUFSVF9DT05TT0xFPXkKLUNPTkZJR19VQVJUX0NPTlNPTEVfSUQ9MQotIyBlbmQgb2YgU2VyaWFsIGRyaXZlcnMKLQotQ09ORklHX1NFUklBTF9OT05TVEFOREFSRD15Ci0jIENPTkZJR19OX0hETEMgaXMgbm90IHNldAotIyBDT05GSUdfTlVMTF9UVFkgaXMgbm90IHNldAotIyBDT05GSUdfVFJBQ0VfU0lOSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVkNfRENDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9ERVZfQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RUWV9QUklOVEsgaXMgbm90IHNldAotIyBDT05GSUdfVklSVElPX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0Ci1DT05GSUdfREVWTUVNPXkKLSMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hJTExZQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBTkRPTV9UUlVTVF9CT09UTE9BREVSIGlzIG5vdCBzZXQKLSMgZW5kIG9mIENoYXJhY3RlciBkZXZpY2VzCi0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLUNPTkZJR19JMkM9eQotQ09ORklHX0kyQ19CT0FSRElORk89eQotQ09ORklHX0kyQ19DT01QQVQ9eQotQ09ORklHX0kyQ19DSEFSREVWPXkKLSMgQ09ORklHX0kyQ19NVVggaXMgbm90IHNldAotQ09ORklHX0kyQ19IRUxQRVJfQVVUTz15Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCi0jCi0jIENPTkZJR19JMkNfQ0JVU19HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERVNJR05XQVJFX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19FTUVWMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfR1BJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfTk9NQURJSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1JLM1ggaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfWElMSU5YIGlzIG5vdCBzZXQKLQotIwotIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCi0jCi0jIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAotCi0jCi0jIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycwotIwotQ09ORklHX0kyQ19aWDI5PXkKLSNDT05GSUdfSTJDX1pYMjlfU0xBVkU9eQotIyBlbmQgb2YgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0KLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TTEFWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEkyQyBzdXBwb3J0Ci0KLSMgQ09ORklHX0kzQyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BJPXkKLSMgQ09ORklHX1NQSV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BJX01BU1RFUj15Ci1DT05GSUdfU1BJX01FTT15Ci0KLSMKLSMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKLSMKLSMgQ09ORklHX1NQSV9BTFRFUkEgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX0FYSV9TUElfRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9DQURFTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9DQURFTkNFX1FVQURTUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX0RFU0lHTldBUkUgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX05YUF9GTEVYU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9GU0xfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9PQ19USU5ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9QTDAyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfUk9DS0NISVAgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX1NDMThJUzYwMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfU0lGSVZFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NWElDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9YQ09NTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfWElMSU5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9aWU5RTVBfR1FTUEkgaXMgbm90IHNldAotIyBDT05GSUdfU1BJX0FNRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIE11bHRpcGxleGVyIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NQSV9NVVggaXMgbm90IHNldAotCi0jCi0jIFNQSSBQcm90b2NvbCBNYXN0ZXJzCi0jCi0jIENPTkZJR19TUElfU1BJREVWIGlzIG5vdCBzZXQKLUNPTkZJR19TUElfU1BJREVWPXkKLSMgQ09ORklHX1NQSV9MT09QQkFDS19URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9UTEU2MlgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9aWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfWlhfU0ZDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9aWF8yOSBpcyBub3Qgc2V0Ci1DT05GSUdfU1BJX1pYMjk9eQotQ09ORklHX1NQSV9aWElDX1NQSUZDPXkKLSMgQ09ORklHX1NQSV9TTEFWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUE1JIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hTSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFMgaXMgbm90IHNldAotCi0jCi0jIFBUUCBjbG9jayBzdXBwb3J0Ci0jCi0KLSMKLSMgRW5hYmxlIFBIWUxJQiBhbmQgTkVUV09SS19QSFlfVElNRVNUQU1QSU5HIHRvIHNlZSB0aGUgYWRkaXRpb25hbCBjbG9ja3MuCi0jCi0jIGVuZCBvZiBQVFAgY2xvY2sgc3VwcG9ydAotCi1DT05GSUdfUElOQ1RSTD15Ci1DT05GSUdfR0VORVJJQ19QSU5DVFJMX0dST1VQUz15Ci1DT05GSUdfUElOTVVYPXkKLUNPTkZJR19HRU5FUklDX1BJTk1VWF9GVU5DVElPTlM9eQotQ09ORklHX1BJTkNPTkY9eQotQ09ORklHX0dFTkVSSUNfUElOQ09ORj15Ci1DT05GSUdfREVCVUdfUElOQ1RSTD15Ci0jIENPTkZJR19QSU5DVFJMX01DUDIzUzA4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJTkNUUkxfU0lOR0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJTkNUUkxfU1gxNTBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BJTkNUUkxfU1RNRlggaXMgbm90IHNldAotIyBDT05GSUdfUElOQ1RSTF9PQ0VMT1QgaXMgbm90IHNldAotCi0jCi0jIFJlbmVzYXMgcGluY3RybCBkcml2ZXJzCi0jCi0jIGVuZCBvZiBSZW5lc2FzIHBpbmN0cmwgZHJpdmVycwotCi1DT05GSUdfUElOQ1RSTF9aWDI5NzUyMFYzPXkKLUNPTkZJR19BUkNIX0hBVkVfQ1VTVE9NX0dQSU9fSD15Ci1DT05GSUdfR1BJT0xJQj15Ci1DT05GSUdfR1BJT0xJQl9GQVNUUEFUSF9MSU1JVD01MTIKLUNPTkZJR19PRl9HUElPPXkKLUNPTkZJR19HUElPTElCX0lSUUNISVA9eQotQ09ORklHX0RFQlVHX0dQSU89eQotQ09ORklHX0dQSU9fU1lTRlM9eQotQ09ORklHX0dQSU9fQ0RFVj15Ci1DT05GSUdfR1BJT19DREVWX1YxPXkKLQotIwotIyBNZW1vcnkgbWFwcGVkIEdQSU8gZHJpdmVycwotIwotIyBDT05GSUdfR1BJT183NFhYX01NSU8gaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19BTFRFUkEgaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19DQURFTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fRFdBUEIgaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19GVEdQSU8wMTAgaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19HRU5FUklDX1BMQVRGT1JNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fR1JHUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fSExXRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX0xPR0lDVkMgaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19NQjg2UzdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fTVBDOFhYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1BMMDYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fU0FNQTVEMl9QSU9CVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1NJRklWRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1NZU0NPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1hJTElOWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1pFVklPIGlzIG5vdCBzZXQKLUNPTkZJR19HUElPX1pYMjk9eQotIyBDT05GSUdfR1BJT19BTURfRkNIIGlzIG5vdCBzZXQKLSMgZW5kIG9mIE1lbW9yeSBtYXBwZWQgR1BJTyBkcml2ZXJzCi0KLSMKLSMgSTJDIEdQSU8gZXhwYW5kZXJzCi0jCi0jIENPTkZJR19HUElPX0FEUDU1ODggaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19BRE5QIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fR1dfUExEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fTUFYNzMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fUENBOTU3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19HUElPX1BDRjg1N1ggaXMgbm90IHNldAotIyBDT05GSUdfR1BJT19UUElDMjgxMCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBJMkMgR1BJTyBleHBhbmRlcnMKLQotIwotIyBNRkQgR1BJTyBleHBhbmRlcnMKLSMKLSMgQ09ORklHX0hUQ19FR1BJTyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBNRkQgR1BJTyBleHBhbmRlcnMKLQotIyBDT05GSUdfR1BJT19BR0dSRUdBVE9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dQSU9fTU9DS1VQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSX1JFU0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKLUNPTkZJR19TU0JfUE9TU0lCTEU9eQotCi1DT05GSUdfV0FUQ0hET0c9eQotQ09ORklHX1dBVENIRE9HX0NPUkU9eQotQ09ORklHX1pYMjlfV0FUQ0hET0c9eQotCi0jIENPTkZJR19TU0IgaXMgbm90IHNldAotQ09ORklHX0JDTUFfUE9TU0lCTEU9eQotIyBDT05GSUdfQkNNQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwotIwotIyBDT05GSUdfTUZEX0FDVDg5NDVBIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9BUzM3MTEgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0FTMzcyMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTUlDX0FEUDU1MjAgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0FBVDI4NzBfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVRNRUxfRkxFWENPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVRNRUxfSExDREMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0JDTTU5MFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9CRDk1NzFNV1YgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0FYUDIwWF9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BREVSQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVNJQzMgaXMgbm90IHNldAotIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0RBOTA1Ml9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0RBOTA1NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfREE5MDYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9EQTkwNjMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0RBOTE1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfR0FURVdPUktTX0dTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfTUMxM1hYWF9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01QMjYyOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfSEk2NDIxX1BNSUMgaXMgbm90IHNldAotIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVENfSTJDUExEIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9JUVM2MlggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0tFTVBMRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfODhQTTgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfODhQTTgwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfODhQTTg2MFggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDE0NTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9NQVg3NzYyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfTUFYNzc2NTAgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDc3Njg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9NQVg3NzY5MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfTUFYNzc4NDMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDg5MDcgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDg5MjUgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDg5OTcgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01BWDg5OTggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX01UNjM2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfTVQ2Mzk3IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9NRU5GMjFCTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1JFVFUgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9QTThYWFggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1JUNTAzMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfUkM1VDU4MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfUks4MDggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1JONVQ2MTggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1NFQ19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TSTQ3NlhfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1NLWTgxNDUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FCWDUwMF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TVE1QRSBpcyBub3Qgc2V0Ci1DT05GSUdfTUZEX1NZU0NPTj15Ci0jIENPTkZJR19NRkRfVElfQU0zMzVYX1RTQ0FEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfTFAzOTQzIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9MUDg3ODggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RJX0xNVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfUEFMTUFTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RQUzYxMDVYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RQUzY1MDdYIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UUFM2NTA4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVFBTNjUwOTAgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RQUzY1MjE3IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9USV9MUDg3M1ggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RJX0xQODc1NjUgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RQUzY1MjE4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UUFM2NTg2WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVFBTNjU5MTAgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RQUzY1OTEyX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVFBTODAwMzEgaXMgbm90IHNldAotIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RXTDYwNDBfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV0wxMjczX0NPUkUgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0xNMzUzMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVEMzNTg5WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVDdMNjZYQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfVEM2Mzg3WEIgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1RDNjM5M1hCIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9UUU1YODYgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX0xPQ0hOQUdBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfQVJJWk9OQV9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV004MzFYX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfV004OTk0IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9ST0hNX0JENzE4WFggaXMgbm90IHNldAotIyBDT05GSUdfTUZEX1JPSE1fQkQ3MDUyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRkRfUk9ITV9CRDcxODI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TVFBNSUMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01GRF9TVE1GWCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCi0KLSMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRURJQV9DRUNfU1VQUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTVhfSVBVVjNfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotCi0jCi0jIEFSTSBkZXZpY2VzCi0jCi0jIGVuZCBvZiBBUk0gZGV2aWNlcwotCi0jCi0jIEZyYW1lIGJ1ZmZlciBEZXZpY2VzCi0jCi0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBGcmFtZSBidWZmZXIgRGV2aWNlcwotCi0jCi0jIEJhY2tsaWdodCAmIExDRCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfTENEX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEJhY2tsaWdodCAmIExDRCBkZXZpY2Ugc3VwcG9ydAotIyBlbmQgb2YgR3JhcGhpY3Mgc3VwcG9ydAotCi1DT05GSUdfU09VTkQ9eQotQ09ORklHX1NORD15Ci1DT05GSUdfU05EX1RJTUVSPXkKLUNPTkZJR19TTkRfUENNPXkKLUNPTkZJR19TTkRfSkFDSz15Ci0jIENPTkZJR19TTkRfT1NTRU1VTCBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1BDTV9USU1FUj15Ci0jIENPTkZJR19TTkRfSFJUSU1FUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAotQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEk9eQotQ09ORklHX1NORF9QUk9DX0ZTPXkKLUNPTkZJR19TTkRfVkVSQk9TRV9QUk9DRlM9eQotIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VRVUVOQ0VSIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfRFJJVkVSUz15Ci0jIENPTkZJR19TTkRfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMT09QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKLQotIwotIyBIRC1BdWRpbwotIwotIyBlbmQgb2YgSEQtQXVkaW8KLQotQ09ORklHX1NORF9IREFfUFJFQUxMT0NfU0laRT02NAotQ09ORklHX1NORF9BUk09eQotIyBDT05GSUdfU05EX0FSTUFBQ0kgaXMgbm90IHNldAotQ09ORklHX1NORF9TUEk9eQotQ09ORklHX1NORF9TT0M9eQotIyBDT05GSUdfU05EX1NPQ19BTURfQUNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVE1FTF9TT0MgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0JDTTYzWFhfSTJTX1dISVNUTEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ERVNJR05XQVJFX0kyUyBpcyBub3Qgc2V0Ci0KLSMKLSMgU29DIEF1ZGlvIGZvciBGcmVlc2NhbGUgQ1BVcwotIwotCi0jCi0jIENvbW1vbiBTb0MgQXVkaW8gb3B0aW9ucyBmb3IgRnJlZXNjYWxlIENQVXM6Ci0jCi0jIENPTkZJR19TTkRfU09DX0ZTTF9BU1JDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfRlNMX1NBSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0ZTTF9BVURNSVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19GU0xfU1NJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfRlNMX1NQRElGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfRlNMX0VTQUkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19GU0xfTUlDRklMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfSU1YX0FVRE1VWCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBTb0MgQXVkaW8gZm9yIEZyZWVzY2FsZSBDUFVzCi0KLSMgQ09ORklHX1NORF9JMlNfSEk2MjEwX0kyUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0lNRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01US19CVENWU0QgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19TT0ZfVE9QTEVWRUwgaXMgbm90IHNldAotCi0jCi0jIFNUTWljcm9lbGVjdHJvbmljcyBTVE0zMiBTT0MgYXVkaW8gc3VwcG9ydAotIwotIyBlbmQgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyIFNPQyBhdWRpbyBzdXBwb3J0Ci0KLSMgQ09ORklHX1NORF9TT0NfWElMSU5YX0kyUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1hJTElOWF9BVURJT19GT1JNQVRURVIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19YSUxJTlhfU1BESUYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19YVEZQR0FfSTJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1pYX1RETSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1NPQ19TQU5FQ0hJUFM9eQotIyBDT05GSUdfU05EX1NPQ19aWDI5X1RJMzEwMCBpcyBub3Qgc2V0Ci0jZG9uZ3l1QG1vZGlmeSBmb3IgY29kZWMgc3RhcnQKLSMgQ09ORklHX1NORF9TT0NfWlgyOV9OQVU4ODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfWlgyOV9USTMxMDQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19aWDI5X0VTODM3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1pYMjlfRVM4MzEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfWlgyOV9BSzQ5NDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19aWDI5X01BWDk4NjcgaXMgbm90IHNldAotQ09ORklHX1NORF9TT0NfWlgyOV9FUzgzMTE9eQotQ09ORklHX1NORF9TT0NfWlhfVk9JQ0U9eQotQ09ORklHX1NORF9TT0NfWlgyOTc1MjBWMz15Ci1DT05GSUdfU05EX1NPQ19aWF9JMlM9eQotQ09ORklHX1NORF9TT0NfWlhfUENNPXkKLSMgQ09ORklHX1NORF9TT0NfWlhfVERNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVExWMzIwQUlDMzFYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX05BVTg4MTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01BWDk4NjcgaXMgbm90IHNldAotQ09ORklHX1NORF9TT0NfRVM4MzExPXkKLSNkb25neXVAbW9kaWZ5IGZvciBjb2RlYyBlbmQKLUNPTkZJR19TTkRfRVhUUkFfQ1RSTD15Ci1DT05GSUdfVVNFX1RPUF9JMlMwPXkKLSMgQ09ORklHX1VTRV9UT1BfSTJTMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0VfVE9QX1RETSBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1NPQ19aWDI5X1BDTV9ETUE9eQotQ09ORklHX1NORF9TT0NfSTJDX0FORF9TUEk9eQotCi0jCi0jIENPREVDIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NORF9TT0NfQUM5N19DT0RFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FEQVUxNzAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQURBVTE3NjFfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQURBVTE3NjFfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQURBVTcwMDIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19BREFVNzExOF9IVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FEQVU3MTE4X0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDEwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDExOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDQ1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDU1NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDYxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNDY0MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNTM4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FLNTU1OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0FMQzU2MjMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19CRDI4NjIzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQlRfU0NPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1MzNUwzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0NTMzVMMzMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzM1TDM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1MzNUwzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0NTMzVMMzYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzQyTDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1M0Mkw1MV9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzQyTDczIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1M0MjM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1M0MjY1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1M0MjcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1M0MjcxX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0NTNDI3MV9TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzQyWFg4X0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0NTNDMxMzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzQzNDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzQzNDkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19DUzUzTDMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfQ1gyMDcyWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0RBNzIxMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0RNSUMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19FUzcxMzQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19FUzcyNDEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19FUzgzMTYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19FUzgzMjhfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfRVM4MzI4X1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0dUTTYwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX0lOTk9fUkszMDM2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTUFYOTgwODggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19NQVg5ODM1N0EgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19NQVg5ODUwNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01BWDk4NjcgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19NQVg5ODkyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01BWDk4MzczX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01BWDk4MzkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTUFYOTg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX01TTTg5MTZfV0NEX0RJR0lUQUwgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ00xNjgxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUENNMTc4OV9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ00xNzlYX0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1BDTTE3OVhfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUENNMTg2WF9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ00xODZYX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1BDTTMwNjBfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUENNMzA2MF9TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ00zMTY4QV9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ00zMTY4QV9TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19QQ001MTJ4X0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1BDTTUxMnhfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUkszMzI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUlQ1NjE2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfUlQ1NjMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU0dUTDUwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19TSU1QTEVfQU1QTElGSUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU0lSRl9BVURJT19DT0RFQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1NQRElGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU1NNMjMwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1NTTTI2MDJfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU1NNMjYwMl9JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19TU000NTY3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU1RBMzJYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU1RBMzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfU1RJX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RBUzI1NTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UQVMyNTYyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVEFTMjc2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RBUzI3NzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UQVM1MDg2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVEFTNTcxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RBUzU3MjAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UQVM2NDI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVERBNzQxOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RGQTk4NzkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMyM19JMkMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMyM19TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UTFYzMjBBSUMzMlg0X0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RMVjMyMEFJQzMyWDRfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVExWMzIwQUlDM1ggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UTFYzMjBBRENYMTQwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVFMzQTIyN0UgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19UU0NTNDJYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1RTQ1M0NTQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19VREExMzM0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NTEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NTIzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NTI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NTgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzExIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzMxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzQxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzUzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzcwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004Nzc2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004NzgyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfV004ODA0X0kyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX1dNODgwNF9TUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5MDMgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5MDQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5NjAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5NzQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5NzggaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19XTTg5ODUgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19aTDM4MDYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfWlhfQVVEOTZQMjIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19NQVg5NzU5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTVQ2MzUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTVQ2MzU4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTVQ2NjYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfTkFVODU0MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU09DX05BVTg4MjIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NPQ19OQVU4ODI0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT0NfVFBBNjEzMEEyIGlzIG5vdCBzZXQKLSMgZW5kIG9mIENPREVDIGRyaXZlcnMKLQotIyBDT05GSUdfU05EX1NJTVBMRV9DQVJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVURJT19HUkFQSF9DQVJEIGlzIG5vdCBzZXQKLUNPTkZJR19NTUM9eQotQ09ORklHX01NQ19EVz15Ci1DT05GSUdfTU1DX0RXX1pYMjk9eQotIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAotIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0Ci1DT05GSUdfRURBQ19BVE9NSUNfU0NSVUI9eQotQ09ORklHX0VEQUNfU1VQUE9SVD15Ci1DT05GSUdfUlRDX0xJQj15Ci1DT05GSUdfUlRDX0NMQVNTPXkKLUNPTkZJR19SVENfSENUT1NZUz15Ci1DT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgotQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKLUNPTkZJR19SVENfSU5URl9QUk9DPXkKLUNPTkZJR19SVENfSU5URl9ERVY9eQotQ09ORklHX1JUQ19aWDIzNDI5MD15Ci1DT05GSUdfRE1BREVWSUNFUz15Ci0jIENPTkZJR19ETUFERVZJQ0VTX0RFQlVHIGlzIG5vdCBzZXQKLQotQ09ORklHX1VTQl9TVVBQT1JUPXkKLUNPTkZJR19VU0JfQ09NTU9OPXkKLSMgQ09ORklHX1VTQl9VTFBJX0JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ09OTl9HUElPIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLSMgQ09ORklHX1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ0ROUzMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01VU0JfSERSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRFdDMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRFdDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQ0hJUElERUEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0lTUDE3NjAgaXMgbm90IHNldAotCi0jCi0jIFVTQiBwb3J0IGRyaXZlcnMKLSMKLQotIwotIyBVU0IgUGh5c2ljYWwgTGF5ZXIgZHJpdmVycwotIwotIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR1BJT19WQlVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JU1AxMzAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VTFBJIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFVTQiBQaHlzaWNhbCBMYXllciBkcml2ZXJzCi0KLUNPTkZJR19VU0JfR0FER0VUPXkKLSMgQ09ORklHX1VTQl9HQURHRVRfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19VU0JfR0FER0VUX1ZCVVNfRFJBVz0yCi1DT05GSUdfVVNCX0dBREdFVF9TVE9SQUdFX05VTV9CVUZGRVJTPTIKLQotIwotIyBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyCi0jCi0jIENPTkZJR19VU0JfRlVTQjMwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRk9URzIxMF9VREMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dSX1VEQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUjhBNjY1OTcgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BYQTI3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTVZfVURDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NVl9VM0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NOUF9VRENfUExBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTTY2NTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9CRENfVURDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ORVQyMjcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HQURHRVRfWElMSU5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NQVgzNDIwX1VEQyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyCi0KLUNPTkZJR19VU0JfRl9BREJfQ0xJRU5UPXkKLSMgQ09ORklHX1VTQl9DT05GSUdGUyBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEdhZGdldCBwcmVjb21wb3NlZCBjb25maWd1cmF0aW9ucwotIwotIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9GVU5DVElPTkZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9NQVNTX1NUT1JBR0UgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HX1BSSU5URVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dfQUNNX01TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9HX0hJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR19EQkdQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SQVdfR0FER0VUIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFVTQiBHYWRnZXQgcHJlY29tcG9zZWQgY29uZmlndXJhdGlvbnMKLQotIwotIyBETUEgRGV2aWNlcwotIwotQ09ORklHX0RNQV9FTkdJTkU9eQotQ09ORklHX0RNQV9PRj15Ci0jIENPTkZJR19BTFRFUkFfTVNHRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FNQkFfUEwwOFggaXMgbm90IHNldAotIyBDT05GSUdfRFdfQVhJX0RNQUMgaXMgbm90IHNldAotIyBDT05GSUdfRlNMX0VETUEgaXMgbm90IHNldAotIyBDT05GSUdfRlNMX1FETUEgaXMgbm90IHNldAotIyBDT05GSUdfSU5URUxfSURNQTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05CUEZBWElfRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BMMzMwX0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YSUxJTlhfWllOUU1QX0RQRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FDT01fSElETUFfTUdNVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19RQ09NX0hJRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RXX0RNQUMgaXMgbm90IHNldAotIyBDT05GSUdfU0ZfUERNQSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLSMgQ09ORklHX0FTWU5DX1RYX0RNQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETUFURVNUIGlzIG5vdCBzZXQKLQotIwotIyBETUFCVUYgb3B0aW9ucwotIwotIyBDT05GSUdfU1lOQ19GSUxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RNQUJVRl9IRUFQUyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBETUFCVUYgb3B0aW9ucwotCi0jIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRklPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJUlRfRFJJVkVSUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSVJUSU9fTUVOVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WRFBBIGlzIG5vdCBzZXQKLUNPTkZJR19WSE9TVF9NRU5VPXkKLSMgQ09ORklHX1ZIT1NUX05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSE9TVF9DUk9TU19FTkRJQU5fTEVHQUNZIGlzIG5vdCBzZXQKLQotIwotIyBNaWNyb3NvZnQgSHlwZXItViBndWVzdCBzdXBwb3J0Ci0jCi0jIGVuZCBvZiBNaWNyb3NvZnQgSHlwZXItViBndWVzdCBzdXBwb3J0Ci0KLSMgQ09ORklHX0dSRVlCVVMgaXMgbm90IHNldAotIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0Ci0jCi0jIFpYMjk3NTIwIHZvaWNlIGJ1ZmZlciBkcml2ZXIKLSMKLSMgQ09ORklHX1ZPSUNFX0JVRkZFUl9EUlYgaXMgbm90IHNldAotIyBDT05GSUdfVkJVRkZfSU5fTVVMVElfQ09SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19HT0xERklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJPTUVfUExBVEZPUk1TIGlzIG5vdCBzZXQKLSMgQ09ORklHX01FTExBTk9YX1BMQVRGT1JNIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0NMSz15Ci1DT05GSUdfQ0xLREVWX0xPT0tVUD15Ci1DT05GSUdfSEFWRV9DTEtfUFJFUEFSRT15Ci1DT05GSUdfQ09NTU9OX0NMSz15Ci0jIENPTkZJR19DT01NT05fQ0xLX01BWDk0ODUgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19TSTUzNDEgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19TSTUzNTEgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19TSTUxNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT01NT05fQ0xLX1NJNTQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTU1PTl9DTEtfU0k1NzAgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19DRENFNzA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPTU1PTl9DTEtfQ0RDRTkyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DT01NT05fQ0xLX0NTMjAwMF9DUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DTEtfUU9SSVEgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19WQzUgaXMgbm90IHNldAotIyBDT05GSUdfQ09NTU9OX0NMS19GSVhFRF9NTUlPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXU1BJTkxPQ0sgaXMgbm90IHNldAotCi0jCi0jIENsb2NrIFNvdXJjZSBkcml2ZXJzCi0jCi1DT05GSUdfVElNRVJfT0Y9eQotQ09ORklHX1RJTUVSX1BST0JFPXkKLUNPTkZJR19BUk1fQVJDSF9USU1FUj15Ci1DT05GSUdfQVJNX0FSQ0hfVElNRVJfRVZUU1RSRUFNPXkKLSMgQ09ORklHX01JQ1JPQ0hJUF9QSVQ2NEIgaXMgbm90IHNldAotIyBlbmQgb2YgQ2xvY2sgU291cmNlIGRyaXZlcnMKLQotIyBDT05GSUdfTUFJTEJPWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKLQotIwotIyBSZW1vdGVwcm9jIGRyaXZlcnMKLSMKLSMgQ09ORklHX1JFTU9URVBST0MgaXMgbm90IHNldAotIyBlbmQgb2YgUmVtb3RlcHJvYyBkcml2ZXJzCi0KLSMKLSMgUnBtc2cgZHJpdmVycwotIwotIyBDT05GSUdfUlBNU0dfVklSVElPIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFJwbXNnIGRyaXZlcnMKLQotIyBDT05GSUdfU09VTkRXSVJFIGlzIG5vdCBzZXQKLQotIwotIyBTT0MgKFN5c3RlbSBPbiBDaGlwKSBzcGVjaWZpYyBEcml2ZXJzCi0jCi0KLSMKLSMgQW1sb2dpYyBTb0MgZHJpdmVycwotIwotIyBlbmQgb2YgQW1sb2dpYyBTb0MgZHJpdmVycwotCi0jCi0jIEFzcGVlZCBTb0MgZHJpdmVycwotIwotIyBlbmQgb2YgQXNwZWVkIFNvQyBkcml2ZXJzCi0KLSMKLSMgQnJvYWRjb20gU29DIGRyaXZlcnMKLSMKLSMgQ09ORklHX1NPQ19CUkNNU1RCIGlzIG5vdCBzZXQKLSMgZW5kIG9mIEJyb2FkY29tIFNvQyBkcml2ZXJzCi0KLSMKLSMgTlhQL0ZyZWVzY2FsZSBRb3JJUSBTb0MgZHJpdmVycwotIwotIyBDT05GSUdfUVVJQ0NfRU5HSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTTF9SQ1BNIGlzIG5vdCBzZXQKLSMgZW5kIG9mIE5YUC9GcmVlc2NhbGUgUW9ySVEgU29DIGRyaXZlcnMKLQotIwotIyBpLk1YIFNvQyBkcml2ZXJzCi0jCi0jIGVuZCBvZiBpLk1YIFNvQyBkcml2ZXJzCi0KLSMKLSMgUXVhbGNvbW0gU29DIGRyaXZlcnMKLSMKLSMgZW5kIG9mIFF1YWxjb21tIFNvQyBkcml2ZXJzCi0KLSMgQ09ORklHX1NPQ19USSBpcyBub3Qgc2V0Ci0KLSMKLSMgWGlsaW54IFNvQyBkcml2ZXJzCi0jCi0jIENPTkZJR19YSUxJTlhfVkNVIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFhpbGlueCBTb0MgZHJpdmVycwotCi1DT05GSUdfU09DX1pURT15Ci1DT05GSUdfWlRFX1JQTVNHPXkKLUNPTkZJR19aWDI5X0lDUD15Ci1DT05GSUdfWlRFX1BDVT15Ci1DT05GSUdfWlhfUkFNX0NPTlNPTEU9eQotQ09ORklHX1pYX1BNX0RFQlVHPXkKLSMgQ09ORklHX1pYX1BNX0RFQlVHX1RJTUUgaXMgbm90IHNldAotQ09ORklHX0FYSV9GUkVRPXkKLSMgZW5kIG9mIFNPQyAoU3lzdGVtIE9uIENoaXApIHNwZWNpZmljIERyaXZlcnMKLQotIyBDT05GSUdfUE1fREVWRlJFUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFRDT04gaXMgbm90IHNldAotIyBDT05GSUdfTUVNT1JZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QV00gaXMgbm90IHNldAotCi0jCi0jIElSUSBjaGlwIHN1cHBvcnQKLSMKLUNPTkZJR19JUlFDSElQPXkKLUNPTkZJR19BUk1fR0lDPXkKLUNPTkZJR19BUk1fR0lDX01BWF9OUj0xCi1DT05GSUdfQVJNX0dJQ19WMz15Ci1DT05GSUdfQVJNX0dJQ19WM19JVFM9eQotIyBDT05GSUdfQUxfRklDIGlzIG5vdCBzZXQKLUNPTkZJR19QQVJUSVRJT05fUEVSQ1BVPXkKLSMgZW5kIG9mIElSUSBjaGlwIHN1cHBvcnQKLQotIyBDT05GSUdfSVBBQ0tfQlVTIGlzIG5vdCBzZXQKLUNPTkZJR19SRVNFVF9DT05UUk9MTEVSPXkKLUNPTkZJR19SRVNFVF9TSU1QTEU9eQotIyBDT05GSUdfUkVTRVRfVElfU1lTQ09OIGlzIG5vdCBzZXQKLUNPTkZJR19SRVNFVF9aWDI5PXkKLQotIwotIyBQSFkgU3Vic3lzdGVtCi0jCi0jIENPTkZJR19HRU5FUklDX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQ01fS09OQV9VU0IyX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSFlfQ0FERU5DRV9UT1JSRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9DQURFTkNFX0RQSFkgaXMgbm90IHNldAotIyBDT05GSUdfUEhZX0NBREVOQ0VfU0lFUlJBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9DQURFTkNFX1NBTFZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9GU0xfSU1YOE1RX1VTQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSFlfTUlYRUxfTUlQSV9EUEhZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9QWEFfMjhOTV9IU0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9QWEFfMjhOTV9VU0IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIWV9PQ0VMT1RfU0VSREVTIGlzIG5vdCBzZXQKLSMgZW5kIG9mIFBIWSBTdWJzeXN0ZW0KLQotIyBDT05GSUdfUE9XRVJDQVAgaXMgbm90IHNldAotIyBDT05GSUdfTUNCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQW5kcm9pZAotIwotQ09ORklHX0FORFJPSUQ9eQotQ09ORklHX0FORFJPSURfQklOREVSX0lQQz15Ci1DT05GSUdfQVNITUVNPXkKLSMgQ09ORklHX0FORFJPSURfQklOREVSX1JQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTkRST0lEX0xPR0dFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTkRST0lEX1JBTV9DT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BFUlNJU1RFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FORFJPSURfVElNRURfT1VUUFVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FORFJPSURfTE9XX01FTU9SWV9LSUxMRVIgaXMgbm90IHNldAotIyBDT05GSUdfQU5EUk9JRF9TV0lUQ0ggaXMgbm90IHNldAotIyBDT05GSUdfQU5EUk9JRF9JTlRGX0FMQVJNX0RFViBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBBbmRyb2lkCi0KLSMgQ09ORklHX0RBWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVk1FTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSFcgdHJhY2luZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19TVE0gaXMgbm90IHNldAotIyBDT05GSUdfSU5URUxfVEggaXMgbm90IHNldAotIyBlbmQgb2YgSFcgdHJhY2luZyBzdXBwb3J0Ci0KLSMgQ09ORklHX0ZQR0EgaXMgbm90IHNldAotIyBDT05GSUdfRlNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFRSBpcyBub3Qgc2V0Ci1DT05GSUdfUE1fT1BQPXkKLSMgQ09ORklHX1NJT1ggaXMgbm90IHNldAotIyBDT05GSUdfU0xJTUJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlRFUkNPTk5FQ1QgaXMgbm90IHNldAotIyBDT05GSUdfQ09VTlRFUiBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBEZXZpY2UgRHJpdmVycwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotQ09ORklHX0RDQUNIRV9XT1JEX0FDQ0VTUz15Ci0jIENPTkZJR19WQUxJREFURV9GU19QQVJTRVIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQ0X0ZTPXkKLSMgQ09ORklHX0VYVDRfVVNFX0ZPUl9FWFQyIGlzIG5vdCBzZXQKLUNPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15Ci1DT05GSUdfRVhUNF9GU19TRUNVUklUWT15Ci1DT05GSUdfRVhUNF9ERUJVRz15Ci1DT05GSUdfSkJEMj15Ci1DT05GSUdfSkJEMl9ERUJVRz15Ci1DT05GSUdfRlNfTUJDQUNIRT15Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0YyRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhQT1JURlNfQkxPQ0tfT1BTIGlzIG5vdCBzZXQKLUNPTkZJR19GSUxFX0xPQ0tJTkc9eQotQ09ORklHX01BTkRBVE9SWV9GSUxFX0xPQ0tJTkc9eQotIyBDT05GSUdfRlNfRU5DUllQVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GU19WRVJJVFkgaXMgbm90IHNldAotQ09ORklHX0ZTTk9USUZZPXkKLUNPTkZJR19ETk9USUZZPXkKLUNPTkZJR19JTk9USUZZX1VTRVI9eQotIyBDT05GSUdfRkFOT1RJRlkgaXMgbm90IHNldAotIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PVkVSTEFZX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBDYWNoZXMKLSMKLSMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAotIyBlbmQgb2YgQ2FjaGVzCi0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotQ09ORklHX0lTTzk2NjBfRlM9eQotIyBDT05GSUdfSk9MSUVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotIyBlbmQgb2YgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotCi0jCi0jIERPUy9GQVQvRVhGQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRVhGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBET1MvRkFUL0VYRkFUL05UIEZpbGVzeXN0ZW1zCi0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKLSMgQ09ORklHX1BST0NfQ0hJTERSRU4gaXMgbm90IHNldAotQ09ORklHX0tFUk5GUz15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAotIyBlbmQgb2YgUHNldWRvIGZpbGVzeXN0ZW1zCi0KLUNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKLSMgQ09ORklHX09SQU5HRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0ZTPXkKLUNPTkZJR19KRkZTMl9GU19ERUJVRz0wCi1DT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQotQ09ORklHX0pGRlMyX0ZTX1dCVUZfVkVSSUZZPXkKLSMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlM9eQotQ09ORklHX0pGRlMyX1pMSUI9eQotQ09ORklHX0pGRlMyX0xaTz15Ci1DT05GSUdfSkZGUzJfUlRJTUU9eQotQ09ORklHX0pGRlMyX1JVQklOPXkKLSMgQ09ORklHX0pGRlMyX0NNT0RFX05PTkUgaXMgbm90IHNldAotQ09ORklHX0pGRlMyX0NNT0RFX1BSSU9SSVRZPXkKLSMgQ09ORklHX0pGRlMyX0NNT0RFX1NJWkUgaXMgbm90IHNldAotIyBDT05GSUdfSkZGUzJfQ01PREVfRkFWT1VSTFpPIGlzIG5vdCBzZXQKLUNPTkZJR19VQklGU19GUz15Ci1DT05GSUdfVUJJRlNfRlNfQURWQU5DRURfQ09NUFI9eQotQ09ORklHX1VCSUZTX0ZTX0xaTz15Ci1DT05GSUdfVUJJRlNfRlNfWkxJQj15Ci1DT05GSUdfVUJJRlNfRlNfWlNURD15Ci0jIENPTkZJR19VQklGU19BVElNRV9TVVBQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VCSUZTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VCSUZTX0ZTX0FVVEhFTlRJQ0FUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci1DT05GSUdfU1FVQVNIRlM9eQotQ09ORklHX1NRVUFTSEZTX0ZJTEVfQ0FDSEU9eQotIyBDT05GSUdfU1FVQVNIRlNfRklMRV9ESVJFQ1QgaXMgbm90IHNldAotQ09ORklHX1NRVUFTSEZTX0RFQ09NUF9TSU5HTEU9eQotIyBDT05GSUdfU1FVQVNIRlNfREVDT01QX01VTFRJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NRVUFTSEZTX0RFQ09NUF9NVUxUSV9QRVJDUFUgaXMgbm90IHNldAotIyBDT05GSUdfU1FVQVNIRlNfWEFUVFIgaXMgbm90IHNldAotQ09ORklHX1NRVUFTSEZTX1pMSUI9eQotQ09ORklHX1NRVUFTSEZTX0xaND15Ci1DT05GSUdfU1FVQVNIRlNfTFpPPXkKLUNPTkZJR19TUVVBU0hGU19YWj15Ci1DT05GSUdfU1FVQVNIRlNfWlNURD15Ci0jIENPTkZJR19TUVVBU0hGU180S19ERVZCTEtfU0laRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUVVBU0hGU19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfU1FVQVNIRlNfRlJBR01FTlRfQ0FDSEVfU0laRT0zCi0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BTVE9SRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUk9GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfTkxTPXkKLUNPTkZJR19OTFNfREVGQVVMVD0iIgotIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX01BQ19ST01BTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfTUFDX0NFTFRJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfTUFDX0NFTlRFVVJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19NQUNfQ1JPQVRJQU4gaXMgbm90IHNldAotIyBDT05GSUdfTkxTX01BQ19DWVJJTExJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfTUFDX0dBRUxJQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfTUFDX0dSRUVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19NQUNfSUNFTEFORCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfTUFDX0lOVUlUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19NQUNfUk9NQU5JQU4gaXMgbm90IHNldAotIyBDT05GSUdfTkxTX01BQ19UVVJLSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSUNPREUgaXMgbm90IHNldAotQ09ORklHX0lPX1dRPXkKLSMgZW5kIG9mIEZpbGUgc3lzdGVtcwotCi0jCi0jIFNlY3VyaXR5IG9wdGlvbnMKLSMKLUNPTkZJR19LRVlTPXkKLSMgQ09ORklHX0tFWVNfUkVRVUVTVF9DQUNIRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QRVJTSVNURU5UX0tFWVJJTkdTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VOQ1JZUFRFRF9LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tFWV9ESF9PUEVSQVRJT05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZX0RNRVNHX1JFU1RSSUNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAotQ09ORklHX0hBVkVfSEFSREVORURfVVNFUkNPUFlfQUxMT0NBVE9SPXkKLSMgQ09ORklHX0hBUkRFTkVEX1VTRVJDT1BZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPUlRJRllfU09VUkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NUQVRJQ19VU0VSTU9ERUhFTFBFUiBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQotQ09ORklHX0xTTT0ibG9ja2Rvd24seWFtYSxsb2FkcGluLHNhZmVzZXRpZCxpbnRlZ3JpdHkiCi0KLSMKLSMgS2VybmVsIGhhcmRlbmluZyBvcHRpb25zCi0jCi0KLSMKLSMgTWVtb3J5IGluaXRpYWxpemF0aW9uCi0jCi1DT05GSUdfSU5JVF9TVEFDS19OT05FPXkKLSMgQ09ORklHX0dDQ19QTFVHSU5fU1RSVUNUTEVBS19VU0VSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dDQ19QTFVHSU5fU1RSVUNUTEVBS19CWVJFRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQ0NfUExVR0lOX1NUUlVDVExFQUtfQllSRUZfQUxMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOSVRfT05fQUxMT0NfREVGQVVMVF9PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTklUX09OX0ZSRUVfREVGQVVMVF9PTiBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBNZW1vcnkgaW5pdGlhbGl6YXRpb24KLSMgZW5kIG9mIEtlcm5lbCBoYXJkZW5pbmcgb3B0aW9ucwotIyBlbmQgb2YgU2VjdXJpdHkgb3B0aW9ucwotCi1DT05GSUdfQ1JZUFRPPXkKLQotIwotIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKLSMKLUNPTkZJR19DUllQVE9fQUxHQVBJPXkKLUNPTkZJR19DUllQVE9fQUxHQVBJMj15Ci1DT05GSUdfQ1JZUFRPX1NLQ0lQSEVSPXkKLUNPTkZJR19DUllQVE9fU0tDSVBIRVIyPXkKLUNPTkZJR19DUllQVE9fSEFTSD15Ci1DT05GSUdfQ1JZUFRPX0hBU0gyPXkKLUNPTkZJR19DUllQVE9fUk5HMj15Ci1DT05GSUdfQ1JZUFRPX0FDT01QMj15Ci0jIENPTkZJR19DUllQVE9fTUFOQUdFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVVNFUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01BTkFHRVJfRElTQUJMRV9URVNUUz15Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBQdWJsaWMta2V5IGNyeXB0b2dyYXBoeQotIwotIyBDT05GSUdfQ1JZUFRPX1JTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VDREggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VDUkRTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU00yIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVVJWRTI1NTE5IGlzIG5vdCBzZXQKLQotIwotIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKLSMKLSMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0hBQ0hBMjBQT0xZMTMwNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQUVHSVMxMjggaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NFUUlWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19FQ0hBSU5JViBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbW9kZXMKLSMKLSMgQ09ORklHX0NSWVBUT19DQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NGQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19PRkIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1BDQkMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fS0VZV1JBUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQURJQU5UVU0gaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0VTU0lWIGlzIG5vdCBzZXQKLQotIwotIyBIYXNoIG1vZGVzCi0jCi0jIENPTkZJR19DUllQVE9fQ01BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fWENCQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnZXN0Ci0jCi1DT05GSUdfQ1JZUFRPX0NSQzMyQz15Ci0jIENPTkZJR19DUllQVE9fQ1JDMzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1hYSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQkxBS0UyQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQkxBS0UyUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ1JDVDEwRElGIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUE9MWTEzMDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fU0hBMT15Ci1DT05GSUdfQ1JZUFRPX1NIQTI1Nj15Ci1DT05GSUdfQ1JZUFRPX1NIQTUxMj15Ci0jIENPTkZJR19DUllQVE9fU0hBMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU00zIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TVFJFRUJPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2lwaGVycwotIwotIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQUVTX1RJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NBTFNBMjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0NIQUNIQTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TTTQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0ggaXMgbm90IHNldAotCi0jCi0jIENvbXByZXNzaW9uCi0jCi1DT05GSUdfQ1JZUFRPX0RFRkxBVEU9eQotQ09ORklHX0NSWVBUT19MWk89eQotIyBDT05GSUdfQ1JZUFRPXzg0MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTFo0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19MWjRIQyBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX1pTVEQ9eQotCi0jCi0jIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgotIwotIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RSQkdfTUVOVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fSklUVEVSRU5UUk9QWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVIgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1JORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVVNFUl9BUElfQUVBRCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX0hBU0hfSU5GTz15Ci1DT05GSUdfQ1JZUFRPX0hXPXkKLSMgQ09ORklHX0NSWVBUT19ERVZfQVRNRUxfRUNDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVZfQVRNRUxfU0hBMjA0QSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVWX1NBRkVYQ0VMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVZfQ0NSRUUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0RFVl9BTUxPR0lDX0dYTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BU1lNTUVUUklDX0tFWV9UWVBFIGlzIG5vdCBzZXQKLQotIwotIyBDZXJ0aWZpY2F0ZXMgZm9yIHNpZ25hdHVyZSBjaGVja2luZwotIwotIyBDT05GSUdfU1lTVEVNX0JMQUNLTElTVF9LRVlSSU5HIGlzIG5vdCBzZXQKLSMgZW5kIG9mIENlcnRpZmljYXRlcyBmb3Igc2lnbmF0dXJlIGNoZWNraW5nCi0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotIyBDT05GSUdfUEFDS0lORyBpcyBub3Qgc2V0Ci1DT05GSUdfQklUUkVWRVJTRT15Ci1DT05GSUdfSEFWRV9BUkNIX0JJVFJFVkVSU0U9eQotQ09ORklHX0dFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVI9eQotQ09ORklHX0dFTkVSSUNfU1RSTkxFTl9VU0VSPXkKLUNPTkZJR19HRU5FUklDX05FVF9VVElMUz15Ci0jIENPTkZJR19DT1JESUMgaXMgbm90IHNldAotIyBDT05GSUdfUFJJTUVfTlVNQkVSUyBpcyBub3Qgc2V0Ci1DT05GSUdfUkFUSU9OQUw9eQotQ09ORklHX0dFTkVSSUNfUENJX0lPTUFQPXkKLUNPTkZJR19BUkNIX1VTRV9DTVBYQ0hHX0xPQ0tSRUY9eQotCi0jCi0jIENyeXB0byBsaWJyYXJ5IHJvdXRpbmVzCi0jCi1DT05GSUdfQ1JZUFRPX0xJQl9CTEFLRTJTX0dFTkVSSUM9eQotIyBDT05GSUdfQ1JZUFRPX0xJQl9DVVJWRTI1NTE5IGlzIG5vdCBzZXQKLUNPTkZJR19DUllQVE9fTElCX1BPTFkxMzA1X1JTSVpFPTkKLSMgQ09ORklHX0NSWVBUT19MSUJfUE9MWTEzMDUgaXMgbm90IHNldAotIyBlbmQgb2YgQ3J5cHRvIGxpYnJhcnkgcm91dGluZXMKLQotQ09ORklHX0NSQ19DQ0lUVD15Ci1DT05GSUdfQ1JDMTY9eQotIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDX0lUVV9UPXkKLUNPTkZJR19DUkMzMj15Ci0jIENPTkZJR19DUkMzMl9TRUxGVEVTVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMzJfU0xJQ0VCWTg9eQotIyBDT05GSUdfQ1JDMzJfU0xJQ0VCWTQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDMzJfU0FSV0FURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkMzMl9CSVQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDNjQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JDNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUkM4IGlzIG5vdCBzZXQKLUNPTkZJR19YWEhBU0g9eQotIyBDT05GSUdfUkFORE9NMzJfU0VMRlRFU1QgaXMgbm90IHNldAotQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfWkxJQl9ERUZMQVRFPXkKLUNPTkZJR19MWk9fQ09NUFJFU1M9eQotQ09ORklHX0xaT19ERUNPTVBSRVNTPXkKLUNPTkZJR19MWjRfREVDT01QUkVTUz15Ci1DT05GSUdfWlNURF9ERUNPTVBSRVNTPXkKLUNPTkZJR19YWl9ERUM9eQotQ09ORklHX1haX0RFQ19YODY9eQotQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKLUNPTkZJR19YWl9ERUNfSUE2ND15Ci1DT05GSUdfWFpfREVDX0FSTT15Ci1DT05GSUdfWFpfREVDX0FSTVRIVU1CPXkKLUNPTkZJR19YWl9ERUNfU1BBUkM9eQotQ09ORklHX1haX0RFQ19CQ0o9eQotIyBDT05GSUdfWFpfREVDX1RFU1QgaXMgbm90IHNldAotQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15Ci1DT05GSUdfREVDT01QUkVTU19CWklQMj15Ci1DT05GSUdfREVDT01QUkVTU19MWk1BPXkKLUNPTkZJR19ERUNPTVBSRVNTX1haPXkKLUNPTkZJR19ERUNPTVBSRVNTX0xaTz15Ci1DT05GSUdfREVDT01QUkVTU19MWjQ9eQotQ09ORklHX0RFQ09NUFJFU1NfWlNURD15Ci1DT05GSUdfR0VORVJJQ19BTExPQ0FUT1I9eQotQ09ORklHX0FTU09DSUFUSVZFX0FSUkFZPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlRfTUFQPXkKLUNPTkZJR19IQVNfRE1BPXkKLUNPTkZJR19ETUFfT1BTPXkKLUNPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEU9eQotQ09ORklHX0RNQV9ERUNMQVJFX0NPSEVSRU5UPXkKLUNPTkZJR19BUkNIX0hBU19TRVRVUF9ETUFfT1BTPXkKLUNPTkZJR19BUkNIX0hBU19URUFSRE9XTl9ETUFfT1BTPXkKLUNPTkZJR19ETUFfTk9OQ09IRVJFTlRfTU1BUD15Ci1DT05GSUdfRE1BX1JFTUFQPXkKLSMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0dMT0I9eQotIyBDT05GSUdfR0xPQl9TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUlFfUE9MTCBpcyBub3Qgc2V0Ci1DT05GSUdfTElCRkRUPXkKLUNPTkZJR19TQklUTUFQPXkKLSMgQ09ORklHX1NUUklOR19TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBMaWJyYXJ5IHJvdXRpbmVzCi0KLSMKLSMgS2VybmVsIGhhY2tpbmcKLSMKLQotIwotIyBwcmludGsgYW5kIGRtZXNnIG9wdGlvbnMKLSMKLUNPTkZJR19QUklOVEtfVElNRT15Ci0jIENPTkZJR19QUklOVEtfQ0FMTEVSIGlzIG5vdCBzZXQKLUNPTkZJR19DT05TT0xFX0xPR0xFVkVMX0RFRkFVTFQ9NwotQ09ORklHX0NPTlNPTEVfTE9HTEVWRUxfUVVJRVQ9NAotQ09ORklHX01FU1NBR0VfTE9HTEVWRUxfREVGQVVMVD00Ci0jIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RZTkFNSUNfREVCVUdfQ09SRSBpcyBub3Qgc2V0Ci1DT05GSUdfU1lNQk9MSUNfRVJSTkFNRT15Ci0jIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKLSMgZW5kIG9mIHByaW50ayBhbmQgZG1lc2cgb3B0aW9ucwotCi0jCi0jIENvbXBpbGUtdGltZSBjaGVja3MgYW5kIGNvbXBpbGVyIG9wdGlvbnMKLSMKLUNPTkZJR19ERUJVR19JTkZPPXkKLSMgQ09ORklHX0RFQlVHX0lORk9fUkVEVUNFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPX0NPTVBSRVNTRUQgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfSU5GT19TUExJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPX0RXQVJGNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19JTkZPX0JURiBpcyBub3Qgc2V0Ci0jIENPTkZJR19HREJfU0NSSVBUUyBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotQ09ORklHX0ZSQU1FX1dBUk49MTAyNAotIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAotIyBDT05GSUdfUkVBREFCTEVfQVNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFQURFUlNfSU5TVEFMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TRUNUSU9OX01JU01BVENIIGlzIG5vdCBzZXQKLUNPTkZJR19TRUNUSU9OX01JU01BVENIX1dBUk5fT05MWT15Ci0jIENPTkZJR19ERUJVR19GT1JDRV9GVU5DVElPTl9BTElHTl8zMkIgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKLSMgZW5kIG9mIENvbXBpbGUtdGltZSBjaGVja3MgYW5kIGNvbXBpbGVyIG9wdGlvbnMKLQotIwotIyBHZW5lcmljIEtlcm5lbCBEZWJ1Z2dpbmcgSW5zdHJ1bWVudHMKLSMKLUNPTkZJR19NQUdJQ19TWVNSUT15Ci1DT05GSUdfTUFHSUNfU1lTUlFfREVGQVVMVF9FTkFCTEU9MHgxCi1DT05GSUdfTUFHSUNfU1lTUlFfU0VSSUFMPXkKLUNPTkZJR19NQUdJQ19TWVNSUV9TRVJJQUxfU0VRVUVOQ0U9IiIKLUNPTkZJR19ERUJVR19GUz15Ci1DT05GSUdfREVCVUdfRlNfQUxMT1dfQUxMPXkKLSMgQ09ORklHX0RFQlVHX0ZTX0RJU0FMTE9XX01PVU5UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0ZTX0FMTE9XX05PTkUgaXMgbm90IHNldAotQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKLSMgQ09ORklHX0tHREIgaXMgbm90IHNldAotIyBDT05GSUdfVUJTQU4gaXMgbm90IHNldAotIyBlbmQgb2YgR2VuZXJpYyBLZXJuZWwgRGVidWdnaW5nIEluc3RydW1lbnRzCi0KLUNPTkZJR19ERUJVR19LRVJORUw9eQotQ09ORklHX0RFQlVHX01JU0M9eQotCi0jCi0jIE1lbW9yeSBEZWJ1Z2dpbmcKLSMKLSMgQ09ORklHX1BBR0VfRVhURU5TSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUdFX09XTkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBR0VfUE9JU09OSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1JPREFUQV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1dYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAotIyBDT05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTFVCX1NUQVRTIGlzIG5vdCBzZXQKLUNPTkZJR19IQVZFX0RFQlVHX0tNRU1MRUFLPXkKLSMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDSEVEX1NUQUNLX0VORF9DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9IQVNfREVCVUdfVklSVFVBTD15Ci0jIENPTkZJR19ERUJVR19WSVJUVUFMIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19NRU1PUllfSU5JVD15Ci1DT05GSUdfQ0NfSEFTX0tBU0FOX0dFTkVSSUM9eQotQ09ORklHX0NDX0hBU19XT1JLSU5HX05PU0FOSVRJWkVfQUREUkVTUz15Ci0jIGVuZCBvZiBNZW1vcnkgRGVidWdnaW5nCi0KLSMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLQotIwotIyBEZWJ1ZyBPb3BzLCBMb2NrdXBzIGFuZCBIYW5ncwotIwotQ09ORklHX1BBTklDX09OX09PUFM9eQotQ09ORklHX1BBTklDX09OX09PUFNfVkFMVUU9MQotQ09ORklHX1BBTklDX1RJTUVPVVQ9MAotIyBDT05GSUdfU09GVExPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dRX1dBVENIRE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfTE9DS1VQIGlzIG5vdCBzZXQKLSMgZW5kIG9mIERlYnVnIE9vcHMsIExvY2t1cHMgYW5kIEhhbmdzCi0KLSMKLSMgU2NoZWR1bGVyIERlYnVnZ2luZwotIwotIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBTY2hlZHVsZXIgRGVidWdnaW5nCi0KLSMgQ09ORklHX0RFQlVHX1RJTUVLRUVQSU5HIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19QUkVFTVBUPXkKLUNPTkZJR19SQU1EVU1QPXkKLSN4Zi5saSBtb2RpZnkgZm9yIGNsb3NlIHJhbWR1bXAgc3RhcnQKLSNDT05GSUdfUkFNRFVNUF9VU0VSPXkKLSNDT05GSUdfUkFNRFVNUF9BQk5PUk1BTF9FWElUX1RBU0s9eQotQ09ORklHX1JBTURVTVBfRU1NQz15Ci1DT05GSUdfUkFNRFVNUF9FTU1DX0JBU0U9MHg0MDAwCi1DT05GSUdfUkFNRFVNUF9FTU1DX1NJWkU9MHg2MzAwMDAwCi0jeGYubGkgbW9kaWZ5IGZvciBjbG9zZSByYW1kdW1wIGVuZAotIwotIyBMb2NrIERlYnVnZ2luZyAoc3BpbmxvY2tzLCBtdXRleGVzLCBldGMuLi4pCi0jCi1DT05GSUdfTE9DS19ERUJVR0dJTkdfU1VQUE9SVD15Ci0jIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfV1dfTVVURVhfU0xPV1BBVEggaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfUldTRU1TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19MT0NLX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XV19NVVRFWF9TRUxGVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ0ZfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKLSMgZW5kIG9mIExvY2sgRGVidWdnaW5nIChzcGlubG9ja3MsIG11dGV4ZXMsIGV0Yy4uLikKLQotQ09ORklHX1NUQUNLVFJBQ0U9eQotIyBDT05GSUdfV0FSTl9BTExfVU5TRUVERURfUkFORE9NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAotCi0jCi0jIERlYnVnIGtlcm5lbCBkYXRhIHN0cnVjdHVyZXMKLSMKLSMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfUExJU1QgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JVR19PTl9EQVRBX0NPUlJVUFRJT04gaXMgbm90IHNldAotIyBlbmQgb2YgRGVidWcga2VybmVsIGRhdGEgc3RydWN0dXJlcwotCi0jIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUkNVIERlYnVnZ2luZwotIwotIyBDT05GSUdfUkNVX1NDQUxFX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQ1VfUkVGX1NDQUxFX1RFU1QgaXMgbm90IHNldAotQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD0yMQotIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JDVV9FUVNfREVCVUcgaXMgbm90IHNldAotIyBlbmQgb2YgUkNVIERlYnVnZ2luZwotCi0jIENPTkZJR19ERUJVR19XUV9GT1JDRV9SUl9DUFUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAotIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0Ci1DT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQotQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQotQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0VfV0lUSF9SRUdTPXkKLUNPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKLUNPTkZJR19IQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFM9eQotQ09ORklHX0hBVkVfQ19SRUNPUkRNQ09VTlQ9eQotQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15Ci0jIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0Ci1DT05GSUdfQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQ9eQotIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0Ci0KLSMKLSMgYXJtIERlYnVnZ2luZwotIwotIyBDT05GSUdfQVJNX1BURFVNUF9ERUJVR0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19VTldJTkRFUl9BUk09eQotQ09ORklHX0FSTV9VTldJTkQ9eQotQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0xMX0lOQ0xVREU9Im1hY2gvZGVidWctbWFjcm8uUyIKLUNPTkZJR19VTkNPTVBSRVNTX0lOQ0xVREU9ImRlYnVnL3VuY29tcHJlc3MuaCIKLSMgQ09ORklHX1BJRF9JTl9DT05URVhUSURSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPUkVTSUdIVCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBhcm0gRGVidWdnaW5nCi0KLSMKLSMgS2VybmVsIFRlc3RpbmcgYW5kIENvdmVyYWdlCi0jCi0jIENPTkZJR19LVU5JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OT1RJRklFUl9FUlJPUl9JTkpFQ1RJT04gaXMgbm90IHNldAotIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKLUNPTkZJR19BUkNIX0hBU19LQ09WPXkKLUNPTkZJR19DQ19IQVNfU0FOQ09WX1RSQUNFX1BDPXkKLSMgQ09ORklHX0tDT1YgaXMgbm90IHNldAotQ09ORklHX1JVTlRJTUVfVEVTVElOR19NRU5VPXkKLSMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfTElTVF9TT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfTUlOX0hFQVAgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9TT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfUkJUUkVFX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfUkVFRF9TT0xPTU9OX1RFU1QgaXMgbm90IHNldAotIyBDT05GSUdfSU5URVJWQUxfVFJFRV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BFUkNQVV9URVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUT01JQzY0X1NFTEZURVNUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfSEVYRFVNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfU1RSU0NQWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX0tTVFJUT1ggaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9QUklOVEYgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9CSVRNQVAgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9VVUlEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfWEFSUkFZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfT1ZFUkZMT1cgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9SSEFTSFRBQkxFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfSEFTSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX0lEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX0xLTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX0JJVE9QUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX1ZNQUxMT0MgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9VU0VSX0NPUFkgaXMgbm90IHNldAotIyBDT05GSUdfRklORF9CSVRfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfRklSTVdBUkUgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9TWVNDVEwgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9VREVMQVkgaXMgbm90IHNldAotIyBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX01FTUNBVF9QIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfU1RBQ0tJTklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RFU1RfTUVNSU5JVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19URVNUX0ZSRUVfUEFHRVMgaXMgbm90IHNldAotIyBDT05GSUdfTUVNVEVTVCBpcyBub3Qgc2V0Ci0jIGVuZCBvZiBLZXJuZWwgVGVzdGluZyBhbmQgQ292ZXJhZ2UKLSMgZW5kIG9mIEtlcm5lbCBoYWNraW5nCi1DT05GSUdfRkxBR1NfVVRJTFM9eQotIyBDT05GSUdfVEVTVF9GTEFHU19VVElMUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1rZXJuZWwvbGludXgvbGludXgtenhpY181LjEwLmJiIGIvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMta2VybmVsL2xpbnV4L2xpbnV4LXp4aWNfNS4xMC5iYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYThjN2Y2NS4uMDAwMDAwMAotLS0gYS9lc2RrL2xheWVycy9tZXRhLXp4aWMvcmVjaXBlcy1rZXJuZWwvbGludXgvbGludXgtenhpY181LjEwLmJiCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotU1VNTUFSWSA9ICJ6eGljIExpbnV4IGtlcm5lbCIKLVNFQ1RJT04gPSAia2VybmVsIgotUFYgICAgICA9ICIke0xJTlVYX1ZFUlNJT059IgotTElDRU5TRSA9ICJHUEx2MiIKLUxJQ19GSUxFU19DSEtTVU0gPz0gImZpbGU6Ly9DT1BZSU5HO21kNT02YmM1MzhlZDViZDlhN2ZjOTM5ODA4NmFlZGNkN2U0NiIKLUxJTlVYX1ZFUlNJT04gICAgPz0gIjUuMTAuMTU2IgotQlNQRElSID0gIiR7VE9QRElSfS8uLi91cHN0cmVhbSIKLSNwdWIgaW5jbHVkZQotaW5jbHVkZSAke1RPUERJUn0vbGF5ZXJzL21ldGEtenhpYy9jb25mL3B1Yl9lc2RrLmluYwotCi1ERVBFTkRTICs9ICJrZXJuLXRvb2xzLW5hdGl2ZSIKLURFUEVORFMgKz0gIiR7QGJiLnV0aWxzLmNvbnRhaW5zKCdESVNUUk9fRkVBVFVSRVMnLCdkbS12ZXJpdHknLCd6c3RkLW5hdGl2ZScsJycsZCl9IgotaW5oZXJpdCBrZXJuZWwgIHNpdGVpbmZvICAKLQotRVhUUkFfT0VNQUtFX2FwcGVuZCA9ICIgTE9BREFERFI9JHtLRVJORUxfTE9BREFERFJ9IEVYVFJBX0NGTEFHUz0nJHtaWElDX0VYVFJBX0NGTEFHU30nICIKLUZJTEVTRVhUUkFQQVRIU19wcmVwZW5kIDo9IiR7VE9QRElSfS8uLi91cHN0cmVhbToiCi0jIFBSX0NPTkZJR19jcGUgPSAibGludXgtNV8xMC1jcGUtJHtCT09UX0NUTH0tZGVmY29uZmlnIgotIyBQUl9DT05GSUdfdjJ4ID0gImxpbnV4LTVfMTAtdjJ4LSR7Qk9PVF9DVEx9LWRlZmNvbmZpZyIKLVBSX0NPTkZJR192ZWhpY2xlX2RjID0gImxpbnV4LTVfMTAtdmVoaWNsZV9kYy0ke0JPT1RfQ1RMfS1kZWZjb25maWciCi1QUl9DT05GSUdfdmVoaWNsZV9kY180R2IgPSAibGludXgtNV8xMC12ZWhpY2xlX2RjXzRHYi0ke0JPT1RfQ1RMfS1kZWZjb25maWciCi1TID0gIiR7V09SS0RJUn0vbGludXgtNS4xMCIKLQotZG9faW5zdGFsbFtub3N0YW1wXSA9ICIxIgotCi1TUkNfVVJJID0gIlwKLSAgICBmaWxlOi8vbGludXgtNS4xMCAgICBcCi0gICAgZmlsZTovLyR7TUFDSElORX0vJHtMSU5VWF9CQVNFX0NPTkZJR30gXAotICAgICIKLQotIyByZXR1cm5zIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgc3JjIHVyaSB0aGF0IGFyZSAuY2ZnIGZpbGVzCi1kZWYgZmluZF9jZmdzKGQpOgotICAgIHNvdXJjZXM9c3JjX3BhdGNoZXMoZCwgVHJ1ZSkKLSAgICBzb3VyY2VzX2xpc3Q9W10KLSAgICBmb3IgcyBpbiBzb3VyY2VzOgotICAgICAgICBpZiBzLmVuZHN3aXRoKCcuY2ZnJyk6Ci0gICAgICAgICAgICBzb3VyY2VzX2xpc3QuYXBwZW5kKHMpCi0KLSAgICByZXR1cm4gc291cmNlc19saXN0Ci0KLWtlcm5lbF9kb19jb25maWd1cmUoKSB7Ci0JIyBmaXhlcyBleHRyYSArIGluIC9saWIvbW9kdWxlcy8yLjYuMzcrCi0JIyAkIHNjcmlwdHMvc2V0bG9jYWx2ZXJzaW9uIC4gPT4gKwotCSMgJCBtYWtlIGtlcm5lbHZlcnNpb24gPT4gMi42LjM3Ci0JIyAkIG1ha2Uga2VybmVscmVsZWFzZSA9PiAyLjYuMzcrCi0JdG91Y2ggJHtCfS8uc2NtdmVyc2lvbiAke1N9Ly5zY212ZXJzaW9uCi0JCi0JY3AgJHtXT1JLRElSfS8ke01BQ0hJTkV9LyR7TElOVVhfQkFTRV9DT05GSUd9ICAke1dPUktESVJ9L2RlZmNvbmZpZyAKLQlpZiBbICIke1N9IiAhPSAiJHtCfSIgXSAmJiBbIC1mICIke1N9Ly5jb25maWciIF0gJiYgWyAhIC1mICIke0J9Ly5jb25maWciIF07IHRoZW4KLQkJbXYgIiR7U30vLmNvbmZpZyIgIiR7Qn0vLmNvbmZpZyIKLQlmaQotCi0JIyBDb3B5IGRlZmNvbmZpZyB0byAuY29uZmlnIGlmIC5jb25maWcgZG9lcyBub3QgZXhpc3QuIFRoaXMgYWxsb3dzCi0JIyByZWNpcGVzIHRvIG1hbmFnZSB0aGUgLmNvbmZpZyB0aGVtc2VsdmVzIGluIGRvX2NvbmZpZ3VyZV9wcmVwZW5kKCkuCi0JaWYgWyAtZiAiJHtXT1JLRElSfS9kZWZjb25maWciIF0gJiYgWyAhIC1mICIke0J9Ly5jb25maWciIF07IHRoZW4KLQkJY3AgIiR7V09SS0RJUn0vZGVmY29uZmlnIiAiJHtCfS8uY29uZmlnIgotCWZpCi0JCi0JbWVyZ2VfY29uZmlnLnNoIC1tICAke1dPUktESVJ9L2RlZmNvbmZpZyAke0AiICIuam9pbihmaW5kX2NmZ3MoZCkpfQotCSR7S0VSTkVMX0NPTkZJR19DT01NQU5EfQotfQotCi1mYWtlcm9vdCBkb19jcGlvICgpIHsKLQlpZiAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywnZG0tdmVyaXR5JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLQkJY3AgIC12ICAke0JTUERJUn0vLi4vZXNkay9zb3VyY2VzL21ldGEtenhpYy1jdXN0b20vY29uZi9kaXN0cm8vZG0tdmVyaXR5LyR7S0VSTkVMX0lOSVRSQU1GU19DUElPfSAgICR7Qn0vCi0JZmkKLX0KLQotZG9faW5zdGFsbF9hcHBlbmQgKCkgewotCSNpbnN0YWxsIGVsZnMKLQlpbnN0YWxsIC1kICR7RUxGUy1QQVRIfS8KLQlpbnN0YWxsIC1kICR7QklOUy1QQVRIfS8KLQlpbnN0YWxsIC1tIDA3NTUgJHtXT1JLRElSfS9pbWFnZS9ib290L3VJbWFnZSAke0VMRlMtUEFUSH0vdUltYWdlCi0JaW5zdGFsbCAtbSAwNzU1ICR7V09SS0RJUn0vaW1hZ2UvYm9vdC8ke01BQ0hJTkV9LSR7RElTVFJPfS5kdGIgICR7QklOUy1QQVRIfS9hcF9jcHVjYXAuZHRiCi0JaW5zdGFsbCAtbSAwNzU1ICR7V09SS0RJUn0vaW1hZ2UvYm9vdC8ke01BQ0hJTkV9LSR7RElTVFJPfS5kdGIgICR7RUxGUy1QQVRIfS8KLQotCWluc3RhbGwgLW0gMDc1NSAke0J9L3ZtbGludXggICAgICAgICAgICAgICR7RUxGUy1QQVRIfS92bWxpbnV4Ci0JaW5zdGFsbCAtbSAwNzU1ICR7Qn0vU3lzdGVtLm1hcCAgICAgICAgICAgJHtFTEZTLVBBVEh9L1N5c3RlbS5tYXAKLQlpZiBbIC1kICR7V09SS0RJUn0vaW1hZ2UvbGliL21vZHVsZXMgXTsgdGhlbgotCQljcCAtcmYgICR7V09SS0RJUn0vaW1hZ2UvbGliL21vZHVsZXMgICAgICAke0VMRlMtUEFUSH0vJHtQTn0vCi0JZmkKLX0KLQotZG9fY2xlYW5saWJzICgpIHsKLQlybSAtZnIgJHtFTEZTLVBBVEh9L3VJbWFnZQotCXJtIC1mciAke0VMRlMtUEFUSH0vJHtNQUNISU5FfS0ke0RJU1RST30uZHRiCi0Jcm0gLWZyICR7RUxGUy1QQVRIfS92bWxpbnV4Ci0Jcm0gLWZyICR7RUxGUy1QQVRIfS9TeXN0ZW0ubWFwCi0Jcm0gLWZyICR7RUxGUy1QQVRIfS8ke1BOfS9tb2R1bGVzCQotfQotYWRkdGFzayAgY2xlYW5saWJzIGFmdGVyIGRvX2NsZWFuICBiZWZvcmUgZG9fY2xlYW5zc3RhdGUKLWFkZHRhc2sgIGRvX2NwaW8gICBhZnRlciBkb19jb25maWd1cmUgYmVmb3JlIGRvX2NvbXBpbGUKLQotQ09NUEFUSUJMRV9NQUNISU5FID0gIl56eGljJCIKZGlmZiAtLWdpdCBhL2VzZGsvbGF5ZXJzL21ldGEtenhpYy9yZWNpcGVzLWtlcm5lbC9saW51eC9saW51eF9iYi5kaWZmIGIvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMta2VybmVsL2xpbnV4L2xpbnV4X2JiLmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM0ZGRhMmYuLjAwMDAwMDAKLS0tIGEvZXNkay9sYXllcnMvbWV0YS16eGljL3JlY2lwZXMta2VybmVsL2xpbnV4L2xpbnV4X2JiLmRpZmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1kaWZmIC0tZ2l0IGEvbGludXgtenhpY181LjEwLmJiIGIvbGludXgtenhpY181LjEwLmJiCi1pbmRleCBhYmFkZDliLi5hOGM3ZjY1IDEwMDc1NQotLS0tIGEvbGludXgtenhpY181LjEwLmJiCi0rKysgYi9saW51eC16eGljXzUuMTAuYmIKLUBAIC00LDE2ICs0LDE2IEBAIFBWICAgICAgPSAiJHtMSU5VWF9WRVJTSU9OfSIKLSBMSUNFTlNFID0gIkdQTHYyIgotIExJQ19GSUxFU19DSEtTVU0gPz0gImZpbGU6Ly9DT1BZSU5HO21kNT02YmM1MzhlZDViZDlhN2ZjOTM5ODA4NmFlZGNkN2U0NiIKLSBMSU5VWF9WRVJTSU9OICAgID89ICI1LjEwLjE1NiIKLS0KLStCU1BESVIgPSAiJHtUT1BESVJ9Ly4uL3Vwc3RyZWFtIgotICNwdWIgaW5jbHVkZQotLWluY2x1ZGUgJHtCU1BESVJ9L3NvdXJjZXMvbWV0YS16eGljL2NvbmYvcHViLmluYwotK2luY2x1ZGUgJHtUT1BESVJ9L2xheWVycy9tZXRhLXp4aWMvY29uZi9wdWJfZXNkay5pbmMKLSAKLSBERVBFTkRTICs9ICJrZXJuLXRvb2xzLW5hdGl2ZSIKLSBERVBFTkRTICs9ICIke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywnZG0tdmVyaXR5JywnenN0ZC1uYXRpdmUnLCcnLGQpfSIKLSBpbmhlcml0IGtlcm5lbCAgc2l0ZWluZm8gIAotIAotIEVYVFJBX09FTUFLRV9hcHBlbmQgPSAiIExPQURBRERSPSR7S0VSTkVMX0xPQURBRERSfSBFWFRSQV9DRkxBR1M9JyR7WlhJQ19FWFRSQV9DRkxBR1N9JyAiCi0tRklMRVNFWFRSQVBBVEhTX3ByZXBlbmQgOj0iJHtTUkMtUEFUSH06IgotK0ZJTEVTRVhUUkFQQVRIU19wcmVwZW5kIDo9IiR7VE9QRElSfS8uLi91cHN0cmVhbToiCi0gIyBQUl9DT05GSUdfY3BlID0gImxpbnV4LTVfMTAtY3BlLSR7Qk9PVF9DVEx9LWRlZmNvbmZpZyIKLSAjIFBSX0NPTkZJR192MnggPSAibGludXgtNV8xMC12MngtJHtCT09UX0NUTH0tZGVmY29uZmlnIgotIFBSX0NPTkZJR192ZWhpY2xlX2RjID0gImxpbnV4LTVfMTAtdmVoaWNsZV9kYy0ke0JPT1RfQ1RMfS1kZWZjb25maWciCi1AQCAtNjEsNyArNjEsNyBAQCBrZXJuZWxfZG9fY29uZmlndXJlKCkgewotIAotIGZha2Vyb290IGRvX2NwaW8gKCkgewotIAlpZiAke0BiYi51dGlscy5jb250YWlucygnRElTVFJPX0ZFQVRVUkVTJywnZG0tdmVyaXR5JywndHJ1ZScsJ2ZhbHNlJyxkKX07IHRoZW4KLS0JCWNwICAtdiAgJHtCU1BESVJ9L3NvdXJjZXMvbWV0YS16eGljLWN1c3RvbS9jb25mL2Rpc3Ryby9kbS12ZXJpdHkvJHtLRVJORUxfSU5JVFJBTUZTX0NQSU99ICAgJHtCfS8KLSsJCWNwICAtdiAgJHtCU1BESVJ9Ly4uL2VzZGsvc291cmNlcy9tZXRhLXp4aWMtY3VzdG9tL2NvbmYvZGlzdHJvL2RtLXZlcml0eS8ke0tFUk5FTF9JTklUUkFNRlNfQ1BJT30gICAke0J9LwotIAlmaQotIH0KLQpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9hcmNoL2FybS9rZXJuZWwvc3ZjX3MuUyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvYXJjaC9hcm0va2VybmVsL3N2Y19zLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE1MmFiYjcuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9hcmNoL2FybS9rZXJuZWwvc3ZjX3MuUworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0KLSNkZWZpbmUJR0lDX0RJU1RfQkFTRQkJCSgweEYyMDAwMDAwKQotI2RlZmluZQlHSUNfUkRJU1RfQkFTRQkJCSgweEYyMDQwMDAwKQotCi0jZGVmaW5lCVJFQUxfVFhUX0FERFIJCQkoQ09ORklHX1BIWVNfT0ZGU0VUICsgMHg4MDAwKQotI2RlZmluZQlEVEJfQUREUgkJCShDT05GSUdfRFRCX0FERFIpCQotCi1zZWN1cmVfaW5pdDoKLQotI2lmIDAKLQltb3YJcjUsIHIwCi0JbW92CXI2LCByMQotCW1vdglyNywgcjIKLSNlbmRpZgkKLQltb3YJcjQsIGxyCi0KLSNpZiAxCi0JLyogdXNlIHIwLS1yNCBvbmx5ICovCi0JYmwgIAlnZXRfY29yZV9pZAotCW1vdiAJcjEsIHIwCi0JYmwgIAlnZXRfY2x1c3Rlcl9pZAotCW1vdiAJcjIsIHIwCQotCi0JbGRyIAlyMywgPUdJQ19ESVNUX0JBU0UKLQlsZHIJcjAsID0weDUwCi0Jc3RyCXIwLCBbcjNdCi0KLQlsZHIgCXIzLCA9R0lDX1JESVNUX0JBU0UKLQlsc2wgIAlyMiwgcjIsICMyCi0JYWRkIAlyMSwgcjEsIHIyCi0JbHNsICAJcjEsIHIxLCAjMTcKLQotCWFkZCAJcjEsIHIxLCByMwotCWFkZCAJcjEsIHIxLCAjMHgxNAotCi0JTERSICBSMCwgW1IxXQotCUxEUiAgUjIsID0weGZmZmZmZmZkCi0JQU5EICBSMCwgUjAsIFIyCi0JU1RSICBSMCwgW1IxXQotCi0JTERSICBSMiwgPSAweEZGRkZGRkZCCi13YWl0OiAgCi0JTERSICBSMCwgW1IxXSAgCi0JQU5EICBSMCwgUjAsIFIyCi0JQ01QICBSMCwgIzAKLQlCTkUgIHdhaXQKLQotCVNVQiAgUjEsIFIxLCAjMHgxNAotCUxEUiAgUjIsID0weDEwMDgwCi0JQUREICBSMSwgUjEsIFIyCi0JTERSICBSMiwgPTB4RkZGRkZGRkYKLQlTVFIgIFIyLCBbUjFdCi0jZW5kaWYKLQotCU1SUyAgIFIwLCBDUFNSCi0JQklDICAgIFIwLCAgIzB4MUYKLQlPUlIgICBSMCwgICMweEQ2Ci0JTVNSICAgQ1BTUl9jLCAgUjAKLQotCU1PViAgcjMsICMweEQKLQlNQ1IgIHAxNSwjMHg2LHIzLGMxMixjMTIsIzUKLQlNQ1IgICAgICBwMTUsMCxyMyxjMTIsYzEyLCM1Ci0KLQlNUkMgICAgcDE1LDAscjEsYzEsYzEsMAotCU1PViAgICByMiwgcjEKLQlPUlIgICAgcjIsICMweDEKLQlNQ1IgICAgcDE1LDAscjIsYzEsYzEsMAotCi0JTUNSICAgICAgcDE1LCMweDQscjMsYzEyLGM5LCM1Ci0KLQlNUlMgICBSMCwgQ1BTUiAgCi0JQklDICAgIFIwLCAgIzB4MUYKLQlPUlIgICBSMCwgICMweEQzCi0JTVNSICAgQ1BTUl9jLCAgUjAKLQotI2lmIDAKLQltb3YJcjAsIHI1Ci0JbW92CXIxLCByNgotCW1vdglyMiwgcjcKLSNlbHNlCi0JbGRyCXIwLCA9MAotCWxkcglyMSwgPVJFQUxfVFhUX0FERFIKLQlsZHIJcjIsID1EVEJfQUREUgotI2VuZGlmCi0JbW92CWxyLCByNAotCi0JcmV0CWxyCi1FTkRQUk9DKHNlY3VyZV9pbml0KQotCi1nZXRfY29yZV9pZDoKLQlNUkMgICAJcDE1LCAwLCBSMCwgYzAsIGMwLCA1Ci0JQU5EICAgCVIwLCBSMCwgIzB4RkYKLQlCWCBSMTQKLUVORFBST0MoZ2V0X2NvcmVfaWQpCi0KLWdldF9jbHVzdGVyX2lkOgotCU1SQyAgIAlwMTUsIDAsIHIwLCBjMCwgYzAsIDUKLQlBTkQgICAJcjAsIHIwLCAjMHhGRjAwCi0JTFNSICAgCXIwLCByMCwgIzB4OAotCUJYICAgIAlscgotRU5EUFJPQyhnZXRfY2x1c3Rlcl9pZCkKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvZHJpdmVycy9taXNjL3pjYXQvZGVidWdfaW5mby5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL21pc2MvemNhdC9kZWJ1Z19pbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyM2UzNDAuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL21pc2MvemNhdC9kZWJ1Z19pbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotCi0vLyAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0vLyAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3NvYy96dGUvcnBtc2cuaD4KLS8vICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotCi0vLyAjaW5jbHVkZSAiZGVidWdpbmZvLmgiCi0jaW5jbHVkZSAicHViX2RlYnVnX2luZm8uaCIKLSNpbmNsdWRlICJyaW5nYnVmLmgiCi0KLQotI2lmIGRlZmluZWQoX1VTRV9aWElDX0RFQlVHX0lORk8pICYmICFkZWZpbmVkKENPTkZJR19TWVNURU1fUkVDT1ZFUlkpCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWuj+WumuS5iSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgREVCVUdfSU5GT19TSEFSRV9NRU1fTEVOICAgICgweDIwMDApCi0jZGVmaW5lIERFQlVHX0lORk9fUkVBREFCTEVfTEVOICAgICAoMHgxNDAwKQotI2RlZmluZSBERUJVR19JTkZPX01BWF9EQVRBX0xFTiAgICAgKDEyOCkKLSNkZWZpbmUgREVCVUdfSU5GT19NQVhfVE9UQUxfTEVOICAgICgxNDApIC8vIDggKyAxMjggKyA0Ci0jZGVmaW5lIERFQlVHX0lORk9fUkVBRF9USU1FX01TRUNTICAoMTAwMDApCi0KLSNkZWZpbmUgREVCVUdfSU5GT19DSEFOTkVMICAgICAgICAgICg5KQotI2RlZmluZSBERUJVR19JTkZPX01TR19DQVBfU0laRSAgICAgKDIgKiAxMDI0KQotCi0jZGVmaW5lIERFQlVHX0lORk9fT0sgICAgICAgICAgICAgICAoMCkKLSNkZWZpbmUgREVCVUdfSU5GT19FUlJPUiAgICAgICAgICAgICgtMSkKLQotI2RlZmluZSBERUJVR19JTkZPX0lPQ1RMX1NFVF9ESVNBQkxFICAoMHgxMDAxKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOe7k+aehOS9k+WumuS5iSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVJTlQ4OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIFVJTlQxNiBtb2R1bGVfaWQ7IC8vIOaooeWdl2lkCi0gICAgVUlOVDE2IHN1Yl9sZW47ICAgLy8g55So5oi35pWw5o2u6ZW/5bqmCi0gICAgVUlOVDMyIHRpbWU7Ci0gICAgY2hhciBzdWJfZGF0YVtdOyAvLyDnlKjmiLfmlbDmja4KLX0gVF9TSEFSRURfTUVNX0RBVEE7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgVUlOVDMyIGhlYWQ7ICAgICAgICAgICAgICAgICAgLy8gMHgwMTBhMGEwYQotICAgIFVJTlQzMiB0b3RhbF9sZW47ICAgICAgICAgICAgIC8vIOaVsOaNruWGheWuuemVv+W6pgotICAgIGxvbmcgbG9uZyB0aW1lOyAgICAgICAgICAgICAgIC8vIHRpbWUoKeWHveaVsOiOt+WPlgotfSBUX1NBVkVfRklMRV9EQVRBOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5YWo5bGA5Y+Y6YePICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9sYXRpbGUgVF9SSU5HQlVGRkVSICpnX2RlYnVnX2luZm9fYnVmID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIGRlYnVnX3NlbTsKLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGRlYnVnV3JfbG9jayk7Ci1zdGF0aWMgaW50IGdfaW5pdF9mbGFnID0gMDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5YaF6YOo5Ye95pWw5a6a5LmJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBzY19kZWJ1Z19pbmZvX3JlYWRfdG9fdXNlcihjaGFyICpidWYsIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKLXN0YXRpYyBpbnQgc2NfZGVidWdfaW5mb19yZWNvcmRfZnJvbV91c2VyKGNvbnN0IGNoYXIgKmluZm8sIHVuc2lnbmVkIHNob3J0IGNvdW50KTsKLXN0YXRpYyBpbnQgc2NfZGVidWdfaW5mb193cml0ZShVSU5UMzIgZmxhZywgY29uc3QgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbik7Ci1zdGF0aWMgdm9pZCBzY19kZWJ1Z19pbmZvX2Zyb21fYXAodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKLQotc3RhdGljIHZvaWQga2VybmVsX3RpbWVyX3RpbWVvdXQoc3RydWN0IHRpbWVyX2xpc3QgKnQpOwotc3RhdGljIHNzaXplX3QgZGVidWdfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgc3NpemVfdCBkZWJ1Z19pbmZvX3dyaXRlKHN0cnVjdCBmaWxlICpmcCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcyk7Ci1zdGF0aWMgaW50IGRlYnVnX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnApOwotc3RhdGljIGxvbmcgZGVidWdfaW5mb19pb2N0bChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyBpbnQgZGVidWdfaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCk7Ci0KLS8v5Yid5aeL5YyWdGltZXIKLXN0YXRpYyBERUZJTkVfVElNRVIodGltZXIsIGtlcm5lbF90aW1lcl90aW1lb3V0KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfaW5mb19mb3BzID0gewotICAgIC5vd25lciA9IFRISVNfTU9EVUxFLAotICAgIC5yZWFkID0gZGVidWdfaW5mb19yZWFkLAotICAgIC53cml0ZSA9IGRlYnVnX2luZm9fd3JpdGUsCi0gICAgLm9wZW4gPSBkZWJ1Z19pbmZvX29wZW4sCi0gICAgLnVubG9ja2VkX2lvY3RsID0gZGVidWdfaW5mb19pb2N0bCwKLSAgICAucmVsZWFzZSA9IGRlYnVnX2luZm9fcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkZWJ1Z19pbmZvX2RldmljZSA9IHsKLSAgICAubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCi0gICAgLm5hbWUgPSAiZGVidWdfaW5mbyIsCi0gICAgLmZvcHMgPSAmZGVidWdfaW5mb19mb3BzLAotfTsKLQotc3RhdGljIHZvaWQga2VybmVsX3RpbWVyX3RpbWVvdXQoc3RydWN0IHRpbWVyX2xpc3QgKnQpCi17Ci0gICAgaWYgKGRlYnVnX3NlbS5jb3VudCA9PSAwKQotICAgIHsKLSAgICAgICAgdXAoJmRlYnVnX3NlbSk7Ci0gICAgfQotICAgIC8qIOWboOS4uuWGheaguOWumuaXtuWZqOaYr+S4gOS4quWNleasoeeahOWumuaXtuWZqCzmiYDku6XlpoLmnpzmg7PopoHlpJrmrKHph43lpI3lrprml7bpnIDopoHlnKjlrprml7blmajnu5HlrprnmoTlh73mlbDnu5PlsL7ph43mlrDoo4Xovb3ml7bpl7Qs5bm25ZCv5Yqo5a6a5pe2ICovCi0gICAgLyogS2VybmVsIFRpbWVyIHJlc3RhcnQgKi8KLSAgICBtb2RfdGltZXIoJnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhERUJVR19JTkZPX1JFQURfVElNRV9NU0VDUykpOyAgICAKLX0KLQotc3RhdGljIHNzaXplX3QgZGVidWdfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmcCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKLXsKLSAgICBpbnQgcmV0OwotICAgIGludCByZF9sZW47Ci0KLSAgICByZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmRlYnVnX3NlbSk7Ci0gICAgaWYocmV0IDwgMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJkX2xlbiA9IHNjX2RlYnVnX2luZm9fcmVhZF90b191c2VyKGJ1ZiwgY291bnQpOwotICAgIH0KLQotICAgIHJldHVybiByZF9sZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGRlYnVnX2luZm9fd3JpdGUoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQotewotICAgIGludCB3cl9sZW4gPSBzY19kZWJ1Z19pbmZvX3JlY29yZF9mcm9tX3VzZXIoYnVmLCBjb3VudCk7Ci0KLSAgICByZXR1cm4gd3JfbGVuOwotfQotCi1zdGF0aWMgaW50IGRlYnVnX2luZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnApCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBsb25nIGRlYnVnX2luZm9faW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICBzd2l0Y2goY21kKQotICAgIHsKLSAgICAgICAgY2FzZSBERUJVR19JTkZPX0lPQ1RMX1NFVF9ESVNBQkxFOgotICAgICAgICAgICAgKih2b2xhdGlsZSBVSU5UMzIgKilaQ0FUX0RFQlVHX0lORk9fRElTQUJMRSA9IGFyZzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGVidWdfaW5mb19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2NfZGVidWdfaW5mb19mcm9tX2FwKHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKLXsKLSAgICBUX1NIQVJFRF9NRU1fREFUQSAqZGVidWdfbXNnID0gKFRfU0hBUkVEX01FTV9EQVRBICopYnVmOwotICAgIGRlYnVnX21zZy0+dGltZSA9IGppZmZpZXM7Ci0KLSAgICBzY19kZWJ1Z19pbmZvX3dyaXRlKFpDQVRfTUVNX1RZUEVfS0VSTkVMLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRlYnVnX2luZm9faW5pdCh2b2lkKQotewotICAgIGludCByZXQgPSBtaXNjX3JlZ2lzdGVyKCZkZWJ1Z19pbmZvX2RldmljZSk7Ci0gICAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiZGVidWdfaW5mb19kZXZpY2UgaW5pdC5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2b2lkICptZW07Ci0gICAgbWVtID0gdm1hbGxvYyhERUJVR19JTkZPX1NIQVJFX01FTV9MRU4pOwotICAgIGlmICghbWVtKQotICAgIHsKLSAgICAgICAgcHJpbnRrKCJ2bWFsbG9jIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICBnX2RlYnVnX2luZm9fYnVmID0gQ3JlYXRlUmluZ0J1ZmZlcigoVUlOVDggKiltZW0sIERFQlVHX0lORk9fU0hBUkVfTUVNX0xFTik7Ci0gICAgaWYgKGdfZGVidWdfaW5mb19idWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiQ3JlYXRlUmluZ0J1ZmZlciBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIERFQlVHX0lORk9fRVJST1I7Ci0gICAgfQotI2lmIDEKLSAgICByZXQgPSBycG1zZ0NyZWF0ZUNoYW5uZWwoCi0gICAgICAgIENPUkVfUFMwLCAKLSAgICAgICAgREVCVUdfSU5GT19DSEFOTkVMLAotICAgICAgICBERUJVR19JTkZPX01TR19DQVBfU0laRSk7Ci0gICAgaWYgKHJldCAhPSBERUJVR19JTkZPX09LKSAKLSAgICB7Ci0gICAgICAgIHByaW50aygicnBtc2dDcmVhdGVDaGFubmVsIGZhaWxlZCwgcmV0ID0gJWRcbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiBERUJVR19JTkZPX0VSUk9SOwotICAgIH0gIAotICAgIAotICAgIHJldCA9IHJwbXNnUmVnQ2FsbEJhY2soCi0gICAgICAgICAgICBDT1JFX1BTMCwKLSAgICAgICAgICAgIERFQlVHX0lORk9fQ0hBTk5FTCwgCi0gICAgICAgICAgICBzY19kZWJ1Z19pbmZvX2Zyb21fYXApOwotICAgIGlmIChyZXQgIT0gREVCVUdfSU5GT19PSykgCi0gICAgewotICAgICAgICBwcmludGsoInJwbXNnUmVnQ2FsbEJhY2sgZmFpbGVkLHJldCA9ICVkXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9IAotI2VuZGlmCi0gICAgc2VtYV9pbml0KCZkZWJ1Z19zZW0sIDApOwotICAgIC8qIOa3u+WKoOW5tuWQr+WKqOWumuaXtuWZqCwgMTBtcyAqLwotICAgIG1vZF90aW1lcigmdGltZXIsIGppZmZpZXMgKyAxKTsgICAgCi0KLSAgICBnX2luaXRfZmxhZyA9IDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGRlYnVnX2luZm9fZXhpdCh2b2lkKQotewotICAgIG1pc2NfZGVyZWdpc3RlcigmZGVidWdfaW5mb19kZXZpY2UpOwotCi0gICAgZGVsX3RpbWVyKCZ0aW1lcik7Ci19Ci0KLXN0YXRpYyBpbnQgc2NfZGVidWdfaW5mb193cml0ZShVSU5UMzIgZmxhZywgY29uc3QgVUlOVDggKmJ1ZiwgVUlOVDMyIGxlbikKLXsKLSAgICBVSU5UMzIgd3JpdGVsZW47Ci0gICAgVUlOVDMyIHVzZWRfc3BhY2U7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIGlmIChsZW4gPT0gMCB8fCBnX2RlYnVnX2luZm9fYnVmID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGsoInNjX2RlYnVnX2luZm9fd3JpdGU6OiAobGVuID09IDAgfHwgZ19kZWJ1Z19pbmZvX2J1ZiA9PSBOVUxMKS5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICByYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRlYnVnV3JfbG9jaywgZmxhZ3MpOwotICAgIHdyaXRlbGVuID0gV3JpdGVSaW5nQnVmZmVyKGdfZGVidWdfaW5mb19idWYsIGJ1ZiwgbGVuLCBmbGFnKTsKLSAgICByYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVidWdXcl9sb2NrLCBmbGFncyk7Ci0gICAgdXNlZF9zcGFjZSA9IEdldFJpbmdCdWZmZXJTaXplKGdfZGVidWdfaW5mb19idWYpOwotICAgIGlmICh1c2VkX3NwYWNlID4gREVCVUdfSU5GT19SRUFEQUJMRV9MRU4pCi0gICAgewotICAgICAgICBpZiAoZGVidWdfc2VtLmNvdW50ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVwKCZkZWJ1Z19zZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHdyaXRlbGVuOwotfQotCi1zdGF0aWMgaW50IHNjX2RlYnVnX2luZm9fcmVhZF90b191c2VyKGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgY291bnQpCi17Ci0gICAgdW5zaWduZWQgaW50IGJ1ZlNpemVfdXNlZCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IHJlYWRMZW4gPSAwOwotICAgIHVuc2lnbmVkIGludCBidWZMZW4gPSAwOwotICAgIFRfU0FWRV9GSUxFX0RBVEEgZmlsZURhdGFIZWFkOwotCi0gICAgaWYgKGdfaW5pdF9mbGFnID09IDApCi0gICAgewotICAgICAgICBwcmludGsoImRlYnVnX2luZm8gbm90IGluaXQuXG4iKTsKLSAgICAgICAgcmV0dXJuIERFQlVHX0lORk9fRVJST1I7Ci0gICAgfQotICAgIGlmIChjb3VudCA9PSAwIHx8IGJ1ZiA9PSBOVUxMIHx8IGdfZGVidWdfaW5mb19idWYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50aygic2NfZGVidWdfaW5mb19yZWFkX3RvX3VzZXI6OiAoY291bnQgPT0gMCB8fCBidWYgPT0gTlVMTCB8fCBnX2RlYnVnX2luZm9fYnVmID09IE5VTEwpLlxuIik7Ci0gICAgICAgIHJldHVybiBERUJVR19JTkZPX0VSUk9SOwotICAgIH0KLQotICAgIGJ1ZlNpemVfdXNlZCA9IEdldFJpbmdCdWZmZXJTaXplKGdfZGVidWdfaW5mb19idWYpOwotICAgIGlmIChidWZTaXplX3VzZWQgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8vIHByaW50aygic2NfZGVidWdfaW5mb19yZWFkX3RvX3VzZXI6OiByaW5nQnVmIGlzIGVtcHR5LlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZpbGVEYXRhSGVhZC5oZWFkID0gMHgwMTBhMGEwYTsKLSAgICBmaWxlRGF0YUhlYWQudGltZSA9IDA7Ci0gICAgZmlsZURhdGFIZWFkLnRvdGFsX2xlbiA9IGJ1ZlNpemVfdXNlZDsKLQotICAgIGNvcHlfdG9fdXNlcihidWYsICZmaWxlRGF0YUhlYWQsIHNpemVvZihUX1NBVkVfRklMRV9EQVRBKSk7Ci0KLSAgICByZWFkTGVuID0gUmVhZFJpbmdCdWZmZXIoZ19kZWJ1Z19pbmZvX2J1ZiwgKGJ1ZiArIHNpemVvZihUX1NBVkVfRklMRV9EQVRBKSksIGJ1ZlNpemVfdXNlZCwgWkNBVF9NRU1fVFlQRV9VU0VSKTsKLSAgICBpZiAocmVhZExlbiA9PSAwKQotICAgIHsKLSAgICAgICAgLy8gcHJpbnRrKCJSZWFkUmluZ0J1ZmZlciBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIChyZWFkTGVuICsgc2l6ZW9mKFRfU0FWRV9GSUxFX0RBVEEpKTsKLX0KLQotc3RhdGljIGludCBzY19kZWJ1Z19pbmZvX3JlY29yZF9mcm9tX3VzZXIoY29uc3QgY2hhciAqaW5mbywgdW5zaWduZWQgc2hvcnQgY291bnQpCi17Ci0gICAgdW5zaWduZWQgaW50IGNudCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IG15X2ppZmZpZXMgPSBqaWZmaWVzOwotCi0gICAgaWYgKGdfaW5pdF9mbGFnID09IDApCi0gICAgewotICAgICAgICBwcmludGsoImRlYnVnX2luZm8gbm90IGluaXQuXG4iKTsKLSAgICAgICAgcmV0dXJuIERFQlVHX0lORk9fRVJST1I7Ci0gICAgfQotICAgIGlmIChpbmZvID09IE5VTEwpCi0gICAgewotICAgICAgICBwcmludGsoInNjX2RlYnVnX2luZm9fcmVjb3JkX2Zyb21fdXNlcjo6IGluZm8gaXMgTlVMTC5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICBjb3B5X3RvX3VzZXIoaW5mbyArIDQsICZteV9qaWZmaWVzLCBzaXplb2YobXlfamlmZmllcykpOwotICAgIGNudCA9IHNjX2RlYnVnX2luZm9fd3JpdGUoWkNBVF9NRU1fVFlQRV9VU0VSLCAoVUlOVDggKilpbmZvLCBjb3VudCk7Ci0KLSAgICByZXR1cm4gY250OwotfQotCi1tb2R1bGVfaW5pdChkZWJ1Z19pbmZvX2luaXQpOwotbW9kdWxlX2V4aXQoZGVidWdfaW5mb19leGl0KTsKLQotTU9EVUxFX0FVVEhPUigiamN3Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImRlYnVnX2luZm8gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQotaW50IHNjX2RlYnVnX2luZm9fdnJlY29yZCh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICAgIGludCBsZW47Ci0gICAgVUlOVDMyIHdyaXRlbGVuOwotICAgIC8vIHZhX2xpc3QgYXJnczsKLSAgICBjaGFyIHN0cl9idWZbREVCVUdfSU5GT19NQVhfVE9UQUxfTEVOXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQpKSk7Ci0gICAgVF9TSEFSRURfTUVNX0RBVEEgKnNoYXJlTWVtRGF0YSA9IChUX1NIQVJFRF9NRU1fREFUQSAqKXN0cl9idWY7Ci0KLSAgICBpZiAoZ19pbml0X2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHByaW50aygiZGVidWdfaW5mbyBub3QgaW5pdC5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvKiBhcmdz5piv5LiA5LiqY2hhcirnsbvlnovmjIfpkojvvIzmjIflkJFmb3JtYXTkuYvlkI7nmoTnrKzkuIDkuKrlj4LmlbAqLwotICAgIC8vIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gICAgbGVuID0gdnNucHJpbnRmKHNoYXJlTWVtRGF0YS0+c3ViX2RhdGEsIERFQlVHX0lORk9fTUFYX0RBVEFfTEVOLCBmb3JtYXQsIGFyZ3MpOwotICAgIC8vIHZhX2VuZChhcmdzKTsKLSAgICBpZiAobGVuIDwgMCkKLSAgICB7Ci0gICAgICAgIHByaW50aygidnNucHJpbnRmIGZvcm1hdCBlcnJvci5cbiIpOwotICAgICAgICByZXR1cm4gREVCVUdfSU5GT19FUlJPUjsKLSAgICB9Ci0KLSAgICBzaGFyZU1lbURhdGEtPm1vZHVsZV9pZCA9IChVSU5UMTYpKGlkICYgMHhGRkZGKTsKLSAgICBzaGFyZU1lbURhdGEtPnN1Yl9sZW4gPSBsZW47Ci0gICAgc2hhcmVNZW1EYXRhLT50aW1lID0gamlmZmllczsKLQotICAgIHdyaXRlbGVuID0gc2NfZGVidWdfaW5mb193cml0ZShaQ0FUX01FTV9UWVBFX0tFUk5FTCwgKFVJTlQ4ICopc2hhcmVNZW1EYXRhLCBsZW4gKyBzaXplb2YoVF9TSEFSRURfTUVNX0RBVEEpKTsKLSAgICByZXR1cm4gd3JpdGVsZW47Ci19Ci1FWFBPUlRfU1lNQk9MKHNjX2RlYnVnX2luZm9fdnJlY29yZCk7Ci0KLWludCBzY19kZWJ1Z19pbmZvX3JlY29yZCh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLQlpbnQgcjsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0JciA9IHNjX2RlYnVnX2luZm9fdnJlY29yZChpZCwgZm9ybWF0LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0KLQotICAgIHJldHVybiByOwotfQotRVhQT1JUX1NZTUJPTChzY19kZWJ1Z19pbmZvX3JlY29yZCk7Ci0jZWxzZQotaW50IHNjX2RlYnVnX2luZm9fcmVjb3JkKHVuc2lnbmVkIGludCBpZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgICAvKiAgX1VTRV9aWElDX0RFQlVHX0lORk8gKi8KLQpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL25ldC96dm5ldC96dm5ldF9kZXYuaCBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvZHJpdmVycy9uZXQvenZuZXQvenZuZXRfZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQxZmVhYTUuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL25ldC96dm5ldC96dm5ldF9kZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNpZm5kZWYgWlZfTkVUX0gNCi0jZGVmaW5lIFpWX05FVF9IDQotDQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPg0KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+DQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPg0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4NCi0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+DQotI2luY2x1ZGUgPGxpbnV4L3NvYy96dGUvcnBtc2cuaD4NCi0NCi0vLyNkZWZpbmUgWlZORVRfREVCVUcNCi0jaWZkZWYgWlZORVRfREVCVUcNCi0jZGVmaW5lIHp2X2RiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIlt6dm5ldF08JXM+OiAiIGZvcm1hdCAiXG4iICwgXA0KLQlfX2Z1bmNfXyAsICMjIGFyZykNCi0jZGVmaW5lIHp2X2luZm8oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0lORk8gIlt6dm5ldF08JXM+OiAiIGZvcm1hdCAiXG4iICwgXA0KLQlfX2Z1bmNfXyAsICMjIGFyZykNCi0jZWxzZQ0KLSNkZWZpbmUgenZfZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkNCi0jZGVmaW5lIHp2X2luZm8oZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQ0KLSNlbmRpZg0KLQ0KLSNkZWZpbmUgenZfZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgIlt6dm5ldF08JXM+OiAiIGZvcm1hdCAiXG4iICwgXA0KLQlfX2Z1bmNfXyAsICMjIGFyZykNCi0NCi0jZGVmaW5lIHp2X3dhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIlt6dm5ldF08JXM+OiAiIGZvcm1hdCAiXG4iICwgXA0KLQlfX2Z1bmNfXyAsICMjIGFyZykNCi0NCi0vL3p2bmV0yeixuNfutPPK/Q0KLSNkZWZpbmUgRERSX1pWTkVUX0RFVl9NQVggMTANCi0jZGVmaW5lIFpWTkVUX0lGTkFNRV9QUkVGSVggInp2bmV0Ig0KLQ0KLSNkZWZpbmUgIElDUF9DSE5fWlZORVQxIDIwIC8vSUNQX0NIQU5ORUxfV0FOMQ0KLSNkZWZpbmUgIElDUF9DSE5fWlZORVQyIDIxIC8vSUNQX0NIQU5ORUxfV0FOMiANCi0jZGVmaW5lICBJQ1BfQ0hOX1pWTkVUMyAyMiAvL0lDUF9DSEFOTkVMX1dBTjMgDQotI2RlZmluZSAgSUNQX0NITl9aVk5FVDQgMjMgLy9JQ1BfQ0hBTk5FTF9XQU40IA0KLQ0KLSNkZWZpbmUJIElDUF9DSEFOTkVMX1NJWkUgCSg4ICogMTAyNCAqMikNCi0NCi0jZGVmaW5lIHp2bmV0Q3JlYXRlQ2hhbm5lbCBycG1zZ0NyZWF0ZUNoYW5uZWwNCi0jZGVmaW5lIHp2bmV0V3JpdGUgICAgICAgICBycG1zZ1dyaXRlDQotI2RlZmluZSB6dm5ldFJlYWQgICAgICAgICAgcnBtc2dSZWFkDQotDQotc3RydWN0IHp2bmV0X2NoYW5uZWwgew0KLSAgICBUX1JwTXNnX0NvcmVJRCBjb3JlX2lkOw0KLSAgICBUX1JwTXNnX0NoSUQgY2hhbm5lbF9pZDsNCi0gICAgdW5zaWduZWQgaW50IGNoYW5uZWxfc2l6ZTsNCi0gICAgc3RydWN0IHRhc2tfc3RydWN0ICpyY3ZfdGhyZWFkOw0KLX07DQotDQotc3RydWN0IHp2bmV0IHsNCi0gICAgc3RydWN0IG5ldF9kZXZpY2UgICpuZXQ7DQotICAgIHN0cnVjdCBza19idWZmX2hlYWQgcnhxOw0KLSAgICBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYmg7DQotICAgIHZvaWQgKmRldl9wcml2Ow0KLX07DQotDQotc3RydWN0IHp2bmV0X2RldmljZSB7DQotICAgIHN0cnVjdCB6dm5ldCAqZGV2Ow0KLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0Ow0KLSAgICAvL3N0cnVjdCB6dm5ldF9jaGFubmVsIGNobl9pbmZvOw0KLSAgICB1bnNpZ25lZCBjaGFyIHJldHJhbl90aW1lczsNCi0gICAgLy9pbnQgKCp3cml0ZSkoc3RydWN0IHNrX2J1ZmYgKixzdHJ1Y3QgdjJ4X2hkciAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBuZXRfZGV2aWNlICopOw0KLX07DQotDQotc3RydWN0IHp2cF9oZWFkZXIgew0KLSAgICB1bnNpZ25lZCBpbnQgbWFnaWNfd29yZDsNCi0gICAgdW5zaWduZWQgc2hvcnQgY2huaWQ7DQotICAgIHVuc2lnbmVkIHNob3J0IHRsZW47DQotfTsNCi0NCi0jZGVmaW5lIFpWUF9NQUdJQ19XT1JEICAweDVBNUE1QTVBDQotI2RlZmluZSBaVlBfSEVBRF9MRU4gCXNpemVvZihzdHJ1Y3QgenZwX2hlYWRlcikNCi0NCi0jZW5kaWYNCi0NCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvcnRjL2NsYXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyNWVmZmUuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCi0vKgotICogUlRDIHN1YnN5c3RlbSwgYmFzZSBjbGFzcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUb3dlciBUZWNobm9sb2dpZXMKLSAqIEF1dGhvcjogQWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+Ci0gKgotICogY2xhc3Mgc2tlbGV0b24gZnJvbSBkcml2ZXJzL2h3bW9uL2h3bW9uLmMKLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lkci5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotI2luY2x1ZGUgInJ0Yy1jb3JlLmgiCi0KLXN0YXRpYyBERUZJTkVfSURBKHJ0Y19pZGEpOwotc3RydWN0IGNsYXNzICpydGNfY2xhc3M7Ci0KLXN0YXRpYyB2b2lkIHJ0Y19kZXZpY2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgdGltZXJxdWV1ZV9oZWFkICpoZWFkID0gJnJ0Yy0+dGltZXJxdWV1ZTsKLQlzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlICpub2RlOwotCi0JbXV0ZXhfbG9jaygmcnRjLT5vcHNfbG9jayk7Ci0Jd2hpbGUgKChub2RlID0gdGltZXJxdWV1ZV9nZXRuZXh0KGhlYWQpKSkKLQkJdGltZXJxdWV1ZV9kZWwoaGVhZCwgbm9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZydGMtPm9wc19sb2NrKTsKLQotCWNhbmNlbF93b3JrX3N5bmMoJnJ0Yy0+aXJxd29yayk7Ci0KLQlpZGFfc2ltcGxlX3JlbW92ZSgmcnRjX2lkYSwgcnRjLT5pZCk7Ci0Ja2ZyZWUocnRjKTsKLX0KLQotI2lmZGVmIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UKLS8qIFJlc3VsdCBvZiB0aGUgbGFzdCBSVEMgdG8gc3lzdGVtIGNsb2NrIGF0dGVtcHQuICovCi1pbnQgcnRjX2hjdG9zeXNfcmV0ID0gLUVOT0RFVjsKLQotLyogSU1QT1JUQU5UOiB0aGUgUlRDIG9ubHkgc3RvcmVzIHdob2xlIHNlY29uZHMuIEl0IGlzIGFyYml0cmFyeQotICogd2hldGhlciBpdCBzdG9yZXMgdGhlIG1vc3QgY2xvc2UgdmFsdWUgb3IgdGhlIHZhbHVlIHdpdGggcGFydGlhbAotICogc2Vjb25kcyB0cnVuY2F0ZWQuIEhvd2V2ZXIsIGl0IGlzIGltcG9ydGFudCB0aGF0IHdlIHVzZSBpdCB0byBzdG9yZQotICogdGhlIHRydW5jYXRlZCB2YWx1ZS4gVGhpcyBpcyBiZWNhdXNlIG90aGVyd2lzZSBpdCBpcyBuZWNlc3NhcnksCi0gKiBpbiBhbiBydGMgc3luYyBmdW5jdGlvbiwgdG8gcmVhZCBib3RoIHh0aW1lLnR2X3NlYyBhbmQKLSAqIHh0aW1lLnR2X25zZWMuIE9uIHNvbWUgcHJvY2Vzc29ycyAoaS5lLiBBUk0pLCBhbiBhdG9taWMgcmVhZAotICogb2YgPjMyYml0cyBpcyBub3QgcG9zc2libGUuIFNvIHN0b3JpbmcgdGhlIG1vc3QgY2xvc2UgdmFsdWUgd291bGQKLSAqIHNsb3cgZG93biB0aGUgc3luYyBBUEkuIFNvIGhlcmUgd2UgaGF2ZSB0aGUgdHJ1bmNhdGVkIHZhbHVlIGFuZAotICogdGhlIGJlc3QgZ3Vlc3MgaXMgdG8gYWRkIDAuNXMuCi0gKi8KLQotc3RhdGljIHZvaWQgcnRjX2hjdG9zeXMoc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBydGNfdGltZSB0bTsKLQlzdHJ1Y3QgdGltZXNwZWM2NCB0djY0ID0gewotCQkudHZfbnNlYyA9IE5TRUNfUEVSX1NFQyA+PiAxLAotCX07Ci0KLQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIocnRjLT5kZXYucGFyZW50LAotCQkJImhjdG9zeXM6IHVuYWJsZSB0byByZWFkIHRoZSBoYXJkd2FyZSBjbG9ja1xuIik7Ci0JCWdvdG8gZXJyX3JlYWQ7Ci0JfQotCi0JdHY2NC50dl9zZWMgPSBydGNfdG1fdG9fdGltZTY0KCZ0bSk7Ci0KLSNpZiBCSVRTX1BFUl9MT05HID09IDMyCi0JaWYgKHR2NjQudHZfc2VjID4gSU5UX01BWCkgewotCQllcnIgPSAtRVJBTkdFOwotCQlnb3RvIGVycl9yZWFkOwotCX0KLSNlbmRpZgotCi0JZXJyID0gZG9fc2V0dGltZW9mZGF5NjQoJnR2NjQpOwotCi0JZGV2X2luZm8ocnRjLT5kZXYucGFyZW50LCAic2V0dGluZyBzeXN0ZW0gY2xvY2sgdG8gJXB0UiBVVEMgKCVsbGQpXG4iLAotCQkgJnRtLCAobG9uZyBsb25nKXR2NjQudHZfc2VjKTsKLQotZXJyX3JlYWQ6Ci0JcnRjX2hjdG9zeXNfcmV0ID0gZXJyOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QTV9TTEVFUCkgJiYgZGVmaW5lZChDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKQotLyoKLSAqIE9uIHN1c3BlbmQoKSwgbWVhc3VyZSB0aGUgZGVsdGEgYmV0d2VlbiBvbmUgUlRDIGFuZCB0aGUKLSAqIHN5c3RlbSdzIHdhbGwgY2xvY2s7IHJlc3RvcmUgaXQgb24gcmVzdW1lKCkuCi0gKi8KLQotc3RhdGljIHN0cnVjdCB0aW1lc3BlYzY0IG9sZF9ydGMsIG9sZF9zeXN0ZW0sIG9sZF9kZWx0YTsKLQotc3RhdGljIGludCBydGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcnRjX3RpbWUJCXRtOwotCXN0cnVjdCB0aW1lc3BlYzY0CWRlbHRhLCBkZWx0YV9kZWx0YTsKLQlpbnQgZXJyOwotCi0JaWYgKHRpbWVrZWVwaW5nX3J0Y19za2lwc3VzcGVuZCgpKQotCQlyZXR1cm4gMDsKLQotCWlmIChzdHJjbXAoZGV2X25hbWUoJnJ0Yy0+ZGV2KSwgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRSkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBzbmFwc2hvdCB0aGUgY3VycmVudCBSVEMgYW5kIHN5c3RlbSB0aW1lIGF0IHN1c3BlbmQqLwotCWVyciA9IHJ0Y19yZWFkX3RpbWUocnRjLCAmdG0pOwotCWlmIChlcnIgPCAwKSB7Ci0JCXByX2RlYnVnKCIlczogIGZhaWwgdG8gcmVhZCBydGMgdGltZVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWt0aW1lX2dldF9yZWFsX3RzNjQoJm9sZF9zeXN0ZW0pOwotCW9sZF9ydGMudHZfc2VjID0gcnRjX3RtX3RvX3RpbWU2NCgmdG0pOwotCi0JLyoKLQkgKiBUbyBhdm9pZCBkcmlmdCBjYXVzZWQgYnkgcmVwZWF0ZWQgc3VzcGVuZC9yZXN1bWVzLAotCSAqIHdoaWNoIGVhY2ggY2FuIGFkZCB+MSBzZWNvbmQgZHJpZnQgZXJyb3IsCi0JICogdHJ5IHRvIGNvbXBlbnNhdGUgc28gdGhlIGRpZmZlcmVuY2UgaW4gc3lzdGVtIHRpbWUKLQkgKiBhbmQgcnRjIHRpbWUgc3RheXMgY2xvc2UgdG8gY29uc3RhbnQuCi0JICovCi0JZGVsdGEgPSB0aW1lc3BlYzY0X3N1YihvbGRfc3lzdGVtLCBvbGRfcnRjKTsKLQlkZWx0YV9kZWx0YSA9IHRpbWVzcGVjNjRfc3ViKGRlbHRhLCBvbGRfZGVsdGEpOwotCWlmIChkZWx0YV9kZWx0YS50dl9zZWMgPCAtMiB8fCBkZWx0YV9kZWx0YS50dl9zZWMgPj0gMikgewotCQkvKgotCQkgKiBpZiBkZWx0YV9kZWx0YSBpcyB0b28gbGFyZ2UsIGFzc3VtZSB0aW1lIGNvcnJlY3Rpb24KLQkJICogaGFzIG9jY3VycmVkIGFuZCBzZXQgb2xkX2RlbHRhIHRvIHRoZSBjdXJyZW50IGRlbHRhLgotCQkgKi8KLQkJb2xkX2RlbHRhID0gZGVsdGE7Ci0JfSBlbHNlIHsKLQkJLyogT3RoZXJ3aXNlIHRyeSB0byBhZGp1c3Qgb2xkX3N5c3RlbSB0byBjb21wZW5zYXRlICovCi0JCW9sZF9zeXN0ZW0gPSB0aW1lc3BlYzY0X3N1YihvbGRfc3lzdGVtLCBkZWx0YV9kZWx0YSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UJKnJ0YyA9IHRvX3J0Y19kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgcnRjX3RpbWUJCXRtOwotCXN0cnVjdCB0aW1lc3BlYzY0CW5ld19zeXN0ZW0sIG5ld19ydGM7Ci0Jc3RydWN0IHRpbWVzcGVjNjQJc2xlZXBfdGltZTsKLQlpbnQgZXJyOwotCi0JaWYgKHRpbWVrZWVwaW5nX3J0Y19za2lwcmVzdW1lKCkpCi0JCXJldHVybiAwOwotCi0JcnRjX2hjdG9zeXNfcmV0ID0gLUVOT0RFVjsKLQlpZiAoc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpICE9IDApCi0JCXJldHVybiAwOwotCi0JLyogc25hcHNob3QgdGhlIGN1cnJlbnQgcnRjIGFuZCBzeXN0ZW0gdGltZSBhdCByZXN1bWUgKi8KLQlrdGltZV9nZXRfcmVhbF90czY0KCZuZXdfc3lzdGVtKTsKLQllcnIgPSBydGNfcmVhZF90aW1lKHJ0YywgJnRtKTsKLQlpZiAoZXJyIDwgMCkgewotCQlwcl9kZWJ1ZygiJXM6ICBmYWlsIHRvIHJlYWQgcnRjIHRpbWVcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQluZXdfcnRjLnR2X3NlYyA9IHJ0Y190bV90b190aW1lNjQoJnRtKTsKLQluZXdfcnRjLnR2X25zZWMgPSAwOwotCi0JaWYgKG5ld19ydGMudHZfc2VjIDwgb2xkX3J0Yy50dl9zZWMpIHsKLQkJcHJfZGVidWcoIiVzOiAgdGltZSB0cmF2ZWwhXG4iLCBkZXZfbmFtZSgmcnRjLT5kZXYpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogY2FsY3VsYXRlIHRoZSBSVEMgdGltZSBkZWx0YSAoc2xlZXAgdGltZSkqLwotCXNsZWVwX3RpbWUgPSB0aW1lc3BlYzY0X3N1YihuZXdfcnRjLCBvbGRfcnRjKTsKLQotCS8qCi0JICogU2luY2UgdGhlc2UgUlRDIHN1c3BlbmQvcmVzdW1lIGhhbmRsZXJzIGFyZSBub3QgY2FsbGVkCi0JICogYXQgdGhlIHZlcnkgZW5kIG9mIHN1c3BlbmQgb3IgdGhlIHN0YXJ0IG9mIHJlc3VtZSwKLQkgKiBzb21lIHJ1bi10aW1lIG1heSBwYXNzIG9uIGVpdGhlciBzaWRlcyBvZiB0aGUgc2xlZXAgdGltZQotCSAqIHNvIHN1YnRyYWN0IGtlcm5lbCBydW4tdGltZSBiZXR3ZWVuIHJ0Y19zdXNwZW5kIHRvIHJ0Y19yZXN1bWUKLQkgKiB0byBrZWVwIHRoaW5ncyBhY2N1cmF0ZS4KLQkgKi8KLQlzbGVlcF90aW1lID0gdGltZXNwZWM2NF9zdWIoc2xlZXBfdGltZSwKLQkJCQkgICAgdGltZXNwZWM2NF9zdWIobmV3X3N5c3RlbSwgb2xkX3N5c3RlbSkpOwotCi0JaWYgKHNsZWVwX3RpbWUudHZfc2VjID49IDApCi0JCXRpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWU2NCgmc2xlZXBfdGltZSk7Ci0JcnRjX2hjdG9zeXNfcmV0ID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHJ0Y19jbGFzc19kZXZfcG1fb3BzLCBydGNfc3VzcGVuZCwgcnRjX3Jlc3VtZSk7Ci0jZGVmaW5lIFJUQ19DTEFTU19ERVZfUE1fT1BTCSgmcnRjX2NsYXNzX2Rldl9wbV9vcHMpCi0jZWxzZQotI2RlZmluZSBSVENfQ0xBU1NfREVWX1BNX09QUwlOVUxMCi0jZW5kaWYKLQotLyogRW5zdXJlIHRoZSBjYWxsZXIgd2lsbCBzZXQgdGhlIGlkIGJlZm9yZSByZWxlYXNpbmcgdGhlIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBydGNfZGV2aWNlICpydGNfYWxsb2NhdGVfZGV2aWNlKHZvaWQpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQotCXJ0YyA9IGt6YWxsb2Moc2l6ZW9mKCpydGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ0YykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlkZXZpY2VfaW5pdGlhbGl6ZSgmcnRjLT5kZXYpOwotCi0JLyogRHJpdmVycyBjYW4gcmV2aXNlIHRoaXMgZGVmYXVsdCBhZnRlciBhbGxvY2F0aW5nIHRoZSBkZXZpY2UuICovCi0JcnRjLT5zZXRfb2Zmc2V0X25zZWMgPSAgTlNFQ19QRVJfU0VDIC8gMjsKLQotCXJ0Yy0+aXJxX2ZyZXEgPSAxOwotCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IDY0OwotCXJ0Yy0+ZGV2LmNsYXNzID0gcnRjX2NsYXNzOwotCXJ0Yy0+ZGV2Lmdyb3VwcyA9IHJ0Y19nZXRfZGV2X2F0dHJpYnV0ZV9ncm91cHMoKTsKLQlydGMtPmRldi5yZWxlYXNlID0gcnRjX2RldmljZV9yZWxlYXNlOwotCi0JbXV0ZXhfaW5pdCgmcnRjLT5vcHNfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJ0Yy0+aXJxX2xvY2spOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ0Yy0+aXJxX3F1ZXVlKTsKLQotCS8qIEluaXQgdGltZXJxdWV1ZSAqLwotCXRpbWVycXVldWVfaW5pdF9oZWFkKCZydGMtPnRpbWVycXVldWUpOwotCUlOSVRfV09SSygmcnRjLT5pcnF3b3JrLCBydGNfdGltZXJfZG9fd29yayk7Ci0JLyogSW5pdCBhaWUgdGltZXIgKi8KLQlydGNfdGltZXJfaW5pdCgmcnRjLT5haWVfdGltZXIsIHJ0Y19haWVfdXBkYXRlX2lycSwgcnRjKTsKLQkvKiBJbml0IHVpZSB0aW1lciAqLwotCXJ0Y190aW1lcl9pbml0KCZydGMtPnVpZV9ydGN0aW1lciwgcnRjX3VpZV91cGRhdGVfaXJxLCBydGMpOwotCS8qIEluaXQgcGllIHRpbWVyICovCi0JaHJ0aW1lcl9pbml0KCZydGMtPnBpZV90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKLQlydGMtPnBpZV90aW1lci5mdW5jdGlvbiA9IHJ0Y19waWVfdXBkYXRlX2lycTsKLQlydGMtPnBpZV9lbmFibGVkID0gMDsKLQotCXJldHVybiBydGM7Ci19Ci0KLXN0YXRpYyBpbnQgcnRjX2RldmljZV9nZXRfaWQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCBvZl9pZCA9IC0xLCBpZCA9IC0xOwotCi0JaWYgKGRldi0+b2Zfbm9kZSkKLQkJb2ZfaWQgPSBvZl9hbGlhc19nZXRfaWQoZGV2LT5vZl9ub2RlLCAicnRjIik7Ci0JZWxzZSBpZiAoZGV2LT5wYXJlbnQgJiYgZGV2LT5wYXJlbnQtPm9mX25vZGUpCi0JCW9mX2lkID0gb2ZfYWxpYXNfZ2V0X2lkKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicnRjIik7Ci0KLQlpZiAob2ZfaWQgPj0gMCkgewotCQlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZydGNfaWRhLCBvZl9pZCwgb2ZfaWQgKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGlkIDwgMCkKLQkJCWRldl93YXJuKGRldiwgIi9hbGlhc2VzIElEICVkIG5vdCBhdmFpbGFibGVcbiIsIG9mX2lkKTsKLQl9Ci0KLQlpZiAoaWQgPCAwKQotCQlpZCA9IGlkYV9zaW1wbGVfZ2V0KCZydGNfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKLQotCXJldHVybiBpZDsKLX0KLQotc3RhdGljIHZvaWQgcnRjX2RldmljZV9nZXRfb2Zmc2V0KHN0cnVjdCBydGNfZGV2aWNlICpydGMpCi17Ci0JdGltZTY0X3QgcmFuZ2Vfc2VjczsKLQl1MzIgc3RhcnRfeWVhcjsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBJZiBSVEMgZHJpdmVyIGRpZCBub3QgaW1wbGVtZW50IHRoZSByYW5nZSBvZiBSVEMgaGFyZHdhcmUgZGV2aWNlLAotCSAqIHRoZW4gd2UgY2FuIG5vdCBleHBhbmQgdGhlIFJUQyByYW5nZSBieSBhZGRpbmcgb3Igc3VidHJhY3Rpbmcgb25lCi0JICogb2Zmc2V0LgotCSAqLwotCWlmIChydGMtPnJhbmdlX21pbiA9PSBydGMtPnJhbmdlX21heCkKLQkJcmV0dXJuOwotCi0JcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHJ0Yy0+ZGV2LnBhcmVudCwgInN0YXJ0LXllYXIiLAotCQkJCSAgICAgICAmc3RhcnRfeWVhcik7Ci0JaWYgKCFyZXQpIHsKLQkJcnRjLT5zdGFydF9zZWNzID0gbWt0aW1lNjQoc3RhcnRfeWVhciwgMSwgMSwgMCwgMCwgMCk7Ci0JCXJ0Yy0+c2V0X3N0YXJ0X3RpbWUgPSB0cnVlOwotCX0KLQotCS8qCi0JICogSWYgdXNlciBkaWQgbm90IGltcGxlbWVudCB0aGUgc3RhcnQgdGltZSBmb3IgUlRDIGRyaXZlciwgdGhlbiBubwotCSAqIG5lZWQgdG8gZXhwYW5kIHRoZSBSVEMgcmFuZ2UuCi0JICovCi0JaWYgKCFydGMtPnNldF9zdGFydF90aW1lKQotCQlyZXR1cm47Ci0KLQlyYW5nZV9zZWNzID0gcnRjLT5yYW5nZV9tYXggLSBydGMtPnJhbmdlX21pbiArIDE7Ci0KLQkvKgotCSAqIElmIHRoZSBzdGFydF9zZWNzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHNlY29uZHMgKHJ0Yy0+cmFuZ2VfbWF4KQotCSAqIHN1cHBvcnRlZCBieSBSVEMgaGFyZHdhcmUgb3IgdGhlIG1heGltdW0gc2Vjb25kcyBvZiBuZXcgZXhwYW5kZWQKLQkgKiByYW5nZSAoc3RhcnRfc2VjcyArIHJ0Yy0+cmFuZ2VfbWF4IC0gcnRjLT5yYW5nZV9taW4pIGlzIGxlc3MgdGhhbgotCSAqIHJ0Yy0+cmFuZ2VfbWluLCB3aGljaCBtZWFucyB0aGUgbWluaW11bSBzZWNvbmRzIChydGMtPnJhbmdlX21pbikgb2YKLQkgKiBSVEMgaGFyZHdhcmUgd2lsbCBiZSBtYXBwZWQgdG8gc3RhcnRfc2VjcyBieSBhZGRpbmcgb25lIG9mZnNldCwgc28KLQkgKiB0aGUgb2Zmc2V0IHNlY29uZHMgY2FsY3VsYXRpb24gZm9ybXVsYSBzaG91bGQgYmU6Ci0JICogcnRjLT5vZmZzZXRfc2VjcyA9IHJ0Yy0+c3RhcnRfc2VjcyAtIHJ0Yy0+cmFuZ2VfbWluOwotCSAqCi0JICogSWYgdGhlIHN0YXJ0X3NlY3MgaXMgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0gc2Vjb25kcyAocnRjLT5yYW5nZV9taW4pCi0JICogc3VwcG9ydGVkIGJ5IFJUQyBoYXJkd2FyZSwgdGhlbiB0aGVyZSBpcyBvbmUgcmVnaW9uIGlzIG92ZXJsYXBwZWQKLQkgKiBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBSVEMgaGFyZHdhcmUgcmFuZ2UgYW5kIHRoZSBuZXcgZXhwYW5kZWQgcmFuZ2UsCi0JICogYW5kIHRoaXMgb3ZlcmxhcHBlZCByZWdpb24gZG8gbm90IG5lZWQgdG8gYmUgbWFwcGVkIGludG8gdGhlIG5ldwotCSAqIGV4cGFuZGVkIHJhbmdlIGR1ZSB0byBpdCBpcyB2YWxpZCBmb3IgUlRDIGRldmljZS4gU28gdGhlIG1pbmltdW0KLQkgKiBzZWNvbmRzIG9mIFJUQyBoYXJkd2FyZSAocnRjLT5yYW5nZV9taW4pIHNob3VsZCBiZSBtYXBwZWQgdG8KLQkgKiBydGMtPnJhbmdlX21heCArIDEsIHRoZW4gdGhlIG9mZnNldCBzZWNvbmRzIGZvcm11bGEgc2hvdWxkIGJlOgotCSAqIHJ0Yy0+b2Zmc2V0X3NlY3MgPSBydGMtPnJhbmdlX21heCAtIHJ0Yy0+cmFuZ2VfbWluICsgMTsKLQkgKgotCSAqIElmIHRoZSBzdGFydF9zZWNzIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSBzZWNvbmRzIChydGMtPnJhbmdlX21pbiksCi0JICogd2hpY2ggaXMgc2ltaWxhciB0byBjYXNlIDIuIFNvIHRoZSBzdGFydF9zZWNzIHNob3VsZCBiZSBtYXBwZWQgdG8KLQkgKiBzdGFydF9zZWNzICsgcnRjLT5yYW5nZV9tYXggLSBydGMtPnJhbmdlX21pbiArIDEsIHRoZW4gdGhlCi0JICogb2Zmc2V0IHNlY29uZHMgZm9ybXVsYSBzaG91bGQgYmU6Ci0JICogcnRjLT5vZmZzZXRfc2VjcyA9IC0ocnRjLT5yYW5nZV9tYXggLSBydGMtPnJhbmdlX21pbiArIDEpOwotCSAqCi0JICogT3RoZXJ3aXNlIHRoZSBvZmZzZXQgc2Vjb25kcyBzaG91bGQgYmUgMC4KLQkgKi8KLQlpZiAocnRjLT5zdGFydF9zZWNzID4gcnRjLT5yYW5nZV9tYXggfHwKLQkgICAgcnRjLT5zdGFydF9zZWNzICsgcmFuZ2Vfc2VjcyAtIDEgPCBydGMtPnJhbmdlX21pbikKLQkJcnRjLT5vZmZzZXRfc2VjcyA9IHJ0Yy0+c3RhcnRfc2VjcyAtIHJ0Yy0+cmFuZ2VfbWluOwotCWVsc2UgaWYgKHJ0Yy0+c3RhcnRfc2VjcyA+IHJ0Yy0+cmFuZ2VfbWluKQotCQlydGMtPm9mZnNldF9zZWNzID0gcmFuZ2Vfc2VjczsKLQllbHNlIGlmIChydGMtPnN0YXJ0X3NlY3MgPCBydGMtPnJhbmdlX21pbikKLQkJcnRjLT5vZmZzZXRfc2VjcyA9IC1yYW5nZV9zZWNzOwotCWVsc2UKLQkJcnRjLT5vZmZzZXRfc2VjcyA9IDA7Ci19Ci0KLS8qKgotICogcnRjX2RldmljZV91bnJlZ2lzdGVyIC0gcmVtb3ZlcyB0aGUgcHJldmlvdXNseSByZWdpc3RlcmVkIFJUQyBjbGFzcyBkZXZpY2UKLSAqCi0gKiBAcnRjOiB0aGUgUlRDIGNsYXNzIGRldmljZSB0byBkZXN0cm95Ci0gKi8KLXN0YXRpYyB2b2lkIHJ0Y19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQotewotCW11dGV4X2xvY2soJnJ0Yy0+b3BzX2xvY2spOwotCS8qCi0JICogUmVtb3ZlIGlubmFyZHMgb2YgdGhpcyBSVEMsIHRoZW4gZGlzYWJsZSBpdCwgYmVmb3JlCi0JICogbGV0dGluZyBhbnkgcnRjX2NsYXNzX29wZW4oKSB1c2VycyBhY2Nlc3MgaXQgYWdhaW4KLQkgKi8KLQlydGNfcHJvY19kZWxfZGV2aWNlKHJ0Yyk7Ci0JY2Rldl9kZXZpY2VfZGVsKCZydGMtPmNoYXJfZGV2LCAmcnRjLT5kZXYpOwotCXJ0Yy0+b3BzID0gTlVMTDsKLQltdXRleF91bmxvY2soJnJ0Yy0+b3BzX2xvY2spOwotCXB1dF9kZXZpY2UoJnJ0Yy0+ZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgZGV2bV9ydGNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9ICooc3RydWN0IHJ0Y19kZXZpY2UgKiopcmVzOwotCi0JcnRjX252bWVtX3VucmVnaXN0ZXIocnRjKTsKLQotCWlmIChydGMtPnJlZ2lzdGVyZWQpCi0JCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOwotCWVsc2UKLQkJcHV0X2RldmljZSgmcnRjLT5kZXYpOwotfQotCi1zdHJ1Y3QgcnRjX2RldmljZSAqZGV2bV9ydGNfYWxsb2NhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcnRjX2RldmljZSAqKnB0ciwgKnJ0YzsKLQlpbnQgaWQsIGVycjsKLQotCWlkID0gcnRjX2RldmljZV9nZXRfaWQoZGV2KTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gRVJSX1BUUihpZCk7Ci0KLQlwdHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9ydGNfcmVsZWFzZV9kZXZpY2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwdHIpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0X2lkYTsKLQl9Ci0KLQlydGMgPSBydGNfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWYgKCFydGMpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0X2RldnJlczsKLQl9Ci0KLQkqcHRyID0gcnRjOwotCWRldnJlc19hZGQoZGV2LCBwdHIpOwotCi0JcnRjLT5pZCA9IGlkOwotCXJ0Yy0+ZGV2LnBhcmVudCA9IGRldjsKLQlkZXZfc2V0X25hbWUoJnJ0Yy0+ZGV2LCAicnRjJWQiLCBpZCk7Ci0KLQlyZXR1cm4gcnRjOwotCi1leGl0X2RldnJlczoKLQlkZXZyZXNfZnJlZShwdHIpOwotZXhpdF9pZGE6Ci0JaWRhX3NpbXBsZV9yZW1vdmUoJnJ0Y19pZGEsIGlkKTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9ydGNfYWxsb2NhdGVfZGV2aWNlKTsKLQotaW50IF9fcnRjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YykKLXsKLQlzdHJ1Y3QgcnRjX3drYWxybSBhbHJtOwotCWludCBlcnI7Ci0KLQlpZiAoIXJ0Yy0+b3BzKSB7Ci0JCWRldl9kYmcoJnJ0Yy0+ZGV2LCAibm8gb3BzIHNldFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ0Yy0+b3duZXIgPSBvd25lcjsKLQlydGNfZGV2aWNlX2dldF9vZmZzZXQocnRjKTsKLQotCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBBTEFSTSBhbHJlYWR5IHNldCBpbiBodyAqLwotCWVyciA9IF9fcnRjX3JlYWRfYWxhcm0ocnRjLCAmYWxybSk7Ci0JaWYgKCFlcnIgJiYgIXJ0Y192YWxpZF90bSgmYWxybS50aW1lKSkKLQkJcnRjX2luaXRpYWxpemVfYWxhcm0ocnRjLCAmYWxybSk7Ci0KLQlydGNfZGV2X3ByZXBhcmUocnRjKTsKLQotCWVyciA9IGNkZXZfZGV2aWNlX2FkZCgmcnRjLT5jaGFyX2RldiwgJnJ0Yy0+ZGV2KTsKLQlpZiAoZXJyKQotCQlkZXZfd2FybihydGMtPmRldi5wYXJlbnQsICJmYWlsZWQgdG8gYWRkIGNoYXIgZGV2aWNlICVkOiVkXG4iLAotCQkJIE1BSk9SKHJ0Yy0+ZGV2LmRldnQpLCBydGMtPmlkKTsKLQllbHNlCi0JCWRldl9kYmcocnRjLT5kZXYucGFyZW50LCAiY2hhciBkZXZpY2UgKCVkOiVkKVxuIiwKLQkJCU1BSk9SKHJ0Yy0+ZGV2LmRldnQpLCBydGMtPmlkKTsKLQotCXJ0Y19wcm9jX2FkZF9kZXZpY2UocnRjKTsKLQotCXJ0Yy0+cmVnaXN0ZXJlZCA9IHRydWU7Ci0JZGV2X2luZm8ocnRjLT5kZXYucGFyZW50LCAicmVnaXN0ZXJlZCBhcyAlc1xuIiwKLQkJIGRldl9uYW1lKCZydGMtPmRldikpOwotCi0jaWZkZWYgQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRQotCWlmICghc3RyY21wKGRldl9uYW1lKCZydGMtPmRldiksIENPTkZJR19SVENfSENUT1NZU19ERVZJQ0UpKQotCQlydGNfaGN0b3N5cyhydGMpOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fcnRjX3JlZ2lzdGVyX2RldmljZSk7Ci0KLS8qKgotICogZGV2bV9ydGNfZGV2aWNlX3JlZ2lzdGVyIC0gcmVzb3VyY2UgbWFuYWdlZCBydGNfZGV2aWNlX3JlZ2lzdGVyKCkKLSAqIEBkZXY6IHRoZSBkZXZpY2UgdG8gcmVnaXN0ZXIKLSAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlICh1bnVzZWQpCi0gKiBAb3BzOiB0aGUgcnRjIG9wZXJhdGlvbnMgc3RydWN0dXJlCi0gKiBAb3duZXI6IHRoZSBtb2R1bGUgb3duZXIKLSAqCi0gKiBAcmV0dXJuIGEgc3RydWN0IHJ0YyBvbiBzdWNjZXNzLCBvciBhbiBFUlJfUFRSIG9uIGVycm9yCi0gKgotICogTWFuYWdlZCBydGNfZGV2aWNlX3JlZ2lzdGVyKCkuIFRoZSBydGNfZGV2aWNlIHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbgotICogYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgb24gZHJpdmVyIGRldGFjaC4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgdXNlIGRldm1fcnRjX2FsbG9jYXRlX2RldmljZSBhbmQKLSAqIHJ0Y19yZWdpc3Rlcl9kZXZpY2UgaW5zdGVhZAotICovCi1zdHJ1Y3QgcnRjX2RldmljZSAqZGV2bV9ydGNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyAqb3BzLAotCQkJCQkgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpCi17Ci0Jc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKLQlpbnQgZXJyOwotCi0JcnRjID0gZGV2bV9ydGNfYWxsb2NhdGVfZGV2aWNlKGRldik7Ci0JaWYgKElTX0VSUihydGMpKQotCQlyZXR1cm4gcnRjOwotCi0JcnRjLT5vcHMgPSBvcHM7Ci0KLQllcnIgPSBfX3J0Y19yZWdpc3Rlcl9kZXZpY2Uob3duZXIsIHJ0Yyk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQotCXJldHVybiBydGM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkZXZtX3J0Y19kZXZpY2VfcmVnaXN0ZXIpOwotCi1zdGF0aWMgaW50IF9faW5pdCBydGNfaW5pdCh2b2lkKQotewotCXJ0Y19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInJ0YyIpOwotCWlmIChJU19FUlIocnRjX2NsYXNzKSkgewotCQlwcl9lcnIoImNvdWxkbid0IGNyZWF0ZSBjbGFzc1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKHJ0Y19jbGFzcyk7Ci0JfQotCXJ0Y19jbGFzcy0+cG0gPSBSVENfQ0xBU1NfREVWX1BNX09QUzsKLQlydGNfZGV2X2luaXQoKTsKLQlyZXR1cm4gMDsKLX0KLXN1YnN5c19pbml0Y2FsbChydGNfaW5pdCk7CmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvc29jL3NjL3BjdS9wY3UtengyOTc1MjB2My5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL3NvYy9zYy9wY3UvcGN1LXp4Mjk3NTIwdjMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZjOGNmMy4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvc29jL3NjL3BjdS9wY3UtengyOTc1MjB2My5jCisrKyAvZGV2L251bGwKQEAgLTEsOTc2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMjIgWlRFLVRTUAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZmNvdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgotCi0jaW5jbHVkZSA8bGludXgvc29jL3NjL2NvbW1vbi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvYy9zYy9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3NvYy9zYy9wY3UuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2Mvc2MvcnBtc2cuaD4KLSNpbmNsdWRlIDxkdC1iaW5kaW5ncy9zb2MvengyOTc1MjB2My1pcnEuaD4KLSNpbmNsdWRlIDx1YXBpL2xpbnV4L3NjX2JzcC9ic3BfYXBpLmg+Ci0KLSNpbmNsdWRlICJwY3UtY29tbW9uLmgiCi0KLSNpZiAwCi0KLSNkZWZpbmUgcG1fcmFtX2xvZyhmbXQsIGFyZ3MuLi4pICAgICAgCVwKLXsJXAotCXBtX3ByaW50aygiW1NMUF0gIiBmbXQsICMjYXJncyk7CVwKLX0KLSNlbHNlCi0jZGVmaW5lIHBtX3JhbV9sb2coZm10LCBhcmdzLi4uKSAgICAgIAlcCi17CVwKLQlwcmludGsoS0VSTl9JTkZPICJbU0xQXSAiIGZtdCwgIyNhcmdzKTsJXAotfQotCi0jZW5kaWYKLQotI2RlZmluZSBaWF9JUlFfTlVNCQkJKElSUV9aWDI5NzUyMFYzX1NQSV9OVU0gKyAzMikKLQotI2RlZmluZSBQQ1VfTE9DSwkJcmVnX3NwaW5fbG9jaygpOwotI2RlZmluZSBQQ1VfVU5MT0NLCQlyZWdfc3Bpbl91bmxvY2soKTsKLQotc3RhdGljIHN0cnVjdCB6eF9wY3VfaW50X2luZm8gengyOTc1MjB2M19wY3VfaW50X2luZm9bXSA9IAotewotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfQVBfVElNRVIxX0lOVCwKLQkgCS5naWNfaW5kZXgJCT0gQVBfVElNRVIxX0lOVCwKLQkJLnN0YXR1c19pbmRleAk9IDUxLAotCSAJLndha2VfaW5kZXgJCT0gMCwKLQkgCS5pbnRfbmFtZQkJPSAiYXBfdGltZXIxIiwKLQkgCS5pcnFfdHlwZQkJPSBJUlFfVFlQRV9FREdFX1JJU0lORywKLQkgCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0FQX1RJTUVSMSwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfQVBfVElNRVIyX0lOVCwKLQkgCS5naWNfaW5kZXgJCT0gQVBfVElNRVIyX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSA1MiwJIAkKLQkJLndha2VfaW5kZXggCT0gMSwKLQkgCS5pbnRfbmFtZQkJPSAiYXBfdGltZXIyIiwKLQkgCS5pcnFfdHlwZQkJPSBJUlFfVFlQRV9FREdFX1JJU0lORywKLQkgCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0FQX1RJTUVSMiwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfSUNQX1BTMkFQX0lOVCwKLQkJLmdpY19pbmRleAkJPSBJQ1BfUFMyQVBfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDUzLAkJCi0JCS53YWtlX2luZGV4IAk9IDIsCi0JCS5pbnRfbmFtZQkJPSAiaWNwX3BzX2FwIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0lDUF9QUzJBUCwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfVVNCX1BPV0VSRFdOX1VQX0lOVCwKLQkJLmdpY19pbmRleAkJPSBVU0JfUE9XRVJEV05fVVBfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDYsCQkKLQkJLndha2VfaW5kZXggCT0gMywKLQkJLmludF9uYW1lCQk9ICJ1c2JfdXAiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfRURHRV9SSVNJTkcsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX1VTQl9QT1dFUkRXTl9VUCwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfVVNCX1BPV0VSRFdOX0RPV05fSU5ULAotCQkuZ2ljX2luZGV4CQk9IFVTQl9QT1dFUkRXTl9ET1dOX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSA3LAkJCi0JCS53YWtlX2luZGV4IAk9IDQsCi0JCS5pbnRfbmFtZQkJPSAidXNiX2Rvd24iLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfRURHRV9GQUxMSU5HLAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9VU0JfUE9XRVJEV05fRE9XTiwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfSFNJQ19QT1dFUkRXTl9VUF9JTlQsCi0JCS5naWNfaW5kZXgJCT0gSFNJQ19QT1dFUkRXTl9VUF9JTlQsCi0JIAkuc3RhdHVzX2luZGV4CT0gOCwJCQotCQkud2FrZV9pbmRleCAJPSA1LAotCQkuaW50X25hbWUJCT0gImhzaWNfdXAiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfRURHRV9SSVNJTkcsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0hTSUNfUE9XRVJEV05fVVAsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0hTSUNfUE9XRVJEV05fRE9XTl9JTlQsCi0JCS5naWNfaW5kZXgJCT0gSFNJQ19QT1dFUkRXTl9ET1dOX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSA5LAkJCi0JCS53YWtlX2luZGV4IAk9IDYsCi0JCS5pbnRfbmFtZQkJPSAiaHNpY19kb3duIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0VER0VfRkFMTElORywKLQkJLndsX3R5cGUJCT0gUE1fV0xfRVZFTlRfSFNJQ19QT1dFUkRXTl9ET1dOLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9JQ1BfTTAyQVBfSU5ULAotCQkuZ2ljX2luZGV4CQk9IElDUF9NMDJBUF9JTlQsCi0JIAkuc3RhdHVzX2luZGV4CT0gNTQsCQkKLQkJLndha2VfaW5kZXggCT0gNywKLQkJLmludF9uYW1lCQk9ICJpY3BfbTBfYXAiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfTEVWRUxfSElHSCwKLQkJLndsX3R5cGUJCT0gUE1fV0xfRVZFTlRfSUNQX00wMkFQLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9SVENfQUxBUk1fSU5ULAotCQkuZ2ljX2luZGV4CQk9IFJUQ19BTEFSTV9JTlQsCi0JIAkuc3RhdHVzX2luZGV4CT0gMTIsCQkKLQkJLndha2VfaW5kZXggCT0gOCwKLQkJLmludF9uYW1lCQk9ICJydGNfYWxhcm0iLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfTEVWRUxfTE9XLAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9BTEFSTSwKLQl9LAotCXsKLQkJLnBjdV9pbmRleAkJPSBQQ1VfUlRDX1RJTUVSX0lOVCwKLQkJLmdpY19pbmRleAkJPSBSVENfVElNRVJfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDEzLAkJCi0JCS53YWtlX2luZGV4IAk9IDksCi0JCS5pbnRfbmFtZQkJPSAicnRjX3RpbWVyIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0xPVywKLQkJLndsX3R5cGUJCT0gUE1fV0xfRVZFTlRfUlRDX1RJTUVSLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9LRVlQQURfSU5ULAotCQkuZ2ljX2luZGV4CQk9IEtFWVBBRF9JTlQsCi0JIAkuc3RhdHVzX2luZGV4CT0gMTQsCQkKLQkJLndha2VfaW5kZXggCT0gMTAsCi0JCS5pbnRfbmFtZQkJPSAia3BkIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0VER0VfUklTSU5HLAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9LRVlQQUQsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX1NEMV9EQVRBMV9JTlQsCi0JCS5naWNfaW5kZXgJCT0gU0QxX0RBVEExX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAxNSwJCQotCQkud2FrZV9pbmRleCAJPSAxMSwKLQkJLmludF9uYW1lCQk9ICJzZDFfZDEiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfTEVWRUxfTE9XLAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9TRDFfREFUQTEsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYMF9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVgwX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzMCwJCQotCQkud2FrZV9pbmRleCAJPSAxNCwKLQkJLmludF9uYW1lCQk9ICJleHQwIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDAsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYMV9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVgxX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzMSwJCQotCQkud2FrZV9pbmRleCAJPSAxNSwKLQkJLmludF9uYW1lCQk9ICJleHQxIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDEsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYMl9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVgyX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzMiwJCQotCQkud2FrZV9pbmRleCAJPSAxNiwKLQkJLmludF9uYW1lCQk9ICJleHQyIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDIsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYM19JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVgzX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzMywJCQotCQkud2FrZV9pbmRleCAJPSAxNywKLQkJLmludF9uYW1lCQk9ICJleHQzIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDMsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYNF9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg0X0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzNCwJCQotCQkud2FrZV9pbmRleCAJPSAxOCwKLQkJLmludF9uYW1lCQk9ICJleHQ0IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDQsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYNV9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg1X0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzNSwJCQotCQkud2FrZV9pbmRleCAJPSAxOSwKLQkJLmludF9uYW1lCQk9ICJleHQ1IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDUsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYNl9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg2X0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzNiwJCQotCQkud2FrZV9pbmRleCAJPSAyMCwKLQkJLmludF9uYW1lCQk9ICJleHQ2IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDYsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYN19JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg3X0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzNywJCQotCQkud2FrZV9pbmRleCAJPSAyMSwKLQkJLmludF9uYW1lCQk9ICJleHQ3IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDcsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYOF9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg4SU4xX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzOCwJCQotCQkud2FrZV9pbmRleCAJPSAyMiwKLQkJLmludF9uYW1lCQk9ICJleHQ4IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDgsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0VYOV9JTlQsCi0JCS5naWNfaW5kZXgJCT0gRVg4SU4xX0lOVCwKLQkgCS5zdGF0dXNfaW5kZXgJPSAzOSwKLQkJLndha2VfaW5kZXggCT0gMjMsCi0JCS5pbnRfbmFtZQkJPSAiZXh0OSIsCi0JCS5pcnFfdHlwZQkJPSBJUlFfVFlQRV9MRVZFTF9ISUdILAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9FWFQ5LAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDEwX0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQwLAkJCi0JCS53YWtlX2luZGV4IAk9IDI0LAotCQkuaW50X25hbWUJCT0gImV4dDEwIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDEwLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDExX0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQxLAkJCi0JCS53YWtlX2luZGV4IAk9IDI1LAotCQkuaW50X25hbWUJCT0gImV4dDExIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDExLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDEyX0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQyLAkJCi0JCS53YWtlX2luZGV4IAk9IDI2LAotCQkuaW50X25hbWUJCT0gImV4dDEyIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDEyLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDEzX0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQzLAkJCi0JCS53YWtlX2luZGV4IAk9IDI3LAotCQkuaW50X25hbWUJCT0gImV4dDEzIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDEzLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDE0X0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQ0LAkJCi0JCS53YWtlX2luZGV4IAk9IDI4LAotCQkuaW50X25hbWUJCT0gImV4dDE0IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDE0LAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9FWDE1X0lOVCwKLQkJLmdpY19pbmRleAkJPSBFWDhJTjFfSU5ULAotCSAJLnN0YXR1c19pbmRleAk9IDQ1LAkJCi0JCS53YWtlX2luZGV4IAk9IDI5LAotCQkuaW50X25hbWUJCT0gImV4dDE1IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IFBNX1dMX0VWRU5UX0VYVDE1LAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9TRDBfREFUQTFfSU5ULAotCQkuZ2ljX2luZGV4CQk9IFNEMF9EQVRBMV9JTlQsCi0JIAkuc3RhdHVzX2luZGV4CT0gMiwJCQotCQkud2FrZV9pbmRleCAJPSAzMCwKLQkJLmludF9uYW1lCQk9ICJzZDBfZDEiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfTEVWRUxfTE9XLAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9TRDBfREFUQTEsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0lDUF9QSFkyQVBfSU5ULAotCQkuZ2ljX2luZGV4CQk9IElDUF9QSFkyQVBfSU5ULAotCQkuc3RhdHVzX2luZGV4CT0gNTUsCQkKLQkJLndha2VfaW5kZXggCT0gMzEsCi0JCS5pbnRfbmFtZQkJPSAiaWNwX3BoeV9hcCIsCi0JCS5pcnFfdHlwZQkJPSBJUlFfVFlQRV9MRVZFTF9ISUdILAotCQkud2xfdHlwZQkJPSBQTV9XTF9FVkVOVF9JQ1BfUEhZMkFQLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9HTUFDUEhZX1dBS0VfSU5ULAotCQkuZ2ljX2luZGV4CQk9IEdNQUNQSFlfV0FLRV9JTlQsCi0JCS5zdGF0dXNfaW5kZXgJPSA2MCwJCQotCQkud2FrZV9pbmRleCAJPSAweGZmLAotCQkuaW50X25hbWUJCT0gImdtYWNwaHlfd2FrZSIsCi0JCS5pcnFfdHlwZQkJPSBJUlFfVFlQRV9MRVZFTF9ISUdILAotCQkud2xfdHlwZQkJPSAweGZmLAotCX0sCi0JewotCQkucGN1X2luZGV4CQk9IFBDVV9VQVJUMF9SWERfSU5ULAotCQkuZ2ljX2luZGV4CQk9IFVBUlQwX1JYRF9JTlQsCi0JCS5zdGF0dXNfaW5kZXgJPSA1OSwJCQotCQkud2FrZV9pbmRleCAJPSA0MiwKLQkJLmludF9uYW1lCQk9ICJ1YXJ0MF9yeGQiLAotCQkuaXJxX3R5cGUJCT0gSVJRX1RZUEVfRURHRV9GQUxMSU5HLAotCQkud2xfdHlwZQkJPSAweGZmLAotCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0dNQUNfSU5ULAotCQkuZ2ljX2luZGV4CQk9IEdNQUNfSU5ULAotCQkuc3RhdHVzX2luZGV4CT0gMTYsCQkKLQkJLndha2VfaW5kZXggCT0gMHhmZiwKLQkJLmludF9uYW1lCQk9ICJnbWFjIiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IDB4ZmYsCi0JfSwKLQl7Ci0JCS5wY3VfaW5kZXgJCT0gUENVX0dNQUNQSFlfSU5ULAotCQkuZ2ljX2luZGV4CQk9IEdNQUNQSFlfSU5ULAotCQkuc3RhdHVzX2luZGV4CT0gNjEsCQkKLQkJLndha2VfaW5kZXggCT0gMHhmZiwKLQkJLmludF9uYW1lCQk9ICJnbWFjcGh5IiwKLQkJLmlycV90eXBlCQk9IElSUV9UWVBFX0xFVkVMX0hJR0gsCi0JCS53bF90eXBlCQk9IDB4ZmYsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgenhfcGN1X2dldF9pcnFjaGlwX3N0YXRlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKLQkJCQkgICAgIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgKnZhbCkKLXsKLQlkYXRhID0gZGF0YS0+cGFyZW50X2RhdGE7Ci0KLQlpZiAoZGF0YS0+Y2hpcC0+aXJxX2dldF9pcnFjaGlwX3N0YXRlKQotCQlyZXR1cm4gZGF0YS0+Y2hpcC0+aXJxX2dldF9pcnFjaGlwX3N0YXRlKGRhdGEsIHdoaWNoLCB2YWwpOwotCi0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyBpbnQgenhfcGN1X3NldF9pcnFjaGlwX3N0YXRlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKLQkJCQkgICAgIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgdmFsKQotewotCWRhdGEgPSBkYXRhLT5wYXJlbnRfZGF0YTsKLQotCWlmIChkYXRhLT5jaGlwLT5pcnFfc2V0X2lycWNoaXBfc3RhdGUpCi0JCXJldHVybiBkYXRhLT5jaGlwLT5pcnFfc2V0X2lycWNoaXBfc3RhdGUoZGF0YSwgd2hpY2gsIHZhbCk7Ci0KLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGludCB6eF9wY3Vfbm1pX3NldHVwKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlkYXRhID0gZGF0YS0+cGFyZW50X2RhdGE7Ci0KLQlpZiAoZGF0YS0+Y2hpcC0+aXJxX25taV9zZXR1cCkKLQkJcmV0dXJuIGRhdGEtPmNoaXAtPmlycV9ubWlfc2V0dXAoZGF0YSk7Ci0KLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIHZvaWQgenhfcGN1X25taV90ZWFyZG93bihzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0JZGF0YSA9IGRhdGEtPnBhcmVudF9kYXRhOwotCi0JaWYgKGRhdGEtPmNoaXAtPmlycV9ubWlfdGVhcmRvd24pCi0JCWRhdGEtPmNoaXAtPmlycV9ubWlfdGVhcmRvd24oZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgenhfcGN1X3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQotewotCXBjdV9zZXRfaXJxX3dha2UoZGF0YS0+aHdpcnEsIG9uKTsKLQotLyoJcHJfaW5mbygiaXJxOiVkLCBvbm9mZjolZCIsIGRhdGEtPmh3aXJxLCBvbik7Ki8KLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgenhfcGN1X2VvaV9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXBjdV9jbHJfaXJxX3BlbmRpbmcoZGF0YS0+aHdpcnEpOwotCi0JaXJxX2NoaXBfZW9pX3BhcmVudChkYXRhKTsKLX0KLQotc3RhdGljIGludCB6eF9wY3Vfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQl1bnNpZ25lZCBpbnQgbmV3X3R5cGUgPSB0eXBlOwotCi0JaWYoIXBjdV9zZXRfaXJxX3R5cGUoZGF0YS0+aHdpcnEsIHR5cGUpKQotCQluZXdfdHlwZSA9IElSUV9UWVBFX0xFVkVMX0hJR0g7Ci0KLQlyZXR1cm4gaXJxX2NoaXBfc2V0X3R5cGVfcGFyZW50KGRhdGEsIG5ld190eXBlKTsKLX0KLQotc3RhdGljIGludCB6eF9wY3Vfc2V0X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKLQkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QsIGJvb2wgZm9yY2UpCi17Ci0vKgotCWlmIChkYXRhLT5od2lycSA9PSBJUlFfWlgyOTg1MDFfQVBfVElNRVIxKQotCQlyZXR1cm4gaXJxX2NoaXBfc2V0X2FmZmluaXR5X3BhcmVudChkYXRhLCBjcHVtYXNrX29mKDApLCBmb3JjZSk7IC8vID8/PwotCWVsc2UKLSovCQlyZXR1cm4gaXJxX2NoaXBfc2V0X2FmZmluaXR5X3BhcmVudChkYXRhLCBkZXN0LCBmb3JjZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgenhfcGN1X2NoaXAgPSB7Ci0JLm5hbWUJCQk9ICJQQ1UiLAotCS5pcnFfZW9pCQk9IHp4X3BjdV9lb2lfaXJxLAotCS5pcnFfbWFzawkJPSBpcnFfY2hpcF9tYXNrX3BhcmVudCwKLQkuaXJxX3VubWFzawkJPSBpcnFfY2hpcF91bm1hc2tfcGFyZW50LAotCS5pcnFfc2V0X3dha2UJPSB6eF9wY3Vfc2V0X3dha2UsCi0JLmlycV9zZXRfdHlwZQk9IHp4X3BjdV9zZXRfdHlwZSwKLQkKLQkuaXJxX3NldF9hZmZpbml0eQkJPSB6eF9wY3Vfc2V0X2FmZmluaXR5LAotCS5pcnFfZ2V0X2lycWNoaXBfc3RhdGUJPSB6eF9wY3VfZ2V0X2lycWNoaXBfc3RhdGUsCi0JLmlycV9zZXRfaXJxY2hpcF9zdGF0ZQk9IHp4X3BjdV9zZXRfaXJxY2hpcF9zdGF0ZSwKLQkuaXJxX3NldF92Y3B1X2FmZmluaXR5CT0gaXJxX2NoaXBfc2V0X3ZjcHVfYWZmaW5pdHlfcGFyZW50LAotCS5pcnFfbm1pX3NldHVwCQkJPSB6eF9wY3Vfbm1pX3NldHVwLAotCS5pcnFfbm1pX3RlYXJkb3duCQk9IHp4X3BjdV9ubWlfdGVhcmRvd24sCQotCS5mbGFncwkJCQkJPSBJUlFDSElQX01BU0tfT05fU1VTUEVORCB8IElSUUNISVBfU0VUX1RZUEVfTUFTS0VELAotfTsKLQotc3RhdGljIGludCB6eF9wY3VfZG9tYWluX3RyYW5zbGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKLQkJCQkJc3RydWN0IGlycV9md3NwZWMgKmZ3c3BlYywKLQkJCQkJdW5zaWduZWQgbG9uZyAqaHdpcnEsCi0JCQkJCXVuc2lnbmVkIGludCAqdHlwZSkKLXsKLQlpZiAoaXNfb2Zfbm9kZShmd3NwZWMtPmZ3bm9kZSkpIHsKLQkJaWYgKGZ3c3BlYy0+cGFyYW1fY291bnQgIT0gMykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIE5vIFBQSSBzaG91bGQgcG9pbnQgdG8gdGhpcyBkb21haW4gKi8KLQkJaWYgKGZ3c3BlYy0+cGFyYW1bMF0gIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCSpod2lycSA9IGZ3c3BlYy0+cGFyYW1bMV07Ci0JCSp0eXBlID0gZndzcGVjLT5wYXJhbVsyXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHp4X3BjdV9kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwKLQkJCQkgICAgdW5zaWduZWQgaW50IHZpcnEsCi0JCQkJICAgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMgPSBkYXRhOwotCXN0cnVjdCBpcnFfZndzcGVjIHBhcmVudF9md3NwZWM7Ci0Jc3RydWN0IHp4X3BjdV9kZXYgKnBjdSA9IGRvbWFpbi0+aG9zdF9kYXRhOwotCWlycV9od19udW1iZXJfdCBod2lycTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmIChmd3NwZWMtPnBhcmFtX2NvdW50ICE9IDMpCi0JCXJldHVybiAtRUlOVkFMOwkvKiBOb3QgR0lDIGNvbXBsaWFudCAqLwotCWlmIChmd3NwZWMtPnBhcmFtWzBdICE9IEdJQ19TUEkpCi0JCXJldHVybiAtRUlOVkFMOwkvKiBObyBQUEkgc2hvdWxkIHBvaW50IHRvIHRoaXMgZG9tYWluICovCi0KLQlod2lycSA9IGZ3c3BlYy0+cGFyYW1bMV07Ci0JaWYgKGh3aXJxID49IFpYX0lSUV9OVU0pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewotCQlpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkb21haW4sIHZpcnEgKyBpLCBod2lycSArIGksCi0JCQkJCSAgICAgICZ6eF9wY3VfY2hpcCwKLQkJCQkJICAgICAgKHZvaWQgX19mb3JjZSAqKXBjdS0+dG9wX3JlZ19iYXNlKTsKLQl9Ci0KLQlwYXJlbnRfZndzcGVjID0gKmZ3c3BlYzsKLQlwYXJlbnRfZndzcGVjLmZ3bm9kZSA9IGRvbWFpbi0+cGFyZW50LT5md25vZGU7Ci0JcmV0dXJuIGlycV9kb21haW5fYWxsb2NfaXJxc19wYXJlbnQoZG9tYWluLCB2aXJxLCBucl9pcnFzLAotCQkJCQkgICAgJnBhcmVudF9md3NwZWMpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIHp4X3BjdV9kb21haW5fb3BzID0gewotCS50cmFuc2xhdGUJPSB6eF9wY3VfZG9tYWluX3RyYW5zbGF0ZSwKLQkuYWxsb2MJCT0genhfcGN1X2RvbWFpbl9hbGxvYywKLQkuZnJlZQkJPSBpcnFfZG9tYWluX2ZyZWVfaXJxc19jb21tb24sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB6eF9wY3VfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCi17Ci0Jc3RydWN0IGlycV9kb21haW4gKnBhcmVudF9kb21haW4sICpkb21haW47Ci0Jc3RydWN0IHp4X3BjdV9kZXYgKnBjdTsKLQotCWlmICghcGFyZW50KSB7Ci0JCXByX2VycigiJXBPRjogbm8gcGFyZW50IGZvdW5kXG4iLCBub2RlKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcGFyZW50X2RvbWFpbiA9IGlycV9maW5kX2hvc3QocGFyZW50KTsKLQlpZiAoIXBhcmVudF9kb21haW4pIHsKLQkJcHJfZXJyKCIlcE9GOiB1bmFibGUgdG8gb2J0YWluIHBhcmVudCBkb21haW5cbiIsIG5vZGUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCXBjdSA9ICZwY3VfZGV2OwotCXBjdS0+bnAJCQkJPSBub2RlOwotCXBjdS0+dG9wX3JlZ19iYXNlCT0gb2ZfaW9tYXAobm9kZSwgMCk7Ci0JV0FSTighcGN1LT50b3BfcmVnX2Jhc2UsICJ1bmFibGUgdG8gbWFwIHRvcCBwY3UgcmVnaXN0ZXJzXG4iKTsKLQotCXBjdS0+aW50X2luZm8gPSB6eDI5NzUyMHYzX3BjdV9pbnRfaW5mbzsKLQlwY3UtPmludF9jb3VudCA9IEFSUkFZX1NJWkUoengyOTc1MjB2M19wY3VfaW50X2luZm8pOwotCi0JcGN1X2luaXQoKTsKLQotCWRvbWFpbiA9IGlycV9kb21haW5fYWRkX2hpZXJhcmNoeShwYXJlbnRfZG9tYWluLCAwLCBaWF9JUlFfTlVNLAotCQkJCQkgIG5vZGUsICZ6eF9wY3VfZG9tYWluX29wcywKLQkJCQkJICBwY3UpOwotCWlmICghZG9tYWluKSB7Ci0JCXByX2VycigiJXBPRjogZmFpbGVkIHRvIGFsbG9jYXRlZCBkb21haW5cbiIsIG5vZGUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLS8vCXNldF9zbXBfY3Jvc3NfY2FsbCgpOwotCXBtX3BjdV9pbml0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotSVJRQ0hJUF9ERUNMQVJFKHp4Mjk3NTIwdjNfcGN1LCAienRlLHp4Mjk3NTIwdjMtcGN1IiwgenhfcGN1X2luaXQpOwotCi0vKiBwY3UgZGVidWcgKi8KLSNpZmRlZiBDT05GSUdfUE0KLSNkZWZpbmUgUENVX1RPUAkJCQkJCShwY3VfZGV2LnRvcF9yZWdfYmFzZSkKLQotI2RlZmluZSBBUk1fQVBfQ09ORklHX1JFRyAgICAgICAgICAgKFBDVV9UT1AgKyAweDApCi0jZGVmaW5lIEFSTV9BUF9TTEVFUF9USU1FX1JFRyAgICAgICAoUENVX1RPUCArIDQqMHgzQykKLSNkZWZpbmUgQVBfSU5UX1dBS0VfRElTX1JFRyAgICAgICAgCShQQ1VfVE9QICsgNCoweEQpCi0jZGVmaW5lIENPUkVfU1dJVENIX0NPTkZJR19SRUcgICAgCShQQ1VfVE9QICsgNCoweDJiKQotCi0jZGVmaW5lIE0wX0lOVF9XQUtFX0RJU19SRUcgICAgICAgIAkoUENVX1RPUCArIDQqMHhFKQotI2RlZmluZSBQQ1VfSU5UX1JFQURPVVRfUkVHMQkJKFBDVV9UT1AgKyA0KjB4MUVCKQotI2RlZmluZSBQQ1VfSU5UX1JFQURPVVRfUkVHMgkJKFBDVV9UT1AgKyA0KjB4MUVDKQotI2RlZmluZSBQQ1VfSU5UX1JFQURPVVRfUkVHMwkJKFBDVV9UT1AgKyA0KjB4MUVEKQotCi0KLS8qQVJNX0FQX0NPTkZJR19SRUcqLwotI2RlZmluZQlQQ1VfU0xFRVBfTU9ERQkJCQkoMVUgPDwgMCkKLSNkZWZpbmUJUENVX1BPV0VST0ZGX01PREUJCQkoMVUgPDwgMSkKLSNkZWZpbmUJUENVX0wyX0NMS19HQVRFCQkJCSgxVSA8PCAyKQkJLyoxLWNhbiB0dXJuIG9mZiovCi0jZGVmaW5lIFBDVV9TTEVFUF8yTTAgICAgICAgICAgICAgICAoMVUgPDwgMykKLSNkZWZpbmUJUENVX1NMRUVQX0RPTkVfQllQQVNTCQkoMVUgPDwgNCkJIAkKLSNkZWZpbmUJUENVX1NXX0NPTkZJR19NQVNLCQkJKDFVIDw8IDUpCSAJLyogPz8/Pz8gICovCi0KLSNkZWZpbmUJUENVX01PREVfTUFTSwkJCQkoMHgzVSA8PCAwKQotCi0vKkFSTV9BUF9TTEVFUF9USU1FX1JFRyovCi0jZGVmaW5lCVBDVV9BUF9TTEVFUF9USU1FX0RJUyAgICAgICAoMVUgPDwgMzEpCi0KLQotCi0vKiBsb3cgcG93ZXIgZnVuY3Rpb24gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgcG1fZ2V0X3dha2Vzb3VyY2Uodm9pZCk7Ci0KLS8qKgotICogY2xlYXIgcGN1IHNsZWVwIG1vZGUuCi0gKiAKLSAqLwotdm9pZCBwbV9jbGVhcl9wY3Uodm9pZCkKLXsKLQl6eF9jbHJfcmVnKEFSTV9BUF9DT05GSUdfUkVHLCBQQ1VfTU9ERV9NQVNLKTsKLX0KLQotdm9pZCBwbV9wY3VfaW5pdCh2b2lkKQotewotCXp4X2Nscl9yZWcoQVJNX0FQX0NPTkZJR19SRUcsIFBDVV9NT0RFX01BU0spOwotCXp4X3NldF9yZWcoQVJNX0FQX0NPTkZJR19SRUcsIFBDVV9MMl9DTEtfR0FURSk7Ci0Jenhfd3JpdGVfcmVnKEFQX0lOVF9XQUtFX0RJU19SRUcsIH4ocG1fZ2V0X3dha2Vzb3VyY2UoKSkpOwotfQotCi12b2lkIHp4X2FwbWdjbGtlbl9zZXQodW5zaWduZWQgZW4pCi17Ci0JdW5zaWduZWQgdG1wOwotCWlmKGVuKXsKLQkJLy9zZXQgcHNfY2xrX3N3aXRjaD0xCi0JCXRtcCA9IHp4X3JlYWRfcmVnKENPUkVfU1dJVENIX0NPTkZJR19SRUcpOwotCQl0bXAgfD0gKDB4MTw8Mik7Ci0JCXp4X3dyaXRlX3JlZyhDT1JFX1NXSVRDSF9DT05GSUdfUkVHLCB0bXApOwotCX0gZWxzZXsKLQkJLy9zZXQgcHNfY2xrX3N3aXRjaD0wCi0JCXRtcCA9IHp4X3JlYWRfcmVnKENPUkVfU1dJVENIX0NPTkZJR19SRUcpOwotCQl0bXAgJj0gfigweDE8PDIpOwotCQl6eF93cml0ZV9yZWcoQ09SRV9TV0lUQ0hfQ09ORklHX1JFRywgdG1wKTsKLQl9Ci19Ci0KLQotLyoqCi0gKiBjb25maWcgcGN1IGJlZm9yZSBwb3dlcm9mZgotICogCi0gKi8KLXZvaWQgcG1fc2V0X3BjdV9wb3dlcm9mZih1MzIgc2xlZXBfdGltZSkKLXsKLQl6eF9zZXRfcmVnKEFSTV9BUF9DT05GSUdfUkVHLCBQQ1VfUE9XRVJPRkZfTU9ERSk7Ci0Jenhfd3JpdGVfcmVnKEFSTV9BUF9TTEVFUF9USU1FX1JFRywgc2xlZXBfdGltZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBtX3NldF9wY3VfcG93ZXJvZmYpOwotCi0KLS8qKgotICogY29uZmlnIHBjdSBiZWZvcmUgc2xlZXAKLSAqIAotICovCi12b2lkIHBtX3NldF9wY3Vfc2xlZXAodTMyIHNsZWVwX3RpbWUpCi17Ci0Jenhfc2V0X3JlZyhBUk1fQVBfQ09ORklHX1JFRywgUENVX1NMRUVQX01PREUpOwotCXp4X3dyaXRlX3JlZyhBUk1fQVBfU0xFRVBfVElNRV9SRUcsIHNsZWVwX3RpbWUpOwotfQotCi0vKioKLSAqIGdldCB3YWtldXAgc2V0dGluZy4KLSAqIAotICovCi11bnNpZ25lZCBpbnQgcGN1X2dldF93YWtldXBfc2V0dGluZyh2b2lkKQotewotCXJldHVybiB6eF9yZWFkX3JlZyhBUF9JTlRfV0FLRV9ESVNfUkVHKTsKLX0KLS8qKgotICogc2V0IHdha2V1cCBlbmFibGUgYnkgZ2ljLgotICogCi0gKiAKLSAqLwotdW5zaWduZWQgaW50ICBnaWNfd2FrZV9lbmFibGVbM109Ci17Ci0JKDE8PElDUF9QUzJBUF9JTlQpIHwoMTw8SUNQX00wMkFQX0lOVCkgfCAoMTw8QVBfVElNRVIxX0lOVCkgfCAoMTw8RVg4SU4xX0lOVCksCi0JMCwgCi0JMAotfTsKLQotZXh0ZXJuIHZvaWQgc2hvd19pY3Bfc3RhdGUoVF9ScE1zZ19Db3JlSUQgYWN0b3JJRCk7Ci12b2lkIHBtX2dldF93YWtlX2NhdXNlKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50CWludF9zdGF0dXNbMl07Ci0JaW50IAkJCWkgPSAwOwotCWludCAJCQlpbmRleF9mb3VuZCA9IDB4ZmY7Ci0JdW5zaWduZWQgaW50CXBjdV93YWtlX3NldHRpbmdbMl07Ci0JCQotCS8qIHdoZW4gd2FrZSB1cCwgdGhlIGxldmVsIGlzIGhpZ2gmdGhlIHZhbHVlIGlzIDAqLwotCWludF9zdGF0dXNbMF0gPSB6eF9yZWFkX3JlZyhQQ1VfSU5UX1JFQURPVVRfUkVHMSk7Ci0JaW50X3N0YXR1c1sxXSA9IHp4X3JlYWRfcmVnKFBDVV9JTlRfUkVBRE9VVF9SRUcyKTsKLQotCXBjdV93YWtlX3NldHRpbmdbMF0gPSB6eF9yZWFkX3JlZyhBUF9JTlRfV0FLRV9ESVNfUkVHKTsKLQlwY3Vfd2FrZV9zZXR0aW5nWzFdID0genhfcmVhZF9yZWcoTTBfSU5UX1dBS0VfRElTX1JFRyk7Ci0KLQlmb3IoaT0wOyBpPEFSUkFZX1NJWkUoengyOTc1MjB2M19wY3VfaW50X2luZm8pOyBpKyspCi0JewotCQlpZiAoengyOTc1MjB2M19wY3VfaW50X2luZm9baV0ud2FrZV9pbmRleCA9PSAweGZmKQotCQkJY29udGludWU7Ci0KLQkJaWYocGN1X3dha2Vfc2V0dGluZ1swXSZCSVQoengyOTc1MjB2M19wY3VfaW50X2luZm9baV0ud2FrZV9pbmRleCkpCQotCQkJY29udGludWU7Ci0KLQkJaWYoaW50X3N0YXR1c1t6eDI5NzUyMHYzX3BjdV9pbnRfaW5mb1tpXS5zdGF0dXNfaW5kZXgvMzJdJigxPDwoengyOTc1MjB2M19wY3VfaW50X2luZm9baV0uc3RhdHVzX2luZGV4JTMyKSkpCi0JCQljb250aW51ZTsKLQotCQlpbmRleF9mb3VuZCA9IGk7Ci0JCWJyZWFrOwotCX0KLQkKLQlpZihpbmRleF9mb3VuZCAhPSAweGZmKQotCXsKLQkJcG1fcmFtX2xvZygiIHdha2U6ICVkICBbJXNdXG4iLCB6eDI5NzUyMHYzX3BjdV9pbnRfaW5mb1tpbmRleF9mb3VuZF0uZ2ljX2luZGV4LCB6eDI5NzUyMHYzX3BjdV9pbnRfaW5mb1tpbmRleF9mb3VuZF0uaW50X25hbWUpOwotCi0JCWlmKHp4Mjk3NTIwdjNfcGN1X2ludF9pbmZvW2luZGV4X2ZvdW5kXS5naWNfaW5kZXggPT1JQ1BfUFMyQVBfSU5UKSB7Ci0JCQlzaG93X2ljcF9zdGF0ZShDT1JFX1BTMCk7Ci0JCX0KLQkJcG1fcmFtX2xvZygiIHBjdSBpbnQgc3RhdHVzOjB4JXggMHgleFxuIixpbnRfc3RhdHVzWzBdLCBpbnRfc3RhdHVzWzFdKTsKLQotCQlwbV93bF9zZXRfZXZlbnQocGN1X2dldF93bF9pbmRleF9ieV9naWMoengyOTc1MjB2M19wY3VfaW50X2luZm9baW5kZXhfZm91bmRdLmdpY19pbmRleCkpOwotCX0KLQllbHNlCi0JewotCQlwbV9yYW1fbG9nKCIgd2FrZSBhYm5vcm1hbFxuIik7Ci0JCXBtX3JhbV9sb2coIiBwY3UgaW50IHN0YXR1czoweCV4IDB4JXhcbiIsaW50X3N0YXR1c1swXSwgaW50X3N0YXR1c1sxXSk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHdha2V1cF9zb3VyY2UgKnp4X21haW5fd3M7Ci1zdGF0aWMgaW50IHp4X3BjdV9wbV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKnB0cikKLXsKLQlzd2l0Y2ggKGFjdGlvbikgewotCi0JY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCV9fcG1fd2FrZXVwX2V2ZW50KHp4X21haW5fd3MsIDEwMDApOwkJCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXN0YXRpYyBpbnQgcGN1X3BtX3N1c3BlbmQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjdV9wbV9yZXN1bWUodm9pZCkKLXsKLS8vCXBjdV9nZXRfd2FrZV9jYXVzZSgpOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c2NvcmVfb3BzIHBjdV9wbV9zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZCA9IHBjdV9wbV9zdXNwZW5kLAotCS5yZXN1bWUgPSBwY3VfcG1fcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBwY3VfcG1faW5pdCh2b2lkKQotewotCXp4X21haW5fd3MgPSB3YWtldXBfc291cmNlX3JlZ2lzdGVyKE5VTEwsICJ6eF9tYWluIik7Ci0JaWYgKCF6eF9tYWluX3dzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBtX25vdGlmaWVyKHp4X3BjdV9wbV9jYWxsYmFjaywgMCk7Ci0KLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmcGN1X3BtX3N5c2NvcmVfb3BzKTsKLQlyZXR1cm4gMDsKLX0KLWNvcmVfaW5pdGNhbGwocGN1X3BtX2luaXQpOwotI2VuZGlmCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBleHRpbnRfOGluMQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RydWN0IGV4dDhpbjFfaW5mbyB7Ci0Jc3RydWN0IGlycV9kb21haW4gICAqZG9tYWluOwotCXN0cnVjdCByZWdtYXAgCQkqcmVnbWFwOwotCWludCAgICAgICAgICAgICAgICAgcGFyZW50X2lycTsKLQkKLX07Ci0KLXN0cnVjdCBleHQ4aW4xX2luZm8gZXh0OGluMV9kZXYgPSB7MH07Ci0KLS8qCi0gKiByZXR1cm4gZXh0ZXJuYWwgaW50ZXJydXB0IG51bWJlciBmcm9tIGV4OC1leDE1LAotICogcmV0dXJuIHZhbHVlIGlzIDAtNwotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBjdV9nZXRfOGluMV9pbnRfc291cmNlKHZvaWQpCi17ICAKLQl1bnNpZ25lZCBpbnQgdmVjdG9yXzhpbjEgPSAwOwotIAotCXZlY3Rvcl84aW4xID0genhfcmVhZF9yZWcocGN1X2Rldi50b3BfcmVnX2Jhc2UrMHgxMkMpOwkgCi0JCi0JcmV0dXJuIAkodmVjdG9yXzhpbjEmMHg3KTsKLX0KLSAKLQotLypleHRlcm5hbCBpbnQgOC0xNSBuZWVkIGV4dHJhIGNsZWFyKi8KLXN0YXRpYyB2b2lkIHBjdV9pbnRfY2xlYXJfOGluMSh1bnNpZ25lZCBpbnQgcGN1X2luZGV4KQotewkKLQl1bnNpZ25lZCBpbnQgdmVjdG9yPTA7Ci0JCi0JaWYgKCAocGN1X2luZGV4ID49IFBDVV9FWDhfSU5UKSYmKHBjdV9pbmRleCA8PSBQQ1VfRVgxNV9JTlQpICkKLQl7Ci0JCS8qCi0JCSAqaW4gNzUxMCBwbGF0Zm9ybSwgOGluMSBpbnRlcnJ1cHQgd291bGQgYmUgdXNlZCBieSBkaWZmZXJlbnQgY29yZXMuCi0JCSAqd2hlbiBhbnkgY29yZSBpbnN0YWxscyBhIG5ldyA4aW4xIGludGVycnVwdCwgYW5vdGhlciBjb3JlIG1heSBiZSAKLQkJICogcmVzcG9uZGluZyBhbm90aGVyIDhpbjEgaW50ZXJydXB0LCBzbyAgOGluMSBpbnRlcnJ1cHQgc2hvdWxkbid0IGJlIAotCQkgKmNsZWFyZWQuIGluIHRoaXMgY2FzZSwgbm90aGluZyB0byBiZSBkb25lLiBidXQgYSBuZXcgcHJvYmxlbSBjb21lcywKLQkJICogdGhlIGNvcmUgaW5zdGFsbCBuZXcgIDhpbjEgaW50ZXJydXB0IHdpbGwgcmVjZWl2ZSBhIGZha2UgaW50ZXJydXB0LgotCQkgKi8KLQkJdmVjdG9yID0gcGN1X2dldF84aW4xX2ludF9zb3VyY2UoKTsKLQkJaWYgKHBjdV9pbmRleCAhPSAodmVjdG9yICsgUENVX0VYOF9JTlQpICkKLQkJCXJldHVybjsKLQotCQlQQ1VfTE9DSwotICAgCQl6eF93cml0ZV9yZWcocGN1X2Rldi50b3BfcmVnX2Jhc2UrMHgxMjgsIDB4MSk7Ci0JCVBDVV9VTkxPQ0sKLQotCQlwY3VfaW50X2NsZWFyKHBjdV9pbmRleCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBleHQ4aW4xX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSl7fQotc3RhdGljIHZvaWQgZXh0OGluMV9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKXt9Ci1zdGF0aWMgdm9pZCBleHQ4aW4xX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSl7fQotc3RhdGljIHZvaWQgZXh0OGluMV9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSl7fQotc3RhdGljIGludCBleHQ4aW4xX2lycV9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKLXsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGN1X3NldF9pcnFfd2FrZV9ieV9wY3UoZGF0YS0+aHdpcnEgKyBQQ1VfRVg4X0lOVCwgb24pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0OGluMV9pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGN1X2ludF9zZXRfdHlwZShkYXRhLT5od2lycSArIFBDVV9FWDhfSU5ULCB0eXBlKTsKLQotCXBjdV9pbnRfY2xlYXJfOGluMShkYXRhLT5od2lycSArIFBDVV9FWDhfSU5UKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGlycV9jaGlwIGV4dDhpbjFfaXJxX2NoaXAgPQotewotICAgIC5uYW1lICAgICAgICAgICAJCT0gImV4dDhpbjEiLAotCi0JLmlycV9zZXRfd2FrZQkJCT0gZXh0OGluMV9pcnFfc2V0X3dha2UsCi0JLmlycV9zZXRfdHlwZQkJCT0gZXh0OGluMV9pcnFfc2V0X3R5cGUsCi0JLmlycV9tYXNrCQkJCT0gZXh0OGluMV9pcnFfbWFzaywKLQkuaXJxX3VubWFzawkJCQk9IGV4dDhpbjFfaXJxX3VubWFzaywKLQkuaXJxX2J1c19sb2NrCQkJPSBleHQ4aW4xX2lycV9sb2NrLAotCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gZXh0OGluMV9pcnFfc3luY191bmxvY2ssCi19OwotCi1zdGF0aWMgdm9pZCBleHQ4aW4xX2hhbmRsZV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBleHQ4aW4xX2luZm8gKmRhdGEgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOwotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwotCWludCB2aXJxOwotCWludCBod2lycSwgbmV3X2h3aXJxOwotCi0JY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7Ci0gICAKLSAgICBod2lycSA9IHBjdV9nZXRfOGluMV9pbnRfc291cmNlKCk7Ci0KLQl3aGlsZSgxKSB7Ci0JCXBjdV9pbnRfY2xlYXJfOGluMShod2lycSArIFBDVV9FWDhfSU5UKTsKLQotCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyhkYXRhLT5kb21haW4sIGh3aXJxKTsKLQkJaWYgKHZpcnEgPiAwKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwotCi0JCW5ld19od2lycSA9IHBjdV9nZXRfOGluMV9pbnRfc291cmNlKCk7Ci0gICAgICAgIGlmIChod2lycSA9PSBuZXdfaHdpcnEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaHdpcnEgPSBuZXdfaHdpcnE7Ci0JfQotCi0JY2hhaW5lZF9pcnFfZXhpdChjaGlwLCBkZXNjKTsKLX0KLQotZXh0ZXJuIHZvaWQgbWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKLWV4dGVybiB2b2lkIHVubWFza19pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKLXN0YXRpYyBpbnQgZXh0OGluMV9pcnFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQl1bm1hc2tfaXJxKGlycV90b19kZXNjKGV4dDhpbjFfZGV2LnBhcmVudF9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGV4dDhpbjFfaXJxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCW1hc2tfaXJxKGlycV90b19kZXNjKGV4dDhpbjFfZGV2LnBhcmVudF9pcnEpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHp4X2V4dDhpbjFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfbnA7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBleHQ4aW4xX2luZm8gKmRhdGEgPSAmZXh0OGluMV9kZXY7Ci0JaW50IGk7Ci0KLQlwYXJlbnRfbnAgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicGFyZW50LXN5c2NvbiIsIDApOwotCWlmICghcGFyZW50X25wKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBwYXJlbnQtc3lzY29uXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCQotCXJlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChwYXJlbnRfbnApOwotCWlmIChJU19FUlIocmVnbWFwKSkgewotCQlvZl9ub2RlX3B1dChwYXJlbnRfbnApOwotCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOwotCX0JCi0JZGF0YS0+cmVnbWFwID0gcmVnbWFwOwotCi0JZGF0YS0+cGFyZW50X2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGRhdGEtPnBhcmVudF9pcnEgPD0gMCkKLQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0KLQlkYXRhLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobnAsIDgsICZpcnFfZG9tYWluX3NpbXBsZV9vcHMsIE5VTEwpOwotCWlmICghZGF0YS0+ZG9tYWluKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWZvciAoaSA9IEVYOF9JTlQ7IGkgPD0gRVgxNV9JTlQ7IGkrKykgewotCQlpbnQgdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhkYXRhLT5kb21haW4sIGkpOwotCi0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmZXh0OGluMV9pcnFfY2hpcCwKLQkJCQkJIGhhbmRsZV9zaW1wbGVfaXJxKTsKLQkJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgZGF0YSk7Ci0JfQotCi0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoZGF0YS0+cGFyZW50X2lycSwKLQkJCQkJIGV4dDhpbjFfaGFuZGxlX2lycSwgZGF0YSk7Ci0JZW5hYmxlX2lycV93YWtlKGRhdGEtPnBhcmVudF9pcnEpOwotCi0JcHJfaW5mbygienhfZXh0OGluMSBpbml0IE9LLiBcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHp4X2V4dDhpbjFfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInp0ZSx6eDI5NzUyMHYzLWV4dDhpbjEiIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZXh0OGluMV9pcnFfcG1fb3BzID0gewotCS5yZXN1bWUgPSBleHQ4aW4xX2lycV9yZXN1bWUsCi0JLnN1c3BlbmQgPSBleHQ4aW4xX2lycV9zdXNwZW5kLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgenhfZXh0OGluMV9kcml2ZXIgPSB7Ci0JLnByb2JlID0genhfZXh0OGluMV9wcm9iZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ6eF9leHQ4aW4xX2RydiIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IHp4X2V4dDhpbjFfbWF0Y2gsCi0JCS5wbSA9ICZleHQ4aW4xX2lycV9wbV9vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHp4X2V4dDhpbjFfZHJpdmVyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ6eF9leHQ4aW4xX2RyaXZlcik7Ci19Ci1jb3JlX2luaXRjYWxsKHp4X2V4dDhpbjFfZHJpdmVyX2luaXQpOwotCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvc29jL3NjL3JwbXNnL3p4MjlfaWNwLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvc29jL3NjL3JwbXNnL3p4MjlfaWNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFhZTQyYTIuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9kcml2ZXJzL3NvYy9zYy9ycG1zZy96eDI5X2ljcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2Mvc2MvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc29jL3NjL3NwaW5sb2NrLmg+Ci0KLSNpbmNsdWRlICJpY3BfZGV2LmgiCi0jaW5jbHVkZSAiengyOV9pY3AuaCIKLSNpbmNsdWRlICJpY3BfcnBtc2cuaCIKLQotc3RhdGljIGljcF9jYWxsYmFja19mbglfaWNwX2ZuOwotc3RhdGljIFRfSGFsSWNwX1JlZyAqaWNwX2FwMm0wX3JlZzsKLXN0YXRpYyBUX0hhbEljcF9SZWcgKmljcF9hcDJwc19yZWc7Ci0KLXN0YXRpYyBpbmxpbmUgVF9IYWxJY3BfUmVnICppY3BfZ2V0X3JlZyhUX1pEcnZScE1zZ19BY3RvcklEIGFjdG9yX2lkKQotewotCWlmIChDT1JFX00wID09IGFjdG9yX2lkICkKLQkJcmV0dXJuIGljcF9hcDJtMF9yZWc7Ci0JZWxzZSBpZiAoQ09SRV9QUzAgPT0gYWN0b3JfaWQgKQotCQlyZXR1cm4gaWNwX2FwMnBzX3JlZzsKLQllbHNlCi0JCUJVRygpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBGdW5jdGlvbjogaWNwX3NldF9pbnQKLSogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBpY3AgaW50ZXJydXB0IHRvIGluZm9ybSByZW1vdGUgY3B1OwotKiBQYXJhbWV0ZXJzOgotKiAgIElucHV0OgotICAgICAgICAgICBhY3RvcklEOiBpZCBvZiByZW1vdGUgY3B1Ci0gICAgICAgICAgIGNoSUQ6IGlkIG9mIGNoYW5uZWwKLSogICBPdXRwdXQ6Tm9uZQotKgotKiBSZXR1cm5zOk5vbmUKLSoKLSoKLSogT3RoZXJzOgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGljcF9zZXRfaW50KFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCwgVF9aRHJ2UnBNc2dfQ2hJRCBjaElEKQotewotCVRfSGFsSWNwX1JlZyAqaWNwX3JlZzsKLQotICAgIGlmICgoYWN0b3JJRCA+PSBDT1JFX01BWElEKSB8fCAoY2hJRCA+PSBDSEFOTkVMX01BWElEKGFjdG9ySUQpKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlpY3BfcmVnID0gaWNwX2dldF9yZWcoYWN0b3JJRCk7Ci0KLSAgICBpZihjaElEPDMyKQotCQlpY3BfcmVnLT5jb250cm9sLmxvd193b3JkCT0gKDE8PGNoSUQpOwotICAgIGVsc2UKLQkJaWNwX3JlZy0+Y29udHJvbC5oaWdoX3dvcmQJPSAoMTw8KGNoSUQtMzIpKTsKLQotCXJldHVybiAwOwotfQotICAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uOiBpY3BfY2xlYXJfaW50Ci0qIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGNsZWFyIGljcCBpbnRlcnJ1cHQgZnJvbSByZW1vdGUgY3B1OwotKiBQYXJhbWV0ZXJzOgotKiAgIElucHV0OgotICAgICAgICAgICBhY3RvcklEOiBpZCBvZiByZW1vdGUgY3B1Ci0gICAgICAgICAgIGNoSUQ6IGlkIG9mIGNoYW5uZWwKLSogICBPdXRwdXQ6Tm9uZQotKgotKiBSZXR1cm5zOk5vbmUKLSoKLSoKLSogT3RoZXJzOgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpY3BfY2xlYXJfaW50KFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCwgVF9aRHJ2UnBNc2dfQ2hJRCBjaElEKQotewotCVRfSGFsSWNwX1JlZyAqaWNwX3JlZyA9IGljcF9nZXRfcmVnKGFjdG9ySUQpOwotCi0gICAgaWYoY2hJRDwzMikKLSAgICAgICAgaWNwX3JlZy0+Y2xlYXIubG93X3dvcmQgID0gKDE8PGNoSUQpOwotICAgIGVsc2UKLSAgICAgICAJaWNwX3JlZy0+Y2xlYXIuaGlnaF93b3JkID0gKDE8PChjaElELTMyKSkgOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBGdW5jdGlvbjogaWNwX2dldF9pbnQKLSogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZ2V0IGljcCBpbnRlcnJ1cHQgZnJvbSByZW1vdGUgY3B1OwotKiBQYXJhbWV0ZXJzOgotKiAgIElucHV0OgotKiAgICAgICAgICAgYWN0b3JJRDogaWQgb2YgcmVtb3RlIGNwdQotKiAgICAgICAgICAgY2hJRDogaWQgb2YgY2hhbm5lbAotKiAgIE91dHB1dDpOb25lCi0qCi0qIFJldHVybnM6Tm9uZQotKgotKgotKiBPdGhlcnM6Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVRfSGFsSWNwX0R3b3JkIGljcF9nZXRfaW50KFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCkKLXsKLQlUX0hhbEljcF9Ed29yZCBJY3BTdGF0ZTsKLQlUX0hhbEljcF9SZWcgKmljcF9yZWc7Ci0KLSAgICBpZiAoYWN0b3JJRCA+PSBDT1JFX01BWElEKQotICAgIHsKLQkJSWNwU3RhdGUuaGlnaF93b3JkCT0gMDsKLQkJSWNwU3RhdGUubG93X3dvcmQJPSAwOwotICAgIAotICAgICAgICByZXR1cm4gSWNwU3RhdGU7Ci0gICAgfQotCi0JaWNwX3JlZyA9IGljcF9nZXRfcmVnKGFjdG9ySUQpOwotCQotCUljcFN0YXRlLmhpZ2hfd29yZCAJPSBpY3BfcmVnLT5zdGF0ZS5oaWdoX3dvcmQ7Ci0JSWNwU3RhdGUubG93X3dvcmQgCT0gaWNwX3JlZy0+c3RhdGUubG93X3dvcmQ7Ci0JCi0JcmV0dXJuIEljcFN0YXRlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBGdW5jdGlvbjogaWNwX2dldF9pbnRfc3RhdGUKLSogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZ2V0IHRoZSBzdGF0ZSBvZiBpY3AgaW50ZXJydXB0dGluZyAgb2YgcmVtb3RlIGNwdTsKLSogUGFyYW1ldGVyczoKLSogICBJbnB1dDoKLSAgICAgICAgICAgYWN0b3JJRDogaWQgb2YgcmVtb3RlIGNwdQotICAgICAgICAgICBjaElEOiBpZCBvZiBjaGFubmVsCi0qICAgT3V0cHV0Ok5vbmUKLSoKLSogUmV0dXJuczpOb25lCi0qCi0qCi0qIE90aGVyczoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBpY3BfZ2V0X2ludF9zdGF0ZShUX1pEcnZScE1zZ19BY3RvcklEIGFjdG9ySUQsIFRfWkRydlJwTXNnX0NoSUQgY2hJRCkKLXsKLQlUX0hhbEljcF9SZWcgKmljcF9yZWc7Ci0KLQlpY3BfcmVnID0gaWNwX2dldF9yZWcoYWN0b3JJRCk7Ci0KLQlpZihjaElEPDMyKQotCXsKLQkJaWYoaWNwX3JlZy0+aW5fc3RhdGUubG93X3dvcmQgJiAoMHgxPDxjaElEKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQllbHNlCi0JewotCQlpZihpY3BfcmVnLT5pbl9zdGF0ZS5oaWdoX3dvcmQgJiAoMHgxPDwoY2hJRC0zMikpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRnVuY3Rpb246IGljcF9tYXNrX2ludAotKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBNYXNrIGludGVycnVwdCBvZiBjaGFubmVsOwotKiBQYXJhbWV0ZXJzOgotKiAgIElucHV0OgotKiAgIE91dHB1dDoKLSoKLSogUmV0dXJuczogIE5PTkUKLSoKLSoKLSogT3RoZXJzOgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGljcF9tYXNrX2ludChUX1pEcnZScE1zZ19BY3RvcklEIGFjdG9ySUQsIFRfWkRydlJwTXNnX0NoSUQgY2hJRCkKLXsKLQlUX0hhbEljcF9SZWcgKmljcF9yZWc7Ci0KLSAgICBpZiAoKGFjdG9ySUQgPj0gQ09SRV9NQVhJRCkgfHwgKGNoSUQgPj0gQ0hBTk5FTF9NQVhJRChhY3RvcklEKSkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOwotCi0JaWNwX3JlZyA9IGljcF9nZXRfcmVnKGFjdG9ySUQpOwotCi0gICAgaWYoY2hJRDwzMikKLSAgICAgICAgaWNwX3JlZy0+bWFzay5sb3dfd29yZCAgfD0gKDB4MTw8Y2hJRCk7Ci0gICAgZWxzZQotICAgICAgICBpY3BfcmVnLT5tYXNrLmhpZ2hfd29yZCB8PSAoMHgxPDwoY2hJRC0zMikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uOiBpY3BfdW5tYXNrX2ludAotKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB1bm1hc2sgaW50ZXJydXB0IG9mIGNoYW5uZWw7Ci0qIFBhcmFtZXRlcnM6Ci0qICAgSW5wdXQ6Ci0qICAgT3V0cHV0OgotKgotKiBSZXR1cm5zOgotKiAgICAgICAgICAgIE5PTkUKLSoKLSoKLSogT3RoZXJzOgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGljcF91bm1hc2tfaW50KFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCwgVF9aRHJ2UnBNc2dfQ2hJRCBjaElEKQotewotCVRfSGFsSWNwX1JlZyAqaWNwX3JlZzsKLQotICAgIGlmICgoYWN0b3JJRCA+PSBDT1JFX01BWElEKSB8fCAoY2hJRCA+PSBDSEFOTkVMX01BWElEKGFjdG9ySUQpKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlpY3BfcmVnID0gaWNwX2dldF9yZWcoYWN0b3JJRCk7Ci0KLQlpZihjaElEIDwgMzIpCi0JCWljcF9yZWctPm1hc2subG93X3dvcmQgICY9IH4oMHgxPDxjaElEKTsKLSAgICBlbHNlCi0JCWljcF9yZWctPm1hc2suaGlnaF93b3JkICY9IH4oMHgxPDwoY2hJRC0zMikpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpY3BfaW50X2NvdW50ID0gMDsKLSNpZmRlZiBDT05GSUdfWlgyOV9XQVRDSERPRwotZXh0ZXJuIHZvaWQgenhfd2R0X2ljcF93YWtlKHZvaWQpOwotI2VuZGlmCi1pcnFyZXR1cm5fdCBpY3BfaXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0JaWNwX21zZwlfaWNwX21zZzsJCi0JVF9IYWxJY3BfRHdvcmQgSWNwU3RhdGU7CQotCXVuc2lnbmVkIGludCBpOwotCi0JX2ljcF9tc2cuc3JjX2lkID0gKHVuc2lnbmVkIGludClkYXRhOwotCi0JSWNwU3RhdGUgPSBpY3BfZ2V0X2ludChfaWNwX21zZy5zcmNfaWQpOwotCi0JZm9yKGk9MDsgaTxDSEFOTkVMX01BWElEKF9pY3BfbXNnLnNyY19pZCk7IGkrKykKLQl7Ci0JCWlmKCgoKGk8MzIpJiYoKEljcFN0YXRlLmxvd193b3JkPj5pKSAmIDB4MSkpfHwoKGk+PTMyKSYmKChJY3BTdGF0ZS5oaWdoX3dvcmQ+PihpLTMyKSkgJiAweDEpKSkpIHsKLQkJCV9pY3BfbXNnLmV2ZW50X2lkID0gaTsJCQkKLQkJI2lmZGVmIENPTkZJR19aWDI5X1dBVENIRE9HCQkJCi0JCQlpZigoQ09SRV9NMCA9PSBfaWNwX21zZy5zcmNfaWQpJiYoMiA9PSBpKSkKLQkgIAkJCXp4X3dkdF9pY3Bfd2FrZSgpOwotCQkjZW5kaWYKLQkJCWlmKF9pY3BfZm4pCi0JCQkJX2ljcF9mbigmX2ljcF9tc2cpOwotCQkJCi0JCQlpY3BfY2xlYXJfaW50KF9pY3BfbXNnLnNyY19pZCwgaSk7Ci0JCX0KLQl9Ci0KLQlpY3BfaW50X2NvdW50ICsrOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotICogZm9yIGxvb3BiYWNrIHRlc3QKLSAqLwotdm9pZCBmYWtlX2ljcF9pc3IoVF9ScE1zZ19Db3JlSUQgc3JjX2NvcmUsIFRfUnBNc2dfQ29yZUlEIGRlc3RfY29yZSwgVF9ScE1zZ19DaElEIGNoKQotewotCWljcF9tc2cJX2ljcF9tc2c7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlfaWNwX21zZy5zcmNfaWQgCT0gc3JjX2NvcmU7Ci0JX2ljcF9tc2cuZGVzdF9jb3JlIAk9IGRlc3RfY29yZTsJCi0JX2ljcF9tc2cuZXZlbnRfaWQgCT0gY2g7Ci0KLQlpZihfaWNwX2ZuKQotCQlfaWNwX2ZuKCZfaWNwX21zZyk7Ci19Ci0KLS8qCi0gKiBmb3IgZ2V0IHdha2Ugc3RhdGUKLSAqLwotdm9pZCBpY3BfZ2V0X2ludF9pbmZvKFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCwgdW5zaWduZWQgaW50ICpoaWdoX3dvcmQsIHVuc2lnbmVkIGludCAqbG93X3dvcmQpCi17Ci0JVF9IYWxJY3BfRHdvcmQgSWNwU3RhdGU7Ci0KLQlJY3BTdGF0ZSA9IGljcF9nZXRfaW50KGFjdG9ySUQpOwotCi0JKmhpZ2hfd29yZCA9IEljcFN0YXRlLmhpZ2hfd29yZDsKLQkqbG93X3dvcmQgPSBJY3BTdGF0ZS5sb3dfd29yZDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwc19jaGFubmVsX2luZm9bNjRdID0gewotCVswXSA9ICJkcnYgdGVzdCIsCi0JWzJdID0gIlBvd2VyIE1hbmFnZW1lbnQiLAotCVszXSA9ICJBREIgYWdlbnQiLAotCVs0XSA9ICJVU0IgYXBwIGNvbmZpZyIsCi0JWzVdID0gIlVTQiBrZXJuZWwgY29uZmlnIiwKLQlbNl0gPSAiYXVkaW8iLAotCVs3XSA9ICJjb25zb2xlIHN3aXRjaCIsCi0JWzhdID0gIk5WIiwKLQlbOV0gPSAiZGVidWciLAotCVsxMF0gPSAicmFtZHVtcCIsCi0JWzExXSA9ICJ0ZWUgY29tbW9uIiwKLQlbMTJdID0gInRlZSBSUEMiLAotCVsxM10gPSAiYXAyY2FwIG1lc3NhZ2UgcXVldWUiLAotCVsxNF0gPSAiY2FwMmFwIG1lc3NhZ2UgcXVldWUiLAotCVsxNV0gPSAiQU1UIGZyYW1ld29yayIsCi0JWzE2XSA9ICJBUFAgcnN2ZCAxNiIsCi0JWzE3XSA9ICJBUFAgcnN2ZCAxNyIsCi0JWzE4XSA9ICJBUFAgcnN2ZCAxOCIsCi0JWzE5XSA9ICJBUFAgcnN2ZCAxOSIsCi0JWzIwXSA9ICJ6dm5ldCAyMCIsCi0JWzIxXSA9ICJ6dm5ldCAyMSIsCi0JWzIyXSA9ICJ6dm5ldCAyMiIsCi0JWzIzXSA9ICJ6dm5ldCAyMyIsCi0JWzI0XSA9ICJ6dm5ldCAyNCIsCi0JWzI1XSA9ICJ6dm5ldCAyNSIsCi0JWzI2XSA9ICJ6dm5ldCAyNiIsCi0JWzI3XSA9ICJ6dm5ldCAyNyIsCi0JWzI4XSA9ICJ6dm5ldCAyOCIsCi0JWzI5XSA9ICJmcmVlIHNrYiIsCi0JWzMwXSA9ICJ0dHlnczAiLAotCVszMV0gPSAidHR5Z3MxIiwKLQlbMzJdID0gInNvY2tldCBpcGMiLAotCVszM10gPSAiYmluZGVyIGlwYyIsCi0JWzM0XSA9ICJhdCBjaGFubmVsIDM0IiwKLQlbMzVdID0gImF0IGNoYW5uZWwgMzUiLAotCVszNl0gPSAiYXQgY2hhbm5lbCAzNiIsCi0JWzM3XSA9ICJhdCBjaGFubmVsIDM3IiwKLQlbMzhdID0gImF0IGNoYW5uZWwgMzgiLAotCVszOV0gPSAiYXQgY2hhbm5lbCAzOSIsCi0JWzQwXSA9ICJhdCBjaGFubmVsIDQwIiwKLQlbNDFdID0gInZvaWNlIGJ1ZmZlciIsCi19OwotCi12b2lkIHNob3dfaWNwX3N0YXRlKFRfWkRydlJwTXNnX0FjdG9ySUQgYWN0b3JJRCkKLXsKLQl1bnNpZ25lZCBpbnQJaHcsIGx3OwotCWludCBpOwotCi0JaWYgKGFjdG9ySUQgIT0gQ09SRV9QUzApCi0JCXJldHVybjsKLQotCWljcF9nZXRfaW50X2luZm8oYWN0b3JJRCwgJmh3LCAmbHcpOwotCXByX2luZm8oIltTTFBdIGljcHdha2U6IDB4JXggMHgleFxuIiwgaHcsIGx3KTsKLQotCWZvciAoaT0wOyBpPDMyOyBpKyspCi0JCWlmIChsdyZCSVQoaSkpCi0JCQlwcl9pbmZvKCJbU0xQXSBpY3B3YWtlOiBjaGFubmVsKCVkKSBmdW5jdGlvbiglcylcbiIsIGksIHBzX2NoYW5uZWxfaW5mb1tpXSA/IHBzX2NoYW5uZWxfaW5mb1tpXSA6ICJOQSIpOwotCi0JZm9yIChpPTA7IGk8MzI7IGkrKykKLQkJaWYgKGh3JkJJVChpKSkKLQkJCXByX2luZm8oIltTTFBdIGljcHdha2U6IGNoYW5uZWwoJWQpIGZ1bmN0aW9uKCVzKVxuIiwgaSszMiwgcHNfY2hhbm5lbF9pbmZvW2krMzJdID8gcHNfY2hhbm5lbF9pbmZvW2krMzJdIDogIk5BIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGljcF9yZWdpc3Rlcl9jYWxsYmFjayhpY3BfY2FsbGJhY2tfZm4gY2IpCi17Ci0JX2ljcF9mbiA9IGNiOwotfQotCi1zdGF0aWMgaW50IGljcF9zZW5kX21lc3NhZ2UodW5zaWduZWQgaW50IGNvcmVfaWQsIGljcF9tc2cgKmljcF9tc2cpCi17Ci0JaWYoIWljcF9tc2cgfHwgaWNwX21zZy0+ZGVzdF9jb3JlID4gQ09SRV9NQVhJRCApCi0JCXJldHVybiAtRUlOVkFMOwotCQkKLQlpZihpY3BfZ2V0X2ludF9zdGF0ZShpY3BfbXNnLT5kZXN0X2NvcmUsIGljcF9tc2ctPmV2ZW50X2lkKT09ZmFsc2UpCi0JewotCQlpY3Bfc2V0X2ludChpY3BfbXNnLT5kZXN0X2NvcmUsIGljcF9tc2ctPmV2ZW50X2lkKTsKLQl9Ci0JCi0JcmV0dXJuIDA7CQotfQotCi1zdGF0aWMgdF9pY3BkZXZfb3BzIHp4MjlfaWNwX29wcyA9IHsKLQkucmVnaXN0ZXJfY2FsbGJhY2sJPSBpY3BfcmVnaXN0ZXJfY2FsbGJhY2ssCi0JLnNlbmRfbWVzc2FnZQkJPSBpY3Bfc2VuZF9tZXNzYWdlLCAKLQkubWFza19pbnQJCQk9IGljcF9tYXNrX2ludCwKLQkudW5tYXNrX2ludAkJCT0gaWNwX3VubWFza19pbnQsCi0JLnNldF9pbnQJCQk9IGljcF9zZXRfaW50LAotfTsKLQotc3RhdGljIGludCBpY3BfYXAycHNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCWludCByZXQ7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQotCXJlZ19iYXNlID0gb2ZfaW9tYXAobnAsIDApOwotCWlmICggIXJlZ19iYXNlICl7Ci0JCXByX2VycigiJXM6IFtJQ1BdQ2Fubm90IGdldCBJT1JFU09VUkNFX01FTVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0JCi0JaWNwX2FwMnBzX3JlZyA9IChUX0hhbEljcF9SZWcgKilyZWdfYmFzZTsKLQotCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiggIWlycSApewotCQlwcl9lcnIoIiVzOiBbSUNQXUNhbm5vdCBnZXQgSU9SRVNPVVJDRV9JUlFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQkJCi0KLQlpY3BfYXAycHNfcmVnLT5tYXNrLmhpZ2hfd29yZAk9IDB4ZmZmZmZmZmY7Ci0JaWNwX2FwMnBzX3JlZy0+bWFzay5sb3dfd29yZAk9IDB4ZmZmZmZmZmY7Ci0KLQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGljcF9pc3IsIDAsICJ6eF9pY3AiLCBDT1JFX1BTMCk7Ci0JaWYgKHJldCkKLQl7Ci0JCXByX2VycigiJXM6IFtJQ1BdcmVnaXN0ZXIgaXJxIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQllbmFibGVfaXJxX3dha2UoaXJxKTsKLQotCWljcGRldl9yZWdpc3Rlcl9vcHMoJnp4MjlfaWNwX29wcyk7Ci0JCQotCXJwbXNnSW5pdChDT1JFX1BTMCwgbnApOwotLyoKLQlkZXYtPmlkID0gQ09SRV9QUzA7Ci0JcmV0ID0gaWNwX3JwbXNnX2RldmljZV9yZWdpc3RlcihkZXYpOwotKi8KLQlwcl9pbmZvKCIlczogb2shIGlycSglZCkgaWNwX2FkZHJlc3MoJWxseCBcbiIsIF9fZnVuY19fLCBpcnEsIHJlZ19iYXNlICk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGljcF9hcDJtMF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwotCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwotCi0JcHJfaW5mbygiJXM6IGVudGVyIFxuIiwgX19mdW5jX18pOwotCi0JcmVnX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7Ci0JaWYgKCAhcmVnX2Jhc2UgKXsKLQkJcHJfZXJyKCIlczogW0lDUF1DYW5ub3QgZ2V0IElPUkVTT1VSQ0VfTUVNXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQkKLQlpY3BfYXAybTBfcmVnID0gKFRfSGFsSWNwX1JlZyAqKXJlZ19iYXNlOwotCi0JaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmKCAhaXJxICl7Ci0JCXByX2VycigiJXM6IFtJQ1BdQ2Fubm90IGdldCBJT1JFU09VUkNFX0lSUVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9CQkKLQotCWljcF9hcDJtMF9yZWctPm1hc2suaGlnaF93b3JkCT0gMHhmZmZmZmZmZjsKLQlpY3BfYXAybTBfcmVnLT5tYXNrLmxvd193b3JkCT0gMHhmZmZmZmZmZjsKLQotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaWNwX2lzciwgMCwgInp4X2ljcCIsIENPUkVfTTApOwotCWlmIChyZXQpCi0JewotCQlwcl9lcnIoIiVzOiBbSUNQXXJlZ2lzdGVyIGlycSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQllbmFibGVfaXJxX3dha2UoaXJxKTsKLQotCWljcGRldl9yZWdpc3Rlcl9vcHMoJnp4MjlfaWNwX29wcyk7Ci0KLQlycG1zZ0luaXQoQ09SRV9NMCwgbnApOwotCi0JcHJfaW5mbygiJXM6IG9rISBpcnEoJWQpIGljcF9hZGRyZXNzKCVsbHggXG4iLCBfX2Z1bmNfXywgaXJxLCByZWdfYmFzZSApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHp4MjlfaWNwX2R0X2lkc1tdID0gewotCXsJLmNvbXBhdGlibGUgPSAienRlLHp4MjktaWNwLWFwMm0wIiwgLmRhdGEgPSAmaWNwX2FwMm0wX2luaXQJfSwgCi0JewkuY29tcGF0aWJsZSA9ICJ6dGUsengyOS1pY3AtYXAycHMiLCAuZGF0YSA9ICZpY3BfYXAycHNfaW5pdAl9LCAJCQotCXsJLyogc2VudGluZWwgKi8JfQotfTsKLQotc3RhdGljIGludCB6eDI5X2ljcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCAoKmluaXRfZm4pKHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLQlpbml0X2ZuID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwotCWlmICghaW5pdF9mbikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvcjogTm8gZGV2aWNlIG1hdGNoIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIGluaXRfZm4oJnBkZXYtPmRldik7Ci19Ci0JCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB6eDI5X2ljcF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiengyOS1pY3AiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHp4MjlfaWNwX2R0X2lkcyksCi0JfSwKLQkucHJvYmUJPSB6eDI5X2ljcF9wcm9iZSwKLX07Ci0KLWJ1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKHp4MjlfaWNwX2RyaXZlcikKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvZHJpdmVycy90dHkvdHR5X2lvLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2RyaXZlcnMvdHR5L3R0eV9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NjlhZWY3Li4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvZHJpdmVycy90dHkvdHR5X2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAyICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCi0vKgotICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKLSAqLwotCi0vKgotICogJ3R0eV9pby5jJyBnaXZlcyBhbiBvcnRob2dvbmFsIGZlZWxpbmcgdG8gdHR5J3MsIGJlIHRoZXkgY29uc29sZXMKLSAqIG9yIHJzLWNoYW5uZWxzLiBJdCBhbHNvIGltcGxlbWVudHMgZWNob2luZywgY29va2VkIG1vZGUgZXRjLgotICoKLSAqIEtpbGwtbGluZSB0aGFua3MgdG8gSm9obiBUIEtvaGwsIHdobyBhbHNvIGNvcnJlY3RlZCBWTUlOID0gVlRJTUUgPSAwLgotICoKLSAqIE1vZGlmaWVkIGJ5IFRoZW9kb3JlIFRzJ28sIDkvMTQvOTIsIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZQotICogdHR5X3N0cnVjdCBhbmQgdHR5X3F1ZXVlIHN0cnVjdHVyZXMuICBQcmV2aW91c2x5IHRoZXJlIHdhcyBhbiBhcnJheQotICogb2YgMjU2IHR0eV9zdHJ1Y3QncyB3aGljaCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQsIGFuZCB0aGUKLSAqIHR0eV9xdWV1ZSBzdHJ1Y3R1cmVzIHdlcmUgYWxsb2NhdGVkIGF0IGJvb3QgdGltZS4gIEJvdGggYXJlIG5vdwotICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9ubHkgd2hlbiB0aGUgdHR5IGlzIG9wZW4uCi0gKgotICogQWxzbyByZXN0cnVjdHVyZWQgcm91dGluZXMgc28gdGhhdCB0aGVyZSBpcyBtb3JlIG9mIGEgc2VwYXJhdGlvbgotICogYmV0d2VlbiB0aGUgaGlnaC1sZXZlbCB0dHkgcm91dGluZXMgKHR0eV9pby5jIGFuZCB0dHlfaW9jdGwuYykgYW5kCi0gKiB0aGUgbG93LWxldmVsIHR0eSByb3V0aW5lcyAoc2VyaWFsLmMsIHB0eS5jLCBjb25zb2xlLmMpLiAgVGhpcwotICogbWFrZXMgZm9yIGNsZWFuZXIgYW5kIG1vcmUgY29tcGFjdCBjb2RlLiAgLVRZVCwgOS8xNy85MgotICoKLSAqIE1vZGlmaWVkIGJ5IEZyZWQgTi4gdmFuIEtlbXBlbiwgMDEvMjkvOTMsIHRvIGFkZCBsaW5lIGRpc2NpcGxpbmVzCi0gKiB3aGljaCBjYW4gYmUgZHluYW1pY2FsbHkgYWN0aXZhdGVkIGFuZCBkZS1hY3RpdmF0ZWQgYnkgdGhlIGxpbmUKLSAqIGRpc2NpcGxpbmUgaGFuZGxpbmcgbW9kdWxlcyAobGlrZSBTTElQKS4KLSAqCi0gKiBOT1RFOiBwYXkgbm8gYXR0ZW50aW9uIHRvIHRoZSBsaW5lIGRpc2NpcGxpbmUgY29kZSAoeWV0KTsgaXRzCi0gKiBpbnRlcmZhY2UgaXMgc3RpbGwgc3ViamVjdCB0byBjaGFuZ2UgaW4gdGhpcyB2ZXJzaW9uLi4uCi0gKiAtLSBUWVQsIDEvMzEvOTIKLSAqCi0gKiBBZGRlZCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBPUE9TVCB0dHkgaGFuZGxpbmcuICBObyBkZWxheXMsIGJ1dCBhbGwKLSAqIG90aGVyIGJpdHMgc2hvdWxkIGJlIHRoZXJlLgotICoJLS0gTmljayBIb2xsb3dheSA8YWxmaWVAZGNzLndhcndpY2suYWMudWs+LCAyN3RoIE1heSAxOTkzLgotICoKLSAqIFJld3JvdGUgY2Fub25pY2FsIG1vZGUgYW5kIGFkZGVkIG1vcmUgdGVybWlvcyBmbGFncy4KLSAqIAktLSBqdWxpYW5AdWh1bml4LnVoY2MuaGF3YWlpLmVkdSAoSi4gQ293bGV5KSwgMTNKYW45NAotICoKLSAqIFJlb3JnYW5pemVkIEZBU1lOQyBzdXBwb3J0IHNvIG1vdXNlIGNvZGUgY2FuIHNoYXJlIGl0LgotICoJLS0gY3RtQGFyZGkuY29tLCA5U2VwOTUKLSAqCi0gKiBOZXcgVElPQ0xJTlVYIHZhcmlhbnRzIGFkZGVkLgotICoJLS0gbWpAazMzMi5mZWxkLmN2dXQuY3osIDE5LU5vdi05NQotICoKLSAqIFJlc3RyaWN0IHZ0IHN3aXRjaGluZyB2aWEgaW9jdGwoKQotICogICAgICAtLSBncmlmQGNzLnVjci5lZHUsIDUtRGVjLTk1Ci0gKgotICogTW92ZSBjb25zb2xlIGFuZCB2aXJ0dWFsIHRlcm1pbmFsIGNvZGUgdG8gbW9yZSBhcHByb3ByaWF0ZSBmaWxlcywKLSAqIGltcGxlbWVudCBDT05GSUdfVlQgYW5kIGdlbmVyYWxpemUgY29uc29sZSBkZXZpY2UgaW50ZXJmYWNlLgotICoJLS0gTWFya28gS29odGFsYSA8TWFya28uS29odGFsYUBodXQuZmk+LCBNYXJjaCA5NwotICoKLSAqIFJld3JvdGUgdHR5X2luaXRfZGV2IGFuZCB0dHlfcmVsZWFzZV9kZXYgdG8gZWxpbWluYXRlIHJhY2VzLgotICoJLS0gQmlsbCBIYXdlcyA8d2hhd2VzQHN0YXIubmV0PiwgSnVuZSA5NwotICoKLSAqIEFkZGVkIGRldmZzIHN1cHBvcnQuCi0gKiAgICAgIC0tIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PiwgMTMtSmFuLTE5OTgKLSAqCi0gKiBBZGRlZCBzdXBwb3J0IGZvciBhIFVuaXg5OC1zdHlsZSBwdG14IGRldmljZS4KLSAqICAgICAgLS0gQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+LCAxNC1KYW4tMTk5OAotICoKLSAqIFJlZHVjZWQgbWVtb3J5IHVzYWdlIGZvciBvbGRlciBBUk0gc3lzdGVtcwotICogICAgICAtLSBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgotICoKLSAqIE1vdmUgZG9fU0FLKCkgaW50byBwcm9jZXNzIGNvbnRleHQuICBMZXNzIHN0YWNrIHVzZSBpbiBkZXZmcyBmdW5jdGlvbnMuCi0gKiBhbGxvY190dHlfc3RydWN0KCkgYWx3YXlzIHVzZXMga21hbGxvYygpCi0gKgkJCSAtLSBBbmRyZXcgTW9ydG9uIDxhbmRyZXdtQHVvdy5lZHUuZXU+IDE3TWFyMDEKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC90YXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2cHRzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BwcC1pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+Ci0jaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbGVjdGlvbi5oPgotCi0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KLQotI3VuZGVmIFRUWV9ERUJVR19IQU5HVVAKLSNpZmRlZiBUVFlfREVCVUdfSEFOR1VQCi0jIGRlZmluZSB0dHlfZGVidWdfaGFuZ3VwKHR0eSwgZiwgYXJncy4uLikJdHR5X2RlYnVnKHR0eSwgZiwgIyNhcmdzKQotI2Vsc2UKLSMgZGVmaW5lIHR0eV9kZWJ1Z19oYW5ndXAodHR5LCBmLCBhcmdzLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBUVFlfUEFSQU5PSUFfQ0hFQ0sgMQotI2RlZmluZSBDSEVDS19UVFlfQ09VTlQgMQotCi1zdHJ1Y3Qga3Rlcm1pb3MgdHR5X3N0ZF90ZXJtaW9zID0gewkvKiBmb3IgdGhlIGJlbmVmaXQgb2YgdHR5IGRyaXZlcnMgICovCi0JLmNfaWZsYWcgPSBJQ1JOTCB8IElYT04sCi0JLmNfb2ZsYWcgPSBPUE9TVCB8IE9OTENSLAotCS5jX2NmbGFnID0gQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCwKLQkuY19sZmxhZyA9IElTSUcgfCBJQ0FOT04gfCBFQ0hPIHwgRUNIT0UgfCBFQ0hPSyB8Ci0JCSAgIEVDSE9DVEwgfCBFQ0hPS0UgfCBJRVhURU4sCi0JLmNfY2MgPSBJTklUX0NfQ0MsCi0JLmNfaXNwZWVkID0gMzg0MDAsCi0JLmNfb3NwZWVkID0gMzg0MDAsCi0JLyogLmNfbGluZSA9IE5fVFRZLCAqLwotfTsKLQotRVhQT1JUX1NZTUJPTCh0dHlfc3RkX3Rlcm1pb3MpOwotCi0vKiBUaGlzIGxpc3QgZ2V0cyBwb2tlZCBhdCBieSBwcm9jZnMgYW5kIHZhcmlvdXMgYml0cyBvZiBib290IHVwIGNvZGUuIFRoaXMKLSAgIGNvdWxkIGRvIHdpdGggc29tZSByYXRpb25hbGlzYXRpb24gc3VjaCBhcyBwdWxsaW5nIHRoZSB0dHkgcHJvYyBmdW5jdGlvbgotICAgaW50byB0aGlzIGZpbGUgKi8KLQotTElTVF9IRUFEKHR0eV9kcml2ZXJzKTsJCQkvKiBsaW5rZWQgbGlzdCBvZiB0dHkgZHJpdmVycyAqLwotCi0vKiBNdXRleCB0byBwcm90ZWN0IGNyZWF0aW5nIGFuZCByZWxlYXNpbmcgYSB0dHkgKi8KLURFRklORV9NVVRFWCh0dHlfbXV0ZXgpOwotCi1zdGF0aWMgc3NpemVfdCB0dHlfcmVhZChzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOwotc3RhdGljIHNzaXplX3QgdHR5X3dyaXRlKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7Ci1zdGF0aWMgX19wb2xsX3QgdHR5X3BvbGwoc3RydWN0IGZpbGUgKiwgcG9sbF90YWJsZSAqKTsKLXN0YXRpYyBpbnQgdHR5X29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotI2lmZGVmIENPTkZJR19DT01QQVQKLXN0YXRpYyBsb25nIHR0eV9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkJdW5zaWduZWQgbG9uZyBhcmcpOwotI2Vsc2UKLSNkZWZpbmUgdHR5X2NvbXBhdF9pb2N0bCBOVUxMCi0jZW5kaWYKLXN0YXRpYyBpbnQgX190dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbik7Ci1zdGF0aWMgaW50IHR0eV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKTsKLXN0YXRpYyB2b2lkIHJlbGVhc2VfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBpZHgpOwotCi0vKioKLSAqCWZyZWVfdHR5X3N0cnVjdAkJLQlmcmVlIGEgZGlzdXNlZCB0dHkKLSAqCUB0dHk6IHR0eSBzdHJ1Y3QgdG8gZnJlZQotICoKLSAqCUZyZWUgdGhlIHdyaXRlIGJ1ZmZlcnMsIHR0eSBxdWV1ZSBhbmQgdHR5IG1lbW9yeSBpdHNlbGYuCi0gKgotICoJTG9ja2luZzogbm9uZS4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdHR5IGlzIGRlZmluaXRlbHkgdW51c2VkCi0gKi8KLQotc3RhdGljIHZvaWQgZnJlZV90dHlfc3RydWN0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JdHR5X2xkaXNjX2RlaW5pdCh0dHkpOwotCXB1dF9kZXZpY2UodHR5LT5kZXYpOwotCWtmcmVlKHR0eS0+d3JpdGVfYnVmKTsKLQl0dHktPm1hZ2ljID0gMHhERUFEREVBRDsKLQlrZnJlZSh0dHkpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0dHlfc3RydWN0ICpmaWxlX3R0eShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgdHR5X2ZpbGVfcHJpdmF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnR0eTsKLX0KLQotaW50IHR0eV9hbGxvY19maWxlKHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCB0dHlfZmlsZV9wcml2YXRlICpwcml2OwotCi0JcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IHByaXY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogQXNzb2NpYXRlIGEgbmV3IGZpbGUgd2l0aCB0aGUgdHR5IHN0cnVjdHVyZSAqLwotdm9pZCB0dHlfYWRkX2ZpbGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHR0eV9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlwcml2LT50dHkgPSB0dHk7Ci0JcHJpdi0+ZmlsZSA9IGZpbGU7Ci0KLQlzcGluX2xvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci0JbGlzdF9hZGQoJnByaXYtPmxpc3QsICZ0dHktPnR0eV9maWxlcyk7Ci0Jc3Bpbl91bmxvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci19Ci0KLS8qKgotICogdHR5X2ZyZWVfZmlsZSAtIGZyZWUgZmlsZS0+cHJpdmF0ZV9kYXRhCi0gKgotICogVGhpcyBzaGFsbCBiZSB1c2VkIG9ubHkgZm9yIGZhaWwgcGF0aCBoYW5kbGluZyB3aGVuIHR0eV9hZGRfZmlsZSB3YXMgbm90Ci0gKiBjYWxsZWQgeWV0LgotICovCi12b2lkIHR0eV9mcmVlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHR0eV9maWxlX3ByaXZhdGUgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWtmcmVlKHByaXYpOwotfQotCi0vKiBEZWxldGUgZmlsZSBmcm9tIGl0cyB0dHkgKi8KLXN0YXRpYyB2b2lkIHR0eV9kZWxfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgdHR5X2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcHJpdi0+dHR5OwotCi0Jc3Bpbl9sb2NrKCZ0dHktPmZpbGVzX2xvY2spOwotCWxpc3RfZGVsKCZwcml2LT5saXN0KTsKLQlzcGluX3VubG9jaygmdHR5LT5maWxlc19sb2NrKTsKLQl0dHlfZnJlZV9maWxlKGZpbGUpOwotfQotCi0vKioKLSAqCXR0eV9uYW1lCS0JcmV0dXJuIHR0eSBuYW1pbmcKLSAqCUB0dHk6IHR0eSBzdHJ1Y3R1cmUKLSAqCi0gKglDb252ZXJ0IGEgdHR5IHN0cnVjdHVyZSBpbnRvIGEgbmFtZS4gVGhlIG5hbWUgcmVmbGVjdHMgdGhlIGtlcm5lbAotICoJbmFtaW5nIHBvbGljeSBhbmQgaWYgdWRldiBpcyBpbiB1c2UgbWF5IG5vdCByZWZsZWN0IHVzZXIgc3BhY2UKLSAqCi0gKglMb2NraW5nOiBub25lCi0gKi8KLQotY29uc3QgY2hhciAqdHR5X25hbWUoY29uc3Qgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlpZiAoIXR0eSkgLyogSG1tLiAgTlVMTCBwb2ludGVyLiAgVGhhdCdzIGZ1bi4gKi8KLQkJcmV0dXJuICJOVUxMIHR0eSI7Ci0JcmV0dXJuIHR0eS0+bmFtZTsKLX0KLQotRVhQT1JUX1NZTUJPTCh0dHlfbmFtZSk7Ci0KLWNvbnN0IGNoYXIgKnR0eV9kcml2ZXJfbmFtZShjb25zdCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmICghdHR5IHx8ICF0dHktPmRyaXZlcikKLQkJcmV0dXJuICIiOwotCXJldHVybiB0dHktPmRyaXZlci0+bmFtZTsKLX0KLQotc3RhdGljIGludCB0dHlfcGFyYW5vaWFfY2hlY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKnJvdXRpbmUpCi17Ci0jaWZkZWYgVFRZX1BBUkFOT0lBX0NIRUNLCi0JaWYgKCF0dHkpIHsKLQkJcHJfd2FybigiKCVkOiVkKTogJXM6IE5VTEwgdHR5XG4iLAotCQkJaW1ham9yKGlub2RlKSwgaW1pbm9yKGlub2RlKSwgcm91dGluZSk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAodHR5LT5tYWdpYyAhPSBUVFlfTUFHSUMpIHsKLQkJcHJfd2FybigiKCVkOiVkKTogJXM6IGJhZCBtYWdpYyBudW1iZXJcbiIsCi0JCQlpbWFqb3IoaW5vZGUpLCBpbWlub3IoaW5vZGUpLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIENhbGxlciBtdXN0IGhvbGQgdHR5X2xvY2sgKi8KLXN0YXRpYyBpbnQgY2hlY2tfdHR5X2NvdW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IGNoYXIgKnJvdXRpbmUpCi17Ci0jaWZkZWYgQ0hFQ0tfVFRZX0NPVU5UCi0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQlpbnQgY291bnQgPSAwLCBrb3Blbl9jb3VudCA9IDA7Ci0KLQlzcGluX2xvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaChwLCAmdHR5LT50dHlfZmlsZXMpIHsKLQkJY291bnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci0JaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKLQkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfU0xBVkUgJiYKLQkgICAgdHR5LT5saW5rICYmIHR0eS0+bGluay0+Y291bnQpCi0JCWNvdW50Kys7Ci0JaWYgKHR0eV9wb3J0X2tvcGVuZWQodHR5LT5wb3J0KSkKLQkJa29wZW5fY291bnQrKzsKLQlpZiAodHR5LT5jb3VudCAhPSAoY291bnQgKyBrb3Blbl9jb3VudCkpIHsKLQkJdHR5X3dhcm4odHR5LCAiJXM6IHR0eS0+Y291bnQoJWQpICE9ICgjZmQncyglZCkgKyAja29wZW4ncyglZCkpXG4iLAotCQkJIHJvdXRpbmUsIHR0eS0+Y291bnQsIGNvdW50LCBrb3Blbl9jb3VudCk7Ci0JCXJldHVybiAoY291bnQgKyBrb3Blbl9jb3VudCk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoJZ2V0X3R0eV9kcml2ZXIJCS0JZmluZCBkZXZpY2Ugb2YgYSB0dHkKLSAqCUBkZXZpY2U6IGRldmljZSBpZGVudGlmaWVyCi0gKglAaW5kZXg6IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0dHkKLSAqCi0gKglUaGlzIHJvdXRpbmUgcmV0dXJucyBhIHR0eSBkcml2ZXIgc3RydWN0dXJlLCBnaXZlbiBhIGRldmljZSBudW1iZXIKLSAqCWFuZCBhbHNvIHBhc3NlcyBiYWNrIHRoZSBpbmRleCBudW1iZXIuCi0gKgotICoJTG9ja2luZzogY2FsbGVyIG11c3QgaG9sZCB0dHlfbXV0ZXgKLSAqLwotCi1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmdldF90dHlfZHJpdmVyKGRldl90IGRldmljZSwgaW50ICppbmRleCkKLXsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnR0eV9kcml2ZXJzLCB0dHlfZHJpdmVycykgewotCQlkZXZfdCBiYXNlID0gTUtERVYocC0+bWFqb3IsIHAtPm1pbm9yX3N0YXJ0KTsKLQkJaWYgKGRldmljZSA8IGJhc2UgfHwgZGV2aWNlID49IGJhc2UgKyBwLT5udW0pCi0JCQljb250aW51ZTsKLQkJKmluZGV4ID0gZGV2aWNlIC0gYmFzZTsKLQkJcmV0dXJuIHR0eV9kcml2ZXJfa3JlZl9nZXQocCk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKioKLSAqCXR0eV9kZXZfbmFtZV90b19udW1iZXIJLQlyZXR1cm4gZGV2X3QgZm9yIGRldmljZSBuYW1lCi0gKglAbmFtZTogdXNlciBzcGFjZSBuYW1lIG9mIGRldmljZSB1bmRlciAvZGV2Ci0gKglAbnVtYmVyOiBwb2ludGVyIHRvIGRldl90IHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIHBvcHVsYXRlCi0gKgotICoJVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBkZXZpY2UgbmFtZXMgbGlrZSB0dHlTMCBvciB0dHlVU0IxIGludG8gZGV2X3QKLSAqCWxpa2UgKDQsIDY0KSBvciAoMTg4LCAxKS4gSWYgbm8gY29ycmVzcG9uZGluZyBkcml2ZXIgaXMgcmVnaXN0ZXJlZCB0aGVuCi0gKgl0aGUgZnVuY3Rpb24gcmV0dXJucyAtRU5PREVWLgotICoKLSAqCUxvY2tpbmc6IHRoaXMgYWNxdWlyZXMgdHR5X211dGV4IHRvIHByb3RlY3QgdGhlIHR0eV9kcml2ZXJzIGxpc3QgZnJvbQotICoJCWJlaW5nIG1vZGlmaWVkIHdoaWxlIHdlIGFyZSB0cmF2ZXJzaW5nIGl0LCBhbmQgbWFrZXMgc3VyZSB0bwotICoJCXJlbGVhc2UgaXQgYmVmb3JlIGV4aXRpbmcuCi0gKi8KLWludCB0dHlfZGV2X25hbWVfdG9fbnVtYmVyKGNvbnN0IGNoYXIgKm5hbWUsIGRldl90ICpudW1iZXIpCi17Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKnA7Ci0JaW50IHJldDsKLQlpbnQgaW5kZXgsIHByZWZpeF9sZW5ndGggPSAwOwotCWNvbnN0IGNoYXIgKnN0cjsKLQotCWZvciAoc3RyID0gbmFtZTsgKnN0ciAmJiAhaXNkaWdpdCgqc3RyKTsgc3RyKyspCi0JCTsKLQotCWlmICghKnN0cikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBrc3RydG9pbnQoc3RyLCAxMCwgJmluZGV4KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHJlZml4X2xlbmd0aCA9IHN0ciAtIG5hbWU7Ci0JbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnR0eV9kcml2ZXJzLCB0dHlfZHJpdmVycykKLQkJaWYgKHByZWZpeF9sZW5ndGggPT0gc3RybGVuKHAtPm5hbWUpICYmIHN0cm5jbXAobmFtZSwKLQkJCQkJcC0+bmFtZSwgcHJlZml4X2xlbmd0aCkgPT0gMCkgewotCQkJaWYgKGluZGV4IDwgcC0+bnVtKSB7Ci0JCQkJKm51bWJlciA9IE1LREVWKHAtPm1ham9yLCBwLT5taW5vcl9zdGFydCArIGluZGV4KTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfQotCi0JLyogaWYgaGVyZSB0aGVuIGRyaXZlciB3YXNuJ3QgZm91bmQgKi8KLQlyZXQgPSAtRU5PREVWOwotb3V0OgotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwodHR5X2Rldl9uYW1lX3RvX251bWJlcik7Ci0KLSNpZmRlZiBDT05GSUdfQ09OU09MRV9QT0xMCi0KLS8qKgotICoJdHR5X2ZpbmRfcG9sbGluZ19kcml2ZXIJLQlmaW5kIGRldmljZSBvZiBhIHBvbGxlZCB0dHkKLSAqCUBuYW1lOiBuYW1lIHN0cmluZyB0byBtYXRjaAotICoJQGxpbmU6IHBvaW50ZXIgdG8gcmVzdWx0aW5nIHR0eSBsaW5lIG5yCi0gKgotICoJVGhpcyByb3V0aW5lIHJldHVybnMgYSB0dHkgZHJpdmVyIHN0cnVjdHVyZSwgZ2l2ZW4gYSBuYW1lCi0gKglhbmQgdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSB0dHkgZHJpdmVyIGlzIGNhcGFibGUgb2YgcG9sbGVkCi0gKglvcGVyYXRpb24uCi0gKi8KLXN0cnVjdCB0dHlfZHJpdmVyICp0dHlfZmluZF9wb2xsaW5nX2RyaXZlcihjaGFyICpuYW1lLCBpbnQgKmxpbmUpCi17Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKnAsICpyZXMgPSBOVUxMOwotCWludCB0dHlfbGluZSA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzdHIsICpzdHA7Ci0KLQlmb3IgKHN0ciA9IG5hbWU7ICpzdHI7IHN0cisrKQotCQlpZiAoKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKSB8fCAqc3RyID09ICcsJykKLQkJCWJyZWFrOwotCWlmICghKnN0cikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlsZW4gPSBzdHIgLSBuYW1lOwotCXR0eV9saW5lID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAxMCk7Ci0KLQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCS8qIFNlYXJjaCB0aHJvdWdoIHRoZSB0dHkgZGV2aWNlcyB0byBsb29rIGZvciBhIG1hdGNoICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmdHR5X2RyaXZlcnMsIHR0eV9kcml2ZXJzKSB7Ci0JCWlmICghbGVuIHx8IHN0cm5jbXAobmFtZSwgcC0+bmFtZSwgbGVuKSAhPSAwKQotCQkJY29udGludWU7Ci0JCXN0cCA9IHN0cjsKLQkJaWYgKCpzdHAgPT0gJywnKQotCQkJc3RwKys7Ci0JCWlmICgqc3RwID09ICdcMCcpCi0JCQlzdHAgPSBOVUxMOwotCi0JCWlmICh0dHlfbGluZSA+PSAwICYmIHR0eV9saW5lIDwgcC0+bnVtICYmIHAtPm9wcyAmJgotCQkgICAgcC0+b3BzLT5wb2xsX2luaXQgJiYgIXAtPm9wcy0+cG9sbF9pbml0KHAsIHR0eV9saW5lLCBzdHApKSB7Ci0JCQlyZXMgPSB0dHlfZHJpdmVyX2tyZWZfZ2V0KHApOwotCQkJKmxpbmUgPSB0dHlfbGluZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQotCXJldHVybiByZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfZmluZF9wb2xsaW5nX2RyaXZlcik7Ci0jZW5kaWYKLQotc3RhdGljIHNzaXplX3QgaHVuZ191cF90dHlfcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGh1bmdfdXBfdHR5X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQotewotCXJldHVybiAtRUlPOwotfQotCi0vKiBObyBrZXJuZWwgbG9jayBoZWxkIC0gbm9uZSBuZWVkZWQgOykgKi8KLXN0YXRpYyBfX3BvbGxfdCBodW5nX3VwX3R0eV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXJldHVybiBFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTEVSUiB8IEVQT0xMSFVQIHwgRVBPTExSRE5PUk0gfCBFUE9MTFdSTk9STTsKLX0KLQotc3RhdGljIGxvbmcgaHVuZ191cF90dHlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiBjbWQgPT0gVElPQ1NQR1JQID8gLUVOT1RUWSA6IC1FSU87Ci19Ci0KLXN0YXRpYyBsb25nIGh1bmdfdXBfdHR5X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiBjbWQgPT0gVElPQ1NQR1JQID8gLUVOT1RUWSA6IC1FSU87Ci19Ci0KLXN0YXRpYyBpbnQgaHVuZ191cF90dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKLXsKLQlyZXR1cm4gLUVOT1RUWTsKLX0KLQotc3RhdGljIHZvaWQgdHR5X3Nob3dfZmRpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbGUpOwotCi0JaWYgKHR0eSAmJiB0dHktPm9wcyAmJiB0dHktPm9wcy0+c2hvd19mZGluZm8pCi0JCXR0eS0+b3BzLT5zaG93X2ZkaW5mbyh0dHksIG0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0dHlfZm9wcyA9IHsKLQkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZF9pdGVyCT0gdHR5X3JlYWQsCi0JLndyaXRlX2l0ZXIJPSB0dHlfd3JpdGUsCi0JLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAotCS5wb2xsCQk9IHR0eV9wb2xsLAotCS51bmxvY2tlZF9pb2N0bAk9IHR0eV9pb2N0bCwKLQkuY29tcGF0X2lvY3RsCT0gdHR5X2NvbXBhdF9pb2N0bCwKLQkub3BlbgkJPSB0dHlfb3BlbiwKLQkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAotCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKLQkuc2hvd19mZGluZm8JPSB0dHlfc2hvd19mZGluZm8sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb25zb2xlX2ZvcHMgPSB7Ci0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWRfaXRlcgk9IHR0eV9yZWFkLAotCS53cml0ZV9pdGVyCT0gcmVkaXJlY3RlZF90dHlfd3JpdGUsCi0JLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAotCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAotCS5wb2xsCQk9IHR0eV9wb2xsLAotCS51bmxvY2tlZF9pb2N0bAk9IHR0eV9pb2N0bCwKLQkuY29tcGF0X2lvY3RsCT0gdHR5X2NvbXBhdF9pb2N0bCwKLQkub3BlbgkJPSB0dHlfb3BlbiwKLQkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAotCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1bmdfdXBfdHR5X2ZvcHMgPSB7Ci0JLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWRfaXRlcgk9IGh1bmdfdXBfdHR5X3JlYWQsCi0JLndyaXRlX2l0ZXIJPSBodW5nX3VwX3R0eV93cml0ZSwKLQkucG9sbAkJPSBodW5nX3VwX3R0eV9wb2xsLAotCS51bmxvY2tlZF9pb2N0bAk9IGh1bmdfdXBfdHR5X2lvY3RsLAotCS5jb21wYXRfaW9jdGwJPSBodW5nX3VwX3R0eV9jb21wYXRfaW9jdGwsCi0JLnJlbGVhc2UJPSB0dHlfcmVsZWFzZSwKLQkuZmFzeW5jCQk9IGh1bmdfdXBfdHR5X2Zhc3luYywKLX07Ci0KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socmVkaXJlY3RfbG9jayk7Ci1zdGF0aWMgc3RydWN0IGZpbGUgKnJlZGlyZWN0OwotCi1leHRlcm4gdm9pZCB0dHlfc3lzY3RsX2luaXQodm9pZCk7Ci0KLS8qKgotICoJdHR5X3dha2V1cAktCXJlcXVlc3QgbW9yZSBkYXRhCi0gKglAdHR5OiB0ZXJtaW5hbAotICoKLSAqCUludGVybmFsIGFuZCBleHRlcm5hbCBoZWxwZXIgZm9yIHdha2V1cHMgb2YgdHR5LiBUaGlzIGZ1bmN0aW9uCi0gKglpbmZvcm1zIHRoZSBsaW5lIGRpc2NpcGxpbmUgaWYgcHJlc2VudCB0aGF0IHRoZSBkcml2ZXIgaXMgcmVhZHkKLSAqCXRvIHJlY2VpdmUgbW9yZSBvdXRwdXQgZGF0YS4KLSAqLwotCi12b2lkIHR0eV93YWtldXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQotCWlmICh0ZXN0X2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncykpIHsKLQkJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JCWlmIChsZCkgewotCQkJaWYgKGxkLT5vcHMtPndyaXRlX3dha2V1cCkKLQkJCQlsZC0+b3BzLT53cml0ZV93YWtldXAodHR5KTsKLQkJCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0JCX0KLQl9Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoJnR0eS0+d3JpdGVfd2FpdCwgRVBPTExPVVQpOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfd2FrZXVwKTsKLQotLyoqCi0gKglfX3R0eV9oYW5ndXAJCS0JYWN0dWFsIGhhbmRsZXIgZm9yIGhhbmd1cCBldmVudHMKLSAqCUB0dHk6IHR0eSBkZXZpY2UKLSAqCi0gKglUaGlzIGNhbiBiZSBjYWxsZWQgYnkgYSAia3dvcmtlciIga2VybmVsIHRocmVhZC4gIFRoYXQgaXMgcHJvY2VzcwotICoJc3luY2hyb25vdXMgYnV0IGRvZXNuJ3QgaG9sZCBhbnkgbG9ja3MsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlCi0gKgloYXZlIHRoZSBhcHByb3ByaWF0ZSBsb2NrcyBmb3Igd2hhdCB3ZSdyZSBkb2luZy4KLSAqCi0gKglUaGUgaGFuZ3VwIGV2ZW50IGNsZWFycyBhbnkgcGVuZGluZyByZWRpcmVjdGlvbnMgb250byB0aGUgaHVuZyB1cAotICoJZGV2aWNlLiBJdCBlbnN1cmVzIGZ1dHVyZSB3cml0ZXMgd2lsbCBlcnJvciBhbmQgaXQgZG9lcyB0aGUgbmVlZGVkCi0gKglsaW5lIGRpc2NpcGxpbmUgaGFuZ3VwIGFuZCBzaWduYWwgZGVsaXZlcnkuIFRoZSB0dHkgb2JqZWN0IGl0c2VsZgotICoJcmVtYWlucyBpbnRhY3QuCi0gKgotICoJTG9ja2luZzoKLSAqCQlCVE0KLSAqCQkgIHJlZGlyZWN0IGxvY2sgZm9yIHVuZG9pbmcgcmVkaXJlY3Rpb24KLSAqCQkgIGZpbGUgbGlzdCBsb2NrIGZvciBtYW5pcHVsYXRpbmcgbGlzdCBvZiB0dHlzCi0gKgkJICB0dHlfbGRpc2NzX2xvY2sgZnJvbSBjYWxsZWQgZnVuY3Rpb25zCi0gKgkJICB0ZXJtaW9zX3J3c2VtIHJlc2V0dGluZyB0ZXJtaW9zIGRhdGEKLSAqCQkgIHRhc2tsaXN0X2xvY2sgdG8gd2FsayB0YXNrIGxpc3QgZm9yIGhhbmd1cCBldmVudAotICoJCSAgICAtPnNpZ2xvY2sgdG8gcHJvdGVjdCAtPnNpZ25hbC8tPnNpZ2hhbmQKLSAqLwotc3RhdGljIHZvaWQgX190dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBleGl0X3Nlc3Npb24pCi17Ci0Jc3RydWN0IGZpbGUgKmNvbnNfZmlscCA9IE5VTEw7Ci0Jc3RydWN0IGZpbGUgKmZpbHAsICpmID0gTlVMTDsKLQlzdHJ1Y3QgdHR5X2ZpbGVfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgICAgY2xvc2Vjb3VudCA9IDAsIG47Ci0JaW50IHJlZnM7Ci0KLQlpZiAoIXR0eSkKLQkJcmV0dXJuOwotCi0KLQlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOwotCWlmIChyZWRpcmVjdCAmJiBmaWxlX3R0eShyZWRpcmVjdCkgPT0gdHR5KSB7Ci0JCWYgPSByZWRpcmVjdDsKLQkJcmVkaXJlY3QgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7Ci0KLQl0dHlfbG9jayh0dHkpOwotCi0JaWYgKHRlc3RfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKSkgewotCQl0dHlfdW5sb2NrKHR0eSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFNvbWUgY29uc29sZSBkZXZpY2VzIGFyZW4ndCBhY3R1YWxseSBodW5nIHVwIGZvciB0ZWNobmljYWwgYW5kCi0JICogaGlzdG9yaWNhbCByZWFzb25zLCB3aGljaCBjYW4gbGVhZCB0byBpbmRlZmluaXRlIGludGVycnVwdGlibGUKLQkgKiBzbGVlcCBpbiBuX3R0eV9yZWFkKCkuICBUaGUgZm9sbG93aW5nIGV4cGxpY2l0bHkgdGVsbHMKLQkgKiBuX3R0eV9yZWFkKCkgdG8gYWJvcnQgcmVhZGVycy4KLQkgKi8KLQlzZXRfYml0KFRUWV9IVVBQSU5HLCAmdHR5LT5mbGFncyk7Ci0KLQkvKiBpbnVzZV9maWxwcyBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNpbmdsZSB0dHkgbG9jaywKLQkgICB0aGlzIHJlYWxseSBuZWVkcyB0byBjaGFuZ2UgaWYgd2Ugd2FudCB0byBmbHVzaCB0aGUKLQkgICB3b3JrcXVldWUgd2l0aCB0aGUgbG9jayBoZWxkICovCi0JY2hlY2tfdHR5X2NvdW50KHR0eSwgInR0eV9oYW5ndXAiKTsKLQotCXNwaW5fbG9jaygmdHR5LT5maWxlc19sb2NrKTsKLQkvKiBUaGlzIGJyZWFrcyBmb3IgZmlsZSBoYW5kbGVzIGJlaW5nIHNlbnQgb3ZlciBBRl9VTklYIHNvY2tldHMgPyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHJpdiwgJnR0eS0+dHR5X2ZpbGVzLCBsaXN0KSB7Ci0JCWZpbHAgPSBwcml2LT5maWxlOwotCQlpZiAoZmlscC0+Zl9vcC0+d3JpdGVfaXRlciA9PSByZWRpcmVjdGVkX3R0eV93cml0ZSkKLQkJCWNvbnNfZmlscCA9IGZpbHA7Ci0JCWlmIChmaWxwLT5mX29wLT53cml0ZV9pdGVyICE9IHR0eV93cml0ZSkKLQkJCWNvbnRpbnVlOwotCQljbG9zZWNvdW50Kys7Ci0JCV9fdHR5X2Zhc3luYygtMSwgZmlscCwgMCk7CS8qIGNhbid0IGJsb2NrICovCi0JCWZpbHAtPmZfb3AgPSAmaHVuZ191cF90dHlfZm9wczsKLQl9Ci0Jc3Bpbl91bmxvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci0KLQlyZWZzID0gdHR5X3NpZ25hbF9zZXNzaW9uX2xlYWRlcih0dHksIGV4aXRfc2Vzc2lvbik7Ci0JLyogQWNjb3VudCBmb3IgdGhlIHAtPnNpZ25hbCByZWZlcmVuY2VzIHdlIGtpbGxlZCAqLwotCXdoaWxlIChyZWZzLS0pCi0JCXR0eV9rcmVmX3B1dCh0dHkpOwotCi0JdHR5X2xkaXNjX2hhbmd1cCh0dHksIGNvbnNfZmlscCAhPSBOVUxMKTsKLQotCXNwaW5fbG9ja19pcnEoJnR0eS0+Y3RybF9sb2NrKTsKLQljbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpOwotCWNsZWFyX2JpdChUVFlfRE9fV1JJVEVfV0FLRVVQLCAmdHR5LT5mbGFncyk7Ci0JcHV0X3BpZCh0dHktPnNlc3Npb24pOwotCXB1dF9waWQodHR5LT5wZ3JwKTsKLQl0dHktPnNlc3Npb24gPSBOVUxMOwotCXR0eS0+cGdycCA9IE5VTEw7Ci0JdHR5LT5jdHJsX3N0YXR1cyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0dHktPmN0cmxfbG9jayk7Ci0KLQkvKgotCSAqIElmIG9uZSBvZiB0aGUgZGV2aWNlcyBtYXRjaGVzIGEgY29uc29sZSBwb2ludGVyLCB3ZQotCSAqIGNhbm5vdCBqdXN0IGNhbGwgaGFuZ3VwKCkgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKLQkgKiB0dHktPmNvdW50IGFuZCBzdGF0ZS0+Y291bnQgdG8gZ28gb3V0IG9mIHN5bmMuCi0JICogU28gd2UganVzdCBjYWxsIGNsb3NlKCkgdGhlIHJpZ2h0IG51bWJlciBvZiB0aW1lcy4KLQkgKi8KLQlpZiAoY29uc19maWxwKSB7Ci0JCWlmICh0dHktPm9wcy0+Y2xvc2UpCi0JCQlmb3IgKG4gPSAwOyBuIDwgY2xvc2Vjb3VudDsgbisrKQotCQkJCXR0eS0+b3BzLT5jbG9zZSh0dHksIGNvbnNfZmlscCk7Ci0JfSBlbHNlIGlmICh0dHktPm9wcy0+aGFuZ3VwKQotCQl0dHktPm9wcy0+aGFuZ3VwKHR0eSk7Ci0JLyoKLQkgKiBXZSBkb24ndCB3YW50IHRvIGhhdmUgZHJpdmVyL2xkaXNjIGludGVyYWN0aW9ucyBiZXlvbmQgdGhlIG9uZXMKLQkgKiB3ZSBkaWQgaGVyZS4gVGhlIGRyaXZlciBsYXllciBleHBlY3RzIG5vIGNhbGxzIGFmdGVyIC0+aGFuZ3VwKCkKLQkgKiBmcm9tIHRoZSBsZGlzYyBzaWRlLCB3aGljaCBpcyBub3cgZ3VhcmFudGVlZC4KLQkgKi8KLQlzZXRfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKTsKLQljbGVhcl9iaXQoVFRZX0hVUFBJTkcsICZ0dHktPmZsYWdzKTsKLQl0dHlfdW5sb2NrKHR0eSk7Ci0KLQlpZiAoZikKLQkJZnB1dChmKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fdHR5X2hhbmd1cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdHR5X3N0cnVjdCwgaGFuZ3VwX3dvcmspOwotCi0JX190dHlfaGFuZ3VwKHR0eSwgMCk7Ci19Ci0KLS8qKgotICoJdHR5X2hhbmd1cAkJLQl0cmlnZ2VyIGEgaGFuZ3VwIGV2ZW50Ci0gKglAdHR5OiB0dHkgdG8gaGFuZ3VwCi0gKgotICoJQSBjYXJyaWVyIGxvc3MgKHZpcnR1YWwgb3Igb3RoZXJ3aXNlKSBoYXMgb2NjdXJyZWQgb24gdGhpcyBsaWtlCi0gKglzY2hlZHVsZSBhIGhhbmd1cCBzZXF1ZW5jZSB0byBydW4gYWZ0ZXIgdGhpcyBldmVudC4KLSAqLwotCi12b2lkIHR0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQl0dHlfZGVidWdfaGFuZ3VwKHR0eSwgImhhbmd1cFxuIik7Ci0Jc2NoZWR1bGVfd29yaygmdHR5LT5oYW5ndXBfd29yayk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wodHR5X2hhbmd1cCk7Ci0KLS8qKgotICoJdHR5X3ZoYW5ndXAJCS0JcHJvY2VzcyB2aGFuZ3VwCi0gKglAdHR5OiB0dHkgdG8gaGFuZ3VwCi0gKgotICoJVGhlIHVzZXIgaGFzIGFza2VkIHZpYSBzeXN0ZW0gY2FsbCBmb3IgdGhlIHRlcm1pbmFsIHRvIGJlIGh1bmcgdXAuCi0gKglXZSBkbyB0aGlzIHN5bmNocm9ub3VzbHkgc28gdGhhdCB3aGVuIHRoZSBzeXNjYWxsIHJldHVybnMgdGhlIHByb2Nlc3MKLSAqCWlzIGNvbXBsZXRlLiBUaGF0IGd1YXJhbnRlZSBpcyBuZWNlc3NhcnkgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi0gKi8KLQotdm9pZCB0dHlfdmhhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXR0eV9kZWJ1Z19oYW5ndXAodHR5LCAidmhhbmd1cFxuIik7Ci0JX190dHlfaGFuZ3VwKHR0eSwgMCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0wodHR5X3ZoYW5ndXApOwotCi0KLS8qKgotICoJdHR5X3ZoYW5ndXBfc2VsZgktCXByb2Nlc3Mgdmhhbmd1cCBmb3Igb3duIGN0dHkKLSAqCi0gKglQZXJmb3JtIGEgdmhhbmd1cCBvbiB0aGUgY3VycmVudCBjb250cm9sbGluZyB0dHkKLSAqLwotCi12b2lkIHR0eV92aGFuZ3VwX3NlbGYodm9pZCkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCi0JdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7Ci0JaWYgKHR0eSkgewotCQl0dHlfdmhhbmd1cCh0dHkpOwotCQl0dHlfa3JlZl9wdXQodHR5KTsKLQl9Ci19Ci0KLS8qKgotICoJdHR5X3ZoYW5ndXBfc2Vzc2lvbgkJLQloYW5ndXAgc2Vzc2lvbiBsZWFkZXIgZXhpdAotICoJQHR0eTogdHR5IHRvIGhhbmd1cAotICoKLSAqCVRoZSBzZXNzaW9uIGxlYWRlciBpcyBleGl0aW5nIGFuZCBoYW5naW5nIHVwIGl0cyBjb250cm9sbGluZyB0ZXJtaW5hbC4KLSAqCUV2ZXJ5IHByb2Nlc3MgaW4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpcyBzaWduYWxsZWQgU0lHSFVQLgotICoKLSAqCVdlIGRvIHRoaXMgc3luY2hyb25vdXNseSBzbyB0aGF0IHdoZW4gdGhlIHN5c2NhbGwgcmV0dXJucyB0aGUgcHJvY2VzcwotICoJaXMgY29tcGxldGUuIFRoYXQgZ3VhcmFudGVlIGlzIG5lY2Vzc2FyeSBmb3Igc2VjdXJpdHkgcmVhc29ucy4KLSAqLwotCi12b2lkIHR0eV92aGFuZ3VwX3Nlc3Npb24oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQl0dHlfZGVidWdfaGFuZ3VwKHR0eSwgInNlc3Npb24gaGFuZ3VwXG4iKTsKLQlfX3R0eV9oYW5ndXAodHR5LCAxKTsKLX0KLQotLyoqCi0gKgl0dHlfaHVuZ191cF9wCQktCXdhcyB0dHkgaHVuZyB1cAotICoJQGZpbHA6IGZpbGUgcG9pbnRlciBvZiB0dHkKLSAqCi0gKglSZXR1cm4gdHJ1ZSBpZiB0aGUgdHR5IGhhcyBiZWVuIHN1YmplY3QgdG8gYSB2aGFuZ3VwIG9yIGEgY2FycmllcgotICoJbG9zcwotICovCi0KLWludCB0dHlfaHVuZ191cF9wKHN0cnVjdCBmaWxlICpmaWxwKQotewotCXJldHVybiAoZmlscCAmJiBmaWxwLT5mX29wID09ICZodW5nX3VwX3R0eV9mb3BzKTsKLX0KLQotRVhQT1JUX1NZTUJPTCh0dHlfaHVuZ191cF9wKTsKLQotLyoqCi0gKglzdG9wX3R0eQktCXByb3BhZ2F0ZSBmbG93IGNvbnRyb2wKLSAqCUB0dHk6IHR0eSB0byBzdG9wCi0gKgotICoJUGVyZm9ybSBmbG93IGNvbnRyb2wgdG8gdGhlIGRyaXZlci4gTWF5IGJlIGNhbGxlZAotICoJb24gYW4gYWxyZWFkeSBzdG9wcGVkIGRldmljZSBhbmQgd2lsbCBub3QgcmUtY2FsbCB0aGUgZHJpdmVyCi0gKgltZXRob2QuCi0gKgotICoJVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgYnkgYm90aCB0aGUgbGluZSBkaXNjaXBsaW5lcyBmb3IKLSAqCWhhbHRpbmcgaW5jb21pbmcgZmxvdyBhbmQgYnkgdGhlIGRyaXZlci4gSXQgbWF5IHRoZXJlZm9yZSBiZQotICoJY2FsbGVkIGZyb20gYW55IGNvbnRleHQsIG1heSBiZSB1bmRlciB0aGUgdHR5IGF0b21pY193cml0ZV9sb2NrCi0gKglidXQgbm90IGFsd2F5cy4KLSAqCi0gKglMb2NraW5nOgotICoJCWZsb3dfbG9jawotICovCi0KLXZvaWQgX19zdG9wX3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmICh0dHktPnN0b3BwZWQpCi0JCXJldHVybjsKLQl0dHktPnN0b3BwZWQgPSAxOwotCWlmICh0dHktPm9wcy0+c3RvcCkKLQkJdHR5LT5vcHMtPnN0b3AodHR5KTsKLX0KLQotdm9pZCBzdG9wX3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5mbG93X2xvY2ssIGZsYWdzKTsKLQlfX3N0b3BfdHR5KHR0eSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5mbG93X2xvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0woc3RvcF90dHkpOwotCi0vKioKLSAqCXN0YXJ0X3R0eQktCXByb3BhZ2F0ZSBmbG93IGNvbnRyb2wKLSAqCUB0dHk6IHR0eSB0byBzdGFydAotICoKLSAqCVN0YXJ0IGEgdHR5IHRoYXQgaGFzIGJlZW4gc3RvcHBlZCBpZiBhdCBhbGwgcG9zc2libGUuIElmIHRoaXMKLSAqCXR0eSB3YXMgcHJldmlvdXMgc3RvcHBlZCBhbmQgaXMgbm93IGJlaW5nIHN0YXJ0ZWQsIHRoZSBkcml2ZXIKLSAqCXN0YXJ0IG1ldGhvZCBpcyBpbnZva2VkIGFuZCB0aGUgbGluZSBkaXNjaXBsaW5lIHdva2VuLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJZmxvd19sb2NrCi0gKi8KLQotdm9pZCBfX3N0YXJ0X3R0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmICghdHR5LT5zdG9wcGVkIHx8IHR0eS0+Zmxvd19zdG9wcGVkKQotCQlyZXR1cm47Ci0JdHR5LT5zdG9wcGVkID0gMDsKLQlpZiAodHR5LT5vcHMtPnN0YXJ0KQotCQl0dHktPm9wcy0+c3RhcnQodHR5KTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLXZvaWQgc3RhcnRfdHR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmZsb3dfbG9jaywgZmxhZ3MpOwotCV9fc3RhcnRfdHR5KHR0eSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5mbG93X2xvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0woc3RhcnRfdHR5KTsKLQotc3RhdGljIHZvaWQgdHR5X3VwZGF0ZV90aW1lKHN0cnVjdCB0aW1lc3BlYzY0ICp0aW1lKQotewotCXRpbWU2NF90IHNlYyA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKTsKLQotCS8qCi0JICogV2Ugb25seSBjYXJlIGlmIHRoZSB0d28gdmFsdWVzIGRpZmZlciBpbiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZQotCSAqIGxvd2VyIHRocmVlIGJpdHMgKGkuZSBldmVyeSA4IHNlY29uZHMpLiAgSWYgc28sIHRoZW4gd2UgY2FuIHVwZGF0ZQotCSAqIHRoZSB0aW1lIG9mIHRoZSB0dHkgZGV2aWNlLCBvdGhlcndpc2UgaXQgY291bGQgYmUgY29uc3RydWRlZCBhcyBhCi0JICogc2VjdXJpdHkgbGVhayB0byBsZXQgdXNlcnNwYWNlIGtub3cgdGhlIGV4YWN0IHRpbWluZyBvZiB0aGUgdHR5LgotCSAqLwotCWlmICgoc2VjIF4gdGltZS0+dHZfc2VjKSAmIH43KQotCQl0aW1lLT50dl9zZWMgPSBzZWM7Ci19Ci0KLS8qCi0gKiBJdGVyYXRlIG9uIHRoZSBsZGlzYyAtPnJlYWQoKSBmdW5jdGlvbiB1bnRpbCB3ZSd2ZSBnb3R0ZW4gYWxsCi0gKiB0aGUgZGF0YSB0aGUgbGRpc2MgaGFzIGZvciB1cy4KLSAqCi0gKiBUaGUgImNvb2tpZSIgaXMgc29tZXRoaW5nIHRoYXQgdGhlIGxkaXNjIHJlYWQgZnVuY3Rpb24gY2FuIGZpbGwKLSAqIGluIHRvIGxldCB1cyBrbm93IHRoYXQgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGJlIGhhZC4KLSAqCi0gKiBXZSBwcm9taXNlIHRvIGNvbnRpbnVlIHRvIGNhbGwgdGhlIGxkaXNjIHVudGlsIGl0IHN0b3BzIHJldHVybmluZwotICogZGF0YSBvciBjbGVhcnMgdGhlIGNvb2tpZS4gVGhlIGNvb2tpZSBtYXkgYmUgc29tZXRoaW5nIHRoYXQgdGhlCi0gKiBsZGlzYyBtYWludGFpbnMgc3RhdGUgZm9yIGFuZCBuZWVkcyB0byBmcmVlLgotICovCi1zdGF0aWMgaW50IGl0ZXJhdGVfdHR5X3JlYWQoc3RydWN0IHR0eV9sZGlzYyAqbGQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCXN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQotewotCWludCByZXR2YWwgPSAwOwotCXZvaWQgKmNvb2tpZSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCWNoYXIga2VybmVsX2J1Zls2NF07Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQodG8pOwotCi0JZG8gewotCQlpbnQgc2l6ZSwgY29waWVkOwotCi0JCXNpemUgPSBjb3VudCA+IHNpemVvZihrZXJuZWxfYnVmKSA/IHNpemVvZihrZXJuZWxfYnVmKSA6IGNvdW50OwotCQlzaXplID0gbGQtPm9wcy0+cmVhZCh0dHksIGZpbGUsIGtlcm5lbF9idWYsIHNpemUsICZjb29raWUsIG9mZnNldCk7Ci0JCWlmICghc2l6ZSkKLQkJCWJyZWFrOwotCi0JCWlmIChzaXplIDwgMCkgewotCQkJLyogRGlkIHdlIGhhdmUgYW4gZWFybGllciBlcnJvciAoaWUgLUVGQVVMVCk/ICovCi0JCQlpZiAocmV0dmFsKQotCQkJCWJyZWFrOwotCQkJcmV0dmFsID0gc2l6ZTsKLQotCQkJLyoKLQkJCSAqIC1FT1ZFUkZMT1cgbWVhbnMgd2UgZGlkbid0IGhhdmUgZW5vdWdoIHNwYWNlCi0JCQkgKiBmb3IgYSB3aG9sZSBwYWNrZXQsIGFuZCB3ZSBzaG91bGRuJ3QgcmV0dXJuCi0JCQkgKiBhIHBhcnRpYWwgcmVzdWx0LgotCQkJICovCi0JCQlpZiAocmV0dmFsID09IC1FT1ZFUkZMT1cpCi0JCQkJb2Zmc2V0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY29waWVkID0gY29weV90b19pdGVyKGtlcm5lbF9idWYsIHNpemUsIHRvKTsKLQkJb2Zmc2V0ICs9IGNvcGllZDsKLQkJY291bnQgLT0gY29waWVkOwotCi0JCS8qCi0JCSAqIElmIHRoZSB1c2VyIGNvcHkgZmFpbGVkLCB3ZSBzdGlsbCBuZWVkIHRvIGRvIGFub3RoZXIgLT5yZWFkKCkKLQkJICogY2FsbCBpZiB3ZSBoYWQgYSBjb29raWUgdG8gbGV0IHRoZSBsZGlzYyBjbGVhciB1cC4KLQkJICoKLQkJICogQnV0IG1ha2Ugc3VyZSBzaXplIGlzIHplcm9lZC4KLQkJICovCi0JCWlmICh1bmxpa2VseShjb3BpZWQgIT0gc2l6ZSkpIHsKLQkJCWNvdW50ID0gMDsKLQkJCXJldHZhbCA9IC1FRkFVTFQ7Ci0JCX0KLQl9IHdoaWxlIChjb29raWUpOwotCi0JLyogV2UgYWx3YXlzIGNsZWFyIHR0eSBidWZmZXIgaW4gY2FzZSB0aGV5IGNvbnRhaW5lZCBwYXNzd29yZHMgKi8KLQltZW16ZXJvX2V4cGxpY2l0KGtlcm5lbF9idWYsIHNpemVvZihrZXJuZWxfYnVmKSk7Ci0JcmV0dXJuIG9mZnNldCA/IG9mZnNldCA6IHJldHZhbDsKLX0KLQotCi0vKioKLSAqCXR0eV9yZWFkCS0JcmVhZCBtZXRob2QgZm9yIHR0eSBkZXZpY2UgZmlsZXMKLSAqCUBmaWxlOiBwb2ludGVyIHRvIHR0eSBmaWxlCi0gKglAYnVmOiB1c2VyIGJ1ZmZlcgotICoJQGNvdW50OiBzaXplIG9mIHVzZXIgYnVmZmVyCi0gKglAcHBvczogdW51c2VkCi0gKgotICoJUGVyZm9ybSB0aGUgcmVhZCBzeXN0ZW0gY2FsbCBmdW5jdGlvbiBvbiB0aGlzIHRlcm1pbmFsIGRldmljZS4gQ2hlY2tzCi0gKglmb3IgaHVuZyB1cCBkZXZpY2VzIGJlZm9yZSBjYWxsaW5nIHRoZSBsaW5lIGRpc2NpcGxpbmUgbWV0aG9kLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJTG9ja3MgdGhlIGxpbmUgZGlzY2lwbGluZSBpbnRlcm5hbGx5IHdoaWxlIG5lZWRlZC4gTXVsdGlwbGUKLSAqCXJlYWQgY2FsbHMgbWF5IGJlIG91dHN0YW5kaW5nIGluIHBhcmFsbGVsLgotICovCi0KLXN0YXRpYyBzc2l6ZV90IHR0eV9yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbGUpOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCi0JaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X3JlYWQiKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKCF0dHkgfHwgdHR5X2lvX2Vycm9yKHR0eSkpCi0JCXJldHVybiAtRUlPOwotCi0JLyogV2Ugd2FudCB0byB3YWl0IGZvciB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIHNvcnQgb3V0IGluIHRoaXMKLQkgICBzaXR1YXRpb24gKi8KLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmICghbGQpCi0JCXJldHVybiBodW5nX3VwX3R0eV9yZWFkKGlvY2IsIHRvKTsKLQlpID0gLUVJTzsKLQlpZiAobGQtPm9wcy0+cmVhZCkKLQkJaSA9IGl0ZXJhdGVfdHR5X3JlYWQobGQsIHR0eSwgZmlsZSwgdG8pOwotCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0KLQlpZiAoaSA+IDApCi0JCXR0eV91cGRhdGVfdGltZSgmaW5vZGUtPmlfYXRpbWUpOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR0eV93cml0ZV91bmxvY2soc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQltdXRleF91bmxvY2soJnR0eS0+YXRvbWljX3dyaXRlX2xvY2spOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZ0dHktPndyaXRlX3dhaXQsIEVQT0xMT1VUKTsKLX0KLQotc3RhdGljIGludCB0dHlfd3JpdGVfbG9jayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgbmRlbGF5KQotewotCWlmICghbXV0ZXhfdHJ5bG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jaykpIHsKLQkJaWYgKG5kZWxheSkKLQkJCXJldHVybiAtRUFHQUlOOwotCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0dHktPmF0b21pY193cml0ZV9sb2NrKSkKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogU3BsaXQgd3JpdGVzIHVwIGluIHNhbmUgYmxvY2tzaXplcyB0byBhdm9pZAotICogZGVuaWFsLW9mLXNlcnZpY2UgdHlwZSBhdHRhY2tzCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBkb190dHlfd3JpdGUoCi0Jc3NpemVfdCAoKndyaXRlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgZmlsZSAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHNpemVfdCksCi0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQlzdHJ1Y3QgZmlsZSAqZmlsZSwKLQlzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCi17Ci0Jc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoZnJvbSk7Ci0Jc3NpemVfdCByZXQsIHdyaXR0ZW4gPSAwOwotCXVuc2lnbmVkIGludCBjaHVuazsKLQotCXJldCA9IHR0eV93cml0ZV9sb2NrKHR0eSwgZmlsZS0+Zl9mbGFncyAmIE9fTkRFTEFZKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogV2UgY2h1bmsgdXAgd3JpdGVzIGludG8gYSB0ZW1wb3JhcnkgYnVmZmVyLiBUaGlzCi0JICogc2ltcGxpZmllcyBsb3ctbGV2ZWwgZHJpdmVycyBpbW1lbnNlbHksIHNpbmNlIHRoZXkKLQkgKiBkb24ndCBoYXZlIGxvY2tpbmcgaXNzdWVzIGFuZCB1c2VyIG1vZGUgYWNjZXNzZXMuCi0JICoKLQkgKiBCdXQgaWYgVFRZX05PX1dSSVRFX1NQTElUIGlzIHNldCwgd2Ugc2hvdWxkIHVzZSBhCi0JICogYmlnIGNodW5rLXNpemUuLgotCSAqCi0JICogVGhlIGRlZmF1bHQgY2h1bmstc2l6ZSBpcyAya0IsIGJlY2F1c2UgdGhlIE5UVFkKLQkgKiBsYXllciBoYXMgcHJvYmxlbXMgd2l0aCBiaWdnZXIgY2h1bmtzLiBJdCB3aWxsCi0JICogY2xhaW0gdG8gYmUgYWJsZSB0byBoYW5kbGUgbW9yZSBjaGFyYWN0ZXJzIHRoYW4KLQkgKiBpdCBhY3R1YWxseSBkb2VzLgotCSAqCi0JICogRklYTUU6IFRoaXMgY2FuIHByb2JhYmx5IGdvIGF3YXkgbm93IGV4Y2VwdCB0aGF0IDY0SyBjaHVua3MKLQkgKiBhcmUgdG9vIGxpa2VseSB0byBmYWlsIHVubGVzcyBzd2l0Y2hlZCB0byB2bWFsbG9jLi4uCi0JICovCi0JY2h1bmsgPSAyMDQ4OwotCWlmICh0ZXN0X2JpdChUVFlfTk9fV1JJVEVfU1BMSVQsICZ0dHktPmZsYWdzKSkKLQkJY2h1bmsgPSA2NTUzNjsKLQlpZiAoY291bnQgPCBjaHVuaykKLQkJY2h1bmsgPSBjb3VudDsKLQotCS8qIHdyaXRlX2J1Zi93cml0ZV9jbnQgaXMgcHJvdGVjdGVkIGJ5IHRoZSBhdG9taWNfd3JpdGVfbG9jayBtdXRleCAqLwotCWlmICh0dHktPndyaXRlX2NudCA8IGNodW5rKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmJ1Zl9jaHVuazsKLQotCQlpZiAoY2h1bmsgPCAxMDI0KQotCQkJY2h1bmsgPSAxMDI0OwotCi0JCWJ1Zl9jaHVuayA9IGttYWxsb2MoY2h1bmssIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1Zl9jaHVuaykgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWtmcmVlKHR0eS0+d3JpdGVfYnVmKTsKLQkJdHR5LT53cml0ZV9jbnQgPSBjaHVuazsKLQkJdHR5LT53cml0ZV9idWYgPSBidWZfY2h1bms7Ci0JfQotCi0JLyogRG8gdGhlIHdyaXRlIC4uICovCi0JZm9yICg7OykgewotCQlzaXplX3Qgc2l6ZSA9IGNvdW50OwotCQlpZiAoc2l6ZSA+IGNodW5rKQotCQkJc2l6ZSA9IGNodW5rOwotCi0JCXJldCA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21faXRlcih0dHktPndyaXRlX2J1Ziwgc2l6ZSwgZnJvbSkgIT0gc2l6ZSkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHdyaXRlKHR0eSwgZmlsZSwgdHR5LT53cml0ZV9idWYsIHNpemUpOwotCQlpZiAocmV0IDw9IDApCi0JCQlicmVhazsKLQotCQl3cml0dGVuICs9IHJldDsKLQkJaWYgKHJldCA+IHNpemUpCi0JCQlicmVhazsKLQotCQkvKiBGSVhNRSEgSGF2ZSBBbCBjaGVjayB0aGlzISAqLwotCQlpZiAocmV0ICE9IHNpemUpCi0JCQlpb3ZfaXRlcl9yZXZlcnQoZnJvbSwgc2l6ZS1yZXQpOwotCi0JCWNvdW50IC09IHJldDsKLQkJaWYgKCFjb3VudCkKLQkJCWJyZWFrOwotCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0JaWYgKHdyaXR0ZW4pIHsKLQkJdHR5X3VwZGF0ZV90aW1lKCZmaWxlX2lub2RlKGZpbGUpLT5pX210aW1lKTsKLQkJcmV0ID0gd3JpdHRlbjsKLQl9Ci1vdXQ6Ci0JdHR5X3dyaXRlX3VubG9jayh0dHkpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogdHR5X3dyaXRlX21lc3NhZ2UgLSB3cml0ZSBhIG1lc3NhZ2UgdG8gYSBjZXJ0YWluIHR0eSwgbm90IGp1c3QgdGhlIGNvbnNvbGUuCi0gKiBAdHR5OiB0aGUgZGVzdGluYXRpb24gdHR5X3N0cnVjdAotICogQG1zZzogdGhlIG1lc3NhZ2UgdG8gd3JpdGUKLSAqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIG1lc3NhZ2VzIHRoYXQgbmVlZCB0byBiZSByZWRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgdHR5LgotICogV2UgZG9uJ3QgcHV0IGl0IGludG8gdGhlIHN5c2xvZyBxdWV1ZSByaWdodCBub3cgbWF5YmUgaW4gdGhlIGZ1dHVyZSBpZgotICogcmVhbGx5IG5lZWRlZC4KLSAqCi0gKiBXZSBtdXN0IHN0aWxsIGhvbGQgdGhlIEJUTSBhbmQgdGVzdCB0aGUgQ0xPU0lORyBmbGFnIGZvciB0aGUgbW9tZW50LgotICovCi0KLXZvaWQgdHR5X3dyaXRlX21lc3NhZ2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciAqbXNnKQotewotCWlmICh0dHkpIHsKLQkJbXV0ZXhfbG9jaygmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7Ci0JCXR0eV9sb2NrKHR0eSk7Ci0JCWlmICh0dHktPm9wcy0+d3JpdGUgJiYgdHR5LT5jb3VudCA+IDApCi0JCQl0dHktPm9wcy0+d3JpdGUodHR5LCBtc2csIHN0cmxlbihtc2cpKTsKLQkJdHR5X3VubG9jayh0dHkpOwotCQl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7Ci0JfQotCXJldHVybjsKLX0KLQotCi0vKioKLSAqCXR0eV93cml0ZQkJLQl3cml0ZSBtZXRob2QgZm9yIHR0eSBkZXZpY2UgZmlsZQotICoJQGZpbGU6IHR0eSBmaWxlIHBvaW50ZXIKLSAqCUBidWY6IHVzZXIgZGF0YSB0byB3cml0ZQotICoJQGNvdW50OiBieXRlcyB0byB3cml0ZQotICoJQHBwb3M6IHVudXNlZAotICoKLSAqCVdyaXRlIGRhdGEgdG8gYSB0dHkgZGV2aWNlIHZpYSB0aGUgbGluZSBkaXNjaXBsaW5lLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJTG9ja3MgdGhlIGxpbmUgZGlzY2lwbGluZSBhcyByZXF1aXJlZAotICoJCVdyaXRlcyB0byB0aGUgdHR5IGRyaXZlciBhcmUgc2VyaWFsaXplZCBieSB0aGUgYXRvbWljX3dyaXRlX2xvY2sKLSAqCWFuZCBhcmUgdGhlbiBwcm9jZXNzZWQgaW4gY2h1bmtzIHRvIHRoZSBkZXZpY2UuIFRoZSBsaW5lIGRpc2NpcGxpbmUKLSAqCXdyaXRlIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkIGluIHBhcmFsbGVsIGZvciBlYWNoIGRldmljZS4KLSAqLwotCi1zdGF0aWMgc3NpemVfdCBmaWxlX3R0eV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbGUpOwotIAlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQlzc2l6ZV90IHJldDsKLQotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxlX2lub2RlKGZpbGUpLCAidHR5X3dyaXRlIikpCi0JCXJldHVybiAtRUlPOwotCWlmICghdHR5IHx8ICF0dHktPm9wcy0+d3JpdGUgfHwJdHR5X2lvX2Vycm9yKHR0eSkpCi0JCQlyZXR1cm4gLUVJTzsKLQkvKiBTaG9ydCB0ZXJtIGRlYnVnIHRvIGNhdGNoIGJ1Z2d5IGRyaXZlcnMgKi8KLQlpZiAodHR5LT5vcHMtPndyaXRlX3Jvb20gPT0gTlVMTCkKLQkJdHR5X2Vycih0dHksICJtaXNzaW5nIHdyaXRlX3Jvb20gbWV0aG9kXG4iKTsKLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmICghbGQpCi0JCXJldHVybiBodW5nX3VwX3R0eV93cml0ZShpb2NiLCBmcm9tKTsKLQlpZiAoIWxkLT5vcHMtPndyaXRlKQotCQlyZXQgPSAtRUlPOwotCWVsc2UKLQkJcmV0ID0gZG9fdHR5X3dyaXRlKGxkLT5vcHMtPndyaXRlLCB0dHksIGZpbGUsIGZyb20pOwotCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgdHR5X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQotewotCXJldHVybiBmaWxlX3R0eV93cml0ZShpb2NiLT5raV9maWxwLCBpb2NiLCBmcm9tKTsKLX0KLQotc3NpemVfdCByZWRpcmVjdGVkX3R0eV93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlcikKLXsKLQlzdHJ1Y3QgZmlsZSAqcCA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJnJlZGlyZWN0X2xvY2spOwotCWlmIChyZWRpcmVjdCkKLQkJcCA9IGdldF9maWxlKHJlZGlyZWN0KTsKLQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7Ci0KLQkvKgotCSAqIFdlIGtub3cgdGhlIHJlZGlyZWN0ZWQgdHR5IGlzIGp1c3QgYW5vdGhlciB0dHksIHdlIGNhbiBjYW4KLQkgKiBjYWxsIGZpbGVfdHR5X3dyaXRlKCkgZGlyZWN0bHkgd2l0aCB0aGF0IGZpbGUgcG9pbnRlci4KLQkgKi8KLQlpZiAocCkgewotCQlzc2l6ZV90IHJlczsKLQkJcmVzID0gZmlsZV90dHlfd3JpdGUocCwgaW9jYiwgaXRlcik7Ci0JCWZwdXQocCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCXJldHVybiB0dHlfd3JpdGUoaW9jYiwgaXRlcik7Ci19Ci0KLS8qKgotICoJdHR5X3NlbmRfeGNoYXIJLQlzZW5kIHByaW9yaXR5IGNoYXJhY3RlcgotICoKLSAqCVNlbmQgYSBoaWdoIHByaW9yaXR5IGNoYXJhY3RlciB0byB0aGUgdHR5IGV2ZW4gaWYgc3RvcHBlZAotICoKLSAqCUxvY2tpbmc6IG5vbmUgZm9yIHhjaGFyIG1ldGhvZCwgd3JpdGUgb3JkZXJpbmcgZm9yIHdyaXRlIG1ldGhvZC4KLSAqLwotCi1pbnQgdHR5X3NlbmRfeGNoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBjaCkKLXsKLQlpbnQJd2FzX3N0b3BwZWQgPSB0dHktPnN0b3BwZWQ7Ci0KLQlpZiAodHR5LT5vcHMtPnNlbmRfeGNoYXIpIHsKLQkJZG93bl9yZWFkKCZ0dHktPnRlcm1pb3NfcndzZW0pOwotCQl0dHktPm9wcy0+c2VuZF94Y2hhcih0dHksIGNoKTsKLQkJdXBfcmVhZCgmdHR5LT50ZXJtaW9zX3J3c2VtKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHR0eV93cml0ZV9sb2NrKHR0eSwgMCkgPCAwKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JZG93bl9yZWFkKCZ0dHktPnRlcm1pb3NfcndzZW0pOwotCWlmICh3YXNfc3RvcHBlZCkKLQkJc3RhcnRfdHR5KHR0eSk7Ci0JdHR5LT5vcHMtPndyaXRlKHR0eSwgJmNoLCAxKTsKLQlpZiAod2FzX3N0b3BwZWQpCi0JCXN0b3BfdHR5KHR0eSk7Ci0JdXBfcmVhZCgmdHR5LT50ZXJtaW9zX3J3c2VtKTsKLQl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjaGFyIHB0eWNoYXJbXSA9ICJwcXJzdHV2d3h5emFiY2RlIjsKLQotLyoqCi0gKglwdHlfbGluZV9uYW1lCS0JZ2VuZXJhdGUgbmFtZSBmb3IgYSBwdHkKLSAqCUBkcml2ZXI6IHRoZSB0dHkgZHJpdmVyIGluIHVzZQotICoJQGluZGV4OiB0aGUgbWlub3IgbnVtYmVyCi0gKglAcDogb3V0cHV0IGJ1ZmZlciBvZiBhdCBsZWFzdCA2IGJ5dGVzCi0gKgotICoJR2VuZXJhdGUgYSBuYW1lIGZyb20gYSBkcml2ZXIgcmVmZXJlbmNlIGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0Ci0gKglidWZmZXIuCi0gKgotICoJTG9ja2luZzogTm9uZQotICovCi1zdGF0aWMgdm9pZCBwdHlfbGluZV9uYW1lKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpbmRleCwgY2hhciAqcCkKLXsKLQlpbnQgaSA9IGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2U7Ci0JLyogLT5uYW1lIGlzIGluaXRpYWxpemVkIHRvICJ0dHlwIiwgYnV0ICJ0dHkiIGlzIGV4cGVjdGVkICovCi0Jc3ByaW50ZihwLCAiJXMlYyV4IiwKLQkJZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX1NMQVZFID8gInR0eSIgOiBkcml2ZXItPm5hbWUsCi0JCXB0eWNoYXJbaSA+PiA0ICYgMHhmXSwgaSAmIDB4Zik7Ci19Ci0KLS8qKgotICoJdHR5X2xpbmVfbmFtZQktCWdlbmVyYXRlIG5hbWUgZm9yIGEgdHR5Ci0gKglAZHJpdmVyOiB0aGUgdHR5IGRyaXZlciBpbiB1c2UKLSAqCUBpbmRleDogdGhlIG1pbm9yIG51bWJlcgotICoJQHA6IG91dHB1dCBidWZmZXIgb2YgYXQgbGVhc3QgNyBieXRlcwotICoKLSAqCUdlbmVyYXRlIGEgbmFtZSBmcm9tIGEgZHJpdmVyIHJlZmVyZW5jZSBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dAotICoJYnVmZmVyLgotICoKLSAqCUxvY2tpbmc6IE5vbmUKLSAqLwotc3RhdGljIHNzaXplX3QgdHR5X2xpbmVfbmFtZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaW5kZXgsIGNoYXIgKnApCi17Ci0JaWYgKGRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1VOTlVNQkVSRURfTk9ERSkKLQkJcmV0dXJuIHNwcmludGYocCwgIiVzIiwgZHJpdmVyLT5uYW1lKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKHAsICIlcyVkIiwgZHJpdmVyLT5uYW1lLAotCQkJICAgICAgIGluZGV4ICsgZHJpdmVyLT5uYW1lX2Jhc2UpOwotfQotCi0vKioKLSAqCXR0eV9kcml2ZXJfbG9va3VwX3R0eSgpIC0gZmluZCBhbiBleGlzdGluZyB0dHksIGlmIGFueQotICoJQGRyaXZlcjogdGhlIGRyaXZlciBmb3IgdGhlIHR0eQotICoJQGlkeDoJIHRoZSBtaW5vciBudW1iZXIKLSAqCi0gKglSZXR1cm4gdGhlIHR0eSwgaWYgZm91bmQuIElmIG5vdCBmb3VuZCwgcmV0dXJuIE5VTEwgb3IgRVJSX1BUUigpIGlmIHRoZQotICoJZHJpdmVyIGxvb2t1cCgpIG1ldGhvZCByZXR1cm5zIGFuIGVycm9yLgotICoKLSAqCUxvY2tpbmc6IHR0eV9tdXRleCBtdXN0IGJlIGhlbGQuIElmIHRoZSB0dHkgaXMgZm91bmQsIGJ1bXAgdGhlIHR0eSBrcmVmLgotICovCi1zdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9kcml2ZXJfbG9va3VwX3R0eShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLAotCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGlkeCkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCi0JaWYgKGRyaXZlci0+b3BzLT5sb29rdXApCi0JCWlmICghZmlsZSkKLQkJCXR0eSA9IEVSUl9QVFIoLUVJTyk7Ci0JCWVsc2UKLQkJCXR0eSA9IGRyaXZlci0+b3BzLT5sb29rdXAoZHJpdmVyLCBmaWxlLCBpZHgpOwotCWVsc2UKLQkJdHR5ID0gZHJpdmVyLT50dHlzW2lkeF07Ci0KLQlpZiAoIUlTX0VSUih0dHkpKQotCQl0dHlfa3JlZl9nZXQodHR5KTsKLQlyZXR1cm4gdHR5OwotfQotCi0vKioKLSAqCXR0eV9pbml0X3Rlcm1pb3MJLSAgaGVscGVyIGZvciB0ZXJtaW9zIHNldHVwCi0gKglAdHR5OiB0aGUgdHR5IHRvIHNldCB1cAotICoKLSAqCUluaXRpYWxpc2UgdGhlIHRlcm1pb3Mgc3RydWN0dXJlIGZvciB0aGlzIHR0eS4gVGhpcyBydW5zIHVuZGVyCi0gKgl0aGUgdHR5X211dGV4IGN1cnJlbnRseSBzbyB3ZSBjYW4gYmUgcmVsYXhlZCBhYm91dCBvcmRlcmluZy4KLSAqLwotCi12b2lkIHR0eV9pbml0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qga3Rlcm1pb3MgKnRwOwotCWludCBpZHggPSB0dHktPmluZGV4OwotCi0JaWYgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykKLQkJdHR5LT50ZXJtaW9zID0gdHR5LT5kcml2ZXItPmluaXRfdGVybWlvczsKLQllbHNlIHsKLQkJLyogQ2hlY2sgZm9yIGxhenkgc2F2ZWQgZGF0YSAqLwotCQl0cCA9IHR0eS0+ZHJpdmVyLT50ZXJtaW9zW2lkeF07Ci0JCWlmICh0cCAhPSBOVUxMKSB7Ci0JCQl0dHktPnRlcm1pb3MgPSAqdHA7Ci0JCQl0dHktPnRlcm1pb3MuY19saW5lICA9IHR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19saW5lOwotCQl9IGVsc2UKLQkJCXR0eS0+dGVybWlvcyA9IHR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3M7Ci0JfQotCS8qIENvbXBhdGliaWxpdHkgdW50aWwgZHJpdmVycyBhbHdheXMgc2V0IHRoaXMgKi8KLQl0dHktPnRlcm1pb3MuY19pc3BlZWQgPSB0dHlfdGVybWlvc19pbnB1dF9iYXVkX3JhdGUoJnR0eS0+dGVybWlvcyk7Ci0JdHR5LT50ZXJtaW9zLmNfb3NwZWVkID0gdHR5X3Rlcm1pb3NfYmF1ZF9yYXRlKCZ0dHktPnRlcm1pb3MpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodHR5X2luaXRfdGVybWlvcyk7Ci0KLWludCB0dHlfc3RhbmRhcmRfaW5zdGFsbChzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXR0eV9pbml0X3Rlcm1pb3ModHR5KTsKLQl0dHlfZHJpdmVyX2tyZWZfZ2V0KGRyaXZlcik7Ci0JdHR5LT5jb3VudCsrOwotCWRyaXZlci0+dHR5c1t0dHktPmluZGV4XSA9IHR0eTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9zdGFuZGFyZF9pbnN0YWxsKTsKLQotLyoqCi0gKgl0dHlfZHJpdmVyX2luc3RhbGxfdHR5KCkgLSBpbnN0YWxsIGEgdHR5IGVudHJ5IGluIHRoZSBkcml2ZXIKLSAqCUBkcml2ZXI6IHRoZSBkcml2ZXIgZm9yIHRoZSB0dHkKLSAqCUB0dHk6IHRoZSB0dHkKLSAqCi0gKglJbnN0YWxsIGEgdHR5IG9iamVjdCBpbnRvIHRoZSBkcml2ZXIgdGFibGVzLiBUaGUgdHR5LT5pbmRleCBmaWVsZAotICoJd2lsbCBiZSBzZXQgYnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQuIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlCi0gKglmb3IgZW5zdXJpbmcgYW55IG5lZWQgYWRkaXRpb25hbCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgYW5kCi0gKgljb25maWd1cmVkLgotICoKLSAqCUxvY2tpbmc6IHR0eV9tdXRleCBmb3Igbm93Ci0gKi8KLXN0YXRpYyBpbnQgdHR5X2RyaXZlcl9pbnN0YWxsX3R0eShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLAotCQkJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlyZXR1cm4gZHJpdmVyLT5vcHMtPmluc3RhbGwgPyBkcml2ZXItPm9wcy0+aW5zdGFsbChkcml2ZXIsIHR0eSkgOgotCQl0dHlfc3RhbmRhcmRfaW5zdGFsbChkcml2ZXIsIHR0eSk7Ci19Ci0KLS8qKgotICoJdHR5X2RyaXZlcl9yZW1vdmVfdHR5KCkgLSByZW1vdmUgYSB0dHkgZnJvbSB0aGUgZHJpdmVyIHRhYmxlcwotICoJQGRyaXZlcjogdGhlIGRyaXZlciBmb3IgdGhlIHR0eQotICoJQHR0eTogdHR5IHRvIHJlbW92ZQotICoKLSAqCVJlbXZvZSBhIHR0eSBvYmplY3QgZnJvbSB0aGUgZHJpdmVyIHRhYmxlcy4gVGhlIHR0eS0+aW5kZXggZmllbGQKLSAqCXdpbGwgYmUgc2V0IGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLgotICoKLSAqCUxvY2tpbmc6IHR0eV9tdXRleCBmb3Igbm93Ci0gKi8KLXN0YXRpYyB2b2lkIHR0eV9kcml2ZXJfcmVtb3ZlX3R0eShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmIChkcml2ZXItPm9wcy0+cmVtb3ZlKQotCQlkcml2ZXItPm9wcy0+cmVtb3ZlKGRyaXZlciwgdHR5KTsKLQllbHNlCi0JCWRyaXZlci0+dHR5c1t0dHktPmluZGV4XSA9IE5VTEw7Ci19Ci0KLS8qKgotICoJdHR5X3Jlb3BlbigpCS0gZmFzdCByZS1vcGVuIG9mIGFuIG9wZW4gdHR5Ci0gKglAdHR5OiB0aGUgdHR5IHRvIG9wZW4KLSAqCi0gKglSZXR1cm4gMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZXJyb3IuCi0gKglSZS1vcGVucyBvbiBtYXN0ZXIgcHR5cyBhcmUgbm90IGFsbG93ZWQgYW5kIHJldHVybiAtRUlPLgotICoKLSAqCUxvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdHR5X2xvY2sKLSAqLwotc3RhdGljIGludCB0dHlfcmVvcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciA9IHR0eS0+ZHJpdmVyOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKGRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCi0JICAgIGRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKCF0dHktPmNvdW50KQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWlmICh0ZXN0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncykgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmIChsZCkgewotCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCX0gZWxzZSB7Ci0JCXJldHZhbCA9IHR0eV9sZGlzY19sb2NrKHR0eSwgNSAqIEhaKTsKLQkJaWYgKHJldHZhbCkKLQkJCXJldHVybiByZXR2YWw7Ci0KLQkJaWYgKCF0dHktPmxkaXNjKQotCQkJcmV0dmFsID0gdHR5X2xkaXNjX3JlaW5pdCh0dHksIHR0eS0+dGVybWlvcy5jX2xpbmUpOwotCQl0dHlfbGRpc2NfdW5sb2NrKHR0eSk7Ci0JfQotCi0JaWYgKHJldHZhbCA9PSAwKQotCQl0dHktPmNvdW50Kys7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqCXR0eV9pbml0X2RldgkJLQlpbml0aWFsaXNlIGEgdHR5IGRldmljZQotICoJQGRyaXZlcjogdHR5IGRyaXZlciB3ZSBhcmUgb3BlbmluZyBhIGRldmljZSBvbgotICoJQGlkeDogZGV2aWNlIGluZGV4Ci0gKgotICoJUHJlcGFyZSBhIHR0eSBkZXZpY2UuIFRoaXMgbWF5IG5vdCBiZSBhICJuZXciIGNsZWFuIGRldmljZSBidXQKLSAqCWNvdWxkIGFsc28gYmUgYW4gYWN0aXZlIGRldmljZS4gVGhlIHB0eSBkcml2ZXJzIHJlcXVpcmUgc3BlY2lhbAotICoJaGFuZGxpbmcgYmVjYXVzZSBvZiB0aGlzLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB1bmRlciB0aGUgdHR5X211dGV4LCB3aGljaAotICoJcHJvdGVjdHMgdXMgZnJvbSB0aGUgdHR5IHN0cnVjdCBvciBkcml2ZXIgaXRzZWxmIGdvaW5nIGF3YXkuCi0gKgotICoJT24gZXhpdCB0aGUgdHR5IGRldmljZSBoYXMgdGhlIGxpbmUgZGlzY2lwbGluZSBhdHRhY2hlZCBhbmQKLSAqCWEgcmVmZXJlbmNlIGNvdW50IG9mIDEuIElmIGEgcGFpciB3YXMgY3JlYXRlZCBmb3IgcHR5L3R0eSB1c2UKLSAqCWFuZCB0aGUgb3RoZXIgd2FzIGEgcHR5IG1hc3RlciB0aGVuIGl0IHRvbyBoYXMgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAqCi0gKiBXU0ggMDYvMDkvOTc6IFJld3JpdHRlbiB0byByZW1vdmUgcmFjZXMgYW5kIHByb3Blcmx5IGNsZWFuIHVwIGFmdGVyIGEKLSAqIGZhaWxlZCBvcGVuLiAgVGhlIG5ldyBjb2RlIHByb3RlY3RzIHRoZSBvcGVuIHdpdGggYSBtdXRleCwgc28gaXQncwotICogcmVhbGx5IHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZC4gIFRoZSBtdXRleCBsb2NraW5nIGNhbiBwcm9iYWJseSBiZQotICogcmVsYXhlZCBmb3IgdGhlIChtb3N0IGNvbW1vbikgY2FzZSBvZiByZW9wZW5pbmcgYSB0dHkuCi0gKgotICoJUmV0dXJuOiByZXR1cm5lZCB0dHkgc3RydWN0dXJlCi0gKi8KLQotc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9pbml0X2RldihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBpbnQgaWR4KQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JaW50IHJldHZhbDsKLQotCS8qCi0JICogRmlyc3QgdGltZSBvcGVuIGlzIGNvbXBsZXgsIGVzcGVjaWFsbHkgZm9yIFBUWSBkZXZpY2VzLgotCSAqIFRoaXMgY29kZSBndWFyYW50ZWVzIHRoYXQgZWl0aGVyIGV2ZXJ5dGhpbmcgc3VjY2VlZHMgYW5kIHRoZQotCSAqIFRUWSBpcyByZWFkeSBmb3Igb3BlcmF0aW9uLCBvciBlbHNlIHRoZSB0YWJsZSBzbG90cyBhcmUgdmFjYXRlZAotCSAqIGFuZCB0aGUgYWxsb2NhdGVkIG1lbW9yeSByZWxlYXNlZC4gIChFeGNlcHQgdGhhdCB0aGUgdGVybWlvcwotCSAqIG1heSBiZSByZXRhaW5lZC4pCi0JICovCi0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRyaXZlci0+b3duZXIpKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQotCXR0eSA9IGFsbG9jX3R0eV9zdHJ1Y3QoZHJpdmVyLCBpZHgpOwotCWlmICghdHR5KSB7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX21vZHVsZV9wdXQ7Ci0JfQotCi0JdHR5X2xvY2sodHR5KTsKLQlyZXR2YWwgPSB0dHlfZHJpdmVyX2luc3RhbGxfdHR5KGRyaXZlciwgdHR5KTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJZ290byBlcnJfZnJlZV90dHk7Ci0KLQlpZiAoIXR0eS0+cG9ydCkKLQkJdHR5LT5wb3J0ID0gZHJpdmVyLT5wb3J0c1tpZHhdOwotCi0JaWYgKFdBUk5fUkFURUxJTUlUKCF0dHktPnBvcnQsCi0JCQkiJXM6ICVzIGRyaXZlciBkb2VzIG5vdCBzZXQgdHR5LT5wb3J0LiBUaGlzIHdvdWxkIGNyYXNoIHRoZSBrZXJuZWwuIEZpeCB0aGUgZHJpdmVyIVxuIiwKLQkJCV9fZnVuY19fLCB0dHktPmRyaXZlci0+bmFtZSkpIHsKLQkJcmV0dmFsID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZV9sb2NrOwotCX0KLQotCXJldHZhbCA9IHR0eV9sZGlzY19sb2NrKHR0eSwgNSAqIEhaKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycl9yZWxlYXNlX2xvY2s7Ci0JdHR5LT5wb3J0LT5pdHR5ID0gdHR5OwotCi0JLyoKLQkgKiBTdHJ1Y3R1cmVzIGFsbCBpbnN0YWxsZWQgLi4uIGNhbGwgdGhlIGxkaXNjIG9wZW4gcm91dGluZXMuCi0JICogSWYgd2UgZmFpbCBoZXJlIGp1c3QgY2FsbCByZWxlYXNlX3R0eSB0byBjbGVhbiB1cC4gIE5vIG5lZWQKLQkgKiB0byBkZWNyZW1lbnQgdGhlIHVzZSBjb3VudHMsIGFzIHJlbGVhc2VfdHR5IGRvZXNuJ3QgY2FyZS4KLQkgKi8KLQlyZXR2YWwgPSB0dHlfbGRpc2Nfc2V0dXAodHR5LCB0dHktPmxpbmspOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyX3JlbGVhc2VfdHR5OwotCXR0eV9sZGlzY191bmxvY2sodHR5KTsKLQkvKiBSZXR1cm4gdGhlIHR0eSBsb2NrZWQgc28gdGhhdCBpdCBjYW5ub3QgdmFuaXNoIHVuZGVyIHRoZSBjYWxsZXIgKi8KLQlyZXR1cm4gdHR5OwotCi1lcnJfZnJlZV90dHk6Ci0JdHR5X3VubG9jayh0dHkpOwotCWZyZWVfdHR5X3N0cnVjdCh0dHkpOwotZXJyX21vZHVsZV9wdXQ6Ci0JbW9kdWxlX3B1dChkcml2ZXItPm93bmVyKTsKLQlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOwotCi0JLyogY2FsbCB0aGUgdHR5IHJlbGVhc2VfdHR5IHJvdXRpbmUgdG8gY2xlYW4gb3V0IHRoaXMgc2xvdCAqLwotZXJyX3JlbGVhc2VfdHR5OgotCXR0eV9sZGlzY191bmxvY2sodHR5KTsKLQl0dHlfaW5mb19yYXRlbGltaXRlZCh0dHksICJsZGlzYyBvcGVuIGZhaWxlZCAoJWQpLCBjbGVhcmluZyBzbG90ICVkXG4iLAotCQkJICAgICByZXR2YWwsIGlkeCk7Ci1lcnJfcmVsZWFzZV9sb2NrOgotCXR0eV91bmxvY2sodHR5KTsKLQlyZWxlYXNlX3R0eSh0dHksIGlkeCk7Ci0JcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKLX0KLQotLyoqCi0gKiB0dHlfc2F2ZV90ZXJtaW9zKCkgLSBzYXZlIHR0eSB0ZXJtaW9zIGRhdGEgaW4gZHJpdmVyIHRhYmxlCi0gKiBAdHR5OiB0dHkgd2hvc2UgdGVybWlvcyBkYXRhIHRvIHNhdmUKLSAqCi0gKiBMb2NraW5nOiBDYWxsZXIgZ3VhcmFudGVlcyBzZXJpYWxpc2F0aW9uIHdpdGggdHR5X2luaXRfdGVybWlvcygpLgotICovCi12b2lkIHR0eV9zYXZlX3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3Qga3Rlcm1pb3MgKnRwOwotCWludCBpZHggPSB0dHktPmluZGV4OwotCi0JLyogSWYgdGhlIHBvcnQgaXMgZ29pbmcgdG8gcmVzZXQgdGhlbiBpdCBoYXMgbm8gdGVybWlvcyB0byBzYXZlICovCi0JaWYgKHR0eS0+ZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfUkVTRVRfVEVSTUlPUykKLQkJcmV0dXJuOwotCi0JLyogU3Rhc2ggdGhlIHRlcm1pb3MgZGF0YSAqLwotCXRwID0gdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XTsKLQlpZiAodHAgPT0gTlVMTCkgewotCQl0cCA9IGttYWxsb2Moc2l6ZW9mKCp0cCksIEdGUF9LRVJORUwpOwotCQlpZiAodHAgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJdHR5LT5kcml2ZXItPnRlcm1pb3NbaWR4XSA9IHRwOwotCX0KLQkqdHAgPSB0dHktPnRlcm1pb3M7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfc2F2ZV90ZXJtaW9zKTsKLQotLyoqCi0gKgl0dHlfZmx1c2hfd29ya3MJCS0JZmx1c2ggYWxsIHdvcmtzIG9mIGEgdHR5L3B0eSBwYWlyCi0gKglAdHR5OiB0dHkgZGV2aWNlIHRvIGZsdXNoIHdvcmtzIGZvciAob3IgZWl0aGVyIGVuZCBvZiBhIHB0eSBwYWlyKQotICoKLSAqCVN5bmMgZmx1c2ggYWxsIHdvcmtzIGJlbG9uZ2luZyB0byBAdHR5IChhbmQgdGhlICdvdGhlcicgdHR5KS4KLSAqLwotc3RhdGljIHZvaWQgdHR5X2ZsdXNoX3dvcmtzKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JZmx1c2hfd29yaygmdHR5LT5TQUtfd29yayk7Ci0JZmx1c2hfd29yaygmdHR5LT5oYW5ndXBfd29yayk7Ci0JaWYgKHR0eS0+bGluaykgewotCQlmbHVzaF93b3JrKCZ0dHktPmxpbmstPlNBS193b3JrKTsKLQkJZmx1c2hfd29yaygmdHR5LT5saW5rLT5oYW5ndXBfd29yayk7Ci0JfQotfQotCi0vKioKLSAqCXJlbGVhc2Vfb25lX3R0eQkJLQlyZWxlYXNlIHR0eSBzdHJ1Y3R1cmUgbWVtb3J5Ci0gKglAd29yazogd29yayBvZiB0dHkgd2UgYXJlIG9ibGl0ZXJhdGluZwotICoKLSAqCVJlbGVhc2VzIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYSB0dHkgc3RydWN0dXJlLCBhbmQgY2xlYXJzIG91dCB0aGUKLSAqCWRyaXZlciB0YWJsZSBzbG90cy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyBubyBsb25nZXIKLSAqCWluIHVzZS4gSXQgYWxzbyBnZXRzIGNhbGxlZCB3aGVuIHNldHVwIG9mIGEgZGV2aWNlIGZhaWxzLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJdGFrZXMgdGhlIGZpbGUgbGlzdCBsb2NrIGludGVybmFsbHkgd2hlbiB3b3JraW5nIG9uIHRoZSBsaXN0Ci0gKglvZiB0dHlzIHRoYXQgdGhlIGRyaXZlciBrZWVwcy4KLSAqCi0gKglUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBmcm9tIGEgd29yayBxdWV1ZSBzbyB0aGF0IHRoZSBkcml2ZXIgcHJpdmF0ZQotICoJY2xlYW51cCBvcHMgY2FuIHNsZWVwIChuZWVkZWQgZm9yIFVTQiBhdCBsZWFzdCkKLSAqLwotc3RhdGljIHZvaWQgcmVsZWFzZV9vbmVfdHR5KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dHlfc3RydWN0LCBoYW5ndXBfd29yayk7Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlciA9IHR0eS0+ZHJpdmVyOwotCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gZHJpdmVyLT5vd25lcjsKLQotCWlmICh0dHktPm9wcy0+Y2xlYW51cCkKLQkJdHR5LT5vcHMtPmNsZWFudXAodHR5KTsKLQotCXR0eS0+bWFnaWMgPSAwOwotCXR0eV9kcml2ZXJfa3JlZl9wdXQoZHJpdmVyKTsKLQltb2R1bGVfcHV0KG93bmVyKTsKLQotCXNwaW5fbG9jaygmdHR5LT5maWxlc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZ0dHktPnR0eV9maWxlcyk7Ci0Jc3Bpbl91bmxvY2soJnR0eS0+ZmlsZXNfbG9jayk7Ci0KLQlwdXRfcGlkKHR0eS0+cGdycCk7Ci0JcHV0X3BpZCh0dHktPnNlc3Npb24pOwotCWZyZWVfdHR5X3N0cnVjdCh0dHkpOwotfQotCi1zdGF0aWMgdm9pZCBxdWV1ZV9yZWxlYXNlX29uZV90dHkoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdHR5X3N0cnVjdCwga3JlZik7Ci0KLQkvKiBUaGUgaGFuZ3VwIHF1ZXVlIGlzIG5vdyBmcmVlIHNvIHdlIGNhbiByZXVzZSBpdCByYXRoZXIgdGhhbgotCSAgIHdhc3RlIGEgY2h1bmsgb2YgbWVtb3J5IGZvciBlYWNoIHBvcnQgKi8KLQlJTklUX1dPUksoJnR0eS0+aGFuZ3VwX3dvcmssIHJlbGVhc2Vfb25lX3R0eSk7Ci0Jc2NoZWR1bGVfd29yaygmdHR5LT5oYW5ndXBfd29yayk7Ci19Ci0KLS8qKgotICoJdHR5X2tyZWZfcHV0CQktCXJlbGVhc2UgYSB0dHkga3JlZgotICoJQHR0eTogdHR5IGRldmljZQotICoKLSAqCVJlbGVhc2UgYSByZWZlcmVuY2UgdG8gYSB0dHkgZGV2aWNlIGFuZCBpZiBuZWVkIGJlIGxldCB0aGUga3JlZgotICoJbGF5ZXIgZGVzdHJ1Y3QgdGhlIG9iamVjdCBmb3IgdXMKLSAqLwotCi12b2lkIHR0eV9rcmVmX3B1dChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmICh0dHkpCi0JCWtyZWZfcHV0KCZ0dHktPmtyZWYsIHF1ZXVlX3JlbGVhc2Vfb25lX3R0eSk7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0eV9rcmVmX3B1dCk7Ci0KLS8qKgotICoJcmVsZWFzZV90dHkJCS0JcmVsZWFzZSB0dHkgc3RydWN0dXJlIG1lbW9yeQotICoKLSAqCVJlbGVhc2UgYm90aCBAdHR5IGFuZCBhIHBvc3NpYmxlIGxpbmtlZCBwYXJ0bmVyICh0aGluayBwdHkgcGFpciksCi0gKglhbmQgZGVjcmVtZW50IHRoZSByZWZjb3VudCBvZiB0aGUgYmFja2luZyBtb2R1bGUuCi0gKgotICoJTG9ja2luZzoKLSAqCQl0dHlfbXV0ZXgKLSAqCQl0YWtlcyB0aGUgZmlsZSBsaXN0IGxvY2sgaW50ZXJuYWxseSB3aGVuIHdvcmtpbmcgb24gdGhlIGxpc3QKLSAqCW9mIHR0eXMgdGhhdCB0aGUgZHJpdmVyIGtlZXBzLgotICoKLSAqLwotc3RhdGljIHZvaWQgcmVsZWFzZV90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCkKLXsKLQkvKiBUaGlzIHNob3VsZCBhbHdheXMgYmUgdHJ1ZSBidXQgY2hlY2sgZm9yIHRoZSBtb21lbnQgKi8KLQlXQVJOX09OKHR0eS0+aW5kZXggIT0gaWR4KTsKLQlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJnR0eV9tdXRleCkpOwotCWlmICh0dHktPm9wcy0+c2h1dGRvd24pCi0JCXR0eS0+b3BzLT5zaHV0ZG93bih0dHkpOwotCXR0eV9zYXZlX3Rlcm1pb3ModHR5KTsKLQl0dHlfZHJpdmVyX3JlbW92ZV90dHkodHR5LT5kcml2ZXIsIHR0eSk7Ci0JaWYgKHR0eS0+cG9ydCkKLQkJdHR5LT5wb3J0LT5pdHR5ID0gTlVMTDsKLQlpZiAodHR5LT5saW5rKQotCQl0dHktPmxpbmstPnBvcnQtPml0dHkgPSBOVUxMOwotCWlmICh0dHktPnBvcnQpCi0JCXR0eV9idWZmZXJfY2FuY2VsX3dvcmsodHR5LT5wb3J0KTsKLQlpZiAodHR5LT5saW5rKQotCQl0dHlfYnVmZmVyX2NhbmNlbF93b3JrKHR0eS0+bGluay0+cG9ydCk7Ci0KLQl0dHlfa3JlZl9wdXQodHR5LT5saW5rKTsKLQl0dHlfa3JlZl9wdXQodHR5KTsKLX0KLQotLyoqCi0gKgl0dHlfcmVsZWFzZV9jaGVja3MgLSBjaGVjayBhIHR0eSBiZWZvcmUgcmVhbCByZWxlYXNlCi0gKglAdHR5OiB0dHkgdG8gY2hlY2sKLSAqCUBpZHg6IGluZGV4IG9mIHRoZSB0dHkKLSAqCi0gKglQZXJmb3JtcyBzb21lIHBhcmFub2lkIGNoZWNraW5nIGJlZm9yZSB0cnVlIHJlbGVhc2Ugb2YgdGhlIEB0dHkuCi0gKglUaGlzIGlzIGEgbm8tb3AgdW5sZXNzIFRUWV9QQVJBTk9JQV9DSEVDSyBpcyBkZWZpbmVkLgotICovCi1zdGF0aWMgaW50IHR0eV9yZWxlYXNlX2NoZWNrcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KQotewotI2lmZGVmIFRUWV9QQVJBTk9JQV9DSEVDSwotCWlmIChpZHggPCAwIHx8IGlkeCA+PSB0dHktPmRyaXZlci0+bnVtKSB7Ci0JCXR0eV9kZWJ1Zyh0dHksICJiYWQgaWR4ICVkXG4iLCBpZHgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogbm90IG11Y2ggdG8gY2hlY2sgZm9yIGRldnB0cyAqLwotCWlmICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX0RFVlBUU19NRU0pCi0JCXJldHVybiAwOwotCi0JaWYgKHR0eSAhPSB0dHktPmRyaXZlci0+dHR5c1tpZHhdKSB7Ci0JCXR0eV9kZWJ1Zyh0dHksICJiYWQgZHJpdmVyIHRhYmxlWyVkXSA9ICVwXG4iLAotCQkJICBpZHgsIHR0eS0+ZHJpdmVyLT50dHlzW2lkeF0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh0dHktPmRyaXZlci0+b3RoZXIpIHsKLQkJc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5ID0gdHR5LT5saW5rOwotCi0JCWlmIChvX3R0eSAhPSB0dHktPmRyaXZlci0+b3RoZXItPnR0eXNbaWR4XSkgewotCQkJdHR5X2RlYnVnKHR0eSwgImJhZCBvdGhlciB0YWJsZVslZF0gPSAlcFxuIiwKLQkJCQkgIGlkeCwgdHR5LT5kcml2ZXItPm90aGVyLT50dHlzW2lkeF0pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChvX3R0eS0+bGluayAhPSB0dHkpIHsKLQkJCXR0eV9kZWJ1Zyh0dHksICJiYWQgbGluayA9ICVwXG4iLCBvX3R0eS0+bGluayk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiAgICAgIHR0eV9rY2xvc2UgICAgICAtICAgICAgIGNsb3NlcyB0dHkgb3BlbmVkIGJ5IHR0eV9rb3BlbgotICogICAgICBAdHR5OiB0dHkgZGV2aWNlCi0gKgotICogICAgICBQZXJmb3JtcyB0aGUgZmluYWwgc3RlcHMgdG8gcmVsZWFzZSBhbmQgZnJlZSBhIHR0eSBkZXZpY2UuIEl0IGlzIHRoZQotICogICAgICBzYW1lIGFzIHR0eV9yZWxlYXNlX3N0cnVjdCBleGNlcHQgdGhhdCBpdCBhbHNvIHJlc2V0cyBUVFlfUE9SVF9LT1BFTkVECi0gKiAgICAgIGZsYWcgb24gdHR5LT5wb3J0LgotICovCi12b2lkIHR0eV9rY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQkvKgotCSAqIEFzayB0aGUgbGluZSBkaXNjaXBsaW5lIGNvZGUgdG8gcmVsZWFzZSBpdHMgc3RydWN0dXJlcwotCSAqLwotCXR0eV9sZGlzY19yZWxlYXNlKHR0eSk7Ci0KLQkvKiBXYWl0IGZvciBwZW5kaW5nIHdvcmsgYmVmb3JlIHR0eSBkZXN0cnVjdGlvbiBjb21tbWVuY2VzICovCi0JdHR5X2ZsdXNoX3dvcmtzKHR0eSk7Ci0KLQl0dHlfZGVidWdfaGFuZ3VwKHR0eSwgImZyZWVpbmcgc3RydWN0dXJlXG4iKTsKLQkvKgotCSAqIFRoZSByZWxlYXNlX3R0eSBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIHRoZSBkZXRhaWxzIG9mIGNsZWFyaW5nCi0JICogdGhlIHNsb3RzIGFuZCBwcmVzZXJ2aW5nIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZS4KLQkgKi8KLQltdXRleF9sb2NrKCZ0dHlfbXV0ZXgpOwotCXR0eV9wb3J0X3NldF9rb3BlbmVkKHR0eS0+cG9ydCwgMCk7Ci0JcmVsZWFzZV90dHkodHR5LCB0dHktPmluZGV4KTsKLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfa2Nsb3NlKTsKLQotLyoqCi0gKgl0dHlfcmVsZWFzZV9zdHJ1Y3QJLQlyZWxlYXNlIGEgdHR5IHN0cnVjdAotICoJQHR0eTogdHR5IGRldmljZQotICoJQGlkeDogaW5kZXggb2YgdGhlIHR0eQotICoKLSAqCVBlcmZvcm1zIHRoZSBmaW5hbCBzdGVwcyB0byByZWxlYXNlIGFuZCBmcmVlIGEgdHR5IGRldmljZS4gSXQgaXMKLSAqCXJvdWdobHkgdGhlIHJldmVyc2Ugb2YgdHR5X2luaXRfZGV2LgotICovCi12b2lkIHR0eV9yZWxlYXNlX3N0cnVjdChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgaWR4KQotewotCS8qCi0JICogQXNrIHRoZSBsaW5lIGRpc2NpcGxpbmUgY29kZSB0byByZWxlYXNlIGl0cyBzdHJ1Y3R1cmVzCi0JICovCi0JdHR5X2xkaXNjX3JlbGVhc2UodHR5KTsKLQotCS8qIFdhaXQgZm9yIHBlbmRpbmcgd29yayBiZWZvcmUgdHR5IGRlc3RydWN0aW9uIGNvbW1tZW5jZXMgKi8KLQl0dHlfZmx1c2hfd29ya3ModHR5KTsKLQotCXR0eV9kZWJ1Z19oYW5ndXAodHR5LCAiZnJlZWluZyBzdHJ1Y3R1cmVcbiIpOwotCS8qCi0JICogVGhlIHJlbGVhc2VfdHR5IGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgdGhlIGRldGFpbHMgb2YgY2xlYXJpbmcKLQkgKiB0aGUgc2xvdHMgYW5kIHByZXNlcnZpbmcgdGhlIHRlcm1pb3Mgc3RydWN0dXJlLgotCSAqLwotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JcmVsZWFzZV90dHkodHR5LCBpZHgpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9yZWxlYXNlX3N0cnVjdCk7Ci0KLS8qKgotICoJdHR5X3JlbGVhc2UJCS0JdmZzIGNhbGxiYWNrIGZvciBjbG9zZQotICoJQGlub2RlOiBpbm9kZSBvZiB0dHkKLSAqCUBmaWxwOiBmaWxlIHBvaW50ZXIgZm9yIGhhbmRsZSB0byB0dHkKLSAqCi0gKglDYWxsZWQgdGhlIGxhc3QgdGltZSBlYWNoIGZpbGUgaGFuZGxlIGlzIGNsb3NlZCB0aGF0IHJlZmVyZW5jZXMKLSAqCXRoaXMgdHR5LiBUaGVyZSBtYXkgaG93ZXZlciBiZSBzZXZlcmFsIHN1Y2ggcmVmZXJlbmNlcy4KLSAqCi0gKglMb2NraW5nOgotICoJCVRha2VzIGJrbC4gU2VlIHR0eV9yZWxlYXNlX2RldgotICoKLSAqIEV2ZW4gcmVsZWFzaW5nIHRoZSB0dHkgc3RydWN0dXJlcyBpcyBhIHRyaWNreSBidXNpbmVzcy4uIFdlIGhhdmUKLSAqIHRvIGJlIHZlcnkgY2FyZWZ1bCB0aGF0IHRoZSBzdHJ1Y3R1cmVzIGFyZSBhbGwgcmVsZWFzZWQgYXQgdGhlCi0gKiBzYW1lIHRpbWUsIGFzIGludGVycnVwdHMgbWlnaHQgb3RoZXJ3aXNlIGdldCB0aGUgd3JvbmcgcG9pbnRlcnMuCi0gKgotICogV1NIIDA5LzA5Lzk3OiByZXdyaXR0ZW4gdG8gYXZvaWQgc29tZSBuYXN0eSByYWNlIGNvbmRpdGlvbnMgdGhhdCBjb3VsZAotICogbGVhZCB0byBkb3VibGUgZnJlZXMgb3IgcmVsZWFzaW5nIG1lbW9yeSBzdGlsbCBpbiB1c2UuCi0gKi8KLQotaW50IHR0eV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBmaWxlX3R0eShmaWxwKTsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHkgPSBOVUxMOwotCWludAlkb19zbGVlcCwgZmluYWw7Ci0JaW50CWlkeDsKLQlsb25nCXRpbWVvdXQgPSAwOwotCWludAlvbmNlID0gMTsKLQotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgX19mdW5jX18pKQotCQlyZXR1cm4gMDsKLQotCXR0eV9sb2NrKHR0eSk7Ci0JY2hlY2tfdHR5X2NvdW50KHR0eSwgX19mdW5jX18pOwotCi0JX190dHlfZmFzeW5jKC0xLCBmaWxwLCAwKTsKLQotCWlkeCA9IHR0eS0+aW5kZXg7Ci0JaWYgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKLQkgICAgdHR5LT5kcml2ZXItPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQotCQlvX3R0eSA9IHR0eS0+bGluazsKLQotCWlmICh0dHlfcmVsZWFzZV9jaGVja3ModHR5LCBpZHgpKSB7Ci0JCXR0eV91bmxvY2sodHR5KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdHR5X2RlYnVnX2hhbmd1cCh0dHksICJyZWxlYXNpbmcgKGNvdW50PSVkKVxuIiwgdHR5LT5jb3VudCk7Ci0KLQlpZiAodHR5LT5vcHMtPmNsb3NlKQotCQl0dHktPm9wcy0+Y2xvc2UodHR5LCBmaWxwKTsKLQotCS8qIElmIHR0eSBpcyBwdHkgbWFzdGVyLCBsb2NrIHRoZSBzbGF2ZSBwdHkgKHN0YWJsZSBsb2NrIG9yZGVyKSAqLwotCXR0eV9sb2NrX3NsYXZlKG9fdHR5KTsKLQotCS8qCi0JICogU2FuaXR5IGNoZWNrOiBpZiB0dHktPmNvdW50IGlzIGdvaW5nIHRvIHplcm8sIHRoZXJlIHNob3VsZG4ndCBiZQotCSAqIGFueSB3YWl0ZXJzIG9uIHR0eS0+cmVhZF93YWl0IG9yIHR0eS0+d3JpdGVfd2FpdC4gIFdlIHRlc3QgdGhlCi0JICogd2FpdCBxdWV1ZXMgYW5kIGtpY2sgZXZlcnlvbmUgb3V0IF9iZWZvcmVfIGFjdHVhbGx5IHN0YXJ0aW5nIHRvCi0JICogY2xvc2UuICBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3b24ndCBibG9jayB3aGlsZSByZWxlYXNpbmcgdGhlIHR0eQotCSAqIHN0cnVjdHVyZS4KLQkgKgotCSAqIFRoZSB0ZXN0IGZvciB0aGUgb190dHkgY2xvc2luZyBpcyBuZWNlc3NhcnksIHNpbmNlIHRoZSBtYXN0ZXIgYW5kCi0JICogc2xhdmUgc2lkZXMgbWF5IGNsb3NlIGluIGFueSBvcmRlci4gIElmIHRoZSBzbGF2ZSBzaWRlIGNsb3NlcyBvdXQKLQkgKiBmaXJzdCwgaXRzIGNvdW50IHdpbGwgYmUgb25lLCBzaW5jZSB0aGUgbWFzdGVyIHNpZGUgaG9sZHMgYW4gb3Blbi4KLQkgKiBUaHVzIHRoaXMgdGVzdCB3b3VsZG4ndCBiZSB0cmlnZ2VyZWQgYXQgdGhlIHRpbWUgdGhlIHNsYXZlIGNsb3NlZCwKLQkgKiBzbyB3ZSBkbyBpdCBub3cuCi0JICovCi0Jd2hpbGUgKDEpIHsKLQkJZG9fc2xlZXAgPSAwOwotCi0JCWlmICh0dHktPmNvdW50IDw9IDEpIHsKLQkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ0dHktPnJlYWRfd2FpdCkpIHsKLQkJCQl3YWtlX3VwX3BvbGwoJnR0eS0+cmVhZF93YWl0LCBFUE9MTElOKTsKLQkJCQlkb19zbGVlcCsrOwotCQkJfQotCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnR0eS0+d3JpdGVfd2FpdCkpIHsKLQkJCQl3YWtlX3VwX3BvbGwoJnR0eS0+d3JpdGVfd2FpdCwgRVBPTExPVVQpOwotCQkJCWRvX3NsZWVwKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9fdHR5ICYmIG9fdHR5LT5jb3VudCA8PSAxKSB7Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmb190dHktPnJlYWRfd2FpdCkpIHsKLQkJCQl3YWtlX3VwX3BvbGwoJm9fdHR5LT5yZWFkX3dhaXQsIEVQT0xMSU4pOwotCQkJCWRvX3NsZWVwKys7Ci0JCQl9Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmb190dHktPndyaXRlX3dhaXQpKSB7Ci0JCQkJd2FrZV91cF9wb2xsKCZvX3R0eS0+d3JpdGVfd2FpdCwgRVBPTExPVVQpOwotCQkJCWRvX3NsZWVwKys7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkb19zbGVlcCkKLQkJCWJyZWFrOwotCi0JCWlmIChvbmNlKSB7Ci0JCQlvbmNlID0gMDsKLQkJCXR0eV93YXJuKHR0eSwgInJlYWQvd3JpdGUgd2FpdCBxdWV1ZSBhY3RpdmUhXG4iKTsKLQkJfQotCQlzY2hlZHVsZV90aW1lb3V0X2tpbGxhYmxlKHRpbWVvdXQpOwotCQlpZiAodGltZW91dCA8IDEyMCAqIEhaKQotCQkJdGltZW91dCA9IDIgKiB0aW1lb3V0ICsgMTsKLQkJZWxzZQotCQkJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOwotCX0KLQotCWlmIChvX3R0eSkgewotCQlpZiAoLS1vX3R0eS0+Y291bnQgPCAwKSB7Ci0JCQl0dHlfd2Fybih0dHksICJiYWQgc2xhdmUgY291bnQgKCVkKVxuIiwgb190dHktPmNvdW50KTsKLQkJCW9fdHR5LT5jb3VudCA9IDA7Ci0JCX0KLQl9Ci0JaWYgKC0tdHR5LT5jb3VudCA8IDApIHsKLQkJdHR5X3dhcm4odHR5LCAiYmFkIHR0eS0+Y291bnQgKCVkKVxuIiwgdHR5LT5jb3VudCk7Ci0JCXR0eS0+Y291bnQgPSAwOwotCX0KLQotCS8qCi0JICogV2UndmUgZGVjcmVtZW50ZWQgdHR5LT5jb3VudCwgc28gd2UgbmVlZCB0byByZW1vdmUgdGhpcyBmaWxlCi0JICogZGVzY3JpcHRvciBvZmYgdGhlIHR0eS0+dHR5X2ZpbGVzIGxpc3Q7IHRoaXMgc2VydmVzIHR3bwotCSAqIHB1cnBvc2VzOgotCSAqICAtIGNoZWNrX3R0eV9jb3VudCBzZWVzIHRoZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCi0JICogICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHR5LgotCSAqICAtIGRvX3R0eV9oYW5ndXAgbm8gbG9uZ2VyIHNlZXMgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYXMKLQkgKiAgICBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBoYW5kbGVkIGZvciBoYW5ndXBzLgotCSAqLwotCXR0eV9kZWxfZmlsZShmaWxwKTsKLQotCS8qCi0JICogUGVyZm9ybSBzb21lIGhvdXNla2VlcGluZyBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byByZXR1cm4uCi0JICoKLQkgKiBJZiBfZWl0aGVyXyBzaWRlIGlzIGNsb3NpbmcsIG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55Ci0JICogcHJvY2Vzc2VzIHRoYXQgc3RpbGwgdGhpbmsgdHR5IG9yIG9fdHR5IGlzIHRoZWlyIGNvbnRyb2xsaW5nCi0JICogdHR5LgotCSAqLwotCWlmICghdHR5LT5jb3VudCkgewotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCQlzZXNzaW9uX2NsZWFyX3R0eSh0dHktPnNlc3Npb24pOwotCQlpZiAob190dHkpCi0JCQlzZXNzaW9uX2NsZWFyX3R0eShvX3R0eS0+c2Vzc2lvbik7Ci0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQl9Ci0KLQkvKiBjaGVjayB3aGV0aGVyIGJvdGggc2lkZXMgYXJlIGNsb3NpbmcgLi4uICovCi0JZmluYWwgPSAhdHR5LT5jb3VudCAmJiAhKG9fdHR5ICYmIG9fdHR5LT5jb3VudCk7Ci0KLQl0dHlfdW5sb2NrX3NsYXZlKG9fdHR5KTsKLQl0dHlfdW5sb2NrKHR0eSk7Ci0KLQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgdHR5LT5jb3VudCA9PSAwIHNob3VsZCBlbnN1cmUgYSBkZWFkIHR0eQotCSAgIGNhbm5vdCBiZSByZS1vcGVuZWQgYnkgYSByYWNpbmcgb3BlbmVyICovCi0KLQlpZiAoIWZpbmFsKQotCQlyZXR1cm4gMDsKLQotCXR0eV9kZWJ1Z19oYW5ndXAodHR5LCAiZmluYWwgY2xvc2VcbiIpOwotCi0JdHR5X3JlbGVhc2Vfc3RydWN0KHR0eSwgaWR4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKgl0dHlfb3Blbl9jdXJyZW50X3R0eSAtIGdldCBsb2NrZWQgdHR5IG9mIGN1cnJlbnQgdGFzawotICoJQGRldmljZTogZGV2aWNlIG51bWJlcgotICoJQGZpbHA6IGZpbGUgcG9pbnRlciB0byB0dHkKLSAqCUByZXR1cm46IGxvY2tlZCB0dHkgb2YgdGhlIGN1cnJlbnQgdGFzayBpZmYgQGRldmljZSBpcyAvZGV2L3R0eQotICoKLSAqCVBlcmZvcm1zIGEgcmUtb3BlbiBvZiB0aGUgY3VycmVudCB0YXNrJ3MgY29udHJvbGxpbmcgdHR5LgotICoKLSAqCVdlIGNhbm5vdCByZXR1cm4gZHJpdmVyIGFuZCBpbmRleCBsaWtlIGZvciB0aGUgb3RoZXIgbm9kZXMgYmVjYXVzZQotICoJZGV2cHRzIHdpbGwgbm90IHdvcmsgdGhlbi4gSXQgZXhwZWN0cyBpbm9kZXMgdG8gYmUgZnJvbSBkZXZwdHMgRlMuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5X29wZW5fY3VycmVudF90dHkoZGV2X3QgZGV2aWNlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwotCWludCByZXR2YWw7Ci0KLQlpZiAoZGV2aWNlICE9IE1LREVWKFRUWUFVWF9NQUpPUiwgMCkpCi0JCXJldHVybiBOVUxMOwotCi0JdHR5ID0gZ2V0X2N1cnJlbnRfdHR5KCk7Ci0JaWYgKCF0dHkpCi0JCXJldHVybiBFUlJfUFRSKC1FTlhJTyk7Ci0KLQlmaWxwLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7IC8qIERvbid0IGxldCAvZGV2L3R0eSBibG9jayAqLwotCS8qIG5vY3R0eSA9IDE7ICovCi0JdHR5X2xvY2sodHR5KTsKLQl0dHlfa3JlZl9wdXQodHR5KTsJLyogc2FmZSB0byBkcm9wIHRoZSBrcmVmIG5vdyAqLwotCi0JcmV0dmFsID0gdHR5X3Jlb3Blbih0dHkpOwotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXR0eV91bmxvY2sodHR5KTsKLQkJdHR5ID0gRVJSX1BUUihyZXR2YWwpOwotCX0KLQlyZXR1cm4gdHR5OwotfQotCi0vKioKLSAqCXR0eV9sb29rdXBfZHJpdmVyIC0gbG9va3VwIGEgdHR5IGRyaXZlciBmb3IgYSBnaXZlbiBkZXZpY2UgZmlsZQotICoJQGRldmljZTogZGV2aWNlIG51bWJlcgotICoJQGZpbHA6IGZpbGUgcG9pbnRlciB0byB0dHkKLSAqCUBpbmRleDogaW5kZXggZm9yIHRoZSBkZXZpY2UgaW4gdGhlIEByZXR1cm4gZHJpdmVyCi0gKglAcmV0dXJuOiBkcml2ZXIgZm9yIHRoaXMgaW5vZGUgKHdpdGggaW5jcmVhc2VkIHJlZmNvdW50KQotICoKLSAqIAlJZiBAcmV0dXJuIGlzIG5vdCBlcnJvbmVvdXMsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZGVjcmVtZW50IHRoZQotICogCXJlZmNvdW50IGJ5IHR0eV9kcml2ZXJfa3JlZl9wdXQuCi0gKgotICoJTG9ja2luZzogdHR5X211dGV4IHByb3RlY3RzIGdldF90dHlfZHJpdmVyCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqdHR5X2xvb2t1cF9kcml2ZXIoZGV2X3QgZGV2aWNlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJaW50ICppbmRleCkKLXsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gTlVMTDsKLQotCXN3aXRjaCAoZGV2aWNlKSB7Ci0jaWZkZWYgQ09ORklHX1ZUCi0JY2FzZSBNS0RFVihUVFlfTUFKT1IsIDApOiB7Ci0JCWV4dGVybiBzdHJ1Y3QgdHR5X2RyaXZlciAqY29uc29sZV9kcml2ZXI7Ci0JCWRyaXZlciA9IHR0eV9kcml2ZXJfa3JlZl9nZXQoY29uc29sZV9kcml2ZXIpOwotCQkqaW5kZXggPSBmZ19jb25zb2xlOwotCQlicmVhazsKLQl9Ci0jZW5kaWYKLQljYXNlIE1LREVWKFRUWUFVWF9NQUpPUiwgMSk6IHsKLQkJc3RydWN0IHR0eV9kcml2ZXIgKmNvbnNvbGVfZHJpdmVyID0gY29uc29sZV9kZXZpY2UoaW5kZXgpOwotCQlpZiAoY29uc29sZV9kcml2ZXIpIHsKLQkJCWRyaXZlciA9IHR0eV9kcml2ZXJfa3JlZl9nZXQoY29uc29sZV9kcml2ZXIpOwotCQkJaWYgKGRyaXZlciAmJiBmaWxwKSB7Ci0JCQkJLyogRG9uJ3QgbGV0IC9kZXYvY29uc29sZSBibG9jayAqLwotCQkJCWZpbHAtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZHJpdmVyKQotCQkJdHR5X2RyaXZlcl9rcmVmX3B1dChkcml2ZXIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLQl9Ci0JZGVmYXVsdDoKLQkJZHJpdmVyID0gZ2V0X3R0eV9kcml2ZXIoZGV2aWNlLCBpbmRleCk7Ci0JCWlmICghZHJpdmVyKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gZHJpdmVyOwotfQotCi0vKioKLSAqCXR0eV9rb3BlbgktCW9wZW4gYSB0dHkgZGV2aWNlIGZvciBrZXJuZWwKLSAqCUBkZXZpY2U6IGRldl90IG9mIGRldmljZSB0byBvcGVuCi0gKgotICoJT3BlbnMgdHR5IGV4Y2x1c2l2ZWx5IGZvciBrZXJuZWwuIFBlcmZvcm1zIHRoZSBkcml2ZXIgbG9va3VwLAotICoJbWFrZXMgc3VyZSBpdCdzIG5vdCBhbHJlYWR5IG9wZW5lZCBhbmQgcGVyZm9ybXMgdGhlIGZpcnN0LXRpbWUKLSAqCXR0eSBpbml0aWFsaXphdGlvbi4KLSAqCi0gKglSZXR1cm5zIHRoZSBsb2NrZWQgaW5pdGlhbGl6ZWQgJnR0eV9zdHJ1Y3QKLSAqCi0gKglDbGFpbXMgdGhlIGdsb2JhbCB0dHlfbXV0ZXggdG8gc2VyaWFsaXplOgotICoJICAtIGNvbmN1cnJlbnQgZmlyc3QtdGltZSB0dHkgaW5pdGlhbGl6YXRpb24KLSAqCSAgLSBjb25jdXJyZW50IHR0eSBkcml2ZXIgcmVtb3ZhbCB3LyBsb29rdXAKLSAqCSAgLSBjb25jdXJyZW50IHR0eSByZW1vdmFsIGZyb20gZHJpdmVyIHRhYmxlCi0gKi8KLXN0cnVjdCB0dHlfc3RydWN0ICp0dHlfa29wZW4oZGV2X3QgZGV2aWNlKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0Jc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcjsKLQlpbnQgaW5kZXggPSAtMTsKLQotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JZHJpdmVyID0gdHR5X2xvb2t1cF9kcml2ZXIoZGV2aWNlLCBOVUxMLCAmaW5kZXgpOwotCWlmIChJU19FUlIoZHJpdmVyKSkgewotCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0JCXJldHVybiBFUlJfQ0FTVChkcml2ZXIpOwotCX0KLQotCS8qIGNoZWNrIHdoZXRoZXIgd2UncmUgcmVvcGVuaW5nIGFuIGV4aXN0aW5nIHR0eSAqLwotCXR0eSA9IHR0eV9kcml2ZXJfbG9va3VwX3R0eShkcml2ZXIsIE5VTEwsIGluZGV4KTsKLQlpZiAoSVNfRVJSKHR0eSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHR0eSkgewotCQkvKiBkcm9wIGtyZWYgZnJvbSB0dHlfZHJpdmVyX2xvb2t1cF90dHkoKSAqLwotCQl0dHlfa3JlZl9wdXQodHR5KTsKLQkJdHR5ID0gRVJSX1BUUigtRUJVU1kpOwotCX0gZWxzZSB7IC8qIHR0eV9pbml0X2RldiByZXR1cm5zIHR0eSB3aXRoIHRoZSB0dHlfbG9jayBoZWxkICovCi0JCXR0eSA9IHR0eV9pbml0X2Rldihkcml2ZXIsIGluZGV4KTsKLQkJaWYgKElTX0VSUih0dHkpKQotCQkJZ290byBvdXQ7Ci0JCXR0eV9wb3J0X3NldF9rb3BlbmVkKHR0eS0+cG9ydCwgMSk7Ci0JfQotb3V0OgotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQl0dHlfZHJpdmVyX2tyZWZfcHV0KGRyaXZlcik7Ci0JcmV0dXJuIHR0eTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9rb3Blbik7Ci0KLS8qKgotICoJdHR5X29wZW5fYnlfZHJpdmVyCS0Jb3BlbiBhIHR0eSBkZXZpY2UKLSAqCUBkZXZpY2U6IGRldl90IG9mIGRldmljZSB0byBvcGVuCi0gKglAZmlscDogZmlsZSBwb2ludGVyIHRvIHR0eQotICoKLSAqCVBlcmZvcm1zIHRoZSBkcml2ZXIgbG9va3VwLCBjaGVja3MgZm9yIGEgcmVvcGVuLCBvciBvdGhlcndpc2UKLSAqCXBlcmZvcm1zIHRoZSBmaXJzdC10aW1lIHR0eSBpbml0aWFsaXphdGlvbi4KLSAqCi0gKglSZXR1cm5zIHRoZSBsb2NrZWQgaW5pdGlhbGl6ZWQgb3IgcmUtb3BlbmVkICZ0dHlfc3RydWN0Ci0gKgotICoJQ2xhaW1zIHRoZSBnbG9iYWwgdHR5X211dGV4IHRvIHNlcmlhbGl6ZToKLSAqCSAgLSBjb25jdXJyZW50IGZpcnN0LXRpbWUgdHR5IGluaXRpYWxpemF0aW9uCi0gKgkgIC0gY29uY3VycmVudCB0dHkgZHJpdmVyIHJlbW92YWwgdy8gbG9va3VwCi0gKgkgIC0gY29uY3VycmVudCB0dHkgcmVtb3ZhbCBmcm9tIGRyaXZlciB0YWJsZQotICovCi1zdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9vcGVuX2J5X2RyaXZlcihkZXZfdCBkZXZpY2UsCi0JCQkJCSAgICAgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyID0gTlVMTDsKLQlpbnQgaW5kZXggPSAtMTsKLQlpbnQgcmV0dmFsOwotCi0JbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQlkcml2ZXIgPSB0dHlfbG9va3VwX2RyaXZlcihkZXZpY2UsIGZpbHAsICZpbmRleCk7Ci0JaWYgKElTX0VSUihkcml2ZXIpKSB7Ci0JCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQkJcmV0dXJuIEVSUl9DQVNUKGRyaXZlcik7Ci0JfQotCi0JLyogY2hlY2sgd2hldGhlciB3ZSdyZSByZW9wZW5pbmcgYW4gZXhpc3RpbmcgdHR5ICovCi0JdHR5ID0gdHR5X2RyaXZlcl9sb29rdXBfdHR5KGRyaXZlciwgZmlscCwgaW5kZXgpOwotCWlmIChJU19FUlIodHR5KSkgewotCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmICh0dHkpIHsKLQkJaWYgKHR0eV9wb3J0X2tvcGVuZWQodHR5LT5wb3J0KSkgewotCQkJdHR5X2tyZWZfcHV0KHR0eSk7Ci0JCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0JCQl0dHkgPSBFUlJfUFRSKC1FQlVTWSk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0JCXJldHZhbCA9IHR0eV9sb2NrX2ludGVycnVwdGlibGUodHR5KTsKLQkJdHR5X2tyZWZfcHV0KHR0eSk7ICAvKiBkcm9wIGtyZWYgZnJvbSB0dHlfZHJpdmVyX2xvb2t1cF90dHkoKSAqLwotCQlpZiAocmV0dmFsKSB7Ci0JCQlpZiAocmV0dmFsID09IC1FSU5UUikKLQkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCQl0dHkgPSBFUlJfUFRSKHJldHZhbCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlyZXR2YWwgPSB0dHlfcmVvcGVuKHR0eSk7Ci0JCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQl0dHlfdW5sb2NrKHR0eSk7Ci0JCQl0dHkgPSBFUlJfUFRSKHJldHZhbCk7Ci0JCX0KLQl9IGVsc2UgeyAvKiBSZXR1cm5zIHdpdGggdGhlIHR0eV9sb2NrIGhlbGQgZm9yIG5vdyAqLwotCQl0dHkgPSB0dHlfaW5pdF9kZXYoZHJpdmVyLCBpbmRleCk7Ci0JCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQl9Ci1vdXQ6Ci0JdHR5X2RyaXZlcl9rcmVmX3B1dChkcml2ZXIpOwotCXJldHVybiB0dHk7Ci19Ci0KLS8qKgotICoJdHR5X29wZW4JCS0Jb3BlbiBhIHR0eSBkZXZpY2UKLSAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlIGZpbGUKLSAqCUBmaWxwOiBmaWxlIHBvaW50ZXIgdG8gdHR5Ci0gKgotICoJdHR5X29wZW4gYW5kIHR0eV9yZWxlYXNlIGtlZXAgdXAgdGhlIHR0eSBjb3VudCB0aGF0IGNvbnRhaW5zIHRoZQotICoJbnVtYmVyIG9mIG9wZW5zIGRvbmUgb24gYSB0dHkuIFdlIGNhbm5vdCB1c2UgdGhlIGlub2RlLWNvdW50LCBhcwotICoJZGlmZmVyZW50IGlub2RlcyBtaWdodCBwb2ludCB0byB0aGUgc2FtZSB0dHkuCi0gKgotICoJT3Blbi1jb3VudGluZyBpcyBuZWVkZWQgZm9yIHB0eSBtYXN0ZXJzLCBhcyB3ZWxsIGFzIGZvciBrZWVwaW5nCi0gKgl0cmFjayBvZiBzZXJpYWwgbGluZXM6IERUUiBpcyBkcm9wcGVkIHdoZW4gdGhlIGxhc3QgY2xvc2UgaGFwcGVucy4KLSAqCShUaGlzIGlzIG5vdCBkb25lIHNvbGVseSB0aHJvdWdoIHR0eS0+Y291bnQsIG5vdy4gIC0gVGVkIDEvMjcvOTIpCi0gKgotICoJVGhlIHRlcm1pb3Mgc3RhdGUgb2YgYSBwdHkgaXMgcmVzZXQgb24gZmlyc3Qgb3BlbiBzbyB0aGF0Ci0gKglzZXR0aW5ncyBkb24ndCBwZXJzaXN0IGFjcm9zcyByZXVzZS4KLSAqCi0gKglMb2NraW5nOiB0dHlfbXV0ZXggcHJvdGVjdHMgdHR5LCB0dHlfbG9va3VwX2RyaXZlciBhbmQgdHR5X2luaXRfZGV2LgotICoJCSB0dHktPmNvdW50IHNob3VsZCBwcm90ZWN0IHRoZSByZXN0LgotICoJCSAtPnNpZ2xvY2sgcHJvdGVjdHMgLT5zaWduYWwvLT5zaWdoYW5kCi0gKgotICoJTm90ZTogdGhlIHR0eV91bmxvY2svbG9jayBjYXNlcyB3aXRob3V0IGEgcmVmIGFyZSBvbmx5IHNhZmUgZHVlIHRvCi0gKgl0dHlfbXV0ZXgKLSAqLwotCi1zdGF0aWMgaW50IHR0eV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7Ci0JaW50IG5vY3R0eSwgcmV0dmFsOwotCWRldl90IGRldmljZSA9IGlub2RlLT5pX3JkZXY7Ci0JdW5zaWduZWQgc2F2ZWRfZmxhZ3MgPSBmaWxwLT5mX2ZsYWdzOwotCi0Jbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7Ci0KLXJldHJ5X29wZW46Ci0JcmV0dmFsID0gdHR5X2FsbG9jX2ZpbGUoZmlscCk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl0dHkgPSB0dHlfb3Blbl9jdXJyZW50X3R0eShkZXZpY2UsIGZpbHApOwotCWlmICghdHR5KQotCQl0dHkgPSB0dHlfb3Blbl9ieV9kcml2ZXIoZGV2aWNlLCBmaWxwKTsKLQotCWlmIChJU19FUlIodHR5KSkgewotCQl0dHlfZnJlZV9maWxlKGZpbHApOwotCQlyZXR2YWwgPSBQVFJfRVJSKHR0eSk7Ci0JCWlmIChyZXR2YWwgIT0gLUVBR0FJTiB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiByZXR2YWw7Ci0JCXNjaGVkdWxlKCk7Ci0JCWdvdG8gcmV0cnlfb3BlbjsKLQl9Ci0KLQl0dHlfYWRkX2ZpbGUodHR5LCBmaWxwKTsKLQotCWNoZWNrX3R0eV9jb3VudCh0dHksIF9fZnVuY19fKTsKLQl0dHlfZGVidWdfaGFuZ3VwKHR0eSwgIm9wZW5pbmcgKGNvdW50PSVkKVxuIiwgdHR5LT5jb3VudCk7Ci0KLQlpZiAodHR5LT5vcHMtPm9wZW4pCi0JCXJldHZhbCA9IHR0eS0+b3BzLT5vcGVuKHR0eSwgZmlscCk7Ci0JZWxzZQotCQlyZXR2YWwgPSAtRU5PREVWOwotCWZpbHAtPmZfZmxhZ3MgPSBzYXZlZF9mbGFnczsKLQotCWlmIChyZXR2YWwpIHsKLQkJdHR5X2RlYnVnX2hhbmd1cCh0dHksICJvcGVuIGVycm9yICVkLCByZWxlYXNpbmdcbiIsIHJldHZhbCk7Ci0KLQkJdHR5X3VubG9jayh0dHkpOyAvKiBuZWVkIHRvIGNhbGwgdHR5X3JlbGVhc2Ugd2l0aG91dCBCVE0gKi8KLQkJdHR5X3JlbGVhc2UoaW5vZGUsIGZpbHApOwotCQlpZiAocmV0dmFsICE9IC1FUkVTVEFSVFNZUykKLQkJCXJldHVybiByZXR2YWw7Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIHJldHZhbDsKLQotCQlzY2hlZHVsZSgpOwotCQkvKgotCQkgKiBOZWVkIHRvIHJlc2V0IGZfb3AgaW4gY2FzZSBhIGhhbmd1cCBoYXBwZW5lZC4KLQkJICovCi0JCWlmICh0dHlfaHVuZ191cF9wKGZpbHApKQotCQkJZmlscC0+Zl9vcCA9ICZ0dHlfZm9wczsKLQkJZ290byByZXRyeV9vcGVuOwotCX0KLQljbGVhcl9iaXQoVFRZX0hVUFBFRCwgJnR0eS0+ZmxhZ3MpOwotCi0Jbm9jdHR5ID0gKGZpbHAtPmZfZmxhZ3MgJiBPX05PQ1RUWSkgfHwKLQkJIChJU19FTkFCTEVEKENPTkZJR19WVCkgJiYgZGV2aWNlID09IE1LREVWKFRUWV9NQUpPUiwgMCkpIHx8Ci0JCSBkZXZpY2UgPT0gTUtERVYoVFRZQVVYX01BSk9SLCAxKSB8fAotCQkgKHR0eS0+ZHJpdmVyLT50eXBlID09IFRUWV9EUklWRVJfVFlQRV9QVFkgJiYKLQkJICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpOwotCWlmICghbm9jdHR5KQotCQl0dHlfb3Blbl9wcm9jX3NldF90dHkoZmlscCwgdHR5KTsKLQl0dHlfdW5sb2NrKHR0eSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi0vKioKLSAqCXR0eV9wb2xsCS0JY2hlY2sgdHR5IHN0YXR1cwotICoJQGZpbHA6IGZpbGUgYmVpbmcgcG9sbGVkCi0gKglAd2FpdDogcG9sbCB3YWl0IHN0cnVjdHVyZXMgdG8gdXBkYXRlCi0gKgotICoJQ2FsbCB0aGUgbGluZSBkaXNjaXBsaW5lIHBvbGxpbmcgbWV0aG9kIHRvIG9idGFpbiB0aGUgcG9sbAotICoJc3RhdHVzIG9mIHRoZSBkZXZpY2UuCi0gKgotICoJTG9ja2luZzogbG9ja3MgY2FsbGVkIGxpbmUgZGlzY2lwbGluZSBidXQgbGRpc2MgcG9sbCBtZXRob2QKLSAqCW1heSBiZSByZS1lbnRlcmVkIGZyZWVseSBieSBvdGhlciBjYWxsZXJzLgotICovCi0KLXN0YXRpYyBfX3BvbGxfdCB0dHlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gZmlsZV90dHkoZmlscCk7Ci0Jc3RydWN0IHR0eV9sZGlzYyAqbGQ7Ci0JX19wb2xsX3QgcmV0ID0gMDsKLQotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxlX2lub2RlKGZpbHApLCAidHR5X3BvbGwiKSkKLQkJcmV0dXJuIDA7Ci0KLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmICghbGQpCi0JCXJldHVybiBodW5nX3VwX3R0eV9wb2xsKGZpbHAsIHdhaXQpOwotCWlmIChsZC0+b3BzLT5wb2xsKQotCQlyZXQgPSBsZC0+b3BzLT5wb2xsKHR0eSwgZmlscCwgd2FpdCk7Ci0JdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbHApOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgZmlsZV9pbm9kZShmaWxwKSwgInR0eV9mYXN5bmMiKSkKLQkJZ290byBvdXQ7Ci0KLQlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgJnR0eS0+ZmFzeW5jKTsKLQlpZiAocmV0dmFsIDw9IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKG9uKSB7Ci0JCWVudW0gcGlkX3R5cGUgdHlwZTsKLQkJc3RydWN0IHBpZCAqcGlkOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmN0cmxfbG9jaywgZmxhZ3MpOwotCQlpZiAodHR5LT5wZ3JwKSB7Ci0JCQlwaWQgPSB0dHktPnBncnA7Ci0JCQl0eXBlID0gUElEVFlQRV9QR0lEOwotCQl9IGVsc2UgewotCQkJcGlkID0gdGFza19waWQoY3VycmVudCk7Ci0JCQl0eXBlID0gUElEVFlQRV9UR0lEOwotCQl9Ci0JCWdldF9waWQocGlkKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5LT5jdHJsX2xvY2ssIGZsYWdzKTsKLQkJX19mX3NldG93bihmaWxwLCBwaWQsIHR5cGUsIDApOwotCQlwdXRfcGlkKHBpZCk7Ci0JCXJldHZhbCA9IDA7Ci0JfQotb3V0OgotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgdHR5X2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbHApOwotCWludCByZXR2YWwgPSAtRU5PVFRZOwotCi0JdHR5X2xvY2sodHR5KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCXJldHZhbCA9IF9fdHR5X2Zhc3luYyhmZCwgZmlscCwgb24pOwotCXR0eV91bmxvY2sodHR5KTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICoJdGlvY3N0aQkJCS0JZmFrZSBpbnB1dCBjaGFyYWN0ZXIKLSAqCUB0dHk6IHR0eSB0byBmYWtlIGlucHV0IGludG8KLSAqCUBwOiBwb2ludGVyIHRvIGNoYXJhY3RlcgotICoKLSAqCUZha2UgaW5wdXQgdG8gYSB0dHkgZGV2aWNlLiBEb2VzIHRoZSBuZWNlc3NhcnkgbG9ja2luZyBhbmQKLSAqCWlucHV0IG1hbmFnZW1lbnQuCi0gKgotICoJRklYTUU6IGRvZXMgbm90IGhvbm91ciBmbG93IGNvbnRyb2wgPz8KLSAqCi0gKglMb2NraW5nOgotICoJCUNhbGxlZCBmdW5jdGlvbnMgdGFrZSB0dHlfbGRpc2NzX2xvY2sKLSAqCQljdXJyZW50LT5zaWduYWwtPnR0eSBjaGVjayBpcyBzYWZlIHdpdGhvdXQgbG9ja3MKLSAqLwotCi1zdGF0aWMgaW50IHRpb2NzdGkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY2hhciBfX3VzZXIgKnApCi17Ci0JY2hhciBjaCwgbWJ6ID0gMDsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQotCWlmICgoY3VycmVudC0+c2lnbmFsLT50dHkgIT0gdHR5KSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoZ2V0X3VzZXIoY2gsIHApKQotCQlyZXR1cm4gLUVGQVVMVDsKLQl0dHlfYXVkaXRfdGlvY3N0aSh0dHksIGNoKTsKLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmICghbGQpCi0JCXJldHVybiAtRUlPOwotCXR0eV9idWZmZXJfbG9ja19leGNsdXNpdmUodHR5LT5wb3J0KTsKLQlpZiAobGQtPm9wcy0+cmVjZWl2ZV9idWYpCi0JCWxkLT5vcHMtPnJlY2VpdmVfYnVmKHR0eSwgJmNoLCAmbWJ6LCAxKTsKLQl0dHlfYnVmZmVyX3VubG9ja19leGNsdXNpdmUodHR5LT5wb3J0KTsKLQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqCXRpb2Nnd2luc3oJCS0JaW1wbGVtZW50IHdpbmRvdyBxdWVyeSBpb2N0bAotICoJQHR0eTogdHR5Ci0gKglAYXJnOiB1c2VyIGJ1ZmZlciBmb3IgcmVzdWx0Ci0gKgotICoJQ29waWVzIHRoZSBrZXJuZWwgaWRlYSBvZiB0aGUgd2luZG93IHNpemUgaW50byB0aGUgdXNlciBidWZmZXIuCi0gKgotICoJTG9ja2luZzogdHR5LT53aW5zaXplX211dGV4IGlzIHRha2VuIHRvIGVuc3VyZSB0aGUgd2luc2l6ZSBkYXRhCi0gKgkJaXMgY29uc2lzdGVudC4KLSAqLwotCi1zdGF0aWMgaW50IHRpb2Nnd2luc3ooc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgX191c2VyICphcmcpCi17Ci0JaW50IGVycjsKLQotCW11dGV4X2xvY2soJnR0eS0+d2luc2l6ZV9tdXRleCk7Ci0JZXJyID0gY29weV90b191c2VyKGFyZywgJnR0eS0+d2luc2l6ZSwgc2l6ZW9mKCphcmcpKTsKLQltdXRleF91bmxvY2soJnR0eS0+d2luc2l6ZV9tdXRleCk7Ci0KLQlyZXR1cm4gZXJyID8gLUVGQVVMVDogMDsKLX0KLQotLyoqCi0gKgl0dHlfZG9fcmVzaXplCQktCXJlc2l6ZSBldmVudAotICoJQHR0eTogdHR5IGJlaW5nIHJlc2l6ZWQKLSAqCUB3czogbmV3IGRpbWVuc2lvbnMKLSAqCi0gKglVcGRhdGUgdGhlIHRlcm1pb3MgdmFyaWFibGVzIGFuZCBzZW5kIHRoZSBuZWNlc3Nhcnkgc2lnbmFscyB0bwotICoJcGVmb3JtIGEgdGVybWluYWwgcmVzaXplIGNvcnJlY3RseQotICovCi0KLWludCB0dHlfZG9fcmVzaXplKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB3aW5zaXplICp3cykKLXsKLQlzdHJ1Y3QgcGlkICpwZ3JwOwotCi0JLyogTG9jayB0aGUgdHR5ICovCi0JbXV0ZXhfbG9jaygmdHR5LT53aW5zaXplX211dGV4KTsKLQlpZiAoIW1lbWNtcCh3cywgJnR0eS0+d2luc2l6ZSwgc2l6ZW9mKCp3cykpKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBTaWduYWwgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCAqLwotCXBncnAgPSB0dHlfZ2V0X3BncnAodHR5KTsKLQlpZiAocGdycCkKLQkJa2lsbF9wZ3JwKHBncnAsIFNJR1dJTkNILCAxKTsKLQlwdXRfcGlkKHBncnApOwotCi0JdHR5LT53aW5zaXplID0gKndzOwotZG9uZToKLQltdXRleF91bmxvY2soJnR0eS0+d2luc2l6ZV9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0eV9kb19yZXNpemUpOwotCi0vKioKLSAqCXRpb2Nzd2luc3oJCS0JaW1wbGVtZW50IHdpbmRvdyBzaXplIHNldCBpb2N0bAotICoJQHR0eTogdHR5IHNpZGUgb2YgdHR5Ci0gKglAYXJnOiB1c2VyIGJ1ZmZlciBmb3IgcmVzdWx0Ci0gKgotICoJQ29waWVzIHRoZSB1c2VyIGlkZWEgb2YgdGhlIHdpbmRvdyBzaXplIHRvIHRoZSBrZXJuZWwuIFRyYWRpdGlvbmFsbHkKLSAqCXRoaXMgaXMganVzdCBhZHZpc29yeSBpbmZvcm1hdGlvbiBidXQgZm9yIHRoZSBMaW51eCBjb25zb2xlIGl0Ci0gKglhY3R1YWxseSBoYXMgZHJpdmVyIGxldmVsIG1lYW5pbmcgYW5kIHRyaWdnZXJzIGEgVkMgcmVzaXplLgotICoKLSAqCUxvY2tpbmc6Ci0gKgkJRHJpdmVyIGRlcGVuZGVudC4gVGhlIGRlZmF1bHQgZG9fcmVzaXplIG1ldGhvZCB0YWtlcyB0aGUKLSAqCXR0eSB0ZXJtaW9zIG11dGV4IGFuZCBjdHJsX2xvY2suIFRoZSBjb25zb2xlIHRha2VzIGl0cyBvd24gbG9jawotICoJdGhlbiBjYWxscyBpbnRvIHRoZSBkZWZhdWx0IG1ldGhvZC4KLSAqLwotCi1zdGF0aWMgaW50IHRpb2Nzd2luc3ooc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHdpbnNpemUgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IHdpbnNpemUgdG1wX3dzOwotCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wX3dzLCBhcmcsIHNpemVvZigqYXJnKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHR0eS0+b3BzLT5yZXNpemUpCi0JCXJldHVybiB0dHktPm9wcy0+cmVzaXplKHR0eSwgJnRtcF93cyk7Ci0JZWxzZQotCQlyZXR1cm4gdHR5X2RvX3Jlc2l6ZSh0dHksICZ0bXBfd3MpOwotfQotCi0vKioKLSAqCXRpb2Njb25zCS0JYWxsb3cgYWRtaW4gdG8gbW92ZSBsb2dpY2FsIGNvbnNvbGUKLSAqCUBmaWxlOiB0aGUgZmlsZSB0byBiZWNvbWUgY29uc29sZQotICoKLSAqCUFsbG93IHRoZSBhZG1pbmlzdHJhdG9yIHRvIG1vdmUgdGhlIHJlZGlyZWN0ZWQgY29uc29sZSBkZXZpY2UKLSAqCi0gKglMb2NraW5nOiB1c2VzIHJlZGlyZWN0X2xvY2sgdG8gZ3VhcmQgdGhlIHJlZGlyZWN0IGluZm9ybWF0aW9uCi0gKi8KLQotc3RhdGljIGludCB0aW9jY29ucyhzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0JaWYgKGZpbGUtPmZfb3AtPndyaXRlX2l0ZXIgPT0gcmVkaXJlY3RlZF90dHlfd3JpdGUpIHsKLQkJc3RydWN0IGZpbGUgKmY7Ci0JCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7Ci0JCWYgPSByZWRpcmVjdDsKLQkJcmVkaXJlY3QgPSBOVUxMOwotCQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7Ci0JCWlmIChmKQotCQkJZnB1dChmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChmaWxlLT5mX29wLT53cml0ZV9pdGVyICE9IHR0eV93cml0ZSkKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQotCQlyZXR1cm4gLUVCQURGOwotCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9XUklURSkpCi0JCXJldHVybiAtRUlOVkFMOwotCXNwaW5fbG9jaygmcmVkaXJlY3RfbG9jayk7Ci0JaWYgKHJlZGlyZWN0KSB7Ci0JCXNwaW5fdW5sb2NrKCZyZWRpcmVjdF9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JcmVkaXJlY3QgPSBnZXRfZmlsZShmaWxlKTsKLQlzcGluX3VubG9jaygmcmVkaXJlY3RfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICoJdGlvY3NldGQJLQlzZXQgbGluZSBkaXNjaXBsaW5lCi0gKglAdHR5OiB0dHkgZGV2aWNlCi0gKglAcDogcG9pbnRlciB0byB1c2VyIGRhdGEKLSAqCi0gKglTZXQgdGhlIGxpbmUgZGlzY2lwbGluZSBhY2NvcmRpbmcgdG8gdXNlciByZXF1ZXN0LgotICoKLSAqCUxvY2tpbmc6IHNlZSB0dHlfc2V0X2xkaXNjLCB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSBoZWxwZXIKLSAqLwotCi1zdGF0aWMgaW50IHRpb2NzZXRkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBfX3VzZXIgKnApCi17Ci0JaW50IGRpc2M7Ci0JaW50IHJldDsKLQotCWlmIChnZXRfdXNlcihkaXNjLCBwKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXQgPSB0dHlfc2V0X2xkaXNjKHR0eSwgZGlzYyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqCXRpb2NnZXRkCS0JZ2V0IGxpbmUgZGlzY2lwbGluZQotICoJQHR0eTogdHR5IGRldmljZQotICoJQHA6IHBvaW50ZXIgdG8gdXNlciBkYXRhCi0gKgotICoJUmV0cmlldmVzIHRoZSBsaW5lIGRpc2NpcGxpbmUgaWQgZGlyZWN0bHkgZnJvbSB0aGUgbGRpc2MuCi0gKgotICoJTG9ja2luZzogd2FpdHMgZm9yIGxkaXNjIHJlZmVyZW5jZSAoaW4gY2FzZSB0aGUgbGluZSBkaXNjaXBsaW5lCi0gKgkJaXMgY2hhbmdpbmcgb3IgdGhlIHR0eSBpcyBiZWluZyBodW5ndXApCi0gKi8KLQotc3RhdGljIGludCB0aW9jZ2V0ZChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpwKQotewotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCWludCByZXQ7Ci0KLQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCWlmICghbGQpCi0JCXJldHVybiAtRUlPOwotCXJldCA9IHB1dF91c2VyKGxkLT5vcHMtPm51bSwgcCk7Ci0JdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqCXNlbmRfYnJlYWsJLQlwZXJmb3JtZWQgdGltZSBicmVhawotICoJQHR0eTogZGV2aWNlIHRvIGJyZWFrIG9uCi0gKglAZHVyYXRpb246IHRpbWVvdXQgaW4gbVMKLSAqCi0gKglQZXJmb3JtIGEgdGltZWQgYnJlYWsgb24gaGFyZHdhcmUgdGhhdCBsYWNrcyBpdHMgb3duIGRyaXZlciBsZXZlbAotICoJdGltZWQgYnJlYWsgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKglMb2NraW5nOgotICoJCWF0b21pY193cml0ZV9sb2NrIHNlcmlhbGl6ZXMKLSAqCi0gKi8KLQotc3RhdGljIGludCBzZW5kX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBkdXJhdGlvbikKLXsKLQlpbnQgcmV0dmFsOwotCi0JaWYgKHR0eS0+b3BzLT5icmVha19jdGwgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9IQVJEV0FSRV9CUkVBSykKLQkJcmV0dmFsID0gdHR5LT5vcHMtPmJyZWFrX2N0bCh0dHksIGR1cmF0aW9uKTsKLQllbHNlIHsKLQkJLyogRG8gdGhlIHdvcmsgb3Vyc2VsdmVzICovCi0JCWlmICh0dHlfd3JpdGVfbG9jayh0dHksIDApIDwgMCkKLQkJCXJldHVybiAtRUlOVFI7Ci0JCXJldHZhbCA9IHR0eS0+b3BzLT5icmVha19jdGwodHR5LCAtMSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlnb3RvIG91dDsKLQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGR1cmF0aW9uKTsKLQkJcmV0dmFsID0gdHR5LT5vcHMtPmJyZWFrX2N0bCh0dHksIDApOwotb3V0OgotCQl0dHlfd3JpdGVfdW5sb2NrKHR0eSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHZhbCA9IC1FSU5UUjsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKgl0dHlfdGlvY21nZXQJCS0JZ2V0IG1vZGVtIHN0YXR1cwotICoJQHR0eTogdHR5IGRldmljZQotICoJQHA6IHBvaW50ZXIgdG8gcmVzdWx0Ci0gKgotICoJT2J0YWluIHRoZSBtb2RlbSBzdGF0dXMgYml0cyBmcm9tIHRoZSB0dHkgZHJpdmVyIGlmIHRoZSBmZWF0dXJlCi0gKglpcyBzdXBwb3J0ZWQuIFJldHVybiAtRU5PVFRZIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCi0gKgotICoJTG9ja2luZzogbm9uZSAodXAgdG8gdGhlIGRyaXZlcikKLSAqLwotCi1zdGF0aWMgaW50IHR0eV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgX191c2VyICpwKQotewotCWludCByZXR2YWwgPSAtRU5PVFRZOwotCi0JaWYgKHR0eS0+b3BzLT50aW9jbWdldCkgewotCQlyZXR2YWwgPSB0dHktPm9wcy0+dGlvY21nZXQodHR5KTsKLQotCQlpZiAocmV0dmFsID49IDApCi0JCQlyZXR2YWwgPSBwdXRfdXNlcihyZXR2YWwsIHApOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqCXR0eV90aW9jbXNldAkJLQlzZXQgbW9kZW0gc3RhdHVzCi0gKglAdHR5OiB0dHkgZGV2aWNlCi0gKglAY21kOiBjb21tYW5kIC0gY2xlYXIgYml0cywgc2V0IGJpdHMgb3Igc2V0IGFsbAotICoJQHA6IHBvaW50ZXIgdG8gZGVzaXJlZCBiaXRzCi0gKgotICoJU2V0IHRoZSBtb2RlbSBzdGF0dXMgYml0cyBmcm9tIHRoZSB0dHkgZHJpdmVyIGlmIHRoZSBmZWF0dXJlCi0gKglpcyBzdXBwb3J0ZWQuIFJldHVybiAtRU5PVFRZIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCi0gKgotICoJTG9ja2luZzogbm9uZSAodXAgdG8gdGhlIGRyaXZlcikKLSAqLwotCi1zdGF0aWMgaW50IHR0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLAotCSAgICAgdW5zaWduZWQgX191c2VyICpwKQotewotCWludCByZXR2YWw7Ci0JdW5zaWduZWQgaW50IHNldCwgY2xlYXIsIHZhbDsKLQotCWlmICh0dHktPm9wcy0+dGlvY21zZXQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9UVFk7Ci0KLQlyZXR2YWwgPSBnZXRfdXNlcih2YWwsIHApOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0Jc2V0ID0gY2xlYXIgPSAwOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBUSU9DTUJJUzoKLQkJc2V0ID0gdmFsOwotCQlicmVhazsKLQljYXNlIFRJT0NNQklDOgotCQljbGVhciA9IHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBUSU9DTVNFVDoKLQkJc2V0ID0gdmFsOwotCQljbGVhciA9IH52YWw7Ci0JCWJyZWFrOwotCX0KLQlzZXQgJj0gVElPQ01fRFRSfFRJT0NNX1JUU3xUSU9DTV9PVVQxfFRJT0NNX09VVDJ8VElPQ01fTE9PUDsKLQljbGVhciAmPSBUSU9DTV9EVFJ8VElPQ01fUlRTfFRJT0NNX09VVDF8VElPQ01fT1VUMnxUSU9DTV9MT09QOwotCXJldHVybiB0dHktPm9wcy0+dGlvY21zZXQodHR5LCBzZXQsIGNsZWFyKTsKLX0KLQotc3RhdGljIGludCB0dHlfdGlvY2dpY291bnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdm9pZCBfX3VzZXIgKmFyZykKLXsKLQlpbnQgcmV0dmFsID0gLUVJTlZBTDsKLQlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7Ci0JbWVtc2V0KCZpY291bnQsIDAsIHNpemVvZihpY291bnQpKTsKLQlpZiAodHR5LT5vcHMtPmdldF9pY291bnQpCi0JCXJldHZhbCA9IHR0eS0+b3BzLT5nZXRfaWNvdW50KHR0eSwgJmljb3VudCk7Ci0JaWYgKHJldHZhbCAhPSAwKQotCQlyZXR1cm4gcmV0dmFsOwotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaWNvdW50LCBzaXplb2YoaWNvdW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHR0eV90aW9jc3NlcmlhbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnNzKQotewotCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKGRlcHJfZmxhZ3MsCi0JCQlERUZBVUxUX1JBVEVMSU1JVF9JTlRFUlZBTCwKLQkJCURFRkFVTFRfUkFURUxJTUlUX0JVUlNUKTsKLQljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdjsKLQlpbnQgZmxhZ3M7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnYsIHNzLCBzaXplb2YoKnNzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZmxhZ3MgPSB2LmZsYWdzICYgQVNZTkNfREVQUkVDQVRFRDsKLQotCWlmIChmbGFncyAmJiBfX3JhdGVsaW1pdCgmZGVwcl9mbGFncykpCi0JCXByX3dhcm4oIiVzOiAnJXMnIGlzIHVzaW5nIGRlcHJlY2F0ZWQgc2VyaWFsIGZsYWdzICh3aXRoIG5vIGVmZmVjdCk6ICUuOHhcbiIsCi0JCQlfX2Z1bmNfXywgZ2V0X3Rhc2tfY29tbShjb21tLCBjdXJyZW50KSwgZmxhZ3MpOwotCWlmICghdHR5LT5vcHMtPnNldF9zZXJpYWwpCi0JCXJldHVybiAtRU5PVFRZOwotCXJldHVybiB0dHktPm9wcy0+c2V0X3NlcmlhbCh0dHksICZ2KTsKLX0KLQotc3RhdGljIGludCB0dHlfdGlvY2dzZXJpYWwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpzcykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB2OwotCWludCBlcnI7Ci0KLQltZW1zZXQoJnYsIDAsIHNpemVvZih2KSk7Ci0JaWYgKCF0dHktPm9wcy0+Z2V0X3NlcmlhbCkKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JZXJyID0gdHR5LT5vcHMtPmdldF9zZXJpYWwodHR5LCAmdik7Ci0JaWYgKCFlcnIgJiYgY29weV90b191c2VyKHNzLCAmdiwgc2l6ZW9mKHYpKSkKLQkJZXJyID0gLUVGQVVMVDsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogaWYgcHR5LCByZXR1cm4gdGhlIHNsYXZlIHNpZGUgKHJlYWxfdHR5KQotICogb3RoZXJ3aXNlLCByZXR1cm4gc2VsZgotICovCi1zdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9wYWlyX2dldF90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgotCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCi0JCXR0eSA9IHR0eS0+bGluazsKLQlyZXR1cm4gdHR5OwotfQotCi0vKgotICogU3BsaXQgdGhpcyB1cCwgYXMgZ2NjIGNhbiBjaG9rZSBvbiBpdCBvdGhlcndpc2UuLgotICovCi1sb25nIHR0eV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGVfdHR5KGZpbGUpOwotCXN0cnVjdCB0dHlfc3RydWN0ICpyZWFsX3R0eTsKLQl2b2lkIF9fdXNlciAqcCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCi0JaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGZpbGVfaW5vZGUoZmlsZSksICJ0dHlfaW9jdGwiKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZWFsX3R0eSA9IHR0eV9wYWlyX2dldF90dHkodHR5KTsKLQotCS8qCi0JICogRmFjdG9yIG91dCBzb21lIGNvbW1vbiBwcmVwIHdvcmsKLQkgKi8KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgVElPQ1NFVEQ6Ci0JY2FzZSBUSU9DU0JSSzoKLQljYXNlIFRJT0NDQlJLOgotCWNhc2UgVENTQlJLOgotCWNhc2UgVENTQlJLUDoKLQkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwotCQlpZiAocmV0dmFsKQotCQkJcmV0dXJuIHJldHZhbDsKLQkJaWYgKGNtZCAhPSBUSU9DQ0JSSykgewotCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldHVybiAtRUlOVFI7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKglOb3cgZG8gdGhlIHN0dWZmLgotCSAqLwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBUSU9DU1RJOgotCQlyZXR1cm4gdGlvY3N0aSh0dHksIHApOwotCWNhc2UgVElPQ0dXSU5TWjoKLQkJcmV0dXJuIHRpb2Nnd2luc3oocmVhbF90dHksIHApOwotCWNhc2UgVElPQ1NXSU5TWjoKLQkJcmV0dXJuIHRpb2Nzd2luc3oocmVhbF90dHksIHApOwotCWNhc2UgVElPQ0NPTlM6Ci0JCXJldHVybiByZWFsX3R0eSAhPSB0dHkgPyAtRUlOVkFMIDogdGlvY2NvbnMoZmlsZSk7Ci0JY2FzZSBUSU9DRVhDTDoKLQkJc2V0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7Ci0JCXJldHVybiAwOwotCWNhc2UgVElPQ05YQ0w6Ci0JCWNsZWFyX2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7Ci0JCXJldHVybiAwOwotCWNhc2UgVElPQ0dFWENMOgotCXsKLQkJaW50IGV4Y2wgPSB0ZXN0X2JpdChUVFlfRVhDTFVTSVZFLCAmdHR5LT5mbGFncyk7Ci0JCXJldHVybiBwdXRfdXNlcihleGNsLCAoaW50IF9fdXNlciAqKXApOwotCX0KLQljYXNlIFRJT0NHRVREOgotCQlyZXR1cm4gdGlvY2dldGQodHR5LCBwKTsKLQljYXNlIFRJT0NTRVREOgotCQlyZXR1cm4gdGlvY3NldGQodHR5LCBwKTsKLQljYXNlIFRJT0NWSEFOR1VQOgotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCQl0dHlfdmhhbmd1cCh0dHkpOwotCQlyZXR1cm4gMDsKLQljYXNlIFRJT0NHREVWOgotCXsKLQkJdW5zaWduZWQgaW50IHJldCA9IG5ld19lbmNvZGVfZGV2KHR0eV9kZXZudW0ocmVhbF90dHkpKTsKLQkJcmV0dXJuIHB1dF91c2VyKHJldCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilwKTsKLQl9Ci0JLyoKLQkgKiBCcmVhayBoYW5kbGluZwotCSAqLwotCWNhc2UgVElPQ1NCUks6CS8qIFR1cm4gYnJlYWsgb24sIHVuY29uZGl0aW9uYWxseSAqLwotCQlpZiAodHR5LT5vcHMtPmJyZWFrX2N0bCkKLQkJCXJldHVybiB0dHktPm9wcy0+YnJlYWtfY3RsKHR0eSwgLTEpOwotCQlyZXR1cm4gMDsKLQljYXNlIFRJT0NDQlJLOgkvKiBUdXJuIGJyZWFrIG9mZiwgdW5jb25kaXRpb25hbGx5ICovCi0JCWlmICh0dHktPm9wcy0+YnJlYWtfY3RsKQotCQkJcmV0dXJuIHR0eS0+b3BzLT5icmVha19jdGwodHR5LCAwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBUQ1NCUks6ICAgLyogU1ZJRCB2ZXJzaW9uOiBub24temVybyBhcmcgLS0+IG5vIGJyZWFrICovCi0JCS8qIG5vbi16ZXJvIGFyZyBtZWFucyB3YWl0IGZvciBhbGwgb3V0cHV0IGRhdGEKLQkJICogdG8gYmUgc2VudCAocGVyZm9ybWVkIGFib3ZlKSBidXQgZG9uJ3Qgc2VuZCBicmVhay4KLQkJICogVGhpcyBpcyB1c2VkIGJ5IHRoZSB0Y2RyYWluKCkgdGVybWlvcyBmdW5jdGlvbi4KLQkJICovCi0JCWlmICghYXJnKQotCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCAyNTApOwotCQlyZXR1cm4gMDsKLQljYXNlIFRDU0JSS1A6CS8qIHN1cHBvcnQgZm9yIFBPU0lYIHRjc2VuZGJyZWFrKCkgKi8KLQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBhcmcgPyBhcmcqMTAwIDogMjUwKTsKLQotCWNhc2UgVElPQ01HRVQ6Ci0JCXJldHVybiB0dHlfdGlvY21nZXQodHR5LCBwKTsKLQljYXNlIFRJT0NNU0VUOgotCWNhc2UgVElPQ01CSUM6Ci0JY2FzZSBUSU9DTUJJUzoKLQkJcmV0dXJuIHR0eV90aW9jbXNldCh0dHksIGNtZCwgcCk7Ci0JY2FzZSBUSU9DR0lDT1VOVDoKLQkJcmV0dXJuIHR0eV90aW9jZ2ljb3VudCh0dHksIHApOwotCWNhc2UgVENGTFNIOgotCQlzd2l0Y2ggKGFyZykgewotCQljYXNlIFRDSUZMVVNIOgotCQljYXNlIFRDSU9GTFVTSDoKLQkJLyogZmx1c2ggdHR5IGJ1ZmZlciBhbmQgYWxsb3cgbGRpc2MgdG8gcHJvY2VzcyBpb2N0bCAqLwotCQkJdHR5X2J1ZmZlcl9mbHVzaCh0dHksIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUSU9DU1NFUklBTDoKLQkJcmV0dXJuIHR0eV90aW9jc3NlcmlhbCh0dHksIHApOwotCWNhc2UgVElPQ0dTRVJJQUw6Ci0JCXJldHVybiB0dHlfdGlvY2dzZXJpYWwodHR5LCBwKTsKLQljYXNlIFRJT0NHUFRQRUVSOgotCQkvKiBTcGVjaWFsIGJlY2F1c2UgdGhlIHN0cnVjdCBmaWxlIGlzIG5lZWRlZCAqLwotCQlyZXR1cm4gcHRtX29wZW5fcGVlcihmaWxlLCB0dHksIChpbnQpYXJnKTsKLQlkZWZhdWx0OgotCQlyZXR2YWwgPSB0dHlfam9iY3RybF9pb2N0bCh0dHksIHJlYWxfdHR5LCBmaWxlLCBjbWQsIGFyZyk7Ci0JCWlmIChyZXR2YWwgIT0gLUVOT0lPQ1RMQ01EKQotCQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JaWYgKHR0eS0+b3BzLT5pb2N0bCkgewotCQlyZXR2YWwgPSB0dHktPm9wcy0+aW9jdGwodHR5LCBjbWQsIGFyZyk7Ci0JCWlmIChyZXR2YWwgIT0gLUVOT0lPQ1RMQ01EKQotCQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKLQlpZiAoIWxkKQotCQlyZXR1cm4gaHVuZ191cF90dHlfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCXJldHZhbCA9IC1FSU5WQUw7Ci0JaWYgKGxkLT5vcHMtPmlvY3RsKSB7Ci0JCXJldHZhbCA9IGxkLT5vcHMtPmlvY3RsKHR0eSwgZmlsZSwgY21kLCBhcmcpOwotCQlpZiAocmV0dmFsID09IC1FTk9JT0NUTENNRCkKLQkJCXJldHZhbCA9IC1FTk9UVFk7Ci0JfQotCXR0eV9sZGlzY19kZXJlZihsZCk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiB7Ci0JY29tcGF0X2ludF90ICAgIHR5cGU7Ci0JY29tcGF0X2ludF90ICAgIGxpbmU7Ci0JY29tcGF0X3VpbnRfdCAgIHBvcnQ7Ci0JY29tcGF0X2ludF90ICAgIGlycTsKLQljb21wYXRfaW50X3QgICAgZmxhZ3M7Ci0JY29tcGF0X2ludF90ICAgIHhtaXRfZmlmb19zaXplOwotCWNvbXBhdF9pbnRfdCAgICBjdXN0b21fZGl2aXNvcjsKLQljb21wYXRfaW50X3QgICAgYmF1ZF9iYXNlOwotCXVuc2lnbmVkIHNob3J0ICBjbG9zZV9kZWxheTsKLQljaGFyICAgIGlvX3R5cGU7Ci0JY2hhciAgICByZXNlcnZlZF9jaGFyOwotCWNvbXBhdF9pbnRfdCAgICBodWI2OwotCXVuc2lnbmVkIHNob3J0ICBjbG9zaW5nX3dhaXQ7IC8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLwotCXVuc2lnbmVkIHNob3J0ICBjbG9zaW5nX3dhaXQyOyAvKiBubyBsb25nZXIgdXNlZC4uLiAqLwotCWNvbXBhdF91aW50X3QgICBpb21lbV9iYXNlOwotCXVuc2lnbmVkIHNob3J0ICBpb21lbV9yZWdfc2hpZnQ7Ci0JdW5zaWduZWQgaW50ICAgIHBvcnRfaGlnaDsKLQkvKiBjb21wYXRfdWxvbmdfdCAgaW9tYXBfYmFzZSBGSVhNRSAqLwotCWNvbXBhdF9pbnRfdCAgICByZXNlcnZlZDsKLX07Ci0KLXN0YXRpYyBpbnQgY29tcGF0X3R0eV90aW9jc3NlcmlhbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdDMyIF9fdXNlciAqc3MpCi17Ci0Jc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUoZGVwcl9mbGFncywKLQkJCURFRkFVTFRfUkFURUxJTUlUX0lOVEVSVkFMLAotCQkJREVGQVVMVF9SQVRFTElNSVRfQlVSU1QpOwotCWNoYXIgY29tbVtUQVNLX0NPTU1fTEVOXTsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdDMyIHYzMjsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB2OwotCWludCBmbGFnczsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmdjMyLCBzcywgc2l6ZW9mKCpzcykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW1lbWNweSgmdiwgJnYzMiwgb2Zmc2V0b2Yoc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiwgaW9tZW1fYmFzZSkpOwotCXYuaW9tZW1fYmFzZSA9IGNvbXBhdF9wdHIodjMyLmlvbWVtX2Jhc2UpOwotCXYuaW9tZW1fcmVnX3NoaWZ0ID0gdjMyLmlvbWVtX3JlZ19zaGlmdDsKLQl2LnBvcnRfaGlnaCA9IHYzMi5wb3J0X2hpZ2g7Ci0Jdi5pb21hcF9iYXNlID0gMDsKLQotCWZsYWdzID0gdi5mbGFncyAmIEFTWU5DX0RFUFJFQ0FURUQ7Ci0KLQlpZiAoZmxhZ3MgJiYgX19yYXRlbGltaXQoJmRlcHJfZmxhZ3MpKQotCQlwcl93YXJuKCIlczogJyVzJyBpcyB1c2luZyBkZXByZWNhdGVkIHNlcmlhbCBmbGFncyAod2l0aCBubyBlZmZlY3QpOiAlLjh4XG4iLAotCQkJX19mdW5jX18sIGdldF90YXNrX2NvbW0oY29tbSwgY3VycmVudCksIGZsYWdzKTsKLQlpZiAoIXR0eS0+b3BzLT5zZXRfc2VyaWFsKQotCQlyZXR1cm4gLUVOT1RUWTsKLQlyZXR1cm4gdHR5LT5vcHMtPnNldF9zZXJpYWwodHR5LCAmdik7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGF0X3R0eV90aW9jZ3NlcmlhbChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiBfX3VzZXIgKnNzKQotewotCXN0cnVjdCBzZXJpYWxfc3RydWN0MzIgdjMyOwotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHY7Ci0JaW50IGVycjsKLQotCW1lbXNldCgmdiwgMCwgc2l6ZW9mKHYpKTsKLQltZW1zZXQoJnYzMiwgMCwgc2l6ZW9mKHYzMikpOwotCi0JaWYgKCF0dHktPm9wcy0+Z2V0X3NlcmlhbCkKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JZXJyID0gdHR5LT5vcHMtPmdldF9zZXJpYWwodHR5LCAmdik7Ci0JaWYgKCFlcnIpIHsKLQkJbWVtY3B5KCZ2MzIsICZ2LCBvZmZzZXRvZihzdHJ1Y3Qgc2VyaWFsX3N0cnVjdDMyLCBpb21lbV9iYXNlKSk7Ci0JCXYzMi5pb21lbV9iYXNlID0gKHVuc2lnbmVkIGxvbmcpdi5pb21lbV9iYXNlID4+IDMyID8KLQkJCTB4ZmZmZmZmZiA6IHB0cl90b19jb21wYXQodi5pb21lbV9iYXNlKTsKLQkJdjMyLmlvbWVtX3JlZ19zaGlmdCA9IHYuaW9tZW1fcmVnX3NoaWZ0OwotCQl2MzIucG9ydF9oaWdoID0gdi5wb3J0X2hpZ2g7Ci0JCWlmIChjb3B5X3RvX3VzZXIoc3MsICZ2MzIsIHNpemVvZih2MzIpKSkKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci1zdGF0aWMgbG9uZyB0dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBmaWxlX3R0eShmaWxlKTsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKLQlpbnQgcmV0dmFsID0gLUVOT0lPQ1RMQ01EOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFRJT0NPVVRROgotCWNhc2UgVElPQ1NUSToKLQljYXNlIFRJT0NHV0lOU1o6Ci0JY2FzZSBUSU9DU1dJTlNaOgotCWNhc2UgVElPQ0dFWENMOgotCWNhc2UgVElPQ0dFVEQ6Ci0JY2FzZSBUSU9DU0VURDoKLQljYXNlIFRJT0NHREVWOgotCWNhc2UgVElPQ01HRVQ6Ci0JY2FzZSBUSU9DTVNFVDoKLQljYXNlIFRJT0NNQklDOgotCWNhc2UgVElPQ01CSVM6Ci0JY2FzZSBUSU9DR0lDT1VOVDoKLQljYXNlIFRJT0NHUEdSUDoKLQljYXNlIFRJT0NTUEdSUDoKLQljYXNlIFRJT0NHU0lEOgotCWNhc2UgVElPQ1NFUkdFVExTUjoKLQljYXNlIFRJT0NHUlM0ODU6Ci0JY2FzZSBUSU9DU1JTNDg1OgotI2lmZGVmIFRJT0NHRVRQCi0JY2FzZSBUSU9DR0VUUDoKLQljYXNlIFRJT0NTRVRQOgotCWNhc2UgVElPQ1NFVE46Ci0jZW5kaWYKLSNpZmRlZiBUSU9DR0VUQwotCWNhc2UgVElPQ0dFVEM6Ci0JY2FzZSBUSU9DU0VUQzoKLSNlbmRpZgotI2lmZGVmIFRJT0NHTFRDCi0JY2FzZSBUSU9DR0xUQzoKLQljYXNlIFRJT0NTTFRDOgotI2VuZGlmCi0JY2FzZSBUQ1NFVFNGOgotCWNhc2UgVENTRVRTVzoKLQljYXNlIFRDU0VUUzoKLQljYXNlIFRDR0VUUzoKLSNpZmRlZiBUQ0dFVFMyCi0JY2FzZSBUQ0dFVFMyOgotCWNhc2UgVENTRVRTRjI6Ci0JY2FzZSBUQ1NFVFNXMjoKLQljYXNlIFRDU0VUUzI6Ci0jZW5kaWYKLQljYXNlIFRDR0VUQToKLQljYXNlIFRDU0VUQUY6Ci0JY2FzZSBUQ1NFVEFXOgotCWNhc2UgVENTRVRBOgotCWNhc2UgVElPQ0dMQ0tUUk1JT1M6Ci0JY2FzZSBUSU9DU0xDS1RSTUlPUzoKLSNpZmRlZiBUQ0dFVFgKLQljYXNlIFRDR0VUWDoKLQljYXNlIFRDU0VUWDoKLQljYXNlIFRDU0VUWFc6Ci0JY2FzZSBUQ1NFVFhGOgotI2VuZGlmCi0JY2FzZSBUSU9DR1NPRlRDQVI6Ci0JY2FzZSBUSU9DU1NPRlRDQVI6Ci0KLQljYXNlIFBQUElPQ0dDSEFOOgotCWNhc2UgUFBQSU9DR1VOSVQ6Ci0JCXJldHVybiB0dHlfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOwotCWNhc2UgVElPQ0NPTlM6Ci0JY2FzZSBUSU9DRVhDTDoKLQljYXNlIFRJT0NOWENMOgotCWNhc2UgVElPQ1ZIQU5HVVA6Ci0JY2FzZSBUSU9DU0JSSzoKLQljYXNlIFRJT0NDQlJLOgotCWNhc2UgVENTQlJLOgotCWNhc2UgVENTQlJLUDoKLQljYXNlIFRDRkxTSDoKLQljYXNlIFRJT0NHUFRQRUVSOgotCWNhc2UgVElPQ05PVFRZOgotCWNhc2UgVElPQ1NDVFRZOgotCWNhc2UgVENYT05DOgotCWNhc2UgVElPQ01JV0FJVDoKLQljYXNlIFRJT0NTRVJDT05GSUc6Ci0JCXJldHVybiB0dHlfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwotCX0KLQotCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBmaWxlX2lub2RlKGZpbGUpLCAidHR5X2lvY3RsIikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFRJT0NTU0VSSUFMOgotCQlyZXR1cm4gY29tcGF0X3R0eV90aW9jc3NlcmlhbCh0dHksIGNvbXBhdF9wdHIoYXJnKSk7Ci0JY2FzZSBUSU9DR1NFUklBTDoKLQkJcmV0dXJuIGNvbXBhdF90dHlfdGlvY2dzZXJpYWwodHR5LCBjb21wYXRfcHRyKGFyZykpOwotCX0KLQlpZiAodHR5LT5vcHMtPmNvbXBhdF9pb2N0bCkgewotCQlyZXR2YWwgPSB0dHktPm9wcy0+Y29tcGF0X2lvY3RsKHR0eSwgY21kLCBhcmcpOwotCQlpZiAocmV0dmFsICE9IC1FTk9JT0NUTENNRCkKLQkJCXJldHVybiByZXR2YWw7Ci0JfQotCi0JbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKLQlpZiAoIWxkKQotCQlyZXR1cm4gaHVuZ191cF90dHlfY29tcGF0X2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKLQlpZiAobGQtPm9wcy0+Y29tcGF0X2lvY3RsKQotCQlyZXR2YWwgPSBsZC0+b3BzLT5jb21wYXRfaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7Ci0JaWYgKHJldHZhbCA9PSAtRU5PSU9DVExDTUQgJiYgbGQtPm9wcy0+aW9jdGwpCi0JCXJldHZhbCA9IGxkLT5vcHMtPmlvY3RsKHR0eSwgZmlsZSwKLQkJCQkodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGNtZCksIGFyZyk7Ci0JdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCB0aGlzX3R0eShjb25zdCB2b2lkICp0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgZmQpCi17Ci0JaWYgKGxpa2VseShmaWxlLT5mX29wLT5yZWFkX2l0ZXIgIT0gdHR5X3JlYWQpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZmlsZV90dHkoZmlsZSkgIT0gdCA/IDAgOiBmZCArIDE7Ci19Ci0JCi0vKgotICogVGhpcyBpbXBsZW1lbnRzIHRoZSAiU2VjdXJlIEF0dGVudGlvbiBLZXkiIC0tLSAgdGhlIGlkZWEgaXMgdG8KLSAqIHByZXZlbnQgdHJvamFuIGhvcnNlcyBieSBraWxsaW5nIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqIHR0eSB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJTZWN1cmUgQXR0ZW50aW9uIEtleSIuICBSZXF1aXJlZCBmb3IKLSAqIHN1cGVyLXBhcmFub2lkIGFwcGxpY2F0aW9ucyAtLS0gc2VlIHRoZSBPcmFuZ2UgQm9vayBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoaXMgY29kZSBjb3VsZCBiZSBuaWNlcjsgaWRlYWxseSBpdCBzaG91bGQgc2VuZCBhIEhVUCwgd2FpdCBhIGZldwotICogc2Vjb25kcywgdGhlbiBzZW5kIGEgSU5ULCBhbmQgdGhlbiBhIEtJTEwgc2lnbmFsLiAgQnV0IHlvdSB0aGVuCi0gKiBoYXZlIHRvIGNvb3JkaW5hdGUgd2l0aCB0aGUgaW5pdCBwcm9jZXNzLCBzaW5jZSBhbGwgcHJvY2Vzc2VzIGFzc29jaWF0ZWQKLSAqIHdpdGggdGhlIGN1cnJlbnQgdHR5IG11c3QgYmUgZGVhZCBiZWZvcmUgdGhlIG5ldyBnZXR0eSBpcyBhbGxvd2VkCi0gKiB0byBzcGF3bi4KLSAqCi0gKiBOb3csIGlmIGl0IHdvdWxkIGJlIGNvcnJlY3QgOy0vIFRoZSBjdXJyZW50IGNvZGUgaGFzIGEgbmFzdHkgaG9sZSAtCi0gKiBpdCBkb2Vzbid0IGNhdGNoIGZpbGVzIGluIGZsaWdodC4gV2UgbWF5IHNlbmQgdGhlIGRlc2NyaXB0b3IgdG8gb3Vyc2VsdmVzCi0gKiB2aWEgQUZfVU5JWCBzb2NrZXQsIGNsb3NlIGl0IGFuZCBsYXRlciBmZXRjaCBmcm9tIHNvY2tldC4gRklYTUUuCi0gKgotICogTmFzdHkgYnVnOiBkb19TQUsgaXMgYmVpbmcgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LiAgVGhpcyBjYW4KLSAqIGRlYWRsb2NrLiAgV2UgcHVudCBpdCB1cCB0byBwcm9jZXNzIGNvbnRleHQuICBBS1BNIC0gMTZNYXIyMDAxCi0gKi8KLXZvaWQgX19kb19TQUsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLSNpZmRlZiBUVFlfU09GVF9TQUsKLQl0dHlfaGFuZ3VwKHR0eSk7Ci0jZWxzZQotCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7Ci0Jc3RydWN0IHBpZCAqc2Vzc2lvbjsKLQlpbnQJCWk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghdHR5KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHR5LT5jdHJsX2xvY2ssIGZsYWdzKTsKLQlzZXNzaW9uID0gZ2V0X3BpZCh0dHktPnNlc3Npb24pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eS0+Y3RybF9sb2NrLCBmbGFncyk7Ci0KLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQotCXR0eV9kcml2ZXJfZmx1c2hfYnVmZmVyKHR0eSk7Ci0KLQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwotCS8qIEtpbGwgdGhlIGVudGlyZSBzZXNzaW9uICovCi0JZG9fZWFjaF9waWRfdGFzayhzZXNzaW9uLCBQSURUWVBFX1NJRCwgcCkgewotCQl0dHlfbm90aWNlKHR0eSwgIlNBSzoga2lsbGVkIHByb2Nlc3MgJWQgKCVzKTogYnkgc2Vzc2lvblxuIiwKLQkJCSAgIHRhc2tfcGlkX25yKHApLCBwLT5jb21tKTsKLQkJZ3JvdXBfc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCBTRU5EX1NJR19QUklWLCBwLCBQSURUWVBFX1NJRCk7Ci0JfSB3aGlsZV9lYWNoX3BpZF90YXNrKHNlc3Npb24sIFBJRFRZUEVfU0lELCBwKTsKLQotCS8qIE5vdyBraWxsIGFueSBwcm9jZXNzZXMgdGhhdCBoYXBwZW4gdG8gaGF2ZSB0aGUgdHR5IG9wZW4gKi8KLQlkb19lYWNoX3RocmVhZChnLCBwKSB7Ci0JCWlmIChwLT5zaWduYWwtPnR0eSA9PSB0dHkpIHsKLQkJCXR0eV9ub3RpY2UodHR5LCAiU0FLOiBraWxsZWQgcHJvY2VzcyAlZCAoJXMpOiBieSBjb250cm9sbGluZyB0dHlcbiIsCi0JCQkJICAgdGFza19waWRfbnIocCksIHAtPmNvbW0pOwotCQkJZ3JvdXBfc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCBTRU5EX1NJR19QUklWLCBwLCBQSURUWVBFX1NJRCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQl0YXNrX2xvY2socCk7Ci0JCWkgPSBpdGVyYXRlX2ZkKHAtPmZpbGVzLCAwLCB0aGlzX3R0eSwgdHR5KTsKLQkJaWYgKGkgIT0gMCkgewotCQkJdHR5X25vdGljZSh0dHksICJTQUs6IGtpbGxlZCBwcm9jZXNzICVkICglcyk6IGJ5IGZkIyVkXG4iLAotCQkJCSAgIHRhc2tfcGlkX25yKHApLCBwLT5jb21tLCBpIC0gMSk7Ci0JCQlncm91cF9zZW5kX3NpZ19pbmZvKFNJR0tJTEwsIFNFTkRfU0lHX1BSSVYsIHAsIFBJRFRZUEVfU0lEKTsKLQkJfQotCQl0YXNrX3VubG9jayhwKTsKLQl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOwotCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQlwdXRfcGlkKHNlc3Npb24pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIGRvX1NBS193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB0dHlfc3RydWN0LCBTQUtfd29yayk7Ci0JX19kb19TQUsodHR5KTsKLX0KLQotLyoKLSAqIFRoZSB0cSBoYW5kbGluZyBoZXJlIGlzIGEgbGl0dGxlIHJhY3kgLSB0dHktPlNBS193b3JrIG1heSBhbHJlYWR5IGJlIHF1ZXVlZC4KLSAqIEZvcnR1bmF0ZWx5IHdlIGRvbid0IG5lZWQgdG8gd29ycnksIGJlY2F1c2UgaWYgLT5TQUtfd29yayBpcyBhbHJlYWR5IHF1ZXVlZCwKLSAqIHRoZSB2YWx1ZXMgd2hpY2ggd2Ugd3JpdGUgdG8gaXQgd2lsbCBiZSBpZGVudGljYWwgdG8gdGhlIHZhbHVlcyB3aGljaCBpdAotICogYWxyZWFkeSBoYXMuIC0tYWtwbQotICovCi12b2lkIGRvX1NBSyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWlmICghdHR5KQotCQlyZXR1cm47Ci0Jc2NoZWR1bGVfd29yaygmdHR5LT5TQUtfd29yayk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG9fU0FLKTsKLQotLyogTXVzdCBwdXRfZGV2aWNlKCkgYWZ0ZXIgaXQncyB1bnVzZWQhICovCi1zdGF0aWMgc3RydWN0IGRldmljZSAqdHR5X2dldF9kZXZpY2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlkZXZfdCBkZXZ0ID0gdHR5X2Rldm51bSh0dHkpOwotCXJldHVybiBjbGFzc19maW5kX2RldmljZV9ieV9kZXZ0KHR0eV9jbGFzcywgZGV2dCk7Ci19Ci0KLQotLyoqCi0gKglhbGxvY190dHlfc3RydWN0Ci0gKgotICoJVGhpcyBzdWJyb3V0aW5lIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSB0dHkgc3RydWN0dXJlLgotICoKLSAqCUxvY2tpbmc6IG5vbmUgLSB0dHkgaW4gcXVlc3Rpb24gaXMgbm90IGV4cG9zZWQgYXQgdGhpcyBwb2ludAotICovCi0KLXN0cnVjdCB0dHlfc3RydWN0ICphbGxvY190dHlfc3RydWN0KHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIGludCBpZHgpCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKLQotCXR0eSA9IGt6YWxsb2Moc2l6ZW9mKCp0dHkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXR0eSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlrcmVmX2luaXQoJnR0eS0+a3JlZik7Ci0JdHR5LT5tYWdpYyA9IFRUWV9NQUdJQzsKLQlpZiAodHR5X2xkaXNjX2luaXQodHR5KSkgewotCQlrZnJlZSh0dHkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdHR5LT5zZXNzaW9uID0gTlVMTDsKLQl0dHktPnBncnAgPSBOVUxMOwotCW11dGV4X2luaXQoJnR0eS0+bGVnYWN5X211dGV4KTsKLQltdXRleF9pbml0KCZ0dHktPnRocm90dGxlX211dGV4KTsKLQlpbml0X3J3c2VtKCZ0dHktPnRlcm1pb3NfcndzZW0pOwotCW11dGV4X2luaXQoJnR0eS0+d2luc2l6ZV9tdXRleCk7Ci0JaW5pdF9sZHNlbSgmdHR5LT5sZGlzY19zZW0pOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnR0eS0+d3JpdGVfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmdHR5LT5yZWFkX3dhaXQpOwotCUlOSVRfV09SSygmdHR5LT5oYW5ndXBfd29yaywgZG9fdHR5X2hhbmd1cCk7Ci0JbXV0ZXhfaW5pdCgmdHR5LT5hdG9taWNfd3JpdGVfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnR0eS0+Y3RybF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmdHR5LT5mbG93X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZ0dHktPmZpbGVzX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZ0dHktPnR0eV9maWxlcyk7Ci0JSU5JVF9XT1JLKCZ0dHktPlNBS193b3JrLCBkb19TQUtfd29yayk7Ci0KLQl0dHktPmRyaXZlciA9IGRyaXZlcjsKLQl0dHktPm9wcyA9IGRyaXZlci0+b3BzOwotCXR0eS0+aW5kZXggPSBpZHg7Ci0JdHR5X2xpbmVfbmFtZShkcml2ZXIsIGlkeCwgdHR5LT5uYW1lKTsKLQl0dHktPmRldiA9IHR0eV9nZXRfZGV2aWNlKHR0eSk7Ci0KLQlyZXR1cm4gdHR5OwotfQotCi0vKioKLSAqCXR0eV9wdXRfY2hhcgktCXdyaXRlIG9uZSBjaGFyYWN0ZXIgdG8gYSB0dHkKLSAqCUB0dHk6IHR0eQotICoJQGNoOiBjaGFyYWN0ZXIKLSAqCi0gKglXcml0ZSBvbmUgYnl0ZSB0byB0aGUgdHR5IHVzaW5nIHRoZSBwcm92aWRlZCBwdXRfY2hhciBtZXRob2QKLSAqCWlmIHByZXNlbnQuIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHN1Y2Nlc3NmdWxseSBvdXRwdXQuCi0gKgotICoJTm90ZTogdGhlIHNwZWNpZmljIHB1dF9jaGFyIG9wZXJhdGlvbiBpbiB0aGUgZHJpdmVyIGxheWVyIG1heSBnbwotICoJYXdheSBzb29uLiBEb24ndCBjYWxsIGl0IGRpcmVjdGx5LCB1c2UgdGhpcyBtZXRob2QKLSAqLwotCi1pbnQgdHR5X3B1dF9jaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGNoYXIgY2gpCi17Ci0JaWYgKHR0eS0+b3BzLT5wdXRfY2hhcikKLQkJcmV0dXJuIHR0eS0+b3BzLT5wdXRfY2hhcih0dHksIGNoKTsKLQlyZXR1cm4gdHR5LT5vcHMtPndyaXRlKHR0eSwgJmNoLCAxKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9wdXRfY2hhcik7Ci0KLXN0cnVjdCBjbGFzcyAqdHR5X2NsYXNzOwotCi1zdGF0aWMgaW50IHR0eV9jZGV2X2FkZChzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCBkZXZfdCBkZXYsCi0JCXVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IGNvdW50KQotewotCWludCBlcnI7Ci0KLQkvKiBpbml0IGhlcmUsIHNpbmNlIHJldXNlZCBjZGV2cyBjYXVzZSBjcmFzaGVzICovCi0JZHJpdmVyLT5jZGV2c1tpbmRleF0gPSBjZGV2X2FsbG9jKCk7Ci0JaWYgKCFkcml2ZXItPmNkZXZzW2luZGV4XSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZHJpdmVyLT5jZGV2c1tpbmRleF0tPm9wcyA9ICZ0dHlfZm9wczsKLQlkcml2ZXItPmNkZXZzW2luZGV4XS0+b3duZXIgPSBkcml2ZXItPm93bmVyOwotCWVyciA9IGNkZXZfYWRkKGRyaXZlci0+Y2RldnNbaW5kZXhdLCBkZXYsIGNvdW50KTsKLQlpZiAoZXJyKQotCQlrb2JqZWN0X3B1dCgmZHJpdmVyLT5jZGV2c1tpbmRleF0tPmtvYmopOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICoJdHR5X3JlZ2lzdGVyX2RldmljZSAtIHJlZ2lzdGVyIGEgdHR5IGRldmljZQotICoJQGRyaXZlcjogdGhlIHR0eSBkcml2ZXIgdGhhdCBkZXNjcmliZXMgdGhlIHR0eSBkZXZpY2UKLSAqCUBpbmRleDogdGhlIGluZGV4IGluIHRoZSB0dHkgZHJpdmVyIGZvciB0aGlzIHR0eSBkZXZpY2UKLSAqCUBkZXZpY2U6IGEgc3RydWN0IGRldmljZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHR0eSBkZXZpY2UuCi0gKgkJVGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgaWYgdGhlcmUgaXMgbm8ga25vd24gc3RydWN0IGRldmljZQotICoJCWZvciB0aGlzIHR0eSBkZXZpY2UgaXQgY2FuIGJlIHNldCB0byBOVUxMIHNhZmVseS4KLSAqCi0gKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGRldmljZSBmb3IgdGhpcyB0dHkgZGV2aWNlCi0gKgkob3IgRVJSX1BUUigtRUZPTykgb24gZXJyb3IpLgotICoKLSAqCVRoaXMgY2FsbCBpcyByZXF1aXJlZCB0byBiZSBtYWRlIHRvIHJlZ2lzdGVyIGFuIGluZGl2aWR1YWwgdHR5IGRldmljZQotICoJaWYgdGhlIHR0eSBkcml2ZXIncyBmbGFncyBoYXZlIHRoZSBUVFlfRFJJVkVSX0RZTkFNSUNfREVWIGJpdCBzZXQuICBJZgotICoJdGhhdCBiaXQgaXMgbm90IHNldCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBieSBhIHR0eQotICoJZHJpdmVyLgotICoKLSAqCUxvY2tpbmc6ID8/Ci0gKi8KLQotc3RydWN0IGRldmljZSAqdHR5X3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbmRleCwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0JcmV0dXJuIHR0eV9yZWdpc3Rlcl9kZXZpY2VfYXR0cihkcml2ZXIsIGluZGV4LCBkZXZpY2UsIE5VTEwsIE5VTEwpOwotfQotRVhQT1JUX1NZTUJPTCh0dHlfcmVnaXN0ZXJfZGV2aWNlKTsKLQotc3RhdGljIHZvaWQgdHR5X2RldmljZV9jcmVhdGVfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JZGV2X2RiZyhkZXYsICJyZWxlYXNpbmcuLi5cbiIpOwotCWtmcmVlKGRldik7Ci19Ci0KLS8qKgotICoJdHR5X3JlZ2lzdGVyX2RldmljZV9hdHRyIC0gcmVnaXN0ZXIgYSB0dHkgZGV2aWNlCi0gKglAZHJpdmVyOiB0aGUgdHR5IGRyaXZlciB0aGF0IGRlc2NyaWJlcyB0aGUgdHR5IGRldmljZQotICoJQGluZGV4OiB0aGUgaW5kZXggaW4gdGhlIHR0eSBkcml2ZXIgZm9yIHRoaXMgdHR5IGRldmljZQotICoJQGRldmljZTogYSBzdHJ1Y3QgZGV2aWNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHR5IGRldmljZS4KLSAqCQlUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLCBpZiB0aGVyZSBpcyBubyBrbm93biBzdHJ1Y3QgZGV2aWNlCi0gKgkJZm9yIHRoaXMgdHR5IGRldmljZSBpdCBjYW4gYmUgc2V0IHRvIE5VTEwgc2FmZWx5LgotICoJQGRydmRhdGE6IERyaXZlciBkYXRhIHRvIGJlIHNldCB0byBkZXZpY2UuCi0gKglAYXR0cl9ncnA6IEF0dHJpYnV0ZSBncm91cCB0byBiZSBzZXQgb24gZGV2aWNlLgotICoKLSAqCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZGV2aWNlIGZvciB0aGlzIHR0eSBkZXZpY2UKLSAqCShvciBFUlJfUFRSKC1FRk9PKSBvbiBlcnJvcikuCi0gKgotICoJVGhpcyBjYWxsIGlzIHJlcXVpcmVkIHRvIGJlIG1hZGUgdG8gcmVnaXN0ZXIgYW4gaW5kaXZpZHVhbCB0dHkgZGV2aWNlCi0gKglpZiB0aGUgdHR5IGRyaXZlcidzIGZsYWdzIGhhdmUgdGhlIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYgYml0IHNldC4gIElmCi0gKgl0aGF0IGJpdCBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGJ5IGEgdHR5Ci0gKglkcml2ZXIuCi0gKgotICoJTG9ja2luZzogPz8KLSAqLwotc3RydWN0IGRldmljZSAqdHR5X3JlZ2lzdGVyX2RldmljZV9hdHRyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCi0JCQkJICAgdW5zaWduZWQgaW5kZXgsIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKLQkJCQkgICB2b2lkICpkcnZkYXRhLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKiphdHRyX2dycCkKLXsKLQljaGFyIG5hbWVbNjRdOwotCWRldl90IGRldnQgPSBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0KSArIGluZGV4OwotCXN0cnVjdCBrdGVybWlvcyAqdHA7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXR2YWw7Ci0KLQlpZiAoaW5kZXggPj0gZHJpdmVyLT5udW0pIHsKLQkJcHJfZXJyKCIlczogQXR0ZW1wdCB0byByZWdpc3RlciBpbnZhbGlkIHR0eSBsaW5lIG51bWJlciAoJWQpXG4iLAotCQkgICAgICAgZHJpdmVyLT5uYW1lLCBpbmRleCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQotCWlmIChkcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSkKLQkJcHR5X2xpbmVfbmFtZShkcml2ZXIsIGluZGV4LCBuYW1lKTsKLQllbHNlCi0JCXR0eV9saW5lX25hbWUoZHJpdmVyLCBpbmRleCwgbmFtZSk7Ci0KLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JZGV2LT5kZXZ0ID0gZGV2dDsKLQlkZXYtPmNsYXNzID0gdHR5X2NsYXNzOwotCWRldi0+cGFyZW50ID0gZGV2aWNlOwotCWRldi0+cmVsZWFzZSA9IHR0eV9kZXZpY2VfY3JlYXRlX3JlbGVhc2U7Ci0JZGV2X3NldF9uYW1lKGRldiwgIiVzIiwgbmFtZSk7Ci0JZGV2LT5ncm91cHMgPSBhdHRyX2dycDsKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZkYXRhKTsKLQotCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKGRldiwgMSk7Ci0KLQlyZXR2YWwgPSBkZXZpY2VfcmVnaXN0ZXIoZGV2KTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycl9wdXQ7Ci0KLQlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9EWU5BTUlDX0FMTE9DKSkgewotCQkvKgotCQkgKiBGcmVlIGFueSBzYXZlZCB0ZXJtaW9zIGRhdGEgc28gdGhhdCB0aGUgdGVybWlvcyBzdGF0ZSBpcwotCQkgKiByZXNldCB3aGVuIHJldXNpbmcgYSBtaW5vciBudW1iZXIuCi0JCSAqLwotCQl0cCA9IGRyaXZlci0+dGVybWlvc1tpbmRleF07Ci0JCWlmICh0cCkgewotCQkJZHJpdmVyLT50ZXJtaW9zW2luZGV4XSA9IE5VTEw7Ci0JCQlrZnJlZSh0cCk7Ci0JCX0KLQotCQlyZXR2YWwgPSB0dHlfY2Rldl9hZGQoZHJpdmVyLCBkZXZ0LCBpbmRleCwgMSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlnb3RvIGVycl9kZWw7Ci0JfQotCi0JZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoZGV2LCAwKTsKLQlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7Ci0KLQlyZXR1cm4gZGV2OwotCi1lcnJfZGVsOgotCWRldmljZV9kZWwoZGV2KTsKLWVycl9wdXQ6Ci0JcHV0X2RldmljZShkZXYpOwotCi0JcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0eV9yZWdpc3Rlcl9kZXZpY2VfYXR0cik7Ci0KLS8qKgotICogCXR0eV91bnJlZ2lzdGVyX2RldmljZSAtIHVucmVnaXN0ZXIgYSB0dHkgZGV2aWNlCi0gKiAJQGRyaXZlcjogdGhlIHR0eSBkcml2ZXIgdGhhdCBkZXNjcmliZXMgdGhlIHR0eSBkZXZpY2UKLSAqIAlAaW5kZXg6IHRoZSBpbmRleCBpbiB0aGUgdHR5IGRyaXZlciBmb3IgdGhpcyB0dHkgZGV2aWNlCi0gKgotICogCUlmIGEgdHR5IGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGggYSBjYWxsIHRvIHR0eV9yZWdpc3Rlcl9kZXZpY2UoKSB0aGVuCi0gKgl0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIHR0eSBkZXZpY2UgaXMgZ29uZS4KLSAqCi0gKglMb2NraW5nOiA/PwotICovCi0KLXZvaWQgdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsIHVuc2lnbmVkIGluZGV4KQotewotCWRldmljZV9kZXN0cm95KHR0eV9jbGFzcywKLQkJTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCkgKyBpbmRleCk7Ci0JaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfRFlOQU1JQ19BTExPQykpIHsKLQkJY2Rldl9kZWwoZHJpdmVyLT5jZGV2c1tpbmRleF0pOwotCQlkcml2ZXItPmNkZXZzW2luZGV4XSA9IE5VTEw7Ci0JfQotfQotRVhQT1JUX1NZTUJPTCh0dHlfdW5yZWdpc3Rlcl9kZXZpY2UpOwotCi0vKioKLSAqIF9fdHR5X2FsbG9jX2RyaXZlciAtLSBhbGxvY2F0ZSB0dHkgZHJpdmVyCi0gKiBAbGluZXM6IGNvdW50IG9mIGxpbmVzIHRoaXMgZHJpdmVyIGNhbiBoYW5kbGUgYXQgbW9zdAotICogQG93bmVyOiBtb2R1bGUgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgZHJpdmVyCi0gKiBAZmxhZ3M6IHNvbWUgb2YgVFRZX0RSSVZFUl8qIGZsYWdzLCB3aWxsIGJlIHNldCBpbiBkcml2ZXItPmZsYWdzCi0gKgotICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSwgc29tZSBvZiB0aGUgcHJvdmlkZWQgbWFjcm9zIHNob3VsZCBiZQotICogdXNlZCBpbnN0ZWFkLiBVc2UgSVNfRVJSIGFuZCBmcmllbmRzIG9uIEByZXR2YWwuCi0gKi8KLXN0cnVjdCB0dHlfZHJpdmVyICpfX3R0eV9hbGxvY19kcml2ZXIodW5zaWduZWQgaW50IGxpbmVzLCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKLQkJdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyOwotCXVuc2lnbmVkIGludCBjZGV2cyA9IDE7Ci0JaW50IGVycjsKLQotCWlmICghbGluZXMgfHwgKGZsYWdzICYgVFRZX0RSSVZFUl9VTk5VTUJFUkVEX05PREUgJiYgbGluZXMgPiAxKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlkcml2ZXIgPSBremFsbG9jKHNpemVvZigqZHJpdmVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkcml2ZXIpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0Ja3JlZl9pbml0KCZkcml2ZXItPmtyZWYpOwotCWRyaXZlci0+bWFnaWMgPSBUVFlfRFJJVkVSX01BR0lDOwotCWRyaXZlci0+bnVtID0gbGluZXM7Ci0JZHJpdmVyLT5vd25lciA9IG93bmVyOwotCWRyaXZlci0+ZmxhZ3MgPSBmbGFnczsKLQotCWlmICghKGZsYWdzICYgVFRZX0RSSVZFUl9ERVZQVFNfTUVNKSkgewotCQlkcml2ZXItPnR0eXMgPSBrY2FsbG9jKGxpbmVzLCBzaXplb2YoKmRyaXZlci0+dHR5cyksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWRyaXZlci0+dGVybWlvcyA9IGtjYWxsb2MobGluZXMsIHNpemVvZigqZHJpdmVyLT50ZXJtaW9zKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFkcml2ZXItPnR0eXMgfHwgIWRyaXZlci0+dGVybWlvcykgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX2ZyZWVfYWxsOwotCQl9Ci0JfQotCi0JaWYgKCEoZmxhZ3MgJiBUVFlfRFJJVkVSX0RZTkFNSUNfQUxMT0MpKSB7Ci0JCWRyaXZlci0+cG9ydHMgPSBrY2FsbG9jKGxpbmVzLCBzaXplb2YoKmRyaXZlci0+cG9ydHMpLAotCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIWRyaXZlci0+cG9ydHMpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9mcmVlX2FsbDsKLQkJfQotCQljZGV2cyA9IGxpbmVzOwotCX0KLQotCWRyaXZlci0+Y2RldnMgPSBrY2FsbG9jKGNkZXZzLCBzaXplb2YoKmRyaXZlci0+Y2RldnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRyaXZlci0+Y2RldnMpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfZnJlZV9hbGw7Ci0JfQotCi0JcmV0dXJuIGRyaXZlcjsKLWVycl9mcmVlX2FsbDoKLQlrZnJlZShkcml2ZXItPnBvcnRzKTsKLQlrZnJlZShkcml2ZXItPnR0eXMpOwotCWtmcmVlKGRyaXZlci0+dGVybWlvcyk7Ci0Ja2ZyZWUoZHJpdmVyLT5jZGV2cyk7Ci0Ja2ZyZWUoZHJpdmVyKTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotRVhQT1JUX1NZTUJPTChfX3R0eV9hbGxvY19kcml2ZXIpOwotCi1zdGF0aWMgdm9pZCBkZXN0cnVjdF90dHlfZHJpdmVyKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHR0eV9kcml2ZXIsIGtyZWYpOwotCWludCBpOwotCXN0cnVjdCBrdGVybWlvcyAqdHA7Ci0KLQlpZiAoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfSU5TVEFMTEVEKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkcml2ZXItPm51bTsgaSsrKSB7Ci0JCQl0cCA9IGRyaXZlci0+dGVybWlvc1tpXTsKLQkJCWlmICh0cCkgewotCQkJCWRyaXZlci0+dGVybWlvc1tpXSA9IE5VTEw7Ci0JCQkJa2ZyZWUodHApOwotCQkJfQotCQkJaWYgKCEoZHJpdmVyLT5mbGFncyAmIFRUWV9EUklWRVJfRFlOQU1JQ19ERVYpKQotCQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShkcml2ZXIsIGkpOwotCQl9Ci0JCXByb2NfdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7Ci0JCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9EWU5BTUlDX0FMTE9DKQotCQkJY2Rldl9kZWwoZHJpdmVyLT5jZGV2c1swXSk7Ci0JfQotCWtmcmVlKGRyaXZlci0+Y2RldnMpOwotCWtmcmVlKGRyaXZlci0+cG9ydHMpOwotCWtmcmVlKGRyaXZlci0+dGVybWlvcyk7Ci0Ja2ZyZWUoZHJpdmVyLT50dHlzKTsKLQlrZnJlZShkcml2ZXIpOwotfQotCi12b2lkIHR0eV9kcml2ZXJfa3JlZl9wdXQoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKLXsKLQlrcmVmX3B1dCgmZHJpdmVyLT5rcmVmLCBkZXN0cnVjdF90dHlfZHJpdmVyKTsKLX0KLUVYUE9SVF9TWU1CT0wodHR5X2RyaXZlcl9rcmVmX3B1dCk7Ci0KLXZvaWQgdHR5X3NldF9vcGVyYXRpb25zKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCi0JCQljb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgKm9wKQotewotCWRyaXZlci0+b3BzID0gb3A7Ci19OwotRVhQT1JUX1NZTUJPTCh0dHlfc2V0X29wZXJhdGlvbnMpOwotCi12b2lkIHB1dF90dHlfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkKQotewotCXR0eV9kcml2ZXJfa3JlZl9wdXQoZCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHB1dF90dHlfZHJpdmVyKTsKLQotLyoKLSAqIENhbGxlZCBieSBhIHR0eSBkcml2ZXIgdG8gcmVnaXN0ZXIgaXRzZWxmLgotICovCi1pbnQgdHR5X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyKQotewotCWludCBlcnJvcjsKLQlpbnQgaTsKLQlkZXZfdCBkZXY7Ci0Jc3RydWN0IGRldmljZSAqZDsKLQotCWlmICghZHJpdmVyLT5tYWpvcikgewotCQllcnJvciA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgZHJpdmVyLT5taW5vcl9zdGFydCwKLQkJCQkJCWRyaXZlci0+bnVtLCBkcml2ZXItPm5hbWUpOwotCQlpZiAoIWVycm9yKSB7Ci0JCQlkcml2ZXItPm1ham9yID0gTUFKT1IoZGV2KTsKLQkJCWRyaXZlci0+bWlub3Jfc3RhcnQgPSBNSU5PUihkZXYpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZGV2ID0gTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCk7Ci0JCWVycm9yID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIGRyaXZlci0+bnVtLCBkcml2ZXItPm5hbWUpOwotCX0KLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIGVycjsKLQotCWlmIChkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9EWU5BTUlDX0FMTE9DKSB7Ci0JCWVycm9yID0gdHR5X2NkZXZfYWRkKGRyaXZlciwgZGV2LCAwLCBkcml2ZXItPm51bSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZXJyX3VucmVnX2NoYXI7Ci0JfQotCi0JbXV0ZXhfbG9jaygmdHR5X211dGV4KTsKLQlsaXN0X2FkZCgmZHJpdmVyLT50dHlfZHJpdmVycywgJnR0eV9kcml2ZXJzKTsKLQltdXRleF91bmxvY2soJnR0eV9tdXRleCk7Ci0KLQlpZiAoIShkcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVikpIHsKLQkJZm9yIChpID0gMDsgaSA8IGRyaXZlci0+bnVtOyBpKyspIHsKLQkJCWQgPSB0dHlfcmVnaXN0ZXJfZGV2aWNlKGRyaXZlciwgaSwgTlVMTCk7Ci0JCQlpZiAoSVNfRVJSKGQpKSB7Ci0JCQkJZXJyb3IgPSBQVFJfRVJSKGQpOwotCQkJCWdvdG8gZXJyX3VucmVnX2RldnM7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvY190dHlfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlcik7Ci0JZHJpdmVyLT5mbGFncyB8PSBUVFlfRFJJVkVSX0lOU1RBTExFRDsKLQlyZXR1cm4gMDsKLQotZXJyX3VucmVnX2RldnM6Ci0JZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoZHJpdmVyLCBpKTsKLQotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JbGlzdF9kZWwoJmRyaXZlci0+dHR5X2RyaXZlcnMpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQotZXJyX3VucmVnX2NoYXI6Ci0JdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgZHJpdmVyLT5udW0pOwotZXJyOgotCXJldHVybiBlcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0wodHR5X3JlZ2lzdGVyX2RyaXZlcik7Ci0KLS8qCi0gKiBDYWxsZWQgYnkgYSB0dHkgZHJpdmVyIHRvIHVucmVnaXN0ZXIgaXRzZWxmLgotICovCi1pbnQgdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpCi17Ci0jaWYgMAotCS8qIEZJWE1FICovCi0JaWYgKGRyaXZlci0+cmVmY291bnQpCi0JCXJldHVybiAtRUJVU1k7Ci0jZW5kaWYKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoZHJpdmVyLT5tYWpvciwgZHJpdmVyLT5taW5vcl9zdGFydCksCi0JCQkJZHJpdmVyLT5udW0pOwotCW11dGV4X2xvY2soJnR0eV9tdXRleCk7Ci0JbGlzdF9kZWwoJmRyaXZlci0+dHR5X2RyaXZlcnMpOwotCW11dGV4X3VubG9jaygmdHR5X211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTCh0dHlfdW5yZWdpc3Rlcl9kcml2ZXIpOwotCi1kZXZfdCB0dHlfZGV2bnVtKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0JcmV0dXJuIE1LREVWKHR0eS0+ZHJpdmVyLT5tYWpvciwgdHR5LT5kcml2ZXItPm1pbm9yX3N0YXJ0KSArIHR0eS0+aW5kZXg7Ci19Ci1FWFBPUlRfU1lNQk9MKHR0eV9kZXZudW0pOwotCi12b2lkIHR0eV9kZWZhdWx0X2ZvcHMoc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKLXsKLQkqZm9wcyA9IHR0eV9mb3BzOwotfQotCi1zdGF0aWMgY2hhciAqdHR5X2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2LCB1bW9kZV90ICptb2RlKQotewotCWlmICghbW9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRldi0+ZGV2dCA9PSBNS0RFVihUVFlBVVhfTUFKT1IsIDApIHx8Ci0JICAgIGRldi0+ZGV2dCA9PSBNS0RFVihUVFlBVVhfTUFKT1IsIDIpKQotCQkqbW9kZSA9IDA2NjY7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHR0eV9jbGFzc19pbml0KHZvaWQpCi17Ci0JdHR5X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidHR5Iik7Ci0JaWYgKElTX0VSUih0dHlfY2xhc3MpKQotCQlyZXR1cm4gUFRSX0VSUih0dHlfY2xhc3MpOwotCXR0eV9jbGFzcy0+ZGV2bm9kZSA9IHR0eV9kZXZub2RlOwotCXJldHVybiAwOwotfQotCi1wb3N0Y29yZV9pbml0Y2FsbCh0dHlfY2xhc3NfaW5pdCk7Ci0KLS8qIDMvMjAwNCBqbWM6IHdoeSBkbyB0aGVzZSBkZXZpY2VzIGV4aXN0PyAqLwotc3RhdGljIHN0cnVjdCBjZGV2IHR0eV9jZGV2LCBjb25zb2xlX2NkZXY7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY29uc19hY3RpdmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNvbnNvbGUgKmNzWzE2XTsKLQlpbnQgaSA9IDA7Ci0Jc3RydWN0IGNvbnNvbGUgKmM7Ci0Jc3NpemVfdCBjb3VudCA9IDA7Ci0KLQljb25zb2xlX2xvY2soKTsKLQlmb3JfZWFjaF9jb25zb2xlKGMpIHsKLQkJaWYgKCFjLT5kZXZpY2UpCi0JCQljb250aW51ZTsKLQkJaWYgKCFjLT53cml0ZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKGMtPmZsYWdzICYgQ09OX0VOQUJMRUQpID09IDApCi0JCQljb250aW51ZTsKLQkJY3NbaSsrXSA9IGM7Ci0JCWlmIChpID49IEFSUkFZX1NJWkUoY3MpKQotCQkJYnJlYWs7Ci0JfQotCXdoaWxlIChpLS0pIHsKLQkJaW50IGluZGV4ID0gY3NbaV0tPmluZGV4OwotCQlzdHJ1Y3QgdHR5X2RyaXZlciAqZHJ2ID0gY3NbaV0tPmRldmljZShjc1tpXSwgJmluZGV4KTsKLQotCQkvKiBkb24ndCByZXNvbHZlIHR0eTAgYXMgc29tZSBwcm9ncmFtcyBkZXBlbmQgb24gaXQgKi8KLQkJaWYgKGRydiAmJiAoY3NbaV0tPmluZGV4ID4gMCB8fCBkcnYtPm1ham9yICE9IFRUWV9NQUpPUikpCi0JCQljb3VudCArPSB0dHlfbGluZV9uYW1lKGRydiwgaW5kZXgsIGJ1ZiArIGNvdW50KTsKLQkJZWxzZQotCQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVzJWQiLAotCQkJCQkgY3NbaV0tPm5hbWUsIGNzW2ldLT5pbmRleCk7Ci0KLQkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVjIiwgaSA/ICcgJzonXG4nKTsKLQl9Ci0JY29uc29sZV91bmxvY2soKTsKLQotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihhY3RpdmUsIFNfSVJVR08sIHNob3dfY29uc19hY3RpdmUsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY29uc19kZXZfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfYWN0aXZlLmF0dHIsCi0JTlVMTAotfTsKLQotQVRUUklCVVRFX0dST1VQUyhjb25zX2Rldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpjb25zZGV2OwotCi12b2lkIGNvbnNvbGVfc3lzZnNfbm90aWZ5KHZvaWQpCi17Ci0JaWYgKGNvbnNkZXYpCi0JCXN5c2ZzX25vdGlmeSgmY29uc2Rldi0+a29iaiwgTlVMTCwgImFjdGl2ZSIpOwotfQotCi0vKgotICogT2ssIG5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgdHR5IGRldmljZXMgYW5kIGNhbiBjb3VudAotICogb24gbWVtb3J5IGFsbG9jYXRpb25zLCBpbnRlcnJ1cHRzIGV0Yy4uCi0gKi8KLWludCBfX2luaXQgdHR5X2luaXQodm9pZCkKLXsKLQl0dHlfc3lzY3RsX2luaXQoKTsKLQljZGV2X2luaXQoJnR0eV9jZGV2LCAmdHR5X2ZvcHMpOwotCWlmIChjZGV2X2FkZCgmdHR5X2NkZXYsIE1LREVWKFRUWUFVWF9NQUpPUiwgMCksIDEpIHx8Ci0JICAgIHJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgMSwgIi9kZXYvdHR5IikgPCAwKQotCQlwYW5pYygiQ291bGRuJ3QgcmVnaXN0ZXIgL2Rldi90dHkgZHJpdmVyXG4iKTsKLQlkZXZpY2VfY3JlYXRlKHR0eV9jbGFzcywgTlVMTCwgTUtERVYoVFRZQVVYX01BSk9SLCAwKSwgTlVMTCwgInR0eSIpOwotCi0JY2Rldl9pbml0KCZjb25zb2xlX2NkZXYsICZjb25zb2xlX2ZvcHMpOwotCWlmIChjZGV2X2FkZCgmY29uc29sZV9jZGV2LCBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCAxKSB8fAotCSAgICByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKFRUWUFVWF9NQUpPUiwgMSksIDEsICIvZGV2L2NvbnNvbGUiKSA8IDApCi0JCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciAvZGV2L2NvbnNvbGUgZHJpdmVyXG4iKTsKLQljb25zZGV2ID0gZGV2aWNlX2NyZWF0ZV93aXRoX2dyb3Vwcyh0dHlfY2xhc3MsIE5VTEwsCi0JCQkJCSAgICBNS0RFVihUVFlBVVhfTUFKT1IsIDEpLCBOVUxMLAotCQkJCQkgICAgY29uc19kZXZfZ3JvdXBzLCAiY29uc29sZSIpOwotCWlmIChJU19FUlIoY29uc2RldikpCi0JCWNvbnNkZXYgPSBOVUxMOwotCi0jaWZkZWYgQ09ORklHX1ZUCi0JdnR5X2luaXQoJmNvbnNvbGVfZm9wcyk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9pbmNsdWRlL25ldC9TSS9uZXRpb2NfcHJvYy5oIGIvdXBzdHJlYW0vbGludXgtNS4xMC9pbmNsdWRlL25ldC9TSS9uZXRpb2NfcHJvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMGM4YWE0Li4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9uZXQvU0kvbmV0aW9jX3Byb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0quabE3L3pydyjumxpbnV41tDN+MLnZmFzdG5hdKGiZmFzdGJyz+C52LLZ1/e907/aCi0quLrU8MjLo7oKLSqxuLfdyMujugotKtDeuMTI1aO6Ci0q0N64xMTayN2jugotKrDmsb66xaO6Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9ORVRJT19QUk9DX0hfCi0jZGVmaW5lIF9ORVRJT19QUk9DX0hfCi0KLQotI2luY2x1ZGUgPG5ldC9TSS9uZXRfdHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvU0kvZXh0X21lbS5oPgotCi0KLSNkZWZpbmUgIFBDX01BWF9OVU0gICAxMDAKLSNkZWZpbmUgIERFVl9OQU1FX0xFTiA1MAotCi0jZGVmaW5lICBERVZfTkFNRV9MRU5fMjAgMjAKLQotI2RlZmluZSBFVEhfQUxFTiAgICAgICAgICAgIDYKLQotI2RlZmluZSBTTEFCX05VTSAgMjEKLQotI2RlZmluZSBIQVNIX0FSUkFZX0NPVU5UIDUxMgotLy9TS0LNs7zG1rWjrLD8wKjS7LOjteO1xM2zvMbWtQotZW51bSBza2JpbmZvX3R5cGV7Ci0gICAgU0tCX1RZUEVfQUxMID0gMCwgICAgIC8vc2tiveG5uczl1f3U2rmk1/e1xLj2yv0KLSAgICBTS0JfVFlQRV9EQVRBLCAgICAgICAgLy9TS0LW0LXEc2xhYrv61sa1xGRhdGHV/dTauaTX97XEuPbK/aOssPy6rFNLQl9UWVBFX1RPQ1CjrLWrsruw/LqsU0tCX1RZUEVfRlJPTUNQCi0gICAgU0tCX1RZUEVfVE9DUCwgICAgICAgIC8vt6LN+UNQtcRza2LV/dTauaTX97XEuPbK/QotICAgIFNLQl9UWVBFX0ZST01DUCwgICAgICAvL7TTQ1C908rVtb21xFBTQlVG1f3U2rmk1/e1xLj2yv0KLSAgICBTS0JfREFUQV9CWVRFUywgICAgICAgIC8vtbHHsMnqx+u1xGRhdGHX3NfWvdrK/SAgo6xrc2l6Zbe9yr3A27zTtcQKLQotICAgIC8v0NTE3M/gudi1xMirvtbQxc+io6zE2rrLvfbA27zTt6LJ+rXEtM7K/aOssru4utTwt9bO9gotICAgIFNLQl9RVUVVRV9TVE9QLCAgICAgIC8veG1pdF9zdG9w1OyzybXEtqqw/Lj2yv2jrMDbvNPWtQotICAgIFNLQl9RVUVVRV9MT0NLLCAgICAgIC8vUVVFVUVfTE9DS9Tss8m1xLaqsPy49sr9o6zA27zT1rUKLSAgICBTS0JfQ09QWV9DQUNIRSwgICAgICAvL25ldF9jYWNoZdS0zsS8/tbQvfjQ0Mirv72xtLXEwNu809a1o6zEv8ewvfbU2lBQULrNt9bGrMqxv72xtKOs07DP7NDUxNwKLSAgICBTS0JfSVJRX0ZSRUUsICAgICAgICAgICAvL82ouf3I7dbQts/KzbfFtcRza2KjrNDUxNzP4LnYCi0gICAgU0tCX0NPUFksICAgICAgICAgICAgICAgICAgIC8vyv2+3b+9sbS1xHNrYqOs0NTE3M/gudgKLSAgICBTS0JfRkxPT0QsICAgICAgICAgICAgICAgICAvL7e6uum1xHNrYqOs0NTE3M/gudgKLSAgICBTS0JfRVJSRlJFRSwgICAgICAgICAgICAgLy9kZXbUtM7EvP7W0LTtzvPKzbfFtcRza2K8xsr9o6yw/MCoU0tCX1FVRVVFX1NUT1C6zVNLQl9RVUVVRV9MT0NLwb249rzGyv3WtQotICAgIFNLQl9GUkFHLCAgICAgICAgICAgICAgICAgICAvL73TytW1vbXEt9bGrLGozsSjrNDUxNzP4LnYCi0gICAgU0tCX09WRVJfTVRVLCAgICAgICAgICAgLy9mYXN01tDK/b7ds6S2yLTz09qz9r/aZGV2IE1UVcqxo6xmYXN0yqew3Lj2yv3Ns7zGCi0gICAgU0tCX0xPT1AsICAgICAgICAgICAgICAgICAgIC8vzba13bj4x/22r6Os09a008f9tq/K1bW9tcTS7LOju9i7t7j2yv3Ns7zGo6y089PaMLHtyr7H/bav0uyzowotICAgIFNLQl9BTExPQ19GSUFMLCAgICAgICAgIC8vyerH63NrYsqnsNy1xLj2yv3A27zT1rUKLSAgICBTS0JfSU5GT19NQVgsCi19OwotCi0vL834wufE2rrL1MvQ0MqxtcTNs7zG1rWjrNbYteO52NeiveG5uczltcTJ6sfrteMKLWVudW0gbmV0X3J1bl9pbmZvewotICAgIEJSX01BQ19DSEFOR0UgPSAwLCAgICAgICAgLy/N+MfFbWFjtdjWt7G7uMSx5LTOyv0KLSAgICBORUlHSF9BTExPQywgICAgICAgICAgICAgICAgICAgIC8vbmVpZ2hib3VyyerH67TOyv0KLSAgICBORUlHSF9GUkVFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vbmVpZ2hib3Vyys23xbXjwNu809a1Ci0gICAgQlJfTkVJR0hfVkFSWSwgICAgICAgICAgICAgICAvL8fFteO1xLP2v9pkZXa1xE1BQ7XY1rexu7bguPZQQ7myz+0KLSAgICBDT05OX0FMTE9DLCAgICAgICAgICAgICAgICAgICAgICAvL0NPTk7J6sfrtM7K/cDbvNPWtQotICAgIENPTk5fRlJFRSwgICAgICAgICAgICAgICAgICAgICAgICAgLy9DT05Oys23xbXjwNu809a1Ci0gICAgQlJGREJfQUxMT0MsICAgICAgICAgICAgICAgICAgICAvL8fFtePJ6sfrtM7K/cDbvNPWtQotICAgIERTVF9BTExPQywgICAgICAgICAgICAgICAgICAgICAgICAgLy9kc3RfZW50cnnJ6sfrwNu809a1Ci0gICAgRFNUX0ZSRUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZHN0X2VudHJ5ys23xbXjwNu809a1Ci0gICAgSEhfVVBEQVRFLCAgICAgICAgICAgICAgICAgICAgICAgICAvL0hItv6y401BQ823uPzQwsDbvNPWtQotICAgIFJUX0NBQ0hFX0lOVkFMSUQsICAgICAgICAgICAgICAgLy/H5b/VwrfTyWNhY2hltcTA27zT1rUKLSAgICBSVF9IQVNIX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAvL9DC1PZydF9oYXNoX3RhYmxlvdq147XEwNu809a1Ci0gICAgUlRfSEFTSF9ERUwsICAgICAgICAgICAgICAgICAgICAgICAgLy/JvrP9cnRfaGFzaF90YWJsZb3ateO1xMDbvNPWtQotICAgIFNTTUFDX0NIQU5HRV9JTkRFViwgICAgICAgICAgICAgICAgLy/NrNK71LRNQUO12Na3yOu/2mRldrjEseS1xLTOyv0KLSAgICBORVRfSU5GT19NQVgsCi19OwotZW51bSBkZXZfb3B0X3N0YXRlewotICAgIERFVl9VTk9QVD0wLCAgICAvL8j008O7p8601/bIzrrOstnX96Oss/XKvNa1zqowCi0gICAgREVWX05PUFJFU0VOVCwgIC8vttTTpiFuZXRpZl9kZXZpY2VfcHJlc2VudNLss6OjrLHtw/fH/bavtdey48nQzrTXvLG4usMKLSAgICBERVZfT1BFTkVELCAgICAgLy9kZXYgaXMgb3BlbmVkCi0gICAgREVWX09QRU5fRkFJTCwgICAgICAvL29wZW4gIGZhaWwKLSAgICBERVZfQ0xPU0VELCAgICAgICAgICAvL2RldiBpcyBjbG9zZWQgCi19OwotCi1lbnVtIHNsYWJpbmZvX2ZpbGV7Ci0gICAgRkFTVF9TTEFCID0gMCwKLSAgICBTS0JfU0xBQiwKLSAgICBCUkZEQl9TTEFCLAotICAgIERTVF9TTEFCLAotICAgIEZJQl9UUklFX1NMQUIsCi0gICAgRkxPV19TTEFCLAotICAgIElORVRQRUVSX1NMQUIsCi0gICAgSU5FVF9IQVNIVEFCTEVTX1NMQUIsCi0gICAgSU5FVF9USU1FV0FJVF9TT0NLX1NMQUIsCi0gICAgTVlTT0NLRVRfU0xBQiwKLSAgICBORl9DT05OVFJBQ0tfQ09SRV9TTEFCLAotICAgIE5GX0NPTk5UUkFDS19FWENFUFRfU0xBQiwKLSAgICBSRVFVRVNUX1NPQ0tfU0xBQiwKLSAgICBTT0NLX1NMQUIsCi0gICAgU09DS0VUX1NMQUIsCi0gICAgWEZSTTZfVFVOTkVMX1NMQUIsCi0gICAgWFRfSEFTSExJTUlUX1NMQUIsCi0gICAgU09DS19BTExPQ19QQUdFUywgICAgICAgICAgIC8v08nT2s7et6jXvMi31dK1vcrNt8W146Osy/nS1L3209ArK7av1/ejrC0t06a4w9PJcHV0X3BhZ2W0pbeiCi0gICAgSVA2X09VVFBVVF9BTExPQ19QQUdFUywgICAgIC8v08nT2s7et6jXvMi31dK1vcrNt8W146Osy/nS1L3209ArK7av1/ejrC0t06a4w9PJcHV0X3BhZ2W0pbeiCi0gICAgSVBfT1VUUFVUX0FMTE9DX1BBR0VTLCAgICAgIC8v08nT2s7et6jXvMi31dK1vcrNt8W146Osy/nS1L3209ArK7av1/ejrC0t06a4w9PJcHV0X3BhZ2W0pbeiCi0gICAgU0tCX0FMTE9DX1BBR0VTLCAgICAgICAgICAgIC8v08nT2s7et6jXvMi31dK1vcrNt8W146Osy/nS1L3209ArK7av1/ejrC0t06a4w9PJcHV0X3BhZ2W0pbeiCi19OwotCi0KLS8qsb612FRDUM2zvMbQxc+iKi8KLWVudW0gdGNwX3N0YXRfaW5mbwotewotICAgIFRDUF9SRUNWX1BLVFMgPSAwLCAgICAgICAvKr3TytW1xFRDUMr9xL8qLwotICAgIFRDUF9TRU5EX1BLVFMsICAgICAgICAgICAvKreiy821xFRDUMr9xL8qLwotICAgIFRDUF9SRVRSQU5TX1BLVFMsICAgICAgICAvKreiy821xNbYtKtUQ1DK/cS/Ki8KLSAgICBUQ1BfUkVDVl9EUk9QUywgICAgICAgICAgLyq908rVtsu1xFRDULaqsPzK/SovCi0gICAgVENQX1NFTkRfRFJPUFMsICAgICAgICAgIC8qt6LLzbbLtcRUQ1C2qrD8yv0qLwotICAgIFRDUF9SU1RfU0VORF9OVU0sICAgICAgICAvKreiy821xFJTVMr9Ki8KLSAgICBUQ1BfUlNUX1JFQ1ZfTlVNLCAgICAgICAgLyq908rVtcRSU1TK/SovCi0gICAgVENQX1NUQVRTX01BWCwKLX07Ci0KLQotc3RydWN0IHRjcF9zb2NrX3N0YXQKLXsKLSAgICB1bnNpZ25lZCBsb25nIHRjcF9yZWN2X251bTsKLSAgICB1bnNpZ25lZCBsb25nIHRjcF9zZW5kX251bTsKLSAgICB1bnNpZ25lZCBsb25nIHRjcF9yZXRyYW5zX251bTsKLSAgICB1bnNpZ25lZCBsb25nIHRjcF9yZWN2X2Ryb3BzOwotICAgIHVuc2lnbmVkIGxvbmcgdGNwX3NlbmRfZHJvcHM7Ci0gICAgdW5zaWduZWQgbG9uZyB0Y3BfcnN0X3NlbmQ7Ci0gICAgdW5zaWduZWQgbG9uZyB0Y3BfcnN0X3JlY3Y7Ci19OwotCi0vKioqKtfK1LTKudPDvLDJz8/e0MXPoqOsy/nT0LHq17zE2rrL09DJz8/ex+m/9rXEo6y91NDovOyy4qOs0tS3wNa50uyzo7eiyfoqKioqLwotc3RydWN0IG5ldF9tYXhfY2hlY2tfbXNnCi17Ci0gICAgLypuZl9jb25udHJhY2sqLwotICAgIHVuc2lnbmVkIGxvbmcgbmZfY29ubnRyYWNrX21heDsgIC8vbmZfY29ubnRyYWNrX21heCA9IDQ4MzIKLSAgICB1bnNpZ25lZCBsb25nIG5mX2Nvbm50cmFja19ub3c7ICAvL25ldC0+Y3QuY291bnQKLSAgICAvKmVucXVldWUqLwotICAgIGludCAgICAgICAgICAgICBuZXRkZXZfbWF4X2JhY2tsb2c7ICAgIC8vbmV0ZGV2X21heF9iYWNrbG9nPTEwMDAKLSAgICBpbnQgICAgICAgICAgaW5wdXRfcXVldWVfbGVuOyAgICAgICAgICAvL7LOv7RlbnF1ZXVlX3RvX2JhY2tsb2e907/ayrXP1gotICAgIGludCAgICAgICAgICByeF9kcm9wcGVkOyAgICAgICAgICAgICAgICAgLy/S8s6qyOu208HQ0tHC+tTss8m1xMjrttPB0LaqsPy1xMDbvNPWtQotICAgIC8q0NTE3M/gudgqLwotICAgIGludCAgICAgICAgICBmYXN0bmF0X2xpbmtfbWF4OyAgICAgICAgICAgICAgICAvL25mX2Nvbm50cmFja19tYXgKLSAgICBpbnQgICAgICAgICAgZmFzdG5hdF9saW5rX25vdzsgICAgICAgICAgICAgICAgLy93b3JraW5nX2xpc3QuY291bnQKLSAgICBpbnQgICAgICAgICAgZmFzdDZfbGlua19tYXg7ICAgICAgICAgICAgICAgICAgLy9uZl9jb25udHJhY2tfbWF4Ci0gICAgaW50ICAgICAgICAgIGZhc3Q2X2xpbmtfbm93OyAgICAgICAgICAgICAgICAgIC8vd29ya2luZ19saXN0Ni5jb3VudAotICAgIAotICAgIC8qzfjC58TausvUy9DQyrG1xM2zvMbWtaOs1ti147nY16K94bm5zOW1xMnqx+u14yovCi0gICAgdW5zaWduZWQgbG9uZyBicl9tYWNfY2hhbmdlOyAgICAgICAgICAvL834x8VtYWO12Na3sbu4xLHktM7K/QotICAgIHVuc2lnbmVkIGxvbmcgbmVpZ2hfYWxsb2M7ICAgICAgICAgICAgICAgICAgIC8vbmVpZ2hib3VyyerH67TOyv0KLSAgICB1bnNpZ25lZCBsb25nIG5laWdoX2ZyZWU7ICAgICAgICAgICAgICAgICAgICAgIC8vbmVpZ2hib3Vyys23xbXjwNu809a1Ci0gICAgdW5zaWduZWQgbG9uZyBicl9uZWlnaF92YXJ5OyAgICAgICAgICAgICAgICAvL8fFteO1xLP2v9pkZXa1xG1hY7XY1rexu7bguPZwY7myz+0KLSAgICB1bnNpZ25lZCBsb25nIGNvbm5fYWxsb2M7ICAgICAgICAgICAgICAgICAgICAvL2Nvbm7J6sfrtM7K/cDbvNPWtQotICAgIHVuc2lnbmVkIGxvbmcgY29ubl9mcmVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25uys23xbXjwNu809a1Ci0gICAgdW5zaWduZWQgbG9uZyBicmZkYl9hbGxvYzsgICAgICAgICAgICAgICAgICAgIC8vx8W148nqx+u0zsr9wNu809a1Ci0gICAgdW5zaWduZWQgbG9uZyBkc3RfYWxsb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RzdF9lbnRyecnqx+vA27zT1rUKLSAgICB1bnNpZ25lZCBsb25nIGRzdF9mcmVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RzdF9lbnRyecrNt8W148DbvNPWtQotICAgIHVuc2lnbmVkIGxvbmcgaGhfdXBkYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oaLb+suNtYWPNt7j80MLA27zT1rUKLSAgICB1bnNpZ25lZCBsb25nIHJ0X2NhY2hlX2ludmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/H5b/VwrfTyWNhY2hltcTA27zT1rUKLSAgICB1bnNpZ25lZCBsb25nIHJ0X2hhc2hfYWRkOyAgICAgICAgICAgICAgICAgICAgICAgIC8v0MLU9nJ0X2hhc2hfdGFibGW92rXjtcTA27zT1rUKLSAgICB1bnNpZ25lZCBsb25nIHJ0X2hhc2hfZGVsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vyb6z/XJ0X2hhc2hfdGFibGW92rXjtcTA27zT1rUKLSAgICB1bnNpZ25lZCBsb25nIHNzbWFjX2NoYW5nZV9pbmRldjsgICAgICAgICAgIC8vzazSu9S0TUFDtdjWt8jrv9pkZXa4xLHktcS0zsr9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAgU0tCz+C52NDFz6KjrLD8wKjNs7zG0MXPorrNZmFzdNDFz6IgKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3Qgc2tiX2FuZF9mYXN0X21zZwotewotICAgIGludCAgc2tiX251bTQ7ICAgICAgICAgICAgICAvL73TytW1vbXEVjTK/b7dsPwKLSAgICBpbnQgIHNrYl9udW02OyAgICAgICAgICAgICAgLy+908rVtb21xFY2yv2+3bD8Ci0gICAgaW50ICBza2JfYmlnX251bTsgICAgICAgICAgIC8vbGVus6S2yLOsuf0xMDAwtcTK/b7dsPyjrLqsVjS6zVY2Ci0gICAgaW50ICBza2Jfc21hbGxfbnVtOyAgICAgICAgIC8vbGVus6S2yNCh09oxMDC1xMr9vt2w/KOsuqxWNLrNVjYKLSAgICBpbnQgIHNrYl9ieXRlczQ7ICAgICAgICAgICAgLy+908rVtb21xFY0yv2+3bD819a92sr9Ci0gICAgaW50ICBza2JfYnl0ZXM2OyAgICAgICAgICAgIC8vvdPK1bW9tcRWNsr9vt2w/NfWvdrK/QotICAgIGludCAgc2tiX3Vua25vd247ICAgICAgICAgICAvL73TytW1vbXEzrTWqtCt0unK/b7dsPyjrLD8wKhBUlC1yLfHVjS6zVY2tcSxqM7ECi0gICAgaW50ICBza2JfdGNwbnVtOyAgICAgICAgICAgIC8vvdPK1bW9tcR0Y3DK/b7dsPyjrLqsVjS6zVY2o6y1q7K7uqxmYXN0YnK1xLGozsQKLSAgICBpbnQgIHNrYl91ZHBudW07ICAgICAgICAgICAgLy+908rVtb21xHVkcMr9vt2w/KOsuqxWNLrNVjajrLWrsru6rGZhc3RicrXEsajOxAotICAgIGludCAgYnJvYWRjYXN0X251bTQ7ICAgICAgICAvL73TytW1vbXEVjS547KlsPwKLSAgICBpbnQgIGJyb2FkY2FzdF9udW02OyAgICAgICAgLy+908rVtb21xFY2ueOypbD8Ci0gICAgaW50ICBtdWx0aWNhc3RfbnVtNDsgICAgICAgIC8vvdPK1bW9tcRWNNfpsqWxqAotICAgIGludCAgbXVsdGljYXN0X251bTY7ICAgICAgICAvL73TytW1vbXEVjbX6bKlsagKLSAgICBpbnQgIGZhc3RuYXRfbnVtOyAgICAgICAgICAgLy9mYXN0bmF0s8m5prXEsajOxAotICAgIGludCAgZmFzdDZfbnVtOyAgICAgICAgICAgICAvL2Zhc3Q2s8m5prXEsajOxAotICAgIGludCAgZmFzdGJyX251bTsgICAgICAgICAgICAvL2Zhc3RicrPJuaa1xLGozsQKLSAgICBpbnQgIGZhc3RuYXRfbGV2ZWw7ICAgICAgICAgLy+yzr+0RkFTVF9ORVRfREVWSUNFCi0gICAgaW50ICBmYXN0YnJfbGV2ZWw7ICAgICAgICAgIC8vsry2+8Dg0M0KLSAgICAvL8/Cw+a8uLj21rXOqsDbvNPWtaOs0NTE3M/gudgKLSAgICBpbnQgIGlycWZyZWVfbnVtOyAgICAgICAgICAgLy/NqLn9yO3W0LbPys23xbXEc2tio6zQ1MTcz+C52AotICAgIGludCAgc2tiY29weV9udW07ICAgICAgICAgICAvL8r9vt2/vbG0tcRza2KjrNDUxNzP4LnYCi0gICAgaW50ICBjYWNoZV9jb3B5OyAgICAgICAgICAgICAvL25ldF9jYWNoZdS0zsS8/r340NC/vbG0tcTA27v9vMbK/aOs0NTE3M/gudgKLSAgICBpbnQgIHNrYmZsb29kX251bTsgICAgICAgICAgLy+3urrptcRza2KjrNDUxNzP4LnYCi0gICAgaW50ICBlcnJmcmVlX251bTsgICAgICAgICAgLy9kZXbUtM7EvP7W0LTtzvPKzbfFtcRza2K8xsr9o6yw/MCoU0tCX1FVRVVFX1NUT1C6zVNLQl9RVUVVRV9MT0NLwb249rzGyv3WtQotICAgIGludCAgZnJhZ19udW07ICAgICAgICAgICAgICAvL73TytW1vbXEt9bGrLGozsSjrNDUxNzP4LnYCi0gICAgaW50ICBtdHVfbnVtOyAgICAgICAgICAgICAgIC8vZmFzdNbQyv2+3bOktsi089Pas/a/2mRldiBNVFXKsaOsZmFzdMqnsNy49sr9zbO8xgotICAgIGludCAgZmFzdF9sb29wOyAgICAgICAgICAgICAvL822td24+Mf9tq+jrNPWtNPH/bavytW1vbXE0uyzo7vYu7e49sr9zbO8xgotICAgIGludCAgc2tiX2FsbG9jX2ZhaWwgOyAgICAgICAgLy/J6sfrc2tiyqew3LXEuPbK/cDbvNPWtQotICAgIGludCAgeG1pdF9sb2NrX251bTsgICAgICAgIC8veG1pdF9sb2NrX293bmVysbvL+Neh1OyzybXEtqqw/LXEwNu807zGyv2jrMf9tq/U7LPJtcQKLSAgICBpbnQgIHhtaXRfc3RvcF9udW07ICAgICAgLy8hbmV0aWZfeG1pdF9zdG9wcGVkKHR4cSnU7LPJtcS2qrD8tcTA27zTvMbK/aOsx/22r9Tss8m1xAotICAgIGludCAgYnJfbWFjX2NoYW5nZV9udW07ICAgICAgLy/N+MfFbWFjtdjWt7G7uMSx5LTOyv0KLSAgICBpbnQgIGZhc3RfdGNwZHVtcF9udW07ICAgICAgLy9mYXN016Ww/Lj2yv0KLSAgICBpbnQgIGZhc3Rfc3dpdGNoOwotICAgIGludCAgZmFzdF9sb2NhbDRfcmN2X251bTsgICAgICAgLy+xvrXYZmFzdF9sb2NhbDSzybmmvdPK1bGozsQKLSAgICBpbnQgIGZhc3RfbG9jYWw2X3Jjdl9udW07ICAgICAgIC8vsb612GZhc3RfbG9jYWw2s8m5pr3TytWxqM7ECi0gICAgaW50ICBmYXN0X2xvY2FsNF9vdXRwdXRfbnVtOyAgICAvL7G+tdhmYXN0X2xvY2FsNLPJuaa3osvNsajOxAotICAgIGludCAgZmFzdF9sb2NhbDZfb3V0cHV0X251bTsgICAgLy+xvrXYZmFzdF9sb2NhbDazybmmt6LLzbGozsQKLX07Ci0KLXN0cnVjdCBza2JfdXNpbmdfbXNnCi17Ci0gICAgdW5zaWduZWQgbG9uZyBza2JfYWxsOwotICAgIHVuc2lnbmVkIGxvbmcgc2tiX3RvY3A7Ci0gICAgdW5zaWduZWQgbG9uZyBza2JfZnJvbWNwOwotICAgIHVuc2lnbmVkIGxvbmcgc2tiX2RhdGFfbnVtOwotICAgIHVuc2lnbmVkIGxvbmcgc2tiX2RhdGFfc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIHNrYl9zdG9wOwotICAgIHVuc2lnbmVkIGxvbmcgc2tiX2xvY2s7Ci0gICAgdW5zaWduZWQgbG9uZyBza2JfcGFuaWM7Ci0gICAgdW5zaWduZWQgbG9uZyBza2JfZmFpbDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqICC94bm5zOW2qNLlICAgIERFViAgKioqKioqKioqKioqKioqKioqKioqKiovCi0vL834wufM7bzTo6zNs7zGzfjC57Ljw+bK1beisPzH6b/2Ci1zdHJ1Y3QgbmV0X2Rldl9za2JpbmZvIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIHJ4X3BhY2tldHM7ICAvL8f9tq+3osvNwLS1xMr9vt2w/Lj2yv2jrNTabmV0aWZfcnjNt8DbvNMKLSAgICB1bnNpZ25lZCBsb25nICAgIHR4X3BhY2tldHM7ICAvL7eiy824+Mf9tq+1xMr9vt2w/Lj2yv2jrNTaZGV2X3F1ZXVlX3htaXTNt8DbvNMKLSAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2J5dGVzOyAgICAvL9fWvdrK/QotICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfYnl0ZXM7ICAgIC8v19a92sr9Ci0gICAgdW5zaWduZWQgbG9uZyAgICByeF9kcm9wcGVkOyAgLy9uZXRpZl9yeMTasr/B97PM1tDL+dPQ0uyzo8rNt8Vza2K1xMDbvNOjrMjntO+1vW5ldGRldl9tYXhfYmFja2xvZ8jrttPB0MnPz962+LaqsPwKLSAgICB1bnNpZ25lZCBsb25nICAgIHR4X2Ryb3BwZWQ7ICAvL2Rldl9xdWV1ZV94bWl0xNqyv8H3s8zW0Mv509DS7LOjys23xXNrYrXEwNu806OsyOcodHhxLT54bWl0X2xvY2tfb3duZXIgPT0gY3B1KdTss8m1xLaqsPwKLX07Ci0KLS8vzfjC58ztvNOjrGNvbm7K1beisPzH6b/2Ci1zdHJ1Y3QgY29ubl9za2JpbmZvIHsKLSAgICB1bnNpZ25lZCBsb25nICAgIHBhY2tldHM7ICAvL8r9vt2w/Lj2yv0KLSAgICB1bnNpZ25lZCBsb25nICAgIGJ5dGVzOyAgICAvL9fWvdrK/QotfTsKLQotLyoguMO94bm5zOXW0LXEy/nT0NDFz6K91NPJx/22r7iz1rWjrM34wufX6bK7u+G4s9a1ICovCi0vL9XiuPa94bm5zOWx2NDrus0gPGxpbnV4L25ldGRldmljZS5oPtbQtcRuZXRfZGV2aWNlX3N0YXRzsaOz1tK71sIgICAKLXN0cnVjdCBuZXRfZGV2X3N0YXRzIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfcGFja2V0czsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfcGFja2V0czsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfYnl0ZXM7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X2J5dGVzOwotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICByeF9lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfZXJyb3JzOyAgIC8v0Oi84L/YCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2Ryb3BwZWQ7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfZHJvcHBlZDsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICBtdWx0aWNhc3Q7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIGNvbGxpc2lvbnM7Ci0gICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHJ4X2xlbmd0aF9lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfb3Zlcl9lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfY3JjX2Vycm9yczsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICByeF9mcmFtZV9lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfZmlmb19lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfbWlzc2VkX2Vycm9yczsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF9hYm9ydGVkX2Vycm9yczsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF9jYXJyaWVyX2Vycm9yczsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF9maWZvX2Vycm9yczsgICAvL9DovOC/2AotICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgICB0eF9oZWFydGJlYXRfZXJyb3JzOyAgIC8v0Oi84L/YCi0gICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgIHR4X3dpbmRvd19lcnJvcnM7ICAgLy/Q6Lzgv9gKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgcnhfY29tcHJlc3NlZDsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICAgdHhfY29tcHJlc3NlZDsgICAgICAgICAKLX07Ci0KLXN0cnVjdCBpb2N0bF9kZXZfbmV0c3RhdHMKLXsKLSAgICBjaGFyIGRldl9uYW1lWzIwXTsKLSAgICBzdHJ1Y3QgbmV0X2Rldl9za2JpbmZvICBzdGF0c19kYmc7ICAvL834wufM7bzTtcSjrM2zvMbN+MLnsuPD5srVt6Kw/Mfpv/YKLSAgICBzdHJ1Y3QgbmV0X2Rldl9zdGF0cyAgc3RhdHM7ICAgICAvL8r9vt3K1beizbO8xta1o6y4w9a1yKuyv9PJx/22r7iz1rW1xKOszfjC57K7uLPWtQotICAgIHVuc2lnbmVkIGludCAgICAgICAgZmxhZ3M7ICAgICAgICAgICAvL0lGRl9VULXICi0gICAgdW5zaWduZWQgY2hhciAgICAgICBvcGVyc3RhdGU7ICAgIC8vxL/HsMO7ybbTwwotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgc3RhdGU7ICAgICAgICAgICAvL7XXsuPH/bav17TMrKOsX19MSU5LX1NUQVRFX05PQ0FSUklFUgotICAgIGludCAgICAgICAgICAgICAgICAgbmV0X2ZsYWc7ICAgICAgICAvL9PDu6dpZmNvbmZpZ7XEveG5+9e0zKyjrMjnREVWX09QRU5fRkFJTAotICAgIHVuc2lnbmVkIGxvbmcgICAgICAgcXVlX3N0YXRlOyAgICAgICAvL7bTwdDXtMyso6y21NOmIGRldi0+X3R4WzBdLnN0YXRlo6zI519fUVVFVUVfU1RBVEVfRFJWX1hPRkYKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgIG51bV90eF9xdWV1ZXM7ICAgLy9UWLbTwdDK/cG/o6y24Mr9x/22r8q508POqNK7ttPB0KOs1PLWtc6qMQotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiAgveG5uczltqjS5SAgICBPVEhFUiAgKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgcGNfaW5mbwoteyAgCi0gICAgdW5zaWduZWQgY2hhciBtYWNfYWRkcls2XTsKLSAgICBjaGFyIGRldl9uYW1lW0RFVl9OQU1FX0xFTl07Ci19OwotCi1zdHJ1Y3QgcGNfbm9kZQotewotICAgIHVuc2lnbmVkIGludCBudW07Ci0gICAgc3RydWN0IHBjX2luZm8gaW5mb1tQQ19NQVhfTlVNXTsKLX07Ci0KLXN0cnVjdCBsZWFrX2luZm8KLXsgIAotICAgIHZvaWQgKmFkZHI7Ci0gICAgaW50IHVzZXJfbnVtOyAgLy+1scewZGF0Ybvyc2tisbvKudPDtcS8xsr91rWjrLDpy+Zza2LW0LXEdXNlcnO6zWRhdGFyZWa2+LHku68KLSAgICBpbnQgdHJhY2tfbnVtOyAvL7zHwrzS0bzHwry1vcr91+m57LyjtcTPwrHqy/fS/QotICAgIGNoYXIgZnVuY190cmFja1sxMF1bMTAwXTsvL7qvyv272Mvduey8owotfTsKLQotc3RydWN0IHNsYWJfaW5mbwotewotICAgIGludCBudW1bU0xBQl9OVU1dWzJdOwotfTsKLQotIAotc3RydWN0IGhhc2hfaW5mbwotewotICAgIGludCBtYXhfaGFzaF9zaXplOwotICAgIGludCBjdXJyZW50X2hhc2hfbnVtOwotICAgIGludCBoYXNoW0hBU0hfQVJSQVlfQ09VTlRdWzJdOwotICAgIGludCBjdXJyZW50X2FycmF5X3NpemU7Ci19OwotCi1zdHJ1Y3QgcHR5cGVfaW5mbwotewotICAgIHVuc2lnbmVkIGxvbmcgcHR5cGVfYWxsWzVdOwotICAgIHVuc2lnbmVkIGxvbmcgcHR5cGVfYmFzZVsxNV07Ci19OwotCi1zdHJ1Y3QgcGt0X2xvc3Rfc3RhdHMKLXsKLSAgICB1bnNpZ25lZCBpbnQgc2VuZF9kcm9wczsKLSAgICB1bnNpZ25lZCBpbnQgc2VuZF9kcm9wX2J5dGVzOwotICAgIHVuc2lnbmVkIGludCByZWN2X2Ryb3BzOwotICAgIHVuc2lnbmVkIGludCByZWN2X2Ryb3BfYnl0ZXM7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsX3BhY2tldHM7Ci0gICAgdW5zaWduZWQgaW50IHRvdGFsX2J5dGVzOwotfTsKLQotc3RydWN0IHBrdF9sb3N0X2luZm8KLXsKLSAgICBzdHJ1Y3QgcGt0X2xvc3Rfc3RhdHMgc3RhdHNbMl07Ci19OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNoYXIgdXNiW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBwc1tERVZfTkFNRV9MRU5fMjBdOwotICAgIGNoYXIgd2lmaV93YW5bREVWX05BTUVfTEVOXzIwXTsKLSAgICBjaGFyIHdpZmlfbGFuW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBldGhfd2FuW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBldGhfbGFuW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBwc19leHQxW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBwc19leHQyW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBwc19leHQzW0RFVl9OQU1FX0xFTl8yMF07Ci0gICAgY2hhciBwc19leHQ0W0RFVl9OQU1FX0xFTl8yMF07Ci19IG5ldF9kYmdfZGV2X2luZm9fdDsKLQotc3RydWN0IHRpbWVfbGlzdHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkIHBhY2tldF9saXN0OwotfTsKLQotc3RydWN0IG5ldF9kZWJ1Z19wYWNrZXRfbGlzdHsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCB0aW1lOwotICAgIGludCBwaWQ7Ci0JaW50IHRnaWQ7Ci0JY2hhciBwbmFtZVtERVZfTkFNRV9MRU5dOwotICAgIGludCBjb3VudDsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiqx5MG/yfnD9yoqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKrHkwb/J+cP3KioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqseTBv8n5w/cqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgbGVha19zZXQ7ICAgICAgLy8gMbHtyr64+tfZc2tivLBkYXRhyerH68rNt8W146O7MrHtyr64+tfZdXNlcnOjrNLUvOyy4s6qus5za2LKvNbVsrvE3MrNt8WjrNTdyrG4w7mmxNzJ0LK7v8nTwwotZXh0ZXJuIGludCBsZWFrX2xpc3RfbWF4OyAvLyDI3dDtu7q05rXEtP3KzbfFtcRza2K8sGRhdGG1xLj2yv2jrL/JtffV+6O7Ci1leHRlcm4gaW50IHRyYWNrX21heDsgICAgIC8vuey8o7j619nK/dfptcTJz8/eo6y99rWxdXNlcisrLS3KsbLF0OjSqsCptPOjrLfx1PIyvLS/yaO7Ci1leHRlcm4gaW50IHN0YWNrX2xlbm1heDsgIC8v1bu6r8r9uey8o7XE19a3+7j2yv3Jz8/eo7sKLWV4dGVybiBpbnQgbGVha19mdWxsX3BhbmljOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgIG5vd190aW1lOyAvL7Wxx7DKsb/MteMKLWV4dGVybiBzcGlubG9ja190ICBsZWFrX2xvY2s7ICAgLy+3wNa51NpiaNbQsbu199PDo6zKudPDYmjL+AotCi0KLWV4dGVybiBzdHJ1Y3QgbGVha19saXN0IGRhdGFfbGVha1tUUkFDS19FTkRdOwotZXh0ZXJuIHN0cnVjdCBsZWFrX2xpc3QgZGF0YV9mcmVlW1RSQUNLX0VORF07Ly+31rHwttTTptX91NrKudPDtcTK/b7dus3S0b6tys23xbXEyv2+3cG0se0KLWV4dGVybiB2b2lkICpkYXRhX2hlYWRbVFJBQ0tfRU5EXTsvL8O/uPbE2rTmvOC/2MDg0M21xLP1yry7r8rXtdjWt6OsyLexo8G0se21xMr9vt3H+MGs0PijrNLUseNyYW1kdW1wyrHWsb3Ty9HL9wotZXh0ZXJuIGludCBpbml0X2ZpbmlzaCA7Ly/BtLHts/XKvLuvserWvgotCi0vKmR1bXAgc3Rr08O1vbXEz+C52LHkwb8qLwotZXh0ZXJuIHVuc2lnbmVkIGludCBza2JfZHVtcF9sZW47Ci1leHRlcm4gY2hhciBza2JfZHVtcF9zdHJbXTsKLQotLyq6y7zk1ti4tMrNt8W87LLiv6q52CovCi1leHRlcm4gaW50IHNldF9wc2J1ZmxlYWsgOyAgCi1leHRlcm4gaW50IHNldF9leHRza2JsZWFrIDsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2tiaW5mb19kYmdbU0tCX0lORk9fTUFYXTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIG5ldHJ1bmluZm9fZGJnW05FVF9JTkZPX01BWF07IAotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYnJfaXBjaGFuZ2VfZmxhZzsgLy9icjAgaXC027jEts/R1AotZXh0ZXJuIGludCBzZXRfdGNwZHVtcDsgLy+2qLXj16Ww/L+qudgKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaWdub3JlbWFjW0VUSF9BTEVOXTsKLQotLyq21LG+tdhUQ1C9+NDQz+C52M2zvMYqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGNwX3N0YXRzX2RiZ1tUQ1BfU1RBVFNfTUFYXTsKLQotZXh0ZXJuIGNoYXIgYnJfbmFtZVtdOwotZXh0ZXJuIGNoYXIgcHNfbmFtZVtdOwotZXh0ZXJuIGNoYXIgdXNiX25hbWVbXTsKLWV4dGVybiBjaGFyIHBwcF9uYW1lW107Ci0KLQotLy9zccztvNOjrNPD09rK/b7dsPy9qMSj0tS8sNDUxNzNs7zGz+C52KOsbmV0X2luZm9fbnVtyKu+1tbQ0NTE3M/gudi1xM2zvMbSstDozOXP1gotZXh0ZXJuICBpbnQgIHNrYl9udW00OyAgICAgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNMr9vt2w/AotZXh0ZXJuICBpbnQgIHNrYl9udW02OyAgICAgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNsr9vt2w/AotZXh0ZXJuICBpbnQgIHNrYl9iaWdfbnVtOyAgICAgICAgICAgICAgIC8vbGVus6S2yLOsuf0xMDAwtcTK/b7dsPyjrLqsVjS6zVY2Ci1leHRlcm4gIGludCAgc2tiX3NtYWxsX251bTsgICAgICAgICAgICAgLy9sZW6zpLbI0KHT2jEwMLXEyv2+3bD8o6y6rFY0us1WNgotZXh0ZXJuICBpbnQgIHNrYl9ieXRlczQ7ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNMr9vt2w/NfWvdrK/QotZXh0ZXJuICBpbnQgIHNrYl9ieXRlczY7ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNsr9vt2w/NfWvdrK/QotZXh0ZXJuICBpbnQgIHNrYl91bmtub3duOyAgICAgICAgICAgICAgIC8vvdPK1bW9tcTOtNaq0K3S6cr9vt2w/KOssPzAqEFSUAotZXh0ZXJuICBpbnQgIHNrYl90Y3BudW07ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcR0Y3DK/b7dsPyjrLqsVjS6zVY2Ci1leHRlcm4gIGludCAgc2tiX3VkcG51bTsgICAgICAgICAgICAgICAgLy+908rVtb21xHVkcMr9vt2w/KOsuqxWNLrNVjYKLWV4dGVybiAgaW50ICBicm9hZGNhc3RfbnVtNDsgICAgICAgICAgICAvL73TytW1vbXEVjS547KlsPwKLWV4dGVybiAgaW50ICBicm9hZGNhc3RfbnVtNjsgICAgICAgICAgICAvL73TytW1vbXEVja547KlsPwKLWV4dGVybiAgaW50ICBtdWx0aWNhc3RfbnVtNDsgICAgICAgICAgICAvL73TytW1vbXEVjTX6bKlsagKLWV4dGVybiAgaW50ICBtdWx0aWNhc3RfbnVtNjsgICAgICAgICAgICAvL73TytW1vbXEVjbX6bKlsagKLWV4dGVybiAgaW50ICBmYXN0bmF0X251bTsgICAgICAgICAgICAgICAvL2Zhc3RuYXSzybmmtcSxqM7ECi1leHRlcm4gIGludCAgZmFzdDZfbnVtOyAgICAgICAgICAgICAgICAgLy9mYXN0NrPJuaa1xLGozsQKLWV4dGVybiAgaW50ICBmYXN0YnJfbnVtOyAgICAgICAgICAgICAgICAvL2Zhc3RicrPJuaa1xLGozsQKLWV4dGVybiAgaW50ICBmYXN0X2xvY2FsNF9yY3ZfbnVtOyAgICAgICAvL7G+tdhmYXN0X2xvY2FsNLPJuaa908rVsajOxAotZXh0ZXJuICBpbnQgIGZhc3RfbG9jYWw2X3Jjdl9udW07ICAgICAgIC8vsb612GZhc3RfbG9jYWw2s8m5pr3TytWxqM7ECi1leHRlcm4gIGludCAgZmFzdF9sb2NhbDRfb3V0cHV0X251bTsgICAgLy+xvrXYZmFzdF9sb2NhbDSzybmmt6LLzbGozsQKLWV4dGVybiAgaW50ICBmYXN0X2xvY2FsNl9vdXRwdXRfbnVtOyAgICAvL7G+tdhmYXN0X2xvY2FsNrPJuaa3osvNsajOxAotZXh0ZXJuICBpbnQgIGZhc3RfdGNwZHVtcF9udW07ICAgICAgICAgIC8vZmFzdNelsPzK/cG/Ci0KLWV4dGVybiBpbnQgZG91YmxlX21hYzsgCi0KLWV4dGVybiBpbnQgbmV0X2RlYnVnX3Bpbmc7ICAgICAgICAgICAgICAgLy/X1NHQcGluZ7D8vMfCvLaqsPzKsdHTuabE3AotZXh0ZXJuIGludCBuZXRfZGVidWdfcGVyZjsgICAgICAgICAgICAgICAvL9fU0dB0Y3AvdWRwsPy8x8K8tqqw/Mqx0dO5psTco6zQ6NKqc2VydmVyts7E3LCy17DX1NHQ06bTwwotCi0vL3NsYWLE2rTmyrnTw8/gudjNs7zGo6zOtL+8wsfNqNPDc2xhYrXY1rez2KOsyOdrbWFsbG9jCi1leHRlcm4gc3RydWN0IHNsYWJfaW5mbyBzbGFiX2NvdW50OwotCi0vL7eiy824+ENQtKbA7bXEo6y0/crNt8W1xHNrYsG0se2jrNPD09psb2e4+tfZo6y3wNa5usu85MTatObQucKpo7sKLWV4dGVybiBzdHJ1Y3QgZXh0X2xpc3QgdG9DcF9saXN0bG9nW01BWF9FWFRfTUVNX0hBU0hdOwotCi0vL0NQt6LLzbj4QVC1xHBzYnVm0MXPosG0se2jrNPD09psb2e4+tfZo6y3wNa5usu85MTatObQucKpOwotZXh0ZXJuIHN0cnVjdCBleHRfbGlzdCBmcm9tQ3BfbGlzdFtNQVhfRVhUX01FTV9IQVNIXTsKLQotLyq9+NDQVENQzbO8xiovCi0jZGVmaW5lIFRDUF9QS1RfU1RBVFNfSU5DKF9tb2QpICAgIHRjcF9zdGF0c19kYmdbX21vZF0rKwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKirN4rK/vdO/2sn5w/cqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKirN4rK/vdO/2sn5w/cqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKirN4rK/vdO/2sn5w/cqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIHNrYmluZm9fYWRkKHVuc2lnbmVkIGNoYXIgKmFkZHIsdW5zaWduZWQgaW50IHNrYl90eXBlKTsKLWV4dGVybiB2b2lkIHNrYmluZm9fZGVsKHVuc2lnbmVkIGNoYXIgKmFkZHIsdW5zaWduZWQgaW50IHNrYl90eXBlKTsKLWV4dGVybiB2b2lkIG5ldHJ1bmluZm9fYWRkKHVuc2lnbmVkIGNoYXIgKmFkZHIsdW5zaWduZWQgaW50IGluZm9fdHlwZSk7Ci1leHRlcm4gdm9pZCBuZXRydW5pbmZvX2RlbCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBpbmZvX3R5cGUpOwotCi1leHRlcm4gaW50IGdldF9za2JjbnQodW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfZGV2X2luZm8odW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfc2tiX3VzaW5nKHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgbmV0d29ya19nZXRfcGNtYWModW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfa2VybmVscGFyYW0odW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfc2xhYl9pbmZvKHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgZ2V0X2hhc2hfaW5mbyh1bnNpZ25lZCBsb25nIGFyZyk7Ci0KLWV4dGVybiBpbnQgc2V0X2Zhc3RuYXRfbGV2ZWwodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgc2V0X2Zhc3Ricl9sZXZlbCh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfZmFzdF9kZWJ1Z19wYW5pYyh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfZmFzdF9kZXZfeG1pdCh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfYWNrZHJvcCh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfZHVtcGZsYWcodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgc2V0X3NrYl9kdW1wKHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgc2V0X3ByaW50X29wdCh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfc3FfdGNwZHVtcCh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfbGVhayh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfbWF4KHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgc2V0X3N0YWNrbGVubWF4KHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgc2V0X3RyYWNrbWF4KHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgc2V0X3RjcGR1bXBfb3B0KHVuc2lnbmVkIGxvbmcgYXJnKTsKLWV4dGVybiBpbnQgc2V0X2JyX25hbWUodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgc2V0X3BzX25hbWUodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQgc2V0X3VzYl9uYW1lKHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IHNldF9wcHBfbmFtZSh2b2lkICphcmcpOwotZXh0ZXJuIGludCBzZXRfYnJpcCh1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IHNldF9rZXJuZWxwYXJhbSh1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IHNldF9lcnJub19wcm9jbmFtZSh2b2lkICphcmcpOwotZXh0ZXJuIGludCBnZXRfbmVpZ2hfaXAodW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfc2tiX2Zhc3QodW5zaWduZWQgbG9uZyBhcmcpOwotZXh0ZXJuIGludCBnZXRfbWF4X21zZyh1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGdldF9wdHlwZSh1bnNpZ25lZCBsb25nIGFyZyk7Ci1leHRlcm4gaW50IGdldF9wcm9jZXNzX2luZm8odm9pZCAqYXJnKTsKLWV4dGVybiB2b2lkIG5ldHNsYWJfaW5jKGludCBpKTsKLWV4dGVybiB2b2lkIG5ldHNsYWJfZGVjKGludCBpKTsKLWV4dGVybiB2b2lkIHRyYWNrX25ldGxpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYix1MzIgZ3JvdXApOwotLy9leHRlcm4gdm9pZCByZWNvcmRfYXBwX2F0Y2l2ZV9uZXQoKTsKLQotaW50IGdldF9wa3RfbG9zdF9pbmZvKHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotaW50IGdldF90Y3Bfc3RhdF9pbmZvKHVuc2lnbmVkIGxvbmcgYXJnKTsKLQotI2VuZGlmIC8vZW5kIF9ORVRJT19GQVNUSU5GT19IXwotCi0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvdXBzdHJlYW0vbGludXgtNS4xMC9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA0YWI5MTcuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KLS8qCi0gKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAotICogYnV0IHJlcXVpcmVkIGJ5LCB0aGUgKGZ1dHVyZSkgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCi0gKiBleHRlbnNpb24uCi0gKgotICogMTYgRGVjIDIwMDM6IFlhc3V5dWtpIEtvemFrYWkgQFVTQUdJIDx5YXN1eXVraS5rb3pha2FpQHRvc2hpYmEuY28uanA+Ci0gKgktIGdlbmVyYWxpemUgTDMgcHJvdG9jb2wgZGVwZW5kZW50IHBhcnQuCi0gKgotICogRGVyaXZlZCBmcm9tIGluY2x1ZGUvbGludXgvbmV0Zml0ZXJfaXB2NC9pcF9jb25udHJhY2suaAotICovCi0KLSNpZm5kZWYgX05GX0NPTk5UUkFDS19ICi0jZGVmaW5lIF9ORl9DT05OVFJBQ0tfSAotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2RjY3AuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NjdHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRpb2NfcHJvYy5oPgotCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaD4KLSNpZmRlZiBDT05GSUdfRkFTVE5BVF9NT0RVTEUKLSNpbmNsdWRlIDxuZXQvU0kvcGt0X2xvc3RfdHJhY2suaD4KLSNlbmRpZgotCi0KLQotc3RydWN0IG5mX2N0X3VkcCB7Ci0JdW5zaWduZWQgbG9uZwlzdHJlYW1fdHM7Ci19OwotCi0vKiBwZXIgY29ubnRyYWNrOiBwcm90b2NvbCBwcml2YXRlIGRhdGEgKi8KLXVuaW9uIG5mX2Nvbm50cmFja19wcm90byB7Ci0JLyogaW5zZXJ0IGNvbm50cmFjayBwcm90byBwcml2YXRlIGRhdGEgaGVyZSAqLwotCXN0cnVjdCBuZl9jdF9kY2NwIGRjY3A7Ci0Jc3RydWN0IGlwX2N0X3NjdHAgc2N0cDsKLQlzdHJ1Y3QgaXBfY3RfdGNwIHRjcDsKLQlzdHJ1Y3QgbmZfY3RfdWRwIHVkcDsKLQlzdHJ1Y3QgbmZfY3RfZ3JlIGdyZTsKLQl1bnNpZ25lZCBpbnQgdG1wbF9wYWR0bzsKLX07Ci0KLXVuaW9uIG5mX2Nvbm50cmFja19leHBlY3RfcHJvdG8gewotCS8qIGluc2VydCBleHBlY3QgcHJvdG8gcHJpdmF0ZSBkYXRhIGhlcmUgKi8KLX07Ci0KLXN0cnVjdCBuZl9jb25udHJhY2tfbmV0IHsKLQl1bnNpZ25lZCBpbnQgdXNlcnM0OwotCXVuc2lnbmVkIGludCB1c2VyczY7Ci0JdW5zaWduZWQgaW50IHVzZXJzX2JyaWRnZTsKLX07Ci0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY0L25mX2Nvbm50cmFja19pcHY0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX2Nvbm50cmFja19pcHY2Lmg+Ci0jaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCi1zdHJ1Y3QgZmFzdF9jdF9leHR7Ci0gICAgdW5pb24gewotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgc3RydWN0IGRzdF9lbnRyeSAgX19yY3UgKmZhc3RfZHN0W0lQX0NUX0RJUl9NQVhdOwotICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgX19yY3UgKmZhc3RfYnJwb3J0W0lQX0NUX0RJUl9NQVhdOwotICAgICAgICB9OwotICAgICAgICBzdHJ1Y3Qgc29jayBfX3JjdSAqc2s7Ci0gICAgfTsKLSAgICB1bnNpZ25lZCBjaGFyIGlzRmFzdDsgCi19OwotI2VuZGlmCi0KLXN0cnVjdCBuZl9jb25uIHsKLQkvKiBVc2FnZSBjb3VudCBpbiBoZXJlIGlzIDEgZm9yIGhhc2ggdGFibGUsIDEgcGVyIHNrYiwKLQkgKiBwbHVzIDEgZm9yIGFueSBjb25uZWN0aW9uKHMpIHdlIGFyZSBgbWFzdGVyJyBmb3IKLQkgKgotCSAqIEhpbnQsIFNLQiBhZGRyZXNzIHRoaXMgc3RydWN0IGFuZCByZWZjbnQgdmlhIHNrYi0+X25mY3QgYW5kCi0JICogaGVscGVycyBuZl9jb25udHJhY2tfZ2V0KCkgYW5kIG5mX2Nvbm50cmFja19wdXQoKS4KLQkgKiBIZWxwZXIgbmZfY3RfcHV0KCkgZXF1YWxzIG5mX2Nvbm50cmFja19wdXQoKSBieSBkZWMgcmVmY250LAotCSAqIGJld2FyZSBuZl9jdF9nZXQoKSBpcyBkaWZmZXJlbnQgYW5kIGRvbid0IGluYyByZWZjbnQuCi0JICovCi0Jc3RydWN0IG5mX2Nvbm50cmFjayBjdF9nZW5lcmFsOwotCi0Jc3BpbmxvY2tfdAlsb2NrOwotCS8qIGppZmZpZXMzMiB3aGVuIHRoaXMgY3QgaXMgY29uc2lkZXJlZCBkZWFkICovCi0JdTMyIHRpbWVvdXQ7Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1pPTkVTCi0Jc3RydWN0IG5mX2Nvbm50cmFja196b25lIHpvbmU7Ci0jZW5kaWYKLQkvKiBYWFggc2hvdWxkIEkgbW92ZSB0aGlzIHRvIHRoZSB0YWlsID8gLSBZLksgKi8KLQkvKiBUaGVzZSBhcmUgbXkgdHVwbGVzOyBvcmlnaW5hbCBhbmQgcmVwbHkgKi8KLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggdHVwbGVoYXNoW0lQX0NUX0RJUl9NQVhdOwotCi0JLyogSGF2ZSB3ZSBzZWVuIHRyYWZmaWMgYm90aCB3YXlzIHlldD8gKGJpdHNldCkgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXR1czsKLQotCXUxNgkJY3B1OwotCXBvc3NpYmxlX25ldF90IGN0X25ldDsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX05BVCkKLQlzdHJ1Y3QgaGxpc3Rfbm9kZQluYXRfYnlzb3VyY2U7Ci0jZW5kaWYKLQkvKiBhbGwgbWVtYmVycyBiZWxvdyBpbml0aWFsaXplZCB2aWEgbWVtc2V0ICovCi0Jc3RydWN0IHsgfSBfX25mY3RfaW5pdF9vZmZzZXQ7Ci0KLQkvKiBJZiB3ZSB3ZXJlIGV4cGVjdGVkIGJ5IGFuIGV4cGVjdGF0aW9uLCB0aGlzIHdpbGwgYmUgaXQgKi8KLQlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyOwotCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01BUkspCi0JdV9pbnQzMl90IG1hcms7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfU0VDTUFSSwotCXVfaW50MzJfdCBzZWNtYXJrOwotI2VuZGlmCi0KLQkvKiBFeHRlbnNpb25zICovCi0Jc3RydWN0IG5mX2N0X2V4dCAqZXh0OwotCi0JLyogU3RvcmFnZSByZXNlcnZlZCBmb3Igb3RoZXIgbW9kdWxlcywgbXVzdCBiZSB0aGUgbGFzdCBtZW1iZXIgKi8KLQl1bmlvbiBuZl9jb25udHJhY2tfcHJvdG8gcHJvdG87Ci0jaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCi0Jc3RydWN0IGZhc3RfY3RfZXh0IGZhc3RfY3Q7Ci0Jc3RydWN0IGNvbm5fc2VxX3RyYWNrIGNvbm5fcGt0bG9zc1tJUF9DVF9ESVJfTUFYXTsKLSNlbmRpZgotCi0Jc3RydWN0IGNvbm5fc2tiaW5mbyBwYWNrZXRfaW5mb1tJUF9DVF9ESVJfTUFYXTsKLQlzdHJ1Y3QgbmV0X2RldmljZSogaW5kZXZbSVBfQ1RfRElSX01BWF07Ci0Jc3RydWN0IG5ldF9kZXZpY2UqIG91dGRldltJUF9DVF9ESVJfTUFYXTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2Nvbm4gKgotbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmhhc2gpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihoYXNoLCBzdHJ1Y3QgbmZfY29ubiwKLQkJCSAgICB0dXBsZWhhc2hbaGFzaC0+dHVwbGUuZHN0LmRpcl0pOwotfQotCi1zdGF0aWMgaW5saW5lIHVfaW50MTZfdCBuZl9jdF9sM251bShjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JcmV0dXJuIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMubDNudW07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdV9pbnQ4X3QgbmZfY3RfcHJvdG9udW0oY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXJldHVybiBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtOwotfQotCi0jZGVmaW5lIG5mX2N0X3R1cGxlKGN0LCBkaXIpICgmKGN0KS0+dHVwbGVoYXNoW2Rpcl0udHVwbGUpCi0KLS8qIGdldCBtYXN0ZXIgY29ubnRyYWNrIHZpYSBtYXN0ZXIgZXhwZWN0YXRpb24gKi8KLSNkZWZpbmUgbWFzdGVyX2N0KGNvbm50cikgKGNvbm50ci0+bWFzdGVyKQotCi1leHRlcm4gc3RydWN0IG5ldCBpbml0X25ldDsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpuZl9jdF9uZXQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXJldHVybiByZWFkX3BuZXQoJmN0LT5jdF9uZXQpOwotfQotCi0vKiBBbHRlciByZXBseSB0dXBsZSAobWF5YmUgYWx0ZXIgaGVscGVyKS4gKi8KLXZvaWQgbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm5ld3JlcGx5KTsKLQotLyogSXMgdGhpcyB0dXBsZSB0YWtlbj8gKGlnbm9yaW5nIGFueSBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuCi0gICBjb25udHJhY2spLiAqLwotaW50IG5mX2Nvbm50cmFja190dXBsZV90YWtlbihjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmlnbm9yZWRfY29ubnRyYWNrKTsKLQotLyogUmV0dXJuIGNvbm50cmFja19pbmZvIGFuZCB0dXBsZSBoYXNoIGZvciBnaXZlbiBza2IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25uICoKLW5mX2N0X2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIGlwX2Nvbm50cmFja19pbmZvICpjdGluZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBuZmN0ID0gc2tiX2dldF9uZmN0KHNrYik7Ci0KLQkqY3RpbmZvID0gbmZjdCAmIE5GQ1RfSU5GT01BU0s7Ci0JcmV0dXJuIChzdHJ1Y3QgbmZfY29ubiAqKShuZmN0ICYgTkZDVF9QVFJNQVNLKTsKLX0KLQotLyogZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBhIGNvbm50cmFjayAqLwotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3B1dChzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JV0FSTl9PTighY3QpOwotCW5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLX0KLQotLyogUHJvdG9jb2wgbW9kdWxlIGxvYWRpbmcgKi8KLWludCBuZl9jdF9sM3Byb3RvX3RyeV9tb2R1bGVfZ2V0KHVuc2lnbmVkIHNob3J0IGwzcHJvdG8pOwotdm9pZCBuZl9jdF9sM3Byb3RvX21vZHVsZV9wdXQodW5zaWduZWQgc2hvcnQgbDNwcm90byk7Ci0KLS8qIGxvYWQgbW9kdWxlOyBlbmFibGUvZGlzYWJsZSBjb25udHJhY2sgaW4gdGhpcyBuYW1lc3BhY2UgKi8KLWludCBuZl9jdF9uZXRuc19nZXQoc3RydWN0IG5ldCAqbmV0LCB1OCBuZnByb3RvKTsKLXZvaWQgbmZfY3RfbmV0bnNfcHV0KHN0cnVjdCBuZXQgKm5ldCwgdTggbmZwcm90byk7Ci0KLS8qCi0gKiBBbGxvY2F0ZSBhIGhhc2h0YWJsZSBvZiBobGlzdF9oZWFkIChpZiBudWxscyA9PSAwKSwKLSAqIG9yIGhsaXN0X251bGxzX2hlYWQgKGlmIG51bGxzID09IDEpCi0gKi8KLXZvaWQgKm5mX2N0X2FsbG9jX2hhc2h0YWJsZSh1bnNpZ25lZCBpbnQgKnNpemVwLCBpbnQgbnVsbHMpOwotCi12b2lkIG5mX2N0X2ZyZWVfaGFzaHRhYmxlKHZvaWQgKmhhc2gsIHVuc2lnbmVkIGludCBzaXplKTsKLWludCBuZl9jb25udHJhY2tfaGFzaF9jaGVja19pbnNlcnQoc3RydWN0IG5mX2Nvbm4gKmN0KTsKLWJvb2wgbmZfY3RfZGVsZXRlKHN0cnVjdCBuZl9jb25uICpjdCwgdTMyIHBpZCwgaW50IHJlcG9ydCk7Ci0KLWJvb2wgbmZfY3RfZ2V0X3R1cGxlcHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAotCQkgICAgICAgdV9pbnQxNl90IGwzbnVtLCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCSAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSk7Ci0KLXZvaWQgX19uZl9jdF9yZWZyZXNoX2FjY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgdTMyIGV4dHJhX2ppZmZpZXMsIGJvb2wgZG9fYWNjdCk7Ci0KLS8qIFJlZnJlc2ggY29ubnRyYWNrIGZvciB0aGlzIG1hbnkgamlmZmllcyBhbmQgZG8gYWNjb3VudGluZyAqLwotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X3JlZnJlc2hfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICB1MzIgZXh0cmFfamlmZmllcykKLXsKLQlfX25mX2N0X3JlZnJlc2hfYWNjdChjdCwgY3RpbmZvLCBza2IsIGV4dHJhX2ppZmZpZXMsIHRydWUpOwotfQotCi0vKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9jdF9yZWZyZXNoKHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCQkgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgdTMyIGV4dHJhX2ppZmZpZXMpCi17Ci0JX19uZl9jdF9yZWZyZXNoX2FjY3QoY3QsIDAsIHNrYiwgZXh0cmFfamlmZmllcywgZmFsc2UpOwotfQotCi0vKiBraWxsIGNvbm50cmFjayBhbmQgZG8gYWNjb3VudGluZyAqLwotYm9vbCBuZl9jdF9raWxsX2FjY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LCBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotLyoga2lsbCBjb25udHJhY2sgd2l0aG91dCBhY2NvdW50aW5nICovCi1zdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfa2lsbChzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JcmV0dXJuIG5mX2N0X2RlbGV0ZShjdCwgMCwgMCk7Ci19Ci0KLS8qIFNldCBhbGwgdW5jb25maXJtZWQgY29ubnRyYWNrIGFzIGR5aW5nICovCi12b2lkIG5mX2N0X3VuY29uZmlybWVkX2Rlc3Ryb3koc3RydWN0IG5ldCAqKTsKLQotLyogSXRlcmF0ZSBvdmVyIGFsbCBjb25udHJhY2tzOiBpZiBpdGVyIHJldHVybnMgdHJ1ZSwgaXQncyBkZWxldGVkLiAqLwotdm9pZCBuZl9jdF9pdGVyYXRlX2NsZWFudXBfbmV0KHN0cnVjdCBuZXQgKm5ldCwKLQkJCSAgICAgICBpbnQgKCppdGVyKShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSksCi0JCQkgICAgICAgdm9pZCAqZGF0YSwgdTMyIHBvcnRpZCwgaW50IHJlcG9ydCk7Ci0KLS8qIGFsc28gc2V0IHVuY29uZmlybWVkIGNvbm50cmFja3MgYXMgZHlpbmcuIE9ubHkgdXNlIGluIG1vZHVsZSBleGl0IHBhdGguICovCi12b2lkIG5mX2N0X2l0ZXJhdGVfZGVzdHJveShpbnQgKCppdGVyKShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSksCi0JCQkgICB2b2lkICpkYXRhKTsKLQotc3RydWN0IG5mX2Nvbm50cmFja196b25lOwotCi12b2lkIG5mX2Nvbm50cmFja19mcmVlKHN0cnVjdCBuZl9jb25uICpjdCk7Ci1zdHJ1Y3QgbmZfY29ubiAqbmZfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXBsLAotCQkJCSAgIGdmcF90IGdmcCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG5mX2N0X2lzX3RlbXBsYXRlKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlyZXR1cm4gdGVzdF9iaXQoSVBTX1RFTVBMQVRFX0JJVCwgJmN0LT5zdGF0dXMpOwotfQotCi0vKiBJdCdzIGNvbmZpcm1lZCBpZiBpdCBpcywgb3IgaGFzIGJlZW4gaW4gdGhlIGhhc2ggdGFibGUuICovCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc19jb25maXJtZWQoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXJldHVybiB0ZXN0X2JpdChJUFNfQ09ORklSTUVEX0JJVCwgJmN0LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9jdF9pc19keWluZyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JcmV0dXJuIHRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKLX0KLQotLyogUGFja2V0IGlzIHJlY2VpdmVkIGZyb20gbG9vcGJhY2sgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBuZl9pc19sb29wYmFja19wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gc2tiLT5kZXYgJiYgc2tiLT5za2JfaWlmICYmIHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKLX0KLQotI2RlZmluZSBuZmN0X3RpbWVfc3RhbXAgKCh1MzIpKGppZmZpZXMpKQotCi0vKiBqaWZmaWVzIHVudGlsIGN0IGV4cGlyZXMsIDAgaWYgYWxyZWFkeSBleHBpcmVkICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbmZfY3RfZXhwaXJlcyhjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JczMyIHRpbWVvdXQgPSBSRUFEX09OQ0UoY3QtPnRpbWVvdXQpIC0gbmZjdF90aW1lX3N0YW1wOwotCi0JcmV0dXJuIHRpbWVvdXQgPiAwID8gdGltZW91dCA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBuZl9jdF9pc19leHBpcmVkKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlyZXR1cm4gKF9fczMyKShSRUFEX09OQ0UoY3QtPnRpbWVvdXQpIC0gbmZjdF90aW1lX3N0YW1wKSA8PSAwOwotfQotCi0vKiB1c2UgYWZ0ZXIgb2J0YWluaW5nIGEgcmVmZXJlbmNlIGNvdW50ICovCi1zdGF0aWMgaW5saW5lIGJvb2wgbmZfY3Rfc2hvdWxkX2djKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlyZXR1cm4gbmZfY3RfaXNfZXhwaXJlZChjdCkgJiYgbmZfY3RfaXNfY29uZmlybWVkKGN0KSAmJgotCSAgICAgICAhbmZfY3RfaXNfZHlpbmcoY3QpOwotfQotCi0jZGVmaW5lCU5GX0NUX0RBWQkoODY0MDAgKiBIWikKLQotLyogU2V0IGFuIGFyYml0cmFyeSB0aW1lb3V0IGxhcmdlIGVub3VnaCBub3QgdG8gZXZlciBleHBpcmUsIHRoaXMgc2F2ZQotICogdXMgYSBjaGVjayBmb3IgdGhlIElQU19PRkZMT0FEX0JJVCBmcm9tIHRoZSBwYWNrZXQgcGF0aCB2aWEKLSAqIG5mX2N0X2lzX2V4cGlyZWQoKS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIG5mX2N0X29mZmxvYWRfdGltZW91dChzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JaWYgKG5mX2N0X2V4cGlyZXMoY3QpIDwgTkZfQ1RfREFZIC8gMikKLQkJV1JJVEVfT05DRShjdC0+dGltZW91dCwgbmZjdF90aW1lX3N0YW1wICsgTkZfQ1RfREFZKTsKLX0KLQotc3RydWN0IGtlcm5lbF9wYXJhbTsKLQotaW50IG5mX2Nvbm50cmFja19zZXRfaGFzaHNpemUoY29uc3QgY2hhciAqdmFsLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7Ci1pbnQgbmZfY29ubnRyYWNrX2hhc2hfcmVzaXplKHVuc2lnbmVkIGludCBoYXNoc2l6ZSk7Ci0KLWV4dGVybiBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqbmZfY29ubnRyYWNrX2hhc2g7Ci1leHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLWV4dGVybiBzZXFjb3VudF9zcGlubG9ja190IG5mX2Nvbm50cmFja19nZW5lcmF0aW9uOwotZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4OwotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJjdSByZWFkIGxvY2sgaGVsZCAqLwotc3RhdGljIGlubGluZSB2b2lkCi1uZl9jb25udHJhY2tfZ2V0X2h0KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICoqaGFzaCwgdW5zaWduZWQgaW50ICpoc2l6ZSkKLXsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaHB0cjsKLQl1bnNpZ25lZCBpbnQgc2VxdWVuY2UsIGhzejsKLQotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWhzeiA9IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQkJaHB0ciA9IG5mX2Nvbm50cmFja19oYXNoOwotCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOwotCi0JKmhhc2ggPSBocHRyOwotCSpoc2l6ZSA9IGhzejsKLX0KLQotc3RydWN0IG5mX2Nvbm4gKm5mX2N0X3RtcGxfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCQkJIGdmcF90IGZsYWdzKTsKLXZvaWQgbmZfY3RfdG1wbF9mcmVlKHN0cnVjdCBuZl9jb25uICp0bXBsKTsKLQotdTMyIG5mX2N0X2dldF9pZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW5mX2N0X3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gaW5mbykKLXsKLQlza2Jfc2V0X25mY3Qoc2tiLCAodW5zaWduZWQgbG9uZyljdCB8IGluZm8pOwotfQotCi0jZGVmaW5lIE5GX0NUX1NUQVRfSU5DKG5ldCwgY291bnQpCSAgX190aGlzX2NwdV9pbmMoKG5ldCktPmN0LnN0YXQtPmNvdW50KQotI2RlZmluZSBORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBjb3VudCkgdGhpc19jcHVfaW5jKChuZXQpLT5jdC5zdGF0LT5jb3VudCkKLSNkZWZpbmUgTkZfQ1RfU1RBVF9BRERfQVRPTUlDKG5ldCwgY291bnQsIHYpIHRoaXNfY3B1X2FkZCgobmV0KS0+Y3Quc3RhdC0+Y291bnQsICh2KSkKLQotI2RlZmluZSBNT0RVTEVfQUxJQVNfTkZDVF9IRUxQRVIoaGVscGVyKSBcCi0gICAgICAgIE1PRFVMRV9BTElBUygibmZjdC1oZWxwZXItIiBoZWxwZXIpCi0KLSNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5pdC9tYWluLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2luaXQvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2Q5M2VhLi4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvaW5pdC9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcxICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKLS8qCi0gKiAgbGludXgvaW5pdC9tYWluLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwotICoKLSAqICBHSyAyLzUvOTUgIC0gIENoYW5nZWQgdG8gc3VwcG9ydCBtb3VudGluZyByb290IGZzIHZpYSBORlMKLSAqICBBZGRlZCBpbml0cmQgJiBjaGFuZ2Vfcm9vdDogV2VybmVyIEFsbWVzYmVyZ2VyICYgSGFucyBMZXJtZW4sIEZlYiAnOTYKLSAqICBNb2FuIGVhcmx5IGlmIGdjYyBpcyBvbGQsIGF2b2lkaW5nIGJvZ3VzIGtlcm5lbHMgLSBQYXVsIEdvcnRtYWtlciwgTWF5ICc5NgotICogIFNpbXBsaWZpZWQgc3RhcnRpbmcgb2YgaW5pdDogIE1pY2hhZWwgQS4gR3JpZmZpdGggPGdyaWZAYWNtLm9yZz4KLSAqLwotCi0jZGVmaW5lIERFQlVHCQkvKiBFbmFibGUgaW5pdGNhbGxfZGVidWcgKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGFja3Byb3RlY3Rvci5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdGNvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ubWkuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgotI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC9pc29sYXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90YXNrc3RhdHNfa2Vybi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9ybWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+Ci0jaW5jbHVkZSA8bGludXgva2V5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlX2V4dC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdvYmplY3RzLmg+Ci0jaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFkYXRhLmg+Ci0jaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRyLmg+Ci0jaW5jbHVkZSA8bGludXgva2dkYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+Ci0jaW5jbHVkZSA8bGludXgvc2ZpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3B0aS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2VsZXZhdG9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC90YXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQvdGFza19zdGFjay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnRleHRfdHJhY2tpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZWdyaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19ucy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yb2RhdGFfdGVzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1fZW5jcnlwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tjc2FuLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdF9zeXNjYWxscy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2J1Z3MuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotCi0jZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMvaW5pdGNhbGwuaD4KLQotI2luY2x1ZGUgPGt1bml0L3Rlc3QuaD4KLQotI2lmZGVmIENPTkZJR19GTEFHU19VVElMUwotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgInB1Yl9mbGFncy5oIgotI2VuZGlmCi0KLXN0YXRpYyBpbnQga2VybmVsX2luaXQodm9pZCAqKTsKLQotZXh0ZXJuIHZvaWQgaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gdm9pZCByYWRpeF90cmVlX2luaXQodm9pZCk7Ci0KLS8qCi0gKiBEZWJ1ZyBoZWxwZXI6IHZpYSB0aGlzIGZsYWcgd2Uga25vdyB0aGF0IHdlIGFyZSBpbiAnZWFybHkgYm9vdHVwIGNvZGUnCi0gKiB3aGVyZSBvbmx5IHRoZSBib290IHByb2Nlc3NvciBpcyBydW5uaW5nIHdpdGggSVJRIGRpc2FibGVkLiAgVGhpcyBtZWFucwotICogdHdvIHRoaW5ncyAtIElSUSBtdXN0IG5vdCBiZSBlbmFibGVkIGJlZm9yZSB0aGUgZmxhZyBpcyBjbGVhcmVkIGFuZCBzb21lCi0gKiBvcGVyYXRpb25zIHdoaWNoIGFyZSBub3QgYWxsb3dlZCB3aXRoIElSUSBkaXNhYmxlZCBhcmUgYWxsb3dlZCB3aGlsZSB0aGUKLSAqIGZsYWcgaXMgc2V0LgotICovCi1ib29sIGVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCBfX3JlYWRfbW9zdGx5OwotCi1lbnVtIHN5c3RlbV9zdGF0ZXMgc3lzdGVtX3N0YXRlIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MKHN5c3RlbV9zdGF0ZSk7Ci0KLS8qCi0gKiBCb290IGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotI2RlZmluZSBNQVhfSU5JVF9BUkdTIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQKLSNkZWZpbmUgTUFYX0lOSVRfRU5WUyBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUCi0KLWV4dGVybiB2b2lkIHRpbWVfaW5pdCh2b2lkKTsKLS8qIERlZmF1bHQgbGF0ZSB0aW1lIGluaXQgaXMgTlVMTC4gYXJjaHMgY2FuIG92ZXJyaWRlIHRoaXMgbGF0ZXIuICovCi12b2lkICgqX19pbml0ZGF0YSBsYXRlX3RpbWVfaW5pdCkodm9pZCk7Ci0KLS8qIFVudG91Y2hlZCBjb21tYW5kIGxpbmUgc2F2ZWQgYnkgYXJjaC1zcGVjaWZpYyBjb2RlLiAqLwotY2hhciBfX2luaXRkYXRhIGJvb3RfY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKLS8qIFVudG91Y2hlZCBzYXZlZCBjb21tYW5kIGxpbmUgKGVnLiBmb3IgL3Byb2MpICovCi1jaGFyICpzYXZlZF9jb21tYW5kX2xpbmU7Ci0vKiBDb21tYW5kIGxpbmUgZm9yIHBhcmFtZXRlciBwYXJzaW5nICovCi1zdGF0aWMgY2hhciAqc3RhdGljX2NvbW1hbmRfbGluZTsKLS8qIFVudG91Y2hlZCBleHRyYSBjb21tYW5kIGxpbmUgKi8KLXN0YXRpYyBjaGFyICpleHRyYV9jb21tYW5kX2xpbmU7Ci0vKiBFeHRyYSBpbml0IGFyZ3VtZW50cyAqLwotc3RhdGljIGNoYXIgKmV4dHJhX2luaXRfYXJnczsKLQotI2lmZGVmIENPTkZJR19CT09UX0NPTkZJRwotLyogSXMgYm9vdGNvbmZpZyBvbiBjb21tYW5kIGxpbmU/ICovCi1zdGF0aWMgYm9vbCBib290Y29uZmlnX2ZvdW5kOwotc3RhdGljIGJvb2wgaW5pdGFyZ3NfZm91bmQ7Ci0jZWxzZQotIyBkZWZpbmUgYm9vdGNvbmZpZ19mb3VuZCBmYWxzZQotIyBkZWZpbmUgaW5pdGFyZ3NfZm91bmQgZmFsc2UKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZXhlY3V0ZV9jb21tYW5kOwotc3RhdGljIGNoYXIgKnJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kID0gIi9pbml0IjsKLQotLyoKLSAqIFVzZWQgdG8gZ2VuZXJhdGUgd2FybmluZ3MgaWYgc3RhdGljX2tleSBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIGFyZSB1c2VkCi0gKiBiZWZvcmUganVtcF9sYWJlbF9pbml0IGlzIGNhbGxlZC4KLSAqLwotYm9vbCBzdGF0aWNfa2V5X2luaXRpYWxpemVkIF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzdGF0aWNfa2V5X2luaXRpYWxpemVkKTsKLQotLyoKLSAqIElmIHNldCwgdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBkcml2ZXJzIHRoYXQgcmVzZXQgdGhlIHVuZGVybHlpbmcKLSAqIGRldmljZSBiZWZvcmUgZ29pbmcgYWhlYWQgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gb3RoZXJ3aXNlIGRyaXZlciBtaWdodAotICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgotICoKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCi0gKiBGb3IgZXguIGtkdW1wIHNpdHVhdGlvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KLSAqIHNraXBwZWQgYW5kIGRldmljZXMgd2lsbCBiZSBpbiB1bmtub3duIHN0YXRlLgotICovCi11bnNpZ25lZCBpbnQgcmVzZXRfZGV2aWNlczsKLUVYUE9SVF9TWU1CT0wocmVzZXRfZGV2aWNlcyk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNldF9yZXNldF9kZXZpY2VzKGNoYXIgKnN0cikKLXsKLQlyZXNldF9kZXZpY2VzID0gMTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicmVzZXRfZGV2aWNlcyIsIHNldF9yZXNldF9kZXZpY2VzKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3ZfaW5pdFtNQVhfSU5JVF9BUkdTKzJdID0geyAiaW5pdCIsIE5VTEwsIH07Ci1jb25zdCBjaGFyICplbnZwX2luaXRbTUFYX0lOSVRfRU5WUysyXSA9IHsgIkhPTUU9LyIsICJURVJNPWxpbnV4IiwgTlVMTCwgfTsKLXN0YXRpYyBjb25zdCBjaGFyICpwYW5pY19sYXRlciwgKnBhbmljX3BhcmFtOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gX19zZXR1cF9zdGFydFtdLCBfX3NldHVwX2VuZFtdOwotCi1zdGF0aWMgYm9vbCBfX2luaXQgb2Jzb2xldGVfY2hlY2tzZXR1cChjaGFyICpsaW5lKQotewotCWNvbnN0IHN0cnVjdCBvYnNfa2VybmVsX3BhcmFtICpwOwotCWJvb2wgaGFkX2Vhcmx5X3BhcmFtID0gZmFsc2U7Ci0KLQlwID0gX19zZXR1cF9zdGFydDsKLQlkbyB7Ci0JCWludCBuID0gc3RybGVuKHAtPnN0cik7Ci0JCWlmIChwYXJhbWVxbihsaW5lLCBwLT5zdHIsIG4pKSB7Ci0JCQlpZiAocC0+ZWFybHkpIHsKLQkJCQkvKiBBbHJlYWR5IGRvbmUgaW4gcGFyc2VfZWFybHlfcGFyYW0/Ci0JCQkJICogKE5lZWRzIGV4YWN0IG1hdGNoIG9uIHBhcmFtIHBhcnQpLgotCQkJCSAqIEtlZXAgaXRlcmF0aW5nLCBhcyB3ZSBjYW4gaGF2ZSBlYXJseQotCQkJCSAqIHBhcmFtcyBhbmQgX19zZXR1cHMgb2Ygc2FtZSBuYW1lcyA4KCAqLwotCQkJCWlmIChsaW5lW25dID09ICdcMCcgfHwgbGluZVtuXSA9PSAnPScpCi0JCQkJCWhhZF9lYXJseV9wYXJhbSA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKCFwLT5zZXR1cF9mdW5jKSB7Ci0JCQkJcHJfd2FybigiUGFyYW1ldGVyICVzIGlzIG9ic29sZXRlLCBpZ25vcmVkXG4iLAotCQkJCQlwLT5zdHIpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIGlmIChwLT5zZXR1cF9mdW5jKGxpbmUgKyBuKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwKys7Ci0JfSB3aGlsZSAocCA8IF9fc2V0dXBfZW5kKTsKLQotCXJldHVybiBoYWRfZWFybHlfcGFyYW07Ci19Ci0KLS8qCi0gKiBUaGlzIHNob3VsZCBiZSBhcHByb3ggMiBCbypvTWlwcyB0byBzdGFydCAobm90ZSBpbml0aWFsIHNoaWZ0KSwgYW5kIHdpbGwKLSAqIHN0aWxsIHdvcmsgZXZlbiBpZiBpbml0aWFsbHkgdG9vIGxhcmdlLCBpdCB3aWxsIGp1c3QgdGFrZSBzbGlnaHRseSBsb25nZXIKLSAqLwotdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnkgPSAoMTw8MTIpOwotRVhQT1JUX1NZTUJPTChsb29wc19wZXJfamlmZnkpOwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWJ1Z19rZXJuZWwoY2hhciAqc3RyKQotewotCWNvbnNvbGVfbG9nbGV2ZWwgPSBDT05TT0xFX0xPR0xFVkVMX0RFQlVHOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBxdWlldF9rZXJuZWwoY2hhciAqc3RyKQotewotCWNvbnNvbGVfbG9nbGV2ZWwgPSBDT05TT0xFX0xPR0xFVkVMX1FVSUVUOwotCXJldHVybiAwOwotfQotCi1lYXJseV9wYXJhbSgiZGVidWciLCBkZWJ1Z19rZXJuZWwpOwotZWFybHlfcGFyYW0oInF1aWV0IiwgcXVpZXRfa2VybmVsKTsKLQotc3RhdGljIGludCBfX2luaXQgbG9nbGV2ZWwoY2hhciAqc3RyKQotewotCWludCBuZXdsZXZlbDsKLQotCS8qCi0JICogT25seSB1cGRhdGUgbG9nbGV2ZWwgdmFsdWUgd2hlbiBhIGNvcnJlY3Qgc2V0dGluZyB3YXMgcGFzc2VkLAotCSAqIHRvIHByZXZlbnQgYmxpbmQgY3Jhc2hlcyAod2hlbiBsb2dsZXZlbCBiZWluZyBzZXQgdG8gMCkgdGhhdAotCSAqIGFyZSBxdWl0ZSBoYXJkIHRvIGRlYnVnCi0JICovCi0JaWYgKGdldF9vcHRpb24oJnN0ciwgJm5ld2xldmVsKSkgewotCQljb25zb2xlX2xvZ2xldmVsID0gbmV3bGV2ZWw7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1lYXJseV9wYXJhbSgibG9nbGV2ZWwiLCBsb2dsZXZlbCk7Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLXN0YXRpYyB2b2lkICogX19pbml0IGdldF9ib290X2NvbmZpZ19mcm9tX2luaXRyZCh1MzIgKl9zaXplLCB1MzIgKl9jc3VtKQotewotCXUzMiBzaXplLCBjc3VtOwotCWNoYXIgKmRhdGE7Ci0JdTMyICpoZHI7Ci0JaW50IGk7Ci0KLQlpZiAoIWluaXRyZF9lbmQpCi0JCXJldHVybiBOVUxMOwotCi0JZGF0YSA9IChjaGFyICopaW5pdHJkX2VuZCAtIEJPT1RDT05GSUdfTUFHSUNfTEVOOwotCS8qCi0JICogU2luY2UgR3J1YiBtYXkgYWxpZ24gdGhlIHNpemUgb2YgaW5pdHJkIHRvIDQsIHdlIG11c3QKLQkgKiBjaGVjayB0aGUgcHJlY2VkaW5nIDMgYnl0ZXMgYXMgd2VsbC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmICghbWVtY21wKGRhdGEsIEJPT1RDT05GSUdfTUFHSUMsIEJPT1RDT05GSUdfTUFHSUNfTEVOKSkKLQkJCWdvdG8gZm91bmQ7Ci0JCWRhdGEtLTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci0KLWZvdW5kOgotCWhkciA9ICh1MzIgKikoZGF0YSAtIDgpOwotCXNpemUgPSBsZTMyX3RvX2NwdShoZHJbMF0pOwotCWNzdW0gPSBsZTMyX3RvX2NwdShoZHJbMV0pOwotCi0JZGF0YSA9ICgodm9pZCAqKWhkcikgLSBzaXplOwotCWlmICgodW5zaWduZWQgbG9uZylkYXRhIDwgaW5pdHJkX3N0YXJ0KSB7Ci0JCXByX2VycigiYm9vdGNvbmZpZyBzaXplICVkIGlzIGdyZWF0ZXIgdGhhbiBpbml0cmQgc2l6ZSAlbGRcbiIsCi0JCQlzaXplLCBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogUmVtb3ZlIGJvb3Rjb25maWcgZnJvbSBpbml0cmFtZnMvaW5pdHJkICovCi0JaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7Ci0JaWYgKF9zaXplKQotCQkqX3NpemUgPSBzaXplOwotCWlmIChfY3N1bSkKLQkJKl9jc3VtID0gY3N1bTsKLQotCXJldHVybiBkYXRhOwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkICogX19pbml0IGdldF9ib290X2NvbmZpZ19mcm9tX2luaXRyZCh1MzIgKl9zaXplLCB1MzIgKl9jc3VtKQotewotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQk9PVF9DT05GSUcKLQotc3RhdGljIGNoYXIgeGJjX25hbWVidWZbWEJDX0tFWUxFTl9NQVhdIF9faW5pdGRhdGE7Ci0KLSNkZWZpbmUgcmVzdChkc3QsIGVuZCkgKChlbmQpID4gKGRzdCkgPyAoZW5kKSAtIChkc3QpIDogMCkKLQotc3RhdGljIGludCBfX2luaXQgeGJjX3NucHJpbnRfY21kbGluZShjaGFyICpidWYsIHNpemVfdCBzaXplLAotCQkJCSAgICAgIHN0cnVjdCB4YmNfbm9kZSAqcm9vdCkKLXsKLQlzdHJ1Y3QgeGJjX25vZGUgKmtub2RlLCAqdm5vZGU7Ci0JY2hhciAqZW5kID0gYnVmICsgc2l6ZTsKLQljb25zdCBjaGFyICp2YWw7Ci0JaW50IHJldDsKLQotCXhiY19ub2RlX2Zvcl9lYWNoX2tleV92YWx1ZShyb290LCBrbm9kZSwgdmFsKSB7Ci0JCXJldCA9IHhiY19ub2RlX2NvbXBvc2Vfa2V5X2FmdGVyKHJvb3QsIGtub2RlLAotCQkJCQl4YmNfbmFtZWJ1ZiwgWEJDX0tFWUxFTl9NQVgpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJdm5vZGUgPSB4YmNfbm9kZV9nZXRfY2hpbGQoa25vZGUpOwotCQlpZiAoIXZub2RlKSB7Ci0JCQlyZXQgPSBzbnByaW50ZihidWYsIHJlc3QoYnVmLCBlbmQpLCAiJXMgIiwgeGJjX25hbWVidWYpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJCWJ1ZiArPSByZXQ7Ci0JCQljb250aW51ZTsKLQkJfQotCQl4YmNfYXJyYXlfZm9yX2VhY2hfdmFsdWUodm5vZGUsIHZhbCkgewotCQkJcmV0ID0gc25wcmludGYoYnVmLCByZXN0KGJ1ZiwgZW5kKSwgIiVzPVwiJXNcIiAiLAotCQkJCSAgICAgICB4YmNfbmFtZWJ1ZiwgdmFsKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7Ci0JCQlidWYgKz0gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIGJ1ZiAtIChlbmQgLSBzaXplKTsKLX0KLSN1bmRlZiByZXN0Ci0KLS8qIE1ha2UgYW4gZXh0cmEgY29tbWFuZCBsaW5lIHVuZGVyIGdpdmVuIGtleSB3b3JkICovCi1zdGF0aWMgY2hhciAqIF9faW5pdCB4YmNfbWFrZV9jbWRsaW5lKGNvbnN0IGNoYXIgKmtleSkKLXsKLQlzdHJ1Y3QgeGJjX25vZGUgKnJvb3Q7Ci0JY2hhciAqbmV3X2NtZGxpbmU7Ci0JaW50IHJldCwgbGVuID0gMDsKLQotCXJvb3QgPSB4YmNfZmluZF9ub2RlKGtleSk7Ci0JaWYgKCFyb290KQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIENvdW50IHJlcXVpcmVkIGJ1ZmZlciBzaXplICovCi0JbGVuID0geGJjX3NucHJpbnRfY21kbGluZShOVUxMLCAwLCByb290KTsKLQlpZiAobGVuIDw9IDApCi0JCXJldHVybiBOVUxMOwotCi0JbmV3X2NtZGxpbmUgPSBtZW1ibG9ja19hbGxvYyhsZW4gKyAxLCBTTVBfQ0FDSEVfQllURVMpOwotCWlmICghbmV3X2NtZGxpbmUpIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBleHRyYSBrZXJuZWwgY21kbGluZS5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXQgPSB4YmNfc25wcmludF9jbWRsaW5lKG5ld19jbWRsaW5lLCBsZW4gKyAxLCByb290KTsKLQlpZiAocmV0IDwgMCB8fCByZXQgPiBsZW4pIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcHJpbnQgZXh0cmEga2VybmVsIGNtZGxpbmUuXG4iKTsKLQkJbWVtYmxvY2tfZnJlZShfX3BhKG5ld19jbWRsaW5lKSwgbGVuICsgMSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJldHVybiBuZXdfY21kbGluZTsKLX0KLQotc3RhdGljIHUzMiBib290X2NvbmZpZ19jaGVja3N1bSh1bnNpZ25lZCBjaGFyICpwLCB1MzIgc2l6ZSkKLXsKLQl1MzIgcmV0ID0gMDsKLQotCXdoaWxlIChzaXplLS0pCi0JCXJldCArPSAqcCsrOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgYm9vdGNvbmZpZ19wYXJhbXMoY2hhciAqcGFyYW0sIGNoYXIgKnZhbCwKLQkJCQkgICAgY29uc3QgY2hhciAqdW51c2VkLCB2b2lkICphcmcpCi17Ci0JaWYgKHN0cmNtcChwYXJhbSwgImJvb3Rjb25maWciKSA9PSAwKSB7Ci0JCWJvb3Rjb25maWdfZm91bmQgPSB0cnVlOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Jvb3RfY29uZmlnKGNvbnN0IGNoYXIgKmNtZGxpbmUpCi17Ci0Jc3RhdGljIGNoYXIgdG1wX2NtZGxpbmVbQ09NTUFORF9MSU5FX1NJWkVdIF9faW5pdGRhdGE7Ci0JY29uc3QgY2hhciAqbXNnOwotCWludCBwb3M7Ci0JdTMyIHNpemUsIGNzdW07Ci0JY2hhciAqZGF0YSwgKmNvcHksICplcnI7Ci0JaW50IHJldDsKLQotCS8qIEN1dCBvdXQgdGhlIGJvb3Rjb25maWcgZGF0YSBldmVuIGlmIHdlIGhhdmUgbm8gYm9vdGNvbmZpZyBvcHRpb24gKi8KLQlkYXRhID0gZ2V0X2Jvb3RfY29uZmlnX2Zyb21faW5pdHJkKCZzaXplLCAmY3N1bSk7Ci0KLQlzdHJsY3B5KHRtcF9jbWRsaW5lLCBib290X2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwotCWVyciA9IHBhcnNlX2FyZ3MoImJvb3Rjb25maWciLCB0bXBfY21kbGluZSwgTlVMTCwgMCwgMCwgMCwgTlVMTCwKLQkJCSBib290Y29uZmlnX3BhcmFtcyk7Ci0KLQlpZiAoSVNfRVJSKGVycikgfHwgIWJvb3Rjb25maWdfZm91bmQpCi0JCXJldHVybjsKLQotCS8qIHBhcnNlX2FyZ3MoKSBzdG9wcyBhdCAnLS0nIGFuZCByZXR1cm5zIGFuIGFkZHJlc3MgKi8KLQlpZiAoZXJyKQotCQlpbml0YXJnc19mb3VuZCA9IHRydWU7Ci0KLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCInYm9vdGNvbmZpZycgZm91bmQgb24gY29tbWFuZCBsaW5lLCBidXQgbm8gYm9vdGNvbmZpZyBmb3VuZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2l6ZSA+PSBYQkNfREFUQV9NQVgpIHsKLQkJcHJfZXJyKCJib290Y29uZmlnIHNpemUgJWQgZ3JlYXRlciB0aGFuIG1heCBzaXplICVkXG4iLAotCQkJc2l6ZSwgWEJDX0RBVEFfTUFYKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChib290X2NvbmZpZ19jaGVja3N1bSgodW5zaWduZWQgY2hhciAqKWRhdGEsIHNpemUpICE9IGNzdW0pIHsKLQkJcHJfZXJyKCJib290Y29uZmlnIGNoZWNrc3VtIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQljb3B5ID0gbWVtYmxvY2tfYWxsb2Moc2l6ZSArIDEsIFNNUF9DQUNIRV9CWVRFUyk7Ci0JaWYgKCFjb3B5KSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYm9vdGNvbmZpZ1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1jcHkoY29weSwgZGF0YSwgc2l6ZSk7Ci0JY29weVtzaXplXSA9ICdcMCc7Ci0KLQlyZXQgPSB4YmNfaW5pdChjb3B5LCAmbXNnLCAmcG9zKTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocG9zIDwgMCkKLQkJCXByX2VycigiRmFpbGVkIHRvIGluaXQgYm9vdGNvbmZpZzogJXMuXG4iLCBtc2cpOwotCQllbHNlCi0JCQlwcl9lcnIoIkZhaWxlZCB0byBwYXJzZSBib290Y29uZmlnOiAlcyBhdCAlZC5cbiIsCi0JCQkJbXNnLCBwb3MpOwotCX0gZWxzZSB7Ci0JCXByX2luZm8oIkxvYWQgYm9vdGNvbmZpZzogJWQgYnl0ZXMgJWQgbm9kZXNcbiIsIHNpemUsIHJldCk7Ci0JCS8qIGtleXMgc3RhcnRpbmcgd2l0aCAia2VybmVsLiIgYXJlIHBhc3NlZCB2aWEgY21kbGluZSAqLwotCQlleHRyYV9jb21tYW5kX2xpbmUgPSB4YmNfbWFrZV9jbWRsaW5lKCJrZXJuZWwiKTsKLQkJLyogQWxzbywgImluaXQuIiBrZXlzIGFyZSBpbml0IGFyZ3VtZW50cyAqLwotCQlleHRyYV9pbml0X2FyZ3MgPSB4YmNfbWFrZV9jbWRsaW5lKCJpbml0Iik7Ci0JfQotCXJldHVybjsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Jvb3RfY29uZmlnKGNvbnN0IGNoYXIgKmNtZGxpbmUpCi17Ci0JLyogUmVtb3ZlIGJvb3Rjb25maWcgZGF0YSBmcm9tIGluaXRyZCAqLwotCWdldF9ib290X2NvbmZpZ19mcm9tX2luaXRyZChOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgd2Fybl9ib290Y29uZmlnKGNoYXIgKnN0cikKLXsKLQlwcl93YXJuKCJXQVJOSU5HOiAnYm9vdGNvbmZpZycgZm91bmQgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgYnV0IENPTkZJR19CT09UX0NPTkZJRyBpcyBub3Qgc2V0LlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgiYm9vdGNvbmZpZyIsIHdhcm5fYm9vdGNvbmZpZyk7Ci0KLSNlbmRpZgotCi0vKiBDaGFuZ2UgTlVMIHRlcm0gYmFjayB0byAiPSIsIHRvIG1ha2UgInBhcmFtIiB0aGUgd2hvbGUgc3RyaW5nLiAqLwotc3RhdGljIHZvaWQgX19pbml0IHJlcGFpcl9lbnZfc3RyaW5nKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwpCi17Ci0JaWYgKHZhbCkgewotCQkvKiBwYXJhbT12YWwgb3IgcGFyYW09InZhbCI/ICovCi0JCWlmICh2YWwgPT0gcGFyYW0rc3RybGVuKHBhcmFtKSsxKQotCQkJdmFsWy0xXSA9ICc9JzsKLQkJZWxzZSBpZiAodmFsID09IHBhcmFtK3N0cmxlbihwYXJhbSkrMikgewotCQkJdmFsWy0yXSA9ICc9JzsKLQkJCW1lbW1vdmUodmFsLTEsIHZhbCwgc3RybGVuKHZhbCkrMSk7Ci0JCX0gZWxzZQotCQkJQlVHKCk7Ci0JfQotfQotCi0vKiBBbnl0aGluZyBhZnRlciAtLSBnZXRzIGhhbmRlZCBzdHJhaWdodCB0byBpbml0LiAqLwotc3RhdGljIGludCBfX2luaXQgc2V0X2luaXRfYXJnKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwsCi0JCQkgICAgICAgY29uc3QgY2hhciAqdW51c2VkLCB2b2lkICphcmcpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAocGFuaWNfbGF0ZXIpCi0JCXJldHVybiAwOwotCi0JcmVwYWlyX2Vudl9zdHJpbmcocGFyYW0sIHZhbCk7Ci0KLQlmb3IgKGkgPSAwOyBhcmd2X2luaXRbaV07IGkrKykgewotCQlpZiAoaSA9PSBNQVhfSU5JVF9BUkdTKSB7Ci0JCQlwYW5pY19sYXRlciA9ICJpbml0IjsKLQkJCXBhbmljX3BhcmFtID0gcGFyYW07Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlhcmd2X2luaXRbaV0gPSBwYXJhbTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFVua25vd24gYm9vdCBvcHRpb25zIGdldCBoYW5kZWQgdG8gaW5pdCwgdW5sZXNzIHRoZXkgbG9vayBsaWtlCi0gKiB1bnVzZWQgcGFyYW1ldGVycyAobW9kcHJvYmUgd2lsbCBmaW5kIHRoZW0gaW4gL3Byb2MvY21kbGluZSkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHVua25vd25fYm9vdG9wdGlvbihjaGFyICpwYXJhbSwgY2hhciAqdmFsLAotCQkJCSAgICAgY29uc3QgY2hhciAqdW51c2VkLCB2b2lkICphcmcpCi17Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihwYXJhbSk7Ci0KLQlyZXBhaXJfZW52X3N0cmluZyhwYXJhbSwgdmFsKTsKLQotCS8qIEhhbmRsZSBvYnNvbGV0ZS1zdHlsZSBwYXJhbWV0ZXJzICovCi0JaWYgKG9ic29sZXRlX2NoZWNrc2V0dXAocGFyYW0pKQotCQlyZXR1cm4gMDsKLQotCS8qIFVudXNlZCBtb2R1bGUgcGFyYW1ldGVyLiAqLwotCWlmIChzdHJuY2hyKHBhcmFtLCBsZW4sICcuJykpCi0JCXJldHVybiAwOwotCi0JaWYgKHBhbmljX2xhdGVyKQotCQlyZXR1cm4gMDsKLQotCWlmICh2YWwpIHsKLQkJLyogRW52aXJvbm1lbnQgb3B0aW9uICovCi0JCXVuc2lnbmVkIGludCBpOwotCQlmb3IgKGkgPSAwOyBlbnZwX2luaXRbaV07IGkrKykgewotCQkJaWYgKGkgPT0gTUFYX0lOSVRfRU5WUykgewotCQkJCXBhbmljX2xhdGVyID0gImVudiI7Ci0JCQkJcGFuaWNfcGFyYW0gPSBwYXJhbTsKLQkJCX0KLQkJCWlmICghc3RybmNtcChwYXJhbSwgZW52cF9pbml0W2ldLCBsZW4rMSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZW52cF9pbml0W2ldID0gcGFyYW07Ci0JfSBlbHNlIHsKLQkJLyogQ29tbWFuZCBsaW5lIG9wdGlvbiAqLwotCQl1bnNpZ25lZCBpbnQgaTsKLQkJZm9yIChpID0gMDsgYXJndl9pbml0W2ldOyBpKyspIHsKLQkJCWlmIChpID09IE1BWF9JTklUX0FSR1MpIHsKLQkJCQlwYW5pY19sYXRlciA9ICJpbml0IjsKLQkJCQlwYW5pY19wYXJhbSA9IHBhcmFtOwotCQkJfQotCQl9Ci0JCWFyZ3ZfaW5pdFtpXSA9IHBhcmFtOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9zZXR1cChjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlleGVjdXRlX2NvbW1hbmQgPSBzdHI7Ci0JLyoKLQkgKiBJbiBjYXNlIExJTE8gaXMgZ29pbmcgdG8gYm9vdCB1cyB3aXRoIGRlZmF1bHQgY29tbWFuZCBsaW5lLAotCSAqIGl0IHByZXBlbmRzICJhdXRvIiBiZWZvcmUgdGhlIHdob2xlIGNtZGxpbmUgd2hpY2ggbWFrZXMKLQkgKiB0aGUgc2hlbGwgdGhpbmsgaXQgc2hvdWxkIGV4ZWN1dGUgYSBzY3JpcHQgd2l0aCBzdWNoIG5hbWUuCi0JICogU28gd2UgaWdub3JlIGFsbCBhcmd1bWVudHMgZW50ZXJlZCBfYmVmb3JlXyBpbml0PS4uLiBbTUpdCi0JICovCi0JZm9yIChpID0gMTsgaSA8IE1BWF9JTklUX0FSR1M7IGkrKykKLQkJYXJndl9pbml0W2ldID0gTlVMTDsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoImluaXQ9IiwgaW5pdF9zZXR1cCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJkaW5pdF9zZXR1cChjaGFyICpzdHIpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9IHN0cjsKLQkvKiBTZWUgImF1dG8iIGNvbW1lbnQgaW4gaW5pdF9zZXR1cCAqLwotCWZvciAoaSA9IDE7IGkgPCBNQVhfSU5JVF9BUkdTOyBpKyspCi0JCWFyZ3ZfaW5pdFtpXSA9IE5VTEw7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJyZGluaXQ9IiwgcmRpbml0X3NldHVwKTsKLQotI2lmbmRlZiBDT05GSUdfU01QCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNldHVwX21heF9jcHVzID0gTlJfQ1BVUzsKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9ucl9jcHVfaWRzKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heGNwdXMpIHsgfQotI2VuZGlmCi0KLS8qCi0gKiBXZSBuZWVkIHRvIHN0b3JlIHRoZSB1bnRvdWNoZWQgY29tbWFuZCBsaW5lIGZvciBmdXR1cmUgcmVmZXJlbmNlLgotICogV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3VjaGVkIGNvbW1hbmQgbGluZSBzaW5jZSB0aGUgcGFyYW1ldGVyCi0gKiBwYXJzaW5nIGlzIHBlcmZvcm1lZCBpbiBwbGFjZSwgYW5kIHdlIHNob3VsZCBhbGxvdyBhIGNvbXBvbmVudCB0bwotICogc3RvcmUgcmVmZXJlbmNlIG9mIG5hbWUvdmFsdWUgZm9yIGZ1dHVyZSByZWZlcmVuY2UuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9jb21tYW5kX2xpbmUoY2hhciAqY29tbWFuZF9saW5lKQotewotCXNpemVfdCBsZW4sIHhsZW4gPSAwLCBpbGVuID0gMDsKLQotCWlmIChleHRyYV9jb21tYW5kX2xpbmUpCi0JCXhsZW4gPSBzdHJsZW4oZXh0cmFfY29tbWFuZF9saW5lKTsKLQlpZiAoZXh0cmFfaW5pdF9hcmdzKQotCQlpbGVuID0gc3RybGVuKGV4dHJhX2luaXRfYXJncykgKyA0OyAvKiBmb3IgIiAtLSAiICovCi0KLQlsZW4gPSB4bGVuICsgc3RybGVuKGJvb3RfY29tbWFuZF9saW5lKSArIDE7Ci0KLQlzYXZlZF9jb21tYW5kX2xpbmUgPSBtZW1ibG9ja19hbGxvYyhsZW4gKyBpbGVuLCBTTVBfQ0FDSEVfQllURVMpOwotCWlmICghc2F2ZWRfY29tbWFuZF9saW5lKQotCQlwYW5pYygiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSAlenUgYnl0ZXNcbiIsIF9fZnVuY19fLCBsZW4gKyBpbGVuKTsKLQotCXN0YXRpY19jb21tYW5kX2xpbmUgPSBtZW1ibG9ja19hbGxvYyhsZW4sIFNNUF9DQUNIRV9CWVRFUyk7Ci0JaWYgKCFzdGF0aWNfY29tbWFuZF9saW5lKQotCQlwYW5pYygiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSAlenUgYnl0ZXNcbiIsIF9fZnVuY19fLCBsZW4pOwotCi0JaWYgKHhsZW4pIHsKLQkJLyoKLQkJICogV2UgaGF2ZSB0byBwdXQgZXh0cmFfY29tbWFuZF9saW5lIGJlZm9yZSBib290IGNvbW1hbmQKLQkJICogbGluZXMgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBkYXNoZXMgKHNlcGFyYXRvciBvZiBpbml0Ci0JCSAqIGNvbW1hbmQgbGluZSkgaW4gdGhlIGNvbW1hbmQgbGluZXMuCi0JCSAqLwotCQlzdHJjcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBleHRyYV9jb21tYW5kX2xpbmUpOwotCQlzdHJjcHkoc3RhdGljX2NvbW1hbmRfbGluZSwgZXh0cmFfY29tbWFuZF9saW5lKTsKLQl9Ci0Jc3RyY3B5KHNhdmVkX2NvbW1hbmRfbGluZSArIHhsZW4sIGJvb3RfY29tbWFuZF9saW5lKTsKLQlzdHJjcHkoc3RhdGljX2NvbW1hbmRfbGluZSArIHhsZW4sIGNvbW1hbmRfbGluZSk7Ci0KLQlpZiAoaWxlbikgewotCQkvKgotCQkgKiBBcHBlbmQgc3VwcGxlbWVudGFsIGluaXQgYm9vdCBhcmdzIHRvIHNhdmVkX2NvbW1hbmRfbGluZQotCQkgKiBzbyB0aGF0IHVzZXIgY2FuIGNoZWNrIHdoYXQgY29tbWFuZCBsaW5lIG9wdGlvbnMgcGFzc2VkCi0JCSAqIHRvIGluaXQuCi0JCSAqLwotCQlsZW4gPSBzdHJsZW4oc2F2ZWRfY29tbWFuZF9saW5lKTsKLQkJaWYgKGluaXRhcmdzX2ZvdW5kKSB7Ci0JCQlzYXZlZF9jb21tYW5kX2xpbmVbbGVuKytdID0gJyAnOwotCQl9IGVsc2UgewotCQkJc3RyY3B5KHNhdmVkX2NvbW1hbmRfbGluZSArIGxlbiwgIiAtLSAiKTsKLQkJCWxlbiArPSA0OwotCQl9Ci0KLQkJc3RyY3B5KHNhdmVkX2NvbW1hbmRfbGluZSArIGxlbiwgZXh0cmFfaW5pdF9hcmdzKTsKLQl9Ci19Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIGZpbmFsaXplIGluIGEgbm9uLV9faW5pdCBmdW5jdGlvbiBvciBlbHNlIHJhY2UgY29uZGl0aW9ucwotICogYmV0d2VlbiB0aGUgcm9vdCB0aHJlYWQgYW5kIHRoZSBpbml0IHRocmVhZCBtYXkgY2F1c2Ugc3RhcnRfa2VybmVsIHRvCi0gKiBiZSByZWFwZWQgYnkgZnJlZV9pbml0bWVtIGJlZm9yZSB0aGUgcm9vdCB0aHJlYWQgaGFzIHByb2NlZWRlZCB0bwotICogY3B1X2lkbGUuCi0gKgotICogZ2NjLTMuNCBhY2NpZGVudGFsbHkgaW5saW5lcyB0aGlzIGZ1bmN0aW9uLCBzbyB1c2Ugbm9pbmxpbmUuCi0gKi8KLQotc3RhdGljIF9faW5pdGRhdGEgREVDTEFSRV9DT01QTEVUSU9OKGt0aHJlYWRkX2RvbmUpOwotCi1ub2lubGluZSB2b2lkIF9fcmVmIHJlc3RfaW5pdCh2b2lkKQotewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCWludCBwaWQ7Ci0KLQlyY3Vfc2NoZWR1bGVyX3N0YXJ0aW5nKCk7Ci0JLyoKLQkgKiBXZSBuZWVkIHRvIHNwYXduIGluaXQgZmlyc3Qgc28gdGhhdCBpdCBvYnRhaW5zIHBpZCAxLCBob3dldmVyCi0JICogdGhlIGluaXQgdGFzayB3aWxsIGVuZCB1cCB3YW50aW5nIHRvIGNyZWF0ZSBrdGhyZWFkcywgd2hpY2gsIGlmCi0JICogd2Ugc2NoZWR1bGUgaXQgYmVmb3JlIHdlIGNyZWF0ZSBrdGhyZWFkZCwgd2lsbCBPT1BTLgotCSAqLwotCXBpZCA9IGtlcm5lbF90aHJlYWQoa2VybmVsX2luaXQsIE5VTEwsIENMT05FX0ZTKTsKLQkvKgotCSAqIFBpbiBpbml0IG9uIHRoZSBib290IENQVS4gVGFzayBtaWdyYXRpb24gaXMgbm90IHByb3Blcmx5IHdvcmtpbmcKLQkgKiB1bnRpbCBzY2hlZF9pbml0X3NtcCgpIGhhcyBiZWVuIHJ1bi4gSXQgd2lsbCBzZXQgdGhlIGFsbG93ZWQKLQkgKiBDUFVzIGZvciBpbml0IHRvIHRoZSBub24gaXNvbGF0ZWQgQ1BVcy4KLQkgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JdHNrID0gZmluZF90YXNrX2J5X3BpZF9ucyhwaWQsICZpbml0X3BpZF9ucyk7Ci0Jc2V0X2NwdXNfYWxsb3dlZF9wdHIodHNrLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JbnVtYV9kZWZhdWx0X3BvbGljeSgpOwotCXBpZCA9IGtlcm5lbF90aHJlYWQoa3RocmVhZGQsIE5VTEwsIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMpOwotCXJjdV9yZWFkX2xvY2soKTsKLQlrdGhyZWFkZF90YXNrID0gZmluZF90YXNrX2J5X3BpZF9ucyhwaWQsICZpbml0X3BpZF9ucyk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkvKgotCSAqIEVuYWJsZSBtaWdodF9zbGVlcCgpIGFuZCBzbXBfcHJvY2Vzc29yX2lkKCkgY2hlY2tzLgotCSAqIFRoZXkgY2Fubm90IGJlIGVuYWJsZWQgZWFybGllciBiZWNhdXNlIHdpdGggQ09ORklHX1BSRUVNUFRJT049eQotCSAqIGtlcm5lbF90aHJlYWQoKSB3b3VsZCB0cmlnZ2VyIG1pZ2h0X3NsZWVwKCkgc3BsYXRzLiBXaXRoCi0JICogQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkgdGhlIGluaXQgdGFzayBtaWdodCBoYXZlIHNjaGVkdWxlZAotCSAqIGFscmVhZHksIGJ1dCBpdCdzIHN0dWNrIG9uIHRoZSBrdGhyZWFkZF9kb25lIGNvbXBsZXRpb24uCi0JICovCi0Jc3lzdGVtX3N0YXRlID0gU1lTVEVNX1NDSEVEVUxJTkc7Ci0KLQljb21wbGV0ZSgma3RocmVhZGRfZG9uZSk7Ci0KLQkvKgotCSAqIFRoZSBib290IGlkbGUgdGhyZWFkIG11c3QgZXhlY3V0ZSBzY2hlZHVsZSgpCi0JICogYXQgbGVhc3Qgb25jZSB0byBnZXQgdGhpbmdzIG1vdmluZzoKLQkgKi8KLQlzY2hlZHVsZV9wcmVlbXB0X2Rpc2FibGVkKCk7Ci0JLyogQ2FsbCBpbnRvIGNwdV9pZGxlIHdpdGggcHJlZW1wdCBkaXNhYmxlZCAqLwotCWNwdV9zdGFydHVwX2VudHJ5KENQVUhQX09OTElORSk7Ci19Ci0KLS8qIENoZWNrIGZvciBlYXJseSBwYXJhbXMuICovCi1zdGF0aWMgaW50IF9faW5pdCBkb19lYXJseV9wYXJhbShjaGFyICpwYXJhbSwgY2hhciAqdmFsLAotCQkJCSBjb25zdCBjaGFyICp1bnVzZWQsIHZvaWQgKmFyZykKLXsKLQljb25zdCBzdHJ1Y3Qgb2JzX2tlcm5lbF9wYXJhbSAqcDsKLQotCWZvciAocCA9IF9fc2V0dXBfc3RhcnQ7IHAgPCBfX3NldHVwX2VuZDsgcCsrKSB7Ci0JCWlmICgocC0+ZWFybHkgJiYgcGFyYW1lcShwYXJhbSwgcC0+c3RyKSkgfHwKLQkJICAgIChzdHJjbXAocGFyYW0sICJjb25zb2xlIikgPT0gMCAmJgotCQkgICAgIHN0cmNtcChwLT5zdHIsICJlYXJseWNvbiIpID09IDApCi0JCSkgewotCQkJaWYgKHAtPnNldHVwX2Z1bmModmFsKSAhPSAwKQotCQkJCXByX3dhcm4oIk1hbGZvcm1lZCBlYXJseSBvcHRpb24gJyVzJ1xuIiwgcGFyYW0pOwotCQl9Ci0JfQotCS8qIFdlIGFjY2VwdCBldmVyeXRoaW5nIGF0IHRoaXMgc3RhZ2UuICovCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IHBhcnNlX2Vhcmx5X29wdGlvbnMoY2hhciAqY21kbGluZSkKLXsKLQlwYXJzZV9hcmdzKCJlYXJseSBvcHRpb25zIiwgY21kbGluZSwgTlVMTCwgMCwgMCwgMCwgTlVMTCwKLQkJICAgZG9fZWFybHlfcGFyYW0pOwotfQotCi0vKiBBcmNoIGNvZGUgY2FsbHMgdGhpcyBlYXJseSBvbiwgb3IgaWYgbm90LCBqdXN0IGJlZm9yZSBvdGhlciBwYXJzaW5nLiAqLwotdm9pZCBfX2luaXQgcGFyc2VfZWFybHlfcGFyYW0odm9pZCkKLXsKLQlzdGF0aWMgaW50IGRvbmUgX19pbml0ZGF0YTsKLQlzdGF0aWMgY2hhciB0bXBfY21kbGluZVtDT01NQU5EX0xJTkVfU0laRV0gX19pbml0ZGF0YTsKLQotCWlmIChkb25lKQotCQlyZXR1cm47Ci0KLQkvKiBBbGwgZmFsbCB0aHJvdWdoIHRvIGRvX2Vhcmx5X3BhcmFtLiAqLwotCXN0cmxjcHkodG1wX2NtZGxpbmUsIGJvb3RfY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JcGFyc2VfZWFybHlfb3B0aW9ucyh0bXBfY21kbGluZSk7Ci0JZG9uZSA9IDE7Ci19Ci0KLXZvaWQgX19pbml0IF9fd2VhayBhcmNoX3Bvc3RfYWNwaV9zdWJzeXNfaW5pdCh2b2lkKSB7IH0KLQotdm9pZCBfX2luaXQgX193ZWFrIHNtcF9zZXR1cF9wcm9jZXNzb3JfaWQodm9pZCkKLXsKLX0KLQotIyBpZiBUSFJFQURfU0laRSA+PSBQQUdFX1NJWkUKLXZvaWQgX19pbml0IF9fd2VhayB0aHJlYWRfc3RhY2tfY2FjaGVfaW5pdCh2b2lkKQotewotfQotI2VuZGlmCi0KLXZvaWQgX19pbml0IF9fd2VhayBtZW1fZW5jcnlwdF9pbml0KHZvaWQpIHsgfQotCi12b2lkIF9faW5pdCBfX3dlYWsgcG9raW5nX2luaXQodm9pZCkgeyB9Ci0KLXZvaWQgX19pbml0IF9fd2VhayBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCkgeyB9Ci0KLWJvb2wgaW5pdGNhbGxfZGVidWc7Ci1jb3JlX3BhcmFtKGluaXRjYWxsX2RlYnVnLCBpbml0Y2FsbF9kZWJ1ZywgYm9vbCwgMDY0NCk7Ci0KLSNpZmRlZiBUUkFDRVBPSU5UU19FTkFCTEVECi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdGNhbGxfZGVidWdfZW5hYmxlKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0Y2FsbF9kZWJ1Z19lbmFibGUodm9pZCkKLXsKLX0KLSNlbmRpZgotCi0vKiBSZXBvcnQgbWVtb3J5IGF1dG8taW5pdGlhbGl6YXRpb24gc3RhdGVzIGZvciB0aGlzIGJvb3QuICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVwb3J0X21lbWluaXQodm9pZCkKLXsKLQljb25zdCBjaGFyICpzdGFjazsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JTklUX1NUQUNLX0FMTF9QQVRURVJOKSkKLQkJc3RhY2sgPSAiYWxsKHBhdHRlcm4pIjsKLQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19JTklUX1NUQUNLX0FMTF9aRVJPKSkKLQkJc3RhY2sgPSAiYWxsKHplcm8pIjsKLQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19HQ0NfUExVR0lOX1NUUlVDVExFQUtfQllSRUZfQUxMKSkKLQkJc3RhY2sgPSAiYnlyZWZfYWxsKHplcm8pIjsKLQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19HQ0NfUExVR0lOX1NUUlVDVExFQUtfQllSRUYpKQotCQlzdGFjayA9ICJieXJlZih6ZXJvKSI7Ci0JZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfR0NDX1BMVUdJTl9TVFJVQ1RMRUFLX1VTRVIpKQotCQlzdGFjayA9ICJfX3VzZXIoemVybykiOwotCWVsc2UKLQkJc3RhY2sgPSAib2ZmIjsKLQotCXByX2luZm8oIm1lbSBhdXRvLWluaXQ6IHN0YWNrOiVzLCBoZWFwIGFsbG9jOiVzLCBoZWFwIGZyZWU6JXNcbiIsCi0JCXN0YWNrLCB3YW50X2luaXRfb25fYWxsb2MoR0ZQX0tFUk5FTCkgPyAib24iIDogIm9mZiIsCi0JCXdhbnRfaW5pdF9vbl9mcmVlKCkgPyAib24iIDogIm9mZiIpOwotCWlmICh3YW50X2luaXRfb25fZnJlZSgpKQotCQlwcl9pbmZvKCJtZW0gYXV0by1pbml0OiBjbGVhcmluZyBzeXN0ZW0gbWVtb3J5IG1heSB0YWtlIHNvbWUgdGltZS4uLlxuIik7Ci19Ci0KLS8qCi0gKiBTZXQgdXAga2VybmVsIG1lbW9yeSBhbGxvY2F0b3JzCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBtbV9pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBwYWdlX2V4dCByZXF1aXJlcyBjb250aWd1b3VzIHBhZ2VzLAotCSAqIGJpZ2dlciB0aGFuIE1BWF9PUkRFUiB1bmxlc3MgU1BBUlNFTUVNLgotCSAqLwotCXBhZ2VfZXh0X2luaXRfZmxhdG1lbSgpOwotCWluaXRfZGVidWdfcGFnZWFsbG9jKCk7Ci0JcmVwb3J0X21lbWluaXQoKTsKLQltZW1faW5pdCgpOwotCWttZW1fY2FjaGVfaW5pdCgpOwotCWttZW1sZWFrX2luaXQoKTsKLQlwZ3RhYmxlX2luaXQoKTsKLQlkZWJ1Z19vYmplY3RzX21lbV9pbml0KCk7Ci0Jdm1hbGxvY19pbml0KCk7Ci0JaW9yZW1hcF9odWdlX2luaXQoKTsKLQkvKiBTaG91bGQgYmUgcnVuIGJlZm9yZSB0aGUgZmlyc3Qgbm9uLWluaXQgdGhyZWFkIGlzIGNyZWF0ZWQgKi8KLQlpbml0X2VzcGZpeF9ic3AoKTsKLQkvKiBTaG91bGQgYmUgcnVuIGFmdGVyIGVzcGZpeDY0IGlzIHNldCB1cC4gKi8KLQlwdGlfaW5pdCgpOwotfQotCi12b2lkIF9faW5pdCBfX3dlYWsgYXJjaF9jYWxsX3Jlc3RfaW5pdCh2b2lkKQotewotCXJlc3RfaW5pdCgpOwotfQotCi12b2lkIF9fd2VhayBlYXJseV9kcnZfaW5pdCh2b2lkKSB7fQotCi1hc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCBfX25vX3Nhbml0aXplX2FkZHJlc3Mgc3RhcnRfa2VybmVsKHZvaWQpCi17Ci0JY2hhciAqY29tbWFuZF9saW5lOwotCWNoYXIgKmFmdGVyX2Rhc2hlczsKLQotCXNldF90YXNrX3N0YWNrX2VuZF9tYWdpYygmaW5pdF90YXNrKTsKLQlzbXBfc2V0dXBfcHJvY2Vzc29yX2lkKCk7Ci0JZGVidWdfb2JqZWN0c19lYXJseV9pbml0KCk7Ci0KLQljZ3JvdXBfaW5pdF9lYXJseSgpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQllYXJseV9ib290X2lycXNfZGlzYWJsZWQgPSB0cnVlOwotCi0JLyoKLQkgKiBJbnRlcnJ1cHRzIGFyZSBzdGlsbCBkaXNhYmxlZC4gRG8gbmVjZXNzYXJ5IHNldHVwcywgdGhlbgotCSAqIGVuYWJsZSB0aGVtLgotCSAqLwotCWJvb3RfY3B1X2luaXQoKTsKLQlwYWdlX2FkZHJlc3NfaW5pdCgpOwotCXByX25vdGljZSgiJXMiLCBsaW51eF9iYW5uZXIpOwotCWVhcmx5X3NlY3VyaXR5X2luaXQoKTsKLQlzZXR1cF9hcmNoKCZjb21tYW5kX2xpbmUpOwotCXNldHVwX2Jvb3RfY29uZmlnKGNvbW1hbmRfbGluZSk7Ci0Jc2V0dXBfY29tbWFuZF9saW5lKGNvbW1hbmRfbGluZSk7Ci0Jc2V0dXBfbnJfY3B1X2lkcygpOwotCXNldHVwX3Blcl9jcHVfYXJlYXMoKTsKLQlzbXBfcHJlcGFyZV9ib290X2NwdSgpOwkvKiBhcmNoLXNwZWNpZmljIGJvb3QtY3B1IGhvb2tzICovCi0JYm9vdF9jcHVfaG90cGx1Z19pbml0KCk7Ci0KLQlidWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpOwotCXBhZ2VfYWxsb2NfaW5pdCgpOwotCi0JcHJfbm90aWNlKCJLZXJuZWwgY29tbWFuZCBsaW5lOiAlc1xuIiwgc2F2ZWRfY29tbWFuZF9saW5lKTsKLQkvKiBwYXJhbWV0ZXJzIG1heSBzZXQgc3RhdGljIGtleXMgKi8KLQlqdW1wX2xhYmVsX2luaXQoKTsKLQlwYXJzZV9lYXJseV9wYXJhbSgpOwotCWFmdGVyX2Rhc2hlcyA9IHBhcnNlX2FyZ3MoIkJvb3Rpbmcga2VybmVsIiwKLQkJCQkgIHN0YXRpY19jb21tYW5kX2xpbmUsIF9fc3RhcnRfX19wYXJhbSwKLQkJCQkgIF9fc3RvcF9fX3BhcmFtIC0gX19zdGFydF9fX3BhcmFtLAotCQkJCSAgLTEsIC0xLCBOVUxMLCAmdW5rbm93bl9ib290b3B0aW9uKTsKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFmdGVyX2Rhc2hlcykpCi0JCXBhcnNlX2FyZ3MoIlNldHRpbmcgaW5pdCBhcmdzIiwgYWZ0ZXJfZGFzaGVzLCBOVUxMLCAwLCAtMSwgLTEsCi0JCQkgICBOVUxMLCBzZXRfaW5pdF9hcmcpOwotCWlmIChleHRyYV9pbml0X2FyZ3MpCi0JCXBhcnNlX2FyZ3MoIlNldHRpbmcgZXh0cmEgaW5pdCBhcmdzIiwgZXh0cmFfaW5pdF9hcmdzLAotCQkJICAgTlVMTCwgMCwgLTEsIC0xLCBOVUxMLCBzZXRfaW5pdF9hcmcpOwotCi0JLyoKLQkgKiBUaGVzZSB1c2UgbGFyZ2UgYm9vdG1lbSBhbGxvY2F0aW9ucyBhbmQgbXVzdCBwcmVjZWRlCi0JICoga21lbV9jYWNoZV9pbml0KCkKLQkgKi8KLQlzZXR1cF9sb2dfYnVmKDApOwotCXZmc19jYWNoZXNfaW5pdF9lYXJseSgpOwotCXNvcnRfbWFpbl9leHRhYmxlKCk7Ci0JdHJhcF9pbml0KCk7Ci0JbW1faW5pdCgpOwotCi0JZnRyYWNlX2luaXQoKTsKLQotCS8qIHRyYWNlX3ByaW50ayBjYW4gYmUgZW5hYmxlZCBoZXJlICovCi0JZWFybHlfdHJhY2VfaW5pdCgpOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIHNjaGVkdWxlciBwcmlvciBzdGFydGluZyBhbnkgaW50ZXJydXB0cyAoc3VjaCBhcyB0aGUKLQkgKiB0aW1lciBpbnRlcnJ1cHQpLiBGdWxsIHRvcG9sb2d5IHNldHVwIGhhcHBlbnMgYXQgc21wX2luaXQoKQotCSAqIHRpbWUgLSBidXQgbWVhbndoaWxlIHdlIHN0aWxsIGhhdmUgYSBmdW5jdGlvbmluZyBzY2hlZHVsZXIuCi0JICovCi0Jc2NoZWRfaW5pdCgpOwotCi0JaWYgKFdBUk4oIWlycXNfZGlzYWJsZWQoKSwKLQkJICJJbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCAqdmVyeSogZWFybHksIGZpeGluZyBpdFxuIikpCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JcmFkaXhfdHJlZV9pbml0KCk7Ci0KLQkvKgotCSAqIFNldCB1cCBob3VzZWtlZXBpbmcgYmVmb3JlIHNldHRpbmcgdXAgd29ya3F1ZXVlcyB0byBhbGxvdyB0aGUgdW5ib3VuZAotCSAqIHdvcmtxdWV1ZSB0byB0YWtlIG5vbi1ob3VzZWtlZXBpbmcgaW50byBhY2NvdW50LgotCSAqLwotCWhvdXNla2VlcGluZ19pbml0KCk7Ci0KLQkvKgotCSAqIEFsbG93IHdvcmtxdWV1ZSBjcmVhdGlvbiBhbmQgd29yayBpdGVtIHF1ZXVlaW5nL2NhbmNlbGxpbmcKLQkgKiBlYXJseS4gIFdvcmsgaXRlbSBleGVjdXRpb24gZGVwZW5kcyBvbiBrdGhyZWFkcyBhbmQgc3RhcnRzIGFmdGVyCi0JICogd29ya3F1ZXVlX2luaXQoKS4KLQkgKi8KLQl3b3JrcXVldWVfaW5pdF9lYXJseSgpOwotCi0JcmN1X2luaXQoKTsKLQotCS8qIFRyYWNlIGV2ZW50cyBhcmUgYXZhaWxhYmxlIGFmdGVyIHRoaXMgKi8KLQl0cmFjZV9pbml0KCk7Ci0KLQlpZiAoaW5pdGNhbGxfZGVidWcpCi0JCWluaXRjYWxsX2RlYnVnX2VuYWJsZSgpOwotCi0JY29udGV4dF90cmFja2luZ19pbml0KCk7Ci0KLQllYXJseV9kcnZfaW5pdCgpOwotCQotCS8qIGluaXQgc29tZSBsaW5rcyBiZWZvcmUgaW5pdF9JU0FfaXJxcygpICovCi0JZWFybHlfaXJxX2luaXQoKTsKLQlpbml0X0lSUSgpOwotCXRpY2tfaW5pdCgpOwotCXJjdV9pbml0X25vaHooKTsKLQlpbml0X3RpbWVycygpOwotCWhydGltZXJzX2luaXQoKTsKLQlzb2Z0aXJxX2luaXQoKTsKLQl0aW1la2VlcGluZ19pbml0KCk7Ci0JdGltZV9pbml0KCk7Ci0KLQkvKgotCSAqIEZvciBiZXN0IGluaXRpYWwgc3RhY2sgY2FuYXJ5IGVudHJvcHksIHByZXBhcmUgaXQgYWZ0ZXI6Ci0JICogLSBzZXR1cF9hcmNoKCkgZm9yIGFueSBVRUZJIFJORyBlbnRyb3B5IGFuZCBib290IGNtZGxpbmUgYWNjZXNzCi0JICogLSB0aW1la2VlcGluZ19pbml0KCkgZm9yIGt0aW1lIGVudHJvcHkgdXNlZCBpbiByYW5kb21faW5pdCgpCi0JICogLSB0aW1lX2luaXQoKSBmb3IgbWFraW5nIHJhbmRvbV9nZXRfZW50cm9weSgpIHdvcmsgb24gc29tZSBwbGF0Zm9ybXMKLQkgKiAtIHJhbmRvbV9pbml0KCkgdG8gaW5pdGlhbGl6ZSB0aGUgUk5HIGZyb20gZnJvbSBlYXJseSBlbnRyb3B5IHNvdXJjZXMKLQkgKi8KLQlyYW5kb21faW5pdChjb21tYW5kX2xpbmUpOwotCWJvb3RfaW5pdF9zdGFja19jYW5hcnkoKTsKLQotCXBlcmZfZXZlbnRfaW5pdCgpOwotCXByb2ZpbGVfaW5pdCgpOwotCWNhbGxfZnVuY3Rpb25faW5pdCgpOwotCVdBUk4oIWlycXNfZGlzYWJsZWQoKSwgIkludGVycnVwdHMgd2VyZSBlbmFibGVkIGVhcmx5XG4iKTsKLQotCWVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCA9IGZhbHNlOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCWttZW1fY2FjaGVfaW5pdF9sYXRlKCk7Ci0KLQkvKgotCSAqIEhBQ0sgQUxFUlQhIFRoaXMgaXMgZWFybHkuIFdlJ3JlIGVuYWJsaW5nIHRoZSBjb25zb2xlIGJlZm9yZQotCSAqIHdlJ3ZlIGRvbmUgUENJIHNldHVwcyBldGMsIGFuZCBjb25zb2xlX2luaXQoKSBtdXN0IGJlIGF3YXJlIG9mCi0JICogdGhpcy4gQnV0IHdlIGRvIHdhbnQgb3V0cHV0IGVhcmx5LCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nLgotCSAqLwotCWNvbnNvbGVfaW5pdCgpOwotCWlmIChwYW5pY19sYXRlcikKLQkJcGFuaWMoIlRvbyBtYW55IGJvb3QgJXMgdmFycyBhdCBgJXMnIiwgcGFuaWNfbGF0ZXIsCi0JCSAgICAgIHBhbmljX3BhcmFtKTsKLQotCWxvY2tkZXBfaW5pdCgpOwotCi0JLyoKLQkgKiBOZWVkIHRvIHJ1biB0aGlzIHdoZW4gaXJxcyBhcmUgZW5hYmxlZCwgYmVjYXVzZSBpdCB3YW50cwotCSAqIHRvIHNlbGYtdGVzdCBbaGFyZC9zb2Z0XS1pcnFzIG9uL29mZiBsb2NrIGludmVyc2lvbiBidWdzCi0JICogdG9vOgotCSAqLwotCWxvY2tpbmdfc2VsZnRlc3QoKTsKLQotCS8qCi0JICogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIGFueSBkZXZpY2VzIHBlcmZvcm0gRE1BCi0JICogb3BlcmF0aW9ucyB0aGF0IG1pZ2h0IHVzZSB0aGUgU1dJT1RMQiBib3VuY2UgYnVmZmVycy4gSXQgd2lsbAotCSAqIG1hcmsgdGhlIGJvdW5jZSBidWZmZXJzIGFzIGRlY3J5cHRlZCBzbyB0aGF0IHRoZWlyIHVzYWdlIHdpbGwKLQkgKiBub3QgY2F1c2UgInBsYWluLXRleHQiIGRhdGEgdG8gYmUgZGVjcnlwdGVkIHdoZW4gYWNjZXNzZWQuCi0JICovCi0JbWVtX2VuY3J5cHRfaW5pdCgpOwotCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JaWYgKGluaXRyZF9zdGFydCAmJiAhaW5pdHJkX2JlbG93X3N0YXJ0X29rICYmCi0JICAgIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZSgodm9pZCAqKWluaXRyZF9zdGFydCkpIDwgbWluX2xvd19wZm4pIHsKLQkJcHJfY3JpdCgiaW5pdHJkIG92ZXJ3cml0dGVuICgweCUwOGx4IDwgMHglMDhseCkgLSBkaXNhYmxpbmcgaXQuXG4iLAotCQkgICAgcGFnZV90b19wZm4odmlydF90b19wYWdlKCh2b2lkICopaW5pdHJkX3N0YXJ0KSksCi0JCSAgICBtaW5fbG93X3Bmbik7Ci0JCWluaXRyZF9zdGFydCA9IDA7Ci0JfQotI2VuZGlmCi0Jc2V0dXBfcGVyX2NwdV9wYWdlc2V0KCk7Ci0JbnVtYV9wb2xpY3lfaW5pdCgpOwotCWFjcGlfZWFybHlfaW5pdCgpOwotCWlmIChsYXRlX3RpbWVfaW5pdCkKLQkJbGF0ZV90aW1lX2luaXQoKTsKLQlzY2hlZF9jbG9ja19pbml0KCk7Ci0JY2FsaWJyYXRlX2RlbGF5KCk7Ci0JcGlkX2lkcl9pbml0KCk7Ci0JYW5vbl92bWFfaW5pdCgpOwotI2lmZGVmIENPTkZJR19YODYKLQlpZiAoZWZpX2VuYWJsZWQoRUZJX1JVTlRJTUVfU0VSVklDRVMpKQotCQllZmlfZW50ZXJfdmlydHVhbF9tb2RlKCk7Ci0jZW5kaWYKLQl0aHJlYWRfc3RhY2tfY2FjaGVfaW5pdCgpOwotCWNyZWRfaW5pdCgpOwotCWZvcmtfaW5pdCgpOwotCXByb2NfY2FjaGVzX2luaXQoKTsKLQl1dHNfbnNfaW5pdCgpOwotCWJ1ZmZlcl9pbml0KCk7Ci0Ja2V5X2luaXQoKTsKLQlzZWN1cml0eV9pbml0KCk7Ci0JZGJnX2xhdGVfaW5pdCgpOwotCXZmc19jYWNoZXNfaW5pdCgpOwotCXBhZ2VjYWNoZV9pbml0KCk7Ci0Jc2lnbmFsc19pbml0KCk7Ci0Jc2VxX2ZpbGVfaW5pdCgpOwotCXByb2Nfcm9vdF9pbml0KCk7Ci0JbnNmc19pbml0KCk7Ci0JY3B1c2V0X2luaXQoKTsKLQljZ3JvdXBfaW5pdCgpOwotCXRhc2tzdGF0c19pbml0X2Vhcmx5KCk7Ci0JZGVsYXlhY2N0X2luaXQoKTsKLQotCXBva2luZ19pbml0KCk7Ci0JY2hlY2tfYnVncygpOwotCi0JYWNwaV9zdWJzeXN0ZW1faW5pdCgpOwotCWFyY2hfcG9zdF9hY3BpX3N1YnN5c19pbml0KCk7Ci0Jc2ZpX2luaXRfbGF0ZSgpOwotCWtjc2FuX2luaXQoKTsKLQotCS8qIERvIHRoZSByZXN0IG5vbi1fX2luaXQnZWQsIHdlJ3JlIG5vdyBhbGl2ZSAqLwotCWFyY2hfY2FsbF9yZXN0X2luaXQoKTsKLQotCXByZXZlbnRfdGFpbF9jYWxsX29wdGltaXphdGlvbigpOwotfQotCi0vKiBDYWxsIGFsbCBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgbGlua2VkIGludG8gdGhlIGtlcm5lbC4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBkb19jdG9ycyh2b2lkKQotewotI2lmZGVmIENPTkZJR19DT05TVFJVQ1RPUlMKLQljdG9yX2ZuX3QgKmZuID0gKGN0b3JfZm5fdCAqKSBfX2N0b3JzX3N0YXJ0OwotCi0JZm9yICg7IGZuIDwgKGN0b3JfZm5fdCAqKSBfX2N0b3JzX2VuZDsgZm4rKykKLQkJKCpmbikoKTsKLSNlbmRpZgotfQotCi0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi1zdHJ1Y3QgYmxhY2tsaXN0X2VudHJ5IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7Ci0JY2hhciAqYnVmOwotfTsKLQotc3RhdGljIF9faW5pdGRhdGFfb3JfbW9kdWxlIExJU1RfSEVBRChibGFja2xpc3RlZF9pbml0Y2FsbHMpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0Y2FsbF9ibGFja2xpc3QoY2hhciAqc3RyKQotewotCWNoYXIgKnN0cl9lbnRyeTsKLQlzdHJ1Y3QgYmxhY2tsaXN0X2VudHJ5ICplbnRyeTsKLQotCS8qIHN0ciBhcmd1bWVudCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGZ1bmN0aW9ucyAqLwotCWRvIHsKLQkJc3RyX2VudHJ5ID0gc3Ryc2VwKCZzdHIsICIsIik7Ci0JCWlmIChzdHJfZW50cnkpIHsKLQkJCXByX2RlYnVnKCJibGFja2xpc3RpbmcgaW5pdGNhbGwgJXNcbiIsIHN0cl9lbnRyeSk7Ci0JCQllbnRyeSA9IG1lbWJsb2NrX2FsbG9jKHNpemVvZigqZW50cnkpLAotCQkJCQkgICAgICAgU01QX0NBQ0hFX0JZVEVTKTsKLQkJCWlmICghZW50cnkpCi0JCQkJcGFuaWMoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzXG4iLAotCQkJCSAgICAgIF9fZnVuY19fLCBzaXplb2YoKmVudHJ5KSk7Ci0JCQllbnRyeS0+YnVmID0gbWVtYmxvY2tfYWxsb2Moc3RybGVuKHN0cl9lbnRyeSkgKyAxLAotCQkJCQkJICAgIFNNUF9DQUNIRV9CWVRFUyk7Ci0JCQlpZiAoIWVudHJ5LT5idWYpCi0JCQkJcGFuaWMoIiVzOiBGYWlsZWQgdG8gYWxsb2NhdGUgJXp1IGJ5dGVzXG4iLAotCQkJCSAgICAgIF9fZnVuY19fLCBzdHJsZW4oc3RyX2VudHJ5KSArIDEpOwotCQkJc3RyY3B5KGVudHJ5LT5idWYsIHN0cl9lbnRyeSk7Ci0JCQlsaXN0X2FkZCgmZW50cnktPm5leHQsICZibGFja2xpc3RlZF9pbml0Y2FsbHMpOwotCQl9Ci0JfSB3aGlsZSAoc3RyX2VudHJ5KTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgYm9vbCBfX2luaXRfb3JfbW9kdWxlIGluaXRjYWxsX2JsYWNrbGlzdGVkKGluaXRjYWxsX3QgZm4pCi17Ci0Jc3RydWN0IGJsYWNrbGlzdF9lbnRyeSAqZW50cnk7Ci0JY2hhciBmbl9uYW1lW0tTWU1fU1lNQk9MX0xFTl07Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JaWYgKGxpc3RfZW1wdHkoJmJsYWNrbGlzdGVkX2luaXRjYWxscykpCi0JCXJldHVybiBmYWxzZTsKLQotCWFkZHIgPSAodW5zaWduZWQgbG9uZykgZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcihmbik7Ci0Jc3ByaW50X3N5bWJvbF9ub19vZmZzZXQoZm5fbmFtZSwgYWRkcik7Ci0KLQkvKgotCSAqIGZuIHdpbGwgYmUgImZ1bmN0aW9uX25hbWUgW21vZHVsZV9uYW1lXSIgd2hlcmUgW21vZHVsZV9uYW1lXSBpcyBub3QKLQkgKiBkaXNwbGF5ZWQgZm9yIGJ1aWx0LWluIGluaXQgZnVuY3Rpb25zLiAgU3RyaXAgb2ZmIHRoZSBbbW9kdWxlX25hbWVdLgotCSAqLwotCXN0cnJlcGxhY2UoZm5fbmFtZSwgJyAnLCAnXDAnKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZibGFja2xpc3RlZF9pbml0Y2FsbHMsIG5leHQpIHsKLQkJaWYgKCFzdHJjbXAoZm5fbmFtZSwgZW50cnktPmJ1ZikpIHsKLQkJCXByX2RlYnVnKCJpbml0Y2FsbCAlcyBibGFja2xpc3RlZFxuIiwgZm5fbmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IF9faW5pdCBpbml0Y2FsbF9ibGFja2xpc3QoY2hhciAqc3RyKQotewotCXByX3dhcm4oImluaXRjYWxsX2JsYWNrbGlzdCByZXF1aXJlcyBDT05GSUdfS0FMTFNZTVNcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBfX2luaXRfb3JfbW9kdWxlIGluaXRjYWxsX2JsYWNrbGlzdGVkKGluaXRjYWxsX3QgZm4pCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotI2VuZGlmCi1fX3NldHVwKCJpbml0Y2FsbF9ibGFja2xpc3Q9IiwgaW5pdGNhbGxfYmxhY2tsaXN0KTsKLQotc3RhdGljIF9faW5pdF9vcl9tb2R1bGUgdm9pZAotdHJhY2VfaW5pdGNhbGxfc3RhcnRfY2Iodm9pZCAqZGF0YSwgaW5pdGNhbGxfdCBmbikKLXsKLQlrdGltZV90ICpjYWxsdGltZSA9IChrdGltZV90ICopZGF0YTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nICAlcFMgQCAlaVxuIiwgZm4sIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKLQkqY2FsbHRpbWUgPSBrdGltZV9nZXQoKTsKLX0KLQotc3RhdGljIF9faW5pdF9vcl9tb2R1bGUgdm9pZAotdHJhY2VfaW5pdGNhbGxfZmluaXNoX2NiKHZvaWQgKmRhdGEsIGluaXRjYWxsX3QgZm4sIGludCByZXQpCi17Ci0Ja3RpbWVfdCAqY2FsbHRpbWUgPSAoa3RpbWVfdCAqKWRhdGE7Ci0Ja3RpbWVfdCBkZWx0YSwgcmV0dGltZTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb247Ci0KLQlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7Ci0JZGVsdGEgPSBrdGltZV9zdWIocmV0dGltZSwgKmNhbGx0aW1lKTsKLQlkdXJhdGlvbiA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGt0aW1lX3RvX25zKGRlbHRhKSA+PiAxMDsKLQlwcmludGsoS0VSTl9ERUJVRyAiaW5pdGNhbGwgJXBTIHJldHVybmVkICVkIGFmdGVyICVsbGQgdXNlY3NcbiIsCi0JCSBmbiwgcmV0LCBkdXJhdGlvbik7Ci19Ci0KLXN0YXRpYyBrdGltZV90IGluaXRjYWxsX2NhbGx0aW1lOwotCi0jaWZkZWYgVFJBQ0VQT0lOVFNfRU5BQkxFRAotc3RhdGljIHZvaWQgX19pbml0IGluaXRjYWxsX2RlYnVnX2VuYWJsZSh2b2lkKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdpc3Rlcl90cmFjZV9pbml0Y2FsbF9zdGFydCh0cmFjZV9pbml0Y2FsbF9zdGFydF9jYiwKLQkJCQkJICAgICZpbml0Y2FsbF9jYWxsdGltZSk7Ci0JcmV0IHw9IHJlZ2lzdGVyX3RyYWNlX2luaXRjYWxsX2ZpbmlzaCh0cmFjZV9pbml0Y2FsbF9maW5pc2hfY2IsCi0JCQkJCSAgICAgICZpbml0Y2FsbF9jYWxsdGltZSk7Ci0JV0FSTihyZXQsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaW5pdGNhbGwgdHJhY2Vwb2ludHNcbiIpOwotfQotIyBkZWZpbmUgZG9fdHJhY2VfaW5pdGNhbGxfc3RhcnQJdHJhY2VfaW5pdGNhbGxfc3RhcnQKLSMgZGVmaW5lIGRvX3RyYWNlX2luaXRjYWxsX2ZpbmlzaAl0cmFjZV9pbml0Y2FsbF9maW5pc2gKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgZG9fdHJhY2VfaW5pdGNhbGxfc3RhcnQoaW5pdGNhbGxfdCBmbikKLXsKLQlpZiAoIWluaXRjYWxsX2RlYnVnKQotCQlyZXR1cm47Ci0JdHJhY2VfaW5pdGNhbGxfc3RhcnRfY2IoJmluaXRjYWxsX2NhbGx0aW1lLCBmbik7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZG9fdHJhY2VfaW5pdGNhbGxfZmluaXNoKGluaXRjYWxsX3QgZm4sIGludCByZXQpCi17Ci0JaWYgKCFpbml0Y2FsbF9kZWJ1ZykKLQkJcmV0dXJuOwotCXRyYWNlX2luaXRjYWxsX2ZpbmlzaF9jYigmaW5pdGNhbGxfY2FsbHRpbWUsIGZuLCByZXQpOwotfQotI2VuZGlmIC8qICFUUkFDRVBPSU5UU19FTkFCTEVEICovCi0KLWludCBfX2luaXRfb3JfbW9kdWxlIGRvX29uZV9pbml0Y2FsbChpbml0Y2FsbF90IGZuKQotewotCWludCBjb3VudCA9IHByZWVtcHRfY291bnQoKTsKLQljaGFyIG1zZ2J1Zls2NF07Ci0JaW50IHJldDsKLQotCWlmIChpbml0Y2FsbF9ibGFja2xpc3RlZChmbikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlkb190cmFjZV9pbml0Y2FsbF9zdGFydChmbik7Ci0JcmV0ID0gZm4oKTsKLQlkb190cmFjZV9pbml0Y2FsbF9maW5pc2goZm4sIHJldCk7Ci0KLQltc2didWZbMF0gPSAwOwotCi0JaWYgKHByZWVtcHRfY291bnQoKSAhPSBjb3VudCkgewotCQlzcHJpbnRmKG1zZ2J1ZiwgInByZWVtcHRpb24gaW1iYWxhbmNlICIpOwotCQlwcmVlbXB0X2NvdW50X3NldChjb3VudCk7Ci0JfQotCWlmIChpcnFzX2Rpc2FibGVkKCkpIHsKLQkJc3RybGNhdChtc2didWYsICJkaXNhYmxlZCBpbnRlcnJ1cHRzICIsIHNpemVvZihtc2didWYpKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KLQlXQVJOKG1zZ2J1ZlswXSwgImluaXRjYWxsICVwUyByZXR1cm5lZCB3aXRoICVzXG4iLCBmbiwgbXNnYnVmKTsKLQotCWFkZF9sYXRlbnRfZW50cm9weSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotZXh0ZXJuIGluaXRjYWxsX2VudHJ5X3QgX19pbml0Y2FsbF9zdGFydFtdOwotZXh0ZXJuIGluaXRjYWxsX2VudHJ5X3QgX19pbml0Y2FsbDBfc3RhcnRbXTsKLWV4dGVybiBpbml0Y2FsbF9lbnRyeV90IF9faW5pdGNhbGwxX3N0YXJ0W107Ci1leHRlcm4gaW5pdGNhbGxfZW50cnlfdCBfX2luaXRjYWxsMl9zdGFydFtdOwotZXh0ZXJuIGluaXRjYWxsX2VudHJ5X3QgX19pbml0Y2FsbDNfc3RhcnRbXTsKLWV4dGVybiBpbml0Y2FsbF9lbnRyeV90IF9faW5pdGNhbGw0X3N0YXJ0W107Ci1leHRlcm4gaW5pdGNhbGxfZW50cnlfdCBfX2luaXRjYWxsNV9zdGFydFtdOwotZXh0ZXJuIGluaXRjYWxsX2VudHJ5X3QgX19pbml0Y2FsbDZfc3RhcnRbXTsKLWV4dGVybiBpbml0Y2FsbF9lbnRyeV90IF9faW5pdGNhbGw3X3N0YXJ0W107Ci1leHRlcm4gaW5pdGNhbGxfZW50cnlfdCBfX2luaXRjYWxsX2VuZFtdOwotCi1zdGF0aWMgaW5pdGNhbGxfZW50cnlfdCAqaW5pdGNhbGxfbGV2ZWxzW10gX19pbml0ZGF0YSA9IHsKLQlfX2luaXRjYWxsMF9zdGFydCwKLQlfX2luaXRjYWxsMV9zdGFydCwKLQlfX2luaXRjYWxsMl9zdGFydCwKLQlfX2luaXRjYWxsM19zdGFydCwKLQlfX2luaXRjYWxsNF9zdGFydCwKLQlfX2luaXRjYWxsNV9zdGFydCwKLQlfX2luaXRjYWxsNl9zdGFydCwKLQlfX2luaXRjYWxsN19zdGFydCwKLQlfX2luaXRjYWxsX2VuZCwKLX07Ci0KLS8qIEtlZXAgdGhlc2UgaW4gc3luYyB3aXRoIGluaXRjYWxscyBpbiBpbmNsdWRlL2xpbnV4L2luaXQuaCAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmluaXRjYWxsX2xldmVsX25hbWVzW10gX19pbml0ZGF0YSA9IHsKLQkicHVyZSIsCi0JImNvcmUiLAotCSJwb3N0Y29yZSIsCi0JImFyY2giLAotCSJzdWJzeXMiLAotCSJmcyIsCi0JImRldmljZSIsCi0JImxhdGUiLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaWdub3JlX3Vua25vd25fYm9vdG9wdGlvbihjaGFyICpwYXJhbSwgY2hhciAqdmFsLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKnVudXNlZCwgdm9pZCAqYXJnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZG9faW5pdGNhbGxfbGV2ZWwoaW50IGxldmVsLCBjaGFyICpjb21tYW5kX2xpbmUpCi17Ci0JaW5pdGNhbGxfZW50cnlfdCAqZm47Ci0KLQlwYXJzZV9hcmdzKGluaXRjYWxsX2xldmVsX25hbWVzW2xldmVsXSwKLQkJICAgY29tbWFuZF9saW5lLCBfX3N0YXJ0X19fcGFyYW0sCi0JCSAgIF9fc3RvcF9fX3BhcmFtIC0gX19zdGFydF9fX3BhcmFtLAotCQkgICBsZXZlbCwgbGV2ZWwsCi0JCSAgIE5VTEwsIGlnbm9yZV91bmtub3duX2Jvb3RvcHRpb24pOwotCi0JdHJhY2VfaW5pdGNhbGxfbGV2ZWwoaW5pdGNhbGxfbGV2ZWxfbmFtZXNbbGV2ZWxdKTsKLQlmb3IgKGZuID0gaW5pdGNhbGxfbGV2ZWxzW2xldmVsXTsgZm4gPCBpbml0Y2FsbF9sZXZlbHNbbGV2ZWwrMV07IGZuKyspCi0JCWRvX29uZV9pbml0Y2FsbChpbml0Y2FsbF9mcm9tX2VudHJ5KGZuKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBkb19pbml0Y2FsbHModm9pZCkKLXsKLQlpbnQgbGV2ZWw7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihzYXZlZF9jb21tYW5kX2xpbmUpICsgMTsKLQljaGFyICpjb21tYW5kX2xpbmU7Ci0KLQljb21tYW5kX2xpbmUgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb21tYW5kX2xpbmUpCi0JCXBhbmljKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlICV6dSBieXRlc1xuIiwgX19mdW5jX18sIGxlbik7Ci0KLQlmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBBUlJBWV9TSVpFKGluaXRjYWxsX2xldmVscykgLSAxOyBsZXZlbCsrKSB7Ci0JCS8qIFBhcnNlciBtb2RpZmllcyBjb21tYW5kX2xpbmUsIHJlc3RvcmUgaXQgZWFjaCB0aW1lICovCi0JCXN0cmNweShjb21tYW5kX2xpbmUsIHNhdmVkX2NvbW1hbmRfbGluZSk7Ci0JCWRvX2luaXRjYWxsX2xldmVsKGxldmVsLCBjb21tYW5kX2xpbmUpOwotCX0KLQotCWtmcmVlKGNvbW1hbmRfbGluZSk7Ci19Ci0KLS8qCi0gKiBPaywgdGhlIG1hY2hpbmUgaXMgbm93IGluaXRpYWxpemVkLiBOb25lIG9mIHRoZSBkZXZpY2VzCi0gKiBoYXZlIGJlZW4gdG91Y2hlZCB5ZXQsIGJ1dCB0aGUgQ1BVIHN1YnN5c3RlbSBpcyB1cCBhbmQKLSAqIHJ1bm5pbmcsIGFuZCBtZW1vcnkgYW5kIHByb2Nlc3MgbWFuYWdlbWVudCB3b3Jrcy4KLSAqCi0gKiBOb3cgd2UgY2FuIGZpbmFsbHkgc3RhcnQgZG9pbmcgc29tZSByZWFsIHdvcmsuLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZG9fYmFzaWNfc2V0dXAodm9pZCkKLXsKLQljcHVzZXRfaW5pdF9zbXAoKTsKLQlkcml2ZXJfaW5pdCgpOwotCWluaXRfaXJxX3Byb2MoKTsKLQlkb19jdG9ycygpOwotCXVzZXJtb2RlaGVscGVyX2VuYWJsZSgpOwotCWRvX2luaXRjYWxscygpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgZG9fcHJlX3NtcF9pbml0Y2FsbHModm9pZCkKLXsKLQlpbml0Y2FsbF9lbnRyeV90ICpmbjsKLQotCXRyYWNlX2luaXRjYWxsX2xldmVsKCJlYXJseSIpOwotCWZvciAoZm4gPSBfX2luaXRjYWxsX3N0YXJ0OyBmbiA8IF9faW5pdGNhbGwwX3N0YXJ0OyBmbisrKQotCQlkb19vbmVfaW5pdGNhbGwoaW5pdGNhbGxfZnJvbV9lbnRyeShmbikpOwotfQotCi1zdGF0aWMgaW50IHJ1bl9pbml0X3Byb2Nlc3MoY29uc3QgY2hhciAqaW5pdF9maWxlbmFtZSkKLXsKLQljb25zdCBjaGFyICpjb25zdCAqcDsKLQotCWFyZ3ZfaW5pdFswXSA9IGluaXRfZmlsZW5hbWU7Ci0JcHJfaW5mbygiUnVuICVzIGFzIGluaXQgcHJvY2Vzc1xuIiwgaW5pdF9maWxlbmFtZSk7Ci0JcHJfZGVidWcoIiAgd2l0aCBhcmd1bWVudHM6XG4iKTsKLQlmb3IgKHAgPSBhcmd2X2luaXQ7ICpwOyBwKyspCi0JCXByX2RlYnVnKCIgICAgJXNcbiIsICpwKTsKLQlwcl9kZWJ1ZygiICB3aXRoIGVudmlyb25tZW50OlxuIik7Ci0JZm9yIChwID0gZW52cF9pbml0OyAqcDsgcCsrKQotCQlwcl9kZWJ1ZygiICAgICVzXG4iLCAqcCk7Ci0JcmV0dXJuIGtlcm5lbF9leGVjdmUoaW5pdF9maWxlbmFtZSwgYXJndl9pbml0LCBlbnZwX2luaXQpOwotfQotCi1zdGF0aWMgaW50IHRyeV90b19ydW5faW5pdF9wcm9jZXNzKGNvbnN0IGNoYXIgKmluaXRfZmlsZW5hbWUpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHJ1bl9pbml0X3Byb2Nlc3MoaW5pdF9maWxlbmFtZSk7Ci0KLQlpZiAocmV0ICYmIHJldCAhPSAtRU5PRU5UKSB7Ci0JCXByX2VycigiU3RhcnRpbmcgaW5pdDogJXMgZXhpc3RzIGJ1dCBjb3VsZG4ndCBleGVjdXRlIGl0IChlcnJvciAlZClcbiIsCi0JCSAgICAgICBpbml0X2ZpbGVuYW1lLCByZXQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrZXJuZWxfaW5pdF9mcmVlYWJsZSh2b2lkKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NUUklDVF9LRVJORUxfUldYKSB8fCBkZWZpbmVkKENPTkZJR19TVFJJQ1RfTU9EVUxFX1JXWCkKLWJvb2wgcm9kYXRhX2VuYWJsZWQgX19yb19hZnRlcl9pbml0ID0gdHJ1ZTsKLXN0YXRpYyBpbnQgX19pbml0IHNldF9kZWJ1Z19yb2RhdGEoY2hhciAqc3RyKQotewotCWlmIChzdHJ0b2Jvb2woc3RyLCAmcm9kYXRhX2VuYWJsZWQpKQotCQlwcl93YXJuKCJJbnZhbGlkIG9wdGlvbiBzdHJpbmcgZm9yIHJvZGF0YTogJyVzJ1xuIiwgc3RyKTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoInJvZGF0YT0iLCBzZXRfZGVidWdfcm9kYXRhKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NUUklDVF9LRVJORUxfUldYCi1zdGF0aWMgdm9pZCBtYXJrX3JlYWRvbmx5KHZvaWQpCi17Ci0JaWYgKHJvZGF0YV9lbmFibGVkKSB7Ci0JCS8qCi0JCSAqIGxvYWRfbW9kdWxlKCkgcmVzdWx0cyBpbiBXK1ggbWFwcGluZ3MsIHdoaWNoIGFyZSBjbGVhbmVkCi0JCSAqIHVwIHdpdGggY2FsbF9yY3UoKS4gIExldCdzIG1ha2Ugc3VyZSB0aGF0IHF1ZXVlZCB3b3JrIGlzCi0JCSAqIGZsdXNoZWQgc28gdGhhdCB3ZSBkb24ndCBoaXQgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yCi0JCSAqIGluc2VjdXJlIHBhZ2VzIHdoaWNoIGFyZSBXK1guCi0JCSAqLwotCQlyY3VfYmFycmllcigpOwotCQltYXJrX3JvZGF0YV9ybygpOwotCQlyb2RhdGFfdGVzdCgpOwotCX0gZWxzZQotCQlwcl9pbmZvKCJLZXJuZWwgbWVtb3J5IHByb3RlY3Rpb24gZGlzYWJsZWQuXG4iKTsKLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX1NUUklDVF9LRVJORUxfUldYKQotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcmVhZG9ubHkodm9pZCkKLXsKLQlwcl93YXJuKCJLZXJuZWwgbWVtb3J5IHByb3RlY3Rpb24gbm90IHNlbGVjdGVkIGJ5IGtlcm5lbCBjb25maWcuXG4iKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19yZWFkb25seSh2b2lkKQotewotCXByX3dhcm4oIlRoaXMgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IGhhdmUga2VybmVsIG1lbW9yeSBwcm90ZWN0aW9uLlxuIik7Ci19Ci0jZW5kaWYKLQotdm9pZCBfX3dlYWsgZnJlZV9pbml0bWVtKHZvaWQpCi17Ci0JZnJlZV9pbml0bWVtX2RlZmF1bHQoUE9JU09OX0ZSRUVfSU5JVE1FTSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19yZWYga2VybmVsX2luaXQodm9pZCAqdW51c2VkKQotewotCWludCByZXQ7Ci0KLQlrZXJuZWxfaW5pdF9mcmVlYWJsZSgpOwotCS8qIG5lZWQgdG8gZmluaXNoIGFsbCBhc3luYyBfX2luaXQgY29kZSBiZWZvcmUgZnJlZWluZyB0aGUgbWVtb3J5ICovCi0JYXN5bmNfc3luY2hyb25pemVfZnVsbCgpOwotCWtwcm9iZV9mcmVlX2luaXRfbWVtKCk7Ci0JZnRyYWNlX2ZyZWVfaW5pdF9tZW0oKTsKLQlrZ2RiX2ZyZWVfaW5pdF9tZW0oKTsKLQlmcmVlX2luaXRtZW0oKTsKLQltYXJrX3JlYWRvbmx5KCk7Ci0KLQkvKgotCSAqIEtlcm5lbCBtYXBwaW5ncyBhcmUgbm93IGZpbmFsaXplZCAtIHVwZGF0ZSB0aGUgdXNlcnNwYWNlIHBhZ2UtdGFibGUKLQkgKiB0byBmaW5hbGl6ZSBQVEkuCi0JICovCi0JcHRpX2ZpbmFsaXplKCk7Ci0KLQlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUlVOTklORzsKLQludW1hX2RlZmF1bHRfcG9saWN5KCk7Ci0KLQlyY3VfZW5kX2lua2VybmVsX2Jvb3QoKTsKLQotCWRvX3N5c2N0bF9hcmdzKCk7Ci0KLQlpZiAocmFtZGlza19leGVjdXRlX2NvbW1hbmQpIHsKLQkJcmV0ID0gcnVuX2luaXRfcHJvY2VzcyhyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCk7Ci0JCWlmICghcmV0KQotCQkJcmV0dXJuIDA7Ci0JCXByX2VycigiRmFpbGVkIHRvIGV4ZWN1dGUgJXMgKGVycm9yICVkKVxuIiwKLQkJICAgICAgIHJhbWRpc2tfZXhlY3V0ZV9jb21tYW5kLCByZXQpOwotCX0KLQotCS8qCi0JICogV2UgdHJ5IGVhY2ggb2YgdGhlc2UgdW50aWwgb25lIHN1Y2NlZWRzLgotCSAqCi0JICogVGhlIEJvdXJuZSBzaGVsbCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGluaXQgaWYgd2UgYXJlCi0JICogdHJ5aW5nIHRvIHJlY292ZXIgYSByZWFsbHkgYnJva2VuIG1hY2hpbmUuCi0JICovCi0JaWYgKGV4ZWN1dGVfY29tbWFuZCkgewotCQlyZXQgPSBydW5faW5pdF9wcm9jZXNzKGV4ZWN1dGVfY29tbWFuZCk7Ci0JCWlmICghcmV0KQotCQkJcmV0dXJuIDA7Ci0JCXBhbmljKCJSZXF1ZXN0ZWQgaW5pdCAlcyBmYWlsZWQgKGVycm9yICVkKS4iLAotCQkgICAgICBleGVjdXRlX2NvbW1hbmQsIHJldCk7Ci0JfQotCi0JaWYgKENPTkZJR19ERUZBVUxUX0lOSVRbMF0gIT0gJ1wwJykgewotCQlyZXQgPSBydW5faW5pdF9wcm9jZXNzKENPTkZJR19ERUZBVUxUX0lOSVQpOwotCQlpZiAocmV0KQotCQkJcHJfZXJyKCJEZWZhdWx0IGluaXQgJXMgZmFpbGVkIChlcnJvciAlZClcbiIsCi0JCQkgICAgICAgQ09ORklHX0RFRkFVTFRfSU5JVCwgcmV0KTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCF0cnlfdG9fcnVuX2luaXRfcHJvY2VzcygiL3NiaW4vaW5pdCIpIHx8Ci0JICAgICF0cnlfdG9fcnVuX2luaXRfcHJvY2VzcygiL2V0Yy9pbml0IikgfHwKLQkgICAgIXRyeV90b19ydW5faW5pdF9wcm9jZXNzKCIvYmluL2luaXQiKSB8fAotCSAgICAhdHJ5X3RvX3J1bl9pbml0X3Byb2Nlc3MoIi9iaW4vc2giKSkKLQkJcmV0dXJuIDA7Ci0jaWZkZWYgQ09ORklHX0ZMQUdTX1VUSUxTCi17Ci0JZXh0ZXJuIGludCBmbGFnc19zeXNfc3dpdGNoKHZvaWQpOwotCWludCByZXQ7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIk5vIHdvcmtpbmcgaW5pdCBmb3VuZC4gIFRyeSBwYXNzaW5nIGluaXQ9IG9wdGlvbiB0byBrZXJuZWwuICIKLQkgICAgICAiU2VlIExpbnV4IERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvaW5pdC5yc3QgZm9yIGd1aWRhbmNlLiIpOwotCXJldCA9IGZsYWdzX3N5c19zd2l0Y2goKTsKLQlpZiAocmV0IDwgMCkKLQkJcGFuaWMoIlZGUzogZmxhZ3Nfc3lzX3N3aXRjaCBmYWlsIik7Ci0JZWxzZQotCQlrZXJuZWxfcmVzdGFydCgiVkZTOiBTd2l0Y2ggdG8gYW5vdGhlciBzeXN0ZW0sIHBsZWFzZSByZXNldCBtYWNoaW5lIik7Ci19Ci0jZW5kaWYKLQlwYW5pYygiTm8gd29ya2luZyBpbml0IGZvdW5kLiAgVHJ5IHBhc3NpbmcgaW5pdD0gb3B0aW9uIHRvIGtlcm5lbC4gIgotCSAgICAgICJTZWUgTGludXggRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9pbml0LnJzdCBmb3IgZ3VpZGFuY2UuIik7Ci19Ci0KLS8qIE9wZW4gL2Rldi9jb25zb2xlLCBmb3Igc3RkaW4vc3Rkb3V0L3N0ZGVyciwgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbCAqLwotdm9pZCBfX2luaXQgY29uc29sZV9vbl9yb290ZnModm9pZCkKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbHBfb3BlbigiL2Rldi9jb25zb2xlIiwgT19SRFdSLCAwKTsKLQotCWlmIChJU19FUlIoZmlsZSkpIHsKLQkJcHJfZXJyKCJXYXJuaW5nOiB1bmFibGUgdG8gb3BlbiBhbiBpbml0aWFsIGNvbnNvbGUuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlpbml0X2R1cChmaWxlKTsKLQlpbml0X2R1cChmaWxlKTsKLQlpbml0X2R1cChmaWxlKTsKLQlmcHV0KGZpbGUpOwotfQotCi1zdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga2VybmVsX2luaXRfZnJlZWFibGUodm9pZCkKLXsKLQkvKgotCSAqIFdhaXQgdW50aWwga3RocmVhZGQgaXMgYWxsIHNldC11cC4KLQkgKi8KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrdGhyZWFkZF9kb25lKTsKLQotCS8qIE5vdyB0aGUgc2NoZWR1bGVyIGlzIGZ1bGx5IHNldCB1cCBhbmQgY2FuIGRvIGJsb2NraW5nIGFsbG9jYXRpb25zICovCi0JZ2ZwX2FsbG93ZWRfbWFzayA9IF9fR0ZQX0JJVFNfTUFTSzsKLQotCS8qCi0JICogaW5pdCBjYW4gYWxsb2NhdGUgcGFnZXMgb24gYW55IG5vZGUKLQkgKi8KLQlzZXRfbWVtc19hbGxvd2VkKG5vZGVfc3RhdGVzW05fTUVNT1JZXSk7Ci0KLQljYWRfcGlkID0gZ2V0X3BpZCh0YXNrX3BpZChjdXJyZW50KSk7Ci0KLQlzbXBfcHJlcGFyZV9jcHVzKHNldHVwX21heF9jcHVzKTsKLQotCXdvcmtxdWV1ZV9pbml0KCk7Ci0KLQlpbml0X21tX2ludGVybmFscygpOwotCi0JcmN1X2luaXRfdGFza3NfZ2VuZXJpYygpOwotCWRvX3ByZV9zbXBfaW5pdGNhbGxzKCk7Ci0JbG9ja3VwX2RldGVjdG9yX2luaXQoKTsKLQotCXNtcF9pbml0KCk7Ci0Jc2NoZWRfaW5pdF9zbXAoKTsKLQotCXBhZGF0YV9pbml0KCk7Ci0JcGFnZV9hbGxvY19pbml0X2xhdGUoKTsKLQkvKiBJbml0aWFsaXplIHBhZ2UgZXh0IGFmdGVyIGFsbCBzdHJ1Y3QgcGFnZXMgYXJlIGluaXRpYWxpemVkLiAqLwotCXBhZ2VfZXh0X2luaXQoKTsKLQotCWRvX2Jhc2ljX3NldHVwKCk7Ci0KLQlrdW5pdF9ydW5fYWxsX3Rlc3RzKCk7Ci0KLQljb25zb2xlX29uX3Jvb3RmcygpOwotCi0JLyoKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBlYXJseSB1c2Vyc3BhY2UgaW5pdC4gIElmIHllcywgbGV0IGl0IGRvIGFsbAotCSAqIHRoZSB3b3JrCi0JICovCi0JaWYgKGluaXRfZWFjY2VzcyhyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCkgIT0gMCkgewotCQlyYW1kaXNrX2V4ZWN1dGVfY29tbWFuZCA9IE5VTEw7Ci0JCXByZXBhcmVfbmFtZXNwYWNlKCk7Ci0JfQotCi0JLyoKLQkgKiBPaywgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlIGluaXRpYWwgYm9vdHVwLCBhbmQKLQkgKiB3ZSdyZSBlc3NlbnRpYWxseSB1cCBhbmQgcnVubmluZy4gR2V0IHJpZCBvZiB0aGUKLQkgKiBpbml0bWVtIHNlZ21lbnRzIGFuZCBzdGFydCB0aGUgdXNlci1tb2RlIHN0dWZmLi4KLQkgKgotCSAqIHJvb3RmcyBpcyBhdmFpbGFibGUgbm93LCB0cnkgbG9hZGluZyB0aGUgcHVibGljIGtleXMKLQkgKiBhbmQgZGVmYXVsdCBtb2R1bGVzCi0JICovCi0KLQlpbnRlZ3JpdHlfbG9hZF9rZXlzKCk7Ci19CmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL2tlcm5lbC9yYW1kdW1wL3JhbWR1bXBfZGV2aWNlX3RyYW5zLmMgYi91cHN0cmVhbS9saW51eC01LjEwL2tlcm5lbC9yYW1kdW1wL3JhbWR1bXBfZGV2aWNlX3RyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQwYzkyMGQuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9rZXJuZWwvcmFtZHVtcC9yYW1kdW1wX2RldmljZV90cmFucy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUzICswLDAgQEAKLS8qKgotICogQGZpbGUgb3NzX3JhbWR1bXBfb3NhLmMKLSAqIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBSYW1kdW1wIG9zIGFkYXB0Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgotICogQGF1dGhvciBRaW5nIFdhbmcgPHdhbmcucWluZ0BzYW5lY2hpcHMuY29tLmNuPgotICogQGluZ3JvdXAgc2lfYXBfb3NzX3JhbWR1bXBfaWQKLSAqCi0gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5Ci0gKiBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlIGhlYWRlciBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAicmFtZHVtcC5oIgotI2luY2x1ZGUgPGxpbnV4L2x6by5oPgotI2luY2x1ZGUgInJhbWR1bXBfY29tcHJlc3MuaCIKLSNpZmRlZiBDT05GSUdfUkFNRFVNUF9FTU1DCi0jaW5jbHVkZSAicmFtZHVtcF9lbW1jLmgiCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVREX1NQSV9OQU5ECi0jaW5jbHVkZSAicmFtZHVtcF9zcGluYW5kLmgiCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdW5zaWduZWQgY2hhciAqcmFtZHVtcF9waHlfdG9fdmlyKHVuc2lnbmVkIGxvbmcgcGh5LCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIGludCBkdW1wX3ByaW50a190ZXh0KGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBsZW4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1leHRlcm4gdW5zaWduZWQgaW50IHJhbWR1bXBfY29tcHJlc3NfZmxhZzsKLWV4dGVybiB1bnNpZ25lZCBjaGFyICpyYW1kdW1wX2xvZ19idWY7Ci1leHRlcm4gdW5zaWduZWQgaW50IHJhbWR1bXBfZXhwb3J0X21vZGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8q1rjB7tahs6S2yCAqLwotI2RlZmluZSBSQU1EVU1QX0lOVEVSQUNUSVZFX0RBVEFfTEVOICAgICAgICA0MAotI2RlZmluZSBSQU1EVU1QX0lOVEVSQUNUSVZFX0FSUkFZX0xFTiAgICAgICAxMAotCi0vKiByYW1kdW1wILrNILmyz+3E2rTmvbu7pcP8we7UvLaoICovCi0vKs2ssr3H68fzKi8KLSNkZWZpbmUgUkFNRFVNUF9QQ19JTlRFUkFDVElWRV9SRVEgICAgICAgICAgICAgICAgICAxCi0vKs2ssr3H68fz06a08Cy0q8rkcmFtZHVtcLXEzsS8/sr9xL8qLwotI2RlZmluZSBSQU1EVU1QX1RSQU5TX1NFUlZFUl9JTlRFUkFDVElWRV9SU1AgICAgICAgIDIKLS8qx+vH87Srtd3WuLaozsS8/rHgusW1xM7EvP7Qxc+iKi8KLSNkZWZpbmUgUkFNRFVNUF9QQ19GSUxFX0lORk9fUkVBRF9SRVEgICAgICAgICAgICAgICAzCi0vKsfrx/O0q7Xd1ri2qM7EvP6x4LrFtcTOxLz+0MXPorXE06a08KOstKvK5M7EvP7D+7ywtPPQoSovCi0jZGVmaW5lIFJBTURVTVBfVFJBTlNfU0VSVkVSX0ZJTEVfSU5GT19SRUFEX1JTUCAgICAgNAotLyrH68fztsHIoda4tqjOxLz+seC6xbXEzsS8/sTayN0qLwotI2RlZmluZSBSQU1EVU1QX1BDX0ZJTEVfREFUQV9UUkFOU19SRVEgICAgICAgICAgICAgIDUKLS8qx+vH87bByKHWuLaozsS8/rHgusW1xM7EvP7E2sjdtcTTprTwo6y0q8rkzsS8/sTayN0qLwotI2RlZmluZSBSQU1EVU1QX1RSQU5TX1NFUlZFUl9GSUxFX0RBVEFfVFJBTlNfUlNQICAgIDYKLS8qtKvK5L3hyvgqLwotI2RlZmluZSBSQU1EVU1QX1BDX0ZJTEVfVFJBTlNfRE9ORV9SRVEgICAgICAgICAgICAgIDcKLS8qtKvK5L3hyvjTprTwKi8gCi0jZGVmaW5lIFJBTURVTVBfVFJBTlNfU0VSVkVSX0ZJTEVfVFJBTlNfRE9ORV9SU1AgICAgOAotCi0vKiC07c7zwODQzSAqLwotLyrWuMHutO3O8yovCi0jZGVmaW5lIFJBTURVTVBfSU5URVJBQ1RJVkVfQ01EX0VSUk9SICAgICAgICAgICAgICAgOQotLyrH68fztKu13da4tqjOxLz+seC6xbTtKi8KLSNkZWZpbmUgUkFNRFVNUF9GSUxFX05VTUJFUl9FUlJPUiAgICAgICAgICAgICAgICAgICAxMAotLyrH68fztKu13da4tqjOxLz+zrvWw7Tz0KG07SovCi0jZGVmaW5lIFJBTURVTVBfRklMRV9TSVpFX0VSUk9SICAgICAgICAgICAgICAgICAgICAgMTEKLQotI2RlZmluZSBSQU1EVU1QX0RFTEFZX01TX0NPVU5UICgyNTAwKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogc3RydWN0IFRSQU5TIFdJVEggQVAKLSAqLwotCi0vKiB0cmFuc19zZXJ2ZXIgcnNwIHBjLCBpbnRlcmFjdGl2ZSBtc2cgc3RydWN0ICovCi10eXBlZGVmIHN0cnVjdAotewotCXVuc2lnbmVkIGludCBjbWQ7Ci0JdW5zaWduZWQgaW50IGZpbGVfbnVtOwotfSByYW1kdW1wX3RyYW5zX3NlcnZlcl9pbnRlcmFjdGl2ZV9yZXE7Ci0KLS8qIHRyYW5zX3NlcnZlciByc3AgcGMsIGZpbGUgaW5mbyBtc2cgc3RydWN0ICovCi10eXBlZGVmIHN0cnVjdAotewotCXVuc2lnbmVkIGludCBjbWQ7Ci0JY2hhciAgICBmaWxlX25hbWVbUkFNRFVNUF9SQU1DT05GX0ZJTEVOQU1FX01BWExFTl07Ci0JdW5zaWduZWQgaW50IGZpbGVfc2l6ZTsKLX0gcmFtZHVtcF90cmFuc19zZXJ2ZXJfZmlsZV9pbmZvX3JlcTsKLQotLyogcGMgcmVxIHRyYW5zX3NlcnZlciwgZmlsZSBpbmZvIG1zZyBzdHJ1Y3QgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0JdW5zaWduZWQgaW50IGNtZDsKLQl1bnNpZ25lZCBpbnQgZmlsZV9pZDsKLX0gcmFtZHVtcF9wY19maWxlX2luZm9fcnNwOwotCi0vKiB0cmFuc19zZXJ2ZXIgcnNwIHBjLCB0cmFucyBkYXRhIG1zZyBzdHJ1Y3QgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0JdW5zaWduZWQgaW50IGNtZDsKLQl1bnNpZ25lZCBpbnQgYnVmX2FkZHI7Ci0JdW5zaWduZWQgaW50IGJ1Zl9sZWZ0X3NpemU7Ci19IHJhbWR1bXBfdHJhbnNfc2VydmVyX2RhdGFfdHJhbnNfcmVxOwotCi0vKiBwYyByZXEgdHJhbnNfc2VydmVyLCB0cmFucyBkYXRhIG1zZyBzdHJ1Y3QgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0JdW5zaWduZWQgaW50ICAgY21kOwotCXVuc2lnbmVkIGludCAgIGZpbGVfaWQ7ICAgICAgLyogzsS8/rHgusUgICAgICAgICAqLwotCXVuc2lnbmVkIGludCAgIG9mZnNldDsgICAgICAgLyogb2Zmc2V0zqrK/b7dxqvSxiAqLwotCXVuc2lnbmVkIGludCAgIGxlbmd0aDsgICAgICAgLyogbGVuZ3RozqrK/b7ds6S2yCAqLwotfSByYW1kdW1wX3BjX3RyYW5zX2RhdGFfcnNwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNoYXIgKnJhbWR1bXBfbG9nX2J1Zl9yZWdpb24gPSBOVUxMOwotdW5zaWduZWQgaW50IHJhbWR1bXBfbG9nX2J1Zl9sZW4gPSAwOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgdmFyaWFibGUgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBjaGFyICpyYW1kdW1wX3NoYXJlZF9tZW1fYmFzZSA9IE5VTEw7Ci11bnNpZ25lZCBjaGFyICpyYW1kdW1wX2V4cG9ydF9mbGFnX2Jhc2UgPSBOVUxMOwotaW50IHJhbWR1bXBfZmlsZV9udW0gPSAwOwotcmFtZHVtcF9maWxlX3QgcmFtZHVtcF9kZXZpY2VfZnAgPSB7MH07Ci1yYW1kdW1wX2ZpbGVfdCByYW1kdW1wX3NwaW5hbmRfZnAgPSB7MH07Ci1yYW1kdW1wX2ZpbGVfdCAqZ19yYW1kdW1wX2Rldl9mcDsKLXVuc2lnbmVkIGludCAgIHJhbWR1bXBfZGV2aWNlX2ZpbGVfY250ID0gMDsKLXVuc2lnbmVkIGNoYXIgKnJhbWR1bXBfbG9nX2J1ZiA9IE5VTEw7IC8qILi008NyYW1kdW1wtOa0orXEMTI4S0IoxqvSxjE2S0IpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICBJbmxpbmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByYW1kdW1wX3dhaXRfZGVsYXkoIHVuc2lnbmVkIGxvbmcgbXMpCi17Ci0Jdm9sYXRpbGUgaW50IGogPSAwOwotCWZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICBleHRlcm4gZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qILmmxNzD6Mr2OiAgICByYW1kdW1wX29zc19kYXRhX3RyYW5zX3dyaXRlCi0qILLOyv3LtcP3OiAgICAgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1OiAgICB2b2lkIAotKiDG5Mv8y7XD9zogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciByYW1kdW1wIHRvIHRyYW5zIGR1bXAgZGF0YSB0byBQQwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCByYW1kdW1wX29zc19kYXRhX3RyYW5zX3dyaXRlKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IHJldDsKLQlyYW1kdW1wX3NobWVtX3QgKm1zZyA9IChyYW1kdW1wX3NobWVtX3QgKilyYW1kdW1wX3NoYXJlZF9tZW1fYmFzZTsKLQotCWlmIChzaXplID4gKFJBTURVTVBfU0hBUkVEX01FTV9MRU4tIHJvdW5kdXAoc2l6ZW9mKHJhbWR1bXBfc2htZW1fdCksIFJBTURVTVBfU0hNRU1fQUxJR05fU0laRSkpKTsKLQkJcmV0ID0gLTE7Ci0KLQl3aGlsZSgxKXsKLQkJaWYgKChtc2ctPmNvcmVfZmxhZyA9PSAxKSAmJiAobXNnLT5yd19mbGFnID09IDEpKXsKLQkJCW1lbWNweShtc2ctPmJ1ZiwgYnVmZmVyLCBzaXplKTsKLQkJCW1zZy0+c2l6ZSA9IHNpemU7Ci0JCQltc2ctPmNvcmVfZmxhZyA9IDA7Ci0JCQltc2ctPnJ3X2ZsYWcgPSAyOwotCQkJcmV0ID0gc2l6ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCXJhbWR1bXBfd2FpdF9kZWxheSgwKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoguabE3MPoyvY6ICAgIHJhbWR1bXBfb3NzX2RhdGFfdHJhbnNfcmVhZAotKiCyzsr9y7XD9zogICAgIAotKiAgICi0q8jrss7K/Skgdm9pZAotKiAgICi0q7P2ss7K/Skgdm9pZAotKiC3tSC72CDWtTogICAgdm9pZCAKLSogxuTL/Mu1w/c6ICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmFtZHVtcCB0byB0cmFucyBkdW1wIGRhdGEgdG8gUEMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcmFtZHVtcF9vc3NfZGF0YV90cmFuc19yZWFkKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaW50IHJldDsKLQlyYW1kdW1wX3NobWVtX3QgKm1zZyA9IChyYW1kdW1wX3NobWVtX3QgKilyYW1kdW1wX3NoYXJlZF9tZW1fYmFzZTsKLQotCWlmIChzaXplID4gKFJBTURVTVBfU0hBUkVEX01FTV9MRU4gLSByb3VuZHVwKHNpemVvZihyYW1kdW1wX3NobWVtX3QpLCBSQU1EVU1QX1NITUVNX0FMSUdOX1NJWkUpKSkKLQkJcmV0ID0gLTE7Ci0KLQl3aGlsZSgxKXsKLQkJaWYgKChtc2ctPmNvcmVfZmxhZyA9PSAxKSAmJiAobXNnLT5yd19mbGFnID09IDIpKXsKLQkJCWlmIChzaXplIDwgbXNnLT5zaXplKQotCQkJCXJldHVybiAtMTsKLQkJCW1lbWNweShidWZmZXIsIG1zZy0+YnVmLCBtc2ctPnNpemUpOwotCQkJbXNnLT5zaXplID0gc2l6ZTsKLQkJCW1zZy0+Y29yZV9mbGFnID0gMTsKLQkJCW1zZy0+cndfZmxhZyA9IDE7Ci0JCQlyZXQgPSBzaXplOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJcmFtZHVtcF93YWl0X2RlbGF5KDApOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9jogICAgcmFtZHVtcF9vc3NfZGF0YV90cmFuc19pbml0Ci0qILLOyv3LtcP3OiAgICAgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1OiAgICB2b2lkIAotKiDG5Mv8y7XD9zogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtYXAgcmFtZHVtcF9zaGFyZWRfbWVtX2Jhc2UKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHJhbWR1bXBfb3NzX2RhdGFfdHJhbnNfaW5pdCh2b2lkKQotewotCXJhbWR1bXBfc2htZW1fdCAqbXNnID0gKHJhbWR1bXBfc2htZW1fdCAqKXJhbWR1bXBfc2hhcmVkX21lbV9iYXNlOwotCi0JbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHJhbWR1bXBfc2htZW1fdCkpOwotCW1zZy0+Y29yZV9mbGFnID0gMTsKLQltc2ctPnJ3X2ZsYWcgPSAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9jogICAgcmFtZHVtcF9kZXZpY2VfaW5pdAotKiCyzsr9y7XD9zogICAgIAotKiAgICi0q8jrss7K/Skgdm9pZAotKiAgICi0q7P2ss7K/Skgdm9pZAotKiC3tSC72CDWtTogICAgdm9pZCAKLSogxuTL/Mu1w/c6ICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgaW5pdCBmcCBoZWFkCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHJhbWR1bXBfZGV2aWNlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXJhbWR1bXBfbHpvX2luaXQoKTsKLQlpZihyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9FTU1DKQotCXsKLSNpZmRlZiBDT05GSUdfUkFNRFVNUF9FTU1DCi0JCXJldCA9IHJhbWR1bXBfZW1tY19pbml0KCZyYW1kdW1wX2RldmljZV9mcCk7Ci0jZW5kaWYKLQkJZ19yYW1kdW1wX2Rldl9mcCA9ICZyYW1kdW1wX2RldmljZV9mcDsKLQl9Ci0JZWxzZSBpZihyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9TUElOQU5EKQotCXsKLSNpZmRlZiBDT05GSUdfTVREX1NQSV9OQU5ECi0JCXJldCA9IHJhbWR1bXBfc3BpbmFuZF9pbml0KCZyYW1kdW1wX3NwaW5hbmRfZnApOwotI2VuZGlmCi0JCWdfcmFtZHVtcF9kZXZfZnAgPSAmcmFtZHVtcF9zcGluYW5kX2ZwOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9jogICAgcmFtZHVtcF9kZXZpY2VfY2xvc2UKLSogss7K/cu1w/c6ICAgICAKLSogICAotKvI67LOyv0pIHZvaWQKLSogICAotKuz9rLOyv0pIHZvaWQKLSogt7Ugu9gg1rU6ICAgIHZvaWQgCi0qIMbky/zLtcP3OiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHByaW50IGNsb3NlIG1zZwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcmFtZHVtcF9kZXZpY2VfY2xvc2Uodm9pZCkKLXsKLQlpZihyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9FTU1DKQotCXsKLSNpZmRlZiBDT05GSUdfUkFNRFVNUF9FTU1DCi0JCXJhbWR1bXBfZW1tY19jbG9zZSgmcmFtZHVtcF9kZXZpY2VfZnApOwotI2VuZGlmCi0JfQotCWVsc2UgaWYgKHJhbWR1bXBfZXhwb3J0X21vZGUgPT0gUkFNRFVNUF9NT0RFX1NQSU5BTkQpCi0JewotI2lmZGVmIENPTkZJR19NVERfU1BJX05BTkQKLQkJcmFtZHVtcF9zcGluYW5kX2Nsb3NlKCZyYW1kdW1wX3NwaW5hbmRfZnApOwotI2VuZGlmCi0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9jogICAgcmFtZHVtcF9maWxsX2hlYWRlcgotKiCyzsr9y7XD9zogICAgIAotKiAgICi0q8jrss7K/SkgCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1OiAgICB2b2lkIAotKiDG5Mv8y7XD9zogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciAgcmFtZHVtcCBmaWxlIGhlYWRlcgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCByYW1kdW1wX2ZpbGxfaGVhZGVyKGNoYXIgKmZpbGVfbmFtZSwgdW5zaWduZWQgaW50IGZpbGVfc2l6ZSwgcmFtZHVtcF9maWxlX3QgKmZwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCWlmIChyYW1kdW1wX2RldmljZV9maWxlX2NudCA+PSBSQU1EVU1QX0ZJTEVfTlVNX01BWCkKLQkJcmV0dXJuIC0xOwotCi0JZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLm1hZ2ljID0gMHgzQTNBM0EzQTsKLQlzdHJuY3B5KGZwLT5maWxlX2ZwW3JhbWR1bXBfZGV2aWNlX2ZpbGVfY250XS5maWxlX25hbWUsIGZpbGVfbmFtZSwgUkFNRFVNUF9SQU1DT05GX0ZJTEVOQU1FX01BWExFTiAtIDEpOwotCWZwLT5maWxlX2ZwW3JhbWR1bXBfZGV2aWNlX2ZpbGVfY250XS5vZmZzZXQgPSBvZmZzZXQ7Ci0JZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLnNpemUgPSBmaWxlX3NpemU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qILmmxNzD6Mr2OiAgICByYW1kdW1wX2RldmljZV93cml0ZV9maWxlCi0qILLOyv3LtcP3OiAgICAgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1OiAgICB2b2lkIAotKiDG5Mv8y7XD9zogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB3cml0ZSBmaWxlIGluZm9tYXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcmFtZHVtcF9kZXZpY2Vfd3JpdGVfZmlsZShyYW1kdW1wX3RyYW5zX3NlcnZlcl9maWxlX2luZm9fcmVxICpzZXJ2ZXJfdG9fY2FwKQotewotCWludCByZXQgPSAtMTsKLQkKLQlpZihyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9FTU1DKQotCXsKLSNpZmRlZiBDT05GSUdfUkFNRFVNUF9FTU1DCi0JCWlmIChyYW1kdW1wX2VtbWNfb2Zmc2V0ID49IFJBTURVTVBfVFJBTlNfRU1NQ19MRU4pCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcmV0ID0gcmFtZHVtcF9maWxsX2hlYWRlcihzZXJ2ZXJfdG9fY2FwLT5maWxlX25hbWUsIAotCQkJCQkJCQkgc2VydmVyX3RvX2NhcC0+ZmlsZV9zaXplLCAKLQkJCQkJCQkJICZyYW1kdW1wX2RldmljZV9mcCwgCi0JCQkJCQkJCSByYW1kdW1wX2VtbWNfb2Zmc2V0KTsKLSNlbmRpZgotCX0KLQllbHNlIGlmKHJhbWR1bXBfZXhwb3J0X21vZGUgPT0gUkFNRFVNUF9NT0RFX1NQSU5BTkQpCi0JewotI2lmZGVmIENPTkZJR19NVERfU1BJX05BTkQKLQkJaWYgKHJhbWR1bXBfc3BpbmFuZF9vZmZzZXQgPj0gUkFNRFVNUF9TUElOQU5EX0xFTikKLQkJCXJldHVybiAtMTsKLQotCQlyZXQgPSByYW1kdW1wX2ZpbGxfaGVhZGVyKHNlcnZlcl90b19jYXAtPmZpbGVfbmFtZSwgCi0JCQkJCQkJCSAgc2VydmVyX3RvX2NhcC0+ZmlsZV9zaXplLAotCQkJCQkJCQkgICZyYW1kdW1wX3NwaW5hbmRfZnAsIAotCQkJCQkJCQkgIHJhbWR1bXBfc3BpbmFuZF9vZmZzZXQpOwotI2VuZGlmCi0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qILmmxNzD6Mr2OglyYW1kdW1wX2RldmljZV93cml0ZV9maWxlCi0qILLOyv3LtcP3OgkgCi0qICAgKLSryOuyzsr9KSBmcKO6CSAgzsS8/r7ksfoKLSogICAotKuz9rLOyv0pIGZpbGVfc2l6ZSDOxLz+tPPQoQotKiC3tSC72CDWtToJs8m5pre1u9gwo6zKp7Dct7W72C0xIAotKiDG5Mv8y7XD9zoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB3cml0ZSBmaWxlIGluZm9tYXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcmFtZHVtcF9kZXZpY2VfbW9kaWZ5X2ZpbGVfc2l6ZShzc2l6ZV90IGZpbGVfc2l6ZSkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0JcmFtZHVtcF9maWxlX3QgKmZwID0gZ19yYW1kdW1wX2Rldl9mcDsKLQotCWlmKGZwKQotCXsKLQkJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLnNpemUgPSBmaWxlX3NpemU7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9joJcmFtZHVtcF9kZXZpY2Vfd3JpdGVfZmlsZV9oZWFkCi0qILLOyv3LtcP3OgkgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1Ogl2b2lkIAotKiDG5Mv8y7XD9zoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB3cml0ZSBmaWxlIGhlYWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgcmFtZHVtcF9kZXZpY2Vfd3JpdGVfZmlsZV9oZWFkKHZvaWQpCi17Ci0JaW50IHJldCA9IC0xOwotCQotCWlmKHJhbWR1bXBfZXhwb3J0X21vZGUgPT0gUkFNRFVNUF9NT0RFX0VNTUMpCi0JewotI2lmZGVmIENPTkZJR19SQU1EVU1QX0VNTUMKLQkJcmV0ID0gcmFtZHVtcF9lbW1jX3dyaXRlX2ZpbGVfaGVhZCgmcmFtZHVtcF9kZXZpY2VfZnApOwkJCi0jZW5kaWYKLQl9Ci0JZWxzZSBpZihyYW1kdW1wX2V4cG9ydF9tb2RlID09IFJBTURVTVBfTU9ERV9TUElOQU5EKQotCXsKLSNpZmRlZiBDT05GSUdfTVREX1NQSV9OQU5ECi0JCXJldCA9IHJhbWR1bXBfc3BpbmFuZF93cml0ZV9maWxlX2hlYWQoJnJhbWR1bXBfc3BpbmFuZF9mcCk7Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJhbWR1bXBfZG9fd3JpdGVfbG9nX3R4dChyYW1kdW1wX2ZpbGVfdCAqZnApCi17Ci0JaW50IHJldCA9IC0xOwotCXNpemVfdCBkc3RfbGVuID0gMDsJCi0Jc2l6ZV90IHNlbmRfbGVuID0gMDsKLQlyYW1kdW1wX3NobWVtX3QgKm1zZyA9IChyYW1kdW1wX3NobWVtX3QgKilyYW1kdW1wX3NoYXJlZF9tZW1fYmFzZTsKLQljaGFyICpidWYgPSBOVUxMOwotCi0JbWVtc2V0KHJhbWR1bXBfbG9nX2J1ZiwgMCwgUkFNRFVNUF9MT0dfQlVGKTsKLQlyZXQgPSBkdW1wX3ByaW50a190ZXh0KHJhbWR1bXBfbG9nX2J1ZiwgUkFNRFVNUF9MT0dfQlVGKTsKLQlpZihyZXQgPCAwKXsKLQkJcHJpbnRrKCJyYW1kdW1wIHByaW50ayBsb2cgYnVmIGZhaWxlZCEhXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JaWYgKHJhbWR1bXBfY29tcHJlc3NfZmxhZyA9PSAxKXsKLQkJcmV0ID0gcmFtZHVtcF9sem9fY29tcHJlc3MocmFtZHVtcF9sb2dfYnVmLCBSQU1EVU1QX0xPR19CVUYsIG1zZy0+YnVmLCAmZHN0X2xlbik7Ci0JCWJ1ZiA9IG1zZy0+YnVmOwotCX0KLQlpZiAocmV0ICE9IExaT19FX09LKXsKLQkJZHN0X2xlbiA9IFJBTURVTVBfTE9HX0JVRjsKLQkJYnVmID0gcmFtZHVtcF9sb2dfYnVmOwotCX0KLQlmcC0+ZmlsZV9udW0gKz0gMTsKLQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0ubWFnaWMgPSAweDNBM0EzQTNBOwotCXN0cm5jcHkoZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLmZpbGVfbmFtZSwgImNhcF9sb2dfYnVmLnR4dCIsIFJBTURVTVBfUkFNQ09ORl9GSUxFTkFNRV9NQVhMRU4gLSAxKTsKLQotCWlmIChmcCA9PSAmcmFtZHVtcF9kZXZpY2VfZnApCi0JewotI2lmZGVmIENPTkZJR19SQU1EVU1QX0VNTUMKLQkJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLnNpemUgPSByb3VuZHVwKGRzdF9sZW4sIFJBTURVTVBfRU1NQ19BTElHTl9TSVpFKTsKLQkJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLm9mZnNldCA9IHJhbWR1bXBfZW1tY19vZmZzZXQ7Ci0JCXJldCA9IG1tY19id3JpdGUoUkFNRFVNUF9FTU1DX0FERFIgKyByYW1kdW1wX2VtbWNfb2Zmc2V0LCBkc3RfbGVuLCBidWYpOwotCQlyYW1kdW1wX2VtbWNfd3JpdGVfZmlsZV9oZWFkKGZwKTsKLQkJcmFtZHVtcF9lbW1jX29mZnNldCA9IHJhbWR1bXBfZW1tY19vZmZzZXQgKyByb3VuZHVwKGRzdF9sZW4sIFJBTURVTVBfRU1NQ19BTElHTl9TSVpFKTsKLSNlbmRpZgotCX0KLQllbHNlIGlmIChmcCA9PSAmcmFtZHVtcF9zcGluYW5kX2ZwKQotCXsKLSNpZmRlZiBDT05GSUdfTVREX1NQSV9OQU5ECi0JCXNlbmRfbGVuID0gcm91bmR1cChkc3RfbGVuLCBSQU1EVU1QX0ZMQVNIX0FMSUdOX1NJWkUpOwotCQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0uc2l6ZSA9IHNlbmRfbGVuOwotCQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0ub2Zmc2V0ID0gcmFtZHVtcF9zcGluYW5kX29mZnNldDsKLQkJcmV0ID0gd3JpdGVfZGF0YShSQU1EVU1QX1NQSU5BTkRfQUREUiArIHJhbWR1bXBfc3BpbmFuZF9vZmZzZXQsIHNlbmRfbGVuLCBidWYpOwotCQlyYW1kdW1wX3NwaW5hbmRfb2Zmc2V0ID0gcmFtZHVtcF9zcGluYW5kX29mZnNldCArIHNlbmRfbGVuOwotI2VuZGlmCi0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygicmFtZHVtcF9kb193cml0ZV9sb2didWYgZXJyb3IgZnAhXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyYW1kdW1wX2RldmljZV9maWxlX2NudCArPSAxOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCByYW1kdW1wX2RvX3dyaXRlX2xvZ2J1ZihyYW1kdW1wX2ZpbGVfdCAqZnApCi17Ci0JY2hhciAgICpidWYgPSBOVUxMOwotCWludAlyZXQgID0gLTE7Ci0Jc2l6ZV90IGRzdF9sZW4gPSAwOwotCXNpemVfdCBzZW5kX2xlbiA9IDA7Ci0JcmFtZHVtcF9zaG1lbV90ICptc2cgPSAocmFtZHVtcF9zaG1lbV90ICopcmFtZHVtcF9zaGFyZWRfbWVtX2Jhc2U7Ci0KLQlpZighZnApCi0JewotCQlwcmludGsoInJhbWR1bXBfZG9fd3JpdGVfbG9nYnVmIGVycm9yOiBmcCBpcyBOdWxsXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJhbWR1bXBfbG9nX2J1Zl9yZWdpb24gPSBsb2dfYnVmX2FkZHJfZ2V0KCk7Ci0JcmFtZHVtcF9sb2dfYnVmX2xlbiA9IGxvZ19idWZfbGVuX2dldCgpOwotCi0JaWYgKHJhbWR1bXBfY29tcHJlc3NfZmxhZyA9PSAxKXsKLQkJcmV0ID0gcmFtZHVtcF9sem9fY29tcHJlc3MocmFtZHVtcF9sb2dfYnVmX3JlZ2lvbiwgcmFtZHVtcF9sb2dfYnVmX2xlbiwgbXNnLT5idWYsICZkc3RfbGVuKTsKLQkJYnVmID0gbXNnLT5idWY7Ci0JfQotCWlmIChyZXQgIT0gTFpPX0VfT0spewotCQlkc3RfbGVuID0gcmFtZHVtcF9sb2dfYnVmX2xlbjsKLQkJYnVmID0gcmFtZHVtcF9sb2dfYnVmX3JlZ2lvbjsKLQl9Ci0KLQlmcC0+ZmlsZV9udW0gKz0gMTsKLQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0ubWFnaWMgPSAweDNBM0EzQTNBOwotCXN0cm5jcHkoZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLmZpbGVfbmFtZSwgImNhcF9sb2dfYnVmLmJpbiIsIFJBTURVTVBfUkFNQ09ORl9GSUxFTkFNRV9NQVhMRU4gLSAxKTsKLQotCWlmIChmcCA9PSAmcmFtZHVtcF9kZXZpY2VfZnApCi0JewotI2lmZGVmIENPTkZJR19SQU1EVU1QX0VNTUMKLQkJZnAtPmZpbGVfZnBbcmFtZHVtcF9kZXZpY2VfZmlsZV9jbnRdLnNpemUgPSByb3VuZHVwKGRzdF9sZW4sIFJBTURVTVBfRU1NQ19BTElHTl9TSVpFKTsKLQkJcmV0ID0gbW1jX2J3cml0ZShSQU1EVU1QX0VNTUNfQUREUiArIHJhbWR1bXBfZW1tY19vZmZzZXQsIGRzdF9sZW4sIGJ1Zik7Ci0JCWZwLT5maWxlX2ZwW3JhbWR1bXBfZGV2aWNlX2ZpbGVfY250XS5vZmZzZXQgPSByYW1kdW1wX2VtbWNfb2Zmc2V0OwotCQlyYW1kdW1wX2VtbWNfd3JpdGVfZmlsZV9oZWFkKGZwKTsKLQkJcmFtZHVtcF9lbW1jX29mZnNldCA9IHJhbWR1bXBfZW1tY19vZmZzZXQgKyByb3VuZHVwKGRzdF9sZW4sIFJBTURVTVBfRU1NQ19BTElHTl9TSVpFKTsKLSNlbmRpZgotCX0KLQllbHNlIGlmIChmcCA9PSAmcmFtZHVtcF9zcGluYW5kX2ZwKQotCXsKLSNpZmRlZiBDT05GSUdfTVREX1NQSV9OQU5ECi0JCXNlbmRfbGVuID0gcm91bmR1cChkc3RfbGVuLCBSQU1EVU1QX0ZMQVNIX0FMSUdOX1NJWkUpOwotCQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0uc2l6ZSA9IHNlbmRfbGVuOwotCQlmcC0+ZmlsZV9mcFtyYW1kdW1wX2RldmljZV9maWxlX2NudF0ub2Zmc2V0ID0gcmFtZHVtcF9zcGluYW5kX29mZnNldDsKLQkJcmV0ID0gd3JpdGVfZGF0YShSQU1EVU1QX1NQSU5BTkRfQUREUiArIHJhbWR1bXBfc3BpbmFuZF9vZmZzZXQsIHNlbmRfbGVuLCBidWYpOwotCQlyYW1kdW1wX3NwaW5hbmRfb2Zmc2V0ID0gcmFtZHVtcF9zcGluYW5kX29mZnNldCArIHNlbmRfbGVuOwotI2VuZGlmCi0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygicmFtZHVtcF9kb193cml0ZV9sb2didWYgZXJyb3IgZnAhXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlyYW1kdW1wX2RldmljZV9maWxlX2NudCArPSAxOwotCXJhbWR1bXBfZG9fd3JpdGVfbG9nX3R4dChmcCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9joJcmFtZHVtcF9kZXZpY2Vfd3JpdGVfbG9nYnVmCi0qILLOyv3LtcP3OgkgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1Ogl2b2lkIAotKiDG5Mv8y7XD9zoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciAgd3JpdGUgY2FwIGxvZ2J1ZgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCByYW1kdW1wX2RldmljZV93cml0ZV9sb2didWYodm9pZCkKLXsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlyZXQgPSByYW1kdW1wX2RvX3dyaXRlX2xvZ2J1ZihnX3JhbWR1bXBfZGV2X2ZwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmFtZHVtcF9wcmludGYoImRldmljZSBtZW1vcnkgdHJhbnMgZmlsZTpjYXBfbG9nX2J1ZiBlcnJvciEhIVxuIik7Ci0JZWxzZQotCQlyYW1kdW1wX3ByaW50ZigiZGV2aWNlIG1lbW9yeSB0cmFucyBmaWxlOmNhcF9sb2dfYnVmIHN1Y2Nlc3MhISFcbiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qILmmxNzD6Mr2OglyYW1kdW1wX2RldmljZV93cml0ZV9kYXRhCi0qILLOyv3LtcP3OgkgCi0qICAgKLSryOuyzsr9KSB2b2lkCi0qICAgKLSrs/ayzsr9KSB2b2lkCi0qILe1ILvYINa1Ogl2b2lkIAotKiDG5Mv8y7XD9zoJVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciB3cml0ZSBkYXRhCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHJhbWR1bXBfZGV2aWNlX3dyaXRlX2RhdGEocmFtZHVtcF9zaG1lbV90ICptc2csIHVuc2lnbmVkIGludCBzaXplLCBzc2l6ZV90ICpkc3RsZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0JCQotCWlmKHJhbWR1bXBfZXhwb3J0X21vZGUgPT0gUkFNRFVNUF9NT0RFX0VNTUMpCi0JewkJCi0jaWZkZWYgQ09ORklHX1JBTURVTVBfRU1NQwotCQlyZXQgPSByYW1kdW1wX2VtbWNfd3JpdGVfZGF0YShtc2csICZyYW1kdW1wX2RldmljZV9mcCwgc2l6ZSk7Ci0JCWlmKHJldCA8IDApCi0JCQkqZHN0bGVuID0gMDsKLQkJZWxzZQotCQkJKmRzdGxlbiArPSByb3VuZHVwKHJldCwgUkFNRFVNUF9FTU1DX0FMSUdOX1NJWkUpOwotI2VuZGlmCi0JfQotCWVsc2UgaWYocmFtZHVtcF9leHBvcnRfbW9kZSA9PSBSQU1EVU1QX01PREVfU1BJTkFORCkKLQl7Ci0jaWZkZWYgQ09ORklHX01URF9TUElfTkFORAotCQlyZXQgPSByYW1kdW1wX3NwaW5hbmRfd3JpdGVfZGF0YShtc2csICZyYW1kdW1wX3NwaW5hbmRfZnAsIHNpemUpOwotCQlpZihyZXQgPCAwKQotCQkJKmRzdGxlbiA9IDA7Ci0JCWVsc2UKLQkJCSpkc3RsZW4gKz0gcmV0OwotI2VuZGlmCi0JfQotCWVsc2UKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgR2xvYmFsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByYW1kdW1wX3NoYXJlZF9tZW1faW5pdCh2b2lkKQotewotCXJhbWR1bXBfc2hhcmVkX21lbV9iYXNlID0gcmFtZHVtcF9waHlfdG9fdmlyKCh1bnNpZ25lZCBsb25nKVJBTURVTVBfU0hBUkVEX01FTV9CQVNFLCAodW5zaWduZWQgbG9uZylSQU1EVU1QX01FTV9MRU4pOwotCXJhbWR1bXBfZXhwb3J0X2ZsYWdfYmFzZSA9IHJhbWR1bXBfcGh5X3RvX3ZpcigodW5zaWduZWQgbG9uZylJUkFNX0JBU0VfQUREUl9SQU1EVU1QX01PREUsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JcmFtZHVtcF9sb2dfYnVmID0gcmFtZHVtcF9zaGFyZWRfbWVtX2Jhc2UgKyAweDQwMDA7Ci0JcmFtZHVtcF9mbGFzaF9hbGxvY190cmFuc2J1ZigpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiC5psTcw+jK9joJcmFtZHVtcF9kYXRhX3RyYW5zZmVyX3RvX2RldmljZQotKiCyzsr9y7XD9zoKLSogICAotKvI67LOyv0pIHZvaWQKLSogICAotKuz9rLOyv0pIHZvaWQKLSogt7Ugu9gg1rU6CXZvaWQgCi0qIMbky/zLtcP3OglUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHJhbWR1bXAgdG8gdHJhbnMgZHVtcCBkYXRhIHRvIGFwCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCByYW1kdW1wX2RhdGFfdHJhbnNmZXJfdG9fZGV2aWNlKHZvaWQpCi17Ci0JaW50IGRhdGFfdHJhbnNfbWF4OwotCWludCBmaWxlX2NudCA9IDA7Ci0JaW50IGZpbGVfc2l6ZSA9IDA7Ci0JaW50IGZpbGVfb2Zmc2V0ID0gMDsKLQlpbnQgZmlsZV9sZWZ0X3NpemUgPSAwOwotCWludCBmaWxlX3RyYW5zX3NpemUgPSAwOwotCWludCBlcnJvcl9jbWQgPSAwOwotCWludCByZXQgPSAwOwotCXNzaXplX3QgZmlsZV9kc3RsZW4gPSAwOwotCi0JdW5zaWduZWQgaW50IHJlcV9idWZbUkFNRFVNUF9JTlRFUkFDVElWRV9BUlJBWV9MRU5dID0gezB9OwotCXJhbWR1bXBfdHJhbnNfc2VydmVyX2ludGVyYWN0aXZlX3JlcSBjYXBfdG9fc2VydmVyX21zZyA9IHswfTsKLQotCS8qIGludGVyYWN0aXZlIGJlZ2luICovCi0JaWYocmFtZHVtcF9kZXZpY2VfaW5pdCgpIDwgMCkKLQkJcmV0dXJuOwotCWRhdGFfdHJhbnNfbWF4ID0gUkFNRFVNUF9TSEFSRURfTUVNX0xFTiAtIHJvdW5kdXAoc2l6ZW9mKHJhbWR1bXBfc2htZW1fdCksIFJBTURVTVBfU0hNRU1fQUxJR05fU0laRSkgLSBSQU1EVU1QX0NPTVBSRVNTX09VVF9MRU47Ci0JY2FwX3RvX3NlcnZlcl9tc2cuY21kID0gUkFNRFVNUF9QQ19JTlRFUkFDVElWRV9SRVE7Ci0JcmFtZHVtcF9vc3NfZGF0YV90cmFuc193cml0ZSgodW5zaWduZWQgY2hhciopKCZjYXBfdG9fc2VydmVyX21zZyksIHNpemVvZihjYXBfdG9fc2VydmVyX21zZykpOwotCi0JZm9yKDs7KQotCXsKLQkJcmFtZHVtcF9vc3NfZGF0YV90cmFuc19yZWFkKCh1bnNpZ25lZCBjaGFyICopcmVxX2J1ZiwgUkFNRFVNUF9JTlRFUkFDVElWRV9EQVRBX0xFTik7Ci0JCXN3aXRjaCAoKih1bnNpZ25lZCBpbnQgKilyZXFfYnVmKQotCQl7Ci0JCQljYXNlIFJBTURVTVBfVFJBTlNfU0VSVkVSX0lOVEVSQUNUSVZFX1JTUDoKLQkJCXsKLQkJCQlyYW1kdW1wX3BjX2ZpbGVfaW5mb19yc3AgY2FwX3RvX3NlcnZlcl9tc2cgPXswfTsKLQkJCQlyYW1kdW1wX3RyYW5zX3NlcnZlcl9pbnRlcmFjdGl2ZV9yZXEgKnNlcnZlcl90b19jYXBfbXNnID0gKHJhbWR1bXBfdHJhbnNfc2VydmVyX2ludGVyYWN0aXZlX3JlcSAqKXJlcV9idWY7Ci0JCQkJLyogZGF0YSBmcm9tIHNlcnZlciB0byBjYXAgKi8KLQkJCQlyYW1kdW1wX2ZpbGVfbnVtID0gc2VydmVyX3RvX2NhcF9tc2ctPmZpbGVfbnVtOwotCQkJCXJhbWR1bXBfZGV2aWNlX2ZwLmZpbGVfbnVtICA9IHJhbWR1bXBfZmlsZV9udW07Ci0JCQkJcmFtZHVtcF9zcGluYW5kX2ZwLmZpbGVfbnVtID0gcmFtZHVtcF9maWxlX251bTsKLQotCQkJCS8qIGRhdGEgZnJvbSBjYXAgdG8gc2VydmVyICovCi0JCQkJY2FwX3RvX3NlcnZlcl9tc2cuY21kID0gUkFNRFVNUF9QQ19GSUxFX0lORk9fUkVBRF9SRVE7Ci0JCQkJY2FwX3RvX3NlcnZlcl9tc2cuZmlsZV9pZCA9IGZpbGVfY250OwotCi0JCQkJcmFtZHVtcF9vc3NfZGF0YV90cmFuc193cml0ZSgKLQkJCQkJKHVuc2lnbmVkIGNoYXIqKSgmY2FwX3RvX3NlcnZlcl9tc2cpLAotCQkJCQlzaXplb2YoY2FwX3RvX3NlcnZlcl9tc2cpKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBSQU1EVU1QX1RSQU5TX1NFUlZFUl9GSUxFX0lORk9fUkVBRF9SU1A6Ci0JCQl7Ci0JCQkJcmFtZHVtcF9wY190cmFuc19kYXRhX3JzcCBjYXBfdG9fc2VydmVyX21zZyA9IHswfTsKLQkJCQlyYW1kdW1wX3RyYW5zX3NlcnZlcl9maWxlX2luZm9fcmVxICpzZXJ2ZXJfdG9fY2FwX21zZyA9IChyYW1kdW1wX3RyYW5zX3NlcnZlcl9maWxlX2luZm9fcmVxICopcmVxX2J1ZjsKLQkJCQkvKiBkYXRhIGZyb20gc2VydmVyIHRvIGNhcCAqLwotCQkJCS8qZGV2aWNlIG1lbW9yeSBmaWxlIGNyZWF0ZSovCi0JCQkJaWYocmFtZHVtcF9kZXZpY2Vfd3JpdGVfZmlsZShzZXJ2ZXJfdG9fY2FwX21zZykgPT0gLTEpewotCQkJCQljYXBfdG9fc2VydmVyX21zZy5jbWQgPSBSQU1EVU1QX1BDX0ZJTEVfVFJBTlNfRE9ORV9SRVE7Ci0JCQkJCXJhbWR1bXBfZGV2aWNlX3dyaXRlX2ZpbGVfaGVhZCgpOy8vsaPWpLP2tO3HsLy4uPbOxLz+vvnQtLbUoaMKLQkJCQkJcmFtZHVtcF9wcmludGYoInJhbWR1bXAgd3JpdGUgZW1tYyBmaWxlIGVycm9yIVxuIik7Ci0JCQkJfQotCQkJCWZpbGVfc2l6ZSA9IHNlcnZlcl90b19jYXBfbXNnLT5maWxlX3NpemU7Ci0JCQkJZmlsZV9vZmZzZXQgPSAwOwotCQkJCWZpbGVfbGVmdF9zaXplID0gZmlsZV9zaXplOwotCQkJCS8qIGRhdGEgZnJvbSBjYXAgdG8gc2VydmVyICovCi0JCQkJY2FwX3RvX3NlcnZlcl9tc2cuY21kID0gUkFNRFVNUF9QQ19GSUxFX0RBVEFfVFJBTlNfUkVROwotCQkJCWNhcF90b19zZXJ2ZXJfbXNnLmZpbGVfaWQgPSBmaWxlX2NudDsKLQkJCQljYXBfdG9fc2VydmVyX21zZy5vZmZzZXQgPSBmaWxlX29mZnNldDsKLQkJCQlpZiAoZmlsZV9zaXplID49IGRhdGFfdHJhbnNfbWF4KQotCQkJCQljYXBfdG9fc2VydmVyX21zZy5sZW5ndGggPSBkYXRhX3RyYW5zX21heDsKLQkJCQllbHNlCi0JCQkJCWNhcF90b19zZXJ2ZXJfbXNnLmxlbmd0aCA9IGZpbGVfc2l6ZTsKLQkJCQlmaWxlX3RyYW5zX3NpemUgPSBjYXBfdG9fc2VydmVyX21zZy5sZW5ndGg7Ci0JCQkJZmlsZV9sZWZ0X3NpemUgPSBmaWxlX2xlZnRfc2l6ZSAtIGNhcF90b19zZXJ2ZXJfbXNnLmxlbmd0aDsKLQkJCQlmaWxlX29mZnNldCA9IGZpbGVfb2Zmc2V0ICsgY2FwX3RvX3NlcnZlcl9tc2cubGVuZ3RoOwotCQkJCXByaW50aygiZGV2aWNlIG1lbW9yeSB0cmFucyBmaWxlOiVzICEhIVxuIiwgc2VydmVyX3RvX2NhcF9tc2ctPmZpbGVfbmFtZSk7Ci0JCQkJLyogaW50ZXJhY3RpdmUgZGF0YSB0cmFucyAqLwotCQkJCXJhbWR1bXBfb3NzX2RhdGFfdHJhbnNfd3JpdGUoCi0JCQkJCSh1bnNpZ25lZCBjaGFyKikoJmNhcF90b19zZXJ2ZXJfbXNnKSwgCi0JCQkJCXNpemVvZihjYXBfdG9fc2VydmVyX21zZykpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFJBTURVTVBfVFJBTlNfU0VSVkVSX0ZJTEVfREFUQV9UUkFOU19SU1A6Ci0JCQl7Ci0JCQkJaW50IHdyaXRlX2xlbiA9IDA7Ci0JCQkJcmFtZHVtcF9wY190cmFuc19kYXRhX3JzcCBjYXBfdG9fc2VydmVyX21zZyA9IHswfTsKLQkJCQkvKiBkYXRhIGZyb20gc2VydmVyIHRvIGNhcCAqLwotCQkJCXJhbWR1bXBfc2htZW1fdCAqc2VydmVyX3RvX2NhcF9tc2cgPSAocmFtZHVtcF9zaG1lbV90ICopcmFtZHVtcF9zaGFyZWRfbWVtX2Jhc2U7Ci0JCQkJc2VydmVyX3RvX2NhcF9tc2ctPmNvcmVfZmxhZyA9IDA7Ci0JCQkJLypkYXRhIGZyb20gY2FwIHRvIGVtbWMqLwotCQkJCQotCQkJCXdyaXRlX2xlbiA9IHJhbWR1bXBfZGV2aWNlX3dyaXRlX2RhdGEoc2VydmVyX3RvX2NhcF9tc2csIGZpbGVfbGVmdF9zaXplLCAmZmlsZV9kc3RsZW4pOwotCQkJCWlmKHdyaXRlX2xlbiA8IDApCi0JCQkJewotCQkJCQlyYW1kdW1wX3ByaW50ZigicmFtZHVtcCB3cml0ZSBlbW1jIGRhdGEgZXJyb3IhXG4iKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLyrF0LbPyqPT4LTz0KEqLwotCQkJCWlmIChmaWxlX2xlZnRfc2l6ZSA9PSAwKQotCQkJCXsKLQkJCQkJZmlsZV9jbnQrKzsKLQkJCQkJaWYgKGZpbGVfY250ID09IHJhbWR1bXBfZmlsZV9udW0pCi0JCQkJCXsKLQkJCQkJCWNhcF90b19zZXJ2ZXJfbXNnLmNtZCA9IFJBTURVTVBfUENfRklMRV9UUkFOU19ET05FX1JFUTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWNhcF90b19zZXJ2ZXJfbXNnLmNtZCA9IFJBTURVTVBfUENfRklMRV9JTkZPX1JFQURfUkVROwotCQkJCQkJY2FwX3RvX3NlcnZlcl9tc2cuZmlsZV9pZCA9IGZpbGVfY250OwotCQkJCQl9Ci0JCQkJCXJhbWR1bXBfZGV2aWNlX21vZGlmeV9maWxlX3NpemUoZmlsZV9kc3RsZW4pOwotCQkJCQlmaWxlX2RzdGxlbiA9IDA7Ci0JCQkJCXJhbWR1bXBfZGV2aWNlX2ZpbGVfY250Kys7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCS8qIGRhdGEgZnJvbSBjYXAgdG8gc2VydmVyICovCi0JCQkJCWlmIChmaWxlX2xlZnRfc2l6ZSA+PSBkYXRhX3RyYW5zX21heCkKLQkJCQkJCWNhcF90b19zZXJ2ZXJfbXNnLmxlbmd0aCA9IGRhdGFfdHJhbnNfbWF4OwotCQkJCQllbHNlCi0JCQkJCQljYXBfdG9fc2VydmVyX21zZy5sZW5ndGggPSBmaWxlX2xlZnRfc2l6ZTsKLQkJCQkJY2FwX3RvX3NlcnZlcl9tc2cuY21kID0gUkFNRFVNUF9QQ19GSUxFX0RBVEFfVFJBTlNfUkVROwotCQkJCQljYXBfdG9fc2VydmVyX21zZy5maWxlX2lkID0gZmlsZV9jbnQ7Ci0JCQkJCWNhcF90b19zZXJ2ZXJfbXNnLm9mZnNldCA9IGZpbGVfb2Zmc2V0OwotCQkJCQlmaWxlX2xlZnRfc2l6ZSA9IGZpbGVfbGVmdF9zaXplIC0gY2FwX3RvX3NlcnZlcl9tc2cubGVuZ3RoOwotCQkJCQlmaWxlX29mZnNldD0gZmlsZV9vZmZzZXQgKyBjYXBfdG9fc2VydmVyX21zZy5sZW5ndGg7Ci0JCQkJfQotCi0JCQkJcmFtZHVtcF9vc3NfZGF0YV90cmFuc193cml0ZSgodW5zaWduZWQgY2hhciAqKSgmY2FwX3RvX3NlcnZlcl9tc2cpLCBzaXplb2YoY2FwX3RvX3NlcnZlcl9tc2cpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNhc2UgUkFNRFVNUF9UUkFOU19TRVJWRVJfRklMRV9UUkFOU19ET05FX1JTUDoKLQkJCXsKLQkJCQlyYW1kdW1wX2RldmljZV93cml0ZV9sb2didWYoKTsKLQkJCQlyYW1kdW1wX2RldmljZV9jbG9zZSgpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWRlZmF1bHQ6Ci0JCQl7Ci0JCQkJZXJyb3JfY21kID0gUkFNRFVNUF9JTlRFUkFDVElWRV9DTURfRVJST1I7Ci0JCQkJcmFtZHVtcF9wcmludGYoInJhbWR1bXAgdHJhbnMgZW1tYyBlcnJvcjolZCFcbiIsIGVycm9yX2NtZCk7Ci0JCQkJLyogaW50ZXJhY3RpdmUgZGF0YSB0cmFucyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL25ldC84MDIxcS92bGFuX2Rldi5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvODAyMXEvdmxhbl9kZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODZhMWM5OS4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9saW51eC01LjEwL25ldC84MDIxcS92bGFuX2Rldi5jCisrKyAvZGV2L251bGwKQEAgLTEsODQyICswLDAgQEAKLS8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyCi0vKiAtKi0gbGludXgtYyAtKi0KLSAqIElORVQJCTgwMi4xUSBWTEFOCi0gKgkJRXRoZXJuZXQtdHlwZSBkZXZpY2UgaGFuZGxpbmcuCi0gKgotICogQXV0aG9yczoJQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+Ci0gKiAgICAgICAgICAgICAgUGxlYXNlIHNlbmQgc3VwcG9ydCByZWxhdGVkIGVtYWlsIHRvOiBuZXRkZXZAdmdlci5rZXJuZWwub3JnCi0gKiAgICAgICAgICAgICAgVkxBTiBIb21lIFBhZ2U6IGh0dHA6Ly93d3cuY2FuZGVsYXRlY2guY29tL35ncmVlYXIvdmxhbi5odG1sCi0gKgotICogRml4ZXM6ICAgICAgIE1hciAyMiAyMDAxOiBNYXJ0aW4gQm9rYWVtcGVyIDxtYm9rYWVtcGVyQHVuaXNwaGVyZW5ldHdvcmtzLmNvbT4KLSAqICAgICAgICAgICAgICAgIC0gcmVzZXQgc2tiLT5wa3RfdHlwZSBvbiBpbmNvbWluZyBwYWNrZXRzIHdoZW4gTUFDIHdhcyBjaGFuZ2VkCi0gKiAgICAgICAgICAgICAgICAtIHNlZSB0aGF0IGNoYW5nZWQgTUFDIGlzIHNhZGRyIGZvciBvdXRnb2luZyBwYWNrZXRzCi0gKiAgICAgICAgICAgICAgT2N0IDIwLCAyMDAxOiAgQXJkIHZhbiBCcmVlbWFuOgotICogICAgICAgICAgICAgICAgLSBGaXggTUMtbGlzdCwgZmluYWxseS4KLSAqICAgICAgICAgICAgICAgIC0gRmx1c2ggTUMtbGlzdCBvbiBWTEFOIGRlc3Ryb3kuCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldF90c3RhbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9waHkuaD4KLSNpbmNsdWRlIDxuZXQvYXJwLmg+Ci0KLSNpbmNsdWRlICJ2bGFuLmgiCi0jaW5jbHVkZSAidmxhbnByb2MuaCIKLSNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0cG9sbC5oPgotCi0vKgotICoJQ3JlYXRlIHRoZSBWTEFOIGhlYWRlciBmb3IgYW4gYXJiaXRyYXJ5IHByb3RvY29sIGxheWVyCi0gKgotICoJc2FkZHI9TlVMTAltZWFucyB1c2UgZGV2aWNlIHNvdXJjZSBhZGRyZXNzCi0gKglkYWRkcj1OVUxMCW1lYW5zIGxlYXZlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKGVnIHVucmVzb2x2ZWQgYXJwKQotICoKLSAqICBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBTS0IgaXMgbW92aW5nIGRvd24gdGhlIHN0YWNrIHRvd2FyZHMgdGhlCi0gKiAgcGh5c2ljYWwgZGV2aWNlcy4KLSAqLwotc3RhdGljIGludCB2bGFuX2Rldl9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXVuc2lnbmVkIHNob3J0IHR5cGUsCi0JCQkJY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLAotCQkJCXVuc2lnbmVkIGludCBsZW4pCi17Ci0Jc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7Ci0Jc3RydWN0IHZsYW5faGRyICp2aGRyOwotCXVuc2lnbmVkIGludCB2aGRybGVuID0gMDsKLQl1MTYgdmxhbl90Y2kgPSAwOwotCWludCByYzsKLQotCWlmICghKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX1JFT1JERVJfSERSKSkgewotCQl2aGRyID0gc2tiX3B1c2goc2tiLCBWTEFOX0hMRU4pOwotCi0JCXZsYW5fdGNpID0gdmxhbi0+dmxhbl9pZDsKLQkJdmxhbl90Y2kgfD0gdmxhbl9kZXZfZ2V0X2VncmVzc19xb3NfbWFzayhkZXYsIHNrYi0+cHJpb3JpdHkpOwotCQl2aGRyLT5oX3ZsYW5fVENJID0gaHRvbnModmxhbl90Y2kpOwotCi0JCS8qCi0JCSAqICBTZXQgdGhlIHByb3RvY29sIHR5cGUuIEZvciBhIHBhY2tldCBvZiB0eXBlIEVUSF9QXzgwMl8zLzIgd2UKLQkJICogIHB1dCB0aGUgbGVuZ3RoIGluIGhlcmUgaW5zdGVhZC4KLQkJICovCi0JCWlmICh0eXBlICE9IEVUSF9QXzgwMl8zICYmIHR5cGUgIT0gRVRIX1BfODAyXzIpCi0JCQl2aGRyLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvID0gaHRvbnModHlwZSk7Ci0JCWVsc2UKLQkJCXZoZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG8gPSBodG9ucyhsZW4pOwotCi0JCXNrYi0+cHJvdG9jb2wgPSB2bGFuLT52bGFuX3Byb3RvOwotCQl0eXBlID0gbnRvaHModmxhbi0+dmxhbl9wcm90byk7Ci0JCXZoZHJsZW4gPSBWTEFOX0hMRU47Ci0JfQotCi0JLyogQmVmb3JlIGRlbGVnYXRpbmcgd29yayB0byB0aGUgbG93ZXIgbGF5ZXIsIGVudGVyIG91ciBNQUMtYWRkcmVzcyAqLwotCWlmIChzYWRkciA9PSBOVUxMKQotCQlzYWRkciA9IGRldi0+ZGV2X2FkZHI7Ci0KLQkvKiBOb3cgbWFrZSB0aGUgdW5kZXJseWluZyByZWFsIGhhcmQgaGVhZGVyICovCi0JZGV2ID0gdmxhbi0+cmVhbF9kZXY7Ci0JcmMgPSBkZXZfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuICsgdmhkcmxlbik7Ci0JaWYgKHJjID4gMCkKLQkJcmMgKz0gdmhkcmxlbjsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbmV0ZGV2X3R4X3Qgdmxhbl9uZXRwb2xsX3NlbmRfc2tiKHN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCi0JcmV0dXJuIG5ldHBvbGxfc2VuZF9za2Iodmxhbi0+bmV0cG9sbCwgc2tiKTsKLSNlbHNlCi0JQlVHKCk7Ci0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLSNlbmRpZgotfQotCi1zdGF0aWMgbmV0ZGV2X3R4X3Qgdmxhbl9kZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdihkZXYpOwotCXN0cnVjdCB2bGFuX2V0aGhkciAqdmV0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKikoc2tiLT5kYXRhKTsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWludCByZXQ7Ci0KLQkvKiBIYW5kbGUgbm9uLVZMQU4gZnJhbWVzIGlmIHRoZXkgYXJlIHNlbnQgdG8gdXMsIGZvciBleGFtcGxlIGJ5IERIQ1AuCi0JICoKLQkgKiBOT1RFOiBUSElTIEFTU1VNRVMgRElYIEVUSEVSTkVULCBTUEVDSUZJQ0FMTFkgTk9UIFNVUFBPUlRJTkcKLQkgKiBPVEhFUiBUSElOR1MgTElLRSBGRERJL1Rva2VuUmluZy84MDIuMyBTTkFQcy4uLgotCSAqLwotCWlmICh2ZXRoLT5oX3ZsYW5fcHJvdG8gIT0gdmxhbi0+dmxhbl9wcm90byB8fAotCSAgICB2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19SRU9SREVSX0hEUikgewotCQl1MTYgdmxhbl90Y2k7Ci0JCXZsYW5fdGNpID0gdmxhbi0+dmxhbl9pZDsKLQkJdmxhbl90Y2kgfD0gdmxhbl9kZXZfZ2V0X2VncmVzc19xb3NfbWFzayhkZXYsIHNrYi0+cHJpb3JpdHkpOwotCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbi0+dmxhbl9wcm90bywgdmxhbl90Y2kpOwotCX0KLQotCXNrYi0+ZGV2ID0gdmxhbi0+cmVhbF9kZXY7Ci0JbGVuID0gc2tiLT5sZW47Ci0JaWYgKHVubGlrZWx5KG5ldHBvbGxfdHhfcnVubmluZyhkZXYpKSkKLQkJcmV0dXJuIHZsYW5fbmV0cG9sbF9zZW5kX3NrYih2bGFuLCBza2IpOwotCi0JcmV0ID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKLQotCWlmIChsaWtlbHkocmV0ID09IE5FVF9YTUlUX1NVQ0NFU1MgfHwgcmV0ID09IE5FVF9YTUlUX0NOKSkgewotCQlzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzICpzdGF0czsKLQotCQlzdGF0cyA9IHRoaXNfY3B1X3B0cih2bGFuLT52bGFuX3BjcHVfc3RhdHMpOwotCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luY3ApOwotCQlzdGF0cy0+dHhfcGFja2V0cysrOwotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuOwotCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmNwKTsKLQl9IGVsc2UgewotCQl0aGlzX2NwdV9pbmModmxhbi0+dmxhbl9wY3B1X3N0YXRzLT50eF9kcm9wcGVkKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHZsYW5fZGV2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKLQl1bnNpZ25lZCBpbnQgbWF4X210dSA9IHJlYWxfZGV2LT5tdHU7Ci0KLQlpZiAobmV0aWZfcmVkdWNlc192bGFuX210dShyZWFsX2RldikpCi0JCW1heF9tdHUgLT0gVkxBTl9ITEVOOwotCWlmIChtYXhfbXR1IDwgbmV3X210dSkKLQkJcmV0dXJuIC1FUkFOR0U7Ci0KLQlkZXYtPm10dSA9IG5ld19tdHU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB2bGFuX2Rldl9zZXRfaW5ncmVzc19wcmlvcml0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgIHUzMiBza2JfcHJpbywgdTE2IHZsYW5fcHJpbykKLXsKLQlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQotCWlmICh2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFt2bGFuX3ByaW8gJiAweDddICYmICFza2JfcHJpbykKLQkJdmxhbi0+bnJfaW5ncmVzc19tYXBwaW5ncy0tOwotCWVsc2UgaWYgKCF2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFt2bGFuX3ByaW8gJiAweDddICYmIHNrYl9wcmlvKQotCQl2bGFuLT5ucl9pbmdyZXNzX21hcHBpbmdzKys7Ci0KLQl2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFt2bGFuX3ByaW8gJiAweDddID0gc2tiX3ByaW87Ci19Ci0KLWludCB2bGFuX2Rldl9zZXRfZWdyZXNzX3ByaW9yaXR5KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHUzMiBza2JfcHJpbywgdTE2IHZsYW5fcHJpbykKLXsKLQlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqbXAgPSBOVUxMOwotCXN0cnVjdCB2bGFuX3ByaW9yaXR5X3RjaV9tYXBwaW5nICpucDsKLQl1MzIgdmxhbl9xb3MgPSAodmxhbl9wcmlvIDw8IFZMQU5fUFJJT19TSElGVCkgJiBWTEFOX1BSSU9fTUFTSzsKLQotCS8qIFNlZSBpZiBhIHByaW9yaXR5IG1hcHBpbmcgZXhpc3RzLi4gKi8KLQltcCA9IHZsYW4tPmVncmVzc19wcmlvcml0eV9tYXBbc2tiX3ByaW8gJiAweEZdOwotCXdoaWxlIChtcCkgewotCQlpZiAobXAtPnByaW9yaXR5ID09IHNrYl9wcmlvKSB7Ci0JCQlpZiAobXAtPnZsYW5fcW9zICYmICF2bGFuX3FvcykKLQkJCQl2bGFuLT5ucl9lZ3Jlc3NfbWFwcGluZ3MtLTsKLQkJCWVsc2UgaWYgKCFtcC0+dmxhbl9xb3MgJiYgdmxhbl9xb3MpCi0JCQkJdmxhbi0+bnJfZWdyZXNzX21hcHBpbmdzKys7Ci0JCQltcC0+dmxhbl9xb3MgPSB2bGFuX3FvczsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW1wID0gbXAtPm5leHQ7Ci0JfQotCi0JLyogQ3JlYXRlIGEgbmV3IG1hcHBpbmcgdGhlbi4gKi8KLQltcCA9IHZsYW4tPmVncmVzc19wcmlvcml0eV9tYXBbc2tiX3ByaW8gJiAweEZdOwotCW5wID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZsYW5fcHJpb3JpdHlfdGNpX21hcHBpbmcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wKQotCQlyZXR1cm4gLUVOT0JVRlM7Ci0KLQlucC0+bmV4dCA9IG1wOwotCW5wLT5wcmlvcml0eSA9IHNrYl9wcmlvOwotCW5wLT52bGFuX3FvcyA9IHZsYW5fcW9zOwotCS8qIEJlZm9yZSBpbnNlcnRpbmcgdGhpcyBlbGVtZW50IGluIGhhc2ggdGFibGUsIG1ha2Ugc3VyZSBhbGwgaXRzIGZpZWxkcwotCSAqIGFyZSBjb21taXR0ZWQgdG8gbWVtb3J5LgotCSAqIGNvdXBsZWQgd2l0aCBzbXBfcm1iKCkgaW4gdmxhbl9kZXZfZ2V0X2VncmVzc19xb3NfbWFzaygpCi0JICovCi0Jc21wX3dtYigpOwotCXZsYW4tPmVncmVzc19wcmlvcml0eV9tYXBbc2tiX3ByaW8gJiAweEZdID0gbnA7Ci0JaWYgKHZsYW5fcW9zKQotCQl2bGFuLT5ucl9lZ3Jlc3NfbWFwcGluZ3MrKzsKLQlyZXR1cm4gMDsKLX0KLQotLyogRmxhZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHZsYW5fZmxhZ3MgZW51bSBpbgotICogaW5jbHVkZS91YXBpL2xpbnV4L2lmX3ZsYW4uaCBmaWxlLgotICovCi1pbnQgdmxhbl9kZXZfY2hhbmdlX2ZsYWdzKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmbGFncywgdTMyIG1hc2spCi17Ci0Jc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7Ci0JdTMyIG9sZF9mbGFncyA9IHZsYW4tPmZsYWdzOwotCi0JaWYgKG1hc2sgJiB+KFZMQU5fRkxBR19SRU9SREVSX0hEUiB8IFZMQU5fRkxBR19HVlJQIHwKLQkJICAgICBWTEFOX0ZMQUdfTE9PU0VfQklORElORyB8IFZMQU5fRkxBR19NVlJQIHwKLQkJICAgICBWTEFOX0ZMQUdfQlJJREdFX0JJTkRJTkcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZsYW4tPmZsYWdzID0gKG9sZF9mbGFncyAmIH5tYXNrKSB8IChmbGFncyAmIG1hc2spOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiAodmxhbi0+ZmxhZ3MgXiBvbGRfZmxhZ3MpICYgVkxBTl9GTEFHX0dWUlApIHsKLQkJaWYgKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX0dWUlApCi0JCQl2bGFuX2d2cnBfcmVxdWVzdF9qb2luKGRldik7Ci0JCWVsc2UKLQkJCXZsYW5fZ3ZycF9yZXF1ZXN0X2xlYXZlKGRldik7Ci0JfQotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiAodmxhbi0+ZmxhZ3MgXiBvbGRfZmxhZ3MpICYgVkxBTl9GTEFHX01WUlApIHsKLQkJaWYgKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX01WUlApCi0JCQl2bGFuX212cnBfcmVxdWVzdF9qb2luKGRldik7Ci0JCWVsc2UKLQkJCXZsYW5fbXZycF9yZXF1ZXN0X2xlYXZlKGRldik7Ci0JfQotCXJldHVybiAwOwotfQotCi12b2lkIHZsYW5fZGV2X2dldF9yZWFsZGV2X25hbWUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqcmVzdWx0KQotewotCXN0cm5jcHkocmVzdWx0LCB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2LT5uYW1lLCAyMyk7Ci19Ci0KLWJvb2wgdmxhbl9kZXZfaW5oZXJpdF9hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYpCi17Ci0JaWYgKGRldi0+YWRkcl9hc3NpZ25fdHlwZSAhPSBORVRfQUREUl9TVE9MRU4pCi0JCXJldHVybiBmYWxzZTsKLQotCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpOwotCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfQ0hBTkdFQUREUiwgZGV2KTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCB2bGFuX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbi0+cmVhbF9kZXY7Ci0JaW50IGVycjsKLQotCWlmICghKHJlYWxfZGV2LT5mbGFncyAmIElGRl9VUCkgJiYKLQkgICAgISh2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19MT09TRV9CSU5ESU5HKSkKLQkJcmV0dXJuIC1FTkVURE9XTjsKLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChkZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpICYmCi0JICAgICF2bGFuX2Rldl9pbmhlcml0X2FkZHJlc3MoZGV2LCByZWFsX2RldikpIHsKLQkJZXJyID0gZGV2X3VjX2FkZChyZWFsX2RldiwgZGV2LT5kZXZfYWRkcik7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKLQkJZXJyID0gZGV2X3NldF9hbGxtdWx0aShyZWFsX2RldiwgMSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJZ290byBkZWxfdW5pY2FzdDsKLQl9Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewotCQllcnIgPSBkZXZfc2V0X3Byb21pc2N1aXR5KHJlYWxfZGV2LCAxKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIGNsZWFyX2FsbG11bHRpOwotCX0KLQotCWV0aGVyX2FkZHJfY29weSh2bGFuLT5yZWFsX2Rldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpOwotCi0JaWYgKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX0dWUlApCi0JCXZsYW5fZ3ZycF9yZXF1ZXN0X2pvaW4oZGV2KTsKLQotCWlmICh2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19NVlJQKQotCQl2bGFuX212cnBfcmVxdWVzdF9qb2luKGRldik7Ci0KLQlpZiAobmV0aWZfY2Fycmllcl9vayhyZWFsX2RldikgJiYKLQkgICAgISh2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19CUklER0VfQklORElORykpCi0JCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKLQlyZXR1cm4gMDsKLQotY2xlYXJfYWxsbXVsdGk6Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCi0JCWRldl9zZXRfYWxsbXVsdGkocmVhbF9kZXYsIC0xKTsKLWRlbF91bmljYXN0OgotCWlmICghZXRoZXJfYWRkcl9lcXVhbChkZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpKQotCQlkZXZfdWNfZGVsKHJlYWxfZGV2LCBkZXYtPmRldl9hZGRyKTsKLW91dDoKLQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgdmxhbl9kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW4tPnJlYWxfZGV2OwotCi0JZGV2X21jX3Vuc3luYyhyZWFsX2RldiwgZGV2KTsKLQlkZXZfdWNfdW5zeW5jKHJlYWxfZGV2LCBkZXYpOwotCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQotCQlkZXZfc2V0X2FsbG11bHRpKHJlYWxfZGV2LCAtMSk7Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJZGV2X3NldF9wcm9taXNjdWl0eShyZWFsX2RldiwgLTEpOwotCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKGRldi0+ZGV2X2FkZHIsIHJlYWxfZGV2LT5kZXZfYWRkcikpCi0JCWRldl91Y19kZWwocmVhbF9kZXYsIGRldi0+ZGV2X2FkZHIpOwotCi0JaWYgKCEodmxhbi0+ZmxhZ3MgJiBWTEFOX0ZMQUdfQlJJREdFX0JJTkRJTkcpKQotCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZsYW5fZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKLQlpbnQgZXJyOwotCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHItPnNhX2RhdGEpKQotCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Ci0KLQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX1VQKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoYWRkci0+c2FfZGF0YSwgcmVhbF9kZXYtPmRldl9hZGRyKSkgewotCQllcnIgPSBkZXZfdWNfYWRkKHJlYWxfZGV2LCBhZGRyLT5zYV9kYXRhKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChkZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpKQotCQlkZXZfdWNfZGVsKHJlYWxfZGV2LCBkZXYtPmRldl9hZGRyKTsKLQotb3V0OgotCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2bGFuX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7Ci0Jc3RydWN0IGlmcmVxIGlmcnI7Ci0JaW50IGVyciA9IC1FT1BOT1RTVVBQOwotCi0Jc3RybmNweShpZnJyLmlmcl9uYW1lLCByZWFsX2Rldi0+bmFtZSwgSUZOQU1TSVopOwotCWlmcnIuaWZyX2lmcnUgPSBpZnItPmlmcl9pZnJ1OwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNJT0NTSFdUU1RBTVA6Ci0JCWlmICghbmV0X2VxKGRldl9uZXQoZGV2KSwgJmluaXRfbmV0KSkKLQkJCWJyZWFrOwotCQlmYWxsdGhyb3VnaDsKLQljYXNlIFNJT0NHTUlJUEhZOgotCWNhc2UgU0lPQ0dNSUlSRUc6Ci0JY2FzZSBTSU9DU01JSVJFRzoKLQljYXNlIFNJT0NHSFdUU1RBTVA6Ci0JCWlmIChuZXRpZl9kZXZpY2VfcHJlc2VudChyZWFsX2RldikgJiYgb3BzLT5uZG9fZG9faW9jdGwpCi0JCQllcnIgPSBvcHMtPm5kb19kb19pb2N0bChyZWFsX2RldiwgJmlmcnIsIGNtZCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmICghZXJyKQotCQlpZnItPmlmcl9pZnJ1ID0gaWZyci5pZnJfaWZydTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgdmxhbl9kZXZfbmVpZ2hfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoX3Bhcm1zICpwYSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmV0aWZfZGV2aWNlX3ByZXNlbnQocmVhbF9kZXYpICYmIG9wcy0+bmRvX25laWdoX3NldHVwKQotCQllcnIgPSBvcHMtPm5kb19uZWlnaF9zZXR1cChyZWFsX2RldiwgcGEpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZDT0UpCi1zdGF0aWMgaW50IHZsYW5fZGV2X2Zjb2VfZGRwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB4aWQsCi0JCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2MpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwotCWludCByYyA9IDA7Ci0KLQlpZiAob3BzLT5uZG9fZmNvZV9kZHBfc2V0dXApCi0JCXJjID0gb3BzLT5uZG9fZmNvZV9kZHBfc2V0dXAocmVhbF9kZXYsIHhpZCwgc2dsLCBzZ2MpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZsYW5fZGV2X2Zjb2VfZGRwX2RvbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHhpZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAob3BzLT5uZG9fZmNvZV9kZHBfZG9uZSkKLQkJbGVuID0gb3BzLT5uZG9fZmNvZV9kZHBfZG9uZShyZWFsX2RldiwgeGlkKTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCWlmIChvcHMtPm5kb19mY29lX2VuYWJsZSkKLQkJcmMgPSBvcHMtPm5kb19mY29lX2VuYWJsZShyZWFsX2Rldik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHZsYW5fZGV2X2Zjb2VfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7Ci0JY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSByZWFsX2Rldi0+bmV0ZGV2X29wczsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JaWYgKG9wcy0+bmRvX2Zjb2VfZGlzYWJsZSkKLQkJcmMgPSBvcHMtPm5kb19mY29lX2Rpc2FibGUocmVhbF9kZXYpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCB2bGFuX2Rldl9mY29lX2RkcF90YXJnZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHhpZCwKLQkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2MpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwotCWludCByYyA9IDA7Ci0KLQlpZiAob3BzLT5uZG9fZmNvZV9kZHBfdGFyZ2V0KQotCQlyYyA9IG9wcy0+bmRvX2Zjb2VfZGRwX3RhcmdldChyZWFsX2RldiwgeGlkLCBzZ2wsIHNnYyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIE5FVERFVl9GQ09FX1dXTk4KLXN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9nZXRfd3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU2NCAqd3duLCBpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7Ci0JaW50IHJjID0gLUVJTlZBTDsKLQotCWlmIChvcHMtPm5kb19mY29lX2dldF93d24pCi0JCXJjID0gb3BzLT5uZG9fZmNvZV9nZXRfd3duKHJlYWxfZGV2LCB3d24sIHR5cGUpOwotCXJldHVybiByYzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB2bGFuX2Rldl9jaGFuZ2VfcnhfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNoYW5nZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCi0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKLQkJaWYgKGNoYW5nZSAmIElGRl9BTExNVUxUSSkKLQkJCWRldl9zZXRfYWxsbXVsdGkocmVhbF9kZXYsIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgPyAxIDogLTEpOwotCQlpZiAoY2hhbmdlICYgSUZGX1BST01JU0MpCi0JCQlkZXZfc2V0X3Byb21pc2N1aXR5KHJlYWxfZGV2LCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAxIDogLTEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdmxhbl9kZXZfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2KQotewotCWRldl9tY19zeW5jKHZsYW5fZGV2X3ByaXYodmxhbl9kZXYpLT5yZWFsX2Rldiwgdmxhbl9kZXYpOwotCWRldl91Y19zeW5jKHZsYW5fZGV2X3ByaXYodmxhbl9kZXYpLT5yZWFsX2Rldiwgdmxhbl9kZXYpOwotfQotCi0vKgotICogdmxhbiBuZXR3b3JrIGRldmljZXMgaGF2ZSBkZXZpY2VzIG5lc3RpbmcgYmVsb3cgaXQsIGFuZCBhcmUgYSBzcGVjaWFsCi0gKiAic3VwZXIgY2xhc3MiIG9mIG5vcm1hbCBuZXR3b3JrIGRldmljZXM7IHNwbGl0IHRoZWlyIGxvY2tzIG9mZiBpbnRvIGEKLSAqIHNlcGFyYXRlIGNsYXNzIHNpbmNlIHRoZXkgYWx3YXlzIG5lc3QuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgdmxhbl9uZXRkZXZfeG1pdF9sb2NrX2tleTsKLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgdmxhbl9uZXRkZXZfYWRkcl9sb2NrX2tleTsKLQotc3RhdGljIHZvaWQgdmxhbl9kZXZfc2V0X2xvY2tkZXBfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEsCi0JCQkJICAgICB2b2lkICp1bnVzZWQpCi17Ci0JbG9ja2RlcF9zZXRfY2xhc3MoJnR4cS0+X3htaXRfbG9jaywgJnZsYW5fbmV0ZGV2X3htaXRfbG9ja19rZXkpOwotfQotCi1zdGF0aWMgdm9pZCB2bGFuX2Rldl9zZXRfbG9ja2RlcF9jbGFzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXYtPmFkZHJfbGlzdF9sb2NrLAotCQkJICAmdmxhbl9uZXRkZXZfYWRkcl9sb2NrX2tleSk7Ci0JbmV0ZGV2X2Zvcl9lYWNoX3R4X3F1ZXVlKGRldiwgdmxhbl9kZXZfc2V0X2xvY2tkZXBfb25lLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIHZsYW5faGVhZGVyX29wcyA9IHsKLQkuY3JlYXRlCSA9IHZsYW5fZGV2X2hhcmRfaGVhZGVyLAotCS5wYXJzZQkgPSBldGhfaGVhZGVyX3BhcnNlLAotfTsKLQotc3RhdGljIGludCB2bGFuX3Bhc3N0aHJ1X2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAotCQkJCSAgICAgY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLAotCQkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKLXsKLQlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuLT5yZWFsX2RldjsKLQotCWlmIChzYWRkciA9PSBOVUxMKQotCQlzYWRkciA9IGRldi0+ZGV2X2FkZHI7Ci0KLQlyZXR1cm4gZGV2X2hhcmRfaGVhZGVyKHNrYiwgcmVhbF9kZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIHZsYW5fcGFzc3RocnVfaGVhZGVyX29wcyA9IHsKLQkuY3JlYXRlCSA9IHZsYW5fcGFzc3RocnVfaGFyZF9oZWFkZXIsCi0JLnBhcnNlCSA9IGV0aF9oZWFkZXJfcGFyc2UsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldmljZV90eXBlIHZsYW5fdHlwZSA9IHsKLQkubmFtZQk9ICJ2bGFuIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdmxhbl9uZXRkZXZfb3BzOwotCi1zdGF0aWMgaW50IHZsYW5fZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuLT5yZWFsX2RldjsKLQotCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7Ci0KLQkvKiBJRkZfQlJPQURDQVNUfElGRl9NVUxUSUNBU1Q7ID8/PyAqLwotCWRldi0+ZmxhZ3MgID0gcmVhbF9kZXYtPmZsYWdzICYgfihJRkZfVVAgfCBJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSSB8Ci0JCQkJCSAgSUZGX01BU1RFUiB8IElGRl9TTEFWRSk7Ci0JZGV2LT5zdGF0ZSAgPSAocmVhbF9kZXYtPnN0YXRlICYgKCgxPDxfX0xJTktfU1RBVEVfTk9DQVJSSUVSKSB8Ci0JCQkJCSAgKDE8PF9fTElOS19TVEFURV9ET1JNQU5UKSkpIHwKLQkJICAgICAgKDE8PF9fTElOS19TVEFURV9QUkVTRU5UKTsKLQotCWlmICh2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19CUklER0VfQklORElORykKLQkJZGV2LT5zdGF0ZSB8PSAoMSA8PCBfX0xJTktfU1RBVEVfTk9DQVJSSUVSKTsKLQotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1NHIHwKLQkJCSAgIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0dTT19TT0ZUV0FSRSB8Ci0JCQkgICBORVRJRl9GX0dTT19FTkNBUF9BTEwgfAotCQkJICAgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9TQ1RQX0NSQyB8Ci0JCQkgICBORVRJRl9GX0FMTF9GQ09FOwotCi0JZGV2LT5mZWF0dXJlcyB8PSBkZXYtPmh3X2ZlYXR1cmVzIHwgTkVUSUZfRl9MTFRYOwotCWRldi0+Z3NvX21heF9zaXplID0gcmVhbF9kZXYtPmdzb19tYXhfc2l6ZTsKLQlkZXYtPmdzb19tYXhfc2VncyA9IHJlYWxfZGV2LT5nc29fbWF4X3NlZ3M7Ci0JaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1ZMQU5fRkVBVFVSRVMpCi0JCW5ldGRldl93YXJuKHJlYWxfZGV2LCAiVkxBTiBmZWF0dXJlcyBhcmUgc2V0IGluY29ycmVjdGx5LiAgUS1pbi1RIGNvbmZpZ3VyYXRpb25zIG1heSBub3Qgd29yayBjb3JyZWN0bHkuXG4iKTsKLQotCWRldi0+dmxhbl9mZWF0dXJlcyA9IHJlYWxfZGV2LT52bGFuX2ZlYXR1cmVzICYgfk5FVElGX0ZfQUxMX0ZDT0U7Ci0JZGV2LT5od19lbmNfZmVhdHVyZXMgPSB2bGFuX3RubF9mZWF0dXJlcyhyZWFsX2Rldik7Ci0JZGV2LT5tcGxzX2ZlYXR1cmVzID0gcmVhbF9kZXYtPm1wbHNfZmVhdHVyZXM7Ci0KLQkvKiBpcHY2IHNoYXJlZCBjYXJkIHJlbGF0ZWQgc3R1ZmYgKi8KLQlkZXYtPmRldl9pZCA9IHJlYWxfZGV2LT5kZXZfaWQ7Ci0KLQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7Ci0JCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCByZWFsX2Rldi0+ZGV2X2FkZHIpOwotCQlkZXYtPmFkZHJfYXNzaWduX3R5cGUgPSBORVRfQUREUl9TVE9MRU47Ci0JfQotCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoZGV2LT5icm9hZGNhc3QpKQotCQltZW1jcHkoZGV2LT5icm9hZGNhc3QsIHJlYWxfZGV2LT5icm9hZGNhc3QsIGRldi0+YWRkcl9sZW4pOwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfRkNPRSkKLQlkZXYtPmZjb2VfZGRwX3hpZCA9IHJlYWxfZGV2LT5mY29lX2RkcF94aWQ7Ci0jZW5kaWYKLQotCWRldi0+bmVlZGVkX2hlYWRyb29tID0gcmVhbF9kZXYtPm5lZWRlZF9oZWFkcm9vbTsKLQlpZiAodmxhbl9od19vZmZsb2FkX2NhcGFibGUocmVhbF9kZXYtPmZlYXR1cmVzLCB2bGFuLT52bGFuX3Byb3RvKSkgewotCQlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZ2bGFuX3Bhc3N0aHJ1X2hlYWRlcl9vcHM7Ci0JCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcmVhbF9kZXYtPmhhcmRfaGVhZGVyX2xlbjsKLQl9IGVsc2UgewotCQlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZ2bGFuX2hlYWRlcl9vcHM7Ci0JCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcmVhbF9kZXYtPmhhcmRfaGVhZGVyX2xlbiArIFZMQU5fSExFTjsKLQl9Ci0KLQlkZXYtPm5ldGRldl9vcHMgPSAmdmxhbl9uZXRkZXZfb3BzOwotCi0JU0VUX05FVERFVl9ERVZUWVBFKGRldiwgJnZsYW5fdHlwZSk7Ci0KLQl2bGFuX2Rldl9zZXRfbG9ja2RlcF9jbGFzcyhkZXYpOwotCi0Jdmxhbi0+dmxhbl9wY3B1X3N0YXRzID0gbmV0ZGV2X2FsbG9jX3BjcHVfc3RhdHMoc3RydWN0IHZsYW5fcGNwdV9zdGF0cyk7Ci0JaWYgKCF2bGFuLT52bGFuX3BjcHVfc3RhdHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogR2V0IHZsYW4ncyByZWZlcmVuY2UgdG8gcmVhbF9kZXYgKi8KLQlkZXZfaG9sZChyZWFsX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogTm90ZTogdGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lIGRldmljZS4gKi8KLXZvaWQgdmxhbl9kZXZfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHZsYW5fcHJpb3JpdHlfdGNpX21hcHBpbmcgKnBtOwotCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdihkZXYpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmxhbi0+ZWdyZXNzX3ByaW9yaXR5X21hcCk7IGkrKykgewotCQl3aGlsZSAoKHBtID0gdmxhbi0+ZWdyZXNzX3ByaW9yaXR5X21hcFtpXSkgIT0gTlVMTCkgewotCQkJdmxhbi0+ZWdyZXNzX3ByaW9yaXR5X21hcFtpXSA9IHBtLT5uZXh0OwotCQkJa2ZyZWUocG0pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3Qgdmxhbl9kZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKLQluZXRkZXZfZmVhdHVyZXNfdCBvbGRfZmVhdHVyZXMgPSBmZWF0dXJlczsKLQluZXRkZXZfZmVhdHVyZXNfdCBsb3dlcl9mZWF0dXJlczsKLQotCWxvd2VyX2ZlYXR1cmVzID0gbmV0ZGV2X2ludGVyc2VjdF9mZWF0dXJlcygocmVhbF9kZXYtPnZsYW5fZmVhdHVyZXMgfAotCQkJCQkJICAgIE5FVElGX0ZfUlhDU1VNKSwKLQkJCQkJCSAgIHJlYWxfZGV2LT5mZWF0dXJlcyk7Ci0KLQkvKiBBZGQgSFdfQ1NVTSBzZXR0aW5nIHRvIHByZXNlcnZlIHVzZXIgYWJpbGl0eSB0byBjb250cm9sCi0JICogY2hlY2tzdW0gb2ZmbG9hZCBvbiB0aGUgdmxhbiBkZXZpY2UuCi0JICovCi0JaWYgKGxvd2VyX2ZlYXR1cmVzICYgKE5FVElGX0ZfSVBfQ1NVTXxORVRJRl9GX0lQVjZfQ1NVTSkpCi0JCWxvd2VyX2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKLQlmZWF0dXJlcyA9IG5ldGRldl9pbnRlcnNlY3RfZmVhdHVyZXMoZmVhdHVyZXMsIGxvd2VyX2ZlYXR1cmVzKTsKLQlmZWF0dXJlcyB8PSBvbGRfZmVhdHVyZXMgJiAoTkVUSUZfRl9TT0ZUX0ZFQVRVUkVTIHwgTkVUSUZfRl9HU09fU09GVFdBUkUpOwotCWZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKLQotCXJldHVybiBmZWF0dXJlczsKLX0KLQotc3RhdGljIGludCB2bGFuX2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCi17Ci0JY29uc3Qgc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7Ci0KLQlyZXR1cm4gX19ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncyh2bGFuLT5yZWFsX2RldiwgY21kKTsKLX0KLQotc3RhdGljIHZvaWQgdmxhbl9ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCB2bGFuX2Z1bGxuYW1lLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7Ci0Jc3RybGNweShpbmZvLT52ZXJzaW9uLCB2bGFuX3ZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0Jc3RybGNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKLX0KLQotc3RhdGljIGludCB2bGFuX2V0aHRvb2xfZ2V0X3RzX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGV0aHRvb2xfdHNfaW5mbyAqaW5mbykKLXsKLQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQljb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKm9wcyA9IHZsYW4tPnJlYWxfZGV2LT5ldGh0b29sX29wczsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gdmxhbi0+cmVhbF9kZXYtPnBoeWRldjsKLQotCWlmIChwaHlfaGFzX3RzaW5mbyhwaHlkZXYpKSB7Ci0JCXJldHVybiBwaHlfdHNfaW5mbyhwaHlkZXYsIGluZm8pOwotCX0gZWxzZSBpZiAob3BzLT5nZXRfdHNfaW5mbykgewotCQlyZXR1cm4gb3BzLT5nZXRfdHNfaW5mbyh2bGFuLT5yZWFsX2RldiwgaW5mbyk7Ci0JfSBlbHNlIHsKLQkJaW5mby0+c29fdGltZXN0YW1waW5nID0gU09GX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSB8Ci0JCQlTT0ZfVElNRVNUQU1QSU5HX1NPRlRXQVJFOwotCQlpbmZvLT5waGNfaW5kZXggPSAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmxhbl9kZXZfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKLXsKLQlzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzICpwOwotCXUzMiByeF9lcnJvcnMgPSAwLCB0eF9kcm9wcGVkID0gMDsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXU2NCByeHBhY2tldHMsIHJ4Ynl0ZXMsIHJ4bXVsdGljYXN0LCB0eHBhY2tldHMsIHR4Ynl0ZXM7Ci0JCXVuc2lnbmVkIGludCBzdGFydDsKLQotCQlwID0gcGVyX2NwdV9wdHIodmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX3BjcHVfc3RhdHMsIGkpOwotCQlkbyB7Ci0JCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJnAtPnN5bmNwKTsKLQkJCXJ4cGFja2V0cwk9IHAtPnJ4X3BhY2tldHM7Ci0JCQlyeGJ5dGVzCQk9IHAtPnJ4X2J5dGVzOwotCQkJcnhtdWx0aWNhc3QJPSBwLT5yeF9tdWx0aWNhc3Q7Ci0JCQl0eHBhY2tldHMJPSBwLT50eF9wYWNrZXRzOwotCQkJdHhieXRlcwkJPSBwLT50eF9ieXRlczsKLQkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycSgmcC0+c3luY3AsIHN0YXJ0KSk7Ci0KLQkJc3RhdHMtPnJ4X3BhY2tldHMJKz0gcnhwYWNrZXRzOwotCQlzdGF0cy0+cnhfYnl0ZXMJCSs9IHJ4Ynl0ZXM7Ci0JCXN0YXRzLT5tdWx0aWNhc3QJKz0gcnhtdWx0aWNhc3Q7Ci0JCXN0YXRzLT50eF9wYWNrZXRzCSs9IHR4cGFja2V0czsKLQkJc3RhdHMtPnR4X2J5dGVzCQkrPSB0eGJ5dGVzOwotCQkvKiByeF9lcnJvcnMgJiB0eF9kcm9wcGVkIGFyZSB1MzIgKi8KLQkJcnhfZXJyb3JzCSs9IHAtPnJ4X2Vycm9yczsKLQkJdHhfZHJvcHBlZAkrPSBwLT50eF9kcm9wcGVkOwotCX0KLQlzdGF0cy0+cnhfZXJyb3JzICA9IHJ4X2Vycm9yczsKLQlzdGF0cy0+dHhfZHJvcHBlZCA9IHR4X2Ryb3BwZWQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotc3RhdGljIHZvaWQgdmxhbl9kZXZfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IHZsYW5fZGV2X25ldHBvbGxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvKQotewotCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW4tPnJlYWxfZGV2OwotCXN0cnVjdCBuZXRwb2xsICpuZXRwb2xsOwotCWludCBlcnIgPSAwOwotCi0JbmV0cG9sbCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXRwb2xsKSwgR0ZQX0tFUk5FTCk7Ci0JZXJyID0gLUVOT01FTTsKLQlpZiAoIW5ldHBvbGwpCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gX19uZXRwb2xsX3NldHVwKG5ldHBvbGwsIHJlYWxfZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWtmcmVlKG5ldHBvbGwpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl2bGFuLT5uZXRwb2xsID0gbmV0cG9sbDsKLQotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHZsYW5fZGV2X25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuPSB2bGFuX2Rldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHBvbGwgKm5ldHBvbGwgPSB2bGFuLT5uZXRwb2xsOwotCi0JaWYgKCFuZXRwb2xsKQotCQlyZXR1cm47Ci0KLQl2bGFuLT5uZXRwb2xsID0gTlVMTDsKLQlfX25ldHBvbGxfZnJlZShuZXRwb2xsKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLwotCi1zdGF0aWMgaW50IHZsYW5fZGV2X2dldF9pZmxpbmsoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwotCi0JcmV0dXJuIHJlYWxfZGV2LT5pZmluZGV4OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHZsYW5fZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9saW5rX2tzZXR0aW5ncwk9IHZsYW5fZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvCSAgICAgICAgPSB2bGFuX2V0aHRvb2xfZ2V0X2RydmluZm8sCi0JLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF90c19pbmZvCQk9IHZsYW5fZXRodG9vbF9nZXRfdHNfaW5mbywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgdmxhbl9uZXRkZXZfb3BzID0gewotCS5uZG9fY2hhbmdlX210dQkJPSB2bGFuX2Rldl9jaGFuZ2VfbXR1LAotCS5uZG9faW5pdAkJPSB2bGFuX2Rldl9pbml0LAotCS5uZG9fdW5pbml0CQk9IHZsYW5fZGV2X3VuaW5pdCwKLQkubmRvX29wZW4JCT0gdmxhbl9kZXZfb3BlbiwKLQkubmRvX3N0b3AJCT0gdmxhbl9kZXZfc3RvcCwKLQkubmRvX3N0YXJ0X3htaXQgPSAgdmxhbl9kZXZfaGFyZF9zdGFydF94bWl0LAotCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gdmxhbl9kZXZfc2V0X21hY19hZGRyZXNzLAotCS5uZG9fc2V0X3J4X21vZGUJPSB2bGFuX2Rldl9zZXRfcnhfbW9kZSwKLQkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHZsYW5fZGV2X2NoYW5nZV9yeF9mbGFncywKLQkubmRvX2RvX2lvY3RsCQk9IHZsYW5fZGV2X2lvY3RsLAotCS5uZG9fbmVpZ2hfc2V0dXAJPSB2bGFuX2Rldl9uZWlnaF9zZXR1cCwKLQkubmRvX2dldF9zdGF0czY0CT0gdmxhbl9kZXZfZ2V0X3N0YXRzNjQsCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfRkNPRSkKLQkubmRvX2Zjb2VfZGRwX3NldHVwCT0gdmxhbl9kZXZfZmNvZV9kZHBfc2V0dXAsCi0JLm5kb19mY29lX2RkcF9kb25lCT0gdmxhbl9kZXZfZmNvZV9kZHBfZG9uZSwKLQkubmRvX2Zjb2VfZW5hYmxlCT0gdmxhbl9kZXZfZmNvZV9lbmFibGUsCi0JLm5kb19mY29lX2Rpc2FibGUJPSB2bGFuX2Rldl9mY29lX2Rpc2FibGUsCi0JLm5kb19mY29lX2RkcF90YXJnZXQJPSB2bGFuX2Rldl9mY29lX2RkcF90YXJnZXQsCi0jZW5kaWYKLSNpZmRlZiBORVRERVZfRkNPRV9XV05OCi0JLm5kb19mY29lX2dldF93d24JPSB2bGFuX2Rldl9mY29lX2dldF93d24sCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdmxhbl9kZXZfcG9sbF9jb250cm9sbGVyLAotCS5uZG9fbmV0cG9sbF9zZXR1cAk9IHZsYW5fZGV2X25ldHBvbGxfc2V0dXAsCi0JLm5kb19uZXRwb2xsX2NsZWFudXAJPSB2bGFuX2Rldl9uZXRwb2xsX2NsZWFudXAsCi0jZW5kaWYKLQkubmRvX2ZpeF9mZWF0dXJlcwk9IHZsYW5fZGV2X2ZpeF9mZWF0dXJlcywKLQkubmRvX2dldF9pZmxpbmsJCT0gdmxhbl9kZXZfZ2V0X2lmbGluaywKLX07Ci0KLXN0YXRpYyB2b2lkIHZsYW5fZGV2X2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKLQotCWZyZWVfcGVyY3B1KHZsYW4tPnZsYW5fcGNwdV9zdGF0cyk7Ci0Jdmxhbi0+dmxhbl9wY3B1X3N0YXRzID0gTlVMTDsKLQotCS8qIEdldCByaWQgb2YgdGhlIHZsYW4ncyByZWZlcmVuY2UgdG8gcmVhbF9kZXYgKi8KLQlkZXZfcHV0KHZsYW4tPnJlYWxfZGV2KTsKLX0KLQotdm9pZCB2bGFuX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZXRoZXJfc2V0dXAoZGV2KTsKLQotCWRldi0+cHJpdl9mbGFncwkJfD0gSUZGXzgwMl8xUV9WTEFOIHwgSUZGX05PX1FVRVVFOwotCWRldi0+cHJpdl9mbGFncwkJfD0gSUZGX1VOSUNBU1RfRkxUOwotCWRldi0+cHJpdl9mbGFncwkJJj0gfklGRl9UWF9TS0JfU0hBUklORzsKLQluZXRpZl9rZWVwX2RzdChkZXYpOwotCi0JZGV2LT5uZXRkZXZfb3BzCQk9ICZ2bGFuX25ldGRldl9vcHM7Ci0JZGV2LT5uZWVkc19mcmVlX25ldGRldgk9IHRydWU7Ci0JZGV2LT5wcml2X2Rlc3RydWN0b3IJPSB2bGFuX2Rldl9mcmVlOwotCWRldi0+ZXRodG9vbF9vcHMJPSAmdmxhbl9ldGh0b29sX29wczsKLQotCWRldi0+bWluX210dQkJPSAwOwotCWRldi0+bWF4X210dQkJPSBFVEhfTUFYX01UVTsKLQotCWV0aF96ZXJvX2FkZHIoZGV2LT5icm9hZGNhc3QpOwotfQpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvYnJpZGdlL2JyX2ZkYi5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvYnJpZGdlL2JyX2ZkYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NWE2MDU0Li4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2JyaWRnZS9icl9mZGIuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MTEgKzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXIKLS8qCi0gKglGb3J3YXJkaW5nIGRhdGFiYXNlCi0gKglMaW51eCBldGhlcm5ldCBicmlkZ2UKLSAqCi0gKglBdXRob3JzOgotICoJTGVubmVydCBCdXl0ZW5oZWsJCTxidXl0ZW5oQGdudS5vcmc+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRvbWljLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+Ci0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2JyaWRnZS5oPgotI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKLSNpZmRlZiBDT05GSUdfRkFTVE5BVF9NT0RVTEUKLSNpbmNsdWRlIDxuZXQvU0kvZmFzdF9jb21tb24uaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X3RyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldGlvY19wcm9jLmg+Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBicl9mZGJfcmh0X3BhcmFtcyA9IHsKLQkuaGVhZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnksIHJobm9kZSksCi0JLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnksIGtleSksCi0JLmtleV9sZW4gPSBzaXplb2Yoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2tleSksCi0JLmF1dG9tYXRpY19zaHJpbmtpbmcgPSB0cnVlLAotfTsKLQotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpicl9mZGJfY2FjaGUgX19yZWFkX21vc3RseTsKLXN0YXRpYyBpbnQgZmRiX2luc2VydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwKLQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCk7Ci1zdGF0aWMgdm9pZCBmZGJfbm90aWZ5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqLCBpbnQsIGJvb2wpOwotCi1pbnQgX19pbml0IGJyX2ZkYl9pbml0KHZvaWQpCi17Ci0JYnJfZmRiX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJyaWRnZV9mZGJfY2FjaGUiLAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSksCi0JCQkJCSAwLAotCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKLQlpZiAoIWJyX2ZkYl9jYWNoZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBicl9mZGJfZmluaSh2b2lkKQotewotCWttZW1fY2FjaGVfZGVzdHJveShicl9mZGJfY2FjaGUpOwotfQotCi1pbnQgYnJfZmRiX2hhc2hfaW5pdChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpCi17Ci0JcmV0dXJuIHJoYXNodGFibGVfaW5pdCgmYnItPmZkYl9oYXNoX3RibCwgJmJyX2ZkYl9yaHRfcGFyYW1zKTsKLX0KLQotdm9pZCBicl9mZGJfaGFzaF9maW5pKHN0cnVjdCBuZXRfYnJpZGdlICpicikKLXsKLQlyaGFzaHRhYmxlX2Rlc3Ryb3koJmJyLT5mZGJfaGFzaF90YmwpOwotfQotCi0vKiBpZiB0b3BvbG9neV9jaGFuZ2luZyB0aGVuIHVzZSBmb3J3YXJkX2RlbGF5IChkZWZhdWx0IDE1IHNlYykKLSAqIG90aGVyd2lzZSBrZWVwIGxvbmdlciAoZGVmYXVsdCA1IG1pbnV0ZXMpCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBob2xkX3RpbWUoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyKQotewotCXJldHVybiBici0+dG9wb2xvZ3lfY2hhbmdlID8gYnItPmZvcndhcmRfZGVsYXkgOiBici0+YWdlaW5nX3RpbWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGhhc19leHBpcmVkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiKQotewotCXJldHVybiAhdGVzdF9iaXQoQlJfRkRCX1NUQVRJQywgJmZkYi0+ZmxhZ3MpICYmCi0JICAgICAgICF0ZXN0X2JpdChCUl9GREJfQURERURfQllfRVhUX0xFQVJOLCAmZmRiLT5mbGFncykgJiYKLQkgICAgICAgdGltZV9iZWZvcmVfZXEoZmRiLT51cGRhdGVkICsgaG9sZF90aW1lKGJyKSwgamlmZmllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZkYl9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICplbnQKLQkJPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5LCByY3UpOwotCWttZW1fY2FjaGVfZnJlZShicl9mZGJfY2FjaGUsIGVudCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYl9maW5kX3JjdShzdHJ1Y3Qgcmhhc2h0YWJsZSAqdGJsLAotCQkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCi0JCQkJCQkgX191MTYgdmlkKQotewotCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9rZXkga2V5OwotCi0JV0FSTl9PTl9PTkNFKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0KLQlrZXkudmxhbl9pZCA9IHZpZDsKLQltZW1jcHkoa2V5LmFkZHIuYWRkciwgYWRkciwgc2l6ZW9mKGtleS5hZGRyLmFkZHIpKTsKLQotCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cCh0YmwsICZrZXksIGJyX2ZkYl9yaHRfcGFyYW1zKTsKLX0KLQotLyogcmVxdWlyZXMgYnJpZGdlIGhhc2hfbG9jayAqLwotc3RhdGljIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqYnJfZmRiX2ZpbmQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKLQkJCQkJCV9fdTE2IHZpZCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGRfb25jZSgmYnItPmhhc2hfbG9jayk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZmRiID0gZmRiX2ZpbmRfcmN1KCZici0+ZmRiX2hhc2hfdGJsLCBhZGRyLCB2aWQpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGZkYjsKLX0KLQotc3RydWN0IG5ldF9kZXZpY2UgKmJyX2ZkYl9maW5kX3BvcnQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmJyX2RldiwKLQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKLQkJCQkgICAgX191MTYgdmlkKQotewotCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7Ci0KLQlBU1NFUlRfUlROTCgpOwotCi0JaWYgKCFuZXRpZl9pc19icmlkZ2VfbWFzdGVyKGJyX2RldikpCi0JCXJldHVybiBOVUxMOwotCi0JYnIgPSBuZXRkZXZfcHJpdihicl9kZXYpOwotCXJjdV9yZWFkX2xvY2soKTsKLQlmID0gYnJfZmRiX2ZpbmRfcmN1KGJyLCBhZGRyLCB2aWQpOwotCWlmIChmICYmIGYtPmRzdCkKLQkJZGV2ID0gZi0+ZHN0LT5kZXY7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gZGV2OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYnJfZmRiX2ZpbmRfcG9ydCk7Ci0KLXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqYnJfZmRiX2ZpbmRfcmN1KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAotCQkJCQkgICAgIF9fdTE2IHZpZCkKLXsKLQlyZXR1cm4gZmRiX2ZpbmRfcmN1KCZici0+ZmRiX2hhc2hfdGJsLCBhZGRyLCB2aWQpOwotfQotCi0vKiBXaGVuIGEgc3RhdGljIEZEQiBlbnRyeSBpcyBhZGRlZCwgdGhlIG1hYyBhZGRyZXNzIGZyb20gdGhlIGVudHJ5IGlzCi0gKiBhZGRlZCB0byB0aGUgYnJpZGdlIHByaXZhdGUgSFcgYWRkcmVzcyBsaXN0IGFuZCBhbGwgcmVxdWlyZWQgcG9ydHMKLSAqIGFyZSB0aGVuIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGluZm9ybWF0aW9uLgotICogQ2FsbGVkIHVuZGVyIFJUTkwuCi0gKi8KLXN0YXRpYyB2b2lkIGZkYl9hZGRfaHdfYWRkcihzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFicl9wcm9taXNjX3BvcnQocCkpIHsKLQkJCWVyciA9IGRldl91Y19hZGQocC0+ZGV2LCBhZGRyKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byB1bmRvOwotCQl9Ci0JfQotCi0JcmV0dXJuOwotdW5kbzoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFicl9wcm9taXNjX3BvcnQocCkpCi0JCQlkZXZfdWNfZGVsKHAtPmRldiwgYWRkcik7Ci0JfQotfQotCi0vKiBXaGVuIGEgc3RhdGljIEZEQiBlbnRyeSBpcyBkZWxldGVkLCB0aGUgSFcgYWRkcmVzcyBmcm9tIHRoYXQgZW50cnkgaXMKLSAqIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBicmlkZ2UgcHJpdmF0ZSBIVyBhZGRyZXNzIGxpc3QgYW5kIHVwZGF0ZXMgYWxsCi0gKiB0aGUgcG9ydHMgd2l0aCBuZWVkZWQgaW5mb3JtYXRpb24uCi0gKiBDYWxsZWQgdW5kZXIgUlROTC4KLSAqLwotc3RhdGljIHZvaWQgZmRiX2RlbF9od19hZGRyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmJyLT5wb3J0X2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFicl9wcm9taXNjX3BvcnQocCkpCi0JCQlkZXZfdWNfZGVsKHAtPmRldiwgYWRkcik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmLAotCQkgICAgICAgYm9vbCBzd2Rldl9ub3RpZnkpCi17Ci0JdHJhY2VfZmRiX2RlbGV0ZShiciwgZik7Ci0KLQlpZiAodGVzdF9iaXQoQlJfRkRCX1NUQVRJQywgJmYtPmZsYWdzKSkKLQkJZmRiX2RlbF9od19hZGRyKGJyLCBmLT5rZXkuYWRkci5hZGRyKTsKLQotCWhsaXN0X2RlbF9pbml0X3JjdSgmZi0+ZmRiX25vZGUpOwotCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmJyLT5mZGJfaGFzaF90YmwsICZmLT5yaG5vZGUsCi0JCQkgICAgICAgYnJfZmRiX3JodF9wYXJhbXMpOwotCWZkYl9ub3RpZnkoYnIsIGYsIFJUTV9ERUxORUlHSCwgc3dkZXZfbm90aWZ5KTsKLQljYWxsX3JjdSgmZi0+cmN1LCBmZGJfcmN1X2ZyZWUpOwotfQotCi0vKiBEZWxldGUgYSBsb2NhbCBlbnRyeSBpZiBubyBvdGhlciBwb3J0IGhhZCB0aGUgc2FtZSBhZGRyZXNzLiAqLwotc3RhdGljIHZvaWQgZmRiX2RlbGV0ZV9sb2NhbChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCi0JCQkgICAgIHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZikKLXsKLQljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyID0gZi0+a2V5LmFkZHIuYWRkcjsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZzsKLQljb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuICp2OwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKm9wOwotCXUxNiB2aWQgPSBmLT5rZXkudmxhbl9pZDsKLQotCS8qIE1heWJlIGFub3RoZXIgcG9ydCBoYXMgc2FtZSBodyBhZGRyPyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkob3AsICZici0+cG9ydF9saXN0LCBsaXN0KSB7Ci0JCXZnID0gbmJwX3ZsYW5fZ3JvdXAob3ApOwotCQlpZiAob3AgIT0gcCAmJiBldGhlcl9hZGRyX2VxdWFsKG9wLT5kZXYtPmRldl9hZGRyLCBhZGRyKSAmJgotCQkgICAgKCF2aWQgfHwgYnJfdmxhbl9maW5kKHZnLCB2aWQpKSkgewotCQkJZi0+ZHN0ID0gb3A7Ci0JCQljbGVhcl9iaXQoQlJfRkRCX0FEREVEX0JZX1VTRVIsICZmLT5mbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOwotCXYgPSBicl92bGFuX2ZpbmQodmcsIHZpZCk7Ci0JLyogTWF5YmUgYnJpZGdlIGRldmljZSBoYXMgc2FtZSBodyBhZGRyPyAqLwotCWlmIChwICYmIGV0aGVyX2FkZHJfZXF1YWwoYnItPmRldi0+ZGV2X2FkZHIsIGFkZHIpICYmCi0JICAgICghdmlkIHx8ICh2ICYmIGJyX3ZsYW5fc2hvdWxkX3VzZSh2KSkpKSB7Ci0JCWYtPmRzdCA9IE5VTEw7Ci0JCWNsZWFyX2JpdChCUl9GREJfQURERURfQllfVVNFUiwgJmYtPmZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWZkYl9kZWxldGUoYnIsIGYsIHRydWUpOwotfQotCi12b2lkIGJyX2ZkYl9maW5kX2RlbGV0ZV9sb2NhbChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmY7Ci0KLQlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCWYgPSBicl9mZGJfZmluZChiciwgYWRkciwgdmlkKTsKLQlpZiAoZiAmJiB0ZXN0X2JpdChCUl9GREJfTE9DQUwsICZmLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9VU0VSLCAmZi0+ZmxhZ3MpICYmIGYtPmRzdCA9PSBwKQotCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBwLCBmKTsKLQlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci19Ci0KLXZvaWQgYnJfZmRiX2NoYW5nZWFkZHIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3YWRkcikKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV92bGFuX2dyb3VwICp2ZzsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmY7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gcC0+YnI7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdjsKLQotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0JdmcgPSBuYnBfdmxhbl9ncm91cChwKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmYnItPmZkYl9saXN0LCBmZGJfbm9kZSkgewotCQlpZiAoZi0+ZHN0ID09IHAgJiYgdGVzdF9iaXQoQlJfRkRCX0xPQ0FMLCAmZi0+ZmxhZ3MpICYmCi0JCSAgICAhdGVzdF9iaXQoQlJfRkRCX0FEREVEX0JZX1VTRVIsICZmLT5mbGFncykpIHsKLQkJCS8qIGRlbGV0ZSBvbGQgb25lICovCi0JCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBwLCBmKTsKLQotCQkJLyogaWYgdGhpcyBwb3J0IGhhcyBubyB2bGFuIGluZm9ybWF0aW9uCi0JCQkgKiBjb25maWd1cmVkLCB3ZSBjYW4gc2FmZWx5IGJlIGRvbmUgYXQKLQkJCSAqIHRoaXMgcG9pbnQuCi0JCQkgKi8KLQkJCWlmICghdmcgfHwgIXZnLT5udW1fdmxhbnMpCi0JCQkJZ290byBpbnNlcnQ7Ci0JCX0KLQl9Ci0KLWluc2VydDoKLQkvKiBpbnNlcnQgbmV3IGFkZHJlc3MsICBtYXkgZmFpbCBpZiBpbnZhbGlkIGFkZHJlc3Mgb3IgZHVwLiAqLwotCWZkYl9pbnNlcnQoYnIsIHAsIG5ld2FkZHIsIDApOwotCi0JaWYgKCF2ZyB8fCAhdmctPm51bV92bGFucykKLQkJZ290byBkb25lOwotCi0JLyogTm93IGFkZCBlbnRyaWVzIGZvciBldmVyeSBWTEFOIGNvbmZpZ3VyZWQgb24gdGhlIHBvcnQuCi0JICogVGhpcyBmdW5jdGlvbiBydW5zIHVuZGVyIFJUTkwgc28gdGhlIGJpdG1hcCB3aWxsIG5vdCBjaGFuZ2UKLQkgKiBmcm9tIHVuZGVyIHVzLgotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkodiwgJnZnLT52bGFuX2xpc3QsIHZsaXN0KQotCQlmZGJfaW5zZXJ0KGJyLCBwLCBuZXdhZGRyLCB2LT52aWQpOwotCi1kb25lOgotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLX0KLQotdm9pZCBicl9mZGJfY2hhbmdlX21hY19hZGRyZXNzKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgY29uc3QgdTggKm5ld2FkZHIpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7Ci0KLQlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCi0JLyogSWYgb2xkIGVudHJ5IHdhcyB1bmFzc29jaWF0ZWQgd2l0aCBhbnkgcG9ydCwgdGhlbiBkZWxldGUgaXQuICovCi0JZiA9IGJyX2ZkYl9maW5kKGJyLCBici0+ZGV2LT5kZXZfYWRkciwgMCk7Ci0JaWYgKGYgJiYgdGVzdF9iaXQoQlJfRkRCX0xPQ0FMLCAmZi0+ZmxhZ3MpICYmCi0JICAgICFmLT5kc3QgJiYgIXRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9VU0VSLCAmZi0+ZmxhZ3MpKQotCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBOVUxMLCBmKTsKLQotCWZkYl9pbnNlcnQoYnIsIE5VTEwsIG5ld2FkZHIsIDApOwotCXZnID0gYnJfdmxhbl9ncm91cChicik7Ci0JaWYgKCF2ZyB8fCAhdmctPm51bV92bGFucykKLQkJZ290byBvdXQ7Ci0JLyogTm93IHJlbW92ZSBhbmQgYWRkIGVudHJpZXMgZm9yIGV2ZXJ5IFZMQU4gY29uZmlndXJlZCBvbiB0aGUKLQkgKiBicmlkZ2UuICBUaGlzIGZ1bmN0aW9uIHJ1bnMgdW5kZXIgUlROTCBzbyB0aGUgYml0bWFwIHdpbGwgbm90Ci0JICogY2hhbmdlIGZyb20gdW5kZXIgdXMuCi0JICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCAmdmctPnZsYW5fbGlzdCwgdmxpc3QpIHsKLQkJaWYgKCFicl92bGFuX3Nob3VsZF91c2UodikpCi0JCQljb250aW51ZTsKLQkJZiA9IGJyX2ZkYl9maW5kKGJyLCBici0+ZGV2LT5kZXZfYWRkciwgdi0+dmlkKTsKLQkJaWYgKGYgJiYgdGVzdF9iaXQoQlJfRkRCX0xPQ0FMLCAmZi0+ZmxhZ3MpICYmCi0JCSAgICAhZi0+ZHN0ICYmICF0ZXN0X2JpdChCUl9GREJfQURERURfQllfVVNFUiwgJmYtPmZsYWdzKSkKLQkJCWZkYl9kZWxldGVfbG9jYWwoYnIsIE5VTEwsIGYpOwotCQlmZGJfaW5zZXJ0KGJyLCBOVUxMLCBuZXdhZGRyLCB2LT52aWQpOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci19Ci0KLXZvaWQgYnJfZmRiX2NsZWFudXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmV0X2JyaWRnZSwKLQkJCQkJICAgICBnY193b3JrLndvcmspOwotCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZiA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBkZWxheSA9IGhvbGRfdGltZShicik7Ci0JdW5zaWduZWQgbG9uZyB3b3JrX2RlbGF5ID0gZGVsYXk7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCi0JLyogdGhpcyBwYXJ0IGlzIHRyaWNreSwgaW4gb3JkZXIgdG8gYXZvaWQgYmxvY2tpbmcgbGVhcm5pbmcgYW5kCi0JICogY29uc2VxdWVudGx5IGZvcndhcmRpbmcsIHdlIHJlbHkgb24gcmN1IHRvIGRlbGV0ZSBvYmplY3RzIHdpdGgKLQkgKiBkZWxheWVkIGZyZWVpbmcgYWxsb3dpbmcgdXMgdG8gY29udGludWUgdHJhdmVyc2luZwotCSAqLwotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJmJyLT5mZGJfbGlzdCwgZmRiX25vZGUpIHsKLQkJdW5zaWduZWQgbG9uZyB0aGlzX3RpbWVyID0gZi0+dXBkYXRlZCArIGRlbGF5OwotCi0JCWlmICh0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZi0+ZmxhZ3MpIHx8Ci0JCSAgICB0ZXN0X2JpdChCUl9GREJfQURERURfQllfRVhUX0xFQVJOLCAmZi0+ZmxhZ3MpKSB7Ci0JCQlpZiAodGVzdF9iaXQoQlJfRkRCX05PVElGWSwgJmYtPmZsYWdzKSkgewotCQkJCWlmICh0aW1lX2FmdGVyKHRoaXNfdGltZXIsIG5vdykpCi0JCQkJCXdvcmtfZGVsYXkgPSBtaW4od29ya19kZWxheSwKLQkJCQkJCQkgdGhpc190aW1lciAtIG5vdyk7Ci0JCQkJZWxzZSBpZiAoIXRlc3RfYW5kX3NldF9iaXQoQlJfRkRCX05PVElGWV9JTkFDVElWRSwKLQkJCQkJCQkgICAmZi0+ZmxhZ3MpKQotCQkJCQlmZGJfbm90aWZ5KGJyLCBmLCBSVE1fTkVXTkVJR0gsIGZhbHNlKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIodGhpc190aW1lciwgbm93KSkgewotCQkJd29ya19kZWxheSA9IG1pbih3b3JrX2RlbGF5LCB0aGlzX3RpbWVyIC0gbm93KTsKLQkJfSBlbHNlIHsKLQkJCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0JCQlpZiAoIWhsaXN0X3VuaGFzaGVkKCZmLT5mZGJfbm9kZSkpCi0JCQkJZmRiX2RlbGV0ZShiciwgZiwgdHJ1ZSk7Ci0JCQlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0JCX0KLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkvKiBDbGVhbnVwIG1pbmltdW0gMTAgbWlsbGlzZWNvbmRzIGFwYXJ0ICovCi0Jd29ya19kZWxheSA9IG1heF90KHVuc2lnbmVkIGxvbmcsIHdvcmtfZGVsYXksIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQltb2RfZGVsYXllZF93b3JrKHN5c3RlbV9sb25nX3dxLCAmYnItPmdjX3dvcmssIHdvcmtfZGVsYXkpOwotfQotCi0vKiBDb21wbGV0ZWx5IGZsdXNoIGFsbCBkeW5hbWljIGVudHJpZXMgaW4gZm9yd2FyZGluZyBkYXRhYmFzZS4qLwotdm9pZCBicl9mZGJfZmx1c2goc3RydWN0IG5ldF9icmlkZ2UgKmJyKQotewotCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwotCi0Jc3Bpbl9sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIHRtcCwgJmJyLT5mZGJfbGlzdCwgZmRiX25vZGUpIHsKLQkJaWYgKCF0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZi0+ZmxhZ3MpKQotCQkJZmRiX2RlbGV0ZShiciwgZiwgdHJ1ZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLX0KLQotLyogRmx1c2ggYWxsIGVudHJpZXMgcmVmZXJyaW5nIHRvIGEgc3BlY2lmaWMgcG9ydC4KLSAqIGlmIGRvX2FsbCBpcyBzZXQgYWxzbyBmbHVzaCBzdGF0aWMgZW50cmllcwotICogaWYgdmlkIGlzIHNldCBkZWxldGUgYWxsIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgdmxhbl9pZAotICovCi12b2lkIGJyX2ZkYl9kZWxldGVfYnlfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJICAgdTE2IHZpZCwKLQkJCSAgIGludCBkb19hbGwpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7Ci0KLQlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZiwgdG1wLCAmYnItPmZkYl9saXN0LCBmZGJfbm9kZSkgewotCQlpZiAoZi0+ZHN0ICE9IHApCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWRvX2FsbCkKLQkJCWlmICh0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZi0+ZmxhZ3MpIHx8Ci0JCQkgICAgKHRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9FWFRfTEVBUk4sICZmLT5mbGFncykgJiYKLQkJCSAgICAgIXRlc3RfYml0KEJSX0ZEQl9PRkZMT0FERUQsICZmLT5mbGFncykpIHx8Ci0JCQkgICAgKHZpZCAmJiBmLT5rZXkudmxhbl9pZCAhPSB2aWQpKQotCQkJCWNvbnRpbnVlOwotCi0JCWlmICh0ZXN0X2JpdChCUl9GREJfTE9DQUwsICZmLT5mbGFncykpCi0JCQlmZGJfZGVsZXRlX2xvY2FsKGJyLCBwLCBmKTsKLQkJZWxzZQotCQkJZmRiX2RlbGV0ZShiciwgZiwgdHJ1ZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLX0KLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0FUTV9MQU5FKQotLyogSW50ZXJmYWNlIHVzZWQgYnkgQVRNIExBTkUgaG9vayB0byB0ZXN0Ci0gKiBpZiBhbiBhZGRyIGlzIG9uIHNvbWUgb3RoZXIgYnJpZGdlIHBvcnQgKi8KLWludCBicl9mZGJfdGVzdF9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKmFkZHIpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydDsKLQlpbnQgcmV0OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXBvcnQgPSBicl9wb3J0X2dldF9yY3UoZGV2KTsKLQlpZiAoIXBvcnQpCi0JCXJldCA9IDA7Ci0JZWxzZSB7Ci0JCWZkYiA9IGJyX2ZkYl9maW5kX3JjdShwb3J0LT5iciwgYWRkciwgMCk7Ci0JCXJldCA9IGZkYiAmJiBmZGItPmRzdCAmJiBmZGItPmRzdC0+ZGV2ICE9IGRldiAmJgotCQkJZmRiLT5kc3QtPnN0YXRlID09IEJSX1NUQVRFX0ZPUldBUkRJTkc7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfQVRNX0xBTkUgKi8KLQotLyoKLSAqIEZpbGwgYnVmZmVyIHdpdGggZm9yd2FyZGluZyB0YWJsZSByZWNvcmRzIGluCi0gKiB0aGUgQVBJIGZvcm1hdC4KLSAqLwotaW50IGJyX2ZkYl9maWxsYnVmKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdm9pZCAqYnVmLAotCQkgICB1bnNpZ25lZCBsb25nIG1heG51bSwgdW5zaWduZWQgbG9uZyBza2lwKQotewotCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKLQlzdHJ1Y3QgX19mZGJfZW50cnkgKmZlID0gYnVmOwotCWludCBudW0gPSAwOwotCi0JbWVtc2V0KGJ1ZiwgMCwgbWF4bnVtKnNpemVvZihzdHJ1Y3QgX19mZGJfZW50cnkpKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJmJyLT5mZGJfbGlzdCwgZmRiX25vZGUpIHsKLQkJaWYgKG51bSA+PSBtYXhudW0pCi0JCQlicmVhazsKLQotCQlpZiAoaGFzX2V4cGlyZWQoYnIsIGYpKQotCQkJY29udGludWU7Ci0KLQkJLyogaWdub3JlIHBzZXVkbyBlbnRyeSBmb3IgbG9jYWwgTUFDIGFkZHJlc3MgKi8KLQkJaWYgKCFmLT5kc3QpCi0JCQljb250aW51ZTsKLQotCQlpZiAoc2tpcCkgewotCQkJLS1za2lwOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBjb252ZXJ0IGZyb20gaW50ZXJuYWwgZm9ybWF0IHRvIEFQSSAqLwotCQltZW1jcHkoZmUtPm1hY19hZGRyLCBmLT5rZXkuYWRkci5hZGRyLCBFVEhfQUxFTik7Ci0KLQkJLyogZHVlIHRvIEFCSSBjb21wYXQgbmVlZCB0byBzcGxpdCBpbnRvIGhpL2xvICovCi0JCWZlLT5wb3J0X25vID0gZi0+ZHN0LT5wb3J0X25vOwotCQlmZS0+cG9ydF9oaSA9IGYtPmRzdC0+cG9ydF9ubyA+PiA4OwotCi0JCWZlLT5pc19sb2NhbCA9IHRlc3RfYml0KEJSX0ZEQl9MT0NBTCwgJmYtPmZsYWdzKTsKLQkJaWYgKCF0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZi0+ZmxhZ3MpKQotCQkJZmUtPmFnZWluZ190aW1lcl92YWx1ZSA9IGppZmZpZXNfZGVsdGFfdG9fY2xvY2tfdChqaWZmaWVzIC0gZi0+dXBkYXRlZCk7Ci0JCSsrZmU7Ci0JCSsrbnVtOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBudW07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYl9jcmVhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJCQkgICAgICAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAotCQkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKLQkJCQkJICAgICAgIF9fdTE2IHZpZCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7Ci0KLQlmZGIgPSBrbWVtX2NhY2hlX2FsbG9jKGJyX2ZkYl9jYWNoZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGZkYikgewotCQltZW1jcHkoZmRiLT5rZXkuYWRkci5hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0JCWZkYi0+ZHN0ID0gc291cmNlOwotCQlmZGItPmtleS52bGFuX2lkID0gdmlkOwotCQlmZGItPmZsYWdzID0gZmxhZ3M7Ci0JCWZkYi0+dXBkYXRlZCA9IGZkYi0+dXNlZCA9IGppZmZpZXM7Ci0JCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfZmFzdCgmYnItPmZkYl9oYXNoX3RibCwKLQkJCQkJCSAgJmZkYi0+cmhub2RlLAotCQkJCQkJICBicl9mZGJfcmh0X3BhcmFtcykpIHsKLQkJCWttZW1fY2FjaGVfZnJlZShicl9mZGJfY2FjaGUsIGZkYik7Ci0JCQlmZGIgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZmZGItPmZkYl9ub2RlLCAmYnItPmZkYl9saXN0KTsKLQkJfQotCX0KLQlyZXR1cm4gZmRiOwotfQotCi1zdGF0aWMgaW50IGZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCi0JCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmZGIgPSBicl9mZGJfZmluZChiciwgYWRkciwgdmlkKTsKLQlpZiAoZmRiKSB7Ci0JCS8qIGl0IGlzIG9rYXkgdG8gaGF2ZSBtdWx0aXBsZSBwb3J0cyB3aXRoIHNhbWUKLQkJICogYWRkcmVzcywganVzdCB1c2UgdGhlIGZpcnN0IG9uZS4KLQkJICovCi0JCWlmICh0ZXN0X2JpdChCUl9GREJfTE9DQUwsICZmZGItPmZsYWdzKSkKLQkJCXJldHVybiAwOwotCQlicl93YXJuKGJyLCAiYWRkaW5nIGludGVyZmFjZSAlcyB3aXRoIHNhbWUgYWRkcmVzcyBhcyBhIHJlY2VpdmVkIHBhY2tldCAoYWRkcjolcE0sIHZsYW46JXUpXG4iLAotCQkgICAgICAgc291cmNlID8gc291cmNlLT5kZXYtPm5hbWUgOiBici0+ZGV2LT5uYW1lLCBhZGRyLCB2aWQpOwotCQlmZGJfZGVsZXRlKGJyLCBmZGIsIHRydWUpOwotCX0KLQotCWZkYiA9IGZkYl9jcmVhdGUoYnIsIHNvdXJjZSwgYWRkciwgdmlkLAotCQkJIEJJVChCUl9GREJfTE9DQUwpIHwgQklUKEJSX0ZEQl9TVEFUSUMpKTsKLQlpZiAoIWZkYikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmZGJfYWRkX2h3X2FkZHIoYnIsIGFkZHIpOwotCWZkYl9ub3RpZnkoYnIsIGZkYiwgUlRNX05FV05FSUdILCB0cnVlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogQWRkIGVudHJ5IGZvciBsb2NhbCBhZGRyZXNzIG9mIGludGVyZmFjZSAqLwotaW50IGJyX2ZkYl9pbnNlcnQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCi0JCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQlyZXQgPSBmZGJfaW5zZXJ0KGJyLCBzb3VyY2UsIGFkZHIsIHZpZCk7Ci0Jc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmRiIHdhcyBtb2RpZmllZCAqLwotc3RhdGljIGJvb2wgX19mZGJfbWFya19hY3RpdmUoc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGIpCi17Ci0JcmV0dXJuICEhKHRlc3RfYml0KEJSX0ZEQl9OT1RJRllfSU5BQ1RJVkUsICZmZGItPmZsYWdzKSAmJgotCQkgIHRlc3RfYW5kX2NsZWFyX2JpdChCUl9GREJfTk9USUZZX0lOQUNUSVZFLCAmZmRiLT5mbGFncykpOwotfQotCi12b2lkIGJyX2ZkYl91cGRhdGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpzb3VyY2UsCi0JCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7Ci0KLQkvKiBzb21lIHVzZXJzIHdhbnQgdG8gYWx3YXlzIGZsb29kLiAqLwotCWlmIChob2xkX3RpbWUoYnIpID09IDApCi0JCXJldHVybjsKLQotCWZkYiA9IGZkYl9maW5kX3JjdSgmYnItPmZkYl9oYXNoX3RibCwgYWRkciwgdmlkKTsKLQlpZiAobGlrZWx5KGZkYikpIHsKLQkJLyogYXR0ZW1wdCB0byB1cGRhdGUgYW4gZW50cnkgZm9yIGEgbG9jYWwgaW50ZXJmYWNlICovCi0JCWlmICh1bmxpa2VseSh0ZXN0X2JpdChCUl9GREJfTE9DQUwsICZmZGItPmZsYWdzKSkpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJYnJfd2FybihiciwgInJlY2VpdmVkIHBhY2tldCBvbiAlcyB3aXRoIG93biBhZGRyZXNzIGFzIHNvdXJjZSBhZGRyZXNzIChhZGRyOiVwTSwgdmxhbjoldSlcbiIsCi0JCQkJCXNvdXJjZS0+ZGV2LT5uYW1lLCBhZGRyLCB2aWQpOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCQkJYm9vbCBmZGJfbW9kaWZpZWQgPSBmYWxzZTsKLQotCQkJaWYgKG5vdyAhPSBmZGItPnVwZGF0ZWQpIHsKLQkJCQlmZGItPnVwZGF0ZWQgPSBub3c7Ci0JCQkJZmRiX21vZGlmaWVkID0gX19mZGJfbWFya19hY3RpdmUoZmRiKTsKLQkJCX0KLQotCQkJLyogZmFzdHBhdGg6IHVwZGF0ZSBvZiBleGlzdGluZyBlbnRyeSAqLwotCQkJaWYgKHVubGlrZWx5KHNvdXJjZSAhPSBmZGItPmRzdCAmJgotCQkJCSAgICAgIXRlc3RfYml0KEJSX0ZEQl9TVElDS1ksICZmZGItPmZsYWdzKSkpIHsKLQkJCQlmZGItPmRzdCA9IHNvdXJjZTsKLQkJCQlmZGJfbW9kaWZpZWQgPSB0cnVlOwotCQkJCS8qIFRha2Ugb3ZlciBIVyBsZWFybmVkIGVudHJ5ICovCi0JCQkJaWYgKHVubGlrZWx5KHRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9FWFRfTEVBUk4sCi0JCQkJCQkgICAgICAmZmRiLT5mbGFncykpKQotCQkJCQljbGVhcl9iaXQoQlJfRkRCX0FEREVEX0JZX0VYVF9MRUFSTiwKLQkJCQkJCSAgJmZkYi0+ZmxhZ3MpOwotCQkJfQotCi0JCQlpZiAodW5saWtlbHkodGVzdF9iaXQoQlJfRkRCX0FEREVEX0JZX1VTRVIsICZmbGFncykpKQotCQkJCXNldF9iaXQoQlJfRkRCX0FEREVEX0JZX1VTRVIsICZmZGItPmZsYWdzKTsKLQkJCWlmICh1bmxpa2VseShmZGJfbW9kaWZpZWQpKSB7Ci0JCQkJdHJhY2VfYnJfZmRiX3VwZGF0ZShiciwgc291cmNlLCBhZGRyLCB2aWQsIGZsYWdzKTsKLQkJCQlmZGJfbm90aWZ5KGJyLCBmZGIsIFJUTV9ORVdORUlHSCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlzcGluX2xvY2soJmJyLT5oYXNoX2xvY2spOwotCQlmZGIgPSBmZGJfY3JlYXRlKGJyLCBzb3VyY2UsIGFkZHIsIHZpZCwgZmxhZ3MpOwotCQlpZiAoZmRiKSB7Ci0JCQl0cmFjZV9icl9mZGJfdXBkYXRlKGJyLCBzb3VyY2UsIGFkZHIsIHZpZCwgZmxhZ3MpOwotCQkJZmRiX25vdGlmeShiciwgZmRiLCBSVE1fTkVXTkVJR0gsIHRydWUpOwotCQl9Ci0JCS8qIGVsc2UgIHdlIGxvc2UgcmFjZSBhbmQgc29tZW9uZSBlbHNlIGluc2VydHMKLQkJICogaXQgZmlyc3QsIGRvbid0IGJvdGhlciB1cGRhdGluZwotCQkgKi8KLQkJc3Bpbl91bmxvY2soJmJyLT5oYXNoX2xvY2spOwotCX0KLX0KLQotc3RhdGljIGludCBmZGJfdG9fbnVkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGIpCi17Ci0JaWYgKHRlc3RfYml0KEJSX0ZEQl9MT0NBTCwgJmZkYi0+ZmxhZ3MpKQotCQlyZXR1cm4gTlVEX1BFUk1BTkVOVDsKLQllbHNlIGlmICh0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZmRiLT5mbGFncykpCi0JCXJldHVybiBOVURfTk9BUlA7Ci0JZWxzZSBpZiAoaGFzX2V4cGlyZWQoYnIsIGZkYikpCi0JCXJldHVybiBOVURfU1RBTEU7Ci0JZWxzZQotCQlyZXR1cm4gTlVEX1JFQUNIQUJMRTsKLX0KLQotc3RhdGljIGludCBmZGJfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYiwKLQkJCSB1MzIgcG9ydGlkLCB1MzIgc2VxLCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKLQlzdHJ1Y3QgbmRhX2NhY2hlaW5mbyBjaTsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKLQlzdHJ1Y3QgbmRtc2cgKm5kbTsKLQotCW5saCA9IG5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCB0eXBlLCBzaXplb2YoKm5kbSksIGZsYWdzKTsKLQlpZiAobmxoID09IE5VTEwpCi0JCXJldHVybiAtRU1TR1NJWkU7Ci0KLQluZG0gPSBubG1zZ19kYXRhKG5saCk7Ci0JbmRtLT5uZG1fZmFtaWx5CSA9IEFGX0JSSURHRTsKLQluZG0tPm5kbV9wYWQxICAgID0gMDsKLQluZG0tPm5kbV9wYWQyICAgID0gMDsKLQluZG0tPm5kbV9mbGFncwkgPSAwOwotCW5kbS0+bmRtX3R5cGUJID0gMDsKLQluZG0tPm5kbV9pZmluZGV4ID0gZmRiLT5kc3QgPyBmZGItPmRzdC0+ZGV2LT5pZmluZGV4IDogYnItPmRldi0+aWZpbmRleDsKLQluZG0tPm5kbV9zdGF0ZSAgID0gZmRiX3RvX251ZChiciwgZmRiKTsKLQotCWlmICh0ZXN0X2JpdChCUl9GREJfT0ZGTE9BREVELCAmZmRiLT5mbGFncykpCi0JCW5kbS0+bmRtX2ZsYWdzIHw9IE5URl9PRkZMT0FERUQ7Ci0JaWYgKHRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9FWFRfTEVBUk4sICZmZGItPmZsYWdzKSkKLQkJbmRtLT5uZG1fZmxhZ3MgfD0gTlRGX0VYVF9MRUFSTkVEOwotCWlmICh0ZXN0X2JpdChCUl9GREJfU1RJQ0tZLCAmZmRiLT5mbGFncykpCi0JCW5kbS0+bmRtX2ZsYWdzIHw9IE5URl9TVElDS1k7Ci0KLQlpZiAobmxhX3B1dChza2IsIE5EQV9MTEFERFIsIEVUSF9BTEVOLCAmZmRiLT5rZXkuYWRkcikpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X3UzMihza2IsIE5EQV9NQVNURVIsIGJyLT5kZXYtPmlmaW5kZXgpKQotCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQljaS5uZG1fdXNlZAkgPSBqaWZmaWVzX3RvX2Nsb2NrX3Qobm93IC0gZmRiLT51c2VkKTsKLQljaS5uZG1fY29uZmlybWVkID0gMDsKLQljaS5uZG1fdXBkYXRlZAkgPSBqaWZmaWVzX3RvX2Nsb2NrX3Qobm93IC0gZmRiLT51cGRhdGVkKTsKLQljaS5uZG1fcmVmY250CSA9IDA7Ci0JaWYgKG5sYV9wdXQoc2tiLCBOREFfQ0FDSEVJTkZPLCBzaXplb2YoY2kpLCAmY2kpKQotCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQotCWlmIChmZGItPmtleS52bGFuX2lkICYmIG5sYV9wdXQoc2tiLCBOREFfVkxBTiwgc2l6ZW9mKHUxNiksCi0JCQkJCSZmZGItPmtleS52bGFuX2lkKSkKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0KLQlpZiAodGVzdF9iaXQoQlJfRkRCX05PVElGWSwgJmZkYi0+ZmxhZ3MpKSB7Ci0JCXN0cnVjdCBubGF0dHIgKm5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIE5EQV9GREJfRVhUX0FUVFJTKTsKLQkJdTggbm90aWZ5X2JpdHMgPSBGREJfTk9USUZZX0JJVDsKLQotCQlpZiAoIW5lc3QpCi0JCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKHRlc3RfYml0KEJSX0ZEQl9OT1RJRllfSU5BQ1RJVkUsICZmZGItPmZsYWdzKSkKLQkJCW5vdGlmeV9iaXRzIHw9IEZEQl9OT1RJRllfSU5BQ1RJVkVfQklUOwotCi0JCWlmIChubGFfcHV0X3U4KHNrYiwgTkZFQV9BQ1RJVklUWV9OT1RJRlksIG5vdGlmeV9iaXRzKSkgewotCQkJbmxhX25lc3RfY2FuY2VsKHNrYiwgbmVzdCk7Ci0JCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJfQotCi0JCW5sYV9uZXN0X2VuZChza2IsIG5lc3QpOwotCX0KLQotCW5sbXNnX2VuZChza2IsIG5saCk7Ci0JcmV0dXJuIDA7Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlubG1zZ19jYW5jZWwoc2tiLCBubGgpOwotCXJldHVybiAtRU1TR1NJWkU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IGZkYl9ubG1zZ19zaXplKHZvaWQpCi17Ci0JcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmRtc2cpKQotCQkrIG5sYV90b3RhbF9zaXplKEVUSF9BTEVOKSAvKiBOREFfTExBRERSICovCi0JCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpIC8qIE5EQV9NQVNURVIgKi8KLQkJKyBubGFfdG90YWxfc2l6ZShzaXplb2YodTE2KSkgLyogTkRBX1ZMQU4gKi8KLQkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IG5kYV9jYWNoZWluZm8pKQotCQkrIG5sYV90b3RhbF9zaXplKDApIC8qIE5EQV9GREJfRVhUX0FUVFJTICovCi0JCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHU4KSk7IC8qIE5GRUFfQUNUSVZJVFlfTk9USUZZICovCi19Ci0KLXN0YXRpYyB2b2lkIGZkYl9ub3RpZnkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGIsIGludCB0eXBlLAotCQkgICAgICAgYm9vbCBzd2Rldl9ub3RpZnkpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChici0+ZGV2KTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBlcnIgPSAtRU5PQlVGUzsKLQotCWlmIChzd2Rldl9ub3RpZnkpCi0JCWJyX3N3aXRjaGRldl9mZGJfbm90aWZ5KGZkYiwgdHlwZSk7Ci0KLQlza2IgPSBubG1zZ19uZXcoZmRiX25sbXNnX3NpemUoKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQotCQlnb3RvIGVycm91dDsKLQotCWVyciA9IGZkYl9maWxsX2luZm8oc2tiLCBiciwgZmRiLCAwLCAwLCB0eXBlLCAwKTsKLQlpZiAoZXJyIDwgMCkgewotCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gZmRiX25sbXNnX3NpemUoKSAqLwotCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBlcnJvdXQ7Ci0JfQotCXJ0bmxfbm90aWZ5KHNrYiwgbmV0LCAwLCBSVE5MR1JQX05FSUdILCBOVUxMLCBHRlBfQVRPTUlDKTsKLQlyZXR1cm47Ci1lcnJvdXQ6Ci0JcnRubF9zZXRfc2tfZXJyKG5ldCwgUlROTEdSUF9ORUlHSCwgZXJyKTsKLX0KLQotLyogRHVtcCBpbmZvcm1hdGlvbiBhYm91dCBlbnRyaWVzLCBpbiByZXNwb25zZSB0byBHRVRORUlHSCAqLwotaW50IGJyX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsCi0JCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCWludCAqaWR4KQotewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCWludCBlcnIgPSAwOwotCi0JaWYgKCEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCFmaWx0ZXJfZGV2KSB7Ci0JCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwgaWR4KTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJmJyLT5mZGJfbGlzdCwgZmRiX25vZGUpIHsKLQkJaWYgKCppZHggPCBjYi0+YXJnc1syXSkKLQkJCWdvdG8gc2tpcDsKLQkJaWYgKGZpbHRlcl9kZXYgJiYgKCFmLT5kc3QgfHwgZi0+ZHN0LT5kZXYgIT0gZmlsdGVyX2RldikpIHsKLQkJCWlmIChmaWx0ZXJfZGV2ICE9IGRldikKLQkJCQlnb3RvIHNraXA7Ci0JCQkvKiAhZi0+ZHN0IGlzIGEgc3BlY2lhbCBjYXNlIGZvciBicmlkZ2UKLQkJCSAqIEl0IG1lYW5zIHRoZSBNQUMgYmVsb25ncyB0byB0aGUgYnJpZGdlCi0JCQkgKiBUaGVyZWZvcmUgbmVlZCBhIGxpdHRsZSBtb3JlIGZpbHRlcmluZwotCQkJICogd2Ugb25seSB3YW50IHRvIGR1bXAgdGhlICFmLT5kc3QgY2FzZQotCQkJICovCi0JCQlpZiAoZi0+ZHN0KQotCQkJCWdvdG8gc2tpcDsKLQkJfQotCQlpZiAoIWZpbHRlcl9kZXYgJiYgZi0+ZHN0KQotCQkJZ290byBza2lwOwotCi0JCWVyciA9IGZkYl9maWxsX2luZm8oc2tiLCBiciwgZiwKLQkJCQkgICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKLQkJCQkgICAgUlRNX05FV05FSUdILAotCQkJCSAgICBOTE1fRl9NVUxUSSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJYnJlYWs7Ci1za2lwOgotCQkqaWR4ICs9IDE7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotaW50IGJyX2ZkYl9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICAgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKLQkgICAgICAgdTE2IHZpZCwgdTMyIHBvcnRpZCwgdTMyIHNlcSwKLQkgICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQotewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCWludCBlcnIgPSAwOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWYgPSBicl9mZGJfZmluZF9yY3UoYnIsIGFkZHIsIHZpZCk7Ci0JaWYgKCFmKSB7Ci0JCU5MX1NFVF9FUlJfTVNHKGV4dGFjaywgIkZkYiBlbnRyeSBub3QgZm91bmQiKTsKLQkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBlcnJvdXQ7Ci0JfQotCi0JZXJyID0gZmRiX2ZpbGxfaW5mbyhza2IsIGJyLCBmLCBwb3J0aWQsIHNlcSwKLQkJCSAgICBSVE1fTkVXTkVJR0gsIDApOwotZXJyb3V0OgotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmRiIGlzIG1vZGlmaWVkICovCi1zdGF0aWMgYm9vbCBmZGJfaGFuZGxlX25vdGlmeShzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYiwgdTggbm90aWZ5KQotewotCWJvb2wgbW9kaWZpZWQgPSBmYWxzZTsKLQotCS8qIGFsbG93IHRvIG1hcmsgYW4gZW50cnkgYXMgaW5hY3RpdmUsIHVzdWFsbHkgZG9uZSBvbiBjcmVhdGlvbiAqLwotCWlmICgobm90aWZ5ICYgRkRCX05PVElGWV9JTkFDVElWRV9CSVQpICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KEJSX0ZEQl9OT1RJRllfSU5BQ1RJVkUsICZmZGItPmZsYWdzKSkKLQkJbW9kaWZpZWQgPSB0cnVlOwotCi0JaWYgKChub3RpZnkgJiBGREJfTk9USUZZX0JJVCkgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoQlJfRkRCX05PVElGWSwgJmZkYi0+ZmxhZ3MpKSB7Ci0JCS8qIGVuYWJsZWQgYWN0aXZpdHkgdHJhY2tpbmcgKi8KLQkJbW9kaWZpZWQgPSB0cnVlOwotCX0gZWxzZSBpZiAoIShub3RpZnkgJiBGREJfTk9USUZZX0JJVCkgJiYKLQkJICAgdGVzdF9hbmRfY2xlYXJfYml0KEJSX0ZEQl9OT1RJRlksICZmZGItPmZsYWdzKSkgewotCQkvKiBkaXNhYmxlZCBhY3Rpdml0eSB0cmFja2luZywgY2xlYXIgbm90aWZ5IHN0YXRlICovCi0JCWNsZWFyX2JpdChCUl9GREJfTk9USUZZX0lOQUNUSVZFLCAmZmRiLT5mbGFncyk7Ci0JCW1vZGlmaWVkID0gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gbW9kaWZpZWQ7Ci19Ci0KLS8qIFVwZGF0ZSAoY3JlYXRlIG9yIHJlcGxhY2UpIGZvcndhcmRpbmcgZGF0YWJhc2UgZW50cnkgKi8KLXN0YXRpYyBpbnQgZmRiX2FkZF9lbnRyeShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwKLQkJCSBjb25zdCB1OCAqYWRkciwgc3RydWN0IG5kbXNnICpuZG0sIHUxNiBmbGFncywgdTE2IHZpZCwKLQkJCSBzdHJ1Y3QgbmxhdHRyICpuZmVhX3RiW10pCi17Ci0JYm9vbCBpc19zdGlja3kgPSAhIShuZG0tPm5kbV9mbGFncyAmIE5URl9TVElDS1kpOwotCWJvb2wgcmVmcmVzaCA9ICFuZmVhX3RiW05GRUFfRE9OVF9SRUZSRVNIXTsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQl1MTYgc3RhdGUgPSBuZG0tPm5kbV9zdGF0ZTsKLQlib29sIG1vZGlmaWVkID0gZmFsc2U7Ci0JdTggbm90aWZ5ID0gMDsKLQotCS8qIElmIHRoZSBwb3J0IGNhbm5vdCBsZWFybiBhbGxvdyBvbmx5IGxvY2FsIGFuZCBzdGF0aWMgZW50cmllcyAqLwotCWlmIChzb3VyY2UgJiYgIShzdGF0ZSAmIE5VRF9QRVJNQU5FTlQpICYmICEoc3RhdGUgJiBOVURfTk9BUlApICYmCi0JICAgICEoc291cmNlLT5zdGF0ZSA9PSBCUl9TVEFURV9MRUFSTklORyB8fAotCSAgICAgIHNvdXJjZS0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoIXNvdXJjZSAmJiAhKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkpIHsKLQkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggJXMgd2l0aG91dCBOVURfUEVSTUFORU5UXG4iLAotCQkJYnItPmRldi0+bmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChpc19zdGlja3kgJiYgKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG5mZWFfdGJbTkZFQV9BQ1RJVklUWV9OT1RJRlldKSB7Ci0JCW5vdGlmeSA9IG5sYV9nZXRfdTgobmZlYV90YltORkVBX0FDVElWSVRZX05PVElGWV0pOwotCQlpZiAoKG5vdGlmeSAmIH5CUl9GREJfTk9USUZZX1NFVFRBQkxFX0JJVFMpIHx8Ci0JCSAgICAobm90aWZ5ICYgQlJfRkRCX05PVElGWV9TRVRUQUJMRV9CSVRTKSA9PSBGREJfTk9USUZZX0lOQUNUSVZFX0JJVCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZkYiA9IGJyX2ZkYl9maW5kKGJyLCBhZGRyLCB2aWQpOwotCWlmIChmZGIgPT0gTlVMTCkgewotCQlpZiAoIShmbGFncyAmIE5MTV9GX0NSRUFURSkpCi0JCQlyZXR1cm4gLUVOT0VOVDsKLQotCQlmZGIgPSBmZGJfY3JlYXRlKGJyLCBzb3VyY2UsIGFkZHIsIHZpZCwgMCk7Ci0JCWlmICghZmRiKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJbW9kaWZpZWQgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCWlmIChmbGFncyAmIE5MTV9GX0VYQ0wpCi0JCQlyZXR1cm4gLUVFWElTVDsKLQotCQlpZiAoZmRiLT5kc3QgIT0gc291cmNlKSB7Ci0JCQlmZGItPmRzdCA9IHNvdXJjZTsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCWlmIChmZGJfdG9fbnVkKGJyLCBmZGIpICE9IHN0YXRlKSB7Ci0JCWlmIChzdGF0ZSAmIE5VRF9QRVJNQU5FTlQpIHsKLQkJCXNldF9iaXQoQlJfRkRCX0xPQ0FMLCAmZmRiLT5mbGFncyk7Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQlJfRkRCX1NUQVRJQywgJmZkYi0+ZmxhZ3MpKQotCQkJCWZkYl9hZGRfaHdfYWRkcihiciwgYWRkcik7Ci0JCX0gZWxzZSBpZiAoc3RhdGUgJiBOVURfTk9BUlApIHsKLQkJCWNsZWFyX2JpdChCUl9GREJfTE9DQUwsICZmZGItPmZsYWdzKTsKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChCUl9GREJfU1RBVElDLCAmZmRiLT5mbGFncykpCi0JCQkJZmRiX2FkZF9od19hZGRyKGJyLCBhZGRyKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyX2JpdChCUl9GREJfTE9DQUwsICZmZGItPmZsYWdzKTsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQlJfRkRCX1NUQVRJQywgJmZkYi0+ZmxhZ3MpKQotCQkJCWZkYl9kZWxfaHdfYWRkcihiciwgYWRkcik7Ci0JCX0KLQotCQltb2RpZmllZCA9IHRydWU7Ci0JfQotCi0JaWYgKGlzX3N0aWNreSAhPSB0ZXN0X2JpdChCUl9GREJfU1RJQ0tZLCAmZmRiLT5mbGFncykpIHsKLQkJY2hhbmdlX2JpdChCUl9GREJfU1RJQ0tZLCAmZmRiLT5mbGFncyk7Ci0JCW1vZGlmaWVkID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoZmRiX2hhbmRsZV9ub3RpZnkoZmRiLCBub3RpZnkpKQotCQltb2RpZmllZCA9IHRydWU7Ci0KLQlzZXRfYml0KEJSX0ZEQl9BRERFRF9CWV9VU0VSLCAmZmRiLT5mbGFncyk7Ci0KLQlmZGItPnVzZWQgPSBqaWZmaWVzOwotCWlmIChtb2RpZmllZCkgewotCQlpZiAocmVmcmVzaCkKLQkJCWZkYi0+dXBkYXRlZCA9IGppZmZpZXM7Ci0JCWZkYl9ub3RpZnkoYnIsIGZkYiwgUlRNX05FV05FSUdILCB0cnVlKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2JyX2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBuZXRfYnJpZGdlICpiciwKLQkJCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCi0JCQl1MTYgbmxoX2ZsYWdzLCB1MTYgdmlkLCBzdHJ1Y3QgbmxhdHRyICpuZmVhX3RiW10sCi0JCQlzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAobmRtLT5uZG1fZmxhZ3MgJiBOVEZfVVNFKSB7Ci0JCWlmICghcCkgewotCQkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggJXMgd2l0aCBOVEZfVVNFIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkJYnItPmRldi0+bmFtZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoIW5icF9zdGF0ZV9zaG91bGRfbGVhcm4ocCkpCi0JCQlyZXR1cm4gMDsKLQotCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCXJjdV9yZWFkX2xvY2soKTsKLQkJYnJfZmRiX3VwZGF0ZShiciwgcCwgYWRkciwgdmlkLCBCSVQoQlJfRkRCX0FEREVEX0JZX1VTRVIpKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWxvY2FsX2JoX2VuYWJsZSgpOwotCX0gZWxzZSBpZiAobmRtLT5uZG1fZmxhZ3MgJiBOVEZfRVhUX0xFQVJORUQpIHsKLQkJaWYgKCFwICYmICEobmRtLT5uZG1fc3RhdGUgJiBOVURfUEVSTUFORU5UKSkgewotCQkJTkxfU0VUX0VSUl9NU0dfTU9EKGV4dGFjaywKLQkJCQkJICAgIkZEQiBlbnRyeSB0b3dhcmRzIGJyaWRnZSBtdXN0IGJlIHBlcm1hbmVudCIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZXJyID0gYnJfZmRiX2V4dGVybmFsX2xlYXJuX2FkZChiciwgcCwgYWRkciwgdmlkLCB0cnVlKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCQllcnIgPSBmZGJfYWRkX2VudHJ5KGJyLCBwLCBhZGRyLCBuZG0sIG5saF9mbGFncywgdmlkLCBuZmVhX3RiKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBicl9uZGFfZmRiX3BvbFtORkVBX01BWCArIDFdID0gewotCVtORkVBX0FDVElWSVRZX05PVElGWV0JPSB7IC50eXBlID0gTkxBX1U4IH0sCi0JW05GRUFfRE9OVF9SRUZSRVNIXQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAotfTsKLQotLyogQWRkIG5ldyBwZXJtYW5lbnQgZmRiIGVudHJ5IHdpdGggUlRNX05FV05FSUdIICovCi1pbnQgYnJfZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5sYXR0ciAqdGJbXSwKLQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwgdTE2IG5saF9mbGFncywKLQkgICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQotewotCXN0cnVjdCBubGF0dHIgKm5mZWFfdGJbTkZFQV9NQVggKyAxXSwgKmF0dHI7Ci0Jc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfdmxhbiAqdjsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBOVUxMOwotCWludCBlcnIgPSAwOwotCi0JdHJhY2VfYnJfZmRiX2FkZChuZG0sIGRldiwgYWRkciwgdmlkLCBubGhfZmxhZ3MpOwotCi0JaWYgKCEobmRtLT5uZG1fc3RhdGUgJiAoTlVEX1BFUk1BTkVOVHxOVURfTk9BUlB8TlVEX1JFQUNIQUJMRSkpKSB7Ci0JCXByX2luZm8oImJyaWRnZTogUlRNX05FV05FSUdIIHdpdGggaW52YWxpZCBzdGF0ZSAlI3hcbiIsIG5kbS0+bmRtX3N0YXRlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhZGRyKSkgewotCQlwcl9pbmZvKCJicmlkZ2U6IFJUTV9ORVdORUlHSCB3aXRoIGludmFsaWQgZXRoZXIgYWRkcmVzc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkgewotCQliciA9IG5ldGRldl9wcml2KGRldik7Ci0JCXZnID0gYnJfdmxhbl9ncm91cChicik7Ci0JfSBlbHNlIHsKLQkJcCA9IGJyX3BvcnRfZ2V0X3J0bmwoZGV2KTsKLQkJaWYgKCFwKSB7Ci0JCQlwcl9pbmZvKCJicmlkZ2U6IFJUTV9ORVdORUlHSCAlcyBub3QgYSBicmlkZ2UgcG9ydFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnIgPSBwLT5icjsKLQkJdmcgPSBuYnBfdmxhbl9ncm91cChwKTsKLQl9Ci0KLQlpZiAodGJbTkRBX0ZEQl9FWFRfQVRUUlNdKSB7Ci0JCWF0dHIgPSB0YltOREFfRkRCX0VYVF9BVFRSU107Ci0JCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQobmZlYV90YiwgTkZFQV9NQVgsIGF0dHIsCi0JCQkJICAgICAgIGJyX25kYV9mZGJfcG9sLCBleHRhY2spOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9IGVsc2UgewotCQltZW1zZXQobmZlYV90YiwgMCwgc2l6ZW9mKHN0cnVjdCBubGF0dHIgKikgKiAoTkZFQV9NQVggKyAxKSk7Ci0JfQotCi0JaWYgKHZpZCkgewotCQl2ID0gYnJfdmxhbl9maW5kKHZnLCB2aWQpOwotCQlpZiAoIXYgfHwgIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSkgewotCQkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggd2l0aCB1bmNvbmZpZ3VyZWQgdmxhbiAlZCBvbiAlc1xuIiwgdmlkLCBkZXYtPm5hbWUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQkvKiBWSUQgd2FzIHNwZWNpZmllZCwgc28gdXNlIGl0LiAqLwotCQllcnIgPSBfX2JyX2ZkYl9hZGQobmRtLCBiciwgcCwgYWRkciwgbmxoX2ZsYWdzLCB2aWQsIG5mZWFfdGIsCi0JCQkJICAgZXh0YWNrKTsKLQl9IGVsc2UgewotCQllcnIgPSBfX2JyX2ZkYl9hZGQobmRtLCBiciwgcCwgYWRkciwgbmxoX2ZsYWdzLCAwLCBuZmVhX3RiLAotCQkJCSAgIGV4dGFjayk7Ci0JCWlmIChlcnIgfHwgIXZnIHx8ICF2Zy0+bnVtX3ZsYW5zKQotCQkJZ290byBvdXQ7Ci0KLQkJLyogV2UgaGF2ZSB2bGFucyBjb25maWd1cmVkIG9uIHRoaXMgcG9ydCBhbmQgdXNlciBkaWRuJ3QKLQkJICogc3BlY2lmeSBhIFZMQU4uICBUbyBiZSBuaWNlLCBhZGQvdXBkYXRlIGVudHJ5IGZvciBldmVyeQotCQkgKiB2bGFuIG9uIHRoaXMgcG9ydC4KLQkJICovCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodiwgJnZnLT52bGFuX2xpc3QsIHZsaXN0KSB7Ci0JCQlpZiAoIWJyX3ZsYW5fc2hvdWxkX3VzZSh2KSkKLQkJCQljb250aW51ZTsKLQkJCWVyciA9IF9fYnJfZmRiX2FkZChuZG0sIGJyLCBwLCBhZGRyLCBubGhfZmxhZ3MsIHYtPnZpZCwKLQkJCQkJICAgbmZlYV90YiwgZXh0YWNrKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGZkYl9kZWxldGVfYnlfYWRkcl9hbmRfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCi0JCQkJICAgICAgIGNvbnN0IHU4ICphZGRyLCB1MTYgdmxhbikKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQotCWZkYiA9IGJyX2ZkYl9maW5kKGJyLCBhZGRyLCB2bGFuKTsKLQlpZiAoIWZkYiB8fCBmZGItPmRzdCAhPSBwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWZkYl9kZWxldGUoYnIsIGZkYiwgdHJ1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2JyX2ZkYl9kZWxldGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJICAgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKLQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpCi17Ci0JaW50IGVycjsKLQotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0JZXJyID0gZmRiX2RlbGV0ZV9ieV9hZGRyX2FuZF9wb3J0KGJyLCBwLCBhZGRyLCB2aWQpOwotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qIFJlbW92ZSBuZWlnaGJvciBlbnRyeSB3aXRoIFJUTV9ERUxORUlHSCAqLwotaW50IGJyX2ZkYl9kZWxldGUoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKQotewotCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW5fZ3JvdXAgKnZnOwotCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBOVUxMOwotCXN0cnVjdCBuZXRfYnJpZGdlX3ZsYW4gKnY7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyOwotCWludCBlcnI7Ci0KLQlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpIHsKLQkJYnIgPSBuZXRkZXZfcHJpdihkZXYpOwotCQl2ZyA9IGJyX3ZsYW5fZ3JvdXAoYnIpOwotCX0gZWxzZSB7Ci0JCXAgPSBicl9wb3J0X2dldF9ydG5sKGRldik7Ci0JCWlmICghcCkgewotCQkJcHJfaW5mbygiYnJpZGdlOiBSVE1fREVMTkVJR0ggJXMgbm90IGEgYnJpZGdlIHBvcnRcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXZnID0gbmJwX3ZsYW5fZ3JvdXAocCk7Ci0JCWJyID0gcC0+YnI7Ci0JfQotCi0JaWYgKHZpZCkgewotCQl2ID0gYnJfdmxhbl9maW5kKHZnLCB2aWQpOwotCQlpZiAoIXYpIHsKLQkJCXByX2luZm8oImJyaWRnZTogUlRNX0RFTE5FSUdIIHdpdGggdW5jb25maWd1cmVkIHZsYW4gJWQgb24gJXNcbiIsIHZpZCwgZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJZXJyID0gX19icl9mZGJfZGVsZXRlKGJyLCBwLCBhZGRyLCB2aWQpOwotCX0gZWxzZSB7Ci0JCWVyciA9IC1FTk9FTlQ7Ci0JCWVyciAmPSBfX2JyX2ZkYl9kZWxldGUoYnIsIHAsIGFkZHIsIDApOwotCQlpZiAoIXZnIHx8ICF2Zy0+bnVtX3ZsYW5zKQotCQkJcmV0dXJuIGVycjsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsICZ2Zy0+dmxhbl9saXN0LCB2bGlzdCkgewotCQkJaWYgKCFicl92bGFuX3Nob3VsZF91c2UodikpCi0JCQkJY29udGludWU7Ci0JCQllcnIgJj0gX19icl9mZGJfZGVsZXRlKGJyLCBwLCBhZGRyLCB2LT52aWQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotaW50IGJyX2ZkYl9zeW5jX3N0YXRpYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmLCAqdG1wOwotCWludCBlcnIgPSAwOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCS8qIHRoZSBrZXkgaGVyZSBpcyB0aGF0IHN0YXRpYyBlbnRyaWVzIGNoYW5nZSBvbmx5IHVuZGVyIHJ0bmwgKi8KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsICZici0+ZmRiX2xpc3QsIGZkYl9ub2RlKSB7Ci0JCS8qIFdlIG9ubHkgY2FyZSBmb3Igc3RhdGljIGVudHJpZXMgKi8KLQkJaWYgKCF0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmZi0+ZmxhZ3MpKQotCQkJY29udGludWU7Ci0JCWVyciA9IGRldl91Y19hZGQocC0+ZGV2LCBmLT5rZXkuYWRkci5hZGRyKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gcm9sbGJhY2s7Ci0JfQotZG9uZToKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBlcnI7Ci0KLXJvbGxiYWNrOgotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0bXAsICZici0+ZmRiX2xpc3QsIGZkYl9ub2RlKSB7Ci0JCS8qIFdlIG9ubHkgY2FyZSBmb3Igc3RhdGljIGVudHJpZXMgKi8KLQkJaWYgKCF0ZXN0X2JpdChCUl9GREJfU1RBVElDLCAmdG1wLT5mbGFncykpCi0JCQljb250aW51ZTsKLQkJaWYgKHRtcCA9PSBmKQotCQkJYnJlYWs7Ci0JCWRldl91Y19kZWwocC0+ZGV2LCB0bXAtPmtleS5hZGRyLmFkZHIpOwotCX0KLQotCWdvdG8gZG9uZTsKLX0KLQotdm9pZCBicl9mZGJfdW5zeW5jX3N0YXRpYyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnApCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCi0JQVNTRVJUX1JUTkwoKTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJmJyLT5mZGJfbGlzdCwgZmRiX25vZGUpIHsKLQkJLyogV2Ugb25seSBjYXJlIGZvciBzdGF0aWMgZW50cmllcyAqLwotCQlpZiAoIXRlc3RfYml0KEJSX0ZEQl9TVEFUSUMsICZmLT5mbGFncykpCi0JCQljb250aW51ZTsKLQotCQlkZXZfdWNfZGVsKHAtPmRldiwgZi0+a2V5LmFkZHIuYWRkcik7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1pbnQgYnJfZmRiX2V4dGVybmFsX2xlYXJuX2FkZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAsCi0JCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLAotCQkJICAgICAgYm9vbCBzd2Rldl9ub3RpZnkpCi17Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7Ci0JYm9vbCBtb2RpZmllZCA9IGZhbHNlOwotCWludCBlcnIgPSAwOwotCi0JdHJhY2VfYnJfZmRiX2V4dGVybmFsX2xlYXJuX2FkZChiciwgcCwgYWRkciwgdmlkKTsKLQotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0KLQlmZGIgPSBicl9mZGJfZmluZChiciwgYWRkciwgdmlkKTsKLQlpZiAoIWZkYikgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzID0gQklUKEJSX0ZEQl9BRERFRF9CWV9FWFRfTEVBUk4pOwotCi0JCWlmIChzd2Rldl9ub3RpZnkpCi0JCQlmbGFncyB8PSBCSVQoQlJfRkRCX0FEREVEX0JZX1VTRVIpOwotCi0JCWlmICghcCkKLQkJCWZsYWdzIHw9IEJJVChCUl9GREJfTE9DQUwpOwotCi0JCWZkYiA9IGZkYl9jcmVhdGUoYnIsIHAsIGFkZHIsIHZpZCwgZmxhZ3MpOwotCQlpZiAoIWZkYikgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX3VubG9jazsKLQkJfQotCQlmZGJfbm90aWZ5KGJyLCBmZGIsIFJUTV9ORVdORUlHSCwgc3dkZXZfbm90aWZ5KTsKLQl9IGVsc2UgewotCQlmZGItPnVwZGF0ZWQgPSBqaWZmaWVzOwotCi0JCWlmIChmZGItPmRzdCAhPSBwKSB7Ci0JCQlmZGItPmRzdCA9IHA7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCX0KLQotCQlpZiAodGVzdF9iaXQoQlJfRkRCX0FEREVEX0JZX0VYVF9MRUFSTiwgJmZkYi0+ZmxhZ3MpKSB7Ci0JCQkvKiBSZWZyZXNoIGVudHJ5ICovCi0JCQlmZGItPnVzZWQgPSBqaWZmaWVzOwotCQl9IGVsc2UgaWYgKCF0ZXN0X2JpdChCUl9GREJfQURERURfQllfVVNFUiwgJmZkYi0+ZmxhZ3MpKSB7Ci0JCQkvKiBUYWtlIG92ZXIgU1cgbGVhcm5lZCBlbnRyeSAqLwotCQkJc2V0X2JpdChCUl9GREJfQURERURfQllfRVhUX0xFQVJOLCAmZmRiLT5mbGFncyk7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCX0KLQotCQlpZiAoc3dkZXZfbm90aWZ5KQotCQkJc2V0X2JpdChCUl9GREJfQURERURfQllfVVNFUiwgJmZkYi0+ZmxhZ3MpOwotCi0JCWlmICghcCkKLQkJCXNldF9iaXQoQlJfRkRCX0xPQ0FMLCAmZmRiLT5mbGFncyk7Ci0KLQkJaWYgKG1vZGlmaWVkKQotCQkJZmRiX25vdGlmeShiciwgZmRiLCBSVE1fTkVXTkVJR0gsIHN3ZGV2X25vdGlmeSk7Ci0JfQotCi1lcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLWludCBicl9mZGJfZXh0ZXJuYWxfbGVhcm5fZGVsKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKLQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsCi0JCQkgICAgICBib29sIHN3ZGV2X25vdGlmeSkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQlpbnQgZXJyID0gMDsKLQotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0KLQlmZGIgPSBicl9mZGJfZmluZChiciwgYWRkciwgdmlkKTsKLQlpZiAoZmRiICYmIHRlc3RfYml0KEJSX0ZEQl9BRERFRF9CWV9FWFRfTEVBUk4sICZmZGItPmZsYWdzKSkKLQkJZmRiX2RlbGV0ZShiciwgZmRiLCBzd2Rldl9ub3RpZnkpOwotCWVsc2UKLQkJZXJyID0gLUVOT0VOVDsKLQotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXZvaWQgYnJfZmRiX29mZmxvYWRlZF9zZXQoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLCBib29sIG9mZmxvYWRlZCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQotCXNwaW5fbG9ja19iaCgmYnItPmhhc2hfbG9jayk7Ci0KLQlmZGIgPSBicl9mZGJfZmluZChiciwgYWRkciwgdmlkKTsKLQlpZiAoZmRiICYmIG9mZmxvYWRlZCAhPSB0ZXN0X2JpdChCUl9GREJfT0ZGTE9BREVELCAmZmRiLT5mbGFncykpCi0JCWNoYW5nZV9iaXQoQlJfRkRCX09GRkxPQURFRCwgJmZkYi0+ZmxhZ3MpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwotfQotI2lmZGVmIENPTkZJR19GQVNUTkFUX01PRFVMRQotaW50IGZhc3RfYnIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQkvL2xpdW1fZmFzdG5hdF9kZWwKLQljb25zdCB1bnNpZ25lZCBjaGFyICpkZXN0ID0gTlVMTDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYjsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwotCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKLQl1MTYgdmlkID0gMDsKLQlpbnQgbnRsX3BvcnRfaWQgPSAweGZmOwotCQotCWlmKCFza2ItPmRldikKLQl7Ci0JCS8vcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X2JyICBza2ItPmRldiBlcnIgc2tiLT5kZXYgPSAleFxuIiwgc2tiLT5kZXYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCQkJCSAgCi0JLyppZihza2ItPm1hY19oZWFkZXIgPT0gMCB8fCBza2ItPm1hY19oZWFkZXIgPT0gfjBVKQotCQlwYW5pYygiZHJpdmVyICBub3QgIHNldCAgbWFjaGVhZGVyICEhIVxuIik7Ki8KLQkJCQkJICAKLQlkZXN0ID0gZXRoX2hkcihza2IpLT5oX2Rlc3Q7Ci0JCQkJICAKLQotCXAgPSBicl9wb3J0X2dldF9ydG5sKHNrYi0+ZGV2KTsKLQlpZiAocCA9PSBOVUxMIHx8IHAtPmJyID09IE5VTEwpCQkgIAotCXsKLQkJLy9wcmludF9zdW4oU1VOX0RCRywgImZhc3RfYnIgIGJyX3BvcnRfZ2V0X3J0bmwgZXJyIHAgPSAleFxuIiwgcCk7Ci0JCXJldHVybiAwOwotCX0KLQkJCQkgIAotCWJyID0gcC0+YnI7Ci0JYnJfc2hvdWxkX2xlYXJuKHAsIHNrYiwgJnZpZCk7Ci0KLQkvL2hlYWQgPSAmYnItPmhhc2hbYnJfbWFjX2hhc2goZGVzdCwgdmlkKV07Ci0JCQkJCSAgCi0JLy9pZigoZmRiID0gZmRiX2ZpbmRfcmN1KGhlYWQsIGRlc3QsdmlkKSkgIT0gTlVMTCkKLQlpZigoZmRiID0gZmRiX2ZpbmRfcmN1KCYoYnItPmZkYl9oYXNoX3RibCksIGRlc3QsdmlkKSkgIT0gTlVMTCkKLQl7Ci0JCQotCQlpZigoISh0ZXN0X2JpdChCUl9GREJfTE9DQUwsICZmZGItPmZsYWdzKSkpICYmIGZkYi0+ZHN0ICYmIGZkYi0+ZHN0LT5kZXYgJiYgCi0JCQkoKChmZGItPmRzdC0+ZmxhZ3MgJiBCUl9IQUlSUElOX01PREUpIHx8IHNrYi0+ZGV2ICE9IGZkYi0+ZHN0LT5kZXYpICYmZmRiLT5kc3QtPnN0YXRlID09IEJSX1NUQVRFX0ZPUldBUkRJTkcpKSAKLQkJewotCQkJZmFzdF90Y3BkdW1wKHNrYik7Ci0JCQlpZihmYXN0bmF0X2xldmVsID09IEZBU1RfTkVUX0RFVklDRSl7Ci0JCQkJc2tiLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQlza2ItPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0JCQl9Ci0JCQlza2ItPmRldiA9IGZkYi0+ZHN0LT5kZXY7Ci0JCQlza2ItPmlzRmFzdGJyID0gMTsKLQkJCWZkYi0+dXBkYXRlZCA9IGppZmZpZXM7Ci0JCQlza2ItPm5vd19sb2NhdGlvbiB8PSBGQVNUQlJfU1VDQzsKLQkJCXNrYl9yZXN0X2RhdGFfYnlwcm90byhza2IpOwotCi0JCQlicl9kZXZfcXVldWVfcHVzaF94bWl0KE5VTEwsIE5VTEwsIHNrYik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQkJICAKLQkJCi0JCWlmKCghKHRlc3RfYml0KEJSX0ZEQl9MT0NBTCwgJmZkYi0+ZmxhZ3MpKSkgJiYgZmRiLT5kc3QgJiYgZmRiLT5kc3QtPmRldiAmJiAKLQkJCShza2ItPmRldiA9PSBmZGItPmRzdC0+ZGV2KSAmJiBmZGItPmRzdC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykKLQkJewotCQkJc2tiaW5mb19hZGQoTlVMTCxTS0JfTE9PUCk7Ci0JCQlza2ItPmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJLy9wcmludF9zdW4oU1VOX0VSUiwiZmFzdF9iciBsb29wIGRhdGEgZGlzY2FyZGVkLCBkZXY6JXMgXG4iLCBza2ItPmRldi0+bmFtZSk7Ci0JCQlrZnJlZV9za2Ioc2tiKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCS8vcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X2JyICBmZGJfZmluZF9yY3UgZXJyIGZkYiA9ICV4IFxuIixmZGIpOwotCQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChmYXN0X2JyKTsKLQotCi0KLXN0cnVjdCBuZXRfZGV2aWNlICpnZXRicnBvcnRfYnlkc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1bnNpZ25lZCBjaGFyICpkZXN0KQotewotCS8vbGl1bV9mYXN0bmF0X2RlbAotCS8vc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGI7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7Ci0Jc3RydWN0IG5ldF9icmlkZ2Vfdmxhbl9ncm91cCAqdmc7Ci0JX191MTYgdmlkOwotI2lmIEZBU1ROQVRfREVCVUcKLQlwcmludGsoImdldGJycG9ydF9ieWRzdCgpIGJlZ2luZSIpOwotI2VuZGlmCi0KLQlpZiAoZGV2ID09IE5VTEwgfHwgIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpCi0JCXJldHVybiBkZXY7Ci0jaWYgRkFTVE5BVF9ERUJVRwotCXByaW50aygiZ2V0YnJwb3J0X2J5ZHN0KCkgMSIpOwotI2VuZGlmCi0JYnIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXZnID0gYnJfdmxhbl9ncm91cF9yY3UoYnIpOwotCXZpZCA9IGJyX2dldF9wdmlkKHZnKTsKLSNpZiBGQVNUTkFUX0RFQlVHCi0JcHJpbnRrKCJnZXRicnBvcnRfYnlkc3QoKSAyIik7Ci0jZW5kaWYKLQkKLQkvL2hlYWQgPSAmYnItPmhhc2hbYnJfbWFjX2hhc2goZGVzdCx2aWQpXTsKLSNpZiBGQVNUTkFUX0RFQlVHCi0JcHJpbnRrKCJnZXRicnBvcnRfYnlkc3QoKSAzIik7Ci0jZW5kaWYKLQkvL2lmKChmZGIgPSBmZGJfZmluZF9yY3UoaGVhZCwgZGVzdCx2aWQpKSAhPSBOVUxMKQotCWlmKChmZGIgPSBmZGJfZmluZF9yY3UoJihici0+ZmRiX2hhc2hfdGJsKSwgZGVzdCx2aWQpKSAhPSBOVUxMKQotCXsKLQkKLQkJaWYoKCEodGVzdF9iaXQoQlJfRkRCX0xPQ0FMLCAmZmRiLT5mbGFncykpKSAmJiBmZGItPmRzdCAmJiBmZGItPmRzdC0+ZGV2ICYmIAotCQkJKGZkYi0+ZHN0LT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKSkgLy8oZmRiLT5kc3QtPmZsYWdzICYgQlJfSEFJUlBJTl9NT0RFKQotCQl7Ci0JCQlyZXR1cm4gZmRiLT5kc3QtPmRldjsKLQkJfQotCX0KLQlyZXR1cm4gZGV2OwotfQotCi1leHRlcm4gdm9pZCBmYXN0X3RjcGR1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gc3RydWN0IG5laWdoX3RhYmxlIGFycF90Ymw7Ci1leHRlcm4gY2hhciBkZWZhdWx0X3JvdXRlX25hbWVbSUZOQU1TSVpdOwotY2hhciBkZWZhdWx0X2JyX25hbWVbSUZOQU1TSVpdID0gezB9OwotaW50IGZhc3RfZndkX2lwNGFkZHJfY29uZmxpY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCV9fYmUzMiBzYWRkcixkYWRkcix3YW5faXAsYnJfaXA9MCxicl9iY2FzdD0wOwotCXN0cnVjdCBuZXRfZGV2aWNlKiBpbl9kZXYgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlKiBvdXRfZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgZXRoaGRyICpldGg7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZWZhdWx0X3JvdXRlX2RldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGVmYXVsdF9icl9kZXY7Ci0Jc3RydWN0IGluX2RldmljZSAqaXBfcHRyOwotCi0JaWYoaXBoLT52ZXJzaW9uICE9IDQgfHwgc2tiLT5pbmRldiA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIDA7Ci0JfQotCWRlZmF1bHRfcm91dGVfZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgZGVmYXVsdF9yb3V0ZV9uYW1lKTsKLQlpZihkZWZhdWx0X3JvdXRlX2RldiA9PSBOVUxMKQotCXsKLQkJcmV0dXJuIDA7Ci0JfQotCWlwX3B0ciA9IF9faW5fZGV2X2dldF9ydG5sKGRlZmF1bHRfcm91dGVfZGV2KTsKLQlpZihpcF9wdHIgJiYgaXBfcHRyLT5pZmFfbGlzdCkKLQl7Ci0JCXdhbl9pcCA9IGlwX3B0ci0+aWZhX2xpc3QtPmlmYV9sb2NhbDsKLQl9Ci0JZWxzZQotCXsKLQkJZGVmYXVsdF9icl9uYW1lWzBdID0gMDsKLQkJZGV2X3B1dChkZWZhdWx0X3JvdXRlX2Rldik7Ci0JCXJldHVybiAwOwotCX0KLQlpbl9kZXYgPSBza2ItPmluZGV2OwotCXNhZGRyID0gaXBoLT5zYWRkcjsKLQlkYWRkciA9IGlwaC0+ZGFkZHI7Ci0JcCA9IGJyX3BvcnRfZ2V0X3J0bmwoaW5fZGV2KTsKLQlpZiAocCAhPSBOVUxMKSAJCQotCXsKLQkJYnIgPSBwLT5icjsKLQkJaWYgKGJyICYmIGJyLT5kZXYgJiYgc3RybmNtcChici0+ZGV2LT5uYW1lLCBkZWZhdWx0X2JyX25hbWUsIElGTkFNU0laLTEpKQotCQl7Ci0JCQlzdHJuY3B5KGRlZmF1bHRfYnJfbmFtZSwgYnItPmRldi0+bmFtZSwgSUZOQU1TSVotMSk7Ci0JCX0KLQl9Ci0JZGVmYXVsdF9icl9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBkZWZhdWx0X2JyX25hbWUpOwotCWlmKGRlZmF1bHRfYnJfZGV2KQotCXsKLQkJaXBfcHRyID0gX19pbl9kZXZfZ2V0X3J0bmwoZGVmYXVsdF9icl9kZXYpOwotCQlpZihpcF9wdHIgJiYgaXBfcHRyLT5pZmFfbGlzdCkKLQkJewotCQkJYnJfaXAgPSBpcF9wdHItPmlmYV9saXN0LT5pZmFfbG9jYWw7Ci0JCQlicl9iY2FzdCA9IGlwX3B0ci0+aWZhX2xpc3QtPmlmYV9icm9hZGNhc3Q7Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJZGV2X3B1dChkZWZhdWx0X3JvdXRlX2Rldik7Ci0JCXJldHVybiAwOwotCX0KLQlpZihiciAmJiAoKGRhZGRyID09IGJyX2lwKSB8fCAoZGFkZHIgPT0gYnJfYmNhc3QpIHx8IChkYWRkciA9PSB3YW5faXApKSkKLQl7Ci0JCS8vcHJpbnRrKCJAIUAxc2FkZHI9JTA4eCxkYWRkcj0lMDh4LGJyX2lwPSUwOHgsYnJfYmNhc3Q9JTA4eCx3YW5faXA9JTA4eFxuIixzYWRkciwgZGFkZHIsICBicl9pcCwgYnJfYmNhc3QsIHdhbl9pcCk7Ci0JCWlmIChJUFBST1RPX1VEUCA9PSBpcGgtPnByb3RvY29sKQotCQl7Ci0JCQlzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgaXBoLT5paGwgKiA0KTsKLQkJCWlmKHVkcGgtPnNvdXJjZSA9PSAweDQzMDAgfHwgdWRwaC0+c291cmNlID09IDB4NDQwMAotCQkJCXx8IHVkcGgtPmRlc3QgPT0gMHg0MzAwIHx8IHVkcGgtPmRlc3QgPT0gMHg0NDAwKQotCQkJewotCQkJCS8vcHJpbnRrKCJAIUBkaGNwIHBhY2tldFxuIik7Ci0JCQkJZGV2X3B1dChkZWZhdWx0X3JvdXRlX2Rldik7Ci0JCQkJZGV2X3B1dChkZWZhdWx0X2JyX2Rldik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJb3V0X2RldiA9IGRlZmF1bHRfcm91dGVfZGV2OwotCQlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLQkJZXRoID0gKHN0cnVjdCBldGhoZHIqKShza2ItPmRhdGEpOwotCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgaW5fZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkoZXRoLT5oX2Rlc3QsIG91dF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCWZhc3RfdGNwZHVtcChza2IpOwotCQlza2ItPmRldiA9IG91dF9kZXY7Ci0JfQotCWVsc2UgaWYoaW5fZGV2ID09IGRlZmF1bHRfcm91dGVfZGV2ICYmICgoc2FkZHIgPT0gYnJfaXApIHx8IChzYWRkciA9PSBicl9iY2FzdCkgfHwgKHNhZGRyID09IHdhbl9pcCkpKQotCXsKLQkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmZGFkZHIsIGRlZmF1bHRfYnJfZGV2KTsKLQkJLy9wcmludGsoIkAhQDJzYWRkcj0lMDh4LGRhZGRyPSUwOHgsbmVpZ2g9JTA4eCx3YW5faXA9JTA4eFxuIixzYWRkciwgZGFkZHIsIG5laWdoLCB3YW5faXApOwotCQlpZihuZWlnaCkKLQkJewotCQkJLy9wcmludGsoIkAhQG5laWdoPSVzXG4iLG5laWdoLT5kZXYtPm5hbWUpOwotCQkJb3V0X2RldiA9IGdldGJycG9ydF9ieWRzdChkZWZhdWx0X2JyX2RldixuZWlnaC0+aGEpOwotCQkJaWYob3V0X2RldikKLQkJCXsKLQkJCQkvL3ByaW50aygiQCFAb3V0X2Rldj0lc1xuIixvdXRfZGV2LT5uYW1lKTsKLQkJCQlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLQkJCQlldGggPSAoc3RydWN0IGV0aGhkciopKHNrYi0+ZGF0YSk7Ci0JCQkJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIG91dF9kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JCQkJbWVtY3B5KGV0aC0+aF9kZXN0LCBuZWlnaC0+aGEsIEVUSF9BTEVOKTsKLQkJCQkvL3ByaW50aygiQCFAbWFjPSUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLGV0aC0+aF9kZXN0WzBdLGV0aC0+aF9kZXN0WzFdLGV0aC0+aF9kZXN0WzJdLGV0aC0+aF9kZXN0WzNdLGV0aC0+aF9kZXN0WzRdLGV0aC0+aF9kZXN0WzVdKTsKLQkJCX0KLQkJCW5laWdoX3JlbGVhc2UobmVpZ2gpOwotCQl9Ci0JCWlmKG91dF9kZXYgPT0gTlVMTCkKLQkJewotCQkJcHJpbnRrKCJAIUBkZXY6IGJyIHBvcnQgbm90IGZvdW5kXG4iKTsKLQkJCWRldl9wdXQoZGVmYXVsdF9yb3V0ZV9kZXYpOwotCQkJZGV2X3B1dChkZWZhdWx0X2JyX2Rldik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlmYXN0X3RjcGR1bXAoc2tiKTsKLQkJc2tiLT5kZXYgPSBvdXRfZGV2OwotCX0KLQllbHNlCi0JewotCQlkZXZfcHV0KGRlZmF1bHRfcm91dGVfZGV2KTsKLQkJZGV2X3B1dChkZWZhdWx0X2JyX2Rldik7Ci0JCXJldHVybiAwOwotCX0KLQkJCi0JZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOwotCXNrYi0+bm93X2xvY2F0aW9uIHw9IEZBU1ROQVRfU1VDQzsKLQlkZXZfcXVldWVfeG1pdChza2IpOwotCQotCWRldl9wdXQoZGVmYXVsdF9yb3V0ZV9kZXYpOwotCWRldl9wdXQoZGVmYXVsdF9icl9kZXYpOwotCXJldHVybiAxOwotfQotCi1pbnQgZmFzdF9mb3JfbXVsdGljYXN0KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+aW5kZXYgJiYgIXN0cm5jbXAoc2tiLT5pbmRldi0+bmFtZSwgZGVmYXVsdF9yb3V0ZV9uYW1lLCBJRk5BTVNJWi0xKSkKLQl7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlKiBkZXYgPSBOVUxMOwotCQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7Ci0JCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7Ci0JCQotCQlkZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBkZWZhdWx0X2JyX25hbWUpOwotCQlpZiAoZGV2ID09IE5VTEwgfHwgIShkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkpCi0JCXsKLQkJCXByaW50aygiQCFAZGV2OiBiciBub3QgZm91bmRcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnIgPSAoc3RydWN0IG5ldF9icmlkZ2UgKiluZXRkZXZfcHJpdihkZXYpOwotCQlwID0gYnJfZ2V0X3BvcnQoYnIsIDEpOwotCQlpZihwICYmIHAtPmRldikKLQkJewotCQkJc3RydWN0IGV0aGhkciAqZXRoOwotCQkJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQkJCQotCQkJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7Ci0JCQlldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQkJCW1lbWNweShldGgtPmhfc291cmNlLCBwLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IAotCQkJaXBfZXRoX21jX21hcChpcGgtPmRhZGRyLCBldGgtPmhfZGVzdCk7Ci0JCQlldGgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7Ci0JCQlza2ItPmRldiA9IHAtPmRldjsKLQkJCXNrYi0+bm93X2xvY2F0aW9uIHw9IEZBU1ROQVRfU1VDQzsKLQkJCWRldl9xdWV1ZV94bWl0KHNrYik7Ci0JCQlkZXZfcHV0KGRldik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlkZXZfcHV0KGRldik7Ci0JfQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXZvaWQgYnJfZmRiX2NsZWFyX29mZmxvYWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHZpZCkKLXsKLQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmY7Ci0Jc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKLQotCUFTU0VSVF9SVE5MKCk7Ci0KLQlwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOwotCWlmICghcCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2JoKCZwLT5ici0+aGFzaF9sb2NrKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmcC0+YnItPmZkYl9saXN0LCBmZGJfbm9kZSkgewotCQlpZiAoZi0+ZHN0ID09IHAgJiYgZi0+a2V5LnZsYW5faWQgPT0gdmlkKQotCQkJY2xlYXJfYml0KEJSX0ZEQl9PRkZMT0FERUQsICZmLT5mbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwLT5ici0+aGFzaF9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJyX2ZkYl9jbGVhcl9vZmZsb2FkKTsKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvU0kvbmV0X290aGVyLmMgYi91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL1NJL25ldF9vdGhlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNjc0OGM3Li4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvU0kvbmV0X290aGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIyICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9pY21wLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSAiLi4vLi4vYnJpZGdlL2JyX3ByaXZhdGUuaCIKLSNpbmNsdWRlIDxuZXQvYXJwLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldGlvY19wcm9jLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldGlvY3RsLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL2Vycm5vX3RyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X290aGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNpZmRlZiBORVRMSU5LX1VDIAotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2RyaXZlcnMvbmV0L2Zhc3Q2L2Zhc3Q2LmgiCi0jaW5jbHVkZSAiLi4vLi4vLi4vLi4vZHJpdmVycy9uZXQvZmFzdG5hdC9mYXN0bmF0LmgiCi0jZWxzZQotI2luY2x1ZGUgPG5ldC9TSS9mYXN0bmF0Lmg+Ci0jaW5jbHVkZSA8bmV0L1NJL2Zhc3Q2Lmg+Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU1BFRURfT1BUCi1leHRlcm4gc2l6ZV90IHNrYl9zeXNfcG9vbF9zaXplKGNvbnN0IHZvaWQgKnB0cik7Ci0jZW5kaWYKLXVuc2lnbmVkIGxvbmcgY2hlY2tfcGt0ID0gMDsKLUVYUE9SVF9TWU1CT0woY2hlY2tfcGt0KTsKLWludCBzZXRfcHJpbnRfcGt0ID0gMDsgIC8qtPLTobD8xNrI3SovCi0KLS8qvMfCvLGozsSz9sjrttTQxc+iKi8KLXN0cnVjdCBjaGVja19wa3RfaW5mbyBza2JfaW5zZXJ0X2luZm8gPSB7MH07Ci1FWFBPUlRfU1lNQk9MKHNrYl9pbnNlcnRfaW5mbyk7Ci1zdHJ1Y3QgY2hlY2tfcGt0X2luZm8gc2tiX3VubGlua19pbmZvID0gezB9OwotRVhQT1JUX1NZTUJPTChza2JfdW5saW5rX2luZm8pOwotCi0vKr2rc2tizPjXqrW9QVJQL0lQVjTNt7K/LLe1u9jN+MLnsuPQrdLpo6yyu7jEseRza2IqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIqIHNraXBfbWFjX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBzaG9ydCAqcHJvdG9jb2wpCi17Ci0gICAgX19iZTE2IG5leHRfcHJvOwotICAgIHVuc2lnbmVkIGNoYXIgKmN1cnJfcHRyID0gTlVMTDsKLQotICAgIGlmKHNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkKLSAgICB7Ci0gICAgICAgIGN1cnJfcHRyID0gc2tiX21hY19oZWFkZXIoc2tiKTsKLSAgICAgICAgY3Vycl9wdHIgKz0gRVRIX0hMRU47Ci0gICAgICAgIG5leHRfcHJvID0gKihfX2JlMTYgKikoY3Vycl9wdHIgLSAyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY3Vycl9wdHIgPSBza2ItPmRhdGEgKyBFVEhfSExFTjsKLSAgICAgICAgbmV4dF9wcm8gPSAqKF9fYmUxNiAqKShjdXJyX3B0ciAtIDIpOwotICAgIH0KLQotYWdhaW46Ci0gICAgaWYgKGh0b25zKEVUSF9QX0lQKSA9PSBuZXh0X3BybyB8fCBodG9ucyhFVEhfUF9BUlApID09IG5leHRfcHJvKQotICAgIHsKLSAgICAgICAgKnByb3RvY29sID0gbnRvaHMobmV4dF9wcm8pOwotICAgICAgICByZXR1cm4gY3Vycl9wdHI7Ci0gICAgfQotICAgIC8vdmxhbgotICAgIGVsc2UgaWYgKG5leHRfcHJvID09IGNwdV90b19iZTE2KEVUSF9QXzgwMjFRKSkKLSAgICB7Ci0gICAgICAgIGN1cnJfcHRyICs9IFZMQU5fSExFTjsKLSAgICAgICAgbmV4dF9wcm8gPSAqKChfX2JlMTYgKikoY3Vycl9wdHIgLSAyKSk7Ci0gICAgICAgIGdvdG8gYWdhaW47Ci0gICAgfQotICAgIC8vcHBwb2UgCi0gICAgZWxzZSBpZiAobmV4dF9wcm8gPT0gaHRvbnMoRVRIX1BfUFBQX1NFUykpCi0gICAgewotICAgICAgICBpZiAoKihjdXJyX3B0ciArIDYpID09IDB4MDAgJiYgKCooY3Vycl9wdHIgKyA3KSA9PSAweDIxIHx8ICooY3Vycl9wdHIgKyA3KSA9PSAweDU3KSkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dF9wcm8gPSBodG9ucyhFVEhfUF9JUCk7Ci0gICAgICAgICAgICBjdXJyX3B0ciArPSBQUFBPRV9IRUFERVJfTEVOOwotICAgICAgICAgICAgZ290byBhZ2FpbjsKLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyq94s72REhDUNGhz+7X1rbOo6y78cihttTTpm1lc3NhZ2UgdHlwZSzDu9PQveJvdmVybG9hZCovCi11bnNpZ25lZCBjaGFyICpkaGNwX29wdGlvbl9nZXQodW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLCBpbnQgY29kZSkKLXsKLQl1bnNpZ25lZCBjaGFyICpvcHRfcHRyOwotCWludCBsZW47Ci0JaW50IG92ZXJsb2FkID0gMDsKLQotCW9wdF9wdHIgPSBkYXRhOwotCXdoaWxlICgxKSB7Ci0JCWlmIChkYXRhX2xlbiA8PSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaWYgKG9wdF9wdHJbMF0gPT0gREhDUF9QQURESU5HKSAKLSAgICAgICAgewotCQkJZGF0YV9sZW4tLTsKLQkJCW9wdF9wdHIrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChvcHRfcHRyWzBdID09IERIQ1BfRU5EKQotCQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIAotCQlsZW4gPSAyICsgb3B0X3B0clsxXTsKLQkJZGF0YV9sZW4gLT0gbGVuOwotCQlpZiAoZGF0YV9sZW4gPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaWYgKG9wdF9wdHJbMF0gPT0gY29kZSkKLQkJCXJldHVybiBvcHRfcHRyICsgMjsKLQotCQlvcHRfcHRyICs9IGxlbjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotCi12b2lkIHByaW50X2NoZWNrX3BrdF9pbmZvKHN0cnVjdCBjaGVja19wa3RfaW5mbyAqcGt0X2luZm8sIGludCBudW0pCi17Ci0gICAgaW50IGkgPSAwOwotICAgIAotICAgIG51bSA9IG51bSA+IE1BWF9QS1RfTlVNID8gTUFYX1BLVF9OVU0gOiBudW07Ci0gICAgcHJpbnRrKCJcbiUxMHMgJTEwcyAlMTBzXG4iLCAiUHJvdG9jb2wiLCAiTXNnVHlwZSIsICJUaW1lIik7Ci0gICAgZm9yKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0gICAgewotICAgICAgICBwcmludGsoIiUxMHMgJTEwZCAlMTBsdVxuIiwgCi0gICAgICAgICAgICBwcm90b19zdHJbcGt0X2luZm8tPmluZm9baV0ucHJvdG9fdHlwZV0sIAotICAgICAgICAgICAgcGt0X2luZm8tPmluZm9baV0ubXNnX3R5cGUsIAotICAgICAgICAgICAgcGt0X2luZm8tPmluZm9baV0udGltZSk7Ci0gICAgfQotfQotRVhQT1JUX1NZTUJPTChwcmludF9jaGVja19wa3RfaW5mbyk7Ci0KLS8qvOyy4sr9vt2w/MrHt/HKx9a4tqjA4NDNtcSw/LKivMfCvMqxvOQqLwotLypwa3RfaW5mb7e1u9i94s72tcTQrdLpz+C52MTayN0qLwotaW50IGNoZWNrX3BhY2tldF90eXBlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBwa3RfaW5mbyAqcGt0X2luZm8pCi17Ci0gICAgc3RydWN0IGlwaGRyICppcF9oZHIgPSBOVUxMOwotICAgIHN0cnVjdCBpY21waGRyICppY21waGRyID0gTlVMTDsKLSAgICBzdHJ1Y3QgdWRwaGRyICp1ZHBfaGRyID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXJwaGRyICphcnBfaGRyID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhX3B0ciA9IE5VTEw7Ci0gICAgdW5zaWduZWQgY2hhciAqb3B0X3B0ciA9IE5VTEw7Ci0gICAgdW5zaWduZWQgc2hvcnQgZGF0YV9sZW4gPSAwOwotICAgIHVuc2lnbmVkIHNob3J0IHByb3RvY29sID0gMDsKLQotICAgIGlmKDAgPT0gY2hlY2tfcGt0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG1lbXNldChwa3RfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBwa3RfaW5mbykpOwotCi0gICAgLyrM+Ln9TUFDzbejrLW9QVJQL0lQVjQqLwotICAgIGRhdGFfcHRyID0gc2tpcF9tYWNfaGVhZGVyKHNrYiwgJnByb3RvY29sKTsKLSAgICBpZihOVUxMID09IGRhdGFfcHRyKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmKEVUSF9QX0FSUCA9PSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIGlmKHRlc3RfYml0KFBLVF9UWVBFX0FSUF9CSVQsICZjaGVja19wa3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcnBfaGRyID0gKHN0cnVjdCBhcnBoZHIgKilkYXRhX3B0cjsKLSAgICAgICAgICAgIHBrdF9pbmZvLT5wcm90b190eXBlID0gUFJPVE9fVFlQRV9BUlA7Ci0gICAgICAgICAgICBwa3RfaW5mby0+bXNnX3R5cGUgICA9IG50b2hzKGFycF9oZHItPmFyX29wKTsKLSAgICAgICAgICAgIHBrdF9pbmZvLT50aW1lICAgICAgID0gamlmZmllczsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoRVRIX1BfSVAgPT0gcHJvdG9jb2wpCi0gICAgeyAgIAotICAgICAgICBpcF9oZHIgPSAoc3RydWN0IGlwaGRyICopZGF0YV9wdHI7Ci0KLSAgICAgICAgLyq21NPat9bGrLD8o6zWu8q2sfDK18asKi8KLSAgICAgICAgaWYobnRvaHMoaXBfaGRyLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YV9sZW4gPSBudG9ocyhpcF9oZHItPnRvdF9sZW4pOwotCi0gICAgICAgIHN3aXRjaChpcF9oZHItPnByb3RvY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIElQUFJPVE9fVURQOgotICAgICAgICAgICAgICAgIHVkcF9oZHIgPSAoc3RydWN0IHVkcGhkciAqKSgodW5zaWduZWQgY2hhciAqKWlwX2hkciArIGlwX2hkci0+aWhsICogNCk7Ci0gICAgICAgICAgICAgICAgaWYodGVzdF9iaXQoUEtUX1RZUEVfREhDUF9CSVQsICZjaGVja19wa3QpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoKERIQ1BfQ0xJRU5UX1BPUlQgPT0gbnRvaHModWRwX2hkci0+c291cmNlKSAmJiBESENQX1NFUlZFUl9QT1JUID09IG50b2hzKHVkcF9oZHItPmRlc3QpKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgICAgIChESENQX0NMSUVOVF9QT1JUID09IG50b2hzKHVkcF9oZHItPmRlc3QpICYmIERIQ1BfU0VSVkVSX1BPUlQgPT0gbnRvaHModWRwX2hkci0+c291cmNlKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qzPi5/VVEUM23Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcHRyID0gKHVuc2lnbmVkIGNoYXIgKil1ZHBfaGRyICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qzPi5/URIQ1C5zLaozbcqLwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wdHIgKz0gMjM2OwotICAgICAgICAgICAgICAgICAgICAgICAgLyrM+Ln9bWFnaWMgY29va2llcyovCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3B0ciArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9sZW4gPSBkYXRhX2xlbiAtIGlwX2hkci0+aWhsICogNCAtIDggLSAyMzYgLSA0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKsihREhDULXEbWVzc2FnZSB0eXBlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9wdHIgPSBkaGNwX29wdGlvbl9nZXQoZGF0YV9wdHIsIGRhdGFfbGVuLCBESENQX01TR19UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9wdF9wdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2luZm8tPm1zZ190eXBlID0gb3B0X3B0clswXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2luZm8tPnByb3RvX3R5cGUgPSBQUk9UT19UWVBFX0RIQ1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwa3RfaW5mby0+dGltZSA9IGppZmZpZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSVBQUk9UT19JQ01QOgotICAgICAgICAgICAgICAgIGljbXBoZHIgPSAoc3RydWN0IGljbXBoZHIgKikoKHVuc2lnbmVkIGNoYXIgKilpcF9oZHIgKyBpcF9oZHItPmlobCAqIDQpOwotICAgICAgICAgICAgICAgIGlmKHRlc3RfYml0KFBLVF9UWVBFX1BJTkdfQklULCAmY2hlY2tfcGt0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKElDTVBfRUNIT1JFUExZID09IGljbXBoZHItPnR5cGUgfHwgSUNNUF9FQ0hPID09IGljbXBoZHItPnR5cGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9pbmZvLT5wcm90b190eXBlID0gUFJPVE9fVFlQRV9QSU5HOwotICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2luZm8tPm1zZ190eXBlICAgPSBpY21waGRyLT50eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2luZm8tPnRpbWUgICAgICAgPSBqaWZmaWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNoZWNrX3BhY2tldF90eXBlKTsKLQotCi0jaWZkZWYgQ09ORklHX05FVENUTAotCi12b2lkIG5ldF9wcmludF9wYWNrZXQodW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgaW50IGZsYWcpCi17Ci0gICAgaW50IGkgPSAwOwotCi0gICAgaWYoc2V0X3ByaW50X3BrdCAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0gICAgewotICAgICAgICBpZigwID09IGZsYWcpCi0gICAgICAgICAgICBwcmludGsoIlxucmVjdiBwYWNrZXQ6XG4iKTsKLSAgICAgICAgZWxzZSBpZigxID09IGZsYWcpCi0gICAgICAgICAgICBwcmludGsoIlxuc2VuZCBwYWNrZXQ6XG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRrKCJcbnByaW50IHBhY2tldDpcbiIpOwotCi0gICAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihpICUgMTYgPT0gMCkKLSAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgICAgICBwcmludGsoIiUyeCAiLCBkYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi12b2lkIHRyYWNrX25ldGxpbmsoc3RydWN0IHNrX2J1ZmYgKnNrYix1MzIgZ3JvdXApCi17Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7CQotCi0JbmxoID0gKHN0cnVjdCBubG1zZ2hkciopKHNrYi0+ZGF0YSk7CQotCW5ldF9ydW5fdHJhY2soUFJUX1JUTkxfU0VORCwicnRuZXRsaW5rX3NlbmQsbXNnX3R5cGUgPSVkO2dyb3VwID0gJWQiLG5saC0+bmxtc2dfdHlwZSxncm91cCk7Ci19Ci0KLQotLyq9q01BQ7XY1re6zW5ldF9kZXZpY2W12Na3vfjQ0LHIvc8KLSAgs/bP1rXEs6G+sKO6Ci0gIDEuyv2+3bvYu7cKLSAgMi7K/b7dzajRttX9s6OjrMG9uPZDUEXT0M/gzay1xE1BQ7XY1rcKLSAqLwotdm9pZCBjaGVja19tYWNhZGRyX29ubHkodW5zaWduZWQgY2hhciAqaGEsIHVuc2lnbmVkIGNoYXIgaGFfbGVuKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgY2hhciBhZGRyX2xlbiA9IDA7Ci0JdW5zaWduZWQgY2hhciBhZGRyW0VUSF9BTEVOXSA9IHswfTsKLQkKLQlpZigwID09IGFkZHJfY2hlY2spCi0JewotCQlyZXR1cm47Ci0JfQotCQotCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7Ci0KLQlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpCi0JewotCQlpZihkZXYtPmFkZHJfbGVuICE9IGhhX2xlbikKLQkJewotCQkJLy/Q3rjE1K3S8qO6xKzIz3NpdDC1xGFkZHJfbGVuPTTH0mRldl9hZGRyxKzIz86qyKswo6y1scbky/vJ6LG4bWFjtdjWt1swOjNd0rLIq86qMMqxvs274bbP0dTLwLv6oaMKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8vYWRkcl9sZW4gPSBkZXYtPmFkZHJfbGVuID4gaGFfbGVuID8gaGFfbGVuIDogZGV2LT5hZGRyX2xlbjsKLQkJYWRkcl9sZW4gPSBoYV9sZW47Ci0JCWlmKChhZGRyX2xlbiA+IDApICYmICFtZW1jbXAoZGV2LT5kZXZfYWRkciwgaGEsIGFkZHJfbGVuKSkKLQkJewotCQkJYWRkcl9sZW4gPSBhZGRyX2xlbiA+IEVUSF9BTEVOID8gRVRIX0FMRU4gOiBhZGRyX2xlbjsKLQkJCW1lbWNweShhZGRyLCBoYSwgYWRkcl9sZW4pOwotCQkJCi0JCQlwYW5pYygiY2hlY2tfbWFjYWRkcl9vbmx5OiBtYWMgYWRkcmVzcyBvZiBwYyBpcyBzYW1lIGFzIHRoZSBkZXZpY2UsIGRldiBuYW1lOiAlcywgbWFjICV4OiV4OiV4OiV4OiV4OiV4XG4iLCAKLQkJCQlkZXYtPm5hbWUsIGFkZHJbMF0sIGFkZHJbMV0sIGFkZHJbMl0sIGFkZHJbM10sIGFkZHJbNF0sIGFkZHJbNV0pOwkJCi0JCQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlyZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Ci0KLQlyZXR1cm47Ci19Ci0KLQotdm9pZCBza2JpbmZvX2FkZCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBza2JpbmZvX3R5cGUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlza2JpbmZvX2RiZ1tza2JpbmZvX3R5cGVdICsrOwotLyoKLQlpZihza2JfbWF4X3BhbmljICYmIHNrYmluZm9fdHlwZSA9PSBTS0JfVFlQRV9BTEwpCi0JewotCQkvL7TLtKbOtNPDc3BpbmxvY2uxo7uko6zSu7WpyrnTw7jDuabE3KOs0OjSqtPDy/ixo7ukCi0JCWlmKHNrYmluZm9fZGJnW1NLQl9UWVBFX0FMTF0gPiBza2JfbWF4X3BhbmljKQotCQkJcGFuaWMoInRvbyBtdWNoIHNrYiBpcyBhbGxvY2VkLHBsZWFzdyBjaGVjayBkYXRhX2xlYWsgIik7Ci0JfQotKi8KLQlpZihza2JpbmZvX3R5cGUgPT0gU0tCX1RZUEVfREFUQSkKLQl7Ci0JCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKWFkZHI7Ci0gICAgICAgIC8vaWYoc2tiLT5pc0V4dGVybiA9PSAwKQotCQkvLyAgICBza2JpbmZvX2RiZ1tTS0JfREFUQV9CWVRFU10gKz0ga3NpemUoc2tiLT5oZWFkKTsKLSAgICAgICAgLy9lbHNlCi0gICAgICAgICAgICBza2JpbmZvX2RiZ1tTS0JfREFUQV9CWVRFU10gKz0gc2tiLT5kYXRhIC0gc2tiLT5oZWFkICsgc2tiLT5sZW47Ci0JfQotCWlmKHNrYmluZm9fdHlwZT09KHNrYl9pbmZvX3RyYWNrJjBYN0YpKSAKLQl7IAotCQlwcmludGsoIm5ldCByZXNvdXJjZSBtb25pdG9yISEhIik7ICAgCi0JCWR1bXBfc3RhY2soKTsgCi0JCWlmKHNrYl9pbmZvX3RyYWNrJjBYODApCi0JCQlwYW5pYygibmV0IHRlYW0gZGJnIHBhbmljICEhISIpOwotCX0gCi0JCi19Ci0KLQotdm9pZCBza2JpbmZvX2RlbCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBza2JpbmZvX3R5cGUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlza2JpbmZvX2RiZ1tza2JpbmZvX3R5cGVdIC0tOwotCQotCWlmKHNrYmluZm9fdHlwZSA9PSBTS0JfVFlQRV9EQVRBKQotCXsKLQkJc2tiID0gKHN0cnVjdCBza19idWZmICopYWRkcjsKLSAgICAgICAgLy9pZihza2ItPmlzRXh0ZXJuID09IDApCi0JCS8vICAgIHNrYmluZm9fZGJnW1NLQl9EQVRBX0JZVEVTXSAtPSBrc2l6ZShza2ItPmhlYWQpOwotICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIHNrYmluZm9fZGJnW1NLQl9EQVRBX0JZVEVTXSAtPSBza2ItPmRhdGEgLSBza2ItPmhlYWQgKyBza2ItPmxlbjsKLQl9Ci0KLX0KLQotdm9pZCBuZXRydW5pbmZvX2FkZCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBpbmZvX3R5cGUpCi17Ci0JbmV0cnVuaW5mb19kYmdbaW5mb190eXBlXSArKzsJCi0JaWYoaW5mb190eXBlPT0obmV0X2luZm9fdHJhY2smMFg3RikpIAotCXsgCi0JCXByaW50aygibmV0IHJlc291cmNlIG1vbml0b3IhISEiKTsgICAKLQkJZHVtcF9zdGFjaygpOyAKLQkJaWYobmV0X2luZm9fdHJhY2smMFg4MCkKLQkJCXBhbmljKCJuZXQgdGVhbSBkYmcgcGFuaWMgISEhIik7Ci0JfSAKLX0KLQotdm9pZCBuZXRydW5pbmZvX2RlbCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBpbmZvX3R5cGUpCi17Ci0JbmV0cnVuaW5mb19kYmdbaW5mb190eXBlXSAtLTsKLX0KLXN0YXRpYyBpbnQgZmlsdGVyKHZvaWQgKnN0YXJ0MSwgdm9pZCAqc3RhcnQyLCB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIGludCBpID0gMTAwLCByZXQgPSAtMTsKLSAgICBpbnQgKnAgPSBzdGFydDEsICpxID0gc3RhcnQyOwotCi0gICAgZG8gewotICAgICAgICBpZiAoIW1lbWNtcChwLCBxLCBsZW4pKSB7Ci0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKytwOwotICAgIH13aGlsZShpLS0pOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLy+4w7qvyv3Tw9PaxdC2z3NrYi0+bmV0d29ya19oZWFkZXLT0NCn0NSjrLe1u9i78cih09DQp7XEaXDNtwotdW5zaWduZWQgY2hhciAqIGNoZWNrX3NrYl9mb3JfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKm1hcmspCi17Ci0gICAgdW5zaWduZWQgY2hhciAqIG1hY19oZWFkLCAqbmV0X2hlYWQsICp0c3BfaGVhZDsKLSAgICAvL2RyaS0+bmV0IDA7IG5ldC0+ZHJpIDE7Ci0gICAgbWFjX2hlYWQgPSBza2JfbWFjX2hlYWQoc2tiKTsKLSAgICBuZXRfaGVhZCA9IHNrYl9uZXR3b3JrX2hlYWQoc2tiKTsKLSAgICB0c3BfaGVhZCA9IHNrYl90cmFuc3BvcnRfaGVhZChza2IpOwotICAgICptYXJrID0gMDsKLSAgICBpZiAoIXNrYi0+ZGV2KXsKLSAgIC8vICAgICBwcmludGsoInNrYi0+ZGV2ID0gTlVMTCBlcnIgaW4gJXMuXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoc2tiLT5kYXRhID09IE5VTEwpewotICAgICAgICBwcmludGsoInNrYi0+ZGF0YSA9IE5VTEwgZXJyIGluICVzLlxuIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHNrYi0+ZGF0YSA9PSBtYWNfaGVhZCl7Ci0gICAgICAgIGlmKG5ldF9oZWFkICYmIG5ldF9oZWFkIDwgKG1hY19oZWFkICsgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbiApKXsKLSAgICAgICAgICAgICptYXJrID0gLTI7Ci0gICAgICAgICAgICByZXR1cm4gbWFjX2hlYWQgKyBza2ItPmRldi0+aGFyZF9oZWFkZXJfbGVuOwotICAgICAgICB9Ci0gICAgICAgICptYXJrID0gMjsKLSAgICAgICAgIHJldHVybiBtYWNfaGVhZCArIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47ICAKLSAgICB9Ci0gICAgZWxzZSBpZihza2ItPmRhdGEgPT0gbmV0X2hlYWQpewotICAgICAgICBpZihtYWNfaGVhZCAmJiBuZXRfaGVhZCA8IChtYWNfaGVhZCArIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKSl7Ci0gICAgICAgICAgICAqbWFyayA9IC0yMzsKLSAgICAgICAgICAgIHJldHVybiBtYWNfaGVhZCArIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYodHNwX2hlYWQgJiYgbmV0X2hlYWQgPCAodHNwX2hlYWQgLSAyMCkpewotICAgICAgICAgICAgKm1hcmsgPSAtMzsKLSAgICAgICAgICAgIHJldHVybiBuZXRfaGVhZDsKLSAgICAgICAgfQotICAgICAgICAqbWFyayA9IDM7Ci0gICAgICAgIHJldHVybiBuZXRfaGVhZDsKLSAgICB9Ci0gICAgZWxzZSBpZihza2ItPmRhdGEgPT0gdHNwX2hlYWQgKXsKLSAgICAgICAgaWYoKCFuZXRfaGVhZCkgfHwgKG5ldF9oZWFkICYmIG5ldF9oZWFkIDwgKHRzcF9oZWFkIC0gMjApKSl7Ci0gICAgICAgICAgICAqbWFyayA9IC00OwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgKm1hcmsgPSA0OwotICAgICAgICByZXR1cm4gbmV0X2hlYWQ7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgIC8vICAgcHJpbnRrKCJ1bmV4cGVjdGVkIGVyciBpbiAlc1xuIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgICAgIAotfQotCi1leHRlcm4gc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZV9pbmZvOwotZXh0ZXJuIGludCBnZXRjb25uX3R5cGU7Ci0KLS8v1Npza2JfcmVsZWFzZV9kYXRhyrG9+NDQxNrI3bXE19a3+7SuxqXF5KOssqK1vLP21bu57LyjCi12b2lkIGR1bXBfbmV0X3N0YWNrKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0gICAgaWYoZ2V0Y29ubl90eXBlICE9IDggJiYgZ2V0Y29ubl90eXBlICE9IDEwKQotICAgICAgICByZXR1cm47Ci0gICAgaW50IG1hcmsgPSAwOwotICAgIHN0cnVjdCBpcGhkciAqaXBodjQ7Ci0gICAgc3RydWN0IGlwdjZoZHIgKmlwaHY2OwotICAgIHVuc2lnbmVkIGNoYXIgKnRzcF9zdGFydCA9IE5VTEw7Ci0gICAgdW5zaWduZWQgY2hhciAqaXBoID0gY2hlY2tfc2tiX2Zvcl9kdW1wKHNrYiwgJm1hcmspOwotICAgIAotICAgIGlmKGdldGNvbm5fdHlwZSA9PSAxMCAmJiBpcGgpewotICAgICAgICBpZiAoc2tiLT5ub3dfbG9jYXRpb24gJiBGQVNUTkFUX1NVQ0MpewotICAgICAgICAgICAgcHJpbnRrKCJza2ItPmxlbiA9ICVkIG5vd19sb2NhdGlvbiA9ICVkXG4iLCBza2ItPmxlbiwgc2tiLT5ub3dfbG9jYXRpb24pOwotICAgICAgICAgICAgc3RydWN0IHRjcGhkciAqdGggPSAoc3RydWN0IHRjcGhkciAqKShpcGggKyAyMCk7Ci0gICAgICAgICAgICBwcmludGsoInRoLT5zZXE9JWx1LCB0aC0+c3BvcnQ9JWxkLCB0aC0+ZHBvcnQ9JWxkXG4iLCBodG9ubCh0aC0+c2VxKSwgaHRvbnModGgtPnNvdXJjZSksIGh0b25zKHRoLT5kZXN0KSk7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmKGlwaCl7Ci0gICAgICAgIGlmKChpcGhbMF0gJiAweGYwKSA9PSAweDQwKXsKLSAgICAgICAgICAgIGlwaHY0ID0gKHN0cnVjdCBpcGhkciopaXBoOwotICAgICAgICAgICAgaWYodHVwbGVfaW5mby5kc3QucHJvdG9udW0gJiYgdHVwbGVfaW5mby5kc3QucHJvdG9udW0gIT0gaXBodjQtPnByb3RvY29sKXsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLmRzdC51My5pcCAmJiBtZW1jbXAoJnR1cGxlX2luZm8uZHN0LnUzLmlwLCAmaXBodjQtPmRhZGRyLCA0KSAhPSAwKXsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLnNyYy51My5pcCAmJiBtZW1jbXAoJnR1cGxlX2luZm8uc3JjLnUzLmlwLCAmaXBodjQtPnNhZGRyLCA0KSAhPSAwKXsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0c3Bfc3RhcnQgPSAodW5zaWduZWQgY2hhciopaXBodjQgKyAoaXBodjQtPmlobCA8PCAyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKChpcGhbMF0gJiAweGYwKSA9PSAweDYwKXsKLSAgICAgICAgICAgIGlwaHY2ID0gKHN0cnVjdCBpcHY2aGRyKilpcGg7Ci0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLmRzdC5wcm90b251bSAmJiB0dXBsZV9pbmZvLmRzdC5wcm90b251bSAhPSBpcGh2Ni0+bmV4dGhkcil7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYodHVwbGVfaW5mby5kc3QudTMuaXAgJiYgbWVtY21wKCZ0dXBsZV9pbmZvLmRzdC51My5pbjYsICZpcGh2Ni0+ZGFkZHIsIDE2KSAhPSAwKXsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLnNyYy51My5pcCAmJiBtZW1jbXAoJnR1cGxlX2luZm8uc3JjLnUzLmluNiwgJmlwaHY2LT5zYWRkciwgMTYpICE9IDApewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRzcF9zdGFydCA9ICh1bnNpZ25lZCBjaGFyKilpcGh2NiArIDQwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vyOe5+8rNt8XKsda709C0q8rkzbfDu9PQzfjC5823o6zWu7HIvc/T0NCncG9ydAotICAgIGlmKG1hcmsgPT0gLTQpewotICAgICAgICB0c3Bfc3RhcnQgPSBza2ItPmRhdGE7IAotICAgIH0KLSAgICBpZih0c3Bfc3RhcnQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmKHR1cGxlX2luZm8uc3JjLnUuYWxsICYmIG1lbWNtcCgmdHVwbGVfaW5mby5zcmMudS5hbGwsIHRzcF9zdGFydCwgMikgIT0gMCl7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYodHVwbGVfaW5mby5kc3QudS5hbGwgJiYgbWVtY21wKCZ0dXBsZV9pbmZvLmRzdC51LmFsbCwgdHNwX3N0YXJ0ICsgMiwgMikgIT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHByaW50aygiZnJlZSBza2IgbWF0Y2ggbWFyayA9ICVkOlxuIiwgbWFyayk7Ci0gICAgaWYodHVwbGVfaW5mby5kc3QucHJvdG9udW0gJiYgbWFyayAhPSAtNCkKLSAgICAgICAgcHJpbnRrKCJwcm90b251bSA9ICVkICIsdHVwbGVfaW5mby5kc3QucHJvdG9udW0pOwotICAgIGlmKHR1cGxlX2luZm8uc3JjLnUzLmlwICYmIG1hcmsgIT0gLTQpewotICAgICAgICBpZihpcGggJiYgKGlwaFswXSAmIDB4ZjApID09IDB4NDApewotICAgICAgICAgICAgcHJpbnRrKCJzaXA6ICUwOHggIiwgbnRvaGwodHVwbGVfaW5mby5zcmMudTMuaXApKTsKLSAgICAgICAgfWVsc2UgaWYoaXBoICYmIChpcGhbMF0gJiAweGYwKSA9PSAweDYwKXsKLSAgICAgICAgICAgIHByaW50aygic2lwOiAleDoleDoleDoleDoleDoleDoleDoleCAiLCBudG9ocyh0dXBsZV9pbmZvLnNyYy51My5pbjYuczZfYWRkcjE2WzBdKSwgbnRvaHModHVwbGVfaW5mby5zcmMudTMuaW42LnM2X2FkZHIxNlsxXSksIG50b2hzKHR1cGxlX2luZm8uc3JjLnUzLmluNi5zNl9hZGRyMTZbMl0pLCBudG9ocyh0dXBsZV9pbmZvLnNyYy51My5pbjYuczZfYWRkcjE2WzNdKSwgCi0gICAgICAgICAgICAgICAgICAgIG50b2hzKHR1cGxlX2luZm8uc3JjLnUzLmluNi5zNl9hZGRyMTZbNF0pLCBudG9ocyh0dXBsZV9pbmZvLnNyYy51My5pbjYuczZfYWRkcjE2WzVdKSwgbnRvaHModHVwbGVfaW5mby5zcmMudTMuaW42LnM2X2FkZHIxNls2XSksIG50b2hzKHR1cGxlX2luZm8uc3JjLnUzLmluNi5zNl9hZGRyMTZbN10pKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZih0dXBsZV9pbmZvLnNyYy51LmFsbCl7Ci0gICAgICAgIHByaW50aygic3BvcnQgOiAlZCAiLCBudG9ocyh0dXBsZV9pbmZvLnNyYy51LmFsbCkpOwotICAgIH0KLSAgICBpZih0dXBsZV9pbmZvLmRzdC51My5pcCAmJiBtYXJrICE9IC00KXsKLSAgICAgICAgaWYoaXBoICYmIChpcGhbMF0gJiAweGYwKSA9PSAweDQwKXsKLSAgICAgICAgICAgIHByaW50aygiJWRpcDogJTA4eCAiLCBudG9obCh0dXBsZV9pbmZvLmRzdC51My5pcCkpOwotICAgICAgICB9ZWxzZSBpZihpcGggJiYgKGlwaFswXSAmIDB4ZjApID09IDB4NjApewotICAgICAgICAgICAgcHJpbnRrKCJkaXA6ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4ICIsIG50b2hzKHR1cGxlX2luZm8uZHN0LnUzLmluNi5zNl9hZGRyMTZbMF0pLCBudG9ocyh0dXBsZV9pbmZvLmRzdC51My5pbjYuczZfYWRkcjE2WzFdKSwgbnRvaHModHVwbGVfaW5mby5kc3QudTMuaW42LnM2X2FkZHIxNlsyXSksIG50b2hzKHR1cGxlX2luZm8uZHN0LnUzLmluNi5zNl9hZGRyMTZbM10pLCAKLSAgICAgICAgICAgICAgICAgICAgbnRvaHModHVwbGVfaW5mby5kc3QudTMuaW42LnM2X2FkZHIxNls0XSksIG50b2hzKHR1cGxlX2luZm8uZHN0LnUzLmluNi5zNl9hZGRyMTZbNV0pLCBudG9ocyh0dXBsZV9pbmZvLmRzdC51My5pbjYuczZfYWRkcjE2WzZdKSwgbnRvaHModHVwbGVfaW5mby5kc3QudTMuaW42LnM2X2FkZHIxNls3XSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmKHR1cGxlX2luZm8uZHN0LnUuYWxsKSB7Ci0gICAgICAgIHByaW50aygiZHBvcnQgOiAlZCAiLCBudG9ocyh0dXBsZV9pbmZvLmRzdC51LmFsbCkpOwotICAgIH0KLSAgICBwcmludGsoIlxuIik7Ci0gICAvLyBpZiAoc2tiX2R1bXBfbGVuKSAKLSAgICAgIC8vICBpZighZmlsdGVyKChza2ItPmhlYWQgKyBvZmZzZXQpLCBza2JfZHVtcF9zdHIsIHNrYl9kdW1wX2xlbikpCi1vdXQ6Ci0gICAgZHVtcF9zdGFjaygpOwotfQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyrS1M/CzqrN+MLn1+nQwtT2tcS907/ao6zTydPa8e66z8e/o6yyu8TctsDBorPJ1LTOxLz+o6y1q9Do16LKzcfls/4qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1leHRlcm4gaW50IHNldF90Y3BkdW1wOwotZXh0ZXJuIGNoYXIgYnJfbmFtZVtdOwotCi0vL9Do0qpza2ItPm1hY19oZWFkZXLS0b6tuLPWtQotdW5zaWduZWQgaW50IGdldF9uZXR3b3JrX2hlYWRfbGVuKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0jaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCi0gICAgdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPmhlYWQgKyBza2ItPm1hY19oZWFkZXIgKyBFVEhfSExFTjsKLSNlbHNlCi0gICAgdW5zaWduZWQgY2hhciAqYnVmID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPm1hY19oZWFkZXIgKyBFVEhfSExFTjsKLSNlbmRpZgotCi0gICAgaWYgKCgoKHVuc2lnbmVkKWJ1ZlswXSkgJiAweEYwKSA9PSAweDQwKQotICAgICAgICByZXR1cm4gMjA7IC8vaXB2NCBpcM23s6S2yDIwCi0gICAgICAgIAotICAgIGlmICgoKCh1bnNpZ25lZClidWZbMF0pICYgMHhGMCkgPT0gMHg2MCkKLSAgICAgICAgcmV0dXJuIDQwOyAvL2lwdjYgaXDNt7Oktsg0MAotICAgICAgICAKLSAgICByZXR1cm4gMjA7IC8vxKzIz2lwdjS0psDtCi19Ci0KLS8vy+/IqsztvNOjrLLOv7xfX25ldGlmX3JlY2VpdmVfc2tio6zTw9Pa16XIob3TytW3vc/ytcS2qNbGsajOxKOsyOdmYXN0bmF0tcjI67/asajOxKOssLTV1XRjcGR1bXDV/bOjt73Kvcq508O8tL/Jo6y1q7vh07DP7NDUxNyjrMv50tTQ6NKq08Nwcm9jseTBv7/Y1sYKLXZvaWQgdGNwZHVtcGluX3NxKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgKmRhdGFfcHJpdjsKLSAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwotICAgIF9fYmUxNiB0eXBlOwotICAgIHVuc2lnbmVkIGludCBsZW5fcHJpdjsKLSAgICBpbnQgZGV2X2ZsYWcgPSAwOwotCi0gICAgaWYgKCEoc2V0X3RjcGR1bXAgJiAxKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChsaXN0X2VtcHR5KCZwdHlwZV9hbGwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vsaO05rWxx7CxqM7EtcTK/b7d1qHNt9DFz6KjrNelsPy94cr4uvO71ri0Ci0gICAgZGF0YV9wcml2ID0gc2tiLT5kYXRhOwotICAgIGxlbl9wcml2ID0gc2tiLT5sZW47Ci0gICAgCi0gICAgLy+9q7Oktsi6zWRhdGHWuM/yTUFDzbejrLj5vt21scewx+m/9ravzKy199X7Ci0gICAgaWYgKHNrYi0+bWFjX2hlYWRlciA9PSAwIHx8IHNrYi0+bWFjX2hlYWRlciA9PSB+MFUpCi0gICAgewotICAgICAgICBza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotICAgICAgICBza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT5tYWNfaGVhZGVyICsgRVRIX0hMRU47Ci0gICAgICAgIHNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBnZXRfbmV0d29ya19oZWFkX2xlbihza2IpOwotICAgIH0KLSAgICBlbHNlIGlmIChza2ItPm5ldHdvcmtfaGVhZGVyID09IDAgfHwgc2tiLT5uZXR3b3JrX2hlYWRlciA9PSB+MFUpCi0gICAgewotICAgICAgICBza2ItPm5ldHdvcmtfaGVhZGVyID0gc2tiLT5tYWNfaGVhZGVyICsgRVRIX0hMRU47Ci0gICAgICAgIHNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBnZXRfbmV0d29ya19oZWFkX2xlbihza2IpOwotICAgICAgICBza2JfcmVzZXRfZGF0YV9ieW1hY2hkKHNrYik7Ci0gICAgICAgIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotICAgIH0KLSAgICBlbHNlIGlmIChza2ItPnRyYW5zcG9ydF9oZWFkZXIgPT0gMCB8fCBza2ItPnRyYW5zcG9ydF9oZWFkZXIgPT0gfjBVKQotICAgIHsKLSAgICAgICAgc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwotICAgICAgICBza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgZ2V0X25ldHdvcmtfaGVhZF9sZW4oc2tiKTsKLSAgICAgICAgc2tiX3Jlc2V0X2RhdGFfYnltYWNoZChza2IpOwotICAgICAgICBza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLSAgICB9Ci0gICAgCi0gICAgLy9kZXbOqr/VyrGjrM6qwcuxo9aky/nT0LXjtrzE3Neltb2xqKOsvauw0WRldsnozqpwdHlwZS0+ZGV2Ci0gICAgaWYgKHNrYi0+ZGV2ID09IE5VTEwpCi0gICAgewotICAgICAgICBkZXZfZmxhZyA9IDE7Ci0gICAgfQotCi0gICAgcmN1X3JlYWRfbG9jaygpOwotICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCAmcHR5cGVfYWxsLCBsaXN0KSB7Ci0gICAgICAgIC8vyOu/2nNrYsrHzerV+7XETUFD1qGjrLK70OjSqr340NDIzrrOxqvSxrX31fsKLSAgICAgICAgaWYgKCghcHR5cGUtPmRldiB8fCAhc2tiLT5kZXYgfHwgcHR5cGUtPmRldiA9PSBza2ItPmRldikpICAvLyAmJiAocHR5cGUtPmZ1bmMgPT0gcGFja2V0X3JjdikKLSAgICAgICAgewotICAgICAgICAgICAgLy9wYWNrZXRfcmN2xNqyv9Kqx/Nza2ItPmRldrHY0Ouyu86qv9WjrMv50tS0y7SmvfjQ0MHL0KG8vMfJo6y1q7/JxNzT0Lbg0+Cw/LG716W1vQotICAgICAgICAgICAgaWYoc2tiLT5kZXYgPT0gTlVMTCAmJiBwdHlwZS0+ZGV2KQotICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gcHR5cGUtPmRldjsKLSAgICAgICAgICAgIGVsc2UgaWYoc2tiLT5kZXYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBza2ItPmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgYnJfbmFtZSk7Ci0KLSAgICAgICAgICAgIGF0b21pY19pbmMoJnNrYi0+dXNlcnMpOwotICAgICAgICAgICAgLy90cmFja19hZGQoc2tiLCAwLCBVU0VSX0lORk8sIDApOwotICAgICAgICAgICAgcHR5cGUtPmZ1bmMoc2tiLCBza2ItPmRldiwgcHR5cGUsIHNrYi0+ZGV2KTsKLSAgICAgICAgICAgIGlmKGRldl9mbGFnID09IDEpCi0gICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIHJjdV9yZWFkX3VubG9jaygpOwotCi0gICAgLy+71ri0c2tis/XKvNe0zKwKLSAgICBza2ItPmRhdGEgPSBkYXRhX3ByaXY7Ci0gICAgc2tiLT5sZW4gPSBsZW5fcHJpdjsKLSAgICBpZihkZXZfZmxhZyA9PSAxKQotICAgICAgICBza2ItPmRldiA9IE5VTEw7Ci19Ci0KLS8vy+/IqsztvNOjrLLOv7xkZXZfcXVldWVfeG1pdF9uaXSjrNPD09rXpciht6LLzbe9z/K1xLao1saxqM7Eo6zI52Zhc3RuYXS1yLP2v9qxqM7Eo6ywtNXVdGNwZHVtcNX9s6O3vcq9yrnTw7y0v8mjrLWru+HTsM/s0NTE3KOsy/nS1NDo0qrTw3Byb2Ox5MG/v9jWxgotdm9pZCB0Y3BkdW1wb3V0X3NxKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZTsKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7Ci0gICAgaW50IGRldl9mbGFnID0gMDsKLSAgICBza19idWZmX2RhdGFfdCAgICAgICAgdHJhbnNwb3J0X2hlYWRlcjsKLSAgICBza19idWZmX2RhdGFfdCAgICAgICAgbmV0d29ya19oZWFkZXI7Ci0gICAgc2tfYnVmZl9kYXRhX3QgICAgICAgIG1hY19oZWFkZXI7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgKmRhdGFfcHJpdjsKLSAgICB1bnNpZ25lZCBpbnQgbGVuX3ByaXY7Ci0gICAgCi0gICAgaWYgKCEoc2V0X3RjcGR1bXAgJiAyKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChsaXN0X2VtcHR5KCZwdHlwZV9hbGwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vsaO05rWxx7CxqM7EtcTK/b7d1qHNt9DFz6KjrNelsPy94cr4uvO71ri0Ci0gICAgZGF0YV9wcml2ID0gc2tiLT5kYXRhOwotICAgIGxlbl9wcml2ID0gc2tiLT5sZW47Ci0gICAgdHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+dHJhbnNwb3J0X2hlYWRlcjsKLSAgICBuZXR3b3JrX2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7Ci0gICAgbWFjX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlcjsKLQotICAgIGlmIChza2ItPm1hY19oZWFkZXIgPT0gMCB8fCBza2ItPm1hY19oZWFkZXIgPT0gfjBVKQotICAgIHsKLSAgICAgICAgc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLSAgICAgICAgc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwotICAgICAgICBza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgZ2V0X25ldHdvcmtfaGVhZF9sZW4oc2tiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2tiLT5uZXR3b3JrX2hlYWRlciA9PSAwIHx8IHNrYi0+bmV0d29ya19oZWFkZXIgPT0gfjBVKQotICAgIHsKLSAgICAgICAgc2tiLT5uZXR3b3JrX2hlYWRlciA9IHNrYi0+bWFjX2hlYWRlciArIEVUSF9ITEVOOwotICAgICAgICBza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyICsgZ2V0X25ldHdvcmtfaGVhZF9sZW4oc2tiKTsKLSAgICAgICAgc2tiX3Jlc2V0X2RhdGFfYnltYWNoZChza2IpOwotICAgICAgICBza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2tiLT50cmFuc3BvcnRfaGVhZGVyID09IDAgfHwgc2tiLT50cmFuc3BvcnRfaGVhZGVyID09IH4wVSkKLSAgICB7Ci0gICAgICAgIHNrYi0+dHJhbnNwb3J0X2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXIgKyBnZXRfbmV0d29ya19oZWFkX2xlbihza2IpOwotICAgICAgICBza2JfcmVzZXRfZGF0YV9ieW1hY2hkKHNrYik7Ci0gICAgICAgIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotICAgIH0KLQotICAgIC8vVENQsuPD5snQzrTAtLXDvLC4s9a1s/a/2mRldqOstMu0pse/0NC4s9a1zqpicjCjrMv50tTSqsfz16Wz9r/asajOxMqxo6zSqrK7z97WxmRldrLF0NCjrLfx1PLN4s34v9qxqM7E16Wyu7W9Ci0gICAgaWYoc2tiLT5kZXYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRldl9mbGFnID0gMTsKLSAgICB9Ci0gICAgCi0gICAgcmN1X3JlYWRfbG9jaygpOwotICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCAmcHR5cGVfYWxsLCBsaXN0KSB7Ci0gICAgICAgIC8vyPTU2lRDULvySVCy48Pmo6y0y8qxZGF0Yc601rjP8k1BQ823o6y1q9PJ09rO0sPHvfjQ0MHLxqvSxqOs1rjP8sHLTUFDzbejrMv50tTE3NelyKHN6tX7sajOxKOstatQUFBvRcDgsajOxKOszt63qNelyKsKLSAgICAgICAgaWYgKChwdHlwZS0+ZGV2ID09IHNrYi0+ZGV2IHx8ICFwdHlwZS0+ZGV2IHx8ICFza2ItPmRldikgJiYgKHB0eXBlLT5hZl9wYWNrZXRfcHJpdiAhPSBOVUxMKSAmJgotICAgICAgICAgIChzdHJ1Y3Qgc29jayAqKXB0eXBlLT5hZl9wYWNrZXRfcHJpdiAhPSBza2ItPnNrKSAvLyAmJiAocHR5cGUtPmZ1bmMgPT0gcGFja2V0X3JjdikKLSAgICAgICAgewotICAgICAgICAgICAgLy9wYWNrZXRfcmN2xNqyv9Kqx/Nza2ItPmRldrHY0Ouyu86qv9WjrMv50tS0y7SmvfjQ0MHL0KG8vMfJo6y1q7/JxNzT0Lbg0+Cw/LG716W1vQotICAgICAgICAgICAgaWYoc2tiLT5kZXYgPT0gTlVMTCAmJiBwdHlwZS0+ZGV2KQotICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gcHR5cGUtPmRldjsKLSAgICAgICAgICAgIGVsc2UgaWYoc2tiLT5kZXYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBza2ItPmRldiA9IF9fZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgYnJfbmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLSAgICAgICAgICAgIGlmICghc2tiMikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHB0eXBlLT5mdW5jKHNrYjIsIHNrYi0+ZGV2LCBwdHlwZSwgc2tiLT5kZXYpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGV2X2ZsYWcgPT0gMSkKLSAgICAgICAgICAgICAgICBza2ItPmRldiA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLSAgICAvL7vWuLRza2Kz9cq817TMrAotICAgIGlmKGRldl9mbGFnID09IDEpCi0gICAgICAgIHNrYi0+ZGV2ID0gTlVMTDsKLSAgICBza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSB0cmFuc3BvcnRfaGVhZGVyOwotICAgIHNrYi0+bmV0d29ya19oZWFkZXIgPSBuZXR3b3JrX2hlYWRlcjsKLSAgICBza2ItPm1hY19oZWFkZXIgPSBtYWNfaGVhZGVyOwotICAgIHNrYi0+ZGF0YSA9IGRhdGFfcHJpdjsKLSAgICBza2ItPmxlbiA9IGxlbl9wcml2OwotfQotCi0KLQotCi0vKrj5vt1kZXbGpcXksunV0sHavtOx7WFycF90YmzW0LXEwdq+073ateMqLwotdm9pZCBnZXRfbmVpZ2hfYnlkZXYoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfbmVpZ2hfaW5mbyAqbmVpZ2hfaW5mbykKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuOwotICAgIHVuc2lnbmVkIGludCBuZWlnaF9udW0gPSAwOwotICAgIHN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQ7Ci0KLSAgICBpZih0YmwtPmZhbWlseSAhPSBBRl9JTkVUICYmIHRibC0+ZmFtaWx5ICE9IEFGX0lORVQ2KQotICAgICAgICByZXR1cm47Ci0KLSAgICByY3VfcmVhZF9sb2NrX2JoKCk7Ci0gICAgbmh0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHRibC0+bmh0KTsKLQotICAgIGZvcihpID0gMDsgaSA8ICgxIDw8IG5odC0+aGFzaF9zaGlmdCk7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwotCi0gICAgICAgIGZvcihuZWlnaCA9IHJjdV9kZXJlZmVyZW5jZV9iaChuaHQtPmhhc2hfYnVja2V0c1tpXSk7IG5laWdoICE9IE5VTEw7IG5laWdoID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5laWdoLT5uZXh0KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobmVpZ2gtPmRldiA9PSBkZXYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuID0gdGJsLT5rZXlfbGVuID4gTUFYX0lQQUREUl9MRU4gPyBNQVhfSVBBRERSX0xFTiA6IHRibC0+a2V5X2xlbjsKLQotICAgICAgICAgICAgICAgIG1lbWNweShuZWlnaF9pbmZvLT5uZWlnaF9ub2RbbmVpZ2hfbnVtXS5pcF9hZGRyLCBuZWlnaC0+cHJpbWFyeV9rZXksIGxlbik7Ci0gICAgICAgICAgICAgICAgbmVpZ2hfaW5mby0+bmVpZ2hfbm9kW25laWdoX251bV0uaXBfbGVuID0gbGVuOwotICAgICAgICAgICAgICAgIG1lbWNweShuZWlnaF9pbmZvLT5uZWlnaF9ub2RbbmVpZ2hfbnVtXS5tYWNfYWRkciwgbmVpZ2gtPmhhLCBNQVhfTUFDQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIG5laWdoX251bSsrOwotICAgICAgICAgICAgICAgIGlmKG5laWdoX251bSA+PSAyMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLWVuZDoKLSAgICBuZWlnaF9pbmZvLT5udW0gPSBuZWlnaF9udW07Ci0KLSAgICByY3VfcmVhZF91bmxvY2tfYmgoKTsKLQotICAgIHJldHVybjsKLX0KLQotLyq4+b7d1La2y8HavtO1xE1BQ7XY1rfV0rW9YXJwX3RibNbQtcTB2r7TSVC12Na3tcjQxc+iKi8KLXZvaWQgZ2V0X25laWdoX2J5bWFjKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLG1hY19hZGRyICphZGRyLCBzdHJ1Y3QgbmVpZ2hfaW5mbyAqaW5mbykKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGVuOwotICAgIHN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQ7Ci0KLSAgICBpZih0YmwtPmZhbWlseSAhPSBBRl9JTkVUICYmIHRibC0+ZmFtaWx5ICE9IEFGX0lORVQ2KQotICAgICAgICByZXR1cm47Ci0KLSAgICBuaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgodGJsLT5uaHQpOwotCi0gICAgZm9yKGkgPSAwOyBpIDwgKDEgPDwgbmh0LT5oYXNoX3NoaWZ0KTsgaSsrKQotICAgIHsKLSAgICAgICAgc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7Ci0KLSAgICAgICAgZm9yKG5laWdoID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5odC0+aGFzaF9idWNrZXRzW2ldKTsgbmVpZ2ggIT0gTlVMTDsgbmVpZ2ggPSByY3VfZGVyZWZlcmVuY2VfYmgobmVpZ2gtPm5leHQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighY29tcGFyZV9ldGhlcl9hZGRyKG5laWdoLT5oYSxhZGRyLT5hZGRyKSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuID0gdGJsLT5rZXlfbGVuID4gTUFYX0lQQUREUl9MRU4gPyBNQVhfSVBBRERSX0xFTiA6IHRibC0+a2V5X2xlbjsKLQotICAgICAgICAgICAgICAgIG1lbWNweShpbmZvLT5pcF9hZGRyLCBuZWlnaC0+cHJpbWFyeV9rZXksIGxlbik7Ci0gICAgICAgICAgICAgICAgaW5mby0+aXBfbGVuID0gbGVuOwotICAgICAgICAgICAgICAgIG1lbWNweShpbmZvLT5tYWNfYWRkciwgbmVpZ2gtPmhhLCBNQVhfTUFDQUREUl9MRU4pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLX0KLQotLy+78cihxLMysuPHxbXjyeixuLXEwdq+08HQse3Qxc+io6zPyLj5vt2z9r/aZGV21dK1vcv509C1xNS2s8zB2r7TTUFDtdjWt6Os1Nm4+b7dTUFDtdjWt9XStb1hcnBfdGJs1tC1xMHavtNJULXY1re1yNDFz6IKLXZvaWQgZ2V0bmVpZ2hfb2ZkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRzdF9kZXYsc3RydWN0IGRldl9uZWlnaF9pbmZvICAqbmVpZ2hfaW5mbykKLXsKLQlpbnQgaTsKLQlpbnQgbmVpZ2hfbnVtID0gMDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqYnJfZGV2OwotCXN0cnVjdCBuZXRfYnJpZGdlICpicjsKLQkKLQlicl9kZXYgPSBkZXZfZ2V0X2J5X25hbWUoJmluaXRfbmV0LCBicl9uYW1lKTsKLQliciA9IG5ldGRldl9wcml2KGJyX2Rldik7Ci0JCi0Jc3Bpbl9sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJfSEFTSF9TSVpFOyBpKyspIHsKLQkJc3RydWN0IGhsaXN0X25vZGUgKmg7Ci0JCWhsaXN0X2Zvcl9lYWNoKGgsICZici0+aGFzaFtpXSkgewotCQkJc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmOwotCi0JCQlmID0gaGxpc3RfZW50cnkoaCwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5LCBobGlzdCk7Ci0JCQlpZiAoZi0+ZHN0ICYmIGYtPmRzdC0+ZGV2ID09IGRzdF9kZXYgJiYgISh0ZXN0X2JpdCgwLCAmZi0+ZmxhZ3MpKSkgey8vQlJfRkRCX0xPQ0FMPT0wCi0JCQkgICBnZXRfbmVpZ2hfYnltYWMoJmFycF90YmwsICZmLT5hZGRyLG5laWdoX2luZm8tPm5laWdoX25vZCtuZWlnaF9udW0pOwotCSAgICAgICAgICAgICAgICBuZWlnaF9udW0rKzsKLQotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZici0+aGFzaF9sb2NrKTsKLQluZWlnaF9pbmZvLT5udW0gPSBuZWlnaF9udW07Ci19Ci0KLXZvaWQgdXBkYXRlX2JycG9ydF9pbmZvKHN0cnVjdCBkZXZsaXN0X2luZm8gKmRldl9pbmZvKXsKLSAgICBpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqYnJfZGV2OwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICp0ZW1wX2RldjsKLSAgICBzdHJ1Y3QgZGV2X25laWdoX2luZm8gKnRlbXBfbmVpZ2g7Ci0gICAgaW50IHRlbXBfY291bnQgOwotICAgIGZvcihpID0gMDsgaSA8IGRldl9pbmZvLT5udW07IGkrKyl7Ci0gICAgICAgIGlmKGRldl9pbmZvLT5pbmZvW2ldLmRldl9sYXllciA9PSBCUl9ERVYpewotICAgICAgICAgICAgYnJfZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgZGV2X2luZm8tPmluZm9baV0ubmFtZSk7Ci0gICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBkZXZfaW5mby0+aW5mb1tpXS5kZXZfbmVpZ2gubnVtOyBqKyspewotICAgICAgICAgICAgICAgIHRlbXBfZGV2ID0gZ2V0YnJwb3J0X2J5ZHN0KGJyX2RldiwgZGV2X2luZm8tPmluZm9baV0uZGV2X25laWdoLm5laWdoX25vZFtqXS5tYWNfYWRkcik7Ci0gICAgICAgICAgICAgICAgaWYoIXRlbXBfZGV2IHx8IHRlbXBfZGV2LT5pZmluZGV4ID09IGJyX2Rldi0+aWZpbmRleCl7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50aygidGVtcF9kZXYgZXJyb3IhISFcbiIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoayA9IDAgOyBrIDwgZGV2X2luZm8tPm51bTsgaysrKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoc3RyY21wKGRldl9pbmZvLT5pbmZvW2tdLm5hbWUsIHRlbXBfZGV2LT5uYW1lKSA9PSAwKXsKLQkJCQkJCXRlbXBfbmVpZ2ggPSAmKGRldl9pbmZvLT5pbmZvW2tdLmRldl9uZWlnaCk7Ci0JCQkJCQlpZih0ZW1wX25laWdoLT5udW0gPj0gMjApewotCQkJCQkJCXByaW50aygiZGV2PSVzICwgbmVpZ2ggaW5mbyBpcyBmdWxsIVxuIiwgdGVtcF9kZXYtPm5hbWUpOwotCQkJCQkJICAgIGJyZWFrOwotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9jb3VudCA9IHRlbXBfbmVpZ2gtPm51bTsJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX25laWdoLT5uZWlnaF9ub2RbdGVtcF9jb3VudF0uaXBfYWRkciwgZGV2X2luZm8tPmluZm9baV0uZGV2X25laWdoLm5laWdoX25vZFtqXS5pcF9hZGRyLCAgZGV2X2luZm8tPmluZm9baV0uZGV2X25laWdoLm5laWdoX25vZFtqXS5pcF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9uZWlnaC0+bmVpZ2hfbm9kW3RlbXBfY291bnRdLmlwX2xlbiA9IGRldl9pbmZvLT5pbmZvW2ldLmRldl9uZWlnaC5uZWlnaF9ub2Rbal0uaXBfbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfbmVpZ2gtPm5laWdoX25vZFt0ZW1wX2NvdW50XS5tYWNfYWRkciwgZGV2X2luZm8tPmluZm9baV0uZGV2X25laWdoLm5laWdoX25vZFtqXS5tYWNfYWRkciwgTUFYX01BQ0FERFJfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfY291bnQgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX25laWdoLT5udW0gPSB0ZW1wX2NvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCQlpZihicl9kZXYpCi0JCQkJZGV2X3B1dChicl9kZXYpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKrvxyKFpbml0X25ldNbQzfjC58nosbjP4LnY0MXPoqOssPzAqElQoaJNQUOhorP2v9pkZXahosHavtPB0LHttcgqLwotaW50IGdldF9kZXZsaXN0X2luZm8odW5zaWduZWQgbG9uZyBhcmcpCi17Ci0gICAgc3RydWN0IGRldmxpc3RfaW5mbyAqZGV2X2luZm87Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqdGVtcF9kZXY7Ci0gICAgc3RydWN0IGRldl9uZWlnaF9pbmZvICp0ZW1wX25laWdoOwotICAgIHVuc2lnbmVkIGludCB0ZW1wX2NvdW50ID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgZGV2X251bSA9IDA7Ci0JCi0gICAgZGV2X2luZm89KHN0cnVjdCBkZXZsaXN0X2luZm8qKWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZsaXN0X2luZm8pLCBHRlBfS0VSTkVMKTsKLSAgICBpZighZGV2X2luZm8pCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotCi0gICAgcmVhZF9sb2NrKCZkZXZfYmFzZV9sb2NrKTsKLQotICAgIGZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikKLSAgICB7Ci0gICAgICAgIGlmKGRldi0+ZmxhZ3MgJiBJRkZfVVAgJiYgc3RyY21wKGRldi0+bmFtZSwgImxvIikgIT0gMCkKLSAgICAgICAgewotICAgICAgICAJLy+8x8K8sb612M34v9q1xNDFz6IKLSAgICAgICAgICAgIHN0cmNweShkZXZfaW5mby0+aW5mb1tkZXZfbnVtXS5uYW1lLCBkZXYtPm5hbWUpOwotICAgICAgICAgICAgaWYoZGV2LT5pcF9wdHIgJiYgZGV2LT5pcF9wdHItPmlmYV9saXN0KQotICAgICAgICAgICAgICAgIGRldl9pbmZvLT5pbmZvW2Rldl9udW1dLmlwdjRfYWRkciA9IGRldi0+aXBfcHRyLT5pZmFfbGlzdC0+aWZhX2FkZHJlc3M7IAotICAgICAgICAgICAgaWYoZGV2LT5oZWFkZXJfb3BzICYmIGRldi0+ZGV2X2FkZHIpewotICAgICAgICAgICAgICAgIG1lbWNweShkZXZfaW5mby0+aW5mb1tkZXZfbnVtXS5tYWNfYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0gICAgICAgICAgICAgICAgaWYoaXNfemVyb19ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQotICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+aW5mb1tkZXZfbnVtXS5tYWNfZXJydHlwZSA9IFpFUk9fQUREUkVSUjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQotICAgICAgICAgICAgICAgICAgICBkZXZfaW5mby0+aW5mb1tkZXZfbnVtXS5tYWNfZXJydHlwZSA9IEJST0FEQ0FTVF9BRERSRVJSOwotICAgICAgICAgICAgICAgIGVsc2UgaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCi0gICAgICAgICAgICAgICAgICAgIGRldl9pbmZvLT5pbmZvW2Rldl9udW1dLm1hY19lcnJ0eXBlID0gTVVMVElDQVNUX0FERFJFUlI7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotCQkvL9LUz8LOqrj80MKxvrXYzfi/2rnYwaq1xNS2s8zB2r7TwdCx7dDFz6IKLQkJLy+21NPax8W148nosbijrM/IuPm+3bP2v9pkZXbV0rW9y/nT0LXE1LazzMHavtNNQUO12Na3o6zU2bj5vt1NQUO12Na31dK1vWFycF90YmzW0LXEwdq+00lQtdjWt7XI0MXPogotICAgICAgICAgICAgaWYoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKXsKLQkJICAgIAlkZXZfaW5mby0+aW5mb1tkZXZfbnVtXS5kZXZfbGF5ZXIgPSBMMl9ERVY7Ci0gICAgICAgICAgICAgICAgZGV2X2luZm8tPmluZm9bZGV2X251bV0uZGV2X25laWdoLm51bSA9IDA7Ci0JCS8vCWdldG5laWdoX29mZGV2KGRldiwmKGRldl9pbmZvLT5pbmZvW2Rldl9udW1dLmRldl9uZWlnaCkpOwotICAgICAgICAgICAgfQotCQkvL2JyMMzYyuLN+LnYo6y78cihxuTB2r7TwdCx7QotICAgICAgICAgICAgZWxzZSBpZihkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSl7Ci0gICAgICAgICAgICAgICAgZGV2X2luZm8tPmluZm9bZGV2X251bV0uZGV2X2xheWVyID0gQlJfREVWOwotICAgICAgICAgICAgICAgIGdldF9uZWlnaF9ieWRldigmYXJwX3RibCwgZGV2LCYoZGV2X2luZm8tPmluZm9bZGV2X251bV0uZGV2X25laWdoKSk7Ci0gICAgICAgICAgICB9Ci0JCS8vttTT2sbVzai1xDOy48nosbijrLvxyKHG5MHavtPB0LHt0MXPogotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAvL8XFs/23x2FycL3Tv9oKLSAgICAgICAgICAgICAgICBpZighKGRldi0+ZmxhZ3MgJiBJRkZfTk9BUlApKQotICAgICAgICAgICAgICAgICAgICBnZXRfbmVpZ2hfYnlkZXYoJmFycF90YmwsIGRldiwmKGRldl9pbmZvLT5pbmZvW2Rldl9udW1dLmRldl9uZWlnaCkpOwotICAgICAgICAgICAgICAgIGRldl9pbmZvLT5pbmZvW2Rldl9udW1dLmRldl9sYXllciA9IEwzX0RFVjsgICAgICAgICAKLSAgICAgICAgICAgIH0KLQkJICAgIGRldl9udW0rKzsKLSAgICAgICAgICAgIGlmKGRldl9udW0gPj0gTUFYX0RFVl9OVU0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZGV2X2luZm8tPm51bSA9IGRldl9udW07Ci0gICAgdXBkYXRlX2JycG9ydF9pbmZvKGRldl9pbmZvKTsKLSAgICByZWFkX3VubG9jaygmZGV2X2Jhc2VfbG9jayk7Ci0gICAgCi0gICAgaWYgKGNvcHlfdG9fdXNlcigoY2hhciAqKWFyZywgZGV2X2luZm8sIHNpemVvZihzdHJ1Y3QgZGV2bGlzdF9pbmZvKSkpCi0gICAgewotICAgICAgICBrZnJlZShkZXZfaW5mbyk7Ci0gICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgIH0KLSAgICBrZnJlZShkZXZfaW5mbyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IHNrYl93YWl0X3F1ZXVlOwotLy9leHRlcm4gYXRvbWljX3QgIHNrYl91c2VkOwotZXh0ZXJuIGF0b21pY190ICBza2JfdG9wczsKLWV4dGVybiBhdG9taWNfdCAgc2tiX2Zyb21wczsKLS8v08PT2rj619lza2K94bm5zOW1xMnqx+ujrLD8uqzN4rK/tKu13cC0tcRkYXRhCi12b2lkIHNrYl9hbGxvY190cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmbmRlZiBDT05GSUdfU1BFRURfT1BUCi0JbmV0c2xhYl9pbmMoU0tCX1NMQUIpOwotCS8vdHJhY2tfYWRkKHNrYiwgMCwgU0tCX0lORk8sIHNrYi0+dHJ1ZXNpemUpOwotCXNrYmluZm9fYWRkKHNrYixTS0JfVFlQRV9BTEwpOwotI2VuZGlmCi0vLwlhdG9taWNfaW5jKCZza2JfdXNlZCk7Ci19Ci0vL9PD09q4+tfZc2tiveG5uczltcTKzbfFo6yw/LqszeKyv7Srtd3AtLXEZGF0YQotZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IHNrYl93YWl0X3F1ZXVlOwotdm9pZCBza2JfZnJlZV90cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmbmRlZiBDT05GSUdfU1BFRURfT1BUCi0JdHJhY2tfZGVsKHNrYiwgMCwgU0tCX0lORk8pOwotCXNrYmluZm9fZGVsKHNrYixTS0JfVFlQRV9BTEwpOwotCW5ldHNsYWJfZGVjKFNLQl9TTEFCKTsJCi0jZW5kaWYKLQkvLzIwMTcuNi4zICBhZGQgYnkgbGlueHUgIHNldCBhIGxpbWl0IGZvciBza2IKLS8vCWF0b21pY19kZWMoJnNrYl91c2VkKTsKLQlpZih3YWl0cXVldWVfYWN0aXZlKCZza2Jfd2FpdF9xdWV1ZSkpCi0JewotCQl3YWtlX3VwKCZza2Jfd2FpdF9xdWV1ZSk7CQkKLQl9Ci19Ci0vL9PD09q4+tfZc2xhYrv61sa1xHNrYi0+ZGF0Yb3hubnM5bXEyerH6yyyu7D8uqzN4rK/UFNCVUYKLXZvaWQgc2tiZGF0YV9hbGxvY190cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmbmRlZiBDT05GSUdfU1BFRURfT1BUCi0Jc2tiaW5mb19hZGQoKHVuc2lnbmVkIGNoYXIgKilza2IsU0tCX1RZUEVfREFUQSk7Ci0JLy90cmFja19hZGQoc2tiLT5oZWFkLCAwLCBEQVRBX0lORk8sIHNrYi0+bGVuKTsKLSNlbmRpZgotfQotLy/Tw9PauPrX2XNsYWK7+tbGtcRza2ItPmRhdGG94bm5zOW1xMrNt8Ussruw/LqszeKyv1BTQlVGCi12b2lkIHNrYmRhdGFfZnJlZV90cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmbmRlZiBDT05GSUdfU1BFRURfT1BUCi0JdHJhY2tfZGVsKHNrYi0+aGVhZCwgMCwgREFUQV9JTkZPKTsKLQlza2JpbmZvX2RlbChza2IsU0tCX1RZUEVfREFUQSk7Ci0jZW5kaWYKLX0KLQotLy/Tw9PauPrX2c3isr+0q7XdwLS1xGRhdGHJ6sfrCi12b2lkIGZyb21leHRfYWxsb2NfdHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSNpZm5kZWYgQ09ORklHX1NQRUVEX09QVAotCS8vdHJhY2tfYWRkKHNrYiwgMCwgREFUQV9JTkZPLCAgc2tiLT5sZW4pOwotCXNrYmluZm9fYWRkKCh1bnNpZ25lZCBjaGFyICopc2tiLFNLQl9UWVBFX0ZST01DUCk7Ci0jZW5kaWYKLQlhdG9taWNfaW5jKCZza2JfZnJvbXBzKTsKLX0KLS8v08PT2rj619nN4rK/tKu13cC0tcRkYXRhtcTKzbfFCi12b2lkIGZyb21leHRfZnJlZV90cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmbmRlZiBDT05GSUdfU1BFRURfT1BUCi0JdHJhY2tfZGVsKHNrYi0+aGVhZCwgMCwgREFUQV9JTkZPKTsKLQlza2JpbmZvX2RlbChza2IsU0tCX1RZUEVfRlJPTUNQKTsKLSNlbmRpZgkKLQlhdG9taWNfZGVjKCZza2JfZnJvbXBzKTsKLX0KLS8v08PT2rj619m3osvNuPjN4rK/tcTJ6sfrCi12b2lkIHRvZXh0X2FsbG9jX3RyYWNrKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0jaWZuZGVmIENPTkZJR19TUEVFRF9PUFQKLQlza2JpbmZvX2FkZCgodW5zaWduZWQgY2hhciAqKXNrYixTS0JfVFlQRV9UT0NQKTsKLSNlbmRpZgotCWF0b21pY19pbmMoJnNrYl90b3BzKTsKLX0KLS8v08PT2rj619m3osvNuPjN4rK/tcTKzbfFCi12b2lkIHRvZXh0X2ZyZWVfdHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSNpZm5kZWYgQ09ORklHX1NQRUVEX09QVAotCXNrYmluZm9fZGVsKHNrYixTS0JfVFlQRV9UT0NQKTsKLSNlbmRpZgotCWF0b21pY19kZWMoJnNrYl90b3BzKTsKLX0KLSNlbHNlCi0KLQotCi1pbnQgc2V0X3ByaW50ID0gMDsgICAgICAgLy/N+MLn19S2qNLltcS08tOhv6q52AotRVhQT1JUX1NZTUJPTChzZXRfcHJpbnQpOwotCi1pbnQgc2V0X3RjcGR1bXAgPSAwOyAgLy/IztLitePXpbD8v6q52AotCi0vL7Tmt8W1scewc2tiz+C52LXEzbO8xtDFz6KjrLD8wKjSu9Cp0uyzo8/gudjQxc+iCi11bnNpZ25lZCBsb25nIHNrYmluZm9fZGJnW1NLQl9JTkZPX01BWF09IHswfTsgCi0KLS8vuPfW1s34wufUy9DQ18rUtLXEzbO8xta1o6zTyMbkyse497j2udi8/L3hubnM5bXEyerH66Os0tS5qcTasr/Rp8+wus22qM67Ci11bnNpZ25lZCBsb25nIG5ldHJ1bmluZm9fZGJnW05FVF9JTkZPX01BWF09IHswfTsgCi0KLS8vc2tiyerH68nPz961xMXk1sPIq77Wo6zEv8ewydDOtMq508MKLXVuc2lnbmVkIGxvbmcgc2tiX21heF9wYW5pYyA9IDA7IC8vc2ti19zK/cnPz96jrLOss/a74bW81sJwYW5pYwotdW5zaWduZWQgbG9uZyBza2JfbnVtX2xpbWl0ID0gNjAwMDsgIC8vc2ti19zK/cnPz96jrLOss/a3tbvYTlVMTAotCi0vL7bUzNi2qLXEc2ti1NrKzbfFtePKsb340NDVu7j619kKLWNoYXIgc2tiX2R1bXBfc3RyW05JT0NUTF9NQVhfTVNHTEVOXSA9IHswfTsKLXVuc2lnbmVkIGludCBza2JfZHVtcF9sZW4gPSAwOwotCi0vKrbUsb612FRDUL340NDP4LnYzbO8xiovCi11bnNpZ25lZCBsb25nIHRjcF9zdGF0c19kYmdbVENQX1NUQVRTX01BWF0gPSB7MH07Ci0KLQotLy/S1M/CzqrK/b7dsPy1xL2oxKPQxc+io6zS1M2zvMaz9sr9vt2w/MSj0M0KLWludCAgc2tiX251bTQgPSAwOyAgICAgICAgICAgICAgICAgIC8vvdPK1bW9tcRWNMr9vt2w/AotaW50ICBza2JfbnVtNiA9IDA7ICAgICAgICAgICAgICAgICAgLy+908rVtb21xFY2yv2+3bD8Ci1pbnQgIHNrYl9iaWdfbnVtOyAgICAgICAgICAgICAgICAgICAvL2xlbrOktsizrLn9MTAwMLXEyv2+3bD8o6y6rFY0us1WNgotaW50ICBza2Jfc21hbGxfbnVtOyAgICAgICAgICAgICAgICAgLy9sZW6zpLbI0KHT2jEwMLXEyv2+3bD8o6y6rFY0us1WNgotaW50ICBza2JfYnl0ZXM0ID0gMDsgICAgICAgICAgICAgICAgLy+908rVtb21xFY0yv2+3bD819a92sr9Ci1pbnQgIHNrYl9ieXRlczYgPSAwOyAgICAgICAgICAgICAgICAvL73TytW1vbXEVjbK/b7dsPzX1r3ayv0KLWludCAgc2tiX3Vua25vd24gPSAwOyAgICAgICAgICAgICAgIC8vvdPK1bW9tcTOtNaq0K3S6cr9vt2w/KOssPzAqEFSULXIt8dWNLrNVja1xLGozsQKLWludCAgc2tiX3RjcG51bSA9IDA7ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcR0Y3DK/b7dsPyjrLqsVjS6zVY2o6y1q7K7uqxmYXN0YnK1xLGozsQKLWludCAgc2tiX3VkcG51bSA9IDA7ICAgICAgICAgICAgICAgIC8vvdPK1bW9tcR1ZHDK/b7dsPyjrLqsVjS6zVY2o6y1q7K7uqxmYXN0YnK1xLGozsQKLWludCAgYnJvYWRjYXN0X251bTQgPSAwOyAgICAgICAgICAgIC8vvdPK1bW9tcRWNLnjsqWw/AotaW50ICBicm9hZGNhc3RfbnVtNiA9IDA7ICAgICAgICAgICAgLy+908rVtb21xFY2ueOypbD8Ci1pbnQgIG11bHRpY2FzdF9udW00ID0gMDsgICAgICAgICAgICAvL73TytW1vbXEVjTX6bKlsagKLWludCAgbXVsdGljYXN0X251bTYgPSAwOyAgICAgICAgICAgIC8vvdPK1bW9tcRWNtfpsqWxqAotaW50ICBmYXN0bmF0X251bSA9IDA7ICAgICAgICAgICAgICAgLy9mYXN0bmF0s8m5prXEsajOxAotaW50ICBmYXN0Nl9udW0gPSAwOyAgICAgICAgICAgICAgICAgLy9mYXN0NrPJuaa1xLGozsQKLWludCAgZmFzdGJyX251bSA9IDA7ICAgICAgICAgICAgICAgIC8vZmFzdGJys8m5prXEsajOxAotaW50ICBmYXN0X2xvY2FsNF9yY3ZfbnVtID0gMDsgICAgICAgLy+xvrXYZmFzdF9sb2NhbDSzybmmvdPK1bGozsQKLWludCAgZmFzdF9sb2NhbDZfcmN2X251bSA9IDA7ICAgICAgIC8vsb612GZhc3RfbG9jYWw2s8m5pr3TytWxqM7ECi1pbnQgIGZhc3RfbG9jYWw0X291dHB1dF9udW0gPSAwOyAgICAvL7G+tdhmYXN0X2xvY2FsNLPJuaa3osvNsajOxAotaW50ICBmYXN0X2xvY2FsNl9vdXRwdXRfbnVtID0gMDsgICAgLy+xvrXYZmFzdF9sb2NhbDazybmmt6LLzbGozsQKLWludCAgZmFzdF90Y3BkdW1wX251bSA9IDA7ICAgICAgICAgIC8vZmFzdNelsPzK/cG/Ci0KLQotaW50IGRvdWJsZV9tYWMgPSAwOyAvL21hY7zssum/qrnYCi0vL3NsYWLE2rTmyrnTw8/gudjNs7zGo6zOtL+8wsfNqNPDc2xhYrXY1rez2KOsyOdrbWFsbG9jCi1zdHJ1Y3Qgc2xhYl9pbmZvIHNsYWJfY291bnQgPSB7MH07Ci0KLS8qvfjQ0FRDUM2zvMYqLwotI2RlZmluZSBUQ1BfUEtUX1NUQVRTX0lOQyhfbW9kKSAgICB0Y3Bfc3RhdHNfZGJnW19tb2RdKysKLQotdm9pZCBkdW1wX25ldF9zdGFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotICAgCi19Ci0KLQotdm9pZCBjaGVja19tYWNhZGRyX29ubHkodW5zaWduZWQgY2hhciAqaGEsIHVuc2lnbmVkIGNoYXIgaGFfbGVuKQotewotCQotfQotCi0vL9PD09q4+tfZc2tiveG5uczltcTJ6sfro6yw/LqszeKyv7Srtd3AtLXEZGF0YQotdm9pZCBza2JfYWxsb2NfdHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQkKLX0KLS8v08PT2rj619lza2K94bm5zOW1xMrNt8WjrLD8uqzN4rK/tKu13cC0tcRkYXRhCi12b2lkIHNrYl9mcmVlX3RyYWNrKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JCi19Ci0vL9PD09q4+tfZc2xhYrv61sa1xHNrYi0+ZGF0Yb3hubnM5bXEyerH6yyyu7D8uqzN4rK/UFNCVUYKLXZvaWQgc2tiZGF0YV9hbGxvY190cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCQotfQotLy/Tw9PauPrX2XNsYWK7+tbGtcRza2ItPmRhdGG94bm5zOW1xMrNt8Ussruw/LqszeKyv1BTQlVGCi12b2lkIHNrYmRhdGFfZnJlZV90cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCQotfQotCi0vL9PD09q4+tfZzeKyv7Srtd3AtLXEZGF0Ycnqx+sKLXZvaWQgZnJvbWV4dF9hbGxvY190cmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCQotCi19Ci0vL9PD09q4+tfZzeKyv7Srtd3AtLXEZGF0YbXEys23xQotdm9pZCBmcm9tZXh0X2ZyZWVfdHJhY2soc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQkKLX0KLS8v08PT2rj619m3osvNuPjN4rK/tcTJ6sfrCi12b2lkIHRvZXh0X2FsbG9jX3RyYWNrKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JCi19Ci0vL9PD09q4+tfZt6LLzbj4zeKyv7XEys23xQotdm9pZCB0b2V4dF9mcmVlX3RyYWNrKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JCi19Ci0KLXZvaWQgbmV0X3ByaW50X3BhY2tldCh1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgZmxhZykKLXsKLSAgIAotfQotCi0KLXZvaWQgdGNwZHVtcGluX3NxKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgCi19Ci0KLXZvaWQgdHJhY2tfbmV0bGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLHUzMiBncm91cCkKLXsKLQotfQotCi12b2lkIG5ldHNsYWJfaW5jKGludCBpKQotewotCi19Ci0KLXZvaWQgbmV0c2xhYl9kZWMoaW50IGkpCi17Ci0KLX0KLQotdm9pZCBuZXRydW5pbmZvX2FkZCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBpbmZvX3R5cGUpCi17Ci19Ci0KLXZvaWQgbmV0cnVuaW5mb19kZWwodW5zaWduZWQgY2hhciAqYWRkcix1bnNpZ25lZCBpbnQgaW5mb190eXBlKQotewotfQotCi12b2lkIHNrYmluZm9fYWRkKHVuc2lnbmVkIGNoYXIgKmFkZHIsdW5zaWduZWQgaW50IHNrYmluZm9fdHlwZSkKLXsKLX0KLQotdm9pZCBza2JpbmZvX2RlbCh1bnNpZ25lZCBjaGFyICphZGRyLHVuc2lnbmVkIGludCBza2JpbmZvX3R5cGUpCi17Ci19Ci0KLWludCBuZXRfZGVidWdfcGFja2V0ID0gMDsKLXN0cnVjdCB0aW1ldmFsIG5ldF9kZWJ1Z19wYWNrZXRfdHYgPSB7MCwgMH07Ci1zdHJ1Y3QgbGlzdF9oZWFkIG5ldF9kZWJ1Z19wYWNrZXRfbGlzdF9oZWFkOyAKLWludCBuZXRfZGVidWdfcGFja2V0X3NlYyA9IDA7Ci0KLSNpZiAwCi0vL7zHwrzTptPDt6Kw/Mfpv/YKLXZvaWQgcmVjb3JkX2FwcF9hdGNpdmVfbmV0KCkKLXsKLQotfQotI2VuZGlmCi1pbnQgZ2V0X3RjcF9zdGF0X2luZm8odW5zaWduZWQgbG9uZyBhcmcpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIF9VU0VfVGVzdEhhcm5lc3MgCi1pbnQgKnZpcl9hZGRyX2Rkcm5ldCA9IDA7Ci0KLXZvaWQgcHNuZXRfZnJlZXBzYnVmKHZvaWQgKmhlYWQpCi17Ci19Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3Q0X2Z3LmMgYi91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3Q0X2Z3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBlZjMyZTQuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvY29yZS9mYXN0cHJvYy9mYXN0NF9mdy5jCisrKyAvZGV2L251bGwKQEAgLTEsODI5ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL2Zhc3RfY29tbW9uLmg+Ci0jaW5jbHVkZSA8bmV0L2luZXRfaGFzaHRhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3pvbmVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGltZXN0YW1wLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGltZW91dC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldF90cmFjay5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRfb3RoZXIuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0aW9jX3Byb2MuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X2NhY2hlLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL3ByaW50X3N1bi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLQotc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3RfaXB0YWJsZXNfc3luOwotc3RhdGljIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBjdF9pcHRhYmxlc19iaDsKLXVuc2lnbmVkIGludCBjdF9pcHRhYmxlc19zeW5fc3c7Ci1lbnVtIHRhYmxlX2luZGV4IHsKLQlJUFRBQkxFX1JBVywKLQlJUFRBQkxFX01BTkdMRSwKLQlJUFRBQkxFX05BVCwKLQlJUFRBQkxFX0ZJTFRFUgotfTsKLQotCi0vKiAqKioqKioqKioqKioqKioqKiBpcHY0IL/sy9nXqreiz+C52LHkwb8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIENPTkZJR19QUkVFTVBUX1JUX0ZVTEwKLWV4dGVybiBpbnQgKnZpcl9hZGRyX2Rkcm5ldDsKLSNlbmRpZgotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioguq/K/cnqw/cgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioguq/K/cq1z9YgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgZHN0X2V4cGlyZV9jb3VudCA9IDA7Ci1leHRlcm4gaW50IG5vX25laWdoYm91cjsKLQotc3RhdGljIGlubGluZSBpbnQgcnRfaXNfZXhwaXJlZChzdHJ1Y3QgcnRhYmxlICpydGgpCi17Ci0gICAgcmV0dXJuIHJ0aC0+cnRfZ2VuaWQgIT0gYXRvbWljX3JlYWQoJihkZXZfbmV0KHJ0aC0+ZHN0LmRldikpLT5pcHY0LnJ0X2dlbmlkKTsKLX0KLQotdm9pZCBfX2ZsdXNoX2RjYWNoZV9hcmVhKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pCi17Ci0gICAgICAvL7Ty1666r8r9LLrz0Pi/tMjnus7KudPDICAKLX0KLQotCi1leHRlcm4gdm9pZCBudGxfY3Rfc2V0X2l3KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9jb25uICpjdCwgaW50IGN0X2Rpcik7Ci1pbnQgZmFzdDRfZndfcmVjdihzdHJ1Y3QgbmZfY29ubiAqdG1wbCwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8sCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLSAgICAgICAgICAgICAgICAgIGludCBkaXIsCi0gICAgICAgICAgICAgICAgICB1X2ludDhfdCBwcm90b251bSkKLXsKLSAgICBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotICAgIHN0cnVjdCB1ZHBoZHIgKnVkcGggPSBOVUxMOwotICAgIHN0cnVjdCB0Y3BoZHIgKnRjcGggPSBOVUxMOwotICAgIF9fc3VtMTYgKmNrc3VtID0gTlVMTDsKLSAgICBfX2JlMzIgKm9sZGlwID0gTlVMTDsKLSAgICBfX2JlMTYgKm9sZHBvcnQgPSAwOwotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotICAgIHVfaW50MzJfdCBza2lwX25hdCA9IDA7Ci0KLSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLSAgICBpbnQgcmV0OwotICAgIGludCByZGlyOwotICAgIGludCB0eXBlOwotICAgIHVfaW50MzJfdCAgICAgIG5hdF9hZGRyOwotICAgIHVfaW50MTZfdCAgICAgIG5hdF9wb3J0OwotICAgIHN0cnVjdCBldGhoZHIgKiBldGg7Ci0gICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0X2RpciA9IE5VTEwsICpkc3RfcmRpciA9IE5VTEw7Ci0gICAgc3RydWN0IG5laWdoYm91ciAqX25laWdoYm91ciA9IE5VTEw7Ci0JCi0JX19iZTE2CQkJdmxhbl9wcm90b19yYXcgPSBza2ItPnZsYW5fcHJvdG87Ci0JX191MTYJCQl2bGFuX3RjaV9yYXcgPSBza2ItPnZsYW5fdGNpOwotCi0gICAgLyqyzr+8dGNmX2lwdF9hY3QoKSovCi0gICAgc3RydWN0IG5mX2hvb2tfc3RhdGUgc3RhdGUgPSB7Ci0gICAgICAgIC5ob29rID0gTkZfSU5FVF9QUkVfUk9VVElORywKLSAgICAgICAgLm5ldCA9ICZpbml0X25ldCwKLSAgICAgICAgLmluCT0gc2tiLT5kZXYsCi0gICAgICAgIC5wZgk9IE5GUFJPVE9fSVBWNCwKLSAgICB9OwotCi0KLSAgICByZGlyID0gKElQX0NUX0RJUl9PUklHSU5BTCA9PSBkaXIpID8gSVBfQ1RfRElSX1JFUExZOiBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0gICAgZHN0X2RpciA9IGRzdF9nZXRfYnlfY3QoY3QsIGRpcik7Ci0KLSAgICBpZiAoIWRzdF9kaXIpCi0gICAgewotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQotCi0gICAgaWYgKHJ0X2lzX2V4cGlyZWQoKHN0cnVjdCBydGFibGUqKWRzdF9kaXIpKQotICAgIHsKLSAgICAgICAgZHN0X2V4cGlyZV9jb3VudCsrOwotICAgICAgICBmYXN0X2Z3X2Nvbm5fcmVsZWFzZShjdCk7Ci0gICAgICAgIGdvdG8gZXJyX291dDsKLSAgICB9Ci0KLSAgICAvLyDI57n7vMfCvMHLx8W146Osvs3Wsb3T1rjP8sfFteMKLSAgICBpZiAoY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbZGlyXSkKLSAgICB7Ci0gICAgICAgIHJjdV9yZWFkX2xvY2soKTsKLSAgICAgICAgZGV2ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtkaXJdLCAxKTsKLSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBkZXYgPSBkc3RfZGlyLT5kZXY7Ci0gICAgfQotCi0gICAgLyq87LLpsPyzpLbIyse38bOsuf2z9r/ayeixuE1UVSovCi0KLSAgICBpZiAoIWRldiB8fCAoc2tiLT5sZW4gPiBkZXYtPm10dSkpCi0gICAgewotICAgICAgICBza2JpbmZvX2FkZChOVUxMLCBTS0JfT1ZFUl9NVFUpOwotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQotCi0gICAgLy+72LSrtcSw/NaxvdPKzbfFsqK8xsr9Ci0gICAgaWYgKHN0cmNtcChza2ItPmRldi0+bmFtZSwgZGV2LT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgICAgc2tiaW5mb19hZGQoTlVMTCwgU0tCX0xPT1ApOwotCi0gICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICBnb3RvIGRyb3BfcGFja2V0OwotICAgIH0KLQotICAgIC8vss6/vHJlc29sdmVfbm9ybWFsX2N0Ci0gICAgaWYgKGRpciA9PSAxKSB7Ci0gICAgICAgIGN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkgewotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodGVzdF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpKSB7Ci0gICAgICAgICAgICBjdGluZm8gPSBJUF9DVF9SRUxBVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfTkVXOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXQgPSBuZl9jb25udHJhY2tfaGFuZGxlX3BhY2tldF9mYXN0KGN0LCBza2IsIGRhdGFvZmYsIGN0aW5mbywgJnN0YXRlKTsKLSAgICBpZiAocmV0IDw9IDApIHsKLSAgICAgICAgc2tiLT5fbmZjdCA9IDA7Ci0gICAgICAgIGdvdG8gZXJyX291dDsgLy8gZmFzdMqnsNzHsLa8srvE3Lj8uMRza2K1xMTayN2jrLfx1PLKp7Dcvs3Sqtf2u9a4tLLZ1/cKLSAgICB9Ci0gICAgLy/F0LbPs/a/2mRldrXEzbeyv7/VvOTKx7fx1+O5u6Ossru5u9Do0qpleHBhbmQKLSAgICBpZiAoIShza2IgPSBmYXN0X2V4cGFuZF9oZWFkcm9vbShza2IsIGRldikpKSB7Ci0gICAgICAgIGdvdG8gZHJvcF9wYWNrZXQ7Ci0gICAgfQotCi0gICAgZmFzdF90Y3BkdW1wKHNrYik7Ci0KLSAgICAvL8jnufvXpbD8w/zW0KOsyv2+3bvhY2xvbmWjrGZhc3Szybmm0OjSqrjEseRkYXRhxNrI3aOs0OjSqtbY0MJjb3B50ru33QotICAgIGlmIChza2JfY2xvbmVkKHNrYikpCi0gICAgewotICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3Q0X2Z3X3JlY3YgY2xvbmUgY29weSBmYWlsZWQgISEhXG4iKTsKLSAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICAgICAgZ290byBkcm9wX3BhY2tldDsKLSAgICAgICAgfQotICAgICAgICBjbGVhbl9jYWNoZShza2ItPmRhdGEsc2tiLT5sZW4pOwotICAgIH0KLQotICAgIGlwaCA9IGlwX2hkcihza2IpOwotCi0gICAgLy+99rWxZmFzdG5hdLPJuaajrLLFxNzJ6NbDSVDNt8rXtdjWtyzS1LmpY2FjaGXLotDCyrHKudPDCi0gICAgc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7Ci0gICAgc2tiLT5pc0Zhc3RuYXQgPSAxOwotICAgIG5mX2N0X3NldChza2IsIChzdHJ1Y3QgbmZfY29ubiAqKSZjdC0+Y3RfZ2VuZXJhbCwgY3RpbmZvKTsKLQotICAgIGlmICh0ZXN0X2JpdChJUFNfU1JDX05BVF9CSVQsICZjdC0+c3RhdHVzKSkKLSAgICB7Ci0gICAgICAgIGlmKElQX0NUX0RJUl9PUklHSU5BTCA9PSBkaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hdF9hZGRyID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5kc3QudTMuaXA7Ci0gICAgICAgICAgICBuYXRfcG9ydCA9IGN0LT50dXBsZWhhc2hbcmRpcl0udHVwbGUuZHN0LnUuYWxsOwotICAgICAgICAgICAgdHlwZSA9IEZOX1RZUEVfU1JDOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmF0X2FkZHIgPSBjdC0+dHVwbGVoYXNoW3JkaXJdLnR1cGxlLnNyYy51My5pcDsKLSAgICAgICAgICAgIG5hdF9wb3J0ID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5zcmMudS5hbGw7Ci0gICAgICAgICAgICB0eXBlID0gRk5fVFlQRV9EU1Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAodGVzdF9iaXQoSVBTX0RTVF9OQVRfQklULCAmY3QtPnN0YXR1cykpCi0gICAgewotICAgICAgICBpZiAoSVBfQ1RfRElSX09SSUdJTkFMID09IGRpcikKLSAgICAgICAgewotICAgICAgICAgICAgbmF0X2FkZHIgPSBjdC0+dHVwbGVoYXNoW3JkaXJdLnR1cGxlLnNyYy51My5pcDsKLSAgICAgICAgICAgIG5hdF9wb3J0ID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5zcmMudS5hbGw7Ci0gICAgICAgICAgICB0eXBlID0gRk5fVFlQRV9EU1Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBuYXRfYWRkciA9IGN0LT50dXBsZWhhc2hbcmRpcl0udHVwbGUuZHN0LnUzLmlwOwotICAgICAgICAgICAgbmF0X3BvcnQgPSBjdC0+dHVwbGVoYXNoW3JkaXJdLnR1cGxlLmRzdC51LmFsbDsKLSAgICAgICAgICAgIHR5cGUgPSBGTl9UWVBFX1NSQzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBza2lwX25hdCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCFza2lwX25hdCkKLSAgICB7Ci0gICAgICAgIC8qvfjQ0G5hdNequ7sqLwotICAgICAgICBpZiAoSVBQUk9UT19UQ1AgPT0gaXBoLT5wcm90b2NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIGlwaC0+aWhsICogNCk7Ci0gICAgICAgICAgICBja3N1bSA9ICZ0Y3BoLT5jaGVjazsKLSAgICAgICAgICAgIG9sZHBvcnQgPSAoRk5fVFlQRV9TUkMgPT0gdHlwZSk/ICgmdGNwaC0+c291cmNlKTogKCZ0Y3BoLT5kZXN0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChJUFBST1RPX1VEUCA9PSBpcGgtPnByb3RvY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICB1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgaXBoLT5paGwgKiA0KTsKLSAgICAgICAgICAgIGNrc3VtID0gJnVkcGgtPmNoZWNrOwotICAgICAgICAgICAgb2xkcG9ydCA9IChGTl9UWVBFX1NSQyA9PSB0eXBlKT8gKCZ1ZHBoLT5zb3VyY2UpOiAoJnVkcGgtPmRlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2xkaXAgPSAoRk5fVFlQRV9TUkMgPT0gdHlwZSk/ICgmaXBoLT5zYWRkcikgOiAoJmlwaC0+ZGFkZHIpOwotCi0gICAgICAgIGlmIChja3N1bSAhPSBOVUxMICYmICgwIT0qY2tzdW0gfHwgSVBQUk9UT19UQ1AgPT0gaXBoLT5wcm90b2NvbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZXRfcHJvdG9fY3N1bV9yZXBsYWNlNChja3N1bSwgc2tiLCAqb2xkaXAsIG5hdF9hZGRyLCAwKTsKLSAgICAgICAgICAgIGluZXRfcHJvdG9fY3N1bV9yZXBsYWNlMihja3N1bSwgc2tiLCAqb2xkcG9ydCwgbmF0X3BvcnQsIDApOwotICAgICAgICB9Ci0gICAgICAgIGNzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssICpvbGRpcCwgbmF0X2FkZHIpOwotICAgICAgICBpZihvbGRwb3J0KQotICAgICAgICAgICAgKm9sZHBvcnQgPSBuYXRfcG9ydDsKLSAgICAgICAgKm9sZGlwID0gbmF0X2FkZHI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChJUFBST1RPX1RDUCA9PSBpcGgtPnByb3RvY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICB0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiLT5kYXRhICsgaXBoLT5paGwgKiA0KTsKLSAgICAgICAgfQotICAgIH0KLQotCS8vu/nT2mN0wbS907XEwffBv82zvMYKLSAgICBjdC0+cGFja2V0X2luZm9bZGlyXS5wYWNrZXRzKys7Ci0gICAgY3QtPnBhY2tldF9pbmZvW2Rpcl0uYnl0ZXMgKz0gc2tiLT5sZW47Ci0gICAgLy+7+dPazfi/2rXEwffBv82zvMYgIC0tLSCyzr+8bGludXjUrcn6tcTH/bavo6zNs7zGtcS2vMrHSVCw/LOktsgKLSAgICBpZiAoZmFzdG5hdF9sZXZlbCA9PSBGQVNUX05FVF9ERVZJQ0UpCi0gICAgewotICAgICAgICBza2ItPmRldi0+c3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICBza2ItPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0gICAgfQotCi0KLSAgICBpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkKLSAgICB7Ci0gICAgICAgIGlmICghKGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpKSB7Ci0gICAgICAgICAgICBza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLQkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0JCQlpZihza2ItPmlzdmxhbiA9PSAxKQotCQkJewotCQkJCXN0cnVjdCB2bGFuX2V0aGhkciAqdmxhbl9ldGggPSAoc3RydWN0IHZsYW5fZXRoaGRyKikoc2tiLT5kYXRhIC0gVkxBTl9ITEVOKTsKLQkJCQlza2ItPnZsYW5fcHJvdG8gPSB2bGFuX2V0aC0+aF92bGFuX3Byb3RvOwotCQkJCXNrYi0+dmxhbl90Y2kgPSBudG9ocyh2bGFuX2V0aC0+aF92bGFuX1RDSSk7CQkJCQotCQkJfQotICAgICAgICAgICAgZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0gICAgICAgICAgICBfbmVpZ2hib3VyID0gZHN0X25laWdoX2xvb2t1cF9za2IoZHN0X2Rpciwgc2tiKTsKLSAgICAgICAgICAgIC8vs/a/2mRldiBtYWO12Na31/fOqsr9vt2w/NS0bWFjtdjWtwotICAgICAgICAgICAgbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLSAgICAgICAgICAgIGlmIChfbmVpZ2hib3VyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lbWNweShldGgtPmhfZGVzdCwgX25laWdoYm91ci0+aGEsIEVUSF9BTEVOKTsKLSAgICAgICAgICAgICAgICBuZWlnaF9yZWxlYXNlKF9uZWlnaGJvdXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgX19mbHVzaF9kY2FjaGVfYXJlYShza2ItPmRhdGEsIHNrYi0+bGVuKTsKLSAgICAgICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgICAgICAgICBub19uZWlnaGJvdXIrKzsKLSAgICAgICAgICAgICAgICBnb3RvIGRyb3BfcGFja2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXRoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfSVApOwotICAgICAgICB9Ci0gICAgICAgIHNrYi0+ZGV2ID0gZGV2OwotICAgICAgICBza2ItPm5vd19sb2NhdGlvbiB8PSBGQVNUTkFUX1NVQ0M7Ci0KLQlpZihjdC0+aW5kZXZbZGlyXSA9PSBOVUxMICYmIHNrYi0+aW5kZXYgIT0gTlVMTCkKLQl7Ci0JCWN0LT5pbmRldltkaXJdID0gc2tiLT5pbmRldjsKLQl9Ci0KLQlpZihjdC0+b3V0ZGV2W2Rpcl0gPT0gTlVMTCAmJiBza2ItPmRldiAhPSBOVUxMKQotCXsKLQkJY3QtPm91dGRldltkaXJdID0gc2tiLT5kZXY7Ci0JfQotCi0Jc2tiLT52bGFuX3Byb3RvID0gdmxhbl9wcm90b19yYXc7Ci0Jc2tiLT52bGFuX3RjaSA9IHZsYW5fdGNpX3JhdzsKLSAgICAgICAgX19mbHVzaF9kY2FjaGVfYXJlYShza2ItPmRhdGEsIHNrYi0+bGVuKTsKLSAgICAgICAgc3Bpbl91bmxvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOwotICAgICAgICBkZXZfcXVldWVfeG1pdChza2IpOwotCQlzcGluX2xvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgIkVSUiAmJiYmJiYgJXMgRE9XTiwga2ZyZWVfc2tiISEhISEhISEgXG4iLCBza2ItPmRldi0+bmFtZSk7Ci0gICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgIH0KLQotCi0gICAgcHJpbnRfc3VuKFNVTl9EQkcsICJza2IgOiAweCV4LCBuZXcgZmFzdG5hdCBzdWNjLS0tLS0tLS0iLCBza2IpOwotCi1zdWNjX291dDoKLWRyb3BfcGFja2V0OgotICAgIGlmICh0bXBsKQotICAgICAgICBuZl9jb25udHJhY2tfcHV0KCZ0bXBsLT5jdF9nZW5lcmFsKTsKLSAgICBkc3RfcmVsZWFzZShkc3RfZGlyKTsKLSAgICByZXR1cm4gMTsKLQotZXJyX291dCA6Ci0gICAgZHN0X3JlbGVhc2UoZHN0X2Rpcik7Ci0gICAgbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwotICAgIHByaW50X3N1bihTVU5fREJHLCAic2tiIDogMHgleCwgbmV3IGZhc3RuYXQgRkFJTCEhISEhISEhISEiLCBza2IpOwotICAgIGlmICh0bXBsKSB7Ci0gICAgICAgIG5mX2N0X3NldChza2IsIChzdHJ1Y3QgbmZfY29ubiAqKSZ0bXBsLT5jdF9nZW5lcmFsLCBJUF9DVF9ORVcpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2tiLT5fbmZjdCA9IDA7Ci0gICAgfQotICAgIHJldHVybiAwOyAvKiBub3QgZmFzdCBuYXQgKi8KLX0KLQotLy+5pNf31NpQT1NUX1JPVVRJTke92rXjo6zTw9PaZmFzdM/gudjK/b7dtcS4s9a1Ci11bnNpZ25lZCBpbnQgbmFwdF9oYW5kbGU0X2Z3KHZvaWQgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLSAgICBzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0gICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0gICAgdV9pbnQ4X3QgcHJvdG9jb2w7Ci0gICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwgcmRpcjsKLSAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7Ci0jaWZkZWYgQ09ORklHX0FUSFJTX0hXX05BVAotICAgIHVfaW50MzJfdCBtYXNrID0wOwotI2VuZGlmCi0gICAgc3RydWN0IG5laWdoYm91ciAqX25laWdoYm91ciA9IE5VTEw7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm91dCA9IHN0YXRlLT5vdXQ7Ci0KLQotICAgIC8vv+zL2deqt6LX3L+qudgKLSAgICBpZiAoZmFzdG5hdF9sZXZlbCA9PSBGQVNUX0NMT1NFIHx8IGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9DTE9TRV9LRUVQX0xJTkspCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIC8v1rvT0FRDUKGiVURQ1qez1mZhc3SjrElDTVDV0rW9tcRjdL/JxNzKx1RDUKGiVURQtcSjrMD9yOc6ILbLv9qyu7/JtO+jrMv50tSx2NDrz9TKvsXQts8KLSAgICBpZiAoaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fVENQICYmIGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1VEUCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotICAgIC8vv+zL2deqt6LX07mmxNzOu828v6q52AotCi0gICAgaWYgKCF0ZXN0X2JpdChGQVNUX1RZUEVfVkVSU0lPTl9CSVQsICZmYXN0X3N3aXRjaCkKLSAgICAgICAgICAgIHx8ICF0ZXN0X2JpdChGQVNUX1RZUEVfRlc0X0JJVCwgJmZhc3Rfc3dpdGNoKSApCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIGlmICghb3V0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICAvL7njsqWhotfpsqWyu72owbQKLSAgICBpZiAoaXB2NF9pc19tdWx0aWNhc3QoaXBfaGRyKHNrYiktPmRhZGRyKSB8fCBpcHY0X2lzX2xiY2FzdChpcF9oZHIoc2tiKS0+ZGFkZHIpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICBpZighZHN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICBfbmVpZ2hib3VyID0gZHN0X25laWdoX2xvb2t1cF9za2IoZHN0LCBza2IpOwotICAgIGlmICghX25laWdoYm91cikKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotICAgIGlmIChtZW1jbXAoX25laWdoYm91ci0+aGEsIHplcm9tYWMsIEVUSF9BTEVOKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKCEoc2tiLT5kZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSkKLSAgICAgICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIC8qvOyy6bD8s6S2yMrHt/GzrLn9s/a/2snosbhNVFUqLwotICAgIGlmIChkc3QtPmRldiAmJiAoc2tiLT5sZW4gPiBkc3QtPmRldi0+bXR1KSkKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIGN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0KLSAgICBpZiAoIWN0KQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgcHJvdG9jb2wgPSBuZl9jdF9wcm90b251bShjdCk7Ci0KLSAgICBpZiAoY3QtPm1hc3RlciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RydWN0IG5mX2Nvbm5faGVscCAqdGVtcF9oZWxwID0gbmZjdF9oZWxwKGN0KTsKLSAgICAgICAgLy+21NPaxLPM9cG0vdPJz7Tm1NpoZWxwtci5s9fTo6yx2NDrvbvTyWxpbnV4serXosTausu0psDto6y38dTyxNq6y7K7xNy78cihz+C52LXEyv2+3bD80MXPogotICAgICAgICBpZih0ZW1wX2hlbHAhPU5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gYWNjZXB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogb25seSBmb3J3YXJkICovCi0gICAgaWYgKCFza2ItPnNrYl9paWYpCi0gICAgewotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0KLSAgICAvL7n9wsuyu9Do0qq+rbn9ZmFzdG5hdLXE0K3S6bD8LLj5vt22y7/ausW9+NDQuf3CywotICAgIGlmIChjaGVja19za2lwX3BvcnRzKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudS5hbGwpKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgZGlyID0gQ1RJTkZPMkRJUihjdGluZm8pOwotCi0gICAgcmRpciA9IChJUF9DVF9ESVJfT1JJR0lOQUwgPT0gZGlyKSA/IElQX0NUX0RJUl9SRVBMWTogSVBfQ1RfRElSX09SSUdJTkFMOwotCi0gICAgLyrWu9XrttRUQ1AvVURQvfjQ0GZhc3RuYXQqLwotICAgIGlmIChJUFBST1RPX1RDUCA9PSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIC8qVENQyP20zs7VytazybmmKi8KLSAgICAgICAgaWYoIXRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChJUFBST1RPX1VEUCAhPSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIHNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgaWYgKGN0LT5mYXN0X2N0LmZhc3RfZHN0W2Rpcl0gJiYgKGN0LT5mYXN0X2N0LmZhc3RfZHN0W2Rpcl0gIT0gZHN0KSkKLSAgICB7Ci0gICAgICAgIGZhc3RfZndfY29ubl9yZWxlYXNlKGN0KTsKLSAgICB9Ci0KLSAgICBpZiAoIWN0LT5mYXN0X2N0LmZhc3RfZHN0W2Rpcl0pCi0gICAgewotICAgICAgICByY3VfYXNzaWduX3BvaW50ZXIoY3QtPmZhc3RfY3QuZmFzdF9kc3RbZGlyXSwgZHN0KTsKLSAgICAgICAgY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbZGlyXSA9IGdldEJyaWRnZVBvcnQoX25laWdoYm91ciwgb3V0KTsKLSAgICAgICAgZmFzdF9kc3RfYWRkX2N0KGRzdCwgY3QpOwotICAgIH0KLQotICAgIGN0LT5mYXN0X2N0LmlzRmFzdCA9IEZBU1RfQ1RfRlc0OwotICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0X2Z3X3NwaW5sb2NrKTsKLQotYWNjZXB0OgotCi0gICAgbmVpZ2hfcmVsZWFzZShfbmVpZ2hib3VyKTsKLSAgICByZXR1cm4gTkZfQUNDRVBUOwotfQotCi1zdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGZhc3Q0X2Z3X2hvb2sgPSB7Ci0gICAgLmhvb2sgPSBuYXB0X2hhbmRsZTRfZncsCi0gICAgLy8ub3duZXIgPSBUSElTX01PRFVMRSwKLSAgICAucGYgPSBQRl9JTkVULAotICAgIC5ob29rbnVtID0gTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0gICAgLnByaW9yaXR5ID0gTkZfSVBfUFJJX0xBU1QsCi19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBvcnRfbWF0Y2godV9pbnQxNl90IG1pbiwgdV9pbnQxNl90IG1heCwgdV9pbnQxNl90IHBvcnQsIGJvb2wgaW52ZXJ0KQotewotCXJldHVybiAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OwotfQotCi1zdGF0aWMgYm9vbCBjdGFibGVfbXQoc3RydWN0IG5mX2Nvbm4qIGN0LCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsaW50IGRpciwgaW50KiBtYXRjaF9maWx0ZXIpCi17Ci0JY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwotCi0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCi0JCQludG9ocyhjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuc3JjLnUudGNwLnBvcnQpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX1NSQ1BUKSkpCi0JCXJldHVybiBmYWxzZTsKLQlpZigodGNwaW5mby0+c3B0c1swXSB8fCB0Y3BpbmZvLT5zcHRzWzFdKSBeICghISh0Y3BpbmZvLT5pbnZmbGFncyAmIFhUX1RDUF9JTlZfU1JDUFQpKSkKLQkJKm1hdGNoX2ZpbHRlciA9IDE7Ci0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPmRwdHNbMF0sIHRjcGluZm8tPmRwdHNbMV0sCi0JCQludG9ocyhjdC0+dHVwbGVoYXNoW2Rpcl0udHVwbGUuZHN0LnUudGNwLnBvcnQpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX0RTVFBUKSkpCi0JCXJldHVybiBmYWxzZTsKLQlpZigodGNwaW5mby0+ZHB0c1swXSB8fCB0Y3BpbmZvLT5kcHRzWzFdKSBeICghISh0Y3BpbmZvLT5pbnZmbGFncyAmIFhUX1RDUF9JTlZfRFNUUFQpKSkKLQkJKm1hdGNoX2ZpbHRlciA9IDE7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaXBfcGFja2V0X21hdGNoKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwaW5mbyxzdHJ1Y3QgbmZfY29ubiogY3QsaW50IGRpciwgaW50KiBtYXRjaF9maWx0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyByZXQ7Ci0JaWYgKE5GX0lOVkYoaXBpbmZvLCBJUFRfSU5WX1NSQ0lQLAotCQkgICAgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5zcmMudTMuaXAgJiBpcGluZm8tPnNtc2suc19hZGRyKSAhPSBpcGluZm8tPnNyYy5zX2FkZHIpIHx8Ci0JICAgIE5GX0lOVkYoaXBpbmZvLCBJUFRfSU5WX0RTVElQLAotCQkgICAgKGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QudTMuaXAgJiBpcGluZm8tPmRtc2suc19hZGRyKSAhPSBpcGluZm8tPmRzdC5zX2FkZHIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYoaXBpbmZvLT5zcmMuc19hZGRyIHx8IGlwaW5mby0+ZHN0LnNfYWRkcikKLQkJKm1hdGNoX2ZpbHRlciA9IDE7Ci0KLQlpZihjdC0+aW5kZXZbZGlyXSAhPSBOVUxMKQotCXsKLQkJcmV0ID0gaWZuYW1lX2NvbXBhcmVfYWxpZ25lZChjdC0+aW5kZXZbZGlyXS0+bmFtZSwgaXBpbmZvLT5pbmlmYWNlLCBpcGluZm8tPmluaWZhY2VfbWFzayk7Ci0JfQotCQotCWlmKGlwaW5mby0+aW5pZmFjZVswXSAhPSAnXDAnKQotCQkqbWF0Y2hfZmlsdGVyID0gMTsKLQkJCi0JaWYgKE5GX0lOVkYoaXBpbmZvLCBJUFRfSU5WX1ZJQV9JTiwgcmV0ICE9IDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYoY3QtPm91dGRldltkaXJdICE9IE5VTEwpCi0JewotCQlyZXQgPSBpZm5hbWVfY29tcGFyZV9hbGlnbmVkKGN0LT5vdXRkZXZbZGlyXS0+bmFtZSwgaXBpbmZvLT5vdXRpZmFjZSwgaXBpbmZvLT5vdXRpZmFjZV9tYXNrKTsKLQl9Ci0KLQlpZihpcGluZm8tPm91dGlmYWNlWzBdICE9ICdcMCcpCi0JCSptYXRjaF9maWx0ZXIgPSAxOwotCi0JaWYgKE5GX0lOVkYoaXBpbmZvLCBJUFRfSU5WX1ZJQV9PVVQsIHJldCAhPSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGlwaW5mby0+cHJvdG8gJiYKLQkgICAgTkZfSU5WRihpcGluZm8sIElQVF9JTlZfUFJPVE8sIGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZS5kc3QucHJvdG9udW0gIT0gaXBpbmZvLT5wcm90bykpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWlwX3BhY2tldF9tYXRjaF9uZWcoY29uc3Qgc3RydWN0IGlwdF9pcCAqaXBpbmZvLHN0cnVjdCBuZl9jb25uKiBjdCxpbnQgZGlyLCBpbnQqIG1hdGNoX2ZpbHRlcikKLXsKLQl1bnNpZ25lZCBsb25nIHJldDsKLQlpZiAoTkZfSU5WRihpcGluZm8sIElQVF9JTlZfU1JDSVAsCi0JCSAgICAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC51My5pcCAmIGlwaW5mby0+c21zay5zX2FkZHIpICE9IGlwaW5mby0+c3JjLnNfYWRkcikgfHwKLQkgICAgTkZfSU5WRihpcGluZm8sIElQVF9JTlZfRFNUSVAsCi0JCSAgICAoY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLnNyYy51My5pcCAmIGlwaW5mby0+ZG1zay5zX2FkZHIpICE9IGlwaW5mby0+ZHN0LnNfYWRkcikpCi0JCXJldHVybiBmYWxzZTsKLQlpZihpcGluZm8tPnNyYy5zX2FkZHIgfHwgaXBpbmZvLT5kc3Quc19hZGRyKQotCQkqbWF0Y2hfZmlsdGVyID0gMTsKLQotCWlmKGN0LT5vdXRkZXZbZGlyXSAhPSBOVUxMKQotCXsKLQkJcmV0ID0gaWZuYW1lX2NvbXBhcmVfYWxpZ25lZChjdC0+b3V0ZGV2W2Rpcl0tPm5hbWUsIGlwaW5mby0+aW5pZmFjZSwgaXBpbmZvLT5pbmlmYWNlX21hc2spOwotCX0KLQkKLQlpZihpcGluZm8tPmluaWZhY2VbMF0gIT0gJ1wwJykKLQkJKm1hdGNoX2ZpbHRlciA9IDE7Ci0JCQotCWlmIChORl9JTlZGKGlwaW5mbywgSVBUX0lOVl9WSUFfSU4sIHJldCAhPSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmKGN0LT5pbmRldltkaXJdICE9IE5VTEwpCi0JewotCQlyZXQgPSBpZm5hbWVfY29tcGFyZV9hbGlnbmVkKGN0LT5pbmRldltkaXJdLT5uYW1lLCBpcGluZm8tPm91dGlmYWNlLCBpcGluZm8tPm91dGlmYWNlX21hc2spOwotCX0KLQotCWlmKGlwaW5mby0+b3V0aWZhY2VbMF0gIT0gJ1wwJykKLQkJKm1hdGNoX2ZpbHRlciA9IDE7Ci0KLQlpZiAoTkZfSU5WRihpcGluZm8sIElQVF9JTlZfVklBX09VVCwgcmV0ICE9IDApKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoaXBpbmZvLT5wcm90byAmJgotCSAgICBORl9JTlZGKGlwaW5mbywgSVBUX0lOVl9QUk9UTywgY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlLmRzdC5wcm90b251bSAhPSBpcGluZm8tPnByb3RvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwdF9lbnRyeSAqCi1nZXRfZW50cnkoY29uc3Qgdm9pZCAqYmFzZSwgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gKHN0cnVjdCBpcHRfZW50cnkgKikoYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXN0cnVjdCBpcHRfZW50cnkgKmlwdF9uZXh0X2VudHJ5KGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmVudHJ5KQotewotCXJldHVybiAodm9pZCAqKWVudHJ5ICsgZW50cnktPm5leHRfb2Zmc2V0OwotfQotCi0KLQotLy/NrLK9Y3TNs7zG0MXPorW9aXB0YWJsZXMszayyvdbcxtrU3baoMXMKLXN0YXRpYyBpbnQgY3RfaXB0YWJsZXNfc3luX3RocmVhZCh2b2lkICpwYXJhbSkKLXsKLQl3aGlsZSAoMSkgCi0JewotCQlpZihjdF9pcHRhYmxlc19zeW5fc3cpCi0JCXsKLQkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmN0X2lwdGFibGVzX2JoKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJLy/Dv7TOzayyvbzkuPTOqjFzLgotCQl9Ci0JCW1zbGVlcCgxKjEwMDApOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjdF9pcHRhYmxlc19zeW5faGFuZGxlKHN0cnVjdCBuZl9jb25uICpjdCxzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSxpbnQgdGFibGVfaWQpCi17Ci0Jdm9pZCAqdGFibGVfYmFzZTsKLQlzdHJ1Y3QgaXB0X2VudHJ5ICplOwotCWNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqZW1hdGNoOwotCXN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gYWNwYXI7Ci0Jc3RydWN0IHh0X2NvdW50ZXJzICpjb3VudGVyOwotCWludCBtYXRjaF9mbGFnID0gMDsKLQlpbnQgbWF0Y2hfZmlsdGVyID0gMDsKLQlpbnQgbnVtID0gMDsKLQotCi0JdGFibGVfYmFzZSA9IHByaXZhdGUtPmVudHJpZXM7Ci0JbnVtID0gcHJpdmF0ZS0+bnVtYmVyOwotCXN3aXRjaCh0YWJsZV9pZCkKLQl7Ci0JCWNhc2UgMDoKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbTkZfSU5FVF9QUkVfUk9VVElOR10pOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+aG9va19lbnRyeVtORl9JTkVUX0xPQ0FMX0lOXSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQl3aGlsZShudW0tLSkKLQl7Ci0JCW1hdGNoX2ZsYWcgPSAwOwotCQltYXRjaF9maWx0ZXIgPSAwOwotCQlpZighaXBfcGFja2V0X21hdGNoKCZlLT5pcCwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCwmbWF0Y2hfZmlsdGVyKSAmJgotCQkJIWlwX3BhY2tldF9tYXRjaF9uZWcoJmUtPmlwLCBjdCwgSVBfQ1RfRElSX1JFUExZLCZtYXRjaF9maWx0ZXIpKQotCQl7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl4dF9lbWF0Y2hfZm9yZWFjaChlbWF0Y2gsIGUpIAotCQkJewotCQkJCWFjcGFyLm1hdGNoaW5mbyA9IGVtYXRjaC0+ZGF0YTsKLQkJCQlpZiAoIWN0YWJsZV9tdChjdCwgJmFjcGFyLCBJUF9DVF9ESVJfT1JJR0lOQUwsJm1hdGNoX2ZpbHRlcikpCi0JCQkJewotCQkJCQltYXRjaF9mbGFnID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJfQotCQkJfQotCQkJaWYoIW1hdGNoX2ZsYWcpCi0JCQl7Ci0JCQkJaWYobWF0Y2hfZmlsdGVyKQotCQkJCXsKLQkJCQkJY291bnRlciA9IHh0X2dldF90aGlzX2NwdV9jb3VudGVyKCZlLT5jb3VudGVycyk7Ci0JCQkJCUFERF9DT1VOVEVSKCpjb3VudGVyLCBjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyxjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzKTsKLQkJCQl9Ci0JCQkJZSA9IGlwdF9uZXh0X2VudHJ5KGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbWF0Y2hfZmxhZyA9IDA7Ci0JCQltYXRjaF9maWx0ZXIgPSAwOwotCQl9Ci0JCQotCQlpZiAoIWlwX3BhY2tldF9tYXRjaCgmZS0+aXAsIGN0LCBJUF9DVF9ESVJfUkVQTFksJm1hdGNoX2ZpbHRlcikgJiYKLQkJCSFpcF9wYWNrZXRfbWF0Y2hfbmVnKCZlLT5pcCwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCwmbWF0Y2hfZmlsdGVyKSkKLQkJewotCQkJZSA9IGlwdF9uZXh0X2VudHJ5KGUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl4dF9lbWF0Y2hfZm9yZWFjaChlbWF0Y2gsIGUpIAotCQkJewotCQkJCWFjcGFyLm1hdGNoaW5mbyA9IGVtYXRjaC0+ZGF0YTsKLQkJCQlpZiAoIWN0YWJsZV9tdChjdCwgJmFjcGFyLCBJUF9DVF9ESVJfUkVQTFksJm1hdGNoX2ZpbHRlcikpCi0JCQkJewotCQkJCQltYXRjaF9mbGFnID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYoIW1hdGNoX2ZsYWcpCi0JCQl7Ci0JCQkJaWYobWF0Y2hfZmlsdGVyKQotCQkJCXsKLQkJCQkJY291bnRlciA9IHh0X2dldF90aGlzX2NwdV9jb3VudGVyKCZlLT5jb3VudGVycyk7Ci0JCQkJCUFERF9DT1VOVEVSKCpjb3VudGVyLCBjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX1JFUExZXS5ieXRlcyxjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzKTsKLQkJCQl9Ci0JCQkJZSA9IGlwdF9uZXh0X2VudHJ5KGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIGN0X2lwdGFibGVzX2JoZnVuYyh1bnNpZ25lZCBsb25nIHBhcmFtKQotewotCWludCBoYXNoID0gMDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwotCXN0cnVjdCBuZXQgKiBuZXQ7Ci0JdW5zaWduZWQgaW50IGFkZGVuZDsKLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JYWRkZW5kID0geHRfd3JpdGVfcmVjc2VxX2JlZ2luKCk7Ci0JZm9yKGhhc2ggPSAwOyBoYXNoIDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBoYXNoKyspCi0gICAgewotCSAgIAlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCxuLCZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSxobm5vZGUpCi0JCXsKLQkgICAJCWlmKGgpCi0JCQl7Ci0JICAgCQkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQkJCWlmKGN0LT5mYXN0X2N0LmlzRmFzdCkKLQkJCQl7Ci0JCQkJCW5ldCA9IG5mX2N0X25ldChjdCk7Ci0JCQkJCXByaXZhdGUgPSBSRUFEX09OQ0UobmV0LT5pcHY0LmlwdGFibGVfcmF3LT5wcml2YXRlKTsKLQkJCQkJY3RfaXB0YWJsZXNfc3luX2hhbmRsZShjdCxwcml2YXRlLElQVEFCTEVfUkFXKTsKLQkJCQkJcHJpdmF0ZSA9IFJFQURfT05DRShuZXQtPmlwdjQuaXB0YWJsZV9tYW5nbGUtPnByaXZhdGUpOwotCQkJCQljdF9pcHRhYmxlc19zeW5faGFuZGxlKGN0LHByaXZhdGUsSVBUQUJMRV9NQU5HTEUpOwotCQkJCQlwcml2YXRlID0gUkVBRF9PTkNFKG5ldC0+aXB2NC5uYXRfdGFibGUtPnByaXZhdGUpOwotCQkJCQljdF9pcHRhYmxlc19zeW5faGFuZGxlKGN0LHByaXZhdGUsSVBUQUJMRV9OQVQpOwotCQkJCQlwcml2YXRlID0gUkVBRF9PTkNFKG5ldC0+aXB2NC5pcHRhYmxlX2ZpbHRlci0+cHJpdmF0ZSk7CQotCQkJCQljdF9pcHRhYmxlc19zeW5faGFuZGxlKGN0LHByaXZhdGUsSVBUQUJMRV9GSUxURVIpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWNvbnRpbnVlOwotCQkJCXNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0JCQkJY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMgPSAwOwotCQkJCWN0LT5wYWNrZXRfaW5mb1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHMgPSAwOwotCQkJCWN0LT5wYWNrZXRfaW5mb1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzID0gMDsKLQkJCQljdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzID0gMDsKLQkJCQlzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0JCQl9Ci0JICAgCX0KLSAgICB9Ci0JeHRfd3JpdGVfcmVjc2VxX2VuZChhZGRlbmQpOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotfQotCi0KLWludCBmYXN0NF9md19pbml0KHZvaWQpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICByZXQgPSBuZl9yZWdpc3Rlcl9uZXRfaG9vaygmaW5pdF9uZXQsICZmYXN0NF9md19ob29rKTsKLSAgICBpZiAocmV0ICE9IDApCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0VSUiwiaW5pdCBmYXN0NF9md19pbml0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBwcmludF9zdW4oU1VOX0RCRywiaW5pdCBmYXN0NF9md19pbml0IGRvbmVcbiIpOwotCQotCWN0X2lwdGFibGVzX2JoLmZ1bmMgPSBjdF9pcHRhYmxlc19iaGZ1bmM7Ci0JY3RfaXB0YWJsZXNfc3luID0ga3RocmVhZF9jcmVhdGUoY3RfaXB0YWJsZXNfc3luX3RocmVhZCwgKHZvaWQgKikwLCAiY3RfaXB0YWJsZXNfc3luIiApOwotICAgIGlmICghSVNfRVJSKGN0X2lwdGFibGVzX3N5bikpCi0gICAgewotICAgICAgICBwcmludGsoIm50bF9zeW5fdGFzayB0aHJlYWQncyBpbml0IGlzIHN1Y2MiKTsKLSAgICAgICAgd2FrZV91cF9wcm9jZXNzKGN0X2lwdGFibGVzX3N5bik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBmYXN0NF9md19jbGVhbnVwKHZvaWQpCi17Ci0gICAgZmFzdF9yZWxlYXNlX2FsbChSRUxFQVNFX0FMTF9EU1QpOwotICAgIG5mX3VucmVnaXN0ZXJfbmV0X2hvb2soJmluaXRfbmV0LCAmZmFzdDRfZndfaG9vayk7Ci0JaWYgKGN0X2lwdGFibGVzX3N5bikgCi0JewotICAgIAlrdGhyZWFkX3N0b3AoY3RfaXB0YWJsZXNfc3luKTsKLSAgICAJY3RfaXB0YWJsZXNfc3luID0gTlVMTDsKLQl9Ci0JdGFza2xldF9raWxsKCZjdF9pcHRhYmxlc19iaCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdDYuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdDYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVmYWI5Yy4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3Q2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotLyogKiBDb3B5cmlnaHQgKGMpIDIwMTEgUXVhbGNvbW0gQXRoZXJvcywgSW5jLiAqICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbXVsdGlwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2lwcmFuZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RjcC5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9TSS9mYXN0Ni5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRpb2NfcHJvYy5oPgotI2luY2x1ZGUgPG5ldC9TSS9wcmludF9zdW4uaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldF90cmFjay5oPgotCi0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyogKioqKioqKioqKioqKioqKiogaXB2NiC/7MvZ16q3os/gudix5MG/ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3BpbmxvY2tfdCBmYXN0Nl9zcGlubG9jazsgLy/X1ND9y/ijrLGju6TBtLHttcSy2df3Ci1mYXN0X2xpc3RfdCB3b3JraW5nX2xpc3Q2ID0gezB9Owotc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKndvcmtpbmdfaGFzaDY7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqILqvyv3J6sP3ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqILqvyv3Ktc/WICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gaXB2NrGozbfAqdW50aHP7qOsxdC2z8rHt/Gw/LqsbDRoZWFkCi1zdGF0aWMgaW50IGlwNm5vbDRoZWFkKGludCB0eXBlKQotewotICAgIGludCBpLCBjb3VudDsKLSAgICBpbnQgb3B0YXJyYXlbXSA9IHtJUFBST1RPX0VTUH07IC8v1N3KsbX3ytTWu9aqtcBFU1CjrL2rwLTR0L6/0K3S6brzwKnVuQotCi0gICAgY291bnQgPSBzaXplb2Yob3B0YXJyYXkpL3NpemVvZihvcHRhcnJheVswXSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBvcHRhcnJheVtpXSkKLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8qxdC2z8rHt/HKx0lQVjbAqdW5zbcqLwotc3RhdGljIGludCBpcDZvcHRpb24oaW50IHR5cGUpCi17Ci0gICAgaW50IGksIG9wdGFycmF5WzhdID0ge0lQUFJPVE9fSE9QT1BUUywgSVBQUk9UT19JUFY2LCBJUFBST1RPX1JPVVRJTkcsIElQUFJPVE9fRlJBR01FTlQsCi0gICAgICAgICAgICBJUFBST1RPX0VTUCwgSVBQUk9UT19BSCwgSVBQUk9UT19EU1RPUFRTLCBJUFBST1RPX05PTkV9OwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgewotICAgICAgICBpZiAodHlwZSA9PSBvcHRhcnJheVtpXSkKLSAgICAgICAgICAgIHJldHVybihvcHRhcnJheVtpXSk7Ci0gICAgfQotICAgIHJldHVybiAoMCk7Ci19Ci0KLS8vc2tiLT5kYXRh0OjSqta4z/JpcM23Ci0vKsz4uf1JUFY2zbe8sMCp1bnNt6Os1rjP8kw0zbcssqK3tbvYTDTQrdLpwODQzSovCi11bnNpZ25lZCBjaGFyICpnZXRpcHY2dXBwa2codW5zaWduZWQgY2hhciAqaXBwa2csIHVuc2lnbmVkIGNoYXIgKnByb3RvY29sLCBpbnQgKnVwcGtnbGVuKQotewotICAgIHVuc2lnbmVkIGNoYXIgKmlwcGtncG9zID0gaXBwa2cgKyA0MDsKLSAgICBzdHJ1Y3QgaXA2X2hkciAqaGRyID0gKHN0cnVjdCBpcDZfaGRyICopaXBwa2c7Ci0gICAgc3RydWN0IGlwNl9vcHRoZHIgKm9wdGhkcjsKLSAgICBpbnQgaXA2aGRybGVuOwotICAgIGludCBwcm90byA9IDA7Ci0KLSAgICBwcm90byA9IGlwNm9wdGlvbihoZHItPmlwNl9ueHQpOwotICAgIGlmIChwcm90bykKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotI2lmIDAKLSAgICAgICAgaWYgKGlwNm5vbDRoZWFkKHByb3RvKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICAgIG9wdGhkciA9KHN0cnVjdCBpcDZfb3B0aGRyICopaXBwa2dwb3M7Ci0gICAgICAgIHdoaWxlIChwcm90byA9IGlwNm9wdGlvbihvcHRoZHItPm54dCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpcDZub2w0aGVhZChwcm90bykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBpcHBrZ3BvcyArPSAob3B0aGRyLT5sZW4gKyAxKSA8PCAzOwotICAgICAgICAgICAgb3B0aGRyID0gKHN0cnVjdCBpcDZfb3B0aGRyICopaXBwa2dwb3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3RvY29sKQotICAgICAgICAgICAgKnByb3RvY29sID0gb3B0aGRyLT5ueHQ7Ci0gICAgICAgIGlwcGtncG9zICs9IChvcHRoZHItPmxlbiArIDEpIDw8IDM7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpZiAocHJvdG9jb2wpCi0gICAgICAgICAgICAqcHJvdG9jb2wgPSBoZHItPmlwNl9ueHQ7Ci0gICAgICAgIAotICAgIGlwNmhkcmxlbiA9IGlwcGtncG9zIC0gaXBwa2c7Ci0gICAgCi0gICAgaWYgKHVwcGtnbGVuKQotICAgICAgICAqdXBwa2dsZW4gPSBudG9ocyhoZHItPmlwNl9wbGVuKSArIDQwIC0gaXA2aGRybGVuOwotICAgIAotICAgIHJldHVybiAoaXBwa2dwb3MpOwotfQotCi0vKrvxyKFJUFY2zuXUqtfp0MXPoqOsxL/HsL32tKbA7VRDUC9VRFAvSUNNULD8Ki8KLWludCBmYXN0Nl9nZXRfdHVwbGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0gICAgaWYgKCFza2IgfHwgIXR1cGxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBfX3U4IG5leHRfaGRyOwotICAgIHVuc2lnbmVkIGNoYXIgKmw0aGVhZDsKLSAgICBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiLT5kYXRhOwotICAgIHN0cnVjdCB1ZHBoZHIgKnVkcGggPSBOVUxMOwotICAgIHN0cnVjdCB0Y3BoZHIgKnRjcGggPSBOVUxMOwotICAgIHN0cnVjdCBpY21wNmhkciAqaWNtcGggPSBOVUxMOwotCi0KLSAgICAvKiBvbmx5IElQdjYgcGFja2V0cyAqLyAgICAKLSAgICBpZiAoaHRvbnMoRVRIX1BfSVBWNikgIT0gc2tiLT5wcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+PSAwKQotICAgIHsKLSAgICAgICAgbDRoZWFkID0gZ2V0aXB2NnVwcGtnKHNrYi0+ZGF0YSwgJm5leHRfaGRyLCBOVUxMKTsKLSAgICAgICAgaWYgKGw0aGVhZCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAKLSAgICBtZW1zZXQodHVwbGUsIDAsIHNpemVvZihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlKSk7Ci0KLSAgICAvKiBvbmx5IHRjcC91ZHAgKi8KLSAgICBpZiAoTkVYVEhEUl9VRFAgPT0gbmV4dF9oZHIpCi0gICAgewotICAgICAgICB1ZHBoID0gKHN0cnVjdCB1ZHBoZHIgKilsNGhlYWQ7Ci0gICAgICAgIHR1cGxlLT5zcmMudS51ZHAucG9ydCA9IHVkcGgtPnNvdXJjZTsKLSAgICAgICAgdHVwbGUtPmRzdC51LnVkcC5wb3J0ID0gdWRwaC0+ZGVzdDsKLSAgICAgICAgc2tiX3VkcG51bSsrOwotICAgIH0KLSAgICBlbHNlIGlmIChORVhUSERSX1RDUCA9PSBuZXh0X2hkcikKLSAgICB7Ci0gICAgICAgIHRjcGggPSAoc3RydWN0IHRjcGhkciAqKWw0aGVhZDsKLSAgICAgICAgdHVwbGUtPnNyYy51LnRjcC5wb3J0ID0gdGNwaC0+c291cmNlOwotICAgICAgICB0dXBsZS0+ZHN0LnUudGNwLnBvcnQgPSB0Y3BoLT5kZXN0OwotICAgICAgICBza2JfdGNwbnVtKys7Ci0gICAgfQotICAgIGVsc2UgaWYgKE5FWFRIRFJfSUNNUCA9PSBuZXh0X2hkcikKLSAgICB7Ci0gICAgICAgIGljbXBoID0gKHN0cnVjdCBpY21wNmhkciAqKWw0aGVhZDsgLyogcG9pbnQgdG8gSUNNUHY0IGhlYWRlciAqLwotICAgICAgICB0dXBsZS0+c3JjLnUuaWNtcC5pZCA9IGljbXBoLT5pY21wNl9pZGVudGlmaWVyOwotICAgICAgICB0dXBsZS0+ZHN0LnUuaWNtcC50eXBlID0gaWNtcGgtPmljbXA2X3R5cGU7Ci0gICAgICAgIHR1cGxlLT5kc3QudS5pY21wLmNvZGUgPSBpY21waC0+aWNtcDZfY29kZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHR1cGxlLT5zcmMubDNudW0gPSBBRl9JTkVUNjsKLSAgICB0dXBsZS0+c3JjLnUzLmluNiA9IGlwaC0+c2FkZHI7Ci0gICAgdHVwbGUtPmRzdC51My5pbjYgPSBpcGgtPmRhZGRyOwotICAgIHR1cGxlLT5kc3QucHJvdG9udW0gPSBuZXh0X2hkcjsKLSAgICB0dXBsZS0+ZHN0LmRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsKLQotICAgIHJldHVybiAwOwotfQotCi0vL7TLtKbQ6NKqsaOz1rrNZGV2X3htaXRfY29tcGxldGXSu9bCCi0vL9PDaW5saW5lzt63qMzhyKG1vbmrubLOxLz+1tCjrNa7xNxmYXN0bmF0oaJmYXN0Nrj3t8XSu7fdCi1zdGF0aWMgaW5saW5lIGJvb2wgc3RhcnRfeG1pdF9jb21wbGV0ZShpbnQgcmMpCi17Ci0gICAgLyoKLSAgICAgKiBQb3NpdGl2ZSBjYXNlcyB3aXRoIGFuIHNrYiBjb25zdW1lZCBieSBhIGRyaXZlcjoKLSAgICAgKiAtIHN1Y2Nlc3NmdWwgdHJhbnNtaXNzaW9uIChyYyA9PSBORVRERVZfVFhfT0spCi0gICAgICogLSBlcnJvciB3aGlsZSB0cmFuc21pdHRpbmcgKHJjIDwgMCkKLSAgICAgKiAtIGVycm9yIHdoaWxlIHF1ZXVlaW5nIHRvIGEgZGlmZmVyZW50IGRldmljZSAocmMgJiBORVRfWE1JVF9NQVNLKQotICAgICAqLwotICAgIGlmIChsaWtlbHkocmMgPCBORVRfWE1JVF9NQVNLKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vaXB2Nsr9vt2w/LXEv+zL2bSmwO2jrGhhc2jTw1JDVbv61sa9+NDQsaO7pKOs19y1xMGsvdPBtLHt08NzcGluvfjQ0LGju6QKLWludCBmYXN0Nl9yZWN2KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZTsKLSAgICBmYXN0X2VudHJ5X2RhdGFfdCAqZmFzdDZfZW50cnlfZGF0YSA9IE5VTEw7Ci0gICAgZmFzdF9lbnRyeV90ICpmYXN0Nl9lbnRyeSA9IE5VTEw7Ci0gICAgc3RydWN0IHRjcGhkciAqdGNwaCA9IE5VTEw7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0gICAgX191OCBuZXh0X2hkciA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqbDRoZWFkOwotICAgIHN0cnVjdCBpcHY2aGRyICppcDY7Ci0gICAgCi0gICAgcHJpbnRfc3VuKFNVTl9EQkcsICJlbnRlciBmYXN0XzZfcmVjdiBcbiIpOwotCi0gICAgaWYgKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9DTE9TRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoZmFzdDZfZ2V0X3R1cGxlKHNrYiwgJnR1cGxlKSA8IDApCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3RfNl9yZWN2IGdldCB0dXBsZSBlcnIgXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIGlwNiA9IGlwdjZfaGRyKHNrYik7Ci0gICAgaWYgKGlwNi0+bmV4dGhkciAhPSBJUFBST1RPX1RDUCAmJiBpcDYtPm5leHRoZHIgIT0gSVBQUk9UT19VRFApCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHJjdV9yZWFkX2xvY2soKTsKLQotICAgIGZhc3Q2X2VudHJ5X2RhdGEgPSBmYXN0X2ZpbmRfZW50cnlfZGF0YSh3b3JraW5nX2hhc2g2LCAmdHVwbGUpOwotICAgIGlmIChmYXN0Nl9lbnRyeV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLQotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3RfNl9yZWN2IGZhc3RfNl9maW5kIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8qxdC2z7GozsSzpLbIyse38bOsuf2z9r/aREVWtcRNVFUqLwotICAgIGRldiA9IGZhc3Q2X2VudHJ5X2RhdGEtPm91dGRldjsKLSAgICBpZiAoIWRldiB8fCAoc2tiLT5sZW4gPiBkZXYtPm10dSkpCi0gICAgewotICAgICAgICBza2JpbmZvX2FkZChOVUxMLCBTS0JfT1ZFUl9NVFUpOwotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLQotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3RfNl9yZWN2IG91dGRldiBlcnIgXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8vu9i0q7XEsPzWsb3Tys23xbKivMbK/QotICAgIGlmIChzdHJjbXAoc2tiLT5kZXYtPm5hbWUsIGRldi0+bmFtZSkgPT0gMCkKLSAgICB7Ci0gICAgICAgIHNrYmluZm9fYWRkKE5VTEwsIFNLQl9MT09QKTsKLSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLSAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHByaW50aygibG9vcGJhY2sgc2tiLCBmcmVlIHNrYlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGZhc3Q2X2VudHJ5ID0gZmFzdF9kYXRhX3RvX2VudHJ5KGZhc3Q2X2VudHJ5X2RhdGEpOwotICAgIGlmICghZmFzdDZfZW50cnkpCi0gICAgewotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLQotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3RfNl9yZWN2IGZhc3Q2X2VudHJ5IGlzIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyog1rvT0LWxy6vP8r/sy9nBtL3Ttry9qMGis8m5prLF199GQVNUTkFUo6y38dTy19+x6te8wfezzCAqLwotCS8qIHVkcLK70OjSqsurz/K9qMG0ICAgICAgICAqLwotCWlmICgoZmFzdDZfZW50cnktPmZsYWdzICE9IEZBU1RfQUxMX0RJUikgJiYgKGlwdjZfaGRyKHNrYiktPm5leHRoZHIgIT0gSVBQUk9UT19VRFApKQotICAgIHsKLSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0XzZfcmVjdiBmbGFncyBpcyBub3QgRkFTVF9BTExfRElSIFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qzPi5/UlQVjbNt6Osu/HIoUw0zbfWuNXrKi8KLSAgICBsNGhlYWQgPSBnZXRpcHY2dXBwa2coc2tiLT5kYXRhLCAmbmV4dF9oZHIsIE5VTEwpOwotICAgIGlmIChsNGhlYWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJjdV9yZWFkX3VubG9jaygpOwotCi0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiZmFzdF82X3JlY3YgbDRoZWFkIGlzIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0KLQotICAgIGlmICghKHNrYiA9IGZhc3RfZXhwYW5kX2hlYWRyb29tX3Y2KHNrYiwgZGV2KSkpewotCQlyY3VfcmVhZF91bmxvY2soKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgZmFzdF90Y3BkdW1wKHNrYik7Ci0gICAgCi0gICAgLy/I57n716Ww/MP81tCjrMr9vt274WNsb25lo6xmYXN0s8m5ptDo0qq4xLHkZGF0YcTayN2jrNDo0qrW2NDCY29wedK7t90KLSAgICBpZiAoc2tiX2Nsb25lZChza2IpKQotICAgIHsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0Nl9yZWN2IGNsb25lIFxuIik7Ci0gICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdV9yZWFkX3VubG9jaygpOwotCi0gICAgICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3Q2X3JlY3YgY2xvbmUgY29weSBmYWlsZWQgISEhXG4iKTsKLSAgICAgICAgICAgIHByaW50aygicHNrYl9leHBhbmRfaGVhZCBza2IgZmFpbGVkLCBmcmVlIHNrYlxuIik7Ci0gICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy+99rWxZmFzdDazybmmo6yyxcTcyejWw0lQzbfK17XY1rcs0tS5qWNhY2hly6LQwsqxyrnTwwotICAgIHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotICAgIHNrYi0+aXNGYXN0bmF0ID0gMTsKLSAgICBza2ItPnByaW9yaXR5ID0gZmFzdDZfZW50cnlfZGF0YS0+cHJpb3JpdHk7Ci0gICAgc2tiLT5tYXJrID0gZmFzdDZfZW50cnlfZGF0YS0+bWFyazsKLQotCi0gICAgLy/E2rrL19S0+LXEu/nT2sG0vdO1xMH3wb/Ns7zGCi0gICAgc3RydWN0IG5mX2Nvbm5fY291bnRlciAqYWNjdCA9IChzdHJ1Y3QgbmZfY29ubl9jb3VudGVyKiluZl9jb25uX2FjY3RfZmluZChmYXN0Nl9lbnRyeS0+Y3QpOwotICAgIGlmIChhY2N0KSB7Ci0gICAgICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotICAgICAgICBpZiAoZmFzdDZfZW50cnlfZGF0YS0+dHVwbGVoYXNoLnR1cGxlLmRzdC5kaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQ7Ci0gICAgICAgIGVsc2UgCi0gICAgICAgICAgICBjdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWTsKLQotICAgICAgICBhdG9taWM2NF9pbmMoJmFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKTsKLSAgICAgICAgYXRvbWljNjRfYWRkKHNrYi0+bGVuLCAmYWNjdFtDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzKTsKLSAgICB9Ci0JCi0gICAgLyogtqjWxrmmxNyjrM6qwcu94r72taVVRFC54LD8yrGjrM7et6jWqs/+aW5kZXa9+NDQwffBv82zvMbOyszitqjWxiAqLwotICAgIGlmICgoZmFzdDZfZW50cnlfZGF0YS0+aW5kZXYgPT0gTlVMTCkgJiYgc2tiLT5kZXYpCi0gICAgewotICAgICAgICBmYXN0Nl9lbnRyeV9kYXRhLT5pbmRldiA9IHNrYi0+ZGV2OwotICAgIH0KLQotICAgIC8vIM2zvMbI67/azfjC58nosbi1xL3TytWw/Mr9wb8gIC0tLSCyzr+8bGludXjUrcn6tcTH/bavo6zNs7zGtcS2vMrHSVCw/LOktsgKLSAgICBpZiAoZmFzdDZfZW50cnlfZGF0YS0+aW5kZXYgJiYgKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9ORVRfREVWSUNFKSkKLSAgICB7Ci0gICAgICAgIGZhc3Q2X2VudHJ5X2RhdGEtPmluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgIGZhc3Q2X2VudHJ5X2RhdGEtPmluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKLSAgICB9ICAKLSAgICAKLSAgICBza2ItPmRldiA9IGRldjsKLQotICAgIC8v1rvT0LWx09BNQUPNt9SkuLPWtcqxo6yyxde8uLPWtaOst/HU8s6qSVDNtwotICAgIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCi0gICAgbWVtY3B5KHNrYi0+ZGF0YSwgZmFzdDZfZW50cnlfZGF0YS0+aGhfZGF0YSwgRVRIX0hMRU4pOwotICAgIC8quPzQwsGsvdOzrMqxKi8KLSAgICBpZiAoSVBQUk9UT19UQ1AgPT0gdHVwbGUuZHN0LnByb3RvbnVtKQotICAgIHsKLSAgICAgICAgbW9kX3RpbWVyKCZmYXN0Nl9lbnRyeS0+dGltZW91dCwgamlmZmllcyArIHRjcF90aW1lb3V0c1tmYXN0Nl9lbnRyeS0+Y3QtPnByb3RvLnRjcC5zdGF0ZV0pOwotICAgICAgICB0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKilsNGhlYWQ7Ci0gICAgICAgIHVwZGF0ZV90Y3BfdGltZW91dChmYXN0Nl9lbnRyeSwgZmFzdDZfZW50cnlfZGF0YSwgdGNwaCk7Ci0JCWZhc3Q2X2VudHJ5LT5jdC0+dGltZW91dCA9IGppZmZpZXMgKyB0Y3BfdGltZW91dHNbZmFzdDZfZW50cnktPmN0LT5wcm90by50Y3Auc3RhdGVdOwotICAgIH0KLSAgICBlbHNlIGlmIChJUFBST1RPX1VEUCA9PSB0dXBsZS5kc3QucHJvdG9udW0pCi0gICAgewotICAgICAgICAvKnVkcCovCi0gICAgICAgIGlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZmYXN0Nl9lbnRyeS0+Y3QtPnN0YXR1cykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vZF90aW1lcigmZmFzdDZfZW50cnktPnRpbWVvdXQsIGppZmZpZXMgKyBmYXN0X3VkcF90aW1lb3V0X3N0cmVhbSk7Ci0JCQlmYXN0Nl9lbnRyeS0+Y3QtPnRpbWVvdXQgPSBqaWZmaWVzICsgZmFzdF91ZHBfdGltZW91dF9zdHJlYW07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RfdGltZXIoJmZhc3Q2X2VudHJ5LT50aW1lb3V0LCBqaWZmaWVzICsgZmFzdF91ZHBfdGltZW91dCk7Ci0JCQlmYXN0Nl9lbnRyeS0+Y3QtPnRpbWVvdXQgPSBqaWZmaWVzICsgZmFzdF91ZHBfdGltZW91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChza2ItPmRldi0+ZmxhZ3MgJiBJRkZfVVApCi0gICAgewotICAgICAgICAvL3BwcNa70OjSqrSryuRJULD8Ci0gICAgICAgIGlmIChzdHJuY21wKHNrYi0+ZGV2LT5uYW1lLCBwcHBfbmFtZSwgc3RybGVuKHBwcF9uYW1lKSkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICBza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2tiLT5ub3dfbG9jYXRpb24gfD0gRkFTVDZfU1VDQzsKLSAgICAgICAgaWYgKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9ORVRfREVWSUNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3RuYXQtMiBkZXZfcXVldWVfeG1pdCwgc2VuZCB0bzolcyAhISEhISEhISBcbiIsIHNrYi0+ZGV2LT5uYW1lKTsKLSAgICAgICAgICAgIGRldl9xdWV1ZV94bWl0KHNrYik7Ci0gICAgICAgIH0KLSAgICAgICAgLy+21NPawfe/2LXIzNjK4tOm08OjrNa7xNzX37Hq17y1xGZhc3RuYXTB97PMo6y38dTyzt63qL340NCy5bz+1rTQ0AotICAgICAgICBlbHNlIGlmIChmYXN0bmF0X2xldmVsID09IEZBU1RfTkVUX0NPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRldl9xdWV1ZV94bWl0KHNrYik7Ci0gICAgICAgIH0KLSAgICAgICAgLyphZGQgYnkgamlhbmdqaW5nKi8KLSAgICAgICAgZmFzdDZfZW50cnlfZGF0YS0+cGFja2V0X251bSsrOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiZmFzdDZfcmVjdiBFUlIgJiYmJiYmICVzIERPV04sIGtmcmVlX3NrYiEhISEhISEhIFxuIiwgc2tiLT5kZXYtPm5hbWUpOwotICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICB9Ci0KLSAgICByY3VfcmVhZF91bmxvY2soKTsKLQotICAgIHByaW50X3N1bihTVU5fREJHLCAiZmFzdF82X3JlY3Ygb2tva29rIFxuIik7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgZmFzdDZfaG9vayA9IHsKLSAgICAuaG9vayA9IG5hcHQ2X2hhbmRsZSwKLSAgICAvLy5vd25lciA9IFRISVNfTU9EVUxFLAotICAgIC5wZiA9IFBGX0lORVQ2LAotICAgIC5ob29rbnVtID0gTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0gICAgLnByaW9yaXR5ID0gTkZfSVA2X1BSSV9MQVNULAotfTsKLQotLy+5pNf31NpQT1NUX1JPVVRJTke92rXjo6zTw9PaZmFzdMG0vdO1xLiz1rW6zcztvNNoYXNose0KLXVuc2lnbmVkIGludCBuYXB0Nl9oYW5kbGUodm9pZCogcHJpdiwKLSAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0gICAgc3RydWN0IG5mX2Nvbm4gKmN0OwotICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotICAgIHVfaW50OF90IHByb3RvY29sOwotICAgIGZhc3RfZW50cnlfdCAqZmFzdDZfZW50cnk7Ci0gICAgZmFzdF9lbnRyeV9kYXRhX3QgKmZhc3Q2X2VudHJ5X2RhdGE7Ci0gICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciwgcmRpcjsKLSAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7Ci0jaWZkZWYgQ09ORklHX0FUSFJTX0hXX05BVAotICAgIHVfaW50MzJfdCBtYXNrID0wOwotI2VuZGlmCi0Jc3RydWN0IG5laWdoYm91ciAqX25laWdoYm91ciA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm91dCA9IHN0YXRlLT5vdXQ7Ci0KLQotICAgIGlmIChmYXN0bmF0X2xldmVsID09IEZBU1RfQ0xPU0UgfHwgZmFzdG5hdF9sZXZlbCA9PSBGQVNUX0NMT1NFX0tFRVBfTElOSykKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgaWYgKHRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotICAgIAotICAgIGlmICghb3V0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGlwdjZfaGRyKHNrYiktPm5leHRoZHIgIT0gSVBQUk9UT19UQ1AgJiYgaXB2Nl9oZHIoc2tiKS0+bmV4dGhkciAhPSBJUFBST1RPX1VEUCkKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLQotICAgIC8v1+mypbK7vajBtAotICAgIGlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikpCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIC8vtMu0ptKqudjXosrHt/G74ca1t7Gz9s/WZmFzdMG0vdPS0cL6x+m/9qOsyOe5+76ts6Oz9s/Wo6zKx7fxv7zCx9fuvsm4srjHx+m/9gotICAgIGlmICh3b3JraW5nX2xpc3Q2LmNvdW50ID4gbmZfY29ubnRyYWNrX21heCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotICAgIC8qxdC2z8rHt/HT0M/C0rvM+CovCi0gICAgaWYgKCFkc3QpCi0gICAgeyAKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0JX25laWdoYm91ciA9IGRzdF9uZWlnaF9sb29rdXBfc2tiKGRzdCwgc2tiKTsKLQlpZighX25laWdoYm91cikKLQl7Ci0JCXJldHVybiBORl9BQ0NFUFQ7Ci0JfQotICAgIAotICAgIGlmIChtZW1jbXAoX25laWdoYm91ci0+aGEsIHplcm9tYWMsIEVUSF9BTEVOKSA9PSAwKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgaWYgKCEoY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKSkpCi0gICAgewotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0gICAgcHJvdG9jb2wgPSBuZl9jdF9wcm90b251bShjdCk7Ci0KLQotICAgIC8qIG9ubHkgZm9yd2FyZCAqLwotICAgIGlmICghc2tiLT5za2JfaWlmKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0KLSAgICAvL7n9wsuyu9Do0qq+rbn9ZmFzdG5hdLXE0K3S6bD8Ci0gICAgaWYgKGNoZWNrX3NraXBfcG9ydHMoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51LmFsbCkpCi0gICAgewotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0KLSAgICBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7Ci0gICAgCi0gICAgcmRpciA9IChJUF9DVF9ESVJfT1JJR0lOQUwgPT0gZGlyKSA/IElQX0NUX0RJUl9SRVBMWTogSVBfQ1RfRElSX09SSUdJTkFMOwotICAgIAotICAgIGlmIChJUFBST1RPX1RDUCA9PSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIC8qIG9ubHkgZXN0YWJsaXNoZWQgKi8KLSAgICAgICAgaWYoIXRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpKQotICAgICAgICB7Ci0JCQlnb3RvIGFjY2VwdDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChJUFBST1RPX1VEUCAhPSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIHNwaW5fbG9ja19iaCgmZmFzdDZfc3BpbmxvY2spOwotICAgIGlmICghKGZhc3Q2X2VudHJ5ID0gZmFzdF9nZXRfZW50cnkoJndvcmtpbmdfbGlzdDYsIGN0LCBkaXIpKSkKLSAgICB7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0Nl9zcGlubG9jayk7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLSAgICBmYXN0Nl9lbnRyeS0+ZmFzdF9zcGlubG9jayA9ICZmYXN0Nl9zcGlubG9jazsKLQotICAgIC8vyte0zr2owbSjrLvxyKFjdLzGyv3L+KOssqLJvrP9Y3S2qMqxxveju8rXtM69qMG01ti4tLD8o6yyu8TcstnX9wotICAgIGlmICghKGZhc3Q2X2VudHJ5LT5mbGFncyAmIEZBU1RfQUxMX0RJUikpCi0gICAgewotICAgICAgICBuZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0gICAgICAgIC8vZGVsX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0gICAgICAgIGN0LT50aW1lb3V0ID0gZmFzdDZfZW50cnktPnRpbWVvdXQuZXhwaXJlczsKLSAgICB9Ci0KLSAgICBmYXN0Nl9lbnRyeV9kYXRhID0gJmZhc3Q2X2VudHJ5LT5kYXRhW2Rpcl07Ci0gICAgZmFzdDZfZW50cnlfZGF0YS0+dHVwbGVoYXNoLnR1cGxlID0gY3QtPnR1cGxlaGFzaFtkaXJdLnR1cGxlOwotCi0gICAgbWVtY3B5KGZhc3Q2X2VudHJ5X2RhdGEtPmRtYWMsIF9uZWlnaGJvdXItPmhhLCBFVEhfQUxFTik7Ci0gICAgZmFzdDZfZW50cnlfZGF0YS0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OwotICAgIGZhc3Q2X2VudHJ5X2RhdGEtPm1hcmsgPSBza2ItPm1hcms7Ci0gICAgZmFzdDZfZW50cnlfZGF0YS0+b3V0ZGV2ID0gb3V0OwotCi0gICAgaWYgKCFyZWNvcmRfTUFDX2hlYWRlcih3b3JraW5nX2hhc2g2LCBjdCwgZmFzdDZfZW50cnksIGZhc3Q2X2VudHJ5X2RhdGEsIF9uZWlnaGJvdXIsIG91dCwgaHRvbnMoRVRIX1BfSVBWNikpKQotICAgIHsKLSAgICAgICAgc3Bpbl91bmxvY2tfYmgoJmZhc3Q2X3NwaW5sb2NrKTsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgLy+0y7SmsaPWpNX9t7TBvbj2seq8x867sruz5c27Ci0gICAgZmFzdDZfZW50cnktPmZsYWdzID0gZmFzdDZfZW50cnktPmZsYWdzIHwgKDEgPDwgZGlyKTsKLSAgICAKLSAgICBmYXN0X2FkZF9lbnRyeSh3b3JraW5nX2hhc2g2LCBmYXN0Nl9lbnRyeV9kYXRhKTsKLSAgICAKLSAgICBpZiAoZmFzdDZfZW50cnktPmZsYWdzID09IEZBU1RfQUxMX0RJUikKLSAgICB7Ci0gICAgICAgIGZhc3Q2X2VudHJ5LT5kYXRhWzBdLmluZGV2ID0gZmFzdDZfZW50cnktPmRhdGFbMV0ub3V0ZGV2OwotICAgICAgICBmYXN0Nl9lbnRyeS0+ZGF0YVsxXS5pbmRldiA9IGZhc3Q2X2VudHJ5LT5kYXRhWzBdLm91dGRldjsKLSAgICB9Ci0KLSAgICBzcGluX3VubG9ja19iaCgmZmFzdDZfc3BpbmxvY2spOwotCi0gICAgY3QtPmZhc3RfY3QuaXNGYXN0ID0gRkFTVF9DVF9XTkQ2OwotCi1hY2NlcHQ6Ci0JCi0JbmVpZ2hfcmVsZWFzZShfbmVpZ2hib3VyKTsKLSAgICByZXR1cm4gTkZfQUNDRVBUOwotfQotCi0vKrSmwO3NqNaqwbTKwrz+Ki8KLWludCBmYXN0Nl9ldmVudCh0cmF2ZXJzZV9jb21tYW5kX3QgKmNtZCkKLXsKLSAgICBzcGluX2xvY2tfYmgoJmZhc3Q2X3NwaW5sb2NrKTsKLSAgICB0cmF2ZXJzZV9wcm9jZXNzKCZ3b3JraW5nX2xpc3Q2LCBjbWQpOwotICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0Nl9zcGlubG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8vZmFzdG5hdF9sZXZlbLnYsdWjrMflv9XL+dPQaXB2Nr/sy9nXqrei0MXPogotdm9pZCBmYXN0Nl9jbGVhbnVwX2xpbmtzKHZvaWQpCi17Ci0gICAgc3Bpbl9sb2NrX2JoKCZmYXN0Nl9zcGlubG9jayk7Ci0gICAgZmFzdF9jbGVhbnVwX2xpbmtzKCZ3b3JraW5nX2xpc3Q2KTsKLSAgICBzcGluX3VubG9ja19iaCgmZmFzdDZfc3BpbmxvY2spOwotfQotCi1pbnQgdHNwX2Zhc3Q2X2luaXQodm9pZCkKLXsKLSAgICBpbnQgcmV0OwotICAgIAotICAgIHByaW50X3N1bihTVU5fREJHLCJzdGFydCBpbml0IGZhc3Q2XG4iKTsKLQotICAgIHdvcmtpbmdfaGFzaDYgPSBuZl9jdF9hbGxvY19oYXNodGFibGUoJm5mX2Nvbm50cmFja19odGFibGVfc2l6ZSwgLyomZmFzdDZoYXNoX3ZtYWxsb2MsKi8gMSk7Ci0gICAgaWYgKCF3b3JraW5nX2hhc2g2KSAKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiVW5hYmxlIHRvIGNyZWF0ZSB3b3JraW5nX2hhc2g2XG4iKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgc3Bpbl9sb2NrX2luaXQoJmZhc3Q2X3NwaW5sb2NrKTsKLQotICAgIHJldCA9IG5mX3JlZ2lzdGVyX25ldF9ob29rKCZpbml0X25ldCwgJmZhc3Q2X2hvb2spOwotICAgIGlmIChyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCJpbml0IGZhc3Q2IGZhaWxlZFxuIik7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgICAKLSAgICBwcmludF9zdW4oU1VOX0RCRywiaW5pdCBmYXN0NiBkb25lXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgICAKLWVycjoKLSAgICBuZl9jdF9mcmVlX2hhc2h0YWJsZSh3b3JraW5nX2hhc2g2LCAvKmZhc3Q2X2hhc2hfdm1hbGxvYywgKi9uZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOwotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgdHNwX2Zhc3Q2X2NsZWFudXAodm9pZCkKLXsKLSAgICBuZl91bnJlZ2lzdGVyX25ldF9ob29rKCZpbml0X25ldCwgJmZhc3Q2X2hvb2spOwotICAgIG5mX2N0X2ZyZWVfaGFzaHRhYmxlKHdvcmtpbmdfaGFzaDYsIC8qZmFzdDZfaGFzaF92bWFsbG9jLCovIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci0gICAgCi0gICAgcHJpbnRfc3VuKFNVTl9EQkcsImZhc3Q2IGNsZWFudXAgZG9uZVxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdDZfZncuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdDZfZncuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzIyMTc1Yi4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3Q2X2Z3LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC9pY21wLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaXByYW5nZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxuZXQvU0kvZmFzdDYuaD4KLSNpbmNsdWRlIDxuZXQvU0kvZmFzdF9jb21tb24uaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3pvbmVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGltZXN0YW1wLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGltZW91dC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+Ci0jaW5jbHVkZSA8bmV0L2lwNl9maWIuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X3RyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldF9vdGhlci5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRpb2NfcHJvYy5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRfY2FjaGUuaD4KLSNpbmNsdWRlIDxuZXQvU0kvcHJpbnRfc3VuLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyogKioqKioqKioqKioqKioqKiogaXB2NiC/7MvZ16q3os/gudix5MG/ICoqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqILqvyv3J6sP3ICoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioguq/K/cq1z9YgKioqKioqKioqKioqKioqKioqKioqKioqICovCi1leHRlcm4gdTMyIHJ0Nl9wZWVyX2dlbmlkKHZvaWQpOwotCi1pbnQgZHN0X2V4cGlyZV9jb3VudF92NiA9IDA7Ci1leHRlcm4gaW50IG5vX25laWdoYm91cjsKLWV4dGVybiB2b2lkIG50bF9jdF9zZXRfaXcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LCBpbnQgY3RfZGlyKTsKLWludCBmYXN0Nl9md19yZWN2KHN0cnVjdCBuZl9jb25uICp0bXBsLAotICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bywKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotICAgICAgICAgICAgICAgICAgaW50IGRpciwKLSAgICAgICAgICAgICAgICAgIHVfaW50OF90IHByb3RvbnVtKQotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotICAgIGludCByZXQ7Ci0gICAgaW50ICByZGlyOwotICAgIHN0cnVjdCBldGhoZHIgKiBldGg7Ci0gICAgX191OCBuZXh0X2hkciA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqbDRoZWFkOwotICAgIHN0cnVjdCBkc3RfZW50cnkgKmRzdF9kaXIgPSBOVUxMOwotICAgIHN0cnVjdCBuZWlnaGJvdXIgKl9uZWlnaGJvdXIgPSBOVUxMOwotCi0JX19iZTE2CQkJdmxhbl9wcm90b19yYXcgPSBza2ItPnZsYW5fcHJvdG87Ci0JX191MTYJCQl2bGFuX3RjaV9yYXcgPSBza2ItPnZsYW5fdGNpOwotCQotICAgIHJkaXIgPSAoSVBfQ1RfRElSX09SSUdJTkFMID09IGRpcikgPyBJUF9DVF9ESVJfUkVQTFk6IElQX0NUX0RJUl9PUklHSU5BTDsKLSAgICBkc3RfZGlyID0gZHN0X2dldF9ieV9jdChjdCwgZGlyKTsKLQotICAgIHN0cnVjdCBuZl9ob29rX3N0YXRlIHN0YXRlID0gewotICAgICAgICAuaG9vayA9IE5GX0lORVRfUFJFX1JPVVRJTkcsCi0gICAgICAgIC5uZXQgPSAmaW5pdF9uZXQsCi0gICAgICAgIC5pbgk9IHNrYi0+ZGV2LAotICAgICAgICAucGYJPSBORlBST1RPX0lQVjYsCi0gICAgfTsKLQotCi0gICAgLy9UQ1Cx2NDry6vP8r2owbSjrFVEULWlz/K8tL/JCi0gICAgaWYgKCFkc3RfZGlyKQotICAgIHsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIC8vIMjnufu8x8K8wcvHxbXjo6y+zdaxvdPWuM/yx8W14wotICAgIGlmIChjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtkaXJdKQotICAgIHsKLSAgICAgICAgcmN1X3JlYWRfbG9jaygpOwotICAgICAgICBkZXYgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGN0LT5mYXN0X2N0LmZhc3RfYnJwb3J0W2Rpcl0sIDEpOwotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRldiA9IGRzdF9kaXItPmRldjsKLSAgICB9Ci0KLSAgICAvKrzssumw/LOktsjKx7fxs6y5/bP2v9rJ6LG4TVRVKi8KLSAgICBpZiAoIWRldiB8fCAoc2tiLT5sZW4gPiBkZXYtPm10dSkpCi0gICAgewotICAgICAgICBza2JpbmZvX2FkZChOVUxMLCBTS0JfT1ZFUl9NVFUpOwotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQotCi0gICAgLy+72LSrtcSw/NaxvdPKzbfFsqK8xsr9Ci0gICAgaWYgKHN0cmNtcChza2ItPmRldi0+bmFtZSwgZGV2LT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgICAgc2tiaW5mb19hZGQoTlVMTCwgU0tCX0xPT1ApOwotICAgICAgICAvL25mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIGdvdG8gZHJvcF9wYWNrZXQ7Ci0gICAgfQotCi0gICAgaWYgKGRpciA9PSAxKSB7Ci0gICAgICAgIGN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkgewotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodGVzdF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpKSB7Ci0gICAgICAgICAgICBjdGluZm8gPSBJUF9DVF9SRUxBVEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfTkVXOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIHJldCA9IG5mX2Nvbm50cmFja19oYW5kbGVfcGFja2V0X2Zhc3QoY3QsIHNrYiwgZGF0YW9mZiwgY3RpbmZvLCAmc3RhdGUpOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgICBza2ItPl9uZmN0ID0gMDsKLSAgICAgICAgZ290byBlcnJfb3V0OyAvLyBmYXN0yqew3Mewtryyu8TcuPy4xHNrYrXExNrI3aOst/HU8sqnsNy+zdKq1/a71ri0stnX9wotICAgIH0KLSAgICAvL8XQts+z9r/aZGV2tcTNt7K/v9W85MrHt/HX47m7o6yyu7m70OjSqmV4cGFuZAotICAgIGlmICghKHNrYiA9IGZhc3RfZXhwYW5kX2hlYWRyb29tX3Y2KHNrYiwgZGV2KSkpIHsKLSAgICAgICAgLy9uZl9jb25udHJhY2tfcHV0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0gICAgICAgIGdvdG8gZHJvcF9wYWNrZXQ7Ci0gICAgfQotCi0gICAgZmFzdF90Y3BkdW1wKHNrYik7Ci0KLSAgICAvL8jnufvXpbD8w/zW0KOsyv2+3bvhY2xvbmWjrGZhc3Szybmm0OjSqrjEseRkYXRhxNrI3aOs0OjSqtbY0MJjb3B50ru33QotICAgIGlmIChza2JfY2xvbmVkKHNrYikpCi0gICAgewotICAgICAgICBpZiAocHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludF9zdW4oU1VOX0RCRywgImZhc3Q2X2Z3X3JlY3YgY2xvbmUgY29weSBmYWlsZWQgISEhXG4iKTsKLSAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICAgICAgZ290byBkcm9wX3BhY2tldDsKLSAgICAgICAgfQotICAgICAgICBjbGVhbl9jYWNoZShza2ItPmRhdGEsc2tiLT5sZW4pOwotICAgIH0KLQotICAgIC8vvfa1sWZhc3RuYXSzybmmo6yyxcTcyejWw0lQzbfK17XY1rcs0tS5qWNhY2hly6LQwsqxyrnTwwotICAgIHNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwotICAgIHNrYi0+aXNGYXN0bmF0ID0gMTsKLSAgICBuZl9jdF9zZXQoc2tiLCAoc3RydWN0IG5mX2Nvbm4gKikmY3QtPmN0X2dlbmVyYWwsIGN0aW5mbyk7Ci0KLQotICAgIC8vu/nT2s34v9q1xMH3wb/Ns7zGICAtLS0gss6/vGxpbnV41K3J+rXEx/22r6OszbO8xrXEtrzKx0lQsPyzpLbICi0gICAgaWYgKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9ORVRfREVWSUNFKQotICAgIHsKLSAgICAgICAgc2tiLT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLSAgICAgICAgc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotICAgIH0KLQotICAgIGlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQotICAgIHsKLSAgICAgICAgaWYgKCEoZGV2LT5mbGFncyAmIElGRl9QT0lOVE9QT0lOVCkpIHsKLSAgICAgICAgICAgIC8vt8dwcHC2y7/assXXvLiz1rWjrLfx1PLOqklQzbcKLSAgICAgICAgICAgIHNrYl9wdXNoKHNrYiwgRVRIX0hMRU4pOwotCQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQkJCWlmKHNrYi0+aXN2bGFuID09IDEpCi0JCQl7Ci0JCQkJc3RydWN0IHZsYW5fZXRoaGRyICp2bGFuX2V0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIqKShza2ItPmRhdGEgLSBWTEFOX0hMRU4pOwotCQkJCXNrYi0+dmxhbl9wcm90byA9IHZsYW5fZXRoLT5oX3ZsYW5fcHJvdG87Ci0JCQkJc2tiLT52bGFuX3RjaSA9IG50b2hzKHZsYW5fZXRoLT5oX3ZsYW5fVENJKTsJCQkJCi0JCQl9Ci0gICAgICAgICAgICBldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLSAgICAgICAgICAgIC8vs/a/2mRldiBtYWO12Na31/fOqsr9vt2w/NS0bWFjtdjWtwotICAgICAgICAgICAgbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLSAgICAgICAgICAgIF9uZWlnaGJvdXIgPSBkc3RfbmVpZ2hfbG9va3VwX3NrYihkc3RfZGlyLCBza2IpOwotICAgICAgICAgICAgaWYgKF9uZWlnaGJvdXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGV0aC0+aF9kZXN0LCBfbmVpZ2hib3VyLT5oYSwgRVRIX0FMRU4pOwotICAgICAgICAgICAgICAgIG5laWdoX3JlbGVhc2UoX25laWdoYm91cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBfX2ZsdXNoX2RjYWNoZV9hcmVhKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotICAgICAgICAgICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICAgICAgICAgIG5vX25laWdoYm91cisrOwotICAgICAgICAgICAgICAgIGdvdG8gZHJvcF9wYWNrZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGV0aC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwotICAgICAgICB9Ci0gICAgICAgIHNrYi0+ZGV2ID0gZGV2OwotICAgICAgICBza2ItPm5vd19sb2NhdGlvbiB8PSBGQVNUTkFUX1NVQ0M7Ci0JCXNrYi0+dmxhbl9wcm90byA9IHZsYW5fcHJvdG9fcmF3OwotCQlza2ItPnZsYW5fdGNpID0gdmxhbl90Y2lfcmF3OwotICAgICAgICBfX2ZsdXNoX2RjYWNoZV9hcmVhKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotICAgICAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgICAgIGRldl9xdWV1ZV94bWl0KHNrYik7Ci0JCXNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiRVJSICYmJiYmJiAlcyBET1dOLCBrZnJlZV9za2IhISEhISEhISBcbiIsIHNrYi0+ZGV2LT5uYW1lKTsKLSAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgfQotCi0KLSAgICBwcmludF9zdW4oU1VOX0RCRywgInNrYiA6IDB4JXgsIGZhc3Q2X2Z3IHN1Y2MtLS0tLS0tLSIsIHNrYik7Ci0KLXN1Y2Nfb3V0OgotZHJvcF9wYWNrZXQ6Ci0gICAgaWYgKHRtcGwpCi0gICAgICAgIG5mX2Nvbm50cmFja19wdXQoJnRtcGwtPmN0X2dlbmVyYWwpOwotICAgIGRzdF9yZWxlYXNlKGRzdF9kaXIpOwotICAgIHJldHVybiAxOwotCi1lcnJfb3V0IDoKLSAgICBkc3RfcmVsZWFzZShkc3RfZGlyKTsKLQotICAgIG5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICBwcmludF9zdW4oU1VOX0RCRywgInNrYiA6IDB4JXgsIGZhc3Q2X2Z3IGZhaWwhISEhISEhISEhIiwgc2tiKTsKLSAgICBpZiAodG1wbCkgewotICAgICAgICBuZl9jdF9zZXQoc2tiLCAoc3RydWN0IG5mX2Nvbm4gKikmdG1wbC0+Y3RfZ2VuZXJhbCwgSVBfQ1RfTkVXKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNrYi0+X25mY3QgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsgLyogbm90IGZhc3QgbmF0ICovCi19Ci0KLS8vuaTX99TaUE9TVF9ST1VUSU5Hvdq146Os08PT2mZhc3TBtL3TtcS4s9a1us3M7bzTaGFzaLHtCi11bnNpZ25lZCBpbnQgbmFwdF9oYW5kbGU2X2Z3KHZvaWQgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLSAgICBzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0gICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0gICAgdV9pbnQ4X3QgcHJvdG9jb2w7Ci0gICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcjsKLSAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7Ci0jaWZkZWYgQ09ORklHX0FUSFJTX0hXX05BVAotICAgIHVfaW50MzJfdCBtYXNrID0wOwotI2VuZGlmCi0gICAgc3RydWN0IG5laWdoYm91ciAqX25laWdoYm91ciA9IE5VTEw7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm91dCA9IHN0YXRlLT5vdXQ7Ci0KLSAgICAvL7/sy9nXqrei19y/qrnYCi0gICAgaWYgKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9DTE9TRSB8fCBmYXN0bmF0X2xldmVsID09IEZBU1RfQ0xPU0VfS0VFUF9MSU5LKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICAvL7/sy9nXqrei19O5psTczrvNvL+qudgKLSAgICBpZiAoIXRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJmZhc3Rfc3dpdGNoKQotICAgICAgICAgICAgfHwgIXRlc3RfYml0KEZBU1RfVFlQRV9GVzZfQklULCAmZmFzdF9zd2l0Y2gpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICBpZiAoIW91dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgLy/Wu9PQVENQoaJVRFDWp7PWZmFzdKOsSUNNUNXStb21xGN0v8nE3MrHVENQoaJVRFC1xKOswP3I5zogtsu/2rK7v8m076Osy/nS1LHY0OvP1Mq+xdC2zwotICAgIGlmIChpcHY2X2hkcihza2IpLT5uZXh0aGRyICE9IElQUFJPVE9fVENQICYmIGlwdjZfaGRyKHNrYiktPm5leHRoZHIgIT0gSVBQUk9UT19VRFApCi0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0KLSAgICAvL9fpsqWyu72owbQKLSAgICBpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICAvKsXQts/Kx7fx09DPwtK7zPgqLwotICAgIGlmKCFkc3QpCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIF9uZWlnaGJvdXIgPSBkc3RfbmVpZ2hfbG9va3VwX3NrYihkc3QsIHNrYik7Ci0gICAgaWYoIV9uZWlnaGJvdXIpCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIGlmIChtZW1jbXAoX25laWdoYm91ci0+aGEsIHplcm9tYWMsIEVUSF9BTEVOKSA9PSAwKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgLyq87LLpsPyzpLbIyse38bOsuf2z9r/ayeixuE1UVSovCi0gICAgaWYgKGRzdC0+ZGV2ICYmIChza2ItPmxlbiA+IGRzdC0+ZGV2LT5tdHUpKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotICAgIGlmICghKGN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbykpKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgcHJvdG9jb2wgPSBuZl9jdF9wcm90b251bShjdCk7Ci0KLSAgICAvKiBvbmx5IGZvcndhcmQgKi8KLSAgICBpZiAoIXNrYi0+c2tiX2lpZikKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIC8vuf3Cy7K70OjSqr6tuf1mYXN0bmF0tcTQrdLpsPwKLSAgICBpZiAoY2hlY2tfc2tpcF9wb3J0cyhjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnUuYWxsKSkKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQotICAgIC8q1rvV67bUVENQL1VEUL340NBmYXN0bmF0Ki8KLSAgICBpZiAoSVBQUk9UT19UQ1AgPT0gcHJvdG9jb2wpCi0gICAgewotICAgICAgICAvKlRDUMj9tM7O1crWs8m5piovCi0gICAgICAgIGlmKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoSVBQUk9UT19VRFAgIT0gcHJvdG9jb2wpCi0gICAgewotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0KLSAgICBzcGluX2xvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOwotICAgIGlmIChjdC0+ZmFzdF9jdC5mYXN0X2RzdFtkaXJdICYmIChjdC0+ZmFzdF9jdC5mYXN0X2RzdFtkaXJdICE9IGRzdCkpCi0gICAgewotICAgICAgICBmYXN0X2Z3X2Nvbm5fcmVsZWFzZShjdCk7Ci0gICAgfQotCi0gICAgaWYgKCFjdC0+ZmFzdF9jdC5mYXN0X2RzdFtkaXJdKQotICAgIHsKLSAgICAgICAgcmN1X2Fzc2lnbl9wb2ludGVyKGN0LT5mYXN0X2N0LmZhc3RfZHN0W2Rpcl0sIGRzdCk7Ci0gICAgICAgIGN0LT5mYXN0X2N0LmZhc3RfYnJwb3J0W2Rpcl0gPSBnZXRCcmlkZ2VQb3J0KF9uZWlnaGJvdXIsIG91dCk7Ci0gICAgICAgIGZhc3RfZHN0X2FkZF9jdChkc3QsIGN0KTsKLSAgICB9Ci0KLSAgICBjdC0+ZmFzdF9jdC5pc0Zhc3QgPSBGQVNUX0NUX0ZXNjsKLSAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci1hY2NlcHQ6Ci0KLSAgICBuZWlnaF9yZWxlYXNlKF9uZWlnaGJvdXIpOwotICAgIHJldHVybiBORl9BQ0NFUFQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgZmFzdDZfZndfaG9vayA9IHsKLSAgICAuaG9vayA9IG5hcHRfaGFuZGxlNl9mdywKLSAgICAvLy5vd25lciA9IFRISVNfTU9EVUxFLAotICAgIC5wZiA9IFBGX0lORVQ2LAotICAgIC5ob29rbnVtID0gTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0gICAgLnByaW9yaXR5ID0gTkZfSVA2X1BSSV9MQVNULAotfTsKLQotCi1pbnQgZmFzdDZfZndfaW5pdCh2b2lkKQotewotICAgIGludCByZXQgPSAwOwotCi0gICAgcmV0ID0gbmZfcmVnaXN0ZXJfbmV0X2hvb2soJmluaXRfbmV0LCAmZmFzdDZfZndfaG9vayk7Ci0gICAgaWYgKHJldCAhPSAwKQotICAgIHsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9FUlIsImluaXQgZmFzdDZfZndfaW5pdCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgcHJpbnRfc3VuKFNVTl9EQkcsImluaXQgZmFzdDZfZndfaW5pdCBkb25lXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmFzdDZfZndfY2xlYW51cCh2b2lkKQotewotICAgIGZhc3RfcmVsZWFzZV9hbGwoUkVMRUFTRV9BTExfRFNUKTsKLSAgICBuZl91bnJlZ2lzdGVyX25ldF9ob29rKCZpbml0X25ldCwgJmZhc3Q2X2Z3X2hvb2spOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3RfY29tbW9uLmMgYi91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3RfY29tbW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY5ZjM3NjEuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvY29yZS9mYXN0cHJvYy9mYXN0X2NvbW1vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjExMyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X211bHRpcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9pcHJhbmdlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190Y3AuaD4KLSNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgotI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPG5ldC9TSS9mYXN0X2NvbW1vbi5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfem9uZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lb3V0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXQuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X3RyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldF9vdGhlci5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRpb2NfcHJvYy5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRfY2FjaGUuaD4KLSNpbmNsdWRlIDxuZXQvU0kvcHJpbnRfc3VuLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfem9uZXMuaD4KLQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqIL/sy9nXqreiuavTw7XEseTBvyAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RydWN0IGttZW1fY2FjaGUgKmZhc3RfaGVhZF9jYWNoZTsKLQotc3BpbmxvY2tfdCBmYXN0X2Z3X3NwaW5sb2NrOyAgICAgICAgICAgICAvL9fU0P3L+KOssaO7pNeqt6LK/b7dz+C7pbLZ1/cKLXNwaW5sb2NrX3QgZmFzdGxvY2FsX3NwaW5sb2NrOyAgICAgICAgICAgLy/X1ND9y/ijrLGju6SxvrXYyv2+3c/gu6Wy2df3Ci0KLS8qCi0qIDA6ILnYsdVmYXN0bmF0o6zX37Hq17xsaW51eKOsv8nS1NbQts/UrcG0vdPW2NDCwbS90wotKiAxOiDX30lQsuOx6te8ZmFzbmF0o6y9+Lb40v3Tw8jt1tC2z7X3tsijrNDUxNzC1LLuo6yzob6wyOfB97/YuabE3AotKiAyOiDX325ldF9kZXZpY2Wy48PmtcTH/bavtb3H/bavo6zO3sjt1tC2zwotKiA1OiC52LHVZmFzdG5hdKOs19+x6te8bGludXijrLGjs9bUrcG0vdOyu9bY0MLBtL3TCi0qIL/J0tTNqLn9cHJvY9DeuMTWtQotKi8KLWludCBmYXN0bmF0X2xldmVsID0gRkFTVF9ORVRfREVWSUNFOy8qRkFTVF9ORVRfREVWSUNFOyBtb2RpZnkgYnkgemRkLCBjbG9zZSBmYXN0bmF0Ki8KLQotLyogzrvNvLe9yr0gIC0tLSC499fTuabE3L/sy9nXqreiv6q52KOsss6/vGZhc3RfY29tbW9uLmjW0Lao0uUqLwotCi0vL3Vuc2lnbmVkIGxvbmcgZmFzdF9zd2l0Y2ggPSAweDY3OwotdW5zaWduZWQgbG9uZyBmYXN0X3N3aXRjaCA9IDB4MDsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqINfTzfi85CC/7MvZ16q3os/gudix5MG/ICoqKioqKioqKioqKioqKioqKioqKioqKiAqLwotaW50IGZhc3Ricl9sZXZlbCA9IDE7ICAgICAgICAgICAgICAgICAvL8rHt/G08r+qZmFzdGJyuabE3AotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqIMa9zKi7r8/gudix5MG/ICoqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qCi0gKs/Cw+Zicl9uYW1ltci8uLj219a3+7Suyv3X6c2ouf1wcm9jvdq148no1sOjrAotICq0y7SmvfbKx7ao0uW6zbizs/XWtaGjCi0gKi8KLWNoYXIgYnJfbmFtZVtNQVhfTkVUX0RFVklDRV9OQU1FX0xFTiArIDFdID0gImJyMCI7Ci1jaGFyIHBzX25hbWVbTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4gKyAxXSA9ICJ3YW4xIjsKLWNoYXIgdXNiX25hbWVbTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4gKyAxXSA9ICJ1c2JsYW4wIjsKLWNoYXIgcHBwX25hbWVbTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4gKyAxXSA9ICJwcHAiOwotLy9jcDq1pbrLo6zEo7/p0M7MrNDo0qrCt9PJtqjWxgotLy9hcDrLq7rLo6zEo7/p0M7MrL/JvPK1pcfFvdMKLWNoYXIgbmVlZF9qaWxpYW5bTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4gKyAxXSA9ICIwIjsKLQotLy/S1M/CyP249tPFz8i8tsXk1sOjrNa717zN+MLn1+m5x7jJtffV+6Ost/HU8tHP1tjTsM/suPe49re9z/K1xNDUxNwKLWludCAgZmFzdF9icl9sZXZlbCA9IDE7Ci1pbnQgIGZhc3RfZndkX2xldmVsID0gMjsKLWludCAgZmFzdF9sb2NhbF9sZXZlbCA9IDA7Ci11bnNpZ25lZCBjaGFyIHplcm9tYWNbRVRIX0FMRU5dID0gIiI7Ci0KLS8qIMTausvBtMK317TMrLXItcSx5MG/oaK907/azOWjrMC019TE2rrLo6zSxtay0MLE2rrLyrHQ6NKquPzQwiovCi0jZGVmaW5lIHNOTyBUQ1BfQ09OTlRSQUNLX05PTkUKLSNkZWZpbmUgc1NTIFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQKLSNkZWZpbmUgc1NSIFRDUF9DT05OVFJBQ0tfU1lOX1JFQ1YKLSNkZWZpbmUgc0VTIFRDUF9DT05OVFJBQ0tfRVNUQUJMSVNIRUQKLSNkZWZpbmUgc0ZXIFRDUF9DT05OVFJBQ0tfRklOX1dBSVQKLSNkZWZpbmUgc0NXIFRDUF9DT05OVFJBQ0tfQ0xPU0VfV0FJVAotI2RlZmluZSBzTEEgVENQX0NPTk5UUkFDS19MQVNUX0FDSwotI2RlZmluZSBzVFcgVENQX0NPTk5UUkFDS19USU1FX1dBSVQKLSNkZWZpbmUgc0NMIFRDUF9DT05OVFJBQ0tfQ0xPU0UKLSNkZWZpbmUgc1MyIFRDUF9DT05OVFJBQ0tfU1lOX1NFTlQyCi0jZGVmaW5lIHNJViBUQ1BfQ09OTlRSQUNLX01BWAotI2RlZmluZSBzSUcgVENQX0NPTk5UUkFDS19JR05PUkUKLQotLyogV2hhdCBUQ1AgZmxhZ3MgYXJlIHNldCBmcm9tIFJTVC9TWU4vRklOL0FDSy4gKi8KLWVudW0gdGNwX2JpdF9zZXQgewotICAgIFRDUF9TWU5fU0VULAotICAgIFRDUF9TWU5BQ0tfU0VULAotICAgIFRDUF9GSU5fU0VULAotICAgIFRDUF9BQ0tfU0VULAotICAgIFRDUF9SU1RfU0VULAotICAgIFRDUF9OT05FX1NFVCwKLX07Ci0KLS8vwLTX1G5mX2Nvbm50cmFja19wcm90b190Y3AuYwotc3RhdGljIGNvbnN0IHU4IHRjcF9jb25udHJhY2tzWzJdWzZdW1RDUF9DT05OVFJBQ0tfTUFYXSA9IHsKLSAgICB7Ci0gICAgICAgIC8qIE9SSUdJTkFMICovCi0gICAgICAgIC8qICAgICAgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNTMiAgICAqLwotICAgICAgICAvKnN5biovICAgICAgIHsgc1NTLCBzU1MsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lHLCBzU1MsIHNTUywgc1MyIH0sCi0gICAgICAgIC8qCi0gICAgICAgICAqICAgIHNOTyAtPiBzU1MgICAgSW5pdGlhbGl6ZSBhIG5ldyBjb25uZWN0aW9uCi0gICAgICAgICAqICAgIHNTUyAtPiBzU1MgICAgUmV0cmFuc21pdHRlZCBTWU4KLSAgICAgICAgICogICAgc1MyIC0+IHNTMiAgICBMYXRlIHJldHJhbnNtaXR0ZWQgU1lOCi0gICAgICAgICAqICAgIHNTUiAtPiBzSUcKLSAgICAgICAgICogICAgc0VTIC0+IHNJRyAgICBFcnJvcjogU1lOcyBpbiB3aW5kb3cgb3V0c2lkZSB0aGUgU1lOX1NFTlQgc3RhdGUKLSAgICAgICAgICogICAgICAgICAgICBhcmUgZXJyb3JzLiBSZWNlaXZlciB3aWxsIHJlcGx5IHdpdGggUlNUCi0gICAgICAgICAqICAgICAgICAgICAgYW5kIGNsb3NlIHRoZSBjb25uZWN0aW9uLgotICAgICAgICAgKiAgICAgICAgICAgIE9yIHdlIGFyZSBub3QgaW4gc3luYyBhbmQgaG9sZCBhIGRlYWQgY29ubmVjdGlvbi4KLSAgICAgICAgICogICAgc0ZXIC0+IHNJRwotICAgICAgICAgKiAgICBzQ1cgLT4gc0lHCi0gICAgICAgICAqICAgIHNMQSAtPiBzSUcKLSAgICAgICAgICogICAgc1RXIC0+IHNTUyAgICBSZW9wZW5lZCBjb25uZWN0aW9uIChSRkMgMTEyMikuCi0gICAgICAgICAqICAgIHNDTCAtPiBzU1MKLSAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNTMiAgICAqLwotICAgICAgICAvKnN5bmFjayovIHsgc0lWLCBzSVYsIHNTUiwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc1NSIH0sCi0gICAgICAgIC8qCi0gICAgICAgICAqICAgIHNOTyAtPiBzSVYgICAgVG9vIGxhdGUgYW5kIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZwotICAgICAgICAgKiAgICBzU1MgLT4gc0lWICAgIENsaWVudCBjYW4ndCBzZW5kIFNZTiBhbmQgdGhlbiBTWU4vQUNLCi0gICAgICAgICAqICAgIHNTMiAtPiBzU1IgICAgU1lOL0FDSyBzZW50IHRvIFNZTjIgaW4gc2ltdWx0YW5lb3VzIG9wZW4KLSAgICAgICAgICogICAgc1NSIC0+IHNTUiAgICBMYXRlIHJldHJhbnNtaXR0ZWQgU1lOL0FDSyBpbiBzaW11bHRhbmVvdXMgb3BlbgotICAgICAgICAgKiAgICBzRVMgLT4gc0lWICAgIEludmFsaWQgU1lOL0FDSyBwYWNrZXRzIHNlbnQgYnkgdGhlIGNsaWVudAotICAgICAgICAgKiAgICBzRlcgLT4gc0lWCi0gICAgICAgICAqICAgIHNDVyAtPiBzSVYKLSAgICAgICAgICogICAgc0xBIC0+IHNJVgotICAgICAgICAgKiAgICBzVFcgLT4gc0lWCi0gICAgICAgICAqICAgIHNDTCAtPiBzSVYKLSAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNTMiAgICAqLwotICAgICAgICAvKmZpbiovICAgIHsgc0lWLCBzSVYsIHNGVywgc0ZXLCBzTEEsIHNMQSwgc0xBLCBzVFcsIHNDTCwgc0lWIH0sCi0gICAgICAgIC8qCi0gICAgICAgICAqICAgIHNOTyAtPiBzSVYgICAgVG9vIGxhdGUgYW5kIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4uLgotICAgICAgICAgKiAgICBzU1MgLT4gc0lWICAgIENsaWVudCBtaWd0aCBub3Qgc2VuZCBGSU4gaW4gdGhpcyBzdGF0ZToKLSAgICAgICAgICogICAgICAgICAgICB3ZSBlbmZvcmNlIHdhaXRpbmcgZm9yIGEgU1lOL0FDSyByZXBseSBmaXJzdC4KLSAgICAgICAgICogICAgc1MyIC0+IHNJVgotICAgICAgICAgKiAgICBzU1IgLT4gc0ZXICAgIENsb3NlIHN0YXJ0ZWQuCi0gICAgICAgICAqICAgIHNFUyAtPiBzRlcKLSAgICAgICAgICogICAgc0ZXIC0+IHNMQSAgICBGSU4gc2VlbiBpbiBib3RoIGRpcmVjdGlvbnMsIHdhaXRpbmcgZm9yCi0gICAgICAgICAqICAgICAgICAgICAgdGhlIGxhc3QgQUNLLgotICAgICAgICAgKiAgICAgICAgICAgIE1pZ3RoIGJlIGEgcmV0cmFuc21pdHRlZCBGSU4gYXMgd2VsbC4uLgotICAgICAgICAgKiAgICBzQ1cgLT4gc0xBCi0gICAgICAgICAqICAgIHNMQSAtPiBzTEEgICAgUmV0cmFuc21pdHRlZCBGSU4uIFJlbWFpbiBpbiB0aGUgc2FtZSBzdGF0ZS4KLSAgICAgICAgICogICAgc1RXIC0+IHNUVwotICAgICAgICAgKiAgICBzQ0wgLT4gc0NMCi0gICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzUzIgICAgKi8KLSAgICAgICAgLyphY2sqLyAgICAgICB7IHNFUywgc0lWLCBzRVMsIHNFUywgc0NXLCBzQ1csIHNUVywgc1RXLCBzQ0wsIHNJViB9LAotICAgICAgICAvKgotICAgICAgICAgKiAgICBzTk8gLT4gc0VTICAgIEFzc3VtZWQuCi0gICAgICAgICAqICAgIHNTUyAtPiBzSVYgICAgQUNLIGlzIGludmFsaWQ6IHdlIGhhdmVuJ3Qgc2VlbiBhIFNZTi9BQ0sgeWV0LgotICAgICAgICAgKiAgICBzUzIgLT4gc0lWCi0gICAgICAgICAqICAgIHNTUiAtPiBzRVMgICAgRXN0YWJsaXNoZWQgc3RhdGUgaXMgcmVhY2hlZC4KLSAgICAgICAgICogICAgc0VTIC0+IHNFUyAgICA6LSkKLSAgICAgICAgICogICAgc0ZXIC0+IHNDVyAgICBOb3JtYWwgY2xvc2UgcmVxdWVzdCBhbnN3ZXJlZCBieSBBQ0suCi0gICAgICAgICAqICAgIHNDVyAtPiBzQ1cKLSAgICAgICAgICogICAgc0xBIC0+IHNUVyAgICBMYXN0IEFDSyBkZXRlY3RlZC4KLSAgICAgICAgICogICAgc1RXIC0+IHNUVyAgICBSZXRyYW5zbWl0dGVkIGxhc3QgQUNLLiBSZW1haW4gaW4gdGhlIHNhbWUgc3RhdGUuCi0gICAgICAgICAqICAgIHNDTCAtPiBzQ0wKLSAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNTMiAgICAqLwotICAgICAgICAvKnJzdCovICAgIHsgc0lWLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMIH0sCi0gICAgICAgIC8qbm9uZSovICAgeyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfQotICAgIH0sCi0gICAgewotICAgICAgICAvKiBSRVBMWSAqLwotICAgICAgICAvKiAgICAgICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzUzIgICAgKi8KLSAgICAgICAgLypzeW4qLyAgICAgICB7IHNJViwgc1MyLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNTMiB9LAotICAgICAgICAvKgotICAgICAgICAgKiAgICBzTk8gLT4gc0lWICAgIE5ldmVyIHJlYWNoZWQuCi0gICAgICAgICAqICAgIHNTUyAtPiBzUzIgICAgU2ltdWx0YW5lb3VzIG9wZW4KLSAgICAgICAgICogICAgc1MyIC0+IHNTMiAgICBSZXRyYW5zbWl0dGVkIHNpbXVsdGFuZW91cyBTWU4KLSAgICAgICAgICogICAgc1NSIC0+IHNJViAgICBJbnZhbGlkIFNZTiBwYWNrZXRzIHNlbnQgYnkgdGhlIHNlcnZlcgotICAgICAgICAgKiAgICBzRVMgLT4gc0lWCi0gICAgICAgICAqICAgIHNGVyAtPiBzSVYKLSAgICAgICAgICogICAgc0NXIC0+IHNJVgotICAgICAgICAgKiAgICBzTEEgLT4gc0lWCi0gICAgICAgICAqICAgIHNUVyAtPiBzSVYgICAgUmVvcGVuZWQgY29ubmVjdGlvbiwgYnV0IHNlcnZlciBtYXkgbm90IGRvIGl0LgotICAgICAgICAgKiAgICBzQ0wgLT4gc0lWCi0gICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzUzIgICAgKi8KLSAgICAgICAgLypzeW5hY2sqLyB7IHNJViwgc1NSLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNJRywgc0lHLCBzSUcsIHNTUiB9LAotICAgICAgICAvKgotICAgICAgICAgKiAgICBzU1MgLT4gc1NSICAgIFN0YW5kYXJkIG9wZW4uCi0gICAgICAgICAqICAgIHNTMiAtPiBzU1IgICAgU2ltdWx0YW5lb3VzIG9wZW4KLSAgICAgICAgICogICAgc1NSIC0+IHNJRyAgICBSZXRyYW5zbWl0dGVkIFNZTi9BQ0ssIGlnbm9yZSBpdC4KLSAgICAgICAgICogICAgc0VTIC0+IHNJRyAgICBMYXRlIHJldHJhbnNtaXR0ZWQgU1lOL0FDSz8KLSAgICAgICAgICogICAgc0ZXIC0+IHNJRyAgICBNaWdodCBiZSBTWU4vQUNLIGFuc3dlcmluZyBpZ25vcmVkIFNZTgotICAgICAgICAgKiAgICBzQ1cgLT4gc0lHCi0gICAgICAgICAqICAgIHNMQSAtPiBzSUcKLSAgICAgICAgICogICAgc1RXIC0+IHNJRwotICAgICAgICAgKiAgICBzQ0wgLT4gc0lHCi0gICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzUzIgICAgKi8KLSAgICAgICAgLypmaW4qLyAgICB7IHNJViwgc0lWLCBzRlcsIHNGVywgc0xBLCBzTEEsIHNMQSwgc1RXLCBzQ0wsIHNJViB9LAotICAgICAgICAvKgotICAgICAgICAgKiAgICBzU1MgLT4gc0lWICAgIFNlcnZlciBtaWdodCBub3Qgc2VuZCBGSU4gaW4gdGhpcyBzdGF0ZS4KLSAgICAgICAgICogICAgc1MyIC0+IHNJVgotICAgICAgICAgKiAgICBzU1IgLT4gc0ZXICAgIENsb3NlIHN0YXJ0ZWQuCi0gICAgICAgICAqICAgIHNFUyAtPiBzRlcKLSAgICAgICAgICogICAgc0ZXIC0+IHNMQSAgICBGSU4gc2VlbiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gICAgICAgICAqICAgIHNDVyAtPiBzTEEKLSAgICAgICAgICogICAgc0xBIC0+IHNMQSAgICBSZXRyYW5zbWl0dGVkIEZJTi4KLSAgICAgICAgICogICAgc1RXIC0+IHNUVwotICAgICAgICAgKiAgICBzQ0wgLT4gc0NMCi0gICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICBzTk8sIHNTUywgc1NSLCBzRVMsIHNGVywgc0NXLCBzTEEsIHNUVywgc0NMLCBzUzIgICAgKi8KLSAgICAgICAgLyphY2sqLyAgICAgICB7IHNJViwgc0lHLCBzU1IsIHNFUywgc0NXLCBzQ1csIHNUVywgc1RXLCBzQ0wsIHNJRyB9LAotICAgICAgICAvKgotICAgICAgICAgKiAgICBzU1MgLT4gc0lHICAgIE1pZ2h0IGJlIGEgaGFsZi1vcGVuIGNvbm5lY3Rpb24uCi0gICAgICAgICAqICAgIHNTMiAtPiBzSUcKLSAgICAgICAgICogICAgc1NSIC0+IHNTUiAgICBNaWdodCBhbnN3ZXIgbGF0ZSByZXNlbnQgU1lOLgotICAgICAgICAgKiAgICBzRVMgLT4gc0VTICAgIDotKQotICAgICAgICAgKiAgICBzRlcgLT4gc0NXICAgIE5vcm1hbCBjbG9zZSByZXF1ZXN0IGFuc3dlcmVkIGJ5IEFDSy4KLSAgICAgICAgICogICAgc0NXIC0+IHNDVwotICAgICAgICAgKiAgICBzTEEgLT4gc1RXICAgIExhc3QgQUNLIGRldGVjdGVkLgotICAgICAgICAgKiAgICBzVFcgLT4gc1RXICAgIFJldHJhbnNtaXR0ZWQgbGFzdCBBQ0suCi0gICAgICAgICAqICAgIHNDTCAtPiBzQ0wKLSAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgIHNOTywgc1NTLCBzU1IsIHNFUywgc0ZXLCBzQ1csIHNMQSwgc1RXLCBzQ0wsIHNTMiAgICAqLwotICAgICAgICAvKnJzdCovICAgIHsgc0lWLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMLCBzQ0wsIHNDTCwgc0NMIH0sCi0gICAgICAgIC8qbm9uZSovICAgeyBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYsIHNJViwgc0lWLCBzSVYgfQotICAgIH0KLX07Ci0KLSNkZWZpbmUgU0VDUyAqIEhaCi0jZGVmaW5lIE1JTlMgKiA2MCBTRUNTCi0jZGVmaW5lIEhPVVJTICogNjAgTUlOUwotI2RlZmluZSBEQVlTICogMjQgSE9VUlMKLQotLy/AtNfUbmZfY29ubnRyYWNrX3Byb3RvX3RjcC5jCi11bnNpZ25lZCBpbnQgdGNwX3RpbWVvdXRzW1RDUF9DT05OVFJBQ0tfVElNRU9VVF9NQVhdIF9fcmVhZF9tb3N0bHkgPSB7Ci0gICAgW1RDUF9DT05OVFJBQ0tfU1lOX1NFTlRdICAgID0gMiBNSU5TLAotICAgIFtUQ1BfQ09OTlRSQUNLX1NZTl9SRUNWXSAgICA9IDUgTUlOUywgLy82MCBTRUNTLAotICAgIFtUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVEXSAgICA9IDIgSE9VUlMsIC8vNSBEQVlTCi0gICAgW1RDUF9DT05OVFJBQ0tfRklOX1dBSVRdICAgID0gMiBNSU5TLAotICAgIFtUQ1BfQ09OTlRSQUNLX0NMT1NFX1dBSVRdICAgID0gNjAgU0VDUywKLSAgICBbVENQX0NPTk5UUkFDS19MQVNUX0FDS10gICAgPSAzMCBTRUNTLAotICAgIFtUQ1BfQ09OTlRSQUNLX1RJTUVfV0FJVF0gICAgPSAyIE1JTlMsCi0gICAgW1RDUF9DT05OVFJBQ0tfQ0xPU0VdICAgICAgICA9IDEyMCBTRUNTLCAvKm5vcm1hbCBpcyAxMFNFQyovCi0gICAgW1RDUF9DT05OVFJBQ0tfU1lOX1NFTlQyXSAgICA9IDIgTUlOUywKLSAgICAvKiBSRkMxMTIyIHNheXMgdGhlIFIyIGxpbWl0IHNob3VsZCBiZSBhdCBsZWFzdCAxMDAgc2Vjb25kcy4KLSAgICAgICBMaW51eCB1c2VzIDE1IHBhY2tldHMgYXMgbGltaXQsIHdoaWNoIGNvcnJlc3BvbmRzCi0gICAgICAgdG8gfjEzLTMwbWluIGRlcGVuZGluZyBvbiBSVE8uICovCi0gICAgLy9bVENQX0NPTk5UUkFDS19NQVhdICAgID0gMiBNSU5TLAotICAgIC8vW1RDUF9DT05OVFJBQ0tfSUdOT1JFXSAgICA9IDIgTUlOUywKLSAgICBbVENQX0NPTk5UUkFDS19SRVRSQU5TXSAgICA9IDUgTUlOUywKLSAgICBbVENQX0NPTk5UUkFDS19VTkFDS10gICAgICA9IDUgTUlOUywKLX07Ci0KLXVuc2lnbmVkIGludCBmYXN0X3VkcF90aW1lb3V0X3N0cmVhbSA9IDE4MCpIWjsKLXVuc2lnbmVkIGludCBmYXN0X3VkcF90aW1lb3V0ID0gMTIwKkhaOyAvKm5vcm1hbCBpcyAzMCpIWiovCi0KLS8vsrvWp7PWZmFzdG5hdLXE0K3S6cDg0M0KLS8vsrvU2cq508OjrLjEs8nNqLn9cHJvY7avzKy0q8jrtb1ub2Zhc3RfcHJvdG+jrNTdyrGxo8H0ts7Ksbzko6zIw7+qt6LBy73ittTTprXEtsu/2tCt0um6xQotdW5zaWduZWQgaW50IG5vZmFzdF9wb3J0W05PRkFTVF9QUk9UT19NQVhdID0gewotICAgIDIxLCAgICAgIC8vIEZUULbLv9qjrNPQyrGxu87EvP63/s7x0K3S6SAoRlNQKcq508MKLSAgICAyMiwgICAgICAvLyBzc2ggsLLIq1NoZWxsKFNTSCm3/s7xCi0gICAgMjMsICAgICAgLy8gdGVsbmV0IFRlbG5ldCC3/s7xCi0gICAgMjUsICAgICAgLy8gc210cCC88rWl08q8/rSryuTQrdLpKFNNVFApCi0gICAgNTMsICAgICAgLy8gZG9tYWluINPyw/u3/s7xKMjnIEJJTkQpCi0gICAgNjcsICAgICAgLy8gc2VydmVytstkaGNwt/7O8bbLv9oKLSAgICA2OCwgICAgICAvLyBjbGllbnS2y2RoY3C3/s7xtsu/2gotICAgIDY5LCAgICAgIC8vIHRmdHAg0KHOxLz+tKvK5NCt0ukoVEZUUCkKLSAgICAxMTAsICAgICAvLyDTyr7W0K3S6bDmsb4zCi0gICAgMTE1LCAgICAgLy8gc2Z0cCCwssirzsS8/rSryuTQrdLpKFNGVFApt/7O8QotICAgIDEyMywgICAgIC8vIG50cCDN+MLnyrG85NCt0ukoTlRQKQotICAgIDQ0MywgICAgIC8vIGh0dHBzILCyyKuzrM7Esb60q8rk0K3S6ShIVFRQKQotICAgIDUwMCwgICAgIC8vIGlzYWttcCC7pcGqzfiwssirudjBqrrN1L+z17ncwO3QrdLpKElTQUtNUCkKLSAgICAxMzUyLCAgICAvLyBMb3R1cyBOb3RlcwotICAgIDE3MjMsICAgIC8vIFBQVFAgVENQCi0gICAgMTk5MCwgICAgLy8gc3R1bi1wMSBjaXNjbyBTVFVOIFByaW9yaXR5IDEgcG9ydAotICAgIDE5OTEsICAgIC8vIHN0dW4tcDIgY2lzY28gU1RVTiBQcmlvcml0eSAyIHBvcnQKLSAgICAxOTkyLCAgICAvLyBzdHVuLXAzIGNpc2NvIFNUVU4gUHJpb3JpdHkgMyBwb3J0LGlwc2VuZG1zZyBJUHNlbmRtc2cKLSAgICAxOTkzLCAgICAvLyBzbm1wLXRjcC1wb3J0IGNpc2NvIFNOTVAgVENQIHBvcnQKLSAgICAxOTk0LCAgICAvLyBzdHVuLXBvcnQgY2lzY28gc2VyaWFsIHR1bm5lbCBwb3J0VENQCi0gICAgMTk5NSwgICAgLy8gcGVyZi1wb3J0IGNpc2NvIHBlcmYgcG9ydFRDUAotICAgIDE5OTYsICAgIC8vIHRyLXJzcmItcG9ydCBjaXNjbyBSZW1vdGUgU1JCIHBvcnRUQ1AKLSAgICAxOTk3LCAgICAvLyBnZHAtcG9ydCBDaXNjbyDN+LnYt6LP1tCt0ukoR0RQKQotICAgIDE5OTgsICAgIC8vIHgyNS1zdmMtcG9ydCBjaXNjbyBYLjI1IHNlcnZpY2UKLSAgICA0NTAwLCAgICAvLyBOQVQtVCBVRFAKLSAgICA1MDYwICAgICAvLyC2y7/atsu/2jo1MDYwL3VkcMPoyvY6U2Vzc2lvbkluaXRpYXRpb25Qcm90b2NvbChTSVC72Luwt6LG8NCt0ukpCi19OwotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqILqvyv3J6sP3ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLWludCAoKmZhc3RfbmF0NF9wcm9jKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCAoKmZhc3RfbmF0Nl9wcm9jKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCAoKmZhc3RfZnc0X3Byb2MpKHN0cnVjdCBuZl9jb25uICp0bXBsLAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwKLSAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90IHByb3RvbnVtKTsKLWludCAoKmZhc3RfZnc2X3Byb2MpKHN0cnVjdCBuZl9jb25uICp0bXBsLAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bywKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwKLSAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90IHByb3RvbnVtKTsKLQotaW50ICgqZmFzdF9sb2NhbDRfcHJvYykoc3RydWN0IG5mX2Nvbm4gKnRtcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG9udW0pOwotaW50ICgqZmFzdF9sb2NhbDZfcHJvYykoc3RydWN0IG5mX2Nvbm4gKnRtcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG9udW0pOwotaW50ICgqZmFzdF9sb2NhbDRfb3V0cHV0X3Byb2MpKHN0cnVjdCBza19idWZmICpza2IpOwotaW50ICgqZmFzdF9sb2NhbDZfb3V0cHV0X3Byb2MpKHN0cnVjdCBza19idWZmICpza2IpOwotCi1pbnQgKCpmYXN0X2JyX3Byb2MpKHN0cnVjdCBza19idWZmICpza2IpOwotCi1leHRlcm4gaW50IGZhc3RfbmF0X3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gaW50IGZhc3Q2X3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLXVuc2lnbmVkIGxvbmcgaXBoZHJfZXJyX251bSA9MDsKLXVuc2lnbmVkIGxvbmcgaXA2aGRyX2Vycl9udW0gPTA7Ci11bnNpZ25lZCBsb25nIHRjcGhkcl9lcnJfbnVtID0wOwotdW5zaWduZWQgbG9uZyB0Y3A2aGRyX2Vycl9udW0gPTA7Ci0KLWV4dGVybiBpbnQgZmFzdDRfZndfcmVjdihzdHJ1Y3QgbmZfY29ubiAqdG1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludDhfdCBwcm90b251bSk7Ci1leHRlcm4gaW50IGZhc3Q2X2Z3X3JlY3Yoc3RydWN0IG5mX2Nvbm4gKnRtcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG9udW0pOwotCi0vL2V4dGVybiBpbnQgZmFzdF9icihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLS8vZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRicnBvcnRfYnlkc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldix1bnNpZ25lZCBjaGFyICpkZXN0KTsKLWV4dGVybiBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja196b25lICp6b25lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKTsKLQotCi1leHRlcm4gaW50ICgqZmFzdF9mcm9tX3NvZnRpcnEpIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBpbnQgKCpmYXN0X2Zyb21fZHJpdmVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSogZGV2KTsKLQotZXh0ZXJuIHZvaWQgZmFzdG5hdF9jbGVhbnVwX2xpbmtzKHZvaWQpOwotZXh0ZXJuIHZvaWQgZmFzdDZfY2xlYW51cF9saW5rcyh2b2lkKTsKLQotZXh0ZXJuIGZhc3RfZW50cnlfdCAqY3VyX3RpbWVvdXRfZW50cnk7Ci1leHRlcm4gaW50IHRjcGFja190aW1lb3V0KGZhc3RfZW50cnlfdCAqZW50cnksIHVuc2lnbmVkIGxvbmcgKm5leHRfc2NoZWR1bGUsIGludCAqc2V0X25leHQpOwotZXh0ZXJuIGludCB0Y3BhY2tfcmVsKGZhc3RfZW50cnlfdCAqZW50cnkpOwotCi1leHRlcm4gaW50IHRzcF9mYXN0bmF0X2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHRzcF9mYXN0bmF0X2NsZWFudXAodm9pZCk7Ci0KLWV4dGVybiBpbnQgZmFzdDRfZndfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgZmFzdDZfZndfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIGludCBmYXN0NF9md19jbGVhbnVwKHZvaWQpOwotZXh0ZXJuIGludCBmYXN0Nl9md19jbGVhbnVwKHZvaWQpOwotCi1leHRlcm4gaW50IHRzcF9mYXN0Nl9pbml0KHZvaWQpOwotZXh0ZXJuIGludCB0c3BfZmFzdDZfY2xlYW51cCh2b2lkKTsKLQotZXh0ZXJuIGludCBmYXN0bmF0X2V2ZW50KHRyYXZlcnNlX2NvbW1hbmRfdCAqY21kKTsKLWV4dGVybiBpbnQgZmFzdDZfZXZlbnQodHJhdmVyc2VfY29tbWFuZF90ICpjbWQpOwotCi0vL7/sy9nXqreicHJvY87EvP61xLP1yry7rwotZXh0ZXJuIGludCBmYXN0X2Nvbm50cmFja19pbml0X3Byb2Modm9pZCApOwotCi0vL8TausvGvcyou69wcm9jzsS8/rXEs/XKvLuvCi1leHRlcm4gaW50IG5ldF9hZGFwdGVyX2luaXRfcHJvYyh2b2lkICk7Ci0KLXVuc2lnbmVkIGludCAoKnRzcF9taXJyb3JfaGFuZGxlKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotZXh0ZXJuIHZvaWQgbmV0X2RiZ19wZXJmX2Rldl9yZWN2KGNoYXIgKiBwYWNrZXRfYWRkcixjaGFyKiBub2RlX3N0cik7Ci1leHRlcm4gdm9pZCBuZXRfZGJnX3BlcmZfY2xlYXJfbGFzdF9pdGVtKHN0cnVjdCBza19idWZmICpza2IpOwotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioguq/K/cq1z9YgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIGludCBmYXN0X2lwaGRyX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKLXsKLSAgICBjb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKLSAgICBjb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKLSAgICB1MzIgbGVuOwotCi0gICAgaWYgKHByb3RvID09IEVUSF9QX0lQKQotICAgIHsKLSAgICAgICAgaXBoID0gaXBfaGRyKHNrYik7Ci0KLSAgICAgICAgaWYgKGlwaC0+aWhsIDwgNSB8fCBpcGgtPnZlcnNpb24gIT0gNCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGxlbiA9IG50b2hzKGlwaC0+dG90X2xlbik7Ci0gICAgICAgIGlmIChza2ItPmxlbiA8IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA8IChpcGgtPmlobCo0KSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIGlmKHByb3RvID09IEVUSF9QX0lQVjYpCi0gICAgewotICAgICAgICBpcDZoID0gaXB2Nl9oZHIoc2tiKTsKLSAgICAgICAgaWYgKGlwNmgtPnZlcnNpb24gIT0gNikKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGxlbiA9IG50b2hzKGlwNmgtPnBheWxvYWRfbGVuKTsKLSAgICAgICAgaWYgKGxlbiB8fCBpcDZoLT5uZXh0aGRyICE9IE5FWFRIRFJfSE9QKSB7Ci0gICAgICAgICAgICBpZiAobGVuICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSA+IHNrYi0+bGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogQmFzZWQgb24gaXB2Nl9za2lwX2V4dGhkcigpIGluIG5ldC9pcHY2L2V4dGhkci5jCi0gKgotICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgKHByb2JhYmx5IHRydW5jYXRlZCkgZXh0aGRyIHNldCAiaGRyIgotICogb2YgbGVuZ3RoICJsZW4iLiAibmV4dGhkcnAiIGluaXRpYWxseSBwb2ludHMgdG8gc29tZSBwbGFjZSwKLSAqIHdoZXJlIHR5cGUgb2YgdGhlIGZpcnN0IGhlYWRlciBjYW4gYmUgZm91bmQuCi0gKgotICogSXQgc2tpcHMgYWxsIHdlbGwta25vd24gZXh0aGRycywgYW5kIHJldHVybnMgcG9pbnRlciB0byB0aGUgc3RhcnQKLSAqIG9mIHVucGFyc2FibGUgYXJlYSBpLmUuIHRoZSBmaXJzdCBoZWFkZXIgd2l0aCB1bmtub3duIHR5cGUuCi0gKiBpZiBzdWNjZXNzLCAqbmV4dGhkciBpcyB1cGRhdGVkIGJ5IHR5cGUvcHJvdG9jb2wgb2YgdGhpcyBoZWFkZXIuCi0gKgotICogTk9URVM6IC0gaXQgbWF5IHJldHVybiBwb2ludGVyIHBvaW50aW5nIGJleW9uZCBlbmQgb2YgcGFja2V0LAotICogICAgICAgICAgaWYgdGhlIGxhc3QgcmVjb2duaXplZCBoZWFkZXIgaXMgdHJ1bmNhdGVkIGluIHRoZSBtaWRkbGUuCi0gKiAgICAgICAgLSBpZiBwYWNrZXQgaXMgdHJ1bmNhdGVkLCBzbyB0aGF0IGFsbCBwYXJzZWQgaGVhZGVycyBhcmUgc2tpcHBlZCwKLSAqICAgICAgICAgIGl0IHJldHVybnMgLTEuCi0gKiAgICAgICAgLSBpZiBwYWNrZXQgaXMgZnJhZ21lbnRlZCwgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGZyYWdtZW50IGhlYWRlci4KLSAqICAgICAgICAtIEVTUCBpcyB1bnBhcnNhYmxlIGZvciBub3cgYW5kIGNvbnNpZGVyZWQgbGlrZQotICogICAgICAgICAgbm9ybWFsIHBheWxvYWQgcHJvdG9jb2wuCi0gKiAgICAgICAgLSBOb3RlIGFsc28gc3BlY2lhbCBoYW5kbGluZyBvZiBBVVRIIGhlYWRlci4gVGhhbmtzIHRvIElQc2VjIHdpemFyZHMuCi0gKi8KLQotc3RhdGljIGludCBuZl9jdF9pcHY2X3NraXBfZXh0aGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbmV4dGhkcnAsIGludCBsZW4pCi17Ci0gICAgdTggbmV4dGhkciA9ICpuZXh0aGRycDsKLQotICAgIHdoaWxlIChpcHY2X2V4dF9oZHIobmV4dGhkcikpIHsKLSAgICAgICAgc3RydWN0IGlwdjZfb3B0X2hkciBoZHI7Ci0gICAgICAgIGludCBoZHJsZW47Ci0KLSAgICAgICAgaWYgKGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpcHY2X29wdF9oZHIpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAobmV4dGhkciA9PSBORVhUSERSX05PTkUpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoc2tiX2NvcHlfYml0cyhza2IsIHN0YXJ0LCAmaGRyLCBzaXplb2YoaGRyKSkpCi0gICAgICAgICAgICBCVUcoKTsKLSAgICAgICAgaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9BVVRIKQotICAgICAgICAgICAgaGRybGVuID0gKGhkci5oZHJsZW4rMik8PDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGhkcmxlbiA9IGlwdjZfb3B0bGVuKCZoZHIpOwotCi0gICAgICAgIG5leHRoZHIgPSBoZHIubmV4dGhkcjsKLSAgICAgICAgbGVuIC09IGhkcmxlbjsKLSAgICAgICAgc3RhcnQgKz0gaGRybGVuOwotICAgIH0KLQotICAgICpuZXh0aGRycCA9IG5leHRoZHI7Ci0gICAgcmV0dXJuIHN0YXJ0OwotfQotCi0KLXN0YXRpYyBpbnQgZmFzdF90Y3BoZHJfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByb3RvKQotewotICAgIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gTlVMTDsKLSAgICBjb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IE5VTEw7Ci0gICAgc3RydWN0IHRjcGhkciAqdGNwaCA9IE5VTEw7Ci0gICAgdW5zaWduZWQgaW50IGlwaGRyX2xlbiA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGlwNmhkcl9sZW4gPSAwOwotICAgIHVuc2lnbmVkIGludCB0Y3BoZHJfbGVuID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpsNGhlYWQgPSBOVUxMOwotICAgIF9fdTggcHJvdG9udW07Ci0gICAgaW50IGV4dG9mZiA9IDA7Ci0KLQotCi0gICAgaWYgKHByb3RvID09IEVUSF9QX0lQKQotICAgIHsKLSAgICAgICAgaXBoID0gaXBfaGRyKHNrYik7Ci0gICAgICAgIGlwaGRyX2xlbiA9IGlwaC0+aWhsICogNDsKLSAgICAgICAgdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKCh1bnNpZ25lZCBjaGFyKilpcGggKyBpcGhkcl9sZW4pOwotICAgICAgICB0Y3BoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCi0gICAgICAgIGlmICh0Y3BoZHJfbGVuID4gc2tiLT5sZW4gLSBpcGhkcl9sZW4pCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvL3RjcM23s6S2yLrNZG9mZsrHt/HGpcXkCi0gICAgICAgIGlmICh0Y3BoLT5kb2ZmIDwgdGNwaGRyX2xlbi80KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaWYgKHRjcGgtPmRvZmYqNCA+IHNrYi0+bGVuIC0gaXBoZHJfbGVuKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgaWYocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICB7Ci0gICAgICAgIGlwNmggPSBpcHY2X2hkcihza2IpOwotICAgICAgICBpcDZoZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLSAgICAgICAgdGNwaGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKLQotICAgICAgICAvL7LOv7y6r8r9aXB2Nl9nZXRfbDRwcm90b6OsyKGz9svEsuPQrdLpusUKLSAgICAgICAgZXh0b2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgKyBpcDZoZHJfbGVuOwotICAgICAgICBwcm90b251bSA9IDA7Ci0gICAgICAgIGlmIChza2JfY29weV9iaXRzKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b251bSwgc2l6ZW9mKHByb3RvbnVtKSkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZXh0b2ZmID0gbmZfY3RfaXB2Nl9za2lwX2V4dGhkcihza2IsIGV4dG9mZiwgJnByb3RvbnVtLCBza2ItPmxlbiAtIGV4dG9mZik7Ci0KLSAgICAgICAgaWYocHJvdG9udW0gIT0gTkVYVEhEUl9UQ1ApCi0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICB0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoKHVuc2lnbmVkIGNoYXIqKWlwNmggKyBleHRvZmYpOwotICAgICAgICBpZiAodGNwaGRyX2xlbiA+IHNrYi0+bGVuIC0gZXh0b2ZmKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgLy90Y3DNt7Oktsi6zWRvZmbKx7fxxqXF5AotICAgICAgICBpZiAodGNwaC0+ZG9mZiA8IHRjcGhkcl9sZW4vNCkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmICh0Y3BoLT5kb2ZmKjQgPiBza2ItPmxlbiAtIGV4dG9mZikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCi0gICAgcmV0dXJuIDE7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBkZWxpdmVyX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdF9wcmV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQotewotICAgIGF0b21pY19pbmMoJnNrYi0+dXNlcnMucmVmcyk7Ci0gICAgcmV0dXJuIHB0X3ByZXYtPmZ1bmMoc2tiLCBza2ItPmRldiwgcHRfcHJldiwgb3JpZ19kZXYpOwotfQotCi12b2lkICpnZXRfY3RfZm9yX2FwKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYoc2tiKXsKLQkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JCXN0cnVjdCBuZl9jb25uICogY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQkJaWYoY3QpewotCQkJbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotCQkJbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotCQkJcmV0dXJuICZjdC0+Y3RfZ2VuZXJhbDsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBwdXRfY3RfZm9yX2FwKHZvaWQgKnBjdCkKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilwY3Q7Ci0JbmZfY29ubnRyYWNrX3B1dCgoc3RydWN0IG5mX2Nvbm50cmFjayAqKWN0KTsKLQluZl9jb25udHJhY2tfcHV0KChzdHJ1Y3QgbmZfY29ubnRyYWNrICopY3QpOwotfQotCi0vL7TLtKa9+NDQUkFXX1BBQ0tFVMDg0M21xHNvY2tldL3TytW0psDto6zS1L3ivvZfX25ldGlmX3JlY2VpdmVfc2ti1tDV/bOj16Ww/Mqxo6zK/b7dsPzE2sjd0tGxu9DeuMS1xMfpv/YKLXZvaWQgZmFzdF90Y3BkdW1wKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSA9IE5VTEw7Ci0KLSAgICByY3VfcmVhZF9sb2NrKCk7Ci0gICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHR5cGUsICZwdHlwZV9hbGwsIGxpc3QpCi0gICAgewotICAgICAgICBpZiAoIXB0eXBlLT5kZXYgfHwgcHR5cGUtPmRldiA9PSBza2ItPmRldikKLSAgICAgICAgewotICAgICAgICAgICAgc2tiaW5mb19hZGQoTlVMTCwgU0tCX0lSUV9GUkVFKTsKLSAgICAgICAgICAgIGRlbGl2ZXJfc2tiKHNrYiwgcHR5cGUsIHNrYi0+ZGV2KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByY3VfcmVhZF91bmxvY2soKTsKLX0KLQotLy+yzr+8aXBfZmluaXNoX291dHB1dDIswKmz5HNrYs23sr8KLXN0cnVjdCBza19idWZmICpmYXN0X2V4cGFuZF9oZWFkcm9vbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0gICAgdW5zaWduZWQgaW50IGhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7Ci0gICAgc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOwotICAgIGlmICh1bmxpa2VseShza2JfaGVhZHJvb20oc2tiKSA8IGhoX2xlbiAmJiBkZXYtPmhlYWRlcl9vcHMpKSB7Ci0gICAgICAgIHNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heChoaF9sZW4sIE5FVF9TS0JfUEFEKSk7Ci0gICAgICAgIGlmKHNrYjIpCi0gICAgICAgICAgICBjbGVhbl9jYWNoZShza2IyLT5kYXRhLHNrYjItPmxlbik7Ci0gICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICByZXR1cm4gc2tiMjsKLSAgICB9Ci0gICAgcmV0dXJuIHNrYjsKLX0KLQotLy+yzr+8aXA2X3htaXQswKmz5HNrYs23sr8KLXN0cnVjdCBza19idWZmICpmYXN0X2V4cGFuZF9oZWFkcm9vbV92NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSB7Ci0gICAgdW5zaWduZWQgaW50IGhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOwotICAgIHN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKLSAgICBpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBoaF9sZW4pKSB7Ci0gICAgICAgIHNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIG1heChoaF9sZW4sIE5FVF9TS0JfUEFEKSk7Ci0gICAgICAgIGlmKHNrYjIpCi0gICAgICAgICAgICBjbGVhbl9jYWNoZShza2IyLT5kYXRhLHNrYjItPmxlbik7Ci0gICAgICAgIGtmcmVlX3NrYihza2IpOwotICAgICAgICByZXR1cm4gc2tiMjsKLSAgICB9Ci0gICAgcmV0dXJuIHNrYjsKLX0KLQotCi0vKiDJvrP90rvM9cGsvdMgKi8KLWZhc3RfZW50cnlfdCAqZm5fbGlzdF9kZWwoZmFzdF9saXN0X3QgKmxpc3RfaGVhZCwgZmFzdF9lbnRyeV90ICplbnRyeSkKLXsKLSAgICBmYXN0X2VudHJ5X3QgKnJldF9lbnRyeSA9IE5VTEwsICoqcHByZXYgPSBOVUxMOwotCi0gICAgaWYgKCFlbnRyeSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHBwcmV2ID0gJmxpc3RfaGVhZC0+bmV4dDsKLSAgICBmb3IgKHJldF9lbnRyeSA9IGxpc3RfaGVhZC0+bmV4dDsgcmV0X2VudHJ5OyByZXRfZW50cnkgPSByZXRfZW50cnktPm5leHQpCi0gICAgewotICAgICAgICBpZiAocmV0X2VudHJ5ID09IGVudHJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICAqcHByZXYgPSByZXRfZW50cnktPm5leHQ7Ci0gICAgICAgICAgICBsaXN0X2hlYWQtPmNvdW50LS07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwcHJldiA9ICZyZXRfZW50cnktPm5leHQ7Ci0gICAgfQotICAgIGttZW1fY2FjaGVfZnJlZShmYXN0X2hlYWRfY2FjaGUsIGVudHJ5KTsKLSAgICBuZXRzbGFiX2RlYyhGQVNUX1NMQUIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vL8ztvNO92rXjCi12b2lkIGZuX2xpc3RfYWRkKGZhc3RfbGlzdF90ICpsaXN0X2hlYWQsIGZhc3RfZW50cnlfdCAqZW50cnkpCi17Ci0gICAgZW50cnktPm5leHQgPSBsaXN0X2hlYWQtPm5leHQ7Ci0gICAgbGlzdF9oZWFkLT5uZXh0ID0gZW50cnk7Ci0gICAgbGlzdF9oZWFkLT5jb3VudCsrOwotfQotCi0vL7Lp0a/K/b7dCi1mYXN0X2VudHJ5X2RhdGFfdCAqZmFzdF9maW5kX2VudHJ5X2RhdGEoY29uc3Qgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKndvcmtpbmdfaGFzaCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0gICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotICAgIHN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwotICAgIHVuc2lnbmVkIGludCBoYXNoOwotCi0gICAgaGFzaCA9IGhhc2hfY29ubnRyYWNrX2Zhc3QodHVwbGUpOwotICAgIGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmd29ya2luZ19oYXNoW2hhc2hdLCBobm5vZGUpCi0gICAgewotICAgICAgICBpZiAobmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYXN0X2hhc2hfdG9fZGF0YShoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vL8ztvNO92rXjCi1pbnQgZmFzdF9hZGRfZW50cnkoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKndvcmtpbmdfaGFzaCwgZmFzdF9lbnRyeV9kYXRhX3QgKmVudHJ5X2RhdGEpCi17Ci0gICAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgICBoYXNoID0gaGFzaF9jb25udHJhY2tfZmFzdCgmZW50cnlfZGF0YS0+dHVwbGVoYXNoLnR1cGxlKTsKLSAgICBpZiAoZmFzdF9maW5kX2VudHJ5X2RhdGEod29ya2luZ19oYXNoLCAmZW50cnlfZGF0YS0+dHVwbGVoYXNoLnR1cGxlKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmZW50cnlfZGF0YS0+dHVwbGVoYXNoLmhubm9kZSwgJndvcmtpbmdfaGFzaFtoYXNoXSk7Ci0gICAgLy/S8s6q1Nq1scewwfezzNbQo6xkZXbS0b6tsbtob2xk16HBy6Osy/nS1LTLtKayu9PDcmN1X3JlYWRfbG9jaygpO7Gju6SjrM7KzOKyu7TzCi0gICAgZGV2X2hvbGQoZW50cnlfZGF0YS0+b3V0ZGV2KTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3b3JraW5naGFzaF9kZWxfbm9kZShmYXN0X2VudHJ5X3QgKmVudHJ5KQotewotICAgIGludCBpID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBJUF9DVF9ESVJfTUFYOyBpKyspCi0gICAgewotICAgICAgICAvL2lmIChlbnRyeS0+ZmxhZ3MgJiAoMSA8PCBpKSkKLSAgICAgICAgaWYgKChlbnRyeS0+ZmxhZ3MgJiAoMSA8PCBpKSkmJigwICE9IGVudHJ5LT5kYXRhW2ldLnR1cGxlaGFzaC5obm5vZGUubmV4dCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhsaXN0X251bGxzX2RlbF9yY3UoJmVudHJ5LT5kYXRhW2ldLnR1cGxlaGFzaC5obm5vZGUpOwotICAgICAgICAgICAgLy9obGlzdF9udWxsc19kZWwoJmVudHJ5LT5kYXRhW2ldLnR1cGxlaGFzaC5obm5vZGUpOwotICAgICAgICAgICAgZGV2X3B1dChlbnRyeS0+ZGF0YVtpXS5vdXRkZXYpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKsm+s/3BrL3TKi8KLXN0YXRpYyB2b2lkIGZhc3RsaXN0X2RlbF9lbnRyeShmYXN0X2xpc3RfdCAqbGlzdF9oZWFkLCBmYXN0X2VudHJ5X3QgKmVudHJ5KQotewotICAgIHRjcGFja19yZWwoZW50cnkpOwotICAgIC8vbmZfY3RfcHV0KGVudHJ5LT5jdCk7Ci0gICAgYXRvbWljX2RlYygmKGVudHJ5LT5jdC0+Y3RfZ2VuZXJhbC51c2UpKTsKLSAgICBmbl9saXN0X2RlbChsaXN0X2hlYWQsIGVudHJ5KTsKLX0KLQotLypmYXN0s6zKsbSmwO2jrMm+s/3BrL3TKi8KLS8qamlhbmdqaW5nLCDQ3rjEyOu/2rLOyv3A4NDNzqp1bnNpZ25lZCBsb25nKi8KLWV4dGVybiBzcGlubG9ja190IGZhc3Q2X3NwaW5sb2NrOwotZXh0ZXJuIHNwaW5sb2NrX3QgZmFzdG5hdF9zcGlubG9jazsKLXN0YXRpYyB2b2lkIGZhc3RfdGltZW91dChzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyKQotewotICAgIGZhc3RfZW50cnlfdCAqZW50cnkgPSAoZmFzdF9lbnRyeV90ICopKHB0aW1lci0+ZGF0YSk7Ci0gICAgZmFzdF9lbnRyeV90ICpyZXRfZW50cnkgPSBOVUxMOwotICAgIHN0cnVjdCBmYXN0X2xpc3RfcyAqbGlzdF9oZWFkID0gZW50cnktPmxpc3RfaGVhZDsKLSAgICBzcGlubG9ja190ICpmYXN0X3NwaW5sb2NrID0gZW50cnktPmZhc3Rfc3BpbmxvY2s7Ci0gICAgaWYoZmFzdF9zcGlubG9jayA9PSAmZmFzdDZfc3BpbmxvY2sgfHwgZmFzdF9zcGlubG9jayA9PSAmZmFzdG5hdF9zcGlubG9jaykKLSAgICB7Ci0gICAgICAgIHNwaW5fbG9ja19iaChmYXN0X3NwaW5sb2NrKTsKLQotICAgICAgICBmb3IgKHJldF9lbnRyeSA9IGxpc3RfaGVhZC0+bmV4dDsgcmV0X2VudHJ5OyByZXRfZW50cnkgPSByZXRfZW50cnktPm5leHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXRfZW50cnkgPT0gZW50cnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd29ya2luZ2hhc2hfZGVsX25vZGUoZW50cnkpOwotICAgICAgICAgICAgICAgIGZhc3RsaXN0X2RlbF9lbnRyeShlbnRyeS0+bGlzdF9oZWFkLCBlbnRyeSk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfYmgoZmFzdF9zcGlubG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNwaW5fdW5sb2NrX2JoKGZhc3Rfc3BpbmxvY2spOwotICAgIH0KLX0KLQotLy+y6dGvvdq146Ossumyu7W91PLQwrS0vagKLWZhc3RfZW50cnlfdCAqZmFzdF9nZXRfZW50cnkoZmFzdF9saXN0X3QgKmxpc3RfaGVhZCwgc3RydWN0IG5mX2Nvbm4gKmN0LCBjaGFyIGRpcikKLXsKLSAgICBmYXN0X2VudHJ5X3QgKnJldCA9IE5VTEw7Ci0gICAgdV9pbnQ4X3QgcHJvdG9jb2w7Ci0gICAgdW5zaWduZWQgbG9uZyBleHBpcmVzOwotCi0gICAgZm9yIChyZXQgPSBsaXN0X2hlYWQtPm5leHQ7IHJldDsgcmV0ID0gcmV0LT5uZXh0KQotICAgIHsKLSAgICAgICAgaWYgKHJldC0+Y3QgPT0gY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gbmZfY3RfcHJvdG9udW0oY3QpOwotICAgICAgICAgICAgaWYgKElQUFJPVE9fVENQID09IHByb3RvY29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qdGNwKi8KLSAgICAgICAgICAgICAgICBleHBpcmVzID0gamlmZmllcyArIHRjcF90aW1lb3V0c1tjdC0+cHJvdG8udGNwLnN0YXRlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKnVkcCovCi0gICAgICAgICAgICAgICAgaWYgKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmN0LT5zdGF0dXMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IGppZmZpZXMgKyBmYXN0X3VkcF90aW1lb3V0X3N0cmVhbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IGppZmZpZXMgKyBmYXN0X3VkcF90aW1lb3V0OwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb2RfdGltZXIoJnJldC0+dGltZW91dCwgZXhwaXJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyrWu9XrttRvcmlnaW5hbLe9z/K0tL2oway90yovCi0gICAgaWYgKElQX0NUX0RJUl9PUklHSU5BTCAhPSBkaXIpCi0gICAgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvL8G91ta2vMrHc2xhYrv61sajrGttYWxsb2PKx82o08NzbGFio6y689XfysfXqMr0c2xhYqOsuMSzydeoyvRzbGFiCi0gICAgcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhmYXN0X2hlYWRfY2FjaGUsIEdGUF9BVE9NSUMpOwotICAgIGlmIChyZXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fRVJSLCJmYXN0X2dldF9lbnRyeToga21hbGxvYyBmYWlsIVxuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBuZXRzbGFiX2luYyhGQVNUX1NMQUIpOwotICAgIG1lbXNldChyZXQsIDAsIHNpemVvZihmYXN0X2VudHJ5X3QpKTsKLSAgICByZXQtPmN0ID0gY3Q7Ci0gICAgcmV0LT5saXN0X2hlYWQgPSBsaXN0X2hlYWQ7Ci0KLSAgICAvL8no1sO2qMqxxvcKLSAgICBfX2luaXRfdGltZXIoJnJldC0+dGltZW91dCwgTlVMTCwgMCk7Ci0KLSAgICBwcm90b2NvbCA9IG5mX2N0X3Byb3RvbnVtKGN0KTsKLSAgICBpZiAoSVBQUk9UT19UQ1AgPT0gcHJvdG9jb2wpCi0gICAgewotICAgICAgICAvKnRjcCovCi0gICAgICAgIHJldC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIHRjcF90aW1lb3V0c1tjdC0+cHJvdG8udGNwLnN0YXRlXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyp1ZHAqLwotICAgICAgICBpZiAodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIGZhc3RfdWRwX3RpbWVvdXRfc3RyZWFtOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgZmFzdF91ZHBfdGltZW91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldC0+dGltZW91dC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcmV0OwotICAgIHJldC0+dGltZW91dC5mdW5jdGlvbiA9IGZhc3RfdGltZW91dDsKLSAgICBhZGRfdGltZXIoJnJldC0+dGltZW91dCk7Ci0KLSAgICBmbl9saXN0X2FkZChsaXN0X2hlYWQsIHJldCk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi11bnNpZ25lZCBpbnQgZ2V0X2Nvbm50cmFja19pbmRleChjb25zdCBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQotewotICAgIGlmICh0Y3BoLT5yc3QpIHJldHVybiBUQ1BfUlNUX1NFVDsKLSAgICBlbHNlIGlmICh0Y3BoLT5zeW4pIHJldHVybiAodGNwaC0+YWNrID8gVENQX1NZTkFDS19TRVQgOiBUQ1BfU1lOX1NFVCk7Ci0gICAgZWxzZSBpZiAodGNwaC0+ZmluKSByZXR1cm4gVENQX0ZJTl9TRVQ7Ci0gICAgZWxzZSBpZiAodGNwaC0+YWNrKSByZXR1cm4gVENQX0FDS19TRVQ7Ci0gICAgZWxzZSByZXR1cm4gVENQX05PTkVfU0VUOwotfQotCi0vKrj80MJ0Y3CzrMqxtqjKscb3Ki8KLXZvaWQgdXBkYXRlX3RjcF90aW1lb3V0KGZhc3RfZW50cnlfdCAqZW50cnksIGZhc3RfZW50cnlfZGF0YV90ICplbnRyeV9kYXRhLCBzdHJ1Y3QgdGNwaGRyICp0Y3BoKQotewotICAgIGVudW0gdGNwX2Nvbm50cmFjayBuZXdfc3RhdGUsIG9sZF9zdGF0ZTsKLSAgICB1bnNpZ25lZCBpbnQgZGlyLCBpbmRleDsKLQotICAgIG9sZF9zdGF0ZSA9IGVudHJ5LT5jdC0+cHJvdG8udGNwLnN0YXRlOwotICAgIGRpciA9IGVudHJ5X2RhdGEtPnR1cGxlaGFzaC50dXBsZS5kc3QuZGlyOwotCi0gICAgaWYgKHRjcGggPT0gTlVMTCB8fCBvbGRfc3RhdGUgPj1UQ1BfQ09OTlRSQUNLX01BWCkKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fRVJSLCJ1cGRhdGVfdGNwX3RpbWVvdXQgdGNwaCBpcyBudWxsISBcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGluZGV4ID0gZ2V0X2Nvbm50cmFja19pbmRleCh0Y3BoKTsKLQotICAgIC8quPzQwlRDUMG0vdPXtMysKi8KLSAgICBuZXdfc3RhdGUgPSB0Y3BfY29ubnRyYWNrc1tkaXJdW2luZGV4XVtvbGRfc3RhdGVdOwotICAgIGlmKG9sZF9zdGF0ZSAhPSBuZXdfc3RhdGUpCi0gICAgewotICAgICAgICAvL7LOv7xuZl9jb25udHJhY2tfcHJvdG9fdGNwLmO6r8r9dGNwX3BhY2tldAotICAgICAgICBpZiAobmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfSUdOT1JFKQotICAgICAgICAgICAgbmV3X3N0YXRlID0gVENQX0NPTk5UUkFDS19TWU5fUkVDVjsKLSAgICAgICAgZWxzZSBpZiAobmV3X3N0YXRlID09IFRDUF9DT05OVFJBQ0tfTUFYKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGVudHJ5LT5jdC0+cHJvdG8udGNwLnN0YXRlID0gbmV3X3N0YXRlOwotICAgICAgICAvL7aoyrHG97Tmu+7KsbzkuMSx5MqxssW199PDs6zKsbzssuKjrLz1ydmx6cD6wbSx7bTOyv0KLSAgICAgICAgbW9kX3RpbWVyKCZlbnRyeS0+dGltZW91dCwgamlmZmllcyArIHRjcF90aW1lb3V0c1tuZXdfc3RhdGVdKTsKLSAgICB9Ci19Ci0KLS8qILzHwry21NOmtcRtYWPQxc+io6yzybmmt7W72DGjrLfx1PK3tbvYMCAqLwotaW50IHJlY29yZF9NQUNfaGVhZGVyKGNvbnN0IHN0cnVjdCBobGlzdF9udWxsc19oZWFkICp3b3JraW5nX2hhc2gsIHN0cnVjdCBuZl9jb25uICpjdCwKLSAgICAgICAgICAgICAgICAgICAgICBmYXN0X2VudHJ5X3QgKmVudHJ5LCBmYXN0X2VudHJ5X2RhdGFfdCAqZW50cnlfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgaW50IHByb3RvKQotewotICAgIHN0cnVjdCBldGhoZHIgKmV0aDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZHN0X291dCA9IE5VTEw7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAob3V0ID09IE5VTEwpCi0gICAgICAgIGdvdG8gUkVMOwotCi0gICAgLy+99rbU0tTMq834wODN+L/avfjQ0E1BQ8231KS4s9a1o6zG5Mv8tcTI51BQUKGiUFBQb0XV4tCpo6y91MrHv8mx5LXEo6yyu8Tc1KS4s9a1o7uyzrz7YWxsb2NfbmV0ZGV2us1hbGxvY19ldGhlcmRldr3Tv9oKLSAgICBpZiAob3V0LT50eXBlICE9IEFSUEhSRF9FVEhFUikKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvL7bU09qz9r/azqrN+MfFYnLKsaOs1rG907vxyKFMMs34wufJ6LG4o6y8tHVzYjC78ndpZmkwCi0gICAgaWYgKG91dC0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKQotICAgIHsKLSAgICAgICAgaWYob3V0LT5kZXZfYWRkciA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBSRUw7Ci0KLSAgICAgICAgaWYgKGZhc3Ricl9sZXZlbCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBkc3Rfb3V0ID0gZ2V0YnJwb3J0X2J5ZHN0KG91dCwgbmVpZ2gtPmhhKTsKLSAgICAgICAgICAgIGlmIChkc3Rfb3V0ID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsIiEhISEhIGdldGJycG9ydF9ieWRzdCBmYWlsIFxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBSRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnRyeV9kYXRhLT5vdXRkZXYgPSBkc3Rfb3V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnlfZGF0YS0+b3V0ZGV2ID0gb3V0OwotICAgICAgICB9Ci0gICAgICAgIGVudHJ5X2RhdGEtPmhoX2ZsYWcgPSAxOwotICAgICAgICBldGggPSAoc3RydWN0IGV0aGhkciAqKWVudHJ5X2RhdGEtPmhoX2RhdGE7Ci0gICAgICAgIGV0aC0+aF9wcm90byA9IHByb3RvOwotICAgICAgICBtZW1jcHkoZXRoLT5oX3NvdXJjZSwgb3V0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotICAgICAgICBtZW1jcHkoZXRoLT5oX2Rlc3QsIG5laWdoLT5oYSwgRVRIX0FMRU4pOwotICAgIH0KLSAgICAvL3BwcNeqt6KjrNa70OjSqrSry81JULD8Ci0gICAgZWxzZSBpZiAoc3RybmNtcChvdXQtPm5hbWUsIHBwcF9uYW1lLCBzdHJsZW4ocHBwX25hbWUpKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYob3V0LT5kZXZfYWRkciA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBSRUw7Ci0KLSAgICAgICAgZW50cnlfZGF0YS0+b3V0ZGV2ID0gb3V0OwotICAgICAgICBlbnRyeV9kYXRhLT5oaF9mbGFnID0gMDsKLSAgICB9Ci0gICAgLy/G1c2otcTS1MyrzfjK/b7d16q3ogotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKG91dC0+ZGV2X2FkZHIgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gUkVMOwotCi0gICAgICAgIC8vttTT2ndpZmkgc3RhdGlvbi9SSjQ1L1VTQrXIo6zQ6NKquLPWtU1BQ823Ci0gICAgICAgIGVudHJ5X2RhdGEtPm91dGRldiA9IG91dDsKLSAgICAgICAgZW50cnlfZGF0YS0+aGhfZmxhZyA9IDE7Ci0gICAgICAgIGV0aCA9IChzdHJ1Y3QgZXRoaGRyICopZW50cnlfZGF0YS0+aGhfZGF0YTsKLSAgICAgICAgZXRoLT5oX3Byb3RvID0gcHJvdG87Ci0gICAgICAgIG1lbWNweShldGgtPmhfc291cmNlLCBvdXQtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0gICAgICAgIG1lbWNweShldGgtPmhfZGVzdCwgbmVpZ2gtPmhhLCBFVEhfQUxFTik7Ci0gICAgfQotICAgIHJldHVybiAxOwotCi1SRUw6Ci0gICAgLy/WrsewwbS907/JxNzS0bG7tLS9qKOs0OjSqsm+s/3L+dPQ18rUtAotICAgIGZvciAoaSA9IDA7IGkgPCBJUF9DVF9ESVJfTUFYOyBpKyspCi0gICAgewotICAgICAgICBpZiAoZW50cnktPmZsYWdzICYgKDEgPDwgaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhsaXN0X251bGxzX2RlbCgmZW50cnktPmRhdGFbaV0udHVwbGVoYXNoLmhubm9kZSk7Ci0gICAgICAgICAgICBkZXZfcHV0KGVudHJ5LT5kYXRhW2ldLm91dGRldik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy+71ri0Y3S1xLOsyrEKLSAgICAvL2FkZF90aW1lcigmY3QtPnRpbWVvdXQpOwotICAgIC8vbmZfY3RfcHV0KGN0KTsKLSAgICBhdG9taWNfZGVjKCYoY3QtPmN0X2dlbmVyYWwudXNlKSk7Ci0gICAgZGVsX3RpbWVyKCZlbnRyeS0+dGltZW91dCk7Ci0gICAgZm5fbGlzdF9kZWwoZW50cnktPmxpc3RfaGVhZCwgZW50cnkpOwotICAgIHJldHVybiAwOwotfQotCi0vKiC4+b7dxL+1xE1BQ7rNzfjHxbLp1dLHxbXjo6zV0rW9t7W72MfFteOjrLfx1PK3tbvYTlVMTCAqLwotc3RydWN0IG5ldF9kZXZpY2UgKmdldEJyaWRnZVBvcnQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCi17Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRzdF9vdXQgPSBOVUxMOwotCi0gICAgaWYgKCF0ZXN0X2JpdChGQVNUX1RZUEVfQlJfTE9DQUxfQklULCAmZmFzdF9zd2l0Y2gpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmICghb3V0IHx8ICFuZWlnaCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvL732ttTS1MyrzfjA4M34v9q9+NDQTUFDzbfUpLiz1rUKLSAgICBpZiAob3V0LT50eXBlICE9IEFSUEhSRF9FVEhFUikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvL7bU09qz9r/azqrN+MfFyrGjrNaxvdO78cihTDLHxbXjyeixuAotICAgIGlmIChvdXQtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkKLSAgICB7Ci0gICAgICAgIGlmIChvdXQtPmRldl9hZGRyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICAvL7vxyKHHxbXjCi0gICAgICAgIGRzdF9vdXQgPSBnZXRicnBvcnRfYnlkc3Qob3V0LCBuZWlnaC0+aGEpOwotICAgICAgICBpZiAoZHN0X291dCAmJiBkc3Rfb3V0ICE9IG91dCkKLSAgICAgICAgICAgIHJldHVybiBkc3Rfb3V0OwotCi0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiISEhISEgZ2V0YnJwb3J0X2J5ZHN0IGZhaWwgXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vxdC2z7K70OjSqr6tuf1mYXN0bmF0tcTQrdLpsPwKLWludCBjaGVja19za2lwX3BvcnRzKHVuc2lnbmVkIGludCBuZXRfZHN0X3BvcnQpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHVuc2lnbmVkIGludCBkc3RfcG9ydCA9IGh0b25zKG5ldF9kc3RfcG9ydCk7Ci0KLSAgICBpZiAoIWRzdF9wb3J0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yobm9mYXN0X3BvcnQpL3NpemVvZihub2Zhc3RfcG9ydFswXSk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChkc3RfcG9ydCA9PSBub2Zhc3RfcG9ydFtpXSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vwbSx7bXEstnX99b3zOW6r8r9o6zE2rK/yrXP1rOsyrGhosnosbjKwrz+tcjBtLHtstnX9wotdm9pZCB0cmF2ZXJzZV9wcm9jZXNzKGZhc3RfbGlzdF90ICpsaXN0X2hlYWQsIHVuc2lnbmVkIGxvbmcgcGFyYW0pCi17Ci0gICAgZmFzdF9lbnRyeV90ICplbnRyeSwgKm5leHQ7Ci0gICAgdHJhdmVyc2VfY29tbWFuZF90ICpjbWQ7Ci0gICAgaW50IGksIG5lZWRfZGVsOwotCi0gICAgY21kID0gKHRyYXZlcnNlX2NvbW1hbmRfdCAqKXBhcmFtOwotICAgIGlmICghY21kKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvcihlbnRyeSA9IGxpc3RfaGVhZC0+bmV4dDsgZW50cnk7IGVudHJ5ID0gbmV4dCkKLSAgICB7Ci0gICAgICAgIG5leHQgPSBlbnRyeS0+bmV4dDsKLSAgICAgICAgbmVlZF9kZWwgPSAwOwotCi0gICAgICAgIGlmIChjbWQtPmNtZCA9PSBUUkFWRVJTRV9DTURfREVWX0RPV04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBJUF9DVF9ESVJfTUFYOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5mbGFncyAmICgxIDw8IGkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm5fbmF0ICpuYXQgPSBuZmN0X25hdChlbnRyeS0+Y3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGVudHJ5LT5kYXRhW2ldLm91dGRldiAmJiBlbnRyeS0+ZGF0YVtpXS5vdXRkZXYtPmlmaW5kZXggPT0gY21kLT5hcmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKG5hdCAmJiBuYXQtPm1hc3FfaW5kZXggPT0gY21kLT5hcmcpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2RlbCA9IEZBU1RfQUxMX0RJUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRfZGVsKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxfdGltZXIoJmVudHJ5LT50aW1lb3V0KTsKLSAgICAgICAgICAgIHdvcmtpbmdoYXNoX2RlbF9ub2RlKGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChuZWVkX2RlbCA9PSBGQVNUX0FMTF9ESVIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFzdGxpc3RfZGVsX2VudHJ5KGVudHJ5LT5saXN0X2hlYWQsIGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy9mYXN0bmF0X2xldmVsudix1aOsx+W/1cv509BpcHY0LGlwdja/7MvZ16q3otDFz6KjrLGjwfTUrWN0way90wotdm9pZCBmYXN0X2NsZWFudXBfbGlua3MoZmFzdF9saXN0X3QgKmxpc3RfaGVhZCkKLXsKLSAgICBmYXN0X2VudHJ5X3QgKmVudHJ5LCAqbmV4dDsKLQotICAgIGZvciAoZW50cnkgPSBsaXN0X2hlYWQtPm5leHQ7IGVudHJ5OyBlbnRyeSA9IG5leHQpCi0gICAgewotICAgICAgICBuZXh0ID0gZW50cnktPm5leHQ7Ci0gICAgICAgIC8vyb6z/WVudHJ519S2qNLltcS2qMqxxvcKLSAgICAgICAgZGVsX3RpbWVyKCZlbnRyeS0+dGltZW91dCk7Ci0KLSAgICAgICAgd29ya2luZ2hhc2hfZGVsX25vZGUoZW50cnkpOwotCi0gICAgICAgIC8vu9a4tGN0tcSzrMqxCi0gICAgICAgIC8vYWRkX3RpbWVyKCZlbnRyeS0+Y3QtPnRpbWVvdXQpOwotICAgICAgICBmbl9saXN0X2RlbChsaXN0X2hlYWQsIGVudHJ5KTsKLQotICAgIH0KLX0KLQotdm9pZCBhdGhyX2Zhc3RfZHVtcChpbnQgY3RsKQotewotCi19Ci0vKiBCdWlsdC1pbiBkZWZhdWx0IHpvbmUgdXNlZCBlLmcuIGJ5IG1vZHVsZXMuICovCi1jb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgbmZfY3Rfem9uZV9kZmx0X2Zhc3QgPSB7Ci0gICAgLmlkCT0gTkZfQ1RfREVGQVVMVF9aT05FX0lELAotICAgIC5kaXIJPSBORl9DVF9ERUZBVUxUX1pPTkVfRElSLAotfTsKLQotLyogKioqKioqKioqKioqKioqKiogv+zL2deqt6LNs9K7tKbA7bqvyv0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiCy6dGvwvrX47/sy9nXqreitcRjdNDFz6IgLS0tILLOv7xuZl9jb25udHJhY2tfaW7Ktc/WICovCi1zdHJ1Y3QgbmZfY29ubiAqc2tiX2dldF9jdChzdHJ1Y3QgbmZfY29ubiAqKnRtcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICoqbDRwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZGF0YW9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90IHBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90ICpwcm90b251bSkKLXsKLSAgICBpbnQgcmV0OwotICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdHVwbGU7Ci0gICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotICAgIHN0cnVjdCBuZl9jb25uICpjdDsKLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKiB6b25lOwotICAgIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotICAgIHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSB0bXA7Ci0gICAgdTMyIGhhc2g7Ci0KLQotICAgIC8v0tTPwrLOv7xuZl9jb25udHJhY2tfaW7Ktc/WsunRr9LR09BjdAotICAgICp0bXBsID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0gICAgaWYgKCp0bXBsIHx8IGN0aW5mbyA9PSBJUF9DVF9VTlRSQUNLRUQpIHsKLSAgICAgICAgLyogUHJldmlvdXNseSBzZWVuIChsb29wYmFjayBvciB1bnRyYWNrZWQpPyAgSWdub3JlLiAqLwotICAgICAgICBpZiAoKCp0bXBsICYmICFuZl9jdF9pc190ZW1wbGF0ZSgqdG1wbCkpIHx8Ci0gICAgICAgICAgICAgICAgY3RpbmZvID09IElQX0NUX1VOVFJBQ0tFRCkgewotICAgICAgICAgICAgZ290byBlcnJfb3V0OwotICAgICAgICB9Ci0gICAgICAgIHNrYi0+X25mY3QgPSAwOwotICAgIH0KLQotICAgICpkYXRhb2ZmID0gZ2V0X2w0cHJvdG9fZmFzdChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLCBwZiwgcHJvdG9udW0pOwotCi0gICAgaWYgKCpkYXRhb2ZmIDw9IDApIHsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotCi0gICAgKmw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmQoKnByb3RvbnVtKTsKLQotCi0gICAgaWYgKCpwcm90b251bSAhPSBJUFBST1RPX1RDUCAmJiAqcHJvdG9udW0gIT0gSVBQUk9UT19VRFApCi0gICAgICAgIGdvdG8gZXJyX291dDsKLQotICAgIGlmICghbmZfY3RfZ2V0X3R1cGxlX2Zhc3Qoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhb2ZmLCBwZiwgKnByb3RvbnVtLCAmaW5pdF9uZXQsICZ0dXBsZSkpIHsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotCi0gICAgem9uZSA9IG5mX2N0X3pvbmVfdG1wbCgqdG1wbCwgc2tiLCAmdG1wKTsKLSAgICBoYXNoID0gaGFzaF9jb25udHJhY2tfcmF3X2Zhc3QoJnR1cGxlLCAmaW5pdF9uZXQpOwotCi0gICAgaCA9IG5mX2Nvbm50cmFja19maW5kX2Zhc3QoJmluaXRfbmV0LCB6b25lLCAmdHVwbGUsIGhhc2gpOwotCi0gICAgaWYgKCFoIHx8IElTX0VSUihoKSkKLSAgICAgICAgZ290byBlcnJfb3V0OwotCi0gICAgY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0KLSAgICBpZiAoIWN0IHx8IElTX0VSUihjdCkpIHsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIGlmICh0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykgfHwgdGVzdF9iaXQoSVBTX1VOVFJBQ0tFRF9CSVQsICZjdC0+c3RhdHVzKSkKLSAgICB7Ci0gICAgICAgIG5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIGlmICgqdG1wbCAmJiAqdG1wbCA9PSBjdCkKLSAgICB7Ci0gICAgICAgIG5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIC8vVENQsdjQ68urz/K9qMG0uvOyxdffv+zL2deqt6IKLSAgICBpZiAoSVBQUk9UT19UQ1AgPT0gKnByb3RvbnVtICYmICF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKSkKLSAgICB7Ci0gICAgICAgIG5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIGlmIChORl9DVF9ESVJFQ1RJT04oaCkgPT0gSVBfQ1RfRElSX1JFUExZKSB7Ci0gICAgICAgICpkaXIgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpkaXIgPSAwOwotICAgIH0KLSAgICByZXR1cm4gY3Q7Ci0KLWVycl9vdXQgOgotICAgIHByaW50X3N1bihTVU5fREJHLCAic2tiIDogMHgleCwgc2tiX2dldF9jdCBmYWlsISEhISEhISEhISIsIHNrYik7Ci0gICAgaWYgKCp0bXBsKSB7Ci0gICAgICAgIG5mX2N0X3NldChza2IsIChzdHJ1Y3QgbmZfY29ubiAqKSYoKCp0bXBsKS0+Y3RfZ2VuZXJhbCksIGN0aW5mbyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBza2ItPl9uZmN0ID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8v0MK1xGZhc3TEo8q9tKbA7be9yr0KLWludCBmYXN0X2Zvcl9pcF9uZXcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgaW50KCpmYXN0X2Z3KShzdHJ1Y3QgbmZfY29ubiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmZfY29ubiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqLCB1bnNpZ25lZCBpbnQsIGludCwgdV9pbnQ4X3QpLAotICAgICAgICAgICAgICAgICAgICBpbnQoKmZhc3RfbG9jYWxfcHJvYykoc3RydWN0IG5mX2Nvbm4gKiwgc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5mX2Nvbm4gKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKiwgdW5zaWduZWQgaW50LCBpbnQsIHVfaW50OF90KSwKLSAgICAgICAgICAgICAgICAgICAgaW50IHByb3RvKQotewotICAgIHN0cnVjdCBuZl9jb25uICpjdCA9IE5VTEwsICp0bXBsID0gTlVMTDsKLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87Ci0gICAgdW5zaWduZWQgaW50IGRhdGFvZmY7Ci0gICAgdV9pbnQ4X3QgcHJvdG9udW07Ci0gICAgaW50IGRpciA9IDA7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAocHJvdG8gPT0gRVRIX1BfSVApCi0gICAgICAgIGN0ID0gc2tiX2dldF9jdCgmdG1wbCwgc2tiLCAmbDRwcm90bywgJmRhdGFvZmYsIFBGX0lORVQsIE5GX0lORVRfUFJFX1JPVVRJTkcsICZkaXIsICZwcm90b251bSk7Ci0gICAgZWxzZSBpZiAocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICAgICAgY3QgPSBza2JfZ2V0X2N0KCZ0bXBsLCBza2IsICZsNHByb3RvLCAmZGF0YW9mZiwgUEZfSU5FVDYsIE5GX0lORVRfUFJFX1JPVVRJTkcsICZkaXIsICZwcm90b251bSk7Ci0gICAgaWYgKCFjdCkKLSAgICB7Ci0gICAgICAgIGlmIChmYXN0X2JyX3Byb2MgJiYgZmFzdF9icl9wcm9jKHNrYikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhc3Ricl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgLypUQ1Cx2NDryP20zs7VytazybmmoaJmYXN0vajBtLPJuaYqLwotICAgIGlmIChJUFBST1RPX1RDUCA9PSBwcm90b251bSB8fCBORVhUSERSX1RDUCA9PSBwcm90b251bSkKLSAgICB7Ci0gICAgICAgIGludCByZGlyID0gKElQX0NUX0RJUl9PUklHSU5BTCA9PSBkaXIpID8gSVBfQ1RfRElSX1JFUExZOiBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0gICAgICAgIGlmICghdGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmY3QtPnN0YXR1cykpIHsKLSAgICAgICAgICAgIG5mX2Nvbm50cmFja19wdXQoJmN0LT5jdF9nZW5lcmFsKTsKLSAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0X2Z3X3NwaW5sb2NrKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKGN0LT5mYXN0X2N0LmZhc3RfZHN0W2Rpcl0gJiYgY3QtPmZhc3RfY3QuZmFzdF9kc3RbcmRpcl0pKSB7Ci0gICAgICAgICAgICBuZl9jb25udHJhY2tfcHV0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0gICAgICAgICAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBzd2l0Y2goY3QtPmZhc3RfY3QuaXNGYXN0KQotICAgIHsKLSAgICBjYXNlIEZBU1RfQ1RfRlc0OgotICAgIGNhc2UgRkFTVF9DVF9GVzY6Ci0gICAgICAgIGlmIChmYXN0X2Z3ICYmIGZhc3RfZncodG1wbCwgc2tiLCBjdCwgbDRwcm90bywgZGF0YW9mZiwgZGlyLCBwcm90b251bSkpIHsKLSAgICAgICAgICAgIGlmIChwcm90byA9PSBFVEhfUF9JUCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYXN0bmF0X251bSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChwcm90byA9PSBFVEhfUF9JUFY2KQotICAgICAgICAgICAgICAgIGZhc3Q2X251bSsrOwotICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRkFTVF9DVF9MT0NBTDQ6Ci0gICAgY2FzZSBGQVNUX0NUX0xPQ0FMNjoKLSAgICAgICAgaWYgKGZhc3RfbG9jYWxfcHJvYyAmJiBmYXN0X2xvY2FsX3Byb2ModG1wbCwgc2tiLCBjdCwgbDRwcm90bywgZGF0YW9mZiwgZGlyLCBwcm90b251bSkpIHsKLSAgICAgICAgICAgIGlmIChwcm90byA9PSBFVEhfUF9JUCkKLSAgICAgICAgICAgICAgICBmYXN0X2xvY2FsNF9yY3ZfbnVtKys7Ci0gICAgICAgICAgICBlbHNlIGlmIChwcm90byA9PSBFVEhfUF9JUFY2KQotICAgICAgICAgICAgICAgIGZhc3RfbG9jYWw2X3Jjdl9udW0rKzsKLSAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXQgPSAwOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBuZl9jb25udHJhY2tfcHV0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0gICAgICAgIGlmIChmYXN0X2JyX3Byb2MgJiYgZmFzdF9icl9wcm9jKHNrYikpIHsKLSAgICAgICAgICAgIGZhc3Ricl9udW0rKzsKLSAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXQgPSAwOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLy++ybXEZmFzdMSjyr20psDtt73KvQotaW50IGZhc3RfZm9yX2lwKHN0cnVjdCBza19idWZmICpza2IsIGludCgqZmFzdF9mdykoc3RydWN0IHNrX2J1ZmYgKiksCi0gICAgICAgICAgICAgICAgaW50KCogZmFzdF9sb2NhbF9wcm9jKShzdHJ1Y3QgbmZfY29ubiAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmZfY29ubiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICosIHVuc2lnbmVkIGludCwgaW50LCB1X2ludDhfdCksCi0gICAgICAgICAgICAgICAgaW50IHByb3RvKQotewotICAgIHN0cnVjdCBuZl9jb25uICpjdCA9IE5VTEwsICp0bXBsID0gTlVMTDsKLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87Ci0gICAgdW5zaWduZWQgaW50IGRhdGFvZmY7Ci0gICAgdV9pbnQ4X3QgcHJvdG9udW07Ci0gICAgaW50IGRpciA9IDA7Ci0gICAgLy/XqreioaLHxb3ToaKxvrXYy7PQ8rSmwO0KLSAgICBpZiAoZmFzdF9md2RfbGV2ZWwgPiBmYXN0X2JyX2xldmVsICYmIGZhc3RfYnJfbGV2ZWwgPiBmYXN0X2xvY2FsX2xldmVsKQotICAgIHsKLSAgICAgICAgaWYgKGZhc3RfZncgJiYgZmFzdF9mdyhza2IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJvdG8gPT0gRVRIX1BfSVApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFzdG5hdF9udW0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvID09IEVUSF9QX0lQVjYpCi0gICAgICAgICAgICAgICAgZmFzdDZfbnVtKys7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmYXN0X2JyX3Byb2MgJiYgZmFzdF9icl9wcm9jKHNrYikgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgZmFzdGJyX251bSsrOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy/XqreioaKxvrXYoaLHxb3Ty7PQ8rSmwO0KLSAgICBlbHNlIGlmIChmYXN0X2Z3ZF9sZXZlbCA+IGZhc3RfbG9jYWxfbGV2ZWwgJiYgZmFzdF9sb2NhbF9sZXZlbCA+IGZhc3RfYnJfbGV2ZWwpCi0gICAgewotICAgICAgICBpZiAoZmFzdF9mdyAmJiBmYXN0X2Z3KHNrYikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcm90byA9PSBFVEhfUF9JUCkKLSAgICAgICAgICAgICAgICBmYXN0bmF0X251bSsrOwotICAgICAgICAgICAgZWxzZSBpZiAocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICAgICAgICAgICAgICBmYXN0Nl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZhc3RfYnJfcHJvYyAmJiBmYXN0X2JyX3Byb2Moc2tiKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYXN0YnJfbnVtKys7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL8fFvdOhoteqt6KhorG+tdjLs9DytKbA7QotICAgIGVsc2UgaWYgKGZhc3RfYnJfbGV2ZWwgPiBmYXN0X2Z3ZF9sZXZlbCAmJiBmYXN0X2Z3ZF9sZXZlbCA+IGZhc3RfbG9jYWxfbGV2ZWwpCi0gICAgewotICAgICAgICBpZiAoZmFzdF9icl9wcm9jICYmIGZhc3RfYnJfcHJvYyhza2IpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhc3Ricl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZhc3RfZncgJiYgZmFzdF9mdyhza2IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJvdG8gPT0gRVRIX1BfSVApCi0gICAgICAgICAgICAgICAgZmFzdG5hdF9udW0rKzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvID09IEVUSF9QX0lQVjYpCi0gICAgICAgICAgICAgICAgZmFzdDZfbnVtKys7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL8fFvdOhorG+tdihoteqt6LLs9DytKbA7QotICAgIGVsc2UgaWYoZmFzdF9icl9sZXZlbCA+IGZhc3RfbG9jYWxfbGV2ZWwgJiYgZmFzdF9sb2NhbF9sZXZlbCA+IGZhc3RfZndkX2xldmVsKQotICAgIHsKLSAgICAgICAgaWYgKGZhc3RfYnJfcHJvYyAmJiBmYXN0X2JyX3Byb2Moc2tiKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYXN0YnJfbnVtKys7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChmYXN0X2xvY2FsX3Byb2MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcm90byA9PSBFVEhfUF9JUCkKLSAgICAgICAgICAgICAgICBjdCA9IHNrYl9nZXRfY3QoJnRtcGwsIHNrYiwgJmw0cHJvdG8sICZkYXRhb2ZmLCBQRl9JTkVULCBORl9JTkVUX1BSRV9ST1VUSU5HLCAmZGlyLCAmcHJvdG9udW0pOwotICAgICAgICAgICAgZWxzZSBpZiAocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICAgICAgICAgICAgICBjdCA9IHNrYl9nZXRfY3QoJnRtcGwsIHNrYiwgJmw0cHJvdG8sICZkYXRhb2ZmLCBQRl9JTkVUNiwgTkZfSU5FVF9QUkVfUk9VVElORywgJmRpciwgJnByb3RvbnVtKTsKLQotICAgICAgICAgICAgaWYoIWN0KQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICBpZiAoZmFzdF9sb2NhbF9wcm9jKHRtcGwsIHNrYiwgY3QsIGw0cHJvdG8sIGRhdGFvZmYsIGRpciwgcHJvdG9udW0pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3RvID09IEVUSF9QX0lQKQotICAgICAgICAgICAgICAgICAgICBmYXN0X2xvY2FsNF9yY3ZfbnVtKys7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICAgICAgICAgICAgICAgICAgZmFzdF9sb2NhbDZfcmN2X251bSsrOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZhc3RfZncgJiYgZmFzdF9mdyhza2IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJvdG8gPT0gRVRIX1BfSVApCi0gICAgICAgICAgICAgICAgZmFzdG5hdF9udW0gKys7Ci0gICAgICAgICAgICBlbHNlIGlmIChwcm90byA9PSBFVEhfUF9JUFY2KQotICAgICAgICAgICAgICAgIGZhc3Q2X251bSsrOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy+xvrXYoaLXqreioaLHxb3Ty7PQ8rSmwO0KLSAgICBlbHNlIGlmKGZhc3RfbG9jYWxfbGV2ZWwgPiBmYXN0X2Z3ZF9sZXZlbCAmJiBmYXN0X2Z3ZF9sZXZlbCA+IGZhc3RfYnJfbGV2ZWwpCi0gICAgewotICAgICAgICBpZiAoZmFzdF9mdyAmJiBmYXN0X2Z3KHNrYikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcm90byA9PSBFVEhfUF9JUCkKLSAgICAgICAgICAgICAgICBmYXN0bmF0X251bSsrOwotICAgICAgICAgICAgZWxzZSBpZiAocHJvdG8gPT0gRVRIX1BfSVBWNikKLSAgICAgICAgICAgICAgICBmYXN0Nl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZhc3RfYnJfcHJvYyA9PSAxICYmIGZhc3RfYnJfcHJvYyhza2IpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhc3Ricl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vsb612KGix8W906Gi16q3osuz0PK0psDtCi0gICAgZWxzZSBpZihmYXN0X2xvY2FsX2xldmVsID4gZmFzdF9icl9sZXZlbCAmJiBmYXN0X2JyX2xldmVsID4gZmFzdF9md2RfbGV2ZWwpCi0gICAgewotICAgICAgICBpZiAoZmFzdF9icl9wcm9jICYmIGZhc3RfYnJfcHJvYyhza2IpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhc3Ricl9udW0rKzsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGZhc3RfZncgJiYgZmFzdF9mdyhza2IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJvdG8gPT0gRVRIX1BfSVApCi0gICAgICAgICAgICAgICAgZmFzdG5hdF9udW0rKzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvID09IEVUSF9QX0lQVjYpCi0gICAgICAgICAgICAgICAgZmFzdDZfbnVtKys7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGJ0cnVua19mdyA9IDA7Ci1tb2R1bGVfcGFyYW0oYnRydW5rX2Z3LCBpbnQsIDA2NDQpOwotLy9leHRlcm4gaW50IGZhc3RfZndkX2lwNGFkZHJfY29uZmxpY3Qoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0vL2V4dGVybiBpbnQgZmFzdF9mb3JfbXVsdGljYXN0KHN0cnVjdCBza19idWZmICpza2IpOwotLyrTydPav8nE3LK7tObU2k1BQ9ahzbejrMjnUFPN+L/ao6zL+dLU0OjSqs2ouf1JUM23yrax8LP2c2tiLT5wcm90b2NvbNa1Ki8KLWludCBmYXN0X2Zvcl9pcGRhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQotICAgIHN0cnVjdCBpcGhkciAqaXBoOwotCi0gICAgaWYgKHNrYi0+bGVuID4gMTAwMCkKLSAgICAgICAgc2tiX2JpZ19udW0rKzsKLSAgICBlbHNlIGlmIChza2ItPmxlbiA8IDEwMCkKLSAgICAgICAgc2tiX3NtYWxsX251bSsrOwotCi0gICAgaWYgKHNrYi0+ZGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgLy9pcHY0Ci0gICAgewotICAgICAgICBza2JfbnVtNCsrOwotICAgICAgICBza2JfYnl0ZXM0ICs9IHNrYi0+bGVuOwotCi0gICAgICAgIGlmKGJ0cnVua19mdyAmJiBmYXN0X2Z3ZF9pcDRhZGRyX2NvbmZsaWN0KHNrYikgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgLy/W97KltcS/7MvZ16q3oqOstP3Ktc/Wo6zU3cqx1rvX9s2zvMYKLSAgICAgICAgaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwX2hkcihza2IpLT5kYWRkcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG11bHRpY2FzdF9udW00Kys7Ci0gICAgICAgICAgICBpZihidHJ1bmtfZncgJiYgZmFzdF9mb3JfbXVsdGljYXN0KHNrYikgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vueOypbK71qez1r/sy9nXqreio6zWu9f2zbO8xgotICAgICAgICBlbHNlIGlmIChpcHY0X2lzX2xiY2FzdChpcF9oZHIoc2tiKS0+ZGFkZHIpKSB7Ci0gICAgICAgICAgICBicm9hZGNhc3RfbnVtNCsrOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXBfaXNfZnJhZ21lbnQoaXBfaGRyKHNrYikpKQotICAgICAgICB7Ci0gICAgICAgICAgICBza2JpbmZvX2FkZChOVUxMLCBTS0JfRlJBRyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8v1rvT0FRDULrNVURQvfjQ0L/sy9nXqreiCi0gICAgICAgIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AgJiYgaXBfaGRyKHNrYiktPnByb3RvY29sICE9IElQUFJPVE9fVURQKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCFmYXN0X2lwaGRyX2NoZWNrKHNrYiwgRVRIX1BfSVApKQotICAgICAgICB7Ci0gICAgICAgICAgICBpcGhkcl9lcnJfbnVtKys7Ci0gICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyrI57n709BwYWRkaW5no6zU8sils/1za2LOsrK/tcRwYWRkaW5nLCCyzr+8aXBfcmN2Ki8KLSAgICAgICAgc2tiX3RyaW0oc2tiLCBudG9ocyhpcF9oZHIoc2tiKS0+dG90X2xlbikpOwotCi0gICAgICAgIC8qIHRjcM23sr/Qxc+ivOCy4iovCi0gICAgICAgIGlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKLSAgICAgICAgICAgIGlmICghZmFzdF90Y3BoZHJfY2hlY2soc2tiLCBFVEhfUF9JUCkpCXsKLSAgICAgICAgICAgICAgICB0Y3BoZHJfZXJyX251bSsrOwotICAgICAgICAgICAgICAgIC8va2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0ZXN0X2JpdChGQVNUX1RZUEVfVkVSU0lPTl9CSVQsICZmYXN0X3N3aXRjaCkpCi0gICAgICAgICAgICByZXR1cm4gZmFzdF9mb3JfaXAoc2tiLCBmYXN0X25hdDRfcHJvYywgZmFzdF9sb2NhbDRfcHJvYywgRVRIX1BfSVApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFzdF9mb3JfaXBfbmV3KHNrYiwgZmFzdF9mdzRfcHJvYywgZmFzdF9sb2NhbDRfcHJvYywgRVRIX1BfSVApOwotCi0gICAgfQotICAgIGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIC8vaXB2NgotICAgIHsKLSAgICAgICAgc2tiX251bTYrKzsKLSAgICAgICAgc2tiX2J5dGVzNiArPSBza2ItPmxlbjsKLQotICAgICAgICAvL9fpsqW1xL/sy9nXqreio6y0/cq1z9ajrNTdyrHWsb3Tt7W72L/sy9nXqreiyqew3AotICAgICAgICBpZihpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZpcHY2X2hkcihza2IpLT5kYWRkcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG11bHRpY2FzdF9udW02Kys7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCFmYXN0X2lwaGRyX2NoZWNrKHNrYiwgRVRIX1BfSVBWNikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlwNmhkcl9lcnJfbnVtKys7Ci0gICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIC8qyOe5+9PQcGFkZGluZ6Os1PLIpbP9c2tizrKyv7XEcGFkZGluZ6Osss6/vGlwdjZfcmN2Ki8KLSAgICAgICAgc2tiX3RyaW0oc2tiLCBudG9ocyhpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbikgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLSAgICAgICAgLyogdGNwzbeyv9DFz6K84LLiKi8KLSAgICAgICAgaWYgKCFmYXN0X3RjcGhkcl9jaGVjayhza2IsIEVUSF9QX0lQVjYpKQl7Ci0gICAgICAgICAgICB0Y3A2aGRyX2Vycl9udW0rKzsKLSAgICAgICAgICAgIC8va2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICAgICAgICAgIHJldHVybiBmYXN0X2Zvcl9pcChza2IsIGZhc3RfbmF0Nl9wcm9jLCBmYXN0X2xvY2FsNl9wcm9jLCBFVEhfUF9JUFY2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhc3RfZm9yX2lwX25ldyhza2IsIGZhc3RfZnc2X3Byb2MsIGZhc3RfbG9jYWw2X3Byb2MsIEVUSF9QX0lQVjYpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHNrYl91bmtub3duKys7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qc2ti1rjV68z416q1vUlQzbcqLwotc3RhdGljIGludCBzZXRfc2tiZGF0YV90b2lwKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgX19iZTE2IG5leHRfcHJvID0gc2tiLT5wcm90b2NvbDsKLWFnYWluOgotICAgIGlmIChuZXh0X3BybyA9PSBodG9ucyhFVEhfUF9JUCkgfHwgbmV4dF9wcm8gPT0gaHRvbnMoRVRIX1BfSVBWNikpCi0gICAgewotICAgICAgICBza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgMCk7Ci0gICAgICAgIHNrYl9yZXNldF9tYWNfbGVuKHNrYik7Ci0gICAgICAgIHNrYi0+cHJvdG9jb2wgPSBuZXh0X3BybzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIC8vdmxhbgotICAgIGVsc2UgaWYgKG5leHRfcHJvID09IGNwdV90b19iZTE2KEVUSF9QXzgwMjFRKSkKLSAgICB7Ci0gICAgICAgIHNrYi0+aXN2bGFuID0gMTsKLSAgICAgICAgc2tiX3B1bGwoc2tiLCBWTEFOX0hMRU4pOwotICAgICAgICBuZXh0X3BybyA9ICooKF9fYmUxNiAqKShza2ItPmRhdGEgLSAyKSk7Ci0gICAgICAgIGdvdG8gYWdhaW47Ci0gICAgfQotCi0gICAgLy9wcHBvZQotICAgIGVsc2UgaWYgKG5leHRfcHJvID09IGh0b25zKEVUSF9QX1BQUF9TRVMpKQotICAgIHsKLSAgICAgICAgaWYgKCooc2tiLT5kYXRhICsgNikgPT0gMHgwMCAmJiAqKHNrYi0+ZGF0YSArIDcpID09IDB4MjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5leHRfcHJvID0gaHRvbnMoRVRIX1BfSVApOwotICAgICAgICAgICAgX19za2JfcHVsbChza2IsIFBQUE9FX0hFQURFUl9MRU4pOwotICAgICAgICAgICAgZ290byBhZ2FpbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCooc2tiLT5kYXRhKyA2KSA9PSAweDAwICYmICooc2tiLT5kYXRhICsgNykgPT0gMHg1NykKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dF9wcm8gPSBodG9ucyhFVEhfUF9JUFY2KTsKLSAgICAgICAgICAgIF9fc2tiX3B1bGwoc2tiLCBQUFBPRV9IRUFERVJfTEVOKTsKLSAgICAgICAgICAgIGdvdG8gYWdhaW47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qttTE2rrLZGV2LmPW0Mr9vt29+NDQv+zL2bSmwO2jrNPQaXCw/KGicHBwsPy1yCovCi1zdGF0aWMgaW50IHRyeV9mYXN0X2Zvcl9uZXRjb3JlZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotICAgIF9fYmUxNiBvbGRfcHJvID0gc2tiLT5wcm90b2NvbDsKLSAgICB1bnNpZ25lZCBpbnQgb2xkX2xlbiA9IHNrYi0+bGVuOwotICAgIHVuc2lnbmVkIGNoYXIgKiBvbGRfZGF0YSA9IHNrYi0+ZGF0YTsKLSAgICBfX2JlMTYgb2xkX25ldGhlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7Ci0KLSAgICAvL2lwzbc019a92rbUxusKLSAgICAvL2lmICgoKHVuc2lnbmVkIGxvbmcpc2tiLT5kYXRhKSU0ICE9IDApCi0gICAgLy9wYW5pYygiRVJSOiBmYXN0IGZyb20gZGV2IHNrYi0+ZGF0YSU0ICE9IDAiKTsKLQotICAgIGlmIChza2ItPmluZGV2ID09IE5VTEwpCi0gICAgICAgIHNrYi0+aW5kZXYgPSBza2ItPmRldjsKLSAgICAvL9Do0qrXvMi3tqjOu7W9SVDNt6Osxtq85L/JxNzM+Ln9cHBwL21hYy9wcHBvZbXIuPfW1rLjMs23sr8KLSAgICBpZiAoc2V0X3NrYmRhdGFfdG9pcChza2IpID09IDEgJiYgZmFzdF9mb3JfaXBkYXRhKHNrYikpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLy/I57n7v+zL2bSmwO3Kp7Dco6yx2NDrzai5/cjnz8K4s9a1t7W72LvY1K3KvHNrYrLOyv3WtaOsvbvTybHq17xsaW51eMTausu0psDtCi0gICAgc2tiLT5wcm90b2NvbCA9IG9sZF9wcm87Ci0gICAgc2tiLT5kYXRhID0gb2xkX2RhdGE7Ci0gICAgc2tiLT5sZW4gPSBvbGRfbGVuOwotICAgIHNrYi0+bmV0d29ya19oZWFkZXIgPSBvbGRfbmV0aGVhZGVyOwotICAgIHJldHVybiAwOwotfQotCi0vKrbUc2ti1tDWuM/yTUFD1qHNt7XEx/22r8nPsajK/b7dvfjQ0L/sy9m0psDto6y/ydPD09rL+dPQ0tTMq834vNy5ubXEzfjC58nosbjJz7Goyv2+3bXEv+zL2bSmwO0qLwotc3RhdGljIGludCB0cnlfZmFzdF9mb3JfbWFjZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgIC8qCi0gICAgc3RydWN0IGV0aGhkciAqZXRoOwotICAgIGlmICghKHNrYi0+bmV0d29ya19oZWFkZXIgPT0gMCB8fCBza2ItPm5ldHdvcmtfaGVhZGVyID09IH4wVSkpCi0gICAgICAgIHBhbmljKCJuZXR3b3JrX2hlYWRlciAgICBFUlIhISEhISEhISEhXG4iKTsKLSAgICBza2ItPmRldiA9IGRldjsKLSAgICBpZiAoc2tiLT5pbmRldiA9PSBOVUxMKQotICAgICAgICBza2ItPmluZGV2ID0gZGV2OwotICAgIHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0gICAgZXRoID0gZXRoX2hkcihza2IpOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGgtPmhfcHJvdG87Ci0gICAgc2tiX3B1bGwoc2tiLCBFVEhfSExFTik7Ci0gICAgKi8KLQotICAgIC8vaWYgKHRzcF9taXJyb3JfaGFuZGxlKQotICAgICAgICAvL3RzcF9taXJyb3JfaGFuZGxlKHNrYik7Ci0KLSAgICAvL9fU0dB0Y3AvdWRwsPy8x8K8tqqw/Mqx0dO5psTco6zQ6NKqc2VydmVyts7E3LCy17DX1NHQ06bTw6OsyOe5+7/sy9nXqreiyqew3KOs0OjSqsfls/68x8K8Ci0gICAgLy9uZXRfZGJnX3BlcmZfZGV2X3JlY3YoKGNoYXIgKilza2IsIHNrYi0+ZGV2LT5uYW1lKTsKLSAgICBpZiAodHJ5X2Zhc3RfZm9yX25ldGNvcmVkYXRhKHNrYikpCi0gICAgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgLy/X1NHQdGNwL3VkcLD8vMfCvLaqsPzKsdHTuabE3KOs0OjSqnNlcnZlcrbOxNywstew19TR0NOm08MKLSAgICAvL25ldF9kYmdfcGVyZl9jbGVhcl9sYXN0X2l0ZW0oc2tiKTsKLQotICAgIC8vc2tiX3B1c2goc2tiLCBFVEhfSExFTik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHRzcF9taXJyb3JfaGFuZGxlKTsKLQotLyq0psDtzajWqsG0ysK8/iovCi1zdGF0aWMgaW50IGZhc3RfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgIHRyYXZlcnNlX2NvbW1hbmRfdCBjbWQ7Ci0KLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBORVRERVZfRE9XTjoKLSAgICAgICAgaWYgKGRldikKLSAgICAgICAgewotICAgICAgICAgICAgY21kLmNtZCA9IFRSQVZFUlNFX0NNRF9ERVZfRE9XTjsKLSAgICAgICAgICAgIGNtZC5hcmcgPSBkZXYtPmlmaW5kZXg7Ci0KLSAgICAgICAgICAgIGZhc3RuYXRfZXZlbnQoJmNtZCk7Ci0gICAgICAgICAgICBmYXN0Nl9ldmVudCgmY21kKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi1zdGF0aWMgaW50IGZhc3RfZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQotewotICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwdHI7Ci0KLSAgICByZXR1cm4gZmFzdF9ldmVudCh0aGlzLCBldmVudCwgZGV2KTsKLX0KLQotc3RhdGljIGludCBmYXN0X2luZXRfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCi17Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9ICgoc3RydWN0IGluX2lmYWRkciAqKXB0ciktPmlmYV9kZXYtPmRldjsKLQotICAgIHJldHVybiBmYXN0X2V2ZW50KHRoaXMsIGV2ZW50LCBkZXYpOwotfQotCi0vKnByaW9yaXR5IHNob3VsZCBiZSBoaWdoZXIgdGhhbiBtYXNxdWVyYWRlLCBvdGhlcndpc2Uga2VybmVsIHdpbGwgaGFuZyovCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZhc3RfZGV2X25vdGlmaWVyID0gewotICAgIC5ub3RpZmllcl9jYWxsICAgID0gZmFzdF9kZXZpY2VfZXZlbnQsCi0gICAgLnByaW9yaXR5ID0gMSwKLX07Ci0KLS8qcHJpb3JpdHkgc2hvdWxkIGJlIGhpZ2hlciB0aGFuIG1hc3F1ZXJhZGUsIG90aGVyd2lzZSBrZXJuZWwgd2lsbCBoYW5nKi8KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmFzdF9pbmV0X25vdGlmaWVyID0gewotICAgIC5ub3RpZmllcl9jYWxsICAgID0gZmFzdF9pbmV0X2V2ZW50LAotICAgIC5wcmlvcml0eSA9IDEsCi19OwotCi12b2lkIGZhc3RfZGV2aWNlX2Rvd25fZXZlbnRfYnlfbmFtZShjaGFyICpkZXZfbmFtZSkKLXsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLQotICAgIGlmICghZGV2X25hbWUpCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0VSUiwiZmFzdF9kZXZpY2VfZG93bl9ldmVudF9ieV9uYW1lIGRldl9uYW1lIGlzIG51bGwgXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGRldl9uYW1lKTsKLSAgICBpZiAoIWRldikKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fRVJSLCJmYXN0X2RldmljZV9kb3duX2V2ZW50X2J5X25hbWUgZGV2IG5vdCBmb3VuZCBcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmFzdF9ldmVudChOVUxMLCBORVRERVZfRE9XTiwgZGV2KTsKLQotICAgIC8qYWRkIGJ5IGppYW5namluZyovCi0gICAgZGV2X3B1dChkZXYpOwotfQotCi0vKioqKiDS1M/Csr+31srH0MK1xGZhc3TEo8q9yrnTw7qvyv0gKioqKi8KLWV4dGVybiB2b2lkIGZhc3RfbG9jYWxfY29ubl9yZWxlYXNlKHN0cnVjdCBuZl9jb25uICpjdCk7Ci1leHRlcm4gdm9pZCBmYXN0X2xvY2FsX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29jayAqc2spOwotCi0KLS8qIL2rv+zL2deqt6K52MGqtcRjdLzTtb1zb2NrvMfCvNbQICovCi12b2lkIGZhc3RfZHN0X2FkZF9jdChzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLSAgICBzdHJ1Y3QgY29ubl9saXN0ICplbnRyeTsKLSAgICBpbnQgY29ubl9mbGFnID0gMDsKLQotICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCAmZHN0LT5jb25uX2hlYWQsIGxpc3QpCi0gICAgewotICAgICAgICBpZiAoZW50cnktPm5mY3QgPT0gY3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbm5fZmxhZyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjb25uX2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBjb25uX2xpc3QgKmNvbm5fbGlzdF9ub2RlID0oc3RydWN0IGNvbm5fbGlzdCopa3phbGxvYyhzaXplb2Yoc3RydWN0IGNvbm5fbGlzdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZihjb25uX2xpc3Rfbm9kZSkgewotICAgICAgICAgICAgcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm5fbGlzdF9ub2RlLT5uZmN0LCBjdCk7Ci0gICAgICAgICAgICBsaXN0X2FkZF9yY3UoJmNvbm5fbGlzdF9ub2RlLT5saXN0LCAmZHN0LT5jb25uX2hlYWQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiC4+b7dbmV0X2RldmljZbXEys23xaOsys23xdeqt6LA4M/gudjE2sjdICovCi12b2lkIGZhc3RfZndfY29ubl9yZWxlYXNlX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSogZGV2KQotewotICAgIGludCBoYXNoID0gMDsKLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0gICAgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0gICAgc3RydWN0IG5mX2Nvbm4gKmN0OwotICAgIGludCBkaXI7Ci0gICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKLQotICAgIGlmKGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9DTE9TRSkKLSAgICAgICAgcmV0dXJuIDsKLQotICAgIHJjdV9yZWFkX2xvY2soKTsKLSAgICBmb3IgKGhhc2ggPSAwOyBoYXNoIDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyBoYXNoKyspCi0gICAgewotICAgICAgICBsb2NhbF9iaF9kaXNhYmxlKCk7Ci0gICAgICAgIGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGhubm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0gICAgICAgICAgICAgICAgLy/KzbfFtMvBtL3Tz+C52L/sy9nXqrei0MXPogotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgICAgICAgICAgICAgZm9yIChkaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7IGRpciA8IElQX0NUX0RJUl9NQVg7IGRpcisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV0ID0gY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbZGlyXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ldCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighc3RyY21wKGRldi0+bmFtZSwgbmV0LT5uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtkaXJdID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9jYWxfYmhfZW5hYmxlKCk7Ci0gICAgfQotICAgIHJjdV9yZWFkX3VubG9jaygpOwotfQotLyoguPm+3WNvbm61xMrNt8WjrMrNt8XXqreiwODP4LnYxNrI3SAqLwotdm9pZCBmYXN0X2Z3X2Nvbm5fcmVsZWFzZShzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0gICAgc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotICAgIHN0cnVjdCBjb25uX2xpc3QgKmVudHJ5OwotICAgIGludCBkaXI7Ci0KLSAgICBmb3IgKGRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsgZGlyIDwgSVBfQ1RfRElSX01BWDsgZGlyKyspCi0gICAgewotICAgICAgICBpZiAoIShkc3QgPSBkc3RfZ2V0X2J5X2N0KGN0LCBkaXIpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCAmZHN0LT5jb25uX2hlYWQsIGxpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS0+bmZjdCA9PSBjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeS0+bmZjdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgX19saXN0X2RlbF9lbnRyeSgmZW50cnktPmxpc3QpOwotICAgICAgICAgICAgICAgIGtmcmVlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL9TaZHN0X2dldF9ieV9jdNbQaG9sZNK7z8KjrMv50tTV4sDv0qpyZWxlYXNlCi0gICAgICAgIGRzdF9yZWxlYXNlKGRzdCk7Ci0gICAgICAgIHJjdV9hc3NpZ25fcG9pbnRlcihjdC0+ZmFzdF9jdC5mYXN0X2RzdFtkaXJdLCBOVUxMKTsKLSAgICAgICAgY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbZGlyXSA9IE5VTEw7Ci0gICAgfQotICAgIGN0LT5mYXN0X2N0LmlzRmFzdCA9IDA7Ci19Ci0KLS8vuPm+3WRzdF9lbnRyebXEys23xaOsys23xdeqt6LA4M/gudjE2sjdCi12b2lkIGZhc3RfZndfZHN0X2VudHJ5X3JlbGVhc2Uoc3RydWN0IGRzdF9lbnRyeSAqZHN0KQotewotICAgIHN0cnVjdCBjb25uX2xpc3QgKmVudHJ5ID0gTlVMTDsKLSAgICBzdHJ1Y3QgY29ubl9saXN0ICplbnRyeV90bXAgPSBOVUxMOwotICAgIHN0cnVjdCBuZl9jb25uICpjdDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0KLSAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgJmRzdC0+Y29ubl9oZWFkLCBsaXN0KSB7Ci0KLSAgICAgICAgcmN1X2Fzc2lnbl9wb2ludGVyKGN0LCBlbnRyeS0+bmZjdCk7Ci0gICAgICAgIGlmICghY3QpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoY3QtPmZhc3RfY3QuZmFzdF9kc3RbSVBfQ1RfRElSX09SSUdJTkFMXSAmJiBjdC0+ZmFzdF9jdC5mYXN0X2RzdFtJUF9DVF9ESVJfT1JJR0lOQUxdID09IGRzdCkgewotICAgICAgICAgICAgcmN1X2Fzc2lnbl9wb2ludGVyKGN0LT5mYXN0X2N0LmZhc3RfZHN0W0lQX0NUX0RJUl9PUklHSU5BTF0sIE5VTEwpOwotICAgICAgICAgICAgY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbSVBfQ1RfRElSX09SSUdJTkFMXSAgID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdC0+ZmFzdF9jdC5mYXN0X2RzdFtJUF9DVF9ESVJfUkVQTFldICYmIGN0LT5mYXN0X2N0LmZhc3RfZHN0W0lQX0NUX0RJUl9SRVBMWV0gPT0gZHN0KSB7Ci0gICAgICAgICAgICByY3VfYXNzaWduX3BvaW50ZXIoY3QtPmZhc3RfY3QuZmFzdF9kc3RbSVBfQ1RfRElSX1JFUExZXSwgTlVMTCk7Ci0gICAgICAgICAgICBjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtJUF9DVF9ESVJfUkVQTFldICAgICAgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50X3N1bihTVU5fRVJSLCJmYXN0X2Z3X2RzdF9lbnRyeV9yZWxlYXNlIFxuIik7Ci0KLSAgICAgICAgaWYgKCFjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtJUF9DVF9ESVJfT1JJR0lOQUxdICYmICFjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtJUF9DVF9ESVJfUkVQTFldKQotICAgICAgICAgICAgY3QtPmZhc3RfY3QuaXNGYXN0ID0gMDsKLSAgICAgICAgZW50cnktPm5mY3QgPSBOVUxMOwotICAgICAgICBfX2xpc3RfZGVsX2VudHJ5KCZlbnRyeS0+bGlzdCk7Ci0gICAgICAgIGtmcmVlKGVudHJ5KTsKLSAgICB9Ci19Ci0KLS8qIGNvbm7KzbfFzajWqrqvyv2jrM2o1qpmYXN0ys23xc/gudjE2sjdICovCi12b2lkIGZhc3RfY29ubl9yZWxlYXNlKHN0cnVjdCBuZl9jb25uICpjdCwgaW50IG1hcmspCi17Ci0gICAgc3Bpbl9sb2NrX2JoKCZmYXN0X2Z3X3NwaW5sb2NrKTsKLSAgICBpZiAoKGN0LT5mYXN0X2N0LmlzRmFzdCA9PSBGQVNUX0NUX0ZXNCB8fCBjdC0+ZmFzdF9jdC5pc0Zhc3QgPT0gRkFTVF9DVF9GVzYpICYmIChtYXJrICYgUkVMRUFTRV9BTExfRFNUKSkKLSAgICB7Ci0gICAgICAgIGZhc3RfZndfY29ubl9yZWxlYXNlKGN0KTsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOwotfQotCi0vKiBkc3RfZW50cnnKzbfFzajWqrqvyv2jrM2o1qpmYXN0ys23xc/gudjE2sjdICovCi12b2lkIGZhc3RfZHN0X2VudHJ5X3JlbGVhc2Uoc3RydWN0IGRzdF9lbnRyeSAqIGRzdCkKLXsKLSAgICBzcGluX2xvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOwotICAgIGZhc3RfZndfZHN0X2VudHJ5X3JlbGVhc2UoZHN0KTsKLSAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci19Ci0KLS8qIMrNt8XQwmZhc3TEo8q9z8LL+dPQv+zL2deqt6LQxc+iOiDWu9PQY3TKx7rNZHN0oaJza7a8udjBqrXEo6zL+dLUzai5/WN0wLSy6dGvICovCi12b2lkIGZhc3RfcmVsZWFzZV9hbGwoaW50IG1hcmspCi17Ci0gICAgaW50IGhhc2ggPSAwOwotICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLSAgICBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLSAgICBzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0KLSAgICByY3VfcmVhZF9sb2NrKCk7Ci0gICAgZm9yIChoYXNoID0gMDsgaGFzaCA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaGFzaCsrKSB7Ci0gICAgICAgIGxvY2FsX2JoX2Rpc2FibGUoKTsKLSAgICAgICAgaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZuZl9jb25udHJhY2tfaGFzaFtoYXNoXSwgaG5ub2RlKSB7Ci0gICAgICAgICAgICBpZiAoaCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAvL8rNt8W0y8G0vdPP4LnYv+zL2deqt6LQxc+iCi0gICAgICAgICAgICAgICAgZmFzdF9jb25uX3JlbGVhc2UoY3QsIG1hcmspOwotCi0gICAgICAgICAgICAgICAgbmZfY3RfcHV0KGN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2NhbF9iaF9lbmFibGUoKTsKLSAgICB9Ci0gICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLS8qKioqINLUz8Kyv7fWysfQwr7JZmFzdMSjyr25stPDtcS6r8r9ICoqKiovCi0KLS8vuPm+3dPFz8i8tsXk1sOyu82ssuO0zrXEubPX07qvyv2jrMS/x7C1xLLfwtTKx7jftci8trXEubPX07qvyv2xu7iz1rW686Ostc21yLy2tcS5s9fTuq/K/dKy0ru2qLTm1NqjrAotLy/S1L3ivvbEs9CpyeixuMO709C437XIvLa1xLmz19O6r8r9x+m/9qO7uMOy38LUvfa74dTss8m5s9fTuq/K/bbgtM7GpcXkyqew3LXEv9XF3KOssru74bTm1NrQ1MTcxr++sQotdm9pZCBzZXRfZmFzdF9sZXZlbF9jYihpbnQgcGFyYW0pCi17Ci0gICAgLy+4+b7dv+zL2deqt6K8trHwyejWw7mpzeKyv7X308O6r8r91rjV6wotICAgIGlmIChwYXJhbSA9PSBGQVNUX0NMT1NFIHx8IHBhcmFtID09IEZBU1RfQ0xPU0VfS0VFUF9MSU5LKSAgLy+52LHVv+zL2deqt6IKLSAgICB7Ci0gICAgICAgIGZhc3RfZnJvbV9zb2Z0aXJxID0gTlVMTDsKLSAgICAgICAgZmFzdF9mcm9tX2RyaXZlciA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmFtID09IEZBU1RfTkVUX0NPUkUpIC8vxNq6y7Ljv+zL2deqt6KjrEZBU1RfTkVX1rvWp7PWyO3W0LbP1tC199PDv+zL2deqt6IKLSAgICB7Ci0gICAgICAgIGZhc3RfZnJvbV9zb2Z0aXJxID0gdHJ5X2Zhc3RfZm9yX25ldGNvcmVkYXRhOwotICAgICAgICBmYXN0X2Zyb21fZHJpdmVyID0gTlVMTDsKLSAgICB9Ci0gICAgLy9uZXRfZGV2aWNltb1uZXRfZGV2aWNlo6yyu734yOtJUMjt1tC2zwotICAgIGVsc2UgaWYgKHBhcmFtID09IEZBU1RfTkVUX0RFVklDRSkKLSAgICB7Ci0gICAgICAgIGZhc3RfZnJvbV9zb2Z0aXJxID0gdHJ5X2Zhc3RfZm9yX25ldGNvcmVkYXRhOwotICAgICAgICBmYXN0X2Zyb21fZHJpdmVyID0gdHJ5X2Zhc3RfZm9yX21hY2RhdGE7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9FUlIsImZhc3RuYXRfbGV2ZWwgZXJyb3IsIHNob3VkIGJlIDB+MiFcbiIpOwotfQotCi0vKiDJ6NbDuPfX07mmxNy1xL/sy9nXqreitffTw7qvyv0gKi8KLXZvaWQgc2V0X2Zhc3Rfc3dpdGNoX2NiKHVuc2lnbmVkIGxvbmcgcGFyYW0pCi17Ci0gICAgLy+4+b7d0MK+yb/sy9nXqreiyejWw8q508O1xLK7zaxpcHY0oaJpcHY2vdO/2gotICAgIGlmICh0ZXN0X2JpdChGQVNUX1RZUEVfVkVSU0lPTl9CSVQsICZwYXJhbSkpIC8v0MK1xGZhc3TEo8q9Ci0gICAgewotICAgICAgICAvL9DCtcRmYXN0xKPKvc/COiDJ6NbDSVB2NLG+tdi/7MvZ16q3orvYtfe6r8r9Ci0gICAgICAgIGlmICh0ZXN0X2JpdChGQVNUX1RZUEVfRlc0X0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICAgICAgICAgIGZhc3RfZnc0X3Byb2MgPSBmYXN0NF9md19yZWN2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmYXN0X2Z3NF9wcm9jID0gTlVMTDsKLQotICAgICAgICAvL9DCtcRmYXN0xKPKvc/COiDJ6NbDSVB2NrG+tdi/7MvZ16q3orvYtfe6r8r9Ci0gICAgICAgIGlmICh0ZXN0X2JpdChGQVNUX1RZUEVfRlc2X0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICAgICAgICAgIGZhc3RfZnc2X3Byb2MgPSBmYXN0Nl9md19yZWN2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmYXN0X2Z3Nl9wcm9jID0gTlVMTDsKLQotICAgICAgICBmYXN0X2xvY2FsNF9wcm9jICAgICAgICA9IE5VTEw7Ci0gICAgICAgIGZhc3RfbG9jYWw0X291dHB1dF9wcm9jID0gTlVMTDsKLQotICAgICAgICBmYXN0X2xvY2FsNl9wcm9jICAgICAgICA9IE5VTEw7Ci0gICAgICAgIGZhc3RfbG9jYWw2X291dHB1dF9wcm9jID0gTlVMTDsKLQotICAgICAgICAvL8no1sPX0834vOS/7MvZ16q3orvYtfe6r8r9Ci0gICAgICAgIGlmICh0ZXN0X2JpdChGQVNUX1RZUEVfQlJfQklULCAmZmFzdF9zd2l0Y2gpKQotICAgICAgICAgICAgZmFzdF9icl9wcm9jID0gZmFzdF9icjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmFzdF9icl9wcm9jID0gTlVMTDsKLQotICAgICAgICBmYXN0X25hdDRfcHJvYyA9IE5VTEw7Ci0gICAgICAgIGZhc3RfbmF0Nl9wcm9jID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZSAvL8DPtcRmYXN0xKPKvQotICAgIHsKLSAgICAgICAgLy/Az7XEZmFzdMSjyr3PwjogyejWw0lQdjSxvrXYv+zL2deqt6K72LX3uq/K/QotICAgICAgICBmYXN0X25hdDRfcHJvYyA9IGZhc3RfbmF0X3JlY3Y7Ci0KLSAgICAgICAgLy/Az7XEZmFzdMSjyr3PwjogyejWw0lQdjaxvrXYv+zL2deqt6K72LX3uq/K/QotICAgICAgICBmYXN0X25hdDZfcHJvYyA9IGZhc3Q2X3JlY3Y7Ci0KLSAgICAgICAgZmFzdF9icl9wcm9jID0gZmFzdF9icjsKLSAgICAgICAgZmFzdF9sb2NhbDRfcHJvYyAgICAgICAgID0gTlVMTDsKLSAgICAgICAgZmFzdF9sb2NhbDRfb3V0cHV0X3Byb2MgID0gTlVMTDsKLSAgICAgICAgZmFzdF9sb2NhbDZfcHJvYyAgICAgICAgID0gTlVMTDsKLSAgICAgICAgZmFzdF9sb2NhbDZfb3V0cHV0X3Byb2MgID0gTlVMTDsKLSAgICAgICAgZmFzdF9mdzRfcHJvYyA9IE5VTEw7Ci0gICAgICAgIGZhc3RfZnc2X3Byb2MgPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBmYXN0X2xldmVsX2NoYW5nZShpbnQgbmV3X2xldmVsKQotewotICAgIGludCBvbGRfbGV2ZWwgPSAwOwotCi0gICAgb2xkX2xldmVsID0gZmFzdG5hdF9sZXZlbDsKLQotICAgIGlmIChvbGRfbGV2ZWwgPT0gbmV3X2xldmVsKQotICAgICAgICByZXR1cm47Ci0KLSAgICBmYXN0bmF0X2xldmVsID0gbmV3X2xldmVsOwotCi0gICAgLy+4+b7d1+7QwrXEZmFzdG5hdCBsZXZlbKOstffV+7vYtfe6r8r9Ci0gICAgc2V0X2Zhc3RfbGV2ZWxfY2IoZmFzdG5hdF9sZXZlbCk7Ci0KLSAgICAvL2Zhc3RuYXS52LHVo6zH5b/Vy/nT0NDFz6IKLSAgICBpZiAoZmFzdG5hdF9sZXZlbCA9PSBGQVNUX0NMT1NFIHx8IGZhc3RuYXRfbGV2ZWwgPT0gRkFTVF9DTE9TRV9LRUVQX0xJTkspCi0gICAgewotICAgICAgICBpZiAoIXRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmFzdG5hdF9jbGVhbnVwX2xpbmtzKCk7Ci0gICAgICAgICAgICBmYXN0Nl9jbGVhbnVwX2xpbmtzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmYXN0X3JlbGVhc2VfYWxsKFJFTEVBU0VfQUxMX0RTVCB8IFJFTEVBU0VfQUxMX1NLKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBmYXN0X3N3aXRjaF9jaGFuZ2UodW5zaWduZWQgbG9uZyBuZXdfc3dpdGNoKQotewotICAgIHVuc2lnbmVkIGxvbmcgb2xkX3N3aXRjaCA9IGZhc3Rfc3dpdGNoOwotCi0gICAgaWYgKG9sZF9zd2l0Y2ggPT0gbmV3X3N3aXRjaCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmFzdF9zd2l0Y2ggPSBuZXdfc3dpdGNoOwotCi0gICAgLy+4+b7d19O5psTcv+zL2deqt6K1xM67zby/qrnYo6zJ6NbD19O5psTcu9i197qvyv0KLSAgICBzZXRfZmFzdF9zd2l0Y2hfY2IoZmFzdF9zd2l0Y2gpOwotCi0gICAgLy/X07mmxNy/7MvZ16q3orTTtPK/qrW9udix1bXEo6zQ6NKqx+Wz/s/gudi/7MvZ16q3otDFz6IKLSAgICAvL7TTwM+1xGZhc3TH0LW90MK1xGZhc3SjrNDo0qrH5bP+wM9mYXN0saO05rXEz+C52L/sy9nXqreiyv2+3QotICAgIGlmICghdGVzdF9iaXQoRkFTVF9UWVBFX1ZFUlNJT05fQklULCAmb2xkX3N3aXRjaCkgJiYgdGVzdF9iaXQoRkFTVF9UWVBFX1ZFUlNJT05fQklULCAmbmV3X3N3aXRjaCkpCi0gICAgewotICAgICAgICAvL8DPtcRmYXN0srvH+LfWSVB2NKGiSVB2NrXEt9a/qr/Y1sYKLSAgICAgICAgZmFzdG5hdF9jbGVhbnVwX2xpbmtzKCk7Ci0KLSAgICAgICAgZmFzdDZfY2xlYW51cF9saW5rcygpOwotICAgIH0KLSAgICAvL7TT0MK1xGZhc3TH0LW9vsm1xGZhc3SjrNDo0qrH5bP+0MJmYXN0saO05rXEz+C52L/sy9nXqreiyv2+3QotICAgIGVsc2UgaWYgKHRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJm9sZF9zd2l0Y2gpICYmICF0ZXN0X2JpdChGQVNUX1RZUEVfVkVSU0lPTl9CSVQsICZuZXdfc3dpdGNoKSkKLSAgICB7Ci0gICAgICAgIGZhc3RfcmVsZWFzZV9hbGwoUkVMRUFTRV9BTExfRFNUIHwgUkVMRUFTRV9BTExfU0spOwotICAgIH0KLQotICAgIGlmICh0ZXN0X2JpdChGQVNUX1RZUEVfVkVSU0lPTl9CSVQsICZuZXdfc3dpdGNoKSAmJiAoIXRlc3RfYml0KEZBU1RfVFlQRV9GVzRfQklULCAmbmV3X3N3aXRjaCkgfHwgIXRlc3RfYml0KEZBU1RfVFlQRV9GVzZfQklULCAmbmV3X3N3aXRjaCkpKSB7Ci0gICAgICAgIGZhc3RfcmVsZWFzZV9hbGwoUkVMRUFTRV9BTExfRFNUKTsKLSAgICB9Ci0gICAgaWYgKHRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJm5ld19zd2l0Y2gpICYmICghdGVzdF9iaXQoRkFTVF9UWVBFX0xPQ0FMNF9CSVQsICZuZXdfc3dpdGNoKSB8fCAhdGVzdF9iaXQoRkFTVF9UWVBFX0xPQ0FMNl9CSVQsICZuZXdfc3dpdGNoKSkpIHsKLSAgICAgICAgZmFzdF9yZWxlYXNlX2FsbChSRUxFQVNFX0FMTF9TSyk7Ci0gICAgfQotfQotCi0vL7zHwrzT0ERTVF9OT0NBQ0hFserWvrXEZHN0s/bP1rXEtM7K/QotaW50IG5vX2NhY2hlID0gMDsKLS8vvMfCvNTayrnTw2RzdMqxo6xkc3QtPm5laWdoYm91cs6qv9W1xLTOyv0KLWludCBub19uZWlnaGJvdXIgPSAwOwotc3RydWN0IGRzdF9lbnRyeSAqIGRzdF9nZXRfYnlfY3Qoc3RydWN0IG5mX2Nvbm4gKiBjdCwgaW50IGRpcikKLXsKLSAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7Ci0gICAgc3RydWN0IG5laWdoYm91ciAqX25laWdoYm91ciA9IE5VTEw7Ci0KLSAgICByY3VfcmVhZF9sb2NrKCk7Ci0gICAgZHN0ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChjdC0+ZmFzdF9jdC5mYXN0X2RzdFtkaXJdLCAxKTsKLQotICAgIGlmKGRzdCkKLSAgICAgICAgZHN0X2hvbGRfYW5kX3VzZShkc3QsIGppZmZpZXMpOwotICAgIGVsc2UgewotICAgICAgICBkc3QgPSBOVUxMOwotICAgIH0KLSAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICByZXR1cm4gZHN0OwotfQotCi0vKmZhc3Sz9cq8u68qLwotc3RhdGljIGludCBfX2luaXQKLXRzcF9mYXN0X2luaXQodm9pZCkKLXsKLSAgICBpbnQgcmV0NCA9IDAsIHJldDYgPSAwOwotCi0gICAgbWVtc2V0KHplcm9tYWMsIDAsIHNpemVvZih6ZXJvbWFjKSk7Ci0KLSAgICBzcGluX2xvY2tfaW5pdCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgLy+yydPD16jK9HNsYWK7+tbGCi0gICAgZmFzdF9oZWFkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZhc3RfaGVhZF9jYWNoZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBmYXN0X2VudHJ5X3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAvL7fWsfC199PDaXB2NKGiaXB2NrXEs/XKvLuvuq/K/QotICAgIHJldDQgPSB0c3BfZmFzdG5hdF9pbml0KCk7Ci0gICAgcmV0NiA9IHRzcF9mYXN0Nl9pbml0KCk7Ci0gICAgZmFzdDRfZndfaW5pdCgpOwotICAgIGZhc3Q2X2Z3X2luaXQoKTsKLQotICAgIGlmICgocmV0NCAhPSAwKSAmJiAocmV0NiAhPSAwKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICAvKteisuHNqNaqwbQqLwotICAgIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZmFzdF9kZXZfbm90aWZpZXIpOwotICAgIHJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZmYXN0X2luZXRfbm90aWZpZXIpOwotCi0gICAgLy+/7MvZ16q3orrNxr3MqLuvcHJvY87EvP6z9cq8u68KLSAgICBzZXRfZmFzdF9sZXZlbF9jYihmYXN0bmF0X2xldmVsKTsKLSAgICBzZXRfZmFzdF9zd2l0Y2hfY2IoZmFzdF9zd2l0Y2gpOwotICAgIGZhc3RfY29ubnRyYWNrX2luaXRfcHJvYygpOwotCi0gICAgbmV0X2FkYXB0ZXJfaW5pdF9wcm9jKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdAotdHNwX2Zhc3RfY2xlYW51cCh2b2lkKQotewotICAgIHNldF9mYXN0X2xldmVsX2NiKEZBU1RfQ0xPU0UpOwotICAgIHNldF9mYXN0X3N3aXRjaF9jYigwKTsKLSAgICB1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZmFzdF9kZXZfbm90aWZpZXIpOwotICAgIHVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmZhc3RfaW5ldF9ub3RpZmllcik7Ci0KLSAgICAvL7fWsfC199PDaXB2NKGiaXB2NrXE16LP+rqvyv0KLSAgICB0c3BfZmFzdG5hdF9jbGVhbnVwKCk7Ci0gICAgdHNwX2Zhc3Q2X2NsZWFudXAoKTsKLSAgICBmYXN0NF9md19jbGVhbnVwKCk7Ci0gICAgZmFzdDZfZndfY2xlYW51cCgpOwotfQotCi1sYXRlX2luaXRjYWxsKHRzcF9mYXN0X2luaXQpOwotbW9kdWxlX2V4aXQodHNwX2Zhc3RfY2xlYW51cCk7Ci0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdF90cmFjay5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvY29yZS9mYXN0cHJvYy9mYXN0X3RyYWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM3ZjNjZmMuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvY29yZS9mYXN0cHJvYy9mYXN0X3RyYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPg0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4NCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPg0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPiAgICAvKiBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgcHJvYyBmcyAqLw0KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4NCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPg0KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPg0KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4NCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+DQotI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+DQotI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+DQotI2lmZGVmIENPTkZJR19TWVNDVEwNCi0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+DQotI2VuZGlmDQotI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfbnVsbHMuaD4NCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4NCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPg0KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+DQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPg0KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4NCi0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPg0KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja196b25lcy5oPg0KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuaD4NCi0jaW5jbHVkZSA8bmV0L1NJL2Zhc3RuYXQuaD4NCi0jaW5jbHVkZSA8bmV0L1NJL2Zhc3Q2Lmg+DQotI2luY2x1ZGUgPG5ldC9TSS9mYXN0X2NvbW1vbi5oPg0KLSNpbmNsdWRlIDxuZXQvU0kvbmV0aW9jX3Byb2MuaD4NCi0NCi0NCi0jZGVmaW5lIFBPUlRfTEVOIDEwDQotZXh0ZXJuIGludCBmYXN0bmF0X2Fja19wYXJhbTsNCi1leHRlcm4gaW50IGFja2Ryb3BfbWF4bnVtOw0KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3RfaXB0YWJsZXNfc3luX3N3Ow0KLQ0KLQ0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VxX3ByaW50X2FjY3Qoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIGludCBkaXIpDQotew0KLSAgICBzdHJ1Y3QgbmZfY29ubl9hY2N0ICphY2N0Ow0KLSAgICBzdHJ1Y3QgbmZfY29ubl9jb3VudGVyICpjb3VudGVyOw0KLQ0KLSAgICBhY2N0ID0gbmZfY29ubl9hY2N0X2ZpbmQoY3QpOw0KLSAgICBpZiAoIWFjY3QpDQotICAgICAgICByZXR1cm4gMDsNCi0NCi0gICAgY291bnRlciA9IGFjY3QtPmNvdW50ZXI7DQotICAgIHNlcV9wcmludGYocywgInBhY2tldHM9JWxsdSBieXRlcz0lbGx1ICIsDQotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdG9taWM2NF9yZWFkKCZjb3VudGVyW2Rpcl0ucGFja2V0cyksDQotICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdG9taWM2NF9yZWFkKCZjb3VudGVyW2Rpcl0uYnl0ZXMpKTsNCi0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkICpmYXN0bmF0X2xldmVsX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpDQotX19hY3F1aXJlcyhSQ1UpDQotew0KLSAgICBpZiAoKnBvcyA+PSAxKQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIHJldHVybiAxOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqZmFzdG5hdF9sZXZlbF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQ0KLXsNCi0gICAgKCpwb3MpKys7DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBmYXN0bmF0X2xldmVsX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi1fX3JlbGVhc2VzKFJDVSkNCi17DQotICAgIHJldHVybjsNCi19DQotDQotLyogcmV0dXJuIDAgb24gc3VjY2VzcywgMSBpbiBjYXNlIG9mIGVycm9yICovDQotc3RhdGljIGludCBmYXN0bmF0X2xldmVsX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi17DQotICAgIHNlcV9wcmludGYocywgImZhc3RuYXRfbGV2ZWw6ICVkXG4iLCBmYXN0bmF0X2xldmVsKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmFzdG5hdF9sZXZlbF9zZXFfb3BzID0gew0KLSAgICAuc3RhcnQgPSBmYXN0bmF0X2xldmVsX3NlcV9zdGFydCwNCi0gICAgLm5leHQgID0gZmFzdG5hdF9sZXZlbF9zZXFfbmV4dCwNCi0gICAgLnN0b3AgID0gZmFzdG5hdF9sZXZlbF9zZXFfc3RvcCwNCi0gICAgLnNob3cgID0gZmFzdG5hdF9sZXZlbF9zZXFfc2hvdw0KLX07DQotDQotc3RhdGljIGludCBmYXN0bmF0X2xldmVsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpDQotew0KLSAgICByZXR1cm4gc2VxX29wZW4oZmlsZSwgJmZhc3RuYXRfbGV2ZWxfc2VxX29wcyk7DQotfQ0KLQ0KLS8v08O7p9C0w/zB7rXEss6/vLT6wuujrL/J08PAtMXk1sO52MGqyejWw6Gizfi/2sP7tciy2df3DQotc3RhdGljIHNzaXplX3QgZmFzdG5hdF9sZXZlbF9zZXQoc3RydWN0IGZpbGUgKmZpbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotICAgIHNpemVfdCBzaXplOw0KLSAgICBjaGFyIGNoYXJfZmFzdG5hdFs1XSA9IHswfTsNCi0gICAgaW50IGxldmVsID0gMDsNCi0NCi0gICAgLy9jb3VudM6ysr+w/LqswcsxuPa94cr4t/ujrNa71qez1jAtM8rkyOsNCi0gICAgaWYgKGNvdW50ICE9IDIpDQotICAgICAgICByZXR1cm4gLUVJTlZBTDsNCi0NCi0gICAgaWYgKGNvcHlfZnJvbV91c2VyKGNoYXJfZmFzdG5hdCwgYnVmZmVyLCAxKSkNCi0gICAgICAgIHJldHVybiAtRUZBVUxUOw0KLQ0KLSAgICBpZiAoKGNoYXJfZmFzdG5hdFswXSA8ICcwJyB8fCBjaGFyX2Zhc3RuYXRbMF0gPiAnMicpICYmIChjaGFyX2Zhc3RuYXRbMF0gIT0gJzUnKSkNCi0gICAgICAgIHJldHVybiAtRUlOVkFMOw0KLQ0KLSAgICBsZXZlbCA9IChpbnQpKGNoYXJfZmFzdG5hdFswXSAtICcwJyk7DQotDQotICAgIC8v1tjQwsno1sO/7MvZ16q3ormz19O6r8r9DQotICAgIGZhc3RfbGV2ZWxfY2hhbmdlKGxldmVsKTsNCi0gICAgcmV0dXJuIGNvdW50Ow0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqZmFzdF9zd2l0Y2hfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykNCi1fX2FjcXVpcmVzKFJDVSkNCi17DQotICAgIGlmICgqcG9zID49IDEpDQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgcmV0dXJuIDE7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkICpmYXN0X3N3aXRjaF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQ0KLXsNCi0gICAgKCpwb3MpKys7DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBmYXN0X3N3aXRjaF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpDQotX19yZWxlYXNlcyhSQ1UpDQotew0KLSAgICByZXR1cm47DQotfQ0KLQ0KLS8qIHJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgaW4gY2FzZSBvZiBlcnJvciAqLw0KLXN0YXRpYyBpbnQgZmFzdF9zd2l0Y2hfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLXsNCi0gICAgc2VxX3ByaW50ZihzLCAiZmFzdF9zd2l0Y2g6IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpZmFzdF9zd2l0Y2gpOw0KLSAgICByZXR1cm4gMDsNCi19DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmYXN0X3N3aXRjaF9zZXFfb3BzID0gew0KLSAgICAuc3RhcnQgPSBmYXN0X3N3aXRjaF9zZXFfc3RhcnQsDQotICAgIC5uZXh0ICA9IGZhc3Rfc3dpdGNoX3NlcV9uZXh0LA0KLSAgICAuc3RvcCAgPSBmYXN0X3N3aXRjaF9zZXFfc3RvcCwNCi0gICAgLnNob3cgID0gZmFzdF9zd2l0Y2hfc2VxX3Nob3cNCi19Ow0KLQ0KLXN0YXRpYyBpbnQgZmFzdF9zd2l0Y2hfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkNCi17DQotICAgIHJldHVybiBzZXFfb3BlbihmaWxlLCAmZmFzdF9zd2l0Y2hfc2VxX29wcyk7DQotfQ0KLQ0KLS8v08O7p9C0w/zB7rXEss6/vLT6wuujrL/J08PAtMXk1sO52MGqyejWw6Gizfi/2sP7tciy2df3DQotc3RhdGljIHNzaXplX3QgZmFzdF9zd2l0Y2hfc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQ0KLXsNCi0gICAgc2l6ZV90IHNpemU7DQotICAgIGNoYXIgY2hhcl9mYXN0bmF0WzVdID0gezB9Ow0KLSAgICBpbnQgbGV2ZWwgPSAwLCBpID0gMDsNCi0NCi0gICAgLy9jb3VudM6ysr+w/LqswcsxuPa94cr4t/ujrNa71qez1jAtM8rkyOsNCi0gICAgaWYgKGNvdW50ID4gNSkNCi0gICAgICAgIHJldHVybiAtRUlOVkFMOw0KLQ0KLSAgICBtZW1zZXQoY2hhcl9mYXN0bmF0LCAwLCAgNSk7DQotICAgIGlmIChjb3B5X2Zyb21fdXNlcihjaGFyX2Zhc3RuYXQsIGJ1ZmZlciwgNSkpDQotICAgICAgICByZXR1cm4gLUVGQVVMVDsNCi0NCi0gICAgZm9yKGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKyspIHsNCi0gICAgICAgIGlmKGNoYXJfZmFzdG5hdFtpXSA8ICcwJyB8fCBjaGFyX2Zhc3RuYXRbaV0gPiAnOScpDQotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQotICAgICAgICBsZXZlbCA9IChpbnQpKGNoYXJfZmFzdG5hdFtpXSAtICcwJykgKyBsZXZlbCoxMDsNCi0gICAgfQ0KLQ0KLSAgICAvL9bY0MLJ6NbDv+zL2deqt6K5s9fTuq/K/Q0KLSAgICBmYXN0X3N3aXRjaF9jaGFuZ2UobGV2ZWwpOw0KLSAgICByZXR1cm4gY291bnQ7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkICpmYXN0YnJfbGV2ZWxfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykNCi1fX2FjcXVpcmVzKFJDVSkNCi17DQotICAgIGlmICgqcG9zID49IDEpDQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgcmV0dXJuIDE7DQotfQ0KLQ0KLXN0YXRpYyB2b2lkICpmYXN0YnJfbGV2ZWxfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykNCi17DQotICAgICgqcG9zKSsrOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotDQotc3RhdGljIHZvaWQgZmFzdGJyX2xldmVsX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi1fX3JlbGVhc2VzKFJDVSkNCi17DQotICAgIHJldHVybjsNCi19DQotDQotLyogcmV0dXJuIDAgb24gc3VjY2VzcywgMSBpbiBjYXNlIG9mIGVycm9yICovDQotc3RhdGljIGludCBmYXN0YnJfbGV2ZWxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLXsNCi0gICAgc2VxX3ByaW50ZihzLCAiZmFzdGJyX2xldmVsOiAlZFxuIiwgZmFzdGJyX2xldmVsKTsNCi0gICAgcmV0dXJuIDA7DQotfQ0KLQ0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZmFzdGJyX2xldmVsX3NlcV9vcHMgPSB7DQotICAgIC5zdGFydCA9IGZhc3Ricl9sZXZlbF9zZXFfc3RhcnQsDQotICAgIC5uZXh0ICA9IGZhc3Ricl9sZXZlbF9zZXFfbmV4dCwNCi0gICAgLnN0b3AgID0gZmFzdGJyX2xldmVsX3NlcV9zdG9wLA0KLSAgICAuc2hvdyAgPSBmYXN0YnJfbGV2ZWxfc2VxX3Nob3cNCi19Ow0KLQ0KLXN0YXRpYyBpbnQgZmFzdGJyX2xldmVsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpDQotew0KLSAgICByZXR1cm4gc2VxX29wZW4oZmlsZSwgJmZhc3Ricl9sZXZlbF9zZXFfb3BzKTsNCi19DQotDQotLy/Tw7un0LTD/MHutcSyzr+8tPrC66Osv8nTw8C0xeTWw7nYwarJ6NbDoaLN+L/aw/u1yLLZ1/cNCi1zdGF0aWMgc3NpemVfdCBmYXN0YnJfbGV2ZWxfc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotICAgIHNpemVfdCBzaXplOw0KLSAgICBjaGFyIGNoYXJfZmFzdGJyWzVdID0gezB9Ow0KLQ0KLSAgICAvL2NvdW50zrKyv7D8uqzByzG49r3hyvi3+6Os1rvWp7PWMC0xyuTI6w0KLSAgICBpZiAoY291bnQgIT0gMikNCi0gICAgICAgIHJldHVybiAtRUlOVkFMOw0KLQ0KLSAgICBpZiAoY29weV9mcm9tX3VzZXIoY2hhcl9mYXN0YnIsIGJ1ZmZlciwgMSkpDQotICAgICAgICByZXR1cm4gLUVGQVVMVDsNCi0NCi0gICAgaWYgKGNoYXJfZmFzdGJyWzBdIDwgJzAnIHx8IGNoYXJfZmFzdGJyWzBdID4gJzEnKQ0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQotDQotICAgIGZhc3Ricl9sZXZlbCA9IChpbnQpKGNoYXJfZmFzdGJyWzBdIC0gJzAnKTsNCi0NCi0gICAgcmV0dXJuIGNvdW50Ow0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqZmFzdG5hdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQ0KLV9fYWNxdWlyZXMoUkNVKQ0KLXsNCi0gICAgc3Bpbl9sb2NrX2JoKCZmYXN0bmF0X3NwaW5sb2NrKTsNCi0gICAgaWYgKCpwb3MgPj0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIGVsc2UNCi0gICAgew0KLSAgICAgICAgaWYgKCpwb3MgPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgImZhc3RuYXQgaGF2ZSAlZCBjb25uISEhXG5za2JfbnVtNDolZCxmYXN0bmF0X251bTolZFxuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfbGlzdC5jb3VudCwgc2tiX251bTQsIGZhc3RuYXRfbnVtKTsNCi0gICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgImZhc3Ricl9zdW06JWQsZmFzdGJyX251bTolZFxuIiwNCi0gICAgICAgICAgICAgICAgICAgICAgIHNrYl9udW00ICsgc2tiX251bTYgKyBza2JfdW5rbm93biAtIGZhc3RuYXRfbnVtIC0gZmFzdDZfbnVtLCBmYXN0YnJfbnVtKTsNCi0NCi0gICAgICAgICAgICBpZiAoKGZhc3RuYXRfYWNrX3BhcmFtID09IDEpICYmIChhY2tkcm9wX21heG51bSAgPj0gMSkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgImZhc3RuYXQgYWNrX2RlbGF5X3N0YXRzIDogdG90YWxfY291bnQgPSAldSwgZm9yd29yZF9jb3VudCA9ICV1LCBkcm9wX2NvdW50ID0gJXUsICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dF94bWl0X2NvdW50ID0gJXUsIHRpbWVvdXRfZHJvcF9jb3VudCA9ICV1XG4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYWNrX2RlbGF5X3N0YXRzLnRvdGFsX2NvdW50LCAodW5zaWduZWQgaW50KWFja19kZWxheV9zdGF0cy5mb3J3b3JkX2NvdW50LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpYWNrX2RlbGF5X3N0YXRzLmRyb3BfY291bnQsICh1bnNpZ25lZCBpbnQpYWNrX2RlbGF5X3N0YXRzLnRpbWVvdXRfeG1pdF9jb3VudCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWFja19kZWxheV9zdGF0cy50aW1lb3V0X2Ryb3BfY291bnQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAmd29ya2luZ19oYXNoWypwb3NdOw0KLSAgICB9DQotDQotfQ0KLQ0KLXN0YXRpYyB2b2lkICpmYXN0bmF0X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpDQotew0KLSAgICAoKnBvcykrKzsNCi0gICAgLy9yZXR1cm4gZmFzdG5hdF9nZXRfbmV4dChzLCB2KTsNCi0gICAgaWYgKCpwb3MgPj0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIGVsc2UNCi0gICAgICAgIHJldHVybiAmd29ya2luZ19oYXNoWypwb3NdOw0KLX0NCi0NCi0NCi1zdGF0aWMgdm9pZCBmYXN0bmF0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi1fX3JlbGVhc2VzKFJDVSkNCi17DQotICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0bmF0X3NwaW5sb2NrKTsNCi19DQotDQotLyogcmV0dXJuIDAgb24gc3VjY2VzcywgMSBpbiBjYXNlIG9mIGVycm9yICovDQotc3RhdGljIGludCBmYXN0bmF0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi17DQotICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICAgICpoZWFkID0gKHN0cnVjdCBobGlzdF9udWxsc19oZWFkICopIHY7DQotICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsNCi0gICAgc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47DQotICAgIGZhc3RfZW50cnlfZGF0YV90ICpuYXRfZW50cnlfZGF0YTsNCi0gICAgZmFzdF9lbnRyeV90ICpuYXRfZW50cnkgPSBOVUxMOw0KLSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87DQotICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsNCi0gICAgaW50IHJldCA9IDA7DQotDQotICAgIGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGgsIG4sIGhlYWQsIGhubm9kZSkNCi0gICAgew0KLSAgICAgICAgbmF0X2VudHJ5X2RhdGEgPSBmYXN0X2hhc2hfdG9fZGF0YShoKTsNCi0gICAgICAgIG5hdF9lbnRyeSA9IGZhc3RfZGF0YV90b19lbnRyeShuYXRfZW50cnlfZGF0YSk7DQotDQotICAgICAgICBpZiAodW5saWtlbHkoIWF0b21pY19pbmNfbm90X3plcm8oJm5hdF9lbnRyeS0+Y3QtPmN0X2dlbmVyYWwudXNlKSkpDQotICAgICAgICAgICAgcmV0dXJuIDA7DQotDQotICAgICAgICAvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovDQotICAgICAgICBpZiAoTkZfQ1RfRElSRUNUSU9OKGgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIG5mX2N0X3B1dChuYXRfZW50cnktPmN0KTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmQobmZfY3RfcHJvdG9udW0obmF0X2VudHJ5LT5jdCkpOw0KLQ0KLQ0KLSAgICAgICAgcmV0ID0gLUVOT1NQQzsNCi0gICAgICAgIHNlcV9wcmludGYocywgImwzcHJvdG86ICV1IGw0cHJvdG86ICV1ICVsdSAlbHUgJWx1ICIsDQotICAgICAgICAgICAgICAgICAgIG5mX2N0X2wzbnVtKG5hdF9lbnRyeS0+Y3QpLCBuZl9jdF9wcm90b251bShuYXRfZW50cnktPmN0KSwNCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5hdF9lbnRyeS0+dGltZW91dC5leHBpcmVzL0haKSwNCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHRjcF90aW1lb3V0c1tuYXRfZW50cnktPmN0LT5wcm90by50Y3Auc3RhdGVdL0haKSwgKHVuc2lnbmVkIGxvbmcpKGppZmZpZXMvSFopKTsNCi0gICAgICAgIC8vdGNwX2Nvbm50cmFja19uYW1lc9a7tqjS5cHLtb1UQ1BfQ09OTlRSQUNLX01BWLXEw/uzxqOstvhzdGF0Zbrzw+a7udPQtuDT4LXE17TMrA0KLSAgICAgICAgaWYgKG5hdF9lbnRyeS0+Y3QtPnByb3RvLnRjcC5zdGF0ZSA8IFRDUF9DT05OVFJBQ0tfTUFYKQ0KLSAgICAgICAgew0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUw0KLSAgICAgICAgICAgIGlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsNHByb3RvLT5wcmludF9jb25udHJhY2socywgbmF0X2VudHJ5LT5jdCk7DQotICAgICAgICAgICAgfQ0KLSNlbmRpZg0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHJpbnRfdHVwbGUocywgJm5hdF9lbnRyeS0+Y3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLA0KLSAgICAgICAgICAgICAgICAgICAgbDRwcm90byk7DQotDQotICAgICAgICBpZiAoc2VxX3ByaW50X2FjY3QocywgbmF0X2VudHJ5LT5jdCwgSVBfQ1RfRElSX09SSUdJTkFMKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZl9jdF9wdXQobmF0X2VudHJ5LT5jdCk7DQotICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoISh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZuYXRfZW50cnktPmN0LT5zdGF0dXMpKSkNCi0gICAgICAgICAgICBzZXFfcHJpbnRmKHMsICJbVU5SRVBMSUVEXSAiKTsNCi0NCi0NCi0gICAgICAgIHByaW50X3R1cGxlKHMsICZuYXRfZW50cnktPmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwNCi0gICAgICAgICAgICAgICAgICAgIGw0cHJvdG8pOw0KLQ0KLSAgICAgICAgaWYgKHNlcV9wcmludF9hY2N0KHMsIG5hdF9lbnRyeS0+Y3QsIElQX0NUX0RJUl9SRVBMWSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgbmZfY3RfcHV0KG5hdF9lbnRyeS0+Y3QpOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKHRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJm5hdF9lbnRyeS0+Y3QtPnN0YXR1cykpDQotICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiW0FTU1VSRURdICIpOw0KLQ0KLQ0KLSAgICAgICAgc2VxX3ByaW50ZihzLCAiTkFUX2lwPSVwSTQgTkFUX3BvcnQ9PSVodSAgXG4iLCZuYXRfZW50cnktPmRhdGFbSVBfQ1RfRElSX09SSUdJTkFMXS5uYXRfYWRkcixudG9ocyhuYXRfZW50cnktPmRhdGFbSVBfQ1RfRElSX09SSUdJTkFMXS5uYXRfcG9ydCkpOw0KLSAgICAgICAgbmZfY3RfcHV0KG5hdF9lbnRyeS0+Y3QpOw0KLSAgICB9DQotDQotICAgIHJldHVybiAwOw0KLX0NCi0NCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZhc3RuYXRfc2VxX29wcyA9IHsNCi0gICAgLnN0YXJ0ID0gZmFzdG5hdF9zZXFfc3RhcnQsDQotICAgIC5uZXh0ICA9IGZhc3RuYXRfc2VxX25leHQsDQotICAgIC5zdG9wICA9IGZhc3RuYXRfc2VxX3N0b3AsDQotICAgIC5zaG93ICA9IGZhc3RuYXRfc2VxX3Nob3cNCi19Ow0KLQ0KLXN0YXRpYyBpbnQgZmFzdG5hdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQ0KLXsNCi0gICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZmYXN0bmF0X3NlcV9vcHMpOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqZmFzdDZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykNCi1fX2FjcXVpcmVzKFJDVSkNCi17DQotICAgIHNwaW5fbG9ja19iaCgmZmFzdDZfc3BpbmxvY2spOw0KLSAgICBpZiAoKnBvcyA+PSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpDQotICAgICAgICByZXR1cm4gTlVMTDsNCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBpZiAoKnBvcyA9PSAwKQ0KLSAgICAgICAgew0KLSNpZiAwDQotICAgICAgICAgICAgc2VxX3ByaW50ZihzZXEsICJmYXN0bmF0IGFja19kZWxheV9zdGF0cyA6IHRvdGFsX2NvdW50ID0gJWQsIGZvcndvcmRfY291bnQgPSAlZCwgZHJvcF9jb3VudCA9ICVkLCAiDQotICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dF94bWl0X2NvdW50ID0gJWQsIHRpbWVvdXRfZHJvcF9jb3VudCA9ICVkXG4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgYWNrX2RlbGF5X3N0YXRzLnRvdGFsX2NvdW50LCBhY2tfZGVsYXlfc3RhdHMuZm9yd29yZF9jb3VudCwgYWNrX2RlbGF5X3N0YXRzLmRyb3BfY291bnQsDQotICAgICAgICAgICAgICAgICAgICAgICBhY2tfZGVsYXlfc3RhdHMudGltZW91dF94bWl0X2NvdW50LCBhY2tfZGVsYXlfc3RhdHMudGltZW91dF9kcm9wX2NvdW50KTsNCi0gICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgImZhc3RuYXQgaGF2ZSAlZCBjb25uISEhXG5mYXN0bmF0X3JlY3ZfY291bnQ6JWQsZmFzdG5hdF9yZWFsX2NvdW50OiVkXG4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19saXN0LmNvdW50LGZhc3RuYXRfcmVjdl9jb3VudCxmYXN0bmF0X3JlYWxfY291bnQpOw0KLSAgICAgICAgICAgIHNlcV9wcmludGYoc2VxLCAic2VuZF8yX3BzX2ZhaWxlZDoldSwgc2VuZF8yX3VzYl9mYWlsZWQ6JXVcbiIsIHNlbmRfMl9wc19mYWlsZWQsIHNlbmRfMl91c2JfZmFpbGVkKTsNCi0jZW5kaWYNCi0gICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgImZhc3Q2IGhhdmUgJWQgY29ubiEhIVxuc2tiX251bTY6JWQsZmFzdDZfbnVtOiVkXG4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgd29ya2luZ19saXN0Ni5jb3VudCwgc2tiX251bTYsIGZhc3Q2X251bSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gJndvcmtpbmdfaGFzaDZbKnBvc107DQotICAgIH0NCi0NCi19DQotDQotc3RhdGljIHZvaWQgKmZhc3Q2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpDQotew0KLSAgICAoKnBvcykrKzsNCi0gICAgaWYgKCpwb3MgPj0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIGVsc2UNCi0gICAgICAgIHJldHVybiAmd29ya2luZ19oYXNoNlsqcG9zXTsNCi19DQotDQotDQotc3RhdGljIHZvaWQgZmFzdDZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLV9fcmVsZWFzZXMoUkNVKQ0KLXsNCi0gICAgc3Bpbl91bmxvY2tfYmgoJmZhc3Q2X3NwaW5sb2NrKTsNCi19DQotDQotLyogcmV0dXJuIDAgb24gc3VjY2VzcywgMSBpbiBjYXNlIG9mIGVycm9yICovDQotc3RhdGljIGludCBmYXN0Nl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpDQotew0KLSAgICBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAgICAqaGVhZCA9IChzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqKSB2Ow0KLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7DQotICAgIHN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOw0KLSAgICBmYXN0X2VudHJ5X2RhdGFfdCAqZmFzdDZfZW50cnlfZGF0YTsNCi0gICAgZmFzdF9lbnRyeV90ICpmYXN0Nl9lbnRyeSA9IE5VTEw7DQotICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsNCi0gICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOw0KLSAgICBpbnQgcmV0ID0gMDsNCi0NCi0gICAgaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkoaCwgbiwgaGVhZCwgaG5ub2RlKQ0KLSAgICB7DQotICAgICAgICBmYXN0Nl9lbnRyeV9kYXRhID0gZmFzdF9oYXNoX3RvX2RhdGEoaCk7DQotICAgICAgICBmYXN0Nl9lbnRyeSA9IGZhc3RfZGF0YV90b19lbnRyeShmYXN0Nl9lbnRyeV9kYXRhKTsNCi0NCi0gICAgICAgIGlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmZmFzdDZfZW50cnktPmN0LT5jdF9nZW5lcmFsLnVzZSkpKQ0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLQ0KLSAgICAgICAgLyogd2Ugb25seSB3YW50IHRvIHByaW50IERJUl9PUklHSU5BTCAqLw0KLSAgICAgICAgaWYgKE5GX0NUX0RJUkVDVElPTihoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZl9jdF9wdXQoZmFzdDZfZW50cnktPmN0KTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGw0cHJvdG8gPSBuZl9jdF9sNHByb3RvX2ZpbmQobmZfY3RfcHJvdG9udW0oZmFzdDZfZW50cnktPmN0KSk7DQotDQotICAgICAgICByZXQgPSAtRU5PU1BDOw0KLSAgICAgICAgc2VxX3ByaW50ZihzLCAibDNwcm90bzogJXUgbDRwcm90bzogJXUgJWx1ICVsdSAlbHUgIiwNCi0gICAgICAgICAgICAgICAgICAgbmZfY3RfbDNudW0oZmFzdDZfZW50cnktPmN0KSwgbmZfY3RfcHJvdG9udW0oZmFzdDZfZW50cnktPmN0KSwNCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGZhc3Q2X2VudHJ5LT50aW1lb3V0LmV4cGlyZXMvSFopLA0KLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodGNwX3RpbWVvdXRzW2Zhc3Q2X2VudHJ5LT5jdC0+cHJvdG8udGNwLnN0YXRlXS9IWiksICh1bnNpZ25lZCBsb25nKShqaWZmaWVzL0haKSk7DQotDQotICAgICAgICAvL3RjcF9jb25udHJhY2tfbmFtZXPWu7ao0uXBy7W9VENQX0NPTk5UUkFDS19NQVi1xMP7s8ajrLb4c3RhdGW688Pmu7nT0Lbg0+C1xNe0zKwNCi0gICAgICAgIGlmIChmYXN0Nl9lbnRyeS0+Y3QtPnByb3RvLnRjcC5zdGF0ZSA8IFRDUF9DT05OVFJBQ0tfTUFYKQ0KLSAgICAgICAgew0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUw0KLSAgICAgICAgICAgIGlmIChsNHByb3RvLT5wcmludF9jb25udHJhY2spDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBsNHByb3RvLT5wcmludF9jb25udHJhY2socywgZmFzdDZfZW50cnktPmN0KTsNCi0gICAgICAgICAgICB9DQotI2VuZGlmDQotICAgICAgICB9DQotDQotICAgICAgICBwcmludF90dXBsZShzLCAmZmFzdDZfZW50cnktPmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwNCi0gICAgICAgICAgICAgICAgICAgIGw0cHJvdG8pOw0KLQ0KLSAgICAgICAgaWYgKHNlcV9wcmludF9hY2N0KHMsIGZhc3Q2X2VudHJ5LT5jdCwgSVBfQ1RfRElSX09SSUdJTkFMKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZl9jdF9wdXQoZmFzdDZfZW50cnktPmN0KTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICghKHRlc3RfYml0KElQU19TRUVOX1JFUExZX0JJVCwgJmZhc3Q2X2VudHJ5LT5jdC0+c3RhdHVzKSkpDQotICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiW1VOUkVQTElFRF0gIik7DQotDQotICAgICAgICBwcmludF90dXBsZShzLCAmZmFzdDZfZW50cnktPmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSwNCi0gICAgICAgICAgICAgICAgICAgIGw0cHJvdG8pOw0KLQ0KLSAgICAgICAgaWYgKHNlcV9wcmludF9hY2N0KHMsIGZhc3Q2X2VudHJ5LT5jdCwgSVBfQ1RfRElSX1JFUExZKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZl9jdF9wdXQoZmFzdDZfZW50cnktPmN0KTsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmICh0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZmYXN0Nl9lbnRyeS0+Y3QtPnN0YXR1cykpDQotICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiW0FTU1VSRURdICIpOw0KLQ0KLQ0KLSAgICAgICAgc2VxX3ByaW50ZihzLCAiXG4iKTsNCi0gICAgICAgIG5mX2N0X3B1dChmYXN0Nl9lbnRyeS0+Y3QpOw0KLSAgICB9DQotDQotICAgIHJldHVybiAwOw0KLX0NCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGZhc3Q2X3NlcV9vcHMgPSB7DQotICAgIC5zdGFydCA9IGZhc3Q2X3NlcV9zdGFydCwNCi0gICAgLm5leHQgID0gZmFzdDZfc2VxX25leHQsDQotICAgIC5zdG9wICA9IGZhc3Q2X3NlcV9zdG9wLA0KLSAgICAuc2hvdyAgPSBmYXN0Nl9zZXFfc2hvdw0KLX07DQotDQotc3RhdGljIGludCBmYXN0Nl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQ0KLXsNCi0gICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZmYXN0Nl9zZXFfb3BzKTsNCi19DQotDQotLy/Tw7un0LTD/MHutcSyzr+8tPrC66Osv8nTw8C0xeTWw7nYwarJ6NbDoaLN+L/aw/u1yLLZ1/cNCi1zdGF0aWMgc3NpemVfdCBkZXZfZG93bl9zZXQoc3RydWN0IGZpbGUgKmZpbGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpDQotew0KLSAgICBzaXplX3Qgc2l6ZTsNCi0gICAgY2hhciBkZXZfbmFtZVtNQVhfTkVUX0RFVklDRV9OQU1FX0xFTiArIDFdID0gezB9Ow0KLQ0KLSAgICAvL2NvdW50zrKyv7D8uqzByzG49r3hyvi3+w0KLSAgICBzaXplID0gbWluKGNvdW50IC0gMSwgTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4pOw0KLSAgICBpZiAoY29weV9mcm9tX3VzZXIoZGV2X25hbWUsIGJ1ZmZlciwgc2l6ZSkpDQotICAgICAgICByZXR1cm4gLUVGQVVMVDsNCi0NCi0gICAgLy/JvrP9tMvN+MLnyeixuM/gudhpcHY0LGlwdjbBtL3TDQotICAgIGZhc3RfZGV2aWNlX2Rvd25fZXZlbnRfYnlfbmFtZShkZXZfbmFtZSk7DQotDQotICAgIHJldHVybiBjb3VudDsNCi19DQotDQotc3RhdGljIHZvaWQgKm5vZmFzdF9wb3J0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpDQotX19hY3F1aXJlcyhSQ1UpDQotew0KLSAgICBpZiAoKnBvcyA+PSAxKQ0KLSAgICAgICAgcmV0dXJuIE5VTEw7DQotICAgIHJldHVybiAxOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqbm9mYXN0X3BvcnRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykNCi17DQotICAgICgqcG9zKSsrOw0KLSAgICByZXR1cm4gTlVMTDsNCi19DQotDQotc3RhdGljIHZvaWQgbm9mYXN0X3BvcnRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLV9fcmVsZWFzZXMoUkNVKQ0KLXsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1zdGF0aWMgaW50IG5vZmFzdF9wb3J0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi17DQotICAgIGludCBpID0gMDsNCi0NCi0gICAgaWYgKG5vZmFzdF9wb3J0WzBdID09IDApDQotICAgIHsNCi0gICAgICAgIHNlcV9wcmludGYocywgIkFsbCBwb3J0cyBzdXBwb3J0IGZhc3QhIFxuIik7DQotICAgIH0NCi0gICAgZWxzZQ0KLSAgICB7DQotICAgICAgICBzZXFfcHJpbnRmKHMsICJOb3Qgc3VwcG9ydGVkIHBvcnRzIGluY2x1ZGU6XG4lZCIsIG5vZmFzdF9wb3J0WzBdKTsNCi0NCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBOT0ZBU1RfUFJPVE9fTUFYOyBpKyspDQotICAgICAgICB7DQotICAgICAgICAgICAgLy+2y7/ausXT9rW9ML3hyvgNCi0gICAgICAgICAgICBpZiAobm9mYXN0X3BvcnRbaV0gPT0gMCkNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiKyVkIiwgbm9mYXN0X3BvcnRbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc2VxX3ByaW50ZihzLCAiXG5cbiIpOw0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5vZmFzdF9wb3J0X3NlcV9vcHMgPSB7DQotICAgIC5zdGFydCA9IG5vZmFzdF9wb3J0X3NlcV9zdGFydCwNCi0gICAgLm5leHQgID0gbm9mYXN0X3BvcnRfc2VxX25leHQsDQotICAgIC5zdG9wICA9IG5vZmFzdF9wb3J0X3NlcV9zdG9wLA0KLSAgICAuc2hvdyAgPSBub2Zhc3RfcG9ydF9zZXFfc2hvdw0KLX07DQotDQotc3RhdGljIGludCBub2Zhc3RfcG9ydF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQ0KLXsNCi0gICAgcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZub2Zhc3RfcG9ydF9zZXFfb3BzKTsNCi19DQotDQotc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSB0dXBsZV9pbmZvOw0KLS8qDQotMX42IGZhc3QgwbS909DFz6Ky6dGvDQotOCBza2LKzbfFteOy6dGvDQotOSBzb2NrZXQguPrX2dDFz6Ky6dGvDQotKi8NCi1pbnQgZ2V0Y29ubl90eXBlID0gMDsNCi0NCi1zdGF0aWMgdm9pZCAqY29ubl9kYXRhaW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQ0KLV9fYWNxdWlyZXMoUkNVKQ0KLXsNCi0gICAgaWYgKCpwb3MgPj0gMSkNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICBzZXFfcHJpbnRmKHNlcSwgInN0YXJ0IGZhc3Q0IGNvdW50OiVsZCwgZnc6JWxkLCBsb2NhbDRfcmVjdjolbGQsIGxvY2FsNF9vdXRwdXQ6JWxkXG4iLA0KLSAgICAgICAgICAgICAgIChsb25nKXNrYl9udW00LCAobG9uZylmYXN0bmF0X251bSwgKGxvbmcpZmFzdF9sb2NhbDRfcmN2X251bSwgKGxvbmcpZmFzdF9sb2NhbDRfb3V0cHV0X251bSk7DQotICAgIHNlcV9wcmludGYoc2VxLCAic3RhcnQgZmFzdDYgY291bnQ6JWxkLCBmdzolbGQsIGxvY2FsNl9yZWN2OiVsZCwgbG9jYWw2X291dHB1dDolbGRcbiIsDQotICAgICAgICAgICAgICAgKGxvbmcpc2tiX251bTYsIChsb25nKWZhc3Q2X251bSwgKGxvbmcpZmFzdF9sb2NhbDZfcmN2X251bSwgKGxvbmcpZmFzdF9sb2NhbDZfb3V0cHV0X251bSk7DQotICAgIHJldHVybiAxOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCAqY29ubl9kYXRhaW5mb19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQ0KLXsNCi0gICAgKCpwb3MpKys7DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBjb25uX2RhdGFpbmZvX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi1fX3JlbGVhc2VzKFJDVSkNCi17DQotICAgIHJldHVybjsNCi19DQotDQotc3RhdGljIGludCBjb25uX2RhdGFpbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikNCi17DQotICAgIGludCBpID0gMCwgaiA9IDA7DQotICAgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsNCi0gICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoX3JkaXI7DQotICAgIHN0cnVjdCBuZl9jb25uICogY3Q7DQotICAgIHN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOw0KLQ0KLSAgICBmb3IoaSA9IDA7IGkgPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7IGkrKykgew0KLSAgICAgICAgaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkoaCwgbiwgJm5mX2Nvbm50cmFja19oYXNoW2ldLCBobm5vZGUpIHsNCi0gICAgICAgICAgICBpZihoLT50dXBsZS5kc3QuZGlyICE9IElQX0NUX0RJUl9PUklHSU5BTCkNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgaWYodHVwbGVfaW5mby5kc3QucHJvdG9udW0gJiYgdHVwbGVfaW5mby5kc3QucHJvdG9udW0gIT0gaC0+dHVwbGUuZHN0LnByb3RvbnVtKQ0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLmRzdC51My5pcCAmJiBtZW1jbXAoJnR1cGxlX2luZm8uZHN0LnUzLmlwNiwgaC0+dHVwbGUuZHN0LnUzLmlwNiwgMTYpICE9IDApDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIGlmKHR1cGxlX2luZm8uc3JjLnUzLmlwICYmIG1lbWNtcCgmdHVwbGVfaW5mby5zcmMudTMuaXA2LCBoLT50dXBsZS5zcmMudTMuaXA2LCAxNikgIT0gMCkNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgaWYodHVwbGVfaW5mby5kc3QudS5hbGwgJiYgdHVwbGVfaW5mby5kc3QudS5hbGwgIT0gaC0+dHVwbGUuZHN0LnUuYWxsKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZih0dXBsZV9pbmZvLnNyYy51LmFsbCAmJiB0dXBsZV9pbmZvLnNyYy51LmFsbCAhPSBoLT50dXBsZS5zcmMudS5hbGwpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGN0ID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBuZl9jb25uLCB0dXBsZWhhc2hbaC0+dHVwbGUuZHN0LmRpcl0pOw0KLQ0KLSAgICAgICAgICAgIHNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7DQotICAgICAgICAgICAgaWYoZ2V0Y29ubl90eXBlICYmIGdldGNvbm5fdHlwZSAhPSBjdC0+ZmFzdF9jdC5pc0Zhc3QpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodW5saWtlbHkoIWF0b21pY19pbmNfbm90X3plcm8oJmN0LT5jdF9nZW5lcmFsLnVzZSkpKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfYmgoJmZhc3RfZndfc3BpbmxvY2spOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaF9yZGlyID0gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXTsNCi0gICAgICAgICAgICBpZihoLT50dXBsZS5zcmMubDNudW0gPT0gQUZfSU5FVCkgew0KLSAgICAgICAgICAgICAgICAvKnNlcV9wcmludGYocywgImN0aW5mbyBwcm90b251bTogJWQgIE9yaWdpbmFsIHNpcDogJTA4eCwgc3BvcnQ6ICVkLCBkaXA6ICUwOHgsIGRwb3J0OiAlZCwgcGFja2V0czogJWx1ICwgYnl0ZXM6ICVsdTsiLA0KLSAgICAgICAgICAgICAgICAgICAgaC0+dHVwbGUuZHN0LnByb3RvbnVtLCBudG9obChoLT50dXBsZS5zcmMudTMuaXApLCBudG9ocyhoLT50dXBsZS5zcmMudS5hbGwpLCBudG9obChoLT50dXBsZS5kc3QudTMuaXApLCBudG9ocyhoLT50dXBsZS5kc3QudS5hbGwpLA0KLSAgICAgICAgICAgICAgICAgICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cywgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMpOw0KLSAgICAgICAgICAgICAgICBzZXFfcHJpbnRmKHMsICIgICAgcmVwbHkgc2lwOiAlMDh4LCBzcG9ydDogJWQsIGRpcDogJTA4eCwgZHBvcnQ6ICVkLCBwYWNrZXRzOiAlbHUgLCBieXRlczogJWx1XG4iLA0KLSAgICAgICAgICAgICAgICAgICAgbnRvaGwoaF9yZGlyLT50dXBsZS5zcmMudTMuaXApLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51LmFsbCksIG50b2hsKGhfcmRpci0+dHVwbGUuZHN0LnUzLmlwKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudS5hbGwpLA0KLSAgICAgICAgICAgICAgICAgICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cywgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMpOyovDQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgImN0aW5mbyBwcm90b251bTogJWQgIE9yaWdpbmFsIHNpcDogJTA4eCwgc3BvcnQ6ICVkLCBkaXA6ICUwOHgsIGRwb3J0OiAlZDsiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnR1cGxlLmRzdC5wcm90b251bSwgbnRvaGwoaC0+dHVwbGUuc3JjLnUzLmlwKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUuYWxsKSwgbnRvaGwoaC0+dHVwbGUuZHN0LnUzLmlwKSwgbnRvaHMoaC0+dHVwbGUuZHN0LnUuYWxsKSk7DQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgIiAgICByZXBseSBzaXA6ICUwOHgsIHNwb3J0OiAlZCwgZGlwOiAlMDh4LCBkcG9ydDogJWRcbiIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaGwoaF9yZGlyLT50dXBsZS5zcmMudTMuaXApLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51LmFsbCksIG50b2hsKGhfcmRpci0+dHVwbGUuZHN0LnUzLmlwKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudS5hbGwpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihoLT50dXBsZS5zcmMubDNudW0gPT0gQUZfSU5FVDYpIHsNCi0gICAgICAgICAgICAgICAgLypzZXFfcHJpbnRmKHMsICJjdGluZm8gIHByb3RvbnVtOiAlZCAgT3JpZ2luYWwgc2lwOiAleDoleDoleDoleDoleDoleDoleDoleCBzcG9ydDogJWQsIGRpcDogJXg6JXg6JXg6JXg6JXg6JXg6JXg6JXgsIGRwb3J0OiAlZCwgcGFja2V0czogJWx1ICwgYnl0ZXM6ICVsdTsiLA0KLSAgICAgICAgICAgICAgICAgICAgaC0+dHVwbGUuZHN0LnByb3RvbnVtLCBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGgtPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzFdKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbMl0pLCBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNls0XSksIG50b2hzKGgtPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzVdKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbNl0pLCBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNls3XSksIG50b2hzKGgtPnR1cGxlLnNyYy51LmFsbCksDQotICAgICAgICAgICAgICAgICAgICBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGgtPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzFdKSwgbnRvaHMoaC0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbMl0pLCBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls0XSksIG50b2hzKGgtPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzVdKSwgbnRvaHMoaC0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbNl0pLCBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls3XSksIG50b2hzKGgtPnR1cGxlLmRzdC51LmFsbCksDQotICAgICAgICAgICAgICAgICAgICBjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzLCBjdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyk7DQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgIiAgICBSZXBseSBzaXA6ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4IHNwb3J0OiAlZCwgZGlwOiAleDoleDoleDoleDoleDoleDoleDoleCwgZHBvcnQ6ICVkLCBwYWNrZXRzOiAlbHUgLCBieXRlczogJWx1XG4iLA0KLSAgICAgICAgICAgICAgICAgICAgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbMV0pLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzJdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzRdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNls1XSksIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbNl0pLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzddKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudS5hbGwpLA0KLSAgICAgICAgICAgICAgICAgICAgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGhfcmRpci0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbMV0pLCBudG9ocyhoX3JkaXItPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzJdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICBudG9ocyhoX3JkaXItPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzRdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls1XSksIG50b2hzKGhfcmRpci0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbNl0pLCBudG9ocyhoX3JkaXItPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzddKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudS5hbGwpLA0KLSAgICAgICAgICAgICAgICAgICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cywgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMpOyovDQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgImN0aW5mbyAgcHJvdG9udW06ICVkICBPcmlnaW5hbCBzaXA6ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4IHNwb3J0OiAlZCwgZGlwOiAleDoleDoleDoleDoleDoleDoleDoleCwgZHBvcnQ6ICVkLCBwYWNrZXRzOiB4eCAsIGJ5dGVzOiB4eDsiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnR1cGxlLmRzdC5wcm90b251bSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbMF0pLCBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlsxXSksIG50b2hzKGgtPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzJdKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbM10pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGgtPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzRdKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbNV0pLCBudG9ocyhoLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNls2XSksIG50b2hzKGgtPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzddKSwgbnRvaHMoaC0+dHVwbGUuc3JjLnUuYWxsKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGgtPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzFdKSwgbnRvaHMoaC0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbMl0pLCBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoaC0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbNF0pLCBudG9ocyhoLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls1XSksIG50b2hzKGgtPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzZdKSwgbnRvaHMoaC0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbN10pLCBudG9ocyhoLT50dXBsZS5kc3QudS5hbGwpKTsNCi0gICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiICAgIFJlcGx5IHNpcDogJXg6JXg6JXg6JXg6JXg6JXg6JXg6JXggc3BvcnQ6ICVkLCBkaXA6ICV4OiV4OiV4OiV4OiV4OiV4OiV4OiV4LCBkcG9ydDogJWQsIHBhY2tldHM6IHh4ICwgYnl0ZXM6IHh4XG4iLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbMF0pLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzFdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNlsyXSksIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbM10pLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbNF0pLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51My5pbjYuczZfYWRkcjE2WzVdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5zcmMudTMuaW42LnM2X2FkZHIxNls2XSksIG50b2hzKGhfcmRpci0+dHVwbGUuc3JjLnUzLmluNi5zNl9hZGRyMTZbN10pLCBudG9ocyhoX3JkaXItPnR1cGxlLnNyYy51LmFsbCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlswXSksIG50b2hzKGhfcmRpci0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbMV0pLCBudG9ocyhoX3JkaXItPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzJdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNlszXSksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls0XSksIG50b2hzKGhfcmRpci0+dHVwbGUuZHN0LnUzLmluNi5zNl9hZGRyMTZbNV0pLCBudG9ocyhoX3JkaXItPnR1cGxlLmRzdC51My5pbjYuczZfYWRkcjE2WzZdKSwgbnRvaHMoaF9yZGlyLT50dXBsZS5kc3QudTMuaW42LnM2X2FkZHIxNls3XSksIG50b2hzKGhfcmRpci0+dHVwbGUuZHN0LnUuYWxsKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKGN0LT5mYXN0X2N0LmlzRmFzdCA9PSBGQVNUX0NUX0xPQ0FMNiB8fCBjdC0+ZmFzdF9jdC5pc0Zhc3QgPT0gRkFTVF9DVF9MT0NBTDQpIHsNCi0gICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiY3RpbmZvIC0+SVNGQVNUOiAlZCwgc2s6ICUjbGx4XG4iLCBjdC0+ZmFzdF9jdC5pc0Zhc3QsIChVSU5UNjQpY3QtPmZhc3RfY3Quc2spOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZihjdC0+ZmFzdF9jdC5pc0Zhc3QgPT0gRkFTVF9DVF9GVzYgfHwgY3QtPmZhc3RfY3QuaXNGYXN0ID09IEZBU1RfQ1RfRlc0KSB7DQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgImN0aW5mbyAtPklTRkFTVDogJWQiLCBjdC0+ZmFzdF9jdC5pc0Zhc3QpOw0KLSAgICAgICAgICAgICAgICBpZihjdC0+ZmFzdF9jdC5mYXN0X2RzdFtJUF9DVF9ESVJfT1JJR0lOQUxdKQ0KLSAgICAgICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiICAgIE9yaWdpbmFsIGZhc3RfZHN0OiAlI2xseCIsIChVSU5UNjQpY3QtPmZhc3RfY3QuZmFzdF9kc3RbSVBfQ1RfRElSX09SSUdJTkFMXSk7DQotICAgICAgICAgICAgICAgIGlmKGN0LT5mYXN0X2N0LmZhc3RfZHN0W0lQX0NUX0RJUl9SRVBMWV0pDQotICAgICAgICAgICAgICAgICAgICBzZXFfcHJpbnRmKHMsICIgICAgUmVwbHkgZmFzdF9kc3Q6ICUjbGx4IiwgKFVJTlQ2NCljdC0+ZmFzdF9jdC5mYXN0X2RzdFtJUF9DVF9ESVJfUkVQTFldKTsNCi0gICAgICAgICAgICAgICAgaWYoY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbSVBfQ1RfRElSX09SSUdJTkFMXSkNCi0gICAgICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgIiAgICBPcmlnaW5hbCBmYXN0X2JycG9ydDogJSNsbHgiLCAoVUlOVDY0KWN0LT5mYXN0X2N0LmZhc3RfYnJwb3J0W0lQX0NUX0RJUl9PUklHSU5BTF0pOw0KLSAgICAgICAgICAgICAgICBpZihjdC0+ZmFzdF9jdC5mYXN0X2JycG9ydFtJUF9DVF9ESVJfUkVQTFldKQ0KLSAgICAgICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiICAgIFJlcGx5IGZhc3RfYnJwb3J0OiAlI2xseCIsIChVSU5UNjQpY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbSVBfQ1RfRElSX1JFUExZXSk7DQotICAgICAgICAgICAgICAgIHNlcV9wcmludGYocywgIlxuIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0X2Z3X3NwaW5sb2NrKTsNCi0gICAgICAgICAgICBuZl9jdF9wdXQoY3QpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiAwOw0KLX0NCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNvbm5fZGF0YWluZm9fc2VxX29wcz0gew0KLSAgICAuc3RhcnQgPSBjb25uX2RhdGFpbmZvX3NlcV9zdGFydCwNCi0gICAgLm5leHQgID0gY29ubl9kYXRhaW5mb19zZXFfbmV4dCwNCi0gICAgLnN0b3AgID0gY29ubl9kYXRhaW5mb19zZXFfc3RvcCwNCi0gICAgLnNob3cgID0gY29ubl9kYXRhaW5mb19zZXFfc2hvdw0KLQ0KLX07DQotDQotc3RhdGljIGludCBjb25uX2RhdGFpbmZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpDQotew0KLSAgICByZXR1cm4gc2VxX29wZW4oZmlsZSwgJmNvbm5fZGF0YWluZm9fc2VxX29wcyk7DQotfQ0KLQ0KLS8vyq69+NbG19a3+7Su16q7r86q1fvK/Q0KLXN0YXRpYyBpbnQgc3RyMmludChjaGFyICpzdHIpDQotew0KLSAgICBpbnQgaSA9IDAsIHZhbHVlID0gMCwgbmVnYXRpdmUgPSAxOw0KLSAgICBpbnQgbGVuID0gc3RybGVuKHN0cik7DQotDQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykNCi0gICAgew0KLSAgICAgICAgLy/M+Ln9x7DD5rXEv9W48Q0KLSAgICAgICAgaWYgKCh2YWx1ZSA9PSAwKSAmJiAoc3RyW2ldID09ICcgJykpDQotICAgICAgICAgICAgY29udGludWU7DQotDQotICAgICAgICAvL7Xa0ru49tPQ0KfX1rf7yse4urrFDQotICAgICAgICBpZiAoKG5lZ2F0aXZlID09IDEpICYmIChzdHJbaV0gPT0gJy0nKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBuZWdhdGl2ZSA9IC0xOw0KLSAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy/T9rW9t8fKrr341sbK/dfW1PK94cr4DQotICAgICAgICBpZiAoc3RyW2ldIDwgJzAnIHx8IHN0cltpXSA+ICc5JykNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIHZhbHVlID0gdmFsdWUgKiAxMCArIChzdHJbaV0gLSAnMCcpOw0KLSAgICB9DQotICAgIHJldHVybiB2YWx1ZSAqIG5lZ2F0aXZlOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBwYXJzZV9ub2Zhc3RfcG9ydChjb25zdCBjaGFyICpzdHIsIGNoYXIgc3BsaXQpDQotew0KLSAgICBjaGFyICpwID0gTlVMTDsNCi0gICAgY2hhciAqcHJlID0gc3RyOw0KLSAgICBjaGFyIHBvcnRTdHJbUE9SVF9MRU5dID0gezB9OyAvL9Ct0um2y7/ausXX7rTzzqo2NTUzNQ0KLSAgICBpbnQgY291bnQgPSAwLCBwb3J0ID0gMCwgbGVuID0gMDsNCi0NCi0gICAgbWVtc2V0KG5vZmFzdF9wb3J0LCAwLCBOT0ZBU1RfUFJPVE9fTUFYICogc2l6ZW9mKG5vZmFzdF9wb3J0WzBdKSk7DQotDQotICAgIGZvciAoOyAocCA9IHN0cmNocihwcmUsIHNwbGl0KSkgIT0gTlVMTDsgcHJlID0gcCArIDEpDQotICAgIHsNCi0gICAgICAgIC8vtdrSu7j219a3+77Nyse31rj0t/sNCi0gICAgICAgIGlmIChwID09IHByZSkNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0NCi0gICAgICAgIG1lbXNldChwb3J0U3RyLCAwLCBQT1JUX0xFTik7DQotICAgICAgICBsZW4gPSBtaW4ocCAtIHByZSwgUE9SVF9MRU4gLSAxKTsNCi0gICAgICAgIHNucHJpbnRmKHBvcnRTdHIsbGVuKzEsIiVzIixwcmUpOw0KLSAgICAgICAgcG9ydCA9IHN0cjJpbnQocG9ydFN0cik7DQotICAgICAgICBpZiAocG9ydCA8PSAwIHx8IHBvcnQgPiA2NTUzNSkgLy+2y7/ausXX7rTzNjU1MzUNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIG5vZmFzdF9wb3J0W2NvdW50KytdID0gcG9ydDsNCi0gICAgICAgIGlmIChjb3VudCA9PSBOT0ZBU1RfUFJPVE9fTUFYKQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoKnByZSAhPSAnXDAnKSAvL9fuuvPSu7j2srvKx7fWuPS3+w0KLSAgICB7DQotICAgICAgICBtZW1zZXQocG9ydFN0ciwgMCwgUE9SVF9MRU4pOw0KLSAgICAgICAgbGVuID0gbWluKHN0ciArIHN0cmxlbihzdHIpIC0gcHJlLCBQT1JUX0xFTiAtIDEpOw0KLSAgICAgICAgc25wcmludGYocG9ydFN0cixsZW4rMSwiJXMiLHByZSk7DQotICAgICAgICBwb3J0ID0gc3RyMmludChwb3J0U3RyKTsNCi0gICAgICAgIGlmIChwb3J0IDw9IDAgfHwgcG9ydCA+IDY1NTM1KSAvL7bLv9q6xdfutPM2NTUzNQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIG5vZmFzdF9wb3J0W2NvdW50KytdID0gcG9ydDsNCi0gICAgfQ0KLX0NCi0NCi0vL9PDu6fQtMP8we61xLLOv7y0+sLro6y/ydPDwLTF5NbDudjBqsno1sOhos34v9rD+7XIstnX9w0KLXN0YXRpYyBzc2l6ZV90IG5vZmFzdF9wb3J0X3NldChzdHJ1Y3QgZmlsZSAqZmlsZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotICAgIHNpemVfdCBzaXplOw0KLSAgICBjaGFyIHByb3RvWzEwMjRdID0gezB9Ow0KLQ0KLSAgICAvL2NvdW50zrKyv7D8uqzByzG49r3hyvi3+w0KLSAgICBzaXplID0gbWluKGNvdW50IC0gMSwgMTAyNCk7DQotICAgIGlmIChjb3B5X2Zyb21fdXNlcihwcm90bywgYnVmZmVyLCBzaXplKSkNCi0gICAgICAgIHJldHVybiAtRUZBVUxUOw0KLQ0KLSAgICAvL73izvbX1rf7tK4NCi0gICAgcGFyc2Vfbm9mYXN0X3BvcnQocHJvdG8sICcrJyk7DQotDQotICAgIHJldHVybiBjb3VudDsNCi19DQotDQotZXh0ZXJuIGludCBpbjRfcHRvbihjb25zdCBjaGFyICpzcmMsIGludCBzcmNsZW4sDQotICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LA0KLSAgICAgICAgICAgICAgICAgICAgaW50IGRlbGltLCBjb25zdCBjaGFyICoqZW5kKTsNCi1leHRlcm4gaW50IGluNl9wdG9uKGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwNCi0gICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsDQotICAgICAgICAgICAgICAgICAgICBpbnQgZGVsaW0sIGNvbnN0IGNoYXIgKiplbmQpOw0KLQ0KLQ0KLXN0YXRpYyB2b2lkIGNvbm5fZGF0YWluZm9fZ2V0X3N0cihjaGFyICpzdHIsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQpIHsNCi0gICAgc3RybmNhdChzdHIsIHN0YXJ0LCBlbmQgLSBzdGFydCk7DQotICAgICooc3RyICsgKHVuc2lnbmVkIGxvbmcpZW5kIC0gKHVuc2lnbmVkIGxvbmcpc3RhcnQpID0gJ1wwJzsNCi19DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLcrkyOu48cq9OiAgICDUtGlwK9S0cG9ydCvEv7XEaXArxL+1xHBvcnQrbDTQrdLpwODQzStmYXN0wbS908Dg0M0oss6/vCBlbnVtIGNvbm5fZmFzdF90eXBlKQ0KLcq1wP06ICAgICAgICAxOTIuMTY4LjAuMTAwKzExMTErMTkyLjE2OC4zMC4xMDIrMjIyMis2KzQNCi3XotLiOiAgICAgICAgyLHKocSz0rvP7qOsxKzIz8TH0rvP7sirxqXF5A0KLSAgICAgICAgICAgICsrKysrOrHtyr7K5LP2yKuyv8G0vdPQxc+iDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXN0YXRpYyBzc2l6ZV90IGNvbm5fZGF0YWluZm9fc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpDQotew0KLSAgICBjaGFyIHR1cGxlWzEwMjRdID0gIiI7DQotICAgIGludCBpID0gMDsNCi0gICAgY2hhciAqc3BsaXRbNV07DQotICAgIGNoYXIgc2lwWzQwXSA9ICIiOw0KLSAgICBjaGFyIHNwb3J0WzZdID0gIiI7DQotICAgIGNoYXIgZGlwWzQwXSA9ICIiOw0KLSAgICBjaGFyIGRwb3J0WzZdID0gIiI7DQotICAgIGNoYXIgcHJvdG9udW1bNl0gPSAiIjsNCi0gICAgY2hhciBjb25uX3R5cGVbNl0gPSAiIjsNCi0gICAgY29uc3QgY2hhciAqZW5kOw0KLQ0KLSAgICB0dXBsZVsxMDIzXSA9ICdcMCc7DQotICAgIGlmIChzdHJuY3B5X2Zyb21fdXNlcih0dXBsZSwgKGNoYXIgKilidWZmZXIsIGNvdW50KSA8PSAwKSB7DQotICAgICAgICByZXR1cm4gLUVGQVVMVDsNCi0gICAgfQ0KLSAgICBtZW1zZXQoJnR1cGxlX2luZm8sIDAsc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUpKTsNCi0gICAgZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7DQotICAgICAgICBpZihpID09IDApDQotICAgICAgICAgICAgc3BsaXRbaV0gPSBzdHJjaHIodHVwbGUsICcrJyk7DQotICAgICAgICBlbHNlDQotICAgICAgICAgICAgc3BsaXRbaV0gPSBzdHJjaHIoc3BsaXRbaS0xXSArIDEsICcrJyk7DQotICAgICAgICBpZighc3BsaXRbaV0pDQotICAgICAgICAgICAgZ290byBlcnJfb3V0Ow0KLSAgICAgICAgc3dpdGNoKGkpIHsNCi0gICAgICAgIGNhc2UgMDoNCi0gICAgICAgICAgICBjb25uX2RhdGFpbmZvX2dldF9zdHIoc2lwLCB0dXBsZSwgc3BsaXRbaV0pOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAxOg0KLSAgICAgICAgICAgIGNvbm5fZGF0YWluZm9fZ2V0X3N0cihzcG9ydCwgc3BsaXRbaS0xXSArIDEsIHNwbGl0W2ldKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgMjoNCi0gICAgICAgICAgICBjb25uX2RhdGFpbmZvX2dldF9zdHIoZGlwLCBzcGxpdFtpLTFdICsgMSwgc3BsaXRbaV0pOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgY2FzZSAzOg0KLSAgICAgICAgICAgIGNvbm5fZGF0YWluZm9fZ2V0X3N0cihkcG9ydCwgc3BsaXRbaS0xXSArIDEsIHNwbGl0W2ldKTsNCi0gICAgICAgICAgICBicmVhazsNCi0gICAgICAgIGNhc2UgNDoNCi0gICAgICAgICAgICBjb25uX2RhdGFpbmZvX2dldF9zdHIocHJvdG9udW0sIHNwbGl0W2ktMV0gKyAxLCBzcGxpdFtpXSk7DQotICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgIGdvdG8gZXJyX291dDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBzdHJuY2F0KGNvbm5fdHlwZSwgc3BsaXRbaS0xXSArIDEsIHNpemVvZihjb25uX3R5cGUpLXN0cmxlbihjb25uX3R5cGUpLTEpOw0KLSAgICBpZihzdHJsZW4oc2lwKSA+IDApIHsNCi0gICAgICAgIGlmKHN0cmNocihzaXAsJy4nKSAhPSBOVUxMICYmIGluNF9wdG9uKHNpcCwgc3RybGVuKHNpcCksICh1OCAqKSZ0dXBsZV9pbmZvLnNyYy51My5pbiwgLTEsICZlbmQpICE9IDEpDQotICAgICAgICAgICAgZ290byBlcnJfb3V0Ow0KLSAgICAgICAgZWxzZSBpZihzdHJjaHIoc2lwLCc6JykgIT0gTlVMTCAmJiBpbjZfcHRvbihzaXAsIHN0cmxlbihzaXApLCAodTggKikmdHVwbGVfaW5mby5zcmMudTMuaW42LCAtMSwgJmVuZCkgIT0gMSkNCi0gICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgIH0NCi0gICAgaWYoc3RybGVuKHNwb3J0KSA+IDApIHsNCi0gICAgICAgIGZvcihpID0gMDsgaSA8IHN0cmxlbihzcG9ydCk7IGkrKykgew0KLSAgICAgICAgICAgIGlmKHNwb3J0W2ldIDwgJzAnIHx8IHNwb3J0W2ldID4gJzknKQ0KLSAgICAgICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgICAgICAgICAgdHVwbGVfaW5mby5zcmMudS5hbGwgPSBzcG9ydFtpXSAtICcwJyArIHR1cGxlX2luZm8uc3JjLnUuYWxsKjEwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYodHVwbGVfaW5mby5zcmMudS5hbGwgPiA2NTUzNSkNCi0gICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgICAgICB0dXBsZV9pbmZvLnNyYy51LmFsbCA9IGh0b25zKHR1cGxlX2luZm8uc3JjLnUuYWxsKTsNCi0gICAgfQ0KLSAgICBpZihzdHJsZW4oZGlwKSA+IDApIHsNCi0gICAgICAgIGlmKHN0cmNocihkaXAsJy4nKSAhPSBOVUxMICYmIGluNF9wdG9uKGRpcCwgc3RybGVuKGRpcCksICh1OCAqKSZ0dXBsZV9pbmZvLmRzdC51My5pbiwgLTEsICZlbmQpICE9IDEpDQotICAgICAgICAgICAgZ290byBlcnJfb3V0Ow0KLSAgICAgICAgZWxzZSBpZihzdHJjaHIoZGlwLCc6JykgIT0gTlVMTCAmJiBpbjZfcHRvbihkaXAsIHN0cmxlbihkaXApLCAodTggKikmdHVwbGVfaW5mby5kc3QudTMuaW42LCAtMSwgJmVuZCkgIT0gMSkNCi0gICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgIH0NCi0gICAgaWYoc3RybGVuKGRwb3J0KSA+IDApIHsNCi0gICAgICAgIGZvcihpID0gMDsgaSA8IHN0cmxlbihkcG9ydCk7IGkrKykgew0KLSAgICAgICAgICAgIGlmKGRwb3J0W2ldIDwgJzAnIHx8IGRwb3J0W2ldID4gJzknKQ0KLSAgICAgICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgICAgICAgICAgdHVwbGVfaW5mby5kc3QudS5hbGwgPSBkcG9ydFtpXSAtICcwJyArIHR1cGxlX2luZm8uZHN0LnUuYWxsKjEwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYodHVwbGVfaW5mby5kc3QudS5hbGwgPiA2NTUzNSkNCi0gICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgICAgICB0dXBsZV9pbmZvLmRzdC51LmFsbCA9IGh0b25zKHR1cGxlX2luZm8uZHN0LnUuYWxsKTsNCi0gICAgfQ0KLSAgICBpZihzdHJsZW4ocHJvdG9udW0pID4gMCkgew0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgc3RybGVuKHByb3RvbnVtKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYocHJvdG9udW1baV0gPCAnMCcgfHwgcHJvdG9udW1baV0gPiAnOScpDQotICAgICAgICAgICAgICAgIGdvdG8gZXJyX291dDsNCi0gICAgICAgICAgICB0dXBsZV9pbmZvLmRzdC5wcm90b251bSA9IHByb3RvbnVtW2ldIC0gJzAnICsgdHVwbGVfaW5mby5kc3QucHJvdG9udW0qMTA7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYoc3RybGVuKGNvbm5fdHlwZSkgPiAwKSB7DQotICAgICAgICBnZXRjb25uX3R5cGUgPSAwOw0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgc3RybGVuKGNvbm5fdHlwZSkgLSAxOyBpKyspIHsNCi0gICAgICAgICAgICBpZihjb25uX3R5cGVbaV0gPCAnMCcgfHwgY29ubl90eXBlW2ldID4gJzknKQ0KLSAgICAgICAgICAgICAgICBnb3RvIGVycl9vdXQ7DQotICAgICAgICAgICAgZ2V0Y29ubl90eXBlID0gY29ubl90eXBlW2ldIC0gJzAnICsgZ2V0Y29ubl90eXBlKjEwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiBjb3VudDsNCi1lcnJfb3V0Og0KLSAgICBtZW1zZXQoJnR1cGxlX2luZm8sIDAsc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUpKTsNCi0gICAgZ2V0Y29ubl90eXBlID0gMDsNCi0gICAgcmV0dXJuIC1FRkFVTFQ7DQotfQ0KLQ0KLWV4dGVybiBpbnQgcGt0X2xvc3RfdHJhY2s7DQotc3RhdGljIHZvaWQgKnBrdF9sb3N0aW5mb19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQ0KLV9fYWNxdWlyZXMoUkNVKQ0KLXsNCi0gICAgaWYgKCpwb3MgPj0gMSkNCi0gICAgICAgIHJldHVybiBOVUxMOw0KLSAgICByZXR1cm4gMTsNCi19DQotDQotc3RhdGljIHZvaWQgKnBrdF9sb3N0aW5mb19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQ0KLXsNCi0gICAgKCpwb3MpKys7DQotICAgIHJldHVybiBOVUxMOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBwa3RfbG9zdGluZm9fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLV9fcmVsZWFzZXMoUkNVKQ0KLXsNCi0gICAgcmV0dXJuOw0KLX0NCi0NCi1zdGF0aWMgaW50IHBrdF9sb3N0aW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpDQotew0KLSAgICByZXR1cm4gMDsNCi0NCi19DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBwa3RfbG9zdGluZm9fc2VxX29wcz0gew0KLSAgICAuc3RhcnQgPSBwa3RfbG9zdGluZm9fc2VxX3N0YXJ0LA0KLSAgICAubmV4dCAgPSBwa3RfbG9zdGluZm9fc2VxX25leHQsDQotICAgIC5zdG9wICA9IHBrdF9sb3N0aW5mb19zZXFfc3RvcCwNCi0gICAgLnNob3cgID0gcGt0X2xvc3RpbmZvX3NlcV9zaG93LA0KLX07DQotDQotc3RhdGljIGludCBwa3RfbG9zdGluZm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkNCi17DQotICAgIHJldHVybiBzZXFfb3BlbihmaWxlLCAmcGt0X2xvc3RpbmZvX3NlcV9vcHMpOw0KLX0NCi0NCi1zdGF0aWMgc3NpemVfdCBwa3RfbG9zdGluZm9fc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotICAgIHNpemVfdCBzaXplOw0KLSAgICBjaGFyIHRlbXBbNV0gPSB7MH07DQotDQotICAgIC8vY291bnTOsrK/sPy6rMHLMbj2veHK+Lf7o6zWu9ans9YwLTHK5MjrDQotICAgIGlmIChjb3VudCAhPSAyKQ0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQotDQotICAgIGlmIChjb3B5X2Zyb21fdXNlcih0ZW1wLCBidWZmZXIsIDEpKQ0KLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7DQotDQotICAgIGlmICh0ZW1wWzBdIDwgJzAnIHx8IHRlbXBbMF0gPiAnMScpDQotICAgICAgICByZXR1cm4gLUVJTlZBTDsNCi0NCi0NCi0NCi0gICAgcmV0dXJuIGNvdW50Ow0KLX0NCi0NCi0NCi1zdGF0aWMgc3NpemVfdCBkZXZfcmVzZXRfc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOw0KLQlzaXplX3Qgc2l6ZTsNCi0JY2hhciBkZXZfbmFtZVtNQVhfTkVUX0RFVklDRV9OQU1FX0xFTiArIDFdID0gezB9Ow0KLQ0KLQkvL2NvdW50zrKyv7D8uqzByzG49r3hyvi3+w0KLQlzaXplID0gbWluKGNvdW50IC0gMSwgTUFYX05FVF9ERVZJQ0VfTkFNRV9MRU4pOw0KLQlpZiAoY29weV9mcm9tX3VzZXIoZGV2X25hbWUsIGJ1ZmZlciwgc2l6ZSkpDQotCQlyZXR1cm4gLUVGQVVMVDsNCi0NCi0JLy/JvrP9tMvN+MLnyeixuM/gudhzdGF0DQotCWRldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGRldl9uYW1lKTsNCi0JaWYgKGRldil7DQotCQltZW1zZXQoJmRldi0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOw0KLQkJYXRvbWljX2xvbmdfc2V0KCZkZXYtPnJ4X2Ryb3BwZWQsIDApOw0KLQkJZGV2X3B1dChkZXYpOw0KLQl9ZWxzZQ0KLQkJcHJpbnRrKCJkZXZfcmVzZXRfc2V0ICVzIG5vdCBmaW5kXG4iLCBkZXZfbmFtZSk7DQotCXJldHVybiBjb3VudDsNCi19DQotDQotDQotc3RhdGljIHZvaWQgKmN0X2lwdGFibGVzX3N5bl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQ0KLV9fYWNxdWlyZXMoUkNVKQ0KLXsNCi0JaWYgKCpwb3MgPj0gMSkNCi0JCXJldHVybiBOVUxMOw0KLQlyZXR1cm4gMTsNCi19DQotDQotc3RhdGljIHZvaWQgKmN0X2lwdGFibGVzX3N5bl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQ0KLXsNCi0JKCpwb3MpKys7DQotCXJldHVybiBOVUxMOw0KLX0NCi0NCi1zdGF0aWMgdm9pZCBjdF9pcHRhYmxlc19zeW5fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQ0KLV9fcmVsZWFzZXMoUkNVKQ0KLXsNCi0JcmV0dXJuOw0KLX0NCi0NCi1zdGF0aWMgaW50IGN0X2lwdGFibGVzX3N5bl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpDQotew0KLQlzZXFfcHJpbnRmKHMsICJjdF9pcHRhYmxlc19zeW5fc3c6ICV1XG4iLCBjdF9pcHRhYmxlc19zeW5fc3cpOw0KLQlyZXR1cm4gMDsNCi0NCi19DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBjdF9pcHRhYmxlc19zeW5fc2VxX29wcz0gew0KLQkuc3RhcnQgPSBjdF9pcHRhYmxlc19zeW5fc2VxX3N0YXJ0LA0KLQkubmV4dCAgPSBjdF9pcHRhYmxlc19zeW5fc2VxX25leHQsDQotCS5zdG9wICA9IGN0X2lwdGFibGVzX3N5bl9zZXFfc3RvcCwNCi0JLnNob3cgID0gY3RfaXB0YWJsZXNfc3luX3NlcV9zaG93LA0KLX07DQotDQotc3RhdGljIGludCBjdF9pcHRhYmxlc19zeW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkNCi17DQotICAgIHJldHVybiBzZXFfb3BlbihmaWxlLCAmY3RfaXB0YWJsZXNfc3luX3NlcV9vcHMpOw0KLX0NCi0NCi1zdGF0aWMgc3NpemVfdCBjdF9pcHRhYmxlc19zeW5fc2V0KHN0cnVjdCBmaWxlICpmaWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCi17DQotICAgIHNpemVfdCBzaXplOw0KLSAgICBjaGFyIHRlbXBbNV0gPSB7MH07DQotDQotICAgIC8vY291bnTOsrK/sPy6rMHLMbj2veHK+Lf7o6zWu9ans9YwLTHK5MjrDQotICAgIGlmIChjb3VudCAhPSAyKQ0KLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQotDQotICAgIGlmIChjb3B5X2Zyb21fdXNlcih0ZW1wLCBidWZmZXIsIDEpKQ0KLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7DQotDQotICAgIGlmICh0ZW1wWzBdIDwgJzAnIHx8IHRlbXBbMF0gPiAnMScpDQotICAgICAgICByZXR1cm4gLUVJTlZBTDsNCi0NCi0JY3RfaXB0YWJsZXNfc3luX3N3ID0gKHVuc2lnbmVkIGludCkodGVtcFswXSAtICcwJyk7DQotDQotICAgIHJldHVybiBjb3VudDsNCi19DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBmYXN0bmF0X2xldmVsX2ZpbGVfb3BzID0gew0KLSAgICAucHJvY19vcGVuICAgID0gZmFzdG5hdF9sZXZlbF9vcGVuLA0KLSAgICAucHJvY19yZWFkICAgID0gc2VxX3JlYWQsDQotICAgIC5wcm9jX2xzZWVrICA9IHNlcV9sc2VlaywNCi0gICAgLnByb2NfcmVsZWFzZSA9IHNlcV9yZWxlYXNlLCAvL3NlcV9yZWxlYXNlX3ByaXZhdGXLxrr10rK/ydLUo6y1q8rHc2luZ2xlX3JlbGVhc2WjrHNlcV9yZWxlYXNlX25ldLvh09C/1da41evS7LOjDQotICAgIC5wcm9jX3dyaXRlID0gZmFzdG5hdF9sZXZlbF9zZXQsDQotfTsNCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGZhc3Rfc3dpdGNoX2ZpbGVfb3BzID0gew0KLSAgICAucHJvY19vcGVuICAgID0gZmFzdF9zd2l0Y2hfb3BlbiwNCi0gICAgLnByb2NfcmVhZCAgICA9IHNlcV9yZWFkLA0KLSAgICAucHJvY19sc2VlayAgPSBzZXFfbHNlZWssDQotICAgIC5wcm9jX3JlbGVhc2UgPSBzZXFfcmVsZWFzZSwgLy9zZXFfcmVsZWFzZV9wcml2YXRly8a69dKyv8nS1KOstavKx3NpbmdsZV9yZWxlYXNlo6xzZXFfcmVsZWFzZV9uZXS74dPQv9XWuNXr0uyzow0KLSAgICAucHJvY193cml0ZSA9IGZhc3Rfc3dpdGNoX3NldCwNCi19Ow0KLQ0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY19vcHMgZmFzdGJyX2xldmVsX2ZpbGVfb3BzID0gew0KLSAgICAucHJvY19vcGVuICAgID0gZmFzdGJyX2xldmVsX29wZW4sDQotICAgIC5wcm9jX3JlYWQgICAgPSBzZXFfcmVhZCwNCi0gICAgLnByb2NfbHNlZWsgID0gc2VxX2xzZWVrLA0KLSAgICAucHJvY19yZWxlYXNlID0gc2VxX3JlbGVhc2UsDQotICAgIC5wcm9jX3dyaXRlID0gZmFzdGJyX2xldmVsX3NldCwNCi19Ow0KLQ0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY19vcHMgZmFzdG5hdF9maWxlX29wcyA9IHsNCi0gICAgLnByb2Nfb3BlbiAgICA9IGZhc3RuYXRfb3BlbiwNCi0gICAgLnByb2NfcmVhZCAgICA9IHNlcV9yZWFkLA0KLSAgICAucHJvY19sc2VlayAgPSBzZXFfbHNlZWssDQotICAgIC5wcm9jX3JlbGVhc2UgPSBzZXFfcmVsZWFzZSwNCi19Ow0KLQ0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvY19vcHMgZmFzdDZfZmlsZV9vcHMgPSB7DQotICAgIC5wcm9jX29wZW4gICAgPSBmYXN0Nl9vcGVuLA0KLSAgICAucHJvY19yZWFkICAgID0gc2VxX3JlYWQsDQotICAgIC5wcm9jX2xzZWVrICA9IHNlcV9sc2VlaywNCi0gICAgLnByb2NfcmVsZWFzZSA9IHNlcV9yZWxlYXNlLA0KLX07DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBkZXZfZG93bl9maWxlX29wcyA9IHsNCi0gICAgLnByb2Nfd3JpdGUgPSBkZXZfZG93bl9zZXQsDQotfTsNCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIG5vZmFzdF9wb3J0X2ZpbGVfb3BzID0gew0KLSAgICAucHJvY19vcGVuICAgID0gbm9mYXN0X3BvcnRfb3BlbiwNCi0gICAgLnByb2NfcmVhZCAgICA9IHNlcV9yZWFkLA0KLSAgICAucHJvY19sc2VlayAgPSBzZXFfbHNlZWssDQotICAgIC5wcm9jX3JlbGVhc2UgPSBzZXFfcmVsZWFzZSwNCi0gICAgLnByb2Nfd3JpdGUgPSBub2Zhc3RfcG9ydF9zZXQsDQotfTsNCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGNvbm5fZGF0YWluZm9fZmlsZV9vcHMgPSB7DQotICAgIC5wcm9jX29wZW4gPSBjb25uX2RhdGFpbmZvX29wZW4sDQotICAgIC5wcm9jX3JlYWQgPSBzZXFfcmVhZCwNCi0gICAgLnByb2NfbHNlZWsgPSBzZXFfbHNlZWssDQotICAgIC5wcm9jX3JlbGVhc2UgPSBzZXFfcmVsZWFzZSwNCi0gICAgLnByb2Nfd3JpdGUgPSBjb25uX2RhdGFpbmZvX3NldA0KLX07DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBwa3RfbG9zdGluZm9fZmlsZV9vcHMgPSB7DQotICAgIC5wcm9jX29wZW4gPSBwa3RfbG9zdGluZm9fb3BlbiwNCi0gICAgLnByb2NfcmVhZCA9IHNlcV9yZWFkLA0KLSAgICAucHJvY19sc2VlayA9IHNlcV9sc2VlaywNCi0gICAgLnByb2NfcmVsZWFzZSA9IHNlcV9yZWxlYXNlLA0KLSAgICAucHJvY193cml0ZSA9IHBrdF9sb3N0aW5mb19zZXQsDQotfTsNCi0NCi1zdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIGRldl9yZXNldF9maWxlX29wcyA9IHsNCi0JLnByb2Nfd3JpdGUgPSBkZXZfcmVzZXRfc2V0LA0KLX07DQotDQotc3RhdGljIGNvbnN0IHN0cnVjdCBwcm9jX29wcyBjdF9pcHRhYmxlc19zeW5fZmlsZV9vcHMgPSB7DQotICAgIC5wcm9jX29wZW4gPSBjdF9pcHRhYmxlc19zeW5fb3BlbiwNCi0gICAgLnByb2NfcmVhZCA9IHNlcV9yZWFkLA0KLSAgICAucHJvY19sc2VlayA9IHNlcV9sc2VlaywNCi0gICAgLnByb2NfcmVsZWFzZSA9IHNlcV9yZWxlYXNlLA0KLSAgICAucHJvY193cml0ZSA9IGN0X2lwdGFibGVzX3N5bl9zZXQsDQotfTsNCi0NCi0NCi0vL7/sy9nXqreicHJvY87EvP61xLP1yry7rw0KLWludCBmYXN0X2Nvbm50cmFja19pbml0X3Byb2Modm9pZCkNCi17DQotICAgIC8vyP2y47/sy9nXqrei19y/qrnYDQotICAgIHByb2NfY3JlYXRlKCJmYXN0bmF0X2xldmVsIiwgMDQ0MCwgaW5pdF9uZXQucHJvY19uZXQsICZmYXN0bmF0X2xldmVsX2ZpbGVfb3BzKTsNCi0NCi0gICAgLy/I/bLjv+zL2deqt6LQwr7Jv6q52KOsuPfA4NDNv6q52A0KLSAgICBwcm9jX2NyZWF0ZSgiZmFzdF9zd2l0Y2giLCAwNDQwLCBpbml0X25ldC5wcm9jX25ldCwgJmZhc3Rfc3dpdGNoX2ZpbGVfb3BzKTsNCi0NCi0gICAgLy+2/rLjv+zL2deqt6K1yLy2MC0xDQotICAgIHByb2NfY3JlYXRlKCJmYXN0YnJfbGV2ZWwiLCAwNDQwLCBpbml0X25ldC5wcm9jX25ldCwgJmZhc3Ricl9sZXZlbF9maWxlX29wcyk7DQotDQotICAgIC8vaXB2NL/sy9nXqreiz+C52M2zvMYNCi0gICAgcHJvY19jcmVhdGUoImZhc3RuYXQiLCAwNDQwLCBpbml0X25ldC5wcm9jX25ldCwgJmZhc3RuYXRfZmlsZV9vcHMpOw0KLQ0KLSAgICAvL2lwdja/7MvZ16q3os/gudjNs7zGDQotICAgIHByb2NfY3JlYXRlKCJmYXN0NiIsIDA0NDAsIGluaXRfbmV0LnByb2NfbmV0LCAmZmFzdDZfZmlsZV9vcHMpOw0KLQ0KLSAgICAvL8Sz0KnJ6LG4srvE3GRvd26y2df3o6y1q8rHyKW8pLvuuvPT1tKqyb6z/c/gudjBtL3TDQotICAgIHByb2NfY3JlYXRlKCJkZXZfZG93biIsIDA0NDAsIGluaXRfbmV0LnByb2NfbmV0LCAmZGV2X2Rvd25fZmlsZV9vcHMpOw0KLQ0KLSAgICAvL7K71qez1mZhc3RuYXS1xNCt0um2y7/ao6zWp7PWtq/MrMXk1sMNCi0gICAgcHJvY19jcmVhdGUoIm5vZmFzdF9wb3J0IiwgMDQ0MCwgaW5pdF9uZXQucHJvY19uZXQsICZub2Zhc3RfcG9ydF9maWxlX29wcyk7DQotDQotICAgIC8vtsHIocG0vdPQxc+iDQotICAgIHByb2NfY3JlYXRlKCJjb25uX2RhdGFpbmZvIiwgMDQ0MCwgaW5pdF9uZXQucHJvY19uZXQsICZjb25uX2RhdGFpbmZvX2ZpbGVfb3BzKTsNCi0NCi0gICAgLy+2wcihwbS907aqsPzQxc+iDQotICAgIC8vcHJvY19jcmVhdGUoInBrdF9sb3N0aW5mbyIsIDA0NDAsIGluaXRfbmV0LnByb2NfbmV0LCAmcGt0X2xvc3RpbmZvX2ZpbGVfb3BzKTsNCi0NCi0gICAgLy9yZXNldCBkZXYgc3RhdHMNCi0gICAgcHJvY19jcmVhdGUoImRldl9yZXNldF9zdGF0cyIsIDA0NDAsIGluaXRfbmV0LnByb2NfbmV0LCAmZGV2X3Jlc2V0X2ZpbGVfb3BzKTsNCi0NCi0JcHJvY19jcmVhdGUoImN0X2lwdGFibGVzX3N5biIsIDA0NDAsIGluaXRfbmV0LnByb2NfbmV0LCAmY3RfaXB0YWJsZXNfc3luX2ZpbGVfb3BzKTsNCi0gICAgcmV0dXJuIDE7DQotfQ0KLQ0KLUVYUE9SVF9TWU1CT0woZmFzdF9jb25udHJhY2tfaW5pdF9wcm9jKTsNCi0NCi0NCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9jb3JlL2Zhc3Rwcm9jL2Zhc3RuYXQuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdG5hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MTc0NTRjLi4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L2NvcmUvZmFzdHByb2MvZmFzdG5hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg3ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvdWRwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9tdWx0aXBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfaXByYW5nZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KLSNpbmNsdWRlIDxuZXQvcm91dGUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL2Zhc3RuYXQuaD4KLSNpbmNsdWRlIDxuZXQvU0kvbmV0X290aGVyLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL25ldGlvY19wcm9jLmg+Ci0jaW5jbHVkZSA8bmV0L1NJL3ByaW50X3N1bi5oPgotI2luY2x1ZGUgPG5ldC9TSS9uZXRfdHJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxuZXQvU0kvZmFzdF9jb21tb24uaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKiAqKioqKioqKioqKioqKioqKiBpcHY0IL/sy9nXqreiz+C52LHkwb8gKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3BpbmxvY2tfdCBmYXN0bmF0X3NwaW5sb2NrOyAgICAgICAgICAvL9fU0P3L+KOssaO7pMG0se21xLLZ1/cKLWZhc3RfbGlzdF90IHdvcmtpbmdfbGlzdCA9IHswfTsKLXN0cnVjdCBobGlzdF9udWxsc19oZWFkICp3b3JraW5nX2hhc2g7Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioguq/K/cnqw/cgKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKiC6r8r9yrXP1iAqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotLyq78cihsajOxM7l1KrX6dDFz6IqLwotc3RhdGljIGlubGluZSBpbnQgZmFzdF9uYXRfZ2V0X3R1cGxlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotICAgIHN0cnVjdCBpcGhkciAgKmlwaDsKLSAgICBzdHJ1Y3QgdWRwaGRyICp1ZHBoOwotICAgIHN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0jaWYgMAotICAgIGlmICghc2tiIHx8ICF0dXBsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvbmx5IElQIHBhY2tldHMgKi8KLSAgICBpZiAoaHRvbnMoRVRIX1BfSVApICE9IHNrYi0+cHJvdG9jb2wpCi0gICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0gICAgaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKLSNpZiAwCi0gICAgLyogbm90IGRlYWwgd2l0aCBmcmFnbWVudCBwYWNrZXRzIG5vdyAqLwotICAgIGlmIChudG9ocyhpcGgtPmZyYWdfb2ZmKSAmIChJUF9NRiB8IElQX09GRlNFVCkpCi0gICAgewotICAgICAgICBza2JpbmZvX2FkZChOVUxMLFNLQl9GUkFHKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChpcGgtPnR0bCA8PSAxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotICAgIG1lbXNldCh0dXBsZSwgMCwgc2l6ZW9mKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUpKTsKLQotICAgIC8qIG9ubHkgdGNwL3VkcCAqLwotICAgIGlmIChJUFBST1RPX1VEUCA9PSBpcGgtPnByb3RvY29sKQotICAgIHsKLSAgICAgICAgdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopKHNrYi0+ZGF0YSArIGlwaC0+aWhsICogNCk7Ci0gICAgICAgIHR1cGxlLT5zcmMudS51ZHAucG9ydCA9IHVkcGgtPnNvdXJjZTsKLSAgICAgICAgdHVwbGUtPmRzdC51LnVkcC5wb3J0ID0gdWRwaC0+ZGVzdDsKLSAgICAgICAgc2tiX3VkcG51bSsrOwotICAgIH0KLSAgICBlbHNlIGlmIChJUFBST1RPX1RDUCA9PSBpcGgtPnByb3RvY29sKQotICAgIHsKLSAgICAgICAgdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIGlwaC0+aWhsICogNCk7Ci0gICAgICAgIHR1cGxlLT5zcmMudS50Y3AucG9ydCA9IHRjcGgtPnNvdXJjZTsKLSAgICAgICAgdHVwbGUtPmRzdC51LnRjcC5wb3J0ID0gdGNwaC0+ZGVzdDsKLSAgICAgICAgc2tiX3RjcG51bSsrOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdHVwbGUtPnNyYy5sM251bSA9IEFGX0lORVQ7Ci0gICAgdHVwbGUtPnNyYy51My5pcCA9IGlwaC0+c2FkZHI7Ci0gICAgdHVwbGUtPmRzdC51My5pcCA9IGlwaC0+ZGFkZHI7Ci0gICAgdHVwbGUtPmRzdC5wcm90b251bSA9IGlwaC0+cHJvdG9jb2w7Ci0gICAgdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLy+0y7Sm0OjSqrGjs9a6zWRldl94bWl0X2NvbXBsZXRl0rvWwgotLy/Tw2lubGluZc7et6jM4cihtb25q7myzsS8/tbQo6zWu8TcZmFzdG5hdKGiZmFzdDa497fF0ru33Qotc3RhdGljIGlubGluZSBib29sIHN0YXJ0X3htaXRfY29tcGxldGUoaW50IHJjKQotewotICAgIC8qCi0gICAgICogUG9zaXRpdmUgY2FzZXMgd2l0aCBhbiBza2IgY29uc3VtZWQgYnkgYSBkcml2ZXI6Ci0gICAgICogLSBzdWNjZXNzZnVsIHRyYW5zbWlzc2lvbiAocmMgPT0gTkVUREVWX1RYX09LKQotICAgICAqIC0gZXJyb3Igd2hpbGUgdHJhbnNtaXR0aW5nIChyYyA8IDApCi0gICAgICogLSBlcnJvciB3aGlsZSBxdWV1ZWluZyB0byBhIGRpZmZlcmVudCBkZXZpY2UgKHJjICYgTkVUX1hNSVRfTUFTSykKLSAgICAgKi8KLSAgICBpZiAobGlrZWx5KHJjIDwgTkVUX1hNSVRfTUFTSykpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotI2lmbmRlZiBDT05GSUdfUFJFRU1QVF9SVF9GVUxMCi1leHRlcm4gaW50ICp2aXJfYWRkcl9kZHJuZXQ7Ci0jZW5kaWYKLQotLy9pcHY0yv2+3bD8tcS/7MvZtKbA7aOsaGFzaNPDUkNVu/rWxr340NCxo7uko6zX3LXEway908G0se3Tw3NwaW69+NDQsaO7pAotaW50IGZhc3RfbmF0X3JlY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotICAgIGZhc3RfZW50cnlfZGF0YV90ICpuYXRfZW50cnlfZGF0YSA9IE5VTEw7Ci0gICAgZmFzdF9lbnRyeV90ICpuYXRfZW50cnkgPSBOVUxMOwotICAgIHN0cnVjdCBpcGhkciAqaXBoID0gTlVMTDsKLSAgICBzdHJ1Y3QgdWRwaGRyICp1ZHBoID0gTlVMTDsKLSAgICBzdHJ1Y3QgdGNwaGRyICp0Y3BoID0gTlVMTDsKLSAgICBfX3N1bTE2ICpja3N1bSA9IE5VTEw7Ci0gICAgX19iZTMyICpvbGRpcCA9IE5VTEw7Ci0gICAgX19iZTE2ICpvbGRwb3J0ID0gTlVMTDsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLSAgICAvL3VfaW50MzJfdCBza2lwX25hdCA9IDA7Ci0gICAgc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBOVUxMOwotCi0gICAgaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKLSAgICAvL2lmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQICYmIGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCi0gICAgICAgIC8vZ290byBlcnJfb3V0OwotCi0gICAgaWYgKGZhc3RfbmF0X2dldF90dXBsZShza2IsICZ0dXBsZSkgPCAwKQotICAgIHsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X25hdF9nZXRfdHVwbGUgIEVSUiAgISEhXG4iKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIHJjdV9yZWFkX2xvY2soKTsKLSAgICBuYXRfZW50cnlfZGF0YSA9IGZhc3RfZmluZF9lbnRyeV9kYXRhKHdvcmtpbmdfaGFzaCwgJnR1cGxlKTsKLSAgICBpZiAodW5saWtlbHkobmF0X2VudHJ5X2RhdGEgPT0gTlVMTCkpCi0gICAgewotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X25hdF9maW5kICBFUlIgICEhIVxuIik7Ci0gICAgICAgIGdvdG8gZXJyX291dDsKLSAgICB9Ci0KLSAgICBkZXYgPSBuYXRfZW50cnlfZGF0YS0+b3V0ZGV2OwotICAgIGlmICh1bmxpa2VseSghZGV2KSkKLSAgICB7Ci0gICAgICAgIHJjdV9yZWFkX3VubG9jaygpOwotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQotCi0gICAgLyq87LLpsPyzpLbIyse38bOsuf2z9r/ayeixuE1UVSovCi0gICAgaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gZGV2LT5tdHUpKQotICAgIHsKLSAgICAgICAgc2tiaW5mb19hZGQoTlVMTCwgU0tCX09WRVJfTVRVKTsKLSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiZmFzdF9uYXRfcmVjdiBvdXRkZXYgbXR1IEVSUiAhISFcbiIpOwotICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgfQotCQotICAgIC8vu9i0q7XEsPzWsb3Tys23xbKivMbK/QotICAgIGlmICh1bmxpa2VseShza2ItPmRldiA9PSBkZXYpKQotICAgIHsKLSAgICAgICAgc2tiaW5mb19hZGQoTlVMTCwgU0tCX0xPT1ApOwotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIG5hdF9lbnRyeSA9IGZhc3RfZGF0YV90b19lbnRyeShuYXRfZW50cnlfZGF0YSk7Ci0gICAgaWYgKHVubGlrZWx5KCFuYXRfZW50cnkpKQotICAgIHsKLSAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiZmFzdF9uYXRfcmVjdiBmYXN0X25hdF9kYXRhX3RvX2VudHJ5IG51bGwgISEhXG4iKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIC8qINa709C1scurz/K/7MvZwbS907a8vajBorPJuaayxdffRkFTVE5BVKOst/HU8tffserXvMH3s8wgKi8KLSAgICBpZiAoKG5hdF9lbnRyeS0+ZmxhZ3MgIT0gRkFTVF9BTExfRElSKSAmJiAoSVBQUk9UT19VRFAgIT0gaXBoLT5wcm90b2NvbCkpCi0gICAgewotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X25hdF9yZWN2IGZsYWdzIGlzIG5vdCBGQVNUX0FMTF9ESVIgISEhXG4iKTsKLSAgICAgICAgZ290byBlcnJfb3V0OwotICAgIH0KLQotICAgIGlmICh1bmxpa2VseSghKHNrYjIgPSBmYXN0X2V4cGFuZF9oZWFkcm9vbShza2IsIGRldikpKSkgewotICAgICAgICByY3VfcmVhZF91bmxvY2soKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKHVubGlrZWx5KHNrYjIgIT0gc2tiKSkKLSAgICB7Ci0gICAgICAgIGlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2IyLT5kYXRhOwotICAgICAgICBza2IgPSBza2IyOwotICAgIH0KLQotICAgIGZhc3RfdGNwZHVtcChza2IpOwotCi0gICAgLy/I57n716Ww/MP81tCjrMr9vt274WNsb25lo6xmYXN0s8m5ptDo0qq4xLHkZGF0YcTayN2jrNDo0qrW2NDCY29wedK7t90KLSAgICBpZiAoc2tiX2Nsb25lZChza2IpKQotICAgIHsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X25hdF9yZWN2IGNsb25lIFxuIik7Ci0gICAgICAgIGlmIChwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdV9yZWFkX3VubG9jaygpOwotICAgICAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0X25hdF9yZWN2IGNsb25lIGNvcHkgZmFpbGVkICEhIVxuIik7Ci0gICAgICAgICAgICBrZnJlZV9za2Ioc2tiKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvL732tbFmYXN0bmF0s8m5pqOsssXE3Mno1sNJUM23yte12Na3LNLUualjYWNoZcui0MLKscq508MKLSAgICBza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKLSAgICBza2ItPmlzRmFzdG5hdCA9IDE7Ci0JaWYgKGxpa2VseShza2JfZ2V0X25mY3Qoc2tiKSA9PSAwKSl7Ci0JCXNrYl9zZXRfbmZjdChza2IsICh1bnNpZ25lZCBsb25nKW5hdF9lbnRyeS0+Y3QpOwotCQluZl9jb25udHJhY2tfZ2V0KCZuYXRfZW50cnktPmN0LT5jdF9nZW5lcmFsKTsKLQl9Ci0gICAgLy+yu9ans9ZOQVSjrNS0tdjWty/Ev7XEtdjWty+2y7/ausW2vLK70OjSqrjEseSjrNaxvdPNuLSrvs3Q0AotICAgIC8vaWYgKG5hdF9lbnRyeV9kYXRhLT5pc19ub3RfbmF0KQotICAgICAgICAvL3NraXBfbmF0ID0gMTsKLSAgICBpZiAoIW5hdF9lbnRyeV9kYXRhLT5pc19ub3RfbmF0KS8vKCFza2lwX25hdCkKLSAgICB7Ci0gICAgICAgIC8qvfjQ0G5hdNequ7sqLwotICAgICAgICBpZiAoSVBQUk9UT19UQ1AgPT0gaXBoLT5wcm90b2NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIGlwaC0+aWhsICogNCk7Ci0gICAgICAgICAgICBja3N1bSA9ICZ0Y3BoLT5jaGVjazsKLSAgICAgICAgICAgIG9sZHBvcnQgPSAoRk5fVFlQRV9TUkMgPT0gbmF0X2VudHJ5X2RhdGEtPnR5cGUpPyAoJnRjcGgtPnNvdXJjZSk6ICgmdGNwaC0+ZGVzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoSVBQUk9UT19VRFAgPT0gaXBoLT5wcm90b2NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopKHNrYi0+ZGF0YSArIGlwaC0+aWhsICogNCk7Ci0gICAgICAgICAgICBja3N1bSA9ICZ1ZHBoLT5jaGVjazsKLSAgICAgICAgICAgIG9sZHBvcnQgPSAoRk5fVFlQRV9TUkMgPT0gbmF0X2VudHJ5X2RhdGEtPnR5cGUpPyAoJnVkcGgtPnNvdXJjZSk6ICgmdWRwaC0+ZGVzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvbGRpcCA9IChGTl9UWVBFX1NSQyA9PSBuYXRfZW50cnlfZGF0YS0+dHlwZSk/ICgmaXBoLT5zYWRkcikgOiAoJmlwaC0+ZGFkZHIpOwotCi0gICAgICAgIGlmIChja3N1bSAhPSBOVUxMICYmICgwIT0qY2tzdW0gfHwgSVBQUk9UT19UQ1AgPT0gaXBoLT5wcm90b2NvbCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZXRfcHJvdG9fY3N1bV9yZXBsYWNlNChja3N1bSwgc2tiLCAqb2xkaXAsIG5hdF9lbnRyeV9kYXRhLT5uYXRfYWRkciwgMCk7Ci0gICAgICAgICAgICBpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTIoY2tzdW0sIHNrYiwgKm9sZHBvcnQsIG5hdF9lbnRyeV9kYXRhLT5uYXRfcG9ydCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3N1bV9yZXBsYWNlNCgmaXBoLT5jaGVjaywgKm9sZGlwLCBuYXRfZW50cnlfZGF0YS0+bmF0X2FkZHIpOwotICAgICAgICBpZihvbGRwb3J0KQotICAgICAgICAgICAgKm9sZHBvcnQgPSBuYXRfZW50cnlfZGF0YS0+bmF0X3BvcnQ7Ci0gICAgICAgICpvbGRpcCA9IG5hdF9lbnRyeV9kYXRhLT5uYXRfYWRkcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKElQUFJPVE9fVENQID09IGlwaC0+cHJvdG9jb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRjcGggPSAoc3RydWN0IHRjcGhkciAqKShza2ItPmRhdGEgKyBpcGgtPmlobCAqIDQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2tiLT5wcmlvcml0eSA9IG5hdF9lbnRyeV9kYXRhLT5wcmlvcml0eTsKLSAgICBza2ItPm1hcmsgPSBuYXRfZW50cnlfZGF0YS0+bWFyazsKLQotICAgIC8vu/nT2mN0wbS907XEwffBv82zvMYgLS0tIM2zvMZJULD8srvKx01BQ7D8Ci0gICAgaWYgKG5hdF9lbnRyeV9kYXRhLT50dXBsZWhhc2gudHVwbGUuZHN0LmRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpewotICAgICAgICBuYXRfZW50cnktPmN0LT5wYWNrZXRfaW5mb1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHMrKzsKLSAgICAgICAgbmF0X2VudHJ5LT5jdC0+cGFja2V0X2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyArPSBza2ItPmxlbjsKLQkJaWYodW5saWtlbHkobmF0X2VudHJ5LT5jdC0+aW5kZXZbSVBfQ1RfRElSX09SSUdJTkFMXSA9PSBOVUxMKSkKLQkJCW5hdF9lbnRyeS0+Y3QtPmluZGV2W0lQX0NUX0RJUl9PUklHSU5BTF0gPSBza2ItPmluZGV2OwotCQlpZih1bmxpa2VseShuYXRfZW50cnktPmN0LT5vdXRkZXZbSVBfQ1RfRElSX09SSUdJTkFMXSA9PSBOVUxMKSkKLQkJCW5hdF9lbnRyeS0+Y3QtPm91dGRldltJUF9DVF9ESVJfT1JJR0lOQUxdID0gZGV2OwotICAgIH0gZWxzZSBpZiAobmF0X2VudHJ5X2RhdGEtPnR1cGxlaGFzaC50dXBsZS5kc3QuZGlyID09IElQX0NUX0RJUl9SRVBMWSl7Ci0gICAgICAgIG5hdF9lbnRyeS0+Y3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cysrOwotICAgICAgICBuYXRfZW50cnktPmN0LT5wYWNrZXRfaW5mb1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzICs9IHNrYi0+bGVuOwotCQlpZih1bmxpa2VseShuYXRfZW50cnktPmN0LT5pbmRldltJUF9DVF9ESVJfUkVQTFldID09IE5VTEwpKQotCQkJbmF0X2VudHJ5LT5jdC0+aW5kZXZbSVBfQ1RfRElSX1JFUExZXSA9IHNrYi0+aW5kZXY7Ci0JCWlmKHVubGlrZWx5KG5hdF9lbnRyeS0+Y3QtPm91dGRldltJUF9DVF9ESVJfUkVQTFldID09IE5VTEwpKQotCQkJbmF0X2VudHJ5LT5jdC0+b3V0ZGV2W0lQX0NUX0RJUl9SRVBMWV0gPSBkZXY7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRrKCJmYXN0bmF0IHBhY2tldCBlcnJvclxuIik7Ci0gICAgfQotCi0gICAgLy/E2rrL19S0+LXEu/nT2sG0vdO1xMH3wb/Ns7zGCi0gICAgc3RydWN0IG5mX2Nvbm5fY291bnRlciAqYWNjdCA9IChzdHJ1Y3QgbmZfY29ubl9jb3VudGVyICopbmZfY29ubl9hY2N0X2ZpbmQoKGNvbnN0IHN0cnVjdCBuZl9jb25uICopbmF0X2VudHJ5LT5jdCk7Ci0gICAgaWYgKGFjY3QpIHsKLSAgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0gICAgICAgIGlmIChuYXRfZW50cnlfZGF0YS0+dHVwbGVoYXNoLnR1cGxlLmRzdC5kaXIgPT0gSVBfQ1RfRElSX09SSUdJTkFMKQotICAgICAgICAgICAgY3RpbmZvID0gSVBfQ1RfRVNUQUJMSVNIRUQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGN0aW5mbyA9IElQX0NUX0VTVEFCTElTSEVEX1JFUExZOwotCi0gICAgICAgIGF0b21pYzY0X2luYygmYWNjdFtDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMpOwotICAgICAgICBhdG9taWM2NF9hZGQoc2tiLT5sZW4sICZhY2N0W0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMpOwotICAgIH0KLQotICAgIC8qILao1sa5psTco6zOqsHLveK+9rWlVURQueCw/Mqxo6zO3reo1qrP/mluZGV2vfjQ0MH3wb/Ns7zGzsrM4rao1sYgKi8KLSAgICBpZiAodW5saWtlbHkobmF0X2VudHJ5X2RhdGEtPmluZGV2ID09IE5VTEwpKQotICAgIHsKLSAgICAgICAgbmF0X2VudHJ5X2RhdGEtPmluZGV2ID0gc2tiLT5kZXY7Ci0gICAgfQotCi0gICAgLy8gzbO8xsjrv9rN+MLnyeixuLXEvdPK1bD8yv3BvyAgLS0tILLOv7xsaW51eNStyfq1xMf9tq+jrM2zvMa1xLa8ysdJULD8s6S2yAotICAgIGlmIChsaWtlbHkoZmFzdG5hdF9sZXZlbCA9PSBGQVNUX05FVF9ERVZJQ0UpKQotICAgIHsKLSAgICAgICAgbmF0X2VudHJ5X2RhdGEtPmluZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0gICAgICAgIG5hdF9lbnRyeV9kYXRhLT5pbmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47Ci0gICAgfQotCi0gICAgc2tiLT5kZXYgPSBkZXY7Ci0KLSAgICAvL9a709C1sdPQTUFDzbfUpLiz1rXKsaOsssXXvLiz1rWjrLfx1PLOqklQzbcKLSAgICBza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKLSAgICBpZiAobGlrZWx5KG5hdF9lbnRyeV9kYXRhLT5oaF9mbGFnKSkKLSAgICB7Ci0gICAgICAgIG1lbWNweShza2ItPmRhdGEsIG5hdF9lbnRyeV9kYXRhLT5oaF9kYXRhLCBFVEhfSExFTik7Ci0gICAgfQotCi0gICAgLyq4/NDCwbS907OsyrEqLwotICAgIGlmIChJUFBST1RPX1RDUCA9PSBpcGgtPnByb3RvY29sKQotICAgIHsKLSAgICAgICAgbW9kX3RpbWVyKCZuYXRfZW50cnktPnRpbWVvdXQsIGppZmZpZXMgKyB0Y3BfdGltZW91dHNbbmF0X2VudHJ5LT5jdC0+cHJvdG8udGNwLnN0YXRlXSk7Ci0gICAgICAgIHVwZGF0ZV90Y3BfdGltZW91dChuYXRfZW50cnksIG5hdF9lbnRyeV9kYXRhLCB0Y3BoKTsKLSAgICAgICAgbmF0X2VudHJ5LT5jdC0+dGltZW91dCA9IGppZmZpZXMgKyB0Y3BfdGltZW91dHNbbmF0X2VudHJ5LT5jdC0+cHJvdG8udGNwLnN0YXRlXTsKLQotICAgICAgICBpZihhY2tmaWx0ZXIoc2tiLCBuYXRfZW50cnksICZ3b3JraW5nX2xpc3QpID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjdV9yZWFkX3VubG9jaygpOwotICAgICAgICAgICAgLy9zcGluX3VubG9ja19iaCgmZmFzdG5hdF9zcGlubG9jayk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChJUFBST1RPX1VEUCA9PSBpcGgtPnByb3RvY29sKQotICAgIHsKLSAgICAgICAgLyp1ZHAqLwotICAgICAgICBpZiAodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmbmF0X2VudHJ5LT5jdC0+c3RhdHVzKSkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kX3RpbWVyKCZuYXRfZW50cnktPnRpbWVvdXQsIGppZmZpZXMgKyBmYXN0X3VkcF90aW1lb3V0X3N0cmVhbSk7Ci0gICAgICAgICAgICBuYXRfZW50cnktPmN0LT50aW1lb3V0ID0gamlmZmllcyArIGZhc3RfdWRwX3RpbWVvdXRfc3RyZWFtOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbW9kX3RpbWVyKCZuYXRfZW50cnktPnRpbWVvdXQsIGppZmZpZXMgKyBmYXN0X3VkcF90aW1lb3V0KTsKLSAgICAgICAgICAgIG5hdF9lbnRyeS0+Y3QtPnRpbWVvdXQgPSBqaWZmaWVzICsgZmFzdF91ZHBfdGltZW91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChsaWtlbHkoc2tiLT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKLSAgICB7Ci0gICAgICAgIC8vcHBw1rvQ6NKqtKvK5ElQsPwKLQkJaWYgKHVubGlrZWx5KHNrYi0+ZGV2LT50eXBlID09IEFSUEhSRF9QUFApKS8vKHN0cm5jbXAoc2tiLT5kZXYtPm5hbWUsIHBwcF9uYW1lLCBzdHJsZW4ocHBwX25hbWUpKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNrYi0+bm93X2xvY2F0aW9uIHw9IEZBU1ROQVRfU1VDQzsKLSAgICAgICAgaWYgKGxpa2VseShmYXN0bmF0X2xldmVsID09IEZBU1RfTkVUX0RFVklDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0bmF0LTIgZGV2X3F1ZXVlX3htaXQsIHNlbmQgdG86JXMgaXBoLT5pZD0weCUwMnghISEhISEhISBcbiIsIHNrYi0+ZGV2LT5uYW1lLCBpcGgtPmlkKTsKLQkJCWlmIChza2ItPmRldi0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBza2ItPmRldikgPj0gTkVUX1hNSVRfTUFTSykgewotCQkJCXNrYi0+ZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQl9Ci0gICAgICAgIH0KLSAgICAgICAgLy+21NPawfe/2LXIzNjK4tOm08OjrNa7xNzX37Hq17y1xGZhc3RuYXTB97PMo6y38dTyzt63qL340NCy5bz+1rTQ0AotICAgICAgICBlbHNlIGlmIChmYXN0bmF0X2xldmVsID09IEZBU1RfTkVUX0NPUkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcHJpbnRfc3VuKFNVTl9EQkcsICJmYXN0bmF0IG9rLTEsIHNlbmQgdG86JXMgISEhISEhISEgXG4iLCBza2ItPmRldi0+bmFtZSk7Ci0KLSAgICAgICAgICAgIGRldl9xdWV1ZV94bWl0KHNrYik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRfc3VuKFNVTl9EQkcsImZhc3RuYXRfbGV2ZWw6JWQgaXMgbm90IHN1cHBvcnRlZCAhISEhISEhISBcbiIsIGZhc3RuYXRfbGV2ZWwpOwotCi0gICAgICAgIG5hdF9lbnRyeV9kYXRhLT5wYWNrZXRfbnVtKys7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCAiRVJSICYmJiYmJiAlcyBET1dOLCBrZnJlZV9za2IhISEhISEhISBcbiIsIHNrYi0+ZGV2LT5uYW1lKTsKLSAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgfQotCi0gICAgLy9wcmludF9zdW4oU1VOX0RCRywgInNrYiA6IDB4JXgsIGZhc3RuYXQgc3VjYy0tLS0tLS0tIiwgc2tiKTsKLSAgICAvL25mX2N0X2R1bXBfdHVwbGUoJnR1cGxlKTsKLSAgICByY3VfcmVhZF91bmxvY2soKTsKLQotICAgIHJldHVybiAxOwotCi1lcnJfb3V0IDoKLSAgICBwcmludF9zdW4oU1VOX0RCRywgInNrYiA6IDB4JXgsIGZhc3RuYXQgRkFJTCEhISEhISEhISEiLCBza2IpOwotICAgIHJldHVybiAwOyAvKiBub3QgZmFzdCBuYXQgKi8KLX0KLQotc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBuYXRfaG9vayA9IHsKLSAgICAuaG9vayA9IG5hcHRfaGFuZGxlLAotLy8gICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0gICAgLnBmID0gUEZfSU5FVCwKLSAgICAuaG9va251bSA9IE5GX0lORVRfUE9TVF9ST1VUSU5HLAotICAgIC5wcmlvcml0eSA9IE5GX0lQX1BSSV9MQVNULAotfTsKLQotLy+5pNf31NpQT1NUX1JPVVRJTke92rXjo6zTw9PaZmFzdMG0vdO1xLiz1rW6zcztvNNoYXNose0KLXVuc2lnbmVkIGludCBuYXB0X2hhbmRsZSh2b2lkICpwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotICAgIHN0cnVjdCBuZl9jb25uICpjdDsKLSAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLSAgICB1X2ludDhfdCBwcm90b2NvbDsKLSAgICBmYXN0X2VudHJ5X3QgKm5hdF9lbnRyeTsKLSAgICBmYXN0X2VudHJ5X2RhdGFfdCAqZW50cnlfZGF0YTsKLSAgICBlbnVtIGlwX2Nvbm50cmFja19kaXIgZGlyLCByZGlyOwotICAgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ID0gc3RhdGUtPm91dDsKLSNpZmRlZiBDT05GSUdfQVRIUlNfSFdfTkFUCi0gICAgdV9pbnQzMl90IG1hc2sgPTA7Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgbmVpZ2hib3VyICpfbmVpZ2hib3VyID0gTlVMTDsKLQotICAgIGlmIChmYXN0bmF0X2xldmVsID09IEZBU1RfQ0xPU0UgfHwgZmFzdG5hdF9sZXZlbCA9PSBGQVNUX0NMT1NFX0tFRVBfTElOSykKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgaWYgKHRlc3RfYml0KEZBU1RfVFlQRV9WRVJTSU9OX0JJVCwgJmZhc3Rfc3dpdGNoKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgaWYgKGlwX2hkcihza2IpLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJiBpcF9oZHIoc2tiKS0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCi0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0KLSAgICBpZiAoIW91dCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgLy+547KloaLX6bKlsru9qMG0Ci0gICAgaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwX2hkcihza2IpLT5kYWRkcikgfHwgaXB2NF9pc19sYmNhc3QoaXBfaGRyKHNrYiktPmRhZGRyKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBORl9BQ0NFUFQ7Ci0gICAgfQotCi0gICAgLy+0y7Sm0qq52Neiyse38bvhxrW3sbP2z9ZmYXN0wbS909LRwvrH6b/2o6zI57n7vq2zo7P2z9ajrMrHt/G/vMLH1+6+ybiyuMfH6b/2Ci0gICAgaWYgKHdvcmtpbmdfbGlzdC5jb3VudCA+IG5mX2Nvbm50cmFja19tYXgpCi0gICAgewotICAgICAgICByZXR1cm4gTkZfQUNDRVBUOwotICAgIH0KLQotICAgIGlmICghZHN0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICBfbmVpZ2hib3VyID0gZHN0X25laWdoX2xvb2t1cF9za2IoZHN0LCBza2IpOwotICAgIGlmICghX25laWdoYm91cikKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fREJHLCJuYXB0X2hhbmRsZSgpIF9uZWlnaGJvdXIgPSBudWxsXG4iKTsKLSAgICAgICAgcmV0dXJuIE5GX0FDQ0VQVDsKLSAgICB9Ci0KLSAgICBpZiAobWVtY21wKF9uZWlnaGJvdXItPmhhLCB6ZXJvbWFjLCBFVEhfQUxFTikgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChzdHJuY21wKG91dC0+bmFtZSwgcHBwX25hbWUsIHN0cmxlbihwcHBfbmFtZSkpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gYWNjZXB0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCEoY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKSkpCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywibmFwdF9oYW5kbGUoKSBjdCA9IG51bGxcbiIpOwotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0KLSAgICBwcm90b2NvbCA9IG5mX2N0X3Byb3RvbnVtKGN0KTsKLSAgICBwcmludF9zdW4oU1VOX0RCRywibmFwdF9oYW5kbGUoKSBwcm90b2NvbCA9ICVkXG4iLCBwcm90b2NvbCk7Ci0KLSAgICBpZiAoY3QtPm1hc3RlciA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgLy9jb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwotICAgICAgICBzdHJ1Y3QgbmZfY29ubl9oZWxwICp0ZW1wX2hlbHAgPSBuZmN0X2hlbHAoY3QpOwotICAgICAgICAvL7bU09rEs8z1wbS908nPtObU2mhlbHC1yLmz19OjrLHY0Ou9u9PJbGludXix6teixNq6y7SmwO2jrLfx1PLE2rrLsrvE3LvxyKHP4LnYtcTK/b7dsPzQxc+iCi0gICAgICAgIGlmKHRlbXBfaGVscCE9TlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9oZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UodGVtcF9oZWxwLT5oZWxwZXIpOwotICAgICAgICAgICAgLy9pZighKGhlbHBlci0+dHVwbGUuc3JjLnUuYWxsID09IGh0b25zKDIxKSYmaGVscGVyLT50dXBsZS5kc3QucHJvdG9udW0gPT0gSVBQUk9UT19UQ1ApKSB7Ci0gICAgICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICAgICAgICAgIC8vICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiBvbmx5IGZvcndhcmQgKi8KLSAgICBpZiAoIXNrYi0+c2tiX2lpZikKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotCi0gICAgLy+5/cLLsrvQ6NKqvq25/WZhc3RuYXS1xNCt0umw/Cy4+b7dtsu/2rrFvfjQ0Ln9wssKLSAgICBpZiAoY2hlY2tfc2tpcF9wb3J0cyhjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnUuYWxsKSkKLSAgICB7Ci0gICAgICAgIGdvdG8gYWNjZXB0OwotICAgIH0KLQotICAgIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKLQotICAgIHJkaXIgPSAoSVBfQ1RfRElSX09SSUdJTkFMID09IGRpcikgPyBJUF9DVF9ESVJfUkVQTFk6IElQX0NUX0RJUl9PUklHSU5BTDsKLSAgICBwcmludF9zdW4oU1VOX0RCRywibmFwdF9oYW5kbGUoKSBkaXI9JWQsIHJkaXI9JWRcbiIsIGRpciwgcmRpcik7Ci0gICAgLyrWu9XrttRUQ1AvVURQvfjQ0GZhc3RuYXQqLwotICAgIGlmIChJUFBST1RPX1RDUCA9PSBwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIC8qIG9ubHkgZXN0YWJsaXNoZWQgKi8KLSAgICAgICAgLypUQ1DI/bTOztXK1rPJuaYqLwotICAgICAgICBpZighdGVzdF9iaXQoSVBTX0FTU1VSRURfQklULCAmY3QtPnN0YXR1cykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gYWNjZXB0OwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKElQUFJPVE9fVURQICE9IHByb3RvY29sKQotICAgIHsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotCi0gICAgc3Bpbl9sb2NrX2JoKCZmYXN0bmF0X3NwaW5sb2NrKTsKLSAgICBpZiAoIShuYXRfZW50cnkgPSBmYXN0X2dldF9lbnRyeSgmd29ya2luZ19saXN0LCBjdCwgZGlyKSkpCi0gICAgewotICAgICAgICBwcmludF9zdW4oU1VOX0RCRywibmFwdF9oYW5kbGUoKSBuYXRfZW50cnk9JXBcbiIsIG5hdF9lbnRyeSk7Ci0gICAgICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0bmF0X3NwaW5sb2NrKTsKLSAgICAgICAgZ290byBhY2NlcHQ7Ci0gICAgfQotICAgIG5hdF9lbnRyeS0+ZmFzdF9zcGlubG9jayA9ICZmYXN0bmF0X3NwaW5sb2NrOwotCi0gICAgLy/K17TOvajBtKOsu/HIoWN0vMbK/cv4o6yyosm+s/1jdLaoyrHG96O7yte0zr2owbTW2Li0sPyjrLK7xNyy2df3Ci0gICAgaWYgKCEobmF0X2VudHJ5LT5mbGFncyAmIEZBU1RfQUxMX0RJUikpCi0gICAgewotICAgICAgICBuZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0gICAgICAgIC8vZGVsX3RpbWVyKCZjdC0+dGltZW91dCk7Ci0gICAgICAgIGN0LT50aW1lb3V0ID0gbmF0X2VudHJ5LT50aW1lb3V0LmV4cGlyZXM7Ci0KLSAgICB9Ci0KLSAgICBlbnRyeV9kYXRhID0gJm5hdF9lbnRyeS0+ZGF0YVtkaXJdOwotICAgIGVudHJ5X2RhdGEtPnR1cGxlaGFzaC50dXBsZSA9IGN0LT50dXBsZWhhc2hbZGlyXS50dXBsZTsKLSAgICBtZW1jcHkoZW50cnlfZGF0YS0+ZG1hYywgX25laWdoYm91ci0+aGEsIEVUSF9BTEVOKTsKLSAgICBlbnRyeV9kYXRhLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7Ci0gICAgZW50cnlfZGF0YS0+bWFyayA9IHNrYi0+bWFyazsKLSAgICBlbnRyeV9kYXRhLT5vdXRkZXYgPSBvdXQ7Ci0KLSAgICAvKrzHwrxNQUO12Na3tb1lbnRyeV9kYXRhLT5oaF9kYXRhKi8KLSAgICBpZiAoIXJlY29yZF9NQUNfaGVhZGVyKHdvcmtpbmdfaGFzaCwgY3QsIG5hdF9lbnRyeSwgZW50cnlfZGF0YSwgX25laWdoYm91ciwgb3V0LCBodG9ucyhFVEhfUF9JUCkpKQotICAgIHsKLSAgICAgICAgc3Bpbl91bmxvY2tfYmgoJmZhc3RuYXRfc3BpbmxvY2spOwotICAgICAgICBnb3RvIGFjY2VwdDsKLSAgICB9Ci0gICAgcHJpbnRfc3VuKFNVTl9EQkcsIm5hcHRfaGFuZGxlKCkgY3QtPnN0YXR1cz0weCV4XG4iLCBjdC0+c3RhdHVzKTsKLSAgICAvKrvxyKFuYXTXqru70OjSqrXESVC6zXBvcnTQxc+iKi8KLSAgICBpZiAodGVzdF9iaXQoSVBTX1NSQ19OQVRfQklULCAmY3QtPnN0YXR1cykpCi0gICAgewotICAgICAgICBpZihJUF9DVF9ESVJfT1JJR0lOQUwgPT0gZGlyKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbnRyeV9kYXRhLT5uYXRfYWRkciA9IGN0LT50dXBsZWhhc2hbcmRpcl0udHVwbGUuZHN0LnUzLmlwOwotICAgICAgICAgICAgZW50cnlfZGF0YS0+bmF0X3BvcnQgPSBjdC0+dHVwbGVoYXNoW3JkaXJdLnR1cGxlLmRzdC51LmFsbDsKLSAgICAgICAgICAgIGVudHJ5X2RhdGEtPnR5cGUgPSBGTl9UWVBFX1NSQzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5X2RhdGEtPm5hdF9hZGRyID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5zcmMudTMuaXA7Ci0gICAgICAgICAgICBlbnRyeV9kYXRhLT5uYXRfcG9ydCA9IGN0LT50dXBsZWhhc2hbcmRpcl0udHVwbGUuc3JjLnUuYWxsOwotICAgICAgICAgICAgZW50cnlfZGF0YS0+dHlwZSA9IEZOX1RZUEVfRFNUOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHRlc3RfYml0KElQU19EU1RfTkFUX0JJVCwgJmN0LT5zdGF0dXMpKQotICAgIHsKLSAgICAgICAgaWYgKElQX0NUX0RJUl9PUklHSU5BTCA9PSBkaXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVudHJ5X2RhdGEtPm5hdF9hZGRyID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5zcmMudTMuaXA7Ci0gICAgICAgICAgICBlbnRyeV9kYXRhLT5uYXRfcG9ydCA9IGN0LT50dXBsZWhhc2hbcmRpcl0udHVwbGUuc3JjLnUuYWxsOwotICAgICAgICAgICAgZW50cnlfZGF0YS0+dHlwZSA9IEZOX1RZUEVfRFNUOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZW50cnlfZGF0YS0+bmF0X2FkZHIgPSBjdC0+dHVwbGVoYXNoW3JkaXJdLnR1cGxlLmRzdC51My5pcDsKLSAgICAgICAgICAgIGVudHJ5X2RhdGEtPm5hdF9wb3J0ID0gY3QtPnR1cGxlaGFzaFtyZGlyXS50dXBsZS5kc3QudS5hbGw7Ci0gICAgICAgICAgICBlbnRyeV9kYXRhLT50eXBlID0gRk5fVFlQRV9TUkM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvL7K71qez1k5BVLXEs6G+sAotICAgIHsKLSAgICAgICAgLy+0y9bWs6G+sKOs1LS12Na3L8S/tcS12Na3L7bLv9q6xba8srvQ6NKquMSx5KOs1rG90824tKu+zdDQCi0gICAgICAgIGVudHJ5X2RhdGEtPmlzX25vdF9uYXQgPSAxOwotICAgIH0KLQotICAgIC8vtMu0prGj1qTV/be0wb249rHqvMfOu7K7s+XNuwotICAgIG5hdF9lbnRyeS0+ZmxhZ3MgPSBuYXRfZW50cnktPmZsYWdzIHwgKDEgPDwgZGlyKTsKLQotICAgIC8vzO2802hhc2i92rXjCi0gICAgZmFzdF9hZGRfZW50cnkod29ya2luZ19oYXNoLCBlbnRyeV9kYXRhKTsKLSAgICBpZiAobmF0X2VudHJ5LT5mbGFncyA9PSBGQVNUX0FMTF9ESVIpCi0gICAgewotICAgICAgICBuYXRfZW50cnktPmRhdGFbMF0uaW5kZXYgPSBuYXRfZW50cnktPmRhdGFbMV0ub3V0ZGV2OwotICAgICAgICBuYXRfZW50cnktPmRhdGFbMV0uaW5kZXYgPSBuYXRfZW50cnktPmRhdGFbMF0ub3V0ZGV2OwotICAgIH0KLQotICAgIHNwaW5fbG9ja19iaCgmZmFzdF9md19zcGlubG9jayk7Ci0gICAgY3QtPmZhc3RfY3QuaXNGYXN0ID0gRkFTVF9DVF9XTkQ0OwotICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0X2Z3X3NwaW5sb2NrKTsKLQotICAgIHNwaW5fdW5sb2NrX2JoKCZmYXN0bmF0X3NwaW5sb2NrKTsKLQotYWNjZXB0OgotICAgIG5laWdoX3JlbGVhc2UoX25laWdoYm91cik7Ci0gICAgcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyq0psDtzajWqsG0ysK8/iovCi1pbnQgZmFzdG5hdF9ldmVudCh0cmF2ZXJzZV9jb21tYW5kX3QgKmNtZCkKLXsKLSAgICBzcGluX2xvY2tfYmgoJmZhc3RuYXRfc3BpbmxvY2spOwotICAgIHRyYXZlcnNlX3Byb2Nlc3MoJndvcmtpbmdfbGlzdCwgY21kKTsKLSAgICBzcGluX3VubG9ja19iaCgmZmFzdG5hdF9zcGlubG9jayk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vZmFzdG5hdF9sZXZlbLnYsdWjrMflv9XL+dPQaXB2NL/sy9nXqrei0MXPogotdm9pZCBmYXN0bmF0X2NsZWFudXBfbGlua3Modm9pZCkKLXsKLSAgICBzcGluX2xvY2tfYmgoJmZhc3RuYXRfc3BpbmxvY2spOwotICAgIGZhc3RfY2xlYW51cF9saW5rcygmd29ya2luZ19saXN0KTsKLSAgICBzcGluX3VubG9ja19iaCgmZmFzdG5hdF9zcGlubG9jayk7Ci19Ci0KLS8qZmFzdG5hdLP1yry7ryovCi1pbnQgdHNwX2Zhc3RuYXRfaW5pdCh2b2lkKQotewotICAgIGludCByZXQ7Ci0KLSAgICBwcmludF9zdW4oU1VOX0RCRywic3RhcnQgaW5pdCBmYXN0bmF0XG4iKTsKLQotICAgIHdvcmtpbmdfaGFzaCA9IG5mX2N0X2FsbG9jX2hhc2h0YWJsZSgmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplLCAvKiZmYXN0bmF0X2hhc2hfdm1hbGxvYywqLyAxKTsKLSAgICBpZiAoIXdvcmtpbmdfaGFzaCkKLSAgICB7Ci0gICAgICAgIHByaW50X3N1bihTVU5fRVJSLCAiVW5hYmxlIHRvIGNyZWF0ZSB3b3JraW5nX2hhc2hcbiIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBzcGluX2xvY2tfaW5pdCgmZmFzdG5hdF9zcGlubG9jayk7Ci0KLSAgICByZXQgPSBuZl9yZWdpc3Rlcl9uZXRfaG9vaygmaW5pdF9uZXQsICZuYXRfaG9vayk7Ci0gICAgaWYgKHJldCAhPSAwKQotICAgIHsKLSAgICAgICAgcHJpbnRfc3VuKFNVTl9FUlIsImluaXQgZmFzdG5hdCBmYWlsZWRcbiIpOwotICAgICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgcHJpbnRfc3VuKFNVTl9EQkcsImluaXQgZmFzdG5hdCBkb25lXG4iKTsKLQotICAgIHJldHVybiAwOwotCi1lcnI6Ci0gICAgbmZfY3RfZnJlZV9oYXNodGFibGUod29ya2luZ19oYXNoLCAvKmZhc3RuYXRfaGFzaF92bWFsbG9jLCAqL25mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCB0c3BfZmFzdG5hdF9jbGVhbnVwKHZvaWQpCi17Ci0gICAgbmZfdW5yZWdpc3Rlcl9uZXRfaG9vaygmaW5pdF9uZXQsICZuYXRfaG9vayk7Ci0gICAgbmZfY3RfZnJlZV9oYXNodGFibGUod29ya2luZ19oYXNoLCAvKmZhc3RuYXRfaGFzaF92bWFsbG9jLCovIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci0KLSAgICBwcmludF9zdW4oU1VOX0RCRywiZmFzdG5hdCBjbGVhbnVwIGRvbmVcbiIpOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS91cHN0cmVhbS9saW51eC01LjEwL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOTI0MTNlLi4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgzNyArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKiBDb25uZWN0aW9uIHN0YXRlIHRyYWNraW5nIGZvciBuZXRmaWx0ZXIuICBUaGlzIGlzIHNlcGFyYXRlZCBmcm9tLAotICAgYnV0IHJlcXVpcmVkIGJ5LCB0aGUgTkFUIGxheWVyOyBpdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGFuIGlwdGFibGVzCi0gICBleHRlbnNpb24uICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqIChDKSAyMDAzLDIwMDQgVVNBR0kvV0lERSBQcm9qZWN0IDxodHRwOi8vd3d3LmxpbnV4LWlwdjYub3JnPgotICogKEMpIDIwMDUtMjAxMiBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KLSNpbmNsdWRlIDxsaW51eC9zaXBoYXNoLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfbnVsbHMuaD4KLQotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDRwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NlcWFkai5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHRlbmQuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfem9uZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lb3V0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbGFiZWxzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3lucHJveHkuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5oPgotI2luY2x1ZGUgPG5ldC9uZXRucy9oYXNoLmg+Ci0jaW5jbHVkZSA8bmV0L2lwLmg+Ci0KLSNpbmNsdWRlICJuZl9pbnRlcm5hbHMuaCIKLQotI2lmZGVmIENPTkZJR19GQVNUTkFUX01PRFVMRQotI2luY2x1ZGUgPG5ldC9TSS9mYXN0X2NvbW1vbi5oPgotI2VuZGlmCi0KLV9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIHNwaW5sb2NrX3QgbmZfY29ubnRyYWNrX2xvY2tzW0NPTk5UUkFDS19MT0NLU107Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbG9ja3MpOwotCi1fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sobmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19leHBlY3RfbG9jayk7Ci0KLXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpuZl9jb25udHJhY2tfaGFzaCBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hhc2gpOwotCi1zdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmsgewotCXN0cnVjdCBkZWxheWVkX3dvcmsJZHdvcms7Ci0JdTMyCQkJbmV4dF9idWNrZXQ7Ci0JYm9vbAkJCWV4aXRpbmc7Ci0JYm9vbAkJCWVhcmx5X2Ryb3A7Ci19OwotCi1zdGF0aWMgX19yZWFkX21vc3RseSBzdHJ1Y3Qga21lbV9jYWNoZSAqbmZfY29ubnRyYWNrX2NhY2hlcDsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKTsKLXN0YXRpYyBfX3JlYWRfbW9zdGx5IGJvb2wgbmZfY29ubnRyYWNrX2xvY2tzX2FsbDsKLQotLyogc2VyaWFsaXplIGhhc2ggcmVzaXplcyBhbmQgbmZfY3RfaXRlcmF0ZV9jbGVhbnVwICovCi1zdGF0aWMgREVGSU5FX01VVEVYKG5mX2Nvbm50cmFja19tdXRleCk7Ci0KLSNkZWZpbmUgR0NfU0NBTl9JTlRFUlZBTAkoMTIwdSAqIEhaKQotI2RlZmluZSBHQ19TQ0FOX01BWF9EVVJBVElPTgltc2Vjc190b19qaWZmaWVzKDEwKQotCi1zdGF0aWMgc3RydWN0IGNvbm50cmFja19nY193b3JrIGNvbm50cmFja19nY193b3JrOwotCi12b2lkIG5mX2Nvbm50cmFja19sb2NrKHNwaW5sb2NrX3QgKmxvY2spIF9fYWNxdWlyZXMobG9jaykKLXsKLQkvKiAxKSBBY3F1aXJlIHRoZSBsb2NrICovCi0Jc3Bpbl9sb2NrKGxvY2spOwotCi0JLyogMikgcmVhZCBuZl9jb25udHJhY2tfbG9ja3NfYWxsLCB3aXRoIEFDUVVJUkUgc2VtYW50aWNzCi0JICogSXQgcGFpcnMgd2l0aCB0aGUgc21wX3N0b3JlX3JlbGVhc2UoKSBpbiBuZl9jb25udHJhY2tfYWxsX3VubG9jaygpCi0JICovCi0JaWYgKGxpa2VseShzbXBfbG9hZF9hY3F1aXJlKCZuZl9jb25udHJhY2tfbG9ja3NfYWxsKSA9PSBmYWxzZSkpCi0JCXJldHVybjsKLQotCS8qIGZhc3QgcGF0aCBmYWlsZWQsIHVubG9jayAqLwotCXNwaW5fdW5sb2NrKGxvY2spOwotCi0JLyogU2xvdyBwYXRoIDEpIGdldCBnbG9iYWwgbG9jayAqLwotCXNwaW5fbG9jaygmbmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKTsKLQotCS8qIFNsb3cgcGF0aCAyKSBnZXQgdGhlIGxvY2sgd2Ugd2FudCAqLwotCXNwaW5fbG9jayhsb2NrKTsKLQotCS8qIFNsb3cgcGF0aCAzKSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLwotCXNwaW5fdW5sb2NrKCZuZl9jb25udHJhY2tfbG9ja3NfYWxsX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2xvY2spOwotCi1zdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfZG91YmxlX3VubG9jayh1bnNpZ25lZCBpbnQgaDEsIHVuc2lnbmVkIGludCBoMikKLXsKLQloMSAlPSBDT05OVFJBQ0tfTE9DS1M7Ci0JaDIgJT0gQ09OTlRSQUNLX0xPQ0tTOwotCXNwaW5fdW5sb2NrKCZuZl9jb25udHJhY2tfbG9ja3NbaDFdKTsKLQlpZiAoaDEgIT0gaDIpCi0JCXNwaW5fdW5sb2NrKCZuZl9jb25udHJhY2tfbG9ja3NbaDJdKTsKLX0KLQotLyogcmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byByZWNvbXB1dGUgaGFzaGVzIChpbiBjYXNlIGhhc2ggdGFibGUgd2FzIHJlc2l6ZWQpICovCi1zdGF0aWMgYm9vbCBuZl9jb25udHJhY2tfZG91YmxlX2xvY2soc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgaDEsCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgaDIsIHVuc2lnbmVkIGludCBzZXF1ZW5jZSkKLXsKLQloMSAlPSBDT05OVFJBQ0tfTE9DS1M7Ci0JaDIgJT0gQ09OTlRSQUNLX0xPQ0tTOwotCWlmIChoMSA8PSBoMikgewotCQluZl9jb25udHJhY2tfbG9jaygmbmZfY29ubnRyYWNrX2xvY2tzW2gxXSk7Ci0JCWlmIChoMSAhPSBoMikKLQkJCXNwaW5fbG9ja19uZXN0ZWQoJm5mX2Nvbm50cmFja19sb2Nrc1toMl0sCi0JCQkJCSBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0JfSBlbHNlIHsKLQkJbmZfY29ubnRyYWNrX2xvY2soJm5mX2Nvbm50cmFja19sb2Nrc1toMl0pOwotCQlzcGluX2xvY2tfbmVzdGVkKCZuZl9jb25udHJhY2tfbG9ja3NbaDFdLAotCQkJCSBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0JfQotCWlmIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKSB7Ci0JCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGgxLCBoMik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19hbGxfbG9jayh2b2lkKQotCV9fYWNxdWlyZXMoJm5mX2Nvbm50cmFja19sb2Nrc19hbGxfbG9jaykKLXsKLQlpbnQgaTsKLQotCXNwaW5fbG9jaygmbmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKTsKLQotCW5mX2Nvbm50cmFja19sb2Nrc19hbGwgPSB0cnVlOwotCi0JZm9yIChpID0gMDsgaSA8IENPTk5UUkFDS19MT0NLUzsgaSsrKSB7Ci0JCXNwaW5fbG9jaygmbmZfY29ubnRyYWNrX2xvY2tzW2ldKTsKLQotCQkvKiBUaGlzIHNwaW5fdW5sb2NrIHByb3ZpZGVzIHRoZSAicmVsZWFzZSIgdG8gZW5zdXJlIHRoYXQKLQkJICogbmZfY29ubnRyYWNrX2xvY2tzX2FsbD09dHJ1ZSBpcyB2aXNpYmxlIHRvIGV2ZXJ5b25lIHRoYXQKLQkJICogYWNxdWlyZWQgc3Bpbl9sb2NrKCZuZl9jb25udHJhY2tfbG9ja3NbXSkuCi0JCSAqLwotCQlzcGluX3VubG9jaygmbmZfY29ubnRyYWNrX2xvY2tzW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19hbGxfdW5sb2NrKHZvaWQpCi0JX19yZWxlYXNlcygmbmZfY29ubnRyYWNrX2xvY2tzX2FsbF9sb2NrKQotewotCS8qIEFsbCBwcmlvciBzdG9yZXMgbXVzdCBiZSBjb21wbGV0ZSBiZWZvcmUgd2UgY2xlYXIKLQkgKiAnbmZfY29ubnRyYWNrX2xvY2tzX2FsbCcuIE90aGVyd2lzZSBuZl9jb25udHJhY2tfbG9jaygpCi0JICogbWlnaHQgb2JzZXJ2ZSB0aGUgZmFsc2UgdmFsdWUgYnV0IG5vdCB0aGUgZW50aXJlCi0JICogY3JpdGljYWwgc2VjdGlvbi4KLQkgKiBJdCBwYWlycyB3aXRoIHRoZSBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbmZfY29ubnRyYWNrX2xvY2soKQotCSAqLwotCXNtcF9zdG9yZV9yZWxlYXNlKCZuZl9jb25udHJhY2tfbG9ja3NfYWxsLCBmYWxzZSk7Ci0Jc3Bpbl91bmxvY2soJm5mX2Nvbm50cmFja19sb2Nrc19hbGxfbG9jayk7Ci19Ci0KLXVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci0KLXVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfbWF4IF9fcmVhZF9tb3N0bHk7Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfbWF4KTsKLXNlcWNvdW50X3NwaW5sb2NrX3QgbmZfY29ubnRyYWNrX2dlbmVyYXRpb24gX19yZWFkX21vc3RseTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX2hhc2hfcm5kIF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyB1MzIgaGFzaF9jb25udHJhY2tfcmF3KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldCAqbmV0KQotewotCXVuc2lnbmVkIGludCBuOwotCXUzMiBzZWVkOwotCi0JZ2V0X3JhbmRvbV9vbmNlKCZuZl9jb25udHJhY2tfaGFzaF9ybmQsIHNpemVvZihuZl9jb25udHJhY2tfaGFzaF9ybmQpKTsKLQotCS8qIFRoZSBkaXJlY3Rpb24gbXVzdCBiZSBpZ25vcmVkLCBzbyB3ZSBoYXNoIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlCi0JICogZGVzdGluYXRpb24gcG9ydHMgKHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgNCkgYW5kIHRyZWF0IHRoZSBsYXN0Ci0JICogdGhyZWUgYnl0ZXMgbWFudWFsbHkuCi0JICovCi0Jc2VlZCA9IG5mX2Nvbm50cmFja19oYXNoX3JuZCBeIG5ldF9oYXNoX21peChuZXQpOwotCW4gPSAoc2l6ZW9mKHR1cGxlLT5zcmMpICsgc2l6ZW9mKHR1cGxlLT5kc3QudTMpKSAvIHNpemVvZih1MzIpOwotCXJldHVybiBqaGFzaDIoKHUzMiAqKXR1cGxlLCBuLCBzZWVkIF4KLQkJICAgICAgKCgoX19mb3JjZSBfX3UxNil0dXBsZS0+ZHN0LnUuYWxsIDw8IDE2KSB8Ci0JCSAgICAgIHR1cGxlLT5kc3QucHJvdG9udW0pKTsKLX0KLQotI2lmZGVmIENPTkZJR19GQVNUTkFUX01PRFVMRQotdTMyIGhhc2hfY29ubnRyYWNrX3Jhd19mYXN0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldCAqbmV0KQotewotCXJldHVybiBoYXNoX2Nvbm50cmFja19yYXcodHVwbGUsIG5ldCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHUzMiBzY2FsZV9oYXNoKHUzMiBoYXNoKQotewotCXJldHVybiByZWNpcHJvY2FsX3NjYWxlKGhhc2gsIG5mX2Nvbm50cmFja19odGFibGVfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB1MzIgX19oYXNoX2Nvbm50cmFjayhjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JcmV0dXJuIHJlY2lwcm9jYWxfc2NhbGUoaGFzaF9jb25udHJhY2tfcmF3KHR1cGxlLCBuZXQpLCBzaXplKTsKLX0KLQotc3RhdGljIHUzMiBoYXNoX2Nvbm50cmFjayhjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotCXJldHVybiBzY2FsZV9oYXNoKGhhc2hfY29ubnRyYWNrX3Jhdyh0dXBsZSwgbmV0KSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfRkFTVE5BVF9NT0RVTEUKLXVfaW50MzJfdCBoYXNoX2Nvbm50cmFja19mYXN0KGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewotICByZXR1cm4gX19oYXNoX2Nvbm50cmFjaygmaW5pdF9uZXQsIHR1cGxlLCAzMik7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGJvb2wgbmZfY3RfZ2V0X3R1cGxlX3BvcnRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCQkgIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlKQotewlzdHJ1Y3QgewotCQlfX2JlMTYgc3BvcnQ7Ci0JCV9fYmUxNiBkcG9ydDsKLQl9IF9pbmV0X2hkciwgKmluZXRfaGRyOwotCi0JLyogQWN0dWFsbHkgb25seSBuZWVkIGZpcnN0IDQgYnl0ZXMgdG8gZ2V0IHBvcnRzLiAqLwotCWluZXRfaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgZGF0YW9mZiwgc2l6ZW9mKF9pbmV0X2hkciksICZfaW5ldF9oZHIpOwotCWlmICghaW5ldF9oZHIpCi0JCXJldHVybiBmYWxzZTsKLQotCXR1cGxlLT5zcmMudS51ZHAucG9ydCA9IGluZXRfaGRyLT5zcG9ydDsKLQl0dXBsZS0+ZHN0LnUudWRwLnBvcnQgPSBpbmV0X2hkci0+ZHBvcnQ7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1uZl9jdF9nZXRfdHVwbGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJdW5zaWduZWQgaW50IG5ob2ZmLAotCQl1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJdV9pbnQxNl90IGwzbnVtLAotCQl1X2ludDhfdCBwcm90b251bSwKLQkJc3RydWN0IG5ldCAqbmV0LAotCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKLXsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQljb25zdCBfX2JlMzIgKmFwOwotCV9fYmUzMiBfYWRkcnNbOF07Ci0KLQltZW1zZXQodHVwbGUsIDAsIHNpemVvZigqdHVwbGUpKTsKLQotCXR1cGxlLT5zcmMubDNudW0gPSBsM251bTsKLQlzd2l0Y2ggKGwzbnVtKSB7Ci0JY2FzZSBORlBST1RPX0lQVjQ6Ci0JCW5ob2ZmICs9IG9mZnNldG9mKHN0cnVjdCBpcGhkciwgc2FkZHIpOwotCQlzaXplID0gMiAqIHNpemVvZihfX2JlMzIpOwotCQlicmVhazsKLQljYXNlIE5GUFJPVE9fSVBWNjoKLQkJbmhvZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIHNhZGRyKTsKLQkJc2l6ZSA9IHNpemVvZihfYWRkcnMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplLCBfYWRkcnMpOwotCWlmICghYXApCi0JCXJldHVybiBmYWxzZTsKLQotCXN3aXRjaCAobDNudW0pIHsKLQljYXNlIE5GUFJPVE9fSVBWNDoKLQkJdHVwbGUtPnNyYy51My5pcCA9IGFwWzBdOwotCQl0dXBsZS0+ZHN0LnUzLmlwID0gYXBbMV07Ci0JCWJyZWFrOwotCWNhc2UgTkZQUk9UT19JUFY2OgotCQltZW1jcHkodHVwbGUtPnNyYy51My5pcDYsIGFwLCBzaXplb2YodHVwbGUtPnNyYy51My5pcDYpKTsKLQkJbWVtY3B5KHR1cGxlLT5kc3QudTMuaXA2LCBhcCArIDQsIHNpemVvZih0dXBsZS0+ZHN0LnUzLmlwNikpOwotCQlicmVhazsKLQl9Ci0KLQl0dXBsZS0+ZHN0LnByb3RvbnVtID0gcHJvdG9udW07Ci0JdHVwbGUtPmRzdC5kaXIgPSBJUF9DVF9ESVJfT1JJR0lOQUw7Ci0KLQlzd2l0Y2ggKHByb3RvbnVtKSB7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQljYXNlIElQUFJPVE9fSUNNUFY2OgotCQlyZXR1cm4gaWNtcHY2X3BrdF90b190dXBsZShza2IsIGRhdGFvZmYsIG5ldCwgdHVwbGUpOwotI2VuZGlmCi0JY2FzZSBJUFBST1RPX0lDTVA6Ci0JCXJldHVybiBpY21wX3BrdF90b190dXBsZShza2IsIGRhdGFvZmYsIG5ldCwgdHVwbGUpOwotI2lmZGVmIENPTkZJR19ORl9DVF9QUk9UT19HUkUKLQljYXNlIElQUFJPVE9fR1JFOgotCQlyZXR1cm4gZ3JlX3BrdF90b190dXBsZShza2IsIGRhdGFvZmYsIG5ldCwgdHVwbGUpOwotI2VuZGlmCi0JY2FzZSBJUFBST1RPX1RDUDoKLQljYXNlIElQUFJPVE9fVURQOiAvKiBmYWxsdGhyb3VnaCAqLwotCQlyZXR1cm4gbmZfY3RfZ2V0X3R1cGxlX3BvcnRzKHNrYiwgZGF0YW9mZiwgdHVwbGUpOwotI2lmZGVmIENPTkZJR19ORl9DVF9QUk9UT19VRFBMSVRFCi0JY2FzZSBJUFBST1RPX1VEUExJVEU6Ci0JCXJldHVybiBuZl9jdF9nZXRfdHVwbGVfcG9ydHMoc2tiLCBkYXRhb2ZmLCB0dXBsZSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ1RfUFJPVE9fU0NUUAotCWNhc2UgSVBQUk9UT19TQ1RQOgotCQlyZXR1cm4gbmZfY3RfZ2V0X3R1cGxlX3BvcnRzKHNrYiwgZGF0YW9mZiwgdHVwbGUpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX05GX0NUX1BST1RPX0RDQ1AKLQljYXNlIElQUFJPVE9fRENDUDoKLQkJcmV0dXJuIG5mX2N0X2dldF90dXBsZV9wb3J0cyhza2IsIGRhdGFvZmYsIHR1cGxlKTsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCi1ib29sIG5mX2N0X2dldF90dXBsZV9mYXN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCXVuc2lnbmVkIGludCBuaG9mZiwKLQkJdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCXVfaW50MTZfdCBsM251bSwKLQkJdV9pbnQ4X3QgcHJvdG9udW0sCi0JCXN0cnVjdCBuZXQgKm5ldCwKLQkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0gIHJldHVybiBuZl9jdF9nZXRfdHVwbGUoc2tiLCBuaG9mZiwgZGF0YW9mZiwgbDNudW0sIHByb3RvbnVtLCBuZXQsIHR1cGxlKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGlwdjRfZ2V0X2w0cHJvdG8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ob2ZmLAotCQkJICAgIHVfaW50OF90ICpwcm90b251bSkKLXsKLQlpbnQgZGF0YW9mZiA9IC0xOwotCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOwotCXN0cnVjdCBpcGhkciBfaXBoOwotCi0JaXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfaXBoKSwgJl9pcGgpOwotCWlmICghaXBoKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBDb25udHJhY2sgZGVmcmFnbWVudHMgcGFja2V0cywgd2UgbWlnaHQgc3RpbGwgc2VlIGZyYWdtZW50cwotCSAqIGluc2lkZSBJQ01QIHBhY2tldHMgdGhvdWdoLgotCSAqLwotCWlmIChpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKLQkJcmV0dXJuIC0xOwotCi0JZGF0YW9mZiA9IG5ob2ZmICsgKGlwaC0+aWhsIDw8IDIpOwotCSpwcm90b251bSA9IGlwaC0+cHJvdG9jb2w7Ci0KLQkvKiBDaGVjayBib2d1cyBJUCBoZWFkZXJzICovCi0JaWYgKGRhdGFvZmYgPiBza2ItPmxlbikgewotCQlwcl9kZWJ1ZygiYm9ndXMgSVB2NCBwYWNrZXQ6IG5ob2ZmICV1LCBpaGwgJXUsIHNrYmxlbiAldVxuIiwKLQkJCSBuaG9mZiwgaXBoLT5paGwgPDwgMiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBkYXRhb2ZmOwotfQotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLXN0YXRpYyBpbnQgaXB2Nl9nZXRfbDRwcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbmhvZmYsCi0JCQkgICAgdTggKnByb3RvbnVtKQotewotCWludCBwcm90b2ZmID0gLTE7Ci0JdW5zaWduZWQgaW50IGV4dG9mZiA9IG5ob2ZmICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQlfX2JlMTYgZnJhZ19vZmY7Ci0JdTggbmV4dGhkcjsKLQotCWlmIChza2JfY29weV9iaXRzKHNrYiwgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkciksCi0JCQkgICZuZXh0aGRyLCBzaXplb2YobmV4dGhkcikpICE9IDApIHsKLQkJcHJfZGVidWcoImNhbid0IGdldCBuZXh0aGRyXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwcm90b2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIGV4dG9mZiwgJm5leHRoZHIsICZmcmFnX29mZik7Ci0JLyoKLQkgKiAocHJvdG9mZiA9PSBza2ItPmxlbikgbWVhbnMgdGhlIHBhY2tldCBoYXMgbm90IGRhdGEsIGp1c3QKLQkgKiBJUHY2IGFuZCBwb3NzaWJseSBleHRlbnNpb25zIGhlYWRlcnMsIGJ1dCBpdCBpcyB0cmFja2VkIGFueXdheQotCSAqLwotCWlmIChwcm90b2ZmIDwgMCB8fCAoZnJhZ19vZmYgJiBodG9ucyh+MHg3KSkgIT0gMCkgewotCQlwcl9kZWJ1ZygiY2FuJ3QgZmluZCBwcm90byBpbiBwa3RcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JKnByb3RvbnVtID0gbmV4dGhkcjsKLQlyZXR1cm4gcHJvdG9mZjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGdldF9sNHByb3RvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbmhvZmYsIHU4IHBmLCB1OCAqbDRudW0pCi17Ci0Jc3dpdGNoIChwZikgewotCWNhc2UgTkZQUk9UT19JUFY0OgotCQlyZXR1cm4gaXB2NF9nZXRfbDRwcm90byhza2IsIG5ob2ZmLCBsNG51bSk7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQljYXNlIE5GUFJPVE9fSVBWNjoKLQkJcmV0dXJuIGlwdjZfZ2V0X2w0cHJvdG8oc2tiLCBuaG9mZiwgbDRudW0pOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJKmw0bnVtID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAtMTsKLX0KLQotI2lmZGVmIENPTkZJR19GQVNUTkFUX01PRFVMRQotaW50IGdldF9sNHByb3RvX2Zhc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICAgIHVuc2lnbmVkIGludCBuaG9mZiwgdTggcGYsIHU4ICpsNG51bSkKLXsKLQlyZXR1cm4gZ2V0X2w0cHJvdG8oc2tiLCBuaG9mZiwgcGYsIGw0bnVtKTsKLX0KLSNlbmRpZgotCi1ib29sIG5mX2N0X2dldF90dXBsZXByKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBuaG9mZiwKLQkJICAgICAgIHVfaW50MTZfdCBsM251bSwKLQkJICAgICAgIHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JdTggcHJvdG9udW07Ci0JaW50IHByb3RvZmY7Ci0KLQlwcm90b2ZmID0gZ2V0X2w0cHJvdG8oc2tiLCBuaG9mZiwgbDNudW0sICZwcm90b251bSk7Ci0JaWYgKHByb3RvZmYgPD0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIG5mX2N0X2dldF90dXBsZShza2IsIG5ob2ZmLCBwcm90b2ZmLCBsM251bSwgcHJvdG9udW0sIG5ldCwgdHVwbGUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZ2V0X3R1cGxlcHIpOwotCi1ib29sCi1uZl9jdF9pbnZlcnRfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqaW52ZXJzZSwKLQkJICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZykKLXsKLQltZW1zZXQoaW52ZXJzZSwgMCwgc2l6ZW9mKCppbnZlcnNlKSk7Ci0KLQlpbnZlcnNlLT5zcmMubDNudW0gPSBvcmlnLT5zcmMubDNudW07Ci0KLQlzd2l0Y2ggKG9yaWctPnNyYy5sM251bSkgewotCWNhc2UgTkZQUk9UT19JUFY0OgotCQlpbnZlcnNlLT5zcmMudTMuaXAgPSBvcmlnLT5kc3QudTMuaXA7Ci0JCWludmVyc2UtPmRzdC51My5pcCA9IG9yaWctPnNyYy51My5pcDsKLQkJYnJlYWs7Ci0JY2FzZSBORlBST1RPX0lQVjY6Ci0JCWludmVyc2UtPnNyYy51My5pbjYgPSBvcmlnLT5kc3QudTMuaW42OwotCQlpbnZlcnNlLT5kc3QudTMuaW42ID0gb3JpZy0+c3JjLnUzLmluNjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaW52ZXJzZS0+ZHN0LmRpciA9ICFvcmlnLT5kc3QuZGlyOwotCi0JaW52ZXJzZS0+ZHN0LnByb3RvbnVtID0gb3JpZy0+ZHN0LnByb3RvbnVtOwotCi0Jc3dpdGNoIChvcmlnLT5kc3QucHJvdG9udW0pIHsKLQljYXNlIElQUFJPVE9fSUNNUDoKLQkJcmV0dXJuIG5mX2Nvbm50cmFja19pbnZlcnRfaWNtcF90dXBsZShpbnZlcnNlLCBvcmlnKTsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCWNhc2UgSVBQUk9UT19JQ01QVjY6Ci0JCXJldHVybiBuZl9jb25udHJhY2tfaW52ZXJ0X2ljbXB2Nl90dXBsZShpbnZlcnNlLCBvcmlnKTsKLSNlbmRpZgotCX0KLQotCWludmVyc2UtPnNyYy51LmFsbCA9IG9yaWctPmRzdC51LmFsbDsKLQlpbnZlcnNlLT5kc3QudS5hbGwgPSBvcmlnLT5zcmMudS5hbGw7Ci0JcmV0dXJuIHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9pbnZlcnRfdHVwbGUpOwotCi0vKiBHZW5lcmF0ZSBhIGFsbW9zdC11bmlxdWUgcHNldWRvLWlkIGZvciBhIGdpdmVuIGNvbm50cmFjay4KLSAqCi0gKiBpbnRlbnRpb25hbGx5IGRvZXNuJ3QgcmUtdXNlIGFueSBvZiB0aGUgc2VlZHMgdXNlZCBmb3IgaGFzaAotICogdGFibGUgbG9jYXRpb24sIHdlIGFzc3VtZSBpZCBnZXRzIGV4cG9zZWQgdG8gdXNlcnNwYWNlLgotICoKLSAqIEZvbGxvd2luZyBuZl9jb25uIGl0ZW1zIGRvIG5vdCBjaGFuZ2UgdGhyb3VnaG91dCBsaWZldGltZQotICogb2YgdGhlIG5mX2Nvbm46Ci0gKgotICogMS4gbmZfY29ubiBhZGRyZXNzCi0gKiAyLiBuZl9jb25uLT5tYXN0ZXIgYWRkcmVzcyAobm9ybWFsbHkgTlVMTCkKLSAqIDMuIHRoZSBhc3NvY2lhdGVkIG5ldCBuYW1lc3BhY2UKLSAqIDQuIHRoZSBvcmlnaW5hbCBkaXJlY3Rpb24gdHVwbGUKLSAqLwotdTMyIG5mX2N0X2dldF9pZChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RhdGljIF9fcmVhZF9tb3N0bHkgc2lwaGFzaF9rZXlfdCBjdF9pZF9zZWVkOwotCXVuc2lnbmVkIGxvbmcgYSwgYiwgYywgZDsKLQotCW5ldF9nZXRfcmFuZG9tX29uY2UoJmN0X2lkX3NlZWQsIHNpemVvZihjdF9pZF9zZWVkKSk7Ci0KLQlhID0gKHVuc2lnbmVkIGxvbmcpY3Q7Ci0JYiA9ICh1bnNpZ25lZCBsb25nKWN0LT5tYXN0ZXI7Ci0JYyA9ICh1bnNpZ25lZCBsb25nKW5mX2N0X25ldChjdCk7Ci0JZCA9ICh1bnNpZ25lZCBsb25nKXNpcGhhc2goJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwKLQkJCQkgICBzaXplb2YoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKSwKLQkJCQkgICAmY3RfaWRfc2VlZCk7Ci0jaWZkZWYgQ09ORklHXzY0QklUCi0JcmV0dXJuIHNpcGhhc2hfNHU2NCgodTY0KWEsICh1NjQpYiwgKHU2NCljLCAodTY0KWQsICZjdF9pZF9zZWVkKTsKLSNlbHNlCi0JcmV0dXJuIHNpcGhhc2hfNHUzMigodTMyKWEsICh1MzIpYiwgKHUzMiljLCAodTMyKWQsICZjdF9pZF9zZWVkKTsKLSNlbmRpZgotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZ2V0X2lkKTsKLQotc3RhdGljIHZvaWQKLWNsZWFuX2Zyb21fbGlzdHMoc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXByX2RlYnVnKCJjbGVhbl9mcm9tX2xpc3RzKCVwKVxuIiwgY3QpOwotCWhsaXN0X251bGxzX2RlbF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm5vZGUpOwotCWhsaXN0X251bGxzX2RlbF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5obm5vZGUpOwotCi0JLyogRGVzdHJveSBhbGwgcGVuZGluZyBleHBlY3RhdGlvbnMgKi8KLQluZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKGN0KTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NhbF9iaF9kaXNhYmxlICovCi1zdGF0aWMgdm9pZCBuZl9jdF9hZGRfdG9fZHlpbmdfbGlzdChzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RydWN0IGN0X3BjcHUgKnBjcHU7Ci0KLQkvKiBhZGQgdGhpcyBjb25udHJhY2sgdG8gdGhlIChwZXIgY3B1KSBkeWluZyBsaXN0ICovCi0JY3QtPmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlwY3B1ID0gcGVyX2NwdV9wdHIobmZfY3RfbmV0KGN0KS0+Y3QucGNwdV9saXN0cywgY3QtPmNwdSk7Ci0KLQlzcGluX2xvY2soJnBjcHUtPmxvY2spOwotCWhsaXN0X251bGxzX2FkZF9oZWFkKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0uaG5ub2RlLAotCQkJICAgICAmcGNwdS0+ZHlpbmcpOwotCXNwaW5fdW5sb2NrKCZwY3B1LT5sb2NrKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NhbF9iaF9kaXNhYmxlICovCi1zdGF0aWMgdm9pZCBuZl9jdF9hZGRfdG9fdW5jb25maXJtZWRfbGlzdChzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RydWN0IGN0X3BjcHUgKnBjcHU7Ci0KLQkvKiBhZGQgdGhpcyBjb25udHJhY2sgdG8gdGhlIChwZXIgY3B1KSB1bmNvbmZpcm1lZCBsaXN0ICovCi0JY3QtPmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlwY3B1ID0gcGVyX2NwdV9wdHIobmZfY3RfbmV0KGN0KS0+Y3QucGNwdV9saXN0cywgY3QtPmNwdSk7Ci0KLQlzcGluX2xvY2soJnBjcHUtPmxvY2spOwotCWhsaXN0X251bGxzX2FkZF9oZWFkKCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0uaG5ub2RlLAotCQkJICAgICAmcGNwdS0+dW5jb25maXJtZWQpOwotCXNwaW5fdW5sb2NrKCZwY3B1LT5sb2NrKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NhbF9iaF9kaXNhYmxlICovCi1zdGF0aWMgdm9pZCBuZl9jdF9kZWxfZnJvbV9keWluZ19vcl91bmNvbmZpcm1lZF9saXN0KHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlzdHJ1Y3QgY3RfcGNwdSAqcGNwdTsKLQotCS8qIFdlIG92ZXJsb2FkIGZpcnN0IHR1cGxlIHRvIGxpbmsgaW50byB1bmNvbmZpcm1lZCBvciBkeWluZyBsaXN0LiovCi0JcGNwdSA9IHBlcl9jcHVfcHRyKG5mX2N0X25ldChjdCktPmN0LnBjcHVfbGlzdHMsIGN0LT5jcHUpOwotCi0Jc3Bpbl9sb2NrKCZwY3B1LT5sb2NrKTsKLQlCVUdfT04oaGxpc3RfbnVsbHNfdW5oYXNoZWQoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm5vZGUpKTsKLQlobGlzdF9udWxsc19kZWxfcmN1KCZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0uaG5ub2RlKTsKLQlzcGluX3VubG9jaygmcGNwdS0+bG9jayk7Ci19Ci0KLSNkZWZpbmUgTkZDVF9BTElHTihsZW4pCSgoKGxlbikgKyBORkNUX0lORk9NQVNLKSAmIH5ORkNUX0lORk9NQVNLKQotCi0vKiBSZWxlYXNlZCB2aWEgZGVzdHJveV9jb25udHJhY2soKSAqLwotc3RydWN0IG5mX2Nvbm4gKm5mX2N0X3RtcGxfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCQkJIGdmcF90IGZsYWdzKQotewotCXN0cnVjdCBuZl9jb25uICp0bXBsLCAqcDsKLQotCWlmIChBUkNIX0tNQUxMT0NfTUlOQUxJR04gPD0gTkZDVF9JTkZPTUFTSykgewotCQl0bXBsID0ga3phbGxvYyhzaXplb2YoKnRtcGwpICsgTkZDVF9JTkZPTUFTSywgZmxhZ3MpOwotCQlpZiAoIXRtcGwpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlwID0gdG1wbDsKLQkJdG1wbCA9IChzdHJ1Y3QgbmZfY29ubiAqKU5GQ1RfQUxJR04oKHVuc2lnbmVkIGxvbmcpcCk7Ci0JCWlmICh0bXBsICE9IHApIHsKLQkJCXRtcGwgPSAoc3RydWN0IG5mX2Nvbm4gKilORkNUX0FMSUdOKCh1bnNpZ25lZCBsb25nKXApOwotCQkJdG1wbC0+cHJvdG8udG1wbF9wYWR0byA9IChjaGFyICopdG1wbCAtIChjaGFyICopcDsKLQkJfQotCX0gZWxzZSB7Ci0JCXRtcGwgPSBremFsbG9jKHNpemVvZigqdG1wbCksIGZsYWdzKTsKLQkJaWYgKCF0bXBsKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JdG1wbC0+c3RhdHVzID0gSVBTX1RFTVBMQVRFOwotCXdyaXRlX3BuZXQoJnRtcGwtPmN0X25ldCwgbmV0KTsKLQluZl9jdF96b25lX2FkZCh0bXBsLCB6b25lKTsKLQlhdG9taWNfc2V0KCZ0bXBsLT5jdF9nZW5lcmFsLnVzZSwgMCk7Ci0KLQlyZXR1cm4gdG1wbDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X3RtcGxfYWxsb2MpOwotCi12b2lkIG5mX2N0X3RtcGxfZnJlZShzdHJ1Y3QgbmZfY29ubiAqdG1wbCkKLXsKLQluZl9jdF9leHRfZGVzdHJveSh0bXBsKTsKLQotCWlmIChBUkNIX0tNQUxMT0NfTUlOQUxJR04gPD0gTkZDVF9JTkZPTUFTSykKLQkJa2ZyZWUoKGNoYXIgKil0bXBsIC0gdG1wbC0+cHJvdG8udG1wbF9wYWR0byk7Ci0JZWxzZQotCQlrZnJlZSh0bXBsKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X3RtcGxfZnJlZSk7Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfZ3JlX2Nvbm50cmFjayhzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0jaWZkZWYgQ09ORklHX05GX0NUX1BST1RPX0dSRQotCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBjdC0+bWFzdGVyOwotCi0JaWYgKG1hc3RlcikKLQkJbmZfY3RfZ3JlX2tleW1hcF9kZXN0cm95KG1hc3Rlcik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLWRlc3Ryb3lfY29ubnRyYWNrKHN0cnVjdCBuZl9jb25udHJhY2sgKm5mY3QpCi17Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKLQotCXByX2RlYnVnKCJkZXN0cm95X2Nvbm50cmFjayglcClcbiIsIGN0KTsKLQlXQVJOX09OKGF0b21pY19yZWFkKCZuZmN0LT51c2UpICE9IDApOwotCi0JaWYgKHVubGlrZWx5KG5mX2N0X2lzX3RlbXBsYXRlKGN0KSkpIHsKLQkJbmZfY3RfdG1wbF9mcmVlKGN0KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1bmxpa2VseShuZl9jdF9wcm90b251bShjdCkgPT0gSVBQUk9UT19HUkUpKQotCQlkZXN0cm95X2dyZV9jb25udHJhY2soY3QpOwotCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCS8qIEV4cGVjdGF0aW9ucyB3aWxsIGhhdmUgYmVlbiByZW1vdmVkIGluIGNsZWFuX2Zyb21fbGlzdHMsCi0JICogZXhjZXB0IFRGVFAgY2FuIGNyZWF0ZSBhbiBleHBlY3RhdGlvbiBvbiB0aGUgZmlyc3QgcGFja2V0LAotCSAqIGJlZm9yZSBjb25uZWN0aW9uIGlzIGluIHRoZSBsaXN0LCBzbyB3ZSBuZWVkIHRvIGNsZWFuIGhlcmUsCi0JICogdG9vLgotCSAqLwotCW5mX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoY3QpOwotCi0JbmZfY3RfZGVsX2Zyb21fZHlpbmdfb3JfdW5jb25maXJtZWRfbGlzdChjdCk7Ci0KLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCWlmIChjdC0+bWFzdGVyKQotCQluZl9jdF9wdXQoY3QtPm1hc3Rlcik7Ci0KLQlwcl9kZWJ1ZygiZGVzdHJveV9jb25udHJhY2s6IHJldHVybmluZyBjdD0lcCB0byBzbGFiXG4iLCBjdCk7Ci0JbmZfY29ubnRyYWNrX2ZyZWUoY3QpOwotfQotCi1zdGF0aWMgdm9pZCBuZl9jdF9kZWxldGVfZnJvbV9saXN0cyhzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVwbHlfaGFzaDsKLQl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7Ci0KLQluZl9jdF9oZWxwZXJfZGVzdHJveShjdCk7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JZG8gewotCQlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uKTsKLQkJaGFzaCA9IGhhc2hfY29ubnRyYWNrKG5ldCwKLQkJCQkgICAgICAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKTsKLQkJcmVwbHlfaGFzaCA9IGhhc2hfY29ubnRyYWNrKG5ldCwKLQkJCQkJICAgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7Ci0JfSB3aGlsZSAobmZfY29ubnRyYWNrX2RvdWJsZV9sb2NrKG5ldCwgaGFzaCwgcmVwbHlfaGFzaCwgc2VxdWVuY2UpKTsKLQotCWNsZWFuX2Zyb21fbGlzdHMoY3QpOwotCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCi0JbmZfY3RfYWRkX3RvX2R5aW5nX2xpc3QoY3QpOwotCi0JbG9jYWxfYmhfZW5hYmxlKCk7Ci19Ci0KLWJvb2wgbmZfY3RfZGVsZXRlKHN0cnVjdCBuZl9jb25uICpjdCwgdTMyIHBvcnRpZCwgaW50IHJlcG9ydCkKLXsKLQlzdHJ1Y3QgbmZfY29ubl90c3RhbXAgKnRzdGFtcDsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JdHN0YW1wID0gbmZfY29ubl90c3RhbXBfZmluZChjdCk7Ci0JaWYgKHRzdGFtcCkgewotCQlzMzIgdGltZW91dCA9IFJFQURfT05DRShjdC0+dGltZW91dCkgLSBuZmN0X3RpbWVfc3RhbXA7Ci0KLQkJdHN0YW1wLT5zdG9wID0ga3RpbWVfZ2V0X3JlYWxfbnMoKTsKLQkJaWYgKHRpbWVvdXQgPCAwKQotCQkJdHN0YW1wLT5zdG9wIC09IGppZmZpZXNfdG9fbnNlY3MoLXRpbWVvdXQpOwotCX0KLQotCWlmIChuZl9jb25udHJhY2tfZXZlbnRfcmVwb3J0KElQQ1RfREVTVFJPWSwgY3QsCi0JCQkJICAgIHBvcnRpZCwgcmVwb3J0KSA8IDApIHsKLQkJLyogZGVzdHJveSBldmVudCB3YXMgbm90IGRlbGl2ZXJlZC4gbmZfY3RfcHV0IHdpbGwKLQkJICogYmUgZG9uZSBieSBldmVudCBjYWNoZSB3b3JrZXIgb24gcmVkZWxpdmVyeS4KLQkJICovCi0JCW5mX2N0X2RlbGV0ZV9mcm9tX2xpc3RzKGN0KTsKLQkJbmZfY29ubnRyYWNrX2VjYWNoZV9kZWxheWVkX3dvcmsobmZfY3RfbmV0KGN0KSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQluZl9jb25udHJhY2tfZWNhY2hlX3dvcmsobmZfY3RfbmV0KGN0KSk7Ci0JbmZfY3RfZGVsZXRlX2Zyb21fbGlzdHMoY3QpOwotCW5mX2N0X3B1dChjdCk7Ci0JcmV0dXJuIHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9kZWxldGUpOwotCi1zdGF0aWMgaW5saW5lIGJvb2wKLW5mX2N0X2tleV9lcXVhbChzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmgsCi0JCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCWNvbnN0IHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JLyogQSBjb25udHJhY2sgY2FuIGJlIHJlY3JlYXRlZCB3aXRoIHRoZSBlcXVhbCB0dXBsZSwKLQkgKiBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGNvbm50cmFjayBpcyBjb25maXJtZWQKLQkgKi8KLQlyZXR1cm4gbmZfY3RfdHVwbGVfZXF1YWwodHVwbGUsICZoLT50dXBsZSkgJiYKLQkgICAgICAgbmZfY3Rfem9uZV9lcXVhbChjdCwgem9uZSwgTkZfQ1RfRElSRUNUSU9OKGgpKSAmJgotCSAgICAgICBuZl9jdF9pc19jb25maXJtZWQoY3QpICYmCi0JICAgICAgIG5ldF9lcShuZXQsIG5mX2N0X25ldChjdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLW5mX2N0X21hdGNoKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdDEsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdDIpCi17Ci0JcmV0dXJuIG5mX2N0X3R1cGxlX2VxdWFsKCZjdDEtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJCSAmY3QyLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSkgJiYKLQkgICAgICAgbmZfY3RfdHVwbGVfZXF1YWwoJmN0MS0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCQkJICZjdDItPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlKSAmJgotCSAgICAgICBuZl9jdF96b25lX2VxdWFsKGN0MSwgbmZfY3Rfem9uZShjdDIpLCBJUF9DVF9ESVJfT1JJR0lOQUwpICYmCi0JICAgICAgIG5mX2N0X3pvbmVfZXF1YWwoY3QxLCBuZl9jdF96b25lKGN0MiksIElQX0NUX0RJUl9SRVBMWSkgJiYKLQkgICAgICAgbmV0X2VxKG5mX2N0X25ldChjdDEpLCBuZl9jdF9uZXQoY3QyKSk7Ci19Ci0KLS8qIGNhbGxlciBtdXN0IGhvbGQgcmN1IHJlYWRsb2NrIGFuZCBub25lIG9mIHRoZSBuZl9jb25udHJhY2tfbG9ja3MgKi8KLXN0YXRpYyB2b2lkIG5mX2N0X2djX2V4cGlyZWQoc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCWlmICghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkKLQkJcmV0dXJuOwotCi0JaWYgKG5mX2N0X3Nob3VsZF9nYyhjdCkpCi0JCW5mX2N0X2tpbGwoY3QpOwotCi0JbmZfY3RfcHV0KGN0KTsKLX0KLQotLyoKLSAqIFdhcm5pbmcgOgotICogLSBDYWxsZXIgbXVzdCB0YWtlIGEgcmVmZXJlbmNlIG9uIHJldHVybmVkIG9iamVjdAotICogICBhbmQgcmVjaGVjayBuZl9jdF90dXBsZV9lcXVhbCh0dXBsZSwgJmgtPnR1cGxlKQotICovCi1zdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9fX19uZl9jb25udHJhY2tfZmluZChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZSwKLQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsIHUzMiBoYXNoKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqY3RfaGFzaDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQl1bnNpZ25lZCBpbnQgYnVja2V0LCBoc2l6ZTsKLQotYmVnaW46Ci0JbmZfY29ubnRyYWNrX2dldF9odCgmY3RfaGFzaCwgJmhzaXplKTsKLQlidWNrZXQgPSByZWNpcHJvY2FsX3NjYWxlKGhhc2gsIGhzaXplKTsKLQotCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmY3RfaGFzaFtidWNrZXRdLCBobm5vZGUpIHsKLQkJc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0JCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQkJaWYgKG5mX2N0X2lzX2V4cGlyZWQoY3QpKSB7Ci0JCQluZl9jdF9nY19leHBpcmVkKGN0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkKLQkJCXJldHVybiBoOwotCX0KLQkvKgotCSAqIGlmIHRoZSBudWxscyB2YWx1ZSB3ZSBnb3QgYXQgdGhlIGVuZCBvZiB0aGlzIGxvb2t1cCBpcwotCSAqIG5vdCB0aGUgZXhwZWN0ZWQgb25lLCB3ZSBtdXN0IHJlc3RhcnQgbG9va3VwLgotCSAqIFdlIHByb2JhYmx5IG1ldCBhbiBpdGVtIHRoYXQgd2FzIG1vdmVkIHRvIGFub3RoZXIgY2hhaW4uCi0JICovCi0JaWYgKGdldF9udWxsc192YWx1ZShuKSAhPSBidWNrZXQpIHsKLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgc2VhcmNoX3Jlc3RhcnQpOwotCQlnb3RvIGJlZ2luOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGEgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgdHVwbGUuICovCi1zdGF0aWMgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKLV9fbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja196b25lICp6b25lLAotCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsIHUzMiBoYXNoKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQloID0gX19fX25mX2Nvbm50cmFja19maW5kKG5ldCwgem9uZSwgdHVwbGUsIGhhc2gpOwotCWlmIChoKSB7Ci0JCS8qIFdlIGhhdmUgYSBjYW5kaWRhdGUgdGhhdCBtYXRjaGVzIHRoZSB0dXBsZSB3ZSdyZSBpbnRlcmVzdGVkCi0JCSAqIGluLCB0cnkgdG8gb2J0YWluIGEgcmVmZXJlbmNlIGFuZCByZS1jaGVjayB0dXBsZQotCQkgKi8KLQkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCQlpZiAobGlrZWx5KGF0b21pY19pbmNfbm90X3plcm8oJmN0LT5jdF9nZW5lcmFsLnVzZSkpKSB7Ci0JCQlpZiAobGlrZWx5KG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkpCi0JCQkJZ290byBmb3VuZDsKLQotCQkJLyogVFlQRVNBRkVfQllfUkNVIHJlY3ljbGVkIHRoZSBjYW5kaWRhdGUgKi8KLQkJCW5mX2N0X3B1dChjdCk7Ci0JCX0KLQotCQloID0gTlVMTDsKLQl9Ci1mb3VuZDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBoOwotfQotCi0jaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCi1zdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKm5mX2Nvbm50cmFja19maW5kX2Zhc3Qoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLCB1MzIgaGFzaCkKLXsKLQlyZXR1cm4gX19uZl9jb25udHJhY2tfZmluZF9nZXQobmV0LCB6b25lLCB0dXBsZSwgaGFzaCk7Ci19Ci0jZW5kaWYKLQotc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICoKLW5mX2Nvbm50cmFja19maW5kX2dldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZSwKLQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JcmV0dXJuIF9fbmZfY29ubnRyYWNrX2ZpbmRfZ2V0KG5ldCwgem9uZSwgdHVwbGUsCi0JCQkJICAgICAgIGhhc2hfY29ubnRyYWNrX3Jhdyh0dXBsZSwgbmV0KSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfZmluZF9nZXQpOwotCi1zdGF0aWMgdm9pZCBfX25mX2Nvbm50cmFja19oYXNoX2luc2VydChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBoYXNoLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVwbHlfaGFzaCkKLXsKLQlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm5vZGUsCi0JCQkgICAmbmZfY29ubnRyYWNrX2hhc2hbaGFzaF0pOwotCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmhubm9kZSwKLQkJCSAgICZuZl9jb25udHJhY2tfaGFzaFtyZXBseV9oYXNoXSk7Ci19Ci0KLWludAotbmZfY29ubnRyYWNrX2hhc2hfY2hlY2tfaW5zZXJ0KHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmU7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgcmVwbHlfaGFzaDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0JdW5zaWduZWQgaW50IHNlcXVlbmNlOwotCi0Jem9uZSA9IG5mX2N0X3pvbmUoY3QpOwotCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JCWhhc2ggPSBoYXNoX2Nvbm50cmFjayhuZXQsCi0JCQkJICAgICAgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSk7Ci0JCXJlcGx5X2hhc2ggPSBoYXNoX2Nvbm50cmFjayhuZXQsCi0JCQkJCSAgICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUpOwotCX0gd2hpbGUgKG5mX2Nvbm50cmFja19kb3VibGVfbG9jayhuZXQsIGhhc2gsIHJlcGx5X2hhc2gsIHNlcXVlbmNlKSk7Ci0KLQkvKiBTZWUgaWYgdGhlcmUncyBvbmUgaW4gdGhlIGxpc3QgYWxyZWFkeSwgaW5jbHVkaW5nIHJldmVyc2UgKi8KLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGhubm9kZSkKLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJCSAgICB6b25lLCBuZXQpKQotCQkJZ290byBvdXQ7Ci0KLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbcmVwbHlfaGFzaF0sIGhubm9kZSkKLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkJCSAgICB6b25lLCBuZXQpKQotCQkJZ290byBvdXQ7Ci0KLQlzbXBfd21iKCk7Ci0JLyogVGhlIGNhbGxlciBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCAqLwotCWF0b21pY19zZXQoJmN0LT5jdF9nZW5lcmFsLnVzZSwgMik7Ci0JX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGx5X2hhc2gpOwotCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0KTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLQlyZXR1cm4gMDsKLQotb3V0OgotCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotCXJldHVybiAtRUVYSVNUOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hhc2hfY2hlY2tfaW5zZXJ0KTsKLQotdm9pZCBuZl9jdF9hY2N0X2FkZChzdHJ1Y3QgbmZfY29ubiAqY3QsIHUzMiBkaXIsIHVuc2lnbmVkIGludCBwYWNrZXRzLAotCQkgICAgdW5zaWduZWQgaW50IGJ5dGVzKQotewotCXN0cnVjdCBuZl9jb25uX2FjY3QgKmFjY3Q7Ci0KLQlhY2N0ID0gbmZfY29ubl9hY2N0X2ZpbmQoY3QpOwotCWlmIChhY2N0KSB7Ci0JCXN0cnVjdCBuZl9jb25uX2NvdW50ZXIgKmNvdW50ZXIgPSBhY2N0LT5jb3VudGVyOwotCi0JCWF0b21pYzY0X2FkZChwYWNrZXRzLCAmY291bnRlcltkaXJdLnBhY2tldHMpOwotCQlhdG9taWM2NF9hZGQoYnl0ZXMsICZjb3VudGVyW2Rpcl0uYnl0ZXMpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2FjY3RfYWRkKTsKLQotc3RhdGljIHZvaWQgbmZfY3RfYWNjdF9tZXJnZShzdHJ1Y3QgbmZfY29ubiAqY3QsIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqbG9zZXJfY3QpCi17Ci0Jc3RydWN0IG5mX2Nvbm5fYWNjdCAqYWNjdDsKLQotCWFjY3QgPSBuZl9jb25uX2FjY3RfZmluZChsb3Nlcl9jdCk7Ci0JaWYgKGFjY3QpIHsKLQkJc3RydWN0IG5mX2Nvbm5fY291bnRlciAqY291bnRlciA9IGFjY3QtPmNvdW50ZXI7Ci0JCXVuc2lnbmVkIGludCBieXRlczsKLQotCQkvKiB1MzIgc2hvdWxkIGJlIGZpbmUgc2luY2Ugd2UgbXVzdCBoYXZlIHNlZW4gb25lIHBhY2tldC4gKi8KLQkJYnl0ZXMgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyW0NUSU5GTzJESVIoY3RpbmZvKV0uYnl0ZXMpOwotCQluZl9jdF9hY2N0X3VwZGF0ZShjdCwgQ1RJTkZPMkRJUihjdGluZm8pLCBieXRlcyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX25mX2Nvbm50cmFja19pbnNlcnRfcHJlcGFyZShzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0Jc3RydWN0IG5mX2Nvbm5fdHN0YW1wICp0c3RhbXA7Ci0KLQlhdG9taWNfaW5jKCZjdC0+Y3RfZ2VuZXJhbC51c2UpOwotCWN0LT5zdGF0dXMgfD0gSVBTX0NPTkZJUk1FRDsKLQotCS8qIHNldCBjb25udHJhY2sgdGltZXN0YW1wLCBpZiBlbmFibGVkLiAqLwotCXRzdGFtcCA9IG5mX2Nvbm5fdHN0YW1wX2ZpbmQoY3QpOwotCWlmICh0c3RhbXApCi0JCXRzdGFtcC0+c3RhcnQgPSBrdGltZV9nZXRfcmVhbF9ucygpOwotfQotCi0vKiBjYWxsZXIgbXVzdCBob2xkIGxvY2tzIHRvIHByZXZlbnQgY29uY3VycmVudCBjaGFuZ2VzICovCi1zdGF0aWMgaW50IF9fbmZfY3RfcmVzb2x2ZV9jbGFzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmgpCi17Ci0JLyogVGhpcyBpcyB0aGUgY29ubnRyYWNrIGVudHJ5IGFscmVhZHkgaW4gaGFzaGVzIHRoYXQgd29uIHJhY2UuICovCi0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgbmZfY29ubiAqbG9zZXJfY3Q7Ci0KLQlsb3Nlcl9jdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCi0JaWYgKG5mX2N0X2lzX2R5aW5nKGN0KSkKLQkJcmV0dXJuIE5GX0RST1A7Ci0KLQlpZiAoKChjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spID09IDApIHx8Ci0JICAgIG5mX2N0X21hdGNoKGN0LCBsb3Nlcl9jdCkpIHsKLQkJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKLQotCQluZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7Ci0KLQkJbmZfY3RfYWNjdF9tZXJnZShjdCwgY3RpbmZvLCBsb3Nlcl9jdCk7Ci0JCW5mX2N0X2FkZF90b19keWluZ19saXN0KGxvc2VyX2N0KTsKLQkJbmZfY29ubnRyYWNrX3B1dCgmbG9zZXJfY3QtPmN0X2dlbmVyYWwpOwotCQluZl9jdF9zZXQoc2tiLCBjdCwgY3RpbmZvKTsKLQotCQlORl9DVF9TVEFUX0lOQyhuZXQsIGNsYXNoX3Jlc29sdmUpOwotCQlyZXR1cm4gTkZfQUNDRVBUOwotCX0KLQotCXJldHVybiBORl9EUk9QOwotfQotCi0vKioKLSAqIG5mX2N0X3Jlc29sdmVfY2xhc2hfaGFyZGVyIC0gYXR0ZW1wdCB0byBpbnNlcnQgY2xhc2hpbmcgY29ubnRyYWNrIGVudHJ5Ci0gKgotICogQHNrYjogc2tiIHRoYXQgY2F1c2VzIHRoZSBjb2xsaXNpb24KLSAqIEByZXBsX2lkeDogaGFzaCBzbG90IGZvciByZXBseSBkaXJlY3Rpb24KLSAqCi0gKiBDYWxsZWQgd2hlbiBvcmlnaW4gb3IgcmVwbHkgZGlyZWN0aW9uIGhhZCBhIGNsYXNoLgotICogVGhlIHNrYiBjYW4gYmUgaGFuZGxlZCB3aXRob3V0IHBhY2tldCBkcm9wIHByb3ZpZGVkIHRoZSByZXBseSBkaXJlY3Rpb24KLSAqIGlzIHVuaXF1ZSBvciB0aGVyZSB0aGUgZXhpc3RpbmcgZW50cnkgaGFzIHRoZSBpZGVudGljYWwgdHVwbGUgaW4gYm90aAotICogZGlyZWN0aW9ucy4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGNvbm50cmFjayB0YWJsZSBsb2NrcyB0byBwcmV2ZW50IGNvbmN1cnJlbnQgdXBkYXRlcy4KLSAqCi0gKiBSZXR1cm5zIE5GX0RST1AgaWYgdGhlIGNsYXNoIGNvdWxkIG5vdCBiZSBoYW5kbGVkLgotICovCi1zdGF0aWMgaW50IG5mX2N0X3Jlc29sdmVfY2xhc2hfaGFyZGVyKHN0cnVjdCBza19idWZmICpza2IsIHUzMiByZXBsX2lkeCkKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqbG9zZXJfY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2JfbmZjdChza2IpOwotCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0Jc3RydWN0IG5ldCAqbmV0OwotCi0Jem9uZSA9IG5mX2N0X3pvbmUobG9zZXJfY3QpOwotCW5ldCA9IG5mX2N0X25ldChsb3Nlcl9jdCk7Ci0KLQkvKiBSZXBseSBkaXJlY3Rpb24gbXVzdCBuZXZlciByZXN1bHQgaW4gYSBjbGFzaCwgdW5sZXNzIGJvdGggb3JpZ2luCi0JICogYW5kIHJlcGx5IHR1cGxlcyBhcmUgaWRlbnRpY2FsLgotCSAqLwotCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGgsIG4sICZuZl9jb25udHJhY2tfaGFzaFtyZXBsX2lkeF0sIGhubm9kZSkgewotCQlpZiAobmZfY3Rfa2V5X2VxdWFsKGgsCi0JCQkJICAgICZsb3Nlcl9jdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCQkJICAgIHpvbmUsIG5ldCkpCi0JCQlyZXR1cm4gX19uZl9jdF9yZXNvbHZlX2NsYXNoKHNrYiwgaCk7Ci0JfQotCi0JLyogV2Ugd2FudCB0aGUgY2xhc2hpbmcgZW50cnkgdG8gZ28gYXdheSByZWFsIHNvb246IDEgc2Vjb25kIHRpbWVvdXQuICovCi0JV1JJVEVfT05DRShsb3Nlcl9jdC0+dGltZW91dCwgbmZjdF90aW1lX3N0YW1wICsgSFopOwotCi0JLyogSVBTX05BVF9DTEFTSCByZW1vdmVzIHRoZSBlbnRyeSBhdXRvbWF0aWNhbGx5IG9uIHRoZSBmaXJzdAotCSAqIHJlcGx5LiAgQWxzbyBwcmV2ZW50cyBVRFAgdHJhY2tlciBmcm9tIG1vdmluZyB0aGUgZW50cnkgdG8KLQkgKiBBU1NVUkVEIHN0YXRlLCBpLmUuIHRoZSBlbnRyeSBjYW4gYWx3YXlzIGJlIGV2aWN0ZWQgdW5kZXIKLQkgKiBwcmVzc3VyZS4KLQkgKi8KLQlsb3Nlcl9jdC0+c3RhdHVzIHw9IElQU19GSVhFRF9USU1FT1VUIHwgSVBTX05BVF9DTEFTSDsKLQotCV9fbmZfY29ubnRyYWNrX2luc2VydF9wcmVwYXJlKGxvc2VyX2N0KTsKLQotCS8qIGZha2UgYWRkIGZvciBPUklHSU5BTCBkaXI6IHdlIHdhbnQgbG9va3VwcyB0byBvbmx5IGZpbmQgdGhlIGVudHJ5Ci0JICogYWxyZWFkeSBpbiB0aGUgdGFibGUuICBUaGlzIGFsc28gaGlkZXMgdGhlIGNsYXNoaW5nIGVudHJ5IGZyb20KLQkgKiBjdG5ldGxpbmsgaXRlcmF0aW9uLCBpLmUuIGNvbm50cmFjayAtTCB3b24ndCBzaG93IHRoZW0uCi0JICovCi0JaGxpc3RfbnVsbHNfYWRkX2Zha2UoJmxvc2VyX2N0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS5obm5vZGUpOwotCi0JaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZsb3Nlcl9jdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0uaG5ub2RlLAotCQkJCSAmbmZfY29ubnRyYWNrX2hhc2hbcmVwbF9pZHhdKTsKLQotCU5GX0NUX1NUQVRfSU5DKG5ldCwgY2xhc2hfcmVzb2x2ZSk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyoqCi0gKiBuZl9jdF9yZXNvbHZlX2NsYXNoIC0gYXR0ZW1wdCB0byBoYW5kbGUgY2xhc2ggd2l0aG91dCBwYWNrZXQgZHJvcAotICoKLSAqIEBza2I6IHNrYiB0aGF0IGNhdXNlcyB0aGUgY2xhc2gKLSAqIEBoOiB0dXBsZWhhc2ggb2YgdGhlIGNsYXNoaW5nIGVudHJ5IGFscmVhZHkgaW4gdGFibGUKLSAqIEByZXBseV9oYXNoOiBoYXNoIHNsb3QgZm9yIHJlcGx5IGRpcmVjdGlvbgotICoKLSAqIEEgY29ubnRyYWNrIGVudHJ5IGNhbiBiZSBpbnNlcnRlZCB0byB0aGUgY29ubmVjdGlvbiB0cmFja2luZyB0YWJsZQotICogaWYgdGhlcmUgaXMgbm8gZXhpc3RpbmcgZW50cnkgd2l0aCBhbiBpZGVudGljYWwgdHVwbGUuCi0gKgotICogSWYgdGhlcmUgaXMgb25lLCBAc2tiIChhbmQgdGhlIGFzc29jYXRlZCwgdW5jb25maXJtZWQgY29ubnRyYWNrKSBoYXMKLSAqIHRvIGJlIGRyb3BwZWQuICBJbiBjYXNlIEBza2IgaXMgcmV0cmFuc21pdHRlZCwgbmV4dCBjb25udHJhY2sgbG9va3VwCi0gKiB3aWxsIGZpbmQgdGhlIGFscmVhZHktZXhpc3RpbmcgZW50cnkuCi0gKgotICogVGhlIG1ham9yIHByb2JsZW0gd2l0aCBzdWNoIHBhY2tldCBkcm9wIGlzIHRoZSBleHRyYSBkZWxheSBhZGRlZCBieQotICogdGhlIHBhY2tldCBsb3NzIC0tIGl0IHdpbGwgdGFrZSBzb21lIHRpbWUgZm9yIGEgcmV0cmFuc21pdCB0byBvY2N1cgotICogKG9yIHRoZSBzZW5kZXIgdG8gdGltZSBvdXQgd2hlbiB3YWl0aW5nIGZvciBhIHJlcGx5KS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGhhbmRsZSB0aGUgc2l0dWF0aW9uIHdpdGhvdXQgcGFja2V0IGRyb3AuCi0gKgotICogSWYgQHNrYiBoYXMgbm8gTkFUIHRyYW5zZm9ybWF0aW9uIG9yIGlmIHRoZSBjb2xsaWRpbmcgZW50cmllcyBhcmUKLSAqIGV4YWN0bHkgdGhlIHNhbWUsIG9ubHkgdGhlIHRvLWJlLWNvbmZpcm1lZCBjb25udHJhY2sgZW50cnkgaXMgZGlzY2FyZGVkCi0gKiBhbmQgQHNrYiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm50cmFjayBlbnRyeSBhbHJlYWR5IGluIHRoZSB0YWJsZS4KLSAqCi0gKiBGYWlsaW5nIHRoYXQsIHRoZSBuZXcsIHVuY29uZmlybWVkIGNvbm50cmFjayBpcyBzdGlsbCBhZGRlZCB0byB0aGUgdGFibGUKLSAqIHByb3ZpZGVkIHRoYXQgdGhlIGNvbGxpc2lvbiBvbmx5IG9jY3VycyBpbiB0aGUgT1JJR0lOQUwgZGlyZWN0aW9uLgotICogVGhlIG5ldyBlbnRyeSB3aWxsIGJlIGFkZGVkIG9ubHkgaW4gdGhlIG5vbi1jbGFzaGluZyBSRVBMWSBkaXJlY3Rpb24sCi0gKiBzbyBwYWNrZXRzIGluIHRoZSBPUklHSU5BTCBkaXJlY3Rpb24gd2lsbCBjb250aW51ZSB0byBtYXRjaCB0aGUgZXhpc3RpbmcKLSAqIGVudHJ5LiAgVGhlIG5ldyBlbnRyeSB3aWxsIGFsc28gaGF2ZSBhIGZpeGVkIHRpbWVvdXQgc28gaXQgZXhwaXJlcyAtLQotICogZHVlIHRvIHRoZSBjb2xsaXNpb24sIGl0IHdpbGwgb25seSBzZWUgcmVwbHkgdHJhZmZpYy4KLSAqCi0gKiBSZXR1cm5zIE5GX0RST1AgaWYgdGhlIGNsYXNoIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KLSAqLwotc3RhdGljIF9fY29sZCBub2lubGluZSBpbnQKLW5mX2N0X3Jlc29sdmVfY2xhc2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoLAotCQkgICAgdTMyIHJlcGx5X2hhc2gpCi17Ci0JLyogVGhpcyBpcyB0aGUgY29ubnRyYWNrIGVudHJ5IGFscmVhZHkgaW4gaGFzaGVzIHRoYXQgd29uIHJhY2UuICovCi0Jc3RydWN0IG5mX2Nvbm4gKmN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IG5mX2Nvbm4gKmxvc2VyX2N0OwotCXN0cnVjdCBuZXQgKm5ldDsKLQlpbnQgcmV0OwotCi0JbG9zZXJfY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQluZXQgPSBuZl9jdF9uZXQobG9zZXJfY3QpOwotCi0JbDRwcm90byA9IG5mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9wcm90b251bShjdCkpOwotCWlmICghbDRwcm90by0+YWxsb3dfY2xhc2gpCi0JCWdvdG8gZHJvcDsKLQotCXJldCA9IF9fbmZfY3RfcmVzb2x2ZV9jbGFzaChza2IsIGgpOwotCWlmIChyZXQgPT0gTkZfQUNDRVBUKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbmZfY3RfcmVzb2x2ZV9jbGFzaF9oYXJkZXIoc2tiLCByZXBseV9oYXNoKTsKLQlpZiAocmV0ID09IE5GX0FDQ0VQVCkKLQkJcmV0dXJuIHJldDsKLQotZHJvcDoKLQluZl9jdF9hZGRfdG9fZHlpbmdfbGlzdChsb3Nlcl9jdCk7Ci0JTkZfQ1RfU1RBVF9JTkMobmV0LCBkcm9wKTsKLQlORl9DVF9TVEFUX0lOQyhuZXQsIGluc2VydF9mYWlsZWQpOwotCXJldHVybiBORl9EUk9QOwotfQotCi0vKiBDb25maXJtIGEgY29ubmVjdGlvbiBnaXZlbiBza2I7IHBsYWNlcyBpdCBpbiBoYXNoIHRhYmxlICovCi1pbnQKLV9fbmZfY29ubnRyYWNrX2NvbmZpcm0oc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmU7Ci0JdW5zaWduZWQgaW50IGhhc2gsIHJlcGx5X2hhc2g7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBuZl9jb25uICpjdDsKLQlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwotCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBuZXQgKm5ldDsKLQl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7Ci0JaW50IHJldCA9IE5GX0RST1A7Ci0KLQljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCW5ldCA9IG5mX2N0X25ldChjdCk7Ci0KLQkvKiBpcHRfUkVKRUNUIHVzZXMgbmZfY29ubnRyYWNrX2F0dGFjaCB0byBhdHRhY2ggcmVsYXRlZAotCSAgIElDTVAvVENQIFJTVCBwYWNrZXRzIGluIG90aGVyIGRpcmVjdGlvbi4gIEFjdHVhbCBwYWNrZXQKLQkgICB3aGljaCBjcmVhdGVkIGNvbm5lY3Rpb24gd2lsbCBiZSBJUF9DVF9ORVcgb3IgZm9yIGFuCi0JICAgZXhwZWN0ZWQgY29ubmVjdGlvbiwgSVBfQ1RfUkVMQVRFRC4gKi8KLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pICE9IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCXpvbmUgPSBuZl9jdF96b25lKGN0KTsKLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0KLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQkvKiByZXVzZSB0aGUgaGFzaCBzYXZlZCBiZWZvcmUgKi8KLQkJaGFzaCA9ICoodW5zaWduZWQgbG9uZyAqKSZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0uaG5ub2RlLnBwcmV2OwotCQloYXNoID0gc2NhbGVfaGFzaChoYXNoKTsKLQkJcmVwbHlfaGFzaCA9IGhhc2hfY29ubnRyYWNrKG5ldCwKLQkJCQkJICAgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSk7Ci0KLQl9IHdoaWxlIChuZl9jb25udHJhY2tfZG91YmxlX2xvY2sobmV0LCBoYXNoLCByZXBseV9oYXNoLCBzZXF1ZW5jZSkpOwotCi0JLyogV2UncmUgbm90IGluIGhhc2ggdGFibGUsIGFuZCB3ZSByZWZ1c2UgdG8gc2V0IHVwIHJlbGF0ZWQKLQkgKiBjb25uZWN0aW9ucyBmb3IgdW5jb25maXJtZWQgY29ubnMuICBCdXQgcGFja2V0IGNvcGllcyBhbmQKLQkgKiBSRUpFQ1Qgd2lsbCBnaXZlIHNwdXJpb3VzIHdhcm5pbmdzIGhlcmUuCi0JICovCi0KLQkvKiBBbm90aGVyIHNrYiB3aXRoIHRoZSBzYW1lIHVuY29uZmlybWVkIGNvbm50cmFjayBtYXkKLQkgKiB3aW4gdGhlIHJhY2UuIFRoaXMgbWF5IGhhcHBlbiBmb3IgYnJpZGdlKGJyX2Zsb29kKQotCSAqIG9yIGJyb2FkY2FzdC9tdWx0aWNhc3QgcGFja2V0cyBkbyBza2JfY2xvbmUgd2l0aAotCSAqIHVuY29uZmlybWVkIGNvbm50cmFjay4KLQkgKi8KLQlpZiAodW5saWtlbHkobmZfY3RfaXNfY29uZmlybWVkKGN0KSkpIHsKLQkJV0FSTl9PTl9PTkNFKDEpOwotCQluZl9jb25udHJhY2tfZG91YmxlX3VubG9jayhoYXNoLCByZXBseV9oYXNoKTsKLQkJbG9jYWxfYmhfZW5hYmxlKCk7Ci0JCXJldHVybiBORl9EUk9QOwotCX0KLQotCXByX2RlYnVnKCJDb25maXJtaW5nIGNvbm50cmFjayAlcFxuIiwgY3QpOwotCS8qIFdlIGhhdmUgdG8gY2hlY2sgdGhlIERZSU5HIGZsYWcgYWZ0ZXIgdW5saW5rIHRvIHByZXZlbnQKLQkgKiBhIHJhY2UgYWdhaW5zdCBuZl9jdF9nZXRfbmV4dF9jb3Jwc2UoKSBwb3NzaWJseSBjYWxsZWQgZnJvbQotCSAqIHVzZXIgY29udGV4dCwgZWxzZSB3ZSBpbnNlcnQgYW4gYWxyZWFkeSAnZGVhZCcgaGFzaCwgYmxvY2tpbmcKLQkgKiBmdXJ0aGVyIHVzZSBvZiB0aGF0IHBhcnRpY3VsYXIgY29ubmVjdGlvbiAtSk0uCi0JICovCi0JbmZfY3RfZGVsX2Zyb21fZHlpbmdfb3JfdW5jb25maXJtZWRfbGlzdChjdCk7Ci0KLQlpZiAodW5saWtlbHkobmZfY3RfaXNfZHlpbmcoY3QpKSkgewotCQluZl9jdF9hZGRfdG9fZHlpbmdfbGlzdChjdCk7Ci0JCU5GX0NUX1NUQVRfSU5DKG5ldCwgaW5zZXJ0X2ZhaWxlZCk7Ci0JCWdvdG8gZHlpbmc7Ci0JfQotCi0JLyogU2VlIGlmIHRoZXJlJ3Mgb25lIGluIHRoZSBsaXN0IGFscmVhZHksIGluY2x1ZGluZyByZXZlcnNlOgotCSAgIE5BVCBjb3VsZCBoYXZlIGdyYWJiZWQgaXQgd2l0aG91dCByZWFsaXppbmcsIHNpbmNlIHdlJ3JlCi0JICAgbm90IGluIHRoZSBoYXNoLiAgSWYgdGhlcmUgaXMsIHdlIGxvc3QgcmFjZS4gKi8KLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbaGFzaF0sIGhubm9kZSkKLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLAotCQkJCSAgICB6b25lLCBuZXQpKQotCQkJZ290byBvdXQ7Ci0KLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBuLCAmbmZfY29ubnRyYWNrX2hhc2hbcmVwbHlfaGFzaF0sIGhubm9kZSkKLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCAmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLAotCQkJCSAgICB6b25lLCBuZXQpKQotCQkJZ290byBvdXQ7Ci0KLQkvKiBUaW1lciByZWxhdGl2ZSB0byBjb25maXJtYXRpb24gdGltZSwgbm90IG9yaWdpbmFsCi0JICAgc2V0dGluZyB0aW1lLCBvdGhlcndpc2Ugd2UnZCBnZXQgdGltZXIgd3JhcCBpbgotCSAgIHdlaXJkIGRlbGF5IGNhc2VzLiAqLwotCWN0LT50aW1lb3V0ICs9IG5mY3RfdGltZV9zdGFtcDsKLQotCV9fbmZfY29ubnRyYWNrX2luc2VydF9wcmVwYXJlKGN0KTsKLQotCS8qIFNpbmNlIHRoZSBsb29rdXAgaXMgbG9ja2xlc3MsIGhhc2ggaW5zZXJ0aW9uIG11c3QgYmUgZG9uZSBhZnRlcgotCSAqIHN0YXJ0aW5nIHRoZSB0aW1lciBhbmQgc2V0dGluZyB0aGUgQ09ORklSTUVEIGJpdC4gVGhlIFJDVSBiYXJyaWVycwotCSAqIGd1YXJhbnRlZSB0aGF0IG5vIG90aGVyIENQVSBjYW4gZmluZCB0aGUgY29ubnRyYWNrIGJlZm9yZSB0aGUgYWJvdmUKLQkgKiBzdG9yZXMgYXJlIHZpc2libGUuCi0JICovCi0JX19uZl9jb25udHJhY2tfaGFzaF9pbnNlcnQoY3QsIGhhc2gsIHJlcGx5X2hhc2gpOwotCW5mX2Nvbm50cmFja19kb3VibGVfdW5sb2NrKGhhc2gsIHJlcGx5X2hhc2gpOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotCi0JaGVscCA9IG5mY3RfaGVscChjdCk7Ci0JaWYgKGhlbHAgJiYgaGVscC0+aGVscGVyKQotCQluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9IRUxQRVIsIGN0KTsKLQotCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShtYXN0ZXJfY3QoY3QpID8KLQkJCQkgSVBDVF9SRUxBVEVEIDogSVBDVF9ORVcsIGN0KTsKLQlyZXR1cm4gTkZfQUNDRVBUOwotCi1vdXQ6Ci0JcmV0ID0gbmZfY3RfcmVzb2x2ZV9jbGFzaChza2IsIGgsIHJlcGx5X2hhc2gpOwotZHlpbmc6Ci0JbmZfY29ubnRyYWNrX2RvdWJsZV91bmxvY2soaGFzaCwgcmVwbHlfaGFzaCk7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fbmZfY29ubnRyYWNrX2NvbmZpcm0pOwotCi0vKiBSZXR1cm5zIHRydWUgaWYgYSBjb25uZWN0aW9uIGNvcnJlc3BvbmRpbmdzIHRvIHRoZSB0dXBsZSAocmVxdWlyZWQKLSAgIGZvciBOQVQpLiAqLwotaW50Ci1uZl9jb25udHJhY2tfdHVwbGVfdGFrZW4oY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmlnbm9yZWRfY29ubnRyYWNrKQotewotCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChpZ25vcmVkX2Nvbm50cmFjayk7Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja196b25lICp6b25lOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqY3RfaGFzaDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgaHNpemU7Ci0Jc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0Jem9uZSA9IG5mX2N0X3pvbmUoaWdub3JlZF9jb25udHJhY2spOwotCi0JcmN1X3JlYWRfbG9jaygpOwotIGJlZ2luOgotCW5mX2Nvbm50cmFja19nZXRfaHQoJmN0X2hhc2gsICZoc2l6ZSk7Ci0JaGFzaCA9IF9faGFzaF9jb25udHJhY2sobmV0LCB0dXBsZSwgaHNpemUpOwotCi0JaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2hhc2hdLCBobm5vZGUpIHsKLQkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwotCi0JCWlmIChjdCA9PSBpZ25vcmVkX2Nvbm50cmFjaykKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChuZl9jdF9pc19leHBpcmVkKGN0KSkgewotCQkJbmZfY3RfZ2NfZXhwaXJlZChjdCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChuZl9jdF9rZXlfZXF1YWwoaCwgdHVwbGUsIHpvbmUsIG5ldCkpIHsKLQkJCS8qIFR1cGxlIGlzIHRha2VuIGFscmVhZHksIHNvIGNhbGxlciB3aWxsIG5lZWQgdG8gZmluZAotCQkJICogYSBuZXcgc291cmNlIHBvcnQgdG8gdXNlLgotCQkJICoKLQkJCSAqIE9ubHkgZXhjZXB0aW9uOgotCQkJICogSWYgdGhlICpvcmlnaW5hbCB0dXBsZXMqIGFyZSBpZGVudGljYWwsIHRoZW4gYm90aAotCQkJICogY29ubnRyYWNrcyByZWZlciB0byB0aGUgc2FtZSBmbG93LgotCQkJICogVGhpcyBpcyBhIHJhcmUgc2l0dWF0aW9uLCBpdCBjYW4gb2NjdXIgZS5nLiB3aGVuCi0JCQkgKiBtb3JlIHRoYW4gb25lIFVEUCBwYWNrZXQgaXMgc2VudCBmcm9tIHNhbWUgc29ja2V0Ci0JCQkgKiBpbiBkaWZmZXJlbnQgdGhyZWFkcy4KLQkJCSAqCi0JCQkgKiBMZXQgbmZfY3RfcmVzb2x2ZV9jbGFzaCgpIGRlYWwgd2l0aCB0aGlzIGxhdGVyLgotCQkJICovCi0JCQlpZiAobmZfY3RfdHVwbGVfZXF1YWwoJmlnbm9yZWRfY29ubnRyYWNrLT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSwKLQkJCQkJICAgICAgJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZSkgJiYKLQkJCQkJICAgICAgbmZfY3Rfem9uZV9lcXVhbChjdCwgem9uZSwgSVBfQ1RfRElSX09SSUdJTkFMKSkKLQkJCQljb250aW51ZTsKLQotCQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgZm91bmQpOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQotCWlmIChnZXRfbnVsbHNfdmFsdWUobikgIT0gaGFzaCkgewotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBzZWFyY2hfcmVzdGFydCk7Ci0JCWdvdG8gYmVnaW47Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja190dXBsZV90YWtlbik7Ci0KLSNkZWZpbmUgTkZfQ1RfRVZJQ1RJT05fUkFOR0UJOAotCi0vKiBUaGVyZSdzIGEgc21hbGwgcmFjZSBoZXJlIHdoZXJlIHdlIG1heSBmcmVlIGEganVzdC1hc3N1cmVkCi0gICBjb25uZWN0aW9uLiAgVG9vIGJhZDogd2UncmUgaW4gdHJvdWJsZSBhbnl3YXkuICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGVhcmx5X2Ryb3BfbGlzdChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQl1bnNpZ25lZCBpbnQgZHJvcHMgPSAwOwotCXN0cnVjdCBuZl9jb25uICp0bXA7Ci0KLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoaCwgbiwgaGVhZCwgaG5ub2RlKSB7Ci0JCXRtcCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQkJaWYgKHRlc3RfYml0KElQU19PRkZMT0FEX0JJVCwgJnRtcC0+c3RhdHVzKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChuZl9jdF9pc19leHBpcmVkKHRtcCkpIHsKLQkJCW5mX2N0X2djX2V4cGlyZWQodG1wKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJnRtcC0+c3RhdHVzKSB8fAotCQkgICAgIW5ldF9lcShuZl9jdF9uZXQodG1wKSwgbmV0KSB8fAotCQkgICAgbmZfY3RfaXNfZHlpbmcodG1wKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghYXRvbWljX2luY19ub3RfemVybygmdG1wLT5jdF9nZW5lcmFsLnVzZSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBraWxsIG9ubHkgaWYgc3RpbGwgaW4gc2FtZSBuZXRucyAtLSBtaWdodCBoYXZlIG1vdmVkIGR1ZSB0bwotCQkgKiBTTEFCX1RZUEVTQUZFX0JZX1JDVSBydWxlcy4KLQkJICoKLQkJICogV2Ugc3RlYWwgdGhlIHRpbWVyIHJlZmVyZW5jZS4gIElmIHRoYXQgZmFpbHMgdGltZXIgaGFzCi0JCSAqIGFscmVhZHkgZmlyZWQgb3Igc29tZW9uZSBlbHNlIGRlbGV0ZWQgaXQuIEp1c3QgZHJvcCByZWYKLQkJICogYW5kIG1vdmUgdG8gbmV4dCBlbnRyeS4KLQkJICovCi0JCWlmIChuZXRfZXEobmZfY3RfbmV0KHRtcCksIG5ldCkgJiYKLQkJICAgIG5mX2N0X2lzX2NvbmZpcm1lZCh0bXApICYmCi0JCSAgICBuZl9jdF9kZWxldGUodG1wLCAwLCAwKSkKLQkJCWRyb3BzKys7Ci0KLQkJbmZfY3RfcHV0KHRtcCk7Ci0JfQotCi0JcmV0dXJuIGRyb3BzOwotfQotCi1zdGF0aWMgbm9pbmxpbmUgaW50IGVhcmx5X2Ryb3Aoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgaGFzaCkKLXsKLQl1bnNpZ25lZCBpbnQgaSwgYnVja2V0OwotCi0JZm9yIChpID0gMDsgaSA8IE5GX0NUX0VWSUNUSU9OX1JBTkdFOyBpKyspIHsKLQkJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7Ci0JCXVuc2lnbmVkIGludCBoc2l6ZSwgZHJvcHM7Ci0KLQkJcmN1X3JlYWRfbG9jaygpOwotCQluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaHNpemUpOwotCQlpZiAoIWkpCi0JCQlidWNrZXQgPSByZWNpcHJvY2FsX3NjYWxlKGhhc2gsIGhzaXplKTsKLQkJZWxzZQotCQkJYnVja2V0ID0gKGJ1Y2tldCArIDEpICUgaHNpemU7Ci0KLQkJZHJvcHMgPSBlYXJseV9kcm9wX2xpc3QobmV0LCAmY3RfaGFzaFtidWNrZXRdKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkJaWYgKGRyb3BzKSB7Ci0JCQlORl9DVF9TVEFUX0FERF9BVE9NSUMobmV0LCBlYXJseV9kcm9wLCBkcm9wcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgZ2Nfd29ya2VyX3NraXBfY3QoY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQotewotCXJldHVybiAhbmZfY3RfaXNfY29uZmlybWVkKGN0KSB8fCBuZl9jdF9pc19keWluZyhjdCk7Ci19Ci0KLXN0YXRpYyBib29sIGdjX3dvcmtlcl9jYW5fZWFybHlfZHJvcChjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwotCi0JaWYgKCF0ZXN0X2JpdChJUFNfQVNTVVJFRF9CSVQsICZjdC0+c3RhdHVzKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlsNHByb3RvID0gbmZfY3RfbDRwcm90b19maW5kKG5mX2N0X3Byb3RvbnVtKGN0KSk7Ci0JaWYgKGw0cHJvdG8tPmNhbl9lYXJseV9kcm9wICYmIGw0cHJvdG8tPmNhbl9lYXJseV9kcm9wKGN0KSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGdjX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JdW5zaWduZWQgbG9uZyBlbmRfdGltZSA9IGppZmZpZXMgKyBHQ19TQ0FOX01BWF9EVVJBVElPTjsKLQl1bnNpZ25lZCBpbnQgaSwgaGFzaHN6LCBuZl9jb25udHJhY2tfbWF4OTUgPSAwOwotCXVuc2lnbmVkIGxvbmcgbmV4dF9ydW4gPSBHQ19TQ0FOX0lOVEVSVkFMOwotCXN0cnVjdCBjb25udHJhY2tfZ2Nfd29yayAqZ2Nfd29yazsKLQlnY193b3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBjb25udHJhY2tfZ2Nfd29yaywgZHdvcmsud29yayk7Ci0KLQlpID0gZ2Nfd29yay0+bmV4dF9idWNrZXQ7Ci0JaWYgKGdjX3dvcmstPmVhcmx5X2Ryb3ApCi0JCW5mX2Nvbm50cmFja19tYXg5NSA9IG5mX2Nvbm50cmFja19tYXggLyAxMDB1ICogOTV1OwotCi0JZG8gewotCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7Ci0JCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpjdF9oYXNoOwotCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQkJc3RydWN0IG5mX2Nvbm4gKnRtcDsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQkJbmZfY29ubnRyYWNrX2dldF9odCgmY3RfaGFzaCwgJmhhc2hzeik7Ci0JCWlmIChpID49IGhhc2hzeikgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmY3RfaGFzaFtpXSwgaG5ub2RlKSB7Ci0JCQlzdHJ1Y3QgbmV0ICpuZXQ7Ci0KLQkJCXRtcCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQkJCWlmICh0ZXN0X2JpdChJUFNfT0ZGTE9BRF9CSVQsICZ0bXAtPnN0YXR1cykpIHsKLQkJCQluZl9jdF9vZmZsb2FkX3RpbWVvdXQodG1wKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKG5mX2N0X2lzX2V4cGlyZWQodG1wKSkgewotCQkJCW5mX2N0X2djX2V4cGlyZWQodG1wKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKG5mX2Nvbm50cmFja19tYXg5NSA9PSAwIHx8IGdjX3dvcmtlcl9za2lwX2N0KHRtcCkpCi0JCQkJY29udGludWU7Ci0KLQkJCW5ldCA9IG5mX2N0X25ldCh0bXApOwotCQkJaWYgKGF0b21pY19yZWFkKCZuZXQtPmN0LmNvdW50KSA8IG5mX2Nvbm50cmFja19tYXg5NSkKLQkJCQljb250aW51ZTsKLQotCQkJLyogbmVlZCB0byB0YWtlIHJlZmVyZW5jZSB0byBhdm9pZCBwb3NzaWJsZSByYWNlcyAqLwotCQkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZ0bXAtPmN0X2dlbmVyYWwudXNlKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKGdjX3dvcmtlcl9za2lwX2N0KHRtcCkpIHsKLQkJCQluZl9jdF9wdXQodG1wKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGdjX3dvcmtlcl9jYW5fZWFybHlfZHJvcCh0bXApKQotCQkJCW5mX2N0X2tpbGwodG1wKTsKLQotCQkJbmZfY3RfcHV0KHRtcCk7Ci0JCX0KLQotCQkvKiBjb3VsZCBjaGVjayBnZXRfbnVsbHNfdmFsdWUoKSBoZXJlIGFuZCByZXN0YXJ0IGlmIGN0Ci0JCSAqIHdhcyBtb3ZlZCB0byBhbm90aGVyIGNoYWluLiAgQnV0IGdpdmVuIGdjIGlzIGJlc3QtZWZmb3J0Ci0JCSAqIHdlIHdpbGwganVzdCBjb250aW51ZSB3aXRoIG5leHQgaGFzaCBzbG90LgotCQkgKi8KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCQlpKys7Ci0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZW5kX3RpbWUpICYmIGkgPCBoYXNoc3opIHsKLQkJCWdjX3dvcmstPm5leHRfYnVja2V0ID0gaTsKLQkJCW5leHRfcnVuID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoaSA8IGhhc2hzeik7Ci0KLQlpZiAoZ2Nfd29yay0+ZXhpdGluZykKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBFdmljdGlvbiB3aWxsIG5vcm1hbGx5IGhhcHBlbiBmcm9tIHRoZSBwYWNrZXQgcGF0aCwgYW5kIG5vdAotCSAqIGZyb20gdGhpcyBnYyB3b3JrZXIuCi0JICoKLQkgKiBUaGlzIHdvcmtlciBpcyBvbmx5IGhlcmUgdG8gcmVhcCBleHBpcmVkIGVudHJpZXMgd2hlbiBzeXN0ZW0gd2VudAotCSAqIGlkbGUgYWZ0ZXIgYSBidXN5IHBlcmlvZC4KLQkgKi8KLQlpZiAobmV4dF9ydW4pIHsKLQkJZ2Nfd29yay0+ZWFybHlfZHJvcCA9IGZhbHNlOwotCQlnY193b3JrLT5uZXh0X2J1Y2tldCA9IDA7Ci0JfQotCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmZ2Nfd29yay0+ZHdvcmssIG5leHRfcnVuKTsKLX0KLQotc3RhdGljIHZvaWQgY29ubnRyYWNrX2djX3dvcmtfaW5pdChzdHJ1Y3QgY29ubnRyYWNrX2djX3dvcmsgKmdjX3dvcmspCi17Ci0JSU5JVF9ERUZFUlJBQkxFX1dPUksoJmdjX3dvcmstPmR3b3JrLCBnY193b3JrZXIpOwotCWdjX3dvcmstPmV4aXRpbmcgPSBmYWxzZTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZl9jb25uICoKLV9fbmZfY29ubnRyYWNrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmUsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqb3JpZywKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXBsLAotCQkgICAgIGdmcF90IGdmcCwgdTMyIGhhc2gpCi17Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0JLyogV2UgZG9uJ3Qgd2FudCBhbnkgcmFjZSBjb25kaXRpb24gYXQgZWFybHkgZHJvcCBzdGFnZSAqLwotCWF0b21pY19pbmMoJm5ldC0+Y3QuY291bnQpOwotCi0JaWYgKG5mX2Nvbm50cmFja19tYXggJiYKLQkgICAgdW5saWtlbHkoYXRvbWljX3JlYWQoJm5ldC0+Y3QuY291bnQpID4gbmZfY29ubnRyYWNrX21heCkpIHsKLQkJaWYgKCFlYXJseV9kcm9wKG5ldCwgaGFzaCkpIHsKLQkJCWlmICghY29ubnRyYWNrX2djX3dvcmsuZWFybHlfZHJvcCkKLQkJCQljb25udHJhY2tfZ2Nfd29yay5lYXJseV9kcm9wID0gdHJ1ZTsKLQkJCWF0b21pY19kZWMoJm5ldC0+Y3QuY291bnQpOwotCQkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoIm5mX2Nvbm50cmFjazogdGFibGUgZnVsbCwgZHJvcHBpbmcgcGFja2V0XG4iKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBEbyBub3QgdXNlIGttZW1fY2FjaGVfemFsbG9jKCksIGFzIHRoaXMgY2FjaGUgdXNlcwotCSAqIFNMQUJfVFlQRVNBRkVfQllfUkNVLgotCSAqLwotCWN0ID0ga21lbV9jYWNoZV9hbGxvYyhuZl9jb25udHJhY2tfY2FjaGVwLCBnZnApOwotCWlmIChjdCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCXNwaW5fbG9ja19pbml0KCZjdC0+bG9jayk7Ci0JY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlID0gKm9yaWc7Ci0JY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLmhubm9kZS5wcHJldiA9IE5VTEw7Ci0JY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlID0gKnJlcGw7Ci0JLyogc2F2ZSBoYXNoIGZvciByZXVzaW5nIHdoZW4gY29uZmlybWluZyAqLwotCSoodW5zaWduZWQgbG9uZyAqKSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLmhubm9kZS5wcHJldikgPSBoYXNoOwotCWN0LT5zdGF0dXMgPSAwOwotCVdSSVRFX09OQ0UoY3QtPnRpbWVvdXQsIDApOwotCXdyaXRlX3BuZXQoJmN0LT5jdF9uZXQsIG5ldCk7Ci0JbWVtc2V0KCZjdC0+X19uZmN0X2luaXRfb2Zmc2V0LCAwLAotCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgbmZfY29ubiwgcHJvdG8pIC0KLQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IG5mX2Nvbm4sIF9fbmZjdF9pbml0X29mZnNldCkpOwotCi0JbmZfY3Rfem9uZV9hZGQoY3QsIHpvbmUpOwotCi0JLyogQmVjYXVzZSB3ZSB1c2UgUkNVIGxvb2t1cHMsIHdlIHNldCBjdF9nZW5lcmFsLnVzZSB0byB6ZXJvIGJlZm9yZQotCSAqIHRoaXMgaXMgaW5zZXJ0ZWQgaW4gYW55IGxpc3QuCi0JICovCi0JYXRvbWljX3NldCgmY3QtPmN0X2dlbmVyYWwudXNlLCAwKTsKLQlyZXR1cm4gY3Q7Ci1vdXQ6Ci0JYXRvbWljX2RlYygmbmV0LT5jdC5jb3VudCk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci19Ci0KLXN0cnVjdCBuZl9jb25uICpuZl9jb25udHJhY2tfYWxsb2Moc3RydWN0IG5ldCAqbmV0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZSwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpvcmlnLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnJlcGwsCi0JCQkJICAgZ2ZwX3QgZ2ZwKQotewotCXJldHVybiBfX25mX2Nvbm50cmFja19hbGxvYyhuZXQsIHpvbmUsIG9yaWcsIHJlcGwsIGdmcCwgMCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfYWxsb2MpOwotCi12b2lkIG5mX2Nvbm50cmFja19mcmVlKHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwotCi0JLyogQSBmcmVlZCBvYmplY3QgaGFzIHJlZmNudCA9PSAwLCB0aGF0J3MKLQkgKiB0aGUgZ29sZGVuIHJ1bGUgZm9yIFNMQUJfVFlQRVNBRkVfQllfUkNVCi0JICovCi0JV0FSTl9PTihhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSAhPSAwKTsKLQotCW5mX2N0X2V4dF9kZXN0cm95KGN0KTsKLQlrbWVtX2NhY2hlX2ZyZWUobmZfY29ubnRyYWNrX2NhY2hlcCwgY3QpOwotCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOwotCWF0b21pY19kZWMoJm5ldC0+Y3QuY291bnQpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2ZyZWUpOwotCi0KLS8qIEFsbG9jYXRlIGEgbmV3IGNvbm50cmFjazogd2UgcmV0dXJuIC1FTk9NRU0gaWYgY2xhc3NpZmljYXRpb24KLSAgIGZhaWxlZCBkdWUgdG8gc3RyZXNzLiAgT3RoZXJ3aXNlIGl0IHJlYWxseSBpcyB1bmNsYXNzaWZpYWJsZS4gKi8KLXN0YXRpYyBub2lubGluZSBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKgotaW5pdF9jb25udHJhY2soc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfY29ubiAqdG1wbCwKLQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgIHVuc2lnbmVkIGludCBkYXRhb2ZmLCB1MzIgaGFzaCkKLXsKLQlzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0Jc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHJlcGxfdHVwbGU7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmVjYWNoZTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgKnpvbmU7Ci0Jc3RydWN0IG5mX2Nvbm5fdGltZW91dCAqdGltZW91dF9leHQ7Ci0Jc3RydWN0IG5mX2Nvbm50cmFja196b25lIHRtcDsKLQlpbnQgZGlyID0gMDsKLQotCWlmICghbmZfY3RfaW52ZXJ0X3R1cGxlKCZyZXBsX3R1cGxlLCB0dXBsZSkpIHsKLQkJcHJfZGVidWcoIkNhbid0IGludmVydCB0dXBsZS5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl6b25lID0gbmZfY3Rfem9uZV90bXBsKHRtcGwsIHNrYiwgJnRtcCk7Ci0JY3QgPSBfX25mX2Nvbm50cmFja19hbGxvYyhuZXQsIHpvbmUsIHR1cGxlLCAmcmVwbF90dXBsZSwgR0ZQX0FUT01JQywKLQkJCQkgIGhhc2gpOwotCWlmIChJU19FUlIoY3QpKQotCQlyZXR1cm4gKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqKWN0OwotCQkKLSNpZmRlZiBDT05GSUdfRkFTVE5BVF9NT0RVTEUKLSAgICBSQ1VfSU5JVF9QT0lOVEVSKGN0LT5mYXN0X2N0LmZhc3RfZHN0W0lQX0NUX0RJUl9PUklHSU5BTF0sIE5VTEwpOwotICAgIFJDVV9JTklUX1BPSU5URVIoY3QtPmZhc3RfY3QuZmFzdF9kc3RbSVBfQ1RfRElSX1JFUExZXSwgTlVMTCk7Ci0gICAgY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbSVBfQ1RfRElSX09SSUdJTkFMXSA9IE5VTEw7Ci0gICAgY3QtPmZhc3RfY3QuZmFzdF9icnBvcnRbSVBfQ1RfRElSX1JFUExZXSAgICA9IE5VTEw7Ci0gICAgY3QtPmZhc3RfY3QuaXNGYXN0ID0gMDsgLy9DVF9GQVNUX05PVAotICAgIFJDVV9JTklUX1BPSU5URVIoY3QtPmZhc3RfY3Quc2ssIE5VTEwpOwotI2VuZGlmCi0JY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cyA9IDA7Ci0gICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMgICA9IDA7Ci0gICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cyAgICA9IDA7Ci0gICAgY3QtPnBhY2tldF9pbmZvW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMgICAgICA9IDA7Ci0JZm9yKGRpciA9IElQX0NUX0RJUl9PUklHSU5BTDsgZGlyIDwgSVBfQ1RfRElSX01BWDsgZGlyKyspCi0JewotCQljdC0+aW5kZXZbZGlyXSA9IE5VTEw7Ci0JCWN0LT5vdXRkZXZbZGlyXSA9IE5VTEw7Ci0JfQotCWlmICghbmZfY3RfYWRkX3N5bnByb3h5KGN0LCB0bXBsKSkgewotCQluZl9jb25udHJhY2tfZnJlZShjdCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCXRpbWVvdXRfZXh0ID0gdG1wbCA/IG5mX2N0X3RpbWVvdXRfZmluZCh0bXBsKSA6IE5VTEw7Ci0KLQlpZiAodGltZW91dF9leHQpCi0JCW5mX2N0X3RpbWVvdXRfZXh0X2FkZChjdCwgcmN1X2RlcmVmZXJlbmNlKHRpbWVvdXRfZXh0LT50aW1lb3V0KSwKLQkJCQkgICAgICBHRlBfQVRPTUlDKTsKLQotCW5mX2N0X2FjY3RfZXh0X2FkZChjdCwgR0ZQX0FUT01JQyk7Ci0JbmZfY3RfdHN0YW1wX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpOwotCW5mX2N0X2xhYmVsc19leHRfYWRkKGN0KTsKLQotCWVjYWNoZSA9IHRtcGwgPyBuZl9jdF9lY2FjaGVfZmluZCh0bXBsKSA6IE5VTEw7Ci0JbmZfY3RfZWNhY2hlX2V4dF9hZGQoY3QsIGVjYWNoZSA/IGVjYWNoZS0+Y3RtYXNrIDogMCwKLQkJCQkgZWNhY2hlID8gZWNhY2hlLT5leHBtYXNrIDogMCwKLQkJCSAgICAgR0ZQX0FUT01JQyk7Ci0KLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JaWYgKG5ldC0+Y3QuZXhwZWN0X2NvdW50KSB7Ci0JCXNwaW5fbG9jaygmbmZfY29ubnRyYWNrX2V4cGVjdF9sb2NrKTsKLQkJZXhwID0gbmZfY3RfZmluZF9leHBlY3RhdGlvbihuZXQsIHpvbmUsIHR1cGxlKTsKLQkJaWYgKGV4cCkgewotCQkJcHJfZGVidWcoImV4cGVjdGF0aW9uIGFycml2ZXMgY3Q9JXAgZXhwPSVwXG4iLAotCQkJCSBjdCwgZXhwKTsKLQkJCS8qIFdlbGNvbWUsIE1yLiBCb25kLiAgV2UndmUgYmVlbiBleHBlY3RpbmcgeW91Li4uICovCi0JCQlfX3NldF9iaXQoSVBTX0VYUEVDVEVEX0JJVCwgJmN0LT5zdGF0dXMpOwotCQkJLyogZXhwLT5tYXN0ZXIgc2FmZSwgcmVmY250IGJ1bXBlZCBpbiBuZl9jdF9maW5kX2V4cGVjdGF0aW9uICovCi0JCQljdC0+bWFzdGVyID0gZXhwLT5tYXN0ZXI7Ci0JCQlpZiAoZXhwLT5oZWxwZXIpIHsKLQkJCQloZWxwID0gbmZfY3RfaGVscGVyX2V4dF9hZGQoY3QsIEdGUF9BVE9NSUMpOwotCQkJCWlmIChoZWxwKQotCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoaGVscC0+aGVscGVyLCBleHAtPmhlbHBlcik7Ci0JCQl9Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksKLQkJCWN0LT5tYXJrID0gZXhwLT5tYXN0ZXItPm1hcms7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1NFQ01BUksKLQkJCWN0LT5zZWNtYXJrID0gZXhwLT5tYXN0ZXItPnNlY21hcms7Ci0jZW5kaWYKLQkJCU5GX0NUX1NUQVRfSU5DKG5ldCwgZXhwZWN0X25ldyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJm5mX2Nvbm50cmFja19leHBlY3RfbG9jayk7Ci0JfQotCWlmICghZXhwKQotCQlfX25mX2N0X3RyeV9hc3NpZ25faGVscGVyKGN0LCB0bXBsLCBHRlBfQVRPTUlDKTsKLQotCS8qIE5vdyBpdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSB1bmNvbmZpcm1lZCBsaXN0LCBidW1wIHJlZmNvdW50ICovCi0JbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwotCW5mX2N0X2FkZF90b191bmNvbmZpcm1lZF9saXN0KGN0KTsKLQotCWxvY2FsX2JoX2VuYWJsZSgpOwotCi0JaWYgKGV4cCkgewotCQlpZiAoZXhwLT5leHBlY3RmbikKLQkJCWV4cC0+ZXhwZWN0Zm4oY3QsIGV4cCk7Ci0JCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKLQl9Ci0KLQlyZXR1cm4gJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXTsKLX0KLQotLyogT24gc3VjY2VzcywgcmV0dXJucyAwLCBzZXRzIHNrYi0+X25mY3QgfCBjdGluZm8gKi8KLXN0YXRpYyBpbnQKLXJlc29sdmVfbm9ybWFsX2N0KHN0cnVjdCBuZl9jb25uICp0bXBsLAotCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgdW5zaWduZWQgaW50IGRhdGFvZmYsCi0JCSAgdV9pbnQ4X3QgcHJvdG9udW0sCi0JCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQotewotCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfem9uZSAqem9uZTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3pvbmUgdG1wOwotCXN0cnVjdCBuZl9jb25uICpjdDsKLQl1MzIgaGFzaDsKLQotCWlmICghbmZfY3RfZ2V0X3R1cGxlKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksCi0JCQkgICAgIGRhdGFvZmYsIHN0YXRlLT5wZiwgcHJvdG9udW0sIHN0YXRlLT5uZXQsCi0JCQkgICAgICZ0dXBsZSkpIHsKLQkJcHJfZGVidWcoIkNhbid0IGdldCB0dXBsZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGxvb2sgZm9yIHR1cGxlIG1hdGNoICovCi0Jem9uZSA9IG5mX2N0X3pvbmVfdG1wbCh0bXBsLCBza2IsICZ0bXApOwotCWhhc2ggPSBoYXNoX2Nvbm50cmFja19yYXcoJnR1cGxlLCBzdGF0ZS0+bmV0KTsKLQloID0gX19uZl9jb25udHJhY2tfZmluZF9nZXQoc3RhdGUtPm5ldCwgem9uZSwgJnR1cGxlLCBoYXNoKTsKLQlpZiAoIWgpIHsKLQkJaCA9IGluaXRfY29ubnRyYWNrKHN0YXRlLT5uZXQsIHRtcGwsICZ0dXBsZSwKLQkJCQkgICBza2IsIGRhdGFvZmYsIGhhc2gpOwotCQlpZiAoIWgpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKElTX0VSUihoKSkKLQkJCXJldHVybiBQVFJfRVJSKGgpOwotCX0KLQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQkvKiBJdCBleGlzdHM7IHdlIGhhdmUgKG5vbi1leGNsdXNpdmUpIHJlZmVyZW5jZS4gKi8KLQlpZiAoTkZfQ1RfRElSRUNUSU9OKGgpID09IElQX0NUX0RJUl9SRVBMWSkgewotCQljdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWTsKLQl9IGVsc2UgewotCQkvKiBPbmNlIHdlJ3ZlIGhhZCB0d28gd2F5IGNvbW1zLCBhbHdheXMgRVNUQUJMSVNIRUQuICovCi0JCWlmICh0ZXN0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkgewotCQkJcHJfZGVidWcoIm5vcm1hbCBwYWNrZXQgZm9yICVwXG4iLCBjdCk7Ci0JCQljdGluZm8gPSBJUF9DVF9FU1RBQkxJU0hFRDsKLQkJfSBlbHNlIGlmICh0ZXN0X2JpdChJUFNfRVhQRUNURURfQklULCAmY3QtPnN0YXR1cykpIHsKLQkJCXByX2RlYnVnKCJyZWxhdGVkIHBhY2tldCBmb3IgJXBcbiIsIGN0KTsKLQkJCWN0aW5mbyA9IElQX0NUX1JFTEFURUQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygibmV3IHBhY2tldCBmb3IgJXBcbiIsIGN0KTsKLQkJCWN0aW5mbyA9IElQX0NUX05FVzsKLQkJfQotCX0KLQluZl9jdF9zZXQoc2tiLCBjdCwgY3RpbmZvKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGljbXAgcGFja2V0cyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IHRvIGhhbmRsZSBlcnJvciBtZXNzYWdlcyB0aGF0IGFyZQotICogcmVsYXRlZCB0byBhIGNvbm5lY3Rpb24uCi0gKgotICogQ2FsbGVycyBuZWVkIHRvIGNoZWNrIGlmIHNrYiBoYXMgYSBjb25udHJhY2sgYXNzaWduZWQgd2hlbiB0aGlzCi0gKiBoZWxwZXIgcmV0dXJuczsgaW4gc3VjaCBjYXNlIHNrYiBiZWxvbmdzIHRvIGFuIGFscmVhZHkga25vd24gY29ubmVjdGlvbi4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2NvbGQKLW5mX2Nvbm50cmFja19oYW5kbGVfaWNtcChzdHJ1Y3QgbmZfY29ubiAqdG1wbCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJIHVuc2lnbmVkIGludCBkYXRhb2ZmLAotCQkJIHU4IHByb3RvbnVtLAotCQkJIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHN0YXRlLT5wZiA9PSBORlBST1RPX0lQVjQgJiYgcHJvdG9udW0gPT0gSVBQUk9UT19JQ01QKQotCQlyZXQgPSBuZl9jb25udHJhY2tfaWNtcHY0X2Vycm9yKHRtcGwsIHNrYiwgZGF0YW9mZiwgc3RhdGUpOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JZWxzZSBpZiAoc3RhdGUtPnBmID09IE5GUFJPVE9fSVBWNiAmJiBwcm90b251bSA9PSBJUFBST1RPX0lDTVBWNikKLQkJcmV0ID0gbmZfY29ubnRyYWNrX2ljbXB2Nl9lcnJvcih0bXBsLCBza2IsIGRhdGFvZmYsIHN0YXRlKTsKLSNlbmRpZgotCWVsc2UKLQkJcmV0dXJuIE5GX0FDQ0VQVDsKLQotCWlmIChyZXQgPD0gMCkKLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKHN0YXRlLT5uZXQsIGVycm9yKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wYWNrZXQoc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnRpbWVvdXQgPSBuZl9jdF90aW1lb3V0X2xvb2t1cChjdCk7Ci0KLQlpZiAoIXRpbWVvdXQpCi0JCXRpbWVvdXQgPSAmbmZfZ2VuZXJpY19wZXJuZXQobmZfY3RfbmV0KGN0KSktPnRpbWVvdXQ7Ci0KLQluZl9jdF9yZWZyZXNoX2FjY3QoY3QsIGN0aW5mbywgc2tiLCAqdGltZW91dCk7Ci0JcmV0dXJuIE5GX0FDQ0VQVDsKLX0KLQotLyogUmV0dXJucyB2ZXJkaWN0IGZvciBwYWNrZXQsIG9yIC0xIGZvciBpbnZhbGlkLiAqLwotc3RhdGljIGludCBuZl9jb25udHJhY2tfaGFuZGxlX3BhY2tldChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3dpdGNoIChuZl9jdF9wcm90b251bShjdCkpIHsKLQljYXNlIElQUFJPVE9fVENQOgotCQlyZXR1cm4gbmZfY29ubnRyYWNrX3RjcF9wYWNrZXQoY3QsIHNrYiwgZGF0YW9mZiwKLQkJCQkJICAgICAgIGN0aW5mbywgc3RhdGUpOwotCWNhc2UgSVBQUk9UT19VRFA6Ci0JCXJldHVybiBuZl9jb25udHJhY2tfdWRwX3BhY2tldChjdCwgc2tiLCBkYXRhb2ZmLAotCQkJCQkgICAgICAgY3RpbmZvLCBzdGF0ZSk7Ci0JY2FzZSBJUFBST1RPX0lDTVA6Ci0JCXJldHVybiBuZl9jb25udHJhY2tfaWNtcF9wYWNrZXQoY3QsIHNrYiwgY3RpbmZvLCBzdGF0ZSk7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLQljYXNlIElQUFJPVE9fSUNNUFY2OgotCQlyZXR1cm4gbmZfY29ubnRyYWNrX2ljbXB2Nl9wYWNrZXQoY3QsIHNrYiwgY3RpbmZvLCBzdGF0ZSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ1RfUFJPVE9fVURQTElURQotCWNhc2UgSVBQUk9UT19VRFBMSVRFOgotCQlyZXR1cm4gbmZfY29ubnRyYWNrX3VkcGxpdGVfcGFja2V0KGN0LCBza2IsIGRhdGFvZmYsCi0JCQkJCQkgICBjdGluZm8sIHN0YXRlKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19ORl9DVF9QUk9UT19TQ1RQCi0JY2FzZSBJUFBST1RPX1NDVFA6Ci0JCXJldHVybiBuZl9jb25udHJhY2tfc2N0cF9wYWNrZXQoY3QsIHNrYiwgZGF0YW9mZiwKLQkJCQkJCWN0aW5mbywgc3RhdGUpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX05GX0NUX1BST1RPX0RDQ1AKLQljYXNlIElQUFJPVE9fRENDUDoKLQkJcmV0dXJuIG5mX2Nvbm50cmFja19kY2NwX3BhY2tldChjdCwgc2tiLCBkYXRhb2ZmLAotCQkJCQkJY3RpbmZvLCBzdGF0ZSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ1RfUFJPVE9fR1JFCi0JY2FzZSBJUFBST1RPX0dSRToKLQkJcmV0dXJuIG5mX2Nvbm50cmFja19ncmVfcGFja2V0KGN0LCBza2IsIGRhdGFvZmYsCi0JCQkJCSAgICAgICBjdGluZm8sIHN0YXRlKTsKLSNlbmRpZgotCX0KLQotCXJldHVybiBnZW5lcmljX3BhY2tldChjdCwgc2tiLCBjdGluZm8pOwotfQotCi0jaWZkZWYgQ09ORklHX0ZBU1ROQVRfTU9EVUxFCi1pbnQgbmZfY29ubnRyYWNrX2hhbmRsZV9wYWNrZXRfZmFzdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZGF0YW9mZiwKLQkJCQkgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCi17Ci0JcmV0dXJuIG5mX2Nvbm50cmFja19oYW5kbGVfcGFja2V0KGN0LCBza2IsIGRhdGFvZmYsIGN0aW5mbywgc3RhdGUpOwotfQotCi12b2lkIG5mX2Nvbm50cmFja19wdXQoc3RydWN0IG5mX2Nvbm50cmFjayAqbmZjdCkKLXsgCi0gICAgaWYgKG5mY3QgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmbmZjdC0+dXNlKSl7Ci0gICAgICAgIGZhc3RfY29ubl9yZWxlYXNlKChzdHJ1Y3QgbmZfY29ubiAqKW5mY3QsIFJFTEVBU0VfQUxMX0RTVCB8IFJFTEVBU0VfQUxMX1NLKTsKLSAgICAgICAgbmZfY29ubnRyYWNrX2Rlc3Ryb3kobmZjdCk7Ci0gICAgfQotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX3B1dCk7Ci0jZW5kaWYKLQotCi0KLXVuc2lnbmVkIGludAotbmZfY29ubnRyYWNrX2luKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKLXsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QsICp0bXBsOwotCXVfaW50OF90IHByb3RvbnVtOwotCWludCBkYXRhb2ZmLCByZXQ7Ci0KLQl0bXBsID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7Ci0JaWYgKHRtcGwgfHwgY3RpbmZvID09IElQX0NUX1VOVFJBQ0tFRCkgewotCQkvKiBQcmV2aW91c2x5IHNlZW4gKGxvb3BiYWNrIG9yIHVudHJhY2tlZCk/ICBJZ25vcmUuICovCi0JCWlmICgodG1wbCAmJiAhbmZfY3RfaXNfdGVtcGxhdGUodG1wbCkpIHx8Ci0JCSAgICAgY3RpbmZvID09IElQX0NUX1VOVFJBQ0tFRCkKLQkJCXJldHVybiBORl9BQ0NFUFQ7Ci0JCXNrYi0+X25mY3QgPSAwOwotCX0KLQotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCi0JZGF0YW9mZiA9IGdldF9sNHByb3RvKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYiksIHN0YXRlLT5wZiwgJnByb3RvbnVtKTsKLQlpZiAoZGF0YW9mZiA8PSAwKSB7Ci0JCXByX2RlYnVnKCJub3QgcHJlcGFyZWQgdG8gdHJhY2sgeWV0IG9yIGVycm9yIG9jY3VycmVkXG4iKTsKLQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKHN0YXRlLT5uZXQsIGludmFsaWQpOwotCQlyZXQgPSBORl9BQ0NFUFQ7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChwcm90b251bSA9PSBJUFBST1RPX0lDTVAgfHwgcHJvdG9udW0gPT0gSVBQUk9UT19JQ01QVjYpIHsKLQkJcmV0ID0gbmZfY29ubnRyYWNrX2hhbmRsZV9pY21wKHRtcGwsIHNrYiwgZGF0YW9mZiwKLQkJCQkJICAgICAgIHByb3RvbnVtLCBzdGF0ZSk7Ci0JCWlmIChyZXQgPD0gMCkgewotCQkJcmV0ID0gLXJldDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCS8qIElDTVBbdjZdIHByb3RvY29sIHRyYWNrZXJzIG1heSBhc3NpZ24gb25lIGNvbm50cmFjay4gKi8KLQkJaWYgKHNrYi0+X25mY3QpCi0JCQlnb3RvIG91dDsKLQl9Ci1yZXBlYXQ6Ci0JcmV0ID0gcmVzb2x2ZV9ub3JtYWxfY3QodG1wbCwgc2tiLCBkYXRhb2ZmLAotCQkJCXByb3RvbnVtLCBzdGF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogVG9vIHN0cmVzc2VkIHRvIGRlYWwuICovCi0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhzdGF0ZS0+bmV0LCBkcm9wKTsKLQkJcmV0ID0gTkZfRFJPUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoIWN0KSB7Ci0JCS8qIE5vdCB2YWxpZCBwYXJ0IG9mIGEgY29ubmVjdGlvbiAqLwotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMoc3RhdGUtPm5ldCwgaW52YWxpZCk7Ci0JCXJldCA9IE5GX0FDQ0VQVDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gbmZfY29ubnRyYWNrX2hhbmRsZV9wYWNrZXQoY3QsIHNrYiwgZGF0YW9mZiwgY3RpbmZvLCBzdGF0ZSk7Ci0JaWYgKHJldCA8PSAwKSB7Ci0JCS8qIEludmFsaWQ6IGludmVyc2Ugb2YgdGhlIHJldHVybiBjb2RlIHRlbGxzCi0JCSAqIHRoZSBuZXRmaWx0ZXIgY29yZSB3aGF0IHRvIGRvICovCi0JCXByX2RlYnVnKCJuZl9jb25udHJhY2tfaW46IENhbid0IHRyYWNrIHdpdGggcHJvdG8gbW9kdWxlXG4iKTsKLQkJbmZfY29ubnRyYWNrX3B1dCgmY3QtPmN0X2dlbmVyYWwpOwotCQlza2ItPl9uZmN0ID0gMDsKLQkJLyogU3BlY2lhbCBjYXNlOiBUQ1AgdHJhY2tlciByZXBvcnRzIGFuIGF0dGVtcHQgdG8gcmVvcGVuIGEKLQkJICogY2xvc2VkL2Fib3J0ZWQgY29ubmVjdGlvbi4gV2UgaGF2ZSB0byBnbyBiYWNrIGFuZCBjcmVhdGUgYQotCQkgKiBmcmVzaCBjb25udHJhY2suCi0JCSAqLwotCQlpZiAocmV0ID09IC1ORl9SRVBFQVQpCi0JCQlnb3RvIHJlcGVhdDsKLQotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMoc3RhdGUtPm5ldCwgaW52YWxpZCk7Ci0JCWlmIChyZXQgPT0gLU5GX0RST1ApCi0JCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMoc3RhdGUtPm5ldCwgZHJvcCk7Ci0KLQkJcmV0ID0gLXJldDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChJUFNfU0VFTl9SRVBMWV9CSVQsICZjdC0+c3RhdHVzKSkKLQkJbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKElQQ1RfUkVQTFksIGN0KTsKLW91dDoKLQlpZiAodG1wbCkKLQkJbmZfY3RfcHV0KHRtcGwpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19pbik7Ci0KLS8qIEFsdGVyIHJlcGx5IHR1cGxlIChtYXliZSBhbHRlciBoZWxwZXIpLiAgVGhpcyBpcyBmb3IgTkFULCBhbmQgaXMKLSAgIGltcGxpY2l0bHkgcmFjeTogc2VlIF9fbmZfY29ubnRyYWNrX2NvbmZpcm0gKi8KLXZvaWQgbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm5ld3JlcGx5KQotewotCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHAgPSBuZmN0X2hlbHAoY3QpOwotCi0JLyogU2hvdWxkIGJlIHVuY29uZmlybWVkLCBzbyBub3QgaW4gaGFzaCB0YWJsZSB5ZXQgKi8KLQlXQVJOX09OKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpOwotCi0JcHJfZGVidWcoIkFsdGVyaW5nIHJlcGx5IHR1cGxlIG9mICVwIHRvICIsIGN0KTsKLQluZl9jdF9kdW1wX3R1cGxlKG5ld3JlcGx5KTsKLQotCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9ICpuZXdyZXBseTsKLQlpZiAoY3QtPm1hc3RlciB8fCAoaGVscCAmJiAhaGxpc3RfZW1wdHkoJmhlbHAtPmV4cGVjdGF0aW9ucykpKQotCQlyZXR1cm47Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JX19uZl9jdF90cnlfYXNzaWduX2hlbHBlcihjdCwgTlVMTCwgR0ZQX0FUT01JQyk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwotCi0vKiBSZWZyZXNoIGNvbm50cmFjayBmb3IgdGhpcyBtYW55IGppZmZpZXMgYW5kIGRvIGFjY291bnRpbmcgaWYgZG9fYWNjdCBpcyAxICovCi12b2lkIF9fbmZfY3RfcmVmcmVzaF9hY2N0KHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIHUzMiBleHRyYV9qaWZmaWVzLAotCQkJICBib29sIGRvX2FjY3QpCi17Ci0JLyogT25seSB1cGRhdGUgaWYgdGhpcyBpcyBub3QgYSBmaXhlZCB0aW1lb3V0ICovCi0JaWYgKHRlc3RfYml0KElQU19GSVhFRF9USU1FT1VUX0JJVCwgJmN0LT5zdGF0dXMpKQotCQlnb3RvIGFjY3Q7Ci0KLQkvKiBJZiBub3QgaW4gaGFzaCB0YWJsZSwgdGltZXIgd2lsbCBub3QgYmUgYWN0aXZlIHlldCAqLwotCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpKQotCQlleHRyYV9qaWZmaWVzICs9IG5mY3RfdGltZV9zdGFtcDsKLQotCWlmIChSRUFEX09OQ0UoY3QtPnRpbWVvdXQpICE9IGV4dHJhX2ppZmZpZXMpCi0JCVdSSVRFX09OQ0UoY3QtPnRpbWVvdXQsIGV4dHJhX2ppZmZpZXMpOwotYWNjdDoKLQlpZiAoZG9fYWNjdCkKLQkJbmZfY3RfYWNjdF91cGRhdGUoY3QsIENUSU5GTzJESVIoY3RpbmZvKSwgc2tiLT5sZW4pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF9yZWZyZXNoX2FjY3QpOwotCi1ib29sIG5mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQluZl9jdF9hY2N0X3VwZGF0ZShjdCwgQ1RJTkZPMkRJUihjdGluZm8pLCBza2ItPmxlbik7Ci0KLQlyZXR1cm4gbmZfY3RfZGVsZXRlKGN0LCAwLCAwKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2tpbGxfYWNjdCk7Ci0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotLyogR2VuZXJpYyBmdW5jdGlvbiBmb3IgdGNwL3VkcC9zY3RwL2RjY3AgYW5kIGFsaWtlLiAqLwotaW50IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmxhdHRyKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCi17Ci0JaWYgKG5sYV9wdXRfYmUxNihza2IsIENUQV9QUk9UT19TUkNfUE9SVCwgdHVwbGUtPnNyYy51LnRjcC5wb3J0KSB8fAotCSAgICBubGFfcHV0X2JlMTYoc2tiLCBDVEFfUFJPVE9fRFNUX1BPUlQsIHR1cGxlLT5kc3QudS50Y3AucG9ydCkpCi0JCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCXJldHVybiAwOwotCi1ubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIpOwotCi1jb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZl9jdF9wb3J0X25sYV9wb2xpY3lbQ1RBX1BST1RPX01BWCsxXSA9IHsKLQlbQ1RBX1BST1RPX1NSQ19QT1JUXSAgPSB7IC50eXBlID0gTkxBX1UxNiB9LAotCVtDVEFfUFJPVE9fRFNUX1BPUlRdICA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCi19OwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfcG9ydF9ubGFfcG9saWN5KTsKLQotaW50IG5mX2N0X3BvcnRfbmxhdHRyX3RvX3R1cGxlKHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdCwKLQkJCSAgICAgICB1X2ludDMyX3QgZmxhZ3MpCi17Ci0JaWYgKGZsYWdzICYgQ1RBX0ZJTFRFUl9GTEFHKENUQV9QUk9UT19TUkNfUE9SVCkpIHsKLQkJaWYgKCF0YltDVEFfUFJPVE9fU1JDX1BPUlRdKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJdC0+c3JjLnUudGNwLnBvcnQgPSBubGFfZ2V0X2JlMTYodGJbQ1RBX1BST1RPX1NSQ19QT1JUXSk7Ci0JfQotCi0JaWYgKGZsYWdzICYgQ1RBX0ZJTFRFUl9GTEFHKENUQV9QUk9UT19EU1RfUE9SVCkpIHsKLQkJaWYgKCF0YltDVEFfUFJPVE9fRFNUX1BPUlRdKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJdC0+ZHN0LnUudGNwLnBvcnQgPSBubGFfZ2V0X2JlMTYodGJbQ1RBX1BST1RPX0RTVF9QT1JUXSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9wb3J0X25sYXR0cl90b190dXBsZSk7Ci0KLXVuc2lnbmVkIGludCBuZl9jdF9wb3J0X25sYXR0cl90dXBsZV9zaXplKHZvaWQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBzaXplIF9fcmVhZF9tb3N0bHk7Ci0KLQlpZiAoIXNpemUpCi0JCXNpemUgPSBubGFfcG9saWN5X2xlbihuZl9jdF9wb3J0X25sYV9wb2xpY3ksIENUQV9QUk9UT19NQVggKyAxKTsKLQotCXJldHVybiBzaXplOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfcG9ydF9ubGF0dHJfdHVwbGVfc2l6ZSk7Ci0jZW5kaWYKLQotLyogVXNlZCBieSBpcHRfUkVKRUNUIGFuZCBpcDZ0X1JFSkVDVC4gKi8KLXN0YXRpYyB2b2lkIG5mX2Nvbm50cmFja19hdHRhY2goc3RydWN0IHNrX2J1ZmYgKm5za2IsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCi0JLyogVGhpcyBJQ01QIGlzIGluIHJldmVyc2UgZGlyZWN0aW9uIHRvIHRoZSBwYWNrZXQgd2hpY2ggY2F1c2VkIGl0ICovCi0JY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoQ1RJTkZPMkRJUihjdGluZm8pID09IElQX0NUX0RJUl9PUklHSU5BTCkKLQkJY3RpbmZvID0gSVBfQ1RfUkVMQVRFRF9SRVBMWTsKLQllbHNlCi0JCWN0aW5mbyA9IElQX0NUX1JFTEFURUQ7Ci0KLQkvKiBBdHRhY2ggdG8gbmV3IHNrYnVmZiwgYW5kIGluY3JlbWVudCBjb3VudCAqLwotCW5mX2N0X3NldChuc2tiLCBjdCwgY3RpbmZvKTsKLQluZl9jb25udHJhY2tfZ2V0KHNrYl9uZmN0KG5za2IpKTsKLX0KLQotc3RhdGljIGludCBfX25mX2Nvbm50cmFja191cGRhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkJIGVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHR1cGxlOwotCXN0cnVjdCBuZl9uYXRfaG9vayAqbmF0X2hvb2s7Ci0JdW5zaWduZWQgaW50IHN0YXR1czsKLQlpbnQgZGF0YW9mZjsKLQl1MTYgbDNudW07Ci0JdTggbDRudW07Ci0KLQlsM251bSA9IG5mX2N0X2wzbnVtKGN0KTsKLQotCWRhdGFvZmYgPSBnZXRfbDRwcm90byhza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLCBsM251bSwgJmw0bnVtKTsKLQlpZiAoZGF0YW9mZiA8PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIW5mX2N0X2dldF90dXBsZShza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLCBkYXRhb2ZmLCBsM251bSwKLQkJCSAgICAgbDRudW0sIG5ldCwgJnR1cGxlKSkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKGN0LT5zdGF0dXMgJiBJUFNfU1JDX05BVCkgewotCQltZW1jcHkodHVwbGUuc3JjLnUzLmFsbCwKLQkJICAgICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuYWxsLAotCQkgICAgICAgc2l6ZW9mKHR1cGxlLnNyYy51My5hbGwpKTsKLQkJdHVwbGUuc3JjLnUuYWxsID0KLQkJCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudS5hbGw7Ci0JfQotCi0JaWYgKGN0LT5zdGF0dXMgJiBJUFNfRFNUX05BVCkgewotCQltZW1jcHkodHVwbGUuZHN0LnUzLmFsbCwKLQkJICAgICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudTMuYWxsLAotCQkgICAgICAgc2l6ZW9mKHR1cGxlLmRzdC51My5hbGwpKTsKLQkJdHVwbGUuZHN0LnUuYWxsID0KLQkJCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QudS5hbGw7Ci0JfQotCi0JaCA9IG5mX2Nvbm50cmFja19maW5kX2dldChuZXQsIG5mX2N0X3pvbmUoY3QpLCAmdHVwbGUpOwotCWlmICghaCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTdG9yZSBzdGF0dXMgYml0cyBvZiB0aGUgY29ubnRyYWNrIHRoYXQgaXMgY2xhc2hpbmcgdG8gcmUtZG8gTkFUCi0JICogbWFuZ2xpbmcgYWNjb3JkaW5nIHRvIHdoYXQgaXQgaGFzIGJlZW4gZG9uZSBhbHJlYWR5IHRvIHRoaXMgcGFja2V0LgotCSAqLwotCXN0YXR1cyA9IGN0LT5zdGF0dXM7Ci0KLQluZl9jdF9wdXQoY3QpOwotCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQluZl9jdF9zZXQoc2tiLCBjdCwgY3RpbmZvKTsKLQotCW5hdF9ob29rID0gcmN1X2RlcmVmZXJlbmNlKG5mX25hdF9ob29rKTsKLQlpZiAoIW5hdF9ob29rKQotCQlyZXR1cm4gMDsKLQotCWlmIChzdGF0dXMgJiBJUFNfU1JDX05BVCAmJgotCSAgICBuYXRfaG9vay0+bWFuaXBfcGt0KHNrYiwgY3QsIE5GX05BVF9NQU5JUF9TUkMsCi0JCQkJSVBfQ1RfRElSX09SSUdJTkFMKSA9PSBORl9EUk9QKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoc3RhdHVzICYgSVBTX0RTVF9OQVQgJiYKLQkgICAgbmF0X2hvb2stPm1hbmlwX3BrdChza2IsIGN0LCBORl9OQVRfTUFOSVBfRFNULAotCQkJCUlQX0NUX0RJUl9PUklHSU5BTCkgPT0gTkZfRFJPUCkKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgcGFja2V0IGlzIGNvbWluZyBmcm9tIHVzZXJzcGFjZSB2aWEgbmZfcXVldWUsIGNvbXBsZXRlIHRoZSBwYWNrZXQKLSAqIHByb2Nlc3NpbmcgYWZ0ZXIgdGhlIGhlbHBlciBpbnZvY2F0aW9uIGluIG5mX2NvbmZpcm0oKS4KLSAqLwotc3RhdGljIGludCBuZl9jb25maXJtX2N0aGVscGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICAgICBlbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwotCWNvbnN0IHN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7Ci0JaW50IHByb3RvZmY7Ci0KLQloZWxwID0gbmZjdF9oZWxwKGN0KTsKLQlpZiAoIWhlbHApCi0JCXJldHVybiAwOwotCi0JaGVscGVyID0gcmN1X2RlcmVmZXJlbmNlKGhlbHAtPmhlbHBlcik7Ci0JaWYgKCEoaGVscGVyLT5mbGFncyAmIE5GX0NUX0hFTFBFUl9GX1VTRVJTUEFDRSkpCi0JCXJldHVybiAwOwotCi0Jc3dpdGNoIChuZl9jdF9sM251bShjdCkpIHsKLQljYXNlIE5GUFJPVE9fSVBWNDoKLQkJcHJvdG9mZiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpICsgaXBfaGRybGVuKHNrYik7Ci0JCWJyZWFrOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JY2FzZSBORlBST1RPX0lQVjY6IHsKLQkJX19iZTE2IGZyYWdfb2ZmOwotCQl1OCBwbnVtOwotCi0JCXBudW0gPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwotCQlwcm90b2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksICZwbnVtLAotCQkJCQkgICAmZnJhZ19vZmYpOwotCQlpZiAocHJvdG9mZiA8IDAgfHwgKGZyYWdfb2ZmICYgaHRvbnMofjB4NykpICE9IDApCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JfQotI2VuZGlmCi0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHRlc3RfYml0KElQU19TRVFfQURKVVNUX0JJVCwgJmN0LT5zdGF0dXMpICYmCi0JICAgICFuZl9pc19sb29wYmFja19wYWNrZXQoc2tiKSkgewotCQlpZiAoIW5mX2N0X3NlcV9hZGp1c3Qoc2tiLCBjdCwgY3RpbmZvLCBwcm90b2ZmKSkgewotCQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5mX2N0X25ldChjdCksIGRyb3ApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyogV2UndmUgc2VlbiBpdCBjb21pbmcgb3V0IHRoZSBvdGhlciBzaWRlOiBjb25maXJtIGl0ICovCi0JcmV0dXJuIG5mX2Nvbm50cmFja19jb25maXJtKHNrYikgPT0gTkZfRFJPUCA/IC0gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmZfY29ubnRyYWNrX3VwZGF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCWludCBlcnI7Ci0KLQljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCWlmICghY3QpCi0JCXJldHVybiAwOwotCi0JaWYgKCFuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7Ci0JCWVyciA9IF9fbmZfY29ubnRyYWNrX3VwZGF0ZShuZXQsIHNrYiwgY3QsIGN0aW5mbyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQotCQljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwotCX0KLQotCXJldHVybiBuZl9jb25maXJtX2N0aGVscGVyKHNrYiwgY3QsIGN0aW5mbyk7Ci19Ci0KLXN0YXRpYyBib29sIG5mX2Nvbm50cmFja19nZXRfdHVwbGVfc2tiKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKmRzdF90dXBsZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpzcmNfdHVwbGU7Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgc3JjdHVwbGU7Ci0JZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0JY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKLQlpZiAoY3QpIHsKLQkJc3JjX3R1cGxlID0gbmZfY3RfdHVwbGUoY3QsIENUSU5GTzJESVIoY3RpbmZvKSk7Ci0JCW1lbWNweShkc3RfdHVwbGUsIHNyY190dXBsZSwgc2l6ZW9mKCpkc3RfdHVwbGUpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JaWYgKCFuZl9jdF9nZXRfdHVwbGVwcihza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAotCQkJICAgICAgIE5GUFJPVE9fSVBWNCwgZGV2X25ldChza2ItPmRldiksCi0JCQkgICAgICAgJnNyY3R1cGxlKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaGFzaCA9IG5mX2Nvbm50cmFja19maW5kX2dldChkZXZfbmV0KHNrYi0+ZGV2KSwKLQkJCQkgICAgICZuZl9jdF96b25lX2RmbHQsCi0JCQkJICAgICAmc3JjdHVwbGUpOwotCWlmICghaGFzaCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGhhc2gpOwotCXNyY190dXBsZSA9IG5mX2N0X3R1cGxlKGN0LCAhaGFzaC0+dHVwbGUuZHN0LmRpcik7Ci0JbWVtY3B5KGRzdF90dXBsZSwgc3JjX3R1cGxlLCBzaXplb2YoKmRzdF90dXBsZSkpOwotCW5mX2N0X3B1dChjdCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyogQnJpbmcgb3V0IHlhIGRlYWQhICovCi1zdGF0aWMgc3RydWN0IG5mX2Nvbm4gKgotZ2V0X25leHRfY29ycHNlKGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwKLQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50ICpidWNrZXQpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCXN0cnVjdCBuZl9jb25uICpjdDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQlzcGlubG9ja190ICpsb2NrcDsKLQotCWZvciAoOyAqYnVja2V0IDwgbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOyAoKmJ1Y2tldCkrKykgewotCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaHNsb3QgPSAmbmZfY29ubnRyYWNrX2hhc2hbKmJ1Y2tldF07Ci0KLQkJaWYgKGhsaXN0X251bGxzX2VtcHR5KGhzbG90KSkKLQkJCWNvbnRpbnVlOwotCi0JCWxvY2twID0gJm5mX2Nvbm50cmFja19sb2Nrc1sqYnVja2V0ICUgQ09OTlRSQUNLX0xPQ0tTXTsKLQkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQluZl9jb25udHJhY2tfbG9jayhsb2NrcCk7Ci0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGgsIG4sIGhzbG90LCBobm5vZGUpIHsKLQkJCWlmIChORl9DVF9ESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX1JFUExZKQotCQkJCWNvbnRpbnVlOwotCQkJLyogQWxsIG5mX2Nvbm4gb2JqZWN0cyBhcmUgYWRkZWQgdG8gaGFzaCB0YWJsZSB0d2ljZSwgb25lCi0JCQkgKiBmb3Igb3JpZ2luYWwgZGlyZWN0aW9uIHR1cGxlLCBvbmNlIGZvciB0aGUgcmVwbHkgdHVwbGUuCi0JCQkgKgotCQkJICogRXhjZXB0aW9uOiBJbiB0aGUgSVBTX05BVF9DTEFTSCBjYXNlLCBvbmx5IHRoZSByZXBseQotCQkJICogdHVwbGUgaXMgYWRkZWQgKHRoZSBvcmlnaW5hbCB0dXBsZSBhbHJlYWR5IGV4aXN0ZWQgZm9yCi0JCQkgKiBhIGRpZmZlcmVudCBvYmplY3QpLgotCQkJICoKLQkJCSAqIFdlIG9ubHkgbmVlZCB0byBjYWxsIHRoZSBpdGVyYXRvciBvbmNlIGZvciBlYWNoCi0JCQkgKiBjb25udHJhY2ssIHNvIHdlIGp1c3QgdXNlIHRoZSAncmVwbHknIGRpcmVjdGlvbgotCQkJICogdHVwbGUgd2hpbGUgaXRlcmF0aW5nLgotCQkJICovCi0JCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCQlpZiAoaXRlcihjdCwgZGF0YSkpCi0JCQkJZ290byBmb3VuZDsKLQkJfQotCQlzcGluX3VubG9jayhsb2NrcCk7Ci0JCWxvY2FsX2JoX2VuYWJsZSgpOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLWZvdW5kOgotCWF0b21pY19pbmMoJmN0LT5jdF9nZW5lcmFsLnVzZSk7Ci0Jc3Bpbl91bmxvY2sobG9ja3ApOwotCWxvY2FsX2JoX2VuYWJsZSgpOwotCXJldHVybiBjdDsKLX0KLQotc3RhdGljIHZvaWQgbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwKLQkJCQkgIHZvaWQgKmRhdGEsIHUzMiBwb3J0aWQsIGludCByZXBvcnQpCi17Ci0JdW5zaWduZWQgaW50IGJ1Y2tldCA9IDA7Ci0Jc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCW11dGV4X2xvY2soJm5mX2Nvbm50cmFja19tdXRleCk7Ci0Jd2hpbGUgKChjdCA9IGdldF9uZXh0X2NvcnBzZShpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewotCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCi0KLQkJbmZfY3RfZGVsZXRlKGN0LCBwb3J0aWQsIHJlcG9ydCk7Ci0JCW5mX2N0X3B1dChjdCk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQltdXRleF91bmxvY2soJm5mX2Nvbm50cmFja19tdXRleCk7Ci19Ci0KLXN0cnVjdCBpdGVyX2RhdGEgewotCWludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKTsKLQl2b2lkICpkYXRhOwotCXN0cnVjdCBuZXQgKm5ldDsKLX07Ci0KLXN0YXRpYyBpbnQgaXRlcl9uZXRfb25seShzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXRlcl9kYXRhICpkID0gZGF0YTsKLQotCWlmICghbmV0X2VxKGQtPm5ldCwgbmZfY3RfbmV0KGkpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZC0+aXRlcihpLCBkLT5kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQKLV9fbmZfY3RfdW5jb25maXJtZWRfZGVzdHJveShzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwotCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQkJc3RydWN0IGN0X3BjcHUgKnBjcHU7Ci0KLQkJcGNwdSA9IHBlcl9jcHVfcHRyKG5ldC0+Y3QucGNwdV9saXN0cywgY3B1KTsKLQotCQlzcGluX2xvY2tfYmgoJnBjcHUtPmxvY2spOwotCQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShoLCBuLCAmcGNwdS0+dW5jb25maXJtZWQsIGhubm9kZSkgewotCQkJc3RydWN0IG5mX2Nvbm4gKmN0OwotCi0JCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0KLQkJCS8qIHdlIGNhbm5vdCBjYWxsIGl0ZXIoKSBvbiB1bmNvbmZpcm1lZCBsaXN0LCB0aGUKLQkJCSAqIG93bmluZyBjcHUgY2FuIHJlYWxsb2NhdGUgY3QtPmV4dCBhdCBhbnkgdGltZS4KLQkJCSAqLwotCQkJc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBjcHUtPmxvY2spOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci19Ci0KLXZvaWQgbmZfY3RfdW5jb25maXJtZWRfZGVzdHJveShzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0JbWlnaHRfc2xlZXAoKTsKLQotCWlmIChhdG9taWNfcmVhZCgmbmV0LT5jdC5jb3VudCkgPiAwKSB7Ci0JCV9fbmZfY3RfdW5jb25maXJtZWRfZGVzdHJveShuZXQpOwotCQluZl9xdWV1ZV9uZl9ob29rX2Ryb3AobmV0KTsKLQkJc3luY2hyb25pemVfbmV0KCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfdW5jb25maXJtZWRfZGVzdHJveSk7Ci0KLXZvaWQgbmZfY3RfaXRlcmF0ZV9jbGVhbnVwX25ldChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgICAgICAgaW50ICgqaXRlcikoc3RydWN0IG5mX2Nvbm4gKmksIHZvaWQgKmRhdGEpLAotCQkJICAgICAgIHZvaWQgKmRhdGEsIHUzMiBwb3J0aWQsIGludCByZXBvcnQpCi17Ci0Jc3RydWN0IGl0ZXJfZGF0YSBkOwotCi0JbWlnaHRfc2xlZXAoKTsKLQotCWlmIChhdG9taWNfcmVhZCgmbmV0LT5jdC5jb3VudCkgPT0gMCkKLQkJcmV0dXJuOwotCi0JZC5pdGVyID0gaXRlcjsKLQlkLmRhdGEgPSBkYXRhOwotCWQubmV0ID0gbmV0OwotCi0JbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGl0ZXJfbmV0X29ubHksICZkLCBwb3J0aWQsIHJlcG9ydCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9pdGVyYXRlX2NsZWFudXBfbmV0KTsKLQotLyoqCi0gKiBuZl9jdF9pdGVyYXRlX2Rlc3Ryb3kgLSBkZXN0cm95IHVuY29uZmlybWVkIGNvbm50cmFja3MgYW5kIGl0ZXJhdGUgdGFibGUKLSAqIEBpdGVyOiBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggY29ubnRyYWNrCi0gKiBAZGF0YTogZGF0YSB0byBwYXNzIHRvIEBpdGVyCi0gKgotICogTGlrZSBuZl9jdF9pdGVyYXRlX2NsZWFudXAsIGJ1dCBmaXJzdCBtYXJrcyBjb25udHJhY2tzIG9uIHRoZQotICogdW5jb25maXJtZWQgbGlzdCBhcyBkeWluZyAoc28gdGhleSB3aWxsIG5vdCBiZSBpbnNlcnRlZCBpbnRvCi0gKiBtYWluIHRhYmxlKS4KLSAqCi0gKiBDYW4gb25seSBiZSBjYWxsZWQgaW4gbW9kdWxlIGV4aXQgcGF0aC4KLSAqLwotdm9pZAotbmZfY3RfaXRlcmF0ZV9kZXN0cm95KGludCAoKml0ZXIpKHN0cnVjdCBuZl9jb25uICppLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0ICpuZXQ7Ci0KLQlkb3duX3JlYWQoJm5ldF9yd3NlbSk7Ci0JZm9yX2VhY2hfbmV0KG5ldCkgewotCQlpZiAoYXRvbWljX3JlYWQoJm5ldC0+Y3QuY291bnQpID09IDApCi0JCQljb250aW51ZTsKLQkJX19uZl9jdF91bmNvbmZpcm1lZF9kZXN0cm95KG5ldCk7Ci0JCW5mX3F1ZXVlX25mX2hvb2tfZHJvcChuZXQpOwotCX0KLQl1cF9yZWFkKCZuZXRfcndzZW0pOwotCi0JLyogTmVlZCB0byB3YWl0IGZvciBuZXRucyBjbGVhbnVwIHdvcmtlciB0byBmaW5pc2gsIGlmIGl0cwotCSAqIHJ1bm5pbmcgLS0gaXQgbWlnaHQgaGF2ZSBkZWxldGVkIGEgbmV0IG5hbWVzcGFjZSBmcm9tCi0JICogdGhlIGdsb2JhbCBsaXN0LCBzbyBvdXIgX19uZl9jdF91bmNvbmZpcm1lZF9kZXN0cm95KCkgbWlnaHQKLQkgKiBub3QgaGF2ZSBhZmZlY3RlZCBhbGwgbmFtZXNwYWNlcy4KLQkgKi8KLQluZXRfbnNfYmFycmllcigpOwotCi0JLyogYSBjb25udHJhY2sgY291bGQgaGF2ZSBiZWVuIHVubGlua2VkIGZyb20gdW5jb25maXJtZWQgbGlzdAotCSAqIGJlZm9yZSB3ZSBncmFiYmVkIHBjcHUgbG9jayBpbiBfX25mX2N0X3VuY29uZmlybWVkX2Rlc3Ryb3koKS4KLQkgKiBUaGlzIG1ha2VzIHN1cmUgaXRzIGluc2VydGVkIGludG8gY29ubnRyYWNrIHRhYmxlLgotCSAqLwotCXN5bmNocm9uaXplX25ldCgpOwotCi0JbmZfY3RfaXRlcmF0ZV9jbGVhbnVwKGl0ZXIsIGRhdGEsIDAsIDApOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfaXRlcmF0ZV9kZXN0cm95KTsKLQotc3RhdGljIGludCBraWxsX2FsbChzdHJ1Y3QgbmZfY29ubiAqaSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gbmV0X2VxKG5mX2N0X25ldChpKSwgZGF0YSk7Ci19Ci0KLXZvaWQgbmZfY3RfZnJlZV9oYXNodGFibGUodm9pZCAqaGFzaCwgdW5zaWduZWQgaW50IHNpemUpCi17Ci0JaWYgKGlzX3ZtYWxsb2NfYWRkcihoYXNoKSkKLQkJdmZyZWUoaGFzaCk7Ci0JZWxzZQotCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWhhc2gsCi0JCQkgICBnZXRfb3JkZXIoc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSAqIHNpemUpKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2ZyZWVfaGFzaHRhYmxlKTsKLQotdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cF9zdGFydCh2b2lkKQotewotCWNvbm50cmFja19nY193b3JrLmV4aXRpbmcgPSB0cnVlOwotCVJDVV9JTklUX1BPSU5URVIoaXBfY3RfYXR0YWNoLCBOVUxMKTsKLX0KLQotdm9pZCBuZl9jb25udHJhY2tfY2xlYW51cF9lbmQodm9pZCkKLXsKLQlSQ1VfSU5JVF9QT0lOVEVSKG5mX2N0X2hvb2ssIE5VTEwpOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubnRyYWNrX2djX3dvcmsuZHdvcmspOwotCWt2ZnJlZShuZl9jb25udHJhY2tfaGFzaCk7Ci0KLQluZl9jb25udHJhY2tfcHJvdG9fZmluaSgpOwotCW5mX2Nvbm50cmFja19zZXFhZGpfZmluaSgpOwotCW5mX2Nvbm50cmFja19sYWJlbHNfZmluaSgpOwotCW5mX2Nvbm50cmFja19oZWxwZXJfZmluaSgpOwotCW5mX2Nvbm50cmFja190aW1lb3V0X2ZpbmkoKTsKLQluZl9jb25udHJhY2tfZWNhY2hlX2ZpbmkoKTsKLQluZl9jb25udHJhY2tfdHN0YW1wX2ZpbmkoKTsKLQluZl9jb25udHJhY2tfYWNjdF9maW5pKCk7Ci0JbmZfY29ubnRyYWNrX2V4cGVjdF9maW5pKCk7Ci0KLQlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZfY29ubnRyYWNrX2NhY2hlcCk7Ci19Ci0KLS8qCi0gKiBNaXNoZWFyaW5nIHRoZSB2b2ljZXMgaW4gaGlzIGhlYWQsIG91ciBoZXJvIHdvbmRlcnMgaG93IGhlJ3MKLSAqIHN1cHBvc2VkIHRvIGtpbGwgdGhlIG1hbGwuCi0gKi8KLXZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXBfbmV0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlMSVNUX0hFQUQoc2luZ2xlKTsKLQotCWxpc3RfYWRkKCZuZXQtPmV4aXRfbGlzdCwgJnNpbmdsZSk7Ci0JbmZfY29ubnRyYWNrX2NsZWFudXBfbmV0X2xpc3QoJnNpbmdsZSk7Ci19Ci0KLXZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXBfbmV0X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbmV0X2V4aXRfbGlzdCkKLXsKLQlpbnQgYnVzeTsKLQlzdHJ1Y3QgbmV0ICpuZXQ7Ci0KLQkvKgotCSAqIFRoaXMgbWFrZXMgc3VyZSBhbGwgY3VycmVudCBwYWNrZXRzIGhhdmUgcGFzc2VkIHRocm91Z2gKLQkgKiAgbmV0ZmlsdGVyIGZyYW1ld29yay4gIFJvbGwgb24sIHR3by1zdGFnZSBtb2R1bGUKLQkgKiAgZGVsZXRlLi4uCi0JICovCi0Jc3luY2hyb25pemVfbmV0KCk7Ci1pX3NlZV9kZWFkX3Blb3BsZToKLQlidXN5ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5ldCwgbmV0X2V4aXRfbGlzdCwgZXhpdF9saXN0KSB7Ci0JCW5mX2N0X2l0ZXJhdGVfY2xlYW51cChraWxsX2FsbCwgbmV0LCAwLCAwKTsKLQkJaWYgKGF0b21pY19yZWFkKCZuZXQtPmN0LmNvdW50KSAhPSAwKQotCQkJYnVzeSA9IDE7Ci0JfQotCWlmIChidXN5KSB7Ci0JCXNjaGVkdWxlKCk7Ci0JCWdvdG8gaV9zZWVfZGVhZF9wZW9wbGU7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShuZXQsIG5ldF9leGl0X2xpc3QsIGV4aXRfbGlzdCkgewotCQluZl9jb25udHJhY2tfcHJvdG9fcGVybmV0X2ZpbmkobmV0KTsKLQkJbmZfY29ubnRyYWNrX2VjYWNoZV9wZXJuZXRfZmluaShuZXQpOwotCQluZl9jb25udHJhY2tfZXhwZWN0X3Blcm5ldF9maW5pKG5ldCk7Ci0JCWZyZWVfcGVyY3B1KG5ldC0+Y3Quc3RhdCk7Ci0JCWZyZWVfcGVyY3B1KG5ldC0+Y3QucGNwdV9saXN0cyk7Ci0JfQotfQotCi12b2lkICpuZl9jdF9hbGxvY19oYXNodGFibGUodW5zaWduZWQgaW50ICpzaXplcCwgaW50IG51bGxzKQotewotCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoYXNoOwotCXVuc2lnbmVkIGludCBucl9zbG90cywgaTsKLQotCWlmICgqc2l6ZXAgPiAoVUlOVF9NQVggLyBzaXplb2Yoc3RydWN0IGhsaXN0X251bGxzX2hlYWQpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBobGlzdF9udWxsc19oZWFkKSAhPSBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKLQlucl9zbG90cyA9ICpzaXplcCA9IHJvdW5kdXAoKnNpemVwLCBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGhsaXN0X251bGxzX2hlYWQpKTsKLQotCWhhc2ggPSBrdmNhbGxvYyhucl9zbG90cywgc2l6ZW9mKHN0cnVjdCBobGlzdF9udWxsc19oZWFkKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoaGFzaCAmJiBudWxscykKLQkJZm9yIChpID0gMDsgaSA8IG5yX3Nsb3RzOyBpKyspCi0JCQlJTklUX0hMSVNUX05VTExTX0hFQUQoJmhhc2hbaV0sIGkpOwotCi0JcmV0dXJuIGhhc2g7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9hbGxvY19oYXNodGFibGUpOwotCi1pbnQgbmZfY29ubnRyYWNrX2hhc2hfcmVzaXplKHVuc2lnbmVkIGludCBoYXNoc2l6ZSkKLXsKLQlpbnQgaSwgYnVja2V0OwotCXVuc2lnbmVkIGludCBvbGRfc2l6ZTsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGFzaCwgKm9sZF9oYXNoOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKLQlzdHJ1Y3QgbmZfY29ubiAqY3Q7Ci0KLQlpZiAoIWhhc2hzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWhhc2ggPSBuZl9jdF9hbGxvY19oYXNodGFibGUoJmhhc2hzaXplLCAxKTsKLQlpZiAoIWhhc2gpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXV0ZXhfbG9jaygmbmZfY29ubnRyYWNrX211dGV4KTsKLQlvbGRfc2l6ZSA9IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQlpZiAob2xkX3NpemUgPT0gaGFzaHNpemUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZuZl9jb25udHJhY2tfbXV0ZXgpOwotCQlrdmZyZWUoaGFzaCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQluZl9jb25udHJhY2tfYWxsX2xvY2soKTsKLQl3cml0ZV9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCi0JLyogTG9va3VwcyBpbiB0aGUgb2xkIGhhc2ggbWlnaHQgaGFwcGVuIGluIHBhcmFsbGVsLCB3aGljaCBtZWFucyB3ZQotCSAqIG1pZ2h0IGdldCBmYWxzZSBuZWdhdGl2ZXMgZHVyaW5nIGNvbm5lY3Rpb24gbG9va3VwLiBOZXcgY29ubmVjdGlvbnMKLQkgKiBjcmVhdGVkIGJlY2F1c2Ugb2YgYSBmYWxzZSBuZWdhdGl2ZSB3b24ndCBtYWtlIGl0IGludG8gdGhlIGhhc2gKLQkgKiB0aG91Z2ggc2luY2UgdGhhdCByZXF1aXJlZCB0YWtpbmcgdGhlIGxvY2tzLgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsgaSsrKSB7Ci0JCXdoaWxlICghaGxpc3RfbnVsbHNfZW1wdHkoJm5mX2Nvbm50cmFja19oYXNoW2ldKSkgewotCQkJaCA9IGhsaXN0X251bGxzX2VudHJ5KG5mX2Nvbm50cmFja19oYXNoW2ldLmZpcnN0LAotCQkJCQkgICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2gsIGhubm9kZSk7Ci0JCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZoLT5obm5vZGUpOwotCQkJYnVja2V0ID0gX19oYXNoX2Nvbm50cmFjayhuZl9jdF9uZXQoY3QpLAotCQkJCQkJICAmaC0+dHVwbGUsIGhhc2hzaXplKTsKLQkJCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmaC0+aG5ub2RlLCAmaGFzaFtidWNrZXRdKTsKLQkJfQotCX0KLQlvbGRfc2l6ZSA9IG5mX2Nvbm50cmFja19odGFibGVfc2l6ZTsKLQlvbGRfaGFzaCA9IG5mX2Nvbm50cmFja19oYXNoOwotCi0JbmZfY29ubnRyYWNrX2hhc2ggPSBoYXNoOwotCW5mX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IGhhc2hzaXplOwotCi0Jd3JpdGVfc2VxY291bnRfZW5kKCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbik7Ci0JbmZfY29ubnRyYWNrX2FsbF91bmxvY2soKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKLQotCW11dGV4X3VubG9jaygmbmZfY29ubnRyYWNrX211dGV4KTsKLQotCXN5bmNocm9uaXplX25ldCgpOwotCWt2ZnJlZShvbGRfaGFzaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JdW5zaWduZWQgaW50IGhhc2hzaXplOwotCWludCByYzsKLQotCWlmIChjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMgIT0gJmluaXRfbmV0KQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBPbiBib290LCB3ZSBjYW4gc2V0IHRoaXMgd2l0aG91dCBhbnkgZmFuY3kgbG9ja2luZy4gKi8KLQlpZiAoIW5mX2Nvbm50cmFja19oYXNoKQotCQlyZXR1cm4gcGFyYW1fc2V0X3VpbnQodmFsLCBrcCk7Ci0KLQlyYyA9IGtzdHJ0b3VpbnQodmFsLCAwLCAmaGFzaHNpemUpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIG5mX2Nvbm50cmFja19oYXNoX3Jlc2l6ZShoYXNoc2l6ZSk7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IHRvdGFsX2V4dGVuc2lvbl9zaXplKHZvaWQpCi17Ci0JLyogcmVtZW1iZXIgdG8gYWRkIG5ldyBleHRlbnNpb25zIGJlbG93ICovCi0JQlVJTERfQlVHX09OKE5GX0NUX0VYVF9OVU0gPiA5KTsKLQotCXJldHVybiBzaXplb2Yoc3RydWN0IG5mX2N0X2V4dCkgKwotCSAgICAgICBzaXplb2Yoc3RydWN0IG5mX2Nvbm5faGVscCkKLSNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9OQVQpCi0JCSsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX25hdCkKLSNlbmRpZgotCQkrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9zZXFhZGopCi0JCSsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX2FjY3QpCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKLQkJKyBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUpCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVTVEFNUAotCQkrIHNpemVvZihzdHJ1Y3QgbmZfY29ubl90c3RhbXApCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1RJTUVPVVQKLQkJKyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fdGltZW91dCkKLSNlbmRpZgotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTEFCRUxTCi0JCSsgc2l6ZW9mKHN0cnVjdCBuZl9jb25uX2xhYmVscykKLSNlbmRpZgotI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVEZJTFRFUl9TWU5QUk9YWSkKLQkJKyBzaXplb2Yoc3RydWN0IG5mX2Nvbm5fc3lucHJveHkpCi0jZW5kaWYKLQk7Ci19OwotCi1pbnQgbmZfY29ubnRyYWNrX2luaXRfc3RhcnQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gdG90YWxyYW1fcGFnZXMoKTsKLQlpbnQgbWF4X2ZhY3RvciA9IDg7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGk7Ci0KLQkvKiBzdHJ1Y3QgbmZfY3RfZXh0IHVzZXMgdTggdG8gc3RvcmUgb2Zmc2V0cy9zaXplICovCi0JQlVJTERfQlVHX09OKHRvdGFsX2V4dGVuc2lvbl9zaXplKCkgPiAyNTV1KTsKLQotCXNlcWNvdW50X3NwaW5sb2NrX2luaXQoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLAotCQkJICAgICAgICZuZl9jb25udHJhY2tfbG9ja3NfYWxsX2xvY2spOwotCi0JZm9yIChpID0gMDsgaSA8IENPTk5UUkFDS19MT0NLUzsgaSsrKQotCQlzcGluX2xvY2tfaW5pdCgmbmZfY29ubnRyYWNrX2xvY2tzW2ldKTsKLQotCWlmICghbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplKSB7Ci0JCS8qIElkZWEgZnJvbSB0Y3AuYzogdXNlIDEvMTYzODQgb2YgbWVtb3J5LgotCQkgKiBPbiBpMzg2OiAzMk1CIG1hY2hpbmUgaGFzIDUxMiBidWNrZXRzLgotCQkgKiA+PSAxR0IgbWFjaGluZXMgaGF2ZSAxNjM4NCBidWNrZXRzLgotCQkgKiA+PSA0R0IgbWFjaGluZXMgaGF2ZSA2NTUzNiBidWNrZXRzLgotCQkgKi8KLQkJbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplCi0JCQk9ICgoKG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpIC8gMTYzODQpCi0JCQkgICAvIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOwotCQlpZiAobnJfcGFnZXMgPiAoNCAqICgxMDI0ICogMTAyNCAqIDEwMjQgLyBQQUdFX1NJWkUpKSkKLQkJCW5mX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IDY1NTM2OwotCQllbHNlIGlmIChucl9wYWdlcyA+ICgxMDI0ICogMTAyNCAqIDEwMjQgLyBQQUdFX1NJWkUpKQotCQkJbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplID0gMTYzODQ7Ci0JCWlmIChuZl9jb25udHJhY2tfaHRhYmxlX3NpemUgPCAzMikKLQkJCW5mX2Nvbm50cmFja19odGFibGVfc2l6ZSA9IDMyOwotCi0JCS8qIFVzZSBhIG1heC4gZmFjdG9yIG9mIGZvdXIgYnkgZGVmYXVsdCB0byBnZXQgdGhlIHNhbWUgbWF4IGFzCi0JCSAqIHdpdGggdGhlIG9sZCBzdHJ1Y3QgbGlzdF9oZWFkcy4gV2hlbiBhIHRhYmxlIHNpemUgaXMgZ2l2ZW4KLQkJICogd2UgdXNlIHRoZSBvbGQgdmFsdWUgb2YgOCB0byBhdm9pZCByZWR1Y2luZyB0aGUgbWF4LgotCQkgKiBlbnRyaWVzLiAqLwotCQltYXhfZmFjdG9yID0gNDsKLQl9Ci0KLQluZl9jb25udHJhY2tfaGFzaCA9IG5mX2N0X2FsbG9jX2hhc2h0YWJsZSgmbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplLCAxKTsKLQlpZiAoIW5mX2Nvbm50cmFja19oYXNoKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW5mX2Nvbm50cmFja19tYXggPSBtYXhfZmFjdG9yICogbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCi0JbmZfY29ubnRyYWNrX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZl9jb25udHJhY2siLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBuZl9jb25uKSwKLQkJCQkJCU5GQ1RfSU5GT01BU0sgKyAxLAotCQkJCQkJU0xBQl9UWVBFU0FGRV9CWV9SQ1UgfCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwotCWlmICghbmZfY29ubnRyYWNrX2NhY2hlcCkKLQkJZ290byBlcnJfY2FjaGVwOwotCi0JcmV0ID0gbmZfY29ubnRyYWNrX2V4cGVjdF9pbml0KCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2V4cGVjdDsKLQotCXJldCA9IG5mX2Nvbm50cmFja19hY2N0X2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfYWNjdDsKLQotCXJldCA9IG5mX2Nvbm50cmFja190c3RhbXBfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl90c3RhbXA7Ci0KLQlyZXQgPSBuZl9jb25udHJhY2tfZWNhY2hlX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZWNhY2hlOwotCi0JcmV0ID0gbmZfY29ubnRyYWNrX3RpbWVvdXRfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl90aW1lb3V0OwotCi0JcmV0ID0gbmZfY29ubnRyYWNrX2hlbHBlcl9pbml0KCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2hlbHBlcjsKLQotCXJldCA9IG5mX2Nvbm50cmFja19sYWJlbHNfaW5pdCgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9sYWJlbHM7Ci0KLQlyZXQgPSBuZl9jb25udHJhY2tfc2VxYWRqX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfc2VxYWRqOwotCi0JcmV0ID0gbmZfY29ubnRyYWNrX3Byb3RvX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfcHJvdG87Ci0KLQljb25udHJhY2tfZ2Nfd29ya19pbml0KCZjb25udHJhY2tfZ2Nfd29yayk7Ci0JcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZjb25udHJhY2tfZ2Nfd29yay5kd29yaywgSFopOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9wcm90bzoKLQluZl9jb25udHJhY2tfc2VxYWRqX2ZpbmkoKTsKLWVycl9zZXFhZGo6Ci0JbmZfY29ubnRyYWNrX2xhYmVsc19maW5pKCk7Ci1lcnJfbGFiZWxzOgotCW5mX2Nvbm50cmFja19oZWxwZXJfZmluaSgpOwotZXJyX2hlbHBlcjoKLQluZl9jb25udHJhY2tfdGltZW91dF9maW5pKCk7Ci1lcnJfdGltZW91dDoKLQluZl9jb25udHJhY2tfZWNhY2hlX2ZpbmkoKTsKLWVycl9lY2FjaGU6Ci0JbmZfY29ubnRyYWNrX3RzdGFtcF9maW5pKCk7Ci1lcnJfdHN0YW1wOgotCW5mX2Nvbm50cmFja19hY2N0X2ZpbmkoKTsKLWVycl9hY2N0OgotCW5mX2Nvbm50cmFja19leHBlY3RfZmluaSgpOwotZXJyX2V4cGVjdDoKLQlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZfY29ubnRyYWNrX2NhY2hlcCk7Ci1lcnJfY2FjaGVwOgotCWt2ZnJlZShuZl9jb25udHJhY2tfaGFzaCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBuZl9jdF9ob29rIG5mX2Nvbm50cmFja19ob29rID0gewotCS51cGRhdGUJCT0gbmZfY29ubnRyYWNrX3VwZGF0ZSwKLQkuZGVzdHJveQk9IGRlc3Ryb3lfY29ubnRyYWNrLAotCS5nZXRfdHVwbGVfc2tiICA9IG5mX2Nvbm50cmFja19nZXRfdHVwbGVfc2tiLAotfTsKLQotdm9pZCBuZl9jb25udHJhY2tfaW5pdF9lbmQodm9pZCkKLXsKLQkvKiBGb3IgdXNlIGJ5IFJFSkVDVCB0YXJnZXQgKi8KLQlSQ1VfSU5JVF9QT0lOVEVSKGlwX2N0X2F0dGFjaCwgbmZfY29ubnRyYWNrX2F0dGFjaCk7Ci0JUkNVX0lOSVRfUE9JTlRFUihuZl9jdF9ob29rLCAmbmZfY29ubnRyYWNrX2hvb2spOwotfQotCi0vKgotICogV2UgbmVlZCB0byB1c2Ugc3BlY2lhbCAibnVsbCIgdmFsdWVzLCBub3QgdXNlZCBpbiBoYXNoIHRhYmxlCi0gKi8KLSNkZWZpbmUgVU5DT05GSVJNRURfTlVMTFNfVkFMCSgoMTw8MzApKzApCi0jZGVmaW5lIERZSU5HX05VTExTX1ZBTAkJKCgxPDwzMCkrMSkKLQotaW50IG5mX2Nvbm50cmFja19pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0JaW50IGNwdTsKLQotCUJVSUxEX0JVR19PTihJUF9DVF9VTlRSQUNLRUQgPT0gSVBfQ1RfTlVNQkVSKTsKLQlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoQ09OTlRSQUNLX0xPQ0tTKTsKLQlhdG9taWNfc2V0KCZuZXQtPmN0LmNvdW50LCAwKTsKLQotCW5ldC0+Y3QucGNwdV9saXN0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY3RfcGNwdSk7Ci0JaWYgKCFuZXQtPmN0LnBjcHVfbGlzdHMpCi0JCWdvdG8gZXJyX3N0YXQ7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCXN0cnVjdCBjdF9wY3B1ICpwY3B1ID0gcGVyX2NwdV9wdHIobmV0LT5jdC5wY3B1X2xpc3RzLCBjcHUpOwotCi0JCXNwaW5fbG9ja19pbml0KCZwY3B1LT5sb2NrKTsKLQkJSU5JVF9ITElTVF9OVUxMU19IRUFEKCZwY3B1LT51bmNvbmZpcm1lZCwgVU5DT05GSVJNRURfTlVMTFNfVkFMKTsKLQkJSU5JVF9ITElTVF9OVUxMU19IRUFEKCZwY3B1LT5keWluZywgRFlJTkdfTlVMTFNfVkFMKTsKLQl9Ci0KLQluZXQtPmN0LnN0YXQgPSBhbGxvY19wZXJjcHUoc3RydWN0IGlwX2Nvbm50cmFja19zdGF0KTsKLQlpZiAoIW5ldC0+Y3Quc3RhdCkKLQkJZ290byBlcnJfcGNwdV9saXN0czsKLQotCXJldCA9IG5mX2Nvbm50cmFja19leHBlY3RfcGVybmV0X2luaXQobmV0KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZXhwZWN0OwotCi0JbmZfY29ubnRyYWNrX2FjY3RfcGVybmV0X2luaXQobmV0KTsKLQluZl9jb25udHJhY2tfdHN0YW1wX3Blcm5ldF9pbml0KG5ldCk7Ci0JbmZfY29ubnRyYWNrX2VjYWNoZV9wZXJuZXRfaW5pdChuZXQpOwotCW5mX2Nvbm50cmFja19oZWxwZXJfcGVybmV0X2luaXQobmV0KTsKLQluZl9jb25udHJhY2tfcHJvdG9fcGVybmV0X2luaXQobmV0KTsKLQotCXJldHVybiAwOwotCi1lcnJfZXhwZWN0OgotCWZyZWVfcGVyY3B1KG5ldC0+Y3Quc3RhdCk7Ci1lcnJfcGNwdV9saXN0czoKLQlmcmVlX3BlcmNwdShuZXQtPmN0LnBjcHVfbGlzdHMpOwotZXJyX3N0YXQ6Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci94dF9EU0NQLmMgYi91cHN0cmVhbS9saW51eC01LjEwL25ldC9uZXRmaWx0ZXIveHRfRFNDUC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYWJhYmMzLi4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci94dF9EU0NQLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQotLyogeF90YWJsZXMgbW9kdWxlIGZvciBzZXR0aW5nIHRoZSBJUHY0L0lQdjYgRFNDUCBmaWVsZCwgVmVyc2lvbiAxLjgKLSAqCi0gKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqIGJhc2VkIG9uIGlwdF9GVE9TLmMgKEMpIDIwMDAgYnkgTWF0dGhldyBHLiBNYXJzaCA8bWdtQHBha3Ryb25peC5jb20+Ci0gKgotICogU2VlIFJGQzI0NzQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIERTQ1AgZmllbGQgd2l0aGluIHRoZSBJUCBIZWFkZXIuCi0qLwotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXB2Ni5oPgotI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfRFNDUC5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiWHRhYmxlczogRFNDUC9UT1MgZmllbGQgbW9kaWZpY2F0aW9uIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVMoImlwdF9EU0NQIik7Ci1NT0RVTEVfQUxJQVMoImlwNnRfRFNDUCIpOwotTU9EVUxFX0FMSUFTKCJpcHRfVE9TIik7Ci1NT0RVTEVfQUxJQVMoImlwNnRfVE9TIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWRzY3BfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQotewotCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmRpbmZvID0gcGFyLT50YXJnaW5mbzsKLQl1X2ludDhfdCBkc2NwID0gaXB2NF9nZXRfZHNmaWVsZChpcF9oZHIoc2tiKSkgPj4gWFRfRFNDUF9TSElGVDsKLQotCWlmIChkc2NwICE9IGRpbmZvLT5kc2NwKSB7Ci0JCWlmIChza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQotCQkJcmV0dXJuIE5GX0RST1A7Ci0KLQkJaXB2NF9jaGFuZ2VfZHNmaWVsZChpcF9oZHIoc2tiKSwKLQkJCQkgICAgKF9fZm9yY2UgX191OCkoflhUX0RTQ1BfTUFTSyksCi0JCQkJICAgIGRpbmZvLT5kc2NwIDw8IFhUX0RTQ1BfU0hJRlQpOwotCi0JfQotCXJldHVybiBYVF9DT05USU5VRTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotZHNjcF90ZzYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQotewotCWNvbnN0IHN0cnVjdCB4dF9EU0NQX2luZm8gKmRpbmZvID0gcGFyLT50YXJnaW5mbzsKLQl1X2ludDhfdCBkc2NwID0gaXB2Nl9nZXRfZHNmaWVsZChpcHY2X2hkcihza2IpKSA+PiBYVF9EU0NQX1NISUZUOwotCi0JaWYgKGRzY3AgIT0gZGluZm8tPmRzY3ApIHsKLQkJaWYgKHNrYl9lbnN1cmVfd3JpdGFibGUoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKLQkJCXJldHVybiBORl9EUk9QOwotCi0JCWlwdjZfY2hhbmdlX2RzZmllbGQoaXB2Nl9oZHIoc2tiKSwKLQkJCQkgICAgKF9fZm9yY2UgX191OCkoflhUX0RTQ1BfTUFTSyksCi0JCQkJICAgIGRpbmZvLT5kc2NwIDw8IFhUX0RTQ1BfU0hJRlQpOwotCX0KLQlyZXR1cm4gWFRfQ09OVElOVUU7Ci19Ci0KLXN0YXRpYyBpbnQgZHNjcF90Z19jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgeHRfRFNDUF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKLQotCWlmIChpbmZvLT5kc2NwID4gWFRfRFNDUF9NQVgpCi0JCXJldHVybiAtRURPTTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdG9zX3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKLQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwotCXVfaW50OF90IG9yaWcsIG52OwotCi0Jb3JpZyA9IGlwdjRfZ2V0X2RzZmllbGQoaXBoKTsKLQludiAgID0gKG9yaWcgJiB+aW5mby0+dG9zX21hc2spIF4gaW5mby0+dG9zX3ZhbHVlOwotCi0JaWYgKG9yaWcgIT0gbnYpIHsKLQkJaWYgKHNrYl9lbnN1cmVfd3JpdGFibGUoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSkpCi0JCQlyZXR1cm4gTkZfRFJPUDsKLQkJaXBoID0gaXBfaGRyKHNrYik7Ci0JCWlwdjRfY2hhbmdlX2RzZmllbGQoaXBoLCAwLCBudik7Ci0JfQotCi0JcmV0dXJuIFhUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci10b3NfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKLQlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKLQl1X2ludDhfdCBvcmlnLCBudjsKLQotCW9yaWcgPSBpcHY2X2dldF9kc2ZpZWxkKGlwaCk7Ci0JbnYgICA9IChvcmlnICYgfmluZm8tPnRvc19tYXNrKSBeIGluZm8tPnRvc192YWx1ZTsKLQotCWlmIChvcmlnICE9IG52KSB7Ci0JCWlmIChza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQotCQkJcmV0dXJuIE5GX0RST1A7Ci0JCWlwaCA9IGlwdjZfaGRyKHNrYik7Ci0JCWlwdjZfY2hhbmdlX2RzZmllbGQoaXBoLCAwLCBudik7Ci0JfQotCi0JcmV0dXJuIFhUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgc3RydWN0IHh0X3RhcmdldCBkc2NwX3RnX3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZQkJPSAiRFNDUCIsCi0JCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAotCQkuY2hlY2tlbnRyeQk9IGRzY3BfdGdfY2hlY2ssCi0JCS50YXJnZXQJCT0gZHNjcF90ZywKLQkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X0RTQ1BfaW5mbyksCi0JCS50YWJsZQkJPSAibWFuZ2xlIiwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZQkJPSAiRFNDUCIsCi0JCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAotCQkuY2hlY2tlbnRyeQk9IGRzY3BfdGdfY2hlY2ssCi0JCS50YXJnZXQJCT0gZHNjcF90ZzYsCi0JCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9EU0NQX2luZm8pLAotCQkudGFibGUJCT0gIm1hbmdsZSIsCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotCXsKLQkJLm5hbWUJCT0gIlRPUyIsCi0JCS5yZXZpc2lvbgk9IDEsCi0JCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAotCQkudGFibGUJCT0gIm1hbmdsZSIsCi0JCS50YXJnZXQJCT0gdG9zX3RnLAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi0JewotCQkubmFtZQkJPSAiVE9TIiwKLQkJLnJldmlzaW9uCT0gMSwKLQkJLmZhbWlseQkJPSBORlBST1RPX0lQVjYsCi0JCS50YWJsZQkJPSAibWFuZ2xlIiwKLQkJLnRhcmdldAkJPSB0b3NfdGc2LAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdG9zX3RhcmdldF9pbmZvKSwKLQkJLm1lCQk9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkc2NwX3RnX2luaXQodm9pZCkKLXsKLQlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyhkc2NwX3RnX3JlZywgQVJSQVlfU0laRShkc2NwX3RnX3JlZykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHNjcF90Z19leGl0KHZvaWQpCi17Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXRzKGRzY3BfdGdfcmVnLCBBUlJBWV9TSVpFKGRzY3BfdGdfcmVnKSk7Ci19Ci0KLW1vZHVsZV9pbml0KGRzY3BfdGdfaW5pdCk7Ci1tb2R1bGVfZXhpdChkc2NwX3RnX2V4aXQpOwpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYyBiL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci94dF9SQVRFRVNULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBkNWM0MjIuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogKEMpIDIwMDcgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9nZW5fc3RhdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvZ2VuX3N0YXRzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KLSNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL3h0X3JhdGVlc3QuaD4KLQotI2RlZmluZSBSQVRFRVNUX0hTSVpFCTE2Ci0KLXN0cnVjdCB4dF9yYXRlZXN0X25ldCB7Ci0Jc3RydWN0IG11dGV4IGhhc2hfbG9jazsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCBoYXNoW1JBVEVFU1RfSFNJWkVdOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGludCB4dF9yYXRlZXN0X2lkOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGpoYXNoX3JuZCBfX3JlYWRfbW9zdGx5OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHh0X3JhdGVlc3RfaGFzaChjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiBqaGFzaChuYW1lLCBzaXplb2ZfZmllbGQoc3RydWN0IHh0X3JhdGVlc3QsIG5hbWUpLCBqaGFzaF9ybmQpICYKLQkgICAgICAgKFJBVEVFU1RfSFNJWkUgLSAxKTsKLX0KLQotc3RhdGljIHZvaWQgeHRfcmF0ZWVzdF9oYXNoX2luc2VydChzdHJ1Y3QgeHRfcmF0ZWVzdF9uZXQgKnhuLAotCQkJCSAgIHN0cnVjdCB4dF9yYXRlZXN0ICplc3QpCi17Ci0JdW5zaWduZWQgaW50IGg7Ci0KLQloID0geHRfcmF0ZWVzdF9oYXNoKGVzdC0+bmFtZSk7Ci0JaGxpc3RfYWRkX2hlYWQoJmVzdC0+bGlzdCwgJnhuLT5oYXNoW2hdKTsKLX0KLQotc3RhdGljIHN0cnVjdCB4dF9yYXRlZXN0ICpfX3h0X3JhdGVlc3RfbG9va3VwKHN0cnVjdCB4dF9yYXRlZXN0X25ldCAqeG4sCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHh0X3JhdGVlc3QgKmVzdDsKLQl1bnNpZ25lZCBpbnQgaDsKLQotCWggPSB4dF9yYXRlZXN0X2hhc2gobmFtZSk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnkoZXN0LCAmeG4tPmhhc2hbaF0sIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChlc3QtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWVzdC0+cmVmY250Kys7Ci0JCQlyZXR1cm4gZXN0OwotCQl9Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0cnVjdCB4dF9yYXRlZXN0ICp4dF9yYXRlZXN0X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IHh0X3JhdGVlc3RfbmV0ICp4biA9IG5ldF9nZW5lcmljKG5ldCwgeHRfcmF0ZWVzdF9pZCk7Ci0Jc3RydWN0IHh0X3JhdGVlc3QgKmVzdDsKLQotCW11dGV4X2xvY2soJnhuLT5oYXNoX2xvY2spOwotCWVzdCA9IF9feHRfcmF0ZWVzdF9sb29rdXAoeG4sIG5hbWUpOwotCW11dGV4X3VubG9jaygmeG4tPmhhc2hfbG9jayk7Ci0JcmV0dXJuIGVzdDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHh0X3JhdGVlc3RfbG9va3VwKTsKLQotdm9pZCB4dF9yYXRlZXN0X3B1dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB4dF9yYXRlZXN0ICplc3QpCi17Ci0Jc3RydWN0IHh0X3JhdGVlc3RfbmV0ICp4biA9IG5ldF9nZW5lcmljKG5ldCwgeHRfcmF0ZWVzdF9pZCk7Ci0KLQltdXRleF9sb2NrKCZ4bi0+aGFzaF9sb2NrKTsKLQlpZiAoLS1lc3QtPnJlZmNudCA9PSAwKSB7Ci0JCWhsaXN0X2RlbCgmZXN0LT5saXN0KTsKLQkJZ2VuX2tpbGxfZXN0aW1hdG9yKCZlc3QtPnJhdGVfZXN0KTsKLQkJLyoKLQkJICogZ2VuX2VzdGltYXRvciBlc3RfdGltZXIoKSBtaWdodCBhY2Nlc3MgZXN0LT5sb2NrIG9yIGJzdGF0cywKLQkJICogd2FpdCBhIFJDVSBncmFjZSBwZXJpb2QgYmVmb3JlIGZyZWVpbmcgJ2VzdCcKLQkJICovCi0JCWtmcmVlX3JjdShlc3QsIHJjdSk7Ci0JfQotCW11dGV4X3VubG9jaygmeG4tPmhhc2hfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4dF9yYXRlZXN0X3B1dCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXh0X3JhdGVlc3RfdGcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQotewotCWNvbnN0IHN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKLQlzdHJ1Y3QgZ25ldF9zdGF0c19iYXNpY19wYWNrZWQgKnN0YXRzID0gJmluZm8tPmVzdC0+YnN0YXRzOwotCi0Jc3Bpbl9sb2NrX2JoKCZpbmZvLT5lc3QtPmxvY2spOwotCXN0YXRzLT5ieXRlcyArPSBza2ItPmxlbjsKLQlzdGF0cy0+cGFja2V0cysrOwotCXNwaW5fdW5sb2NrX2JoKCZpbmZvLT5lc3QtPmxvY2spOwotCi0JcmV0dXJuIFhUX0NPTlRJTlVFOwotfQotCi1zdGF0aWMgaW50IHh0X3JhdGVlc3RfdGdfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKLXsKLQlzdHJ1Y3QgeHRfcmF0ZWVzdF9uZXQgKnhuID0gbmV0X2dlbmVyaWMocGFyLT5uZXQsIHh0X3JhdGVlc3RfaWQpOwotCXN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvICppbmZvID0gcGFyLT50YXJnaW5mbzsKLQlzdHJ1Y3QgeHRfcmF0ZWVzdCAqZXN0OwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBubGF0dHIJCW9wdDsKLQkJc3RydWN0IGduZXRfZXN0aW1hdG9yCWVzdDsKLQl9IGNmZzsKLQlpbnQgcmV0OwotCi0JaWYgKHN0cm5sZW4oaW5mby0+bmFtZSwgc2l6ZW9mKGVzdC0+bmFtZSkpID49IHNpemVvZihlc3QtPm5hbWUpKQotCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKLQotCW5ldF9nZXRfcmFuZG9tX29uY2UoJmpoYXNoX3JuZCwgc2l6ZW9mKGpoYXNoX3JuZCkpOwotCi0JbXV0ZXhfbG9jaygmeG4tPmhhc2hfbG9jayk7Ci0JZXN0ID0gX194dF9yYXRlZXN0X2xvb2t1cCh4biwgaW5mby0+bmFtZSk7Ci0JaWYgKGVzdCkgewotCQltdXRleF91bmxvY2soJnhuLT5oYXNoX2xvY2spOwotCQkvKgotCQkgKiBJZiBlc3RpbWF0b3IgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkLCB0aGV5IG11c3QgbWF0Y2ggdGhlCi0JCSAqIGV4aXN0aW5nIGVzdGltYXRvci4KLQkJICovCi0JCWlmICgoIWluZm8tPmludGVydmFsICYmICFpbmZvLT5ld21hX2xvZykgfHwKLQkJICAgIChpbmZvLT5pbnRlcnZhbCAhPSBlc3QtPnBhcmFtcy5pbnRlcnZhbCB8fAotCQkgICAgIGluZm8tPmV3bWFfbG9nICE9IGVzdC0+cGFyYW1zLmV3bWFfbG9nKSkgewotCQkJeHRfcmF0ZWVzdF9wdXQocGFyLT5uZXQsIGVzdCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpbmZvLT5lc3QgPSBlc3Q7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldCA9IC1FTk9NRU07Ci0JZXN0ID0ga3phbGxvYyhzaXplb2YoKmVzdCksIEdGUF9LRVJORUwpOwotCWlmICghZXN0KQotCQlnb3RvIGVycjE7Ci0KLQlzdHJsY3B5KGVzdC0+bmFtZSwgaW5mby0+bmFtZSwgc2l6ZW9mKGVzdC0+bmFtZSkpOwotCXNwaW5fbG9ja19pbml0KCZlc3QtPmxvY2spOwotCWVzdC0+cmVmY250CQk9IDE7Ci0JZXN0LT5wYXJhbXMuaW50ZXJ2YWwJPSBpbmZvLT5pbnRlcnZhbDsKLQllc3QtPnBhcmFtcy5ld21hX2xvZwk9IGluZm8tPmV3bWFfbG9nOwotCi0JY2ZnLm9wdC5ubGFfbGVuCQk9IG5sYV9hdHRyX3NpemUoc2l6ZW9mKGNmZy5lc3QpKTsKLQljZmcub3B0Lm5sYV90eXBlCT0gVENBX1NUQVRTX1JBVEVfRVNUOwotCWNmZy5lc3QuaW50ZXJ2YWwJPSBpbmZvLT5pbnRlcnZhbDsKLQljZmcuZXN0LmV3bWFfbG9nCT0gaW5mby0+ZXdtYV9sb2c7Ci0KLQlyZXQgPSBnZW5fbmV3X2VzdGltYXRvcigmZXN0LT5ic3RhdHMsIE5VTEwsICZlc3QtPnJhdGVfZXN0LAotCQkJCSZlc3QtPmxvY2ssIE5VTEwsICZjZmcub3B0KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnIyOwotCi0JaW5mby0+ZXN0ID0gZXN0OwotCXh0X3JhdGVlc3RfaGFzaF9pbnNlcnQoeG4sIGVzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZ4bi0+aGFzaF9sb2NrKTsKLQlyZXR1cm4gMDsKLQotZXJyMjoKLQlrZnJlZShlc3QpOwotZXJyMToKLQltdXRleF91bmxvY2soJnhuLT5oYXNoX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHh0X3JhdGVlc3RfdGdfZGVzdHJveShjb25zdCBzdHJ1Y3QgeHRfdGdkdG9yX3BhcmFtICpwYXIpCi17Ci0Jc3RydWN0IHh0X3JhdGVlc3RfdGFyZ2V0X2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwotCi0JeHRfcmF0ZWVzdF9wdXQocGFyLT5uZXQsIGluZm8tPmVzdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHh0X3JhdGVlc3RfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5hbWUgICAgICAgPSAiUkFURUVTVCIsCi0JLnJldmlzaW9uICAgPSAwLAotCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCi0JLnRhcmdldCAgICAgPSB4dF9yYXRlZXN0X3RnLAotCS5jaGVja2VudHJ5ID0geHRfcmF0ZWVzdF90Z19jaGVja2VudHJ5LAotCS5kZXN0cm95ICAgID0geHRfcmF0ZWVzdF90Z19kZXN0cm95LAotCS50YXJnZXRzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvKSwKLQkudXNlcnNpemUgICA9IG9mZnNldG9mKHN0cnVjdCB4dF9yYXRlZXN0X3RhcmdldF9pbmZvLCBlc3QpLAotCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgX19uZXRfaW5pdCBpbnQgeHRfcmF0ZWVzdF9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0Jc3RydWN0IHh0X3JhdGVlc3RfbmV0ICp4biA9IG5ldF9nZW5lcmljKG5ldCwgeHRfcmF0ZWVzdF9pZCk7Ci0JaW50IGk7Ci0KLQltdXRleF9pbml0KCZ4bi0+aGFzaF9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4bi0+aGFzaCk7IGkrKykKLQkJSU5JVF9ITElTVF9IRUFEKCZ4bi0+aGFzaFtpXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgeHRfcmF0ZWVzdF9uZXRfb3BzID0gewotCS5pbml0ID0geHRfcmF0ZWVzdF9uZXRfaW5pdCwKLQkuaWQgICA9ICZ4dF9yYXRlZXN0X2lkLAotCS5zaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9yYXRlZXN0X25ldCksCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB4dF9yYXRlZXN0X3RnX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmeHRfcmF0ZWVzdF9uZXRfb3BzKTsKLQotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX3RhcmdldCgmeHRfcmF0ZWVzdF90Z19yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgeHRfcmF0ZWVzdF90Z19maW5pKHZvaWQpCi17Ci0JeHRfdW5yZWdpc3Rlcl90YXJnZXQoJnh0X3JhdGVlc3RfdGdfcmVnKTsKLQl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnh0X3JhdGVlc3RfbmV0X29wcyk7Ci19Ci0KLQotTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IHBhY2tldCByYXRlIGVzdGltYXRvciIpOwotTU9EVUxFX0FMSUFTKCJpcHRfUkFURUVTVCIpOwotTU9EVUxFX0FMSUFTKCJpcDZ0X1JBVEVFU1QiKTsKLW1vZHVsZV9pbml0KHh0X3JhdGVlc3RfdGdfaW5pdCk7Ci1tb2R1bGVfZXhpdCh4dF9yYXRlZXN0X3RnX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMjJkYjlmLi4wMDAwMDAwCi0tLSBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBNU1Mgb3B0aW9uIGluIFRDUCBwYWNrZXRzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4KLSAqIENvcHlyaWdodCAoQykgMjAwNyBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KLSAqLwotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSA8bGludXgvaXB2Ni5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPG5ldC9kc3QuaD4KLSNpbmNsdWRlIDxuZXQvZmxvdy5oPgotI2luY2x1ZGUgPG5ldC9pcHY2Lmg+Ci0jaW5jbHVkZSA8bmV0L3JvdXRlLmg+Ci0jaW5jbHVkZSA8bmV0L3RjcC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF90Y3B1ZHAuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfVENQTVNTLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBUQ1AgTWF4aW11bSBTZWdtZW50IFNpemUgKE1TUykgYWRqdXN0bWVudCIpOwotTU9EVUxFX0FMSUFTKCJpcHRfVENQTVNTIik7Ci1NT0RVTEVfQUxJQVMoImlwNnRfVENQTVNTIik7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1vcHRsZW4oY29uc3QgdV9pbnQ4X3QgKm9wdCwgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQkvKiBCZXdhcmUgemVyby1sZW5ndGggb3B0aW9uczogbWFrZSBmaW5pdGUgcHJvZ3Jlc3MgKi8KLQlpZiAob3B0W29mZnNldF0gPD0gVENQT1BUX05PUCB8fCBvcHRbb2Zmc2V0KzFdID09IDApCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIG9wdFtvZmZzZXQrMV07Ci19Ci0KLXN0YXRpYyB1X2ludDMyX3QgdGNwbXNzX3JldmVyc2VfbXR1KHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgdW5zaWduZWQgaW50IGZhbWlseSkKLXsKLQlzdHJ1Y3QgZmxvd2kgZmw7Ci0Jc3RydWN0IHJ0YWJsZSAqcnQgPSBOVUxMOwotCXVfaW50MzJfdCBtdHUgICAgID0gfjBVOwotCi0JaWYgKGZhbWlseSA9PSBQRl9JTkVUKSB7Ci0JCXN0cnVjdCBmbG93aTQgKmZsNCA9ICZmbC51LmlwNDsKLQkJbWVtc2V0KGZsNCwgMCwgc2l6ZW9mKCpmbDQpKTsKLQkJZmw0LT5kYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgZmxvd2k2ICpmbDYgPSAmZmwudS5pcDY7Ci0KLQkJbWVtc2V0KGZsNiwgMCwgc2l6ZW9mKCpmbDYpKTsKLQkJZmw2LT5kYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwotCX0KLQotCW5mX3JvdXRlKG5ldCwgKHN0cnVjdCBkc3RfZW50cnkgKiopJnJ0LCAmZmwsIGZhbHNlLCBmYW1pbHkpOwotCWlmIChydCAhPSBOVUxMKSB7Ci0JCW10dSA9IGRzdF9tdHUoJnJ0LT5kc3QpOwotCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7Ci0JfQotCXJldHVybiBtdHU7Ci19Ci0KLXN0YXRpYyBpbnQKLXRjcG1zc19tYW5nbGVfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyLAotCQkgICAgIHVuc2lnbmVkIGludCBmYW1pbHksCi0JCSAgICAgdW5zaWduZWQgaW50IHRjcGhvZmYsCi0JCSAgICAgdW5zaWduZWQgaW50IG1pbmxlbikKLXsKLQljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwotCXN0cnVjdCB0Y3BoZHIgKnRjcGg7Ci0JaW50IGxlbiwgdGNwX2hkcmxlbjsKLQl1bnNpZ25lZCBpbnQgaTsKLQlfX2JlMTYgb2xkdmFsOwotCXUxNiBuZXdtc3M7Ci0JdTggKm9wdDsKLQotCS8qIFRoaXMgaXMgYSBmcmFnbWVudCwgbm8gVENQIGhlYWRlciBpcyBhdmFpbGFibGUgKi8KLQlpZiAocGFyLT5mcmFnb2ZmICE9IDApCi0JCXJldHVybiAwOwotCi0JaWYgKHNrYl9lbnN1cmVfd3JpdGFibGUoc2tiLCBza2ItPmxlbikpCi0JCXJldHVybiAtMTsKLQotCWxlbiA9IHNrYi0+bGVuIC0gdGNwaG9mZjsKLQlpZiAobGVuIDwgKGludClzaXplb2Yoc3RydWN0IHRjcGhkcikpCi0JCXJldHVybiAtMTsKLQotCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKShza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHRjcGhvZmYpOwotCXRjcF9oZHJsZW4gPSB0Y3BoLT5kb2ZmICogNDsKLQotCWlmIChsZW4gPCB0Y3BfaGRybGVuIHx8IHRjcF9oZHJsZW4gPCBzaXplb2Yoc3RydWN0IHRjcGhkcikpCi0JCXJldHVybiAtMTsKLQotCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUpIHsKLQkJc3RydWN0IG5ldCAqbmV0ID0geHRfbmV0KHBhcik7Ci0JCXVuc2lnbmVkIGludCBpbl9tdHUgPSB0Y3Btc3NfcmV2ZXJzZV9tdHUobmV0LCBza2IsIGZhbWlseSk7Ci0JCXVuc2lnbmVkIGludCBtaW5fbXR1ID0gbWluKGRzdF9tdHUoc2tiX2RzdChza2IpKSwgaW5fbXR1KTsKLQotCQlpZiAobWluX210dSA8PSBtaW5sZW4pIHsKLQkJCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJXUpXG4iLAotCQkJCQkgICAgbWluX210dSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbmV3bXNzID0gbWluX210dSAtIG1pbmxlbjsKLQl9IGVsc2UKLQkJbmV3bXNzID0gaW5mby0+bXNzOwotCi0Jb3B0ID0gKHVfaW50OF90ICopdGNwaDsKLQlmb3IgKGkgPSBzaXplb2Yoc3RydWN0IHRjcGhkcik7IGkgPD0gdGNwX2hkcmxlbiAtIFRDUE9MRU5fTVNTOyBpICs9IG9wdGxlbihvcHQsIGkpKSB7Ci0JCWlmIChvcHRbaV0gPT0gVENQT1BUX01TUyAmJiBvcHRbaSsxXSA9PSBUQ1BPTEVOX01TUykgewotCQkJdV9pbnQxNl90IG9sZG1zczsKLQotCQkJb2xkbXNzID0gKG9wdFtpKzJdIDw8IDgpIHwgb3B0W2krM107Ci0KLQkJCS8qIE5ldmVyIGluY3JlYXNlIE1TUywgZXZlbiB3aGVuIHNldHRpbmcgaXQsIGFzCi0JCQkgKiBkb2luZyBzbyByZXN1bHRzIGluIHByb2JsZW1zIGZvciBob3N0cyB0aGF0IHJlbHkKLQkJCSAqIG9uIE1TUyBiZWluZyBzZXQgY29ycmVjdGx5LgotCQkJICovCi0JCQlpZiAob2xkbXNzIDw9IG5ld21zcykKLQkJCQlyZXR1cm4gMDsKLQotCQkJb3B0W2krMl0gPSAobmV3bXNzICYgMHhmZjAwKSA+PiA4OwotCQkJb3B0W2krM10gPSBuZXdtc3MgJiAweDAwZmY7Ci0KLQkJCWluZXRfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssIHNrYiwKLQkJCQkJCSBodG9ucyhvbGRtc3MpLCBodG9ucyhuZXdtc3MpLAotCQkJCQkJIGZhbHNlKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyogVGhlcmUgaXMgZGF0YSBhZnRlciB0aGUgaGVhZGVyIHNvIHRoZSBvcHRpb24gY2FuJ3QgYmUgYWRkZWQKLQkgKiB3aXRob3V0IG1vdmluZyBpdCwgYW5kIGRvaW5nIHNvIG1heSBtYWtlIHRoZSBTWU4gcGFja2V0Ci0JICogaXRzZWxmIHRvbyBsYXJnZS4gQWNjZXB0IHRoZSBwYWNrZXQgdW5tb2RpZmllZCBpbnN0ZWFkLgotCSAqLwotCWlmIChsZW4gPiB0Y3BfaGRybGVuKQotCQlyZXR1cm4gMDsKLQotCS8qIHRjcGgtPmRvZmYgaGFzIDQgYml0cywgZG8gbm90IHdyYXAgaXQgdG8gMCAqLwotCWlmICh0Y3BfaGRybGVuID49IDE1ICogNCkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIE1TUyBPcHRpb24gbm90IGZvdW5kID8hIGFkZCBpdC4uCi0JICovCi0JaWYgKHNrYl90YWlscm9vbShza2IpIDwgVENQT0xFTl9NU1MpIHsKLQkJaWYgKHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLAotCQkJCSAgICAgVENQT0xFTl9NU1MgLSBza2JfdGFpbHJvb20oc2tiKSwKLQkJCQkgICAgIEdGUF9BVE9NSUMpKQotCQkJcmV0dXJuIC0xOwotCQl0Y3BoID0gKHN0cnVjdCB0Y3BoZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB0Y3Bob2ZmKTsKLQl9Ci0KLQlza2JfcHV0KHNrYiwgVENQT0xFTl9NU1MpOwotCi0JLyoKLQkgKiBJUHY0OiBSRkMgMTEyMiBzdGF0ZXMgIklmIGFuIE1TUyBvcHRpb24gaXMgbm90IHJlY2VpdmVkIGF0Ci0JICogY29ubmVjdGlvbiBzZXR1cCwgVENQIE1VU1QgYXNzdW1lIGEgZGVmYXVsdCBzZW5kIE1TUyBvZiA1MzYiLgotCSAqIElQdjY6IFJGQyAyNDYwIHN0YXRlcyBJUHY2IGhhcyBhIG1pbmltdW0gTVRVIG9mIDEyODAgYW5kIGEgbWluaW11bQotCSAqIGxlbmd0aCBJUHY2IGhlYWRlciBvZiA2MCwgZXJnbyB0aGUgZGVmYXVsdCBNU1MgdmFsdWUgaXMgMTIyMAotCSAqIFNpbmNlIG5vIE1TUyB3YXMgcHJvdmlkZWQsIHdlIG11c3QgdXNlIHRoZSBkZWZhdWx0IHZhbHVlcwotCSAqLwotCWlmICh4dF9mYW1pbHkocGFyKSA9PSBORlBST1RPX0lQVjQpCi0JCW5ld21zcyA9IG1pbihuZXdtc3MsICh1MTYpNTM2KTsKLQllbHNlCi0JCW5ld21zcyA9IG1pbihuZXdtc3MsICh1MTYpMTIyMCk7Ci0KLQlvcHQgPSAodV9pbnQ4X3QgKil0Y3BoICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpOwotCW1lbW1vdmUob3B0ICsgVENQT0xFTl9NU1MsIG9wdCwgbGVuIC0gc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKLQotCWluZXRfcHJvdG9fY3N1bV9yZXBsYWNlMigmdGNwaC0+Y2hlY2ssIHNrYiwKLQkJCQkgaHRvbnMobGVuKSwgaHRvbnMobGVuICsgVENQT0xFTl9NU1MpLCB0cnVlKTsKLQlvcHRbMF0gPSBUQ1BPUFRfTVNTOwotCW9wdFsxXSA9IFRDUE9MRU5fTVNTOwotCW9wdFsyXSA9IChuZXdtc3MgJiAweGZmMDApID4+IDg7Ci0Jb3B0WzNdID0gbmV3bXNzICYgMHgwMGZmOwotCi0JaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KCZ0Y3BoLT5jaGVjaywgc2tiLCAwLCAqKChfX2JlMzIgKilvcHQpLCBmYWxzZSk7Ci0KLQlvbGR2YWwgPSAoKF9fYmUxNiAqKXRjcGgpWzZdOwotCXRjcGgtPmRvZmYgKz0gVENQT0xFTl9NU1MvNDsKLQlpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTIoJnRjcGgtPmNoZWNrLCBza2IsCi0JCQkJIG9sZHZhbCwgKChfX2JlMTYgKil0Y3BoKVs2XSwgZmFsc2UpOwotCXJldHVybiBUQ1BPTEVOX01TUzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotdGNwbXNzX3RnNChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCi17Ci0Jc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQlfX2JlMTYgbmV3bGVuOwotCWludCByZXQ7Ci0KLQlyZXQgPSB0Y3Btc3NfbWFuZ2xlX3BhY2tldChza2IsIHBhciwKLQkJCQkgICBQRl9JTkVULAotCQkJCSAgIGlwaC0+aWhsICogNCwKLQkJCQkgICBzaXplb2YoKmlwaCkgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gTkZfRFJPUDsKLQlpZiAocmV0ID4gMCkgewotCQlpcGggPSBpcF9oZHIoc2tiKTsKLQkJbmV3bGVuID0gaHRvbnMobnRvaHMoaXBoLT50b3RfbGVuKSArIHJldCk7Ci0JCWNzdW1fcmVwbGFjZTIoJmlwaC0+Y2hlY2ssIGlwaC0+dG90X2xlbiwgbmV3bGVuKTsKLQkJaXBoLT50b3RfbGVuID0gbmV3bGVuOwotCX0KLQlyZXR1cm4gWFRfQ09OVElOVUU7Ci19Ci0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCi1zdGF0aWMgdW5zaWduZWQgaW50Ci10Y3Btc3NfdGc2KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOwotCXU4IG5leHRoZHI7Ci0JX19iZTE2IGZyYWdfb2ZmLCBvbGRsZW4sIG5ld2xlbjsKLQlpbnQgdGNwaG9mZjsKLQlpbnQgcmV0OwotCi0JbmV4dGhkciA9IGlwdjZoLT5uZXh0aGRyOwotCXRjcGhvZmYgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgc2l6ZW9mKCppcHY2aCksICZuZXh0aGRyLCAmZnJhZ19vZmYpOwotCWlmICh0Y3Bob2ZmIDwgMCkKLQkJcmV0dXJuIE5GX0RST1A7Ci0JcmV0ID0gdGNwbXNzX21hbmdsZV9wYWNrZXQoc2tiLCBwYXIsCi0JCQkJICAgUEZfSU5FVDYsCi0JCQkJICAgdGNwaG9mZiwKLQkJCQkgICBzaXplb2YoKmlwdjZoKSArIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBORl9EUk9QOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKLQkJb2xkbGVuID0gaXB2NmgtPnBheWxvYWRfbGVuOwotCQluZXdsZW4gPSBodG9ucyhudG9ocyhvbGRsZW4pICsgcmV0KTsKLQkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQotCQkJc2tiLT5jc3VtID0gY3N1bV9hZGQoY3N1bV9zdWIoc2tiLT5jc3VtLCBvbGRsZW4pLAotCQkJCQkgICAgIG5ld2xlbik7Ci0JCWlwdjZoLT5wYXlsb2FkX2xlbiA9IG5ld2xlbjsKLQl9Ci0JcmV0dXJuIFhUX0NPTlRJTlVFOwotfQotI2VuZGlmCi0KLS8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBmaW5kX3N5bl9tYXRjaChjb25zdCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKm0pCi17Ci0JY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfdGNwICopbS0+ZGF0YTsKLQotCWlmIChzdHJjbXAobS0+dS5rZXJuZWwubWF0Y2gtPm5hbWUsICJ0Y3AiKSA9PSAwICYmCi0JICAgIHRjcGluZm8tPmZsZ19jbXAgJiBUQ1BIRFJfU1lOICYmCi0JICAgICEodGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX0ZMQUdTKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgdGNwbXNzX3RnNF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUgPSBwYXItPmVudHJ5aW5mbzsKLQljb25zdCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKmVtYXRjaDsKLQotCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKLQkgICAgKHBhci0+aG9va19tYXNrICYgfigoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwKLQkJCSAgICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8Ci0JCQkgICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykpKSAhPSAwKSB7Ci0JCXByX2luZm9fcmF0ZWxpbWl0ZWQoInBhdGgtTVRVIGNsYW1waW5nIG9ubHkgc3VwcG9ydGVkIGluIEZPUldBUkQsIE9VVFBVVCBhbmQgUE9TVFJPVVRJTkcgaG9va3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHBhci0+bmZ0X2NvbXBhdCkKLQkJcmV0dXJuIDA7Ci0KLQl4dF9lbWF0Y2hfZm9yZWFjaChlbWF0Y2gsIGUpCi0JCWlmIChmaW5kX3N5bl9tYXRjaChlbWF0Y2gpKQotCQkJcmV0dXJuIDA7Ci0JcHJfaW5mb19yYXRlbGltaXRlZCgiT25seSB3b3JrcyBvbiBUQ1AgU1lOIHBhY2tldHNcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQotc3RhdGljIGludCB0Y3Btc3NfdGc2X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQotewotCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87Ci0JY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUgPSBwYXItPmVudHJ5aW5mbzsKLQljb25zdCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKmVtYXRjaDsKLQotCWlmIChpbmZvLT5tc3MgPT0gWFRfVENQTVNTX0NMQU1QX1BNVFUgJiYKLQkgICAgKHBhci0+aG9va19tYXNrICYgfigoMSA8PCBORl9JTkVUX0ZPUldBUkQpIHwKLQkJCSAgICgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSB8Ci0JCQkgICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykpKSAhPSAwKSB7Ci0JCXByX2luZm9fcmF0ZWxpbWl0ZWQoInBhdGgtTVRVIGNsYW1waW5nIG9ubHkgc3VwcG9ydGVkIGluIEZPUldBUkQsIE9VVFBVVCBhbmQgUE9TVFJPVVRJTkcgaG9va3NcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHBhci0+bmZ0X2NvbXBhdCkKLQkJcmV0dXJuIDA7Ci0KLQl4dF9lbWF0Y2hfZm9yZWFjaChlbWF0Y2gsIGUpCi0JCWlmIChmaW5kX3N5bl9tYXRjaChlbWF0Y2gpKQotCQkJcmV0dXJuIDA7Ci0JcHJfaW5mb19yYXRlbGltaXRlZCgiT25seSB3b3JrcyBvbiBUQ1AgU1lOIHBhY2tldHNcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IHRjcG1zc190Z19yZWdbXSBfX3JlYWRfbW9zdGx5ID0gewotCXsKLQkJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCi0JCS5uYW1lCQk9ICJUQ1BNU1MiLAotCQkuY2hlY2tlbnRyeQk9IHRjcG1zc190ZzRfY2hlY2ssCi0JCS50YXJnZXQJCT0gdGNwbXNzX3RnNCwKLQkJLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3RjcG1zc19pbmZvKSwKLQkJLnByb3RvCQk9IElQUFJPVE9fVENQLAotCQkubWUJCT0gVEhJU19NT0RVTEUsCi0JfSwKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCi0JewotCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKLQkJLm5hbWUJCT0gIlRDUE1TUyIsCi0JCS5jaGVja2VudHJ5CT0gdGNwbXNzX3RnNl9jaGVjaywKLQkJLnRhcmdldAkJPSB0Y3Btc3NfdGc2LAotCQkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgeHRfdGNwbXNzX2luZm8pLAotCQkucHJvdG8JCT0gSVBQUk9UT19UQ1AsCi0JCS5tZQkJPSBUSElTX01PRFVMRSwKLQl9LAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCB0Y3Btc3NfdGdfaW5pdCh2b2lkKQotewotCXJldHVybiB4dF9yZWdpc3Rlcl90YXJnZXRzKHRjcG1zc190Z19yZWcsIEFSUkFZX1NJWkUodGNwbXNzX3RnX3JlZykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGNwbXNzX3RnX2V4aXQodm9pZCkKLXsKLQl4dF91bnJlZ2lzdGVyX3RhcmdldHModGNwbXNzX3RnX3JlZywgQVJSQVlfU0laRSh0Y3Btc3NfdGdfcmVnKSk7Ci19Ci0KLW1vZHVsZV9pbml0KHRjcG1zc190Z19pbml0KTsKLW1vZHVsZV9leGl0KHRjcG1zc190Z19leGl0KTsKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL2xpbnV4LTUuMTAvbmV0L25ldGZpbHRlci94dF9obC5jIGIvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X2hsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMxYTcwZjguLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vbGludXgtNS4xMC9uZXQvbmV0ZmlsdGVyL3h0X2hsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Ci0vKgotICogSVAgdGFibGVzIG1vZHVsZSBmb3IgbWF0Y2hpbmcgdGhlIHZhbHVlIG9mIHRoZSBUVEwKLSAqIChDKSAyMDAwLDIwMDEgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKgotICogSG9wIExpbWl0IG1hdGNoaW5nIG1vZHVsZQotICogKEMpIDIwMDEtMjAwMiBNYWNpZWogU29sdHlzaWFrIDxzb2x0QGRucy50b3hpY2ZpbG1zLnR2PgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90dGwuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2hsLmg+Ci0KLU1PRFVMRV9BVVRIT1IoIk1hY2llaiBTb2x0eXNpYWsgPHNvbHRAZG5zLnRveGljZmlsbXMudHY+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IEhvcGxpbWl0L1RUTCBmaWVsZCBtYXRjaCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTKCJpcHRfdHRsIik7Ci1NT0RVTEVfQUxJQVMoImlwNnRfaGwiKTsKLQotc3RhdGljIGJvb2wgdHRsX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3R0bF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87Ci0JY29uc3QgdTggdHRsID0gaXBfaGRyKHNrYiktPnR0bDsKLQotCXN3aXRjaCAoaW5mby0+bW9kZSkgewotCWNhc2UgSVBUX1RUTF9FUToKLQkJcmV0dXJuIHR0bCA9PSBpbmZvLT50dGw7Ci0JY2FzZSBJUFRfVFRMX05FOgotCQlyZXR1cm4gdHRsICE9IGluZm8tPnR0bDsKLQljYXNlIElQVF9UVExfTFQ6Ci0JCXJldHVybiB0dGwgPCBpbmZvLT50dGw7Ci0JY2FzZSBJUFRfVFRMX0dUOgotCQlyZXR1cm4gdHRsID4gaW5mby0+dHRsOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaGxfbXQ2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgaXA2dF9obF9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOwotCi0Jc3dpdGNoIChpbmZvLT5tb2RlKSB7Ci0JY2FzZSBJUDZUX0hMX0VROgotCQlyZXR1cm4gaXA2aC0+aG9wX2xpbWl0ID09IGluZm8tPmhvcF9saW1pdDsKLQljYXNlIElQNlRfSExfTkU6Ci0JCXJldHVybiBpcDZoLT5ob3BfbGltaXQgIT0gaW5mby0+aG9wX2xpbWl0OwotCWNhc2UgSVA2VF9ITF9MVDoKLQkJcmV0dXJuIGlwNmgtPmhvcF9saW1pdCA8IGluZm8tPmhvcF9saW1pdDsKLQljYXNlIElQNlRfSExfR1Q6Ci0JCXJldHVybiBpcDZoLT5ob3BfbGltaXQgPiBpbmZvLT5ob3BfbGltaXQ7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgc3RydWN0IHh0X21hdGNoIGhsX210X3JlZ1tdIF9fcmVhZF9tb3N0bHkgPSB7Ci0JewotCQkubmFtZSAgICAgICA9ICJ0dGwiLAotCQkucmV2aXNpb24gICA9IDAsCi0JCS5mYW1pbHkgICAgID0gTkZQUk9UT19JUFY0LAotCQkubWF0Y2ggICAgICA9IHR0bF9tdCwKLQkJLm1hdGNoc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGlwdF90dGxfaW5mbyksCi0JCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgID0gImhsIiwKLQkJLnJldmlzaW9uICAgPSAwLAotCQkuZmFtaWx5ICAgICA9IE5GUFJPVE9fSVBWNiwKLQkJLm1hdGNoICAgICAgPSBobF9tdDYsCi0JCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2hsX2luZm8pLAotCQkubWUgICAgICAgICA9IFRISVNfTU9EVUxFLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBobF9tdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoaGxfbXRfcmVnLCBBUlJBWV9TSVpFKGhsX210X3JlZykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaGxfbXRfZXhpdCh2b2lkKQotewotCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhobF9tdF9yZWcsIEFSUkFZX1NJWkUoaGxfbXRfcmVnKSk7Ci19Ci0KLW1vZHVsZV9pbml0KGhsX210X2luaXQpOwotbW9kdWxlX2V4aXQoaGxfbXRfZXhpdCk7CmRpZmYgLS1naXQgYS91cHN0cmVhbS9wdWIvaW5jbHVkZS9pbmZyYS9wdWJfZGVidWdfaW5mby5oIGIvdXBzdHJlYW0vcHViL2luY2x1ZGUvaW5mcmEvcHViX2RlYnVnX2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAzNTdhYS4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9wdWIvaW5jbHVkZS9pbmZyYS9wdWJfZGVidWdfaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI2lmbmRlZiBfUFVCX0RFQlVHX0lORk9fSF8KLSNkZWZpbmUgX1BVQl9ERUJVR19JTkZPX0hfCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBERUJVR19JTkZPX0RFVl9QQVRIICIvZGV2L2RlYnVnX2luZm8iCi0KLS8qIEFQsuC6zUNBULLgtcRQU1xLRVJORUxcRFJJVkVSXEZTXEFQUCAg0tRTVEFSVH5FTkTOqsf4vOSjrLj3sr+31tSkwfTByzEwMLj2SUQgKi8KLSNkZWZpbmUgTU9EVUxFX0lEX1BTX1NUQVJUCQkJKDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9QU19OQVMJCQkoMSkKLSNkZWZpbmUgTU9EVUxFX0lEX1BTX1JSQwkJCSgyKQotI2RlZmluZSBNT0RVTEVfSURfUFNfTDIJCQkJKDMpCi0jZGVmaW5lIE1PRFVMRV9JRF9QU19VSUNDCQkJKDk5KQotI2RlZmluZSBNT0RVTEVfSURfUFNfRU5ECQkJKDEwMCkKLQotI2RlZmluZSBNT0RVTEVfSURfQVBfS0VSTkVMX1NUQVJUCSgxMDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9LRVJORUxfRU5ECQkoMjAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfS0VSTkVMX1NUQVJUCSgyMDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfS0VSTkVMX0VORAkoMzAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9EUklWRVNfU1RBUlQJKDMwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX1VTQgkJCSgzMDEpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9SRUJPT1QJCQkoMzAyKQotI2RlZmluZSBNT0RVTEVfSURfQVBfVFNDCQkJKDMwMykKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX1BTTQkJCSgzMDQpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9OQU5ECQkJKDMwNSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX01NQwkJCSgzMDYpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9XSUZJCQkJKDMwNykKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0RSSVZFU19FTkQJCSg0MDApCi0KLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9EUklWRVNfU1RBUlQJKDQwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9VU0IJCQkoNDAxKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX1RTQwkJCSg0MDIpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfUFNNCQkJKDQwMykKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9OQU5ECQkJKDQwNCkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9TUEkJCQkoNDA1KQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX01NQwkJCSg0MDYpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfVUFSVAkJCSg0MDcpCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfRFJJVkVTX0VORAkoNTAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9GU19TVEFSVAkJKDUwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0pGRlMyCQkJKDUwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0ZTX0VORAkJCSg2MDApCi0KLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9GU19TVEFSVAkJKDYwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0NBUF9GU19FTkQJCSg3MDApCi0KLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0FQUF9TVEFSVAkJKDcwMSkKLSNkZWZpbmUgTU9EVUxFX0lEX0FQX0ZPVEEJCQkoNzAxKQotI2RlZmluZSBNT0RVTEVfSURfQVBfRlNfQ0hFQ0sJCSg3MDIpCi0jZGVmaW5lIE1PRFVMRV9JRF9BUF9BUFBfRU5ECQkoODAwKQotCi0jZGVmaW5lIE1PRFVMRV9JRF9DQVBfQVBQX1NUQVJUCQkoODAxKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0ZPVEEJCQkoODAxKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0ZTX0NIRUNLCQkoODAyKQotI2RlZmluZSBNT0RVTEVfSURfQ0FQX0FQUF9FTkQJCSg5MDApCi0KLSNpZiBkZWZpbmVkKF9VU0VfWlhJQ19ERUJVR19JTkZPKSAmJiAhZGVmaW5lZChDT05GSUdfU1lTVEVNX1JFQ09WRVJZKQotaW50IHNjX2RlYnVnX2luZm9fdnJlY29yZCh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKLWludCBzY19kZWJ1Z19pbmZvX3JlY29yZCh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBzY19kZWJ1Z19pbmZvX3ZyZWNvcmQodW5zaWduZWQgaW50IGlkLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgc2NfZGVidWdfaW5mb19yZWNvcmQodW5zaWduZWQgaW50IGlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Vwc3RyZWFtL3B1Yi9wcm9qZWN0L3p4Mjk3NTIwdjMvaW5jbHVkZS9kcnYvTnZQYXJhbV9kcnYuaCBiL3Vwc3RyZWFtL3B1Yi9wcm9qZWN0L3p4Mjk3NTIwdjMvaW5jbHVkZS9kcnYvTnZQYXJhbV9kcnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjZjNmY2ZC4uMDAwMDAwMAotLS0gYS91cHN0cmVhbS9wdWIvcHJvamVjdC96eDI5NzUyMHYzL2luY2x1ZGUvZHJ2L052UGFyYW1fZHJ2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiBDb3B5cmlnaHQgKEMpIDIwMTYsIFpURSBDb3Jwb3JhdGlvbi4NCi0qDQotKiBGaWxlIE5hbWU6ICBudnBhcmFtX2Rydi5oDQotKiBGaWxlIE1hcms6DQotKiBEZXNjcmlwdGlvbjogIA0KLSogT3RoZXJzOg0KLSogVmVyc2lvbjogICB2MS4wDQotKiBBdXRob3I6ICAgd2FuZ3hpYQ0KLSogRGF0ZTogICAgICAgICAyMDE2LTAzLTEyDQotKg0KLSogSGlzdG9yeSAxOg0KLSogICAgIERhdGU6DQotKiAgICAgVmVyc2lvbjoNCi0qICAgICBBdXRob3I6DQotKiAgICAgTW9kaWZpY2F0aW9uOg0KLSogSGlzdG9yeSAyOg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotI2lmbmRlZiBOVlBBUkFNX0RSVl9IDQotI2RlZmluZSBOVlBBUkFNX0RSVl9IDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpbmNsdWRlICJSV052Q29uZmlnLmgiDQotI2luY2x1ZGUgIk52UGFyYW1fdHNjLmgiDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNkZWZpbmUJRFJWX05WX0FERFIJCQkJCU9TX0ZMQVNIX0RSVl9SV19OT05GQUNfQkFTRV9BRERSDQotI2RlZmluZQlEUlZfTlZfU0laRQkJCQkJT1NfRkxBU0hfRFJWX1JXX05PTkZBQ19TSVpFCS8qMTZLKi8NCi0NCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18DQotfCAgcHVibGljKDI1NkIpICB8ICAgIHN5c3RlbSgzSykgIHwgIHBsYXRmb3IoM0spICB8IGhpZ2hzcGVlZCg0Syl8IHBlcmlwaGVyYWwoM0spIHwgCWF1ZGlvKDFLKSAJfCByZXNlcnZlZCgxLjc1SykgfA0KLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS18DQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KLQ0KLSNkZWZpbmUJRFJWX1BVQl9OVl9BRERSCQkJCURSVl9OVl9BRERSDQotI2RlZmluZQlEUlZfUFVCX05WX1NJWkUJCQkJKDI1NikNCi0jZGVmaW5lCURSVl9TWVNfTlZfQUREUgkJCQkoRFJWX1BVQl9OVl9BRERSICsgRFJWX1BVQl9OVl9TSVpFKQ0KLSNkZWZpbmUJRFJWX1NZU19OVl9TSVpFCQkJCSgzICogMTAyNCkNCi0jZGVmaW5lCURSVl9QTEFUX05WX0FERFIJCQkoRFJWX1NZU19OVl9BRERSICsgRFJWX1NZU19OVl9TSVpFKQ0KLSNkZWZpbmUJRFJWX1BMQVRfTlZfU0laRQkJCSgzICogMTAyNCkNCi0jZGVmaW5lCURSVl9IU19QRVJJX05WX0FERFIJCQkoRFJWX1BMQVRfTlZfQUREUiArIERSVl9QTEFUX05WX1NJWkUpDQotI2RlZmluZQlEUlZfSFNfUEVSSV9OVl9TSVpFCQkJKDQgKiAxMDI0KQ0KLSNkZWZpbmUJRFJWX1BFUklfTlZfQUREUgkJCShEUlZfSFNfUEVSSV9OVl9BRERSICsgRFJWX0hTX1BFUklfTlZfU0laRSkNCi0jZGVmaW5lCURSVl9QRVJJX05WX1NJWkUJCQkoMyAqIDEwMjQpDQotI2RlZmluZQlEUlZfQVVESU9fTlZfQUREUgkJCShEUlZfUEVSSV9OVl9BRERSICsgRFJWX1BFUklfTlZfU0laRSkNCi0jZGVmaW5lCURSVl9BVURJT19OVl9TSVpFCQkJKDEgKiAxMDI0KQ0KLSNkZWZpbmUJRFJWX1JTVkRfTlZfQUREUgkJCShEUlZfQVVESU9fTlZfQUREUiArIERSVl9BVURJT19OVl9TSVpFKQ0KLSNkZWZpbmUJRFJWX1JTVkRfTlZfU0laRQkJCSgxICogMTAyNCArIDc2OCkNCi0NCi0jZGVmaW5lCURSVl9UT1RBTF9OVl9TSVpFCQkJKERSVl9QVUJfTlZfU0laRStEUlZfU1lTX05WX1NJWkUrRFJWX1BMQVRfTlZfU0laRStEUlZfSFNfUEVSSV9OVl9TSVpFK0RSVl9QRVJJX05WX1NJWkUrRFJWX0FVRElPX05WX1NJWkUrRFJWX1JTVkRfTlZfU0laRSkNCi0NCi0vKiB1c2VyIGludGVyZmFjZSAqLw0KLSNkZWZpbmUgRFJWX1BVQl9OVl9JVEVNX0FERFIoeCkgCShEUlZfUFVCX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfUHViRGF0YSopKDB4MCkpLT54KSkpDQotI2RlZmluZSBEUlZfUFVCX05WX0lURU1fU0laRSh4KSAJKHNpemVvZigoKFRfWkRydk52X1B1YkRhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBEUlZfU1lTX05WX0lURU1fQUREUih4KSAJKERSVl9TWVNfTlZfQUREUiArIChVSU5UMzIpKCYoKChUX1pEcnZOdl9TeXNEYXRhKikoMHgwKSktPngpKSkNCi0jZGVmaW5lIERSVl9TWVNfTlZfSVRFTV9TSVpFKHgpIAkoc2l6ZW9mKCgoVF9aRHJ2TnZfU3lzRGF0YSopKDB4MCkpLT54KSkNCi0NCi0jZGVmaW5lIERSVl9QTEFUX05WX0lURU1fQUREUih4KSAJKERSVl9QTEFUX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfUGxhdERhdGEqKSgweDApKS0+eCkpKQ0KLSNkZWZpbmUgRFJWX1BMQVRfTlZfSVRFTV9TSVpFKHgpIAkoc2l6ZW9mKCgoVF9aRHJ2TnZfUGxhdERhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBEUlZfSFNfUEVSSV9OVl9JVEVNX0FERFIoeCkgKERSVl9IU19QRVJJX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfSFNQZXJpRGF0YSopKDB4MCkpLT54KSkpDQotI2RlZmluZSBERFJWX0hTX1BFUl9OVl9JVEVNX1NJWkUoeCkgKHNpemVvZigoKFRfWkRydk52X0hTUGVyaURhdGEqKSgweDApKS0+eCkpDQotDQotI2RlZmluZSBEUlZfUEVSX05WX0lURU1fQUREUih4KSAJKERSVl9QRVJJX05WX0FERFIgKyAoVUlOVDMyKSgmKCgoVF9aRHJ2TnZfUGVyaURhdGEqKSgweDApKS0+eCkpKQ0KLSNkZWZpbmUgRFJWX1BFUl9OVl9JVEVNX1NJWkUoeCkgCShzaXplb2YoKChUX1pEcnZOdl9QZXJpRGF0YSopKDB4MCkpLT54KSkNCi0NCi0jZGVmaW5lIERSVl9BVURJT19OVl9JVEVNX0FERFIoeCkgCShEUlZfQVVESU9fTlZfQUREUiArIChVSU5UMzIpKCYoKChUX1pEcnZOdl9BdWRpb0RhdGEqKSgweDApKS0+eCkpKQ0KLSNkZWZpbmUgRFJWX0FVRElPX05WX0lURU1fU0laRSh4KSAJKHNpemVvZigoKFRfWkRydk52X0F1ZGlvRGF0YSopKDB4MCkpLT54KSkNCi0NCi0jZGVmaW5lIE9TX0ZMQVNIX1ZPSUNFX0RSVl9SV19OT05GQUNfQkFTRV9BRERSICAgICAgICAgKE9TX0ZMQVNIX0RSVl9SV19OT05GQUNfQkFTRV9BRERSICsgMTUzNjApDQotI2RlZmluZSBPU19GTEFTSF9WT0lDRV9EUlZfTk9ORkFDX1NJWkUgICAgIDEwMjQNCi0NCi0jaWYgRFJWX1RPVEFMX05WX1NJWkUgPiAoT1NfRkxBU0hfRFJWX1JXX05PTkZBQ19TSVpFKQ0KLSNlcnJvciAiZXJyb3IgZHJ2IG52IGNvbmZpZyEhISINCi0jZW5kaWYNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcw0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogCSAgICAgICAgIERydiBOViBDb25maWcNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotMS4gcHVibGljIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydk52X1B1YkRhdGENCi17DQotCS8qIDB4MDAgKi8gCUNIQVIgIAljaGlwTmFtZVsxNl07DQotCS8qIDB4MTAgKi8gCUNIQVIJcHJqTmFtZVsxNl07DQotCS8qIDB4MjAgKi8gCUNIQVIgCWV4dGVybmFsVmVyWzE2XTsNCi0JLyogMHgzMCAqLyAJQ0hBUiAJaW50ZXJuYWxWZXJbMTZdOw0KLQkvKiAweDQwICovIAlDSEFSIAlyZWxlYXNlVGltZVsxNl07DQotCS8qIDB4NTAgKi8gCVVJTlQ4IAlwcm9kdWN0VHlwZTsNCi0JLyogMHg1MSAqLyAJVUlOVDggCXJlc2VydmVkW0RSVl9QVUJfTlZfU0laRSAtIDB4NTFdOw0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFRfWkRydk52X1B1YkRhdGE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotMi4gc3lzdGVtIGdyb3VwIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydk52X1N5c0RhdGENCi17DQotCS8qIDB4MDAwICovCVRfU1lTX05WX1RTQ19DT05GSUcgdHNjX2NvbmZpZzsNCi0JCQkJVUlOVDggcmVzZXJ2ZWQwWzEyXTsNCi0JLyogMHg3MCAqLwlVSU5UMzIgYnVjazFPbm9mZkZsYWc7DQotCS8qIDB4NzQgICovCVVJTlQzMiB3ZHRTd2l0Y2g7DQotCS8qIDB4NzggICovCVVJTlQzMiB3ZHRQcmlvcml0eTsNCi0JLyogMHg3QyAqLwlVSU5UOCB1aWNjbW9kZVN3aXRjaDsNCi0JLyogMHg3RCAqLwlVSU5UOCB1aWNjUHJlU3dpdGNoOyANCi0JLyogMHg3RSAqLwlVSU5UOCB1aWNjMW1vZGVTd2l0Y2g7DQotCS8qIDB4N0YgKi8JVUlOVDggdWljYzFQcmVTd2l0Y2g7IA0KLQkvKiAweDgwICovCVVJTlQ4IGlzaHBub3RzdXBwb3J0ZWQ7DQotICAgICAgICAgICAgICBVSU5UOCByZXNlcnZlZFtEUlZfU1lTX05WX1NJWkUgLSAxMjldOw0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFRfWkRydk52X1N5c0RhdGE7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotMy4gcGxhdGZvcm0gZ3JvdXAgbnZfZGF0YQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCBfVF9aRHJ2TnZfUGxhdERhdGENCi17DQotCVVJTlQ4IHJlc2VydmVkW0RSVl9QTEFUX05WX1NJWkVdOw0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFRfWkRydk52X1BsYXREYXRhOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTQuIGhpZ24tc3BlZWQgcGVyaXBoZXJhbCBncm91cCBudl9kYXRhDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXR5cGVkZWYgc3RydWN0IF9UX1pEcnZOdl9IU1BlcmlEYXRhDQotew0KLQlVSU5UOCByZXNlcnZlZFtEUlZfSFNfUEVSSV9OVl9TSVpFXTsNCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBUX1pEcnZOdl9IU1BlcmlEYXRhOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTUuIGNvbW1vbiBwZXJpcGhlcmFsIGdyb3VwIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydk52X1BlcmlEYXRhDQotew0KLSAgICBVSU5UOCBiYXRfZGV0Ow0KLSAgICBVSU5UOCByZXNlcnZlZFtEUlZfUEVSSV9OVl9TSVpFLTFdOw0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFRfWkRydk52X1BlcmlEYXRhOw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLTYuIGF1ZGlvIGdyb3VwIG52X2RhdGENCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotdHlwZWRlZiBzdHJ1Y3QgX1RfWkRydk52X0F1ZGlvRGF0YQ0KLXsNCi0gICAgVUlOVDggcmVzZXJ2ZWRbRFJWX0FVRElPX05WX1NJWkVdOw0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFRfWkRydk52X0F1ZGlvRGF0YTsNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi03LiBhbGwgZHJpdmVyX3VzZWQgbnZfZGF0YQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi10eXBlZGVmIHN0cnVjdCBfVF9aRHJ2X052RGF0YQ0KLXsNCi0JLyogMHgwMDAwICovCVRfWkRydk52X1B1YkRhdGEJcHViRGF0YTsNCi0JLyogMHgwMTAwICovCVRfWkRydk52X1N5c0RhdGEJc3lzRGF0YTsNCi0JLyogMHgwRDAwICovCVRfWkRydk52X1BsYXREYXRhCXBsYXREYXRhOw0KLQkvKiAweDE5MDAgKi8JVF9aRHJ2TnZfSFNQZXJpRGF0YQlIU1BlcmlEYXRhOw0KLQkvKiAweDI5MDAgKi8JVF9aRHJ2TnZfUGVyaURhdGEJcGVyaURhdGE7DQotCS8qIDB4MzUwMCAqLwlUX1pEcnZOdl9BdWRpb0RhdGEJYXVkaW9EYXRhOw0KLQkvKiAweDM5MDAgKi8JVUlOVDgJCQkJcmVzZXJ2ZWRbRFJWX1JTVkRfTlZfU0laRV07DQotfSBUX1pEcnZfTnZEYXRhOw0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAljaGVjayBzdHJ1Y3Qgc2l6ZQ0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1zdGF0aWMgaW5saW5lIENIQVIgekRydk52X0NoZWNrVHlwZVNpemUodm9pZCkNCi17IFwNCi0JQ0hBUiBfX2R1bW15MVsoc2l6ZW9mKFRfWkRydl9OdkRhdGEpPT1EUlZfTlZfU0laRSk/MTotMV09ezB9OyBcDQotCUNIQVIgX19kdW1teTJbKHNpemVvZihUX1pEcnZOdl9QdWJEYXRhKT09RFJWX1BVQl9OVl9TSVpFKT8xOi0xXT17MH07IFwNCi0JQ0hBUiBfX2R1bW15M1soc2l6ZW9mKFRfWkRydk52X1N5c0RhdGEpPT1EUlZfU1lTX05WX1NJWkUpPzE6LTFdPXswfTsgXA0KLQlDSEFSIF9fZHVtbXk0WyhzaXplb2YoVF9aRHJ2TnZfUGxhdERhdGEpPT1EUlZfUExBVF9OVl9TSVpFKT8xOi0xXT17MH07IFwNCi0JQ0hBUiBfX2R1bW15NVsoc2l6ZW9mKFRfWkRydk52X0hTUGVyaURhdGEpPT1EUlZfSFNfUEVSSV9OVl9TSVpFKT8xOi0xXT17MH07IFwNCi0JQ0hBUiBfX2R1bW15Nlsoc2l6ZW9mKFRfWkRydk52X1BlcmlEYXRhKT09RFJWX1BFUklfTlZfU0laRSk/MTotMV09ezB9OyBcDQotCUNIQVIgX19kdW1teTdbKHNpemVvZihUX1pEcnZOdl9BdWRpb0RhdGEpPT1EUlZfQVVESU9fTlZfU0laRSk/MTotMV09ezB9OyBcDQotCXJldHVybiAoX19kdW1teTFbMF0rX19kdW1teTJbMF0rX19kdW1teTNbMF0rX19kdW1teTRbMF0rX19kdW1teTVbMF0rX19kdW1teTZbMF0rX19kdW1teTdbMF0pOyBcDQotfQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qIAlvbGQgc3RydWN0DQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSNpZiAwDQotdHlwZWRlZiBzdHJ1Y3QgX1RfU3lzX0Rydl9Odl9EYXRhDQotew0KLQlUX1NZU19OVl9UU0NfQ09ORklHIHRzY19jb25maWc7DQotCVVJTlQ4IHJlc2VydmVkWzZdOw0KLQlVSU5UMzIgd2R0U3dpdGNoOw0KLX1UX1N5c19EcnZfTnZfRGF0YTsNCi0jZW5kaWYNCi10eXBlZGVmIHN0cnVjdCBfVF9EcnZfTnZfRGF0YQ0KLXsNCi0JVUlOVDMyIFZwRGF0YVsxMDI0XTsvL2FkZCBieSBsdndlbmh1YSBmb3Igdm9pY2UgMjAxMy4xMi42DQotfVRfRHJ2X052X0RhdGE7DQotDQotI2RlZmluZSBEUlZfTlZfSVRFTV9BRERSRVNTKHgpIChEUlZfQVVESU9fTlZfQUREUiArIChVSU5UMzIpKCYoKChUX0Rydl9Odl9EYXRhKikoMHgwKSktPngpKSkNCi0vL2ZsYWcgdXNlIDMyYnl0ZQ0KLXR5cGVkZWYgc3RydWN0IF9UX0F1ZGlvX052RmxhZw0KLXsNCi0gICAgVUlOVDggICAgICAgICAgIGlzVnBDb25maWdJbml0T247DQotICAgIFVJTlQ4ICAgICAgICAgICBpc1ZwUGFyYW1Jbk52Ow0KLSAgICBVSU5UOCAgICAgICAgICAgaXNVc2VTbGljQ29kZWM7DQotICAgIFVJTlQ4ICAgICAgICAgICBpc1VzZVZvaWNlUHJvYzsvLzQgVUlOVDggICAgICAgICAgIGlzVXNlTlhQOw0KLSAgICBVSU5UOCAgICAgICAgICAgaXNVc2VDb2RlY0RzcDsJDQotCVVJTlQ4CQkJaXNVc2VOdldyaXRlOw0KLQlVSU5UOAkJCWlzQ2xvc2VWcEJ1ZmZlckJhazsNCi0JVUlOVDgJCQlpc1VzZVRkbTsvLzgNCi0JVUlOVDgJCQlpc1VzZVJ4RHRtZkRldDsNCi0JVUlOVDgJCQlpc1VzZVR4RHRtZkRldDsgICAgIA0KLSAgICBVSU5UOAkJCWlzVXNlUnhNaXhEYXRhOw0KLQlVSU5UOAkJCWlzVXNlVHhNaXhEYXRhOy8vMTINCi0JVUlOVDgJCQlpc1VzZUVjYWxsOw0KLSAgICBVSU5UOCAgICAgICAgICAgcmVzZXJ2ZWRbMTldOy8vMzItMTMNCi0JDQotfSAgVF9BdWRpb19OdkZsYWc7DQotDQotI2VuZGlmDQotDQpkaWZmIC0tZ2l0IGEvdXBzdHJlYW0vcHViL3Byb2plY3QvengyOTc1MjB2My9pbmNsdWRlL2luZnJhL3JhbV9iYXNlX2NvbmZpZ183NTIwdjMuaCBiL3Vwc3RyZWFtL3B1Yi9wcm9qZWN0L3p4Mjk3NTIwdjMvaW5jbHVkZS9pbmZyYS9yYW1fYmFzZV9jb25maWdfNzUyMHYzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZhMTYyNmQuLjAwMDAwMDAKLS0tIGEvdXBzdHJlYW0vcHViL3Byb2plY3QvengyOTc1MjB2My9pbmNsdWRlL2luZnJhL3JhbV9iYXNlX2NvbmZpZ183NTIwdjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSogsObIqMv509AgKEMpMjAxNSwg1tDQy82o0ba5ybfd09DP3rmry76how0KLSogDQotKiDOxLz+w/uzxjogICAgIHJhbV9jb25maWdfNzUyMHYzLmgNCi0qIM7EvP6x6sq2OiAgICAgcmFtX2NvbmZpZ183NTIwdjMuaA0KLSogxNrI3dWq0qo6ICAgICB6eDI5NzUyMHYz0L7GrMa9zKi05rSitdjWt8Xk1sPNt87EvP4NCi0qIMq508O3vbeoOiAgICAgI2luY2x1ZGUgInJhbV9jb25maWcuaCINCi0qIA0KLSog0N64xMjVxtogICAgICAgILDmsb66xSAgICAgINDeuMSx6rzHICAgICAgICDQ3rjEyMsgICAgICAgICAg0N64xMTayN0NCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSogMjAxNS8wNi8wOCAgICAgIFYxLjAgICAgICAgIENyZWF0ZSAgICAgICAgICDB9dHHxM8gICAgICAgICAgtLS9qA0KLSogDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jaWZuZGVmIF9SQU1fQkFTRV9DT05GSUdfNzUyMFYzDQotI2RlZmluZSBfUkFNX0JBU0VfQ09ORklHXzc1MjBWMw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgzbfOxLz+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAguuq2qNLlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qIElSQU0wu/m12Na3ICovDQotI2lmZGVmIEREUl9CQVNFX0FERFJfTElOVVhfVkENCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKShaWF9JUkFNMF9CQVNFKSkNCi0jZWxzZQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFIgICAgICAgICAgICAgICAgICAoMHg4MjAwMDAwMFVMPj5DUFVfU0hJRlQpDQotI2VuZGlmDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOICAgICAgICAgICAgICAgICAgICgweDAwMDEwMDAwVUw+PkNQVV9TSElGVCkNCi0NCi0vKiAxSywg0uyzo8/ywb+x7TogMHg4MjAwMDAwMC8weDQxMDAwMDAwICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9WRUNUT1IgICAgICAgICAgIChJUkFNX0JBU0VfQUREUikgDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1ZFQ1RPUiAgICAgICAgICAgICgoMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0jZGVmaW5lIE9UUF9TRUNVUkVfUFVLX0JBU0UgICAgICAgICAgICAgIElSQU1fQkFTRV9BRERSX1ZFQ1RPUiArIDB4NA0KLQ0KLS8qIDEyS6Osx/22r7rLvOTNqNG2ICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9EUlYgICAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9WRUNUT1IgKyBJUkFNX0JBU0VfTEVOX1ZFQ1RPUikNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fRFJWICAgICAgICAgICAgICAgKCgxMiAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAxS6OsyqG158P8we69u7ulICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9QU00gICAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9EUlYgKyBJUkFNX0JBU0VfTEVOX0RSVikNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fUFNNICAgICAgICAgICAgICAgKCgxICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDRLo6xQU9PrUEhZ0MXPor27u6WjrLmrubLStc7xICAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfUFVCICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfUFNNICsgSVJBTV9CQVNFX0xFTl9QU00pDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1BVQiAgICAgICAgICAgICAgICgoNCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiA1MTJCo6xQU9PrUEhZ0MXPor27u6WjrMnkxrW5q7my0rXO8SAgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1BVQl9SRiAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1BVQikNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fUFVCX1JGICAgICAgICAgICAgKDUxMlVMPj5DUFVfU0hJRlQpDQotDQotLyogMzJCo6y4qMSjyr1BRkO7urTmyv2+3b/VvOQgICAgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NMQVZFX0FGQyAgICAgICAgKElSQU1fQkFTRV9BRERSX1BVQl9SRiArIElSQU1fQkFTRV9MRU5fUFVCX1JGKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9TTEFWRV9BRkMgICAgICAgICAoMzJVTD4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDFLo6zOwr/Yyv2+3bTmt8UgICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9UUEMgICAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9QVUIgKyBJUkFNX0JBU0VfTEVOX1BVQikNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fVFBDICAgICAgICAgICAgICAgKCgxICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDJLo6zW0LbPz9+zzLnsvKO05rfFICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUMgICAgIChJUkFNX0JBU0VfQUREUl9UUEMgKyBJUkFNX0JBU0VfTEVOX1RQQykNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDICAgICAgKCgyICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDFLLM+1zbO4+tfZvMfCvCAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICAgICAgICAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDICsgSVJBTV9CQVNFX0xFTl9PU19TVEFUSVNUSUMpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1NZU19UUkFDRSAgICAgICAgICgoMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiBJUkFNIElDULXY1rcgICAgICovDQotI2RlZmluZSBJQ1BfQ01EX0JBU0VfQUREUiAgICAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUikNCi0jZGVmaW5lIElDUF9EUlZfQkFTRV9BRERSICAgICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX0RSVikNCi0jZGVmaW5lIERVQUxfU1RBTkRCWV9JTlRFUkZfR1NNX1VTRV9JTkZPX0JBU0VfQUREUiAgKElSQU1fQkFTRV9BRERSX0dTTSkNCi0NCi0vKiC497rLSVJBTbnsvKO12Na3ICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfUFNDUFUgICAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9PU19TVEFUSVNUSUNfUFNDUFUgICAgKDB4MjAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX09TX1NUQVRJU1RJQ19QSFlDUFUgIChJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfUFNDUFUgKyBJUkFNX0JBU0VfTEVOX09TX1NUQVRJU1RJQ19QU0NQVSkNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX1BIWUNQVSAgICgweDIwMFVMPj5DUFVfU0hJRlQpDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9PU19TVEFUSVNUSUNfQVBDUFUgICAoSVJBTV9CQVNFX0FERFJfT1NfU1RBVElTVElDX1BIWUNQVSArIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX1BIWUNQVSkNCi0jZGVmaW5lIElSQU1fQkFTRV9MRU5fT1NfU1RBVElTVElDX0FQQ1BVICAgICgweDQwMFVMPj5DUFVfU0hJRlQpDQotDQotLyoguPe6y0lSQU24+tfZtdjWtyAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFX1JNQ1BVICAgICAgKElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSkNCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRV9BUENQVSAgICAgIChJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UgKyAoMHgxMD4+Q1BVX1NISUZUKSkNCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRV9QU0NQVSAgICAgIChJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UgKyAoMHgyMD4+Q1BVX1NISUZUKSkNCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRV9QSFlDUFUgICAgIChJUkFNX0JBU0VfQUREUl9TWVNfVFJBQ0UgKyAoMHgzMD4+Q1BVX1NISUZUKSkNCi0NCi0vKiBwaHkgbG9n08W7r7e9sLi4tNPDIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSC68zUxMtfWvdq/1bzkICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9aQ0FUX1BIWV9MT0cgICAgICAgICAoSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICsgKDB4MjAwPj5DUFVfU0hJRlQpKQ0KLQ0KLS8qIHBoeSBsb2e2qsqnuPrX2be9sLi4tNPDIElSQU1fQkFTRV9BRERSX1NZU19UUkFDRSC68zY019a92r/VvOQgKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9QSFlfTE9HX0RST1BfVFJBQ0UgICAgCShJUkFNX0JBU0VfQUREUl9aQ0FUX1BIWV9MT0cgKyAoMHgyMDA+PkNQVV9TSElGVCkgLSAoMHg0MD4+Q1BVX1NISUZUKSkNCi0NCi0vKiC8x8K8cmFtZHVtcMSjyr06IDTX1r3av9W85CovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9SQU1EVU1QX01PREUgICAgICAgICAoSVJBTV9CQVNFX1BIWV9MT0dfRFJPUF9UUkFDRSAtICgweDA0Pj5DUFVfU0hJRlQpKQ0KLQ0KLS8qILzHwrxTSE0gYnVmZmVytdjWtzogMTbX1r3av9W85CovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9TSE1fUkVNT1RFX1JFR0lPTiAgICAoSVJBTV9CQVNFX0FERFJfUkFNRFVNUF9NT0RFIC0gKDB4MTA+PkNQVV9TSElGVCkpDQotDQotLyogvMfCvHpjYXTEo8q9OiA019a92r/VvOQqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfWkNBVF9NT0RFICAgICAgICAgICAgKElSQU1fQkFTRV9BRERSX1NITV9SRU1PVEVfUkVHSU9OIC0gKDB4MDQ+PkNQVV9TSElGVCkpDQotDQotLyoguLTTw7nsvKO1xMewNLj219a92rzHwrxib290tKu13bXERERSIHNpemXQxc+iICovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9CT09UX0REUiAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfRFJWIC0gKDB4MDQ+PkNQVV9TSElGVCkpDQotDQotLyogSVJBTTG7+bXY1rcgKi8NCi0jaWZkZWYgIEREUl9CQVNFX0FERFJfTElOVVhfVkENCi0jZGVmaW5lIElSQU0xX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykoWlhfSVJBTTFfQkFTRSkpDQotI2Vsc2UNCi0jZGVmaW5lIElSQU0xX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICgweDAwMTAwMDAwPj5DUFVfU0hJRlQpDQotI2VuZGlmDQotI2RlZmluZSBJUkFNMV9CQVNFX0xFTiAgICAgICAgICAgICAgICAgICAoMHgwMDAwMzAwMD4+Q1BVX1NISUZUKQ0KLQ0KLQ0KLSNkZWZpbmUgRERSX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgICAoMHgyMDAwMDAwMFVMPj5DUFVfU0hJRlQpDQotDQotLyogM02jrM7vwO2y47Dmsb6jrNPJUFO809TYICAqLw0KLS8qIDc1MjC1xFpTUMXk1sPOqrfHQ2FjaGXH+KOs1rvE3MXk1sM0uPa2zqOsx9LDv7j2ts612Na3u7nT0MzYtqjSqsfzo6y4w7XY1rex5Lav0OjT687vwO2y48i3yM8gKi8NCi0jaWZkZWYgIEREUl9CQVNFX0FERFJfTElOVVhfVkENCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUEhZICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKShaWF9ERFJfUEhZQ09ERV9CQVNFKSkNCi0jZWxzZQ0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QSFkgICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUikNCi0jZW5kaWYNCi0NCi0jaWZkZWYgX1VTRV9MVEVfT05MWQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1BIWSAgICAgICAgICAgICAgICAoMHgwMDIwMDAwMFVMPj5DUFVfU0hJRlQpDQotI2Vsc2UNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QSFkgICAgICAgICAgICAgICAgKDB4MDAzMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbmRpZg0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX1BIWSAgICAgICAgICAgICAgICAoMCkNCi0NCi0vKiAxLjVNo6zO78DtsuNEQVRBL0hBUlEvQ1JDICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1BIWV9EQVRBICAgICAgICAgIChERFJfQkFTRV9BRERSX1BIWSArIEREUl9CQVNFX0xFTl9QSFkpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUEhZX0RBVEEgICAgICAgICAgICgweDAwMTgwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9QSFlfREFUQSAgICAgICAgICAgKEREUl9CQVNFX09GRl9QSFkgKyBERFJfQkFTRV9MRU5fUEhZKQ0KLQ0KLS8qIDEuME2jrNCt0unVu9Przu/A7bLjvbu7pSAqLyANCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfTFRFX0RBVEEgICAgICAgICAgKEREUl9CQVNFX0FERFJfUEhZICsgRERSX0JBU0VfTEVOX1BIWSkgLy9ERFJfQkFTRV9MRU5fUEhZX05WDQotI2RlZmluZSBERFJfQkFTRV9MRU5fTFRFX0RBVEEgICAgICAgICAgICgweDAwMTAwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9MVEVfREFUQSAgICAgICAgICAgKEREUl9CQVNFX09GRl9QSFkgKyBERFJfQkFTRV9MRU5fUEhZKQ0KLQ0KLS8qIDAuMjVNo6zWp7PFtbyz9lJhbWR1bXAgICAgICAgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfUkFNRFVNUCAgICAgICAgICAgKEREUl9CQVNFX0FERFJfTFRFX0RBVEEgKyBERFJfQkFTRV9MRU5fTFRFX0RBVEEpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fUkFNRFVNUCAgICAgICAgICAgICgweDAwMDQwMDAwVUw+PkNQVV9TSElGVCkNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9SQU1EVU1QICAgICAgICAgICAgKEREUl9CQVNFX09GRl9MVEVfREFUQSArIEREUl9CQVNFX0xFTl9MVEVfREFUQSkNCi0NCi0jaWZkZWYgX1VTRV9WRUhJQ0xFX0RDIC8qILO11NjLq7rLTGludXggKi8NCi0vKiAzNy43NU2jrEFQubK6y7Dmsb4otMu089ChysewtNXVuqxDQVC6y7XENjRNxNq05sXk1sO2qNLlo6y4w7rqsfC0prK7u+Gxu8q508MpICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX0FQICAgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX1JBTURVTVAgKyBERFJfQkFTRV9MRU5fUkFNRFVNUCkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9BUCAgICAgICAgICAgICAgICAgKDB4MDI1QzAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX0FQICAgICAgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX1JBTURVTVAgKyBERFJfQkFTRV9MRU5fUkFNRFVNUCkNCi0NCi0vKiAyTSwgc2hhcmUgbWVtb3J5IGJldHdlZW4gYXAgYW5kIGNhcCAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9DQVBfQlVGICAgICAgICAgICAoRERSX0JBU0VfQUREUl9BUCArIEREUl9CQVNFX0xFTl9BUCkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9DQVBfQlVGICAgICAgICAgICAgKDB4MDAyMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX0NBUF9CVUYgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX0FQICsgRERSX0JBU0VfTEVOX0FQKQ0KLQ0KLS8qIDg0TS8yMTJNLCBjYXCw5rG+ICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX0NBUCAgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX0NBUF9CVUYgKyBERFJfQkFTRV9MRU5fQ0FQX0JVRikNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9DQVAgICAgICAgICAgICAgICAgKDB4MDU0MDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX0NBUCAgICAgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX0NBUF9CVUYgKyBERFJfQkFTRV9MRU5fQ0FQX0JVRikNCi0NCi0vKiBjYXC6y7XEZHRitdjWt7mpdWJvb3S6y2NhcCBrZXJuZWzKudPDICovDQotI2RlZmluZSBERFJfQkFTRV9DQVBfRFRCX0FERFIgICAgICAgICAgIChERFJfQkFTRV9BRERSX0NBUF9CVUYgKyAoMHgwMDEwMDAwMFVMPj5DUFVfU0hJRlQpKQ0KLSNlbHNlDQotLyogNDIuNzVNo6xBULmyusuw5rG+KLTLtPPQocrHsLTV1bqsQ0FQusu1xDY0TcTatObF5NbDtqjS5aOsuMO66rHwtKayu7vhsbvKudPDKSAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9BUCAgICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9SQU1EVU1QICsgRERSX0JBU0VfTEVOX1JBTURVTVApDQotI2lmZGVmIF9VU0VfTFRFX09OTFkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9BUCAgICAgICAgICAgICAgICAgKDB4MDJCQzAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbHNlDQotI2RlZmluZSBERFJfQkFTRV9MRU5fQVAgICAgICAgICAgICAgICAgICgweDAyQUMwMDAwVUw+PkNQVV9TSElGVCkNCi0jZW5kaWYNCi0jZGVmaW5lIEREUl9CQVNFX09GRl9BUCAgICAgICAgICAgICAgICAgKEREUl9CQVNFX09GRl9SQU1EVU1QICsgRERSX0JBU0VfTEVOX1JBTURVTVApDQotDQotLyogMU0sIHNoYXJlIG1lbW9yeSBiZXR3ZWVuIGFwIGFuZCBjYXAgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfQ0FQX0JVRiAgICAgICAgICAgKEREUl9CQVNFX0FERFJfQVAgKyBERFJfQkFTRV9MRU5fQVApDQotI2lmbmRlZiBERFJfQkFTRV9MRU5fQ0FQX0JVRg0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX0NBUF9CVUYgICAgICAgICAgICAoMHgwMDEwMDAwMFVMPj5DUFVfU0hJRlQpDQotI2VuZGlmDQotI2RlZmluZSBERFJfQkFTRV9PRkZfQ0FQX0JVRiAgICAgICAgICAgIChERFJfQkFTRV9PRkZfQVAgKyBERFJfQkFTRV9MRU5fQVApDQotDQotLyogMTZNLCBjYXCw5rG+ICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX0NBUCAgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX0NBUF9CVUYgKyBERFJfQkFTRV9MRU5fQ0FQX0JVRikNCi0jaWZuZGVmIEREUl9CQVNFX0xFTl9DQVANCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9DQVAgICAgICAgICAgICAgICAgKDB4MDEwMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNlbmRpZg0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX0NBUCAgICAgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX0NBUF9CVUYgKyBERFJfQkFTRV9MRU5fQ0FQX0JVRikNCi0jZW5kaWYNCi0NCi0jZGVmaW5lIEREUl9CQVNFX1BIWUNPREVfQUREUl9QQSAgICAgCShERFJfQkFTRV9BRERSKQ0KLSNkZWZpbmUgRERSX0JBU0VfTU9ERU1fQUREUl9QQSAgICAgICAJKEREUl9CQVNFX1BIWUNPREVfQUREUl9QQSArIEREUl9CQVNFX0xFTl9QSFkpDQotI2RlZmluZSBERFJfQkFTRV9NT0RFTV9TSVpFICAgICAgICAgIAkoRERSX0JBU0VfTEVOX0xURV9EQVRBICsgRERSX0JBU0VfTEVOX1JBTURVTVApDQotI2RlZmluZSBERFJfQkFTRV9BUF9BRERSX1BBICAgICAgICAgICAgIChERFJfQkFTRV9NT0RFTV9BRERSX1BBICsgRERSX0JBU0VfTU9ERU1fU0laRSkNCi0NCi0jZGVmaW5lIEREUl9CQVNFX0NBUEJVRl9BRERSX1BBICAgICAgICAgKEREUl9CQVNFX0FQX0FERFJfUEEgKyBERFJfQkFTRV9MRU5fQVApDQotI2RlZmluZSBERFJfQkFTRV9DQVBfQUREUl9QQSAgICAgICAgICAgIChERFJfQkFTRV9DQVBCVUZfQUREUl9QQSArIEREUl9CQVNFX0xFTl9DQVBfQlVGKQ0KLQ0KLQ0KLS8qIDFNo6zO78DtsuNOViAgICAgv9W85Li008MgICAgICAgICAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QSFlfTlYgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9MVEVfREFUQSkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QSFlfTlYgICAgICAgICAgICAgKDB4MDAxMDAwMDBVTD4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDAuMzc1TaOsx/22r8qhtee3/tPDUFM8LT5QSFm9u7ulv9W85CAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QU00gICAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9MVEVfREFUQSkNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QU00gICAgICAgICAgICAgICAgKDB4MDAwNjAwMDBVTD4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgRERSX0JBU0VfT0ZGX1BTTSAgICAgICAgICAgICAgICAoRERSX0JBU0VfT0ZGX1JBTURVTVApDQotDQotLyogMU2jrNCt0unVu9Przu/A7bLjvbu7pSAgv9W85Li008MgKi8NCi0jZGVmaW5lIEREUl9CQVNFX0FERFJfV0NETUFfREFUQSAgICAgICAgKEREUl9CQVNFX0FERFJfTFRFX0RBVEEpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fV0NETUFfREFUQSAgICAgICAgIChERFJfQkFTRV9MRU5fTFRFX0RBVEEpDQotDQotI2lmIDANCi0vKiBQc0J1ZmZlcrv51rcgKi8NCi0jZGVmaW5lIFBTX0JVRl9CQVNFX0FERFIgICAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfUFNCVUYpDQotI2VuZGlmDQotDQotLyogSUNQu/nWtyAgICAgICovDQotI2RlZmluZSBJQ1BfREFUQV9CQVNFX0FERFIgICAgICAgICAgICAgIChERFJfQkFTRV9BRERSX0xURV9EQVRBKQ0KLQ0KLS8qIFdDRE1Bu/nWtyAgICAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9GT1JfVyAgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9XQ0RNQV9EQVRBKQ0KLQ0KLS8qILmkvt+0+sDtu/nWtyAqLw0KLS8qICNkZWZpbmUgVE9PTF9BR0VOVF9CQVNFX0FERFIgICAgICAgICAgICAoRERSX0JBU0VfQUREUl9UT09MX0FHRU5UKSAqLw0KLQ0KLSNpZiAwDQotLyogUFBQu/nWtyAgICAgICovDQotI2RlZmluZSBQTEFUX1BQUF9CQVNFX0FERFIgICAgICAgICAgICAgIChQU19CVUZfQkFTRV9BRERSKQ0KLSNlbmRpZg0KLQ0KLS8qKi8NCi0jZGVmaW5lIFNIQVJFX0JVRl9BUF9DUF9CQVNFX0FERFIgICAgICAgKEREUl9CQVNFX0FERFJfQVBfQ1BfU0hBUkVCVUYpDQotDQotI2lmIGRlZmluZWQoX1VTRV9DQVBfU1lTKSB8fCBkZWZpbmVkKF9VU0VfVkVISUNMRV9EQykNCi0jZGVmaW5lIElDUF9DQVBfQlVGX0FERFIgICAgICAgICAgICAgICAgRERSX0JBU0VfQUREUl9DQVBfQlVGDQotI2RlZmluZSBJQ1BfQ0FQX0JVRl9MRU4gICAgICAgICAgICAgICAgICgoOTI0ICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLSNkZWZpbmUgVE9PTF9DQVBfQlVGX0FERFIgICAgICAgICAgICAgICAoSUNQX0NBUF9CVUZfQUREUiArIElDUF9DQVBfQlVGX0xFTikNCi0jZGVmaW5lIFRPT0xfQ0FQX0JVRl9MRU4gICAgICAgICAgICAgICAgKCg2MCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0jZGVmaW5lIFJJTkdCVUZfQ0FQX1RPX0FQX0FERFIgICAgICAgICAgKFRPT0xfQ0FQX0JVRl9BRERSICsgVE9PTF9DQVBfQlVGX0xFTikNCi0jZGVmaW5lIFJJTkdCVUZfQ0FQX1RPX0FQX0xFTiAgICAgICAgICAgKCgzMiAgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBBREJfQ0FQX0JVRl9BRERSICAgICAgICAgICAgICAgIChSSU5HQlVGX0NBUF9UT19BUF9BRERSICsgUklOR0JVRl9DQVBfVE9fQVBfTEVOKQ0KLSNkZWZpbmUgQURCX0NBUF9CVUZfTEVOICAgICAgICAgICAgICAgICAoKDQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFIgICAgICAgIChBREJfQ0FQX0JVRl9BRERSICsgQURCX0NBUF9CVUZfTEVOKQ0KLSNkZWZpbmUgUkFNRFVNUF9DQVBfQ01NX0JVRl9MRU4gICAgICAgICAoKDQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBSSU5HQlVGX0FQX1RPX0NBUF9BRERSICAgICAgICAgIChSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFIgKyBSQU1EVU1QX0NBUF9DTU1fQlVGX0xFTikNCi0jZGVmaW5lIFJJTkdCVUZfQVBfVE9fQ0FQX0xFTiAgICAgICAgICAgKCgxMjggKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotI2RlZmluZSBUT09MX1pTUF9UT19DQVBfTE9HX0FERFIgICAgICAgIChSSU5HQlVGX0FQX1RPX0NBUF9BRERSICsgUklOR0JVRl9BUF9UT19DQVBfTEVOKQ0KLSNkZWZpbmUgVE9PTF9aU1BfVE9fQ0FQX0xPR19MRU4gICAgICAgICAoKDM4NCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0jZGVmaW5lIFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9BRERSICAgICAgKFRPT0xfWlNQX1RPX0NBUF9MT0dfQUREUiArIFRPT0xfWlNQX1RPX0NBUF9MT0dfTEVOKQ0KLSNkZWZpbmUgUkFNRFVNUF9BUF9UT19DQVBfQlVGX0xFTiAgICAgICAoKDEyOCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0jZGVmaW5lIFRFRV9TSEFSRV9CVUZfQUREUiAgICAgICAgICAgICAgKFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9BRERSICsgUkFNRFVNUF9BUF9UT19DQVBfQlVGX0xFTikNCi0jZGVmaW5lIFRFRV9TSEFSRV9CVUZfTEVOICAgICAgICAgICAgICAgKCgzODQgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotI2RlZmluZSBJQ1BfQ0FQX0JVRl9BRERSX1BBICAgICAgICAgICAgIEREUl9CQVNFX0NBUEJVRl9BRERSX1BBDQotI2RlZmluZSBUT09MX0NBUF9CVUZfQUREUl9QQSAgICAgICAgICAgIChJQ1BfQ0FQX0JVRl9BRERSX1BBICsgSUNQX0NBUF9CVUZfTEVOKQ0KLSNkZWZpbmUgUklOR0JVRl9DQVBfVE9fQVBfQUREUl9QQSAgICAgICAoVE9PTF9DQVBfQlVGX0FERFJfUEEgKyBUT09MX0NBUF9CVUZfTEVOKQ0KLSNkZWZpbmUgQURCX0NBUF9CVUZfQUREUl9QQSAgICAgICAgICAgICAoUklOR0JVRl9DQVBfVE9fQVBfQUREUl9QQSArIFJJTkdCVUZfQ0FQX1RPX0FQX0xFTikNCi0jZGVmaW5lIFJBTURVTVBfQ0FQX0NNTV9CVUZfQUREUl9QQSAgICAgKEFEQl9DQVBfQlVGX0FERFJfUEEgKyBBREJfQ0FQX0JVRl9MRU4pDQotI2RlZmluZSBSSU5HQlVGX0FQX1RPX0NBUF9BRERSX1BBICAgICAgIChSQU1EVU1QX0NBUF9DTU1fQlVGX0FERFJfUEEgKyBSQU1EVU1QX0NBUF9DTU1fQlVGX0xFTikNCi0jZGVmaW5lIFRPT0xfWlNQX1RPX0NBUF9MT0dfQUREUl9QQSAgICAgKFJJTkdCVUZfQVBfVE9fQ0FQX0FERFJfUEEgKyBSSU5HQlVGX0FQX1RPX0NBUF9MRU4pDQotI2RlZmluZSBSQU1EVU1QX0FQX1RPX0NBUF9CVUZfQUREUl9QQSAgIChUT09MX1pTUF9UT19DQVBfTE9HX0FERFJfUEEgKyBUT09MX1pTUF9UT19DQVBfTE9HX0xFTikNCi0jZGVmaW5lIFRFRV9TSEFSRV9CVUZfQUREUl9QQSAgICAgICAgICAgKFJBTURVTVBfQVBfVE9fQ0FQX0JVRl9BRERSX1BBICsgUkFNRFVNUF9BUF9UT19DQVBfQlVGX0xFTikNCi0jZW5kaWYNCi0NCi0vKiA3NTIwVjPQvsasSVJBTTDRucv1o6zQrdLp1bvO78DtsuO9u7ulv9W85NLGtq+1vUREUqOsuLTTw1JhbWR1bXC/1bzkICovDQotLyogMzRLo6xQU9PrUEhZ0MXPor27u6WjrExURdK1zvEgKi8NCi0vKiAjZGVmaW5lIElSQU1fQkFTRV9BRERSX0xURSAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfUkFNRFVNUCkgKi8NCi0vKiAxMEujrFBT0+tQSFnQxc+ivbu7paOsTFRF0rXO8SDKudPDSVJBTTCjrLmmusTTxbuvIDdLKzNLLCAzayBmb3IgZW1ibXMqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfTFRFICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfU1lTX1RSQUNFICsgSVJBTV9CQVNFX0xFTl9TWVNfVFJBQ0UpDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX0xURSAgICAgICAgICAgICAgICgoMTAgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMjRLo6xQU9PrUEhZtcRJQ1C9u7ulo6zKudPDSVJBTSovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9QU19QSFlfU0hBUkVCVUYgICAgKElSQU1fQkFTRV9BRERSX0xURSArIElSQU1fQkFTRV9MRU5fTFRFKQ0KLSNkZWZpbmUgSVJBTV9CQVNFX0xFTl9QU19QSFlfU0hBUkVCVUYgICAgKCgyNCAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAyMjFLo6xQU9PrUEhZtcRJQ1C9u7ulo6zKudPDRERSLCC4tNPDUkFNRFVNUCovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1BTX1BIWV9TSEFSRUJVRiAgICAoRERSX0JBU0VfQUREUl9SQU1EVU1QKQ0KLSNkZWZpbmUgRERSX0JBU0VfTEVOX1BTX1BIWV9TSEFSRUJVRiAgICAoKDIyMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAya6OsenNwIFJBTURVTVAqLw0KLSNkZWZpbmUgRERSX0JBU0VfQUREUl9QSFlfUkFNRFVNUCAgICAgICAgKEREUl9CQVNFX0FERFJfUFNfUEhZX1NIQVJFQlVGICsgRERSX0JBU0VfTEVOX1BTX1BIWV9TSEFSRUJVRikNCi0jZGVmaW5lIEREUl9CQVNFX0xFTl9QSFlfUkFNRFVNUCAgICAgICAgKCgyICogMTAyNFVMKT4+Q1BVX1NISUZUKQ0KLQ0KLS8qIDFLo6xQU9PrUEhZ0MXPor27u6WjrFRE0rXO8SDKudPDRERSKi8NCi0jZGVmaW5lIElSQU1fQkFTRV9BRERSX1REICAgICAgICAgICAgICAgKEREUl9CQVNFX0FERFJfUEhZX1JBTURVTVAgKyBERFJfQkFTRV9MRU5fUEhZX1JBTURVTVApDQotLyogI2RlZmluZSBJUkFNX0JBU0VfTEVOX1REICAgICAgICAgICAgICAgICgoMjUgKiAxMDI0VUwpPj5DUFVfU0hJRlQpICovDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1REICAgICAgICAgICAgICAgICgoMSAqIDEwMjRVTCk+PkNQVV9TSElGVCkNCi0NCi0vKiAxMkujrFBT0+tQSFnQxc+ivbu7paOsV9K1zvEgyrnTw0REUiovDQotI2RlZmluZSBJUkFNX0JBU0VfQUREUl9XQ0RNQSAgICAgICAgICAgIChJUkFNX0JBU0VfQUREUl9URCArIElSQU1fQkFTRV9MRU5fVEQpDQotLyogI2RlZmluZSBJUkFNX0JBU0VfTEVOX1dDRE1BICAgICAgICAgICAgICgoNDggKiAxMDI0VUwpPj5DUFVfU0hJRlQpICovDQotI2RlZmluZSBJUkFNX0JBU0VfTEVOX1dDRE1BICAgICAgICAgICAgICgoMTIgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogMjBLo6xXIFVQQSC/1bzkICovDQotI2RlZmluZSBERFJfQkFTRV9BRERSX1dVUEFfREFUQSAgICAgICAgIChJUkFNX0JBU0VfQUREUl9XQ0RNQSArIElSQU1fQkFTRV9MRU5fV0NETUEpDQotI2RlZmluZSBERFJfQkFTRV9MRU5fV1VQQV9EQVRBICAgICAgICAgICgoMjAgKiAxMDI0VUwpPj5DUFVfU0hJRlQpDQotDQotLyogSVJBTSBXQ0RNQbv51rcgICAqLw0KLSNkZWZpbmUgSVJBTV9CQVNFX0FERFJfRk9SX1cgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfV0NETUEpDQotDQotLyogRFBSQU27+da3ICAgICAgICAqLw0KLSNkZWZpbmUgRFBSQU1fQkFTRV9BRERSICAgICAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfVEQpDQotDQotLyogRFBSQU0gRERSu/nWtyAgICAqLw0KLSNkZWZpbmUgRFBSQU1fTUVNX0JBU0VfQUREUiAgICAgICAgICAgICAoSVJBTV9CQVNFX0FERFJfVEQpDQotDQotLyogUFMgdGNtIGNvbmZpZyBmb3IgcmFtZHVtcCAqLw0KLSNkZWZpbmUgUkFNRFVNUF9QU19JVENNX0JBU0VfRVhURVIgICAgICAoMHgwKQ0KLSNkZWZpbmUgUkFNRFVNUF9QU19JVENNX0JBU0VfSU5URVIgICAgICAoMHgwKQ0KLSNkZWZpbmUgUkFNRFVNUF9QU19JVENNX1NJWkUgICAgICAgICAgICAoMHgwKQ0KLSNkZWZpbmUgUkFNRFVNUF9QU19EVENNX0JBU0VfRVhURVIgICAgICAoMHgwKQ0KLSNkZWZpbmUgUkFNRFVNUF9QU19EVENNX0JBU0VfSU5URVIgICAgICAoMHgwKQ0KLSNkZWZpbmUgUkFNRFVNUF9QU19EVENNX1NJWkUgICAgICAgICAgICAoMHgwKQ0KLQ0KLS8qIFpTUCBSYW1kdW1wICovDQotLyogI2lmZGVmIF9VU0VfWlNQX1JBTURVTVAgKi8NCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9JVENNX0JBU0UgICAgICAgICAgKDB4ODEwNDAwMDBVTCkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9JVENNX1NJWkUgICAgICAgICAgKDB4MDAwMTAwMDBVTCkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9EVENNX0JBU0UgICAgICAgICAgKDB4ODEwMDAwMDBVTCkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9EVENNX1NJWkUgICAgICAgICAgKDB4MDAwMTAwMDBVTCkNCi0NCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9DT0RFX1NJWkUgICAgICAgICAgKDB4MWIwMDAwPj5DUFVfU0hJRlQpDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfSUREUl9CQVNFICAgICAgICAgIChERFJfQkFTRV9BRERSX1BIWSkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9JRERSX1NJWkUgICAgICAgICAgKFJBTURVTVBfWlNQX0NPREVfU0laRSkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9ERERSX0JBU0UgICAgICAgICAgKFJBTURVTVBfWlNQX0lERFJfQkFTRSArIFJBTURVTVBfWlNQX0NPREVfU0laRSkNCi0jIGRlZmluZSBSQU1EVU1QX1pTUF9ERERSX1NJWkUgICAgICAgICAgKEREUl9CQVNFX0xFTl9QSFkgLSBSQU1EVU1QX1pTUF9DT0RFX1NJWkUpDQotDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfSVRDTV9TRUxGX0JBU0UgICAgICgweDApDQotIyBkZWZpbmUgUkFNRFVNUF9aU1BfRFRDTV9TRUxGX0JBU0UgICAgICgweDEwMDAwVUwpDQotLyogI2VuZGlmICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDK/b7dwODQzbao0uUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIq77WseTBv8n5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIq77Wuq/K/cn5w/cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2VuZGlmICAvLyAjaWZuZGVmIF9SQU1fQkFTRV9DT05GSUdfNzUyMFYzDQotDQo=