ZGlmZiAtLWdpdCBhL3NjcmlwdHMvTGluZGVudCBiL3NjcmlwdHMvTGluZGVudApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGVkNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9MaW5kZW50CkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitpbmRlbnQgLWtyIC1pOCAtdHM4IC1zb2IgLWw4MCAtc3MgLW5jcyAiJEAiCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlIGIvc2NyaXB0cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc2M2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjIyMKKyMgc2NyaXB0cyBjb250YWlucyBzb3VyY2VzIGZvciB2YXJpb3VzIGhlbHBlciBwcm9ncmFtcyB1c2VkIHRocm91Z2hvdXQKKyMgdGhlIGtlcm5lbCBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBrYWxsc3ltczogICAgICBGaW5kIGFsbCBzeW1ib2xzIGluIHZtbGludXgKKyMgcG5tdHRvbG9nbzogICAgQ29udmVydCBwbm0gZmlsZXMgdG8gbG9nbyBmaWxlcworIyBjb25tYWtlaGFzaDogICBDcmVhdGUgY2hhcnRhYmxlCisjIGNvbm1ha2VoYXNoOgkgQ3JlYXRlIGFycmF5cyBmb3IgaW5pdGlhbGl6aW5nIHRoZSBrZXJuZWwgY29uc29sZSB0YWJsZXMKKworaG9zdHByb2dzLSQoQ09ORklHX0tBTExTWU1TKSAgICAgKz0ga2FsbHN5bXMKK2hvc3Rwcm9ncy0kKENPTkZJR19MT0dPKSAgICAgICAgICs9IHBubXRvbG9nbworaG9zdHByb2dzLSQoQ09ORklHX1ZUKSAgICAgICAgICAgKz0gY29ubWFrZWhhc2gKK2hvc3Rwcm9ncy0kKENPTkZJR19QUk9NX0NPTlNPTEUpICs9IGNvbm1ha2VoYXNoCitob3N0cHJvZ3MtJChDT05GSUdfSUtDT05GSUcpICAgICArPSBiaW4yYworCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCisKK3N1YmRpci0kKENPTkZJR19NT0RWRVJTSU9OUykgKz0gZ2Vua3N5bXMKK3N1YmRpci0kKENPTkZJR19NT0RVTEVTKSAgICAgKz0gbW9kCisKKyMgTGV0IGNsZWFuIGRlc2NlbmQgaW50byBzdWJkaXJzCitzdWJkaXItCSs9IGJhc2ljIGx4ZGlhbG9nIGtjb25maWcgcGFja2FnZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZDUzMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTAsMCArMSwzMzAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGRpbmcKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCisuUEhPTlk6IF9fYnVpbGQKK19fYnVpbGQ6CisKKyMgUmVhZCAuY29uZmlnIGlmIGl0IGV4aXN0LCBvdGhlcndpc2UgaWdub3JlCistaW5jbHVkZSAuY29uZmlnCisKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQob2JqKS9LYnVpbGQpLCAkKG9iaikvS2J1aWxkLCAkKG9iaikvTWFrZWZpbGUpCisKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5saWIKKworaWZkZWYgaG9zdC1wcm9ncworaWZuZXEgKCQoaG9zdHByb2dzLXkpLCQoaG9zdC1wcm9ncykpCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBob3N0LXByb2dzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXBsYWNlIHdpdGggaG9zdHByb2dzLXkhKQoraG9zdHByb2dzLXkgKz0gJChob3N0LXByb2dzKQorZW5kaWYKK2VuZGlmCisKKyMgRG8gbm90IGluY2x1ZGUgaG9zdCBydWxlcyB1bmxlcyBuZWVkZWQKK2lmbmVxICgkKGhvc3Rwcm9ncy15KSQoaG9zdHByb2dzLW0pLCkKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5ob3N0CitlbmRpZgorCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisjIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKK19kdW1teSA6PSAkKHNoZWxsIFsgLWQgJChvYmopIF0gfHwgbWtkaXIgLXAgJChvYmopKQorCisjIENyZWF0ZSBkaXJlY3RvcmllcyBmb3Igb2JqZWN0IGZpbGVzIGlmIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorIyBOZWVkZWQgd2hlbiBvYmoteSA6PSBkaXIvZmlsZS5vIHN5bnRheCBpcyB1c2VkCitfZHVtbXkgOj0gJChmb3JlYWNoIGQsJChvYmotZGlycyksICQoc2hlbGwgWyAtZCAkKGQpIF0gfHwgbWtkaXIgLXAgJChkKSkpCitlbmRpZgorCisKK2lmZGVmIEVYVFJBX1RBUkdFVFMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIEVYVFJBX1RBUkdFVFMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGJ1aWxkLXRhcmdldHMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIGJ1aWxkLXRhcmdldHMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGV4cG9ydC1vYmpzCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBleHBvcnQtb2JqcyBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgT19UQVJHRVQKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIE9fVEFSR0VUIDo9ICQoT19UQVJHRVQpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBMX1RBUkdFVAorJChlcnJvciBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzZSBvZiBMX1RBUkdFVCBpcyByZXBsYWNlZCBieSBsaWIteSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgbGlzdC1tdWx0aQorJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gbGlzdC1tdWx0aSA6PSAkKGxpc3QtbXVsdGkpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZm5kZWYgb2JqCiskKHdhcm5pbmcga2J1aWxkOiBNYWtlZmlsZS5idWlsZCBpcyBpbmNsdWRlZCBpbXByb3Blcmx5KQorZW5kaWYKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaWZuZXEgKCQoc3RyaXAgJChsaWIteSkgJChsaWItbSkgJChsaWItbikgJChsaWItKSksKQorbGliLXRhcmdldCA6PSAkKG9iaikvbGliLmEKK2VuZGlmCisKK2lmbmVxICgkKHN0cmlwICQob2JqLXkpICQob2JqLW0pICQob2JqLW4pICQob2JqLSkgJChsaWItdGFyZ2V0KSksKQorYnVpbHRpbi10YXJnZXQgOj0gJChvYmopL2J1aWx0LWluLm8KK2VuZGlmCisKKyMgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIG1vZHVsZXMgaW4gJChNT0RWRVJESVIpCisKK19fYnVpbGQ6ICQoaWYgJChLQlVJTERfQlVJTFRJTiksJChidWlsdGluLXRhcmdldCkgJChsaWItdGFyZ2V0KSAkKGV4dHJhLXkpKSBcCisJICQoaWYgJChLQlVJTERfTU9EVUxFUyksJChvYmotbSkpIFwKKwkgJChzdWJkaXIteW0pICQoYWx3YXlzKQorCUA6CisKKyMgTGludXMnIGtlcm5lbCBzYW5pdHkgY2hlY2tpbmcgdG9vbAoraWZuZXEgKCQoS0JVSUxEX0NIRUNLU1JDKSwwKQorICBpZmVxICgkKEtCVUlMRF9DSEVDS1NSQyksMikKKyAgICBxdWlldF9jbWRfZm9yY2VfY2hlY2tzcmMgPSBDSEVDSyAgICQ8CisgICAgICAgICAgY21kX2ZvcmNlX2NoZWNrc3JjID0gJChDSEVDSykgJChDSEVDS0ZMQUdTKSAkKGNfZmxhZ3MpICQ8IDsKKyAgZWxzZQorICAgICAgcXVpZXRfY21kX2NoZWNrc3JjICAgICA9IENIRUNLICAgJDwKKyAgICAgICAgICAgIGNtZF9jaGVja3NyYyAgICAgPSAkKENIRUNLKSAkKENIRUNLRkxBR1MpICQoY19mbGFncykgJDwgOworICBlbmRpZgorZW5kaWYKKworCisjIENvbXBpbGUgQyBzb3VyY2VzICguYykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgRGVmYXVsdCBpcyBidWlsdC1pbiwgdW5sZXNzIHdlIGtub3cgb3RoZXJ3aXNlCittb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19LRVJORUwpCitxdWlldF9tb2R0YWcgOj0gJChlbXB0eSkgICAkKGVtcHR5KQorCiskKHJlYWwtb2Jqcy1tKSAgICAgICAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5pKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5zKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5sc3QpOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCisKKyQocmVhbC1vYmpzLW0pICAgICAgICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmkpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LnMpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmxzdCk6IHF1aWV0X21vZHRhZyA6PSBbTV0KKworJChvYmotbSkgICAgICAgICAgICAgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorCisjIERlZmF1bHQgZm9yIG5vdCBtdWx0aS1wYXJ0IG1vZHVsZXMKK21vZG5hbWUgPSAkKCpGKQorCiskKG11bHRpLW9ianMtbSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCisKK3F1aWV0X2NtZF9jY19zX2MgPSBDQyAkKHF1aWV0X21vZHRhZykgICRACitjbWRfY2Nfc19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAtUyAtbyAkQCAkPCAKKworJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCitxdWlldF9jbWRfY2NfaV9jID0gQ1BQICQocXVpZXRfbW9kdGFnKSAkQAorY21kX2NjX2lfYyAgICAgICA9ICQoQ1BQKSAkKGNfZmxhZ3MpICAgLW8gJEAgJDwKKworJS5pOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2NfaV9jKQorCisjIEMgKC5jKSBmaWxlcworIyBUaGUgQyBmaWxlIGlzIGNvbXBpbGVkIGFuZCB1cGRhdGVkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgorIyAoU2VlIGNtZF9jY19vX2MgKyByZWxldmFudCBwYXJ0IG9mIHJ1bGVfY2Nfb19jKQorCitxdWlldF9jbWRfY2Nfb19jID0gQ0MgJChxdWlldF9tb2R0YWcpICAkQAorCitpZm5kZWYgQ09ORklHX01PRFZFUlNJT05TCitjbWRfY2Nfb19jID0gJChDQykgJChjX2ZsYWdzKSAtYyAtbyAkQCAkPAorCitlbHNlCisjIFdoZW4gbW9kdWxlIHZlcnNpb25pbmcgaXMgZW5hYmxlZCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSBleGVjdXRlZDoKKyMgbyBjb21waWxlIGEgLnRtcF88ZmlsZT4ubyBmcm9tIDxmaWxlPi5jCisjIG8gaWYgLnRtcF88ZmlsZT4ubyBkb2Vzbid0IGNvbnRhaW4gYSBfX2tzeW10YWIgdmVyc2lvbiwgaS5lLiBkb2VzCisjICAgbm90IGV4cG9ydCBzeW1ib2xzLCB3ZSBqdXN0IHJlbmFtZSAudG1wXzxmaWxlPi5vIHRvIDxmaWxlPi5vIGFuZAorIyAgIGFyZSBkb25lLgorIyBvIG90aGVyd2lzZSwgd2UgY2FsY3VsYXRlIHN5bWJvbCB2ZXJzaW9ucyB1c2luZyB0aGUgZ29vZCBvbGQKKyMgICBnZW5rc3ltcyBvbiB0aGUgcHJlcHJvY2Vzc2VkIHNvdXJjZSBhbmQgcG9zdHByb2Nlc3MgdGhlbSBpbiBhIHdheQorIyAgIHRoYXQgdGhleSBhcmUgdXNhYmxlIGFzIGEgbGlua2VyIHNjcmlwdAorIyBvIGdlbmVyYXRlIDxmaWxlPi5vIGZyb20gLnRtcF88ZmlsZT4ubyB1c2luZyB0aGUgbGlua2VyIHRvCisjICAgcmVwbGFjZSB0aGUgdW5yZXNvbHZlZCBzeW1ib2xzIF9fY3JjX2V4cG9ydGVkX3N5bWJvbCB3aXRoCisjICAgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdGVkIGJ5IGdlbmtzeW1zCisKK2NtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICQoQEQpLy50bXBfJChARikgJDwKK2NtZF9tb2R2ZXJzaW9ucyA9CQkJCQkJCVwKKwlpZiAkKE9CSkRVTVApIC1oICQoQEQpLy50bXBfJChARikgfCBncmVwIC1xIF9fa3N5bXRhYjsgdGhlbglcCisJCSQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8CQkJXAorCQl8ICQoR0VOS1NZTVMpCQkJCQkJXAorCQk+ICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQkJXAorCQkJCQkJCQkJXAorCQkkKExEKSAkKExERkxBR1MpIC1yIC1vICRAICQoQEQpLy50bXBfJChARikgCQlcCisJCQktVCAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CQkJXAorCQlybSAtZiAkKEBEKS8udG1wXyQoQEYpICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJXAorCWVsc2UJCQkJCQkJCVwKKwkJbXYgJChARCkvLnRtcF8kKEBGKSAkQDsJCQkJCVwKKwlmaTsKK2VuZGlmCisKK2RlZmluZSBydWxlX2NjX29fYworCSQoaWYgJCgkKHF1aWV0KWNtZF9jaGVja3NyYyksZWNobyAnICAkKCQocXVpZXQpY21kX2NoZWNrc3JjKSc7KSAgIFwKKwkkKGNtZF9jaGVja3NyYykJCQkJCQkJICBcCisJJChpZiAkKCQocXVpZXQpY21kX2NjX29fYyksZWNobyAnICAkKCQocXVpZXQpY21kX2NjX29fYyknOykJICBcCisJJChjbWRfY2Nfb19jKTsJCQkJCQkJICBcCisJJChjbWRfbW9kdmVyc2lvbnMpCQkJCQkJICBcCisJc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChjbWRfY2Nfb19jKScgPiAkKEBEKS8uJChARikudG1wOyAgXAorCXJtIC1mICQoZGVwZmlsZSk7CQkJCQkJICBcCisJbXYgLWYgJChARCkvLiQoQEYpLnRtcCAkKEBEKS8uJChARikuY21kCitlbmRlZgorCisjIEJ1aWx0LWluIGFuZCBjb21wb3NpdGUgbW9kdWxlIHBhcnRzCisKKyUubzogJS5jIEZPUkNFCisJJChjYWxsIGNtZCxmb3JjZV9jaGVja3NyYykKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGNjX29fYykKKworIyBTaW5nbGUtcGFydCBtb2R1bGVzIGFyZSBzcGVjaWFsIHNpbmNlIHdlIG5lZWQgdG8gbWFyayB0aGVtIGluICQoTU9EVkVSRElSKQorCiskKHNpbmdsZS11c2VkLW0pOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBjbWQsZm9yY2VfY2hlY2tzcmMpCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxjY19vX2MpCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkQDsgfSA+ICQoTU9EVkVSRElSKS8kKEBGOi5vPS5tb2QpCisKK3F1aWV0X2NtZF9jY19sc3RfYyA9IE1LTFNUICAgJEAKKyAgICAgIGNtZF9jY19sc3RfYyA9ICQoQ0MpICQoY19mbGFncykgLWcgLWMgLW8gJCoubyAkPCAmJiBcCisJCSAgICAgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9tYWtlbHN0ICQqLm8gXAorCQkJCSAgICAgU3lzdGVtLm1hcCAkKE9CSkRVTVApID4gJEAKKworJS5sc3Q6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19sc3RfYykKKworIyBDb21waWxlIGFzc2VtYmxlciBzb3VyY2VzICguUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX0tFUk5FTCkKKworJChyZWFsLW9ianMtbSkgICAgICA6IG1vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LnMpOiBtb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19NT0RVTEUpCisKK3F1aWV0X2NtZF9hc19zX1MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACitjbWRfYXNfc19TICAgICAgID0gJChDUFApICQoYV9mbGFncykgICAtbyAkQCAkPCAKKworJS5zOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfc19TKQorCitxdWlldF9jbWRfYXNfb19TID0gQVMgJChxdWlldF9tb2R0YWcpICAkQAorY21kX2FzX29fUyAgICAgICA9ICQoQ0MpICQoYV9mbGFncykgLWMgLW8gJEAgJDwKKworJS5vOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfb19TKQorCit0YXJnZXRzICs9ICQocmVhbC1vYmpzLXkpICQocmVhbC1vYmpzLW0pICQobGliLXkpCit0YXJnZXRzICs9ICQoZXh0cmEteSkgJChNQUtFQ01ER09BTFMpICQoYWx3YXlzKQorCisjIExpbmtlciBzY3JpcHRzIHByZXByb2Nlc3NvciAoLmxkcy5TIC0+IC5sZHMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2NwcF9sZHNfUyA9IExEUyAgICAgJEAKKyAgICAgIGNtZF9jcHBfbGRzX1MgPSAkKENQUCkgJChjcHBfZmxhZ3MpIC1EX19BU1NFTUJMWV9fIC1vICRAICQ8CisKKyUubGRzOiAlLmxkcy5TIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNwcF9sZHNfUykKKworIyBCdWlsZCB0aGUgY29tcGlsZWQtaW4gdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUbyBidWlsZCBvYmplY3RzIGluIHN1YmRpcnMsIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvIHRoZSBkaXJlY3RvcmllcworJChzb3J0ICQoc3ViZGlyLW9iai15KSk6ICQoc3ViZGlyLXltKSA7CisKKyMKKyMgUnVsZSB0byBjb21waWxlIGEgc2V0IG9mIC5vIGZpbGVzIGludG8gb25lIC5vIGZpbGUKKyMKK2lmZGVmIGJ1aWx0aW4tdGFyZ2V0CitxdWlldF9jbWRfbGlua19vX3RhcmdldCA9IExEICAgICAgJEAKKyMgSWYgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBsaW5rIGlzIGVtcHR5LCBqdXN0IGNyZWF0ZSBhbiBlbXB0eSBidWlsdC1pbi5vCitjbWRfbGlua19vX3RhcmdldCA9ICQoaWYgJChzdHJpcCAkKG9iai15KSksXAorCQkgICAgICAkKExEKSAkKGxkX2ZsYWdzKSAtciAtbyAkQCAkKGZpbHRlciAkKG9iai15KSwgJF4pLFwKKwkJICAgICAgcm0gLWYgJEA7ICQoQVIpIHJjcyAkQCkKKworJChidWlsdGluLXRhcmdldCk6ICQob2JqLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19vX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGJ1aWx0aW4tdGFyZ2V0KQorZW5kaWYgIyBidWlsdGluLXRhcmdldAorCisjCisjIFJ1bGUgdG8gY29tcGlsZSBhIHNldCBvZiAubyBmaWxlcyBpbnRvIG9uZSAuYSBmaWxlCisjCitpZmRlZiBsaWItdGFyZ2V0CitxdWlldF9jbWRfbGlua19sX3RhcmdldCA9IEFSICAgICAgJEAKK2NtZF9saW5rX2xfdGFyZ2V0ID0gcm0gLWYgJEA7ICQoQVIpICQoRVhUUkFfQVJGTEFHUykgcmNzICRAICQobGliLXkpCisKKyQobGliLXRhcmdldCk6ICQobGliLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19sX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGxpYi10YXJnZXQpCitlbmRpZgorCisjCisjIFJ1bGUgdG8gbGluayBjb21wb3NpdGUgb2JqZWN0cworIworIyAgQ29tcG9zaXRlIG9iamVjdHMgYXJlIHNwZWNpZmllZCBpbiBrYnVpbGQgbWFrZWZpbGUgYXMgZm9sbG93czoKKyMgICAgPGNvbXBvc2l0ZS1vYmplY3Q+LW9ianMgOj0gPGxpc3Qgb2YgLm8gZmlsZXM+CisjICBvcgorIyAgICA8Y29tcG9zaXRlLW9iamVjdD4teSAgICA6PSA8bGlzdCBvZiAubyBmaWxlcz4KK2xpbmtfbXVsdGlfZGVwcyA9ICAgICAgICAgICAgICAgICAgICAgXAorJChmaWx0ZXIgJChhZGRwcmVmaXggJChvYmopLywgICAgICAgICBcCiskKCQoc3Vic3QgJChvYmopLywsJChAOi5vPS1vYmpzKSkpICAgIFwKKyQoJChzdWJzdCAkKG9iaikvLCwkKEA6Lm89LXkpKSkpLCAkXikKKyAKK3F1aWV0X2NtZF9saW5rX211bHRpLXkgPSBMRCAgICAgICRACitjbWRfbGlua19tdWx0aS15ID0gJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKK3F1aWV0X2NtZF9saW5rX211bHRpLW0gPSBMRCBbTV0gICRACitjbWRfbGlua19tdWx0aS1tID0gJChMRCkgJChsZF9mbGFncykgJChMREZMQUdTX01PRFVMRSkgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKKyMgV2Ugd291bGQgcmF0aGVyIGhhdmUgYSBsaXN0IG9mIHJ1bGVzIGxpa2UKKyMgCWZvby5vOiAkKGZvby1vYmpzKQorIyBidXQgdGhhdCdzIG5vdCBzbyBlYXN5LCBzbyB3ZSByYXRoZXIgbWFrZSBhbGwgY29tcG9zaXRlIG9iamVjdHMgZGVwZW5kCisjIG9uIHRoZSBzZXQgb2YgYWxsIHRoZWlyIHBhcnRzCiskKG11bHRpLXVzZWQteSkgOiAlLm86ICQobXVsdGktb2Jqcy15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbXVsdGkteSkKKworJChtdWx0aS11c2VkLW0pIDogJS5vOiAkKG11bHRpLW9ianMtbSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsaW5rX211bHRpLW0pCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkKGxpbmtfbXVsdGlfZGVwcyk7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQorCit0YXJnZXRzICs9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKKworCisjIERlc2NlbmRpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5QSE9OWTogJChzdWJkaXIteW0pCiskKHN1YmRpci15bSk6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JEAKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCisKK3RhcmdldHMgOj0gJCh3aWxkY2FyZCAkKHNvcnQgJCh0YXJnZXRzKSkpCitjbWRfZmlsZXMgOj0gJCh3aWxkY2FyZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICBpbmNsdWRlICQoY21kX2ZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4gYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2U4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCkBAIC0wLDAgKzEsOTQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2xlYW5pbmcgdXAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCisuUEhPTlk6IF9fY2xlYW4KK19fY2xlYW46CisKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQob2JqKS9LYnVpbGQpLCAkKG9iaikvS2J1aWxkLCAkKG9iaikvTWFrZWZpbGUpCisKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitfX3N1YmRpci1uCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbikpKQorc3ViZGlyLW4JKz0gJChfX3N1YmRpci1uKQorX19zdWJkaXItCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotKSkpCitzdWJkaXItCQkrPSAkKF9fc3ViZGlyLSkKKworIyBTdWJkaXJlY3RvcmllcyB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50bworCitzdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQorc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCisKKyMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyMgZGlyZWN0b3J5CisKK19fY2xlYW4tZmlsZXMJOj0gJChleHRyYS15KSAkKEVYVFJBX1RBUkdFVFMpICQoYWx3YXlzKSBcCisJCSAgICQodGFyZ2V0cykgJChjbGVhbi1maWxlcykgICAgICAgICAgICAgXAorCQkgICAkKGhvc3QtcHJvZ3MpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKQorCisjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCisjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocworCitfX2NsZWFuLWZpbGVzICAgOj0gJCh3aWxkY2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQob2JqKS8sICQoZmlsdGVyLW91dCAvJSwgJChfX2NsZWFuLWZpbGVzKSkpIFwKKwkJICAgJChmaWx0ZXIgLyUsICQoX19jbGVhbi1maWxlcykpKQorCisjIGFzIGNsZWFuLWRpcnMgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGFkZHMKKyMgYSAkKG9iaikgcHJlZml4LCBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzCisKK19fY2xlYW4tZGlycyAgICA6PSAkKHdpbGRjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChvYmopLywgJChmaWx0ZXItb3V0IC8lLCAkKGNsZWFuLWRpcnMpKSkgICAgXAorCQkgICAkKGZpbHRlciAvJSwgJChjbGVhbi1kaXJzKSkpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcXVpZXRfY21kX2NsZWFuICAgID0gQ0xFQU4gICAkKG9iaikKKyAgICAgIGNtZF9jbGVhbiAgICA9IHJtIC1mICQoX19jbGVhbi1maWxlcykKK3F1aWV0X2NtZF9jbGVhbmRpciA9IENMRUFOICAgJChfX2NsZWFuLWRpcnMpCisgICAgICBjbWRfY2xlYW5kaXIgPSBybSAtcmYgJChfX2NsZWFuLWRpcnMpCisKKworX19jbGVhbjogJChzdWJkaXIteW1uKQoraWZuZXEgKCQoc3RyaXAgJChfX2NsZWFuLWZpbGVzKSksKQorCSskKGNhbGwgY21kLGNsZWFuKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoX19jbGVhbi1kaXJzKSksKQorCSskKGNhbGwgY21kLGNsZWFuZGlyKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoY2xlYW4tcnVsZSkpLCkKKwkrJChjbGVhbi1ydWxlKQorZW5kaWYKKwlAOgorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdlbmVyaWMgc3R1ZmYKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgRGVzY2VuZGluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiAkKHN1YmRpci15bW4pCiskKHN1YmRpci15bW4pOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSRACisKKyMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAorCitjbWQgPSBAJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJCgkKHF1aWV0KWNtZF8kKDEpKScgJiYpICQoY21kXyQoMSkpCisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSBzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iaj1kaXIKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoY2xlYW4pPWRpcgorY2xlYW4gOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMWEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdApAQCAtMCwwICsxLDE1NSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZGluZyBiaW5hcmllcyBvbiB0aGUgaG9zdCBzeXN0ZW0KKyMgQmluYXJpZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUga2VybmVsLCBmb3IgZXhhbXBsZQorIyB0byBwcmVwcm9jZXNzIGEgZGF0YSBmaWxlLgorIworIyBCb3RoIEMgYW5kIEMrKyBpcyBzdXBwb3J0ZWQsIGJ1dCBwcmVmZXJyZWQgbGFuZ3VhZ2UgaXMgQyBmb3Igc3VjaCB1dGlsaXRpZXMuCisjCisjIFNhbWxlIHN5bnRheCAoc2VlIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlLnR4dCBmb3IgcmVmZXJlbmNlKQorIyBob3N0cHJvZ3MteSA6PSBiaW4yaGV4CisjIFdpbGwgY29tcGlsZSBiaW4yaGV4LmMgYW5kIGNyZWF0ZSBhbiBleGVjdXRhYmxlIG5hbWVkIGJpbjJoZXgKKyMKKyMgaG9zdHByb2dzLXkgICAgOj0gbHhkaWFsb2cKKyMgbHhkaWFsb2ctb2JqcyA6PSBjaGVja2xpc3QubyBseGRpYWxvZy5vCisjIFdpbGwgY29tcGlsZSBseGRpYWxvZy5jIGFuZCBjaGVja2xpc3QuYywgYW5kIHRoZW4gbGluayB0aGUgZXhlY3V0YWJsZQorIyBseGRpYWxvZywgYmFzZWQgb24gY2hlY2tsaXN0Lm8gYW5kIGx4ZGlhbG9nLm8KKyMKKyMgaG9zdHByb2dzLXkgICAgICA6PSBxY29uZgorIyBxY29uZi1jeHhvYmpzICAgOj0gcWNvbmYubworIyBxY29uZi1vYmpzICAgICAgOj0gbWVudS5vCisjIFdpbGwgY29tcGlsZSBxY29uZiBhcyBhIEMrKyBwcm9ncmFtLCBhbmQgbWVudSBhcyBhIEMgcHJvZ3JhbS4KKyMgVGhleSBhcmUgbGlua2VkIGFzIEMrKyBjb2RlIHRvIHRoZSBleGVjdXRhYmxlIHFjb25mCisKKyMgaG9zdHByb2dzLXkgOj0gY29uZgorIyBjb25mLW9ianMgIDo9IGNvbmYubyBsaWJrY29uZmlnLnNvCisjIGxpYmtjb25maWctb2JqcyA6PSBleHByLm8gdHlwZS5vCisjIFdpbGwgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgbmFtZWQgbGlia2NvbmZpZy5zbyB0aGF0IGNvbnNpc3Qgb2YKKyMgZXhwci5vIGFuZCB0eXBlLm8gKHRoZXkgYXJlIGJvdGggY29tcGlsZWQgYXMgQyBjb2RlIGFuZCB0aGUgb2JqZWN0IGZpbGUKKyMgYXJlIG1hZGUgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSkuCisjIGNvbmYuYyBpcyBjb21waWxlZCBhcyBhIGMgcHJvZ3JhbSwgYW5kIGNvbmYubyBpcyBsaW5rZWQgdG9nZXRoZXIgd2l0aAorIyBsaWJrY29uZmlnLnNvIGFzIHRoZSBleGVjdXRhYmxlIGNvbmYuCisjIE5vdGU6IFNoYXJlZCBsaWJyYXJpZXMgY29uc2lzdGluZyBvZiBDKysgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKworX19ob3N0cHJvZ3MgOj0gJChzb3J0ICQoaG9zdHByb2dzLXkpJChob3N0cHJvZ3MtbSkpCisKKyMgaG9zdHByb2dzLXkgOj0gdG9vbHMvYnVpbGQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQuIFJldHJlaXZlIGRpcmVjdG9yeQorb2JqLWRpcnMgKz0gJChmb3JlYWNoIGYsJChfX2hvc3Rwcm9ncyksICQoaWYgJChkaXIgJChmKSksJChkaXIgJChmKSkpKQorb2JqLWRpcnMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IC4vLCQob2JqLWRpcnMpKSkpCisKKworIyBDIGNvZGUKKyMgRXhlY3V0YWJsZXMgY29tcGlsZWQgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCitob3N0LWNzaW5nbGUJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktb2JqcyksLCQobSkpKQorCisjIEMgZXhlY3V0YWJsZXMgbGlua2VkIGJhc2VkIG9uIHNldmVyYWwgLm8gZmlsZXMKK2hvc3QtY211bHRpCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLFwKKwkJICAgJChpZiAkKCQobSktY3h4b2JqcyksLCQoaWYgJCgkKG0pLW9ianMpLCQobSkpKSkKKworIyBPYmplY3QgKC5vKSBmaWxlcyBjb21waWxlZCBmcm9tIC5jIGZpbGVzCitob3N0LWNvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKF9faG9zdHByb2dzKSwkKCQobSktb2JqcykpKQorCisjIEMrKyBjb2RlCisjIEMrKyBleGVjdXRhYmxlcyBjb21waWxlZCBmcm9tIGF0IGxlYXN0IG9uIC5jYyBmaWxlCisjIGFuZCB6ZXJvIG9yIG1vcmUgLmMgZmlsZXMKK2hvc3QtY3h4bXVsdGkJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktY3h4b2JqcyksJChtKSkpCisKKyMgQysrIE9iamVjdCAoLm8pIGZpbGVzIGNvbXBpbGVkIGZyb20gLmNjIGZpbGVzCitob3N0LWN4eG9ianMJOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQoaG9zdC1jeHhtdWx0aSksJCgkKG0pLWN4eG9ianMpKSkKKworIyBTaGFyZWQgbGliYXJpZXMgKG9ubHkgLmMgc3VwcG9ydGVkKQorIyBTaGFyZWQgbGlicmFyaWVzICguc28pIC0gYWxsIC5zbyBmaWxlcyByZWZlcmVuY2VkIGluICJ4eHgtb2JqcyIKK2hvc3QtY3NobGliCTo9ICQoc29ydCAkKGZpbHRlciAlLnNvLCAkKGhvc3QtY29ianMpKSkKKyMgUmVtb3ZlIC5zbyBmaWxlcyBmcm9tICJ4eHgtb2JqcyIKK2hvc3QtY29ianMJOj0gJChmaWx0ZXItb3V0ICUuc28sJChob3N0LWNvYmpzKSkKKworI09iamVjdCAoLm8pIGZpbGVzIHVzZWQgYnkgdGhlIHNoYXJlZCBsaWJhcmllcworaG9zdC1jc2hvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3NobGliKSwkKCQobTouc289LW9ianMpKSkpCisKK19faG9zdHByb2dzICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoX19ob3N0cHJvZ3MpKQoraG9zdC1jc2luZ2xlCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaW5nbGUpKQoraG9zdC1jbXVsdGkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY211bHRpKSkKK2hvc3QtY29ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY29ianMpKQoraG9zdC1jeHhtdWx0aQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jeHhtdWx0aSkpCitob3N0LWN4eG9ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3h4b2JqcykpCitob3N0LWNzaGxpYgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2hsaWIpKQoraG9zdC1jc2hvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaG9ianMpKQorb2JqLWRpcnMgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotZGlycykpCisKKyMjIyMjCisjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKKworX2hvc3RjX2ZsYWdzICAgPSAkKEhPU1RDRkxBR1MpICAgJChIT1NUX0VYVFJBQ0ZMQUdTKSAgICQoSE9TVENGTEFHU18kKCpGKS5vKQorX2hvc3RjeHhfZmxhZ3MgPSAkKEhPU1RDWFhGTEFHUykgJChIT1NUX0VYVFJBQ1hYRkxBR1MpICQoSE9TVENYWEZMQUdTXyQoKkYpLm8pCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX19ob3N0Y19mbGFncwk9ICQoX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gJChfaG9zdGN4eF9mbGFncykKK2Vsc2UKK19faG9zdGNfZmxhZ3MJPSAtSSQob2JqKSAkKGNhbGwgZmxhZ3MsX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gLUkkKG9iaikgJChjYWxsIGZsYWdzLF9ob3N0Y3h4X2ZsYWdzKQorZW5kaWYKKworaG9zdGNfZmxhZ3MgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjX2ZsYWdzKQoraG9zdGN4eF9mbGFncyAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjeHhfZmxhZ3MpCisKKyMjIyMjCisjIENvbXBpbGUgcHJvZ3JhbXMgb24gdGhlIGhvc3QKKworIyBDcmVhdGUgZXhlY3V0YWJsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKKyMgaG9zdC1jc2luZ2xlIC0+IEV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWNzaW5nbGUgCT0gSE9TVENDICAkQAorICAgICAgY21kX2hvc3QtY3NpbmdsZQk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAkKEhPU1RfTE9BRExJQkVTKSAtbyAkQCAkPAorJChob3N0LWNzaW5nbGUpOiAlOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jc2luZ2xlKQorCisjIExpbmsgYW4gZXhlY3V0YWJsZSBiYXNlZCBvbiBsaXN0IG9mIC5vIGZpbGVzLCBhbGwgcGxhaW4gYworIyBob3N0LWNtdWx0aSAtPiBleGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jbXVsdGkJPSBIT1NUTEQgICRACisgICAgICBjbWRfaG9zdC1jbXVsdGkJPSAkKEhPU1RDQykgJChIT1NUTERGTEFHUykgLW8gJEAgXAorCQkJICAkKGFkZHByZWZpeCAkKG9iaikvLCQoJChARiktb2JqcykpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWNtdWx0aSk6ICU6ICQoaG9zdC1jb2JqcykgJChob3N0LWNzaGxpYikgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWNtdWx0aSkKKworIyBDcmVhdGUgLm8gZmlsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKKyMgaG9zdC1jb2JqcyAtPiAubworcXVpZXRfY21kX2hvc3QtY29ianMJPSBIT1NUQ0MgICRACisgICAgICBjbWRfaG9zdC1jb2Jqcwk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAtYyAtbyAkQCAkPAorJChob3N0LWNvYmpzKTogJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jb2JqcykKKworIyBMaW5rIGFuIGV4ZWN1dGFibGUgYmFzZWQgb24gbGlzdCBvZiAubyBmaWxlcywgYSBtaXh0dXJlIG9mIC5jIGFuZCAuY2MKKyMgaG9zdC1jeHhtdWx0aSAtPiBleGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jeHhtdWx0aQk9IEhPU1RMRCAgJEAKKyAgICAgIGNtZF9ob3N0LWN4eG11bHRpCT0gJChIT1NUQ1hYKSAkKEhPU1RMREZMQUdTKSAtbyAkQCBcCisJCQkgICQoZm9yZWFjaCBvLG9ianMgY3h4b2JqcyxcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGKS0kKG8pKSkpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWN4eG11bHRpKTogJTogJChob3N0LWNvYmpzKSAkKGhvc3QtY3h4b2JqcykgJChob3N0LWNzaGxpYikgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWN4eG11bHRpKQorCisjIENyZWF0ZSAubyBmaWxlIGZyb20gYSBzaW5nbGUgLmNjIChDKyspIGZpbGUKK3F1aWV0X2NtZF9ob3N0LWN4eG9ianMJPSBIT1NUQ1hYICRACisgICAgICBjbWRfaG9zdC1jeHhvYmpzCT0gJChIT1NUQ1hYKSAkKGhvc3RjeHhfZmxhZ3MpIC1jIC1vICRAICQ8CiskKGhvc3QtY3h4b2Jqcyk6ICUubzogJS5jYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWN4eG9ianMpCisKKyMgQ29tcGlsZSAuYyBmaWxlLCBjcmVhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgLm8gZmlsZQorIyBob3N0LWNzaG9ianMgLT4gLm8KK3F1aWV0X2NtZF9ob3N0LWNzaG9ianMJPSBIT1NUQ0MgIC1mUElDICRACisgICAgICBjbWRfaG9zdC1jc2hvYmpzCT0gJChIT1NUQ0MpICQoaG9zdGNfZmxhZ3MpIC1mUElDIC1jIC1vICRAICQ8CiskKGhvc3QtY3Nob2Jqcyk6ICUubzogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY3Nob2JqcykKKworIyBMaW5rIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBvc2l0aW9uIGluZGVwZW5kZW50IC5vIGZpbGVzCisjICoubyAtPiAuc28gc2hhcmVkIGxpYnJhcnkgKGhvc3QtY3NobGliKQorcXVpZXRfY21kX2hvc3QtY3NobGliCT0gSE9TVExMRCAtc2hhcmVkICRACisgICAgICBjbWRfaG9zdC1jc2hsaWIJPSAkKEhPU1RDQykgJChIT1NUTERGTEFHUykgLXNoYXJlZCAtbyAkQCBcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGOi5zbz0tb2JqcykpKSBcCisJCQkgICQoSE9TVF9MT0FETElCRVMpICQoSE9TVExPQURMSUJFU18kKEBGKSkKKyQoaG9zdC1jc2hsaWIpOiAlOiAkKGhvc3QtY3Nob2JqcykgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWNzaGxpYikKKwordGFyZ2V0cyArPSAkKGhvc3QtY3NpbmdsZSkgICQoaG9zdC1jbXVsdGkpICQoaG9zdC1jb2JqcylcCisJICAgJChob3N0LWN4eG11bHRpKSAkKGhvc3QtY3h4b2JqcykgJChob3N0LWNzaGxpYikgJChob3N0LWNzaG9ianMpIAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjc1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgpAQCAtMCwwICsxLDI2NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMga2J1aWxkOiBHZW5lcmljIGRlZmluaXRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFN0YW5kYXJkIHZhcnMKKworY29tbWEgICA6PSAsCitlbXB0eSAgIDo9CitzcGFjZSAgIDo9ICQoZW1wdHkpICQoZW1wdHkpCisKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIHRvIGJlIHJlbW92ZWQuLi4KK2V4dHJhLXkJKz0gJChFWFRSQV9UQVJHRVRTKQorIyBGaWd1cmUgb3V0IHdoYXQgd2UgbmVlZCB0byBidWlsZCBmcm9tIHRoZSB2YXJpb3VzIHZhcmlhYmxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBXaGVuIGFuIG9iamVjdCBpcyBsaXN0ZWQgdG8gYmUgYnVpbHQgY29tcGlsZWQtaW4gYW5kIG1vZHVsYXIsCisjIG9ubHkgYnVpbGQgdGhlIGNvbXBpbGVkLWluIHZlcnNpb24KKworb2JqLW0gOj0gJChmaWx0ZXItb3V0ICQob2JqLXkpLCQob2JqLW0pKQorCisjIExpYnJhcmllcyBhcmUgYWx3YXlzIGNvbGxlY3RlZCBpbiBvbmUgbGliIGZpbGUuCisjIEZpbHRlciBvdXQgb2JqZWN0cyBhbHJlYWR5IGJ1aWx0LWluCisKK2xpYi15IDo9ICQoZmlsdGVyLW91dCAkKG9iai15KSwgJChzb3J0ICQobGliLXkpICQobGliLW0pKSkKKworCisjIEhhbmRsZSBvYmplY3RzIGluIHN1YmRpcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmoteSksIHJlcGxhY2UgaXQgYnkgZm9vL2J1aWx0LWluLm8KKyMgICBhbmQgYWRkIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlycyB0byBkZXNjZW5kIGludG86ICQoc3ViZGlyLXkpCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmotbSksIHJlbW92ZSBpdCBmcm9tICQob2JqLW0pIAorIyAgIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJzIHRvIGRlc2NlbmQgaW50bzogJChzdWJkaXItbSkKKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitvYmoteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKG9iai15KSkKK29iai1tCQk6PSAkKGZpbHRlci1vdXQgJS8sICQob2JqLW0pKQorCisjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCisKK3N1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCisKKyMgaWYgJChmb28tb2JqcykgZXhpc3RzLCBmb28ubyBpcyBhIGNvbXBvc2l0ZSBvYmplY3QgCittdWx0aS11c2VkLXkgOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQob2JqLXkpLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwgJChtKSkpKQorbXVsdGktdXNlZC1tIDo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKG9iai1tKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksICQobSkpKSkKK211bHRpLXVzZWQgICA6PSAkKG11bHRpLXVzZWQteSkgJChtdWx0aS11c2VkLW0pCitzaW5nbGUtdXNlZC1tIDo9ICQoc29ydCAkKGZpbHRlci1vdXQgJChtdWx0aS11c2VkLW0pLCQob2JqLW0pKSkKKworIyBCdWlsZCBsaXN0IG9mIHRoZSBwYXJ0cyBvZiBvdXIgY29tcG9zaXRlIG9iamVjdHMsIG91ciBjb21wb3NpdGUKKyMgb2JqZWN0cyBkZXBlbmQgb24gdGhvc2UgKG9idmlvdXNseSkKK211bHRpLW9ianMteSA6PSAkKGZvcmVhY2ggbSwgJChtdWx0aS11c2VkLXkpLCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpCittdWx0aS1vYmpzLW0gOj0gJChmb3JlYWNoIG0sICQobXVsdGktdXNlZC1tKSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKQorbXVsdGktb2JqcyAgIDo9ICQobXVsdGktb2Jqcy15KSAkKG11bHRpLW9ianMtbSkKKworIyAkKHN1YmRpci1vYmoteSkgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiAkKG9iai15KSB3aGljaCBkbyBub3QgbGl2ZQorIyBpbiB0aGUgbG9jYWwgZGlyZWN0b3J5CitzdWJkaXItb2JqLXkgOj0gJChmb3JlYWNoIG8sJChvYmoteSksJChpZiAkKGZpbHRlci1vdXQgJChvKSwkKG5vdGRpciAkKG8pKSksJChvKSkpCisKKyMgJChvYmotZGlycykgaXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBvYmplY3QgZmlsZXMKK29iai1kaXJzIDo9ICQoZGlyICQobXVsdGktb2JqcykgJChzdWJkaXItb2JqLXkpKQorCisjIFJlcGxhY2UgbXVsdGktcGFydCBvYmplY3RzIGJ5IHRoZWlyIGluZGl2aWR1YWwgcGFydHMsIGxvb2sgYXQgbG9jYWwgZGlyIG9ubHkKK3JlYWwtb2Jqcy15IDo9ICQoZm9yZWFjaCBtLCAkKGZpbHRlci1vdXQgJChzdWJkaXItb2JqLXkpLCAkKG9iai15KSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSwkKG0pKSkgJChleHRyYS15KQorcmVhbC1vYmpzLW0gOj0gJChmb3JlYWNoIG0sICQob2JqLW0pLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSksJChtKSkpCisKKyMgQWRkIHN1YmRpciBwYXRoCisKK2V4dHJhLXkJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChleHRyYS15KSkKK2Fsd2F5cwkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGFsd2F5cykpCit0YXJnZXRzCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQodGFyZ2V0cykpCitvYmoteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai15KSkKK29iai1tCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLW0pKQorbGliLXkJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChsaWIteSkpCitzdWJkaXItb2JqLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN1YmRpci1vYmoteSkpCityZWFsLW9ianMteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQocmVhbC1vYmpzLXkpKQorcmVhbC1vYmpzLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHJlYWwtb2Jqcy1tKSkKK3NpbmdsZS11c2VkLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHNpbmdsZS11c2VkLW0pKQorbXVsdGktdXNlZC15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS11c2VkLXkpKQorbXVsdGktdXNlZC1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS11c2VkLW0pKQorbXVsdGktb2Jqcy15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS1vYmpzLXkpKQorbXVsdGktb2Jqcy1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS1vYmpzLW0pKQorc3ViZGlyLXltCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzdWJkaXIteW0pKQorb2JqLWRpcnMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai1kaXJzKSkKKworIyBUaGUgdGVtcG9yYXJ5IGZpbGUgdG8gc2F2ZSBnY2MgLU1EIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgbXVzdCBub3QKKyMgY29udGFpbiBhIGNvbW1hCitkZXBmaWxlID0gJChzdWJzdCAkKGNvbW1hKSxfLCQoQEQpLy4kKEBGKS5kKQorCisjIFRoZXNlIGZsYWdzIGFyZSBuZWVkZWQgZm9yIG1vZHZlcnNpb25zIGFuZCBjb21waWxpbmcsIHNvIHdlIGRlZmluZSB0aGVtIGhlcmUKKyMgYWxyZWFkeQorIyAkKG1vZG5hbWVfZmxhZ3MpICNkZWZpbmVzIEtCVUlMRF9NT0ROQU1FIGFzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXQgd2lsbCAKKyMgZW5kIHVwIGluIChvciB3b3VsZCwgaWYgaXQgZ2V0cyBjb21waWxlZCBpbikKKyMgTm90ZTogSXQncyBwb3NzaWJsZSB0aGF0IG9uZSBvYmplY3QgZ2V0cyBwb3RlbnRpYWxseSBsaW5rZWQgaW50byBtb3JlCisjICAgICAgIHRoYW4gb25lIG1vZHVsZS4gSW4gdGhhdCBjYXNlIEtCVUlMRF9NT0ROQU1FIHdpbGwgYmUgc2V0IHRvIGZvb19iYXIsCisjICAgICAgIHdoZXJlIGZvbyBhbmQgYmFyIGFyZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlcy4KK2Jhc2VuYW1lX2ZsYWdzID0gLURLQlVJTERfQkFTRU5BTUU9JChzdWJzdCAkKGNvbW1hKSxfLCQoc3Vic3QgLSxfLCQoKkYpKSkKK21vZG5hbWVfZmxhZ3MgID0gJChpZiAkKGZpbHRlciAxLCQod29yZHMgJChtb2RuYW1lKSkpLC1ES0JVSUxEX01PRE5BTUU9JChzdWJzdCAkKGNvbW1hKSxfLCQoc3Vic3QgLSxfLCQobW9kbmFtZSkpKSkKKworX2NfZmxhZ3MgICAgICAgPSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyQoKkYpLm8pCitfYV9mbGFncyAgICAgICA9ICQoQUZMQUdTKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJCgqRikubykKK19jcHBfZmxhZ3MgICAgID0gJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykgJChDUFBGTEFHU18kKEBGKSkKKworIyBJZiBidWlsZGluZyB0aGUga2VybmVsIGluIGEgc2VwYXJhdGUgb2JqdHJlZSBleHBhbmQgYWxsIG9jY3VycmVuY2VzCisjIG9mIC1JZGlyIHRvIC1JJChzcmN0cmVlKS9kaXIgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocyAoc3RhcnRpbmcgd2l0aCAnLycpLgorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19fY19mbGFncwk9ICQoX2NfZmxhZ3MpCitfX2FfZmxhZ3MJPSAkKF9hX2ZsYWdzKQorX19jcHBfZmxhZ3MgICAgID0gJChfY3BwX2ZsYWdzKQorZWxzZQorCisjIFByZWZpeCAtSSB3aXRoICQoc3JjdHJlZSkgaWYgaXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGgKK2FkZHRyZWUgPSAkKGlmICQoZmlsdGVyLW91dCAtSS8lLCQoMSkpLCQocGF0c3Vic3QgLUklLC1JJChzcmN0cmVlKS8lLCQoMSkpKSAkKDEpCisjIEZpbmQgYWxsIC1JIG9wdGlvbnMgYW5kIGNhbGwgYWRkdHJlZQorZmxhZ3MgPSAkKGZvcmVhY2ggbywkKCQoMSkpLCQoaWYgJChmaWx0ZXIgLUklLCQobykpLCQoY2FsbCBhZGR0cmVlLCQobykpLCQobykpKQorCisjIC1JJChvYmopIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjICQoY2FsbCBhZGR0cmVlLC1JJChvYmopKSBsb2NhdGVzIC5oIGZpbGVzIGluIHNyY3RyZWUsIGZyb20gZ2VuZXJhdGVkIC5jIGZpbGVzCisjICAgYW5kIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjIEZJWE1FOiBSZXBsYWNlIGJvdGggd2l0aCBzcGVjaWZpYyBDRkxBR1MqIHN0YXRlbWVudHMgaW4gdGhlIG1ha2VmaWxlcworX19jX2ZsYWdzCT0gJChjYWxsIGFkZHRyZWUsLUkkKG9iaikpICQoY2FsbCBmbGFncyxfY19mbGFncykKK19fYV9mbGFncwk9ICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmxhZ3MsX2FfZmxhZ3MpCitfX2NwcF9mbGFncyAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGZsYWdzLF9jcHBfZmxhZ3MpCitlbmRpZgorCitjX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fY19mbGFncykgJChtb2RrZXJuX2NmbGFncykgXAorCQkgJChiYXNlbmFtZV9mbGFncykgJChtb2RuYW1lX2ZsYWdzKQorCithX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fYV9mbGFncykgJChtb2RrZXJuX2FmbGFncykKKworY3BwX2ZsYWdzICAgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChOT1NURElOQ19GTEFHUykgJChfX2NwcF9mbGFncykKKworbGRfZmxhZ3MgICAgICAgPSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykKKworIyBGaW5kcyB0aGUgbXVsdGktcGFydCBvYmplY3QgdGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgbGlua2VkIGludG8KK21vZG5hbWUtbXVsdGkgPSAkKHNvcnQgJChmb3JlYWNoIG0sJChtdWx0aS11c2VkKSxcCisJCSQoaWYgJChmaWx0ZXIgJChzdWJzdCAkKG9iaikvLCwkKi5vKSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKG06Lm89KSkpKQorCisjIFNoaXBwZWQgZmlsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3F1aWV0X2NtZF9zaGlwcGVkID0gU0hJUFBFRCAkQAorY21kX3NoaXBwZWQgPSBjYXQgJDwgPiAkQAorCiskKG9iaikvJTo6ICQoc3JjKS8lX3NoaXBwZWQKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyMgQ29tbWFuZHMgdXNlZnVsIGZvciBidWlsZGluZyBhIGJvb3QgaW1hZ2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIAorIwlVc2UgYXMgZm9sbG93aW5nOgorIworIwl0YXJnZXQ6IHNvdXJjZShzKSBGT1JDRQorIwkJJChpZl9jaGFuZ2VkLGxkL29iamNvcHkvZ3ppcCkKKyMKKyMJYW5kIGFkZCB0YXJnZXQgdG8gRVhUUkFfVEFSR0VUUyBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSB0bworIwlyZWFkIGluIHRoZSBzYXZlZCBjb21tYW5kIGxpbmUKKworIyBMaW5raW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitxdWlldF9jbWRfbGQgPSBMRCAgICAgICRACitjbWRfbGQgPSAkKExEKSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykgJChMREZMQUdTXyQoQEYpKSBcCisJICAgICAgICQoZmlsdGVyLW91dCBGT1JDRSwkXikgLW8gJEAgCisKKyMgT2JqY29weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcXVpZXRfY21kX29iamNvcHkgPSBPQkpDT1BZICRACitjbWRfb2JqY29weSA9ICQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQoT0JKQ09QWUZMQUdTXyQoQEYpKSAkPCAkQAorCisjIEd6aXAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9nemlwID0gR1pJUCAgICAkQAorY21kX2d6aXAgPSBnemlwIC1mIC05IDwgJDwgPiAkQAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBHZW5lcmljIHN0dWZmCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZm5lcSAoJChLQlVJTERfTk9DTURERVApLDEpCisjIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGhhcyBzYW1lIGFyZ3VtZW50cy4gUmVzdWx0IGluIGVtcHR5IHN0cmluZyBpZiBlcXVhbAorIyBVc2VyIG1heSBvdmVycmlkZSB0aGlzIGNoZWNrIHVzaW5nIG1ha2UgS0JVSUxEX05PQ01EREVQPTEKK2FyZy1jaGVjayA9ICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoMSksICQoMikpICQoZmlsdGVyLW91dCAkKDIpLCAkKDEpKSApCisKK2VuZGlmCisKKyMgZWNobyBjb21tYW5kLiBTaG9ydCB2ZXJzaW9uIGlzICQocXVpZXQpIGVxdWFscyBxdWlldCwgb3RoZXJ3aXNlIGZ1bGwgY29tbWFuZAorZWNoby1jbWQgPSAkKGlmICQoJChxdWlldCljbWRfJCgxKSksIFwKKwllY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJzspCisKKyMgZnVuY3Rpb24gdG8gb25seSBleGVjdXRlIHRoZSBwYXNzZWQgY29tbWFuZCBpZiBuZWNlc3NhcnkKKyMgPic8IHN1YnN0aXR1dGlvbiBpcyBmb3IgZWNobyB0byB3b3JrLCA+JDwgc3Vic3RpdHV0aW9uIHRvIHByZXNlcnZlICQgd2hlbiByZWxvYWRpbmcgLmNtZCBmaWxlCisjIG5vdGU6IHdoZW4gdXNpbmcgaW5saW5lIHBlcmwgc2NyaXB0cyBbcGVybCAtZSAnLi4uJCR0PTE7Li4uJ10gaW4gJChjbWRfeHh4KSBkb3VibGUgJCQgeW91ciBwZXJsIHZhcnMKKyMgCitpZl9jaGFuZ2VkID0gJChpZiAkKHN0cmlwICQ/ICQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksIFwKKwlAc2V0IC1lOyBcCisJJChlY2hvLWNtZCkgXAorCSQoY21kXyQoMSkpOyBcCisJZWNobyAnY21kXyRAIDo9ICQoc3Vic3QgJCQsJCQkJCwkKHN1YnN0ICcsJ1wnJywkKGNtZF8kKDEpKSkpJyA+ICQoQEQpLy4kKEBGKS5jbWQpCisKKworIyBleGVjdXRlIHRoZSBjb21tYW5kIGFuZCBhbHNvIHBvc3Rwcm9jZXNzIGdlbmVyYXRlZCAuZCBkZXBlbmRlbmNpZXMKKyMgZmlsZQorCitpZl9jaGFuZ2VkX2RlcCA9ICQoaWYgJChzdHJpcCAkPyAkKGZpbHRlci1vdXQgRk9SQ0UgJCh3aWxkY2FyZCAkXiksJF4pXAorCSQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksICAgICAgICAgICAgICAgICAgXAorCUBzZXQgLWU7IFwKKwkkKGVjaG8tY21kKSBcCisJJChjbWRfJCgxKSk7IFwKKwlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKHN1YnN0ICQkLCQkJCQsJChzdWJzdCAnLCdcJycsJChjbWRfJCgxKSkpKScgPiAkKEBEKS8uJChARikudG1wOyBcCisJcm0gLWYgJChkZXBmaWxlKTsgXAorCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZCkKKworIyBVc2FnZTogJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxmb28pCisjIHdpbGwgY2hlY2sgaWYgJChjbWRfZm9vKSBjaGFuZ2VkLCBvciBhbnkgb2YgdGhlIHByZXF1aXNpdGVzIGNoYW5nZWQsCisjIGFuZCBpZiBzbyB3aWxsIGV4ZWN1dGUgJChydWxlX2ZvbykKKworaWZfY2hhbmdlZF9ydWxlID0gJChpZiAkKHN0cmlwICQ/ICQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksXAorCQkJQHNldCAtZTsgXAorCQkJJChydWxlXyQoMSkpKQorCisjIElmIHF1aWV0IGlzIHNldCwgb25seSBwcmludCBzaG9ydCB2ZXJzaW9uIG9mIGNvbW1hbmQKKworY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKKworIwkkKGNhbGwgZGVzY2VuZCw8ZGlyPiw8dGFyZ2V0PikKKyMJUmVjdXJzaXZlbHkgY2FsbCBhIHN1Yi1tYWtlIGluIDxkaXI+IHdpdGggdGFyZ2V0IDx0YXJnZXQ+IAorIyBVc2FnZSBpcyBkZXByZWNhdGVkLCBiZWNhdXNlIG1ha2UgZG8gbm90IHNlZSB0aGlzIGFzIGFuIGludm9jYXRpb24gb2YgbWFrZS4KK2Rlc2NlbmQgPSQoUSkkKE1BS0UpIC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iaj0kKDEpICQoMikKKworIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqPQorIyBVc2FnZToKKyMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCitidWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKKworIyBmaWxlY2hrIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgYSBnZW5lcmF0ZWQgZmlsZSBpcyB1cGRhdGVkLgorIyBTYW1wbGUgdXNhZ2U6CisjIGRlZmluZSBmaWxlY2hrX3NhbXBsZQorIwllY2hvICRLRVJORUxSRUxFQVNFCisjIGVuZGVmCisjIHZlcnNpb24uaCA6IE1ha2VmaWxlCisjCSQoY2FsbCBmaWxlY2hrLHNhbXBsZSkKKyMgVGhlIHJ1bGUgZGVmaW5lZCBzaGFsbCB3cml0ZSB0byBzdGRvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBmaWxlLgorIyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIGNvbXBhcmVkIHdpdGggdGhlIG5ldyBvbmUuCisjIC0gSWYgbm8gZmlsZSBleGlzdCBpdCBpcyBjcmVhdGVkCisjIC0gSWYgdGhlIGNvbnRlbnQgZGlmZmVyIHRoZSBuZXcgZmlsZSBpcyB1c2VkCisjIC0gSWYgdGhleSBhcmUgZXF1YWwgbm8gY2hhbmdlLCBhbmQgbm8gdGltZXN0YW1wIHVwZGF0ZQorCitkZWZpbmUgZmlsZWNoaworCSQoUSlzZXQgLWU7CQkJCVwKKwllY2hvICcgIENISyAgICAgJEAnOwkJCVwKKwlta2RpciAtcCAkKGRpciAkQCk7CQkJXAorCSQoZmlsZWNoa18kKDEpKSAkKDIpID4gJEAudG1wOwkJXAorCWlmIFsgLXIgJEAgXSAmJiBjbXAgLXMgJEAgJEAudG1wOyB0aGVuCVwKKwkJcm0gLWYgJEAudG1wOwkJCVwKKwllbHNlCQkJCQlcCisJCWVjaG8gJyAgVVBEICAgICAkQCc7CQlcCisJCW12IC1mICRALnRtcCAkQDsJCVwKKwlmaQorZW5kZWYKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0IGIvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDY0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKQEAgLTAsMCArMSwyOSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBJbnN0YWxsaW5nIG1vZHVsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLlBIT05ZOiBfX21vZGluc3QKK19fbW9kaW5zdDoKKworaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgorCisjCisKK19fbW9kdWxlcyA6PSAkKHNvcnQgJChzaGVsbCBncmVwIC1oICdcLmtvJyAvZGV2L251bGwgJCh3aWxkY2FyZCAkKE1PRFZFUkRJUikvKi5tb2QpKSkKK21vZHVsZXMgOj0gJChwYXRzdWJzdCAlLm8sJS5rbywkKHdpbGRjYXJkICQoX19tb2R1bGVzOi5rbz0ubykpKQorCisuUEhPTlk6ICQobW9kdWxlcykKK19fbW9kaW5zdDogJChtb2R1bGVzKQorCUA6CisKK3F1aWV0X2NtZF9tb2R1bGVzX2luc3RhbGwgPSBJTlNUQUxMICRACisgICAgICBjbWRfbW9kdWxlc19pbnN0YWxsID0gbWtkaXIgLXAgJCgyKTsgY3AgJEAgJCgyKQorCisjIE1vZHVsZXMgYnVpbHQgb3V0c2lkZSB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGdvIGludG8gZXh0cmEgYnkgZGVmYXVsdAorSU5TVEFMTF9NT0RfRElSID89IGV4dHJhCitleHQtbW9kLWRpciA9ICQoSU5TVEFMTF9NT0RfRElSKSQoc3Vic3QgJChLQlVJTERfRVhUTU9EKSwsJChARCkpCisKK21vZGluc3RfZGlyID0gJChpZiAkKEtCVUlMRF9FWFRNT0QpLCQoZXh0LW1vZC1kaXIpLGtlcm5lbC8kKEBEKSkKKworJChtb2R1bGVzKToKKwkkKGNhbGwgY21kLG1vZHVsZXNfaW5zdGFsbCwkKE1PRExJQikvJChtb2RpbnN0X2RpcikpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtMCwwICsxLDExMCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgTW9kdWxlIHZlcnNpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdGFnZSBvbmUgb2YgbW9kdWxlIGJ1aWxkaW5nIGNyZWF0ZWQgdGhlIGZvbGxvd2luZzoKKyMgYSkgVGhlIGluZGl2aWR1YWwgLm8gZmlsZXMgdXNlZCBmb3IgdGhlIG1vZHVsZQorIyBiKSBBIDxtb2R1bGU+Lm8gZmlsZSB3aWNoIGlzIHRoZSAubyBmaWxlcyBhYm92ZSBsaW5rZWQgdG9nZXRoZXIKKyMgYykgQSA8bW9kdWxlPi5tb2QgZmlsZSBpbiAkKE1PRFZFUkRJUikvLCBsaXN0aW5nIHRoZSBuYW1lIG9mIHRoZQorIyAgICB0aGUgcHJlbGltaW5hcnkgPG1vZHVsZT4ubyBmaWxlLCBwbHVzIGFsbCAubyBmaWxlcworCisjIFN0YWdlIDIgaXMgaGFuZGxlZCBieSB0aGlzIGZpbGUgYW5kIGRvZXMgdGhlIGZvbGxvd2luZworIyAxKSBGaW5kIGFsbCBtb2R1bGVzIGZyb20gdGhlIGZpbGVzIGxpc3RlZCBpbiAkKE1PRFZFUkRJUikvCisjIDIpIG1vZHBvc3QgaXMgdGhlbiB1c2VkIHRvCisjIDMpICBjcmVhdGUgb25lIDxtb2R1bGU+Lm1vZC5jIGZpbGUgcHIuIG1vZHVsZQorIyA0KSAgY3JlYXRlIG9uZSBNb2R1bGUuc3ltdmVycyBmaWxlIHdpdGggQ1JDIGZvciBhbGwgZXhwb3J0ZWQgc3ltYm9scworIyA1KSBjb21waWxlIGFsbCA8bW9kdWxlPi5tb2QuYyBmaWxlcworIyA2KSBmaW5hbCBsaW5rIG9mIHRoZSBtb2R1bGUgdG8gYSA8bW9kdWxlLmtvPiBmaWxlCisKKyMgU3RlcCAzIGlzIHVzZWQgdG8gcGxhY2UgY2VydGFpbiBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kdWxlJ3MgRUxGCisjIHNlY3Rpb24sIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzOgorIyAgIFZlcnNpb24gbWFnaWMgKHNlZSBpbmNsdWRlL3Zlcm1hZ2ljLmggZm9yIGZ1bGwgZGV0YWlscykKKyMgICAgIC0gS2VybmVsIHJlbGVhc2UKKyMgICAgIC0gU01QIGlzIENPTkZJR19TTVAKKyMgICAgIC0gUFJFRU1QVCBpcyBDT05GSUdfUFJFRU1QVAorIyAgICAgLSBHQ0MgVmVyc2lvbgorIyAgIE1vZHVsZSBpbmZvCisjICAgICAtIE1vZHVsZSB2ZXJzaW9uIChNT0RVTEVfVkVSU0lPTikKKyMgICAgIC0gTW9kdWxlIGFsaWFzJ2VzIChNT0RVTEVfQUxJQVMpCisjICAgICAtIE1vZHVsZSBsaWNlbnNlIChNT0RVTEVfTElDRU5TRSkKKyMgICAgIC0gU2VlIGluY2x1ZGUvbGludXgvbW9kdWxlLmggZm9yIG1vcmUgZGV0YWlscworCisjIFN0ZXAgNCBpcyBzb2xlbHkgdXNlZCB0byBhbGxvdyBtb2R1bGUgdmVyc2lvbmluZyBpbiBleHRlcm5hbCBtb2R1bGVzLAorIyB3aGVyZSB0aGUgQ1JDIG9mIGVhY2ggbW9kdWxlIGlzIHJldHJlaXZlZCBmcm9tIHRoZSBNb2R1bGUuc3ltZXJzIGZpbGUuCisKKy5QSE9OWTogX21vZHBvc3QKK19tb2Rwb3N0OiBfX21vZHBvc3QKKworaW5jbHVkZSAuY29uZmlnCitpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCisKK3N5bXZlcmZpbGUgOj0gJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycworCisjIFN0ZXAgMSksIGZpbmQgYWxsIG1vZHVsZXMgbGlzdGVkIGluICQoTU9EVkVSRElSKS8KK19fbW9kdWxlcyA6PSAkKHNvcnQgJChzaGVsbCBncmVwIC1oICdcLmtvJyAvZGV2L251bGwgJCh3aWxkY2FyZCAkKE1PRFZFUkRJUikvKi5tb2QpKSkKK21vZHVsZXMgICA6PSAkKHBhdHN1YnN0ICUubywlLmtvLCAkKHdpbGRjYXJkICQoX19tb2R1bGVzOi5rbz0ubykpKQorCitfbW9kcG9zdDogJChtb2R1bGVzKQorCisKKyMgU3RlcCAyKSwgaW52b2tlIG1vZHBvc3QKKyMgIEluY2x1ZGVzIHN0ZXAgMyw0CitxdWlldF9jbWRfbW9kcG9zdCA9IE1PRFBPU1QKKyAgICAgIGNtZF9tb2Rwb3N0ID0gc2NyaXB0cy9tb2QvbW9kcG9zdCAgICAgICAgICAgIFwKKyAgICAgICAgJChpZiAkKENPTkZJR19NT0RWRVJTSU9OUyksLW0pICAgICAgICAgICAgIFwKKwkkKGlmICQoQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCksLWEsKSAgXAorCSQoaWYgJChLQlVJTERfRVhUTU9EKSwtaSwtbykgJChzeW12ZXJmaWxlKSBcCisJJChmaWx0ZXItb3V0IEZPUkNFLCReKQorCisuUEhPTlk6IF9fbW9kcG9zdAorX19tb2Rwb3N0OiAkKHdpbGRjYXJkIHZtbGludXgpICQobW9kdWxlczoua289Lm8pIEZPUkNFCisJJChjYWxsIGNtZCxtb2Rwb3N0KQorCisjIERlY2xhcmUgZ2VuZXJhdGVkIGZpbGVzIGFzIHRhcmdldHMgZm9yIG1vZHBvc3QKKyQoc3ltdmVyZmlsZSk6ICAgICAgICAgX19tb2Rwb3N0IDsKKyQobW9kdWxlczoua289Lm1vZC5jKTogX19tb2Rwb3N0IDsKKworCisjIFN0ZXAgNSksIGNvbXBpbGUgYWxsICoubW9kLmMgZmlsZXMKKworIyBtb2RuYW1lIGlzIHNldCB0byBtYWtlIGNfZmxhZ3MgZGVmaW5lIEtCVUlMRF9NT0ROQU1FCittb2RuYW1lID0gJCgqRikKKworcXVpZXRfY21kX2NjX29fYyA9IENDICAgICAgJEAKKyAgICAgIGNtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpICQoQ0ZMQUdTX01PRFVMRSkJXAorCQkgICAtYyAtbyAkQCAkPAorCiskKG1vZHVsZXM6LmtvPS5tb2Qubyk6ICUubW9kLm86ICUubW9kLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCit0YXJnZXRzICs9ICQobW9kdWxlczoua289Lm1vZC5vKQorCisjIFN0ZXAgNiksIGZpbmFsIGxpbmsgb2YgdGhlIG1vZHVsZXMKK3F1aWV0X2NtZF9sZF9rb19vID0gTEQgW01dICAkQAorICAgICAgY21kX2xkX2tvX28gPSAkKExEKSAkKExERkxBR1MpICQoTERGTEFHU19NT0RVTEUpIC1vICRAIAkJXAorCQkJICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pCisKKyQobW9kdWxlcyk6ICUua28gOiUubyAlLm1vZC5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGRfa29fbykKKwordGFyZ2V0cyArPSAkKG1vZHVsZXMpCisKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCisKK3RhcmdldHMgOj0gJCh3aWxkY2FyZCAkKHNvcnQgJCh0YXJnZXRzKSkpCitjbWRfZmlsZXMgOj0gJCh3aWxkY2FyZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICBpbmNsdWRlICQoY21kX2ZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUgYi9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmU5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMjIworIyBNYWtlZmlsZS5iYXNpYyBsaXN0IHRoZSBtb3N0IGJhc2ljIHByb2dyYW1zIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLgorIyBUaGUgcHJvZ3JhbXMgbGlzdGVkIGhlcmVpbiBpcyB3aGF0IGlzIG5lZWRlZCB0byBkbyB0aGUgYmFzaWMgc3R1ZmYsCisjIHN1Y2ggYXMgc3BsaXR0aW5nIC5jb25maWcgYW5kIGZpeCBkZXBlbmRlbmN5IGZpbGUuCisjIFRoaXMgaW5pdGlhbCBzdGVwIGlzIG5lZWRlZCB0byBhdm9pZCBmaWxlcyB0byBiZSByZWNvbXBpbGVkCisjIHdoZW4ga2VybmVsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAod2hpY2ggaXMgd2hhdCBoYXBwZW5zIHdoZW4KKyMgLmNvbmZpZyBpcyBpbmNsdWRlZCBieSBtYWluIE1ha2VmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZml4ZGVwOiAJIFVzZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBkdXJpbmcgYnVpbGQgcHJvY2VzcworIyBzcGxpdC1pbmNsdWRlOiBEaXZpZGUgYWxsIGNvbmZpZyBzeW1ib2xzIHVwIGluIGEgbnVtYmVyIG9mIGZpbGVzIGluCisjICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnLy4uLgorIyBkb2Nwcm9jOgkgVXNlZCBpbiBEb2N1bWVudGF0aW9uL2RvY2Jvb2sKKworaG9zdHByb2dzLXkJOj0gZml4ZGVwIHNwbGl0LWluY2x1ZGUgZG9jcHJvYworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCisjIGZpeGRlcCBpcyBuZWVkZWQgdG8gY29tcGlsZSBvdGhlciBob3N0IHByb2dyYW1zCiskKGFkZHByZWZpeCAkKG9iaikvLCQoZmlsdGVyLW91dCBmaXhkZXAsJChhbHdheXMpKSk6ICQob2JqKS9maXhkZXAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhN2VjZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcworICogICAgICB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorICoJZG9jcHJvYyBpcyB1c2VkIGZvciBkb2N1bWVudGF0aW9uLWZyb250ZW5kIGFuZAorICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KKyAqCVRoZSB0d28gdXNhZ2VzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSByZXF1aXJlCisgKglzb21lIGtub3dsZWRnZSBvZiB0aGUgLnRtcGwgc3ludGF4LCB0aGVyZWZvcmUgdGhleQorICoJYXJlIGtlcHQgdG9nZXRoZXIuCisgKgorICoJZG9jdW1lbnRhdGlvbi1mcm9udGVuZAorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCisgKgkJYWxsIG9jY3VycmVuY2VzIG9mICFbRUlGXWZpbGUKKyAqCQlCZWZvcmVoYW5kIGVhY2ggcmVmZXJlbmNlZCBmaWxlIGFyZSBzY2FubmVkIGZvcgorICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCisgKgkJVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBwcm9wZXIgLWZ1bmN0aW9uIGFuZAorICoJCS1ub2Z1bmN0aW9uIGFyZ3VtZW50cyBpbiBjYWxscyB0byBrZXJuZWwtZG9jLgorICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKKyAqCisgKglkZXBlbmRlbmN5LWdlbmVyYXRvcjoKKyAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKKyAqCQlyZWZlcmVuY2VkIGluIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgbWFrZS4KKyAqCQlVc2FnZToJZG9jcHJvYyBkZXBlbmQgZmlsZS50bXBsCisgKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKgkJaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgkJZmlsZS50bXBsIHNyYy5jCXNyYzIuYworICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgorICoJCSFFZmlsZW5hbWUKKyAqCQkhSWZpbGVuYW1lCisgKgkJIURmaWxlbmFtZQorICoJCSFGZmlsZW5hbWUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKiBleGl0c3RhdHVzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbnkgZmFpbGluZyBjYWxscyB0byBrZXJuZWwtZG9jLAorICogYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMuICovCitpbnQgZXhpdHN0YXR1cyA9IDA7CisKK3R5cGVkZWYgdm9pZCBERkwoY2hhciAqKTsKK0RGTCAqZGVmYXVsdGxpbmU7CisKK3R5cGVkZWYgdm9pZCBGSUxFT05MWShjaGFyICogZmlsZSk7CitGSUxFT05MWSAqaW50ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqZXh0ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqc3ltYm9sc29ubHk7CisKK3R5cGVkZWYgdm9pZCBGSUxFTElORShjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKTsKK0ZJTEVMSU5FICogc2luZ2xlZnVuY3Rpb25zOworRklMRUxJTkUgKiBlbnRpdHlfc3lzdGVtOworCisjZGVmaW5lIE1BWExJTkVTWiAgICAgMjA0OAorI2RlZmluZSBNQVhGSUxFUyAgICAgIDI1MAorI2RlZmluZSBLRVJORUxET0NQQVRIICJzY3JpcHRzLyIKKyNkZWZpbmUgS0VSTkVMRE9DICAgICAia2VybmVsLWRvYyIKKyNkZWZpbmUgRE9DQk9PSyAgICAgICAiLWRvY2Jvb2siCisjZGVmaW5lIEZVTkNUSU9OICAgICAgIi1mdW5jdGlvbiIKKyNkZWZpbmUgTk9GVU5DVElPTiAgICAiLW5vZnVuY3Rpb24iCisKK3ZvaWQgdXNhZ2UgKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZG9jcHJvYyB7ZG9jfGRlcGVuZH0gZmlsZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJJbnB1dCBpcyByZWFkIGZyb20gZmlsZS50bXBsLiBPdXRwdXQgaXMgc2VudCB0byBzdGRvdXRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiZG9jOiBmcm9udGVuZCB3aGVuIGdlbmVyYXRpbmcga2VybmVsIGRvY3VtZW50YXRpb25cbiIpOworCWZwcmludGYoc3RkZXJyLCAiZGVwZW5kOiBnZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIGZpbGVcbiIpOworfQorCisvKgorICogRXhlY3V0ZSBrZXJuZWwtZG9jIHdpdGggcGFyYW1ldGVycyBnaXZpbiBpbiBzdmVjCisgKi8KK3ZvaWQgZXhlY19rZXJuZWxfZG9jKGNoYXIgKipzdmVjKQoreworCXBpZF90IHBpZDsKKwlpbnQgcmV0OworCWNoYXIgcmVhbF9maWxlbmFtZVtQQVRIX01BWCArIDFdOworCS8qIE1ha2Ugc3VyZSBvdXRwdXQgZ2VuZXJhdGVkIHNvIGZhciBhcmUgZmx1c2hlZCAqLworCWZmbHVzaChzdGRvdXQpOworCXN3aXRjaChwaWQ9Zm9yaygpKSB7CisJCWNhc2UgLTE6CisJCQlwZXJyb3IoImZvcmsiKTsKKwkJCWV4aXQoMSk7CisJCWNhc2UgIDA6CisJCQltZW1zZXQocmVhbF9maWxlbmFtZSwgMCwgc2l6ZW9mKHJlYWxfZmlsZW5hbWUpKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgS0VSTkVMRE9DUEFUSCBLRVJORUxET0MsCisJCQkJCVBBVEhfTUFYIC0gc3RybGVuKHJlYWxfZmlsZW5hbWUpKTsKKwkJCWV4ZWN2cChyZWFsX2ZpbGVuYW1lLCBzdmVjKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXhlYyAiKTsKKwkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKKwkJCWV4aXQoMSk7CisJCWRlZmF1bHQ6CisJCQl3YWl0cGlkKHBpZCwgJnJldCAsMCk7CisJfQorCWlmIChXSUZFWElURUQocmV0KSkKKwkJZXhpdHN0YXR1cyB8PSBXRVhJVFNUQVRVUyhyZXQpOworCWVsc2UKKwkJZXhpdHN0YXR1cyA9IDB4ZmY7Cit9CisKKy8qIFR5cGVzIHVzZWQgdG8gY3JlYXRlIGxpc3Qgb2YgYWxsIGV4cG9ydGVkIHN5bWJvbHMgaW4gYSBudW1iZXIgb2YgZmlsZXMgKi8KK3N0cnVjdCBzeW1ib2xzCit7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1maWxlCit7CisJY2hhciAqZmlsZW5hbWU7CisJc3RydWN0IHN5bWJvbHMgKnN5bWJvbGxpc3Q7CisJaW50IHN5bWJvbGNudDsKK307CisKK3N0cnVjdCBzeW1maWxlIHN5bWZpbGVsaXN0W01BWEZJTEVTXTsKK2ludCBzeW1maWxlY250ID0gMDsKKwordm9pZCBhZGRfbmV3X3N5bWJvbChzdHJ1Y3Qgc3ltZmlsZSAqc3ltLCBjaGFyICogc3ltbmFtZSkKK3sKKwlzeW0tPnN5bWJvbGxpc3QgPQorICAgICAgICAgIHJlYWxsb2Moc3ltLT5zeW1ib2xsaXN0LCAoc3ltLT5zeW1ib2xjbnQgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwlzeW0tPnN5bWJvbGxpc3Rbc3ltLT5zeW1ib2xjbnQrK10ubmFtZSA9IHN0cmR1cChzeW1uYW1lKTsKK30KKworLyogQWRkIGEgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8KK3N0cnVjdCBzeW1maWxlICogYWRkX25ld19maWxlKGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlzeW1maWxlbGlzdFtzeW1maWxlY250KytdLmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKwlyZXR1cm4gJnN5bWZpbGVsaXN0W3N5bWZpbGVjbnQgLSAxXTsKK30KKy8qIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBhcmUgcHJlc2VudCBpbiB0aGUgbGlzdCAqLworc3RydWN0IHN5bWZpbGUgKiBmaWxlbmFtZV9leGlzdChjaGFyICogZmlsZW5hbWUpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspCisJCWlmIChzdHJjbXAoc3ltZmlsZWxpc3RbaV0uZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZzeW1maWxlbGlzdFtpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExpc3QgYWxsIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgorICogRmlsZXMgYXJlIHNlcGFyYXRlZCBieSB0YWJzLgorICovCit2b2lkIGFkZGRlcChjaGFyICogZmlsZSkJCSAgIHsgcHJpbnRmKCJcdCVzIiwgZmlsZSk7IH0KK3ZvaWQgYWRkZGVwMihjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKSAgICAgeyBsaW5lID0gbGluZTsgYWRkZGVwKGZpbGUpOyB9Cit2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQordm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIHNpZ25lZCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQorCisvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KK3ZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CisKKy8qCisgKiBGaW5kIGFsbCBzeW1ib2xzIGV4cG9ydGVkIHdpdGggRVhQT1JUX1NZTUJPTCBhbmQgRVhQT1JUX1NZTUJPTF9HUEwKKyAqIGluIGZpbGVuYW1lLgorICogQWxsIHN5bWJvbHMgbG9jYXRlZCBhcmUgc3RvcmVkIGluIHN5bWZpbGVsaXN0LgorICovCit2b2lkIGZpbmRfZXhwb3J0X3N5bWJvbHMoY2hhciAqIGZpbGVuYW1lKQoreworCUZJTEUgKiBmcDsKKwlzdHJ1Y3Qgc3ltZmlsZSAqc3ltOworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCWlmIChmaWxlbmFtZV9leGlzdChmaWxlbmFtZSkgPT0gTlVMTCkgeworCQljaGFyIHJlYWxfZmlsZW5hbWVbUEFUSF9NQVggKyAxXTsKKwkJbWVtc2V0KHJlYWxfZmlsZW5hbWUsIDAsIHNpemVvZihyZWFsX2ZpbGVuYW1lKSk7CisJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJc3RybmNhdChyZWFsX2ZpbGVuYW1lLCBmaWxlbmFtZSwKKwkJCQlQQVRIX01BWCAtIHN0cmxlbihyZWFsX2ZpbGVuYW1lKSk7CisJCXN5bSA9IGFkZF9uZXdfZmlsZShmaWxlbmFtZSk7CisJCWZwID0gZm9wZW4ocmVhbF9maWxlbmFtZSwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CisJCX0KKwkJd2hpbGUoZmdldHMobGluZSwgTUFYTElORVNaLCBmcCkpIHsKKwkJCXNpZ25lZCBjaGFyICpwOworCQkJc2lnbmVkIGNoYXIgKmU7CisJCQlpZiAoKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MX0dQTCIpKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSAwKSkgeworCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLworCQkJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCisJCQkJCXArKzsKKwkJCQkvKiBSZW1vdmUgcGFyYW50ZXNlcyBhbmQgYWRkaXRpb25hbCB3cyAqLworCQkJCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJCQkJcCsrOworCQkJCWlmICgqcCAhPSAnKCcpCisJCQkJCWNvbnRpbnVlOyAvKiBTeW50YXggZXJyb3I/ICovCisJCQkJZWxzZQorCQkJCQlwKys7CisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJZSA9IHA7CisJCQkJd2hpbGUgKGlzYWxudW0oKmUpIHx8ICplID09ICdfJykKKwkJCQkJZSsrOworCQkJCSplID0gJ1wwJzsKKwkJCQlhZGRfbmV3X3N5bWJvbChzeW0sIHApOworCQkJfQorCQl9CisJCWZjbG9zZShmcCk7CisJfQorfQorCisvKgorICogRG9jdW1lbnQgYWxsIGV4dGVybmFsIG9yIGludGVybmFsIGZ1bmN0aW9ucyBpbiBhIGZpbGUuCisgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLW5vZnVuY3Rpb24gZnVuY3Rpb25fbmFtZTEgZmlsZW5hbWUKKyAqIGZ1bmN0aW9uIG5hbWVzIGFyZSBvYnRhaW5lZCBmcm9tIGFsbCB0aGUgdGhlIHNyYyBmaWxlcworICogYnkgZmluZF9leHBvcnRfc3ltYm9scy4KKyAqIGludGZ1bmMgdXNlcyAtbm9mdW5jdGlvbgorICogZXh0ZnVuYyB1c2VzIC1mdW5jdGlvbgorICovCit2b2lkIGRvY2Z1bmN0aW9ucyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiB0eXBlKQoreworCWludCBpLGo7CisJaW50IHN5bWNudCA9IDA7CisJaW50IGlkeCA9IDA7CisJY2hhciAqKnZlYzsKKworCWZvciAoaT0wOyBpIDw9IHN5bWZpbGVjbnQ7IGkrKykKKwkJc3ltY250ICs9IHN5bWZpbGVsaXN0W2ldLnN5bWJvbGNudDsKKwl2ZWMgPSBtYWxsb2MoKDIgKyAyICogc3ltY250ICsgMikgKiBzaXplb2YoY2hhciopKTsKKwlpZiAodmVjID09IE5VTEwpIHsKKwkJcGVycm9yKCJkb2Nwcm9jOiAiKTsKKwkJZXhpdCgxKTsKKwl9CisJdmVjW2lkeCsrXSA9IEtFUk5FTERPQzsKKwl2ZWNbaWR4KytdID0gRE9DQk9PSzsKKwlmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykgeworCQlzdHJ1Y3Qgc3ltZmlsZSAqIHN5bSA9ICZzeW1maWxlbGlzdFtpXTsKKwkJZm9yIChqPTA7IGogPCBzeW0tPnN5bWJvbGNudDsgaisrKSB7CisJCQl2ZWNbaWR4KytdICAgICA9IHR5cGU7CisJCQl2ZWNbaWR4KytdID0gc3ltLT5zeW1ib2xsaXN0W2pdLm5hbWU7CisJCX0KKwl9CisJdmVjW2lkeCsrXSAgICAgPSBmaWxlbmFtZTsKKwl2ZWNbaWR4XSA9IE5VTEw7CisJcHJpbnRmKCI8IS0tICVzIC0tPlxuIiwgZmlsZW5hbWUpOworCWV4ZWNfa2VybmVsX2RvYyh2ZWMpOworCWZmbHVzaChzdGRvdXQpOworCWZyZWUodmVjKTsKK30KK3ZvaWQgaW50ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsJZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBOT0ZVTkNUSU9OKTsgfQordm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CisKKy8qCisgKiBEb2N1bWVudCBzcOVlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQorICovCit2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgc2lnbmVkIGNoYXIgKiBsaW5lKQoreworCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworICAgICAgICBpbnQgaSwgaWR4ID0gMDsKKyAgICAgICAgaW50IHN0YXJ0b2ZzeW0gPSAxOworCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisKKyAgICAgICAgLyogU3BsaXQgbGluZSB1cCBpbiBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgcHJlY2VlZGVkIGJ5IEZVTkNUSU9OICovCisgICAgICAgIGZvciAoaT0wOyBsaW5lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNzcGFjZShsaW5lW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydG9mc3ltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRvZnN5bSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRvZnN5bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gRlVOQ1RJT047CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gJmxpbmVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJdmVjW2lkeCsrXSA9IGZpbGVuYW1lOworCXZlY1tpZHhdID0gTlVMTDsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKK30KKworLyoKKyAqIFBhcnNlIGZpbGUsIGNhbGxpbmcgYWN0aW9uIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3I6CisgKiAxKSBMaW5lcyBjb250YWluaW5nICFFCisgKiAyKSBMaW5lcyBjb250YWluaW5nICFJCisgKiAzKSBMaW5lcyBjb250YWluaW5nICFECisgKiA0KSBMaW5lcyBjb250YWluaW5nICFGCisgKiA1KSBEZWZhdWx0IGxpbmVzIC0gbGluZXMgbm90IG1hdGNoaW5nIHRoZSBhYm92ZQorICovCit2b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQoreworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCXNpZ25lZCBjaGFyICogczsKKwl3aGlsZShmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGluZmlsZSkpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJyEnKSB7CisJCQlzID0gbGluZSArIDI7CisJCQlzd2l0Y2ggKGxpbmVbMV0pIHsKKwkJCQljYXNlICdFJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCWV4dGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0knOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJaW50ZXJuYWxmdW5jdGlvbnMobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRCc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sc29ubHkobGluZSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlICdGJzoKKwkJCQkJLyogZmlsZW5hbWUgKi8KKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcysrID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdW5jdGlvbiBuYW1lcyAqLworCQkJCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQkJCQlzKys7CisJCQkJCXNpbmdsZWZ1bmN0aW9ucyhsaW5lICsyLCBzKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVmYXVsdGxpbmUobGluZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlkZWZhdWx0bGluZShsaW5lKTsKKwkJfQorCX0KKwlmZmx1c2goc3Rkb3V0KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCUZJTEUgKiBpbmZpbGU7CisJaWYgKGFyZ2MgIT0gMykgeworCQl1c2FnZSgpOworCQlleGl0KDEpOworCX0KKwkvKiBPcGVuIGZpbGUsIGV4aXQgb24gZXJyb3IgKi8KKwlpbmZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOworICAgICAgICBpZiAoaW5maWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworICAgICAgICAgICAgICAgIHBlcnJvcihhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CisKKwlpZiAoc3RyY21wKCJkb2MiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogTmVlZCB0byBkbyB0aGlzIGluIHR3byBwYXNzZXMuCisJCSAqIEZpcnN0IHBhc3MgaXMgdXNlZCB0byBjb2xsZWN0IGFsbCBzeW1ib2xzIGV4cG9ydGVkCisJCSAqIGluIHRoZSB2YXJpb3VzIGZpbGVzLgorCQkgKiBTZWNvbmQgcGFzcyBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZ1bmN0aW9uIGFyZSBkZWNsYXJlZAorCQkgKiBhbmQgZXhwb3J0ZWQgaW4gZGlmZmVyZW50IGZpbGVzIDotKCgKKwkJICovCisJCS8qIENvbGxlY3Qgc3ltYm9scyAqLworCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IG5vYWN0aW9uMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCisJCS8qIFJld2luZCB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIGFnYWluICovCisJCWZzZWVrKGluZmlsZSwgMCwgU0VFS19TRVQpOworCQlkZWZhdWx0bGluZSAgICAgICA9IHByaW50bGluZTsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBpbnRmdW5jOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGV4dGZ1bmM7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gcHJpbnRsaW5lOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IHNpbmdmdW5jOworCisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogQ3JlYXRlIGZpcnN0IHBhcnQgb2YgZGVwZW5kZW5jeSBjaGFpbgorCQkgKiBmaWxlLnRtcGwgKi8KKwkJcHJpbnRmKCIlc1x0IiwgYXJndlsyXSk7CisJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CisJCWludGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGFkZGRlcDsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBhZGRkZXA7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gYWRkZGVwMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJZmNsb3NlKGluZmlsZSk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuIGV4aXRzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDJjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogIk9wdGltaXplIiBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFzIHNwaXQgb3V0IGJ5IGdjYyAtTUQKKyAqIGZvciB0aGUga2VybmVsIGJ1aWxkCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBdXRob3IgICAgICAgS2FpIEdlcm1hc2NoZXdza2kKKyAqIENvcHlyaWdodCAgICAyMDAyIGJ5IEthaSBHZXJtYXNjaGV3c2tpICA8a2FpLmdlcm1hc2NoZXdza2lAZ214LmRlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoKKyAqIEludHJvZHVjdGlvbjoKKyAqCisgKiBnY2MgcHJvZHVjZXMgYSB2ZXJ5IG5pY2UgYW5kIGNvcnJlY3QgbGlzdCBvZiBkZXBlbmRlbmNpZXMgd2hpY2gKKyAqIHRlbGxzIG1ha2Ugd2hlbiB0byByZW1ha2UgYSBmaWxlLgorICoKKyAqIFRvIHVzZSB0aGlzIGxpc3QgYXMtaXMgaG93ZXZlciBoYXMgdGhlIGRyYXdiYWNrIHRoYXQgdmlydHVhbGx5CisgKiBldmVyeSBmaWxlIGluIHRoZSBrZXJuZWwgaW5jbHVkZXMgPGxpbnV4L2NvbmZpZy5oPiB3aGljaCB0aGVuIGFnYWluCisgKiBpbmNsdWRlcyA8bGludXgvYXV0b2NvbmYuaD4KKyAqCisgKiBJZiB0aGUgdXNlciByZS1ydW5zIG1ha2UgKmNvbmZpZywgbGludXgvYXV0b2NvbmYuaCB3aWxsIGJlCisgKiByZWdlbmVyYXRlZC4gIG1ha2Ugbm90aWNlcyB0aGF0IGFuZCB3aWxsIHJlYnVpbGQgZXZlcnkgZmlsZSB3aGljaAorICogaW5jbHVkZXMgYXV0b2NvbmYuaCwgaS5lLiBiYXNpY2FsbHkgYWxsIGZpbGVzLiBUaGlzIGlzIGV4dHJlbWVseQorICogYW5ub3lpbmcgaWYgdGhlIHVzZXIganVzdCBjaGFuZ2VkIENPTkZJR19ISVNfRFJJVkVSIGZyb20gbiB0byBtLgorICoKKyAqIFNvIHdlIHBsYXkgdGhlIHNhbWUgdHJpY2sgdGhhdCAibWtkZXAiIHBsYXllZCBiZWZvcmUuIFdlIHJlcGxhY2UKKyAqIHRoZSBkZXBlbmRlbmN5IG9uIGxpbnV4L2F1dG9jb25mLmggYnkgYSBkZXBlbmRlbmN5IG9uIGV2ZXJ5IGNvbmZpZworICogb3B0aW9uIHdoaWNoIGlzIG1lbnRpb25lZCBpbiBhbnkgb2YgdGhlIGxpc3RlZCBwcmVxdWlzaXRlcy4KKyAqCisgKiBUbyBiZSBleGFjdCwgc3BsaXQtaW5jbHVkZSBwb3B1bGF0ZXMgYSB0cmVlIGluIGluY2x1ZGUvY29uZmlnLywKKyAqIGUuZy4gaW5jbHVkZS9jb25maWcvaGlzL2RyaXZlci5oLCB3aGljaCBjb250YWlucyB0aGUgI2RlZmluZS8jdW5kZWYKKyAqIGZvciB0aGUgQ09ORklHX0hJU19EUklWRVIgb3B0aW9uLgorICoKKyAqIFNvIGlmIHRoZSB1c2VyIGNoYW5nZXMgaGlzIENPTkZJR19ISVNfRFJJVkVSIG9wdGlvbiwgb25seSB0aGUgb2JqZWN0cworICogd2hpY2ggZGVwZW5kIG9uICJpbmNsdWRlL2xpbnV4L2NvbmZpZy9oaXMvZHJpdmVyLmgiIHdpbGwgYmUgcmVidWlsdCwKKyAqIHNvIG1vc3QgbGlrZWx5IG9ubHkgaGlzIGRyaXZlciA7LSkKKyAqCisgKiBUaGUgaWRlYSBhYm92ZSBkYXRlcywgYnkgdGhlIHdheSwgYmFjayB0byBNaWNoYWVsIEUgQ2hhc3RhaW4sIEFGQUlLLgorICoKKyAqIFNvIHRvIGdldCBkZXBlbmRlbmNpZXMgcmlnaHQsIHRoZXJlIGFyZSB0d28gaXNzdWVzOgorICogbyBpZiBhbnkgb2YgdGhlIGZpbGVzIHRoZSBjb21waWxlciByZWFkIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVidWlsZAorICogbyBpZiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuIHRvIHRoZSBjb21waWxlIHRoZSBmaWxlIGNoYW5nZWQsIHdlCisgKiAgIGJldHRlciByZWJ1aWxkIGFzIHdlbGwuCisgKgorICogVGhlIGZvcm1lciBpcyBoYW5kbGVkIGJ5IHVzaW5nIHRoZSAtTUQgb3V0cHV0LCB0aGUgbGF0ZXIgYnkgc2F2aW5nCisgKiB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gY29tcGlsZSB0aGUgb2xkIG9iamVjdCBhbmQgY29tcGFyaW5nIGl0CisgKiB0byB0aGUgb25lIHdlIHdvdWxkIG5vdyB1c2UuCisgKgorICogQWdhaW4sIGFsc28gdGhpcyBpZGVhIGlzIHByZXR0eSBvbGQgYW5kIGhhcyBiZWVuIGRpc2N1c3NlZCBvbgorICoga2J1aWxkLWRldmVsIGEgbG9uZyB0aW1lIGFnby4gSSBkb24ndCBoYXZlIGEgc2Vuc2libHkgd29ya2luZworICogaW50ZXJuZXQgY29ubmVjdGlvbiByaWdodCBub3csIHNvIEkgcmF0aGVyIGRvbid0IG1lbnRpb24gbmFtZXMKKyAqIHdpdGhvdXQgZG91YmxlIGNoZWNraW5nLgorICoKKyAqIFRoaXMgY29kZSBoZXJlIGhhcyBiZWVuIGJhc2VkIHBhcnRpYWxseSBiYXNlZCBvbiBta2RlcC5jLCB3aGljaAorICogc2F5cyB0aGUgZm9sbG93aW5nIGFib3V0IGl0cyBoaXN0b3J5OgorICoKKyAqICAgQ29weXJpZ2h0IGFiYW5kb25lZCwgTWljaGFlbCBDaGFzdGFpbiwgPG1haWx0bzptZWNAc2hvdXQubmV0Pi4KKyAqICAgVGhpcyBpcyBhIEMgdmVyc2lvbiBvZiBzeW5jZGVwLnBsIGJ5IFdlcm5lciBBbG1lc2Jlcmdlci4KKyAqCisgKgorICogSXQgaXMgaW52b2tlZCBhcworICoKKyAqICAgZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT4KKyAqCisgKiBhbmQgd2lsbCByZWFkIHRoZSBkZXBlbmRlbmN5IGZpbGUgPGRlcGZpbGU+CisgKgorICogVGhlIHRyYW5zZm9ybWVkIGRlcGVuZGVuY3kgc25pcHBlZCBpcyB3cml0dGVuIHRvIHN0ZG91dC4KKyAqCisgKiBJdCBmaXJzdCBnZW5lcmF0ZXMgYSBsaW5lCisgKgorICogICBjbWRfPHRhcmdldD4gPSA8Y21kbGluZT4KKyAqCisgKiBhbmQgdGhlbiBiYXNpY2FsbHkgY29waWVzIHRoZSAuPHRhcmdldD4uZCBmaWxlIHRvIHN0ZG91dCwgaW4gdGhlCisgKiBwcm9jZXNzIGZpbHRlcmluZyBvdXQgdGhlIGRlcGVuZGVuY3kgb24gbGludXgvYXV0b2NvbmYuaCBhbmQgYWRkaW5nCisgKiBkZXBlbmRlbmNpZXMgb24gaW5jbHVkZS9jb25maWcvbXkvb3B0aW9uLmggZm9yIGV2ZXJ5CisgKiBDT05GSUdfTVlfT1BUSU9OIGVuY291bnRlcmVkIGluIGFueSBvZiB0aGUgcHJlcXVpc2l0ZXMuCisgKgorICogSXQgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWxsIHRoZSBkZXBlbmRlbmNpZXMgb24gKi52ZXIuIFdlIG5lZWQKKyAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgdmVyc2lvbiBjaGVja3N1bSBhcmUgZ2xvYmFsbHkgdXAKKyAqIHRvIGRhdGUgYmVmb3JlIGV2ZW4gc3RhcnRpbmcgdGhlIHJlY3Vyc2l2ZSBidWlsZCwgc28gaXQncyB0b28gbGF0ZQorICogYXQgdGhpcyBwb2ludCBhbnl3YXkuCisgKgorICogVGhlIGFsZ29yaXRobSB0byBncmVwIGZvciAiQ09ORklHXy4uLiIgaXMgYml0IHVudXN1YWwsIGJ1dCBzaG91bGQKKyAqIGJlIGZhc3QgOy0pIFdlIGRvbid0IGV2ZW4gdHJ5IHRvIHJlYWxseSBwYXJzZSB0aGUgaGVhZGVyIGZpbGVzLCBidXQKKyAqIG1lcmVseSBncmVwLCBpLmUuIGlmIENPTkZJR19GT08gaXMgbWVudGlvbmVkIGluIGEgY29tbWVudCwgaXQgd2lsbAorICogYmUgcGlja2VkIHVwIGFzIHdlbGwuIEl0J3Mgbm90IGEgcHJvYmxlbSB3aXRoIHJlc3BlY3QgdG8KKyAqIGNvcnJlY3RuZXNzLCBzaW5jZSB0aGF0IGNhbiBvbmx5IGdpdmUgdG9vIG1hbnkgZGVwZW5kZW5jaWVzLCB0aHVzCisgKiB3ZSBjYW5ub3QgbWlzcyBhIHJlYnVpbGQuIFNpbmNlIHBlb3BsZSB0ZW5kIHRvIG5vdCBtZW50aW9uIHRvdGFsbHkKKyAqIHVucmVsYXRlZCBDT05GSUdfIG9wdGlvbnMgYWxsIG92ZXIgdGhlIHBsYWNlLCBpdCdzIG5vdCBhbgorICogZWZmaWNpZW5jeSBwcm9ibGVtIGVpdGhlci4KKyAqCisgKiAoTm90ZTogaXQnZCBiZSBlYXN5IHRvIHBvcnQgb3ZlciB0aGUgY29tcGxldGUgbWtkZXAgc3RhdGUgbWFjaGluZSwKKyAqICBidXQgSSBkb24ndCB0aGluayB0aGUgYWRkZWQgY29tcGxleGl0eSBpcyB3b3J0aCBpdCkKKyAqLworLyoKKyAqIE5vdGUgMjogaWYgc29tZWJvZHkgd3JpdGVzIEhFTExPX0NPTkZJR19CT09NIGluIGEgZmlsZSwgaXQgd2lsbCBkZXBlbmQgb250bworICogQ09ORklHX0JPT00uIFRoaXMgY291bGQgc2VlbSBhIGJ1ZyAobm90IHRvbyBoYXJkIHRvIGZpeCksIGJ1dCBwbGVhc2UgZG8gbm90CisgKiBmaXggaXQhIFNvbWUgVXNlck1vZGVMaW51eCBmaWxlcyAobG9vayBhdCBhcmNoL3VtLykgY2FsbCBDT05GSUdfQk9PTSBhcworICogVU1MX0NPTkZJR19CT09NLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCAvdXNyL2luY2x1ZGUvbGludXgvYXV0b2NvbmYuaCwKKyAqIHRocm91Z2ggYXJjaC91bS9pbmNsdWRlL3VtbC1jb25maWcuaDsgdGhpcyBmaXhkZXAgImJ1ZyIgbWFrZXMgc3VyZSB0aGF0CisgKiB0aG9zZSBmaWxlcyB3aWxsIGhhdmUgY29ycmVjdCBkZXBlbmRlbmNpZXMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBJTlRfQ09ORiBudG9obCgweDQzNGY0ZTQ2KQorI2RlZmluZSBJTlRfT05GSSBudG9obCgweDRmNGU0NjQ5KQorI2RlZmluZSBJTlRfTkZJRyBudG9obCgweDRlNDY0OTQ3KQorI2RlZmluZSBJTlRfRklHXyBudG9obCgweDQ2NDk0NzVmKQorCitjaGFyICp0YXJnZXQ7CitjaGFyICpkZXBmaWxlOworY2hhciAqY21kbGluZTsKKwordm9pZCB1c2FnZSh2b2lkKQorCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT5cbiIpOworCWV4aXQoMSk7Cit9CisKK3ZvaWQgcHJpbnRfY21kbGluZSh2b2lkKQoreworCXByaW50ZigiY21kXyVzIDo9ICVzXG5cbiIsIHRhcmdldCwgY21kbGluZSk7Cit9CisKK2NoYXIgKiBzdHJfY29uZmlnICA9IE5VTEw7CitpbnQgICAgc2l6ZV9jb25maWcgPSAwOworaW50ICAgIGxlbl9jb25maWcgID0gMDsKKworLyoKKyAqIEdyb3cgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIHRvIGEgZGVzaXJlZCBsZW5ndGguCisgKiBVc3VhbGx5IHRoZSBmaXJzdCBncm93dGggaXMgcGxlbnR5LgorICovCit2b2lkIGdyb3dfY29uZmlnKGludCBsZW4pCit7CisJd2hpbGUgKGxlbl9jb25maWcgKyBsZW4gPiBzaXplX2NvbmZpZykgeworCQlpZiAoc2l6ZV9jb25maWcgPT0gMCkKKwkJCXNpemVfY29uZmlnID0gMjA0ODsKKwkJc3RyX2NvbmZpZyA9IHJlYWxsb2Moc3RyX2NvbmZpZywgc2l6ZV9jb25maWcgKj0gMik7CisJCWlmIChzdHJfY29uZmlnID09IE5VTEwpCisJCQl7IHBlcnJvcigiZml4ZGVwOm1hbGxvYyIpOyBleGl0KDEpOyB9CisJfQorfQorCisKKworLyoKKyAqIExvb2t1cCBhIHZhbHVlIGluIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KKyAqLworaW50IGlzX2RlZmluZWRfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKiBwY29uZmlnOworCWNvbnN0IGNoYXIgKiBwbGFzdCA9IHN0cl9jb25maWcgKyBsZW5fY29uZmlnIC0gbGVuOworCWZvciAoIHBjb25maWcgPSBzdHJfY29uZmlnICsgMTsgcGNvbmZpZyA8IHBsYXN0OyBwY29uZmlnKysgKSB7CisJCWlmIChwY29uZmlnWyAtMV0gPT0gJ1xuJworCQkmJiAgcGNvbmZpZ1tsZW5dID09ICdcbicKKwkJJiYgICFtZW1jbXAocGNvbmZpZywgbmFtZSwgbGVuKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCBhIG5ldyB2YWx1ZSB0byB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcuCisgKi8KK3ZvaWQgZGVmaW5lX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3sKKwlncm93X2NvbmZpZyhsZW4gKyAxKTsKKworCW1lbWNweShzdHJfY29uZmlnK2xlbl9jb25maWcsIG5hbWUsIGxlbik7CisJbGVuX2NvbmZpZyArPSBsZW47CisJc3RyX2NvbmZpZ1tsZW5fY29uZmlnKytdID0gJ1xuJzsKK30KKworLyoKKyAqIENsZWFyIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBzdHJpbmdzLgorICovCit2b2lkIGNsZWFyX2NvbmZpZyh2b2lkKQoreworCWxlbl9jb25maWcgPSAwOworCWRlZmluZV9jb25maWcoIiIsIDApOworfQorCisvKgorICogUmVjb3JkIHRoZSB1c2Ugb2YgYSBDT05GSUdfKiB3b3JkLgorICovCit2b2lkIHVzZV9jb25maWcoY2hhciAqbSwgaW50IHNsZW4pCit7CisJY2hhciBzW1BBVEhfTUFYXTsKKwljaGFyICpwOworCisJaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4pKQorCSAgICByZXR1cm47CisKKwlkZWZpbmVfY29uZmlnKG0sIHNsZW4pOworCisJbWVtY3B5KHMsIG0sIHNsZW4pOyBzW3NsZW5dID0gMDsKKworCWZvciAocCA9IHM7IHAgPCBzICsgc2xlbjsgcCsrKSB7CisJCWlmICgqcCA9PSAnXycpCisJCQkqcCA9ICcvJzsKKwkJZWxzZQorCQkJKnAgPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSpwKTsKKwl9CisJcHJpbnRmKCIgICAgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy8lcy5oKSBcXFxuIiwgcyk7Cit9CisKK3ZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoc2lnbmVkIGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKK3sKKwlpbnQgKmVuZCA9IChpbnQgKikgKG1hcCArIGxlbik7CisJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KKwlpbnQgKm0gICA9IChpbnQgKikgbWFwICsgMTsKKwlzaWduZWQgY2hhciAqcCwgKnE7CisKKwlmb3IgKDsgbSA8IGVuZDsgbSsrKSB7CisJCWlmICgqbSA9PSBJTlRfQ09ORikgeyBwID0gKHNpZ25lZCBjaGFyICopIG0gIDsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfT05GSSkgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMTsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfTkZJRykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMjsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfRklHXykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMzsgZ290byBjb25mOyB9CisJCWNvbnRpbnVlOworCWNvbmY6CisJCWlmIChwID4gbWFwICsgbGVuIC0gNykKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKHAsICJDT05GSUdfIiwgNykpCisJCQljb250aW51ZTsKKwkJZm9yIChxID0gcCArIDc7IHEgPCBtYXAgKyBsZW47IHErKykgeworCQkJaWYgKCEoaXNhbG51bSgqcSkgfHwgKnEgPT0gJ18nKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWNvbnRpbnVlOworCisJZm91bmQ6CisJCXVzZV9jb25maWcocCs3LCBxLXAtNyk7CisJfQorfQorCisvKiB0ZXN0IGlzIHMgZW5kcyBpbiBzdWIgKi8KK2ludCBzdHJyY21wKGNoYXIgKnMsIGNoYXIgKnN1YikKK3sKKwlpbnQgc2xlbiA9IHN0cmxlbihzKTsKKwlpbnQgc3VibGVuID0gc3RybGVuKHN1Yik7CisKKwlpZiAoc3VibGVuID4gc2xlbikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gbWVtY21wKHMgKyBzbGVuIC0gc3VibGVuLCBzdWIsIHN1Ymxlbik7Cit9CisKK3ZvaWQgZG9fY29uZmlnX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCXZvaWQgKm1hcDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZmlsZW5hbWUpOworCQlleGl0KDIpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9jb25maWdfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgcGFyc2VfZGVwX2ZpbGUodm9pZCAqbWFwLCBzaXplX3QgbGVuKQoreworCXNpZ25lZCBjaGFyICptID0gbWFwOworCXNpZ25lZCBjaGFyICplbmQgPSBtICsgbGVuOworCXNpZ25lZCBjaGFyICpwOworCWNoYXIgc1tQQVRIX01BWF07CisKKwlwID0gc3RyY2hyKG0sICc6Jyk7CisJaWYgKCFwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBwYXJzZSBlcnJvclxuIik7CisJCWV4aXQoMSk7CisJfQorCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOworCXByaW50ZigiZGVwc18lcyA6PSBcXFxuIiwgdGFyZ2V0KTsKKwltID0gcCsxOworCisJY2xlYXJfY29uZmlnKCk7CisKKwl3aGlsZSAobSA8IGVuZCkgeworCQl3aGlsZSAobSA8IGVuZCAmJiAoKm0gPT0gJyAnIHx8ICptID09ICdcXCcgfHwgKm0gPT0gJ1xuJykpCisJCQltKys7CisJCXAgPSBtOworCQl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAnICcpIHArKzsKKwkJaWYgKHAgPT0gZW5kKSB7CisJCQlkbyBwLS07IHdoaWxlICghaXNhbG51bSgqcCkpOworCQkJcCsrOworCQl9CisJCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOworCQlpZiAoc3RycmNtcChzLCAiaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgImFyY2gvdW0vaW5jbHVkZS91bWwtY29uZmlnLmgiKSAmJgorCQkgICAgc3RycmNtcChzLCAiLnZlciIpKSB7CisJCQlwcmludGYoIiAgJXMgXFxcbiIsIHMpOworCQkJZG9fY29uZmlnX2ZpbGUocyk7CisJCX0KKwkJbSA9IHAgKyAxOworCX0KKwlwcmludGYoIlxuJXM6ICQoZGVwc18lcylcblxuIiwgdGFyZ2V0LCB0YXJnZXQpOworCXByaW50ZigiJChkZXBzXyVzKTpcbiIsIHRhcmdldCk7Cit9CisKK3ZvaWQgcHJpbnRfZGVwcyh2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl2b2lkICptYXA7CisKKwlmZCA9IG9wZW4oZGVwZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZGVwZmlsZSk7CisJCWV4aXQoMik7CisJfQorCWZzdGF0KGZkLCAmc3QpOworCWlmIChzdC5zdF9zaXplID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImZpeGRlcDogJXMgaXMgZW1wdHlcbiIsZGVwZmlsZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9kZXBfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgdHJhcHModm9pZCkKK3sKKwlzdGF0aWMgY2hhciB0ZXN0W10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YoaW50KSkpKSA9ICJDT05GIjsKKworCWlmICgqKGludCAqKXRlc3QgIT0gSU5UX0NPTkYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IHNpemVvZihpbnQpICE9IDQgb3Igd3JvbmcgZW5kaWFuZXNzPyAlI3hcbiIsCisJCQkqKGludCAqKXRlc3QpOworCQlleGl0KDIpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl0cmFwcygpOworCisJaWYgKGFyZ2MgIT0gNCkKKwkJdXNhZ2UoKTsKKworCWRlcGZpbGUgPSBhcmd2WzFdOworCXRhcmdldCA9IGFyZ3ZbMl07CisJY21kbGluZSA9IGFyZ3ZbM107CisKKwlwcmludF9jbWRsaW5lKCk7CisJcHJpbnRfZGVwcygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYyBiL3NjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmM0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIHNwbGl0LWluY2x1ZGUuYworICoKKyAqIENvcHlyaWdodCBhYmFuZG9uZWQsIE1pY2hhZWwgQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisgKiBUaGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHN5bmNkZXAucGwgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSB0YWtlcyBhdXRvY29uZi5oIGFzIGlucHV0IGFuZCBvdXRwdXRzIGEgZGlyZWN0b3J5IGZ1bGwKKyAqIG9mIG9uZS1saW5lIGluY2x1ZGUgZmlsZXMsIG1lcmdpbmcgb250byB0aGUgb2xkIHZhbHVlcy4KKyAqCisgKiBUaGluayBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gIFRoZW4gdGhlcmUKKyAqIGFyZSBmaXZlIGNhc2VzOgorICoKKyAqICAgIGtleSAgICAgIG9sZCB2YWx1ZSAgIG5ldyB2YWx1ZSAgIGFjdGlvbgorICoKKyAqICAgIEtFWS0xICAgIFZBTFVFLTEgICAgIFZBTFVFLTEgICAgIGxlYXZlIGZpbGUgYWxvbmUKKyAqICAgIEtFWS0yICAgIFZBTFVFLTJBICAgIFZBTFVFLTJCICAgIHdyaXRlIFZBTFVFLTJCIGludG8gZmlsZQorICogICAgS0VZLTMgICAgLSAgICAgICAgICAgVkFMVUUtMyAgICAgd3JpdGUgVkFMVUUtMyAgaW50byBmaWxlCisgKiAgICBLRVktNCAgICBWQUxVRS00ICAgICAtICAgICAgICAgICB3cml0ZSBhbiBlbXB0eSBmaWxlCisgKiAgICBLRVktNSAgICAoZW1wdHkpICAgICAtICAgICAgICAgICBsZWF2ZSBvbGQgZW1wdHkgZmlsZSBhbG9uZQorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBFUlJPUl9FWElUKHN0ckV4aXQpCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJY29uc3QgaW50IGVycm5vU2F2ZSA9IGVycm5vOwkJCQkJXAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHN0cl9teV9uYW1lKTsJCQkJXAorCWVycm5vID0gZXJybm9TYXZlOwkJCQkJCVwKKwlwZXJyb3IoKHN0ckV4aXQpKTsJCQkJCQlcCisJZXhpdCgxKTsJCQkJCQkJXAorICAgIH0KKworCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndiBbXSkKK3sKKyAgICBjb25zdCBjaGFyICogc3RyX215X25hbWU7CisgICAgY29uc3QgY2hhciAqIHN0cl9maWxlX2F1dG9jb25mOworICAgIGNvbnN0IGNoYXIgKiBzdHJfZGlyX2NvbmZpZzsKKworICAgIEZJTEUgKiBmcF9jb25maWc7CisgICAgRklMRSAqIGZwX3RhcmdldDsKKyAgICBGSUxFICogZnBfZmluZDsKKworICAgIGludCBidWZmZXJfc2l6ZTsKKworICAgIGNoYXIgKiBsaW5lOworICAgIGNoYXIgKiBvbGRfbGluZTsKKyAgICBjaGFyICogbGlzdF90YXJnZXQ7CisgICAgY2hhciAqIHB0YXJnZXQ7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKworICAgIC8qIENoZWNrIGFyZyBjb3VudC4gKi8KKyAgICBpZiAoYXJnYyAhPSAzKQorICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLlxuIiwgYXJndlswXSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJfbXlfbmFtZSAgICAgICA9IGFyZ3ZbMF07CisgICAgc3RyX2ZpbGVfYXV0b2NvbmYgPSBhcmd2WzFdOworICAgIHN0cl9kaXJfY29uZmlnICAgID0gYXJndlsyXTsKKworICAgIC8qIEZpbmQgYSBidWZmZXIgc2l6ZS4gKi8KKyAgICBpZiAoc3RhdChzdHJfZmlsZV9hdXRvY29uZiwgJnN0YXRfYnVmKSAhPSAwKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworICAgIGJ1ZmZlcl9zaXplID0gMiAqIHN0YXRfYnVmLnN0X3NpemUgKyA0MDk2OworCisgICAgLyogQWxsb2NhdGUgYnVmZmVycy4gKi8KKyAgICBpZiAoIChsaW5lICAgICAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChvbGRfbGluZSAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChsaXN0X3RhcmdldCA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwgKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworCisgICAgLyogT3BlbiBhdXRvY29uZmlnIGZpbGUuICovCisgICAgaWYgKChmcF9jb25maWcgPSBmb3BlbihzdHJfZmlsZV9hdXRvY29uZiwgInIiKSkgPT0gTlVMTCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKworICAgIC8qIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBpZiBuZWVkZWQuICovCisgICAgaWYgKHN0YXQoc3RyX2Rpcl9jb25maWcsICZzdGF0X2J1ZikgIT0gMCkKKyAgICB7CisJaWYgKG1rZGlyKHN0cl9kaXJfY29uZmlnLCAwNzU1KSAhPSAwKQorCSAgICBFUlJPUl9FWElUKHN0cl9kaXJfY29uZmlnKTsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdG8gb3V0cHV0IGRpcmVjdG9yeS4gKi8KKyAgICBpZiAoY2hkaXIoc3RyX2Rpcl9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7CisKKyAgICAvKiBQdXQgaW5pdGlhbCBzZXBhcmF0b3IgaW50byB0YXJnZXQgbGlzdC4gKi8KKyAgICBwdGFyZ2V0ID0gbGlzdF90YXJnZXQ7CisgICAgKnB0YXJnZXQrKyA9ICdcbic7CisKKyAgICAvKiBSZWFkIGNvbmZpZyBsaW5lcy4gKi8KKyAgICB3aGlsZSAoZmdldHMobGluZSwgYnVmZmVyX3NpemUsIGZwX2NvbmZpZykpCisgICAgeworCWNvbnN0IHNpZ25lZCBjaGFyICogc3RyX2NvbmZpZzsKKwlpbnQgaXNfc2FtZTsKKwlpbnQgaXRhcmdldDsKKworCWlmIChsaW5lWzBdICE9ICcjJykKKwkgICAgY29udGludWU7CisJaWYgKChzdHJfY29uZmlnID0gc3Ryc3RyKGxpbmUsICJDT05GSUdfIikpID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJLyogTWFrZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gKi8KKwlzdHJfY29uZmlnICs9IHNpemVvZigiQ09ORklHXyIpIC0gMTsKKwlmb3IgKGl0YXJnZXQgPSAwOyAhaXNzcGFjZShzdHJfY29uZmlnW2l0YXJnZXRdKTsgaXRhcmdldCsrKQorCXsKKwkgICAgaW50IGMgPSAodW5zaWduZWQgY2hhcikgc3RyX2NvbmZpZ1tpdGFyZ2V0XTsKKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCSAgICBpZiAoYyA9PSAnXycpICAgYyA9ICcvJzsKKwkgICAgcHRhcmdldFtpdGFyZ2V0XSA9IGM7CisJfQorCXB0YXJnZXRbaXRhcmdldCsrXSA9ICcuJzsKKwlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnaCc7CisJcHRhcmdldFtpdGFyZ2V0KytdID0gJ1wwJzsKKworCS8qIENoZWNrIGZvciBleGlzdGluZyBmaWxlLiAqLworCWlzX3NhbWUgPSAwOworCWlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInIiKSkgIT0gTlVMTCkKKwl7CisJICAgIGZnZXRzKG9sZF9saW5lLCBidWZmZXJfc2l6ZSwgZnBfdGFyZ2V0KTsKKwkgICAgaWYgKGZjbG9zZShmcF90YXJnZXQpICE9IDApCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGlmICghc3RyY21wKGxpbmUsIG9sZF9saW5lKSkKKwkJaXNfc2FtZSA9IDE7CisJfQorCisJaWYgKCFpc19zYW1lKQorCXsKKwkgICAgLyogQXV0by1jcmVhdGUgZGlyZWN0b3JpZXMuICovCisJICAgIGludCBpc2xhc2g7CisJICAgIGZvciAoaXNsYXNoID0gMDsgaXNsYXNoIDwgaXRhcmdldDsgaXNsYXNoKyspCisJICAgIHsKKwkJaWYgKHB0YXJnZXRbaXNsYXNoXSA9PSAnLycpCisJCXsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICdcMCc7CisJCSAgICBpZiAoc3RhdChwdGFyZ2V0LCAmc3RhdF9idWYpICE9IDAKKwkJICAgICYmICBta2RpcihwdGFyZ2V0LCAwNzU1KSAgICAgIT0gMCkKKwkJCUVSUk9SX0VYSVQoIHB0YXJnZXQgKTsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICcvJzsKKwkJfQorCSAgICB9CisKKwkgICAgLyogV3JpdGUgdGhlIGZpbGUuICovCisJICAgIGlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInciICkpID09IE5VTEwpCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGZwdXRzKGxpbmUsIGZwX3RhcmdldCk7CisJICAgIGlmIChmZXJyb3IoZnBfdGFyZ2V0KSB8fCBmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQorCQlFUlJPUl9FWElUKHB0YXJnZXQpOworCX0KKworCS8qIFVwZGF0ZSB0YXJnZXQgbGlzdCAqLworCXB0YXJnZXQgKz0gaXRhcmdldDsKKwkqKHB0YXJnZXQtMSkgPSAnXG4nOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xvc2UgYXV0b2NvbmZpZyBmaWxlLgorICAgICAqIFRlcm1pbmF0ZSB0aGUgdGFyZ2V0IGxpc3QuCisgICAgICovCisgICAgaWYgKGZjbG9zZShmcF9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisgICAgKnB0YXJnZXQgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBGaXggdXAgZXhpc3RpbmcgZmlsZXMgd2hpY2ggaGF2ZSBubyBuZXcgdmFsdWUuCisgICAgICogVGhpcyBpcyBDYXNlIDQgYW5kIENhc2UgNS4KKyAgICAgKgorICAgICAqIEkgcmUtcmVhZCB0aGUgdHJlZSBhbmQgZmlsdGVyIGl0IGFnYWluc3QgbGlzdF90YXJnZXQuCisgICAgICogVGhpcyBpcyBjcnVkZS4gIEJ1dCBpdCBhdm9pZHMgZGF0YSBjb3BpZXMuICBBbHNvLCBsaXN0X3RhcmdldAorICAgICAqIGlzIGNvbXBhY3QgYW5kIGNvbnRpZ3VvdXMsIHNvIGl0IGVhc2lseSBmaXRzIGludG8gY2FjaGUuCisgICAgICoKKyAgICAgKiBOb3RpY2UgdGhhdCBsaXN0X3RhcmdldCBjb250YWlucyBzdHJpbmdzIHNlcGFyYXRlZCBieSBcbiwKKyAgICAgKiB3aXRoIGEgXG4gYmVmb3JlIHRoZSBmaXJzdCBzdHJpbmcgYW5kIGFmdGVyIHRoZSBsYXN0LgorICAgICAqIGZnZXRzIGdpdmVzIHRoZSBpbmNvbWluZyBuYW1lcyBhIHRlcm1pbmF0aW5nIFxuLgorICAgICAqIFNvIGJ5IGhhdmluZyBhbiBpbml0aWFsIFxuLCBzdHJzdHIgd2lsbCBmaW5kIGV4YWN0IG1hdGNoZXMuCisgICAgICovCisKKyAgICBmcF9maW5kID0gcG9wZW4oImZpbmQgKiAtdHlwZSBmIC1uYW1lIFwiKi5oXCIgLXByaW50IiwgInIiKTsKKyAgICBpZiAoZnBfZmluZCA9PSAwKQorCUVSUk9SX0VYSVQoICJmaW5kIiApOworCisgICAgbGluZVswXSA9ICdcbic7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUrMSwgYnVmZmVyX3NpemUsIGZwX2ZpbmQpKQorICAgIHsKKwlpZiAoc3Ryc3RyKGxpc3RfdGFyZ2V0LCBsaW5lKSA9PSBOVUxMKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyBhbiBvbGQgZmlsZSB3aXRoIG5vIENPTkZJR18qIGZsYWcgaW4gYXV0b2NvbmYuaC4KKwkgICAgICovCisKKwkgICAgLyogRmlyc3Qgc3RyaXAgdGhlIFxuLiAqLworCSAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9ICdcMCc7CisKKwkgICAgLyogR3JhYiBzaXplLiAqLworCSAgICBpZiAoc3RhdChsaW5lKzEsICZzdGF0X2J1ZikgIT0gMCkKKwkJRVJST1JfRVhJVChsaW5lKTsKKworCSAgICAvKiBJZiBmaWxlIGlzIG5vdCBlbXB0eSwgbWFrZSBpdCBlbXB0eSBhbmQgZ2l2ZSBpdCBhIGZyZXNoIGRhdGUuICovCisJICAgIGlmIChzdGF0X2J1Zi5zdF9zaXplICE9IDApCisJICAgIHsKKwkJaWYgKChmcF90YXJnZXQgPSBmb3BlbihsaW5lKzEsICJ3IikpID09IE5VTEwpCisJCSAgICBFUlJPUl9FWElUKGxpbmUpOworCQlpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKKwkJICAgIEVSUk9SX0VYSVQobGluZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKHBjbG9zZShmcF9maW5kKSAhPSAwKQorCUVSUk9SX0VYSVQoImZpbmQiKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iaW4yYy5jIGIvc2NyaXB0cy9iaW4yYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGQyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2JpbjJjLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFVubG92ZWQgcHJvZ3JhbSB0byBjb252ZXJ0IGEgYmluYXJ5IG9uIHN0ZGluIHRvIGEgQyBpbmNsdWRlIG9uIHN0ZG91dAorICoKKyAqIEphbiAxOTk5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGNoLCB0b3RhbD0wOworCisJaWYgKGFyZ2MgPiAxKQorCQlwcmludGYoImNvbnN0IGNoYXIgJXNbXSAlcz1cbiIsCisJCQlhcmd2WzFdLCBhcmdjID4gMiA/IGFyZ3ZbMl0gOiAiIik7CisKKwlkbyB7CisJCXByaW50ZigiXHRcIiIpOworCQl3aGlsZSAoKGNoID0gZ2V0Y2hhcigpKSAhPSBFT0YpCisJCXsKKwkJCXRvdGFsKys7CisJCQlwcmludGYoIlxceCUwMngiLGNoKTsKKwkJCWlmICh0b3RhbCAlIDE2ID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCJcIlxuIik7CisJfSB3aGlsZSAoY2ggIT0gRU9GKTsKKworCWlmIChhcmdjID4gMSkKKwkJcHJpbnRmKCJcdDtcblxuY29uc3QgaW50ICVzX3NpemUgPSAlZDtcbiIsIGFyZ3ZbMV0sIHRvdGFsKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iaW5vZmZzZXQuYyBiL3NjcmlwdHMvYmlub2Zmc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMzA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmlub2Zmc2V0LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJpbm9mZnNldC5jCisgKiAoQykgMjAwMiBSYW5keSBEdW5sYXAgPHJkZHVubGFwQG9zZGwub3JnPgorCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIyBiaW5vZmZzZXQuYzoKKyMgLSBzZWFyY2hlcyBhIChiaW5hcnkpIGZpbGUgZm9yIGEgc3BlY2lmaWVkIChiaW5hcnkpIHBhdHRlcm4KKyMgLSByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0ZWQgcGF0dGVybiBvciB+MCBpZiBub3QgZm91bmQKKyMgLSBleGl0cyB3aXRoIGV4aXQgc3RhdHVzIDAgbm9ybWFsbHkgb3Igbm9uLTAgaWYgcGF0dGVybiBpcyBub3QgZm91bmQKKyMgICBvciBhbnkgb3RoZXIgZXJyb3Igb2NjdXJzLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjZGVmaW5lIFZFUlNJT04JCSIwLjEiCisjZGVmaW5lIEJVRl9TSVpFCSgxNiAqIDEwMjQpCisjZGVmaW5lIFBBVF9TSVpFCTEwMAorCitjaGFyCQkqcHJvZ25hbWU7CitjaGFyCQkqaW5wdXRuYW1lOworaW50CQlpbnB1dGZkOwordW5zaWduZWQgaW50CWJpeDsJCQkvKiBidWYgaW5kZXggKi8KK3Vuc2lnbmVkIGNoYXIJcGF0dGVybnMgW1BBVF9TSVpFXSA9IHswfTsgLyogYnl0ZS1zaXplZCBwYXR0ZXJuIGFycmF5ICovCitpbnQJCXBhdF9sZW47CQkvKiBhY3R1YWwgbnVtYmVyIG9mIHBhdHRlcm4gYnl0ZXMgKi8KK3Vuc2lnbmVkIGNoYXIJKm1hZHI7CQkJLyogbW1hcCBhZGRyZXNzICovCitzaXplX3QJCWZpbGVzaXplOworaW50CQludW1fbWF0Y2hlcyA9IDA7CitvZmZfdAkJZmlyc3Rsb2MgPSAwOworCit2b2lkIHVzYWdlICh2b2lkKQoreworCWZwcmludGYgKHN0ZGVyciwgIiVzIHZlci4gJXNcbiIsIHByb2duYW1lLCBWRVJTSU9OKTsKKwlmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogICVzIGZpbGVuYW1lIHBhdHRlcm5fYnl0ZXNcbiIsCisJCQlwcm9nbmFtZSk7CisJZnByaW50ZiAoc3RkZXJyLCAiICAgICAgICBbcHJpbnRzIGxvY2F0aW9uIG9mIHBhdHRlcm5fYnl0ZXMgaW4gZmlsZV1cbiIpOworCWV4aXQgKDEpOworfQorCit2b2lkIGdldF9wYXR0ZXJuIChpbnQgcGF0X2NvdW50LCBjaGFyICpwYXRzIFtdKQoreworCWludCBpeCwgZXJyLCB0bXA7CisKKyNpZmRlZiBERUJVRworCWZwcmludGYgKHN0ZGVyciwiZ2V0X3BhdHRlcm46IGNvdW50ID0gJWRcbiIsIHBhdF9jb3VudCk7CisJZm9yIChpeCA9IDA7IGl4IDwgcGF0X2NvdW50OyBpeCsrKQorCQlmcHJpbnRmIChzdGRlcnIsICIgIHBhdCAjICVkOiAgWyVzXVxuIiwgaXgsIHBhdHNbaXhdKTsKKyNlbmRpZgorCisJZm9yIChpeCA9IDA7IGl4IDwgcGF0X2NvdW50OyBpeCsrKSB7CisJCXRtcCA9IDA7CisJCWVyciA9IHNzY2FuZiAocGF0c1tpeF0sICIlNWkiLCAmdG1wKTsKKwkJaWYgKGVyciAhPSAxIHx8IHRtcCA+IDB4ZmYpIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgInBhdHRlcm4gb3IgdmFsdWUgZXJyb3IgaW4gcGF0dGVybiAjICVkIFslc11cbiIsCisJCQkJCWl4LCBwYXRzW2l4XSk7CisJCQl1c2FnZSAoKTsKKwkJfQorCQlwYXR0ZXJucyBbaXhdID0gdG1wOworCX0KKwlwYXRfbGVuID0gcGF0X2NvdW50OworfQorCit2b2lkIHNlYXJjaF9wYXR0ZXJuICh2b2lkKQoreworCWZvciAoYml4ID0gMDsgYml4IDwgZmlsZXNpemU7IGJpeCsrKSB7CisJCWlmIChtYWRyW2JpeF0gPT0gcGF0dGVybnNbMF0pIHsKKwkJCWlmIChtZW1jbXAgKCZtYWRyW2JpeF0sIHBhdHRlcm5zLCBwYXRfbGVuKSA9PSAwKSB7CisJCQkJaWYgKG51bV9tYXRjaGVzID09IDApCisJCQkJCWZpcnN0bG9jID0gYml4OworCQkJCW51bV9tYXRjaGVzKys7CisJCQl9CisJCX0KKwl9Cit9CisKKyNpZmRlZiBOT1RERUYKK3NpemVfdCBnZXRfZmlsZXNpemUgKGludCBmZCkKK3sKKwlvZmZfdCBlbmRfb2ZmID0gbHNlZWsgKGZkLCAwLCBTRUVLX0VORCk7CisJbHNlZWsgKGZkLCAwLCBTRUVLX1NFVCk7CisJcmV0dXJuIChzaXplX3QpIGVuZF9vZmY7Cit9CisjZW5kaWYKKworc2l6ZV90IGdldF9maWxlc2l6ZSAoaW50IGZkKQoreworCWludCBlcnI7CisJc3RydWN0IHN0YXQgc3RhdDsKKworCWVyciA9IGZzdGF0IChmZCwgJnN0YXQpOworCWZwcmludGYgKHN0ZGVyciwgImZpbGVzaXplOiAlbGRcbiIsIGVyciA8IDAgPyAobG9uZyllcnIgOiBzdGF0LnN0X3NpemUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAoc2l6ZV90KSBzdGF0LnN0X3NpemU7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndiBbXSkKK3sKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlpZiAoYXJnYyA8IDMpCisJCXVzYWdlICgpOworCisJZ2V0X3BhdHRlcm4gKGFyZ2MgLSAyLCBhcmd2ICsgMik7CisKKwlpbnB1dG5hbWUgPSBhcmd2WzFdOworCisJaW5wdXRmZCA9IG9wZW4gKGlucHV0bmFtZSwgT19SRE9OTFkpOworCWlmIChpbnB1dGZkID09IC0xKSB7CisJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBjYW5ub3Qgb3BlbiAnJXMnXG4iLAorCQkJCXByb2duYW1lLCBpbnB1dG5hbWUpOworCQlleGl0ICgzKTsKKwl9CisKKwlmaWxlc2l6ZSA9IGdldF9maWxlc2l6ZSAoaW5wdXRmZCk7CisKKwltYWRyID0gbW1hcCAoMCwgZmlsZXNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGlucHV0ZmQsIDApOworCWlmIChtYWRyID09IE1BUF9GQUlMRUQpIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAibW1hcCBlcnJvciA9ICVkXG4iLCBlcnJubyk7CisJCWNsb3NlIChpbnB1dGZkKTsKKwkJZXhpdCAoNCk7CisJfQorCisJc2VhcmNoX3BhdHRlcm4gKCk7CisKKwlpZiAobXVubWFwIChtYWRyLCBmaWxlc2l6ZSkpCisJCWZwcmludGYgKHN0ZGVyciwgIm11bm1hcCBlcnJvciA9ICVkXG4iLCBlcnJubyk7CisKKwlpZiAoY2xvc2UgKGlucHV0ZmQpKQorCQlmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3IgJWQgY2xvc2luZyAnJXMnXG4iLAorCQkJCXByb2duYW1lLCBlcnJubywgaW5wdXRuYW1lKTsKKworCWZwcmludGYgKHN0ZGVyciwgIm51bWJlciBvZiBwYXR0ZXJuIG1hdGNoZXMgPSAlZFxuIiwgbnVtX21hdGNoZXMpOworCWlmIChudW1fbWF0Y2hlcyA9PSAwKQorCQlmaXJzdGxvYyA9IH4wOworCXByaW50ZiAoIiVsZFxuIiwgZmlyc3Rsb2MpOworCWZwcmludGYgKHN0ZGVyciwgIiVsZFxuIiwgZmlyc3Rsb2MpOworCisJZXhpdCAobnVtX21hdGNoZXMgPyAwIDogMik7Cit9CisKKy8qIGVuZCBiaW5vZmZzZXQuYyAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2NvbmZpZy5wbCBiL3NjcmlwdHMvY2hlY2tjb25maWcucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ExZjIzMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2hlY2tjb25maWcucGwKQEAgLTAsMCArMSw2NSBAQAorIyEgL3Vzci9iaW4vcGVybAorIworIyBjaGVja2NvbmZpZzogZmluZCB1c2VzIG9mIENPTkZJR18qIG5hbWVzIHdpdGhvdXQgbWF0Y2hpbmcgZGVmaW5pdGlvbnMuCisjIENvcHlyaWdodCBhYmFuZG9uZWQsIDE5OTgsIE1pY2hhZWwgRWxpemFiZXRoIENoYXN0YWluIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisKK3VzZSBpbnRlZ2VyOworCiskfCA9IDE7CisKK2ZvcmVhY2ggJGZpbGUgKEBBUkdWKQoreworICAgICMgT3BlbiB0aGlzIGZpbGUuCisgICAgb3BlbihGSUxFLCAkZmlsZSkgfHwgZGllICJDYW4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKworICAgICMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisgICAgbXkgJGZJbkNvbW1lbnQgICA9IDA7CisgICAgbXkgJGZJblN0cmluZyAgICA9IDA7CisgICAgbXkgJGZVc2VDb25maWcgICA9IDA7CisgICAgbXkgJGlMaW51eENvbmZpZyA9IDA7CisgICAgbXkgJWNvbmZpZ0xpc3QgICA9ICgpOworCisgICAgTElORTogd2hpbGUgKCA8RklMRT4gKQorICAgIHsKKwkjIFN0cmlwIGNvbW1lbnRzLgorCSRmSW5Db21tZW50ICYmIChzK14uKj9cKi8rICtvID8gKCRmSW5Db21tZW50ID0gMCkgOiBuZXh0KTsKKwltKy9cKitvICYmIChzKy9cKi4qP1wqLysgK2dvLCAocysvXCouKiQrICtvICYmICgkZkluQ29tbWVudCA9IDEpKSk7CisKKwkjIFBpY2sgdXAgZGVmaW5pdGlvbnMuCisJaWYgKCBtL15ccyojL28gKQorCXsKKwkgICAgJGlMaW51eENvbmZpZyAgICAgID0gJC4gaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoibGludXhcL2NvbmZpZ1wuaCIvbzsKKwkgICAgJGNvbmZpZ0xpc3R7dWMgJDF9ID0gMSAgaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoiY29uZmlnXC8oXFMqKVwuaCIvbzsKKwl9CisKKwkjIFN0cmlwIHN0cmluZ3MuCisJJGZJblN0cmluZyAmJiAocyteLio/IisgK28gPyAoJGZJblN0cmluZyA9IDApIDogbmV4dCk7CisJbSsiK28gJiYgKHMrIi4qPyIrICtnbywgKHMrIi4qJCsgK28gJiYgKCRmSW5TdHJpbmcgPSAxKSkpOworCisJIyBQaWNrIHVwIGRlZmluaXRpb25zLgorCWlmICggbS9eXHMqIy9vICkKKwl7CisJICAgICRpTGludXhDb25maWcgICAgICA9ICQuIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGxpbnV4XC9jb25maWdcLmg+L287CisJICAgICRjb25maWdMaXN0e3VjICQxfSA9IDEgIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGNvbmZpZ1wvKFxTKilcLmg+L287CisJICAgICRjb25maWdMaXN0eyQxfSAgICA9IDEgIGlmIG0vXlxzKiNccypkZWZpbmVccytDT05GSUdfKFx3KikvbzsKKwkgICAgJGNvbmZpZ0xpc3R7JDF9ICAgID0gMSAgaWYgbS9eXHMqI1xzKnVuZGVmXHMrQ09ORklHXyhcdyopL287CisJfQorCisJIyBMb29rIGZvciB1c2FnZXMuCisJbmV4dCB1bmxlc3MgbS9DT05GSUdfL287CisJV09SRDogd2hpbGUgKCBtL1xiQ09ORklHXyhcdyspL29nICkKKwl7CisJICAgICRmVXNlQ29uZmlnID0gMTsKKwkgICAgbGFzdCBMSU5FIGlmICRpTGludXhDb25maWc7CisJICAgIG5leHQgV09SRCBpZiBleGlzdHMgJGNvbmZpZ0xpc3R7JDF9OworCSAgICBwcmludCAiJGZpbGU6ICQuOiBuZWVkIENPTkZJR18kMS5cbiI7CisJICAgICRjb25maWdMaXN0eyQxfSA9IDA7CisJfQorICAgIH0KKworICAgICMgUmVwb3J0IHN1cGVyZmx1b3VzIGluY2x1ZGVzLgorICAgIGlmICggJGlMaW51eENvbmZpZyAmJiAhICRmVXNlQ29uZmlnICkKKwl7IHByaW50ICIkZmlsZTogJGlMaW51eENvbmZpZzogbGludXgvY29uZmlnLmggbm90IG5lZWRlZC5cbiI7IH0KKworICAgIGNsb3NlKEZJTEUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsIGIvc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlNmI3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NoZWNraW5jbHVkZXMucGwKQEAgLTAsMCArMSwyNCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIGNoZWNraW5jbHVkZXM6IEZpbmQgZmlsZXMgaW5jbHVkZWQgbW9yZSB0aGFuIG9uY2UgaW4gKG90aGVyKSBmaWxlcy4KKyMgQ29weXJpZ2h0IGFiYW5kb25lZCwgMjAwMCwgTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+LgorCitmb3JlYWNoICRmaWxlIChAQVJHVikgeworCW9wZW4oRklMRSwgJGZpbGUpIG9yIGRpZSAiQ2Fubm90IG9wZW4gJGZpbGU6ICQhLlxuIjsKKworCW15ICVpbmNsdWRlZGZpbGVzID0gKCk7CisKKwl3aGlsZSAoPEZJTEU+KSB7CisJCWlmIChtL15ccyojXHMqaW5jbHVkZVxzKls8Il0oXFMqKVs+Il0vbykgeworCQkJKyskaW5jbHVkZWRmaWxlc3skMX07CisJCX0KKwl9CisJCisJZm9yZWFjaCAkZmlsZW5hbWUgKGtleXMgJWluY2x1ZGVkZmlsZXMpIHsKKwkJaWYgKCRpbmNsdWRlZGZpbGVzeyRmaWxlbmFtZX0gPiAxKSB7CisJCQlwcmludCAiJGZpbGU6ICRmaWxlbmFtZSBpcyBpbmNsdWRlZCBtb3JlIHRoYW4gb25jZS5cbiI7CisJCX0KKwl9CisKKwljbG9zZShGSUxFKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2tzdGFjay5wbCBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRmYTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja3N0YWNrLnBsCkBAIC0wLDAgKzEsMTIzIEBACisjIS91c3IvYmluL3BlcmwKKworIwlDaGVjayB0aGUgc3RhY2sgdXNhZ2Ugb2YgZnVuY3Rpb25zCisjCisjCUNvcHlyaWdodCBKb2VybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CisjCUluc3BpcmVkIGJ5IExpbnVzIFRvcnZhbGRzCisjCU9yaWdpbmFsIGlkZWEgbWF5YmUgZnJvbSBLZWl0aCBPd2VucworIwlzMzkwIHBvcnQgYW5kIGJpZyBzcGVlZHVwIGJ5IEFybmQgQmVyZ21hbm4gPGFybmRAYmVyZ21hbm4tZGFsbGRvcmYuZGU+CisjCU1pcHMgcG9ydCBieSBKdWFuIFF1aW50ZWxhIDxxdWludGVsYUBtYW5kcmFrZXNvZnQuY29tPgorIwlJQTY0IHBvcnQgdmlhIEFuZHJlYXMgRGlsZ2VyCisjCUFybSBwb3J0IGJ5IEhvbGdlciBTY2h1cmlnCisjCXNoNjQgcG9ydCBieSBQYXVsIE11bmR0CisjCVJhbmRvbSBiaXRzIGJ5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorIwlNNjhrIHBvcnQgYnkgR2VlcnQgVXl0dGVyaG9ldmVuIGFuZCBBbmRyZWFzIFNjaHdhYgorIworIwlVc2FnZToKKyMJb2JqZHVtcCAtZCB2bWxpbnV4IHwgc3RhY2tjaGVjay5wbCBbYXJjaF0KKyMKKyMJVE9ETyA6CVBvcnQgdG8gYWxsIGFyY2hpdGVjdHVyZXMgKG9uZSByZWdleCBwZXIgYXJjaCkKKworIyBjaGVjayBmb3IgYXJjaAorIworIyAkcmUgaXMgdXNlZCBmb3IgdHdvIG1hdGNoZXM6CisjICQmICh3aG9sZSByZSkgbWF0Y2hlcyB0aGUgY29tcGxldGUgb2JqZHVtcCBsaW5lIHdpdGggdGhlIHN0YWNrIGdyb3d0aAorIyAkMSAoZmlyc3QgYnJhY2tldCkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZ3Jvd3RoCisjCisjIHVzZSBhbnl0aGluZyBlbHNlIGFuZCBmZWVsIHRoZSBwYWluIDspCitteSAoQHN0YWNrLCAkcmUsICR4LCAkeHMpOworeworCW15ICRhcmNoID0gc2hpZnQ7CisJaWYgKCRhcmNoIGVxICIiKSB7CisJCSRhcmNoID0gYHVuYW1lIC1tYDsKKwl9CisKKwkkeAk9ICJbMC05YS1mXSI7CSMgaGV4IGNoYXJhY3RlcgorCSR4cwk9ICJbMC05YS1mIF0iOwkjIGhleCBjaGFyYWN0ZXIgb3Igc3BhY2UKKwlpZiAoJGFyY2ggZXEgJ2FybScpIHsKKwkJI2MwMDA4ZmZjOgllMjRkZDA2NAlzdWIJc3AsIHNwLCAjMTAwCTsgMHg2NAorCQkkcmUgPSBxci8uKnN1Yi4qc3AsIHNwLCAjKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXmlbMzQ1Nl04NiQvKSB7CisJCSNjMDEwNTIzNDogICAgICAgODEgZWMgYWMgMDUgMDAgMDAgICAgICAgc3ViICAgICQweDVhYywlZXNwCisJCSRyZSA9IHFyL14uKlthc11bZHVdW2RiXSAgICBcJCgweCR4ezEsOH0pLFwlZXNwJC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICd4ODZfNjQnKSB7CisJCSMgICAgMmY2MDoJNDggODEgZWMgZTggMDUgMDAgMDAgCXN1YiAgICAkMHg1ZTgsJXJzcAorCQkkcmUgPSBxci9eLipbYXNdW2R1XVtkYl0gICAgXCQoMHgkeHsxLDh9KSxcJXJzcCQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnaWE2NCcpIHsKKwkJI2UwMDAwMDAwMDQ0MDExZmM6ICAgICAgIDAxIDBmIGZjIDhjICAgICBhZGRzIHIxMj0tMzg0LHIxMgorCQkkcmUgPSBxci8uKmFkZHMuKnIxMj0tKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkscjEyL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ202OGsnKSB7CisJCSMgICAgMmI2YzogICAgICAgNGU1NiBmYjcwICAgICAgIGxpbmt3ICVmcCwjLTExNjgKKwkJIyAgMWRmNzcwOiAgICAgICBkZWZjIGZmZTQgICAgICAgYWRkYXcgIy0yOCwlc3AKKwkJJHJlID0gcXIvLiooPzpsaW5rdyAlZnAsfGFkZGF3ICkjLShbMC05XXsxLDR9KSg/Oiwlc3ApPyQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbWlwczY0JykgeworCQkjODgwMDQwMmM6ICAgICAgIDY3YmRmZmYwICAgICAgICBkYWRkaXUgIHNwLHNwLC0xNgorCQkkcmUgPSBxci8uKmRhZGRpdS4qc3Asc3AsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ21pcHMnKSB7CisJCSM4ODAwMzI1NDogICAgICAgMjdiZGZmZTAgICAgICAgIGFkZGl1ICAgc3Asc3AsLTMyCisJCSRyZSA9IHFyLy4qYWRkaXUuKnNwLHNwLC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwcGMnKSB7CisJCSNjMDAwMjlmNDogICAgICAgOTQgMjEgZmYgMzAgICAgIHN0d3UgICAgcjEsLTIwOChyMSkKKwkJJHJlID0gcXIvLipzdHd1LipyMSwtKCR4ezEsOH0pXChyMVwpL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3BwYzY0JykgeworCQkjWFhYCisJCSRyZSA9IHFyLy4qc3RkdS4qcjEsLSgkeHsxLDh9KVwocjFcKS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9eczM5MHg/JC8pIHsKKwkJIyAgIDExMTYwOiAgICAgICBhNyBmYiBmZiA2MCAgICAgICAgICAgICBhZ2hpICAgJXIxNSwtMTYwCisJCSRyZSA9IHFyLy4qYWc/aGkuKlwlcjE1LC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9ec2g2NCQvKSB7CisJCSNYWFg6IHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpbW1lZGlhdGUgY2FzZSBwcmVzZW50bHksCisJCSMgICAgIHRob3VnaCB3ZSB3aWxsIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBtb3ZpL3N1YgorCQkjICAgICBwYWlyIGZvciBsYXJnZXIgdXNlcnMuIC0tIFBGTS4KKwkJI2EwMDA0OGUwOiAgICAgICBkNGZjNDBmMCAgICAgICAgYWRkaS5sICByMTUsLTI0MCxyMTUKKwkJJHJlID0gcXIvLiphZGRpXC5sLipyMTUsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pLHIxNS9vOworCX0gZWxzZSB7CisJCXByaW50KCJ3cm9uZyBvciB1bmtub3duIGFyY2hpdGVjdHVyZVxuIik7CisJCWV4aXQKKwl9Cit9CisKK3N1YiBieXNpemUoJCkgeworCW15ICgkYXNpemUsICRic2l6ZSk7CisJKCRhc2l6ZSA9ICRhKSA9fiBzLy4qOgkqKC4qKSQvJDEvOworCSgkYnNpemUgPSAkYikgPX4gcy8uKjoJKiguKikkLyQxLzsKKwkkYnNpemUgPD0+ICRhc2l6ZQorfQorCisjCisjIG1haW4oKQorIworbXkgJGZ1bmNyZSA9IHFyL14keCogPCguKik+OiQvOworbXkgJGZ1bmM7Cit3aGlsZSAobXkgJGxpbmUgPSA8U1RESU4+KSB7CisJaWYgKCRsaW5lID1+IG0vJGZ1bmNyZS8pIHsKKwkJJGZ1bmMgPSAkMTsKKwl9CisJaWYgKCRsaW5lID1+IG0vJHJlLykgeworCQlteSAkc2l6ZSA9ICQxOworCQkkc2l6ZSA9IGhleCgkc2l6ZSkgaWYgKCRzaXplID1+IC9eMHgvKTsKKworCQlpZiAoJHNpemUgPiAweGYwMDAwMDAwKSB7CisJCQkkc2l6ZSA9IC0gJHNpemU7CisJCQkkc2l6ZSArPSAweDgwMDAwMDAwOworCQkJJHNpemUgKz0gMHg4MDAwMDAwMDsKKwkJfQorCQluZXh0IGlmICgkc2l6ZSA+IDB4MTAwMDAwMDApOworCisJCW5leHQgaWYgJGxpbmUgIX4gbS9eKCR4cyopLzsKKwkJbXkgJGFkZHIgPSAkMTsKKwkJJGFkZHIgPX4gcy8gLzAvZzsKKwkJJGFkZHIgPSAiMHgkYWRkciI7CisKKwkJbXkgJGludHJvID0gIiRhZGRyICRmdW5jOiI7CisJCW15ICRwYWRsZW4gPSA1NiAtIGxlbmd0aCgkaW50cm8pOworCQl3aGlsZSAoJHBhZGxlbiA+IDApIHsKKwkJCSRpbnRybyAuPSAnCSc7CisJCQkkcGFkbGVuIC09IDg7CisJCX0KKwkJbmV4dCBpZiAoJHNpemUgPCAxMDApOworCQlwdXNoIEBzdGFjaywgIiRpbnRybyRzaXplXG4iOworCX0KK30KKworcHJpbnQgc29ydCBieXNpemUgQHN0YWNrOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwgYi9zY3JpcHRzL2NoZWNrdmVyc2lvbi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjEwZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwKQEAgLTAsMCArMSw3MiBAQAorIyEgL3Vzci9iaW4vcGVybAorIworIyBjaGVja3ZlcnNpb24gZmluZCB1c2VzIG9mIExJTlVYX1ZFUlNJT05fQ09ERSwgS0VSTkVMX1ZFUlNJT04sIG9yCisjIFVUU19SRUxFQVNFIHdpdGhvdXQgaW5jbHVkaW5nIDxsaW51eC92ZXJzaW9uLmg+LCBvciBjYXNlcyBvZgorIyBpbmNsdWRpbmcgPGxpbnV4L3ZlcnNpb24uaD4gdGhhdCBkb24ndCBuZWVkIGl0LgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIFJhbmR5IER1bmxhcCA8cmRkdW5sYXBAb3NkbC5vcmc+CisKKyR8ID0gMTsKKworbXkgJGRlYnVnZ2luZyA9IDA7CisKK2ZvcmVhY2ggJGZpbGUgKEBBUkdWKQoreworICAgICMgT3BlbiB0aGlzIGZpbGUuCisgICAgb3BlbihGSUxFLCAkZmlsZSkgfHwgZGllICJDYW4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKworICAgICMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisgICAgbXkgJGZJbkNvbW1lbnQgICA9IDA7CisgICAgbXkgJGZJblN0cmluZyAgICA9IDA7CisgICAgbXkgJGZVc2VWZXJzaW9uICAgPSAwOworICAgIG15ICRpTGludXhWZXJzaW9uID0gMDsKKworICAgIExJTkU6IHdoaWxlICggPEZJTEU+ICkKKyAgICB7CisJIyBTdHJpcCBjb21tZW50cy4KKwkkZkluQ29tbWVudCAmJiAocyteLio/XCovKyArbyA/ICgkZkluQ29tbWVudCA9IDApIDogbmV4dCk7CisJbSsvXCorbyAmJiAocysvXCouKj9cKi8rICtnbywgKHMrL1wqLiokKyArbyAmJiAoJGZJbkNvbW1lbnQgPSAxKSkpOworCisJIyBQaWNrIHVwIGRlZmluaXRpb25zLgorCWlmICggbS9eXHMqIy9vICkgeworCSAgICAkaUxpbnV4VmVyc2lvbiAgICAgID0gJC4gaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoibGludXhcL3ZlcnNpb25cLmgiL287CisJfQorCisJIyBTdHJpcCBzdHJpbmdzLgorCSRmSW5TdHJpbmcgJiYgKHMrXi4qPyIrICtvID8gKCRmSW5TdHJpbmcgPSAwKSA6IG5leHQpOworCW0rIitvICYmIChzKyIuKj8iKyArZ28sIChzKyIuKiQrICtvICYmICgkZkluU3RyaW5nID0gMSkpKTsKKworCSMgUGljayB1cCBkZWZpbml0aW9ucy4KKwlpZiAoIG0vXlxzKiMvbyApIHsKKwkgICAgJGlMaW51eFZlcnNpb24gICAgICA9ICQuIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGxpbnV4XC92ZXJzaW9uXC5oPi9vOworCX0KKworCSMgTG9vayBmb3IgdXNlczogTElOVVhfVkVSU0lPTl9DT0RFLCBLRVJORUxfVkVSU0lPTiwgVVRTX1JFTEVBU0UKKwlpZiAoKCRfID1+IC9MSU5VWF9WRVJTSU9OX0NPREUvKSB8fCAoJF8gPX4gL1xXS0VSTkVMX1ZFUlNJT04vKSB8fAorCQkoJF8gPX4gL1VUU19SRUxFQVNFLykpIHsKKwkgICAgJGZVc2VWZXJzaW9uID0gMTsKKwkgICAgbGFzdCBMSU5FIGlmICRpTGludXhWZXJzaW9uOworCX0KKyAgICB9CisKKyAgICAjIFJlcG9ydCB1c2VkIHZlcnNpb24gSURzIHdpdGhvdXQgaW5jbHVkZT8KKyAgICBpZiAoJGZVc2VWZXJzaW9uICYmICEgJGlMaW51eFZlcnNpb24pIHsKKwlwcmludCAiJGZpbGU6ICQuOiBuZWVkIGxpbnV4L3ZlcnNpb24uaFxuIjsKKyAgICB9CisKKyAgICAjIFJlcG9ydCBzdXBlcmZsdW91cyBpbmNsdWRlcy4KKyAgICBpZiAoJGlMaW51eFZlcnNpb24gJiYgISAkZlVzZVZlcnNpb24pIHsKKwlwcmludCAiJGZpbGU6ICRpTGludXhWZXJzaW9uIGxpbnV4L3ZlcnNpb24uaCBub3QgbmVlZGVkLlxuIjsKKyAgICB9CisKKyAgICAjIGRlYnVnOiByZXBvcnQgT0sgcmVzdWx0czoKKyAgICBpZiAoJGRlYnVnZ2luZykgeworICAgICAgICBpZiAoJGlMaW51eFZlcnNpb24gJiYgJGZVc2VWZXJzaW9uKSB7CisJICAgIHByaW50ICIkZmlsZTogdmVyc2lvbiB1c2UgaXMgT0sgKCRpTGludXhWZXJzaW9uKVxuIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoISAkaUxpbnV4VmVyc2lvbiAmJiAhICRmVXNlVmVyc2lvbikgeworCSAgICBwcmludCAiJGZpbGU6IHZlcnNpb24gdXNlIGlzIE9LIChub25lKVxuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlKEZJTEUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25tYWtlaGFzaC5jIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGQyM2YyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogY29ubWFrZWhhc2guYworICoKKyAqIENyZWF0ZSBhcnJheXMgZm9yIGluaXRpYWxpemluZyB0aGUga2VybmVsIGZvbGRlZCB0YWJsZXMgKHVzaW5nIGEgaGFzaAorICogdGFibGUgdHVybmVkIG91dCB0byBiZSB0byBsaW1pdGluZy4uLikgIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3Qgc2ltcGx5CisgKiBwcmVpbml0aWFsaXplIHRoZSB0YWJsZXMgYXQgY29tcGlsZSB0aW1lIHNpbmNlIGtmcmVlKCkgY2Fubm90IGFjY2VwdAorICogbWVtb3J5IG5vdCBhbGxvY2F0ZWQgYnkga21hbGxvYygpLCBhbmQgZG9pbmcgb3VyIG93biBtZW1vcnkgbWFuYWdlbWVudAorICoganVzdCBmb3IgdGhpcyBzZWVtcyBsaWtlIG1hc3NpdmUgb3ZlcmtpbGwuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgYSBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBtYXkgYmUgZnJlZWx5CisgKiBjb3BpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIHZlcnNpb24gMiwgb3IgYXQgeW91ciBvcHRpb24gYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIE1BWF9GT05UTEVOIDI1NgorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuaWNvZGU7CisKK3ZvaWQgdXNhZ2UoY2hhciAqYXJndjApCit7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IFxuIgorICAgICAgICAgIiAgICAgICAgJXMgY2hhcnRhYmxlIFtoYXNoc2l6ZV0gW2hhc2hzdGVwXSBbbWF4aGFzaGxldmVsXVxuIiwgYXJndjApOworICBleGl0KEVYX1VTQUdFKTsKK30KKworaW50IGdldHVuaWNvZGUoY2hhciAqKnAwKQoreworICB1bnNpZ25lZCBjaGFyICpwID0gKnAwOworCisgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKyAgICBwKys7CisgIGlmICgqcCAhPSAnVScgfHwgcFsxXSAhPSAnKycgfHwKKyAgICAgICFpc3hkaWdpdChwWzJdKSB8fCAhaXN4ZGlnaXQocFszXSkgfHwgIWlzeGRpZ2l0KHBbNF0pIHx8CisgICAgICAhaXN4ZGlnaXQocFs1XSkgfHwgaXN4ZGlnaXQocFs2XSkpCisgICAgcmV0dXJuIC0xOworICAqcDAgPSBwKzY7CisgIHJldHVybiBzdHJ0b2wocCsyLDAsMTYpOworfQorCit1bmljb2RlIHVuaXRhYmxlW01BWF9GT05UTEVOXVsyNTVdOworCQkJCS8qIE1hc3NpdmUgb3ZlcmtpbGwsIGJ1dCB3aG8gY2FyZXM/ICovCitpbnQgdW5pY291bnRbTUFYX0ZPTlRMRU5dOworCit2b2lkIGFkZHBhaXIoaW50IGZwLCBpbnQgdW4pCit7CisgIGludCBpOworCisgIGlmICggdW4gPD0gMHhmZmZlICkKKyAgICB7CisgICAgICAvKiBDaGVjayBpdCBpc24ndCBhIGR1cGxpY2F0ZSAqLworCisgICAgICBmb3IgKCBpID0gMCA7IGkgPCB1bmljb3VudFtmcF0gOyBpKysgKQorCWlmICggdW5pdGFibGVbZnBdW2ldID09IHVuICkKKwkgIHJldHVybjsKKworICAgICAgLyogQWRkIHRvIGxpc3QgKi8KKworICAgICAgaWYgKCB1bmljb3VudFtmcF0gPiAyNTQgKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IE9ubHkgMjU1IHVuaWNvZGVzL2dseXBoIHBlcm1pdHRlZCFcbiIpOworCSAgZXhpdChFWF9EQVRBRVJSKTsKKwl9CisKKyAgICAgIHVuaXRhYmxlW2ZwXVt1bmljb3VudFtmcF1dID0gdW47CisgICAgICB1bmljb3VudFtmcF0rKzsKKyAgICB9CisKKyAgLyogb3RoZXJ3aXNlOiBpZ25vcmUgKi8KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgRklMRSAqY3RibDsKKyAgY2hhciAqdGJsbmFtZTsKKyAgY2hhciBidWZmZXJbNjU1MzZdOworICBpbnQgZm9udGxlbjsKKyAgaW50IGksIG51bmksIG5lbnQ7CisgIGludCBmcDAsIGZwMSwgdW4wLCB1bjE7CisgIGNoYXIgKnAsICpwMTsKKworICBpZiAoIGFyZ2MgPCAyIHx8IGFyZ2MgPiA1ICkKKyAgICB1c2FnZShhcmd2WzBdKTsKKworICBpZiAoICFzdHJjbXAoYXJndlsxXSwiLSIpICkKKyAgICB7CisgICAgICBjdGJsID0gc3RkaW47CisgICAgICB0YmxuYW1lID0gInN0ZGluIjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjdGJsID0gZm9wZW4odGJsbmFtZSA9IGFyZ3ZbMV0sICJyIik7CisgICAgICBpZiAoICFjdGJsICkKKwl7CisJICBwZXJyb3IodGJsbmFtZSk7CisJICBleGl0KEVYX05PSU5QVVQpOworCX0KKyAgICB9CisKKyAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIGRlZmF1bHQgZm9udCBpcyBhbHdheXMgMjU2IGNoYXJhY3RlcnMuICovICAgIAorICBmb250bGVuID0gMjU2OworCisgIC8qIEluaXRpYWxpemUgdGFibGUgKi8KKworICBmb3IgKCBpID0gMCA7IGkgPCBmb250bGVuIDsgaSsrICkKKyAgICB1bmljb3VudFtpXSA9IDA7CisKKyAgLyogTm93IHdlIGNvbWUgdG8gdGhlIHRyaWNreSBwYXJ0LiAgUGFyc2UgdGhlIGlucHV0IHRhYmxlLiAqLworCisgIHdoaWxlICggZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgY3RibCkgIT0gTlVMTCApCisgICAgeworICAgICAgaWYgKCAocCA9IHN0cmNocihidWZmZXIsICdcbicpKSAhPSBOVUxMICkKKwkqcCA9ICdcMCc7CisgICAgICBlbHNlCisJZnByaW50ZihzdGRlcnIsICIlczogV2FybmluZzogbGluZSB0b28gbG9uZ1xuIiwgdGJsbmFtZSk7CisKKyAgICAgIHAgPSBidWZmZXI7CisKKy8qCisgKiBTeW50YXggYWNjZXB0ZWQ6CisgKgk8Zm9udHBvcz4JPHVuaWNvZGU+IDx1bmljb2RlPiAuLi4KKyAqCTxyYW5nZT4JCWlkZW0KKyAqCTxyYW5nZT4JCTx1bmljb2RlIHJhbmdlPgorICoKKyAqIHdoZXJlIDxyYW5nZT4gOjo9IDxmb250cG9zPi08Zm9udHBvcz4KKyAqIGFuZCA8dW5pY29kZT4gOjo9IFUrPGg+PGg+PGg+PGg+CisgKiBhbmQgPGg+IDo6PSA8aGV4YWRlY2ltYWwgZGlnaXQ+CisgKi8KKworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCXArKzsKKyAgICAgIGlmICghKnAgfHwgKnAgPT0gJyMnKQorCWNvbnRpbnVlOwkvKiBza2lwIGNvbW1lbnQgb3IgYmxhbmsgbGluZSAqLworCisgICAgICBmcDAgPSBzdHJ0b2wocCwgJnAxLCAwKTsKKyAgICAgIGlmIChwMSA9PSBwKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiQmFkIGlucHV0IGxpbmU6ICVzXG4iLCBidWZmZXIpOworCSAgZXhpdChFWF9EQVRBRVJSKTsKKyAgICAgICAgfQorICAgICAgcCA9IHAxOworCisgICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJcCsrOworICAgICAgaWYgKCpwID09ICctJykKKwl7CisJICBwKys7CisJICBmcDEgPSBzdHJ0b2wocCwgJnAxLCAwKTsKKwkgIGlmIChwMSA9PSBwKQorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgaW5wdXQgbGluZTogJXNcbiIsIGJ1ZmZlcik7CisJICAgICAgZXhpdChFWF9EQVRBRVJSKTsKKwkgICAgfQorCSAgcCA9IHAxOworICAgICAgICB9CisgICAgICBlbHNlCisJZnAxID0gMDsKKworICAgICAgaWYgKCBmcDAgPCAwIHx8IGZwMCA+PSBmb250bGVuICkKKwl7CisJICAgIGZwcmludGYoc3RkZXJyLAorCQkgICAgIiVzOiBHbHlwaCBudW1iZXIgKDB4JXgpIGxhcmdlciB0aGFuIGZvbnQgbGVuZ3RoXG4iLAorCQkgICAgdGJsbmFtZSwgZnAwKTsKKwkgICAgZXhpdChFWF9EQVRBRVJSKTsKKwl9CisgICAgICBpZiAoIGZwMSAmJiAoZnAxIDwgZnAwIHx8IGZwMSA+PSBmb250bGVuKSApCisJeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICIlczogQmFkIGVuZCBvZiByYW5nZSAoMHgleClcbiIsCisJCSAgICB0YmxuYW1lLCBmcDEpOworCSAgICBleGl0KEVYX0RBVEFFUlIpOworCX0KKworICAgICAgaWYgKGZwMSkKKwl7CisJICAvKiB3ZSBoYXZlIGEgcmFuZ2U7IGV4cGVjdCB0aGUgd29yZCAiaWRlbSIgb3IgYSBVbmljb2RlIHJhbmdlIG9mIHRoZQorCSAgICAgc2FtZSBsZW5ndGggKi8KKwkgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkgICAgcCsrOworCSAgaWYgKCFzdHJuY21wKHAsICJpZGVtIiwgNCkpCisJICAgIHsKKwkgICAgICBmb3IgKGk9ZnAwOyBpPD1mcDE7IGkrKykKKwkJYWRkcGFpcihpLGkpOworCSAgICAgIHAgKz0gNDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdW4wID0gZ2V0dW5pY29kZSgmcCk7CisJICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQlwKys7CisJICAgICAgaWYgKCpwICE9ICctJykKKwkJeworCQkgIGZwcmludGYoc3RkZXJyLAorIiVzOiBDb3JyZXNwb25kaW5nIHRvIGEgcmFuZ2Ugb2YgZm9udCBwb3NpdGlvbnMsIHRoZXJlIHNob3VsZCBiZSBhIFVuaWNvZGUgcmFuZ2VcbiIsCisJCQkgIHRibG5hbWUpOworCQkgIGV4aXQoRVhfREFUQUVSUik7CisJICAgICAgICB9CisJICAgICAgcCsrOworCSAgICAgIHVuMSA9IGdldHVuaWNvZGUoJnApOworCSAgICAgIGlmICh1bjAgPCAwIHx8IHVuMSA8IDApCisJCXsKKwkJICBmcHJpbnRmKHN0ZGVyciwKKyIlczogQmFkIFVuaWNvZGUgcmFuZ2UgY29ycmVzcG9uZGluZyB0byBmb250IHBvc2l0aW9uIHJhbmdlIDB4JXgtMHgleFxuIiwKKwkJCSAgdGJsbmFtZSwgZnAwLCBmcDEpOworCQkgIGV4aXQoRVhfREFUQUVSUik7CisJICAgICAgICB9CisJICAgICAgaWYgKHVuMSAtIHVuMCAhPSBmcDEgLSBmcDApCisJCXsKKwkJICBmcHJpbnRmKHN0ZGVyciwKKyIlczogVW5pY29kZSByYW5nZSBVKyV4LVUrJXggbm90IG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBmb250IHBvc2l0aW9uIHJhbmdlIDB4JXgtMHgleFxuIiwKKwkJCSAgdGJsbmFtZSwgdW4wLCB1bjEsIGZwMCwgZnAxKTsKKwkJICBleGl0KEVYX0RBVEFFUlIpOworCSAgICAgICAgfQorCSAgICAgIGZvcihpPWZwMDsgaTw9ZnAxOyBpKyspCisJCWFkZHBhaXIoaSx1bjAtZnAwK2kpOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICAgIC8qIG5vIHJhbmdlOyBleHBlY3QgYSBsaXN0IG9mIHVuaWNvZGUgdmFsdWVzIGZvciBhIHNpbmdsZSBmb250IHBvc2l0aW9uICovCisKKwkgICAgd2hpbGUgKCAodW4wID0gZ2V0dW5pY29kZSgmcCkpID49IDAgKQorCSAgICAgIGFkZHBhaXIoZnAwLCB1bjApOworCX0KKyAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwlwKys7CisgICAgICBpZiAoKnAgJiYgKnAgIT0gJyMnKQorCWZwcmludGYoc3RkZXJyLCAiJXM6IHRyYWlsaW5nIGp1bmsgKCVzKSBpZ25vcmVkXG4iLCB0YmxuYW1lLCBwKTsKKyAgICB9CisKKyAgLyogT2theSwgd2UgaGl0IEVPRiwgbm93IG91dHB1dCBoYXNoIHRhYmxlICovCisgIAorICBmY2xvc2UoY3RibCk7CisgIAorCisgIC8qIENvbXB1dGUgdG90YWwgc2l6ZSBvZiBVbmljb2RlIGxpc3QgKi8KKyAgbnVuaSA9IDA7CisgIGZvciAoIGkgPSAwIDsgaSA8IGZvbnRsZW4gOyBpKysgKQorICAgIG51bmkgKz0gdW5pY291bnRbaV07CisgIAorICBwcmludGYoIlwKKy8qXG5cCisgKiBEbyBub3QgZWRpdCB0aGlzIGZpbGU7IGl0IHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieVxuXAorICpcblwKKyAqIGNvbm1ha2VoYXNoICVzID4gW3RoaXMgZmlsZV1cblwKKyAqXG5cCisgKi9cblwKK1xuXAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+XG5cCitcblwKK3U4IGRmb250X3VuaWNvdW50WyVkXSA9IFxuXAore1xuXHQiLCBhcmd2WzFdLCBmb250bGVuKTsKKworICBmb3IgKCBpID0gMCA7IGkgPCBmb250bGVuIDsgaSsrICkKKyAgICB7CisgICAgICBwcmludGYoIiUzZCIsIHVuaWNvdW50W2ldKTsKKyAgICAgIGlmICggaSA9PSBmb250bGVuLTEgKQorICAgICAgICBwcmludGYoIlxufTtcbiIpOworICAgICAgZWxzZSBpZiAoIGkgJSA4ID09IDcgKQorICAgICAgICBwcmludGYoIixcblx0Iik7CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB9CisgIAorICBwcmludGYoIlxudTE2IGRmb250X3VuaXRhYmxlWyVkXSA9IFxue1xuXHQiLCBudW5pKTsKKyAgCisgIGZwMCA9IDA7CisgIG5lbnQgPSAwOworICBmb3IgKCBpID0gMCA7IGkgPCBudW5pIDsgaSsrICkKKyAgICB7CisgICAgICB3aGlsZSAoIG5lbnQgPj0gdW5pY291bnRbZnAwXSApCisJeworCSAgZnAwKys7CisJICBuZW50ID0gMDsKKwl9CisgICAgICBwcmludGYoIjB4JTA0eCIsIHVuaXRhYmxlW2ZwMF1bbmVudCsrXSk7CisgICAgICBpZiAoIGkgPT0gbnVuaS0xICkKKyAgICAgICAgIHByaW50ZigiXG59O1xuIik7CisgICAgICAgZWxzZSBpZiAoIGkgJSA4ID09IDcgKQorICAgICAgICAgcHJpbnRmKCIsXG5cdCIpOworICAgICAgIGVsc2UKKyAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB9CisKKyAgZXhpdChFWF9PSyk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2V4dHJhY3QtaWtjb25maWcgYi9zY3JpcHRzL2V4dHJhY3QtaWtjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDlmOWYzNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZXh0cmFjdC1pa2NvbmZpZwpAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vc2gKKyMgZXh0cmFjdHMgLmNvbmZpZyBpbmZvIGZyb20gYSBbYl16SW1hZ2UgZmlsZQorIyB1c2VzOiBiaW5vZmZzZXQgKG5ldyksIGRkLCB6Y2F0LCBzdHJpbmdzLCBncmVwCisjICRhcmcxIGlzIFtiXXpJbWFnZSBmaWxlbmFtZQorCitiaW5vZmZzZXQ9Ii4vc2NyaXB0cy9iaW5vZmZzZXQiCisKK0lLQ0ZHX1NUPSIweDQ5IDB4NGIgMHg0MyAweDQ2IDB4NDcgMHg1ZiAweDUzIDB4NTQiCitJS0NGR19FRD0iMHg0OSAweDRiIDB4NDMgMHg0NiAweDQ3IDB4NWYgMHg0NSAweDQ0IgorZnVuY3Rpb24gZHVtcF9jb25maWcgeworICAgIHR5cGVzZXQgZmlsZT0iJDEiCisKKyAgICBzdGFydD1gJGJpbm9mZnNldCAkZmlsZSAkSUtDRkdfU1QgMj4vZGV2L251bGxgCisgICAgWyAiJD8iICE9ICIwIiBdICYmIHN0YXJ0PSItMSIKKyAgICBpZiBbICIkc3RhcnQiIC1lcSAiLTEiIF07IHRoZW4KKwlyZXR1cm4KKyAgICBmaQorICAgIGVuZD1gJGJpbm9mZnNldCAkZmlsZSAkSUtDRkdfRUQgMj4vZGV2L251bGxgCisKKyAgICBsZXQgc3RhcnQ9IiRzdGFydCArIDgiCisgICAgbGV0IHNpemU9IiRlbmQgLSAkc3RhcnQiCisKKyAgICBoZWFkIC0tYnl0ZXM9IiRlbmQiICIkZmlsZSIgfCB0YWlsIC0tYnl0ZXM9IiRzaXplIiB8IHpjYXQKKworICAgIGNsZWFuX3VwCisgICAgZXhpdCAwCit9CisKKwordXNhZ2UoKQoreworCWVjaG8gIiAgdXNhZ2U6IGV4dHJhY3QtaWtjb25maWcgW2JdekltYWdlX2ZpbGVuYW1lIgorfQorCitjbGVhbl91cCgpCit7CisJaWYgWyAiJFRNUEZJTEUiICE9ICIiIF07IHRoZW4KKwkJcm0gLWYgJFRNUEZJTEUKKwlmaQorfQorCitpZiBbICQjIC1sdCAxIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMQorZmkKKworVE1QRklMRT0iL3RtcC9pa2NvbmZpZy0kJCIKK2ltYWdlPSIkMSIKKworIyB2bWxpbnV4OiBBdHRlbXB0IHRvIGR1bXAgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZmlsZSBkaXJlY3RseQorZHVtcF9jb25maWcgIiRpbWFnZSIKKworR1pIRFIxPSIweDFmIDB4OGIgMHgwOCAweDAwIgorR1pIRFIyPSIweDFmIDB4OGIgMHgwOCAweDA4IgorCisjIHZtbGludXguZ3o6IENoZWNrIGZvciBhIGNvbXByZXNzZWQgaW1hZ2VzCitvZmY9YCRiaW5vZmZzZXQgIiRpbWFnZSIgJEdaSERSMSAyPi9kZXYvbnVsbGAKK1sgIiQ/IiAhPSAiMCIgXSAmJiBvZmY9Ii0xIgoraWYgWyAiJG9mZiIgLWVxICItMSIgXTsgdGhlbgorCW9mZj1gJGJpbm9mZnNldCAiJGltYWdlIiAkR1pIRFIyIDI+L2Rldi9udWxsYAorCVsgIiQ/IiAhPSAiMCIgXSAmJiBvZmY9Ii0xIgorZmkKK2lmIFsgIiRvZmYiIC1lcSAiMCIgXTsgdGhlbgorCXpjYXQgPCIkaW1hZ2UiID4iJFRNUEZJTEUiCisJZHVtcF9jb25maWcgIiRUTVBGSUxFIgorZWxpZiBbICIkb2ZmIiAtbmUgIi0xIiBdOyB0aGVuCisJKGRkIGlicz0iJG9mZiIgc2tpcD0xIGNvdW50PTAgJiYgZGQgYnM9NTEyaykgPCIkaW1hZ2UiIDI+L2Rldi9udWxsIHwgXAorCQl6Y2F0ID4iJFRNUEZJTEUiCisJZHVtcF9jb25maWcgIiRUTVBGSUxFIgorZmkKKworZWNobyAiRVJST1I6IFVuYWJsZSB0byBleHRyYWN0IGtlcm5lbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiIKK2VjaG8gIiAgICAgICBUaGlzIGtlcm5lbCBpbWFnZSBtYXkgbm90IGhhdmUgdGhlIGNvbmZpZyBpbmZvLiIKKworY2xlYW5fdXAKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZmJlYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisjCisjIGdjYy12ZXJzaW9uIGdjYy1jb21tYW5kCisjCisjIFByaW50cyB0aGUgZ2NjIHZlcnNpb24gb2YgYGdjYy1jb21tYW5kJyBpbiBhIGNhbm9uaWNhbCA0LWRpZ2l0IGZvcm0KKyMgc3VjaCBhcyBgMDI5NScgZm9yIGdjYy0yLjk1LCBgMDMwMycgZm9yIGdjYy0zLjMsIGV0Yy4KKyMKKworY29tcGlsZXI9IiQqIgorCitNQUpPUj0kKGVjaG8gX19HTlVDX18gfCAkY29tcGlsZXIgLUUgLXhjIC0gfCB0YWlsIC1uIDEpCitNSU5PUj0kKGVjaG8gX19HTlVDX01JTk9SX18gfCAkY29tcGlsZXIgLUUgLXhjIC0gfCB0YWlsIC1uIDEpCitwcmludGYgIiUwMmQlMDJkXFxuIiAkTUFKT1IgJE1JTk9SCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoIGIvc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0MTExNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCkBAIC0wLDAgKzEsMjAzIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIE1hcnRpbiBTY2hsZW1tZXIgPGF6YXJhaEBub3NmZXJhdHUuemEub3JnPgorIyBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwKKyMKKyMgR2VuZXJhdGUgYSBuZXdsaW5lIHNlcGFyYXRlZCBsaXN0IG9mIGVudHJpZXMgZnJvbSB0aGUgZmlsZS9kaXJlY3RvcnkKKyMgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuCisjCisjIElmIGEgZmlsZS9kaXJlY3RvcnkgaXMgbm90IHN1cHBsaWVkIHRoZW4gZ2VuZXJhdGUgYSBzbWFsbCBkdW1teSBmaWxlLgorIworIyBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBnZW5faW5pdF9jcGlvIGJ1aWx0IGZyb20gdXNyL2dlbl9pbml0X2NwaW8uYy4KKyMKKworZGVmYXVsdF9pbml0cmFtZnMoKSB7CisJY2F0IDw8LUVPRgorCQkjIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSwgZGVmYXVsdCBpbml0cmFtZnMKKworCQlkaXIgL2RldiAwNzU1IDAgMAorCQlub2QgL2Rldi9jb25zb2xlIDA2MDAgMCAwIGMgNSAxCisJCWRpciAvcm9vdCAwNzAwIDAgMAorCUVPRgorfQorCitmaWxldHlwZSgpIHsKKwlsb2NhbCBhcmd2MT0iJDEiCisKKwkjIHN5bWxpbmsgdGVzdCBtdXN0IGNvbWUgYmVmb3JlIGZpbGUgdGVzdAorCWlmIFsgLUwgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gInNsaW5rIgorCWVsaWYgWyAtZiAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAiZmlsZSIKKwllbGlmIFsgLWQgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gImRpciIKKwllbGlmIFsgLWIgIiR7YXJndjF9IiAtbyAtYyAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAibm9kIgorCWVsaWYgWyAtcCAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAicGlwZSIKKwllbGlmIFsgLVMgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gInNvY2siCisJZWxzZQorCQllY2hvICJpbnZhbGlkIgorCWZpCisJcmV0dXJuIDAKK30KKworcHJpbnRfbXRpbWUoKSB7CisJbG9jYWwgYXJndjE9IiQxIgorCWxvY2FsIG15X210aW1lPSIwIgorCisJaWYgWyAtZSAiJHthcmd2MX0iIF07IHRoZW4KKwkJbXlfbXRpbWU9JChmaW5kICIke2FyZ3YxfSIgLXByaW50ZiAiJVRAXG4iIHwgc29ydCAtciB8IGhlYWQgLW4gMSkKKwlmaQorCQorCWVjaG8gIiMgTGFzdCBtb2RpZmllZDogJHtteV9tdGltZX0iCisJZWNobworfQorCitwYXJzZSgpIHsKKwlsb2NhbCBsb2NhdGlvbj0iJDEiCisJbG9jYWwgbmFtZT0iJHtsb2NhdGlvbi8ke3NyY2Rpcn0vL30iCisJIyBjaGFuZ2UgJy8vJyBpbnRvICcvJworCW5hbWU9IiR7bmFtZS8vXC9cLy8vfSIKKwlsb2NhbCBtb2RlPSIkMiIKKwlsb2NhbCB1aWQ9IiQzIgorCWxvY2FsIGdpZD0iJDQiCisJbG9jYWwgZnR5cGU9JChmaWxldHlwZSAiJHtsb2NhdGlvbn0iKQorCSMgcmVtYXAgdWlkL2dpZCB0byAwIGlmIG5lY2Vzc2FyeQorCVsgIiR1aWQiIC1lcSAiJHJvb3RfdWlkIiBdICYmIHVpZD0wCisJWyAiJGdpZCIgLWVxICIkcm9vdF9naWQiIF0gJiYgZ2lkPTAKKwlsb2NhbCBzdHI9IiR7bW9kZX0gJHt1aWR9ICR7Z2lkfSIKKworCVsgIiR7ZnR5cGV9IiA9PSAiaW52YWxpZCIgXSAmJiByZXR1cm4gMAorCVsgIiR7bG9jYXRpb259IiA9PSAiJHtzcmNkaXJ9IiBdICYmIHJldHVybiAwCisKKwljYXNlICIke2Z0eXBlfSIgaW4KKwkJImZpbGUiKQorCQkJc3RyPSIke2Z0eXBlfSAke25hbWV9ICR7bG9jYXRpb259ICR7c3RyfSIKKwkJCTs7CisJCSJub2QiKQorCQkJbG9jYWwgZGV2X3R5cGU9CisJCQlsb2NhbCBtYWo9JChMQ19BTEw9QyBscyAtbCAiJHtsb2NhdGlvbn0iIHwgXAorCQkJCQlnYXdrICd7c3ViKC8sLywgIiIsICQ1KTsgcHJpbnQgJDV9JykKKwkJCWxvY2FsIG1pbj0kKExDX0FMTD1DIGxzIC1sICIke2xvY2F0aW9ufSIgfCBcCisJCQkJCWdhd2sgJ3twcmludCAkNn0nKQorCisJCQlpZiBbIC1iICIke2xvY2F0aW9ufSIgXTsgdGhlbgorCQkJCWRldl90eXBlPSJiIgorCQkJZWxzZQorCQkJCWRldl90eXBlPSJjIgorCQkJZmkKKwkJCXN0cj0iJHtmdHlwZX0gJHtuYW1lfSAke3N0cn0gJHtkZXZfdHlwZX0gJHttYWp9ICR7bWlufSIKKwkJCTs7CisJCSJzbGluayIpCisJCQlsb2NhbCB0YXJnZXQ9JChMQ19BTEw9QyBscyAtbCAiJHtsb2NhdGlvbn0iIHwgXAorCQkJCQlnYXdrICd7cHJpbnQgJDExfScpCisJCQlzdHI9IiR7ZnR5cGV9ICR7bmFtZX0gJHt0YXJnZXR9ICR7c3RyfSIKKwkJCTs7CisJCSopCisJCQlzdHI9IiR7ZnR5cGV9ICR7bmFtZX0gJHtzdHJ9IgorCQkJOzsKKwllc2FjCisKKwllY2hvICIke3N0cn0iCisKKwlyZXR1cm4gMAorfQorCit1c2FnZSgpIHsKKwlwcmludGYgICAgIlVzYWdlOlxuIgorCXByaW50ZiAgICAiJDAgWyBbLXUgPHJvb3RfdWlkPl0gWy1nIDxyb290X2dpZD5dIFstZCB8IDxjcGlvX3NvdXJjZT5dIF0gLiAuIC5cbiIKKwlwcmludGYgICAgIlxuIgorCXByaW50ZiAtLSAiLXUgPHJvb3RfdWlkPiAgVXNlciBJRCB0byBtYXAgdG8gdXNlciBJRCAwIChyb290KS5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIDxyb290X3VpZD4gaXMgb25seSBtZWFuaW5nZnVsIGlmIDxjcGlvX3NvdXJjZT5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGlzIGEgZGlyZWN0b3J5LlxuIgorCXByaW50ZiAtLSAiLWcgPHJvb3RfZ2lkPiAgR3JvdXAgSUQgdG8gbWFwIHRvIGdyb3VwIElEIDAgKHJvb3QpLlxuIgorCXByaW50ZiAgICAiICAgICAgICAgICAgICAgPHJvb3RfZ2lkPiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgPGNwaW9fc291cmNlPlxuIgorCXByaW50ZiAgICAiICAgICAgICAgICAgICAgaXMgYSBkaXJlY3RvcnkuXG4iCisJcHJpbnRmICAgICI8Y3Bpb19zb3VyY2U+ICBGaWxlIGxpc3Qgb3IgZGlyZWN0b3J5IGZvciBjcGlvIGFyY2hpdmUuXG4iCisJcHJpbnRmICAgICIgICAgICAgICAgICAgICBJZiA8Y3Bpb19zb3VyY2U+IGlzIG5vdCBwcm92aWRlZCB0aGVuIGFcbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGEgZGVmYXVsdCBsaXN0IHdpbGwgYmUgb3V0cHV0LlxuIgorCXByaW50ZiAtLSAiLWQgICAgICAgICAgICAgT3V0cHV0IHRoZSBkZWZhdWx0IGNwaW8gbGlzdC4gIElmIG5vIDxjcGlvX3NvdXJjZT5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGlzIGdpdmVuIHRoZW4gdGhlIGRlZmF1bHQgY3BpbyBsaXN0IHdpbGwgYmUgb3V0cHV0LlxuIgorCXByaW50ZiAgICAiXG4iCisJcHJpbnRmICAgICJBbGwgb3B0aW9ucyBtYXkgYmUgcmVwZWF0ZWQgYW5kIGFyZSBpbnRlcnByZXRlZCBzZXF1ZW50aWFsbHlcbiIKKwlwcmludGYgICAgImFuZCBpbW1lZGlhdGVseS4gIC11IGFuZCAtZyBzdGF0ZXMgYXJlIHByZXNlcnZlZCBhY3Jvc3NcbiIKKwlwcmludGYgICAgIjxjcGlvX3NvdXJjZT4gb3B0aW9ucyBzbyBhbiBleHBsaWNpdCBcIi11IDAgLWcgMFwiIGlzIHJlcXVpcmVkXG4iCisJcHJpbnRmICAgICJ0byByZXNldCB0aGUgcm9vdC9ncm91cCBtYXBwaW5nLlxuIgorfQorCitidWlsZF9saXN0KCkgeworCXByaW50ZiAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgJGNwaW9fc291cmNlXG4iCisKKwlpZiBbIC1mICIkY3Bpb19zb3VyY2UiIF07IHRoZW4KKwkJcHJpbnRfbXRpbWUgIiRjcGlvX3NvdXJjZSIKKwkJY2F0ICIkY3Bpb19zb3VyY2UiCisJZWxpZiBbIC1kICIkY3Bpb19zb3VyY2UiIF07IHRoZW4KKwkJc3JjZGlyPSQoZWNobyAiJGNwaW9fc291cmNlIiB8IHNlZCAtZSAnczovLyo6LzpnJykKKwkJZGlybGlzdD0kKGZpbmQgIiR7c3JjZGlyfSIgLXByaW50ZiAiJXAgJW0gJVUgJUdcbiIgMj4vZGV2L251bGwpCisKKwkJIyBJZiAkZGlybGlzdCBpcyBvbmx5IG9uZSBsaW5lLCB0aGVuIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkKKwkJaWYgWyAgIiQoZWNobyAiJHtkaXJsaXN0fSIgfCB3YyAtbCkiIC1ndCAxIF07IHRoZW4KKwkJCXByaW50X210aW1lICIkY3Bpb19zb3VyY2UiCisJCQorCQkJZWNobyAiJHtkaXJsaXN0fSIgfCBcCisJCQl3aGlsZSByZWFkIHg7IGRvCisJCQkJcGFyc2UgJHt4fQorCQkJZG9uZQorCQllbHNlCisJCQkjIEZhaWxzYWZlIGluIGNhc2UgZGlyZWN0b3J5IGlzIGVtcHR5CisJCQlkZWZhdWx0X2luaXRyYW1mcworCQlmaQorCWVsc2UKKwkJZWNobyAiICAkMDogQ2Fubm90IG9wZW4gJyRjcGlvX3NvdXJjZSciID4mMgorCQlleGl0IDEKKwlmaQorfQorCisKK3Jvb3RfdWlkPTAKK3Jvb3RfZ2lkPTAKKword2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworCWFyZz0iJDEiCisJc2hpZnQKKwljYXNlICIkYXJnIiBpbgorCQkiLXUiKQorCQkJcm9vdF91aWQ9IiQxIgorCQkJc2hpZnQKKwkJCTs7CisJCSItZyIpCisJCQlyb290X2dpZD0iJDEiCisJCQlzaGlmdAorCQkJOzsKKwkJIi1kIikKKwkJCWRlZmF1bHRfbGlzdD0iJGFyZyIKKwkJCWRlZmF1bHRfaW5pdHJhbWZzCisJCQk7OworCQkiLWgiKQorCQkJdXNhZ2UKKwkJCWV4aXQgMAorCQkJOzsKKwkJKikKKwkJCWNhc2UgIiRhcmciIGluCisJCQkJIi0iKikKKwkJCQkJcHJpbnRmICJFUlJPUjogdW5rbm93biBvcHRpb24gXCIkYXJnXCJcbiIgPiYyCisJCQkJCXByaW50ZiAiSWYgdGhlIGZpbGVuYW1lIHZhbGlkbHkgYmVnaW5zIHdpdGggJy0nLCB0aGVuIGl0IG11c3QgYmUgcHJlZml4ZWRcbiIgPiYyCisJCQkJCXByaW50ZiAiYnkgJy4vJyBzbyB0aGF0IGl0IHdvbid0IGJlIGludGVycHJldGVkIGFzIGFuIG9wdGlvbi4iID4mMgorCQkJCQlwcmludGYgIlxuIiA+JjIKKwkJCQkJdXNhZ2UgPiYyCisJCQkJCWV4aXQgMQorCQkJCQk7OworCQkJCSopCisJCQkJCWNwaW9fc291cmNlPSIkYXJnIgorCQkJCQlidWlsZF9saXN0CisJCQkJCTs7CisJCQllc2FjCisJCQk7OworCWVzYWMKK2RvbmUKKworIyBzcGl0IG91dCB0aGUgZGVmYXVsdCBjcGlvIGxpc3QgaWYgYSBzb3VyY2UgaGFzbid0IGJlZW4gc3BlY2lmaWVkCitbIC16ICIkY3Bpb19zb3VyY2UiIC1hIC16ICIkZGVmYXVsdF9saXN0IiBdICYmIGRlZmF1bHRfaW5pdHJhbWZzCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9NYWtlZmlsZSBiL3NjcmlwdHMvZ2Vua3N5bXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3NWYyOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorCitob3N0cHJvZ3MteQk6PSBnZW5rc3ltcworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCitnZW5rc3ltcy1vYmpzCTo9IGdlbmtzeW1zLm8gcGFyc2UubyBsZXgubworCisjIC1JIG5lZWRlZCBmb3IgZ2VuZXJhdGVkIEMgc291cmNlIChzaGlwcGVkIHNvdXJjZSkKK0hPU1RDRkxBR1NfcGFyc2UubyA6PSAtV25vLXVuaW5pdGlhbGl6ZWQgLUkkKHNyYykKKworIyBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKKyQob2JqKS9sZXgubzogJChvYmopL3BhcnNlLmggJChvYmopL2tleXdvcmRzLmMKKworIyAtSSBuZWVkZWQgZm9yIGdlbmVyYXRlZCBDIHNvdXJjZSAoc2hpcHBlZCBzb3VyY2UpCitIT1NUQ0ZMQUdTX2xleC5vIDo9IC1JJChzcmMpCisKK2lmZGVmIEdFTkVSQVRFX1BBUlNFUgorCisjIGdwZXJmCisKK3F1aWV0X2NtZF9rZXl3b3Jkcy5jID0gR1BFUkYgICAkQAorICAgICAgY21kX2tleXdvcmRzLmMgPSBncGVyZiAtTCBBTlNJLUMgLWEgLUMgLUUgLWcgLUggaXNfcmVzZXJ2ZWRfaGFzaAlcCisJCSAgICAgICAtayAxLDMsJCQgLU4gaXNfcmVzZXJ2ZWRfd29yZCAtcCAtdCAkPCA+ICRACisKKyQob2JqKS9rZXl3b3Jkcy5jOiAkKG9iaikva2V5d29yZHMuZ3BlcmYgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxrZXl3b3Jkcy5jKQorCisjIGZsZXgKKworcXVpZXRfY21kX2xleC5jID0gRkxFWCAgICAkQAorICAgICAgY21kX2xleC5jID0gZmxleCAtbyRAIC1kICQoZmlsdGVyLW91dCBGT1JDRSwkXikKKworJChvYmopL2xleC5jOiAkKG9iaikvbGV4LmwgJChvYmopL3BhcnNlLmggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsZXguYykKKworIyBiaXNvbgorCitxdWlldF9jbWRfcGFyc2UuYyA9IEJJU09OICAgJEAKKyAgICAgIGNtZF9wYXJzZS5jID0gYmlzb24gLW8kQCAtZHR2ICQoZmlsdGVyLW91dCBGT1JDRSwkXikKKworJChvYmopL3BhcnNlLmM6ICQob2JqKS9wYXJzZS55IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQscGFyc2UuYykKKworJChvYmopL3BhcnNlLmg6ICQob2JqKS9wYXJzZS5jIDsKKworY2xlYW4tZmlsZXMJKz0gcGFyc2Uub3V0cHV0CisKK2VuZGlmCisKK3RhcmdldHMgKz0ga2V5d29yZHMuYyBsZXguYyBwYXJzZS5jIHBhcnNlLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZhNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCkBAIC0wLDAgKzEsNTkxIEBACisvKiBHZW5lcmF0ZSBrZXJuZWwgc3ltYm9sIHZlcnNpb24gaGFzaGVzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGhpcyBmaWxlIHdhcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscyAyLjQuMjI6IG1vdmVkIGJhY2sgaW50byB0aGUKKyAgIGtlcm5lbCBzb3VyY2VzIGJ5IFJ1c3R5IFJ1c3NlbGwvS2FpIEdlcm1hc2NoZXdza2kuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworCisjaW5jbHVkZSAiZ2Vua3N5bXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBIQVNIX0JVQ0tFVFMgIDQwOTYKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bXRhYltIQVNIX0JVQ0tFVFNdOworRklMRSAqZGVidWdmaWxlOworCitpbnQgY3VyX2xpbmUgPSAxOworY2hhciAqY3VyX2ZpbGVuYW1lLCAqb3V0cHV0X2RpcmVjdG9yeTsKKworaW50IGZsYWdfZGVidWcsIGZsYWdfZHVtcF9kZWZzLCBmbGFnX3dhcm5pbmdzOworCitzdGF0aWMgaW50IGVycm9yczsKK3N0YXRpYyBpbnQgbnN5bXM7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpleHBhbnNpb25fdHJhaWw7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3ltYm9sX3R5cGVfbmFtZVtdID0geworICAibm9ybWFsIiwgInR5cGVkZWYiLCAiZW51bSIsICJzdHJ1Y3QiLCAidW5pb24iCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyY3RhYjMyW10gPQoreworICAweDAwMDAwMDAwVSwgMHg3NzA3MzA5NlUsIDB4ZWUwZTYxMmNVLCAweDk5MDk1MWJhVSwgMHgwNzZkYzQxOVUsCisgIDB4NzA2YWY0OGZVLCAweGU5NjNhNTM1VSwgMHg5ZTY0OTVhM1UsIDB4MGVkYjg4MzJVLCAweDc5ZGNiOGE0VSwKKyAgMHhlMGQ1ZTkxZVUsIDB4OTdkMmQ5ODhVLCAweDA5YjY0YzJiVSwgMHg3ZWIxN2NiZFUsIDB4ZTdiODJkMDdVLAorICAweDkwYmYxZDkxVSwgMHgxZGI3MTA2NFUsIDB4NmFiMDIwZjJVLCAweGYzYjk3MTQ4VSwgMHg4NGJlNDFkZVUsCisgIDB4MWFkYWQ0N2RVLCAweDZkZGRlNGViVSwgMHhmNGQ0YjU1MVUsIDB4ODNkMzg1YzdVLCAweDEzNmM5ODU2VSwKKyAgMHg2NDZiYThjMFUsIDB4ZmQ2MmY5N2FVLCAweDhhNjVjOWVjVSwgMHgxNDAxNWM0ZlUsIDB4NjMwNjZjZDlVLAorICAweGZhMGYzZDYzVSwgMHg4ZDA4MGRmNVUsIDB4M2I2ZTIwYzhVLCAweDRjNjkxMDVlVSwgMHhkNTYwNDFlNFUsCisgIDB4YTI2NzcxNzJVLCAweDNjMDNlNGQxVSwgMHg0YjA0ZDQ0N1UsIDB4ZDIwZDg1ZmRVLCAweGE1MGFiNTZiVSwKKyAgMHgzNWI1YThmYVUsIDB4NDJiMjk4NmNVLCAweGRiYmJjOWQ2VSwgMHhhY2JjZjk0MFUsIDB4MzJkODZjZTNVLAorICAweDQ1ZGY1Yzc1VSwgMHhkY2Q2MGRjZlUsIDB4YWJkMTNkNTlVLCAweDI2ZDkzMGFjVSwgMHg1MWRlMDAzYVUsCisgIDB4YzhkNzUxODBVLCAweGJmZDA2MTE2VSwgMHgyMWI0ZjRiNVUsIDB4NTZiM2M0MjNVLCAweGNmYmE5NTk5VSwKKyAgMHhiOGJkYTUwZlUsIDB4MjgwMmI4OWVVLCAweDVmMDU4ODA4VSwgMHhjNjBjZDliMlUsIDB4YjEwYmU5MjRVLAorICAweDJmNmY3Yzg3VSwgMHg1ODY4NGMxMVUsIDB4YzE2MTFkYWJVLCAweGI2NjYyZDNkVSwgMHg3NmRjNDE5MFUsCisgIDB4MDFkYjcxMDZVLCAweDk4ZDIyMGJjVSwgMHhlZmQ1MTAyYVUsIDB4NzFiMTg1ODlVLCAweDA2YjZiNTFmVSwKKyAgMHg5ZmJmZTRhNVUsIDB4ZThiOGQ0MzNVLCAweDc4MDdjOWEyVSwgMHgwZjAwZjkzNFUsIDB4OTYwOWE4OGVVLAorICAweGUxMGU5ODE4VSwgMHg3ZjZhMGRiYlUsIDB4MDg2ZDNkMmRVLCAweDkxNjQ2Yzk3VSwgMHhlNjYzNWMwMVUsCisgIDB4NmI2YjUxZjRVLCAweDFjNmM2MTYyVSwgMHg4NTY1MzBkOFUsIDB4ZjI2MjAwNGVVLCAweDZjMDY5NWVkVSwKKyAgMHgxYjAxYTU3YlUsIDB4ODIwOGY0YzFVLCAweGY1MGZjNDU3VSwgMHg2NWIwZDljNlUsIDB4MTJiN2U5NTBVLAorICAweDhiYmViOGVhVSwgMHhmY2I5ODg3Y1UsIDB4NjJkZDFkZGZVLCAweDE1ZGEyZDQ5VSwgMHg4Y2QzN2NmM1UsCisgIDB4ZmJkNDRjNjVVLCAweDRkYjI2MTU4VSwgMHgzYWI1NTFjZVUsIDB4YTNiYzAwNzRVLCAweGQ0YmIzMGUyVSwKKyAgMHg0YWRmYTU0MVUsIDB4M2RkODk1ZDdVLCAweGE0ZDFjNDZkVSwgMHhkM2Q2ZjRmYlUsIDB4NDM2OWU5NmFVLAorICAweDM0NmVkOWZjVSwgMHhhZDY3ODg0NlUsIDB4ZGE2MGI4ZDBVLCAweDQ0MDQyZDczVSwgMHgzMzAzMWRlNVUsCisgIDB4YWEwYTRjNWZVLCAweGRkMGQ3Y2M5VSwgMHg1MDA1NzEzY1UsIDB4MjcwMjQxYWFVLCAweGJlMGIxMDEwVSwKKyAgMHhjOTBjMjA4NlUsIDB4NTc2OGI1MjVVLCAweDIwNmY4NWIzVSwgMHhiOTY2ZDQwOVUsIDB4Y2U2MWU0OWZVLAorICAweDVlZGVmOTBlVSwgMHgyOWQ5Yzk5OFUsIDB4YjBkMDk4MjJVLCAweGM3ZDdhOGI0VSwgMHg1OWIzM2QxN1UsCisgIDB4MmViNDBkODFVLCAweGI3YmQ1YzNiVSwgMHhjMGJhNmNhZFUsIDB4ZWRiODgzMjBVLCAweDlhYmZiM2I2VSwKKyAgMHgwM2I2ZTIwY1UsIDB4NzRiMWQyOWFVLCAweGVhZDU0NzM5VSwgMHg5ZGQyNzdhZlUsIDB4MDRkYjI2MTVVLAorICAweDczZGMxNjgzVSwgMHhlMzYzMGIxMlUsIDB4OTQ2NDNiODRVLCAweDBkNmQ2YTNlVSwgMHg3YTZhNWFhOFUsCisgIDB4ZTQwZWNmMGJVLCAweDkzMDlmZjlkVSwgMHgwYTAwYWUyN1UsIDB4N2QwNzllYjFVLCAweGYwMGY5MzQ0VSwKKyAgMHg4NzA4YTNkMlUsIDB4MWUwMWYyNjhVLCAweDY5MDZjMmZlVSwgMHhmNzYyNTc1ZFUsIDB4ODA2NTY3Y2JVLAorICAweDE5NmMzNjcxVSwgMHg2ZTZiMDZlN1UsIDB4ZmVkNDFiNzZVLCAweDg5ZDMyYmUwVSwgMHgxMGRhN2E1YVUsCisgIDB4NjdkZDRhY2NVLCAweGY5YjlkZjZmVSwgMHg4ZWJlZWZmOVUsIDB4MTdiN2JlNDNVLCAweDYwYjA4ZWQ1VSwKKyAgMHhkNmQ2YTNlOFUsIDB4YTFkMTkzN2VVLCAweDM4ZDhjMmM0VSwgMHg0ZmRmZjI1MlUsIDB4ZDFiYjY3ZjFVLAorICAweGE2YmM1NzY3VSwgMHgzZmI1MDZkZFUsIDB4NDhiMjM2NGJVLCAweGQ4MGQyYmRhVSwgMHhhZjBhMWI0Y1UsCisgIDB4MzYwMzRhZjZVLCAweDQxMDQ3YTYwVSwgMHhkZjYwZWZjM1UsIDB4YTg2N2RmNTVVLCAweDMxNmU4ZWVmVSwKKyAgMHg0NjY5YmU3OVUsIDB4Y2I2MWIzOGNVLCAweGJjNjY4MzFhVSwgMHgyNTZmZDJhMFUsIDB4NTI2OGUyMzZVLAorICAweGNjMGM3Nzk1VSwgMHhiYjBiNDcwM1UsIDB4MjIwMjE2YjlVLCAweDU1MDUyNjJmVSwgMHhjNWJhM2JiZVUsCisgIDB4YjJiZDBiMjhVLCAweDJiYjQ1YTkyVSwgMHg1Y2IzNmEwNFUsIDB4YzJkN2ZmYTdVLCAweGI1ZDBjZjMxVSwKKyAgMHgyY2Q5OWU4YlUsIDB4NWJkZWFlMWRVLCAweDliNjRjMmIwVSwgMHhlYzYzZjIyNlUsIDB4NzU2YWEzOWNVLAorICAweDAyNmQ5MzBhVSwgMHg5YzA5MDZhOVUsIDB4ZWIwZTM2M2ZVLCAweDcyMDc2Nzg1VSwgMHgwNTAwNTcxM1UsCisgIDB4OTViZjRhODJVLCAweGUyYjg3YTE0VSwgMHg3YmIxMmJhZVUsIDB4MGNiNjFiMzhVLCAweDkyZDI4ZTliVSwKKyAgMHhlNWQ1YmUwZFUsIDB4N2NkY2VmYjdVLCAweDBiZGJkZjIxVSwgMHg4NmQzZDJkNFUsIDB4ZjFkNGUyNDJVLAorICAweDY4ZGRiM2Y4VSwgMHgxZmRhODM2ZVUsIDB4ODFiZTE2Y2RVLCAweGY2YjkyNjViVSwgMHg2ZmIwNzdlMVUsCisgIDB4MThiNzQ3NzdVLCAweDg4MDg1YWU2VSwgMHhmZjBmNmE3MFUsIDB4NjYwNjNiY2FVLCAweDExMDEwYjVjVSwKKyAgMHg4ZjY1OWVmZlUsIDB4Zjg2MmFlNjlVLCAweDYxNmJmZmQzVSwgMHgxNjZjY2Y0NVUsIDB4YTAwYWUyNzhVLAorICAweGQ3MGRkMmVlVSwgMHg0ZTA0ODM1NFUsIDB4MzkwM2IzYzJVLCAweGE3NjcyNjYxVSwgMHhkMDYwMTZmN1UsCisgIDB4NDk2OTQ3NGRVLCAweDNlNmU3N2RiVSwgMHhhZWQxNmE0YVUsIDB4ZDlkNjVhZGNVLCAweDQwZGYwYjY2VSwKKyAgMHgzN2Q4M2JmMFUsIDB4YTliY2FlNTNVLCAweGRlYmI5ZWM1VSwgMHg0N2IyY2Y3ZlUsIDB4MzBiNWZmZTlVLAorICAweGJkYmRmMjFjVSwgMHhjYWJhYzI4YVUsIDB4NTNiMzkzMzBVLCAweDI0YjRhM2E2VSwgMHhiYWQwMzYwNVUsCisgIDB4Y2RkNzA2OTNVLCAweDU0ZGU1NzI5VSwgMHgyM2Q5NjdiZlUsIDB4YjM2NjdhMmVVLCAweGM0NjE0YWI4VSwKKyAgMHg1ZDY4MWIwMlUsIDB4MmE2ZjJiOTRVLCAweGI0MGJiZTM3VSwgMHhjMzBjOGVhMVUsIDB4NWEwNWRmMWJVLAorICAweDJkMDJlZjhkVQorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitwYXJ0aWFsX2NyYzMyX29uZSh1bnNpZ25lZCBjaGFyIGMsIHVuc2lnbmVkIGxvbmcgY3JjKQoreworICByZXR1cm4gY3JjdGFiMzJbKGNyYyBeIGMpICYgMHhmZl0gXiAoY3JjID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3BhcnRpYWxfY3JjMzIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBjcmMpCit7CisgIHdoaWxlICgqcykKKyAgICBjcmMgPSBwYXJ0aWFsX2NyYzMyX29uZSgqcysrLCBjcmMpOworICByZXR1cm4gY3JjOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2NyYzMyKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiBwYXJ0aWFsX2NyYzMyKHMsIDB4ZmZmZmZmZmYpIF4gMHhmZmZmZmZmZjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGVudW0gc3ltYm9sX3R5cGUKK21hcF90b19ucyhlbnVtIHN5bWJvbF90eXBlIHQpCit7CisgIGlmICh0ID09IFNZTV9UWVBFREVGKQorICAgIHQgPSBTWU1fTk9STUFMOworICBlbHNlIGlmICh0ID09IFNZTV9VTklPTikKKyAgICB0ID0gU1lNX1NUUlVDVDsKKyAgcmV0dXJuIHQ7Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorZmluZF9zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgZW51bSBzeW1ib2xfdHlwZSBucykKK3sKKyAgdW5zaWduZWQgbG9uZyBoID0gY3JjMzIobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBmb3IgKHN5bSA9IHN5bXRhYltoXTsgc3ltIDsgc3ltID0gc3ltLT5oYXNoX25leHQpCisgICAgaWYgKG1hcF90b19ucyhzeW0tPnR5cGUpID09IG1hcF90b19ucyhucykgJiYgc3RyY21wKG5hbWUsIHN5bS0+bmFtZSkgPT0gMCkKKyAgICAgIGJyZWFrOworCisgIHJldHVybiBzeW07Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorYWRkX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBlbnVtIHN5bWJvbF90eXBlIHR5cGUsIHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVmbiwgaW50IGlzX2V4dGVybikKK3sKKyAgdW5zaWduZWQgbG9uZyBoID0gY3JjMzIobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBmb3IgKHN5bSA9IHN5bXRhYltoXTsgc3ltIDsgc3ltID0gc3ltLT5oYXNoX25leHQpCisgICAgaWYgKG1hcF90b19ucyhzeW0tPnR5cGUpID09IG1hcF90b19ucyh0eXBlKQorCSYmIHN0cmNtcChuYW1lLCBzeW0tPm5hbWUpID09IDApCisgICAgICB7CisJaWYgKCFlcXVhbF9saXN0KHN5bS0+ZGVmbiwgZGVmbikpCisJICBlcnJvcl93aXRoX3BvcygicmVkZWZpbml0aW9uIG9mICVzIiwgbmFtZSk7CisJcmV0dXJuIHN5bTsKKyAgICAgIH0KKworICBzeW0gPSB4bWFsbG9jKHNpemVvZigqc3ltKSk7CisgIHN5bS0+bmFtZSA9IG5hbWU7CisgIHN5bS0+dHlwZSA9IHR5cGU7CisgIHN5bS0+ZGVmbiA9IGRlZm47CisgIHN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gTlVMTDsKKyAgc3ltLT5pc19leHRlcm4gPSBpc19leHRlcm47CisKKyAgc3ltLT5oYXNoX25leHQgPSBzeW10YWJbaF07CisgIHN5bXRhYltoXSA9IHN5bTsKKworICBpZiAoZmxhZ19kZWJ1ZykKKyAgICB7CisgICAgICBmcHJpbnRmKGRlYnVnZmlsZSwgIkRlZm4gZm9yICVzICVzID09IDwiLCBzeW1ib2xfdHlwZV9uYW1lW3R5cGVdLCAgbmFtZSk7CisgICAgICBpZiAoaXNfZXh0ZXJuKQorICAgICAgICBmcHV0cygiZXh0ZXJuICIsIGRlYnVnZmlsZSk7CisgICAgICBwcmludF9saXN0KGRlYnVnZmlsZSwgZGVmbik7CisgICAgICBmcHV0cygiPlxuIiwgZGVidWdmaWxlKTsKKyAgICB9CisKKyAgKytuc3ltczsKKyAgcmV0dXJuIHN5bTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbmxpbmUgdm9pZAorZnJlZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSkKK3sKKyAgZnJlZShub2RlLT5zdHJpbmcpOworICBmcmVlKG5vZGUpOworfQorCit2b2lkCitmcmVlX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICpzLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmUpCit7CisgIHdoaWxlIChzICE9IGUpCisgICAgeworICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0ID0gcy0+bmV4dDsKKyAgICAgIGZyZWVfbm9kZShzKTsKKyAgICAgIHMgPSBuZXh0OworICAgIH0KK30KKworaW5saW5lIHN0cnVjdCBzdHJpbmdfbGlzdCAqCitjb3B5X25vZGUoc3RydWN0IHN0cmluZ19saXN0ICpub2RlKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5ld25vZGU7CisKKyAgbmV3bm9kZSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdub2RlKSk7CisgIG5ld25vZGUtPnN0cmluZyA9IHhzdHJkdXAobm9kZS0+c3RyaW5nKTsKKyAgbmV3bm9kZS0+dGFnID0gbm9kZS0+dGFnOworCisgIHJldHVybiBuZXdub2RlOworfQorCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgorY29weV9saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqcywgc3RydWN0IHN0cmluZ19saXN0ICplKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmgsICpwOworCisgIGlmIChzID09IGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcCA9IGggPSBjb3B5X25vZGUocyk7CisgIHdoaWxlICgocyA9IHMtPm5leHQpICE9IGUpCisgICAgcCA9IHAtPm5leHQgPSBjb3B5X25vZGUocyk7CisgIHAtPm5leHQgPSBOVUxMOworCisgIHJldHVybiBoOworfQorCitpbnQKK2VxdWFsX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICphLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmIpCit7CisgIHdoaWxlIChhICYmIGIpCisgICAgeworICAgICAgaWYgKGEtPnRhZyAhPSBiLT50YWcgfHwgc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKSkKKwlyZXR1cm4gMDsKKyAgICAgIGEgPSBhLT5uZXh0OworICAgICAgYiA9IGItPm5leHQ7CisgICAgfQorCisgIHJldHVybiAhYSAmJiAhYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitwcmludF9ub2RlKEZJTEUgKmYsIHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCkKK3sKKyAgc3dpdGNoIChsaXN0LT50YWcpCisgICAgeworICAgIGNhc2UgU1lNX1NUUlVDVDoKKyAgICAgIHB1dGMoJ3MnLCBmKTsKKyAgICAgIGdvdG8gcHJpbnRpdDsKKyAgICBjYXNlIFNZTV9VTklPTjoKKyAgICAgIHB1dGMoJ3UnLCBmKTsKKyAgICAgIGdvdG8gcHJpbnRpdDsKKyAgICBjYXNlIFNZTV9FTlVNOgorICAgICAgcHV0YygnZScsIGYpOworICAgICAgZ290byBwcmludGl0OworICAgIGNhc2UgU1lNX1RZUEVERUY6CisgICAgICBwdXRjKCd0JywgZik7CisgICAgICBnb3RvIHByaW50aXQ7CisKKyAgICBwcmludGl0OgorICAgICAgcHV0YygnIycsIGYpOworICAgIGNhc2UgU1lNX05PUk1BTDoKKyAgICAgIGZwdXRzKGxpc3QtPnN0cmluZywgZik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQKK3ByaW50X2xpc3QoRklMRSAqZiwgc3RydWN0IHN0cmluZ19saXN0ICpsaXN0KQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiplLCAqKmI7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqdG1wLCAqKnRtcDI7CisgIGludCBlbGVtID0gMTsKKworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwdXRzKCIobmlsKSIsIGYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0bXAgPSBsaXN0OworICB3aGlsZSgodG1wID0gdG1wLT5uZXh0KSAhPSBOVUxMKQorCSAgZWxlbSsrOworCisgIGIgPSBhbGxvY2EoZWxlbSAqIHNpemVvZigqZSkpOworICBlID0gYiArIGVsZW07CisgIHRtcDIgPSBlIC0gMTsKKworICAoKnRtcDItLSkgPSBsaXN0OworICB3aGlsZSgobGlzdCA9IGxpc3QtPm5leHQpICE9IE5VTEwpCisJICAqKHRtcDItLSkgPSBsaXN0OworCisgIHdoaWxlIChiICE9IGUpCisgICAgeworICAgICAgcHJpbnRfbm9kZShmLCAqYisrKTsKKyAgICAgIHB1dGMoJyAnLCBmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHBhbmRfYW5kX2NyY19saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCwgdW5zaWduZWQgbG9uZyBjcmMpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqKmUsICoqYjsKKyAgc3RydWN0IHN0cmluZ19saXN0ICp0bXAsICoqdG1wMjsKKyAgaW50IGVsZW0gPSAxOworCisgIGlmICghbGlzdCkKKyAgICByZXR1cm4gY3JjOworCisgIHRtcCA9IGxpc3Q7CisgIHdoaWxlKCh0bXAgPSB0bXAtPm5leHQpICE9IE5VTEwpCisJICBlbGVtKys7CisKKyAgYiA9IGFsbG9jYShlbGVtICogc2l6ZW9mKCplKSk7CisgIGUgPSBiICsgZWxlbTsKKyAgdG1wMiA9IGUgLSAxOworCisgICoodG1wMi0tKSA9IGxpc3Q7CisgIHdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9IE5VTEwpCisgICAgKih0bXAyLS0pID0gbGlzdDsKKworICB3aGlsZSAoYiAhPSBlKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqY3VyOworICAgICAgc3RydWN0IHN5bWJvbCAqc3Vic3ltOworCisgICAgICBjdXIgPSAqKGIrKyk7CisgICAgICBzd2l0Y2ggKGN1ci0+dGFnKQorCXsKKwljYXNlIFNZTV9OT1JNQUw6CisJICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJICAgIGZwcmludGYoZGVidWdmaWxlLCAiJXMgIiwgY3VyLT5zdHJpbmcpOworCSAgY3JjID0gcGFydGlhbF9jcmMzMihjdXItPnN0cmluZywgY3JjKTsKKwkgIGNyYyA9IHBhcnRpYWxfY3JjMzJfb25lKCcgJywgY3JjKTsKKwkgIGJyZWFrOworCisJY2FzZSBTWU1fVFlQRURFRjoKKwkgIHN1YnN5bSA9IGZpbmRfc3ltYm9sKGN1ci0+c3RyaW5nLCBjdXItPnRhZyk7CisJICBpZiAoc3Vic3ltLT5leHBhbnNpb25fdHJhaWwpCisJICAgIHsKKwkgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJCWZwcmludGYoZGVidWdmaWxlLCAiJXMgIiwgY3VyLT5zdHJpbmcpOworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoY3VyLT5zdHJpbmcsIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdWJzeW0tPmV4cGFuc2lvbl90cmFpbCA9IGV4cGFuc2lvbl90cmFpbDsKKwkgICAgICBleHBhbnNpb25fdHJhaWwgPSBzdWJzeW07CisJICAgICAgY3JjID0gZXhwYW5kX2FuZF9jcmNfbGlzdChzdWJzeW0tPmRlZm4sIGNyYyk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBTWU1fU1RSVUNUOgorCWNhc2UgU1lNX1VOSU9OOgorCWNhc2UgU1lNX0VOVU06CisJICBzdWJzeW0gPSBmaW5kX3N5bWJvbChjdXItPnN0cmluZywgY3VyLT50YWcpOworCSAgaWYgKCFzdWJzeW0pCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm4sICp0ID0gTlVMTDsKKworCSAgICAgIGVycm9yX3dpdGhfcG9zKCJleHBhbmQgdW5kZWZpbmVkICVzICVzIiwKKwkJCSAgICAgc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10sIGN1ci0+c3RyaW5nKTsKKworCSAgICAgIG4gPSB4bWFsbG9jKHNpemVvZigqbikpOworCSAgICAgIG4tPnN0cmluZyA9IHhzdHJkdXAoc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10pOworCSAgICAgIG4tPnRhZyA9IFNZTV9OT1JNQUw7CisJICAgICAgbi0+bmV4dCA9IHQ7CisJICAgICAgdCA9IG47CisKKwkgICAgICBuID0geG1hbGxvYyhzaXplb2YoKm4pKTsKKwkgICAgICBuLT5zdHJpbmcgPSB4c3RyZHVwKGN1ci0+c3RyaW5nKTsKKwkgICAgICBuLT50YWcgPSBTWU1fTk9STUFMOworCSAgICAgIG4tPm5leHQgPSB0OworCSAgICAgIHQgPSBuOworCisJICAgICAgbiA9IHhtYWxsb2Moc2l6ZW9mKCpuKSk7CisJICAgICAgbi0+c3RyaW5nID0geHN0cmR1cCgieyBVTktOT1dOIH0iKTsKKwkgICAgICBuLT50YWcgPSBTWU1fTk9STUFMOworCSAgICAgIG4tPm5leHQgPSB0OworCisJICAgICAgc3Vic3ltID0gYWRkX3N5bWJvbChjdXItPnN0cmluZywgY3VyLT50YWcsIG4sIDApOworCSAgICB9CisJICBpZiAoc3Vic3ltLT5leHBhbnNpb25fdHJhaWwpCisJICAgIHsKKwkgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJCXsKKwkJICBmcHJpbnRmKGRlYnVnZmlsZSwgIiVzICVzICIsIHN5bWJvbF90eXBlX25hbWVbY3VyLT50YWddLAorCQkJICBjdXItPnN0cmluZyk7CisJCX0KKworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10sIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoY3VyLT5zdHJpbmcsIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdWJzeW0tPmV4cGFuc2lvbl90cmFpbCA9IGV4cGFuc2lvbl90cmFpbDsKKwkgICAgICBleHBhbnNpb25fdHJhaWwgPSBzdWJzeW07CisJICAgICAgY3JjID0gZXhwYW5kX2FuZF9jcmNfbGlzdChzdWJzeW0tPmRlZm4sIGNyYyk7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIGNyYzsKK30KKwordm9pZAorZXhwb3J0X3N5bWJvbChjb25zdCBjaGFyICpuYW1lKQoreworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgc3ltID0gZmluZF9zeW1ib2wobmFtZSwgU1lNX05PUk1BTCk7CisgIGlmICghc3ltKQorICAgIGVycm9yX3dpdGhfcG9zKCJleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCAlcyIsIG5hbWUpOworICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBjcmM7CisKKyAgICAgIGlmIChmbGFnX2R1bXBfZGVmcykKKwlmcHJpbnRmKGRlYnVnZmlsZSwgIkV4cG9ydCAlcyA9PSA8IiwgbmFtZSk7CisKKyAgICAgIGV4cGFuc2lvbl90cmFpbCA9IChzdHJ1Y3Qgc3ltYm9sICopLTFMOworCisgICAgICBjcmMgPSBleHBhbmRfYW5kX2NyY19saXN0KHN5bS0+ZGVmbiwgMHhmZmZmZmZmZikgXiAweGZmZmZmZmZmOworCisgICAgICBzeW0gPSBleHBhbnNpb25fdHJhaWw7CisgICAgICB3aGlsZSAoc3ltICE9IChzdHJ1Y3Qgc3ltYm9sICopLTFMKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKm4gPSBzeW0tPmV4cGFuc2lvbl90cmFpbDsKKwkgIHN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gMDsKKwkgIHN5bSA9IG47CisJfQorCisgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJZnB1dHMoIj5cbiIsIGRlYnVnZmlsZSk7CisKKyAgICAgIC8qIFVzZWQgYXMgYSBsaW5rZXIgc2NyaXB0LiAqLworICAgICAgcHJpbnRmKCJfX2NyY18lcyA9IDB4JTA4bHggO1xuIiwgbmFtZSwgY3JjKTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgaWYgKGZsYWdfd2FybmluZ3MpCisgICAgeworICAgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgIHB1dGMoJ1xuJywgc3RkZXJyKTsKKworICAgICAgZXJyb3JzKys7CisgICAgfQorfQorCit2b2lkCitlcnJvcl93aXRoX3Bvcyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIGlmIChmbGFnX3dhcm5pbmdzKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIGN1cl9maWxlbmFtZSA/IDogIjxzdGRpbj4iLCBjdXJfbGluZSk7CisKKyAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQoYXJncyk7CisgICAgICBwdXRjKCdcbicsIHN0ZGVycik7CisKKyAgICAgIGVycm9ycysrOworICAgIH0KK30KKworCit2b2lkIGdlbmtzeW1zX3VzYWdlKHZvaWQpCit7CisJZnB1dHMoIlVzYWdlOlxuIgorCSAgICAgICJnZW5rc3ltcyBbLWREd3FoVl0gPiAvcGF0aC90by8udG1wX29iai52ZXJcbiIKKwkgICAgICAiXG4iCisjaWZkZWYgX19HTlVfTElCUkFSWV9fCisJICAgICAgIiAgLWQsIC0tZGVidWcgICAgICAgICAgIEluY3JlbWVudCB0aGUgZGVidWcgbGV2ZWwgKHJlcGVhdGFibGUpXG4iCisJICAgICAgIiAgLUQsIC0tZHVtcCAgICAgICAgICAgIER1bXAgZXhwYW5kZWQgc3ltYm9sIGRlZnMgKGZvciBkZWJ1Z2dpbmcgb25seSlcbiIKKwkgICAgICAiICAtdywgLS13YXJuaW5ncyAgICAgICAgRW5hYmxlIHdhcm5pbmdzXG4iCisJICAgICAgIiAgLXEsIC0tcXVpZXQgICAgICAgICAgIERpc2FibGUgd2FybmluZ3MgKGRlZmF1bHQpXG4iCisJICAgICAgIiAgLWgsIC0taGVscCAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZVxuIgorCSAgICAgICIgIC1WLCAtLXZlcnNpb24gICAgICAgICBQcmludCB0aGUgcmVsZWFzZSB2ZXJzaW9uXG4iCisjZWxzZSAgLyogX19HTlVfTElCUkFSWV9fICovCisgICAgICAgICAgICAgIiAgLWQgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudCB0aGUgZGVidWcgbGV2ZWwgKHJlcGVhdGFibGUpXG4iCisgICAgICAgICAgICAgIiAgLUQgICAgICAgICAgICAgICAgICAgIER1bXAgZXhwYW5kZWQgc3ltYm9sIGRlZnMgKGZvciBkZWJ1Z2dpbmcgb25seSlcbiIKKyAgICAgICAgICAgICAiICAtdyAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHdhcm5pbmdzXG4iCisgICAgICAgICAgICAgIiAgLXEgICAgICAgICAgICAgICAgICAgIERpc2FibGUgd2FybmluZ3MgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICAgIiAgLWggICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZVxuIgorICAgICAgICAgICAgICIgIC1WICAgICAgICAgICAgICAgICAgICBQcmludCB0aGUgcmVsZWFzZSB2ZXJzaW9uXG4iCisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCisJICAgICAgLCBzdGRlcnIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgbzsKKworI2lmZGVmIF9fR05VX0xJQlJBUllfXworICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgIHsiZGVidWciLCAwLCAwLCAnZCd9LAorICAgIHsid2FybmluZ3MiLCAwLCAwLCAndyd9LAorICAgIHsicXVpZXQiLCAwLCAwLCAncSd9LAorICAgIHsiZHVtcCIsIDAsIDAsICdEJ30sCisgICAgeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnfSwKKyAgICB7ImhlbHAiLCAwLCAwLCAnaCd9LAorICAgIHswLCAwLCAwLCAwfQorICB9OworCisgIHdoaWxlICgobyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJkd3FWRGs6cDoiLAorCQkJICAmbG9uZ19vcHRzWzBdLCBOVUxMKSkgIT0gRU9GKQorI2Vsc2UgIC8qIF9fR05VX0xJQlJBUllfXyAqLworICB3aGlsZSAoKG8gPSBnZXRvcHQoYXJnYywgYXJndiwgImR3cVZEazpwOiIpKSAhPSBFT0YpCisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCisgICAgc3dpdGNoIChvKQorICAgICAgeworICAgICAgY2FzZSAnZCc6CisJZmxhZ19kZWJ1ZysrOworCWJyZWFrOworICAgICAgY2FzZSAndyc6CisJZmxhZ193YXJuaW5ncyA9IDE7CisJYnJlYWs7CisgICAgICBjYXNlICdxJzoKKwlmbGFnX3dhcm5pbmdzID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgJ1YnOgorCWZwdXRzKCJnZW5rc3ltcyB2ZXJzaW9uIDIuNS42MFxuIiwgc3RkZXJyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorCWZsYWdfZHVtcF9kZWZzID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2gnOgorCWdlbmtzeW1zX3VzYWdlKCk7CisJcmV0dXJuIDA7CisgICAgICBkZWZhdWx0OgorCWdlbmtzeW1zX3VzYWdlKCk7CisJcmV0dXJuIDE7CisgICAgICB9CisKKyAgICB7CisgICAgICBleHRlcm4gaW50IHl5ZGVidWc7CisgICAgICBleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CisKKyAgICAgIHl5ZGVidWcgPSAoZmxhZ19kZWJ1ZyA+IDEpOworICAgICAgeXlfZmxleF9kZWJ1ZyA9IChmbGFnX2RlYnVnID4gMik7CisKKyAgICAgIGRlYnVnZmlsZSA9IHN0ZGVycjsKKyAgICAgIC8qIHNldGxpbmVidWYoZGVidWdmaWxlKTsgKi8KKyAgICB9CisKKyAgeXlwYXJzZSgpOworCisgIGlmIChmbGFnX2RlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGYoZGVidWdmaWxlLCAiSGFzaCB0YWJsZSBvY2N1cGFuY3kgJWQvJWQgPSAlZ1xuIiwKKwkgICAgICBuc3ltcywgSEFTSF9CVUNLRVRTLCAoZG91YmxlKW5zeW1zIC8gKGRvdWJsZSlIQVNIX0JVQ0tFVFMpOworICAgIH0KKworICByZXR1cm4gZXJyb3JzICE9IDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmggYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5YWY0NwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaApAQCAtMCwwICsxLDEwNCBAQAorLyogR2VuZXJhdGUga2VybmVsIHN5bWJvbCB2ZXJzaW9uIGhhc2hlcy4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCisKKyAgIE5ldyBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorICAgQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaWZuZGVmIE1PRFVUSUxTX0dFTktTWU1TX0gKKyNkZWZpbmUgTU9EVVRJTFNfR0VOS1NZTVNfSCAxCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK2VudW0gc3ltYm9sX3R5cGUKK3sKKyAgU1lNX05PUk1BTCwgU1lNX1RZUEVERUYsIFNZTV9FTlVNLCBTWU1fU1RSVUNULCBTWU1fVU5JT04KK307CisKK3N0cnVjdCBzdHJpbmdfbGlzdAoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7CisgIGVudW0gc3ltYm9sX3R5cGUgdGFnOworICBjaGFyICpzdHJpbmc7Cit9OworCitzdHJ1Y3Qgc3ltYm9sCit7CisgIHN0cnVjdCBzeW1ib2wgKmhhc2hfbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZW51bSBzeW1ib2xfdHlwZSB0eXBlOworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlZm47CisgIHN0cnVjdCBzeW1ib2wgKmV4cGFuc2lvbl90cmFpbDsKKyAgaW50IGlzX2V4dGVybjsKK307CisKK3R5cGVkZWYgc3RydWN0IHN0cmluZ19saXN0ICoqeXlzdHlwZTsKKyNkZWZpbmUgWVlTVFlQRSB5eXN0eXBlCisKK2V4dGVybiBGSUxFICpvdXRmaWxlLCAqZGVidWdmaWxlOworCitleHRlcm4gaW50IGN1cl9saW5lOworZXh0ZXJuIGNoYXIgKmN1cl9maWxlbmFtZSwgKm91dHB1dF9kaXJlY3Rvcnk7CisKK2V4dGVybiBpbnQgZmxhZ19kZWJ1ZywgZmxhZ19kdW1wX2RlZnMsIGZsYWdfd2FybmluZ3M7CitleHRlcm4gaW50IGNoZWNrc3VtX3ZlcnNpb24sIGtlcm5lbF92ZXJzaW9uOworCitleHRlcm4gaW50IHdhbnRfYnJhY2VfcGhyYXNlLCB3YW50X2V4cF9waHJhc2UsIGRpc2NhcmRfcGhyYXNlX2NvbnRlbnRzOworZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqY3VycmVudF9saXN0LCAqbmV4dF9saXN0OworCisKK3N0cnVjdCBzeW1ib2wgKmZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgbnMpOworc3RydWN0IHN5bWJvbCAqYWRkX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBlbnVtIHN5bWJvbF90eXBlIHR5cGUsCisJCQkgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlZm4sIGludCBpc19leHRlcm4pOwordm9pZCBleHBvcnRfc3ltYm9sKGNvbnN0IGNoYXIgKik7CisKK3N0cnVjdCBzdHJpbmdfbGlzdCAqcmVzZXRfbGlzdCh2b2lkKTsKK3ZvaWQgZnJlZV9saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqcywgc3RydWN0IHN0cmluZ19saXN0ICplKTsKK3ZvaWQgZnJlZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCk7CitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmNvcHlfbm9kZShzdHJ1Y3Qgc3RyaW5nX2xpc3QgKik7CitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmNvcHlfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMsIHN0cnVjdCBzdHJpbmdfbGlzdCAqZSk7CitpbnQgZXF1YWxfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmEsIHN0cnVjdCBzdHJpbmdfbGlzdCAqYik7Cit2b2lkIHByaW50X2xpc3QoRklMRSAqLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3QpOworCitpbnQgeXlsZXgodm9pZCk7CitpbnQgeXlwYXJzZSh2b2lkKTsKKwordm9pZCBlcnJvcl93aXRoX3Bvcyhjb25zdCBjaGFyICosIC4uLik7CisKKyNkZWZpbmUgdmVyc2lvbihhLGIsYykgICgoYSA8PCAxNikgfCAoYiA8PCA4KSB8IChjKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNT0RVVElMU19WRVJTSU9OICI8aW4ta2VybmVsPiIKKworI2RlZmluZSB4bWFsbG9jKHNpemUpICh7IHZvaWQgKl9fcHRyID0gbWFsbG9jKHNpemUpOwkJXAorCWlmKCFfX3B0ciAmJiBzaXplICE9IDApIHsJCQkJXAorCQlmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOwkJXAorCQlleGl0KDEpOwkJCQkJXAorCX0JCQkJCQkJXAorCV9fcHRyOyB9KQorI2RlZmluZSB4c3RyZHVwKHN0cikgICh7IGNoYXIgKl9fc3RyID0gc3RyZHVwKHN0cik7CQlcCisJaWYgKCFfX3N0cikgewkJCQkJCVwKKwkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsJCVwKKwkJZXhpdCgxKTsJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3N0cjsgfSkKKworI2VuZGlmIC8qIGdlbmtzeW1zLmggKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiYWY3NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuY19zaGlwcGVkCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDIuNy4yICovCisvKiBDb21tYW5kLWxpbmU6IGdwZXJmIC1MIEFOU0ktQyAtYSAtQyAtRSAtZyAtSCBpc19yZXNlcnZlZF9oYXNoIC1rICcxLDMsJCcgLU4gaXNfcmVzZXJ2ZWRfd29yZCAtcCAtdCBzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmICAqLworc3RydWN0IHJlc3dvcmQgeyBjb25zdCBjaGFyICpuYW1lOyBpbnQgdG9rZW47IH07CisvKiBtYXhpbXVtIGtleSByYW5nZSA9IDEwOSwgZHVwbGljYXRlcyA9IDAgKi8KKworI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2Vsc2UKKyNpZmRlZiBfX2NwbHVzcGx1cworaW5saW5lCisjZW5kaWYKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludAoraXNfcmVzZXJ2ZWRfaGFzaCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc3NvX3ZhbHVlc1tdID0KKyAgICB7CisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAgIDUsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAgIDAsIDExMywgMTEzLCAxMTMsCisgICAgICAgIDAsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgICAwLCAxMTMsICAgMCwgMTEzLCAgMjAsCisgICAgICAgMjUsICAgMCwgIDM1LCAgMzAsIDExMywgIDIwLCAxMTMsIDExMywgIDQwLCAgMzAsCisgICAgICAgMzAsICAgMCwgICAwLCAxMTMsICAgMCwgIDUxLCAgIDAsICAxNSwgICA1LCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzCisgICAgfTsKKyAgcmV0dXJuIGxlbiArIGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clsyXV0gKyBhc3NvX3ZhbHVlc1sodW5zaWduZWQgY2hhcilzdHJbMF1dICsgYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyW2xlbiAtIDFdXTsKK30KKworI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2VuZGlmCitjb25zdCBzdHJ1Y3QgcmVzd29yZCAqCitpc19yZXNlcnZlZF93b3JkIChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGVudW0KKyAgICB7CisgICAgICBUT1RBTF9LRVlXT1JEUyA9IDQxLAorICAgICAgTUlOX1dPUkRfTEVOR1RIID0gMywKKyAgICAgIE1BWF9XT1JEX0xFTkdUSCA9IDE3LAorICAgICAgTUlOX0hBU0hfVkFMVUUgPSA0LAorICAgICAgTUFYX0hBU0hfVkFMVUUgPSAxMTIKKyAgICB9OworCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzd29yZCB3b3JkbGlzdFtdID0KKyAgICB7CisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJhdXRvIiwgQVVUT19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sCisgICAgICB7Il9fYXNtX18iLCBBU01fS0VZV30sCisgICAgICB7IiJ9LAorICAgICAgeyJfcmVzdHJpY3QiLCBSRVNUUklDVF9LRVlXfSwKKyAgICAgIHsiX190eXBlb2ZfXyIsIFRZUEVPRl9LRVlXfSwKKyAgICAgIHsiX19hdHRyaWJ1dGUiLCBBVFRSSUJVVEVfS0VZV30sCisgICAgICB7Il9fcmVzdHJpY3RfXyIsIFJFU1RSSUNUX0tFWVd9LAorICAgICAgeyJfX2F0dHJpYnV0ZV9fIiwgQVRUUklCVVRFX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiX192b2xhdGlsZSIsIFZPTEFUSUxFX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiX192b2xhdGlsZV9fIiwgVk9MQVRJTEVfS0VZV30sCisgICAgICB7IkVYUE9SVF9TWU1CT0wiLCBFWFBPUlRfU1lNQk9MX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsiRVhQT1JUX1NZTUJPTF9HUEwiLCBFWFBPUlRfU1lNQk9MX0tFWVd9LAorICAgICAgeyJpbnQiLCBJTlRfS0VZV30sCisgICAgICB7ImNoYXIiLCBDSEFSX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwKKyAgICAgIHsiX19jb25zdCIsIENPTlNUX0tFWVd9LAorICAgICAgeyJfX2lubGluZSIsIElOTElORV9LRVlXfSwKKyAgICAgIHsiX19jb25zdF9fIiwgQ09OU1RfS0VZV30sCisgICAgICB7Il9faW5saW5lX18iLCBJTkxJTkVfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJfX2FzbSIsIEFTTV9LRVlXfSwKKyAgICAgIHsiZXh0ZXJuIiwgRVhURVJOX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsicmVnaXN0ZXIiLCBSRUdJU1RFUl9LRVlXfSwKKyAgICAgIHsiIn0sCisgICAgICB7ImZsb2F0IiwgRkxPQVRfS0VZV30sCisgICAgICB7InR5cGVvZiIsIFRZUEVPRl9LRVlXfSwKKyAgICAgIHsidHlwZWRlZiIsIFRZUEVERUZfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LAorICAgICAgeyJfQm9vbCIsIEJPT0xfS0VZV30sCisgICAgICB7ImRvdWJsZSIsIERPVUJMRV9LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sCisgICAgICB7ImVudW0iLCBFTlVNX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsidm9sYXRpbGUiLCBWT0xBVElMRV9LRVlXfSwKKyAgICAgIHsidm9pZCIsIFZPSURfS0VZV30sCisgICAgICB7ImNvbnN0IiwgQ09OU1RfS0VZV30sCisgICAgICB7InNob3J0IiwgU0hPUlRfS0VZV30sCisgICAgICB7InN0cnVjdCIsIFNUUlVDVF9LRVlXfSwKKyAgICAgIHsiIn0sCisgICAgICB7InJlc3RyaWN0IiwgUkVTVFJJQ1RfS0VZV30sCisgICAgICB7IiJ9LAorICAgICAgeyJfX3NpZ25lZF9fIiwgU0lHTkVEX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiYXNtIiwgQVNNX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwKKyAgICAgIHsiaW5saW5lIiwgSU5MSU5FX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsidW5pb24iLCBVTklPTl9LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InN0YXRpYyIsIFNUQVRJQ19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7Il9fc2lnbmVkIiwgU0lHTkVEX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InVuc2lnbmVkIiwgVU5TSUdORURfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJsb25nIiwgTE9OR19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InNpZ25lZCIsIFNJR05FRF9LRVlXfQorICAgIH07CisKKyAgaWYgKGxlbiA8PSBNQVhfV09SRF9MRU5HVEggJiYgbGVuID49IE1JTl9XT1JEX0xFTkdUSCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQga2V5ID0gaXNfcmVzZXJ2ZWRfaGFzaCAoc3RyLCBsZW4pOworCisgICAgICBpZiAoa2V5IDw9IE1BWF9IQVNIX1ZBTFVFICYmIGtleSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHdvcmRsaXN0W2tleV0ubmFtZTsKKworICAgICAgICAgIGlmICgqc3RyID09ICpzICYmICFzdHJjbXAgKHN0ciArIDEsIHMgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAmd29yZGxpc3Rba2V5XTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJlYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZgpAQCAtMCwwICsxLDUwIEBACisleworJX0KK3N0cnVjdCByZXN3b3JkIHsgY29uc3QgY2hhciAqbmFtZTsgaW50IHRva2VuOyB9CislJQorRVhQT1JUX1NZTUJPTCwgRVhQT1JUX1NZTUJPTF9LRVlXCitFWFBPUlRfU1lNQk9MX0dQTCwgRVhQT1JUX1NZTUJPTF9LRVlXCitfX2FzbSwgQVNNX0tFWVcKK19fYXNtX18sIEFTTV9LRVlXCitfX2F0dHJpYnV0ZSwgQVRUUklCVVRFX0tFWVcKK19fYXR0cmlidXRlX18sIEFUVFJJQlVURV9LRVlXCitfX2NvbnN0LCBDT05TVF9LRVlXCitfX2NvbnN0X18sIENPTlNUX0tFWVcKK19faW5saW5lLCBJTkxJTkVfS0VZVworX19pbmxpbmVfXywgSU5MSU5FX0tFWVcKK19fc2lnbmVkLCBTSUdORURfS0VZVworX19zaWduZWRfXywgU0lHTkVEX0tFWVcKK19fdm9sYXRpbGUsIFZPTEFUSUxFX0tFWVcKK19fdm9sYXRpbGVfXywgVk9MQVRJTEVfS0VZVworIyBBY2NvcmRpbmcgdG8gcnRoLCBjOTkgZGVmaW5lcyBfQm9vbCwgX19yZXN0cmljdCwgX19yZXN0cmljdF9fLCByZXN0cmljdC4gIEtBTworX0Jvb2wsIEJPT0xfS0VZVworX3Jlc3RyaWN0LCBSRVNUUklDVF9LRVlXCitfX3Jlc3RyaWN0X18sIFJFU1RSSUNUX0tFWVcKK3Jlc3RyaWN0LCBSRVNUUklDVF9LRVlXCithc20sIEFTTV9LRVlXCisjIGF0dHJpYnV0ZSBjb21tZW50ZWQgb3V0IGluIG1vZHV0aWxzIDIuNC4yLiAgUGVvcGxlIGFyZSB1c2luZyAnYXR0cmlidXRlJyBhcyBhCisjIGZpZWxkIG5hbWUgd2hpY2ggYnJlYWtzIHRoZSBnZW5rc3ltcyBwYXJzZXIuICBJdCBpcyBub3QgYSBnY2Mga2V5d29yZCBhbnl3YXkuCisjIEtBTy4KKyMgICBhdHRyaWJ1dGUsIEFUVFJJQlVURV9LRVlXCithdXRvLCBBVVRPX0tFWVcKK2NoYXIsIENIQVJfS0VZVworY29uc3QsIENPTlNUX0tFWVcKK2RvdWJsZSwgRE9VQkxFX0tFWVcKK2VudW0sIEVOVU1fS0VZVworZXh0ZXJuLCBFWFRFUk5fS0VZVworZmxvYXQsIEZMT0FUX0tFWVcKK2lubGluZSwgSU5MSU5FX0tFWVcKK2ludCwgSU5UX0tFWVcKK2xvbmcsIExPTkdfS0VZVworcmVnaXN0ZXIsIFJFR0lTVEVSX0tFWVcKK3Nob3J0LCBTSE9SVF9LRVlXCitzaWduZWQsIFNJR05FRF9LRVlXCitzdGF0aWMsIFNUQVRJQ19LRVlXCitzdHJ1Y3QsIFNUUlVDVF9LRVlXCit0eXBlZGVmLCBUWVBFREVGX0tFWVcKK3VuaW9uLCBVTklPTl9LRVlXCit1bnNpZ25lZCwgVU5TSUdORURfS0VZVwordm9pZCwgVk9JRF9LRVlXCit2b2xhdGlsZSwgVk9MQVRJTEVfS0VZVwordHlwZW9mLCBUWVBFT0ZfS0VZVworX190eXBlb2ZfXywgVFlQRU9GX0tFWVcKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmNfc2hpcHBlZCBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJmYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXguY19zaGlwcGVkCkBAIC0wLDAgKzEsMjA4NCBAQAorI2xpbmUgMiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKKy8qIEEgbGV4aWNhbCBzY2FubmVyIGdlbmVyYXRlZCBieSBmbGV4ICovCisKKy8qIFNjYW5uZXIgc2tlbGV0b24gdmVyc2lvbjoKKyAqICRIZWFkZXI6IC9ob21lL2RhZmZ5L3UwL3Zlcm4vZmxleC9SQ1MvZmxleC5za2wsdiAyLjkxIDk2LzA5LzEwIDE2OjU4OjQ4IHZlcm4gRXhwICQKKyAqLworCisjZGVmaW5lIEZMRVhfU0NBTk5FUgorI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCisvKiBjZnJvbnQgMS4yIGRlZmluZXMgImNfcGx1c3BsdXMiIGluc3RlYWQgb2YgIl9fY3BsdXNwbHVzIiAqLworI2lmZGVmIGNfcGx1c3BsdXMKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19jcGx1c3BsdXMKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogVXNlIHByb3RvdHlwZXMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAqLworI2RlZmluZSBZWV9VU0VfUFJPVE9TCisKKy8qIFRoZSAiY29uc3QiIHN0b3JhZ2UtY2xhc3MtbW9kaWZpZXIgaXMgdmFsaWQuICovCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZiBfX1NURENfXworCisjZGVmaW5lIFlZX1VTRV9QUk9UT1MKKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbmRpZgkvKiBfX1NURENfXyAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIF9fVFVSQk9DX18KKyAjcHJhZ21hIHdhcm4gLXJjaAorICNwcmFnbWEgd2FybiAtdXNlCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisjZGVmaW5lIFlZX1VTRV9QUk9UT1MKKyNlbmRpZgorCisjaWZkZWYgWVlfVVNFX0NPTlNUCisjZGVmaW5lIHl5Y29uc3QgY29uc3QKKyNlbHNlCisjZGVmaW5lIHl5Y29uc3QKKyNlbmRpZgorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCisjZGVmaW5lIFlZX1BST1RPKHByb3RvKSBwcm90bworI2Vsc2UKKyNkZWZpbmUgWVlfUFJPVE8ocHJvdG8pICgpCisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKKyAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcworICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KKyAqLworI2RlZmluZSBCRUdJTiB5eV9zdGFydCA9IDEgKyAyICoKKworLyogVHJhbnNsYXRlIHRoZSBjdXJyZW50IHN0YXJ0IHN0YXRlIGludG8gYSB2YWx1ZSB0aGF0IGNhbiBiZSBsYXRlciBoYW5kZWQKKyAqIHRvIEJFR0lOIHRvIHJldHVybiB0byB0aGUgc3RhdGUuICBUaGUgWVlTVEFURSBhbGlhcyBpcyBmb3IgbGV4CisgKiBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIFlZX1NUQVJUICgoeXlfc3RhcnQgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgeXlyZXN0YXJ0KCB5eWluICkKKworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAorCisvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLworI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAorCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKworZXh0ZXJuIGludCB5eWxlbmc7CitleHRlcm4gRklMRSAqeXlpbiwgKnl5b3V0OworCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisvKiBUaGUgZnVua3kgZG8td2hpbGUgaW4gdGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIHVzZWQgdG8gdHVybiB0aGUgZGVmaW5pdGlvbgorICogaW50IGEgc2luZ2xlIEMgc3RhdGVtZW50ICh3aGljaCBuZWVkcyBhIHNlbWktY29sb24gdGVybWluYXRvcikuICBUaGlzCisgKiBhdm9pZHMgcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6CisgKgorICogCWlmICggY29uZGl0aW9uX2hvbGRzICkKKyAqCQl5eWxlc3MoIDUgKTsKKyAqCWVsc2UKKyAqCQlkb19zb21ldGhpbmdfZWxzZSgpOworICoKKyAqIFByaW9yIHRvIHVzaW5nIHRoZSBkby13aGlsZSB0aGUgY29tcGlsZXIgd291bGQgZ2V0IHVwc2V0IGF0IHRoZQorICogImVsc2UiIGJlY2F1c2UgaXQgaW50ZXJwcmV0ZWQgdGhlICJpZiIgc3RhdGVtZW50IGFzIGJlaW5nIGFsbAorICogZG9uZSB3aGVuIGl0IHJlYWNoZWQgdGhlICc7JyBhZnRlciB0aGUgeXlsZXNzKCkgY2FsbC4KKyAqLworCisvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgJ24nIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCisKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOyBcCisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQgXAorCQl5eV9jX2J1Zl9wID0geXlfY3AgPSB5eV9icCArIG4gLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgeXl0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCB5eXRleHRfcHRyICkKKworLyogVGhlIGZvbGxvd2luZyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBwb3J0YWJseSBnZXQgb3VyIGhhbmRzIG9uIHNpemVfdAorICogKHdpdGhvdXQgYXV0b2NvbmYncyBoZWxwLCB3aGljaCBpc24ndCBhdmFpbGFibGUgYmVjYXVzZSB3ZSB3YW50CisgKiBmbGV4LWdlbmVyYXRlZCBzY2FubmVycyB0byBjb21waWxlIG9uIHRoZWlyIG93bikuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHl5X3NpemVfdDsKKworCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworI2RlZmluZSBZWV9CVUZGRVJfTkVXIDAKKyNkZWZpbmUgWVlfQlVGRkVSX05PUk1BTCAxCisJLyogV2hlbiBhbiBFT0YncyBiZWVuIHNlZW4gYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSB0ZXh0IHRvIHByb2Nlc3MKKwkgKiB0aGVuIHdlIG1hcmsgdGhlIGJ1ZmZlciBhcyBZWV9FT0ZfUEVORElORywgdG8gaW5kaWNhdGUgdGhhdCB3ZQorCSAqIHNob3VsZG4ndCB0cnkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW55IG1vcmUuICBXZSBtaWdodAorCSAqIHN0aWxsIGhhdmUgYSBidW5jaCBvZiB0b2tlbnMgdG8gbWF0Y2gsIHRob3VnaCwgYmVjYXVzZSBvZgorCSAqIHBvc3NpYmxlIGJhY2tpbmctdXAuCisJICoKKwkgKiBXaGVuIHdlIGFjdHVhbGx5IHNlZSB0aGUgRU9GLCB3ZSBjaGFuZ2UgdGhlIHN0YXR1cyB0byAibmV3IgorCSAqICh2aWEgeXlyZXN0YXJ0KCkpLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb250aW51ZSBzY2FubmluZyBieQorCSAqIGp1c3QgcG9pbnRpbmcgeXlpbiBhdCBhIG5ldyBpbnB1dCBmaWxlLgorCSAqLworI2RlZmluZSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgMgorCX07CisKK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgeXlfY3VycmVudF9idWZmZXIgPSAwOworCisvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKKyAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAorICogInNjYW5uZXIgc3RhdGUiLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSIHl5X2N1cnJlbnRfYnVmZmVyCisKKworLyogeXlfaG9sZF9jaGFyIGhvbGRzIHRoZSBjaGFyYWN0ZXIgbG9zdCB3aGVuIHl5dGV4dCBpcyBmb3JtZWQuICovCitzdGF0aWMgY2hhciB5eV9ob2xkX2NoYXI7CisKK3N0YXRpYyBpbnQgeXlfbl9jaGFyczsJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYgKi8KKworCitpbnQgeXlsZW5nOworCisvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworc3RhdGljIGludCB5eV9pbml0ID0gMTsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X3N0YXJ0ID0gMDsJLyogc3RhcnQgc3RhdGUgbnVtYmVyICovCisKKy8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyB5eXdyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcworICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggeXlpbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KKyAqLworc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisKK3ZvaWQgeXlyZXN0YXJ0IFlZX1BST1RPKCggRklMRSAqaW5wdXRfZmlsZSApKTsKKwordm9pZCB5eV9zd2l0Y2hfdG9fYnVmZmVyIFlZX1BST1RPKCggWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKSk7Cit2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlIFlZX1BST1RPKCggdm9pZCApKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9jcmVhdGVfYnVmZmVyIFlZX1BST1RPKCggRklMRSAqZmlsZSwgaW50IHNpemUgKSk7Cit2b2lkIHl5X2RlbGV0ZV9idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgYiApKTsKK3ZvaWQgeXlfaW5pdF9idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgYiwgRklMRSAqZmlsZSApKTsKK3ZvaWQgeXlfZmx1c2hfYnVmZmVyIFlZX1BST1RPKCggWVlfQlVGRkVSX1NUQVRFIGIgKSk7CisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiB5eV9mbHVzaF9idWZmZXIoIHl5X2N1cnJlbnRfYnVmZmVyICkKKworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyIFlZX1BST1RPKCggY2hhciAqYmFzZSwgeXlfc2l6ZV90IHNpemUgKSk7CitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcgWVlfUFJPVE8oKCB5eWNvbnN0IGNoYXIgKnl5X3N0ciApKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzIFlZX1BST1RPKCggeXljb25zdCBjaGFyICpieXRlcywgaW50IGxlbiApKTsKKworc3RhdGljIHZvaWQgKnl5X2ZsZXhfYWxsb2MgWVlfUFJPVE8oKCB5eV9zaXplX3QgKSk7CitzdGF0aWMgdm9pZCAqeXlfZmxleF9yZWFsbG9jIFlZX1BST1RPKCggdm9pZCAqLCB5eV9zaXplX3QgKSk7CitzdGF0aWMgdm9pZCB5eV9mbGV4X2ZyZWUgWVlfUFJPVE8oKCB2b2lkICogKSk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciB5eV9jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIHl5X2N1cnJlbnRfYnVmZmVyICkgXAorCQl5eV9jdXJyZW50X2J1ZmZlciA9IHl5X2NyZWF0ZV9idWZmZXIoIHl5aW4sIFlZX0JVRl9TSVpFICk7IFwKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApIFwKKwkJeXlfY3VycmVudF9idWZmZXIgPSB5eV9jcmVhdGVfYnVmZmVyKCB5eWluLCBZWV9CVUZfU0laRSApOyBcCisJeXlfY3VycmVudF9idWZmZXItPnl5X2F0X2JvbCA9IGF0X2JvbDsgXAorCX0KKworI2RlZmluZSBZWV9BVF9CT0woKSAoeXlfY3VycmVudF9idWZmZXItPnl5X2F0X2JvbCkKKworCisjZGVmaW5lIHl5d3JhcCgpIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKworI2RlZmluZSBGTEVYX0RFQlVHCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKK0ZJTEUgKnl5aW4gPSAoRklMRSAqKSAwLCAqeXlvdXQgPSAoRklMRSAqKSAwOwordHlwZWRlZiBpbnQgeXlfc3RhdGVfdHlwZTsKKworI2RlZmluZSBGTEVYX0RFQlVHCitleHRlcm4gY2hhciAqeXl0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHl5dGV4dAorCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgWVlfUFJPVE8oKCB2b2lkICkpOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyBZWV9QUk9UTygoIHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSApKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyIFlZX1BST1RPKCggdm9pZCApKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yIFlZX1BST1RPKCggeXljb25zdCBjaGFyIG1zZ1tdICkpOworCisvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQorICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHl5dGV4dC4KKyAqLworI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKKwl5eXRleHRfcHRyID0geXlfYnA7IFwKKwl5eWxlbmcgPSAoaW50KSAoeXlfY3AgLSB5eV9icCk7IFwKKwl5eV9ob2xkX2NoYXIgPSAqeXlfY3A7IFwKKwkqeXlfY3AgPSAnXDAnOyBcCisJeXlfY19idWZfcCA9IHl5X2NwOworCisjZGVmaW5lIFlZX05VTV9SVUxFUyAxMworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDE0CitzdGF0aWMgeXljb25zdCBzaG9ydCBpbnQgeXlfYWNjZXB0Wzc2XSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgMTQsICAgMTIsICAgIDQsICAgIDMsICAgMTIsICAgIDcsCisgICAgICAgMTIsICAgMTIsICAgIDcsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgIDksICAgIDksCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgIDQsICAgIDAsICAgIDUsICAgIDAsICAgIDcsICAgIDAsICAgIDYsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDIsICAgIDgsICAgMTAsICAgMTAsCisgICAgICAgIDksICAgIDAsICAgIDAsICAgIDksICAgIDksICAgIDAsICAgIDksICAgIDAsICAgIDAsICAgMTEsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgIDAsICAgMTAsICAgIDksICAgIDksICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgMTAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDEsICAgIDAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgaW50IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICA0LCAgICA0LCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICAxLCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgICAxLAorICAgICAgICAxLCAgICA4LCAgIDExLCAgICAxLCAgIDEyLCAgIDEzLCAgICA4LCAgIDE0LCAgIDE1LCAgIDE1LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LCAgIDE2LCAgICAxLCAgICAxLCAgIDE3LAorICAgICAgIDE4LCAgIDE5LCAgICAxLCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIyLAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDIzLCAgICA3LCAgICA3LCAgICA3LCAgICA3LAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDI0LCAgICA3LCAgICA3LCAgIDI1LCAgICA3LCAgICA3LAorICAgICAgICAxLCAgIDI2LCAgICAxLCAgICA4LCAgICA3LCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAorCisgICAgICAgMjEsICAgMjIsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjcsICAgIDcsICAgIDcsCisgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjQsICAgIDcsICAgIDcsICAgMjUsCisgICAgICAgIDcsICAgIDcsICAgIDEsICAgMjgsICAgIDEsICAgIDgsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBpbnQgeXlfbWV0YVsyOV0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICAxLCAgICAxLCAgICAxLCAgICA3LAorICAgICAgICA4LCAgICA3LCAgICAzLCAgICAzLCAgICAzLCAgICAxLCAgICAzLCAgICAxCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9iYXNlWzg4XSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAxNDcsICAgMjEsICAxNDAsICAxNDUsICAyODQsICAgMzksICAyODQsICAgMjYsICAgIDAsCisgICAgICAgMzIsICAxMjYsICAgNDAsICAgNDQsICAxMTUsICAgMzUsICAgMzYsICAgNDYsICAgNTAsICAgNTMsCisgICAgICAgMzksICAgNjEsICAgNTQsICAgNzksICAgNjUsICAyODQsICAgIDAsICAgIDAsICAgNjYsICAyODQsCisgICAgICAgIDAsICAxMTksICAgNzksICAgNzUsICAxMjMsICAxMDQsICAyODQsICAyODQsICAxMDcsICAgIDAsCisgICAgICAgNzksICAgNzMsICAgNzYsICAgNzYsICAgNjYsICAgIDAsICAgIDAsICAgODUsICAgODYsICAyODQsCisgICAgICAxMzMsICAgODMsICAgOTEsICAyODQsICAgOTksICAxNDcsICAyODQsICAxMTQsICAxMjIsICAgNzAsCisgICAgICAxMDcsICAxNDEsICAxNzIsICAxNTEsICAxMzUsICAxODEsICAyODQsICAxMzcsICAxMTQsICAxNTcsCisgICAgICAxNDksICAgNDgsICAgNDUsICAyODQsICAyODQsICAyMDgsICAyMTQsICAyMjIsICAyMzAsICAyMzgsCisgICAgICAyNDYsICAyNTAsICAyNTUsICAyNTYsICAyNjEsICAyNjcsICAyNzUKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3Qgc2hvcnQgaW50IHl5X2RlZls4OF0gPQorICAgIHsgICAwLAorICAgICAgIDc1LCAgICAxLCAgICAxLCAgICAzLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc2LCAgIDc3LAorICAgICAgIDc4LCAgIDc1LCAgIDc3LCAgIDc5LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDE5LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc2LCAgIDc1LCAgIDgwLCAgIDc3LCAgIDc4LCAgIDc1LAorICAgICAgIDgxLCAgIDc1LCAgIDc2LCAgIDc4LCAgIDc5LCAgIDc5LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDM5LAorICAgICAgIDE5LCAgIDgyLCAgIDgzLCAgIDc1LCAgIDc1LCAgIDg0LCAgIDIwLCAgIDc2LCAgIDc4LCAgIDc1LAorICAgICAgIDc5LCAgIDUxLCAgIDg1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDg0LCAgIDc5LCAgIDUxLAorICAgICAgIDc5LCAgIDc5LCAgIDc5LCAgIDUxLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDg2LCAgIDc5LCAgIDYzLAorICAgICAgIDg2LCAgIDg3LCAgIDg3LCAgIDc1LCAgICAwLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1CisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9ueHRbMzEzXSA9CisgICAgeyAgIDAsCisgICAgICAgIDYsICAgIDcsICAgIDgsICAgIDcsICAgIDksICAgIDYsICAgMTAsICAgIDYsICAgIDYsICAgMTEsCisgICAgICAgIDYsICAgIDYsICAgMTIsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgMTAsCisgICAgICAgMTAsICAgMTAsICAgMTMsICAgMTAsICAgMTAsICAgIDYsICAgMTAsICAgIDYsICAgMTUsICAgMTYsCisgICAgICAgMjYsICAgMTUsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjAsICAgMjEsICAgMTUsICAgMjIsCisgICAgICAgMjQsICAgMzAsICAgMjQsICAgMzgsICAgMzMsICAgMzYsICAgMzcsICAgNzQsICAgMjMsICAgMzQsCisgICAgICAgNzQsICAgMjcsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgMzEsICAgMzIsICAgMzksCisgICAgICAgMzksICAgMzksICAgNDAsICAgNDEsICAgNDEsICAgNDIsICAgNDcsICAgNDcsICAgNDcsICAgMjYsCisgICAgICAgNDMsICAgMzgsICAgNDQsICAgNDUsICAgNDYsICAgMzAsICAgNDQsICAgNzUsICAgMzgsICAgMzgsCisgICAgICAgMjQsICAgMzgsICAgMjQsICAgMjYsICAgMzAsICAgNDAsICAgNTUsICAgNTUsICAgNTcsICAgMjYsCisgICAgICAgMjcsICAgMzEsICAgNTcsICAgNDMsICAgMzUsICAgMzAsICAgNjQsICAgNjQsICAgNjQsICAgNTcsCisKKyAgICAgICAzMSwgICA2NSwgICA2NSwgICA3NSwgICAyNywgICAzNiwgICAzNywgICAzNSwgICA1OSwgICAzNywKKyAgICAgICAyNywgICAzMSwgICA1NiwgICA1NiwgICA1NiwgICA1OSwgICAzNywgICA1MSwgICA1MiwgICA1MiwKKyAgICAgICAzOSwgICAzOSwgICAzOSwgICA1OSwgICAzNywgICAzNywgICA2OCwgICA1MywgICA1NCwgICA1NCwKKyAgICAgICA2OSwgICA1MCwgICAzOCwgICA1NCwgICA1OSwgICAzNywgICA0NCwgICA0NSwgICAzMiwgICAzNywKKyAgICAgICA0NCwgICAzNSwgICA1OSwgICAzNywgICA3NSwgICAxNCwgICA2MCwgICA2MCwgICA2NiwgICA2NiwKKyAgICAgICA2NiwgICAzNywgICAxNCwgICA3MiwgICA3NSwgICA2MSwgICA2MiwgICA2MywgICA1OSwgICA2MSwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA2OSwgICA2NCwgICA2NCwgICA2NCwgICA2OSwgICA2NywgICA2NywKKyAgICAgICA3NSwgICA3NSwgICA3NSwgICA2NywgICAzNywgICAzNSwgICA3NSwgICA3NSwgICA3NSwgICA2MSwKKyAgICAgICA2MiwgICA3NSwgICA3NSwgICA2MSwgICA3NSwgICA3MCwgICA3MCwgICA3MCwgICA3NSwgICA3NSwKKyAgICAgICA3NSwgICA3MCwgICA3MCwgICA3MCwgICA2NiwgICA2NiwgICA2NiwgICA3NSwgICA3NSwgICA3NSwKKworICAgICAgIDc1LCAgIDc1LCAgIDU0LCAgIDU0LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDU0LCAgIDI1LCAgIDI1LAorICAgICAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI4LCAgIDc1LCAgIDc1LCAgIDI4LAorICAgICAgIDI4LCAgIDI4LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDQ4LCAgIDc1LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ5LCAgIDc1LCAgIDQ5LCAgIDQ5LAorICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQyLCAgIDQyLCAgIDc1LCAgIDQyLCAgIDU2LCAgIDc1LAorICAgICAgIDU2LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDY2LCAgIDc1LCAgIDY2LCAgIDcxLCAgIDcxLCAgIDcxLAorICAgICAgIDcxLCAgIDcxLCAgIDcxLCAgIDcxLCAgIDcxLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLAorICAgICAgIDczLCAgIDczLCAgIDczLCAgICA1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorCisgICAgICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisgICAgICAgNzUsICAgNzUKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3Qgc2hvcnQgaW50IHl5X2Noa1szMTNdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMywgICAgMywKKyAgICAgICAgOSwgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywKKyAgICAgICAgNywgICAxMSwgICAgNywgICAxNiwgICAxMywgICAxNCwgICAxNCwgICA3MywgICAgMywgICAxMywKKyAgICAgICA3MiwgICAgOSwgICAxNiwgICAxNywgICAxNywgICAyMSwgICAyMSwgICAxMSwgICAxOCwgICAxOCwKKyAgICAgICAxOCwgICAxOCwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAyMCwgICAyMCwgICAyMCwgICAyNSwKKyAgICAgICAxOSwgICAyMywgICAxOSwgICAxOSwgICAxOSwgICAyOSwgICAxOSwgICAyMCwgICAyMiwgICAyMiwKKyAgICAgICAyNCwgICAyMywgICAyNCwgICAzMywgICAzNCwgICA0MiwgICA0MywgICA0MywgICA0NSwgICA0OCwKKyAgICAgICAyNSwgICAyOSwgICA0NSwgICA0MiwgICA2MCwgICA0OSwgICA1MiwgICA1MiwgICA1MiwgICA0NCwKKworICAgICAgIDM0LCAgIDUzLCAgIDUzLCAgIDQxLCAgIDMzLCAgIDM2LCAgIDM2LCAgIDUyLCAgIDYxLCAgIDYxLAorICAgICAgIDQ4LCAgIDQ5LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDY5LCAgIDY5LCAgIDM2LCAgIDM2LCAgIDM2LAorICAgICAgIDM5LCAgIDM5LCAgIDM5LCAgIDU5LCAgIDU5LCAgIDM1LCAgIDU5LCAgIDM5LCAgIDM5LCAgIDM5LAorICAgICAgIDYxLCAgIDMyLCAgIDE1LCAgIDM5LCAgIDUxLCAgIDUxLCAgIDU4LCAgIDU4LCAgIDEyLCAgIDY4LAorICAgICAgIDU4LCAgIDY4LCAgIDYyLCAgIDYyLCAgICA1LCAgICA0LCAgIDUxLCAgIDUxLCAgIDY1LCAgIDY1LAorICAgICAgIDY1LCAgIDcxLCAgICAyLCAgIDcxLCAgICAwLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDcwLCAgIDUxLAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDYyLCAgIDY0LCAgIDY0LCAgIDY0LCAgIDYyLCAgIDU2LCAgIDU2LAorICAgICAgICAwLCAgICAwLCAgICAwLCAgIDU2LCAgIDYzLCAgIDY0LCAgICAwLCAgICAwLCAgICAwLCAgIDcwLAorICAgICAgIDcwLCAgICAwLCAgICAwLCAgIDcwLCAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgIDY2LCAgIDY2LCAgIDY2LCAgICAwLCAgICAwLCAgICAwLAorCisgICAgICAgIDAsICAgIDAsICAgNjYsICAgNjYsICAgIDAsICAgIDAsICAgIDAsICAgNjYsICAgNzYsICAgNzYsCisgICAgICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzcsICAgIDAsICAgIDAsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsCisgICAgICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgODAsICAgIDAsCisgICAgICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODEsICAgIDAsICAgODEsICAgODEsCisgICAgICAgODEsICAgODEsICAgODEsICAgODEsICAgODIsICAgODIsICAgIDAsICAgODIsICAgODMsICAgIDAsCisgICAgICAgODMsICAgODQsICAgODQsICAgODQsICAgODUsICAgIDAsICAgODUsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODcsICAgODcsICAgODcsICAgODcsICAgODcsCisgICAgICAgODcsICAgODcsICAgODcsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisgICAgICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisKKyAgICAgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwKKyAgICAgICA3NSwgICA3NQorICAgIH0gOworCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKK3N0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCitleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CitpbnQgeXlfZmxleF9kZWJ1ZyA9IDE7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9ydWxlX2xpbmVudW1bMTNdID0KKyAgICB7ICAgMCwKKyAgICAgICA2OSwgICA3MCwgICA3MSwgICA3NCwgICA3NywgICA3OCwgICA3OSwgICA4NSwgICA4NiwgICA4NywKKyAgICAgICA4OSwgICA5MgorICAgIH0gOworCisvKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAorICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgorICovCisjZGVmaW5lIFJFSkVDVCByZWplY3RfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIHl5bW9yZSgpIHl5bW9yZV91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgWVlfTU9SRV9BREogMAorI2RlZmluZSBZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCitjaGFyICp5eXRleHQ7CisjbGluZSAxICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgorI2RlZmluZSBJTklUSUFMIDAKKy8qIExleGljYWwgYW5hbHlzaXMgZm9yIGdlbmtzeW1zLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGFrZW4gZnJvbSBMaW51eCBtb2R1dGlscyAyLjQuMjIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisjbGluZSAyNSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisKKy8qIFdlJ3ZlIGdvdCBhIHR3by1sZXZlbCBsZXhlciBoZXJlLiAgV2UgbGV0IGZsZXggZG8gYmFzaWMgdG9rZW5pemF0aW9uCisgICBhbmQgdGhlbiB3ZSBjYXRlZ29yaXplIHRob3NlIGJhc2ljIHRva2VucyBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgKi8KKyNkZWZpbmUgWVlfREVDTAkJc3RhdGljIGludCB5eWxleDEodm9pZCkKKworLyogVmVyc2lvbiAyIGNoZWNrc3VtbWluZyBkb2VzIHByb3BlciB0b2tlbml6YXRpb247IHZlcnNpb24gMSB3YXNuJ3QKKyAgIHF1aXRlIHNvIHBlZGFudGljLiAgKi8KKyNkZWZpbmUgVjJfVE9LRU5TIDEKKworLyogV2UgZG9uJ3QgZG8gbXVsdGlwbGUgaW5wdXQgZmlsZXMuICAqLworI2xpbmUgNTEzICJzY3JpcHRzL2dlbmtzeW1zL2xleC5jIgorCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgeXl3cmFwIFlZX1BST1RPKCggdm9pZCApKTsKKyNlbHNlCitleHRlcm4gaW50IHl5d3JhcCBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX1VOUFVUCitzdGF0aWMgdm9pZCB5eXVucHV0IFlZX1BST1RPKCggaW50IGMsIGNoYXIgKmJ1Zl9wdHIgKSk7CisjZW5kaWYKKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgWVlfUFJPVE8oKCBjaGFyICosIHl5Y29uc3QgY2hhciAqLCBpbnQgKSk7CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuIFlZX1BST1RPKCggeXljb25zdCBjaGFyICogKSk7CisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIFlZX1NUQUNLX1VTRUQKK3N0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfcHRyID0gMDsKK3N0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfZGVwdGggPSAwOworc3RhdGljIGludCAqeXlfc3RhcnRfc3RhY2sgPSAwOworI2lmbmRlZiBZWV9OT19QVVNIX1NUQVRFCitzdGF0aWMgdm9pZCB5eV9wdXNoX3N0YXRlIFlZX1BST1RPKCggaW50IG5ld19zdGF0ZSApKTsKKyNlbmRpZgorI2lmbmRlZiBZWV9OT19QT1BfU1RBVEUKK3N0YXRpYyB2b2lkIHl5X3BvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKyNpZm5kZWYgWVlfTk9fVE9QX1NUQVRFCitzdGF0aWMgaW50IHl5X3RvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUgWVlfTk9fUFVTSF9TVEFURSAxCisjZGVmaW5lIFlZX05PX1BPUF9TVEFURSAxCisjZGVmaW5lIFlZX05PX1RPUF9TVEFURSAxCisjZW5kaWYKKworI2lmZGVmIFlZX01BTExPQ19ERUNMCitZWV9NQUxMT0NfREVDTAorI2Vsc2UKKyNpZiBfX1NURENfXworI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjZWxzZQorLyogSnVzdCB0cnkgdG8gZ2V0IGJ5IHdpdGhvdXQgZGVjbGFyaW5nIHRoZSByb3V0aW5lcy4gIFRoaXMgd2lsbCBmYWlsCisgKiBtaXNlcmFibHkgb24gbm9uLUFOU0kgc3lzdGVtcyBmb3Igd2hpY2ggc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGludCkKKyAqIG9yIHNpemVvZih2b2lkKikgIT0gc2l6ZW9mKGludCkuCisgKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KKyNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQorI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZgorCisvKiBDb3B5IHdoYXRldmVyIHRoZSBsYXN0IHJ1bGUgbWF0Y2hlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAqLworCisjaWZuZGVmIEVDSE8KKy8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAorICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KKyAqLworI2RlZmluZSBFQ0hPICh2b2lkKSBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWlmICggeXlfY3VycmVudF9idWZmZXItPnl5X2lzX2ludGVyYWN0aXZlICkgXAorCQl7IFwKKwkJaW50IGMgPSAnKicsIG47IFwKKwkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCisJCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCisJCQlidWZbbl0gPSAoY2hhcikgYzsgXAorCQlpZiAoIGMgPT0gJ1xuJyApIFwKKwkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKKwkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQlyZXN1bHQgPSBuOyBcCisJCX0gXAorCWVsc2UgaWYgKCAoKHJlc3VsdCA9IGZyZWFkKCBidWYsIDEsIG1heF9zaXplLCB5eWluICkpID09IDApIFwKKwkJICAmJiBmZXJyb3IoIHl5aW4gKSApIFwKKwkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4IFlZX1BST1RPKCggdm9pZCApKQorI2VuZGlmCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlpZiAoIHl5bGVuZyA+IDAgKSBcCisJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9hdF9ib2wgPSBcCisJCQkJKHl5dGV4dFt5eWxlbmcgLSAxXSA9PSAnXG4nKTsgXAorCVlZX1VTRVJfQUNUSU9OCisKK1lZX0RFQ0wKKwl7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0gTlVMTCwgKnl5X2JwID0gTlVMTDsKKwlyZWdpc3RlciBpbnQgeXlfYWN0OworCisjbGluZSA2NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKworCisKKyAvKiBLZWVwIHRyYWNrIG9mIG91ciBsb2NhdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLiAgKi8KKyNsaW5lIDY3MiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKKworCWlmICggeXlfaW5pdCApCisJCXsKKwkJeXlfaW5pdCA9IDA7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhIHl5X3N0YXJ0ICkKKwkJCXl5X3N0YXJ0ID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KKworCQlpZiAoICEgeXlpbiApCisJCQl5eWluID0gc3RkaW47CisKKwkJaWYgKCAhIHl5b3V0ICkKKwkJCXl5b3V0ID0gc3Rkb3V0OworCisJCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApCisJCQl5eV9jdXJyZW50X2J1ZmZlciA9CisJCQkJeXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsKKworCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCQl9CisKKwl3aGlsZSAoIDEgKQkJLyogbG9vcHMgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCAqLworCQl7CisJCXl5X2NwID0geXlfY19idWZfcDsKKworCQkvKiBTdXBwb3J0IG9mIHl5dGV4dC4gKi8KKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9zdGFydDsKKwkJeXlfY3VycmVudF9zdGF0ZSArPSBZWV9BVF9CT0woKTsKK3l5X21hdGNoOgorCQlkbworCQkJeworCQkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV07CisJCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCQkJeworCQkJCXl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCQl5eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCQkJfQorCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQkJCXsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3NiApCisJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJCX0KKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJKyt5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDI4NCApOworCit5eV9maW5kX2FjdGlvbjoKKwkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCQlpZiAoIHl5X2FjdCA9PSAwICkKKwkJCXsgLyogaGF2ZSB0byBiYWNrIHVwICovCisJCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisJCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisJCQl9CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworCitkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KKworCQlpZiAoIHl5X2ZsZXhfZGVidWcgKQorCQkJeworCQkJaWYgKCB5eV9hY3QgPT0gMCApCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1zY2FubmVyIGJhY2tpbmcgdXBcbiIgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPCAxMyApCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1hY2NlcHRpbmcgcnVsZSBhdCBsaW5lICVkIChcIiVzXCIpXG4iLAorCQkJCSAgICAgICAgIHl5X3J1bGVfbGluZW51bVt5eV9hY3RdLCB5eXRleHQgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTMgKQorCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tYWNjZXB0aW5nIGRlZmF1bHQgcnVsZSAoXCIlc1wiKVxuIiwKKwkJCQkgICAgICAgICB5eXRleHQgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTQgKQorCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tKGVuZCBvZiBidWZmZXIgb3IgYSBOVUwpXG4iICk7CisJCQllbHNlCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1FT0YgKHN0YXJ0IGNvbmRpdGlvbiAlZClcbiIsIFlZX1NUQVJUICk7CisJCQl9CisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCisJCQljYXNlIDA6IC8qIG11c3QgYmFjayB1cCAqLworCQkJLyogdW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OICovCisJCQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7CisJCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCitjYXNlIDE6CitZWV9SVUxFX1NFVFVQCisjbGluZSA2OSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBGSUxFTkFNRTsKKwlZWV9CUkVBSworY2FzZSAyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNzAgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCitjdXJfbGluZSsrOworCVlZX0JSRUFLCitjYXNlIDM6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3MSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK2N1cl9saW5lKys7CisJWVlfQlJFQUsKKy8qIElnbm9yZSBhbGwgb3RoZXIgd2hpdGVzcGFjZS4gICovCitjYXNlIDQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3NCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKzsKKwlZWV9CUkVBSworY2FzZSA1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNzcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gU1RSSU5HOworCVlZX0JSRUFLCitjYXNlIDY6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3OCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBDSEFSOworCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3OSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBJREVOVDsKKwlZWV9CUkVBSworLyogVGhlIFBlZGFudCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBDIG11bHRpLWNoYXJhY3RlciB0b2tlbnMgYmUKKyAgICByZWNvZ25pemVkIGFzIHRva2Vucy4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGVtIHNpbmNlIHdlIGRvbid0CisgICAgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCB3ZSBkbyB3YW50IHdoaXRlc3BhY2UgdG8gYmUgYXJyYW5nZWQKKyAgICBhcm91bmQgdGhlbSBwcm9wZXJseS4gICovCitjYXNlIDg6CitZWV9SVUxFX1NFVFVQCisjbGluZSA4NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBPVEhFUjsKKwlZWV9CUkVBSworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgODYgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gSU5UOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgODcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gUkVBTDsKKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDg5ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgorcmV0dXJuIERPVFM7CisJWVlfQlJFQUsKKy8qIEFsbCBvdGhlciB0b2tlbnMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzLiAgKi8KK2Nhc2UgMTI6CitZWV9SVUxFX1NFVFVQCisjbGluZSA5MiAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiB5eXRleHRbMF07CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCisjbGluZSA5NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK0VDSE87CisJWVlfQlJFQUsKKyNsaW5lIDg0MiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoVjJfVE9LRU5TKToKKwl5eXRlcm1pbmF0ZSgpOworCisJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgorCQl7CisJCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCisJCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0geXl0ZXh0X3B0cikgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOworCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCisKKwkJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB5eWluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiB5eWxleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4geXlfY3VycmVudF9idWZmZXIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUgPSB5eWluOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOworCQkJfQorCisJCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KKwkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKKwkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgorCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKKwkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKKwkJICogaW4gaW5wdXQoKS4KKwkJICovCisJCWlmICggeXlfY19idWZfcCA8PSAmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXSApCisJCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKKworCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCk7CisKKwkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAorCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKKwkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAorCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCisJCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAorCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgorCQkJICovCisKKwkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisKKwkJCXl5X2JwID0geXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArK3l5X2NfYnVmX3A7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X25leHRfc3RhdGU7CisJCQkJZ290byB5eV9tYXRjaDsKKwkJCQl9CisKKwkJCWVsc2UKKwkJCQl7CisJCQkJeXlfY3AgPSB5eV9jX2J1Zl9wOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAwOworCisJCQkJaWYgKCB5eXdyYXAoKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHl5dGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCXl5X2NfYnVmX3AgPQorCQkJCQl5eXRleHRfcHRyICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKKworCQkJCXl5X2NwID0geXlfY19idWZfcDsKKwkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQl5eV9jX2J1Zl9wID0KKwkJCQkmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKKworCQkJCXl5X2NwID0geXlfY19idWZfcDsKKwkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KKwl9IC8qIGVuZCBvZiB5eWxleCAqLworCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlcigpCisJeworCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9IHl5dGV4dF9wdHI7CisJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOworCWludCByZXRfdmFsOworCisJaWYgKCB5eV9jX2J1Zl9wID4gJnl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdICkKKwkJWVlfRkFUQUxfRVJST1IoCisJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfZmlsbF9idWZmZXIgPT0gMCApCisJCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCisJCWlmICggeXlfY19idWZfcCAtIHl5dGV4dF9wdHIgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoeXlfY19idWZfcCAtIHl5dGV4dF9wdHIpIC0gMTsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCisJCSooZGVzdCsrKSA9ICooc291cmNlKyspOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQorCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAorCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgorCQkgKi8KKwkJeXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnMgPSB5eV9uX2NoYXJzID0gMDsKKworCWVsc2UKKwkJeworCQlpbnQgbnVtX3RvX3JlYWQgPQorCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOworCisJCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCisJCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KKyNpZmRlZiBZWV9VU0VTX1JFSkVDVAorCQkJWVlfRkFUQUxfRVJST1IoCisiaW5wdXQgYnVmZmVyIG92ZXJmbG93LCBjYW4ndCBlbmxhcmdlIGJ1ZmZlciBiZWNhdXNlIHNjYW5uZXIgdXNlcyBSRUpFQ1QiICk7CisjZWxzZQorCisJCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJCVlZX0JVRkZFUl9TVEFURSBiID0geXlfY3VycmVudF9idWZmZXI7CisKKwkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9CisJCQkJKGludCkgKHl5X2NfYnVmX3AgLSBiLT55eV9jaF9idWYpOworCisJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQkJCXsKKwkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7CisKKwkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQorCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7CisJCQkJZWxzZQorCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOworCisJCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKKwkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KKwkJCQkJeXlfZmxleF9yZWFsbG9jKCAodm9pZCAqKSBiLT55eV9jaF9idWYsCisJCQkJCQkJIGItPnl5X2J1Zl9zaXplICsgMiApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCXl5X2NfYnVmX3AgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworI2VuZGlmCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCisJCQl5eV9uX2NoYXJzLCBudW1fdG9fcmVhZCApOworCisJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzID0geXlfbl9jaGFyczsKKwkJfQorCisJaWYgKCB5eV9uX2NoYXJzID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl5eXJlc3RhcnQoIHl5aW4gKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1ZmZlcl9zdGF0dXMgPQorCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKKwkJCX0KKwkJfQorCisJZWxzZQorCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOworCisJeXlfbl9jaGFycyArPSBudW1iZXJfdG9fbW92ZTsKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJeXl0ZXh0X3B0ciA9ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmWzBdOworCisJcmV0dXJuIHJldF92YWw7CisJfQorCisKKy8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCisKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpCisJeworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKworCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9zdGFydDsKKwl5eV9jdXJyZW50X3N0YXRlICs9IFlZX0FUX0JPTCgpOworCisJZm9yICggeXlfY3AgPSB5eXRleHRfcHRyICsgWVlfTU9SRV9BREo7IHl5X2NwIDwgeXlfY19idWZfcDsgKyt5eV9jcCApCisJCXsKKwkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSk7CisJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKKwkJCXsKKwkJCXl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCXl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQkJeworCQkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKKwkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3NiApCisJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CisJCQl9CisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQl9CisKKwlyZXR1cm4geXlfY3VycmVudF9zdGF0ZTsKKwl9CisKKworLyogeXlfdHJ5X05VTF90cmFucyAtIHRyeSB0byBtYWtlIGEgdHJhbnNpdGlvbiBvbiB0aGUgTlVMIGNoYXJhY3RlcgorICoKKyAqIHN5bm9wc2lzCisgKgluZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggY3VycmVudF9zdGF0ZSApOworICovCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zKCB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQorI2Vsc2UKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKQoreXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGludCB5eV9pc19qYW07CisJcmVnaXN0ZXIgY2hhciAqeXlfY3AgPSB5eV9jX2J1Zl9wOworCisJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gMTsKKwlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCXsKKwkJeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUgPSB5eV9jdXJyZW50X3N0YXRlOworCQl5eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCX0KKwl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKKwkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDc2ICkKKwkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQl9CisJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gNzUpOworCisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOworCX0KKworCisjaWZuZGVmIFlZX05PX1VOUFVUCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXl1bnB1dCggaW50IGMsIHJlZ2lzdGVyIGNoYXIgKnl5X2JwICkKKyNlbHNlCitzdGF0aWMgdm9pZCB5eXVucHV0KCBjLCB5eV9icCApCitpbnQgYzsKK3JlZ2lzdGVyIGNoYXIgKnl5X2JwOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0geXlfY19idWZfcDsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dCAqLworCSp5eV9jcCA9IHl5X2hvbGRfY2hhcjsKKworCWlmICggeXlfY3AgPCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9IHl5X25fY2hhcnMgKyAyOworCQlyZWdpc3RlciBjaGFyICpkZXN0ID0gJnl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbCisJCQkJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9idWZfc2l6ZSArIDJdOworCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQorCQkJCSZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXTsKKworCQl3aGlsZSAoIHNvdXJjZSA+IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJeXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnMgPQorCQkJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9idWZfc2l6ZTsKKworCQlpZiAoIHl5X2NwIDwgeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1ZiArIDIgKQorCQkJWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93IiApOworCQl9CisKKwkqLS15eV9jcCA9IChjaGFyKSBjOworCisKKwl5eXRleHRfcHRyID0geXlfYnA7CisJeXlfaG9sZF9jaGFyID0gKnl5X2NwOworCXl5X2NfYnVmX3AgPSB5eV9jcDsKKwl9CisjZW5kaWYJLyogaWZuZGVmIFlZX05PX1VOUFVUICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQoKQorI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQoKQorI2VuZGlmCisJeworCWludCBjOworCisJKnl5X2NfYnVmX3AgPSB5eV9ob2xkX2NoYXI7CisKKwlpZiAoICp5eV9jX2J1Zl9wID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggeXlfY19idWZfcCA8ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdICkKKwkJCS8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCSp5eV9jX2J1Zl9wID0gJ1wwJzsKKworCQllbHNlCisJCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLworCQkJaW50IG9mZnNldCA9IHl5X2NfYnVmX3AgLSB5eXRleHRfcHRyOworCQkJKyt5eV9jX2J1Zl9wOworCisJCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXl5cmVzdGFydCggeXlpbiApOworCisJCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggeXl3cmFwKCkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KCk7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSB5eV9jX2J1Zl9wOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqeXlfY19idWZfcCA9ICdcMCc7CS8qIHByZXNlcnZlIHl5dGV4dCAqLworCXl5X2hvbGRfY2hhciA9ICorK3l5X2NfYnVmX3A7CisKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfYXRfYm9sID0gKGMgPT0gJ1xuJyk7CisKKwlyZXR1cm4gYzsKKwl9CisKKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3ZvaWQgeXlyZXN0YXJ0KCBGSUxFICppbnB1dF9maWxlICkKKyNlbHNlCit2b2lkIHl5cmVzdGFydCggaW5wdXRfZmlsZSApCitGSUxFICppbnB1dF9maWxlOworI2VuZGlmCisJeworCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApCisJCXl5X2N1cnJlbnRfYnVmZmVyID0geXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsKKworCXl5X2luaXRfYnVmZmVyKCB5eV9jdXJyZW50X2J1ZmZlciwgaW5wdXRfZmlsZSApOworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCk7CisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKKyNlbHNlCit2b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIG5ld19idWZmZXIgKQorWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXI7CisjZW5kaWYKKwl7CisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlciA9PSBuZXdfYnVmZmVyICkKKwkJcmV0dXJuOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlciApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqeXlfY19idWZfcCA9IHl5X2hvbGRfY2hhcjsKKwkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3MgPSB5eV9jX2J1Zl9wOworCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfbl9jaGFycyA9IHl5X25fY2hhcnM7CisJCX0KKworCXl5X2N1cnJlbnRfYnVmZmVyID0gbmV3X2J1ZmZlcjsKKwl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCisJLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKKwkgKiBFT0YgKHl5d3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKKwkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgeXl3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKKwkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KKwkgKi8KKwl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAxOworCX0KKworCisjaWZkZWYgWVlfVVNFX1BST1RPUwordm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggdm9pZCApCisjZWxzZQordm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpCisjZW5kaWYKKwl7CisJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzOworCXl5dGV4dF9wdHIgPSB5eV9jX2J1Zl9wID0geXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3M7CisJeXlpbiA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9pbnB1dF9maWxlOworCXl5X2hvbGRfY2hhciA9ICp5eV9jX2J1Zl9wOworCX0KKworCisjaWZkZWYgWVlfVVNFX1BST1RPUworWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIoIEZJTEUgKmZpbGUsIGludCBzaXplICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX2J1ZmZlciggZmlsZSwgc2l6ZSApCitGSUxFICpmaWxlOworaW50IHNpemU7CisjZW5kaWYKKwl7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgeXlfZmxleF9hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKKworCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KKwkgKi8KKwliLT55eV9jaF9idWYgPSAoY2hhciAqKSB5eV9mbGV4X2FsbG9jKCBiLT55eV9idWZfc2l6ZSArIDIgKTsKKwlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwl5eV9pbml0X2J1ZmZlciggYiwgZmlsZSApOworCisJcmV0dXJuIGI7CisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X2RlbGV0ZV9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiICkKKyNlbHNlCit2b2lkIHl5X2RlbGV0ZV9idWZmZXIoIGIgKQorWVlfQlVGRkVSX1NUQVRFIGI7CisjZW5kaWYKKwl7CisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwlpZiAoIGIgPT0geXlfY3VycmVudF9idWZmZXIgKQorCQl5eV9jdXJyZW50X2J1ZmZlciA9IChZWV9CVUZGRVJfU1RBVEUpIDA7CisKKwlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQl5eV9mbGV4X2ZyZWUoICh2b2lkICopIGItPnl5X2NoX2J1ZiApOworCisJeXlfZmxleF9mcmVlKCAodm9pZCAqKSBiICk7CisJfQorCisKKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3ZvaWQgeXlfaW5pdF9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiLCBGSUxFICpmaWxlICkKKyNlbHNlCit2b2lkIHl5X2luaXRfYnVmZmVyKCBiLCBmaWxlICkKK1lZX0JVRkZFUl9TVEFURSBiOworRklMRSAqZmlsZTsKKyNlbmRpZgorCisKKwl7CisJeXlfZmx1c2hfYnVmZmVyKCBiICk7CisKKwliLT55eV9pbnB1dF9maWxlID0gZmlsZTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDE7CisKKyNpZiBZWV9BTFdBWVNfSU5URVJBQ1RJVkUKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDE7CisjZWxzZQorI2lmIFlZX05FVkVSX0lOVEVSQUNUSVZFCisJYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworI2Vsc2UKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IGZpbGUgPyAoaXNhdHR5KCBmaWxlbm8oZmlsZSkgKSA+IDApIDogMDsKKyNlbmRpZgorI2VuZGlmCisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X2ZsdXNoX2J1ZmZlciggWVlfQlVGRkVSX1NUQVRFIGIgKQorI2Vsc2UKK3ZvaWQgeXlfZmx1c2hfYnVmZmVyKCBiICkKK1lZX0JVRkZFUl9TVEFURSBiOworI2VuZGlmCisKKwl7CisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0geXlfY3VycmVudF9idWZmZXIgKQorCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCX0KKworCisjaWZuZGVmIFlZX05PX1NDQU5fQlVGRkVSCisjaWZkZWYgWVlfVVNFX1BST1RPUworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKCBjaGFyICpiYXNlLCB5eV9zaXplX3Qgc2l6ZSApCisjZWxzZQorWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKCBiYXNlLCBzaXplICkKK2NoYXIgKmJhc2U7Cit5eV9zaXplX3Qgc2l6ZTsKKyNlbmRpZgorCXsKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKworCWlmICggc2l6ZSA8IDIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0yXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0xXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQkvKiBUaGV5IGZvcmdvdCB0byBsZWF2ZSByb29tIGZvciB0aGUgRU9CJ3MuICovCisJCXJldHVybiAwOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHl5X2ZsZXhfYWxsb2MoIHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9zY2FuX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplIC0gMjsJLyogIi0gMiIgdG8gdGFrZSBjYXJlIG9mIEVPQidzICovCisJYi0+eXlfYnVmX3BvcyA9IGItPnl5X2NoX2J1ZiA9IGJhc2U7CisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDA7CisJYi0+eXlfaW5wdXRfZmlsZSA9IDA7CisJYi0+eXlfbl9jaGFycyA9IGItPnl5X2J1Zl9zaXplOworCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCXl5X3N3aXRjaF90b19idWZmZXIoIGIgKTsKKworCXJldHVybiBiOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fU0NBTl9TVFJJTkcKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcoIHl5Y29uc3QgY2hhciAqeXlfc3RyICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcoIHl5X3N0ciApCit5eWNvbnN0IGNoYXIgKnl5X3N0cjsKKyNlbmRpZgorCXsKKwlpbnQgbGVuOworCWZvciAoIGxlbiA9IDA7IHl5X3N0cltsZW5dOyArK2xlbiApCisJCTsKKworCXJldHVybiB5eV9zY2FuX2J5dGVzKCB5eV9zdHIsIGxlbiApOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fU0NBTl9CWVRFUworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzKCB5eWNvbnN0IGNoYXIgKmJ5dGVzLCBpbnQgbGVuICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyggYnl0ZXMsIGxlbiApCit5eWNvbnN0IGNoYXIgKmJ5dGVzOworaW50IGxlbjsKKyNlbmRpZgorCXsKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKwljaGFyICpidWY7CisJeXlfc2l6ZV90IG47CisJaW50IGk7CisKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB5eV9mbGV4X2FsbG9jKCBuICk7CisJaWYgKCAhIGJ1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X3NjYW5fYnl0ZXMoKSIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQorCQlidWZbaV0gPSBieXRlc1tpXTsKKworCWJ1ZltsZW5dID0gYnVmW2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB5eV9zY2FuX2J1ZmZlciggYnVmLCBuICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4geXlfc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7CisJfQorI2VuZGlmCisKKworI2lmbmRlZiBZWV9OT19QVVNIX1NUQVRFCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXlfcHVzaF9zdGF0ZSggaW50IG5ld19zdGF0ZSApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfcHVzaF9zdGF0ZSggbmV3X3N0YXRlICkKK2ludCBuZXdfc3RhdGU7CisjZW5kaWYKKwl7CisJaWYgKCB5eV9zdGFydF9zdGFja19wdHIgPj0geXlfc3RhcnRfc3RhY2tfZGVwdGggKQorCQl7CisJCXl5X3NpemVfdCBuZXdfc2l6ZTsKKworCQl5eV9zdGFydF9zdGFja19kZXB0aCArPSBZWV9TVEFSVF9TVEFDS19JTkNSOworCQluZXdfc2l6ZSA9IHl5X3N0YXJ0X3N0YWNrX2RlcHRoICogc2l6ZW9mKCBpbnQgKTsKKworCQlpZiAoICEgeXlfc3RhcnRfc3RhY2sgKQorCQkJeXlfc3RhcnRfc3RhY2sgPSAoaW50ICopIHl5X2ZsZXhfYWxsb2MoIG5ld19zaXplICk7CisKKwkJZWxzZQorCQkJeXlfc3RhcnRfc3RhY2sgPSAoaW50ICopIHl5X2ZsZXhfcmVhbGxvYygKKwkJCQkJKHZvaWQgKikgeXlfc3RhcnRfc3RhY2ssIG5ld19zaXplICk7CisKKwkJaWYgKCAhIHl5X3N0YXJ0X3N0YWNrICkKKwkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJIm91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayIgKTsKKwkJfQorCisJeXlfc3RhcnRfc3RhY2tbeXlfc3RhcnRfc3RhY2tfcHRyKytdID0gWVlfU1RBUlQ7CisKKwlCRUdJTihuZXdfc3RhdGUpOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fUE9QX1NUQVRFCitzdGF0aWMgdm9pZCB5eV9wb3Bfc3RhdGUoKQorCXsKKwlpZiAoIC0teXlfc3RhcnRfc3RhY2tfcHRyIDwgMCApCisJCVlZX0ZBVEFMX0VSUk9SKCAic3RhcnQtY29uZGl0aW9uIHN0YWNrIHVuZGVyZmxvdyIgKTsKKworCUJFR0lOKHl5X3N0YXJ0X3N0YWNrW3l5X3N0YXJ0X3N0YWNrX3B0cl0pOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fVE9QX1NUQVRFCitzdGF0aWMgaW50IHl5X3RvcF9zdGF0ZSgpCisJeworCXJldHVybiB5eV9zdGFydF9zdGFja1t5eV9zdGFydF9zdGFja19wdHIgLSAxXTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBZWV9FWElUX0ZBSUxVUkUKKyNkZWZpbmUgWVlfRVhJVF9GQUlMVVJFIDIKKyNlbmRpZgorCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IoIHl5Y29uc3QgY2hhciBtc2dbXSApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IoIG1zZyApCitjaGFyIG1zZ1tdOworI2VuZGlmCisJeworCSh2b2lkKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNnICk7CisJZXhpdCggWVlfRVhJVF9GQUlMVVJFICk7CisJfQorCisKKworLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCisKKyN1bmRlZiB5eWxlc3MKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKwkJeXl0ZXh0W3l5bGVuZ10gPSB5eV9ob2xkX2NoYXI7IFwKKwkJeXlfY19idWZfcCA9IHl5dGV4dCArIG47IFwKKwkJeXlfaG9sZF9jaGFyID0gKnl5X2NfYnVmX3A7IFwKKwkJKnl5X2NfYnVmX3AgPSAnXDAnOyBcCisJCXl5bGVuZyA9IG47IFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworCisvKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLiAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkoIGNoYXIgKnMxLCB5eWNvbnN0IGNoYXIgKnMyLCBpbnQgbiApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5KCBzMSwgczIsIG4gKQorY2hhciAqczE7Cit5eWNvbnN0IGNoYXIgKnMyOworaW50IG47CisjZW5kaWYKKwl7CisJcmVnaXN0ZXIgaW50IGk7CisJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorCQlzMVtpXSA9IHMyW2ldOworCX0KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuKCB5eWNvbnN0IGNoYXIgKnMgKQorI2Vsc2UKK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4oIHMgKQoreXljb25zdCBjaGFyICpzOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGludCBuOworCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCQk7CisKKwlyZXR1cm4gbjsKKwl9CisjZW5kaWYKKworCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgKnl5X2ZsZXhfYWxsb2MoIHl5X3NpemVfdCBzaXplICkKKyNlbHNlCitzdGF0aWMgdm9pZCAqeXlfZmxleF9hbGxvYyggc2l6ZSApCit5eV9zaXplX3Qgc2l6ZTsKKyNlbmRpZgorCXsKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7CisJfQorCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgKnl5X2ZsZXhfcmVhbGxvYyggdm9pZCAqcHRyLCB5eV9zaXplX3Qgc2l6ZSApCisjZWxzZQorc3RhdGljIHZvaWQgKnl5X2ZsZXhfcmVhbGxvYyggcHRyLCBzaXplICkKK3ZvaWQgKnB0cjsKK3l5X3NpemVfdCBzaXplOworI2VuZGlmCisJeworCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKKwkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCisJICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgorCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KKwkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCisJICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCisJICovCisJcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOworCX0KKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfZnJlZSggdm9pZCAqcHRyICkKKyNlbHNlCitzdGF0aWMgdm9pZCB5eV9mbGV4X2ZyZWUoIHB0ciApCit2b2lkICpwdHI7CisjZW5kaWYKKwl7CisJZnJlZSggcHRyICk7CisJfQorCisjaWYgWVlfTUFJTgoraW50IG1haW4oKQorCXsKKwl5eWxleCgpOworCXJldHVybiAwOworCX0KKyNlbmRpZgorI2xpbmUgOTUgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCisKKworLyogQnJpbmcgaW4gdGhlIGtleXdvcmQgcmVjb2duaXplci4gICovCisKKyNpbmNsdWRlICJrZXl3b3Jkcy5jIgorCisKKy8qIE1hY3JvcyB0byBhcHBlbmQgdG8gb3VyIHBocmFzZSBjb2xsZWN0aW9uIGxpc3QuICAqLworCisjZGVmaW5lIF9BUFAoVCxMKQlkbyB7CQkJCQkJICAgXAorCQkJICBjdXJfbm9kZSA9IG5leHRfbm9kZTsJCQkJICAgXAorCQkJICBuZXh0X25vZGUgPSB4bWFsbG9jKHNpemVvZigqbmV4dF9ub2RlKSk7CSAgIFwKKwkJCSAgbmV4dF9ub2RlLT5uZXh0ID0gY3VyX25vZGU7CQkJICAgXAorCQkJICBjdXJfbm9kZS0+c3RyaW5nID0gbWVtY3B5KHhtYWxsb2MoTCsxKSwgVCwgTCsxKTsgXAorCQkJICBjdXJfbm9kZS0+dGFnID0gU1lNX05PUk1BTDsJCQkgICBcCisJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUAkJX0FQUCh5eXRleHQsIHl5bGVuZykKKworCisvKiBUaGUgc2Vjb25kIHN0YWdlIGxleGVyLiAgSGVyZSB3ZSBpbmNvcnBvcmF0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXRlCisgICBvZiB0aGUgcGFyc2VyIHRvIHRhaWxvciB0aGUgdG9rZW5zIHRoYXQgYXJlIHJldHVybmVkLiAgKi8KKworaW50Cit5eWxleCh2b2lkKQoreworICBzdGF0aWMgZW51bSB7CisgICAgU1RfTk9UU1RBUlRFRCwgU1RfTk9STUFMLCBTVF9BVFRSSUJVVEUsIFNUX0FTTSwgU1RfQlJBQ0tFVCwgU1RfQlJBQ0UsCisgICAgU1RfRVhQUkVTU0lPTiwgU1RfVEFCTEVfMSwgU1RfVEFCTEVfMiwgU1RfVEFCTEVfMywgU1RfVEFCTEVfNCwKKyAgICBTVF9UQUJMRV81LCBTVF9UQUJMRV82CisgIH0gbGV4c3RhdGUgPSBTVF9OT1RTVEFSVEVEOworCisgIHN0YXRpYyBpbnQgc3VwcHJlc3NfdHlwZV9sb29rdXAsIGRvbnRfd2FudF9icmFjZV9waHJhc2U7CisgIHN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHRfbm9kZTsKKworICBpbnQgdG9rZW4sIGNvdW50ID0gMDsKKyAgc3RydWN0IHN0cmluZ19saXN0ICpjdXJfbm9kZTsKKworICBpZiAobGV4c3RhdGUgPT0gU1RfTk9UU1RBUlRFRCkKKyAgICB7CisgICAgICBCRUdJTihWMl9UT0tFTlMpOworICAgICAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOworICAgICAgbmV4dF9ub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworICAgIH0KKworcmVwZWF0OgorICB0b2tlbiA9IHl5bGV4MSgpOworCisgIGlmICh0b2tlbiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmICh0b2tlbiA9PSBGSUxFTkFNRSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlLCAqZTsKKworICAgICAgLyogU2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBsYXRlciBlcnJvciBtZXNzYWdlcy4gICovCisKKyAgICAgIGlmIChjdXJfZmlsZW5hbWUpCisJZnJlZShjdXJfZmlsZW5hbWUpOworCisgICAgICBmaWxlID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykrMTsKKyAgICAgIGUgPSBzdHJjaHIoZmlsZSwgJ1wiJyk7CisgICAgICAqZSA9ICdcMCc7CisgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKKyAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CisKKyAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICBzd2l0Y2ggKGxleHN0YXRlKQorICAgIHsKKyAgICBjYXNlIFNUX05PUk1BTDoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgSURFTlQ6CisJICBBUFA7CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCByZXN3b3JkICpyID0gaXNfcmVzZXJ2ZWRfd29yZCh5eXRleHQsIHl5bGVuZyk7CisJICAgIGlmIChyKQorCSAgICAgIHsKKwkJc3dpdGNoICh0b2tlbiA9IHItPnRva2VuKQorCQkgIHsKKwkJICBjYXNlIEFUVFJJQlVURV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BVFRSSUJVVEU7CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJICBjYXNlIEFTTV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BU007CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKworCQkgIGNhc2UgU1RSVUNUX0tFWVc6CisJCSAgY2FzZSBVTklPTl9LRVlXOgorCQkgICAgZG9udF93YW50X2JyYWNlX3BocmFzZSA9IDM7CisJCSAgY2FzZSBFTlVNX0tFWVc6CisJCSAgICBzdXBwcmVzc190eXBlX2xvb2t1cCA9IDI7CisJCSAgICBnb3RvIGZpbmk7CisKKwkJICBjYXNlIEVYUE9SVF9TWU1CT0xfS0VZVzoKKwkJICAgICAgZ290byBmaW5pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmICghc3VwcHJlc3NfdHlwZV9sb29rdXApCisJICAgICAgeworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBmaW5kX3N5bWJvbCh5eXRleHQsIFNZTV9UWVBFREVGKTsKKwkJaWYgKHN5bSAmJiBzeW0tPnR5cGUgPT0gU1lNX1RZUEVERUYpCisJCSAgdG9rZW4gPSBUWVBFOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWyc6CisJICBBUFA7CisJICBsZXhzdGF0ZSA9IFNUX0JSQUNLRVQ7CisJICBjb3VudCA9IDE7CisJICBnb3RvIHJlcGVhdDsKKworCWNhc2UgJ3snOgorCSAgQVBQOworCSAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UpCisJICAgIGJyZWFrOworCSAgbGV4c3RhdGUgPSBTVF9CUkFDRTsKKwkgIGNvdW50ID0gMTsKKwkgIGdvdG8gcmVwZWF0OworCisJY2FzZSAnPSc6IGNhc2UgJzonOgorCSAgQVBQOworCSAgbGV4c3RhdGUgPSBTVF9FWFBSRVNTSU9OOworCSAgYnJlYWs7CisKKwljYXNlIERPVFM6CisJZGVmYXVsdDoKKwkgIEFQUDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVF9BVFRSSUJVVEU6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcpJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEFUVFJJQlVURV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfQVNNOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBBU01fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNLRVQ6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICdbJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICddJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEJSQUNLRVRfUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNFOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBCUkFDRV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfRVhQUkVTU0lPTjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJygnOiBjYXNlICdbJzogY2FzZSAneyc6CisJICArK2NvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6IGNhc2UgJ10nOiBjYXNlICd9JzoKKwkgIC0tY291bnQ7CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcsJzogY2FzZSAnOyc6CisJICBpZiAoY291bnQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFB1dCBiYWNrIHRoZSB0b2tlbiB3ZSBqdXN0IHJlYWQgc28ncyB3ZSBjYW4gZmluZCBpdCBhZ2FpbgorCQkgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGV4cHJlc3Npb24uICAqLworCSAgICAgIHVucHV0KHRva2VuKTsKKworCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworCSAgICAgIHRva2VuID0gRVhQUkVTU0lPTl9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIEFQUDsKKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfVEFCTEVfMToKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV8yOgorICAgICAgaWYgKHRva2VuID09IElERU5UICYmIHl5bGVuZyA9PSAxICYmIHl5dGV4dFswXSA9PSAnWCcpCisJeworCSAgdG9rZW4gPSBFWFBPUlRfU1lNQk9MX0tFWVc7CisJICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzU7CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzY7CisgICAgICAvKiBGQUxMVEhSVSAqLworCisgICAgY2FzZSBTVF9UQUJMRV82OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6IGNhc2UgJ1snOiBjYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBicmVhazsKKwljYXNlICd9JzogY2FzZSAnXSc6IGNhc2UgJyknOgorCSAgLS1jb3VudDsKKwkgIGJyZWFrOworCWNhc2UgJywnOgorCSAgaWYgKGNvdW50ID09IDApCisJICAgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIGJyZWFrOworCX07CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfMzoKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV80OgorICAgICAgaWYgKHRva2VuID09ICc7JykKKwlsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV81OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnLCc6CisJICB0b2tlbiA9ICc7JzsKKwkgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIEFQUDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KK2Zpbmk6CisKKyAgaWYgKHN1cHByZXNzX3R5cGVfbG9va3VwID4gMCkKKyAgICAtLXN1cHByZXNzX3R5cGVfbG9va3VwOworICBpZiAoZG9udF93YW50X2JyYWNlX3BocmFzZSA+IDApCisgICAgLS1kb250X3dhbnRfYnJhY2VfcGhyYXNlOworCisgIHl5bHZhbCA9ICZuZXh0X25vZGUtPm5leHQ7CisKKyAgcmV0dXJuIHRva2VuOworfQorI2lmbmRlZiBZWVNUWVBFCisjZGVmaW5lIFlZU1RZUEUgaW50CisjZW5kaWYKKyNkZWZpbmUJQVNNX0tFWVcJMjU3CisjZGVmaW5lCUFUVFJJQlVURV9LRVlXCTI1OAorI2RlZmluZQlBVVRPX0tFWVcJMjU5CisjZGVmaW5lCUJPT0xfS0VZVwkyNjAKKyNkZWZpbmUJQ0hBUl9LRVlXCTI2MQorI2RlZmluZQlDT05TVF9LRVlXCTI2MgorI2RlZmluZQlET1VCTEVfS0VZVwkyNjMKKyNkZWZpbmUJRU5VTV9LRVlXCTI2NAorI2RlZmluZQlFWFRFUk5fS0VZVwkyNjUKKyNkZWZpbmUJRkxPQVRfS0VZVwkyNjYKKyNkZWZpbmUJSU5MSU5FX0tFWVcJMjY3CisjZGVmaW5lCUlOVF9LRVlXCTI2OAorI2RlZmluZQlMT05HX0tFWVcJMjY5CisjZGVmaW5lCVJFR0lTVEVSX0tFWVcJMjcwCisjZGVmaW5lCVJFU1RSSUNUX0tFWVcJMjcxCisjZGVmaW5lCVNIT1JUX0tFWVcJMjcyCisjZGVmaW5lCVNJR05FRF9LRVlXCTI3MworI2RlZmluZQlTVEFUSUNfS0VZVwkyNzQKKyNkZWZpbmUJU1RSVUNUX0tFWVcJMjc1CisjZGVmaW5lCVRZUEVERUZfS0VZVwkyNzYKKyNkZWZpbmUJVU5JT05fS0VZVwkyNzcKKyNkZWZpbmUJVU5TSUdORURfS0VZVwkyNzgKKyNkZWZpbmUJVk9JRF9LRVlXCTI3OQorI2RlZmluZQlWT0xBVElMRV9LRVlXCTI4MAorI2RlZmluZQlUWVBFT0ZfS0VZVwkyODEKKyNkZWZpbmUJRVhQT1JUX1NZTUJPTF9LRVlXCTI4MgorI2RlZmluZQlBU01fUEhSQVNFCTI4MworI2RlZmluZQlBVFRSSUJVVEVfUEhSQVNFCTI4NAorI2RlZmluZQlCUkFDRV9QSFJBU0UJMjg1CisjZGVmaW5lCUJSQUNLRVRfUEhSQVNFCTI4NgorI2RlZmluZQlFWFBSRVNTSU9OX1BIUkFTRQkyODcKKyNkZWZpbmUJQ0hBUgkyODgKKyNkZWZpbmUJRE9UUwkyODkKKyNkZWZpbmUJSURFTlQJMjkwCisjZGVmaW5lCUlOVAkyOTEKKyNkZWZpbmUJUkVBTAkyOTIKKyNkZWZpbmUJU1RSSU5HCTI5MworI2RlZmluZQlUWVBFCTI5NAorI2RlZmluZQlPVEhFUgkyOTUKKyNkZWZpbmUJRklMRU5BTUUJMjk2CisKKworZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9sZXgubCBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZGZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKQEAgLTAsMCArMSw0MDcgQEAKKy8qIExleGljYWwgYW5hbHlzaXMgZm9yIGdlbmtzeW1zLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGFrZW4gZnJvbSBMaW51eCBtb2R1dGlscyAyLjQuMjIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworJXsKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisKKy8qIFdlJ3ZlIGdvdCBhIHR3by1sZXZlbCBsZXhlciBoZXJlLiAgV2UgbGV0IGZsZXggZG8gYmFzaWMgdG9rZW5pemF0aW9uCisgICBhbmQgdGhlbiB3ZSBjYXRlZ29yaXplIHRob3NlIGJhc2ljIHRva2VucyBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgKi8KKyNkZWZpbmUgWVlfREVDTAkJc3RhdGljIGludCB5eWxleDEodm9pZCkKKworJX0KKworSURFTlQJCQlbQS1aYS16X1wkXVtBLVphLXowLTlfXCRdKgorCitPX0lOVAkJCTBbMC03XSoKK0RfSU5UCQkJWzEtOV1bMC05XSoKK1hfSU5UCQkJMFtYeF1bMC05QS1GYS1mXSsKK0lfU1VGCQkJW1V1XXxbTGxdfFtVdV1bTGxdfFtMbF1bVXVdCitJTlQJCQkoe09fSU5UfXx7RF9JTlR9fHtYX0lOVH0pe0lfU1VGfT8KKworRlJBQwkJCShbMC05XSpcLlswLTldKyl8KFswLTldK1wuKQorRVhQCQkJW0VlXVsrLV0/WzAtOV0rCitGX1NVRgkJCVtGZkxsXQorUkVBTAkJCSh7RlJBQ317RVhQfT97Rl9TVUZ9Pyl8KFswLTldK3tFWFB9e0ZfU1VGfT8pCisKK1NUUklORwkJCUw/XCIoW15cXFwiXSpcXC4pKlteXFxcIl0qXCIKK0NIQVIJCQlMP1wnKFteXFxcJ10qXFwuKSpbXlxcXCddKlwnCisKK01DX1RPS0VOCQkoW34lXiYqKz18PD4vLV09KXwoJiYpfCgifHwiKXwoLT4pfCg8PCl8KD4+KQorCisvKiBWZXJzaW9uIDIgY2hlY2tzdW1taW5nIGRvZXMgcHJvcGVyIHRva2VuaXphdGlvbjsgdmVyc2lvbiAxIHdhc24ndAorICAgcXVpdGUgc28gcGVkYW50aWMuICAqLworJXMgVjJfVE9LRU5TCisKKy8qIFdlIGRvbid0IGRvIG11bHRpcGxlIGlucHV0IGZpbGVzLiAgKi8KKyVvcHRpb24gbm95eXdyYXAKKworJSUKKworCisgLyogS2VlcCB0cmFjayBvZiBvdXIgbG9jYXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy4gICovCiteI1sgXHRdK3tJTlR9WyBcdF0rXCJbXlwiXG5dK1wiLipcbglyZXR1cm4gRklMRU5BTUU7CiteIy4qXG4JCQkJCWN1cl9saW5lKys7CitcbgkJCQkJY3VyX2xpbmUrKzsKKworIC8qIElnbm9yZSBhbGwgb3RoZXIgd2hpdGVzcGFjZS4gICovCitbIFx0XGZcdlxyXSsJCQkJOworCisKK3tTVFJJTkd9CQkJCXJldHVybiBTVFJJTkc7Cit7Q0hBUn0JCQkJCXJldHVybiBDSEFSOwore0lERU5UfQkJCQkJcmV0dXJuIElERU5UOworCisgLyogVGhlIFBlZGFudCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBDIG11bHRpLWNoYXJhY3RlciB0b2tlbnMgYmUKKyAgICByZWNvZ25pemVkIGFzIHRva2Vucy4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGVtIHNpbmNlIHdlIGRvbid0CisgICAgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCB3ZSBkbyB3YW50IHdoaXRlc3BhY2UgdG8gYmUgYXJyYW5nZWQKKyAgICBhcm91bmQgdGhlbSBwcm9wZXJseS4gICovCis8VjJfVE9LRU5TPntNQ19UT0tFTn0JCQlyZXR1cm4gT1RIRVI7Cis8VjJfVE9LRU5TPntJTlR9CQkJcmV0dXJuIElOVDsKKzxWMl9UT0tFTlM+e1JFQUx9CQkJcmV0dXJuIFJFQUw7CisKKyIuLi4iCQkJCQlyZXR1cm4gRE9UUzsKKworIC8qIEFsbCBvdGhlciB0b2tlbnMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzLiAgKi8KKy4JCQkJCXJldHVybiB5eXRleHRbMF07CisKKworJSUKKworLyogQnJpbmcgaW4gdGhlIGtleXdvcmQgcmVjb2duaXplci4gICovCisKKyNpbmNsdWRlICJrZXl3b3Jkcy5jIgorCisKKy8qIE1hY3JvcyB0byBhcHBlbmQgdG8gb3VyIHBocmFzZSBjb2xsZWN0aW9uIGxpc3QuICAqLworCisjZGVmaW5lIF9BUFAoVCxMKQlkbyB7CQkJCQkJICAgXAorCQkJICBjdXJfbm9kZSA9IG5leHRfbm9kZTsJCQkJICAgXAorCQkJICBuZXh0X25vZGUgPSB4bWFsbG9jKHNpemVvZigqbmV4dF9ub2RlKSk7CSAgIFwKKwkJCSAgbmV4dF9ub2RlLT5uZXh0ID0gY3VyX25vZGU7CQkJICAgXAorCQkJICBjdXJfbm9kZS0+c3RyaW5nID0gbWVtY3B5KHhtYWxsb2MoTCsxKSwgVCwgTCsxKTsgXAorCQkJICBjdXJfbm9kZS0+dGFnID0gU1lNX05PUk1BTDsJCQkgICBcCisJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUAkJX0FQUCh5eXRleHQsIHl5bGVuZykKKworCisvKiBUaGUgc2Vjb25kIHN0YWdlIGxleGVyLiAgSGVyZSB3ZSBpbmNvcnBvcmF0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXRlCisgICBvZiB0aGUgcGFyc2VyIHRvIHRhaWxvciB0aGUgdG9rZW5zIHRoYXQgYXJlIHJldHVybmVkLiAgKi8KKworaW50Cit5eWxleCh2b2lkKQoreworICBzdGF0aWMgZW51bSB7CisgICAgU1RfTk9UU1RBUlRFRCwgU1RfTk9STUFMLCBTVF9BVFRSSUJVVEUsIFNUX0FTTSwgU1RfQlJBQ0tFVCwgU1RfQlJBQ0UsCisgICAgU1RfRVhQUkVTU0lPTiwgU1RfVEFCTEVfMSwgU1RfVEFCTEVfMiwgU1RfVEFCTEVfMywgU1RfVEFCTEVfNCwKKyAgICBTVF9UQUJMRV81LCBTVF9UQUJMRV82CisgIH0gbGV4c3RhdGUgPSBTVF9OT1RTVEFSVEVEOworCisgIHN0YXRpYyBpbnQgc3VwcHJlc3NfdHlwZV9sb29rdXAsIGRvbnRfd2FudF9icmFjZV9waHJhc2U7CisgIHN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHRfbm9kZTsKKworICBpbnQgdG9rZW4sIGNvdW50ID0gMDsKKyAgc3RydWN0IHN0cmluZ19saXN0ICpjdXJfbm9kZTsKKworICBpZiAobGV4c3RhdGUgPT0gU1RfTk9UU1RBUlRFRCkKKyAgICB7CisgICAgICBCRUdJTihWMl9UT0tFTlMpOworICAgICAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOworICAgICAgbmV4dF9ub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworICAgIH0KKworcmVwZWF0OgorICB0b2tlbiA9IHl5bGV4MSgpOworCisgIGlmICh0b2tlbiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmICh0b2tlbiA9PSBGSUxFTkFNRSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlLCAqZTsKKworICAgICAgLyogU2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBsYXRlciBlcnJvciBtZXNzYWdlcy4gICovCisKKyAgICAgIGlmIChjdXJfZmlsZW5hbWUpCisJZnJlZShjdXJfZmlsZW5hbWUpOworCisgICAgICBmaWxlID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykrMTsKKyAgICAgIGUgPSBzdHJjaHIoZmlsZSwgJ1wiJyk7CisgICAgICAqZSA9ICdcMCc7CisgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKKyAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CisKKyAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICBzd2l0Y2ggKGxleHN0YXRlKQorICAgIHsKKyAgICBjYXNlIFNUX05PUk1BTDoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgSURFTlQ6CisJICBBUFA7CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCByZXN3b3JkICpyID0gaXNfcmVzZXJ2ZWRfd29yZCh5eXRleHQsIHl5bGVuZyk7CisJICAgIGlmIChyKQorCSAgICAgIHsKKwkJc3dpdGNoICh0b2tlbiA9IHItPnRva2VuKQorCQkgIHsKKwkJICBjYXNlIEFUVFJJQlVURV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BVFRSSUJVVEU7CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJICBjYXNlIEFTTV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BU007CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKworCQkgIGNhc2UgU1RSVUNUX0tFWVc6CisJCSAgY2FzZSBVTklPTl9LRVlXOgorCQkgICAgZG9udF93YW50X2JyYWNlX3BocmFzZSA9IDM7CisJCSAgY2FzZSBFTlVNX0tFWVc6CisJCSAgICBzdXBwcmVzc190eXBlX2xvb2t1cCA9IDI7CisJCSAgICBnb3RvIGZpbmk7CisKKwkJICBjYXNlIEVYUE9SVF9TWU1CT0xfS0VZVzoKKwkJICAgICAgZ290byBmaW5pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmICghc3VwcHJlc3NfdHlwZV9sb29rdXApCisJICAgICAgeworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBmaW5kX3N5bWJvbCh5eXRleHQsIFNZTV9UWVBFREVGKTsKKwkJaWYgKHN5bSAmJiBzeW0tPnR5cGUgPT0gU1lNX1RZUEVERUYpCisJCSAgdG9rZW4gPSBUWVBFOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWyc6CisJICBBUFA7CisJICBsZXhzdGF0ZSA9IFNUX0JSQUNLRVQ7CisJICBjb3VudCA9IDE7CisJICBnb3RvIHJlcGVhdDsKKworCWNhc2UgJ3snOgorCSAgQVBQOworCSAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UpCisJICAgIGJyZWFrOworCSAgbGV4c3RhdGUgPSBTVF9CUkFDRTsKKwkgIGNvdW50ID0gMTsKKwkgIGdvdG8gcmVwZWF0OworCisJY2FzZSAnPSc6IGNhc2UgJzonOgorCSAgQVBQOworCSAgbGV4c3RhdGUgPSBTVF9FWFBSRVNTSU9OOworCSAgYnJlYWs7CisKKwljYXNlIERPVFM6CisJZGVmYXVsdDoKKwkgIEFQUDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVF9BVFRSSUJVVEU6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcpJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEFUVFJJQlVURV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfQVNNOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBBU01fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNLRVQ6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICdbJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICddJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEJSQUNLRVRfUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNFOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBCUkFDRV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfRVhQUkVTU0lPTjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJygnOiBjYXNlICdbJzogY2FzZSAneyc6CisJICArK2NvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6IGNhc2UgJ10nOiBjYXNlICd9JzoKKwkgIC0tY291bnQ7CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcsJzogY2FzZSAnOyc6CisJICBpZiAoY291bnQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFB1dCBiYWNrIHRoZSB0b2tlbiB3ZSBqdXN0IHJlYWQgc28ncyB3ZSBjYW4gZmluZCBpdCBhZ2FpbgorCQkgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGV4cHJlc3Npb24uICAqLworCSAgICAgIHVucHV0KHRva2VuKTsKKworCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworCSAgICAgIHRva2VuID0gRVhQUkVTU0lPTl9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIEFQUDsKKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfVEFCTEVfMToKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV8yOgorICAgICAgaWYgKHRva2VuID09IElERU5UICYmIHl5bGVuZyA9PSAxICYmIHl5dGV4dFswXSA9PSAnWCcpCisJeworCSAgdG9rZW4gPSBFWFBPUlRfU1lNQk9MX0tFWVc7CisJICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzU7CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzY7CisgICAgICAvKiBGQUxMVEhSVSAqLworCisgICAgY2FzZSBTVF9UQUJMRV82OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6IGNhc2UgJ1snOiBjYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBicmVhazsKKwljYXNlICd9JzogY2FzZSAnXSc6IGNhc2UgJyknOgorCSAgLS1jb3VudDsKKwkgIGJyZWFrOworCWNhc2UgJywnOgorCSAgaWYgKGNvdW50ID09IDApCisJICAgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIGJyZWFrOworCX07CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfMzoKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV80OgorICAgICAgaWYgKHRva2VuID09ICc7JykKKwlsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV81OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnLCc6CisJICB0b2tlbiA9ICc7JzsKKwkgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIEFQUDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KK2Zpbmk6CisKKyAgaWYgKHN1cHByZXNzX3R5cGVfbG9va3VwID4gMCkKKyAgICAtLXN1cHByZXNzX3R5cGVfbG9va3VwOworICBpZiAoZG9udF93YW50X2JyYWNlX3BocmFzZSA+IDApCisgICAgLS1kb250X3dhbnRfYnJhY2VfcGhyYXNlOworCisgIHl5bHZhbCA9ICZuZXh0X25vZGUtPm5leHQ7CisKKyAgcmV0dXJuIHRva2VuOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZiMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQKQEAgLTAsMCArMSwxNTc3IEBACisKKy8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIHNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQorICAgIGJ5IEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjggICovCisKKyNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworCisjZGVmaW5lCUFTTV9LRVlXCTI1NworI2RlZmluZQlBVFRSSUJVVEVfS0VZVwkyNTgKKyNkZWZpbmUJQVVUT19LRVlXCTI1OQorI2RlZmluZQlCT09MX0tFWVcJMjYwCisjZGVmaW5lCUNIQVJfS0VZVwkyNjEKKyNkZWZpbmUJQ09OU1RfS0VZVwkyNjIKKyNkZWZpbmUJRE9VQkxFX0tFWVcJMjYzCisjZGVmaW5lCUVOVU1fS0VZVwkyNjQKKyNkZWZpbmUJRVhURVJOX0tFWVcJMjY1CisjZGVmaW5lCUZMT0FUX0tFWVcJMjY2CisjZGVmaW5lCUlOTElORV9LRVlXCTI2NworI2RlZmluZQlJTlRfS0VZVwkyNjgKKyNkZWZpbmUJTE9OR19LRVlXCTI2OQorI2RlZmluZQlSRUdJU1RFUl9LRVlXCTI3MAorI2RlZmluZQlSRVNUUklDVF9LRVlXCTI3MQorI2RlZmluZQlTSE9SVF9LRVlXCTI3MgorI2RlZmluZQlTSUdORURfS0VZVwkyNzMKKyNkZWZpbmUJU1RBVElDX0tFWVcJMjc0CisjZGVmaW5lCVNUUlVDVF9LRVlXCTI3NQorI2RlZmluZQlUWVBFREVGX0tFWVcJMjc2CisjZGVmaW5lCVVOSU9OX0tFWVcJMjc3CisjZGVmaW5lCVVOU0lHTkVEX0tFWVcJMjc4CisjZGVmaW5lCVZPSURfS0VZVwkyNzkKKyNkZWZpbmUJVk9MQVRJTEVfS0VZVwkyODAKKyNkZWZpbmUJVFlQRU9GX0tFWVcJMjgxCisjZGVmaW5lCUVYUE9SVF9TWU1CT0xfS0VZVwkyODIKKyNkZWZpbmUJQVNNX1BIUkFTRQkyODMKKyNkZWZpbmUJQVRUUklCVVRFX1BIUkFTRQkyODQKKyNkZWZpbmUJQlJBQ0VfUEhSQVNFCTI4NQorI2RlZmluZQlCUkFDS0VUX1BIUkFTRQkyODYKKyNkZWZpbmUJRVhQUkVTU0lPTl9QSFJBU0UJMjg3CisjZGVmaW5lCUNIQVIJMjg4CisjZGVmaW5lCURPVFMJMjg5CisjZGVmaW5lCUlERU5UCTI5MAorI2RlZmluZQlJTlQJMjkxCisjZGVmaW5lCVJFQUwJMjkyCisjZGVmaW5lCVNUUklORwkyOTMKKyNkZWZpbmUJVFlQRQkyOTQKKyNkZWZpbmUJT1RIRVIJMjk1CisjZGVmaW5lCUZJTEVOQU1FCTI5NgorCisjbGluZSAyNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgorCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorCitzdGF0aWMgaW50IGlzX3R5cGVkZWY7CitzdGF0aWMgaW50IGlzX2V4dGVybjsKK3N0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7CitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsX3NwZWM7CisKK3N0YXRpYyB2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqKTsKKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfbm9kZShzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5vZGUgPSAqcDsKKyAgKnAgPSBub2RlLT5uZXh0OworICBmcmVlX25vZGUobm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3ZlX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICoqcGIsIHN0cnVjdCBzdHJpbmdfbGlzdCAqKnBlKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmIgPSAqcGIsICplID0gKnBlOworICAqcGIgPSBlOworICBmcmVlX2xpc3QoYiwgZSk7Cit9CisKKyNpZm5kZWYgWVlTVFlQRQorI2RlZmluZSBZWVNUWVBFIGludAorI2VuZGlmCisjaWZuZGVmIFlZREVCVUcKKyNkZWZpbmUgWVlERUJVRyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgY29uc3QKKyNlbmRpZgorI2VuZGlmCisKKworCisjZGVmaW5lCVlZRklOQUwJCTE3MgorI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorI2RlZmluZQlZWU5UQkFTRQk1MgorCisjZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI5NiA/IHl5dHJhbnNsYXRlW3hdIDogOTYpCisKK3N0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDQ2LAorICAgIDQ3LCAgICA0OCwgICAgIDIsICAgIDQ1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1MSwgICAgNDMsICAgICAyLAorICAgIDQ5LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgNTAsICAgICAyLCAgICA0NCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LAorICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIKK307CisKKyNpZiBZWURFQlVHICE9IDAKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCisgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDYsICAgICA5LCAgICAxMCwgICAgMTQsICAgIDE2LCAgICAxOCwgICAgMjAsCisgICAgMjIsICAgIDI1LCAgICAyOCwgICAgMzIsICAgIDMzLCAgICAzNSwgICAgMzcsICAgIDQxLCAgICA0NiwgICAgNDcsCisgICAgNDksICAgIDUxLCAgICA1NCwgICAgNTYsICAgIDU4LCAgICA2MCwgICAgNjIsICAgIDY0LCAgICA2NiwgICAgNjgsCisgICAgNzAsICAgIDcyLCAgICA3NywgICAgODAsICAgIDgzLCAgICA4NiwgICAgOTAsICAgIDk0LCAgICA5OCwgICAxMDEsCisgICAxMDQsICAgMTA3LCAgIDEwOSwgICAxMTEsICAgMTEzLCAgIDExNSwgICAxMTcsICAgMTE5LCAgIDEyMSwgICAxMjMsCisgICAxMjUsICAgMTI3LCAgIDEyOSwgICAxMzIsICAgMTMzLCAgIDEzNSwgICAxMzcsICAgMTQwLCAgIDE0MiwgICAxNDQsCisgICAxNDYsICAgMTQ4LCAgIDE1MSwgICAxNTMsICAgMTU1LCAgIDE2MCwgICAxNjUsICAgMTY4LCAgIDE3MiwgICAxNzYsCisgICAxNzksICAgMTgxLCAgIDE4MywgICAxODUsICAgMTkwLCAgIDE5NSwgICAxOTgsICAgMjAyLCAgIDIwNiwgICAyMDksCisgICAyMTEsICAgMjE1LCAgIDIxNiwgICAyMTgsICAgMjIwLCAgIDIyNCwgICAyMjcsICAgMjMwLCAgIDIzMiwgICAyMzMsCisgICAyMzUsICAgMjM3LCAgIDI0MiwgICAyNDcsICAgMjUwLCAgIDI1NCwgICAyNTgsICAgMjYyLCAgIDI2MywgICAyNjUsCisgICAyNjgsICAgMjcyLCAgIDI3NiwgICAyNzcsICAgMjc5LCAgIDI4MSwgICAyODQsICAgMjg4LCAgIDI5MSwgICAyOTIsCisgICAyOTQsICAgMjk2LCAgIDMwMCwgICAzMDMsICAgMzA2LCAgIDMwOCwgICAzMTEsICAgMzEyLCAgIDMxNCwgICAzMTcsCisgICAzMTgsICAgMzIwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNTMsCisgICAgIDAsICAgIDUyLCAgICA1MywgICAgIDAsICAgICAwLCAgICA1NCwgICAgNTUsICAgICAwLCAgICAgMCwgICAgMjIsCisgICAgNTYsICAgIDU3LCAgICAgMCwgICAgNTcsICAgICAwLCAgICA4MSwgICAgIDAsICAgIDkzLCAgICAgMCwgICAgOTUsCisgICAgIDAsICAgICAxLCAgICA0MywgICAgIDAsICAgICAxLCAgICA0NCwgICAgIDAsICAgIDYxLCAgICA1OCwgICAgNDMsCisgICAgIDAsICAgICAwLCAgICA1OSwgICAgIDAsICAgIDYwLCAgICAgMCwgICAgNTksICAgIDQ1LCAgICA2MCwgICAgIDAsCisgICAgNzEsICAgIDk0LCAgICA5MiwgICAgODIsICAgICAwLCAgICAgMCwgICAgNjIsICAgICAwLCAgICA2MywgICAgIDAsCisgICAgNjIsICAgIDYzLCAgICAgMCwgICAgNjQsICAgICAwLCAgICA2NSwgICAgIDAsICAgICA1LCAgICAgMCwgICAgMTYsCisgICAgIDAsICAgIDIwLCAgICAgMCwgICAgMTEsICAgICAwLCAgICAxMywgICAgIDAsICAgIDY2LCAgICAgMCwgICAgNzAsCisgICAgIDAsICAgIDI3LCAgICA0NiwgICAgNjIsICAgIDQ3LCAgICAgMCwgICAgMjEsICAgIDM2LCAgICAgMCwgICAgMjMsCisgICAgMzYsICAgICAwLCAgICAxMCwgICAgMzYsICAgICAwLCAgICAyMSwgICAgMzYsICAgIDg0LCAgICAgMCwgICAgMjMsCisgICAgMzYsICAgIDg0LCAgICAgMCwgICAgMTAsICAgIDM2LCAgICAzMSwgICAgIDAsICAgIDEwLCAgICAzMSwgICAgIDAsCisgICAgMjEsICAgIDg0LCAgICAgMCwgICAgMjMsICAgIDg0LCAgICAgMCwgICAgIDcsICAgICAwLCAgICAxOCwgICAgIDAsCisgICAgMTQsICAgICAwLCAgICAxNSwgICAgIDAsICAgIDE5LCAgICAgMCwgICAgMjQsICAgICAwLCAgICAxMiwgICAgIDAsCisgICAgIDksICAgICAwLCAgICAyNSwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDAsICAgICAwLCAgICA0OCwgICAgNjgsCisgICAgIDAsICAgICAwLCAgICA2OSwgICAgIDAsICAgIDcwLCAgICAgMCwgICAgNjksICAgIDcwLCAgICAgMCwgICAgIDgsCisgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMzAsICAgICAwLCAgICAxNywgICAgIDAsICAgIDY3LCAgICA3MSwgICAgIDAsCisgICAgNzIsICAgICAwLCAgICAzNiwgICAgIDAsICAgIDcyLCAgICA0NiwgICAgNzUsICAgIDQ3LCAgICAgMCwgICAgNzIsCisgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDcyLCAgICAzMiwgICAgIDAsICAgIDQ2LCAgICA3MSwgICAgNDcsCisgICAgIDAsICAgIDQ2LCAgICAgMSwgICAgNDcsICAgICAwLCAgICA2NywgICAgNzMsICAgICAwLCAgICA3NCwgICAgIDAsCisgICAgMzYsICAgICAwLCAgICA0MCwgICAgIDAsICAgIDc0LCAgICA0NiwgICAgNzUsICAgIDQ3LCAgICAgMCwgICAgNzQsCisgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDc0LCAgICAzMiwgICAgIDAsICAgIDQ2LCAgICA3MywgICAgNDcsCisgICAgIDAsICAgIDQ2LCAgICAgMSwgICAgNDcsICAgICAwLCAgICA3NiwgICAgMzUsICAgICAwLCAgICA3NiwgICAgIDAsCisgICAgNzcsICAgIDQ1LCAgICAzNSwgICAgIDAsICAgICAwLCAgICA3NywgICAgIDAsICAgIDc4LCAgICAgMCwgICAgNzcsCisgICAgNDUsICAgIDc4LCAgICAgMCwgICAgNjIsICAgIDc5LCAgICAgMCwgICAgNjcsICAgIDc5LCAgICAgMCwgICAgODAsCisgICAgIDAsICAgICAwLCAgICAzNiwgICAgIDAsICAgIDQwLCAgICAgMCwgICAgODAsICAgIDQ2LCAgICA3NSwgICAgNDcsCisgICAgIDAsICAgIDgwLCAgICA0NiwgICAgIDEsICAgIDQ3LCAgICAgMCwgICAgODAsICAgIDMyLCAgICAgMCwgICAgNDYsCisgICAgNzksICAgIDQ3LCAgICAgMCwgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDYxLCAgICA3MSwgICAgMzEsCisgICAgIDAsICAgICAwLCAgICA4MywgICAgIDAsICAgIDQ5LCAgICAzMywgICAgIDAsICAgIDUwLCAgICA4NSwgICAgNDQsCisgICAgIDAsICAgIDUwLCAgICAgMSwgICAgNDQsICAgICAwLCAgICAgMCwgICAgODYsICAgICAwLCAgICA4NywgICAgIDAsCisgICAgODYsICAgIDg3LCAgICAgMCwgICAgNjEsICAgIDg4LCAgICA0MywgICAgIDAsICAgICAxLCAgICA0MywgICAgIDAsCisgICAgIDAsICAgIDg5LCAgICAgMCwgICAgOTAsICAgICAwLCAgICA4OSwgICAgNDUsICAgIDkwLCAgICAgMCwgICAgNzMsCisgICAgOTIsICAgICAwLCAgICAzNiwgICAgOTEsICAgICAwLCAgICA5MSwgICAgIDAsICAgIDUxLCAgICAzMywgICAgIDAsCisgICAgIDAsICAgIDMwLCAgICAgMCwgICAgMjksICAgIDQzLCAgICAgMCwgICAgIDAsICAgIDI5LCAgICAgMCwgICAgMjgsCisgICAgNDYsICAgIDM2LCAgICA0NywgICAgNDMsICAgICAwCit9OworCisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKKyAgIDEwMSwgICAxMDMsICAgMTA2LCAgIDEwOSwgICAxMTIsICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE3LCAgIDExOCwKKyAgIDExOSwgICAxMjAsICAgMTIzLCAgIDEzNywgICAxMzksICAgMTQyLCAgIDE1MSwgICAxNjMsICAgMTY5LCAgIDE3MSwKKyAgIDE3NCwgICAxNzYsICAgMTc5LCAgIDE4NiwgICAxODksICAgMTkxLCAgIDE5MiwgICAxOTMsICAgMTk0LCAgIDE5NywKKyAgIDE5OSwgICAyMDAsICAgMjA0LCAgIDIwNiwgICAyMDgsICAgMjEyLCAgIDIxOSwgICAyMjYsICAgMjM1LCAgIDIzNiwKKyAgIDIzNywgICAyNDAsICAgMjQyLCAgIDI0MywgICAyNDQsICAgMjQ1LCAgIDI0NiwgICAyNDcsICAgMjQ4LCAgIDI0OSwKKyAgIDI1MCwgICAyNTEsICAgMjU0LCAgIDI1OSwgICAyNjEsICAgMjY0LCAgIDI2NiwgICAyNjksICAgMjcwLCAgIDI3MCwKKyAgIDI3MSwgICAyNzgsICAgMjgwLCAgIDI4MywgICAyOTMsICAgMjk1LCAgIDI5NywgICAyOTksICAgMzAxLCAgIDMwNywKKyAgIDMwOSwgICAzMTIsICAgMzE0LCAgIDMxNSwgICAzMTcsICAgMzE5LCAgIDMyMSwgICAzMjMsICAgMzI3LCAgIDMyOSwKKyAgIDMzMCwgICAzMzMsICAgMzM1LCAgIDMzOCwgICAzNDAsICAgMzQ0LCAgIDM0OSwgICAzNTIsICAgMzU1LCAgIDM1NywKKyAgIDM2NSwgICAzNjksICAgMzcxLCAgIDM3MywgICAzNzUsICAgMzc3LCAgIDM4MSwgICAzOTAsICAgMzkyLCAgIDM5NiwKKyAgIDQwMSwgICA0MDMsICAgNDA2LCAgIDQwOCwgICA0MTEsICAgNDEzLCAgIDQxNiwgICA0MTksICAgNDIzLCAgIDQyNSwKKyAgIDQyOCwgICA0MzAsICAgNDMzLCAgIDQzNSwgICA0MzYsICAgNDM5LCAgIDQ0MywgICA0NDUsICAgNDQ4LCAgIDQ1MiwKKyAgIDQ1NCwgICA0NTcKK307CisjZW5kaWYKKworCisjaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiQVNNX0tFWVciLAorIkFUVFJJQlVURV9LRVlXIiwiQVVUT19LRVlXIiwiQk9PTF9LRVlXIiwiQ0hBUl9LRVlXIiwiQ09OU1RfS0VZVyIsIkRPVUJMRV9LRVlXIiwKKyJFTlVNX0tFWVciLCJFWFRFUk5fS0VZVyIsIkZMT0FUX0tFWVciLCJJTkxJTkVfS0VZVyIsIklOVF9LRVlXIiwiTE9OR19LRVlXIiwKKyJSRUdJU1RFUl9LRVlXIiwiUkVTVFJJQ1RfS0VZVyIsIlNIT1JUX0tFWVciLCJTSUdORURfS0VZVyIsIlNUQVRJQ19LRVlXIiwiU1RSVUNUX0tFWVciLAorIlRZUEVERUZfS0VZVyIsIlVOSU9OX0tFWVciLCJVTlNJR05FRF9LRVlXIiwiVk9JRF9LRVlXIiwiVk9MQVRJTEVfS0VZVyIsIlRZUEVPRl9LRVlXIiwKKyJFWFBPUlRfU1lNQk9MX0tFWVciLCJBU01fUEhSQVNFIiwiQVRUUklCVVRFX1BIUkFTRSIsIkJSQUNFX1BIUkFTRSIsIkJSQUNLRVRfUEhSQVNFIiwKKyJFWFBSRVNTSU9OX1BIUkFTRSIsIkNIQVIiLCJET1RTIiwiSURFTlQiLCJJTlQiLCJSRUFMIiwiU1RSSU5HIiwiVFlQRSIsIk9USEVSIiwKKyJGSUxFTkFNRSIsIic7JyIsIid9JyIsIicsJyIsIicoJyIsIicpJyIsIicqJyIsIic9JyIsIid7JyIsIic6JyIsImRlY2xhcmF0aW9uX3NlcSIsCisiZGVjbGFyYXRpb24iLCJAMSIsImRlY2xhcmF0aW9uMSIsIkAyIiwic2ltcGxlX2RlY2xhcmF0aW9uIiwiaW5pdF9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwKKyJpbml0X2RlY2xhcmF0b3JfbGlzdCIsImluaXRfZGVjbGFyYXRvciIsImRlY2xfc3BlY2lmaWVyX3NlcV9vcHQiLCJkZWNsX3NwZWNpZmllcl9zZXEiLAorImRlY2xfc3BlY2lmaWVyIiwic3RvcmFnZV9jbGFzc19zcGVjaWZpZXIiLCJ0eXBlX3NwZWNpZmllciIsInNpbXBsZV90eXBlX3NwZWNpZmllciIsCisicHRyX29wZXJhdG9yIiwiY3Zhcl9xdWFsaWZpZXJfc2VxX29wdCIsImN2YXJfcXVhbGlmaWVyX3NlcSIsImN2YXJfcXVhbGlmaWVyIiwKKyJkZWNsYXJhdG9yIiwiZGlyZWN0X2RlY2xhcmF0b3IiLCJuZXN0ZWRfZGVjbGFyYXRvciIsImRpcmVjdF9uZXN0ZWRfZGVjbGFyYXRvciIsCisicGFyYW1ldGVyX2RlY2xhcmF0aW9uX2NsYXVzZSIsInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0X29wdCIsInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0IiwKKyJwYXJhbWV0ZXJfZGVjbGFyYXRpb24iLCJtX2Fic3RyYWN0X2RlY2xhcmF0b3IiLCJkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yIiwKKyJmdW5jdGlvbl9kZWZpbml0aW9uIiwiaW5pdGlhbGl6ZXJfb3B0IiwiaW5pdGlhbGl6ZXIiLCJjbGFzc19ib2R5IiwibWVtYmVyX3NwZWNpZmljYXRpb25fb3B0IiwKKyJtZW1iZXJfc3BlY2lmaWNhdGlvbiIsIm1lbWJlcl9kZWNsYXJhdGlvbiIsIm1lbWJlcl9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwibWVtYmVyX2RlY2xhcmF0b3JfbGlzdCIsCisibWVtYmVyX2RlY2xhcmF0b3IiLCJtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvciIsImF0dHJpYnV0ZV9vcHQiLCJhc21fZGVmaW5pdGlvbiIsCisiYXNtX3BocmFzZV9vcHQiLCJleHBvcnRfZGVmaW5pdGlvbiIsIE5VTEwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCisgICAgNTIsICAgIDUyLCAgICA1NCwgICAgNTMsICAgIDU2LCAgICA1NSwgICAgNTUsICAgIDU1LCAgICA1NSwgICAgNTUsCisgICAgNTUsICAgIDU1LCAgICA1NywgICAgNTgsICAgIDU4LCAgICA1OSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjEsCisgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjMsICAgIDY0LCAgICA2NCwgICAgNjQsICAgIDY0LCAgICA2NCwgICAgNjUsCisgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsCisgICAgNjUsICAgIDY2LCAgICA2NiwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjYsCisgICAgNjYsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY4LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MCwgICAgNzAsCisgICAgNzAsICAgIDcxLCAgICA3MSwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzMsCisgICAgNzMsICAgIDc0LCAgICA3NCwgICAgNzQsICAgIDc0LCAgICA3NCwgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsCisgICAgNzUsICAgIDc2LCAgICA3NiwgICAgNzcsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDc5LCAgICA4MCwgICAgODAsCisgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MiwgICAgODMsCisgICAgODQsICAgIDg0LCAgICA4NSwgICAgODUsICAgIDg2LCAgICA4NiwgICAgODcsICAgIDg3LCAgICA4OCwgICAgODgsCisgICAgODksICAgIDg5LCAgICA5MCwgICAgOTAsICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkyLCAgICA5MywgICAgOTQsCisgICAgOTQsICAgIDk1Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKKyAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDAsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDQsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwKKyAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMiwKKyAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDQsICAgICAyLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwKKyAgICAgMywgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMiwKKyAgICAgMywgICAgIDMsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDIsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMCwKKyAgICAgMSwgICAgIDUKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMywKKyAgICAgMywgICAgIDEsICAgICAwLCAgICAgMiwgICAgIDAsICAgIDI1LCAgICA1MSwgICAgNDIsICAgIDU4LCAgICA0OSwKKyAgICAgMCwgICAgMjgsICAgIDQ4LCAgICAyOSwgICAgNDQsICAgIDQ1LCAgICAyNiwgICAgNjEsICAgIDQzLCAgICA0NiwKKyAgICAyNywgICAgIDAsICAgICA1LCAgICAgMCwgICAgNDcsICAgIDUwLCAgICA1OSwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICA2MCwgICAgNTIsICAgICA0LCAgICAgNywgICAgMTQsICAgIDIwLCAgICAyMSwgICAgMjMsICAgIDI0LCAgICAzMCwKKyAgICAzMSwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAzOSwgICAgMzUsICAgIDMzLCAgICAgMCwKKyAgICA0MCwgICAgMTksICAgIDM0LCAgICA0MSwgICAgIDAsICAgICAwLCAgIDExOSwgICAgNjQsICAgICAwLCAgICA1NCwKKyAgICAgMCwgICAgMTUsICAgIDE2LCAgICAgMCwgICAxMjAsICAgIDYzLCAgICAyMiwgICAgMzgsICAgIDM2LCAgICAgMCwKKyAgIDEwOSwgICAgIDAsICAgICAwLCAgIDEwNSwgICAgIDYsICAgIDE0LCAgICAzNywgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMCwgICAgNTMsICAgIDU1LCAgICA1NiwgICAgMTMsICAgICAwLCAgICA2MiwgICAxMjEsICAgIDk3LCAgIDExNywKKyAgICA2NywgICAgIDAsICAgMTA4LCAgIDEwMiwgICAgNzIsICAgIDczLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDExNywKKyAgICA3MSwgICAgIDAsICAgMTEwLCAgIDExMSwgICAxMTUsICAgMTAxLCAgICAgMCwgICAxMDYsICAgMTIwLCAgICAzMiwKKyAgICAgMCwgICAgNjksICAgIDY4LCAgICA1NywgICAgMTcsICAgMTE4LCAgICA5OCwgICAgIDAsICAgIDg5LCAgICAgMCwKKyAgICA4MCwgICAgODMsICAgIDg0LCAgIDExNCwgICAgIDAsICAgIDcyLCAgICAgMCwgICAxMTYsICAgIDcwLCAgIDExMywKKyAgICA3NiwgICAgIDAsICAgMTA3LCAgICAgMCwgICAxMjIsICAgICAwLCAgICAxOCwgICAgOTksICAgIDY2LCAgICA5MCwKKyAgICA1MiwgICAgIDAsICAgIDg5LCAgICA4NiwgICAgODgsICAgIDY1LCAgICA3OSwgICAgIDAsICAgIDc4LCAgICA3NywKKyAgICAgMCwgICAgIDAsICAgMTEyLCAgIDEwMCwgICAgIDAsICAgIDkxLCAgICAgMCwgICAgODcsICAgIDk0LCAgICAgMCwKKyAgICA4MSwgICAgODUsICAgIDc1LCAgICA3NCwgICAgOTYsICAgIDk1LCAgICAgMCwgICAgIDAsICAgIDkzLCAgICA5MiwKKyAgICAgMCwgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAgIDEsCisgICAgIDIsICAgICAzLCAgICAzMywgICAgNTIsICAgIDM0LCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA3MSwgICAgMzYsCisgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDY0LCAgICA4MiwgICAgODMsICAgIDQxLCAgIDEwOSwgICAgNjYsCisgICAxMDAsICAgMTAxLCAgIDEyMCwgICAxMjEsICAgMTIyLCAgIDEyMywgICAxNDQsICAgMTQ1LCAgICA0MiwgICAxMzcsCisgICAxMzgsICAgIDUxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMTcsCisgICAgNDMsICAgIDkwLCAgICA0NAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0gey0zMjc2OCwKKyAgICAxNSwtMzI3NjgsICAgMTk3LC0zMjc2OCwgICAgMjMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKyAgIC0xOCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAtMjgsLTMyNzY4LCAgIC0yNSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAtMjYsICAgLTIyLCAgIC0xMiwKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNDksICAgNDkzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMjcsICAgIC04LCAgIDEwMSwKKy0zMjc2OCwgICA0OTMsICAgIC04LC0zMjc2OCwgICA0OTMsICAgIDEwLC0zMjc2OCwtMzI3NjgsICAgIDExLCAgICAgOSwKKyAgICAxOCwgICAgMjYsLTMyNzY4LCAgICA0OSwgICAtMTUsICAgLTEzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAyNSwKKyAgICAyNCwgICAgNDgsICAgMTQ5LC0zMjc2OCwtMzI3NjgsICAgIDQ5LC0zMjc2OCwgICA0MTQsICAgIDM5LCAgICA0MCwKKyAgICA0NywtMzI3NjgsICAgICA5LC0zMjc2OCwtMzI3NjgsICAgIDQ5LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2NiwKKy0zMjc2OCwgICAyNDEsLTMyNzY4LC0zMjc2OCwgICAgNTAsLTMyNzY4LCAgICAgNSwgICAgNjUsICAgIDQyLCAgICA2NiwKKyAgICAxNywgICAgNTYsICAgIDU1LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2MCwtMzI3NjgsICAgIDc1LC0zMjc2OCwKKyAgICA4MCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA4MSwgICAgODIsICAgMzcwLCAgICA4NSwKKyAgICA5OCwgICAgODksLTMyNzY4LC0zMjc2OCwgICAgODgsLTMyNzY4LCAgICA5MSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAyODQsLTMyNzY4LCAgICAyNCwtMzI3NjgsICAgMTAzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAgIDgsICAgIDQzLC0zMjc2OCwgICAgMzAsLTMyNzY4LC0zMjc2OCwgICA0NTcsLTMyNzY4LC0zMjc2OCwKKyAgICA5MiwgICAgOTMsLTMyNzY4LC0zMjc2OCwgICAgOTUsLTMyNzY4LCAgICA5NiwtMzI3NjgsLTMyNzY4LCAgIDMyNywKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA5OSwgICAxMDQsLTMyNzY4LC0zMjc2OCwKKyAgIDE0OCwtMzI3NjgKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAorICAgMTUyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDExOSwtMzI3NjgsLTMyNzY4LCAgICA5NCwgICAgIDAsICAgLTU1LAorICAgLTM1LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIC02OSwtMzI3NjgsLTMyNzY4LCAgIC01NiwgICAtMzAsLTMyNzY4LAorICAgLTc2LC0zMjc2OCwgIC0xMjIsLTMyNzY4LC0zMjc2OCwgICAgMjksICAgLTYyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorLTMyNzY4LCAgIC0xNywtMzI3NjgsLTMyNzY4LCAgIDEwNSwtMzI3NjgsLTMyNzY4LCAgICA1MiwgICAgODYsICAgIDgzLAorLTMyNzY4LC0zMjc2OCwtMzI3NjgKK307CisKKworI2RlZmluZQlZWUxBU1QJCTUzMworCisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDc4LAorICAgIDY3LCAgICA5OSwgICAgMzUsICAgIDg0LCAgICA2NSwgICAxMjUsICAgIDU0LCAgICA0OSwgICAxNTUsICAgMTUyLAorICAgIDUzLCAgICA4MCwgICAgNDcsICAgIDg4LCAgIDE3MSwgICAgODksICAgICA5LCAgICA0OCwgICAgOTEsICAgIDU1LAorICAgMTI3LCAgICA1MCwgICAxMjksICAgIDU2LCAgICA1MCwgICAgMTgsICAgMTE0LCAgICA5OSwgICAgODEsICAgIDk5LAorICAgIDU3LCAgICA2OSwgICAgOTIsICAgIDg3LCAgICAyNywgICAgNzcsICAgMTE5LCAgIDE2OCwgICAgMzEsICAgLTg5LAorICAgMTI2LCAgICA1MCwgICAgNjcsICAgMTQwLCAgICA5NiwgICAgNzksICAgIDU4LCAgIDE1NiwgICAxMzEsICAgMTQzLAorICAgIDk3LCAgICA3NiwgICAgNjAsICAgMTQyLCAgIC04OSwgICAgNjAsICAgIDU5LCAgICA2OCwgICAgNjAsICAgIDk1LAorICAgIDg1LCAgIDE1OSwgICAxMzIsICAgIDk2LCAgICA5OSwgICAgNDUsICAgIDQ2LCAgICA5MywgICAgOTQsICAgIDk3LAorICAgIDg2LCAgICA2MCwgICAxNDMsICAgMTQzLCAgICA5OCwgICAxNjAsICAgMTE5LCAgIDEyNiwgICAxNDAsICAgMTU3LAorICAgMTU4LCAgICA5NiwgICAxNTYsICAgIDY3LCAgICA1OCwgICAxMTEsICAgMTEyLCAgICA5NywgICAxNDIsICAgIDYwLAorICAgIDYwLCAgIDEwNiwgICAxMTksICAgMTEzLCAgICA1OSwgICAxMTYsICAgIDYwLCAgIDEyOCwgICAxMzMsICAgMTM0LAorICAgIDk4LCAgICA3MCwgICAgOTMsICAgIDg4LCAgIDExOSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAyMiwgICAxMzUsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAxMzksICAgMTM2LAorICAgIDMxLCAgIDE0NiwgICAxNDcsICAgMTQ4LCAgIDE0OSwgICAxNTQsICAgLTE5LCAgIDE1MCwgICAxNjMsICAgMTY0LAorICAgIDMyLCAgIDE2NSwgICAxNjYsICAgLTE5LCAgLTEwMywgICAxNjksICAgLTE5LCAgIDE3MiwgICAtMTksICAgMTA3LAorICAgMTcwLCAgIC0xOSwgICAgIDQsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAorICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAorICAgIDc1LCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgMTYyLCAgIDEwOCwgICAgMzEsICAgMTE1LAorICAgMTI0LCAgICAgMCwgICAxMzAsICAgICAwLCAgIC0xOSwgICAxNTMsICAgICAwLCAgICAgMCwgICAgMzIsICAgICAwLAorICAgICAwLCAgIC0xOSwgIC0xMDQsICAgICAwLCAgIC0xOSwgICAgIDAsICAgLTE5LCAgICAgNSwgICAgIDAsICAgLTE5LAorICAgICAwLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAtMTksICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgLTE5LAorICAgICAwLCAgIDExOCwgICAtMTksICAgICAwLCAgIC0xOSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgIDAsICAgICAwLAorICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAtODIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1MSwgICAgIDAsICAgICAwLCAgIC04MiwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAtODIsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE2NywgICAgIDAsICAgICAwLAorICAgLTgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgIC04MiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgLTgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgIDIyLCAgICAgMCwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDIsICAgICAwLCAgICA2MCwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgMTEwLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgIDE2MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAorICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LAorICAgICAwLCAgICAgMCwgICAgMzEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgMzIKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgIDU1LAorICAgIDM2LCAgICA3MSwgICAgIDMsICAgIDYwLCAgICAzNSwgICAgIDEsICAgIDI0LCAgICAzNiwgICAgIDEsICAgMTMyLAorICAgIDM2LCAgICAgMSwgICAgMzEsICAgIDI5LCAgICAgMCwgICAgMzEsICAgICA4LCAgICAzNiwgICAgMzIsICAgIDQ2LAorICAgIDk3LCAgICA1MCwgICAgOTksICAgIDQ2LCAgICA1MCwgICAgMTcsICAgIDgzLCAgICA5NywgICAgNTksICAgIDk5LAorICAgIDQzLCAgICA0OSwgICAgNDYsICAgIDY0LCAgICAyNiwgICAgNTMsICAgIDkyLCAgIDE2MCwgICAgMzAsICAgIDMyLAorICAgIDM2LCAgICA1MCwgICAgNzgsICAgIDM2LCAgICA0MCwgICAgMzYsICAgIDM2LCAgICA0MCwgICAgMzIsICAgMTE5LAorICAgIDQ2LCAgICA1MiwgICAgNDgsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ2LCAgICAzMSwgICAgNDgsICAgIDM2LAorICAgIDQzLCAgICAzMiwgICAgNDYsICAgIDQwLCAgIDEzNCwgICAgNDMsICAgIDQ0LCAgICA0MywgICAgNDQsICAgIDQ2LAorICAgIDQ1LCAgICA0OCwgICAxNDIsICAgMTQzLCAgICA1MSwgICAgNDYsICAgMTMyLCAgICAzNiwgICAgMzYsICAgMTQyLAorICAgMTQzLCAgICA0MCwgICAgNDAsICAgMTE5LCAgICAzNiwgICAgNDcsICAgIDQ3LCAgICA0NiwgICAgNDYsICAgIDQ4LAorICAgIDQ4LCAgICA0NCwgICAxNDgsICAgIDQ3LCAgICA0NiwgICAgMzAsICAgIDQ4LCAgICAzMywgICAgNDMsICAgIDQ1LAorICAgIDUxLCAgICAgMSwgICAgNDMsICAgIDI5LCAgIDE2MCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgIDIwLCAgICAyMSwgICAgNDMsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgNDcsICAgIDQ5LAorICAgIDMwLCAgICA0NywgICAgMzUsICAgIDQ1LCAgICA0NywgICAgMzMsICAgIDM2LCAgICA0NywgICAgNDcsICAgIDQ3LAorICAgIDQwLCAgICA0NywgICAgNDcsICAgIDQzLCAgICA0NCwgICAgNDcsICAgIDQ2LCAgICAgMCwgICAgNDgsICAgICAxLAorICAgIDQ3LCAgICA1MSwgICAgIDEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgIDUyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgMTQ4LCAgICA3MywgICAgMzAsICAgIDg2LAorICAgIDk1LCAgICAtMSwgICAxMDAsICAgIC0xLCAgICAzNiwgICAxMzQsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIC0xLAorICAgIC0xLCAgICA0MywgICAgNDQsICAgIC0xLCAgICA0NiwgICAgLTEsICAgIDQ4LCAgICAgMSwgICAgLTEsICAgIDUxLAorICAgIC0xLCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIDQzLAorICAgIC0xLCAgICAgMSwgICAgNDYsICAgIC0xLCAgICA0OCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgLTEsICAgIC0xLAorICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMSwgICAgLTEsICAgIC0xLCAgICA0NywgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzUsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMSwgICAgLTEsICAgIC0xLAorICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAzNSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAtMSwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDYsICAgIC0xLCAgICA0OCwgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAzNSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAgNSwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAtMSwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIC0xLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgNDAKK307CisvKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLworI2xpbmUgMyAiL3Vzci9saWIvYmlzb24uc2ltcGxlIgorLyogVGhpcyBmaWxlIGNvbWVzIGZyb20gYmlzb24tMS4yOC4gICovCisKKy8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAorICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQorICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisKKy8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCisgIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KKyAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCisgIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCisKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjaWZkZWYgYWxsb2NhCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2Vsc2UgLyogYWxsb2NhIG5vdCBkZWZpbmVkICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZSAvKiBub3QgR05VIEMuICAqLworI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkgfHwgKGRlZmluZWQgKF9fc3VuKSAmJiBkZWZpbmVkIChfX2kzODYpKQorI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbHNlIC8qIG5vdCBzcGFyYyAqLworLyogV2UgdGhpbmsgdGhpcyB0ZXN0IGRldGVjdHMgV2F0Y29tIGFuZCBNaWNyb3NvZnQgQy4gICovCisvKiBUaGlzIHVzZWQgdG8gdGVzdCBNU0RPUywgYnV0IHRoYXQgaXMgYSBiYWQgaWRlYQorICAgc2luY2UgdGhhdCBzeW1ib2wgaXMgaW4gdGhlIHVzZXIgbmFtZXNwYWNlLiAgKi8KKyNpZiAoZGVmaW5lZCAoX01TRE9TKSB8fCBkZWZpbmVkIChfTVNET1NfKSkgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCisjaWYgMCAvKiBObyBuZWVkIGZvciBtYWxsb2MuaCwgd2hpY2ggcG9sbHV0ZXMgdGhlIG5hbWVzcGFjZTsKKwkgaW5zdGVhZCwganVzdCBkb24ndCB1c2UgYWxsb2NhLiAgKi8KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCisjaWYgZGVmaW5lZChfQUlYKQorLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyB3YXMgbmVlZGVkIGZvciwgYnV0IGl0IHBvbGx1dGVzIHRoZSBuYW1lc3BhY2UuCisgICBTbyBJIHR1cm5lZCBpdCBvZmYuICAgcm1zLCAyIE1heSAxOTk3LiAgKi8KKy8qICNpbmNsdWRlIDxtYWxsb2MuaD4gICovCisgI3ByYWdtYSBhbGxvY2EKKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KKyNpZiAwCisjaWZkZWYgX19ocHV4IC8qIGhhaWJsZUBpbG9nLmZyIHNheXMgdGhpcyB3b3JrcyBmb3IgSFBVWCA5LjA1IGFuZCB1cCwKKwkJIGFuZCBvbiBIUFVYIDEwLiAgRXZlbnR1YWxseSB3ZSBjYW4gdHVybiB0aGlzIG9uLiAgKi8KKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZW5kaWYgLyogX19ocHV4ICovCisjZW5kaWYKKyNlbmRpZiAvKiBub3QgX0FJWCAqLworI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLworI2VuZGlmIC8qIG5vdCBzcGFyYyAqLworI2VuZGlmIC8qIG5vdCBHTlUgQyAqLworI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZCAqLworI2VuZGlmIC8qIFlZU1RBQ0tfVVNFX0FMTE9DQSBub3QgZGVmaW5lZCAqLworCisjaWZkZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjZWxzZQorI2RlZmluZSBZWVNUQUNLX0FMTE9DIG1hbGxvYworI2VuZGlmCisKKy8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgorICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KKyAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLworCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJLTIKKyNkZWZpbmUgWVlFT0YJCTAKKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorI2RlZmluZSBZWUFCT1JUIAlnb3RvIHl5YWJvcnRsYWIKKyNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgorICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKKyAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisjZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAorICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCit3aGlsZSAoMCkKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworI2lmbmRlZiBZWVBVUkUKKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKKyNlbmRpZgorCisjaWZkZWYgWVlQVVJFCisjaWZkZWYgWVlMU1BfTkVFREVECisjaWZkZWYgWVlMRVhfUEFSQU0KKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQorI2Vsc2UKKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCisjZW5kaWYKKyNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KKyNpZmRlZiBZWUxFWF9QQVJBTQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCisjZWxzZQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKKyNlbmRpZgorI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KKyNlbmRpZgorCisvKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLworCisjaWZuZGVmIFlZUFVSRQorCitpbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KK1lZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLworCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KKworI2lmZGVmIFlZTFNQX05FRURFRAorWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KKwkJCQkvKiAgc3ltYm9sCQkJCSovCisjZW5kaWYKKworaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCisjZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KKworI2lmIFlZREVCVUcgIT0gMAoraW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KKy8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCisgICBmcm9tIGNvZXhpc3RpbmcuICAqLworI2VuZGlmCisKKy8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCisKKyNpZm5kZWYJWVlJTklUREVQVEgKKyNkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCisgICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KKworI2lmIFlZTUFYREVQVEggPT0gMAorI3VuZGVmIFlZTUFYREVQVEgKKyNlbmRpZgorCisjaWZuZGVmIFlZTUFYREVQVEgKKyNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAorI2VuZGlmCisMCisvKiBEZWZpbmUgX195eV9tZW1jcHkuICBOb3RlIHRoYXQgdGhlIHNpemUgYXJndW1lbnQKKyAgIHNob3VsZCBiZSBwYXNzZWQgd2l0aCB0eXBlIHVuc2lnbmVkIGludCwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgdGhlIG5vbi1HQ0MKKyAgIGRlZmluaXRpb25zIHJlcXVpcmUuICBXaXRoIEdDQywgX19idWlsdGluX21lbWNweSB0YWtlcyBhbiBhcmcKKyAgIG9mIHR5cGUgc2l6ZV90LCBidXQgaXQgY2FuIGhhbmRsZSB1bnNpZ25lZCBpbnQuICAqLworCisjaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCisjZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKKyNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKworLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKKyAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KK3N0YXRpYyB2b2lkCitfX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQorICAgICBjaGFyICp0bzsKKyAgICAgY2hhciAqZnJvbTsKKyAgICAgdW5zaWduZWQgaW50IGNvdW50OworeworICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKKyAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOworICByZWdpc3RlciBpbnQgaSA9IGNvdW50OworCisgIHdoaWxlIChpLS0gPiAwKQorICAgICp0KysgPSAqZisrOworfQorCisjZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcworICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLworc3RhdGljIHZvaWQKK19feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgdW5zaWduZWQgaW50IGNvdW50KQoreworICByZWdpc3RlciBjaGFyICp0ID0gdG87CisgIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOworICByZWdpc3RlciBpbnQgaSA9IGNvdW50OworCisgIHdoaWxlIChpLS0gPiAwKQorICAgICp0KysgPSAqZisrOworfQorCisjZW5kaWYKKyNlbmRpZgorDAorI2xpbmUgMjE3ICIvdXNyL2xpYi9iaXNvbi5zaW1wbGUiCisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKKyAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KKyAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCisgICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAorICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQorI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFlZUEFSU0VfUEFSQU0KK2ludCB5eXBhcnNlICh2b2lkICopOworI2Vsc2UKK2ludCB5eXBhcnNlICh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKK2ludAoreXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKKyAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCit7CisgIHJlZ2lzdGVyIGludCB5eXN0YXRlOworICByZWdpc3RlciBpbnQgeXluOworICByZWdpc3RlciBzaG9ydCAqeXlzc3A7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCisgIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLworCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLworCisgIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KKyAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOworICBZWUxUWVBFICp5eWxzcDsKKworI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCisjZWxzZQorI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKyAgaW50IHl5ZnJlZV9zdGFja3MgPSAwOworCisjaWZkZWYgWVlQVVJFCisgIGludCB5eWNoYXI7CisgIFlZU1RZUEUgeXlsdmFsOworICBpbnQgeXluZXJyczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxsb2M7CisjZW5kaWYKKyNlbmRpZgorCisgIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLworCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCisJCQkJLyogIHJvdXRpbmVzCQkJCSovCisKKyAgaW50IHl5bGVuOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3MgLSAxOworICB5eXZzcCA9IHl5dnM7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorCisvKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KKy8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCisgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLworeXluZXdzdGF0ZToKKworICAqKyt5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCisgICAgeworICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCisgICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLworICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOworICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKKyNlbmRpZgorCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCisJIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCisJIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZWxzZQorICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZW5kaWYKKworICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICB5eWxzID0geXlsczE7CisjZW5kaWYKKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCisJeworCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisJICBpZiAoeXlmcmVlX3N0YWNrcykKKwkgICAgeworCSAgICAgIGZyZWUgKHl5c3MpOworCSAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorCSAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisJICAgIH0KKwkgIHJldHVybiAyOworCX0KKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisgICAgICB5eWZyZWVfc3RhY2tzID0gMTsKKyNlbmRpZgorICAgICAgeXlzcyA9IChzaG9ydCAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlzc3ApKTsKKyAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXl2c3ApKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlsc3ApKTsKKyNlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOworI2VuZGlmCisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKKyNlbmRpZgorCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKKyNlbmRpZgorCisgIGdvdG8geXliYWNrdXA7CisgeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKKyNlbmRpZgorICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOworCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZworCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLworI2lmZGVmIFlZUFJJTlQKKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworI2VuZGlmCisJICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgeXluICs9IHl5Y2hhcjE7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisKKyAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgorICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCisgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCisgICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworCisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKy8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLworeXlkZWZhdWx0OgorCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworeXlyZWR1Y2U6CisgIHl5bGVuID0geXlyMlt5eW5dOworICBpZiAoeXlsZW4gPiAwKQorICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQorCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworCisgIHN3aXRjaCAoeXluKSB7CisKK2Nhc2UgMzoKKyNsaW5lIDEwNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc190eXBlZGVmID0gMDsgaXNfZXh0ZXJuID0gMDsgY3VycmVudF9uYW1lID0gTlVMTDsgZGVjbF9zcGVjID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgNDoKKyNsaW5lIDEwOSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBmcmVlX2xpc3QoKnl5dnNwWzBdLCBOVUxMKTsgKnl5dnNwWzBdID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgNToKKyNsaW5lIDExMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc190eXBlZGVmID0gMTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjoKKyNsaW5lIDExNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMToKKyNsaW5lIDExOSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjoKKyNsaW5lIDEyMCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMzoKKyNsaW5lIDEyNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpZiAoY3VycmVudF9uYW1lKSB7CisJCSAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAoKnl5dnNwWzBdKS0+bmV4dDsKKwkJICAgICgqeXl2c3BbMF0pLT5uZXh0ID0gTlVMTDsKKwkJICAgIGFkZF9zeW1ib2woY3VycmVudF9uYW1lLAorCQkJICAgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsCisJCQkgICAgICAgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICAgIGN1cnJlbnRfbmFtZSA9IE5VTEw7CisJCSAgfQorCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDE0OgorI2xpbmUgMTM4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgMTY6CisjbGluZSAxNDQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKnl5dnNwWzBdOworCQkgICp5eXZzcFswXSA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCisJCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgY3VycmVudF9uYW1lID0gTlVMTDsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAxNzoKKyNsaW5lIDE1MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqeXl2c3BbMF07CisJCSAgKnl5dnNwWzBdID0gTlVMTDsKKwkJICBmcmVlX2xpc3QoKnl5dnNwWy0xXSwgTlVMTCk7CisJCSAgKnl5dnNwWy0xXSA9IGRlY2xfc3BlYzsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDE4OgorI2xpbmUgMTY1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXSA/IHl5dnNwWy0xXSA6IHl5dnNwWy0yXSA/IHl5dnNwWy0yXSA6IHl5dnNwWy0zXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTk6CisjbGluZSAxNzAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZGVjbF9zcGVjID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgMjE6CisjbGluZSAxNzUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZGVjbF9zcGVjID0gKnl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAyMjoKKyNsaW5lIDE3NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBkZWNsX3NwZWMgPSAqeXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDIzOgorI2xpbmUgMTgxICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IC8qIFZlcnNpb24gMiBjaGVja3N1bW1pbmcgaWdub3JlcyBzdG9yYWdlIGNsYXNzLCBhcyB0aGF0CisJCSAgICAgaXMgcmVhbGx5IGlycmVsZXZhbnQgdG8gdGhlIGxpbmthZ2UuICAqLworCQkgIHJlbW92ZV9ub2RlKHl5dnNwWzBdKTsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAyODoKKyNsaW5lIDE5MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc19leHRlcm4gPSAxOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAyOToKKyNsaW5lIDE5NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc19leHRlcm4gPSAwOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAzMzoKKyNsaW5lIDIwNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyByZW1vdmVfbm9kZSh5eXZzcFstMV0pOyAoKnl5dnNwWzBdKS0+dGFnID0gU1lNX1NUUlVDVDsgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMzQ6CisjbGluZSAyMDcgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbLTFdKTsgKCp5eXZzcFswXSktPnRhZyA9IFNZTV9VTklPTjsgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMzU6CisjbGluZSAyMDkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbLTFdKTsgKCp5eXZzcFswXSktPnRhZyA9IFNZTV9FTlVNOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAzNjoKKyNsaW5lIDIxMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqeXl2c3BbMF0sICppID0gKnl5dnNwWy0xXSwgKnI7CisJCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1NUUlVDVDsKKwkJICByLT5uZXh0ID0gKCp5eXZzcFstMl0pLT5uZXh0OyAqeXl2c3BbMF0gPSByOyAoKnl5dnNwWy0yXSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDM3OgorI2xpbmUgMjIwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICp5eXZzcFswXSwgKmkgPSAqeXl2c3BbLTFdLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fVU5JT047CisJCSAgci0+bmV4dCA9ICgqeXl2c3BbLTJdKS0+bmV4dDsgKnl5dnNwWzBdID0gcjsgKCp5eXZzcFstMl0pLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDM4OgorI2xpbmUgMjI3ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICp5eXZzcFswXSwgKmkgPSAqeXl2c3BbLTFdLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fRU5VTTsKKwkJICByLT5uZXh0ID0gKCp5eXZzcFstMl0pLT5uZXh0OyAqeXl2c3BbMF0gPSByOyAoKnl5dnNwWy0yXSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAzOToKKyNsaW5lIDIzNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA0MDoKKyNsaW5lIDIzNiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA0MToKKyNsaW5lIDIzNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA1MjoKKyNsaW5lIDI1MSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAoKnl5dnNwWzBdKS0+dGFnID0gU1lNX1RZUEVERUY7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDUzOgorI2xpbmUgMjU2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNTQ6CisjbGluZSAyNjAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA1NzoKKyNsaW5lIDI2NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA2MToKKyNsaW5lIDI3MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCisJCSAgcmVtb3ZlX25vZGUoeXl2c3BbMF0pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDYyOgorI2xpbmUgMjc5ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDY0OgorI2xpbmUgMjg1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkgeworCQkgICAgZXJyb3Jfd2l0aF9wb3MoInVuZXhwZWN0ZWQgc2Vjb25kIGRlY2xhcmF0aW9uIG5hbWUiKTsKKwkJICAgIFlZRVJST1I7CisJCSAgfSBlbHNlIHsKKwkJICAgIGN1cnJlbnRfbmFtZSA9ICgqeXl2c3BbMF0pLT5zdHJpbmc7CisJCSAgICB5eXZhbCA9IHl5dnNwWzBdOworCQkgIH0KKwkJOworICAgIGJyZWFrO30KK2Nhc2UgNjU6CisjbGluZSAyOTQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjY6CisjbGluZSAyOTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjc6CisjbGluZSAyOTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjg6CisjbGluZSAzMDAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjk6CisjbGluZSAzMDIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzA6CisjbGluZSAzMDggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzQ6CisjbGluZSAzMTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzU6CisjbGluZSAzMTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzY6CisjbGluZSAzMjAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzc6CisjbGluZSAzMjIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzg6CisjbGluZSAzMjQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzk6CisjbGluZSAzMjggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODE6CisjbGluZSAzMzAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODI6CisjbGluZSAzMzQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA4NToKKyNsaW5lIDM0MSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA4NjoKKyNsaW5lIDM0NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdID8geXl2c3BbMF0gOiB5eXZzcFstMV07IDsKKyAgICBicmVhazt9CitjYXNlIDg3OgorI2xpbmUgMzUxICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODk6CisjbGluZSAzNTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA5MDoKKyNsaW5lIDM1OCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAvKiBGb3IgdmVyc2lvbiAyIGNoZWNrc3Vtcywgd2UgZG9uJ3Qgd2FudCB0byByZW1lbWJlcgorCQkgICAgIHByaXZhdGUgcGFyYW1ldGVyIG5hbWVzLiAgKi8KKwkJICByZW1vdmVfbm9kZSh5eXZzcFswXSk7CisJCSAgeXl2YWwgPSB5eXZzcFswXTsKKwkJOworICAgIGJyZWFrO30KK2Nhc2UgOTE6CisjbGluZSAzNjYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbMF0pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDkyOgorI2xpbmUgMzcwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDkzOgorI2xpbmUgMzcyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk0OgorI2xpbmUgMzc0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk1OgorI2xpbmUgMzc2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk2OgorI2xpbmUgMzc4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk3OgorI2xpbmUgMzgzICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICp5eXZzcFstMV07CisJCSAgKnl5dnNwWy0xXSA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsIFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgeXl2YWwgPSB5eXZzcFswXTsKKwkJOworICAgIGJyZWFrO30KK2Nhc2UgOTg6CisjbGluZSAzOTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDA6CisjbGluZSAzOTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX2xpc3QoeXl2c3BbMF0sICYoKnl5dnNwWy0xXSktPm5leHQpOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDE6CisjbGluZSA0MDIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTAyOgorI2xpbmUgNDAzICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDEwMzoKKyNsaW5lIDQwNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDEwNjoKKyNsaW5lIDQxMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDc6CisjbGluZSA0MTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTA4OgorI2xpbmUgNDIwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDEwOToKKyNsaW5lIDQyNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDExMjoKKyNsaW5lIDQzMCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMTM6CisjbGluZSA0MzQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXSA/IHl5dnNwWzBdIDogeXl2c3BbLTFdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMTQ6CisjbGluZSA0MzUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTE2OgorI2xpbmUgNDQwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDExNzoKKyNsaW5lIDQ0NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDExOToKKyNsaW5lIDQ0OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjA6CisjbGluZSA0NTMgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjI6CisjbGluZSA0NTkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZXhwb3J0X3N5bWJvbCgoKnl5dnNwWy0yXSktPnN0cmluZyk7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9Cit9CisgICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCisjbGluZSA1NDMgIi91c3IvbGliL2Jpc29uLnNpbXBsZSIKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworI2lmZGVmIFlZTFNQX05FRURFRAorICB5eWxzcCAtPSB5eWxlbjsKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQorCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwKys7CisgIGlmICh5eWxlbiA9PSAwKQorICAgIHsKKyAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7CisgICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKKyAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKKyAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47CisgICAgICB5eWxzcC0+dGV4dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOworICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKKyAgICB9CisjZW5kaWYKKworICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCisgICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKKyAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCisgICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKKyAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworeXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KKworICBpZiAoISB5eWVycnN0YXR1cykKKyAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgICB7CisgICAgICArK3l5bmVycnM7CisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgaW50IHNpemUgPSAwOworCSAgY2hhciAqbXNnOworCSAgaW50IHgsIGNvdW50OworCisJICBjb3VudCA9IDA7CisJICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCisJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKKwkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKKwkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOworCSAgbXNnID0gKGNoYXIgKikgbWFsbG9jKHNpemUgKyAxNSk7CisJICBpZiAobXNnICE9IDApCisJICAgIHsKKwkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKKworCSAgICAgIGlmIChjb3VudCA8IDUpCisJCXsKKwkJICBjb3VudCA9IDA7CisJCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7CisJCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQorCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkJICAgICAgeworCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOworCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7CisJCQlzdHJjYXQobXNnLCAiJyIpOworCQkJY291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvcihtc2cpOworCSAgICAgIGZyZWUobXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCisJeXllcnJvcigicGFyc2UgZXJyb3IiKTsKKyAgICB9CisKKyAgZ290byB5eWVycmxhYjE7Cit5eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorCVlZQUJPUlQ7CisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgICAgICB5eWNoYXIgPSBZWUVNUFRZOworICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgorICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLworCisgIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLworCisgIGdvdG8geXllcnJoYW5kbGU7CisKK3l5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLworCisjaWYgMAorICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKKyAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLworICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLworICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKKyNlbmRpZgorCit5eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLworCisgIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOworICB5eXZzcC0tOworICB5eXN0YXRlID0gKi0teXlzc3A7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwLS07CisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOworICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCisJZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCit5eWVycmhhbmRsZToKKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biArPSBZWVRFUlJPUjsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJwb3A7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJwb3A7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOworI2VuZGlmCisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICorK3l5bHNwID0geXlsbG9jOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisgeXlhY2NlcHRsYWI6CisgIC8qIFlZQUNDRVBUIGNvbWVzIGhlcmUuICAqLworICBpZiAoeXlmcmVlX3N0YWNrcykKKyAgICB7CisgICAgICBmcmVlICh5eXNzKTsKKyAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorICAgICAgZnJlZSAoeXlscyk7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAwOworCisgeXlhYm9ydGxhYjoKKyAgLyogWVlBQk9SVCBjb21lcyBoZXJlLiAgKi8KKyAgaWYgKHl5ZnJlZV9zdGFja3MpCisgICAgeworICAgICAgZnJlZSAoeXlzcyk7CisgICAgICBmcmVlICh5eXZzKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisgICAgfQorICByZXR1cm4gMTsKK30KKyNsaW5lIDQ2MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgorCisKK3N0YXRpYyB2b2lkCit5eWVycm9yKGNvbnN0IGNoYXIgKmUpCit7CisgIGVycm9yX3dpdGhfcG9zKCIlcyIsIGUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIyN2UzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBZWVNUWVBFCisjZGVmaW5lIFlZU1RZUEUgaW50CisjZW5kaWYKKyNkZWZpbmUJQVNNX0tFWVcJMjU3CisjZGVmaW5lCUFUVFJJQlVURV9LRVlXCTI1OAorI2RlZmluZQlBVVRPX0tFWVcJMjU5CisjZGVmaW5lCUJPT0xfS0VZVwkyNjAKKyNkZWZpbmUJQ0hBUl9LRVlXCTI2MQorI2RlZmluZQlDT05TVF9LRVlXCTI2MgorI2RlZmluZQlET1VCTEVfS0VZVwkyNjMKKyNkZWZpbmUJRU5VTV9LRVlXCTI2NAorI2RlZmluZQlFWFRFUk5fS0VZVwkyNjUKKyNkZWZpbmUJRkxPQVRfS0VZVwkyNjYKKyNkZWZpbmUJSU5MSU5FX0tFWVcJMjY3CisjZGVmaW5lCUlOVF9LRVlXCTI2OAorI2RlZmluZQlMT05HX0tFWVcJMjY5CisjZGVmaW5lCVJFR0lTVEVSX0tFWVcJMjcwCisjZGVmaW5lCVJFU1RSSUNUX0tFWVcJMjcxCisjZGVmaW5lCVNIT1JUX0tFWVcJMjcyCisjZGVmaW5lCVNJR05FRF9LRVlXCTI3MworI2RlZmluZQlTVEFUSUNfS0VZVwkyNzQKKyNkZWZpbmUJU1RSVUNUX0tFWVcJMjc1CisjZGVmaW5lCVRZUEVERUZfS0VZVwkyNzYKKyNkZWZpbmUJVU5JT05fS0VZVwkyNzcKKyNkZWZpbmUJVU5TSUdORURfS0VZVwkyNzgKKyNkZWZpbmUJVk9JRF9LRVlXCTI3OQorI2RlZmluZQlWT0xBVElMRV9LRVlXCTI4MAorI2RlZmluZQlUWVBFT0ZfS0VZVwkyODEKKyNkZWZpbmUJRVhQT1JUX1NZTUJPTF9LRVlXCTI4MgorI2RlZmluZQlBU01fUEhSQVNFCTI4MworI2RlZmluZQlBVFRSSUJVVEVfUEhSQVNFCTI4NAorI2RlZmluZQlCUkFDRV9QSFJBU0UJMjg1CisjZGVmaW5lCUJSQUNLRVRfUEhSQVNFCTI4NgorI2RlZmluZQlFWFBSRVNTSU9OX1BIUkFTRQkyODcKKyNkZWZpbmUJQ0hBUgkyODgKKyNkZWZpbmUJRE9UUwkyODkKKyNkZWZpbmUJSURFTlQJMjkwCisjZGVmaW5lCUlOVAkyOTEKKyNkZWZpbmUJUkVBTAkyOTIKKyNkZWZpbmUJU1RSSU5HCTI5MworI2RlZmluZQlUWVBFCTI5NAorI2RlZmluZQlPVEhFUgkyOTUKKyNkZWZpbmUJRklMRU5BTUUJMjk2CisKKworZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTA0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKQEAgLTAsMCArMSw0NjkgQEAKKy8qIEMgZ2xvYmFsIGRlY2xhcmF0aW9uIHBhcnNlciBmb3IgZ2Vua3N5bXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBOZXcgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KKyAgIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworJXsKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgImdlbmtzeW1zLmgiCisKK3N0YXRpYyBpbnQgaXNfdHlwZWRlZjsKK3N0YXRpYyBpbnQgaXNfZXh0ZXJuOworc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2xfc3BlYzsKKworc3RhdGljIHZvaWQgeXllcnJvcihjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW92ZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqKnApCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSA9ICpwOworICAqcCA9IG5vZGUtPm5leHQ7CisgIGZyZWVfbm9kZShub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwYiwgc3RydWN0IHN0cmluZ19saXN0ICoqcGUpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpwYiwgKmUgPSAqcGU7CisgICpwYiA9IGU7CisgIGZyZWVfbGlzdChiLCBlKTsKK30KKworJX0KKworJXRva2VuIEFTTV9LRVlXCisldG9rZW4gQVRUUklCVVRFX0tFWVcKKyV0b2tlbiBBVVRPX0tFWVcKKyV0b2tlbiBCT09MX0tFWVcKKyV0b2tlbiBDSEFSX0tFWVcKKyV0b2tlbiBDT05TVF9LRVlXCisldG9rZW4gRE9VQkxFX0tFWVcKKyV0b2tlbiBFTlVNX0tFWVcKKyV0b2tlbiBFWFRFUk5fS0VZVworJXRva2VuIEZMT0FUX0tFWVcKKyV0b2tlbiBJTkxJTkVfS0VZVworJXRva2VuIElOVF9LRVlXCisldG9rZW4gTE9OR19LRVlXCisldG9rZW4gUkVHSVNURVJfS0VZVworJXRva2VuIFJFU1RSSUNUX0tFWVcKKyV0b2tlbiBTSE9SVF9LRVlXCisldG9rZW4gU0lHTkVEX0tFWVcKKyV0b2tlbiBTVEFUSUNfS0VZVworJXRva2VuIFNUUlVDVF9LRVlXCisldG9rZW4gVFlQRURFRl9LRVlXCisldG9rZW4gVU5JT05fS0VZVworJXRva2VuIFVOU0lHTkVEX0tFWVcKKyV0b2tlbiBWT0lEX0tFWVcKKyV0b2tlbiBWT0xBVElMRV9LRVlXCisldG9rZW4gVFlQRU9GX0tFWVcKKworJXRva2VuIEVYUE9SVF9TWU1CT0xfS0VZVworCisldG9rZW4gQVNNX1BIUkFTRQorJXRva2VuIEFUVFJJQlVURV9QSFJBU0UKKyV0b2tlbiBCUkFDRV9QSFJBU0UKKyV0b2tlbiBCUkFDS0VUX1BIUkFTRQorJXRva2VuIEVYUFJFU1NJT05fUEhSQVNFCisKKyV0b2tlbiBDSEFSCisldG9rZW4gRE9UUworJXRva2VuIElERU5UCisldG9rZW4gSU5UCisldG9rZW4gUkVBTAorJXRva2VuIFNUUklORworJXRva2VuIFRZUEUKKyV0b2tlbiBPVEhFUgorJXRva2VuIEZJTEVOQU1FCisKKyUlCisKK2RlY2xhcmF0aW9uX3NlcToKKwlkZWNsYXJhdGlvbgorCXwgZGVjbGFyYXRpb25fc2VxIGRlY2xhcmF0aW9uCisJOworCitkZWNsYXJhdGlvbjoKKwl7IGlzX3R5cGVkZWYgPSAwOyBpc19leHRlcm4gPSAwOyBjdXJyZW50X25hbWUgPSBOVUxMOyBkZWNsX3NwZWMgPSBOVUxMOyB9CisJZGVjbGFyYXRpb24xCisJeyBmcmVlX2xpc3QoKiQyLCBOVUxMKTsgKiQyID0gTlVMTDsgfQorCTsKKworZGVjbGFyYXRpb24xOgorCVRZUEVERUZfS0VZVyB7IGlzX3R5cGVkZWYgPSAxOyB9IHNpbXBsZV9kZWNsYXJhdGlvbgorCQl7ICQkID0gJDM7IH0KKwl8IHNpbXBsZV9kZWNsYXJhdGlvbgorCXwgZnVuY3Rpb25fZGVmaW5pdGlvbgorCXwgYXNtX2RlZmluaXRpb24KKwl8IGV4cG9ydF9kZWZpbml0aW9uCisJfCBlcnJvciAnOycJCQkJeyAkJCA9ICQyOyB9CisJfCBlcnJvciAnfScJCQkJeyAkJCA9ICQyOyB9CisJOworCitzaW1wbGVfZGVjbGFyYXRpb246CisJZGVjbF9zcGVjaWZpZXJfc2VxX29wdCBpbml0X2RlY2xhcmF0b3JfbGlzdF9vcHQgJzsnCisJCXsgaWYgKGN1cnJlbnRfbmFtZSkgeworCQkgICAgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKCokMyktPm5leHQ7CisJCSAgICAoKiQzKS0+bmV4dCA9IE5VTEw7CisJCSAgICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgICBpc190eXBlZGVmID8gU1lNX1RZUEVERUYgOiBTWU1fTk9STUFMLAorCQkJICAgICAgIGRlY2wsIGlzX2V4dGVybik7CisJCSAgICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgIH0KKwkJICAkJCA9ICQzOworCQl9CisJOworCitpbml0X2RlY2xhcmF0b3JfbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJeyAkJCA9IE5VTEw7IH0KKwl8IGluaXRfZGVjbGFyYXRvcl9saXN0CisJOworCitpbml0X2RlY2xhcmF0b3JfbGlzdDoKKwlpbml0X2RlY2xhcmF0b3IKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqJDE7CisJCSAgKiQxID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgICQkID0gJDE7CisJCX0KKwl8IGluaXRfZGVjbGFyYXRvcl9saXN0ICcsJyBpbml0X2RlY2xhcmF0b3IKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqJDM7CisJCSAgKiQzID0gTlVMTDsKKwkJICBmcmVlX2xpc3QoKiQyLCBOVUxMKTsKKwkJICAqJDIgPSBkZWNsX3NwZWM7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCisJCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgY3VycmVudF9uYW1lID0gTlVMTDsKKwkJICAkJCA9ICQzOworCQl9CisJOworCitpbml0X2RlY2xhcmF0b3I6CisJZGVjbGFyYXRvciBhc21fcGhyYXNlX29wdCBhdHRyaWJ1dGVfb3B0IGluaXRpYWxpemVyX29wdAorCQl7ICQkID0gJDQgPyAkNCA6ICQzID8gJDMgOiAkMiA/ICQyIDogJDE7IH0KKwk7CisKKy8qIEhhbmcgb24gdG8gdGhlIHNwZWNpZmllcnMgc28gdGhhdCB3ZSBjYW4gcmV1c2UgdGhlbS4gICovCitkZWNsX3NwZWNpZmllcl9zZXFfb3B0OgorCS8qIGVtcHR5ICovCQkJCXsgZGVjbF9zcGVjID0gTlVMTDsgfQorCXwgZGVjbF9zcGVjaWZpZXJfc2VxCisJOworCitkZWNsX3NwZWNpZmllcl9zZXE6CisJZGVjbF9zcGVjaWZpZXIJCQkJeyBkZWNsX3NwZWMgPSAqJDE7IH0KKwl8IGRlY2xfc3BlY2lmaWVyX3NlcSBkZWNsX3NwZWNpZmllcgl7IGRlY2xfc3BlYyA9ICokMjsgfQorCTsKKworZGVjbF9zcGVjaWZpZXI6CisJc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKwkJeyAvKiBWZXJzaW9uIDIgY2hlY2tzdW1taW5nIGlnbm9yZXMgc3RvcmFnZSBjbGFzcywgYXMgdGhhdAorCQkgICAgIGlzIHJlYWxseSBpcnJlbGV2YW50IHRvIHRoZSBsaW5rYWdlLiAgKi8KKwkJICByZW1vdmVfbm9kZSgkMSk7CisJCSAgJCQgPSAkMTsKKwkJfQorCXwgdHlwZV9zcGVjaWZpZXIKKwk7CisKK3N0b3JhZ2VfY2xhc3Nfc3BlY2lmaWVyOgorCUFVVE9fS0VZVworCXwgUkVHSVNURVJfS0VZVworCXwgU1RBVElDX0tFWVcKKwl8IEVYVEVSTl9LRVlXCXsgaXNfZXh0ZXJuID0gMTsgJCQgPSAkMTsgfQorCXwgSU5MSU5FX0tFWVcJeyBpc19leHRlcm4gPSAwOyAkJCA9ICQxOyB9CisJOworCit0eXBlX3NwZWNpZmllcjoKKwlzaW1wbGVfdHlwZV9zcGVjaWZpZXIKKwl8IGN2YXJfcXVhbGlmaWVyCisJfCBUWVBFT0ZfS0VZVyAnKCcgZGVjbF9zcGVjaWZpZXJfc2VxICcpJworCisJLyogUmVmZXJlbmNlcyB0byBzL3UvZSdzIGRlZmluZWQgZWxzZXdoZXJlLiAgUmVhcnJhbmdlIHRoaW5ncworCSAgIHNvIHRoYXQgaXQgaXMgZWFzaWVyIHRvIGV4cGFuZCB0aGUgZGVmaW5pdGlvbiBmdWxseSBsYXRlci4gICovCisJfCBTVFJVQ1RfS0VZVyBJREVOVAorCQl7IHJlbW92ZV9ub2RlKCQxKTsgKCokMiktPnRhZyA9IFNZTV9TVFJVQ1Q7ICQkID0gJDI7IH0KKwl8IFVOSU9OX0tFWVcgSURFTlQKKwkJeyByZW1vdmVfbm9kZSgkMSk7ICgqJDIpLT50YWcgPSBTWU1fVU5JT047ICQkID0gJDI7IH0KKwl8IEVOVU1fS0VZVyBJREVOVAorCQl7IHJlbW92ZV9ub2RlKCQxKTsgKCokMiktPnRhZyA9IFNZTV9FTlVNOyAkJCA9ICQyOyB9CisKKwkvKiBGdWxsIGRlZmluaXRpb25zIG9mIGFuIHMvdS9lLiAgUmVjb3JkIGl0LiAgKi8KKwl8IFNUUlVDVF9LRVlXIElERU5UIGNsYXNzX2JvZHkKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fU1RSVUNUOworCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOworCQkgICQkID0gJDM7CisJCX0KKwl8IFVOSU9OX0tFWVcgSURFTlQgY2xhc3NfYm9keQorCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOworCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9VTklPTjsKKwkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOworCQkgICQkID0gJDM7CisJCX0KKwl8IEVOVU1fS0VZVyBJREVOVCBCUkFDRV9QSFJBU0UKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fRU5VTTsKKwkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX0VOVU0sIHMsIGlzX2V4dGVybik7CisJCSAgJCQgPSAkMzsKKwkJfQorCisJLyogQW5vbnltb3VzIHMvdS9lIGRlZmluaXRpb25zLiAgTm90aGluZyBuZWVkcyBkb2luZy4gICovCisJfCBFTlVNX0tFWVcgQlJBQ0VfUEhSQVNFCQkJeyAkJCA9ICQyOyB9CisJfCBTVFJVQ1RfS0VZVyBjbGFzc19ib2R5CQkJeyAkJCA9ICQyOyB9CisJfCBVTklPTl9LRVlXIGNsYXNzX2JvZHkJCQkJeyAkJCA9ICQyOyB9CisJOworCitzaW1wbGVfdHlwZV9zcGVjaWZpZXI6CisJQ0hBUl9LRVlXCisJfCBTSE9SVF9LRVlXCisJfCBJTlRfS0VZVworCXwgTE9OR19LRVlXCisJfCBTSUdORURfS0VZVworCXwgVU5TSUdORURfS0VZVworCXwgRkxPQVRfS0VZVworCXwgRE9VQkxFX0tFWVcKKwl8IFZPSURfS0VZVworCXwgQk9PTF9LRVlXCisJfCBUWVBFCQkJeyAoKiQxKS0+dGFnID0gU1lNX1RZUEVERUY7ICQkID0gJDE7IH0KKwk7CisKK3B0cl9vcGVyYXRvcjoKKwknKicgY3Zhcl9xdWFsaWZpZXJfc2VxX29wdAorCQl7ICQkID0gJDIgPyAkMiA6ICQxOyB9CisJOworCitjdmFyX3F1YWxpZmllcl9zZXFfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgY3Zhcl9xdWFsaWZpZXJfc2VxCisJOworCitjdmFyX3F1YWxpZmllcl9zZXE6CisJY3Zhcl9xdWFsaWZpZXIKKwl8IGN2YXJfcXVhbGlmaWVyX3NlcSBjdmFyX3F1YWxpZmllcgkJeyAkJCA9ICQyOyB9CisJOworCitjdmFyX3F1YWxpZmllcjoKKwlDT05TVF9LRVlXIHwgVk9MQVRJTEVfS0VZVyB8IEFUVFJJQlVURV9QSFJBU0UKKwl8IFJFU1RSSUNUX0tFWVcKKwkJeyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCisJCSAgcmVtb3ZlX25vZGUoJDEpOworCQkgICQkID0gJDE7CisJCX0KKwk7CisKK2RlY2xhcmF0b3I6CisJcHRyX29wZXJhdG9yIGRlY2xhcmF0b3IJCQl7ICQkID0gJDI7IH0KKwl8IGRpcmVjdF9kZWNsYXJhdG9yCisJOworCitkaXJlY3RfZGVjbGFyYXRvcjoKKwlJREVOVAorCQl7IGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkgeworCQkgICAgZXJyb3Jfd2l0aF9wb3MoInVuZXhwZWN0ZWQgc2Vjb25kIGRlY2xhcmF0aW9uIG5hbWUiKTsKKwkJICAgIFlZRVJST1I7CisJCSAgfSBlbHNlIHsKKwkJICAgIGN1cnJlbnRfbmFtZSA9ICgqJDEpLT5zdHJpbmc7CisJCSAgICAkJCA9ICQxOworCQkgIH0KKwkJfQorCXwgZGlyZWN0X2RlY2xhcmF0b3IgJygnIHBhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2UgJyknCisJCXsgJCQgPSAkNDsgfQorCXwgZGlyZWN0X2RlY2xhcmF0b3IgJygnIGVycm9yICcpJworCQl7ICQkID0gJDQ7IH0KKwl8IGRpcmVjdF9kZWNsYXJhdG9yIEJSQUNLRVRfUEhSQVNFCisJCXsgJCQgPSAkMjsgfQorCXwgJygnIGRlY2xhcmF0b3IgJyknCisJCXsgJCQgPSAkMzsgfQorCXwgJygnIGVycm9yICcpJworCQl7ICQkID0gJDM7IH0KKwk7CisKKy8qIE5lc3RlZCBkZWNsYXJhdG9ycyBkaWZmZXIgZnJvbSByZWd1bGFyIGRlY2xhcmF0b3JzIGluIHRoYXQgdGhleSBkbworICAgbm90IHJlY29yZCB0aGUgc3ltYm9scyB0aGV5IGZpbmQgaW4gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLworbmVzdGVkX2RlY2xhcmF0b3I6CisJcHRyX29wZXJhdG9yIG5lc3RlZF9kZWNsYXJhdG9yCQl7ICQkID0gJDI7IH0KKwl8IGRpcmVjdF9uZXN0ZWRfZGVjbGFyYXRvcgorCTsKKworZGlyZWN0X25lc3RlZF9kZWNsYXJhdG9yOgorCUlERU5UCisJfCBUWVBFCisJfCBkaXJlY3RfbmVzdGVkX2RlY2xhcmF0b3IgJygnIHBhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2UgJyknCisJCXsgJCQgPSAkNDsgfQorCXwgZGlyZWN0X25lc3RlZF9kZWNsYXJhdG9yICcoJyBlcnJvciAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbmVzdGVkX2RlY2xhcmF0b3IgQlJBQ0tFVF9QSFJBU0UKKwkJeyAkJCA9ICQyOyB9CisJfCAnKCcgbmVzdGVkX2RlY2xhcmF0b3IgJyknCisJCXsgJCQgPSAkMzsgfQorCXwgJygnIGVycm9yICcpJworCQl7ICQkID0gJDM7IH0KKwk7CisKK3BhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2U6CisJcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Rfb3B0IERPVFMJCXsgJCQgPSAkMjsgfQorCXwgcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Rfb3B0CisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdCAnLCcgRE9UUwkJeyAkJCA9ICQzOyB9CisJOworCitwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJCXsgJCQgPSBOVUxMOyB9CisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdAorCTsKKworcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Q6CisJcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdCAnLCcgcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisJCXsgJCQgPSAkMzsgfQorCTsKKworcGFyYW1ldGVyX2RlY2xhcmF0aW9uOgorCWRlY2xfc3BlY2lmaWVyX3NlcSBtX2Fic3RyYWN0X2RlY2xhcmF0b3IKKwkJeyAkJCA9ICQyID8gJDIgOiAkMTsgfQorCTsKKworbV9hYnN0cmFjdF9kZWNsYXJhdG9yOgorCXB0cl9vcGVyYXRvciBtX2Fic3RyYWN0X2RlY2xhcmF0b3IKKwkJeyAkJCA9ICQyID8gJDIgOiAkMTsgfQorCXwgZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvcgorCTsKKworZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvcjoKKwkvKiBlbXB0eSAqLwkJCQkJeyAkJCA9IE5VTEw7IH0KKwl8IElERU5UCisJCXsgLyogRm9yIHZlcnNpb24gMiBjaGVja3N1bXMsIHdlIGRvbid0IHdhbnQgdG8gcmVtZW1iZXIKKwkJICAgICBwcml2YXRlIHBhcmFtZXRlciBuYW1lcy4gICovCisJCSAgcmVtb3ZlX25vZGUoJDEpOworCQkgICQkID0gJDE7CisJCX0KKwkvKiBUaGlzIHdhc24ndCByZWFsbHkgYSB0eXBlZGVmIG5hbWUgYnV0IGFuIGlkZW50aWZpZXIgdGhhdAorCSAgIHNoYWRvd3Mgb25lLiAgKi8KKwl8IFRZUEUKKwkJeyByZW1vdmVfbm9kZSgkMSk7CisJCSAgJCQgPSAkMTsKKwkJfQorCXwgZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvciAnKCcgcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2NsYXVzZSAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yICcoJyBlcnJvciAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yIEJSQUNLRVRfUEhSQVNFCisJCXsgJCQgPSAkMjsgfQorCXwgJygnIG1fYWJzdHJhY3RfZGVjbGFyYXRvciAnKScKKwkJeyAkJCA9ICQzOyB9CisJfCAnKCcgZXJyb3IgJyknCisJCXsgJCQgPSAkMzsgfQorCTsKKworZnVuY3Rpb25fZGVmaW5pdGlvbjoKKwlkZWNsX3NwZWNpZmllcl9zZXFfb3B0IGRlY2xhcmF0b3IgQlJBQ0VfUEhSQVNFCisJCXsgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKiQyOworCQkgICokMiA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsIFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgJCQgPSAkMzsKKwkJfQorCTsKKworaW5pdGlhbGl6ZXJfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgaW5pdGlhbGl6ZXIKKwk7CisKKy8qIFdlIG5ldmVyIGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIGFuIGluaXRpYWxpemVyLiAgKi8KK2luaXRpYWxpemVyOgorCSc9JyBFWFBSRVNTSU9OX1BIUkFTRQorCQl7IHJlbW92ZV9saXN0KCQyLCAmKCokMSktPm5leHQpOyAkJCA9ICQyOyB9CisJOworCitjbGFzc19ib2R5OgorCSd7JyBtZW1iZXJfc3BlY2lmaWNhdGlvbl9vcHQgJ30nCQl7ICQkID0gJDM7IH0KKwl8ICd7JyBlcnJvciAnfScJCQkJCXsgJCQgPSAkMzsgfQorCTsKKworbWVtYmVyX3NwZWNpZmljYXRpb25fb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgbWVtYmVyX3NwZWNpZmljYXRpb24KKwk7CisKK21lbWJlcl9zcGVjaWZpY2F0aW9uOgorCW1lbWJlcl9kZWNsYXJhdGlvbgorCXwgbWVtYmVyX3NwZWNpZmljYXRpb24gbWVtYmVyX2RlY2xhcmF0aW9uCXsgJCQgPSAkMjsgfQorCTsKKworbWVtYmVyX2RlY2xhcmF0aW9uOgorCWRlY2xfc3BlY2lmaWVyX3NlcV9vcHQgbWVtYmVyX2RlY2xhcmF0b3JfbGlzdF9vcHQgJzsnCisJCXsgJCQgPSAkMzsgfQorCXwgZXJyb3IgJzsnCisJCXsgJCQgPSAkMjsgfQorCTsKKworbWVtYmVyX2RlY2xhcmF0b3JfbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJCXsgJCQgPSBOVUxMOyB9CisJfCBtZW1iZXJfZGVjbGFyYXRvcl9saXN0CisJOworCittZW1iZXJfZGVjbGFyYXRvcl9saXN0OgorCW1lbWJlcl9kZWNsYXJhdG9yCisJfCBtZW1iZXJfZGVjbGFyYXRvcl9saXN0ICcsJyBtZW1iZXJfZGVjbGFyYXRvcgl7ICQkID0gJDM7IH0KKwk7CisKK21lbWJlcl9kZWNsYXJhdG9yOgorCW5lc3RlZF9kZWNsYXJhdG9yIGF0dHJpYnV0ZV9vcHQJCQl7ICQkID0gJDIgPyAkMiA6ICQxOyB9CisJfCBJREVOVCBtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvcgkJeyAkJCA9ICQyOyB9CisJfCBtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvcgorCTsKKworbWVtYmVyX2JpdGZpZWxkX2RlY2xhcmF0b3I6CisJJzonIEVYUFJFU1NJT05fUEhSQVNFCQkJCXsgJCQgPSAkMjsgfQorCTsKKworYXR0cmlidXRlX29wdDoKKwkvKiBlbXB0eSAqLwkJCQkJeyAkJCA9IE5VTEw7IH0KKwl8IEFUVFJJQlVURV9QSFJBU0UKKwk7CisKK2FzbV9kZWZpbml0aW9uOgorCUFTTV9QSFJBU0UgJzsnCQkJCQl7ICQkID0gJDI7IH0KKwk7CisKK2FzbV9waHJhc2Vfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgQVNNX1BIUkFTRQorCTsKKworZXhwb3J0X2RlZmluaXRpb246CisJRVhQT1JUX1NZTUJPTF9LRVlXICcoJyBJREVOVCAnKScgJzsnCisJCXsgZXhwb3J0X3N5bWJvbCgoKiQzKS0+c3RyaW5nKTsgJCQgPSAkNTsgfQorCTsKKworCislJQorCitzdGF0aWMgdm9pZAoreXllcnJvcihjb25zdCBjaGFyICplKQoreworICBlcnJvcl93aXRoX3BvcygiJXMiLCBlKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2FsbHN5bXMuYyBiL3NjcmlwdHMva2FsbHN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBmZmRhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rYWxsc3ltcy5jCkBAIC0wLDAgKzEsNjg2IEBACisvKiBHZW5lcmF0ZSBhc3NlbWJsZXIgc291cmNlIGNvbnRhaW5pbmcgc3ltYm9sIGluZm9ybWF0aW9uCisgKgorICogQ29weXJpZ2h0IDIwMDIgICAgICAgYnkgS2FpIEdlcm1hc2NoZXdza2kKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIFVzYWdlOiBubSAtbiB2bWxpbnV4IHwgc2NyaXB0cy9rYWxsc3ltcyBbLS1hbGwtc3ltYm9sc10gPiBzeW1ib2xzLlMKKyAqCisgKiBDaGFuZ2VMb2c6CisgKgorICogKDI1L0F1Zy8yMDA0KSBQYXVsbyBNYXJxdWVzIDxwbWFycXVlc0BncnVwb3BpZS5jb20+CisgKiAgICAgIENoYW5nZWQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHN0ZW0gY29tcHJlc3Npb24gdG8gInRhYmxlIGxvb2t1cCIKKyAqICAgICAgY29tcHJlc3Npb24KKyAqCisgKiAgICAgIFRhYmxlIGNvbXByZXNzaW9uIHVzZXMgYWxsIHRoZSB1bnVzZWQgY2hhciBjb2RlcyBvbiB0aGUgc3ltYm9scyBhbmQKKyAqICBtYXBzIHRoZXNlIHRvIHRoZSBtb3N0IHVzZWQgc3Vic3RyaW5ncyAodG9rZW5zKS4gRm9yIGluc3RhbmNlLCBpdCBtaWdodAorICogIG1hcCBjaGFyIGNvZGUgMHhGNyB0byByZXByZXNlbnQgIndyaXRlXyIgYW5kIHRoZW4gaW4gZXZlcnkgc3ltYm9sIHdoZXJlCisgKiAgIndyaXRlXyIgYXBwZWFycyBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgMHhGNywgc2F2aW5nIDUgYnl0ZXMuCisgKiAgICAgIFRoZSB1c2VkIGNvZGVzIHRoZW1zZWx2ZXMgYXJlIGFsc28gcGxhY2VkIGluIHRoZSB0YWJsZSBzbyB0aGF0IHRoZQorICogIGRlY29tcHJlc2lvbiBjYW4gd29yayB3aXRob3V0ICJzcGVjaWFsIGNhc2VzIi4KKyAqICAgICAgQXBwbGllZCB0byBrZXJuZWwgc3ltYm9scywgdGhpcyB1c3VhbGx5IHByb2R1Y2VzIGEgY29tcHJlc3Npb24gcmF0aW8KKyAqICBvZiBhYm91dCA1MCUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIG1heGltdW0gdG9rZW4gbGVuZ3RoIHVzZWQuIEl0IGRvZXNuJ3QgcGF5IHRvIGluY3JlYXNlIGl0IGEgbG90LCBiZWNhdXNlCisgKiB2ZXJ5IGxvbmcgc3Vic3RyaW5ncyBwcm9iYWJseSBkb24ndCByZXBlYXQgdGhlbXNlbHZlcyB0b28gb2Z0ZW4uICovCisjZGVmaW5lIE1BWF9UT0tfU0laRQkJMTEKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI3CisKKy8qIHdlIHVzZSBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgdG8gZ2F0aGVyIHRoZSB0b2tlbiBjb3VudCwKKyAqIHRvIHNwZWVkIHVwIGNvbXByZXNzaW9uLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxpdHRsZSBjb21wcmVzc2lvbiByYXRpbyAqLworI2RlZmluZSBXT1JLSU5HX1NFVAkJMTAyNAorCisvKiBmaXJzdCBmaW5kIHRoZSBiZXN0IHRva2VuIG9ubHkgb24gdGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd291bGQgcHJvZml0IG1vcmUKKyAqIHRoYW4gR09PRF9CQURfVEhSRVNIT0xELiBPbmx5IGlmIHRoaXMgbGlzdCBpcyBlbXB0eSBnbyB0byB0aGUgImJhZCIgbGlzdC4KKyAqIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHB1dCBsZXNzIHRva2VucyBvbiB0aGUgImdvb2QiIGxpc3QsIHNvIHRoZSBzZWFyY2gKKyAqIGlzIGZhc3Rlci4gSG93ZXZlciwgaWYgdGhlIGdvb2QgbGlzdCBydW5zIG91dCBvZiB0b2tlbnMsIHdlIG11c3QgcGFpbmZ1bGx5CisgKiBzZWFyY2ggdGhlIGJhZCBsaXN0LiAqLworI2RlZmluZSBHT09EX0JBRF9USFJFU0hPTEQJMTAKKworLyogdG9rZW4gaGFzaCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhBU0hfQklUUwkJMTgKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFCQkoMSA8PCBIQVNIX0JJVFMpCisjZGVmaW5lIEhBU0hfTUFTSwkJKEhBU0hfVEFCTEVfU0laRSAtIDEpCisjZGVmaW5lIEhBU0hfQkFTRV9PRkZTRVQJMjE2NjEzNjI2MVUKKyNkZWZpbmUgSEFTSF9GT0xEKGEpCQkoKGEpJihIQVNIX01BU0spKQorCisvKiBmbGFncyB0byBtYXJrIHN5bWJvbHMgKi8KKyNkZWZpbmUgU1lNX0ZMQUdfVkFMSUQJCTEKKyNkZWZpbmUgU1lNX0ZMQUdfU0FNUExFRAkyCisKK3N0cnVjdCBzeW1fZW50cnkgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCWNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbGVuOworCXVuc2lnbmVkIGNoYXIgKnN5bTsKK307CisKKworc3RhdGljIHN0cnVjdCBzeW1fZW50cnkgKnRhYmxlOworc3RhdGljIGludCBzaXplLCBjbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9zdGV4dCwgX2V0ZXh0LCBfc2luaXR0ZXh0LCBfZWluaXR0ZXh0Oworc3RhdGljIGludCBhbGxfc3ltYm9scyA9IDA7CisKK3N0cnVjdCB0b2tlbiB7CisJdW5zaWduZWQgY2hhciBkYXRhW01BWF9UT0tfU0laRV07CisJdW5zaWduZWQgY2hhciBsZW47CisJLyogcHJvZml0OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgYmUgc2F2ZWQgYnkgaW5zZXJ0aW5nIHRoaXMKKwkgKiB0b2tlbiBpbnRvIHRoZSB0YWJsZSAqLworCWludCBwcm9maXQ7CisJc3RydWN0IHRva2VuICpuZXh0OwkvKiBuZXh0IHRva2VuIG9uIHRoZSBoYXNoIGxpc3QgKi8KKwlzdHJ1Y3QgdG9rZW4gKnJpZ2h0OwkvKiBuZXh0IHRva2VuIG9uIHRoZSBnb29kL2JhZCBsaXN0ICovCisJc3RydWN0IHRva2VuICpsZWZ0OyAgICAvKiBwcmV2aW91cyB0b2tlbiBvbiB0aGUgZ29vZC9iYWQgbGlzdCAqLworCXN0cnVjdCB0b2tlbiAqc21hbGxlcjsgLyogdG9rZW4gdGhhdCBpcyBsZXNzIG9uZSBsZXR0ZXIgdGhhbiB0aGlzIG9uZSAqLworCX07CisKK3N0cnVjdCB0b2tlbiBiYWRfaGVhZCwgZ29vZF9oZWFkOworc3RydWN0IHRva2VuICpoYXNoX3RhYmxlW0hBU0hfVEFCTEVfU0laRV07CisKKy8qIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXByZXNzaW9uICovCit1bnNpZ25lZCBjaGFyIGJlc3RfdGFibGVbMjU2XVtNQVhfVE9LX1NJWkUrMV07Cit1bnNpZ25lZCBjaGFyIGJlc3RfdGFibGVfbGVuWzI1Nl07CisKKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZToga2FsbHN5bXMgWy0tYWxsLXN5bWJvbHNdIDwgaW4ubWFwID4gb3V0LlNcbiIpOworCWV4aXQoMSk7Cit9CisKKy8qCisgKiBUaGlzIGlnbm9yZXMgdGhlIGludGVuc2VseSBhbm5veWluZyAibWFwcGluZyBzeW1ib2xzIiBmb3VuZAorICogaW4gQVJNIEVMRiBmaWxlczogJGEsICR0IGFuZCAkZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lzX2FybV9tYXBwaW5nX3N5bWJvbChjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIHN0clswXSA9PSAnJCcgJiYgc3RyY2hyKCJhdGQiLCBzdHJbMV0pCisJICAgICAgICYmIChzdHJbMl0gPT0gJ1wwJyB8fCBzdHJbMl0gPT0gJy4nKTsKK30KKworc3RhdGljIGludAorcmVhZF9zeW1ib2woRklMRSAqaW4sIHN0cnVjdCBzeW1fZW50cnkgKnMpCit7CisJY2hhciBzdHJbNTAwXTsKKwlpbnQgcmM7CisKKwlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmcy0+dHlwZSwgc3RyKTsKKwlpZiAocmMgIT0gMykgeworCQlpZiAocmMgIT0gRU9GKSB7CisJCQkvKiBza2lwIGxpbmUgKi8KKwkJCWZnZXRzKHN0ciwgNTAwLCBpbik7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qIElnbm9yZSBtb3N0IGFic29sdXRlL3VuZGVmaW5lZCAoPykgc3ltYm9scy4gKi8KKwlpZiAoc3RyY21wKHN0ciwgIl9zdGV4dCIpID09IDApCisJCV9zdGV4dCA9IHMtPmFkZHI7CisJZWxzZSBpZiAoc3RyY21wKHN0ciwgIl9ldGV4dCIpID09IDApCisJCV9ldGV4dCA9IHMtPmFkZHI7CisJZWxzZSBpZiAoc3RyY21wKHN0ciwgIl9zaW5pdHRleHQiKSA9PSAwKQorCQlfc2luaXR0ZXh0ID0gcy0+YWRkcjsKKwllbHNlIGlmIChzdHJjbXAoc3RyLCAiX2Vpbml0dGV4dCIpID09IDApCisJCV9laW5pdHRleHQgPSBzLT5hZGRyOworCWVsc2UgaWYgKHRvdXBwZXIocy0+dHlwZSkgPT0gJ0EnKQorCXsKKwkJLyogS2VlcCB0aGVzZSB1c2VmdWwgYWJzb2x1dGUgc3ltYm9scyAqLworCQlpZiAoc3RyY21wKHN0ciwgIl9fa2VybmVsX3N5c2NhbGxfdmlhX2JyZWFrIikgJiYKKwkJICAgIHN0cmNtcChzdHIsICJfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMiKSAmJgorCQkgICAgc3RyY21wKHN0ciwgIl9fa2VybmVsX3NpZ3RyYW1wIikgJiYKKwkJICAgIHN0cmNtcChzdHIsICJfX2dwIikpCisJCQlyZXR1cm4gLTE7CisKKwl9CisJZWxzZSBpZiAodG91cHBlcihzLT50eXBlKSA9PSAnVScgfHwKKwkJIGlzX2FybV9tYXBwaW5nX3N5bWJvbChzdHIpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBpbmNsdWRlIHRoZSB0eXBlIGZpZWxkIGluIHRoZSBzeW1ib2wgbmFtZSwgc28gdGhhdCBpdCBnZXRzCisJICogY29tcHJlc3NlZCB0b2dldGhlciAqLworCXMtPmxlbiA9IHN0cmxlbihzdHIpICsgMTsKKwlzLT5zeW0gPSAoY2hhciAqKSBtYWxsb2Mocy0+bGVuICsgMSk7CisJc3RyY3B5KHMtPnN5bSArIDEsIHN0cik7CisJcy0+c3ltWzBdID0gcy0+dHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzeW1ib2xfdmFsaWQoc3RydWN0IHN5bV9lbnRyeSAqcykKK3sKKwkvKiBTeW1ib2xzIHdoaWNoIHZhcnkgYmV0d2VlbiBwYXNzZXMuICBQYXNzZXMgMSBhbmQgMiBtdXN0IGhhdmUKKwkgKiBpZGVudGljYWwgc3ltYm9sIGxpc3RzLiAgVGhlIGthbGxzeW1zXyogc3ltYm9scyBiZWxvdyBhcmUgb25seSBhZGRlZAorCSAqIGFmdGVyIHBhc3MgMSwgdGhleSB3b3VsZCBiZSBpbmNsdWRlZCBpbiBwYXNzIDIgd2hlbiAtLWFsbC1zeW1ib2xzIGlzCisJICogc3BlY2lmaWVkIHNvIGV4Y2x1ZGUgdGhlbSB0byBnZXQgYSBzdGFibGUgc3ltYm9sIGxpc3QuCisJICovCisJc3RhdGljIGNoYXIgKnNwZWNpYWxfc3ltYm9sc1tdID0geworCQkia2FsbHN5bXNfYWRkcmVzc2VzIiwKKwkJImthbGxzeW1zX251bV9zeW1zIiwKKwkJImthbGxzeW1zX25hbWVzIiwKKwkJImthbGxzeW1zX21hcmtlcnMiLAorCQkia2FsbHN5bXNfdG9rZW5fdGFibGUiLAorCQkia2FsbHN5bXNfdG9rZW5faW5kZXgiLAorCisJLyogRXhjbHVkZSBsaW5rZXIgZ2VuZXJhdGVkIHN5bWJvbHMgd2hpY2ggdmFyeSBiZXR3ZWVuIHBhc3NlcyAqLworCQkiX1NEQV9CQVNFXyIsCQkvKiBwcGMgKi8KKwkJIl9TREEyX0JBU0VfIiwJCS8qIHBwYyAqLworCQlOVUxMIH07CisJaW50IGk7CisKKwkvKiBpZiAtLWFsbC1zeW1ib2xzIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gc3ltYm9scyBvdXRzaWRlIHRoZSB0ZXh0CisJICogYW5kIGluaXR0ZXh0IHNlY3Rpb25zIGFyZSBkaXNjYXJkZWQgKi8KKwlpZiAoIWFsbF9zeW1ib2xzKSB7CisJCWlmICgocy0+YWRkciA8IF9zdGV4dCB8fCBzLT5hZGRyID4gX2V0ZXh0KQorCQkgICAgJiYgKHMtPmFkZHIgPCBfc2luaXR0ZXh0IHx8IHMtPmFkZHIgPiBfZWluaXR0ZXh0KSkKKwkJCXJldHVybiAwOworCQkvKiBDb3JuZXIgY2FzZS4gIERpc2NhcmQgYW55IHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcworCQkgKiBfZXRleHQgb3IgX2Vpbml0dGV4dCwgdGhleSBjYW4gbW92ZSBiZXR3ZWVuIHBhc3MgMSBhbmQgMgorCQkgKiB3aGVuIHRoZSBrYWxsc3ltcyBkYXRhIGlzIGFkZGVkLiAgSWYgdGhlc2Ugc3ltYm9scyBtb3ZlIHRoZW4KKwkJICogdGhleSBtYXkgZ2V0IGRyb3BwZWQgaW4gcGFzcyAyLCB3aGljaCBicmVha3MgdGhlIGthbGxzeW1zCisJCSAqIHJ1bGVzLgorCQkgKi8KKwkJaWYgKChzLT5hZGRyID09IF9ldGV4dCAmJiBzdHJjbXAocy0+c3ltICsgMSwgIl9ldGV4dCIpKSB8fAorCQkgICAgKHMtPmFkZHIgPT0gX2Vpbml0dGV4dCAmJiBzdHJjbXAocy0+c3ltICsgMSwgIl9laW5pdHRleHQiKSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFeGNsdWRlIHN5bWJvbHMgd2hpY2ggdmFyeSBiZXR3ZWVuIHBhc3Nlcy4gKi8KKwlpZiAoc3Ryc3RyKHMtPnN5bSArIDEsICJfY29tcGlsZWQuIikpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgc3BlY2lhbF9zeW1ib2xzW2ldOyBpKyspCisJCWlmKCBzdHJjbXAocy0+c3ltICsgMSwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwICkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX21hcChGSUxFICppbikKK3sKKwl3aGlsZSAoIWZlb2YoaW4pKSB7CisJCWlmIChjbnQgPj0gc2l6ZSkgeworCQkJc2l6ZSArPSAxMDAwMDsKKwkJCXRhYmxlID0gcmVhbGxvYyh0YWJsZSwgc2l6ZW9mKCp0YWJsZSkgKiBzaXplKTsKKwkJCWlmICghdGFibGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOworCQkJCWV4aXQgKDEpOworCQkJfQorCQl9CisJCWlmIChyZWFkX3N5bWJvbChpbiwgJnRhYmxlW2NudF0pID09IDApCisJCQljbnQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9sYWJlbChjaGFyICpsYWJlbCkKK3sKKwlwcmludGYoIi5nbG9ibCAlc1xuIixsYWJlbCk7CisJcHJpbnRmKCJcdEFMR05cbiIpOworCXByaW50ZigiJXM6XG4iLGxhYmVsKTsKK30KKworLyogdW5jb21wcmVzcyBhIGNvbXByZXNzZWQgc3ltYm9sLiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgYmVzdCB0YWJsZQorICogbWlnaHQgc3RpbGwgYmUgY29tcHJlc3NlZCBpdHNlbGYsIHNvIHRoZSBmdW5jdGlvbiBuZWVkcyB0byBiZSByZWN1cnNpdmUgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX3N5bWJvbCh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLCBjaGFyICpyZXN1bHQpCit7CisJaW50IGMsIHJsZW4sIHRvdGFsPTA7CisKKwl3aGlsZSAobGVuKSB7CisJCWMgPSAqZGF0YTsKKwkJLyogaWYgdGhlIHRhYmxlIGhvbGRzIGEgc2luZ2xlIGNoYXIgdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisJCSAqIHdlIGFyZSBsb29raW5nIGZvciwgdGhlbiBlbmQgdGhlIHNlYXJjaCAqLworCQlpZiAoYmVzdF90YWJsZVtjXVswXT09YyAmJiBiZXN0X3RhYmxlX2xlbltjXT09MSkgeworCQkJKnJlc3VsdCsrID0gYzsKKwkJCXRvdGFsKys7CisJCX0gZWxzZSB7CisJCQkvKiBpZiBub3QsIHJlY3Vyc2UgYW5kIGV4cGFuZCAqLworCQkJcmxlbiA9IGV4cGFuZF9zeW1ib2woYmVzdF90YWJsZVtjXSwgYmVzdF90YWJsZV9sZW5bY10sIHJlc3VsdCk7CisJCQl0b3RhbCArPSBybGVuOworCQkJcmVzdWx0ICs9IHJsZW47CisJCX0KKwkJZGF0YSsrOworCQlsZW4tLTsKKwl9CisJKnJlc3VsdD0wOworCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfc3JjKHZvaWQpCit7CisJaW50IGksIGssIG9mZiwgdmFsaWQ7CisJdW5zaWduZWQgaW50IGJlc3RfaWR4WzI1Nl07CisJdW5zaWduZWQgaW50ICptYXJrZXJzOworCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU4rMV07CisKKwlwcmludGYoIiNpbmNsdWRlIDxhc20vdHlwZXMuaD5cbiIpOworCXByaW50ZigiI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjRcbiIpOworCXByaW50ZigiI2RlZmluZSBQVFIgLnF1YWRcbiIpOworCXByaW50ZigiI2RlZmluZSBBTEdOIC5hbGlnbiA4XG4iKTsKKwlwcmludGYoIiNlbHNlXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgUFRSIC5sb25nXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgQUxHTiAuYWxpZ24gNFxuIik7CisJcHJpbnRmKCIjZW5kaWZcbiIpOworCisJcHJpbnRmKCIuZGF0YVxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX2FkZHJlc3NlcyIpOworCXZhbGlkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfVkFMSUQpIHsKKwkJCXByaW50ZigiXHRQVFJcdCUjbGx4XG4iLCB0YWJsZVtpXS5hZGRyKTsKKwkJCXZhbGlkKys7CisJCX0KKwl9CisJcHJpbnRmKCJcbiIpOworCisJb3V0cHV0X2xhYmVsKCJrYWxsc3ltc19udW1fc3ltcyIpOworCXByaW50ZigiXHRQVFJcdCVkXG4iLCB2YWxpZCk7CisJcHJpbnRmKCJcbiIpOworCisJLyogdGFibGUgb2Ygb2Zmc2V0IG1hcmtlcnMsIHRoYXQgZ2l2ZSB0aGUgb2Zmc2V0IGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorCSAqIGV2ZXJ5IDI1NiBzeW1ib2xzICovCisJbWFya2VycyA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpKigodmFsaWQgKyAyNTUpIC8gMjU2KSk7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX25hbWVzIik7CisJdmFsaWQgPSAwOworCW9mZiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisKKwkJaWYgKCF0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2YWxpZCAmIDB4RkYpID09IDApCisJCQltYXJrZXJzW3ZhbGlkID4+IDhdID0gb2ZmOworCisJCXByaW50ZigiXHQuYnl0ZSAweCUwMngiLCB0YWJsZVtpXS5sZW4pOworCQlmb3IgKGsgPSAwOyBrIDwgdGFibGVbaV0ubGVuOyBrKyspCisJCQlwcmludGYoIiwgMHglMDJ4IiwgdGFibGVbaV0uc3ltW2tdKTsKKwkJcHJpbnRmKCJcbiIpOworCisJCW9mZiArPSB0YWJsZVtpXS5sZW4gKyAxOworCQl2YWxpZCsrOworCX0KKwlwcmludGYoIlxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX21hcmtlcnMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgKCh2YWxpZCArIDI1NSkgPj4gOCk7IGkrKykKKwkJcHJpbnRmKCJcdFBUUlx0JWRcbiIsIG1hcmtlcnNbaV0pOworCXByaW50ZigiXG4iKTsKKworCWZyZWUobWFya2Vycyk7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX3Rva2VuX3RhYmxlIik7CisJb2ZmID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYmVzdF9pZHhbaV0gPSBvZmY7CisJCWV4cGFuZF9zeW1ib2woYmVzdF90YWJsZVtpXSxiZXN0X3RhYmxlX2xlbltpXSxidWYpOworCQlwcmludGYoIlx0LmFzY2l6XHRcIiVzXCJcbiIsIGJ1Zik7CisJCW9mZiArPSBzdHJsZW4oYnVmKSArIDE7CisJfQorCXByaW50ZigiXG4iKTsKKworCW91dHB1dF9sYWJlbCgia2FsbHN5bXNfdG9rZW5faW5kZXgiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXByaW50ZigiXHQuc2hvcnRcdCVkXG4iLCBiZXN0X2lkeFtpXSk7CisJcHJpbnRmKCJcbiIpOworfQorCisKKy8qIHRhYmxlIGxvb2t1cCBjb21wcmVzc2lvbiBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVoYXNoX3Rva2VuKHVuc2lnbmVkIGludCBoYXNoLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJcmV0dXJuICgoaGFzaCAqIDE2Nzc3NjE5KSBeIGRhdGEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaD1IQVNIX0JBU0VfT0ZGU0VUOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaV0pOworCisJcmV0dXJuIEhBU0hfRk9MRChoYXNoKTsKK30KKworLyogZmluZCBhIHRva2VuIGdpdmVuIGl0cyBkYXRhIGFuZCBoYXNoIHZhbHVlICovCitzdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX3Rva2VuX2hhc2godW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc2gpCit7CisJc3RydWN0IHRva2VuICpwdHI7CisKKwlwdHIgPSBoYXNoX3RhYmxlW2hhc2hdOworCisJd2hpbGUgKHB0cikgeworCQlpZiAoKHB0ci0+bGVuID09IGxlbikgJiYgKG1lbWNtcChwdHItPmRhdGEsIGRhdGEsIGxlbikgPT0gMCkpCisJCQlyZXR1cm4gcHRyOworCQlwdHI9cHRyLT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X3Rva2VuX2luX2dyb3VwKHN0cnVjdCB0b2tlbiAqaGVhZCwgc3RydWN0IHRva2VuICpwdHIpCit7CisJcHRyLT5yaWdodCA9IGhlYWQtPnJpZ2h0OworCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHI7CisJaGVhZC0+cmlnaHQgPSBwdHI7CisJcHRyLT5sZWZ0ID0gaGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHN0cnVjdCB0b2tlbiAqcHRyKQoreworCXB0ci0+bGVmdC0+cmlnaHQgPSBwdHItPnJpZ2h0OworCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHItPmxlZnQ7Cit9CisKKworLyogYnVpbGQgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cworICogZnJvbSAyIHRvICJsZW4iICovCitzdGF0aWMgdm9pZCBsZWFybl90b2tlbih1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCB0b2tlbiAqcHRyLCpsYXN0X3B0cjsKKwlpbnQgaSwgbmV3cHJvZml0OworCXVuc2lnbmVkIGludCBoYXNoID0gSEFTSF9CQVNFX09GRlNFVDsKKwl1bnNpZ25lZCBpbnQgaGFzaGVzW01BWF9UT0tfU0laRSArIDFdOworCisJaWYgKGxlbiA+IE1BWF9UT0tfU0laRSkKKwkJbGVuID0gTUFYX1RPS19TSVpFOworCisJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCB0aGUgc3ViLXRva2VucyAqLworCWhhc2ggPSByZWhhc2hfdG9rZW4oaGFzaCwgZGF0YVswXSk7CisJZm9yIChpID0gMjsgaSA8PSBsZW47IGkrKykgeworCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaS0xXSk7CisJCWhhc2hlc1tpXSA9IEhBU0hfRk9MRChoYXNoKTsKKwl9CisKKwlsYXN0X3B0ciA9IE5VTEw7CisJcHRyID0gTlVMTDsKKworCWZvciAoaSA9IGxlbjsgaSA+PSAyOyBpLS0pIHsKKwkJaGFzaCA9IGhhc2hlc1tpXTsKKworCQlpZiAoIXB0cikgcHRyID0gZmluZF90b2tlbl9oYXNoKGRhdGEsIGksIGhhc2gpOworCisJCWlmICghcHRyKSB7CisJCQkvKiBjcmVhdGUgYSBuZXcgdG9rZW4gZW50cnkgKi8KKwkJCXB0ciA9IChzdHJ1Y3QgdG9rZW4gKikgbWFsbG9jKHNpemVvZigqcHRyKSk7CisKKwkJCW1lbWNweShwdHItPmRhdGEsIGRhdGEsIGkpOworCQkJcHRyLT5sZW4gPSBpOworCisJCQkvKiB3aGVuIHdlIGNyZWF0ZSBhbiBlbnRyeSwgaXQncyBwcm9maXQgaXMgMCBiZWNhdXNlCisJCQkgKiB3ZSBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSB0b2tlbiBvbgorCQkJICogdGhlIGNvbXByZXNzZWQgdGFibGUuIFdlIHRoZW4gc3VidHJhY3QgR09PRF9CQURfVEhSRVNIT0xECisJCQkgKiBzbyB0aGF0IHRoZSB0ZXN0IHRvIHNlZSBpZiB0aGlzIHRva2VuIGJlbG9uZ3MgdG8KKwkJCSAqIHRoZSBnb29kIG9yIGJhZCBsaXN0LCBpcyBhIGNvbXBhcmlzb24gdG8gemVybyAqLworCQkJcHRyLT5wcm9maXQgPSAtR09PRF9CQURfVEhSRVNIT0xEOworCisJCQlwdHItPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOworCQkJaGFzaF90YWJsZVtoYXNoXSA9IHB0cjsKKworCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKKworCQkJcHRyLT5zbWFsbGVyID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0ICsgKHB0ci0+bGVuIC0gMSk7CisJCQkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyB0b2tlbiBuZWVkcyB0byBiZSBtb3ZlZCB0byBhCisJCQkgKiBkaWZmZXJlbnQgbGlzdCAqLworCQkJaWYoKHB0ci0+cHJvZml0IDwgMCkgJiYgKG5ld3Byb2ZpdCA+PSAwKSkgeworCQkJCXJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHB0cik7CisJCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZnb29kX2hlYWQscHRyKTsKKwkJCX0KKwkJCXB0ci0+cHJvZml0ID0gbmV3cHJvZml0OworCQl9CisKKwkJaWYgKGxhc3RfcHRyKSBsYXN0X3B0ci0+c21hbGxlciA9IHB0cjsKKwkJbGFzdF9wdHIgPSBwdHI7CisKKwkJcHRyID0gcHRyLT5zbWFsbGVyOworCX0KK30KKworLyogZGVjcmVhc2UgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cworICogZnJvbSAyIHRvICJsZW4iLiBUaGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0aGFuIGxlYXJuX3Rva2VuIGJlY2F1c2Ugd2UgaGF2ZQorICogbW9yZSBndWFyYW50ZWVzICh0aG8gdG9rZW5zIGV4aXN0LCB0aGUgLT5zbWFsbGVyIHBvaW50ZXIgaXMgc2V0LCBldGMuKQorICogVGhlIHR3byBzZXBhcmF0ZSBmdW5jdGlvbnMgZXhpc3Qgb25seSBiZWNhdXNlIG9mIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlICovCitzdGF0aWMgdm9pZCBmb3JnZXRfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdG9rZW4gKnB0cjsKKwlpbnQgaSwgbmV3cHJvZml0OworCXVuc2lnbmVkIGludCBoYXNoPTA7CisKKwlpZiAobGVuID4gTUFYX1RPS19TSVpFKSBsZW4gPSBNQVhfVE9LX1NJWkU7CisKKwloYXNoID0gaGFzaF90b2tlbihkYXRhLCBsZW4pOworCXB0ciA9IGZpbmRfdG9rZW5faGFzaChkYXRhLCBsZW4sIGhhc2gpOworCisJZm9yIChpID0gbGVuOyBpID49IDI7IGktLSkgeworCisJCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0IC0gKHB0ci0+bGVuIC0gMSk7CisJCWlmICgocHRyLT5wcm9maXQgPj0gMCkgJiYgKG5ld3Byb2ZpdCA8IDApKSB7CisJCQlyZW1vdmVfdG9rZW5fZnJvbV9ncm91cChwdHIpOworCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKKwkJfQorCQlwdHItPnByb2ZpdD1uZXdwcm9maXQ7CisKKwkJcHRyPXB0ci0+c21hbGxlcjsKKwl9Cit9CisKKy8qIGNvdW50IGFsbCB0aGUgcG9zc2libGUgdG9rZW5zIGluIGEgc3ltYm9sICovCitzdGF0aWMgdm9pZCBsZWFybl9zeW1ib2wodW5zaWduZWQgY2hhciAqc3ltYm9sLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKKwkJbGVhcm5fdG9rZW4oc3ltYm9sICsgaSwgbGVuIC0gaSk7Cit9CisKKy8qIGRlY3JlYXNlIHRoZSBjb3VudCBmb3IgYWxsIHRoZSBwb3NzaWJsZSB0b2tlbnMgaW4gYSBzeW1ib2wgKi8KK3N0YXRpYyB2b2lkIGZvcmdldF9zeW1ib2wodW5zaWduZWQgY2hhciAqc3ltYm9sLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKKwkJZm9yZ2V0X3Rva2VuKHN5bWJvbCArIGksIGxlbiAtIGkpOworfQorCisvKiBzZXQgYWxsIHRoZSBzeW1ib2wgZmxhZ3MgYW5kIGRvIHRoZSBpbml0aWFsIHRva2VuIGNvdW50ICovCitzdGF0aWMgdm9pZCBidWlsZF9pbml0aWFsX3Rva190YWJsZSh2b2lkKQoreworCWludCBpLCB1c2VfaXQsIHZhbGlkOworCisJdmFsaWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQl0YWJsZVtpXS5mbGFncyA9IDA7CisJCWlmICggc3ltYm9sX3ZhbGlkKCZ0YWJsZVtpXSkgKSB7CisJCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19WQUxJRDsKKwkJCXZhbGlkKys7CisJCX0KKwl9CisKKwl1c2VfaXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCisJCS8qIHN1YnNhbXBsZSB0aGUgYXZhaWxhYmxlIHN5bWJvbHMuIFRoaXMgbWV0aG9kIGlzIGFsbW9zdCBsaWtlCisJCSAqIGEgQnJlc2VuaGFtJ3MgYWxnb3JpdGhtIHRvIGdldCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgc2FtcGxlcworCQkgKiBhY3Jvc3MgdGhlIHN5bWJvbCB0YWJsZSAqLworCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkgeworCisJCQl1c2VfaXQgKz0gV09SS0lOR19TRVQ7CisKKwkJCWlmICh1c2VfaXQgPj0gdmFsaWQpIHsKKwkJCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19TQU1QTEVEOworCQkJCXVzZV9pdCAtPSB2YWxpZDsKKwkJCX0KKwkJfQorCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19TQU1QTEVEKQorCQkJbGVhcm5fc3ltYm9sKHRhYmxlW2ldLnN5bSwgdGFibGVbaV0ubGVuKTsKKwl9Cit9CisKKy8qIHJlcGxhY2UgYSBnaXZlbiB0b2tlbiBpbiBhbGwgdGhlIHZhbGlkIHN5bWJvbHMuIFVzZSB0aGUgc2FtcGxlZCBzeW1ib2xzCisgKiB0byB1cGRhdGUgdGhlIGNvdW50cyAqLworc3RhdGljIHZvaWQgY29tcHJlc3Nfc3ltYm9scyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCB0bGVuLCBpbnQgaWR4KQoreworCWludCBpLCBsZW4sIGxlYXJuLCBzaXplOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKworCQlpZiAoISh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSkgY29udGludWU7CisKKwkJbGVuID0gdGFibGVbaV0ubGVuOworCQlsZWFybiA9IDA7CisJCXAgPSB0YWJsZVtpXS5zeW07CisKKwkJZG8geworCQkJLyogZmluZCB0aGUgdG9rZW4gb24gdGhlIHN5bWJvbCAqLworCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopIHN0cnN0cigoY2hhciAqKSBwLCAoY2hhciAqKSBzdHIpOworCQkJaWYgKCFwKSBicmVhazsKKworCQkJaWYgKCFsZWFybikgeworCQkJCS8qIGlmIHRoaXMgc3ltYm9sIHdhcyB1c2VkIHRvIGNvdW50LCBkZWNyZWFzZSBpdCAqLworCQkJCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1NBTVBMRUQpCisJCQkJCWZvcmdldF9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOworCQkJCWxlYXJuID0gMTsKKwkJCX0KKworCQkJKnAgPSBpZHg7CisJCQlzaXplID0gKGxlbiAtIChwIC0gdGFibGVbaV0uc3ltKSkgLSB0bGVuICsgMTsKKwkJCW1lbW1vdmUocCArIDEsIHAgKyB0bGVuLCBzaXplKTsKKwkJCXArKzsKKwkJCWxlbiAtPSB0bGVuIC0gMTsKKworCQl9IHdoaWxlIChzaXplID49IHRsZW4pOworCisJCWlmKGxlYXJuKSB7CisJCQl0YWJsZVtpXS5sZW4gPSBsZW47CisJCQkvKiBpZiB0aGlzIHN5bWJvbCB3YXMgdXNlZCB0byBjb3VudCwgbGVhcm4gaXQgYWdhaW4gKi8KKwkJCWlmKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfU0FNUExFRCkKKwkJCQlsZWFybl9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOworCQl9CisJfQorfQorCisvKiBzZWFyY2ggdGhlIHRva2VuIHdpdGggdGhlIG1heGltdW0gcHJvZml0ICovCitzdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX2Jlc3RfdG9rZW4odm9pZCkKK3sKKwlzdHJ1Y3QgdG9rZW4gKnB0ciwqYmVzdCwqaGVhZDsKKwlpbnQgYmVzdHByb2ZpdDsKKworCWJlc3Rwcm9maXQ9LTEwMDAwOworCisJLyogZmFpbHNhZmU6IGlmIHRoZSAiZ29vZCIgbGlzdCBpcyBlbXB0eSBzZWFyY2ggZnJvbSB0aGUgImJhZCIgbGlzdCAqLworCWlmKGdvb2RfaGVhZC5yaWdodCA9PSAmZ29vZF9oZWFkKSBoZWFkID0gJmJhZF9oZWFkOworCWVsc2UgaGVhZCA9ICZnb29kX2hlYWQ7CisKKwlwdHIgPSBoZWFkLT5yaWdodDsKKwliZXN0ID0gTlVMTDsKKwl3aGlsZSAocHRyICE9IGhlYWQpIHsKKwkJaWYgKHB0ci0+cHJvZml0ID4gYmVzdHByb2ZpdCkgeworCQkJYmVzdHByb2ZpdCA9IHB0ci0+cHJvZml0OworCQkJYmVzdCA9IHB0cjsKKwkJfQorCQlwdHIgPSBwdHItPnJpZ2h0OworCX0KKworCXJldHVybiBiZXN0OworfQorCisvKiB0aGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG06IGNhbGN1bGF0ZSB0aGUgImJlc3QiIHRhYmxlICovCitzdGF0aWMgdm9pZCBvcHRpbWl6ZV9yZXN1bHQodm9pZCkKK3sKKwlzdHJ1Y3QgdG9rZW4gKmJlc3Q7CisJaW50IGk7CisKKwkvKiB1c2luZyB0aGUgJ1wwJyBzeW1ib2wgbGFzdCBhbGxvd3MgY29tcHJlc3Nfc3ltYm9scyB0byB1c2Ugc3RhbmRhcmQKKwkgKiBmYXN0IHN0cmluZyBmdW5jdGlvbnMgKi8KKwlmb3IgKGkgPSAyNTU7IGkgPj0gMDsgaS0tKSB7CisKKwkJLyogaWYgdGhpcyB0YWJsZSBzbG90IGlzIGVtcHR5IChpdCBpcyBub3QgdXNlZCBieSBhbiBhY3R1YWwKKwkJICogb3JpZ2luYWwgY2hhciBjb2RlICovCisJCWlmICghYmVzdF90YWJsZV9sZW5baV0pIHsKKworCQkJLyogZmluZCB0aGUgdG9rZW4gd2l0aCB0aGUgYnJlYXRlcyBwcm9maXQgdmFsdWUgKi8KKwkJCWJlc3QgPSBmaW5kX2Jlc3RfdG9rZW4oKTsKKworCQkJLyogcGxhY2UgaXQgaW4gdGhlICJiZXN0IiB0YWJsZSAqLworCQkJYmVzdF90YWJsZV9sZW5baV0gPSBiZXN0LT5sZW47CisJCQltZW1jcHkoYmVzdF90YWJsZVtpXSwgYmVzdC0+ZGF0YSwgYmVzdF90YWJsZV9sZW5baV0pOworCQkJLyogemVybyB0ZXJtaW5hdGUgdGhlIHRva2VuIHNvIHRoYXQgd2UgY2FuIHVzZSBzdHJzdHIKKwkJCSAgIGluIGNvbXByZXNzX3N5bWJvbHMgKi8KKwkJCWJlc3RfdGFibGVbaV1bYmVzdF90YWJsZV9sZW5baV1dPSdcMCc7CisKKwkJCS8qIHJlcGxhY2UgdGhpcyB0b2tlbiBpbiBhbGwgdGhlIHZhbGlkIHN5bWJvbHMgKi8KKwkJCWNvbXByZXNzX3N5bWJvbHMoYmVzdF90YWJsZVtpXSwgYmVzdF90YWJsZV9sZW5baV0sIGkpOworCQl9CisJfQorfQorCisvKiBzdGFydCBieSBwbGFjaW5nIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQgb24gdGhlIHRhYmxlICovCitzdGF0aWMgdm9pZCBpbnNlcnRfcmVhbF9zeW1ib2xzX2luX3RhYmxlKHZvaWQpCit7CisJaW50IGksIGosIGM7CisKKwltZW1zZXQoYmVzdF90YWJsZSwgMCwgc2l6ZW9mKGJlc3RfdGFibGUpKTsKKwltZW1zZXQoYmVzdF90YWJsZV9sZW4sIDAsIHNpemVvZihiZXN0X3RhYmxlX2xlbikpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgdGFibGVbaV0ubGVuOyBqKyspIHsKKwkJCQljID0gdGFibGVbaV0uc3ltW2pdOworCQkJCWJlc3RfdGFibGVbY11bMF09YzsKKwkJCQliZXN0X3RhYmxlX2xlbltjXT0xOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvcHRpbWl6ZV90b2tlbl90YWJsZSh2b2lkKQoreworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCisJZ29vZF9oZWFkLmxlZnQgPSAmZ29vZF9oZWFkOworCWdvb2RfaGVhZC5yaWdodCA9ICZnb29kX2hlYWQ7CisKKwliYWRfaGVhZC5sZWZ0ID0gJmJhZF9oZWFkOworCWJhZF9oZWFkLnJpZ2h0ID0gJmJhZF9oZWFkOworCisJYnVpbGRfaW5pdGlhbF90b2tfdGFibGUoKTsKKworCWluc2VydF9yZWFsX3N5bWJvbHNfaW5fdGFibGUoKTsKKworCW9wdGltaXplX3Jlc3VsdCgpOworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi0tYWxsLXN5bWJvbHMiKSA9PSAwKQorCQlhbGxfc3ltYm9scyA9IDE7CisJZWxzZSBpZiAoYXJnYyAhPSAxKQorCQl1c2FnZSgpOworCisJcmVhZF9tYXAoc3RkaW4pOworCW9wdGltaXplX3Rva2VuX3RhYmxlKCk7CisJd3JpdGVfc3JjKCk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNWRkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSwyMDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEtlcm5lbCBjb25maWd1cmF0aW9uIHRhcmdldHMKKyMgVGhlc2UgdGFyZ2V0cyBhcmUgdXNlZCBmcm9tIHRvcC1sZXZlbCBtYWtlZmlsZQorCisuUEhPTlk6IG9sZGNvbmZpZyB4Y29uZmlnIGdjb25maWcgbWVudWNvbmZpZyBjb25maWcgc2lsZW50b2xkY29uZmlnCisKK3hjb25maWc6ICQob2JqKS9xY29uZgorCSQ8IGFyY2gvJChBUkNIKS9LY29uZmlnCisKK2djb25maWc6ICQob2JqKS9nY29uZgorCSQ8IGFyY2gvJChBUkNIKS9LY29uZmlnCisKK21lbnVjb25maWc6ICQob2JqKS9tY29uZgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMvbHhkaWFsb2cKKwkkPCBhcmNoLyQoQVJDSCkvS2NvbmZpZworCitjb25maWc6ICQob2JqKS9jb25mCisJJDwgYXJjaC8kKEFSQ0gpL0tjb25maWcKKworb2xkY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1vIGFyY2gvJChBUkNIKS9LY29uZmlnCisKK3NpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtcyBhcmNoLyQoQVJDSCkvS2NvbmZpZworCisuUEhPTlk6IHJhbmRjb25maWcgYWxseWVzY29uZmlnIGFsbG5vY29uZmlnIGFsbG1vZGNvbmZpZyBkZWZjb25maWcKKworcmFuZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtciBhcmNoLyQoQVJDSCkvS2NvbmZpZworCithbGx5ZXNjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXkgYXJjaC8kKEFSQ0gpL0tjb25maWcKKworYWxsbm9jb25maWc6ICQob2JqKS9jb25mCisJJDwgLW4gYXJjaC8kKEFSQ0gpL0tjb25maWcKKworYWxsbW9kY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1tIGFyY2gvJChBUkNIKS9LY29uZmlnCisKK2RlZmNvbmZpZzogJChvYmopL2NvbmYKK2lmZXEgKCQoS0JVSUxEX0RFRkNPTkZJRyksKQorCSQ8IC1kIGFyY2gvJChBUkNIKS9LY29uZmlnCitlbHNlCisJQGVjaG8gKioqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiAnJChLQlVJTERfREVGQ09ORklHKScKKwkkKFEpJDwgLUQgYXJjaC8kKEFSQ0gpL2NvbmZpZ3MvJChLQlVJTERfREVGQ09ORklHKSBhcmNoLyQoQVJDSCkvS2NvbmZpZworZW5kaWYKKworJV9kZWZjb25maWc6ICQob2JqKS9jb25mCisJJChRKSQ8IC1EIGFyY2gvJChBUkNIKS9jb25maWdzLyRAIGFyY2gvJChBUkNIKS9LY29uZmlnCisKKyMgSGVscCB0ZXh0IHVzZWQgYnkgbWFrZSBoZWxwCitoZWxwOgorCUBlY2hvICAnICBjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW0nCisJQGVjaG8gICcgIG1lbnVjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBtZW51IGJhc2VkIHByb2dyYW0nCisJQGVjaG8gICcgIHhjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBRVCBiYXNlZCBmcm9udC1lbmQnCisJQGVjaG8gICcgIGdjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBHVEsgYmFzZWQgZnJvbnQtZW5kJworCUBlY2hvICAnICBvbGRjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2UnCisJQGVjaG8gICcgIHJhbmRjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICBkZWZjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCBkZWZhdWx0IGFuc3dlciB0byBhbGwgb3B0aW9ucycKKwlAZWNobyAgJyAgYWxsbW9kY29uZmlnCSAgLSBOZXcgY29uZmlnIHNlbGVjdGluZyBtb2R1bGVzIHdoZW4gcG9zc2libGUnCisJQGVjaG8gICcgIGFsbHllc2NvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQgd2l0aCB5ZXMnCisJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgbWluaW1hbCBjb25maWcnCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFNoYXJlZCBNYWtlZmlsZSBmb3IgdGhlIHZhcmlvdXMga2NvbmZpZyBleGVjdXRhYmxlczoKKyMgY29uZjoJICBVc2VkIGZvciBkZWZjb25maWcsIG9sZGNvbmZpZyBhbmQgcmVsYXRlZCB0YXJnZXRzCisjIG1jb25mOiAgVXNlZCBmb3IgdGhlIG1jb25maWcgdGFyZ2V0LgorIyAgICAgICAgIFV0aWxpemVzIHRoZSBseGRpYWxvZyBwYWNrYWdlCisjIHFjb25mOiAgVXNlZCBmb3IgdGhlIHhjb25maWcgdGFyZ2V0CisjICAgICAgICAgQmFzZWQgb24gUVQgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgZ2NvbmY6ICBVc2VkIGZvciB0aGUgZ2NvbmZpZyB0YXJnZXQKKyMgICAgICAgICBCYXNlZCBvbiBHVEsgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgb2JqZWN0IGZpbGVzIHVzZWQgYnkgYWxsIGtjb25maWcgZmxhdm91cnMKKworaG9zdHByb2dzLXkJOj0gY29uZiBtY29uZiBxY29uZiBnY29uZgorY29uZi1vYmpzCTo9IGNvbmYubyAgemNvbmYudGFiLm8KK21jb25mLW9ianMJOj0gbWNvbmYubyB6Y29uZi50YWIubworCitpZmVxICgkKE1BS0VDTURHT0FMUykseGNvbmZpZykKKwlxY29uZi10YXJnZXQgOj0gMQorZW5kaWYKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxnY29uZmlnKQorCWdjb25mLXRhcmdldCA6PSAxCitlbmRpZgorCisKK2lmZXEgKCQocWNvbmYtdGFyZ2V0KSwxKQorcWNvbmYtY3h4b2Jqcwk6PSBxY29uZi5vCitxY29uZi1vYmpzCTo9IGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitlbmRpZgorCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKK2djb25mLW9ianMJOj0gZ2NvbmYubyBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubworZW5kaWYKKworY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIFwKKwkJICAgLnRtcF9ndGtjaGVjayB6Y29uZi50YWIuYyB6Y29uZi50YWIuaCBsZXguemNvbmYuYworCisjIGdlbmVyYXRlZCBmaWxlcyBzZWVtIHRvIG5lZWQgdGhpcyB0byBmaW5kIGxvY2FsIGluY2x1ZGUgZmlsZXMKK0hPU1RDRkxBR1NfbGV4Lnpjb25mLm8JOj0gLUkkKHNyYykKK0hPU1RDRkxBR1NfemNvbmYudGFiLm8JOj0gLUkkKHNyYykKKworSE9TVExPQURMSUJFU19xY29uZgk9IC1MJChRVExJQlBBVEgpIC1XbCwtcnBhdGgsJChRVExJQlBBVEgpIC1sJChRVExJQikgLWxkbAorSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAtSSQoUVRESVIpL2luY2x1ZGUgLUQgTEtDX0RJUkVDVF9MSU5LCisKK0hPU1RMT0FETElCRVNfZ2NvbmYJPSBgcGtnLWNvbmZpZyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjAgLS1saWJzYAorSE9TVENGTEFHU19nY29uZi5vCT0gYHBrZy1jb25maWcgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wIC0tY2ZsYWdzYCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EIExLQ19ESVJFQ1RfTElOSworCiskKG9iaikvY29uZi5vICQob2JqKS9tY29uZi5vICQob2JqKS9xY29uZi5vICQob2JqKS9nY29uZi5vOiAkKG9iaikvemNvbmYudGFiLmgKKworJChvYmopL3pjb25mLnRhYi5oOiAkKHNyYykvemNvbmYudGFiLmhfc2hpcHBlZAorJChvYmopL3pjb25mLnRhYi5jOiAkKHNyYykvemNvbmYudGFiLmNfc2hpcHBlZAorJChvYmopL2xleC56Y29uZi5jOiAkKHNyYykvbGV4Lnpjb25mLmNfc2hpcHBlZAorCiskKG9iaikvcWNvbmYubzogJChvYmopLy50bXBfcXRjaGVjaworCitpZmVxICgkKHFjb25mLXRhcmdldCksMSkKK01PQyA9ICQoUVRESVIpL2Jpbi9tb2MKK1FUTElCUEFUSCA9ICQoUVRESVIpL2xpYgorLWluY2x1ZGUgJChvYmopLy50bXBfcXRjaGVjaworCisjIFFUIG5lZWRzIHNvbWUgZXh0cmEgZWZmb3J0Li4uCiskKG9iaikvLnRtcF9xdGNoZWNrOgorCUBzZXQgLWU7IGZvciBkIGluICQkUVRESVIgL3Vzci9zaGFyZS9xdCogL3Vzci9saWIvcXQqOyBkbyBcCisJICBpZiBbIC1mICQkZC9pbmNsdWRlL3Fjb25maWcuaCBdOyB0aGVuIERJUj0kJGQ7IGJyZWFrOyBmaTsgXAorCWRvbmU7IFwKKwlpZiBbIC16ICIkJERJUiIgXTsgdGhlbiBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgUVQgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIjsgXAorCSAgZWNobyAiKiBRVCBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQgYW5kIHRoZSBRVERJUiI7IFwKKwkgIGVjaG8gIiogZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiI7IFwKKwkgIGVjaG8gIioiOyBcCisJICBmYWxzZTsgXAorCWZpOyBcCisJTElCUEFUSD0kJERJUi9saWI7IExJQj1xdDsgXAorCSQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSA+IC9kZXYvbnVsbCAyPiYxICYmIFwKKwkgIExJQlBBVEg9JCRESVIvbGliLyQkKCQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSk7IFwKKwlpZiBbIC1mICQkTElCUEFUSC9saWJxdC1tdC5zbyBdOyB0aGVuIExJQj1xdC1tdDsgZmk7IFwKKwllY2hvICJRVERJUj0kJERJUiIgPiAkQDsgZWNobyAiUVRMSUJQQVRIPSQkTElCUEFUSCIgPj4gJEA7IFwKKwllY2hvICJRVExJQj0kJExJQiIgPj4gJEA7IFwKKwlpZiBbICEgLXggJCRESVIvYmluL21vYyAtYSAteCAvdXNyL2Jpbi9tb2MgXTsgdGhlbiBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiKiBVbmFibGUgdG8gZmluZCAkJERJUi9iaW4vbW9jLCB1c2luZyAvdXNyL2Jpbi9tb2MgaW5zdGVhZC4iOyBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiTU9DPS91c3IvYmluL21vYyIgPj4gJEA7IFwKKwlmaQorZW5kaWYKKworJChvYmopL2djb25mLm86ICQob2JqKS8udG1wX2d0a2NoZWNrCisKK2lmZXEgKCQoZ2NvbmYtdGFyZ2V0KSwxKQorLWluY2x1ZGUgJChvYmopLy50bXBfZ3RrY2hlY2sKKworIyBHVEsgbmVlZHMgc29tZSBleHRyYSBlZmZvcnQsIHRvby4uLgorJChvYmopLy50bXBfZ3RrY2hlY2s6CisJQGlmIGBwa2ctY29uZmlnIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMCAtLWV4aXN0c2A7IHRoZW4JCVwKKwkJaWYgYHBrZy1jb25maWcgZ3RrKy0yLjAgLS1hdGxlYXN0LXZlcnNpb249Mi4wLjBgOyB0aGVuCQkJXAorCQkJdG91Y2ggJEA7CQkJCQkJCQlcCisJCWVsc2UJCQkJCQkJCQlcCisJCQllY2hvICIqIjsgCQkJCQkJCVwKKwkJCWVjaG8gIiogR1RLKyBpcyBwcmVzZW50IGJ1dCB2ZXJzaW9uID49IDIuMC4wIGlzIHJlcXVpcmVkLiI7CVwKKwkJCWVjaG8gIioiOwkJCQkJCQlcCisJCQlmYWxzZTsJCQkJCQkJCVwKKwkJZmkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQlcCisJCWVjaG8gIioiOyAJCQkJCQkJCVwKKwkJZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgR1RLKyBpbnN0YWxsYXRpb24uIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCI7IAlcCisJCWVjaG8gIiogdGhlIEdUSysgMi4wIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgY29ycmVjdGx5IGluc3RhbGxlZC4uLiI7IAlcCisJCWVjaG8gIiogWW91IG5lZWQgZ3RrKy0yLjAsIGdsaWItMi4wIGFuZCBsaWJnbGFkZS0yLjAuIjsgCQlcCisJCWVjaG8gIioiOyAJCQkJCQkJCVwKKwkJZmFsc2U7CQkJCQkJCQkJXAorCWZpCitlbmRpZgorCiskKG9iaikvemNvbmYudGFiLm86ICQob2JqKS9sZXguemNvbmYuYworCiskKG9iaikva2NvbmZpZ19sb2FkLm86ICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvJS5tb2M6ICQoc3JjKS8lLmgKKwkkKE1PQykgLWkgJDwgLW8gJEAKKworJChvYmopL2xrY19kZWZzLmg6ICQoc3JjKS9sa2NfcHJvdG8uaAorCXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCisKKworIyMjCisjIFRoZSBmb2xsb3dpbmcgcmVxdWlyZXMgZmxleC9iaXNvbgorIyBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgX3NoaXBwZWQgdmVyc2lvbnMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYKKyMgeW91IGFyZSBtb2RpZnlpbmcgdGhlIGZsZXgvYmlzb24gc3JjLgorIyBMS0NfR0VOUEFSU0VSIDo9IDEKKworaWZkZWYgTEtDX0dFTlBBUlNFUgorCiskKG9iaikvemNvbmYudGFiLmM6ICQob2JqKS96Y29uZi55IAorJChvYmopL3pjb25mLnRhYi5oOiAkKG9iaikvemNvbmYudGFiLmMKKworJS50YWIuYzogJS55CisJYmlzb24gLXQgLWQgLXYgLWIgJCogLXAgJChub3RkaXIgJCopICQ8CisKK2xleC4lLmM6ICUubAorCWZsZXggLVAkKG5vdGRpciAkKikgLW8kQCAkPAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5NGQxYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKKworZW51bSB7CisJYXNrX2FsbCwKKwlhc2tfbmV3LAorCWFza19zaWxlbnQsCisJc2V0X2RlZmF1bHQsCisJc2V0X3llcywKKwlzZXRfbW9kLAorCXNldF9ubywKKwlzZXRfcmFuZG9tCit9IGlucHV0X21vZGUgPSBhc2tfYWxsOworY2hhciAqZGVmY29uZmlnX2ZpbGU7CisKK3N0YXRpYyBpbnQgaW5kZW50ID0gMTsKK3N0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBjb25mX2NudDsKK3N0YXRpYyBzaWduZWQgY2hhciBsaW5lWzEyOF07CitzdGF0aWMgc3RydWN0IG1lbnUgKnJvb3RFbnRyeTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9ICJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC5cbiI7CisKK3N0YXRpYyB2b2lkIHN0cmlwKHNpZ25lZCBjaGFyICpzdHIpCit7CisJc2lnbmVkIGNoYXIgKnAgPSBzdHI7CisJaW50IGw7CisKKwl3aGlsZSAoKGlzc3BhY2UoKnApKSkKKwkJcCsrOworCWwgPSBzdHJsZW4ocCk7CisJaWYgKHAgIT0gc3RyKQorCQltZW1tb3ZlKHN0ciwgcCwgbCArIDEpOworCWlmICghbCkKKwkJcmV0dXJuOworCXAgPSBzdHIgKyBsIC0gMTsKKwl3aGlsZSAoKGlzc3BhY2UoKnApKSkKKwkJKnAtLSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N0ZGluKHZvaWQpCit7CisJaWYgKCF2YWxpZF9zdGRpbiAmJiBpbnB1dF9tb2RlID09IGFza19zaWxlbnQpIHsKKwkJcHJpbnRmKCJhYm9ydGVkIVxuXG4iKTsKKwkJcHJpbnRmKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKTsKKwkJcHJpbnRmKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIik7CisJCWV4aXQoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2Fza3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqZGVmKQoreworCWVudW0gc3ltYm9sX3R5cGUgdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXRyaXN0YXRlIHZhbDsKKworCWlmICghc3ltX2hhc192YWx1ZShzeW0pKQorCQlwcmludGYoIihORVcpICIpOworCisJbGluZVswXSA9ICdcbic7CisJbGluZVsxXSA9IDA7CisKKwlpZiAoIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlsaW5lWzBdID0gJ1xuJzsKKwkJbGluZVsxXSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIGFza19uZXc6CisJY2FzZSBhc2tfc2lsZW50OgorCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKSB7CisJCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3N0ZGluKCk7CisJY2FzZSBhc2tfYWxsOgorCQlmZmx1c2goc3Rkb3V0KTsKKwkJZmdldHMobGluZSwgMTI4LCBzdGRpbik7CisJCXJldHVybjsKKwljYXNlIHNldF9kZWZhdWx0OgorCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQk7CisJfQorCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCWNhc2Ugc2V0X3llczoKKwkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKSB7CisJCQlsaW5lWzBdID0gJ3knOworCQkJbGluZVsxXSA9ICdcbic7CisJCQlsaW5lWzJdID0gMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBzZXRfbW9kOgorCQlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkpIHsKKwkJCQlsaW5lWzBdID0gJ20nOworCQkJCWxpbmVbMV0gPSAnXG4nOworCQkJCWxpbmVbMl0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKSB7CisJCQkJbGluZVswXSA9ICd5JzsKKwkJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCQlsaW5lWzJdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCWNhc2Ugc2V0X25vOgorCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSkgeworCQkJbGluZVswXSA9ICduJzsKKwkJCWxpbmVbMV0gPSAnXG4nOworCQkJbGluZVsyXSA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2Ugc2V0X3JhbmRvbToKKwkJZG8geworCQkJdmFsID0gKHRyaXN0YXRlKShyYW5kb20oKSAlIDMpOworCQl9IHdoaWxlICghc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHZhbCkpOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIG5vOiBsaW5lWzBdID0gJ24nOyBicmVhazsKKwkJY2FzZSBtb2Q6IGxpbmVbMF0gPSAnbSc7IGJyZWFrOworCQljYXNlIHllczogbGluZVswXSA9ICd5JzsgYnJlYWs7CisJCX0KKwkJbGluZVsxXSA9ICdcbic7CisJCWxpbmVbMl0gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRmKCIlcyIsIGxpbmUpOworfQorCitpbnQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCWNvbnN0IGNoYXIgKmRlZiwgKmhlbHA7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlwcmludGYoIiglcykgIiwgc3ltLT5uYW1lKTsKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpCisJCQlwcmludGYoIlslc10gIiwgZGVmKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIGRlZik7CisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQkvKiBwcmludCBoZWxwICovCisJCQlpZiAobGluZVsxXSA9PSAnXG4nKSB7CisJCQkJaGVscCA9IG5vaGVscF90ZXh0OworCQkJCWlmIChtZW51LT5zeW0tPmhlbHApCisJCQkJCWhlbHAgPSBtZW51LT5zeW0tPmhlbHA7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHApOworCQkJCWRlZiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlsaW5lW3N0cmxlbihsaW5lKS0xXSA9IDA7CisJCQlkZWYgPSBsaW5lOworCQl9CisJCWlmIChkZWYgJiYgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3ltLCBkZWYpKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZfc3ltKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKwljb25zdCBjaGFyICpoZWxwOworCisJd2hpbGUgKDEpIHsKKwkJcHJpbnRmKCIlKnMlcyAiLCBpbmRlbnQgLSAxLCAiIiwgbWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJaWYgKHN5bS0+bmFtZSkKKwkJCXByaW50ZigiKCVzKSAiLCBzeW0tPm5hbWUpOworCQl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJCXB1dGNoYXIoJ1snKTsKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKG9sZHZhbCkgeworCQljYXNlIG5vOgorCQkJcHV0Y2hhcignTicpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcHV0Y2hhcignTScpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJcHV0Y2hhcignWScpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9sZHZhbCAhPSBubyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKQorCQkJcHJpbnRmKCIvbiIpOworCQlpZiAob2xkdmFsICE9IG1vZCAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkKKwkJCXByaW50ZigiL20iKTsKKwkJaWYgKG9sZHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlwcmludGYoIi95Iik7CisJCWlmIChzeW0tPmhlbHApCisJCQlwcmludGYoIi8/Iik7CisJCXByaW50ZigiXSAiKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlzdHJpcChsaW5lKTsKKworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJbmV3dmFsID0gbm87CisJCQlpZiAoIWxpbmVbMV0gfHwgIXN0cmNtcCgmbGluZVsxXSwgIm8iKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQluZXd2YWwgPSBtb2Q7CisJCQlpZiAoIWxpbmVbMV0pCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ1knOgorCQkJbmV3dmFsID0geWVzOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJlcyIpKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCW5ld3ZhbCA9IG9sZHZhbDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWdvdG8gaGVscDsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCXJldHVybiAwOworaGVscDoKKwkJaGVscCA9IG5vaGVscF90ZXh0OworCQlpZiAoc3ltLT5oZWxwKQorCQkJaGVscCA9IHN5bS0+aGVscDsKKwkJcHJpbnRmKCJcbiVzXG4iLCBoZWxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltLCAqZGVmX3N5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJaW50IHR5cGU7CisJYm9vbCBpc19uZXc7CisKKwlzeW0gPSBtZW51LT5zeW07CisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCWlzX25ldyA9ICFzeW1faGFzX3ZhbHVlKHN5bSk7CisJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQljb25mX3N5bShtZW51KTsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXJldHVybiAwOworCQljYXNlIHllczoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXByaW50ZigiJSpzJXNcbiIsIGluZGVudCAtIDEsICIiLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgeWVzOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgY250LCBkZWY7CisKKwkJcHJpbnRmKCIlKnMlc1xuIiwgaW5kZW50IC0gMSwgIiIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCWRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQljbnQgPSBkZWYgPSAwOworCQlsaW5lWzBdID0gJzAnOworCQlsaW5lWzFdID0gMDsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNoaWxkLT5zeW0pIHsKKwkJCQlwcmludGYoIiUqYyAlc1xuIiwgaW5kZW50LCAnKicsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY250Kys7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBkZWZfc3ltKSB7CisJCQkJZGVmID0gY250OworCQkJCXByaW50ZigiJSpjIiwgaW5kZW50LCAnPicpOworCQkJfSBlbHNlCisJCQkJcHJpbnRmKCIlKmMiLCBpbmRlbnQsICcgJyk7CisJCQlwcmludGYoIiAlZC4gJXMiLCBjbnQsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJaWYgKGNoaWxkLT5zeW0tPm5hbWUpCisJCQkJcHJpbnRmKCIgKCVzKSIsIGNoaWxkLT5zeW0tPm5hbWUpOworCQkJaWYgKCFzeW1faGFzX3ZhbHVlKGNoaWxkLT5zeW0pKQorCQkJCXByaW50ZigiIChORVcpIik7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwkJcHJpbnRmKCIlKnNjaG9pY2UiLCBpbmRlbnQgLSAxLCAiIik7CisJCWlmIChjbnQgPT0gMSkgeworCQkJcHJpbnRmKCJbMV06IDFcbiIpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQlwcmludGYoIlsxLSVkIiwgY250KTsKKwkJaWYgKHN5bS0+aGVscCkKKwkJCXByaW50ZigiPyIpOworCQlwcmludGYoIl06ICIpOworCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBhc2tfbmV3OgorCQljYXNlIGFza19zaWxlbnQ6CisJCQlpZiAoIWlzX25ldykgeworCQkJCWNudCA9IGRlZjsKKwkJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2hlY2tfc3RkaW4oKTsKKwkJY2FzZSBhc2tfYWxsOgorCQkJZmZsdXNoKHN0ZG91dCk7CisJCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJCXN0cmlwKGxpbmUpOworCQkJaWYgKGxpbmVbMF0gPT0gJz8nKSB7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPworCQkJCQltZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWxpbmVbMF0pCisJCQkJY250ID0gZGVmOworCQkJZWxzZSBpZiAoaXNkaWdpdChsaW5lWzBdKSkKKwkJCQljbnQgPSBhdG9pKGxpbmUpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbToKKwkJCWRlZiA9IChyYW5kb20oKSAlIGNudCkgKyAxOworCQljYXNlIHNldF9kZWZhdWx0OgorCQljYXNlIHNldF95ZXM6CisJCWNhc2Ugc2V0X21vZDoKKwkJY2FzZSBzZXRfbm86CisJCQljbnQgPSBkZWY7CisJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJYnJlYWs7CisJCX0KKworCWNvbmZfY2hpbGRzOgorCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghY2hpbGQtPnN5bSB8fCAhbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghLS1jbnQpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjaGlsZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnPycpIHsKKwkJCXByaW50ZigiXG4lc1xuIiwgY2hpbGQtPnN5bS0+aGVscCA/CisJCQkJY2hpbGQtPnN5bS0+aGVscCA6IG5vaGVscF90ZXh0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN5bSwgY2hpbGQtPnN5bSk7CisJCWlmIChjaGlsZC0+bGlzdCkgeworCQkJaW5kZW50ICs9IDI7CisJCQljb25mKGNoaWxkLT5saXN0KTsKKwkJCWluZGVudCAtPSAyOworCQl9CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlpZiAocHJvcCkgeworCQljb25zdCBjaGFyICpwcm9tcHQ7CisKKwkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCWNhc2UgUF9NRU5VOgorCQkJaWYgKGlucHV0X21vZGUgPT0gYXNrX3NpbGVudCAmJiByb290RW50cnkgIT0gbWVudSkgeworCQkJCWNoZWNrX2NvbmYobWVudSk7CisJCQkJcmV0dXJuOworCQkJfQorCQljYXNlIFBfQ09NTUVOVDoKKwkJCXByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCWlmIChwcm9tcHQpCisJCQkJcHJpbnRmKCIlKmNcbiUqYyAlc1xuJSpjXG4iLAorCQkJCQlpbmRlbnQsICcqJywKKwkJCQkJaW5kZW50LCAnKicsIHByb21wdCwKKwkJCQkJaW5kZW50LCAnKicpOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorCisJaWYgKCFzeW0pCisJCWdvdG8gY29uZl9jaGlsZHM7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCWNvbmZfY2hvaWNlKG1lbnUpOworCQlpZiAoc3ltLT5jdXJyLnRyaSAhPSBtb2QpCisJCQlyZXR1cm47CisJCWdvdG8gY29uZl9jaGlsZHM7CisJfQorCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJY29uZl9zdHJpbmcobWVudSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvbmZfc3ltKG1lbnUpOworCQlicmVhazsKKwl9CisKK2NvbmZfY2hpbGRzOgorCWlmIChzeW0pCisJCWluZGVudCArPSAyOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJY29uZihjaGlsZCk7CisJaWYgKHN5bSkKKwkJaW5kZW50IC09IDI7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2NvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmICFzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCWlmICghY29uZl9jbnQrKykKKwkJCQlwcmludGYoIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpOworCQkJcm9vdEVudHJ5ID0gbWVudV9nZXRfcGFyZW50X21lbnUobWVudSk7CisJCQljb25mKHJvb3RFbnRyeSk7CisJCX0KKwkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgIT0gbW9kKQorCQkJcmV0dXJuOworCX0KKworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJY2hlY2tfY29uZihjaGlsZCk7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpID0gMTsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHRtcHN0YXQ7CisKKwlpZiAoYWMgPiBpICYmIGF2W2ldWzBdID09ICctJykgeworCQlzd2l0Y2ggKGF2W2krK11bMV0pIHsKKwkJY2FzZSAnbyc6CisJCQlpbnB1dF9tb2RlID0gYXNrX25ldzsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OworCQkJdmFsaWRfc3RkaW4gPSBpc2F0dHkoMCkgJiYgaXNhdHR5KDEpICYmIGlzYXR0eSgyKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWRlZmNvbmZpZ19maWxlID0gYXZbaSsrXTsKKwkJCWlmICghZGVmY29uZmlnX2ZpbGUpIHsKKwkJCQlwcmludGYoIiVzOiBObyBkZWZhdWx0IGNvbmZpZyBmaWxlIHNwZWNpZmllZFxuIiwKKwkJCQkJYXZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlpbnB1dF9tb2RlID0gc2V0X25vOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaW5wdXRfbW9kZSA9IHNldF9tb2Q7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X3llczsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfcmFuZG9tOworCQkJc3JhbmRvbSh0aW1lKE5VTEwpKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlwcmludGYoIiVzIFstb3wtc10gY29uZmlnXG4iLCBhdlswXSk7CisJCQlleGl0KDApOworCQl9CisJfQorICAJbmFtZSA9IGF2W2ldOworCWlmICghbmFtZSkgeworCQlwcmludGYoIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiwgYXZbMF0pOworCX0KKwljb25mX3BhcnNlKG5hbWUpOworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJaWYgKCFkZWZjb25maWdfZmlsZSkKKwkJCWRlZmNvbmZpZ19maWxlID0gY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSgpOworCQlpZiAoY29uZl9yZWFkKGRlZmNvbmZpZ19maWxlKSkgeworCQkJcHJpbnRmKCIqKipcbiIKKwkJCQkiKioqIENhbid0IGZpbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIFwiJXNcIiFcbiIKKwkJCQkiKioqXG4iLCBkZWZjb25maWdfZmlsZSk7CisJCQlleGl0KDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN0YXQoIi5jb25maWciLCAmdG1wc3RhdCkpIHsKKwkJCXByaW50ZigiKioqXG4iCisJCQkJIioqKiBZb3UgaGF2ZSBub3QgeWV0IGNvbmZpZ3VyZWQgeW91ciBrZXJuZWwhXG4iCisJCQkJIioqKlxuIgorCQkJCSIqKiogUGxlYXNlIHJ1biBzb21lIGNvbmZpZ3VyYXRvciAoZS5nLiBcIm1ha2Ugb2xkY29uZmlnXCIgb3JcbiIKKwkJCQkiKioqIFwibWFrZSBtZW51Y29uZmlnXCIgb3IgXCJtYWtlIHhjb25maWdcIikuXG4iCisJCQkJIioqKlxuIik7CisJCQlleGl0KDEpOworCQl9CisJY2FzZSBhc2tfYWxsOgorCWNhc2UgYXNrX25ldzoKKwkJY29uZl9yZWFkKE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoaW5wdXRfbW9kZSAhPSBhc2tfc2lsZW50KSB7CisJCXJvb3RFbnRyeSA9ICZyb290bWVudTsKKwkJY29uZigmcm9vdG1lbnUpOworCQlpZiAoaW5wdXRfbW9kZSA9PSBhc2tfYWxsKSB7CisJCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKKwkJCXZhbGlkX3N0ZGluID0gMTsKKwkJfQorCX0KKwlkbyB7CisJCWNvbmZfY250ID0gMDsKKwkJY2hlY2tfY29uZigmcm9vdG1lbnUpOworCX0gd2hpbGUgKGNvbmZfY250KTsKKwlpZiAoY29uZl93cml0ZShOVUxMKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MmFlMwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworY29uc3QgY2hhciBjb25mX2RlZl9maWxlbmFtZVtdID0gIi5jb25maWciOworCitjb25zdCBjaGFyIGNvbmZfZGVmbmFtZVtdID0gImFyY2gvJEFSQ0gvZGVmY29uZmlnIjsKKworY29uc3QgY2hhciAqY29uZl9jb25mbmFtZXNbXSA9IHsKKwkiLmNvbmZpZyIsCisJIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIiwKKwkiL2V0Yy9rZXJuZWwtY29uZmlnIiwKKwkiL2Jvb3QvY29uZmlnLSRVTkFNRV9SRUxFQVNFIiwKKwljb25mX2RlZm5hbWUsCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyICpjb25mX2V4cGFuZF92YWx1ZShjb25zdCBzaWduZWQgY2hhciAqaW4pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNvbnN0IHNpZ25lZCBjaGFyICpzcmM7CisJc3RhdGljIGNoYXIgcmVzX3ZhbHVlW1NZTUJPTF9NQVhMRU5HVEhdOworCWNoYXIgKmRzdCwgbmFtZVtTWU1CT0xfTUFYTEVOR1RIXTsKKworCXJlc192YWx1ZVswXSA9IDA7CisJZHN0ID0gbmFtZTsKKwl3aGlsZSAoKHNyYyA9IHN0cmNocihpbiwgJyQnKSkpIHsKKwkJc3RybmNhdChyZXNfdmFsdWUsIGluLCBzcmMgLSBpbik7CisJCXNyYysrOworCQlkc3QgPSBuYW1lOworCQl3aGlsZSAoaXNhbG51bSgqc3JjKSB8fCAqc3JjID09ICdfJykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCA9IDA7CisJCXN5bSA9IHN5bV9sb29rdXAobmFtZSwgMCk7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXN0cmNhdChyZXNfdmFsdWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlpbiA9IHNyYzsKKwl9CisJc3RyY2F0KHJlc192YWx1ZSwgaW4pOworCisJcmV0dXJuIHJlc192YWx1ZTsKK30KKworY2hhciAqY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSh2b2lkKQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlzdGF0aWMgY2hhciBmdWxsbmFtZVtQQVRIX01BWCsxXTsKKwljaGFyICplbnYsICpuYW1lOworCisJbmFtZSA9IGNvbmZfZXhwYW5kX3ZhbHVlKGNvbmZfZGVmbmFtZSk7CisJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCWlmIChlbnYpIHsKKwkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJaWYgKCFzdGF0KGZ1bGxuYW1lLCAmYnVmKSkKKwkJCXJldHVybiBmdWxsbmFtZTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludCBjb25mX3JlYWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlGSUxFICppbiA9IE5VTEw7CisJY2hhciBsaW5lWzEwMjRdOworCWNoYXIgKnAsICpwMjsKKwlpbnQgbGluZW5vID0gMDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICplOworCWludCBpOworCisJaWYgKG5hbWUpIHsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICoqbmFtZXMgPSBjb25mX2NvbmZuYW1lczsKKwkJd2hpbGUgKChuYW1lID0gKm5hbWVzKyspKSB7CisJCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUobmFtZSk7CisJCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCQkJaWYgKGluKSB7CisJCQkJcHJpbnRmKCIjXG4iCisJCQkJICAgICAgICIjIHVzaW5nIGRlZmF1bHRzIGZvdW5kIGluICVzXG4iCisJCQkJICAgICAgICIjXG4iLCBuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaW4pCisJCXJldHVybiAxOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVcgfCBTWU1CT0xfQ0hBTkdFRDsKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfSU5UOgorCQljYXNlIFNfSEVYOgorCQljYXNlIFNfU1RSSU5HOgorCQkJaWYgKHN5bS0+dXNlci52YWwpCisJCQkJZnJlZShzeW0tPnVzZXIudmFsKTsKKwkJZGVmYXVsdDoKKwkJCXN5bS0+dXNlci52YWwgPSBOVUxMOworCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQl9CisJfQorCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWxpbmVubysrOworCQlzeW0gPSBOVUxMOworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnIyc6CisJCQlpZiAobWVtY21wKGxpbmUgKyAyLCAiQ09ORklHXyIsIDcpKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHN0cmNocihsaW5lICsgOSwgJyAnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAwOworCQkJaWYgKHN0cm5jbXAocCwgImlzIG5vdCBzZXQiLCAxMCkpCisJCQkJY29udGludWU7CisJCQlzeW0gPSBzeW1fZmluZChsaW5lICsgOSk7CisJCQlpZiAoIXN5bSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IHRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzXG4iLCBuYW1lLCBsaW5lbm8sIGxpbmUgKyA5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0MnOgorCQkJaWYgKG1lbWNtcChsaW5lLCAiQ09ORklHXyIsIDcpKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHN0cmNocihsaW5lICsgNywgJz0nKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAwOworCQkJcDIgPSBzdHJjaHIocCwgJ1xuJyk7CisJCQlpZiAocDIpCisJCQkJKnAyID0gMDsKKwkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA3KTsKKwkJCWlmICghc3ltKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczolZDogdHJ5aW5nIHRvIGFzc2lnbiBub25leGlzdGVudCBzeW1ib2wgJXNcbiIsIG5hbWUsIGxpbmVubywgbGluZSArIDcpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlpZiAocFswXSA9PSAnbScpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG1vZDsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJaWYgKHBbMF0gPT0gJ3knKSB7CisJCQkJCXN5bS0+dXNlci50cmkgPSB5ZXM7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocFswXSA9PSAnbicpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNfU1RSSU5HOgorCQkJCWlmICgqcCsrICE9ICciJykKKwkJCQkJYnJlYWs7CisJCQkJZm9yIChwMiA9IHA7IChwMiA9IHN0cnBicmsocDIsICJcIlxcIikpOyBwMisrKSB7CisJCQkJCWlmICgqcDIgPT0gJyInKSB7CisJCQkJCQkqcDIgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtbW92ZShwMiwgcDIgKyAxLCBzdHJsZW4ocDIpKTsKKwkJCQl9CisJCQkJaWYgKCFwMikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBpbnZhbGlkIHN0cmluZyBmb3VuZFxuIiwgbmFtZSwgbGluZW5vKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQljYXNlIFNfSU5UOgorCQkJY2FzZSBTX0hFWDoKKwkJCQlpZiAoc3ltX3N0cmluZ192YWxpZChzeW0sIHApKSB7CisJCQkJCXN5bS0+dXNlci52YWwgPSBzdHJkdXAocCk7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJfSBlbHNlIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlczolZDogc3ltYm9sIHZhbHVlICclcycgaW52YWxpZCBmb3IgJXNcbiIsIG5hbWUsIGxpbmVubywgcCwgc3ltLT5uYW1lKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKSB7CisJCQlzdHJ1Y3Qgc3ltYm9sICpjcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQkJc3dpdGNoIChzeW0tPnVzZXIudHJpKSB7CisJCQljYXNlIG5vOgorCQkJCWJyZWFrOworCQkJY2FzZSBtb2Q6CisJCQkJaWYgKGNzLT51c2VyLnRyaSA9PSB5ZXMpCisJCQkJCS8qIHdhcm4/ICovOworCQkJCWJyZWFrOworCQkJY2FzZSB5ZXM6CisJCQkJaWYgKGNzLT51c2VyLnRyaSAhPSBubykKKwkJCQkJLyogd2Fybj8gKi87CisJCQkJY3MtPnVzZXIudmFsID0gc3ltOworCQkJCWJyZWFrOworCQkJfQorCQkJY3MtPnVzZXIudHJpID0gRV9PUihjcy0+dXNlci50cmksIHN5bS0+dXNlci50cmkpOworCQkJY3MtPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQl9CisJfQorCWZjbG9zZShpbik7CisKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIXN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJaWYgKHN5bS0+dmlzaWJsZSA9PSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1NUUklORzoKKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBzeW0tPnVzZXIudmFsKSkKKwkJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKQorCQkJaWYgKGUtPnJpZ2h0LnN5bS0+dmlzaWJsZSAhPSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IGUtPnJpZ2h0LnN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXOworCX0KKworCXN5bV9jaGFuZ2VfY291bnQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqb3V0LCAqb3V0X2g7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWNoYXIgZGlybmFtZVsxMjhdLCB0bXBuYW1lWzEyOF0sIG5ld25hbWVbMTI4XTsKKwlpbnQgdHlwZSwgbDsKKwljb25zdCBjaGFyICpzdHI7CisJdGltZV90IG5vdzsKKwlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CisJY2hhciAqZW52OworCisJZGlybmFtZVswXSA9IDA7CisJaWYgKG5hbWUgJiYgbmFtZVswXSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqc2xhc2g7CisKKwkJaWYgKCFzdGF0KG5hbWUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJc3RyY3B5KGRpcm5hbWUsIG5hbWUpOworCQkJc3RyY2F0KGRpcm5hbWUsICIvIik7CisJCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQl9IGVsc2UgaWYgKChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJCWludCBzaXplID0gc2xhc2ggLSBuYW1lICsgMTsKKwkJCW1lbWNweShkaXJuYW1lLCBuYW1lLCBzaXplKTsKKwkJCWRpcm5hbWVbc2l6ZV0gPSAwOworCQkJaWYgKHNsYXNoWzFdKQorCQkJCWJhc2VuYW1lID0gc2xhc2ggKyAxOworCQkJZWxzZQorCQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCX0gZWxzZQorCQkJYmFzZW5hbWUgPSBuYW1lOworCX0gZWxzZQorCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCisJc3ByaW50ZihuZXduYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJb3V0ID0gZm9wZW4obmV3bmFtZSwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJb3V0X2ggPSBOVUxMOworCWlmICghbmFtZSkgeworCQlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOworCQlpZiAoIW91dF9oKQorCQkJcmV0dXJuIDE7CisJfQorCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFJFTEVBU0UiLCAwKTsKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXRpbWUoJm5vdyk7CisJZW52ID0gZ2V0ZW52KCJLQ09ORklHX05PVElNRVNUQU1QIik7CisJaWYgKGVudiAmJiAqZW52KQorCQl1c2VfdGltZXN0YW1wID0gMDsKKworCWZwcmludGYob3V0LCAiI1xuIgorCQkgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgIiMgTGludXgga2VybmVsIHZlcnNpb246ICVzXG4iCisJCSAgICAgIiVzJXMiCisJCSAgICAgIiNcbiIsCisJCSAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKKwkJICAgICB1c2VfdGltZXN0YW1wID8gIiMgIiA6ICIiLAorCQkgICAgIHVzZV90aW1lc3RhbXAgPyBjdGltZSgmbm93KSA6ICIiKTsKKwlpZiAob3V0X2gpCisJCWZwcmludGYob3V0X2gsICIvKlxuIgorCQkJICAgICAgICIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBDIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgorCQkJICAgICAgICIgKiBMaW51eCBrZXJuZWwgdmVyc2lvbjogJXNcbiIKKwkJCSAgICAgICAiJXMlcyIKKwkJCSAgICAgICAiICovXG4iCisJCQkgICAgICAgIiNkZWZpbmUgQVVUT0NPTkZfSU5DTFVERURcbiIsCisJCQkgICAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKKwkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gIiAqICIgOiAiIiwKKwkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CisKKwlpZiAoIXN5bV9jaGFuZ2VfY291bnQpCisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCXN5bSA9IG1lbnUtPnN5bTsKKwkJaWYgKCFzeW0pIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQkJCWdvdG8gbmV4dDsKKwkJCXN0ciA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCWZwcmludGYob3V0LCAiXG4iCisJCQkJICAgICAiI1xuIgorCQkJCSAgICAgIiMgJXNcbiIKKwkJCQkgICAgICIjXG4iLCBzdHIpOworCQkJaWYgKG91dF9oKQorCQkJCWZwcmludGYob3V0X2gsICJcbiIKKwkJCQkJICAgICAgICIvKlxuIgorCQkJCQkgICAgICAgIiAqICVzXG4iCisJCQkJCSAgICAgICAiICovXG4iLCBzdHIpOworCQl9IGVsc2UgaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0UpKSB7CisJCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQkJZ290byBuZXh0OworCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1dSSVRFOworCQkJdHlwZSA9IHN5bS0+dHlwZTsKKwkJCWlmICh0eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7CisJCQkJaWYgKG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykKKwkJCQkJdHlwZSA9IFNfQk9PTEVBTjsKKwkJCX0KKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJCQljYXNlIG5vOgorCQkJCQlmcHJpbnRmKG91dCwgIiMgQ09ORklHXyVzIGlzIG5vdCBzZXRcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjdW5kZWYgQ09ORklHXyVzXG4iLCBzeW0tPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIG1vZDoKKwkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9bVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJaWYgKG91dF9oKQorCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzX01PRFVMRSAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIHllczoKKwkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9eVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJaWYgKG91dF9oKQorCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQkJLy8gZml4IG1lCisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIHN5bS0+bmFtZSk7CisJCQkJaWYgKG91dF9oKQorCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgXCIiLCBzeW0tPm5hbWUpOworCQkJCWRvIHsKKwkJCQkJbCA9IHN0cmNzcG4oc3RyLCAiXCJcXCIpOworCQkJCQlpZiAobCkgeworCQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKKwkJCQkJCWlmIChvdXRfaCkKKwkJCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXRfaCk7CisJCQkJCX0KKwkJCQkJc3RyICs9IGw7CisJCQkJCXdoaWxlICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnIicpIHsKKwkJCQkJCWZwcmludGYob3V0LCAiXFwlYyIsICpzdHIpOworCQkJCQkJaWYgKG91dF9oKQorCQkJCQkJCWZwcmludGYob3V0X2gsICJcXCVjIiwgKnN0cik7CisJCQkJCQlzdHIrKzsKKwkJCQkJfQorCQkJCX0gd2hpbGUgKCpzdHIpOworCQkJCWZwdXRzKCJcIlxuIiwgb3V0KTsKKwkJCQlpZiAob3V0X2gpCisJCQkJCWZwdXRzKCJcIlxuIiwgb3V0X2gpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX0hFWDoKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyAweCVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCWlmIChvdXRfaCkKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzICVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCW5leHQ6CisJCWlmIChtZW51LT5saXN0KSB7CisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2Uob3V0KTsKKwlpZiAob3V0X2gpIHsKKwkJZmNsb3NlKG91dF9oKTsKKwkJcmVuYW1lKCIudG1wY29uZmlnLmgiLCAiaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIik7CisJCWZpbGVfd3JpdGVfZGVwKE5VTEwpOworCX0KKwlpZiAoIW5hbWUgfHwgYmFzZW5hbWUgIT0gY29uZl9kZWZfZmlsZW5hbWUpIHsKKwkJaWYgKCFuYW1lKQorCQkJbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQlzcHJpbnRmKHRtcG5hbWUsICIlcy5vbGQiLCBuYW1lKTsKKwkJcmVuYW1lKG5hbWUsIHRtcG5hbWUpOworCX0KKwlzcHJpbnRmKHRtcG5hbWUsICIlcyVzIiwgZGlybmFtZSwgYmFzZW5hbWUpOworCWlmIChyZW5hbWUobmV3bmFtZSwgdG1wbmFtZSkpCisJCXJldHVybiAxOworCisJc3ltX2NoYW5nZV9jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTRmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC0wLDAgKzEsMTA5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIERFQlVHX0VYUFIJMAorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gRV9TWU1CT0w7CisJZS0+bGVmdC5zeW0gPSBzeW07CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGNlOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGUxOworCWUtPnJpZ2h0LmV4cHIgPSBlMjsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuc3ltID0gczE7CisJZS0+cmlnaHQuc3ltID0gczI7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlpZiAoIWUxKQorCQlyZXR1cm4gZTI7CisJcmV0dXJuIGUyID8gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaWYgKCFlMSkKKwkJcmV0dXJuIGUyOworCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKQoreworCXN0cnVjdCBleHByICplOworCisJaWYgKCFvcmcpCisJCXJldHVybiBOVUxMOworCisJZSA9IG1hbGxvYyhzaXplb2YoKm9yZykpOworCW1lbWNweShlLCBvcmcsIHNpemVvZigqb3JnKSk7CisJc3dpdGNoIChvcmctPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQllLT5sZWZ0ID0gb3JnLT5sZWZ0OworCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2NvcHkob3JnLT5sZWZ0LmV4cHIpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWUtPmxlZnQuc3ltID0gb3JnLT5sZWZ0LnN5bTsKKwkJZS0+cmlnaHQuc3ltID0gb3JnLT5yaWdodC5zeW07CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCWNhc2UgRV9DSE9JQ0U6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfY29weShvcmctPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2NvcHkob3JnLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJjYW4ndCBjb3B5IHR5cGUgJWRcbiIsIGUtPnR5cGUpOworCQlmcmVlKGUpOworCQllID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCXJldHVybjsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImhvdyB0byBmcmVlIHR5cGUgJWQ/XG4iLCBlLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWZyZWUoZSk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNfY291bnQ7CisKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCitzdGF0aWMgdm9pZCBfX2V4cHJfZWxpbWluYXRlX2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKKwkgICAgZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiAoZTEtPmxlZnQuc3ltLT5mbGFncyAmIChTWU1CT0xfWUVTfFNZTUJPTF9OTykpKQorCQlyZXR1cm47CisJaWYgKCFleHByX2VxKGUxLCBlMikpCisJCXJldHVybjsKKwl0cmFuc19jb3VudCsrOworCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9Cit9CisKK3ZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCWlmICghZTEgfHwgIWUyKQorCQlyZXR1cm47CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlfX2V4cHJfZWxpbWluYXRlX2VxKGUxLT50eXBlLCBlcDEsIGVwMik7CisJZGVmYXVsdDoKKwkJOworCX0KKwlpZiAoZTEtPnR5cGUgIT0gZTItPnR5cGUpIHN3aXRjaCAoZTItPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJX19leHByX2VsaW1pbmF0ZV9lcShlMi0+dHlwZSwgZXAxLCBlcDIpOworCWRlZmF1bHQ6CisJCTsKKwl9CisJZTEgPSBleHByX2VsaW1pbmF0ZV95bihlMSk7CisJZTIgPSBleHByX2VsaW1pbmF0ZV95bihlMik7Cit9CisKKyN1bmRlZiBlMQorI3VuZGVmIGUyCisKK2ludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWludCByZXMsIG9sZF9jb3VudDsKKworCWlmIChlMS0+dHlwZSAhPSBlMi0+dHlwZSkKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0gJiYgZTEtPnJpZ2h0LnN5bSA9PSBlMi0+cmlnaHQuc3ltOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX2VxKGUxLT5sZWZ0LmV4cHIsIGUyLT5sZWZ0LmV4cHIpOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfY29weShlMSk7CisJCWUyID0gZXhwcl9jb3B5KGUyKTsKKwkJb2xkX2NvdW50ID0gdHJhbnNfY291bnQ7CisJCWV4cHJfZWxpbWluYXRlX2VxKCZlMSwgJmUyKTsKKwkJcmVzID0gKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MICYmCisJCSAgICAgICBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltKTsKKwkJZXhwcl9mcmVlKGUxKTsKKwkJZXhwcl9mcmVlKGUyKTsKKwkJdHJhbnNfY291bnQgPSBvbGRfY291bnQ7CisJCXJldHVybiByZXM7CisJY2FzZSBFX0NIT0lDRToKKwljYXNlIEVfUkFOR0U6CisJY2FzZSBFX05PTkU6CisJCS8qIHBhbmljICovOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIiA9ICIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIgP1xuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV95bihzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUpIHN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5yaWdodC5leHByKTsKKwkJaWYgKGUtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCXRtcCA9IGUtPnJpZ2h0LmV4cHI7CisJCQkJKmUgPSAqKGUtPnJpZ2h0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlpZiAoZS0+cmlnaHQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlmcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQkqZSA9ICooZS0+bGVmdC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+cmlnaHQuZXhwcik7CisJCWlmIChlLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJdG1wID0gZS0+cmlnaHQuZXhwcjsKKwkJCQkqZSA9ICooZS0+cmlnaHQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWlmIChlLT5yaWdodC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCSplID0gKihlLT5sZWZ0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworLyoKKyAqIGJvb2wgRk9PIT1uID0+IEZPTworICovCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19ib29sKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl90cmFuc19ib29sKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX3RyYW5zX2Jvb2woZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQkvLyBGT08hPW4gLT4gRk9PCisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCisvKgorICogZTEgfHwgZTIgLT4gPworICovCitzdHJ1Y3QgZXhwciAqZXhwcl9qb2luX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSdtJykgLT4gKGEhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX25vKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSduJykgLT4gKGEhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKSkgeworCQkJLy8gKGE9J20nKSB8fCAoYT0nbicpIC0+IChhIT0neScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCQl9CisJfQorCWlmIChzeW0xLT50eXBlID09IFNfQk9PTEVBTiAmJiBzeW0xID09IHN5bTIpIHsKKwkJaWYgKChlMS0+dHlwZSA9PSBFX05PVCAmJiBlMS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfTk9UICYmIGUyLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9TWU1CT0wpKQorCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlwcmludGYoIm9wdGltaXplICgiKTsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiKSB8fCAoIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIik/XG4iKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBleHByICpleHByX2pvaW5fYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkvLyAoYSkgJiYgKGE9J3knKSAtPiAoYT0neScpCisJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykpCisJCS8vIChhKSAmJiAoYSE9J24nKSAtPiAoYSkKKwkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKHN5bTEpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkKKwkJLy8gKGEpICYmIChhIT0nbScpIC0+IChhPSd5JykKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwlpZiAoc3ltMS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMS0+cmlnaHQuc3ltOworCQkJaWYgKChlMi0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMi0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMi0+cmlnaHQuc3ltOworCQkJaWYgKChlMS0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMS0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmCisJCQkgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKQorCQkJLy8gKGEhPSd5JykgJiYgKGEhPSduJykgLT4gKGE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkKKwkJCS8vIChhIT0neScpICYmIChhIT0nbScpIC0+IChhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF9ubyk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkpCisJCQkvLyAoYSE9J20nKSAmJiAoYSE9J24nKSAtPiAoYT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCQlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJcHJpbnRmKCJvcHRpbWl6ZSAoIik7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIikgJiYgKCIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpP1xuIik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBleHByX2VsaW1pbmF0ZV9kdXBzMShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCQlyZXR1cm47CisJfQorCWlmIChlMSA9PSBlMikKKwkJcmV0dXJuOworCisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjogY2FzZSBFX0FORDoKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEoZTEtPnR5cGUsICZlMSwgJmUxKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQl0bXAgPSBleHByX2pvaW5fb3IoZTEsIGUyKTsKKwkJaWYgKHRtcCkgeworCQkJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJdG1wID0gZXhwcl9qb2luX2FuZChlMSwgZTIpOworCQlpZiAodG1wKSB7CisJCQlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0YXRpYyB2b2lkIGV4cHJfZWxpbWluYXRlX2R1cHMyKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCXN0cnVjdCBleHByICp0bXAsICp0bXAxLCAqdG1wMjsKKworCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLCAmZTItPmxlZnQuZXhwcik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwl9CisJaWYgKGUxID09IGUyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PIHx8IEJBUikgJiYgKCFGT08gJiYgIUJBUikgLT4gbgorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9hbmQoJnRtcDEsICZ0bXAyKTsKKwkJaWYgKGV4cHJfaXNfeWVzKHRtcDEpKSB7CisJCQlleHByX2ZyZWUoZTEpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJZXhwcl9mcmVlKHRtcDIpOworCQlleHByX2ZyZWUodG1wMSk7CisJCWV4cHJfZnJlZSh0bXApOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PICYmIEJBUikgfHwgKCFGT08gfHwgIUJBUikgLT4geQorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9vcigmdG1wMSwgJnRtcDIpOworCQlpZiAoZXhwcl9pc19ubyh0bXAxKSkgeworCQkJZXhwcl9mcmVlKGUxKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlleHByX2ZyZWUodG1wMik7CisJCWV4cHJfZnJlZSh0bXAxKTsKKwkJZXhwcl9mcmVlKHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpbnQgb2xkY291bnQ7CisJaWYgKCFlKQorCQlyZXR1cm4gZTsKKworCW9sZGNvdW50ID0gdHJhbnNfY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJdHJhbnNfY291bnQgPSAwOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBFX09SOiBjYXNlIEVfQU5EOgorCQkJZXhwcl9lbGltaW5hdGVfZHVwczEoZS0+dHlwZSwgJmUsICZlKTsKKwkJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUtPnR5cGUsICZlLCAmZSk7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwkJaWYgKCF0cmFuc19jb3VudCkKKwkJCWJyZWFrOworCQllID0gZXhwcl9lbGltaW5hdGVfeW4oZSk7CisJfQorCXRyYW5zX2NvdW50ID0gb2xkY291bnQ7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX3RyYW5zZm9ybShzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJY2FzZSBFX1NZTUJPTDoKKwljYXNlIEVfQ0hPSUNFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllLT5sZWZ0LmV4cHIgPSBleHByX3RyYW5zZm9ybShlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl90cmFuc2Zvcm0oZS0+cmlnaHQuZXhwcik7CisJfQorCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgIT0gU19CT09MRUFOKQorCQkJYnJlYWs7CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCXByaW50ZigiYm9vbGVhbiBzeW1ib2wgJXMgdGVzdGVkIGZvciAnbSc/IHRlc3QgZm9yY2VkIHRvICduJ1xuIiwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlICE9IFNfQk9PTEVBTikKKwkJCWJyZWFrOworCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQlwcmludGYoImJvb2xlYW4gc3ltYm9sICVzIHRlc3RlZCBmb3IgJ20nPyB0ZXN0IGZvcmNlZCB0byAneSdcbiIsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCXN3aXRjaCAoZS0+bGVmdC5leHByLT50eXBlKSB7CisJCWNhc2UgRV9OT1Q6CisJCQkvLyAhIWEgLT4gYQorCQkJdG1wID0gZS0+bGVmdC5leHByLT5sZWZ0LmV4cHI7CisJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQlmcmVlKGUpOworCQkJZSA9IHRtcDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfRVFVQUw6CisJCWNhc2UgRV9VTkVRVUFMOgorCQkJLy8gIWE9J3gnIC0+IGEhPSd4JworCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZnJlZShlKTsKKwkJCWUgPSB0bXA7CisJCQllLT50eXBlID0gZS0+dHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTDsKKwkJCWJyZWFrOworCQljYXNlIEVfT1I6CisJCQkvLyAhKGEgfHwgYikgLT4gIWEgJiYgIWIKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWUtPnR5cGUgPSBFX0FORDsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfQU5EOgorCQkJLy8gIShhICYmIGIpIC0+ICFhIHx8ICFiCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQllLT50eXBlID0gRV9PUjsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfU1lNQk9MOgorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQkvLyAhJ3knIC0+ICduJworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQkJLy8gISdtJyAtPiAnbScKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbW9kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCS8vICEnbicgLT4gJ3knCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiAwOworCisJc3dpdGNoIChkZXAtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pIHx8CisJCSAgICAgICBleHByX2NvbnRhaW5zX3N5bWJvbChkZXAtPnJpZ2h0LmV4cHIsIHN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltIHx8CisJCSAgICAgICBkZXAtPnJpZ2h0LnN5bSA9PSBzeW07CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgZXhwcl9kZXBlbmRzX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoZGVwLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJcmV0dXJuIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSkgfHwKKwkJICAgICAgIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5yaWdodC5leHByLCBzeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBkZXAtPmxlZnQuc3ltID09IHN5bTsKKwljYXNlIEVfRVFVQUw6CisJCWlmIChkZXAtPmxlZnQuc3ltID09IHN5bSkgeworCQkJaWYgKGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzIHx8IGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAoZGVwLT5sZWZ0LnN5bSA9PSBzeW0pIHsKKwkJCWlmIChkZXAtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisgCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9hbmQoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX0FORCwgJnRtcCwgZXAxLCBlcDIpOworCWlmICh0bXApIHsKKwkJKmVwMSA9IGV4cHJfZWxpbWluYXRlX3luKCplcDEpOworCQkqZXAyID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMik7CisJfQorCXJldHVybiB0bXA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX09SLCAmdG1wLCBlcDEsIGVwMik7CisJaWYgKHRtcCkgeworCQkqZXAxID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMSk7CisJCSplcDIgPSBleHByX2VsaW1pbmF0ZV95bigqZXAyKTsKKwl9CisJcmV0dXJuIHRtcDsKK30KKwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGV4cHJfZXEoZTEsIGUyKSkgeworCQkqZXAgPSAqZXAgPyBleHByX2FsbG9jX3R3byh0eXBlLCAqZXAsIGUxKSA6IGUxOworCQlleHByX2ZyZWUoZTIpOworCQlpZiAodHlwZSA9PSBFX0FORCkgeworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IEVfT1IpIHsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplMSwgKmUyOworCisJaWYgKCFlKSB7CisJCWUgPSBleHByX2FsbG9jX3N5bWJvbChzeW0pOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwl9CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJZTEgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCBFX0VRVUFMLCBzeW0pOworCQllMiA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5yaWdodC5leHByLCBFX0VRVUFMLCBzeW0pOworCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHR5cGUgPT0gRV9VTkVRVUFMKQorCQkJZSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBlKTsKKwkJcmV0dXJuIGU7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWUyID0gZXhwcl90cmFuc19jb21wYXJlKGUtPnJpZ2h0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgdHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTCwgc3ltKTsKKwljYXNlIEVfVU5FUVVBTDoKKwljYXNlIEVfRVFVQUw6CisJCWlmICh0eXBlID09IEVfRVFVQUwpIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfY29weShlKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZSkpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2NvcHkoZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcCh0eXBlLCBlLT5sZWZ0LnN5bSwgc3ltKTsKKwljYXNlIEVfQ0hPSUNFOgorCWNhc2UgRV9SQU5HRToKKwljYXNlIEVfTk9ORToKKwkJLyogcGFuaWMgKi87CisJfQorCXJldHVybiBOVUxMOworfQorCit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpCit7CisJdHJpc3RhdGUgdmFsMSwgdmFsMjsKKwljb25zdCBjaGFyICpzdHIxLCAqc3RyMjsKKworCWlmICghZSkKKwkJcmV0dXJuIHllczsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJcmV0dXJuIGUtPmxlZnQuc3ltLT5jdXJyLnRyaTsKKwljYXNlIEVfQU5EOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXZhbDIgPSBleHByX2NhbGNfdmFsdWUoZS0+cmlnaHQuZXhwcik7CisJCXJldHVybiBFX0FORCh2YWwxLCB2YWwyKTsKKwljYXNlIEVfT1I6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJdmFsMiA9IGV4cHJfY2FsY192YWx1ZShlLT5yaWdodC5leHByKTsKKwkJcmV0dXJuIEVfT1IodmFsMSwgdmFsMik7CisJY2FzZSBFX05PVDoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQlyZXR1cm4gRV9OT1QodmFsMSk7CisJY2FzZSBFX0VRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IHllcyA6IG5vOworCWNhc2UgRV9VTkVRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IG5vIDogeWVzOworCWRlZmF1bHQ6CisJCXByaW50ZigiZXhwcl9jYWxjX3ZhbHVlOiAlZD9cbiIsIGUtPnR5cGUpOworCQlyZXR1cm4gbm87CisJfQorfQorCitpbnQgZXhwcl9jb21wYXJlX3R5cGUoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKQoreworI2lmIDAKKwlyZXR1cm4gMTsKKyNlbHNlCisJaWYgKHQxID09IHQyKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKHQxKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAodDIgPT0gRV9OT1QpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfTk9UOgorCQlpZiAodDIgPT0gRV9BTkQpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfQU5EOgorCQlpZiAodDIgPT0gRV9PUikKKwkJCXJldHVybiAxOworCWNhc2UgRV9PUjoKKwkJaWYgKHQyID09IEVfQ0hPSUNFKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX0NIT0lDRToKKwkJaWYgKHQyID09IDApCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiWyVkZ3QlZD9dIiwgdDEsIHQyKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lkIGV4cHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQoreworCWlmICghZSkgeworCQlmbihkYXRhLCAieSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV4cHJfY29tcGFyZV90eXBlKHByZXZ0b2tlbiwgZS0+dHlwZSkgPiAwKQorCQlmbihkYXRhLCAiKCIpOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWlmIChlLT5sZWZ0LnN5bS0+bmFtZSkKKwkJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZWxzZQorCQkJZm4oZGF0YSwgIjxjaG9pY2U+Iik7CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWZuKGRhdGEsICIhIik7CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9OT1QpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIj0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIiE9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKKwkJZm4oZGF0YSwgIiB8fCAiKTsKKwkJZXhwcl9wcmludChlLT5yaWdodC5leHByLCBmbiwgZGF0YSwgRV9PUik7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9BTkQpOworCQlmbihkYXRhLCAiICYmICIpOworCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7CisJCWJyZWFrOworCWNhc2UgRV9DSE9JQ0U6CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWlmIChlLT5sZWZ0LmV4cHIpIHsKKwkJCWZuKGRhdGEsICIgXiAiKTsKKwkJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9DSE9JQ0UpOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9SQU5HRToKKwkJZm4oZGF0YSwgIlsiKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiICIpOworCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiXSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgeworCQljaGFyIGJ1ZlszMl07CisJCXNwcmludGYoYnVmLCAiPHVua25vd24gdHlwZSAlZD4iLCBlLT50eXBlKTsKKwkJZm4oZGF0YSwgYnVmKTsKKwkJYnJlYWs7CisJICB9CisJfQorCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKKwkJZm4oZGF0YSwgIikiKTsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9maWxlX2hlbHBlcih2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHIpCit7CisJZndyaXRlKHN0ciwgc3RybGVuKHN0ciksIDEsIGRhdGEpOworfQorCit2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2ZpbGVfaGVscGVyLCBvdXQsIEVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cl9hcHBlbmQoKHN0cnVjdCBnc3RyKilkYXRhLCBzdHIpOworfQorCit2b2lkIGV4cHJfZ3N0cl9wcmludChzdHJ1Y3QgZXhwciAqZSwgc3RydWN0IGdzdHIgKmdzKQoreworCWV4cHJfcHJpbnQoZSwgZXhwcl9wcmludF9nc3RyX2hlbHBlciwgZ3MsIEVfTk9ORSk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM5ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpZm5kZWYgRVhQUl9ICisjZGVmaW5lIEVYUFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCitzdHJ1Y3QgZmlsZSB7CisJc3RydWN0IGZpbGUgKm5leHQ7CisJc3RydWN0IGZpbGUgKnBhcmVudDsKKwljaGFyICpuYW1lOworCWludCBsaW5lbm87CisJaW50IGZsYWdzOworfTsKKworI2RlZmluZSBGSUxFX0JVU1kJCTB4MDAwMQorI2RlZmluZSBGSUxFX1NDQU5ORUQJCTB4MDAwMgorI2RlZmluZSBGSUxFX1BSSU5URUQJCTB4MDAwNAorCit0eXBlZGVmIGVudW0gdHJpc3RhdGUgeworCW5vLCBtb2QsIHllcworfSB0cmlzdGF0ZTsKKworZW51bSBleHByX3R5cGUgeworCUVfTk9ORSwgRV9PUiwgRV9BTkQsIEVfTk9ULCBFX0VRVUFMLCBFX1VORVFVQUwsIEVfQ0hPSUNFLCBFX1NZTUJPTCwgRV9SQU5HRQorfTsKKwordW5pb24gZXhwcl9kYXRhIHsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07Cit9OworCitzdHJ1Y3QgZXhwciB7CisJZW51bSBleHByX3R5cGUgdHlwZTsKKwl1bmlvbiBleHByX2RhdGEgbGVmdCwgcmlnaHQ7Cit9OworCisjZGVmaW5lIEVfT1IoZGVwMSwgZGVwMikJKCgoZGVwMSk+KGRlcDIpKT8oZGVwMSk6KGRlcDIpKQorI2RlZmluZSBFX0FORChkZXAxLCBkZXAyKQkoKChkZXAxKTwoZGVwMikpPyhkZXAxKTooZGVwMikpCisjZGVmaW5lIEVfTk9UKGRlcCkJCSgyLShkZXApKQorCitzdHJ1Y3QgZXhwcl92YWx1ZSB7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJdHJpc3RhdGUgdHJpOworfTsKKworc3RydWN0IHN5bWJvbF92YWx1ZSB7CisJdm9pZCAqdmFsOworCXRyaXN0YXRlIHRyaTsKK307CisKK2VudW0gc3ltYm9sX3R5cGUgeworCVNfVU5LTk9XTiwgU19CT09MRUFOLCBTX1RSSVNUQVRFLCBTX0lOVCwgU19IRVgsIFNfU1RSSU5HLCBTX09USEVSCit9OworCitzdHJ1Y3Qgc3ltYm9sIHsKKwlzdHJ1Y3Qgc3ltYm9sICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqaGVscDsKKwllbnVtIHN5bWJvbF90eXBlIHR5cGU7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBjdXJyLCB1c2VyOworCXRyaXN0YXRlIHZpc2libGU7CisJaW50IGZsYWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZGVwLCAqZGVwMjsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSByZXZfZGVwOworfTsKKworI2RlZmluZSBmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIGZvciAoc3ltID0gc3ltYm9sX2hhc2hbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSBpZiAoc3ltLT50eXBlICE9IFNfT1RIRVIpCisKKyNkZWZpbmUgU1lNQk9MX1lFUwkJMHgwMDAxCisjZGVmaW5lIFNZTUJPTF9NT0QJCTB4MDAwMgorI2RlZmluZSBTWU1CT0xfTk8JCTB4MDAwNAorI2RlZmluZSBTWU1CT0xfQ09OU1QJCTB4MDAwNworI2RlZmluZSBTWU1CT0xfQ0hFQ0sJCTB4MDAwOAorI2RlZmluZSBTWU1CT0xfQ0hPSUNFCQkweDAwMTAKKyNkZWZpbmUgU1lNQk9MX0NIT0lDRVZBTAkweDAwMjAKKyNkZWZpbmUgU1lNQk9MX1BSSU5URUQJCTB4MDA0MAorI2RlZmluZSBTWU1CT0xfVkFMSUQJCTB4MDA4MAorI2RlZmluZSBTWU1CT0xfT1BUSU9OQUwJCTB4MDEwMAorI2RlZmluZSBTWU1CT0xfV1JJVEUJCTB4MDIwMAorI2RlZmluZSBTWU1CT0xfQ0hBTkdFRAkJMHgwNDAwCisjZGVmaW5lIFNZTUJPTF9ORVcJCTB4MDgwMAorI2RlZmluZSBTWU1CT0xfQVVUTwkJMHgxMDAwCisjZGVmaW5lIFNZTUJPTF9DSEVDS0VECQkweDIwMDAKKyNkZWZpbmUgU1lNQk9MX0NIRUNLX0RPTkUJMHg0MDAwCisjZGVmaW5lIFNZTUJPTF9XQVJORUQJCTB4ODAwMAorCisjZGVmaW5lIFNZTUJPTF9NQVhMRU5HVEgJMjU2CisjZGVmaW5lIFNZTUJPTF9IQVNIU0laRQkJMjU3CisjZGVmaW5lIFNZTUJPTF9IQVNITUFTSwkJMHhmZgorCitlbnVtIHByb3BfdHlwZSB7CisJUF9VTktOT1dOLCBQX1BST01QVCwgUF9DT01NRU5ULCBQX01FTlUsIFBfREVGQVVMVCwgUF9DSE9JQ0UsIFBfU0VMRUNULCBQX1JBTkdFCit9OworCitzdHJ1Y3QgcHJvcGVydHkgeworCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICp0ZXh0OworCXN0cnVjdCBleHByX3ZhbHVlIHZpc2libGU7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKK307CisKKyNkZWZpbmUgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIHRvaykgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dHlwZSA9PSAodG9rKSkKKyNkZWZpbmUgZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHN0KSBmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBzdCwgUF9ERUZBVUxUKQorI2RlZmluZSBmb3JfYWxsX2Nob2ljZXMoc3ltLCBzdCkgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIFBfQ0hPSUNFKQorI2RlZmluZSBmb3JfYWxsX3Byb21wdHMoc3ltLCBzdCkgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dGV4dCkKKworc3RydWN0IG1lbnUgeworCXN0cnVjdCBtZW51ICpuZXh0OworCXN0cnVjdCBtZW51ICpwYXJlbnQ7CisJc3RydWN0IG1lbnUgKmxpc3Q7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvbXB0OworCXN0cnVjdCBleHByICpkZXA7CisJdW5zaWduZWQgaW50IGZsYWdzOworCS8vY2hhciAqaGVscDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworCXZvaWQgKmRhdGE7Cit9OworCisjZGVmaW5lIE1FTlVfQ0hBTkdFRAkJMHgwMDAxCisjZGVmaW5lIE1FTlVfUk9PVAkJMHgwMDAyCisKKyNpZm5kZWYgU1dJRworCitleHRlcm4gc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqY3VycmVudF9maWxlOworc3RydWN0IGZpbGUgKmxvb2t1cF9maWxlKGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzLCBzeW1ib2xfbm8sIHN5bWJvbF9tb2Q7CitleHRlcm4gc3RydWN0IHN5bWJvbCAqbW9kdWxlc19zeW07CitleHRlcm4gaW50IGNkZWJ1ZzsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb25lKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICpjZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZyk7Cit2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSk7CitpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7Cit2b2lkIGV4cHJfZWxpbWluYXRlX2VxKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Cit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2Jvb2woc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX2R1cHMoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNmb3JtKHN0cnVjdCBleHByICplKTsKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworYm9vbCBleHByX2RlcGVuZHNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2NvbXBhcmUoc3RydWN0IGV4cHIgKmUsIGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CisKK3ZvaWQgZXhwcl9mcHJpbnQoc3RydWN0IGV4cHIgKmUsIEZJTEUgKm91dCk7CitzdHJ1Y3QgZ3N0cjsgLyogZm9yd2FyZCAqLwordm9pZCBleHByX2dzdHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHN0cnVjdCBnc3RyICpncyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfeWVzKHN0cnVjdCBleHByICplKQoreworCXJldHVybiAhZSB8fCAoZS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfbm8oc3RydWN0IGV4cHIgKmUpCit7CisJcmV0dXJuIGUgJiYgKGUtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubyk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEVYUFJfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRiZTZlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTAsMCArMSwxNjM5IEBACisvKiBIZXkgRU1BQ1MgLSotIGxpbnV4LWMgLSotICovCisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJvbWFpbiBMaWV2aW4gPHJvbXNAdGlscC5pbmZvPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAiaW1hZ2VzLmMiCisKKyNpbmNsdWRlIDxnbGFkZS9nbGFkZS5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLyNkZWZpbmUgREVCVUcKKworZW51bSB7CisJU0lOR0xFX1ZJRVcsIFNQTElUX1ZJRVcsIEZVTExfVklFVworfTsKKworc3RhdGljIGdpbnQgdmlld19tb2RlID0gRlVMTF9WSUVXOworc3RhdGljIGdib29sZWFuIHNob3dfbmFtZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19yYW5nZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd192YWx1ZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19hbGwgPSBGQUxTRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X2RlYnVnID0gRkFMU0U7CitzdGF0aWMgZ2Jvb2xlYW4gcmVzaXplYWJsZSA9IEZBTFNFOworCitzdGF0aWMgZ2Jvb2xlYW4gY29uZmlnX2NoYW5nZWQgPSBGQUxTRTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9CisgICAgIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIjsKKworR3RrV2lkZ2V0ICptYWluX3duZCA9IE5VTEw7CitHdGtXaWRnZXQgKnRyZWUxX3cgPSBOVUxMOwkvLyBsZWZ0ICBmcmFtZQorR3RrV2lkZ2V0ICp0cmVlMl93ID0gTlVMTDsJLy8gcmlnaHQgZnJhbWUKK0d0a1dpZGdldCAqdGV4dF93ID0gTlVMTDsKK0d0a1dpZGdldCAqaHBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqdnBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqYmFja19idG4gPSBOVUxMOworCitHdGtUZXh0VGFnICp0YWcxLCAqdGFnMjsKK0dka0NvbG9yIGNvbG9yOworCitHdGtUcmVlU3RvcmUgKnRyZWUxLCAqdHJlZTIsICp0cmVlOworR3RrVHJlZU1vZGVsICptb2RlbDEsICptb2RlbDI7CitzdGF0aWMgR3RrVHJlZUl0ZXIgKnBhcmVudHNbMjU2XTsKK3N0YXRpYyBnaW50IGluZGVudDsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50OyAvLyBjdXJyZW50IG5vZGUgZm9yIFNJTkdMRSB2aWV3CitzdGF0aWMgc3RydWN0IG1lbnUgKmJyb3dzZWQ7IC8vIGJyb3dzZWQgbm9kZSBmb3IgU1BMSVQgdmlldworCitlbnVtIHsKKwlDT0xfT1BUSU9OLCBDT0xfTkFNRSwgQ09MX05PLCBDT0xfTU9ELCBDT0xfWUVTLCBDT0xfVkFMVUUsCisJQ09MX01FTlUsIENPTF9DT0xPUiwgQ09MX0VESVQsIENPTF9QSVhCVUYsCisJQ09MX1BJWFZJUywgQ09MX0JUTlZJUywgQ09MX0JUTkFDVCwgQ09MX0JUTklOQywgQ09MX0JUTlJBRCwKKwlDT0xfTlVNQkVSCit9OworCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlX3BhcnQodm9pZCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfdHJlZShzdHJ1Y3QgbWVudSAqc3JjLCBHdGtUcmVlSXRlciAqIGRzdCk7CitzdGF0aWMgdm9pZCBzZXRfbm9kZShHdGtUcmVlSXRlciAqIG5vZGUsIHN0cnVjdCBtZW51ICptZW51LCBnY2hhciAqKiByb3cpOworc3RhdGljIGdjaGFyICoqZmlsbF9yb3coc3RydWN0IG1lbnUgKm1lbnUpOworCisKKy8qIEhlbHBpbmcvRGVidWdnaW5nIEZ1bmN0aW9ucyAqLworCisKK2NvbnN0IGNoYXIgKmRiZ19wcmludF9zdHlwZShpbnQgdmFsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisJYnplcm8oYnVmLCAyNTYpOworCisJaWYgKHZhbCA9PSBTX1VOS05PV04pCisJCXN0cmNweShidWYsICJ1bmtub3duIik7CisJaWYgKHZhbCA9PSBTX0JPT0xFQU4pCisJCXN0cmNweShidWYsICJib29sZWFuIik7CisJaWYgKHZhbCA9PSBTX1RSSVNUQVRFKQorCQlzdHJjcHkoYnVmLCAidHJpc3RhdGUiKTsKKwlpZiAodmFsID09IFNfSU5UKQorCQlzdHJjcHkoYnVmLCAiaW50Iik7CisJaWYgKHZhbCA9PSBTX0hFWCkKKwkJc3RyY3B5KGJ1ZiwgImhleCIpOworCWlmICh2YWwgPT0gU19TVFJJTkcpCisJCXN0cmNweShidWYsICJzdHJpbmciKTsKKwlpZiAodmFsID09IFNfT1RIRVIpCisJCXN0cmNweShidWYsICJvdGhlciIpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoIiVzIiwgYnVmKTsKKyNlbmRpZgorCisJcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqZGJnX3ByaW50X2ZsYWdzKGludCB2YWwpCit7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwliemVybyhidWYsIDI1Nik7CisKKwlpZiAodmFsICYgU1lNQk9MX1lFUykKKwkJc3RyY2F0KGJ1ZiwgInllcy8iKTsKKwlpZiAodmFsICYgU1lNQk9MX01PRCkKKwkJc3RyY2F0KGJ1ZiwgIm1vZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX05PKQorCQlzdHJjYXQoYnVmLCAibm8vIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DT05TVCkKKwkJc3RyY2F0KGJ1ZiwgImNvbnN0LyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hFQ0spCisJCXN0cmNhdChidWYsICJjaGVjay8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRSkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZS8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRVZBTCkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZXZhbC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX1BSSU5URUQpCisJCXN0cmNhdChidWYsICJwcmludGVkLyIpOworCWlmICh2YWwgJiBTWU1CT0xfVkFMSUQpCisJCXN0cmNhdChidWYsICJ2YWxpZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX09QVElPTkFMKQorCQlzdHJjYXQoYnVmLCAib3B0aW9uYWwvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9XUklURSkKKwkJc3RyY2F0KGJ1ZiwgIndyaXRlLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJc3RyY2F0KGJ1ZiwgImNoYW5nZWQvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9ORVcpCisJCXN0cmNhdChidWYsICJuZXcvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9BVVRPKQorCQlzdHJjYXQoYnVmLCAiYXV0by8iKTsKKworCWJ1ZltzdHJsZW4oYnVmKSAtIDFdID0gJ1wwJzsKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpkYmdfcHJpbnRfcHR5cGUoaW50IHZhbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCWJ6ZXJvKGJ1ZiwgMjU2KTsKKworCWlmICh2YWwgPT0gUF9VTktOT1dOKQorCQlzdHJjcHkoYnVmLCAidW5rbm93biIpOworCWlmICh2YWwgPT0gUF9QUk9NUFQpCisJCXN0cmNweShidWYsICJwcm9tcHQiKTsKKwlpZiAodmFsID09IFBfQ09NTUVOVCkKKwkJc3RyY3B5KGJ1ZiwgImNvbW1lbnQiKTsKKwlpZiAodmFsID09IFBfTUVOVSkKKwkJc3RyY3B5KGJ1ZiwgIm1lbnUiKTsKKwlpZiAodmFsID09IFBfREVGQVVMVCkKKwkJc3RyY3B5KGJ1ZiwgImRlZmF1bHQiKTsKKwlpZiAodmFsID09IFBfQ0hPSUNFKQorCQlzdHJjcHkoYnVmLCAiY2hvaWNlIik7CisKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCisKKy8qIE1haW4gV2luZG93IEluaXRpYWxpemF0aW9uICovCisKKwordm9pZCBpbml0X21haW5fd2luZG93KGNvbnN0IGdjaGFyICogZ2xhZGVfZmlsZSkKK3sKKwlHbGFkZVhNTCAqeG1sOworCUd0a1dpZGdldCAqd2lkZ2V0OworCUd0a1RleHRCdWZmZXIgKnR4dGJ1ZjsKKwljaGFyIHRpdGxlWzI1Nl07CisJR2RrUGl4bWFwICpwaXhtYXA7CisJR2RrQml0bWFwICptYXNrOworCUd0a1N0eWxlICpzdHlsZTsKKworCXhtbCA9IGdsYWRlX3htbF9uZXcoZ2xhZGVfZmlsZSwgIndpbmRvdzEiLCBOVUxMKTsKKwlpZiAoIXhtbCkKKwkJZ19lcnJvcigiR1VJIGxvYWRpbmcgZmFpbGVkICFcbiIpOworCWdsYWRlX3htbF9zaWduYWxfYXV0b2Nvbm5lY3QoeG1sKTsKKworCW1haW5fd25kID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAid2luZG93MSIpOworCWhwYW5lZCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImhwYW5lZDEiKTsKKwl2cGFuZWQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ2cGFuZWQxIik7CisJdHJlZTFfdyA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRyZWV2aWV3MSIpOworCXRyZWUyX3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0cmVldmlldzIiKTsKKwl0ZXh0X3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0ZXh0dmlldzMiKTsKKworCWJhY2tfYnRuID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uMSIpOworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19uYW1lMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfbmFtZSk7CisKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzaG93X3JhbmdlMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfcmFuZ2UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19kYXRhMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfdmFsdWUpOworCisJc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShtYWluX3duZCk7CisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidG9vbGJhcjEiKTsKKworCXBpeG1hcCA9IGdka19waXhtYXBfY3JlYXRlX2Zyb21feHBtX2QobWFpbl93bmQtPndpbmRvdywgJm1hc2ssCisJCQkJCSAgICAgICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAgICAgIChnY2hhciAqKikgeHBtX3NpbmdsZV92aWV3KTsKKwlndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwKEdUS19JTUFHRQorCQkJCSAgKCgoR3RrVG9vbGJhckNoaWxkCisJCQkJICAgICAqKSAoZ19saXN0X250aChHVEtfVE9PTEJBUih3aWRnZXQpLT4KKwkJCQkJCSAgICBjaGlsZHJlbiwKKwkJCQkJCSAgICA1KS0+ZGF0YSkpLT5pY29uKSwKKwkJCQkgIHBpeG1hcCwgbWFzayk7CisJcGl4bWFwID0KKwkgICAgZ2RrX3BpeG1hcF9jcmVhdGVfZnJvbV94cG1fZChtYWluX3duZC0+d2luZG93LCAmbWFzaywKKwkJCQkJICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAoZ2NoYXIgKiopIHhwbV9zcGxpdF92aWV3KTsKKwlndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwKEdUS19JTUFHRQorCQkJCSAgKCgoR3RrVG9vbGJhckNoaWxkCisJCQkJICAgICAqKSAoZ19saXN0X250aChHVEtfVE9PTEJBUih3aWRnZXQpLT4KKwkJCQkJCSAgICBjaGlsZHJlbiwKKwkJCQkJCSAgICA2KS0+ZGF0YSkpLT5pY29uKSwKKwkJCQkgIHBpeG1hcCwgbWFzayk7CisJcGl4bWFwID0KKwkgICAgZ2RrX3BpeG1hcF9jcmVhdGVfZnJvbV94cG1fZChtYWluX3duZC0+d2luZG93LCAmbWFzaywKKwkJCQkJICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAoZ2NoYXIgKiopIHhwbV90cmVlX3ZpZXcpOworCWd0a19pbWFnZV9zZXRfZnJvbV9waXhtYXAoR1RLX0lNQUdFCisJCQkJICAoKChHdGtUb29sYmFyQ2hpbGQKKwkJCQkgICAgICopIChnX2xpc3RfbnRoKEdUS19UT09MQkFSKHdpZGdldCktPgorCQkJCQkJICAgIGNoaWxkcmVuLAorCQkJCQkJICAgIDcpLT5kYXRhKSktPmljb24pLAorCQkJCSAgcGl4bWFwLCBtYXNrKTsKKworCXN3aXRjaCAodmlld19tb2RlKSB7CisJY2FzZSBTSU5HTEVfVklFVzoKKwkJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uNCIpOworCQlnX3NpZ25hbF9lbWl0X2J5X25hbWUod2lkZ2V0LCAiY2xpY2tlZCIpOworCQlicmVhazsKKwljYXNlIFNQTElUX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjUiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBGVUxMX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjYiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJfQorCisJdHh0YnVmID0gZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyKEdUS19URVhUX1ZJRVcodGV4dF93KSk7CisJdGFnMSA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMSIsCisJCQkJCSAgImZvcmVncm91bmQiLCAicmVkIiwKKwkJCQkJICAid2VpZ2h0IiwgUEFOR09fV0VJR0hUX0JPTEQsCisJCQkJCSAgTlVMTCk7CisJdGFnMiA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMiIsCisJCQkJCSAgLyoic3R5bGUiLCBQQU5HT19TVFlMRV9PQkxJUVVFLCAqLworCQkJCQkgIE5VTEwpOworCisJc3ByaW50Zih0aXRsZSwgIkxpbnV4IEtlcm5lbCB2JXMgQ29uZmlndXJhdGlvbiIsCisJCWdldGVudigiS0VSTkVMUkVMRUFTRSIpKTsKKwlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKG1haW5fd25kKSwgdGl0bGUpOworCisJZ3RrX3dpZGdldF9zaG93KG1haW5fd25kKTsKK30KKwordm9pZCBpbml0X3RyZWVfbW9kZWwodm9pZCkKK3sKKwlnaW50IGk7CisKKwl0cmVlID0gdHJlZTIgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkJICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCQkgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJCSAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkJICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDIgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMik7CisKKwlmb3IgKHBhcmVudHNbMF0gPSBOVUxMLCBpID0gMTsgaSA8IDI1NjsgaSsrKQorCQlwYXJlbnRzW2ldID0gKEd0a1RyZWVJdGVyICopIGdfbWFsbG9jKHNpemVvZihHdGtUcmVlSXRlcikpOworCisJdHJlZTEgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCSAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJICAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkgICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDEgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMSk7Cit9CisKK3ZvaWQgaW5pdF9sZWZ0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTFfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKworCWd0a190cmVlX3ZpZXdfc2V0X21vZGVsKHZpZXcsIG1vZGVsMSk7CisJZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlKHZpZXcsIFRSVUUpOworCWd0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnQodmlldywgRkFMU0UpOworCQorCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sICJPcHRpb25zIik7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RvZ2dsZV9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgImFjdGl2ZSIsIENPTF9CVE5BQ1QsCisJCQkJCSAgICAiaW5jb25zaXN0ZW50IiwgQ09MX0JUTklOQywKKwkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX0JUTlZJUywgCisJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOwkKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAidGV4dCIsIENPTF9PUFRJT04sCisJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKworCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih2aWV3KTsKKwlndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGUoc2VsLCBHVEtfU0VMRUNUSU9OX1NJTkdMRSk7CisJZ3RrX3dpZGdldF9yZWFsaXplKHRyZWUxX3cpOworfQorCitzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKKwkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxscmVuZGVyZXJ0b2dnbGUsCisJCQkgICAgIGdjaGFyICogYXJnMSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordm9pZCBpbml0X3JpZ2h0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTJfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlnaW50IGk7CisKKwlndGtfdHJlZV92aWV3X3NldF9tb2RlbCh2aWV3LCBtb2RlbDIpOworCWd0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZSh2aWV3LCBUUlVFKTsKKwlndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50KHZpZXcsIEZBTFNFKTsKKworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sICJPcHRpb25zIik7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3BpeGJ1Zl9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgInBpeGJ1ZiIsIENPTF9QSVhCVUYsCisJCQkJCSAgICAidmlzaWJsZSIsIENPTF9QSVhWSVMsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAiYWN0aXZlIiwgQ09MX0JUTkFDVCwKKwkJCQkJICAgICJpbmNvbnNpc3RlbnQiLCBDT0xfQlROSU5DLAorCQkJCQkgICAgInZpc2libGUiLCBDT0xfQlROVklTLCAKKwkJCQkJICAgICJyYWRpbyIsIENPTF9CVE5SQUQsIE5VTEwpOworCS8qZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChyZW5kZXJlciksICJ0b2dnbGVkIiwKKwkgICBHX0NBTExCQUNLKHJlbmRlcmVyX3RvZ2dsZWQpLCBOVUxMKTsgKi8KKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJ0ZXh0IiwgQ09MX09QVElPTiwKKwkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIk5hbWUiLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9OQU1FLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTiIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX05PLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX01PRCwKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIlkiLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9ZRVMsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgICJWYWx1ZSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX1ZBTFVFLAorCQkJCQkJICAgICJlZGl0YWJsZSIsCisJCQkJCQkgICAgQ09MX0VESVQsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCWdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAiZWRpdGVkIiwKKwkJCSBHX0NBTExCQUNLKHJlbmRlcmVyX2VkaXRlZCksIE5VTEwpOworCisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OQU1FKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfbmFtZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OTyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX01PRCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1lFUyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1ZBTFVFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfdmFsdWUpOworCisJaWYgKHJlc2l6ZWFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IENPTF9WQUxVRTsgaSsrKSB7CisJCQljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgaSk7CisJCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlKGNvbHVtbiwgVFJVRSk7CisJCX0KKwl9CisKKwlzZWwgPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24odmlldyk7CisJZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlKHNlbCwgR1RLX1NFTEVDVElPTl9TSU5HTEUpOworfQorCisKKy8qIFV0aWxpdHkgRnVuY3Rpb25zICovCisKKworc3RhdGljIHZvaWQgdGV4dF9pbnNlcnRfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlHdGtUZXh0QnVmZmVyICpidWZmZXI7CisJR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJZ2NoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqaGVscCA9IG5vaGVscF90ZXh0OworCisJaWYgKCFtZW51LT5zeW0pCisJCWhlbHAgPSAiIjsKKwllbHNlIGlmIChtZW51LT5zeW0tPmhlbHApCisJCWhlbHAgPSBtZW51LT5zeW0tPmhlbHA7CisKKwlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+bmFtZSkKKwkJbmFtZSA9IGdfc3RyZHVwX3ByaW50ZihtZW51LT5zeW0tPm5hbWUpOworCWVsc2UKKwkJbmFtZSA9IGdfc3RyZHVwKCIiKTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHByb21wdCwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICIgIiwgMSk7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgbmFtZSwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICJcblxuIiwgMik7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgaGVscCwgLTEsIHRhZzIsCisJCQkJCSBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXh0X2luc2VydF9tc2coY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJR3RrVGV4dEJ1ZmZlciAqYnVmZmVyOworCUd0a1RleHRJdGVyIHN0YXJ0LCBlbmQ7CisJY29uc3QgY2hhciAqbXNnID0gbWVzc2FnZTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHRpdGxlLCAtMSwgdGFnMSwKKwkJCQkJIE5VTEwpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIlxuXG4iLCAyKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBtc2csIC0xLCB0YWcyLAorCQkJCQkgTlVMTCk7Cit9CisKKworLyogTWFpbiBXaW5kb3dzIENhbGxiYWNrcyAqLworCit2b2lkIG9uX3NhdmUxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7CitnYm9vbGVhbiBvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50ICogZXZlbnQsCisJCQkJIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZywgKmxhYmVsOworCWdpbnQgcmVzdWx0OworCisJaWYgKGNvbmZpZ19jaGFuZ2VkID09IEZBTFNFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkaWFsb2cgPSBndGtfZGlhbG9nX25ld193aXRoX2J1dHRvbnMoIldhcm5pbmcgISIsCisJCQkJCSAgICAgR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCSAgICAgKEd0a0RpYWxvZ0ZsYWdzKQorCQkJCQkgICAgIChHVEtfRElBTE9HX01PREFMIHwKKwkJCQkJICAgICAgR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKSwKKwkJCQkJICAgICBHVEtfU1RPQ0tfT0ssCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX1lFUywKKwkJCQkJICAgICBHVEtfU1RPQ0tfTk8sCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX05PLAorCQkJCQkgICAgIEdUS19TVE9DS19DQU5DRUwsCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX0NBTkNFTCwgTlVMTCk7CisJZ3RrX2RpYWxvZ19zZXRfZGVmYXVsdF9yZXNwb25zZShHVEtfRElBTE9HKGRpYWxvZyksCisJCQkJCUdUS19SRVNQT05TRV9DQU5DRUwpOworCisJbGFiZWwgPSBndGtfbGFiZWxfbmV3KCJcblNhdmUgY29uZmlndXJhdGlvbiA/XG4iKTsKKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKEdUS19ESUFMT0coZGlhbG9nKS0+dmJveCksIGxhYmVsKTsKKwlndGtfd2lkZ2V0X3Nob3cobGFiZWwpOworCisJcmVzdWx0ID0gZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhkaWFsb2cpKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgR1RLX1JFU1BPTlNFX1lFUzoKKwkJb25fc2F2ZTFfYWN0aXZhdGUoTlVMTCwgTlVMTCk7CisJCXJldHVybiBGQUxTRTsKKwljYXNlIEdUS19SRVNQT05TRV9OTzoKKwkJcmV0dXJuIEZBTFNFOworCWNhc2UgR1RLX1JFU1BPTlNFX0NBTkNFTDoKKwljYXNlIEdUS19SRVNQT05TRV9ERUxFVEVfRVZFTlQ6CisJZGVmYXVsdDoKKwkJZ3RrX3dpZGdldF9kZXN0cm95KGRpYWxvZyk7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworCit2b2lkIG9uX3dpbmRvdzFfZGVzdHJveShHdGtPYmplY3QgKiBvYmplY3QsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKwordm9pZAorb25fd2luZG93MV9zaXplX3JlcXVlc3QoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJR3RrUmVxdWlzaXRpb24gKiByZXF1aXNpdGlvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXN0YXRpYyBnaW50IG9sZF9oOworCWdpbnQgdywgaDsKKworCWlmICh3aWRnZXQtPndpbmRvdyA9PSBOVUxMKQorCQlndGtfd2luZG93X2dldF9kZWZhdWx0X3NpemUoR1RLX1dJTkRPVyhtYWluX3duZCksICZ3LCAmaCk7CisJZWxzZQorCQlnZGtfd2luZG93X2dldF9zaXplKHdpZGdldC0+d2luZG93LCAmdywgJmgpOworCisJaWYgKGggPT0gb2xkX2gpCisJCXJldHVybjsKKwlvbGRfaCA9IGg7CisKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRCh2cGFuZWQpLCAyICogaCAvIDMpOworfQorCisKKy8qIE1lbnUgJiBUb29sYmFyIENhbGxiYWNrcyAqLworCisKK3N0YXRpYyB2b2lkCitsb2FkX2ZpbGVuYW1lKEd0a0ZpbGVTZWxlY3Rpb24gKiBmaWxlX3NlbGVjdG9yLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJY29uc3QgZ2NoYXIgKmZuOworCisJZm4gPSBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKEdUS19GSUxFX1NFTEVDVElPTgorCQkJCQkgICAgICh1c2VyX2RhdGEpKTsKKworCWlmIChjb25mX3JlYWQoZm4pKQorCQl0ZXh0X2luc2VydF9tc2coIkVycm9yIiwgIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gISIpOworCWVsc2UKKwkJZGlzcGxheV90cmVlKCZyb290bWVudSk7Cit9CisKK3ZvaWQgb25fbG9hZDFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZnM7CisKKwlmcyA9IGd0a19maWxlX3NlbGVjdGlvbl9uZXcoIkxvYWQgZmlsZS4uLiIpOworCWdfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJICJjbGlja2VkIiwKKwkJCSBHX0NBTExCQUNLKGxvYWRfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9zYXZlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpCisJCXRleHRfaW5zZXJ0X21zZygiRXJyb3IiLCAiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIik7CisKKwljb25maWdfY2hhbmdlZCA9IEZBTFNFOworfQorCisKK3N0YXRpYyB2b2lkCitzdG9yZV9maWxlbmFtZShHdGtGaWxlU2VsZWN0aW9uICogZmlsZV9zZWxlY3RvciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWNvbnN0IGdjaGFyICpmbjsKKworCWZuID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZShHVEtfRklMRV9TRUxFQ1RJT04KKwkJCQkJICAgICAodXNlcl9kYXRhKSk7CisKKwlpZiAoY29uZl93cml0ZShmbikpCisJCXRleHRfaW5zZXJ0X21zZygiRXJyb3IiLCAiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIik7CisKKwlndGtfd2lkZ2V0X2Rlc3Ryb3koR1RLX1dJREdFVCh1c2VyX2RhdGEpKTsKK30KKwordm9pZCBvbl9zYXZlX2FzMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpmczsKKworCWZzID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldygiU2F2ZSBmaWxlIGFzLi4uIik7CisJZ19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkgImNsaWNrZWQiLAorCQkJIEdfQ0FMTEJBQ0soc3RvcmVfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9xdWl0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKCFvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChOVUxMLCBOVUxMLCBOVUxMKSkKKwkJZ3RrX3dpZGdldF9kZXN0cm95KEdUS19XSURHRVQobWFpbl93bmQpKTsKK30KKworCit2b2lkIG9uX3Nob3dfbmFtZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X25hbWUgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTkFNRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X25hbWUpOworfQorCisKK3ZvaWQgb25fc2hvd19yYW5nZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X3JhbmdlID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX05PKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTU9EKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfWUVTKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCit9CisKKwordm9pZCBvbl9zaG93X2RhdGExX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJc2hvd192YWx1ZSA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9WQUxVRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3ZhbHVlKTsKK30KKworCit2b2lkCitvbl9zaG93X2FsbF9vcHRpb25zMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19hbGwgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCisJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOwkvLyBpbnN0ZWFkIG9mIHVwZGF0ZV90cmVlIHRvIHNwZWVkLXVwCit9CisKKwordm9pZAorb25fc2hvd19kZWJ1Z19pbmZvMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19kZWJ1ZyA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKK30KKworCit2b2lkIG9uX2ludHJvZHVjdGlvbjFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICppbnRyb190ZXh0ID0KKwkgICAgIldlbGNvbWUgdG8gZ2tjLCB0aGUgR1RLKyBncmFwaGljYWwga2VybmVsIGNvbmZpZ3VyYXRpb24gdG9vbFxuIgorCSAgICAiZm9yIExpbnV4LlxuIgorCSAgICAiRm9yIGVhY2ggb3B0aW9uLCBhIGJsYW5rIGJveCBpbmRpY2F0ZXMgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGFcbiIKKwkgICAgImNoZWNrIGluZGljYXRlcyBpdCBpcyBlbmFibGVkLCBhbmQgYSBkb3QgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdG9cbiIKKwkgICAgImJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLiAgQ2xpY2tpbmcgb24gdGhlIGJveCB3aWxsIGN5Y2xlIHRocm91Z2ggdGhlIHRocmVlIHN0YXRlcy5cbiIKKwkgICAgIlxuIgorCSAgICAiSWYgeW91IGRvIG5vdCBzZWUgYW4gb3B0aW9uIChlLmcuLCBhIGRldmljZSBkcml2ZXIpIHRoYXQgeW91XG4iCisJICAgICJiZWxpZXZlIHNob3VsZCBiZSBwcmVzZW50LCB0cnkgdHVybmluZyBvbiBTaG93IEFsbCBPcHRpb25zXG4iCisJICAgICJ1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCSAgICAiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0XG4iCisJICAgICJ3aGF0IG90aGVyIG9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3VcbiIKKwkgICAgImFyZSBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0XG4iCisJICAgICJvcHRpb24uXG4iCisJICAgICJcbiIKKwkgICAgIlRvZ2dsaW5nIFNob3cgRGVidWcgSW5mbyB1bmRlciB0aGUgT3B0aW9ucyBtZW51IHdpbGwgc2hvdyBcbiIKKwkgICAgInRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIHlvdSBjYW4gdGhlbiBtYXRjaCBieSBleGFtaW5pbmcgb3RoZXIgb3B0aW9ucy4iOworCisJZGlhbG9nID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAorCQkJCQlHVEtfTUVTU0FHRV9JTkZPLAorCQkJCQlHVEtfQlVUVE9OU19DTE9TRSwgaW50cm9fdGV4dCk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QoZGlhbG9nKSwgInJlc3BvbnNlIiwKKwkJCQkgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSBHVEtfT0JKRUNUKGRpYWxvZykpOworCWd0a193aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsKK30KKworCit2b2lkIG9uX2Fib3V0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2c7CisJY29uc3QgZ2NoYXIgKmFib3V0X3RleHQgPQorCSAgICAiZ2tjIGlzIGNvcHlyaWdodCAoYykgMjAwMiBSb21haW4gTGlldmluIDxyb21zQGxwZy50aWNhbGMub3JnPi5cbiIKKwkgICAgIkJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBmcm9tIFJvbWFuIFppcHBlbC5cbiI7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBhYm91dF90ZXh0KTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVChkaWFsb2cpLCAicmVzcG9uc2UiLAorCQkJCSBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIEdUS19PQkpFQ1QoZGlhbG9nKSk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworfQorCisKK3ZvaWQgb25fbGljZW5zZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICpsaWNlbnNlX3RleHQgPQorCSAgICAiZ2tjIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi5cbiIKKwkgICAgIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBzb3VyY2UgY29kZSBvclxuIgorCSAgICAidmlzaXQgaHR0cDovL3d3dy5mc2Yub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWxcbiI7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBsaWNlbnNlX3RleHQpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUKGRpYWxvZyksICJyZXNwb25zZSIsCisJCQkJIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgR1RLX09CSkVDVChkaWFsb2cpKTsKKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Cit9CisKKwordm9pZCBvbl9iYWNrX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwljdXJyZW50ID0gY3VycmVudC0+cGFyZW50OworCXB0eXBlID0gY3VycmVudC0+cHJvbXB0ID8gY3VycmVudC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChwdHlwZSAhPSBQX01FTlUpCisJCWN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKKworCWlmIChjdXJyZW50ID09ICZyb290bWVudSkKKwkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9sb2FkX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJb25fbG9hZDFfYWN0aXZhdGUoTlVMTCwgdXNlcl9kYXRhKTsKK30KKworCit2b2lkIG9uX3NhdmVfcHJlc3NlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlvbl9zYXZlMV9hY3RpdmF0ZShOVUxMLCB1c2VyX2RhdGEpOworfQorCisKK3ZvaWQgb25fc2luZ2xlX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJdmlld19tb2RlID0gU0lOR0xFX1ZJRVc7CisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQoaHBhbmVkKSwgMCk7CisJZ3RrX3dpZGdldF9oaWRlKHRyZWUxX3cpOworCWN1cnJlbnQgPSAmcm9vdG1lbnU7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKK30KKworCit2b2lkIG9uX3NwbGl0X2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ2ludCB3LCBoOworCXZpZXdfbW9kZSA9IFNQTElUX1ZJRVc7CisJZ3RrX3dpZGdldF9zaG93KHRyZWUxX3cpOworCWd0a193aW5kb3dfZ2V0X2RlZmF1bHRfc2l6ZShHVEtfV0lORE9XKG1haW5fd25kKSwgJncsICZoKTsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCB3IC8gMik7CisJaWYgKHRyZWUyKQkKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfbGlzdCgpOworfQorCisKK3ZvaWQgb25fZnVsbF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXZpZXdfbW9kZSA9IEZVTExfVklFVzsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCAwKTsKKwlndGtfd2lkZ2V0X2hpZGUodHJlZTFfdyk7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJZGlzcGxheV90cmVlKCZyb290bWVudSk7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9jb2xsYXBzZV9wcmVzc2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWd0a190cmVlX3ZpZXdfY29sbGFwc2VfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKK3ZvaWQgb25fZXhwYW5kX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ3RrX3RyZWVfdmlld19leHBhbmRfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKKy8qIENUcmVlIENhbGxiYWNrcyAqLworCisvKiBDaGFuZ2UgaGV4L2ludC9zdHJpbmcgdmFsdWUgaW4gdGhlIGNlbGwgKi8KK3N0YXRpYyB2b2lkIHJlbmRlcmVyX2VkaXRlZChHdGtDZWxsUmVuZGVyZXJUZXh0ICogY2VsbCwKKwkJCSAgICBjb25zdCBnY2hhciAqIHBhdGhfc3RyaW5nLAorCQkJICAgIGNvbnN0IGdjaGFyICogbmV3X3RleHQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlUGF0aCAqcGF0aCA9IGd0a190cmVlX3BhdGhfbmV3X2Zyb21fc3RyaW5nKHBhdGhfc3RyaW5nKTsKKwlHdGtUcmVlSXRlciBpdGVyOworCWNvbnN0IGNoYXIgKm9sZF9kZWYsICpuZXdfZGVmOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybjsKKworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKwlzeW0gPSBtZW51LT5zeW07CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX1ZBTFVFLCAmb2xkX2RlZiwgLTEpOworCW5ld19kZWYgPSBuZXdfdGV4dDsKKworCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN5bSwgbmV3X2RlZik7CisKKwljb25maWdfY2hhbmdlZCA9IFRSVUU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKKworCWd0a190cmVlX3BhdGhfZnJlZShwYXRoKTsKK30KKworLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSB0cmVlICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3ltX3ZhbHVlKHN0cnVjdCBtZW51ICptZW51LCBnaW50IGNvbCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKGNvbCA9PSBDT0xfTk8pCisJCW5ld3ZhbCA9IG5vOworCWVsc2UgaWYgKGNvbCA9PSBDT0xfTU9EKQorCQluZXd2YWwgPSBtb2Q7CisJZWxzZSBpZiAoY29sID09IENPTF9ZRVMpCisJCW5ld3ZhbCA9IHllczsKKwllbHNlCisJCXJldHVybjsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJaWYgKCFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJCW5ld3ZhbCA9IHllczsKKwkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCk7CisJCWNvbmZpZ19jaGFuZ2VkID0gVFJVRTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgeworCQkJdXBkYXRlX3RyZWUoYnJvd3NlZCwgTlVMTCk7CisJCQlkaXNwbGF5X2xpc3QoKTsKKwkJfQorCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX3N5bV92YWx1ZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlpZiAoIW1lbnUtPnN5bSkKKwkJcmV0dXJuOworCisJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pOworCWlmICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSB7CisJCXVwZGF0ZV90cmVlKGJyb3dzZWQsIE5VTEwpOworCQlkaXNwbGF5X2xpc3QoKTsKKwl9CisJZWxzZSBpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCit9CisKK3N0YXRpYyB2b2lkIHJlbmRlcmVyX3RvZ2dsZWQoR3RrQ2VsbFJlbmRlcmVyVG9nZ2xlICogY2VsbCwKKwkJCSAgICAgZ2NoYXIgKiBwYXRoX3N0cmluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVQYXRoICpwYXRoLCAqc2VsX3BhdGggPSBOVUxMOworCUd0a1RyZWVJdGVyIGl0ZXIsIHNlbF9pdGVyOworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXBhdGggPSBndGtfdHJlZV9wYXRoX25ld19mcm9tX3N0cmluZyhwYXRoX3N0cmluZyk7CisJaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKKwkJcmV0dXJuOworCisJc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworCWlmIChndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkKHNlbCwgTlVMTCwgJnNlbF9pdGVyKSkKKwkJc2VsX3BhdGggPSBndGtfdHJlZV9tb2RlbF9nZXRfcGF0aChtb2RlbDIsICZzZWxfaXRlcik7CisJaWYgKCFzZWxfcGF0aCkKKwkJZ290byBvdXQxOworCWlmIChndGtfdHJlZV9wYXRoX2NvbXBhcmUocGF0aCwgc2VsX3BhdGgpKQorCQlnb3RvIG91dDI7CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKworICAgICAgb3V0MjoKKwlndGtfdHJlZV9wYXRoX2ZyZWUoc2VsX3BhdGgpOworICAgICAgb3V0MToKKwlndGtfdHJlZV9wYXRoX2ZyZWUocGF0aCk7Cit9CisKK3N0YXRpYyBnaW50IGNvbHVtbjJpbmRleChHdGtUcmVlVmlld0NvbHVtbiAqIGNvbHVtbikKK3sKKwlnaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09MX05VTUJFUjsgaSsrKSB7CisJCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwkJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIGkpOworCQlpZiAoY29sID09IGNvbHVtbikKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworCisvKiBVc2VyIGNsaWNrOiB1cGRhdGUgY2hvaWNlIChmdWxsKSBvciBnb2VzIGRvd24gKHNpbmdsZSkgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCWdpbnQgY29sOworCisjaWYgR1RLX0NIRUNLX1ZFUlNJT04oMiwxLDQpIC8vIGJ1ZyBpbiBjdHJlZSB3aXRoIGVhcmxpZXIgdmVyc2lvbiBvZiBHVEsKKwlnaW50IHR4ID0gKGdpbnQpIGV2ZW50LT54OworCWdpbnQgdHkgPSAoZ2ludCkgZXZlbnQtPnk7CisJZ2ludCBjeCwgY3k7CisKKwlndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcyh2aWV3LCB0eCwgdHksICZwYXRoLCAmY29sdW1uLCAmY3gsCisJCQkJICAgICAgJmN5KTsKKyNlbHNlCisJZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yKHZpZXcsICZwYXRoLCAmY29sdW1uKTsKKyNlbmRpZgorCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybiBGQUxTRTsKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisKKwljb2wgPSBjb2x1bW4yaW5kZXgoY29sdW1uKTsKKwlpZiAoZXZlbnQtPnR5cGUgPT0gR0RLXzJCVVRUT05fUFJFU1MpIHsKKwkJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCisJCWlmIChwdHlwZSA9PSBQX01FTlUgJiYgdmlld19tb2RlICE9IEZVTExfVklFVyAmJiBjb2wgPT0gQ09MX09QVElPTikgeworCQkJLy8gZ29lcyBkb3duIGludG8gbWVudQorCQkJY3VycmVudCA9IG1lbnU7CisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCQkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBUUlVFKTsKKwkJfSBlbHNlIGlmICgoY29sID09IENPTF9PUFRJT04pKSB7CisJCQl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIFRSVUUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbCA9PSBDT0xfVkFMVUUpIHsKKwkJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgVFJVRSk7CisJCX0gZWxzZSBpZiAoY29sID09IENPTF9OTyB8fCBjb2wgPT0gQ09MX01PRAorCQkJICAgfHwgY29sID09IENPTF9ZRVMpIHsKKwkJCWNoYW5nZV9zeW1fdmFsdWUobWVudSwgY29sKTsKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBUUlVFKTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyogS2V5IHByZXNzZWQ6IHVwZGF0ZSBjaG9pY2UgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCSAgICAgR2RrRXZlbnRLZXkgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh3aWRnZXQpOworCUd0a1RyZWVQYXRoICpwYXRoOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlnaW50IGNvbDsKKworCWd0a190cmVlX3ZpZXdfZ2V0X2N1cnNvcih2aWV3LCAmcGF0aCwgJmNvbHVtbik7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX3NwYWNlKSB7CisJCWlmIChndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZCh2aWV3LCBwYXRoKSkKKwkJCWd0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93KHZpZXcsIHBhdGgpOworCQllbHNlCisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgRkFMU0UpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX0tQX0VudGVyKSB7CisJfQorCWlmICh3aWRnZXQgPT0gdHJlZTFfdykKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJuIikpCisJCWNvbCA9IENPTF9OTzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChldmVudC0+c3RyaW5nLCAibSIpKQorCQljb2wgPSBDT0xfTU9EOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJ5IikpCisJCWNvbCA9IENPTF9ZRVM7CisJZWxzZQorCQljb2wgPSAtMTsKKwljaGFuZ2Vfc3ltX3ZhbHVlKG1lbnUsIGNvbCk7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyogUm93IHNlbGVjdGlvbiBjaGFuZ2VkOiB1cGRhdGUgaGVscCAqLwordm9pZAorb25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkKEd0a1RyZWVWaWV3ICogdHJlZXZpZXcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWxlY3Rpb247CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXNlbGVjdGlvbiA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih0cmVldmlldyk7CisJaWYgKGd0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWQoc2VsZWN0aW9uLCAmbW9kZWwyLCAmaXRlcikpIHsKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCQl0ZXh0X2luc2VydF9oZWxwKG1lbnUpOworCX0KK30KKworCisvKiBVc2VyIGNsaWNrOiBkaXNwbGF5IHN1Yi10cmVlIGluIHRoZSByaWdodCBmcmFtZS4gKi8KK2dib29sZWFuCitvbl90cmVldmlldzFfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCisJZ2ludCB0eCA9IChnaW50KSBldmVudC0+eDsKKwlnaW50IHR5ID0gKGdpbnQpIGV2ZW50LT55OworCWdpbnQgY3gsIGN5OworCisJZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3ModmlldywgdHgsIHR5LCAmcGF0aCwgJmNvbHVtbiwgJmN4LAorCQkJCSAgICAgICZjeSk7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwxLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMSwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKGV2ZW50LT50eXBlID09IEdES18yQlVUVE9OX1BSRVNTKSB7CisJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCWN1cnJlbnQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0gZWxzZSB7CisJCWJyb3dzZWQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0KKworCWd0a193aWRnZXRfcmVhbGl6ZSh0cmVlMl93KTsKKwlndGtfdHJlZV92aWV3X3NldF9jdXJzb3IodmlldywgcGF0aCwgTlVMTCwgRkFMU0UpOworCWd0a193aWRnZXRfZ3JhYl9mb2N1cyh0cmVlMl93KTsKKworCXJldHVybiBGQUxTRTsKK30KKworCisvKiBGaWxsIGEgcm93IG9mIHN0cmluZ3MgKi8KK3N0YXRpYyBnY2hhciAqKmZpbGxfcm93KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0YXRpYyBnY2hhciAqcm93W0NPTF9OVU1CRVJdOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWY7CisJaW50IHN0eXBlOworCXRyaXN0YXRlIHZhbDsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IENPTF9PUFRJT047IGkgPD0gQ09MX0NPTE9SOyBpKyspCisJCWdfZnJlZShyb3dbaV0pOworCWJ6ZXJvKHJvdywgc2l6ZW9mKHJvdykpOworCisJcm93W0NPTF9PUFRJT05dID0KKwkgICAgZ19zdHJkdXBfcHJpbnRmKCIlcyAlcyIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCSAgICBzeW0gPyAoc3ltLT4KKwkJCQkgICBmbGFncyAmIFNZTUJPTF9ORVcgPyAiKE5FVykiIDogIiIpIDoKKwkJCSAgICAiIik7CisKKwlpZiAoc2hvd19hbGwgJiYgIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcm93W0NPTF9DT0xPUl0gPSBnX3N0cmR1cCgiRGFya0dyYXkiKTsKKwllbHNlCisJCXJvd1tDT0xfQ09MT1JdID0gZ19zdHJkdXAoIkJsYWNrIik7CisKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBQX01FTlU6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fbWVudTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJCXJvd1tDT0xfUElYVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSBQX0NPTU1FTlQ6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fdm9pZDsKKwkJcm93W0NPTF9QSVhWSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcm93W0NPTF9QSVhCVUZdID0gKGdjaGFyICopIHhwbV92b2lkOworCQlyb3dbQ09MX1BJWFZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWJyZWFrOworCX0KKworCWlmICghc3ltKQorCQlyZXR1cm4gcm93OworCXJvd1tDT0xfTkFNRV0gPSBnX3N0cmR1cChzeW0tPm5hbWUpOworCisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzeW0tPmZsYWdzICY9IH5TWU1CT0xfQ0hBTkdFRDsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsJLy8gcGFyc2UgY2hpbGRzIGZvciBnZXR0aW5nIGZpbmFsIHZhbHVlCisJCXN0cnVjdCBtZW51ICpjaGlsZDsKKwkJc3RydWN0IHN5bWJvbCAqZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCXN0cnVjdCBtZW51ICpkZWZfbWVudSA9IE5VTEw7CisKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpCisJCQkgICAgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQlpZiAoZGVmX21lbnUpCisJCQlyb3dbQ09MX1ZBTFVFXSA9CisJCQkgICAgZ19zdHJkdXAobWVudV9nZXRfcHJvbXB0KGRlZl9tZW51KSk7CisJfQorCWlmKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFVkFMKQorCQlyb3dbQ09MX0JUTlJBRF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisKKwlzdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAoc3R5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJaWYoR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSkgPT0gRkFMU0UpCisJCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJvd1tDT0xfTk9dID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfQlROQUNUXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfQlROSU5DXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCXJvd1tDT0xfWUVTXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX0JUTkFDVF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsICE9IG5vICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpCisJCQlyb3dbQ09MX05PXSA9IGdfc3RyZHVwKCJfIik7CisJCWlmICh2YWwgIT0gbW9kICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKQorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIl8iKTsKKwkJaWYgKHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlyb3dbQ09MX1lFU10gPSBnX3N0cmR1cCgiXyIpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cChkZWYpOworCQlyb3dbQ09MX0VESVRdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcm93OworfQorCisKKy8qIFNldCB0aGUgbm9kZSBjb250ZW50IHdpdGggYSByb3cgb2Ygc3RyaW5ncyAqLworc3RhdGljIHZvaWQgc2V0X25vZGUoR3RrVHJlZUl0ZXIgKiBub2RlLCBzdHJ1Y3QgbWVudSAqbWVudSwgZ2NoYXIgKiogcm93KQoreworCUdka0NvbG9yIGNvbG9yOworCWdib29sZWFuIHN1Y2Nlc3M7CisJR2RrUGl4YnVmICpwaXg7CisKKwlwaXggPSBnZGtfcGl4YnVmX25ld19mcm9tX3hwbV9kYXRhKChjb25zdCBjaGFyICoqKQorCQkJCQkgICByb3dbQ09MX1BJWEJVRl0pOworCisJZ2RrX2NvbG9yX3BhcnNlKHJvd1tDT0xfQ09MT1JdLCAmY29sb3IpOworCWdka19jb2xvcm1hcF9hbGxvY19jb2xvcnMoZ2RrX2NvbG9ybWFwX2dldF9zeXN0ZW0oKSwgJmNvbG9yLCAxLAorCQkJCSAgRkFMU0UsIEZBTFNFLCAmc3VjY2Vzcyk7CisKKwlndGtfdHJlZV9zdG9yZV9zZXQodHJlZSwgbm9kZSwKKwkJCSAgIENPTF9PUFRJT04sIHJvd1tDT0xfT1BUSU9OXSwKKwkJCSAgIENPTF9OQU1FLCByb3dbQ09MX05BTUVdLAorCQkJICAgQ09MX05PLCByb3dbQ09MX05PXSwKKwkJCSAgIENPTF9NT0QsIHJvd1tDT0xfTU9EXSwKKwkJCSAgIENPTF9ZRVMsIHJvd1tDT0xfWUVTXSwKKwkJCSAgIENPTF9WQUxVRSwgcm93W0NPTF9WQUxVRV0sCisJCQkgICBDT0xfTUVOVSwgKGdwb2ludGVyKSBtZW51LAorCQkJICAgQ09MX0NPTE9SLCAmY29sb3IsCisJCQkgICBDT0xfRURJVCwgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfRURJVF0pLAorCQkJICAgQ09MX1BJWEJVRiwgcGl4LAorCQkJICAgQ09MX1BJWFZJUywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSksCisJCQkgICBDT0xfQlROVklTLCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5WSVNdKSwKKwkJCSAgIENPTF9CVE5BQ1QsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTkFDVF0pLAorCQkJICAgQ09MX0JUTklOQywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROSU5DXSksCisJCQkgICBDT0xfQlROUkFELCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5SQURdKSwKKwkJCSAgIC0xKTsKKworCWdfb2JqZWN0X3VucmVmKHBpeCk7Cit9CisKKworLyogQWRkIGEgbm9kZSB0byB0aGUgdHJlZSAqLworc3RhdGljIHZvaWQgcGxhY2Vfbm9kZShzdHJ1Y3QgbWVudSAqbWVudSwgY2hhciAqKnJvdykKK3sKKwlHdGtUcmVlSXRlciAqcGFyZW50ID0gcGFyZW50c1tpbmRlbnQgLSAxXTsKKwlHdGtUcmVlSXRlciAqbm9kZSA9IHBhcmVudHNbaW5kZW50XTsKKworCWd0a190cmVlX3N0b3JlX2FwcGVuZCh0cmVlLCBub2RlLCBwYXJlbnQpOworCXNldF9ub2RlKG5vZGUsIG1lbnUsIHJvdyk7Cit9CisKKworLyogRmluZCBhIG5vZGUgaW4gdGhlIEdUSysgdHJlZSAqLworc3RhdGljIEd0a1RyZWVJdGVyIGZvdW5kOworCisvKgorICogRmluZCBhIG1lbnUgaW4gdGhlIEd0a1RyZWUgc3RhcnRpbmcgYXQgcGFyZW50LgorICovCitHdGtUcmVlSXRlciAqZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShHdGtUcmVlSXRlciAqIHBhcmVudCwKKwkJCQkgICAgc3RydWN0IG1lbnUgKnRvZmluZCkKK3sKKwlHdGtUcmVlSXRlciBpdGVyOworCUd0a1RyZWVJdGVyICpjaGlsZCA9ICZpdGVyOworCWdib29sZWFuIHZhbGlkOworCUd0a1RyZWVJdGVyICpyZXQ7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZCwgcGFyZW50KTsKKwl3aGlsZSAodmFsaWQpIHsKKwkJc3RydWN0IG1lbnUgKm1lbnU7CisKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgY2hpbGQsIDYsICZtZW51LCAtMSk7CisKKwkJaWYgKG1lbnUgPT0gdG9maW5kKSB7CisJCQltZW1jcHkoJmZvdW5kLCBjaGlsZCwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQlyZXR1cm4gJmZvdW5kOworCQl9CisKKwkJcmV0ID0gZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShjaGlsZCwgdG9maW5kKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLCBjaGlsZCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFVwZGF0ZSB0aGUgdHJlZSBieSBhZGRpbmcvcmVtb3ZpbmcgZW50cmllcworICogRG9lcyBub3QgY2hhbmdlIG90aGVyIG5vZGVzCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV90cmVlKHN0cnVjdCBtZW51ICpzcmMsIEd0a1RyZWVJdGVyICogZHN0KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDE7CisJR3RrVHJlZUl0ZXIgaXRlciwgdG1wOworCUd0a1RyZWVJdGVyICpjaGlsZDIgPSAmaXRlcjsKKwlnYm9vbGVhbiB2YWxpZDsKKwlHdGtUcmVlSXRlciAqc2libGluZzsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICptZW51MSwgKm1lbnUyOworCisJaWYgKHNyYyA9PSAmcm9vdG1lbnUpCisJCWluZGVudCA9IDE7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZDIsIGRzdCk7CisJZm9yIChjaGlsZDEgPSBzcmMtPmxpc3Q7IGNoaWxkMTsgY2hpbGQxID0gY2hpbGQxLT5uZXh0KSB7CisKKwkJcHJvcCA9IGNoaWxkMS0+cHJvbXB0OworCQlzeW0gPSBjaGlsZDEtPnN5bTsKKworCSAgICAgIHJlcGFyc2U6CisJCW1lbnUxID0gY2hpbGQxOworCQlpZiAodmFsaWQpCisJCQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCBjaGlsZDIsIENPTF9NRU5VLAorCQkJCQkgICAmbWVudTIsIC0xKTsKKwkJZWxzZQorCQkJbWVudTIgPSBOVUxMOwkvLyBmb3JjZSBhZGRpbmcgb2YgYSBmaXJzdCBjaGlsZAorCisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCIlKmMlcyB8ICVzXG4iLCBpbmRlbnQsICcgJywKKwkJICAgICAgIG1lbnUxID8gbWVudV9nZXRfcHJvbXB0KG1lbnUxKSA6ICJuaWwiLAorCQkgICAgICAgbWVudTIgPyBtZW51X2dldF9wcm9tcHQobWVudTIpIDogIm5pbCIpOworI2VuZGlmCisKKwkJaWYgKCFtZW51X2lzX3Zpc2libGUoY2hpbGQxKSAmJiAhc2hvd19hbGwpIHsJLy8gcmVtb3ZlIG5vZGUKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpICE9IE5VTEwpIHsKKwkJCQltZW1jcHkoJnRtcCwgY2hpbGQyLCBzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKwkJCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsCisJCQkJCQkJCSBjaGlsZDIpOworCQkJCWd0a190cmVlX3N0b3JlX3JlbW92ZSh0cmVlMiwgJnRtcCk7CisJCQkJaWYgKCF2YWxpZCkKKwkJCQkJcmV0dXJuOwkvLyBuZXh0IHBhcmVudCAKKwkJCQllbHNlCisJCQkJCWdvdG8gcmVwYXJzZTsJLy8gbmV4dCBjaGlsZAorCQkJfSBlbHNlCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWVudTEgIT0gbWVudTIpIHsKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpID09IE5VTEwpIHsJLy8gYWRkIG5vZGUKKwkJCQlpZiAoIXZhbGlkICYmICFtZW51MikKKwkJCQkJc2libGluZyA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlzaWJsaW5nID0gY2hpbGQyOworCQkJCWd0a190cmVlX3N0b3JlX2luc2VydF9iZWZvcmUodHJlZTIsCisJCQkJCQkJICAgICBjaGlsZDIsCisJCQkJCQkJICAgICBkc3QsIHNpYmxpbmcpOworCQkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCQkJaWYgKG1lbnUyID09IE5VTEwpCisJCQkJCXZhbGlkID0gVFJVRTsKKwkJCX0gZWxzZSB7CS8vIHJlbW92ZSBub2RlCisJCQkJbWVtY3B5KCZ0bXAsIGNoaWxkMiwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLAorCQkJCQkJCQkgY2hpbGQyKTsKKwkJCQlndGtfdHJlZV9zdG9yZV9yZW1vdmUodHJlZTIsICZ0bXApOworCQkJCWlmICghdmFsaWQpCisJCQkJCXJldHVybjsJLy8gbmV4dCBwYXJlbnQgCisJCQkJZWxzZQorCQkJCQlnb3RvIHJlcGFyc2U7CS8vIG5leHQgY2hpbGQKKwkJCX0KKwkJfSBlbHNlIGlmIChzeW0gJiYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkpIHsKKwkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCX0KKworCQlpbmRlbnQrKzsKKwkJdXBkYXRlX3RyZWUoY2hpbGQxLCBjaGlsZDIpOworCQlpbmRlbnQtLTsKKworCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsIGNoaWxkMik7CisJfQorfQorCisKKy8qIERpc3BsYXkgdGhlIHdob2xlIHRyZWUgKHNpbmdsZS9zcGxpdC9mdWxsIHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJaW5kZW50ID0gMTsKKwkJY3VycmVudCA9ICZyb290bWVudTsKKwl9CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJcHJvcCA9IGNoaWxkLT5wcm9tcHQ7CisJCXN5bSA9IGNoaWxkLT5zeW07CisJCXB0eXBlID0gcHJvcCA/IHByb3AtPnR5cGUgOiBQX1VOS05PV047CisKKwkJaWYgKHN5bSkKKwkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEFOR0VEOworCisJCWlmICgodmlld19tb2RlID09IFNQTElUX1ZJRVcpICYmICEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSAmJgorCQkgICAgKHRyZWUgPT0gdHJlZTEpKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgJiYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkgJiYKKwkJICAgICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpIHx8IHNob3dfYWxsKQorCQkJcGxhY2Vfbm9kZShjaGlsZCwgZmlsbF9yb3coY2hpbGQpKTsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIiUqYyVzOiAiLCBpbmRlbnQsICcgJywgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCXByaW50ZigiJXMiLCBjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QgPyAicm9vdG1lbnUgfCAiIDogIiIpOworCQlkYmdfcHJpbnRfcHR5cGUocHR5cGUpOworCQlwcmludGYoIiB8ICIpOworCQlpZiAoc3ltKSB7CisJCQlkYmdfcHJpbnRfc3R5cGUoc3ltLT50eXBlKTsKKwkJCXByaW50ZigiIHwgIik7CisJCQlkYmdfcHJpbnRfZmxhZ3Moc3ltLT5mbGFncyk7CisJCQlwcmludGYoIlxuIik7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJcbiIpOworI2VuZGlmCisJCWlmICgodmlld19tb2RlICE9IEZVTExfVklFVykgJiYgKHB0eXBlID09IFBfTUVOVSkKKwkJICAgICYmICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworLyoKKwkJaWYgKCgobWVudSAhPSAmcm9vdG1lbnUpICYmICEobWVudS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKSB8fAorCQkgICAgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCSAgICB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSovCisJCWlmICgoKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykgJiYgKG1lbnUtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKSB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSB7CisJCQlpbmRlbnQrKzsKKwkJCWRpc3BsYXlfdHJlZShjaGlsZCk7CisJCQlpbmRlbnQtLTsKKwkJfQorCX0KK30KKworLyogRGlzcGxheSBhIHBhcnQgb2YgdGhlIHRyZWUgc3RhcnRpbmcgYXQgY3VycmVudCBub2RlIChzaW5nbGUvc3BsaXQgdmlldykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZV9wYXJ0KHZvaWQpCit7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJaWYodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWUoY3VycmVudCk7CisgCWVsc2UgaWYodmlld19tb2RlID09IFNQTElUX1ZJRVcpCisJCWRpc3BsYXlfdHJlZShicm93c2VkKTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7Cit9CisKKy8qIERpc3BsYXkgdGhlIGxpc3QgaW4gdGhlIGxlZnQgZnJhbWUgKHNwbGl0IHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCkKK3sKKwlpZiAodHJlZTEpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUxKTsKKworCXRyZWUgPSB0cmVlMTsKKwlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMV93KSk7CisJdHJlZSA9IHRyZWUyOworfQorCit2b2lkIGZpeHVwX3Jvb3RtZW51KHN0cnVjdCBtZW51ICptZW51KQoreworICAgICAgICBzdHJ1Y3QgbWVudSAqY2hpbGQ7CisgICAgICAgIHN0YXRpYyBpbnQgbWVudV9jbnQgPSAwOworCisgICAgICAgIG1lbnUtPmZsYWdzIHw9IE1FTlVfUk9PVDsKKyAgICAgICAgZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5wcm9tcHQgJiYgY2hpbGQtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVfY250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cF9yb290bWVudShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW51X2NudC0tOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lbnVfY250KQorICAgICAgICAgICAgICAgICAgICAgICAgZml4dXBfcm9vdG1lbnUoY2hpbGQpOworICAgICAgICB9Cit9CisKKworLyogTWFpbiAqLworCisKK2ludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKmVudjsKKwlnY2hhciAqZ2xhZGVfZmlsZTsKKworI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKKwlrY29uZmlnX2xvYWQoKTsKKyNlbmRpZgorCisJLyogR1RLIHN0dWZmcyAqLworCWd0a19zZXRfbG9jYWxlKCk7CisJZ3RrX2luaXQoJmFjLCAmYXYpOworCWdsYWRlX2luaXQoKTsKKworCS8vYWRkX3BpeG1hcF9kaXJlY3RvcnkgKFBBQ0tBR0VfREFUQV9ESVIgIi8iIFBBQ0tBR0UgIi9waXhtYXBzIik7CisJLy9hZGRfcGl4bWFwX2RpcmVjdG9yeSAoUEFDS0FHRV9TT1VSQ0VfRElSICIvcGl4bWFwcyIpOworCisJLyogRGV0ZXJtaW5lIEdVSSBwYXRoICovCisJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCWlmIChlbnYpCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChlbnYsICIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIiwgTlVMTCk7CisJZWxzZSBpZiAoYXZbMF1bMF0gPT0gJy8nKQorCQlnbGFkZV9maWxlID0gZ19zdHJjb25jYXQoYXZbMF0sICIuZ2xhZGUiLCBOVUxMKTsKKwllbHNlCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChnX2dldF9jdXJyZW50X2RpcigpLCAiLyIsIGF2WzBdLCAiLmdsYWRlIiwgTlVMTCk7CisKKwkvKiBMb2FkIHRoZSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Qgc2lnbmFscyAqLworCWluaXRfbWFpbl93aW5kb3coZ2xhZGVfZmlsZSk7CisJaW5pdF90cmVlX21vZGVsKCk7CisJaW5pdF9sZWZ0X3RyZWUoKTsKKwlpbml0X3JpZ2h0X3RyZWUoKTsKKworCS8qIENvbmYgc3R1ZmZzICovCisJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJc3dpdGNoIChhdlsxXVsxXSkgeworCQljYXNlICdhJzoKKwkJCS8vc2hvd0FsbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJcHJpbnRmKCIlcyA8Y29uZmlnPlxuIiwgYXZbMF0pOworCQkJZXhpdCgwKTsKKwkJfQorCQluYW1lID0gYXZbMl07CisJfSBlbHNlCisJCW5hbWUgPSBhdlsxXTsKKworCWNvbmZfcGFyc2UobmFtZSk7CisJZml4dXBfcm9vdG1lbnUoJnJvb3RtZW51KTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzd2l0Y2ggKHZpZXdfbW9kZSkgeworCWNhc2UgU0lOR0xFX1ZJRVc6CisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJCWJyZWFrOworCWNhc2UgU1BMSVRfVklFVzoKKwkJZGlzcGxheV9saXN0KCk7CisJCWJyZWFrOworCWNhc2UgRlVMTF9WSUVXOgorCQlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwkJYnJlYWs7CisJfQorCisJZ3RrX21haW4oKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTczNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKQEAgLTAsMCArMSw1NDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4gPCEtLSotIG1vZGU6IHhtbCAtKi0tPgorPCFET0NUWVBFIGdsYWRlLWludGVyZmFjZSBTWVNURU0gImh0dHA6Ly9nbGFkZS5nbm9tZS5vcmcvZ2xhZGUtMi4wLmR0ZCI+CisKKzxnbGFkZS1pbnRlcmZhY2U+CisKKzx3aWRnZXQgY2xhc3M9Ikd0a1dpbmRvdyIgaWQ9IndpbmRvdzEiPgorICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkd0ayBLZXJuZWwgQ29uZmlndXJhdG9yPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InR5cGUiPkdUS19XSU5ET1dfVE9QTEVWRUw8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93X3Bvc2l0aW9uIj5HVEtfV0lOX1BPU19OT05FPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1vZGFsIj5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0X3dpZHRoIj42NDA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdF9oZWlnaHQiPjQ4MDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemFibGUiPlRydWU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVzdHJveV93aXRoX3BhcmVudCI+RmFsc2U8L3Byb3BlcnR5PgorICA8c2lnbmFsIG5hbWU9ImRlc3Ryb3kiIGhhbmRsZXI9Im9uX3dpbmRvdzFfZGVzdHJveSIgb2JqZWN0PSJ3aW5kb3cxIi8+CisgIDxzaWduYWwgbmFtZT0ic2l6ZV9yZXF1ZXN0IiBoYW5kbGVyPSJvbl93aW5kb3cxX3NpemVfcmVxdWVzdCIgb2JqZWN0PSJ2cGFuZWQxIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDExIEphbiAyMDAyIDE2OjE3OjExIEdNVCIvPgorICA8c2lnbmFsIG5hbWU9ImRlbGV0ZV9ldmVudCIgaGFuZGxlcj0ib25fd2luZG93MV9kZWxldGVfZXZlbnQiIG9iamVjdD0id2luZG93MSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAwOSBNYXIgMjAwMyAxOTo0Mjo0NiBHTVQiLz4KKworICA8Y2hpbGQ+CisgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9InZib3gxIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjA8L3Byb3BlcnR5PgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrTWVudUJhciIgaWQ9Im1lbnViYXIxIj4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9ImZpbGUxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0ZpbGU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9ImZpbGUxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxvYWQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9Mb2FkPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9sb2FkMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJMIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UyNyI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstb3BlbjwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gLmNvbmZpZzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9TYXZlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zYXZlMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJTIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UyOCI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlX2FzMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gYSBmaWxlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSBfYXM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmVfYXMxX2FjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMjkiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXNhdmUtYXM8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9InNlcGFyYXRvcjEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9InF1aXQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fUXVpdDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fcXVpdDFfYWN0aXZhdGUiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iUSIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMzAiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXF1aXQ8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9Im9wdGlvbnMxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X09wdGlvbnM8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9Im9wdGlvbnMxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfbmFtZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBuYW1lPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfbmFtZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X25hbWUxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfcmFuZ2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgcmFuZ2UgKFkvTS9OKTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX3JhbmdlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfcmFuZ2UxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfZGF0YTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyB2YWx1ZSBvZiB0aGUgb3B0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGF0YTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RhdGExX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJzZXBhcmF0b3IyIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X2FsbF9vcHRpb25zMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IGFsbCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBhbGwgX29wdGlvbnM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19hbGxfb3B0aW9uczFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19kZWJ1Z19pbmZvMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IG1hc2tlZCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGVidWcgaW5mbzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RlYnVnX2luZm8xX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJoZWxwMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9IZWxwPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnUiIGlkPSJoZWxwMV9tZW51Ij4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJpbnRyb2R1Y3Rpb24xIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fSW50cm9kdWN0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9pbnRyb2R1Y3Rpb24xX2FjdGl2YXRlIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDE1IE5vdiAyMDAyIDIwOjI2OjMwIEdNVCIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJJIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UzMSI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstZGlhbG9nLXF1ZXN0aW9uPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImFib3V0MSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0Fib3V0PC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9hYm91dDFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IkEiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTMyIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1wcm9wZXJ0aWVzPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxpY2Vuc2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fTGljZW5zZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fbGljZW5zZTFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMzMiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLWp1c3RpZnktZmlsbDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSGFuZGxlQm94IiBpZD0iaGFuZGxlYm94MSI+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfT1VUPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVfcG9zaXRpb24iPkdUS19QT1NfTEVGVDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic25hcF9lZGdlIj5HVEtfUE9TX1RPUDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVG9vbGJhciIgaWQ9InRvb2xiYXIxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9Im9yaWVudGF0aW9uIj5HVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTDwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xiYXJfc3R5bGUiPkdUS19UT09MQkFSX0JPVEg8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwcyI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkdvZXMgdXAgb2Ygb25lIGxldmVsIChzaW5nbGUgdmlldyk8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkJhY2s8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstdW5kbzwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9iYWNrX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IxIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjIiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+TG9hZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19waXhtYXAiPmd0ay1vcGVuPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9InByZXNzZWQiIGhhbmRsZXI9Im9uX2xvYWRfcHJlc3NlZCIvPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b24zIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIGEgY29uZmlnIGZpbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9zYXZlX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IyIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjQiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNpbmdsZSB2aWV3PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaW5nbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zaW5nbGVfY2xpY2tlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNDoyODozOSBHTVQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iYnV0dG9uIiBpZD0iYnV0dG9uNSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQgdmlldzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zcGxpdF9jbGlja2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE0OjI4OjQ1IEdNVCIvPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b242Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5GdWxsIHZpZXc8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkZ1bGw8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9mdWxsX2NsaWNrZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTQ6Mjg6NTAgR01UIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1ZTZXBhcmF0b3IiIGlkPSJ2c2VwYXJhdG9yMyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b243Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Db2xsYXBzZSB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkNvbGxhcHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9jb2xsYXBzZV9wcmVzc2VkIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjgiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZCB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0icHJlc3NlZCIgaGFuZGxlcj0ib25fZXhwYW5kX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSFBhbmVkIiBpZD0iaHBhbmVkMSI+CisJICA8cHJvcGVydHkgbmFtZT0id2lkdGhfcmVxdWVzdCI+MTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQUxXQVlTPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQUxXQVlTPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfSU48L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcGxhY2VtZW50Ij5HVEtfQ09STkVSX1RPUF9MRUZUPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icnVsZXNfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJyZW9yZGVyYWJsZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImN1cnNvcl9jaGFuZ2VkIiBoYW5kbGVyPSJvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MjIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3MV9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MDM6NTIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MTE6NDQgR01UIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgICA8cGFja2luZz4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5GYWxzZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlBhbmVkIiBpZD0idnBhbmVkMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cyIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FMV0FZUzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FMV0FZUzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX0lOPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0id2luZG93X3BsYWNlbWVudCI+R1RLX0NPUk5FUl9UT1BfTEVGVDwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUcmVlVmlldyIgaWQ9InRyZWV2aWV3MiI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNfZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJ1bGVzX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJlb3JkZXJhYmxlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJjdXJzb3JfY2hhbmdlZCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU3OjU1IEdNVCIvPgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImJ1dHRvbl9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2J1dHRvbl9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1Nzo1OCBHTVQiLz4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MDEgR01UIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzMiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfTkVWRVI8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BTFdBWVM8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19JTjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wbGFjZW1lbnQiPkdUS19DT1JORVJfVE9QX0xFRlQ8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVGV4dFZpZXciIGlkPSJ0ZXh0dmlldzMiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iZWRpdGFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9Imp1c3RpZmljYXRpb24iPkdUS19KVVNUSUZZX0xFRlQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0id3JhcF9tb2RlIj5HVEtfV1JBUF9XT1JEPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvcl92aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InBpeGVsc19hYm92ZV9saW5lcyI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXhlbHNfYmVsb3dfbGluZXMiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icGl4ZWxzX2luc2lkZV93cmFwIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfbWFyZ2luIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X21hcmdpbiI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmRlbnQiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LjwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgICAgPHBhY2tpbmc+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisJPC93aWRnZXQ+CisJPHBhY2tpbmc+CisJICA8cHJvcGVydHkgbmFtZT0icGFkZGluZyI+MDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5UcnVlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorICAgIDwvd2lkZ2V0PgorICA8L2NoaWxkPgorPC93aWRnZXQ+CisKKzwvZ2xhZGUtaW50ZXJmYWNlPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jIGIvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Zjg0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvaW1hZ2VzLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2xvYWRbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYyBjICM4MzgxMDAiLAorImEgYyAjZmZmZjAwIiwKKyJiIGMgI2ZmZmZmZiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uIyMjIy4uLi4jLiIsCisiLi4uLi4uLi4uLi4jLi4uLiMjLiMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uIyMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4jIyMjLiIsCisiLiMjIyMuLi4uLi4uLi4uLiMjIyMjLiIsCisiI2FiYWIjIyMjIyMjIyMjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYmFiYWJhYmEjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYiMjIyMjIyMjIyMjIyMjIyIsCisiI2JhYmFiIyNjY2NjY2NjY2NjY2MjIyIsCisiI2FiYWIjI2NjY2NjY2NjY2NjYyMjLiIsCisiI2JhYiMjY2NjY2NjY2NjY2NjIyMuLiIsCisiI2FiIyNjY2NjY2NjY2NjY2MjIy4uLiIsCisiI2IjI2NjY2NjY2NjY2NjYyMjLi4uLiIsCisiIyMjY2NjY2NjY2NjY2NjIyMuLi4uLiIsCisiIyNjY2NjY2NjY2NjY2MjIy4uLi4uLiIsCisiIyMjIyMjIyMjIyMjIyMjLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NhdmVbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYSBjICM4MzgxMDAiLAorImIgYyAjYzVjMmM1IiwKKyJjIGMgI2NkYjZkNSIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiMjIyMjIyMjIyMjIyMjIyMjIyMjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJjYmIjIyMjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyNhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyMjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLi4jIyMjIyMjIyMjIyMjIyMjIyMuLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2JhY2tbXSA9IHsKKyIyMiAyMiAzIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDA4MyIsCisiYSBjICM4MzgxODMiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uIyMjIyMjYS4uLi4iLAorIi4uIy4uLi4uLiMjIyMjIyMjIyMuLi4iLAorIi4uIyMuLi4jIyMjLi4uLi4uIyNhLi4iLAorIi4uIyMjLiMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMuLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIyMuLi4uLi4uIyNhLi4iLAorIi4uLi4uLi4uLi4uLi4uLmEjIyMuLi4iLAorIi4uLi4uLi4uLi4uLi4uLiMjIy4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV90cmVlX3ZpZXdbXSA9IHsKKyIyMiAyMiAyIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NpbmdsZV92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zcGxpdF92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfbm9bXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3ltYm9sX21vZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgIC4gLiAiLAorIiAuICAgICAuLiAuICIsCisiIC4gLiAgLi4gIC4gIiwKKyIgLiAuLi4uICAgLiAiLAorIiAuICAuLiAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2Nob2ljZV9ub1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgIC4uLi4gICAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgLiAgICAgIC4gICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgIC4gICAgICAuICAiLAorIiAgLi4gICAgLi4gICIsCisiICAgIC4uLi4gICAgIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9jaG9pY2VfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgLi4gICAgLi4gICIsCisiICAuICAgICAgLiAgIiwKKyIgLiAgIC4uICAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgIC4uICAgLiAiLAorIiAgLiAgICAgIC4gICIsCisiICAuLiAgICAuLiAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX21lbnVbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAuLiAgICAgLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4gICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudV9pbnZbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLi4gIC4uLi4uLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAgICAgLi4gIiwKKyIgLi4gICAgICAuLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAuLi4uLi4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudWJhY2tbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gICAgIC4uIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fdm9pZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYyBiL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRjYWFkOAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYwpAQCAtMCwwICsxLDM1IEBACisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQl0eXBlICgqbmFtZSAjIyBfcCkgYXJnCisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorCit2b2lkIGtjb25maWdfbG9hZCh2b2lkKQoreworCXZvaWQgKmhhbmRsZTsKKwljaGFyICplcnJvcjsKKworCWhhbmRsZSA9IGRsb3BlbigiLi9saWJrY29uZmlnLnNvIiwgUlRMRF9MQVpZKTsKKwlpZiAoIWhhbmRsZSkgeworCQloYW5kbGUgPSBkbG9wZW4oIi4vc2NyaXB0cy9rY29uZmlnL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOworCQlpZiAoIWhhbmRsZSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZGxlcnJvcigpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQkJCVwKK3sJCQkJCQlcCisJbmFtZSAjIyBfcCA9IGRsc3ltKGhhbmRsZSwgI25hbWUpOwlcCisgICAgICAgIGlmICgoZXJyb3IgPSBkbGVycm9yKCkpKSAgewkJXAorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGVycm9yKTsJXAorCQlleGl0KDEpOwkJCVwKKwl9CQkJCQlcCit9CisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRkYTExZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkCkBAIC0wLDAgKzEsMzY4OCBAQAorCisjbGluZSAzICJsZXguemNvbmYuYyIKKworI2RlZmluZSAgWVlfSU5UX0FMSUdORUQgc2hvcnQgaW50CisKKy8qIEEgbGV4aWNhbCBzY2FubmVyIGdlbmVyYXRlZCBieSBmbGV4ICovCisKKyNkZWZpbmUgRkxFWF9TQ0FOTkVSCisjZGVmaW5lIFlZX0ZMRVhfTUFKT1JfVkVSU0lPTiAyCisjZGVmaW5lIFlZX0ZMRVhfTUlOT1JfVkVSU0lPTiA1CisjZGVmaW5lIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiAzMQorI2lmIFlZX0ZMRVhfU1VCTUlOT1JfVkVSU0lPTiA+IDAKKyNkZWZpbmUgRkxFWF9CRVRBCisjZW5kaWYKKworLyogRmlyc3QsIHdlIGRlYWwgd2l0aCAgcGxhdGZvcm0tc3BlY2lmaWMgb3IgY29tcGlsZXItc3BlY2lmaWMgaXNzdWVzLiAqLworCisvKiBiZWdpbiBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBlbmQgc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworCisvKiBmbGV4IGludGVnZXIgdHlwZSBkZWZpbml0aW9ucyAqLworCisjaWZuZGVmIEZMRVhJTlRfSAorI2RlZmluZSBGTEVYSU5UX0gKKworLyogQzk5IHN5c3RlbXMgaGF2ZSA8aW50dHlwZXMuaD4uIE5vbi1DOTkgc3lzdGVtcyBtYXkgb3IgbWF5IG5vdC4gKi8KKworI2lmIGRlZmluZWQgX19TVERDX1ZFUlNJT05fXyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgordHlwZWRlZiBpbnQ4X3QgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHVpbnQ4X3QgZmxleF91aW50OF90OwordHlwZWRlZiBpbnQxNl90IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgdWludDE2X3QgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgaW50MzJfdCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQzMl90IGZsZXhfdWludDMyX3Q7CisjZWxzZQordHlwZWRlZiBzaWduZWQgY2hhciBmbGV4X2ludDhfdDsKK3R5cGVkZWYgc2hvcnQgaW50IGZsZXhfaW50MTZfdDsKK3R5cGVkZWYgaW50IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBmbGV4X3VpbnQ4X3Q7IAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgZmxleF91aW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IGZsZXhfdWludDMyX3Q7CisjZW5kaWYgLyogISBDOTkgKi8KKworLyogTGltaXRzIG9mIGludGVncmFsIHR5cGVzLiAqLworI2lmbmRlZiBJTlQ4X01JTgorI2RlZmluZSBJTlQ4X01JTiAgICAgICAgICAgICAgICgtMTI4KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01JTgorI2RlZmluZSBJTlQxNl9NSU4gICAgICAgICAgICAgICgtMzI3NjctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NSU4KKyNkZWZpbmUgSU5UMzJfTUlOICAgICAgICAgICAgICAoLTIxNDc0ODM2NDctMSkKKyNlbmRpZgorI2lmbmRlZiBJTlQ4X01BWAorI2RlZmluZSBJTlQ4X01BWCAgICAgICAgICAgICAgICgxMjcpCisjZW5kaWYKKyNpZm5kZWYgSU5UMTZfTUFYCisjZGVmaW5lIElOVDE2X01BWCAgICAgICAgICAgICAgKDMyNzY3KQorI2VuZGlmCisjaWZuZGVmIElOVDMyX01BWAorI2RlZmluZSBJTlQzMl9NQVggICAgICAgICAgICAgICgyMTQ3NDgzNjQ3KQorI2VuZGlmCisjaWZuZGVmIFVJTlQ4X01BWAorI2RlZmluZSBVSU5UOF9NQVggICAgICAgICAgICAgICgyNTVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQxNl9NQVgKKyNkZWZpbmUgVUlOVDE2X01BWCAgICAgICAgICAgICAoNjU1MzVVKQorI2VuZGlmCisjaWZuZGVmIFVJTlQzMl9NQVgKKyNkZWZpbmUgVUlOVDMyX01BWCAgICAgICAgICAgICAoNDI5NDk2NzI5NVUpCisjZW5kaWYKKworI2VuZGlmIC8qICEgRkxFWElOVF9IICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisvKiBUaGUgImNvbnN0IiBzdG9yYWdlLWNsYXNzLW1vZGlmaWVyIGlzIHZhbGlkLiAqLworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2Vsc2UJLyogISBfX2NwbHVzcGx1cyAqLworCisjaWYgX19TVERDX18KKworI2RlZmluZSBZWV9VU0VfQ09OU1QKKworI2VuZGlmCS8qIF9fU1REQ19fICovCisjZW5kaWYJLyogISBfX2NwbHVzcGx1cyAqLworCisjaWZkZWYgWVlfVVNFX0NPTlNUCisjZGVmaW5lIHl5Y29uc3QgY29uc3QKKyNlbHNlCisjZGVmaW5lIHl5Y29uc3QKKyNlbmRpZgorCisvKiBSZXR1cm5lZCB1cG9uIGVuZC1vZi1maWxlLiAqLworI2RlZmluZSBZWV9OVUxMIDAKKworLyogUHJvbW90ZXMgYSBwb3NzaWJseSBuZWdhdGl2ZSwgcG9zc2libHkgc2lnbmVkIGNoYXIgdG8gYW4gdW5zaWduZWQKKyAqIGludGVnZXIgZm9yIHVzZSBhcyBhbiBhcnJheSBpbmRleC4gIElmIHRoZSBzaWduZWQgY2hhciBpcyBuZWdhdGl2ZSwKKyAqIHdlIHdhbnQgdG8gaW5zdGVhZCB0cmVhdCBpdCBhcyBhbiA4LWJpdCB1bnNpZ25lZCBjaGFyLCBoZW5jZSB0aGUKKyAqIGRvdWJsZSBjYXN0LgorICovCisjZGVmaW5lIFlZX1NDX1RPX1VJKGMpICgodW5zaWduZWQgaW50KSAodW5zaWduZWQgY2hhcikgYykKKworLyogRW50ZXIgYSBzdGFydCBjb25kaXRpb24uICBUaGlzIG1hY3JvIHJlYWxseSBvdWdodCB0byB0YWtlIGEgcGFyYW1ldGVyLAorICogYnV0IHdlIGRvIGl0IHRoZSBkaXNndXN0aW5nIGNydWZ0eSB3YXkgZm9yY2VkIG9uIHVzIGJ5IHRoZSAoKS1sZXNzCisgKiBkZWZpbml0aW9uIG9mIEJFR0lOLgorICovCisjZGVmaW5lIEJFR0lOICh5eV9zdGFydCkgPSAxICsgMiAqCisKKy8qIFRyYW5zbGF0ZSB0aGUgY3VycmVudCBzdGFydCBzdGF0ZSBpbnRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgbGF0ZXIgaGFuZGVkCisgKiB0byBCRUdJTiB0byByZXR1cm4gdG8gdGhlIHN0YXRlLiAgVGhlIFlZU1RBVEUgYWxpYXMgaXMgZm9yIGxleAorICogY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBZWV9TVEFSVCAoKCh5eV9zdGFydCkgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgemNvbmZyZXN0YXJ0KHpjb25maW4gICkKKworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAorCisvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLworI2lmbmRlZiBZWV9CVUZfU0laRQorI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAorI2VuZGlmCisKKyNpZm5kZWYgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKKyNkZWZpbmUgWVlfVFlQRURFRl9ZWV9CVUZGRVJfU1RBVEUKK3R5cGVkZWYgc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSAqWVlfQlVGRkVSX1NUQVRFOworI2VuZGlmCisKK2V4dGVybiBpbnQgemNvbmZsZW5nOworCitleHRlcm4gRklMRSAqemNvbmZpbiwgKnpjb25mb3V0OworCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisgICAgI2RlZmluZSBZWV9MRVNTX0xJTkVOTyhuKQorICAgIAorLyogUmV0dXJuIGFsbCBidXQgdGhlIGZpcnN0ICJuIiBtYXRjaGVkIGNoYXJhY3RlcnMgYmFjayB0byB0aGUgaW5wdXQgc3RyZWFtLiAqLworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQgXAorCQkoeXlfY19idWZfcCkgPSB5eV9jcCA9IHl5X2JwICsgeXlsZXNzX21hY3JvX2FyZyAtIFlZX01PUkVfQURKOyBcCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8gXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisjZGVmaW5lIHVucHV0KGMpIHl5dW5wdXQoIGMsICh5eXRleHRfcHRyKSAgKQorCisvKiBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgY2Fubm90IHBvcnRhYmx5IGdldCBvdXIgaGFuZHMgb24gc2l6ZV90CisgKiAod2l0aG91dCBhdXRvY29uZidzIGhlbHAsIHdoaWNoIGlzbid0IGF2YWlsYWJsZSBiZWNhdXNlIHdlIHdhbnQKKyAqIGZsZXgtZ2VuZXJhdGVkIHNjYW5uZXJzIHRvIGNvbXBpbGUgb24gdGhlaXIgb3duKS4KKyAqLworCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfU0laRV9UCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfU0laRV9UCit0eXBlZGVmIHVuc2lnbmVkIGludCB5eV9zaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKK3N0cnVjdCB5eV9idWZmZXJfc3RhdGUKKwl7CisJRklMRSAqeXlfaW5wdXRfZmlsZTsKKworCWNoYXIgKnl5X2NoX2J1ZjsJCS8qIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKnl5X2J1Zl9wb3M7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ1ZmZlciAqLworCisJLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgcm9vbSBmb3IgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwl5eV9zaXplX3QgeXlfYnVmX3NpemU7CisKKwkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmLCBub3QgaW5jbHVkaW5nIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJaW50IHl5X25fY2hhcnM7CisKKwkvKiBXaGV0aGVyIHdlICJvd24iIHRoZSBidWZmZXIgLSBpLmUuLCB3ZSBrbm93IHdlIGNyZWF0ZWQgaXQsCisJICogYW5kIGNhbiByZWFsbG9jKCkgaXQgdG8gZ3JvdyBpdCwgYW5kIHNob3VsZCBmcmVlKCkgaXQgdG8KKwkgKiBkZWxldGUgaXQuCisJICovCisJaW50IHl5X2lzX291cl9idWZmZXI7CisKKwkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gImludGVyYWN0aXZlIiBpbnB1dCBzb3VyY2U7IGlmIHNvLCBhbmQKKwkgKiBpZiB3ZSdyZSB1c2luZyBzdGRpbyBmb3IgaW5wdXQsIHRoZW4gd2Ugd2FudCB0byB1c2UgZ2V0YygpCisJICogaW5zdGVhZCBvZiBmcmVhZCgpLCB0byBtYWtlIHN1cmUgd2Ugc3RvcCBmZXRjaGluZyBpbnB1dCBhZnRlcgorCSAqIGVhY2ggbmV3bGluZS4KKwkgKi8KKwlpbnQgeXlfaXNfaW50ZXJhY3RpdmU7CisKKwkvKiBXaGV0aGVyIHdlJ3JlIGNvbnNpZGVyZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCisJICogSWYgc28sICdeJyBydWxlcyB3aWxsIGJlIGFjdGl2ZSBvbiB0aGUgbmV4dCBtYXRjaCwgb3RoZXJ3aXNlCisJICogbm90LgorCSAqLworCWludCB5eV9hdF9ib2w7CisKKyAgICBpbnQgeXlfYnNfbGluZW5vOyAvKio8IFRoZSBsaW5lIGNvdW50LiAqLworICAgIGludCB5eV9ic19jb2x1bW47IC8qKjwgVGhlIGNvbHVtbiBjb3VudC4gKi8KKyAgICAKKwkvKiBXaGV0aGVyIHRvIHRyeSB0byBmaWxsIHRoZSBpbnB1dCBidWZmZXIgd2hlbiB3ZSByZWFjaCB0aGUKKwkgKiBlbmQgb2YgaXQuCisJICovCisJaW50IHl5X2ZpbGxfYnVmZmVyOworCisJaW50IHl5X2J1ZmZlcl9zdGF0dXM7CisKKyNkZWZpbmUgWVlfQlVGRkVSX05FVyAwCisjZGVmaW5lIFlZX0JVRkZFUl9OT1JNQUwgMQorCS8qIFdoZW4gYW4gRU9GJ3MgYmVlbiBzZWVuIGJ1dCB0aGVyZSdzIHN0aWxsIHNvbWUgdGV4dCB0byBwcm9jZXNzCisJICogdGhlbiB3ZSBtYXJrIHRoZSBidWZmZXIgYXMgWVlfRU9GX1BFTkRJTkcsIHRvIGluZGljYXRlIHRoYXQgd2UKKwkgKiBzaG91bGRuJ3QgdHJ5IHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc291cmNlIGFueSBtb3JlLiAgV2UgbWlnaHQKKwkgKiBzdGlsbCBoYXZlIGEgYnVuY2ggb2YgdG9rZW5zIHRvIG1hdGNoLCB0aG91Z2gsIGJlY2F1c2Ugb2YKKwkgKiBwb3NzaWJsZSBiYWNraW5nLXVwLgorCSAqCisJICogV2hlbiB3ZSBhY3R1YWxseSBzZWUgdGhlIEVPRiwgd2UgY2hhbmdlIHRoZSBzdGF0dXMgdG8gIm5ldyIKKwkgKiAodmlhIHpjb25mcmVzdGFydCgpKSwgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udGludWUgc2Nhbm5pbmcgYnkKKwkgKiBqdXN0IHBvaW50aW5nIHpjb25maW4gYXQgYSBuZXcgaW5wdXQgZmlsZS4KKwkgKi8KKyNkZWZpbmUgWVlfQlVGRkVSX0VPRl9QRU5ESU5HIDIKKworCX07CisjZW5kaWYgLyogIVlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUgKi8KKworLyogU3RhY2sgb2YgaW5wdXQgYnVmZmVycy4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX3RvcCA9IDA7IC8qKjwgaW5kZXggb2YgdG9wIG9mIHN0YWNrLiAqLworc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfbWF4ID0gMDsgLyoqPCBjYXBhY2l0eSBvZiBzdGFjay4gKi8KK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgKiB5eV9idWZmZXJfc3RhY2sgPSAwOyAvKio8IFN0YWNrIGFzIGFuIGFycmF5LiAqLworCisvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKKyAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAorICogInNjYW5uZXIgc3RhdGUiLgorICoKKyAqIFJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9yIE5VTEwuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVIgKCAoeXlfYnVmZmVyX3N0YWNrKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCkKKworLyogU2FtZSBhcyBwcmV2aW91cyBtYWNybywgYnV0IHVzZWZ1bCB3aGVuIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIHN0YWNrIGlzIG5vdAorICogTlVMTCBvciB3aGVuIHdlIG5lZWQgYW4gbHZhbHVlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisgKi8KKyNkZWZpbmUgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0KKworLyogeXlfaG9sZF9jaGFyIGhvbGRzIHRoZSBjaGFyYWN0ZXIgbG9zdCB3aGVuIHpjb25mdGV4dCBpcyBmb3JtZWQuICovCitzdGF0aWMgY2hhciB5eV9ob2xkX2NoYXI7CitzdGF0aWMgaW50IHl5X25fY2hhcnM7CQkvKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmICovCitpbnQgemNvbmZsZW5nOworCisvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworc3RhdGljIGludCB5eV9pbml0ID0gMTsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X3N0YXJ0ID0gMDsJLyogc3RhcnQgc3RhdGUgbnVtYmVyICovCisKKy8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyB6Y29uZndyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcworICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggemNvbmZpbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KKyAqLworc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisKK3ZvaWQgemNvbmZyZXN0YXJ0IChGSUxFICppbnB1dF9maWxlICApOwordm9pZCB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9jcmVhdGVfYnVmZmVyIChGSUxFICpmaWxlLGludCBzaXplICApOwordm9pZCB6Y29uZl9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgemNvbmZfZmx1c2hfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYiAgKTsKK3ZvaWQgemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7Cit2b2lkIHpjb25mcG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworCitzdGF0aWMgdm9pZCB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlICh2b2lkICk7CitzdGF0aWMgdm9pZCB6Y29uZl9pbml0X2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIsRklMRSAqZmlsZSAgKTsKKworI2RlZmluZSBZWV9GTFVTSF9CVUZGRVIgemNvbmZfZmx1c2hfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICkKKworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnVmZmVyIChjaGFyICpiYXNlLHl5X3NpemVfdCBzaXplICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKnl5X3N0ciAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J5dGVzICh5eWNvbnN0IGNoYXIgKmJ5dGVzLGludCBsZW4gICk7CisKK3ZvaWQgKnpjb25mYWxsb2MgKHl5X3NpemVfdCAgKTsKK3ZvaWQgKnpjb25mcmVhbGxvYyAodm9pZCAqLHl5X3NpemVfdCAgKTsKK3ZvaWQgemNvbmZmcmVlICh2b2lkICogICk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciB6Y29uZl9jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7IFwKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pc19pbnRlcmFjdGl2ZSA9IGlzX2ludGVyYWN0aXZlOyBcCisJfQorCisjZGVmaW5lIHl5X3NldF9ib2woYXRfYm9sKSBcCisJeyBcCisJaWYgKCAhIFlZX0NVUlJFTlRfQlVGRkVSICl7XAorICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7IFwKKwl9IFwKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCA9IGF0X2JvbDsgXAorCX0KKworI2RlZmluZSBZWV9BVF9CT0woKSAoWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wpCisKKy8qIEJlZ2luIHVzZXIgc2VjdDMgKi8KKworI2RlZmluZSB6Y29uZndyYXAobikgMQorI2RlZmluZSBZWV9TS0lQX1lZV1JBUAorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKKworRklMRSAqemNvbmZpbiA9IChGSUxFICopIDAsICp6Y29uZm91dCA9IChGSUxFICopIDA7CisKK3R5cGVkZWYgaW50IHl5X3N0YXRlX3R5cGU7CisKK2V4dGVybiBpbnQgemNvbmZsaW5lbm87CisKK2ludCB6Y29uZmxpbmVubyA9IDE7CisKK2V4dGVybiBjaGFyICp6Y29uZnRleHQ7CisjZGVmaW5lIHl5dGV4dF9wdHIgemNvbmZ0ZXh0CitzdGF0aWMgeXljb25zdCBmbGV4X2ludDE2X3QgeXlfbnh0W11bMzhdID0KKyAgICB7CisgICAgeworICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxMiwgICAxMiwgICAxNSwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsCisKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwKKyAgICAgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCisgICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTgsICAgMTgsICAgMTksICAgMjAsCisgICAgICAgMjEsICAgMjIsICAgMTgsICAgMTgsICAgMjMsICAgMjQsICAgMTgsICAgMjUsICAgMTgsICAgMjYsCisgICAgICAgMjcsICAgMTgsICAgMjgsICAgMjksICAgMzAsICAgMTgsICAgMTgsICAgMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAorICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE4LCAgIDE5LCAgIDIwLAorICAgICAgIDIxLCAgIDIyLCAgIDE4LCAgIDE4LCAgIDIzLCAgIDI0LCAgIDE4LCAgIDI1LCAgIDE4LCAgIDI2LAorICAgICAgIDI3LCAgIDE4LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDE4LCAgIDE4LCAgIDE2CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLAorICAgICAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLAorICAgICAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLAorICAgICAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxLCAgIDMxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAzMSwgICAzMiwgICAzMywgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMzQsICAgMzQsICAgMzUsICAgMzQsICAgMzYsICAgMzQsICAgMzQsICAgMzYsICAgMzQsCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzcsICAgMzQsICAgMzQsICAgMzQsICAgMzQsCisKKyAgICAgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwKKyAgICAgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNCwgICAzNAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMzQsICAgMzQsICAgMzUsICAgMzQsICAgMzYsICAgMzQsICAgMzQsICAgMzYsICAgMzQsCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzcsICAgMzQsICAgMzQsICAgMzQsICAgMzQsCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDM4LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQxLCAgIDQ0LAorICAgICAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LAorICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUwLCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUxLAorICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUyCisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDM4LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQxLCAgIDQ0LAorICAgICAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LAorICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUwLCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUxLAorICAgICAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDQ3LCAgIDUyCisgICAgfSwKKworICAgIHsKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisKKyAgICAgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwKKyAgICAgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMiwgIC0xMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTMsICAgNTMsICAgNTQsICAtMTMsICAtMTMsICAgNTUsICAtMTMsICAtMTMsICAtMTMsCisgICAgICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsCisgICAgICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsCisgICAgICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMsICAtMTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LAorICAgICAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LAorICAgICAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LAorICAgICAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0LCAgLTE0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU2LCAgIDU2LCAgIDU3LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwKKyAgICAgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwKKyAgICAgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwKKyAgICAgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNiwgIC0xNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsCisgICAgICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsCisKKyAgICAgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywKKyAgICAgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNywgIC0xNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsICAtMTgsCisgICAgICAtMTgsICAtMTgsICAtMTgsICAgNTgsICAtMTgsICAtMTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LCAgLTE5LAorICAgICAgLTE5LCAgLTE5LCAgLTE5LCAgIDU4LCAgLTE5LCAgLTE5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU5LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTE5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLCAgLTIwLAorICAgICAgLTIwLCAgLTIwLCAgLTIwLCAgIDU4LCAgLTIwLCAgLTIwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDYwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDYxLAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTIwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwgIC0yMSwKKyAgICAgIC0yMSwgIC0yMSwgIC0yMSwgICA1OCwgIC0yMSwgIC0yMSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA2MiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjIsICAtMjIsICAtMjIsICAtMjIsICAtMjIsICAtMjIsICAtMjIsICAtMjIsICAtMjIsCisgICAgICAtMjIsICAtMjIsICAtMjIsICAgNTgsICAtMjIsICAtMjIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA2MywgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsCisgICAgICAtMjMsICAtMjMsICAtMjMsICAgNTgsICAtMjMsICAtMjMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNjQsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LAorICAgICAgLTI0LCAgLTI0LCAgLTI0LCAgIDU4LCAgLTI0LCAgLTI0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDY1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDY2LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTI0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LCAgLTI1LAorICAgICAgLTI1LCAgLTI1LCAgLTI1LCAgIDU4LCAgLTI1LCAgLTI1LCAgIDU4LCAgIDY3LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDY4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTI1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwKKyAgICAgIC0yNiwgIC0yNiwgIC0yNiwgICA1OCwgIC0yNiwgIC0yNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA2OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsCisgICAgICAtMjcsICAtMjcsICAtMjcsICAgNTgsICAtMjcsICAtMjcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA3MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsICAtMjgsCisgICAgICAtMjgsICAtMjgsICAtMjgsICAgNTgsICAtMjgsICAtMjgsICAgNTgsICAgNzEsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNzIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LCAgLTI5LAorICAgICAgLTI5LCAgLTI5LCAgLTI5LCAgIDU4LCAgLTI5LCAgLTI5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDczLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDc0LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDc1LCAgIDU4LCAgIDU4LCAgLTI5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLCAgLTMwLAorICAgICAgLTMwLCAgLTMwLCAgLTMwLCAgIDU4LCAgLTMwLCAgLTMwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDc2LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTMwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA3NywgICA3NywgIC0zMSwgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywKKyAgICAgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywKKyAgICAgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywKKyAgICAgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzIsICAgNzgsICAgNzksICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsCisgICAgICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsCisKKyAgICAgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwKKyAgICAgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMiwgIC0zMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgODAsICAtMzMsICAtMzMsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsCisgICAgICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsCisgICAgICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsCisgICAgICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDgxLCAgIDgxLCAgIDgyLCAgIDgxLCAgLTM0LCAgIDgxLCAgIDgxLCAgLTM0LCAgIDgxLAorICAgICAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgLTM0LCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLAorICAgICAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLAorICAgICAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxLCAgIDgxCisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LAorICAgICAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LAorICAgICAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LAorICAgICAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1LCAgLTM1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwKKyAgICAgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwKKyAgICAgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwKKyAgICAgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNiwgIC0zNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgODMsICAgODMsICAgODQsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsCisgICAgICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsCisKKyAgICAgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywKKyAgICAgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MywgICA4MworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgIDg1LCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwKKyAgICAgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwKKyAgICAgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwKKyAgICAgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MSwgIC00MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgODYsICAgODYsICAtNDIsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisKKyAgICAgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwKKyAgICAgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAgODcsICAtNDMsICAtNDMsCisgICAgICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsCisgICAgICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsCisgICAgICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMsICAtNDMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LAorICAgICAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LAorICAgICAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LAorICAgICAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0LCAgLTQ0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LAorICAgICAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LAorICAgICAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LAorICAgICAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1LCAgLTQ1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwgIC00NiwKKyAgICAgIC00NiwgICA4OCwgICA4OSwgICA4OSwgIC00NiwgIC00NiwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC00NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDcsICAtNDcsICAtNDcsICAtNDcsICAtNDcsICAtNDcsICAtNDcsICAtNDcsICAtNDcsCisgICAgICAtNDcsICAgODksICAgODksICAgODksICAtNDcsICAtNDcsICAgODksICAgODksICAgODksICAgODksCisKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC00NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsCisgICAgICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsCisgICAgICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsCisgICAgICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgsICAtNDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ5LCAgLTQ5LCAgIDkwLCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LAorICAgICAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LAorICAgICAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LAorICAgICAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5LCAgLTQ5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLCAgLTUwLAorICAgICAgLTUwLCAgIDg5LCAgIDg5LCAgIDg5LCAgLTUwLCAgLTUwLCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDkxLCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgLTUwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwgIC01MSwKKyAgICAgIC01MSwgICA4OSwgICA4OSwgICA4OSwgIC01MSwgIC01MSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA5MiwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC01MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsCisgICAgICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsCisKKyAgICAgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwKKyAgICAgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgICA5MworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTMsICAgNTMsICAgNTQsICAtNTMsICAtNTMsICAgNTUsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LAorICAgICAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LAorICAgICAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LAorICAgICAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0LCAgLTU0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU2LCAgIDU2LCAgIDU3LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2LCAgIDU2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NiwgICA1NiwgICA1NywgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisgICAgICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisKKyAgICAgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywKKyAgICAgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NywgIC01NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsICAtNTgsCisgICAgICAtNTgsICAtNTgsICAtNTgsICAgNTgsICAtNTgsICAtNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LCAgLTU5LAorICAgICAgLTU5LCAgLTU5LCAgLTU5LCAgIDU4LCAgLTU5LCAgLTU5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDk0LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTU5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLCAgLTYwLAorICAgICAgLTYwLCAgLTYwLCAgLTYwLCAgIDU4LCAgLTYwLCAgLTYwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDk1LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTYwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwgIC02MSwKKyAgICAgIC02MSwgIC02MSwgIC02MSwgICA1OCwgIC02MSwgIC02MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA5NiwgICA5NywgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC02MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjIsICAtNjIsICAtNjIsICAtNjIsICAtNjIsICAtNjIsICAtNjIsICAtNjIsICAtNjIsCisgICAgICAtNjIsICAtNjIsICAtNjIsICAgNTgsICAtNjIsICAtNjIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA5OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA5OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC02MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjMsICAtNjMsICAtNjMsICAtNjMsICAtNjMsICAtNjMsICAtNjMsICAtNjMsICAtNjMsCisgICAgICAtNjMsICAtNjMsICAtNjMsICAgNTgsICAtNjMsICAtNjMsICAgNTgsICAxMDAsICAgNTgsICAgNTgsCisgICAgICAxMDEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LCAgLTY0LAorICAgICAgLTY0LCAgLTY0LCAgLTY0LCAgIDU4LCAgLTY0LCAgLTY0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTAyLCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTAzLCAgLTY0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LCAgLTY1LAorICAgICAgLTY1LCAgLTY1LCAgLTY1LCAgIDU4LCAgLTY1LCAgLTY1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTY1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02NiwgIC02NiwgIC02NiwgIC02NiwgIC02NiwgIC02NiwgIC02NiwgIC02NiwgIC02NiwKKyAgICAgIC02NiwgIC02NiwgIC02NiwgICA1OCwgIC02NiwgIC02NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwNCwgICA1OCwgICA1OCwgIC02NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjcsICAtNjcsICAtNjcsICAtNjcsICAtNjcsICAtNjcsICAtNjcsICAtNjcsICAtNjcsCisgICAgICAtNjcsICAtNjcsICAtNjcsICAgNTgsICAtNjcsICAtNjcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwNSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC02NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjgsICAtNjgsICAtNjgsICAtNjgsICAtNjgsICAtNjgsICAtNjgsICAtNjgsICAtNjgsCisgICAgICAtNjgsICAtNjgsICAtNjgsICAgNTgsICAtNjgsICAtNjgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMDYsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNjgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LCAgLTY5LAorICAgICAgLTY5LCAgLTY5LCAgLTY5LCAgIDU4LCAgLTY5LCAgLTY5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTA3LCAgIDU4LCAgIDU4LCAgLTY5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLCAgLTcwLAorICAgICAgLTcwLCAgLTcwLCAgLTcwLCAgIDU4LCAgLTcwLCAgLTcwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTA4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTcwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwgIC03MSwKKyAgICAgIC03MSwgIC03MSwgIC03MSwgICA1OCwgIC03MSwgIC03MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwOSwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC03MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNzIsICAtNzIsICAtNzIsICAtNzIsICAtNzIsICAtNzIsICAtNzIsICAtNzIsICAtNzIsCisgICAgICAtNzIsICAtNzIsICAtNzIsICAgNTgsICAtNzIsICAtNzIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDExMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC03MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNzMsICAtNzMsICAtNzMsICAtNzMsICAtNzMsICAtNzMsICAtNzMsICAtNzMsICAtNzMsCisgICAgICAtNzMsICAtNzMsICAtNzMsICAgNTgsICAtNzMsICAtNzMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMTEsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNzMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LCAgLTc0LAorICAgICAgLTc0LCAgLTc0LCAgLTc0LCAgIDU4LCAgLTc0LCAgLTc0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTEyLCAgIDU4LCAgLTc0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LCAgLTc1LAorICAgICAgLTc1LCAgLTc1LCAgLTc1LCAgIDU4LCAgLTc1LCAgLTc1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgMTEzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTc1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC03NiwgIC03NiwgIC03NiwgIC03NiwgIC03NiwgIC03NiwgIC03NiwgIC03NiwgIC03NiwKKyAgICAgIC03NiwgIC03NiwgIC03NiwgICA1OCwgIC03NiwgIC03NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDExNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC03NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNzcsICAgNzcsICAtNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisKKyAgICAgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywKKyAgICAgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NywgICA3NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNzgsICAgNzgsICAgNzksICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsCisgICAgICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsCisgICAgICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsCisgICAgICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgsICAtNzgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDgwLCAgLTc5LCAgLTc5LCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwCisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLAorICAgICAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLAorICAgICAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLAorICAgICAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwLCAgLTgwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA4MSwgICA4MSwgICA4MiwgICA4MSwgIC04MSwgICA4MSwgICA4MSwgIC04MSwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgIC04MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsCisgICAgICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsCisKKyAgICAgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwKKyAgICAgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MiwgIC04MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtODMsICAtODMsICAgODQsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsCisgICAgICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsCisgICAgICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsCisgICAgICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMsICAtODMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LAorICAgICAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LAorICAgICAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LAorICAgICAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0LCAgLTg0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LAorICAgICAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LAorICAgICAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LAorICAgICAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1LCAgLTg1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA4NiwgICA4NiwgIC04NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwKKyAgICAgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwKKyAgICAgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwKKyAgICAgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NiwgICA4NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsCisgICAgICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsCisKKyAgICAgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywKKyAgICAgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NywgIC04NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtODgsICAtODgsICAtODgsICAtODgsICAtODgsICAtODgsICAtODgsICAtODgsICAtODgsCisgICAgICAtODgsICAxMTUsICAgODksICAgODksICAtODgsICAtODgsICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtODgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LCAgLTg5LAorICAgICAgLTg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgLTg5LCAgLTg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgLTg5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLAorICAgICAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLAorICAgICAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLAorICAgICAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwLCAgLTkwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwgIC05MSwKKyAgICAgIC05MSwgICA4OSwgICA4OSwgICA4OSwgIC05MSwgIC05MSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC05MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTIsICAtOTIsICAtOTIsICAtOTIsICAtOTIsICAtOTIsICAtOTIsICAtOTIsICAtOTIsCisgICAgICAtOTIsICAgODksICAgODksICAgODksICAtOTIsICAtOTIsICAgODksICAgODksICAgODksICAgODksCisKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC05MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsCisgICAgICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsCisgICAgICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsCisgICAgICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMsICAtOTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LCAgLTk0LAorICAgICAgLTk0LCAgLTk0LCAgLTk0LCAgIDU4LCAgLTk0LCAgLTk0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTE2LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTk0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LCAgLTk1LAorICAgICAgLTk1LCAgLTk1LCAgLTk1LCAgIDU4LCAgLTk1LCAgLTk1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTE3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTk1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05NiwgIC05NiwgIC05NiwgIC05NiwgIC05NiwgIC05NiwgIC05NiwgIC05NiwgIC05NiwKKyAgICAgIC05NiwgIC05NiwgIC05NiwgICA1OCwgIC05NiwgIC05NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDExOCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC05NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTcsICAtOTcsICAtOTcsICAtOTcsICAtOTcsICAtOTcsICAtOTcsICAtOTcsICAtOTcsCisgICAgICAtOTcsICAtOTcsICAtOTcsICAgNTgsICAtOTcsICAtOTcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgIDExOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC05NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTgsICAtOTgsICAtOTgsICAtOTgsICAtOTgsICAtOTgsICAtOTgsICAtOTgsICAtOTgsCisgICAgICAtOTgsICAtOTgsICAtOTgsICAgNTgsICAtOTgsICAtOTgsICAxMjAsICAxMjEsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtOTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LCAgLTk5LAorICAgICAgLTk5LCAgLTk5LCAgLTk5LCAgIDU4LCAgLTk5LCAgLTk5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMTIyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTk5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLCAtMTAwLAorICAgICAtMTAwLCAtMTAwLCAtMTAwLCAgIDU4LCAtMTAwLCAtMTAwLCAgIDU4LCAgIDU4LCAgMTIzLCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTAwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwgLTEwMSwKKyAgICAgLTEwMSwgLTEwMSwgLTEwMSwgICA1OCwgLTEwMSwgLTEwMSwgICA1OCwgICA1OCwgICA1OCwgIDEyNCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEyNSwgICA1OCwgIDEyNiwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsIC0xMDIsCisgICAgIC0xMDIsIC0xMDIsIC0xMDIsICAgNTgsIC0xMDIsIC0xMDIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgIDEyNywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsIC0xMDMsCisgICAgIC0xMDMsIC0xMDMsIC0xMDMsICAgNTgsIC0xMDMsIC0xMDMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMDMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LCAtMTA0LAorICAgICAtMTA0LCAtMTA0LCAtMTA0LCAgIDU4LCAtMTA0LCAtMTA0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTA0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LCAtMTA1LAorICAgICAtMTA1LCAtMTA1LCAtMTA1LCAgIDU4LCAtMTA1LCAtMTA1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTI4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTA1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwgLTEwNiwKKyAgICAgLTEwNiwgLTEwNiwgLTEwNiwgICA1OCwgLTEwNiwgLTEwNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEyOSwgICA1OCwgLTEwNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsIC0xMDcsCisgICAgIC0xMDcsIC0xMDcsIC0xMDcsICAgNTgsIC0xMDcsIC0xMDcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEzMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsIC0xMDgsCisgICAgIC0xMDgsIC0xMDgsIC0xMDgsICAgNTgsIC0xMDgsIC0xMDgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMzEsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LCAtMTA5LAorICAgICAtMTA5LCAtMTA5LCAtMTA5LCAgIDU4LCAtMTA5LCAtMTA5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgMTMyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTA5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLCAtMTEwLAorICAgICAtMTEwLCAtMTEwLCAtMTEwLCAgIDU4LCAtMTEwLCAtMTEwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTMzLCAgIDU4LCAtMTEwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwgLTExMSwKKyAgICAgLTExMSwgLTExMSwgLTExMSwgICA1OCwgLTExMSwgLTExMSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDEzNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTExMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsIC0xMTIsCisgICAgIC0xMTIsIC0xMTIsIC0xMTIsICAgNTgsIC0xMTIsIC0xMTIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgIDEzNSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTExMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsIC0xMTMsCisgICAgIC0xMTMsIC0xMTMsIC0xMTMsICAgNTgsIC0xMTMsIC0xMTMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMzYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LCAtMTE0LAorICAgICAtMTE0LCAtMTE0LCAtMTE0LCAgIDU4LCAtMTE0LCAtMTE0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgMTM3LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTE0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LCAtMTE1LAorICAgICAtMTE1LCAgIDg5LCAgIDg5LCAgIDg5LCAtMTE1LCAtMTE1LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAtMTE1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExNiwgLTExNiwgLTExNiwgLTExNiwgLTExNiwgLTExNiwgLTExNiwgLTExNiwgLTExNiwKKyAgICAgLTExNiwgLTExNiwgLTExNiwgICA1OCwgLTExNiwgLTExNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDEzOCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTExNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsIC0xMTcsCisgICAgIC0xMTcsIC0xMTcsIC0xMTcsICAgNTgsIC0xMTcsIC0xMTcsICAgNTgsICAgNTgsICAgNTgsICAxMzksCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTExNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsIC0xMTgsCisgICAgIC0xMTgsIC0xMTgsIC0xMTgsICAgNTgsIC0xMTgsIC0xMTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxNDAsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LCAtMTE5LAorICAgICAtMTE5LCAtMTE5LCAtMTE5LCAgIDU4LCAtMTE5LCAtMTE5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTQxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTE5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLCAtMTIwLAorICAgICAtMTIwLCAtMTIwLCAtMTIwLCAgIDU4LCAtMTIwLCAtMTIwLCAgIDU4LCAgIDU4LCAgMTQyLCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTQzLCAgIDU4LCAgIDU4LCAtMTIwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwgLTEyMSwKKyAgICAgLTEyMSwgLTEyMSwgLTEyMSwgICA1OCwgLTEyMSwgLTEyMSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE0NCwgICA1OCwgLTEyMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsIC0xMjIsCisgICAgIC0xMjIsIC0xMjIsIC0xMjIsICAgNTgsIC0xMjIsIC0xMjIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE0NSwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsIC0xMjMsCisgICAgIC0xMjMsIC0xMjMsIC0xMjMsICAgNTgsIC0xMjMsIC0xMjMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNDYsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LCAtMTI0LAorICAgICAtMTI0LCAtMTI0LCAtMTI0LCAgIDU4LCAtMTI0LCAtMTI0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTQ3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTI0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LCAtMTI1LAorICAgICAtMTI1LCAtMTI1LCAtMTI1LCAgIDU4LCAtMTI1LCAtMTI1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgMTQ4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTI1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNiwKKyAgICAgLTEyNiwgLTEyNiwgLTEyNiwgICA1OCwgLTEyNiwgLTEyNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDE0OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjcsCisgICAgIC0xMjcsIC0xMjcsIC0xMjcsICAgNTgsIC0xMjcsIC0xMjcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCisgICAgIC0xMjgsIC0xMjgsIC0xMjgsICAgNTgsIC0xMjgsIC0xMjgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNTAsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMjgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LCAtMTI5LAorICAgICAtMTI5LCAtMTI5LCAtMTI5LCAgIDU4LCAtMTI5LCAtMTI5LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTUxLAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTI5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLCAtMTMwLAorICAgICAtMTMwLCAtMTMwLCAtMTMwLCAgIDU4LCAtMTMwLCAtMTMwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTUyLAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTMwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwgLTEzMSwKKyAgICAgLTEzMSwgLTEzMSwgLTEzMSwgICA1OCwgLTEzMSwgLTEzMSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgIDE1MywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsIC0xMzIsCisgICAgIC0xMzIsIC0xMzIsIC0xMzIsICAgNTgsIC0xMzIsIC0xMzIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgIDE1NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsIC0xMzMsCisgICAgIC0xMzMsIC0xMzMsIC0xMzMsICAgNTgsIC0xMzMsIC0xMzMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNTUsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMzMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LCAtMTM0LAorICAgICAtMTM0LCAtMTM0LCAtMTM0LCAgIDU4LCAtMTM0LCAtMTM0LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTU2LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTM0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LCAtMTM1LAorICAgICAtMTM1LCAtMTM1LCAtMTM1LCAgIDU4LCAtMTM1LCAtMTM1LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTU3LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTM1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwgLTEzNiwKKyAgICAgLTEzNiwgLTEzNiwgLTEzNiwgICA1OCwgLTEzNiwgLTEzNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsIC0xMzcsCisgICAgIC0xMzcsIC0xMzcsIC0xMzcsICAgNTgsIC0xMzcsIC0xMzcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE1OSwgICA1OCwgICA1OCwgLTEzNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsIC0xMzgsCisgICAgIC0xMzgsIC0xMzgsIC0xMzgsICAgNTgsIC0xMzgsIC0xMzgsICAgNTgsICAxNjAsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMzgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LCAtMTM5LAorICAgICAtMTM5LCAtMTM5LCAtMTM5LCAgIDU4LCAtMTM5LCAtMTM5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMTYxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTM5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLCAtMTQwLAorICAgICAtMTQwLCAtMTQwLCAtMTQwLCAgIDU4LCAtMTQwLCAtMTQwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTYyLCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwgLTE0MSwKKyAgICAgLTE0MSwgLTE0MSwgLTE0MSwgICA1OCwgLTE0MSwgLTE0MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDE2MywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsIC0xNDIsCisgICAgIC0xNDIsIC0xNDIsIC0xNDIsICAgNTgsIC0xNDIsIC0xNDIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE2NCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsIC0xNDMsCisgICAgIC0xNDMsIC0xNDMsIC0xNDMsICAgNTgsIC0xNDMsIC0xNDMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAxNjUsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LCAtMTQ0LAorICAgICAtMTQ0LCAtMTQ0LCAtMTQ0LCAgIDU4LCAtMTQ0LCAtMTQ0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTY2LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQ0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LCAtMTQ1LAorICAgICAtMTQ1LCAtMTQ1LCAtMTQ1LCAgIDU4LCAtMTQ1LCAtMTQ1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgMTY3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQ1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwgLTE0NiwKKyAgICAgLTE0NiwgLTE0NiwgLTE0NiwgICA1OCwgLTE0NiwgLTE0NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDE2OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsIC0xNDcsCisgICAgIC0xNDcsIC0xNDcsIC0xNDcsICAgNTgsIC0xNDcsIC0xNDcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE2OSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsIC0xNDgsCisgICAgIC0xNDgsIC0xNDgsIC0xNDgsICAgNTgsIC0xNDgsIC0xNDgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LCAtMTQ5LAorICAgICAtMTQ5LCAtMTQ5LCAtMTQ5LCAgIDU4LCAtMTQ5LCAtMTQ5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTcwLCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQ5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLCAtMTUwLAorICAgICAtMTUwLCAtMTUwLCAtMTUwLCAgIDU4LCAtMTUwLCAtMTUwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMTcxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTUwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwgLTE1MSwKKyAgICAgLTE1MSwgLTE1MSwgLTE1MSwgICA1OCwgLTE1MSwgLTE1MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE3MiwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsIC0xNTIsCisgICAgIC0xNTIsIC0xNTIsIC0xNTIsICAgNTgsIC0xNTIsIC0xNTIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE3MywgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsIC0xNTMsCisgICAgIC0xNTMsIC0xNTMsIC0xNTMsICAgNTgsIC0xNTMsIC0xNTMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNzQsICAgNTgsICAgNTgsIC0xNTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LCAtMTU0LAorICAgICAtMTU0LCAtMTU0LCAtMTU0LCAgIDU4LCAtMTU0LCAtMTU0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTU0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LCAtMTU1LAorICAgICAtMTU1LCAtMTU1LCAtMTU1LCAgIDU4LCAtMTU1LCAtMTU1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgMTc1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTU1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwgLTE1NiwKKyAgICAgLTE1NiwgLTE1NiwgLTE1NiwgICA1OCwgLTE1NiwgLTE1NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE3NiwgICA1OCwgICA1OCwgLTE1NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsIC0xNTcsCisgICAgIC0xNTcsIC0xNTcsIC0xNTcsICAgNTgsIC0xNTcsIC0xNTcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgIDE3NywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsIC0xNTgsCisgICAgIC0xNTgsIC0xNTgsIC0xNTgsICAgNTgsIC0xNTgsIC0xNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAxNzgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LCAtMTU5LAorICAgICAtMTU5LCAtMTU5LCAtMTU5LCAgIDU4LCAtMTU5LCAtMTU5LCAgIDU4LCAgMTc5LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTU5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLCAtMTYwLAorICAgICAtMTYwLCAtMTYwLCAtMTYwLCAgIDU4LCAtMTYwLCAtMTYwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTgwLCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTYwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwgLTE2MSwKKyAgICAgLTE2MSwgLTE2MSwgLTE2MSwgICA1OCwgLTE2MSwgLTE2MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE2MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsIC0xNjIsCisgICAgIC0xNjIsIC0xNjIsIC0xNjIsICAgNTgsIC0xNjIsIC0xNjIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4MSwgICA1OCwgICA1OCwgLTE2MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsIC0xNjMsCisgICAgIC0xNjMsIC0xNjMsIC0xNjMsICAgNTgsIC0xNjMsIC0xNjMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LCAtMTY0LAorICAgICAtMTY0LCAtMTY0LCAtMTY0LCAgIDU4LCAtMTY0LCAtMTY0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTgyLAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTY0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LCAtMTY1LAorICAgICAtMTY1LCAtMTY1LCAtMTY1LCAgIDU4LCAtMTY1LCAtMTY1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTgzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTY1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwgLTE2NiwKKyAgICAgLTE2NiwgLTE2NiwgLTE2NiwgICA1OCwgLTE2NiwgLTE2NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4NCwgICA1OCwgICA1OCwgLTE2NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsIC0xNjcsCisgICAgIC0xNjcsIC0xNjcsIC0xNjcsICAgNTgsIC0xNjcsIC0xNjcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDE4NSwgICA1OCwgICA1OCwgICA1OCwgLTE2NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsIC0xNjgsCisgICAgIC0xNjgsIC0xNjgsIC0xNjgsICAgNTgsIC0xNjgsIC0xNjgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNjgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LCAtMTY5LAorICAgICAtMTY5LCAtMTY5LCAtMTY5LCAgIDU4LCAtMTY5LCAtMTY5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTg2LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTY5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLCAtMTcwLAorICAgICAtMTcwLCAtMTcwLCAtMTcwLCAgIDU4LCAtMTcwLCAtMTcwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTg3LCAgIDU4LCAtMTcwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwgLTE3MSwKKyAgICAgLTE3MSwgLTE3MSwgLTE3MSwgICA1OCwgLTE3MSwgLTE3MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsIC0xNzIsCisgICAgIC0xNzIsIC0xNzIsIC0xNzIsICAgNTgsIC0xNzIsIC0xNzIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4OSwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsIC0xNzMsCisgICAgIC0xNzMsIC0xNzMsIC0xNzMsICAgNTgsIC0xNzMsIC0xNzMsICAgNTgsICAxOTAsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LCAtMTc0LAorICAgICAtMTc0LCAtMTc0LCAtMTc0LCAgIDU4LCAtMTc0LCAtMTc0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTc0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LCAtMTc1LAorICAgICAtMTc1LCAtMTc1LCAtMTc1LCAgIDU4LCAtMTc1LCAtMTc1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMTkxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTc1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwgLTE3NiwKKyAgICAgLTE3NiwgLTE3NiwgLTE3NiwgICA1OCwgLTE3NiwgLTE3NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsIC0xNzcsCisgICAgIC0xNzcsIC0xNzcsIC0xNzcsICAgNTgsIC0xNzcsIC0xNzcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsIC0xNzgsCisgICAgIC0xNzgsIC0xNzgsIC0xNzgsICAgNTgsIC0xNzgsIC0xNzgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LCAtMTc5LAorICAgICAtMTc5LCAtMTc5LCAtMTc5LCAgIDU4LCAtMTc5LCAtMTc5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTkyLCAgIDU4LCAgIDU4LCAtMTc5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLCAtMTgwLAorICAgICAtMTgwLCAtMTgwLCAtMTgwLCAgIDU4LCAtMTgwLCAtMTgwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTgwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwgLTE4MSwKKyAgICAgLTE4MSwgLTE4MSwgLTE4MSwgICA1OCwgLTE4MSwgLTE4MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODIsIC0xODIsIC0xODIsIC0xODIsIC0xODIsIC0xODIsIC0xODIsIC0xODIsIC0xODIsCisgICAgIC0xODIsIC0xODIsIC0xODIsICAgNTgsIC0xODIsIC0xODIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE5MywgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODMsIC0xODMsIC0xODMsIC0xODMsIC0xODMsIC0xODMsIC0xODMsIC0xODMsIC0xODMsCisgICAgIC0xODMsIC0xODMsIC0xODMsICAgNTgsIC0xODMsIC0xODMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAxOTQsICAgNTgsICAgNTgsICAgNTgsIC0xODMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LCAtMTg0LAorICAgICAtMTg0LCAtMTg0LCAtMTg0LCAgIDU4LCAtMTg0LCAtMTg0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTg0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LCAtMTg1LAorICAgICAtMTg1LCAtMTg1LCAtMTg1LCAgIDU4LCAtMTg1LCAtMTg1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTg1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwgLTE4NiwKKyAgICAgLTE4NiwgLTE4NiwgLTE4NiwgICA1OCwgLTE4NiwgLTE4NiwgICA1OCwgICA1OCwgICA1OCwgIDE5NSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODcsIC0xODcsIC0xODcsIC0xODcsIC0xODcsIC0xODcsIC0xODcsIC0xODcsIC0xODcsCisgICAgIC0xODcsIC0xODcsIC0xODcsICAgNTgsIC0xODcsIC0xODcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODgsIC0xODgsIC0xODgsIC0xODgsIC0xODgsIC0xODgsIC0xODgsIC0xODgsIC0xODgsCisgICAgIC0xODgsIC0xODgsIC0xODgsICAgNTgsIC0xODgsIC0xODgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxOTYsICAgNTgsIC0xODgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LCAtMTg5LAorICAgICAtMTg5LCAtMTg5LCAtMTg5LCAgIDU4LCAtMTg5LCAtMTg5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgMTk3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTg5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLCAtMTkwLAorICAgICAtMTkwLCAtMTkwLCAtMTkwLCAgIDU4LCAtMTkwLCAtMTkwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTk4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTkwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwgLTE5MSwKKyAgICAgLTE5MSwgLTE5MSwgLTE5MSwgICA1OCwgLTE5MSwgLTE5MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDE5OSwgICA1OCwgICA1OCwgICA1OCwgLTE5MQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsIC0xOTIsCisgICAgIC0xOTIsIC0xOTIsIC0xOTIsICAgNTgsIC0xOTIsIC0xOTIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgIDIwMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsIC0xOTMsCisgICAgIC0xOTMsIC0xOTMsIC0xOTMsICAgNTgsIC0xOTMsIC0xOTMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAyMDEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xOTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LCAtMTk0LAorICAgICAtMTk0LCAtMTk0LCAtMTk0LCAgIDU4LCAtMTk0LCAtMTk0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMjAyLCAgIDU4LCAgIDU4LCAtMTk0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LCAtMTk1LAorICAgICAtMTk1LCAtMTk1LCAtMTk1LCAgIDU4LCAtMTk1LCAtMTk1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMjAzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTk1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwgLTE5NiwKKyAgICAgLTE5NiwgLTE5NiwgLTE5NiwgICA1OCwgLTE5NiwgLTE5NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsIC0xOTcsCisgICAgIC0xOTcsIC0xOTcsIC0xOTcsICAgNTgsIC0xOTcsIC0xOTcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDIwNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5NworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsIC0xOTgsCisgICAgIC0xOTgsIC0xOTgsIC0xOTgsICAgNTgsIC0xOTgsIC0xOTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xOTgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LCAtMTk5LAorICAgICAtMTk5LCAtMTk5LCAtMTk5LCAgIDU4LCAtMTk5LCAtMTk5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTk5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLCAtMjAwLAorICAgICAtMjAwLCAtMjAwLCAtMjAwLCAgIDU4LCAtMjAwLCAtMjAwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjAwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwgLTIwMSwKKyAgICAgLTIwMSwgLTIwMSwgLTIwMSwgICA1OCwgLTIwMSwgLTIwMSwgICA1OCwgIDIwNSwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsIC0yMDIsCisgICAgIC0yMDIsIC0yMDIsIC0yMDIsICAgNTgsIC0yMDIsIC0yMDIsICAgNTgsICAyMDYsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsIC0yMDMsCisgICAgIC0yMDMsIC0yMDMsIC0yMDMsICAgNTgsIC0yMDMsIC0yMDMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0yMDMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LCAtMjA0LAorICAgICAtMjA0LCAtMjA0LCAtMjA0LCAgIDU4LCAtMjA0LCAtMjA0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgMjA3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjA0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LCAtMjA1LAorICAgICAtMjA1LCAtMjA1LCAtMjA1LCAgIDU4LCAtMjA1LCAtMjA1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMjA4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjA1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwgLTIwNiwKKyAgICAgLTIwNiwgLTIwNiwgLTIwNiwgICA1OCwgLTIwNiwgLTIwNiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDIwOSwgICA1OCwgICA1OCwgLTIwNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsIC0yMDcsCisgICAgIC0yMDcsIC0yMDcsIC0yMDcsICAgNTgsIC0yMDcsIC0yMDcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsIC0yMDgsCisgICAgIC0yMDgsIC0yMDgsIC0yMDgsICAgNTgsIC0yMDgsIC0yMDgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0yMDgKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LCAtMjA5LAorICAgICAtMjA5LCAtMjA5LCAtMjA5LCAgIDU4LCAtMjA5LCAtMjA5LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMjEwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjA5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLCAtMjEwLAorICAgICAtMjEwLCAtMjEwLCAtMjEwLCAgIDU4LCAtMjEwLCAtMjEwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjEwCisgICAgfSwKKworICAgIH0gOworCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgKHZvaWQgKTsKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgKHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSAgKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh2b2lkICk7CitzdGF0aWMgdm9pZCB5eV9mYXRhbF9lcnJvciAoeXljb25zdCBjaGFyIG1zZ1tdICApOworCisvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQorICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHpjb25mdGV4dC4KKyAqLworI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsgXAorCXpjb25mbGVuZyA9IChzaXplX3QpICh5eV9jcCAtIHl5X2JwKTsgXAorCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOyBcCisJKnl5X2NwID0gJ1wwJzsgXAorCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOworCisjZGVmaW5lIFlZX05VTV9SVUxFUyA2NAorI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDY1CisvKiBUaGlzIHN0cnVjdCBpcyBub3QgdXNlZCBpbiB0aGlzIHNjYW5uZXIsCisgICBidXQgaXRzIHByZXNlbmNlIGlzIG5lY2Vzc2FyeS4gKi8KK3N0cnVjdCB5eV90cmFuc19pbmZvCisJeworCWZsZXhfaW50MzJfdCB5eV92ZXJpZnk7CisJZmxleF9pbnQzMl90IHl5X254dDsKKwl9Oworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X2FjY2VwdFsyMTFdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICA2NSwgICAgNSwgICAgNCwgICAgMywgICAgMiwgICAzNiwgICAzNywgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICA2MywgICA2MCwgICA2MiwgICA1NSwgICA1OSwgICA1OCwgICA1NywgICA1MywgICA0OCwgICA0MiwKKyAgICAgICA0NywgICA1MSwgICA1MywgICA0MCwgICA0MSwgICA1MCwgICA1MCwgICA0MywgICA1MywgICA1MCwKKyAgICAgICA1MCwgICA1MywgICAgNCwgICAgMywgICAgMiwgICAgMiwgICAgMSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAxNiwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICA2MywgICA2MCwgICA2MiwgICA2MSwKKyAgICAgICA1NSwgICA1NCwgICA1NywgICA1NiwgICA0NCwgICA1MSwgICAzOCwgICA1MCwgICA1MCwgICA1MiwKKyAgICAgICA0NSwgICA0NiwgICAzOSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKworICAgICAgIDM1LCAgIDM1LCAgIDMwLCAgIDI5LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDQ5LCAgIDI1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDE1LCAgIDM1LCAgICA3LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDE3LCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LAorICAgICAgIDEwLCAgIDM1LCAgIDEzLCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDMzLCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDIyLCAgIDM1LCAgIDMyLCAgICA5LCAgIDMxLCAgIDM1LCAgIDI2LAorICAgICAgIDEyLCAgIDM1LCAgIDM1LCAgIDIxLCAgIDE4LCAgIDM1LCAgICA4LCAgIDM1LCAgIDM1LCAgIDM1LAorICAgICAgIDM1LCAgIDM1LCAgIDI3LCAgIDM1LCAgIDM1LCAgICA2LCAgIDM1LCAgIDIwLCAgIDE5LCAgIDIzLAorCisgICAgICAgMzUsICAgMzUsICAgMTEsICAgMzUsICAgMzUsICAgMzUsICAgMTQsICAgMjgsICAgMzUsICAgMjQKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgZmxleF9pbnQzMl90IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICA0LCAgICA1LCAgICA2LCAgICAxLCAgICAxLCAgICA3LCAgICA4LCAgICA5LAorICAgICAgIDEwLCAgICAxLCAgICAxLCAgICAxLCAgIDExLCAgIDEyLCAgIDEyLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDE0LCAgICAxLCAgICAxLCAgICAxLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLCAgIDEzLAorICAgICAgICAxLCAgIDE1LCAgICAxLCAgICAxLCAgIDE2LCAgICAxLCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLAorCisgICAgICAgMjEsICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMTMsICAgMTMsICAgMjYsICAgMjcsICAgMjgsCisgICAgICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMTMsICAgMTMsICAgMzYsCisgICAgICAgMTMsICAgMTMsICAgIDEsICAgMzcsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitleHRlcm4gaW50IHpjb25mX2ZsZXhfZGVidWc7CitpbnQgemNvbmZfZmxleF9kZWJ1ZyA9IDA7CisKKy8qIFRoZSBpbnRlbnQgYmVoaW5kIHRoaXMgZGVmaW5pdGlvbiBpcyB0aGF0IGl0J2xsIGNhdGNoCisgKiBhbnkgdXNlcyBvZiBSRUpFQ1Qgd2hpY2ggZmxleCBtaXNzZWQuCisgKi8KKyNkZWZpbmUgUkVKRUNUIHJlamVjdF91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgeXltb3JlKCkgeXltb3JlX3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSBZWV9NT1JFX0FESiAwCisjZGVmaW5lIFlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQKK2NoYXIgKnpjb25mdGV4dDsKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIFNUQVJUX1NUUlNJWkUJMTYKKworY2hhciAqdGV4dDsKK3N0YXRpYyBjaGFyICp0ZXh0X3B0cjsKK3N0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOworCitzdHJ1Y3QgYnVmZmVyIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OworICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKKworc3RhdGljIGludCBsYXN0X3RzLCBmaXJzdF90czsKKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICp6Y29uZl9lbmRmaWxlKHZvaWQpOworCit2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfcHRyID0gdGV4dDsKKwl0ZXh0X3NpemUgPSAwOworCSp0ZXh0X3B0ciA9IDA7Cit9CisKK3ZvaWQgYXBwZW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCWludCBuZXdfc2l6ZSA9IHRleHRfc2l6ZSArIHNpemUgKyAxOworCWlmIChuZXdfc2l6ZSA+IHRleHRfYXNpemUpIHsKKwkJdGV4dCA9IHJlYWxsb2ModGV4dCwgbmV3X3NpemUpOworCQl0ZXh0X2FzaXplID0gbmV3X3NpemU7CisJCXRleHRfcHRyID0gdGV4dCArIHRleHRfc2l6ZTsKKwl9CisJbWVtY3B5KHRleHRfcHRyLCBzdHIsIHNpemUpOworCXRleHRfcHRyICs9IHNpemU7CisJdGV4dF9zaXplICs9IHNpemU7CisJKnRleHRfcHRyID0gMDsKK30KKwordm9pZCBhbGxvY19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwl0ZXh0ID0gbWFsbG9jKHNpemUgKyAxKTsKKwltZW1jcHkodGV4dCwgc3RyLCBzaXplKTsKKwl0ZXh0W3NpemVdID0gMDsKK30KKworI2RlZmluZSBJTklUSUFMIDAKKyNkZWZpbmUgQ09NTUFORCAxCisjZGVmaW5lIEhFTFAgMgorI2RlZmluZSBTVFJJTkcgMworI2RlZmluZSBQQVJBTSA0CisKKy8qIFNwZWNpYWwgY2FzZSBmb3IgInVuaXN0ZC5oIiwgc2luY2UgaXQgaXMgbm9uLUFOU0kuIFdlIGluY2x1ZGUgaXQgd2F5CisgKiBkb3duIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZSB1c2VyJ3Mgc2VjdGlvbiAxIHRvIGhhdmUgYmVlbiBzY2FubmVkIGZpcnN0LgorICogVGhlIHVzZXIgaGFzIGEgY2hhbmNlIHRvIG92ZXJyaWRlIGl0IHdpdGggYW4gb3B0aW9uLgorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgWVlfRVhUUkFfVFlQRQorI2RlZmluZSBZWV9FWFRSQV9UWVBFIHZvaWQgKgorI2VuZGlmCisKKy8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCisgKiBzZWN0aW9uIDEuCisgKi8KKworI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbHNlCitleHRlcm4gaW50IHpjb25md3JhcCAodm9pZCApOworI2VuZGlmCisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLGNoYXIgKmJ1Zl9wdHIgICk7CisgICAgCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciAqLHl5Y29uc3QgY2hhciAqLGludCApOworI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogKTsKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX0lOUFVUCisKKyNpZmRlZiBfX2NwbHVzcGx1cworc3RhdGljIGludCB5eWlucHV0ICh2b2lkICk7CisjZWxzZQorc3RhdGljIGludCBpbnB1dCAodm9pZCApOworI2VuZGlmCisKKyNlbmRpZgorCisvKiBBbW91bnQgb2Ygc3R1ZmYgdG8gc2x1cnAgdXAgd2l0aCBlYWNoIHJlYWQuICovCisjaWZuZGVmIFlZX1JFQURfQlVGX1NJWkUKKyNkZWZpbmUgWVlfUkVBRF9CVUZfU0laRSA4MTkyCisjZW5kaWYKKworLyogQ29weSB3aGF0ZXZlciB0aGUgbGFzdCBydWxlIG1hdGNoZWQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gKi8KKyNpZm5kZWYgRUNITworLyogVGhpcyB1c2VkIHRvIGJlIGFuIGZwdXRzKCksIGJ1dCBzaW5jZSB0aGUgc3RyaW5nIG1pZ2h0IGNvbnRhaW4gTlVMJ3MsCisgKiB3ZSBub3cgdXNlIGZ3cml0ZSgpLgorICovCisjZGVmaW5lIEVDSE8gKHZvaWQpIGZ3cml0ZSggemNvbmZ0ZXh0LCB6Y29uZmxlbmcsIDEsIHpjb25mb3V0ICkKKyNlbmRpZgorCisvKiBHZXRzIGlucHV0IGFuZCBzdHVmZnMgaXQgaW50byAiYnVmIi4gIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIFlZX05VTEwsCisgKiBpcyByZXR1cm5lZCBpbiAicmVzdWx0Ii4KKyAqLworI2lmbmRlZiBZWV9JTlBVVAorI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSBcCisJZXJybm89MDsgXAorCXdoaWxlICggKHJlc3VsdCA9IHJlYWQoIGZpbGVubyh6Y29uZmluKSwgKGNoYXIgKikgYnVmLCBtYXhfc2l6ZSApKSA8IDAgKSBcCisJeyBcCisJCWlmKCBlcnJubyAhPSBFSU5UUikgXAorCQl7IFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQkJYnJlYWs7IFwKKwkJfSBcCisJCWVycm5vPTA7IFwKKwkJY2xlYXJlcnIoemNvbmZpbik7IFwKKwl9XAorXAorCisjZW5kaWYKKworLyogTm8gc2VtaS1jb2xvbiBhZnRlciByZXR1cm47IGNvcnJlY3QgdXNhZ2UgaXMgdG8gd3JpdGUgInl5dGVybWluYXRlKCk7IiAtCisgKiB3ZSBkb24ndCB3YW50IGFuIGV4dHJhICc7JyBhZnRlciB0aGUgInJldHVybiIgYmVjYXVzZSB0aGF0IHdpbGwgY2F1c2UKKyAqIHNvbWUgY29tcGlsZXJzIHRvIGNvbXBsYWluIGFib3V0IHVucmVhY2hhYmxlIHN0YXRlbWVudHMuCisgKi8KKyNpZm5kZWYgeXl0ZXJtaW5hdGUKKyNkZWZpbmUgeXl0ZXJtaW5hdGUoKSByZXR1cm4gWVlfTlVMTAorI2VuZGlmCisKKy8qIE51bWJlciBvZiBlbnRyaWVzIGJ5IHdoaWNoIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayBncm93cy4gKi8KKyNpZm5kZWYgWVlfU1RBUlRfU1RBQ0tfSU5DUgorI2RlZmluZSBZWV9TVEFSVF9TVEFDS19JTkNSIDI1CisjZW5kaWYKKworLyogUmVwb3J0IGEgZmF0YWwgZXJyb3IuICovCisjaWZuZGVmIFlZX0ZBVEFMX0VSUk9SCisjZGVmaW5lIFlZX0ZBVEFMX0VSUk9SKG1zZykgeXlfZmF0YWxfZXJyb3IoIG1zZyApCisjZW5kaWYKKworLyogZW5kIHRhYmxlcyBzZXJpYWxpemF0aW9uIHN0cnVjdHVyZXMgYW5kIHByb3RvdHlwZXMgKi8KKworLyogRGVmYXVsdCBkZWNsYXJhdGlvbiBvZiBnZW5lcmF0ZWQgc2Nhbm5lciAtIGEgZGVmaW5lIHNvIHRoZSB1c2VyIGNhbgorICogZWFzaWx5IGFkZCBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIFlZX0RFQ0wKKyNkZWZpbmUgWVlfREVDTF9JU19PVVJTIDEKKworZXh0ZXJuIGludCB6Y29uZmxleCAodm9pZCk7CisKKyNkZWZpbmUgWVlfREVDTCBpbnQgemNvbmZsZXggKHZvaWQpCisjZW5kaWYgLyogIVlZX0RFQ0wgKi8KKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcnVsZSwgYWZ0ZXIgemNvbmZ0ZXh0IGFuZCB6Y29uZmxlbmcKKyAqIGhhdmUgYmVlbiBzZXQgdXAuCisgKi8KKyNpZm5kZWYgWVlfVVNFUl9BQ1RJT04KKyNkZWZpbmUgWVlfVVNFUl9BQ1RJT04KKyNlbmRpZgorCisvKiBDb2RlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgZWFjaCBydWxlLiAqLworI2lmbmRlZiBZWV9CUkVBSworI2RlZmluZSBZWV9CUkVBSyBicmVhazsKKyNlbmRpZgorCisjZGVmaW5lIFlZX1JVTEVfU0VUVVAgXAorCVlZX1VTRVJfQUNUSU9OCisKKy8qKiBUaGUgbWFpbiBzY2FubmVyIGZ1bmN0aW9uIHdoaWNoIGRvZXMgYWxsIHRoZSB3b3JrLgorICovCitZWV9ERUNMCit7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwLCAqeXlfYnA7CisJcmVnaXN0ZXIgaW50IHl5X2FjdDsKKyAgICAKKwlpbnQgc3RyID0gMDsKKwlpbnQgdHMsIGk7CisKKwlpZiAoICh5eV9pbml0KSApCisJCXsKKwkJKHl5X2luaXQpID0gMDsKKworI2lmZGVmIFlZX1VTRVJfSU5JVAorCQlZWV9VU0VSX0lOSVQ7CisjZW5kaWYKKworCQlpZiAoICEgKHl5X3N0YXJ0KSApCisJCQkoeXlfc3RhcnQpID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KKworCQlpZiAoICEgemNvbmZpbiApCisJCQl6Y29uZmluID0gc3RkaW47CisKKwkJaWYgKCAhIHpjb25mb3V0ICkKKwkJCXpjb25mb3V0ID0gc3Rkb3V0OworCisJCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApIHsKKwkJCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9CisJCQkJemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7CisJCX0KKworCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJfQorCisJd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KKwkJeworCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCQkvKiBTdXBwb3J0IG9mIHpjb25mdGV4dC4gKi8KKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisKKwkJLyogeXlfYnAgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB5eV9jaF9idWYgb2YgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBjdXJyZW50IHJ1bi4KKwkJICovCisJCXl5X2JwID0geXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9zdGFydCk7Cit5eV9tYXRjaDoKKwkJd2hpbGUgKCAoeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsgeXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gIF0pID4gMCApCisJCQkrK3l5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAteXlfY3VycmVudF9zdGF0ZTsKKworeXlfZmluZF9hY3Rpb246CisJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKKworCQlZWV9ET19CRUZPUkVfQUNUSU9OOworCitkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KKworCQlzd2l0Y2ggKCB5eV9hY3QgKQorCXsgLyogYmVnaW5uaW5nIG9mIGFjdGlvbiBzd2l0Y2ggKi8KK2Nhc2UgMToKKy8qIHJ1bGUgMSBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitjdXJyZW50X2ZpbGUtPmxpbmVubysrOworCVlZX0JSRUFLCitjYXNlIDI6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSAzOgorLyogcnVsZSAzIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwlZWV9CUkVBSworY2FzZSA0OgorWVlfUlVMRV9TRVRVUAoreworCUJFR0lOKENPTU1BTkQpOworfQorCVlZX0JSRUFLCitjYXNlIDU6CitZWV9SVUxFX1NFVFVQCit7CisJdW5wdXQoemNvbmZ0ZXh0WzBdKTsKKwlCRUdJTihDT01NQU5EKTsKK30KKwlZWV9CUkVBSworCitjYXNlIDY6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX01BSU5NRU5VOworCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX01FTlU7CisJWVlfQlJFQUsKK2Nhc2UgODoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfRU5ETUVOVTsKKwlZWV9CUkVBSworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TT1VSQ0U7CisJWVlfQlJFQUsKK2Nhc2UgMTA6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0NIT0lDRTsKKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfRU5EQ0hPSUNFOworCVlZX0JSRUFLCitjYXNlIDEyOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9DT01NRU5UOworCVlZX0JSRUFLCitjYXNlIDEzOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9DT05GSUc7CisJWVlfQlJFQUsKK2Nhc2UgMTQ6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX01FTlVDT05GSUc7CisJWVlfQlJFQUsKK2Nhc2UgMTU6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0hFTFA7CisJWVlfQlJFQUsKK2Nhc2UgMTY6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0lGOworCVlZX0JSRUFLCitjYXNlIDE3OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9FTkRJRjsKKwlZWV9CUkVBSworY2FzZSAxODoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVQRU5EUzsKKwlZWV9CUkVBSworY2FzZSAxOToKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfUkVRVUlSRVM7CisJWVlfQlJFQUsKK2Nhc2UgMjA6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX09QVElPTkFMOworCVlZX0JSRUFLCitjYXNlIDIxOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZBVUxUOworCVlZX0JSRUFLCitjYXNlIDIyOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9QUk9NUFQ7CisJWVlfQlJFQUsKK2Nhc2UgMjM6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX1RSSVNUQVRFOworCVlZX0JSRUFLCitjYXNlIDI0OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZfVFJJU1RBVEU7CisJWVlfQlJFQUsKK2Nhc2UgMjU6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0JPT0xFQU47CisJWVlfQlJFQUsKK2Nhc2UgMjY6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0JPT0xFQU47CisJWVlfQlJFQUsKK2Nhc2UgMjc6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0RFRl9CT09MRUFOOworCVlZX0JSRUFLCitjYXNlIDI4OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZfQk9PTEVBTjsKKwlZWV9CUkVBSworY2FzZSAyOToKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfSU5UOworCVlZX0JSRUFLCitjYXNlIDMwOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9IRVg7CisJWVlfQlJFQUsKK2Nhc2UgMzE6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX1NUUklORzsKKwlZWV9CUkVBSworY2FzZSAzMjoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU0VMRUNUOworCVlZX0JSRUFLCitjYXNlIDMzOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TRUxFQ1Q7CisJWVlfQlJFQUsKK2Nhc2UgMzQ6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX1JBTkdFOworCVlZX0JSRUFLCitjYXNlIDM1OgorWVlfUlVMRV9TRVRVUAoreworCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMzY6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSAzNzoKKy8qIHJ1bGUgMzcgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorY3VycmVudF9maWxlLT5saW5lbm8rKzsgQkVHSU4oSU5JVElBTCk7CisJWVlfQlJFQUsKKworY2FzZSAzODoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0FORDsKKwlZWV9CUkVBSworY2FzZSAzOToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX09SOworCVlZX0JSRUFLCitjYXNlIDQwOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfT1BFTl9QQVJFTjsKKwlZWV9CUkVBSworY2FzZSA0MToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0NMT1NFX1BBUkVOOworCVlZX0JSRUFLCitjYXNlIDQyOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfTk9UOworCVlZX0JSRUFLCitjYXNlIDQzOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfRVFVQUw7CisJWVlfQlJFQUsKK2Nhc2UgNDQ6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9VTkVRVUFMOworCVlZX0JSRUFLCitjYXNlIDQ1OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfSUY7CisJWVlfQlJFQUsKK2Nhc2UgNDY6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PTjsKKwlZWV9CUkVBSworY2FzZSA0NzoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJc3RyID0gemNvbmZ0ZXh0WzBdOworCQluZXdfc3RyaW5nKCk7CisJCUJFR0lOKFNUUklORyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDQ4OgorLyogcnVsZSA0OCBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitCRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOworCVlZX0JSRUFLCitjYXNlIDQ5OgorWVlfUlVMRV9TRVRVUAorLyogaWdub3JlICovCisJWVlfQlJFQUsKK2Nhc2UgNTA6CitZWV9SVUxFX1NFVFVQCit7CisJCWFsbG9jX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwlZWV9CUkVBSworY2FzZSA1MToKK1lZX1JVTEVfU0VUVVAKKy8qIGNvbW1lbnQgKi8KKwlZWV9CUkVBSworY2FzZSA1MjoKKy8qIHJ1bGUgNTIgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwlZWV9CUkVBSworY2FzZSA1MzoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihQQVJBTSk6Cit7CisJCUJFR0lOKElOSVRJQUwpOworCX0KKwlZWV9CUkVBSworCitjYXNlIDU0OgorLyogcnVsZSA1NCBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVlZX0JSRUFLCitjYXNlIDU1OgorWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNTY6CisvKiBydWxlIDU2IGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlZWV9CUkVBSworY2FzZSA1NzoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQgKyAxLCB6Y29uZmxlbmcgLSAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNTg6CitZWV9SVUxFX1NFVFVQCit7CisJCWlmIChzdHIgPT0gemNvbmZ0ZXh0WzBdKSB7CisJCQlCRUdJTihQQVJBTSk7CisJCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJCX0gZWxzZQorCQkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSA1OToKKy8qIHJ1bGUgNTkgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQlwcmludGYoIiVzOiVkOndhcm5pbmc6IG11bHRpLWxpbmUgc3RyaW5ncyBub3Qgc3VwcG9ydGVkXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJQkVHSU4oSU5JVElBTCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKFNUUklORyk6Cit7CisJCUJFR0lOKElOSVRJQUwpOworCX0KKwlZWV9CUkVBSworCitjYXNlIDYwOgorWVlfUlVMRV9TRVRVUAoreworCQl0cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCB6Y29uZmxlbmc7IGkrKykgeworCQkJaWYgKHpjb25mdGV4dFtpXSA9PSAnXHQnKQorCQkJCXRzID0gKHRzICYgfjcpICsgODsKKwkJCWVsc2UKKwkJCQl0cysrOworCQl9CisJCWxhc3RfdHMgPSB0czsKKwkJaWYgKGZpcnN0X3RzKSB7CisJCQlpZiAodHMgPCBmaXJzdF90cykgeworCQkJCXpjb25mX2VuZGhlbHAoKTsKKwkJCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwkJCX0KKwkJCXRzIC09IGZpcnN0X3RzOworCQkJd2hpbGUgKHRzID4gOCkgeworCQkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgOCk7CisJCQkJdHMgLT0gODsKKwkJCX0KKwkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgdHMpOworCQl9CisJfQorCVlZX0JSRUFLCitjYXNlIDYxOgorLyogcnVsZSA2MSBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KKwlZWV9CUkVBSworY2FzZSA2MjoKKy8qIHJ1bGUgNjIgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlhcHBlbmRfc3RyaW5nKCJcbiIsIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSA2MzoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCWlmICghZmlyc3RfdHMpCisJCQlmaXJzdF90cyA9IGxhc3RfdHM7CisJfQorCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihIRUxQKToKK3sKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWVlfQlJFQUsKKworY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6CitjYXNlIFlZX1NUQVRFX0VPRihDT01NQU5EKToKK3sKKwlpZiAoY3VycmVudF9idWYpIHsKKwkJemNvbmZfZW5kZmlsZSgpOworCQlyZXR1cm4gVF9FT0Y7CisJfQorCWZjbG9zZSh6Y29uZmluKTsKKwl5eXRlcm1pbmF0ZSgpOworfQorCVlZX0JSRUFLCitjYXNlIDY0OgorWVlfUlVMRV9TRVRVUAorWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgamFtbWVkIiApOworCVlZX0JSRUFLCisKKwljYXNlIFlZX0VORF9PRl9CVUZGRVI6CisJCXsKKwkJLyogQW1vdW50IG9mIHRleHQgbWF0Y2hlZCBub3QgaW5jbHVkaW5nIHRoZSBFT0IgY2hhci4gKi8KKwkJaW50IHl5X2Ftb3VudF9vZl9tYXRjaGVkX3RleHQgPSAoaW50KSAoeXlfY3AgLSAoeXl0ZXh0X3B0cikpIC0gMTsKKworCQkvKiBVbmRvIHRoZSBlZmZlY3RzIG9mIFlZX0RPX0JFRk9SRV9BQ1RJT04uICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCisKKwkJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX05FVyApCisJCQl7CisJCQkvKiBXZSdyZSBzY2FubmluZyBhIG5ldyBmaWxlIG9yIGlucHV0IHNvdXJjZS4gIEl0J3MKKwkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBoYXBwZW5lZCBiZWNhdXNlIHRoZSB1c2VyCisJCQkgKiBqdXN0IHBvaW50ZWQgemNvbmZpbiBhdCBhIG5ldyBzb3VyY2UgYW5kIGNhbGxlZAorCQkJICogemNvbmZsZXgoKS4gIElmIHNvLCB0aGVuIHdlIGhhdmUgdG8gYXNzdXJlCisJCQkgKiBjb25zaXN0ZW5jeSBiZXR3ZWVuIFlZX0NVUlJFTlRfQlVGRkVSIGFuZCBvdXIKKwkJCSAqIGdsb2JhbHMuICBIZXJlIGlzIHRoZSByaWdodCBwbGFjZSB0byBkbyBzbywgYmVjYXVzZQorCQkJICogdGhpcyBpcyB0aGUgZmlyc3QgYWN0aW9uIChvdGhlciB0aGFuIHBvc3NpYmx5IGEKKwkJCSAqIGJhY2stdXApIHRoYXQgd2lsbCBtYXRjaCBmb3IgdGhlIG5ldyBpbnB1dCBzb3VyY2UuCisJCQkgKi8KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZSA9IHpjb25maW47CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOworCQkJfQorCisJCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KKwkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKKwkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgorCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKKwkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKKwkJICogaW4gaW5wdXQoKS4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDw9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldICkKKwkJCXsgLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJeXlfc3RhdGVfdHlwZSB5eV9uZXh0X3N0YXRlOworCisJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJLyogT2theSwgd2UncmUgbm93IHBvc2l0aW9uZWQgdG8gbWFrZSB0aGUgTlVMCisJCQkgKiB0cmFuc2l0aW9uLiAgV2UgY291bGRuJ3QgaGF2ZQorCQkJICogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCkgZ28gYWhlYWQgYW5kIGRvIGl0CisJCQkgKiBmb3IgdXMgYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgaG93IHRvIGRlYWwKKwkJCSAqIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIGphbW1pbmcgKGFuZCB3ZSBkb24ndAorCQkJICogd2FudCB0byBidWlsZCBqYW1taW5nIGludG8gaXQgYmVjYXVzZSB0aGVuIGl0CisJCQkgKiB3aWxsIHJ1biBtb3JlIHNsb3dseSkuCisJCQkgKi8KKworCQkJeXlfbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKTsKKworCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKworCQkJaWYgKCB5eV9uZXh0X3N0YXRlICkKKwkJCQl7CisJCQkJLyogQ29uc3VtZSB0aGUgTlVMLiAqLworCQkJCXl5X2NwID0gKysoeXlfY19idWZfcCk7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X25leHRfc3RhdGU7CisJCQkJZ290byB5eV9tYXRjaDsKKwkJCQl9CisKKwkJCWVsc2UKKwkJCQl7CisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKKwkJCQl9CisJCQl9CisKKwkJZWxzZSBzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKKwkJCXsKKwkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKKwkJCQl7CisJCQkJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAwOworCisJCQkJaWYgKCB6Y29uZndyYXAoICkgKQorCQkJCQl7CisJCQkJCS8qIE5vdGU6IGJlY2F1c2Ugd2UndmUgdGFrZW4gY2FyZSBpbgorCQkJCQkgKiB5eV9nZXRfbmV4dF9idWZmZXIoKSB0byBoYXZlIHNldCB1cAorCQkJCQkgKiB6Y29uZnRleHQsIHdlIGNhbiBub3cgc2V0IHVwCisJCQkJCSAqIHl5X2NfYnVmX3Agc28gdGhhdCBpZiBzb21lIHRvdGFsCisJCQkJCSAqIGhvc2VyIChsaWtlIGZsZXggaXRzZWxmKSB3YW50cyB0bworCQkJCQkgKiBjYWxsIHRoZSBzY2FubmVyIGFmdGVyIHdlIHJldHVybiB0aGUKKwkJCQkJICogWVlfTlVMTCwgaXQnbGwgc3RpbGwgd29yayAtIGFub3RoZXIKKwkJCQkJICogWVlfTlVMTCB3aWxsIGdldCByZXR1cm5lZC4KKwkJCQkJICovCisJCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCisJCQkJCXl5X2FjdCA9IFlZX1NUQVRFX0VPRihZWV9TVEFSVCk7CisJCQkJCWdvdG8gZG9fYWN0aW9uOworCQkJCQl9CisKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCAhICh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpICkKKwkJCQkJCVlZX05FV19GSUxFOworCQkJCQl9CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkoeXlfY19idWZfcCkgPQorCQkJCQkoeXl0ZXh0X3B0cikgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfbWF0Y2g7CisKKwkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCSh5eV9jX2J1Zl9wKSA9CisJCQkJJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV07CisKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCAgKTsKKworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisJCQkJZ290byB5eV9maW5kX2FjdGlvbjsKKwkJCX0KKwkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCVlZX0ZBVEFMX0VSUk9SKAorCQkJImZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kIiApOworCX0gLyogZW5kIG9mIGFjdGlvbiBzd2l0Y2ggKi8KKwkJfSAvKiBlbmQgb2Ygc2Nhbm5pbmcgb25lIHRva2VuICovCit9IC8qIGVuZCBvZiB6Y29uZmxleCAqLworCisvKiB5eV9nZXRfbmV4dF9idWZmZXIgLSB0cnkgdG8gcmVhZCBpbiBhIG5ldyBidWZmZXIKKyAqCisgKiBSZXR1cm5zIGEgY29kZSByZXByZXNlbnRpbmcgYW4gYWN0aW9uOgorICoJRU9CX0FDVF9MQVNUX01BVENIIC0KKyAqCUVPQl9BQ1RfQ09OVElOVUVfU0NBTiAtIGNvbnRpbnVlIHNjYW5uaW5nIGZyb20gY3VycmVudCBwb3NpdGlvbgorICoJRU9CX0FDVF9FTkRfT0ZfRklMRSAtIGVuZCBvZiBmaWxlCisgKi8KK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyICh2b2lkKQoreworICAgIAlyZWdpc3RlciBjaGFyICpkZXN0ID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWY7CisJcmVnaXN0ZXIgY2hhciAqc291cmNlID0gKHl5dGV4dF9wdHIpOworCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSwgaTsKKwlpbnQgcmV0X3ZhbDsKKworCWlmICggKHl5X2NfYnVmX3ApID4gJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKSArIDFdICkKKwkJWVlfRkFUQUxfRVJST1IoCisJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2ZpbGxfYnVmZmVyID09IDAgKQorCQl7IC8qIERvbid0IHRyeSB0byBmaWxsIHRoZSBidWZmZXIsIHNvIHRoaXMgaXMgYW4gRU9GLiAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKSAtIFlZX01PUkVfQURKID09IDEgKQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBhIHNpbmdsZSBjaGFyYWN0ZXIsIHRoZSBFT0IsIHNvCisJCQkgKiB0cmVhdCB0aGlzIGFzIGEgZmluYWwgRU9GLgorCQkJICovCisJCQlyZXR1cm4gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQkvKiBXZSBtYXRjaGVkIHNvbWUgdGV4dCBwcmlvciB0byB0aGUgRU9CLCBmaXJzdAorCQkJICogcHJvY2VzcyBpdC4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogVHJ5IHRvIHJlYWQgbW9yZSBkYXRhLiAqLworCisJLyogRmlyc3QgbW92ZSBsYXN0IGNoYXJzIHRvIHN0YXJ0IG9mIGJ1ZmZlci4gKi8KKwludW1iZXJfdG9fbW92ZSA9IChpbnQpICgoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikpIC0gMTsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCisJCSooZGVzdCsrKSA9ICooc291cmNlKyspOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPT0gWVlfQlVGRkVSX0VPRl9QRU5ESU5HICkKKwkJLyogZG9uJ3QgZG8gdGhlIHJlYWQsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gcmV0dXJuIGFuIEVPRiwKKwkJICoganVzdCBmb3JjZSBhbiBFT0YKKwkJICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKSA9IDA7CisKKwllbHNlCisJCXsKKwkJCXNpemVfdCBudW1fdG9fcmVhZCA9CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOworCisJCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCisJCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KKworCQkJLyoganVzdCBhIHNob3J0ZXIgbmFtZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCQlZWV9CVUZGRVJfU1RBVEUgYiA9IFlZX0NVUlJFTlRfQlVGRkVSOworCisJCQlpbnQgeXlfY19idWZfcF9vZmZzZXQgPQorCQkJCShpbnQpICgoeXlfY19idWZfcCkgLSBiLT55eV9jaF9idWYpOworCisJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQkJCXsKKwkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7CisKKwkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQorCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7CisJCQkJZWxzZQorCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOworCisJCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKKwkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KKwkJCQkJemNvbmZyZWFsbG9jKCh2b2lkICopIGItPnl5X2NoX2J1ZixiLT55eV9idWZfc2l6ZSArIDIgICk7CisJCQkJfQorCQkJZWxzZQorCQkJCS8qIENhbid0IGdyb3cgaXQsIHdlIGRvbid0IG93biBpdC4gKi8KKwkJCQliLT55eV9jaF9idWYgPSAwOworCisJCQlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJCQlZWV9GQVRBTF9FUlJPUigKKwkJCQkiZmF0YWwgZXJyb3IgLSBzY2FubmVyIGlucHV0IGJ1ZmZlciBvdmVyZmxvdyIgKTsKKworCQkJKHl5X2NfYnVmX3ApID0gJmItPnl5X2NoX2J1Zlt5eV9jX2J1Zl9wX29mZnNldF07CisKKwkJCW51bV90b19yZWFkID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtCisJCQkJCQludW1iZXJfdG9fbW92ZSAtIDE7CisKKwkJCX0KKworCQlpZiAoIG51bV90b19yZWFkID4gWVlfUkVBRF9CVUZfU0laRSApCisJCQludW1fdG9fcmVhZCA9IFlZX1JFQURfQlVGX1NJWkU7CisKKwkJLyogUmVhZCBpbiBtb3JlIGRhdGEuICovCisJCVlZX0lOUFVUKCAoJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCisJCQkoeXlfbl9jaGFycyksIG51bV90b19yZWFkICk7CisKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwlpZiAoICh5eV9uX2NoYXJzKSA9PSAwICkKKwkJeworCQlpZiAoIG51bWJlcl90b19tb3ZlID09IFlZX01PUkVfQURKICkKKwkJCXsKKwkJCXJldF92YWwgPSBFT0JfQUNUX0VORF9PRl9GSUxFOworCQkJemNvbmZyZXN0YXJ0KHpjb25maW4gICk7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfTEFTVF9NQVRDSDsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmZmVyX3N0YXR1cyA9CisJCQkJWVlfQlVGRkVSX0VPRl9QRU5ESU5HOworCQkJfQorCQl9CisKKwllbHNlCisJCXJldF92YWwgPSBFT0JfQUNUX0NPTlRJTlVFX1NDQU47CisKKwkoeXlfbl9jaGFycykgKz0gbnVtYmVyX3RvX21vdmU7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCSh5eXRleHRfcHRyKSA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlswXTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKiB5eV9nZXRfcHJldmlvdXNfc3RhdGUgLSBnZXQgdGhlIHN0YXRlIGp1c3QgYmVmb3JlIHRoZSBFT0IgY2hhciB3YXMgcmVhY2hlZCAqLworCisgICAgc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkKQoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKyAgICAKKwl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKKworCWZvciAoIHl5X2NwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7IHl5X2NwIDwgKHl5X2NfYnVmX3ApOyArK3l5X2NwICkKKwkJeworCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWygqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpXTsKKwkJfQorCisJcmV0dXJuIHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKy8qIHl5X3RyeV9OVUxfdHJhbnMgLSB0cnkgdG8gbWFrZSBhIHRyYW5zaXRpb24gb24gdGhlIE5VTCBjaGFyYWN0ZXIKKyAqCisgKiBzeW5vcHNpcworICoJbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIGN1cnJlbnRfc3RhdGUgKTsKKyAqLworICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgICh5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQoreworCXJlZ2lzdGVyIGludCB5eV9pc19qYW07CisgICAgCisJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsxXTsKKwl5eV9pc19qYW0gPSAoeXlfY3VycmVudF9zdGF0ZSA8PSAwKTsKKworCXJldHVybiB5eV9pc19qYW0gPyAwIDogeXlfY3VycmVudF9zdGF0ZTsKK30KKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLCByZWdpc3RlciBjaGFyICogeXlfYnAgKQoreworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwOworICAgIAorICAgIHl5X2NwID0gKHl5X2NfYnVmX3ApOworCisJLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisKKwlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJeyAvKiBuZWVkIHRvIHNoaWZ0IHRoaW5ncyB1cCB0byBtYWtlIHJvb20gKi8KKwkJLyogKzIgZm9yIEVPQiBjaGFycy4gKi8KKwkJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlID0gKHl5X25fY2hhcnMpICsgMjsKKwkJcmVnaXN0ZXIgY2hhciAqZGVzdCA9ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsKKwkJCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSArIDJdOworCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV07CisKKwkJd2hpbGUgKCBzb3VyY2UgPiBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZiApCisJCQkqLS1kZXN0ID0gKi0tc291cmNlOworCisJCXl5X2NwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJeXlfYnAgKz0gKGludCkgKGRlc3QgLSBzb3VyY2UpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPQorCQkJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZTsKKworCQlpZiAoIHl5X2NwIDwgWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKyAyICkKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdyIgKTsKKwkJfQorCisJKi0teXlfY3AgPSAoY2hhcikgYzsKKworCSh5eXRleHRfcHRyKSA9IHl5X2JwOworCSh5eV9ob2xkX2NoYXIpID0gKnl5X2NwOworCSh5eV9jX2J1Zl9wKSA9IHl5X2NwOworfQorCisjaWZuZGVmIFlZX05PX0lOUFVUCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBzdGF0aWMgaW50IHl5aW5wdXQgKHZvaWQpCisjZWxzZQorICAgIHN0YXRpYyBpbnQgaW5wdXQgICh2b2lkKQorI2VuZGlmCisKK3sKKwlpbnQgYzsKKyAgICAKKwkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisKKwlpZiAoICooeXlfY19idWZfcCkgPT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkJeworCQkvKiB5eV9jX2J1Zl9wIG5vdyBwb2ludHMgdG8gdGhlIGNoYXJhY3RlciB3ZSB3YW50IHRvIHJldHVybi4KKwkJICogSWYgdGhpcyBvY2N1cnMgKmJlZm9yZSogdGhlIEVPQiBjaGFyYWN0ZXJzLCB0aGVuIGl0J3MgYQorCQkgKiB2YWxpZCBOVUw7IGlmIG5vdCwgdGhlbiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgPCAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCQkvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsKKworCQllbHNlCisJCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLworCQkJaW50IG9mZnNldCA9ICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKTsKKwkJCSsrKHl5X2NfYnVmX3ApOworCisJCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKKwkJCQl7CisJCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJCS8qIFRoaXMgaGFwcGVucyBiZWNhdXNlIHl5X2dfbl9iKCkKKwkJCQkJICogc2VlcyB0aGF0IHdlJ3ZlIGFjY3VtdWxhdGVkIGEKKwkJCQkJICogdG9rZW4gYW5kIGZsYWdzIHRoYXQgd2UgbmVlZCB0bworCQkJCQkgKiB0cnkgbWF0Y2hpbmcgdGhlIHRva2VuIGJlZm9yZQorCQkJCQkgKiBwcm9jZWVkaW5nLiAgQnV0IGZvciBpbnB1dCgpLAorCQkJCQkgKiB0aGVyZSdzIG5vIG1hdGNoaW5nIHRvIGNvbnNpZGVyLgorCQkJCQkgKiBTbyBjb252ZXJ0IHRoZSBFT0JfQUNUX0xBU1RfTUFUQ0gKKwkJCQkJICogdG8gRU9CX0FDVF9FTkRfT0ZfRklMRS4KKwkJCQkJICovCisKKwkJCQkJLyogUmVzZXQgYnVmZmVyIHN0YXR1cy4gKi8KKwkJCQkJemNvbmZyZXN0YXJ0KHpjb25maW4gKTsKKworCQkJCQkvKkZBTExUSFJPVUdIKi8KKworCQkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKKwkJCQkJeworCQkJCQlpZiAoIHpjb25md3JhcCggKSApCisJCQkJCQlyZXR1cm4gRU9GOworCisJCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCQlZWV9ORVdfRklMRTsKKyNpZmRlZiBfX2NwbHVzcGx1cworCQkJCQlyZXR1cm4geXlpbnB1dCgpOworI2Vsc2UKKwkJCQkJcmV0dXJuIGlucHV0KCk7CisjZW5kaWYKKwkJCQkJfQorCisJCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIG9mZnNldDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwljID0gKih1bnNpZ25lZCBjaGFyICopICh5eV9jX2J1Zl9wKTsJLyogY2FzdCBmb3IgOC1iaXQgY2hhcidzICovCisJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CS8qIHByZXNlcnZlIHpjb25mdGV4dCAqLworCSh5eV9ob2xkX2NoYXIpID0gKisrKHl5X2NfYnVmX3ApOworCisJcmV0dXJuIGM7Cit9CisjZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCisKKy8qKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtLgorICogQHBhcmFtIGlucHV0X2ZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiAKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVzZXQgdGhlIHN0YXJ0IGNvbmRpdGlvbiB0byBAYyBJTklUSUFMIC4KKyAqLworICAgIHZvaWQgemNvbmZyZXN0YXJ0ICAoRklMRSAqIGlucHV0X2ZpbGUgKQoreworICAgIAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeworICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9CisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsKKwl9CisKKwl6Y29uZl9pbml0X2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUixpbnB1dF9maWxlICk7CisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Cit9CisKKy8qKiBTd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBpbnB1dCBidWZmZXIuCisgKiAKKyAqLworICAgIHZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgbmV3X2J1ZmZlciApCit7CisgICAgCisJLyogVE9ETy4gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVwbGFjZSB0aGlzIGVudGlyZSBmdW5jdGlvbiBib2R5CisJICogd2l0aAorCSAqCQl6Y29uZnBvcF9idWZmZXJfc3RhdGUoKTsKKwkgKgkJemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZShuZXdfYnVmZmVyKTsKKyAgICAgKi8KKwl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiA9PSBuZXdfYnVmZmVyICkKKwkJcmV0dXJuOworCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCisJLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKKwkgKiBFT0YgKHpjb25md3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKKwkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgemNvbmZ3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKKwkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KKwkgKi8KKwkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2xvYWRfYnVmZmVyX3N0YXRlICAodm9pZCkKK3sKKyAgICAJKHl5X25fY2hhcnMpID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzOworCSh5eXRleHRfcHRyKSA9ICh5eV9jX2J1Zl9wKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvczsKKwl6Y29uZmluID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9pbnB1dF9maWxlOworCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsKK30KKworLyoqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIGlucHV0IGJ1ZmZlciBzdGF0ZS4KKyAqIEBwYXJhbSBmaWxlIEEgcmVhZGFibGUgc3RyZWFtLgorICogQHBhcmFtIHNpemUgVGhlIGNoYXJhY3RlciBidWZmZXIgc2l6ZSBpbiBieXRlcy4gV2hlbiBpbiBkb3VidCwgdXNlIEBjIFlZX0JVRl9TSVpFLgorICogCisgKiBAcmV0dXJuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlLgorICovCisgICAgWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgIChGSUxFICogZmlsZSwgaW50ICBzaXplICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKyAgICAKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKKworCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KKwkgKi8KKwliLT55eV9jaF9idWYgPSAoY2hhciAqKSB6Y29uZmFsbG9jKGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwl6Y29uZl9pbml0X2J1ZmZlcihiLGZpbGUgKTsKKworCXJldHVybiBiOworfQorCisvKiogRGVzdHJveSB0aGUgYnVmZmVyLgorICogQHBhcmFtIGIgYSBidWZmZXIgY3JlYXRlZCB3aXRoIHpjb25mX2NyZWF0ZV9idWZmZXIoKQorICogCisgKi8KKyAgICB2b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCit7CisgICAgCisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKSAvKiBOb3Qgc3VyZSBpZiB3ZSBzaG91bGQgcG9wIGhlcmUuICovCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IChZWV9CVUZGRVJfU1RBVEUpIDA7CisKKwlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQl6Y29uZmZyZWUoKHZvaWQgKikgYi0+eXlfY2hfYnVmICApOworCisJemNvbmZmcmVlKCh2b2lkICopIGIgICk7Cit9CisKKy8qIEluaXRpYWxpemVzIG9yIHJlaW5pdGlhbGl6ZXMgYSBidWZmZXIuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHNvbWV0aW1lcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgYnVmZmVyLAorICogc3VjaCBhcyBkdXJpbmcgYSB6Y29uZnJlc3RhcnQoKSBvciBhdCBFT0YuCisgKi8KKyAgICBzdGF0aWMgdm9pZCB6Y29uZl9pbml0X2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgYiwgRklMRSAqIGZpbGUgKQorCit7CisJaW50IG9lcnJubyA9IGVycm5vOworICAgIAorCXpjb25mX2ZsdXNoX2J1ZmZlcihiICk7CisKKwliLT55eV9pbnB1dF9maWxlID0gZmlsZTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDE7CisKKyAgICAvKiBJZiBiIGlzIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlbiB6Y29uZl9pbml0X2J1ZmZlciB3YXMgX3Byb2JhYmx5XworICAgICAqIGNhbGxlZCBmcm9tIHpjb25mcmVzdGFydCgpIG9yIHRocm91Z2ggeXlfZ2V0X25leHRfYnVmZmVyLgorICAgICAqIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXNldCB0aGUgbGluZW5vIG9yIGNvbHVtbi4KKyAgICAgKi8KKyAgICBpZiAoYiAhPSBZWV9DVVJSRU5UX0JVRkZFUil7CisgICAgICAgIGItPnl5X2JzX2xpbmVubyA9IDE7CisgICAgICAgIGItPnl5X2JzX2NvbHVtbiA9IDA7CisgICAgfQorCisgICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKyAgICAKKwllcnJubyA9IG9lcnJubzsKK30KKworLyoqIERpc2NhcmQgYWxsIGJ1ZmZlcmVkIGNoYXJhY3RlcnMuIE9uIHRoZSBuZXh0IHNjYW4sIFlZX0lOUFVUIHdpbGwgYmUgY2FsbGVkLgorICogQHBhcmFtIGIgdGhlIGJ1ZmZlciBzdGF0ZSB0byBiZSBmbHVzaGVkLCB1c3VhbGx5IEBjIFlZX0NVUlJFTlRfQlVGRkVSLgorICogCisgKi8KKyAgICB2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKyAgICAJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0gWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKK30KKworLyoqIFB1c2hlcyB0aGUgbmV3IHN0YXRlIG9udG8gdGhlIHN0YWNrLiBUaGUgbmV3IHN0YXRlIGJlY29tZXMKKyAqICB0aGUgY3VycmVudCBzdGF0ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIHRoZSBzdGFjaworICogIGlmIG5lY2Vzc2FyeS4KKyAqICBAcGFyYW0gbmV3X2J1ZmZlciBUaGUgbmV3IHN0YXRlLgorICogIAorICovCit2b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKK3sKKyAgICAJaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrKCk7CisKKwkvKiBUaGlzIGJsb2NrIGlzIGNvcGllZCBmcm9tIHpjb25mX3N3aXRjaF90b19idWZmZXIuICovCisJaWYgKCBZWV9DVVJSRU5UX0JVRkZFUiApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3BvcyA9ICh5eV9jX2J1Zl9wKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0gKHl5X25fY2hhcnMpOworCQl9CisKKwkvKiBPbmx5IHB1c2ggaWYgdG9wIGV4aXN0cy4gT3RoZXJ3aXNlLCByZXBsYWNlIHRvcC4gKi8KKwlpZiAoWVlfQ1VSUkVOVF9CVUZGRVIpCisJCSh5eV9idWZmZXJfc3RhY2tfdG9wKSsrOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisKKwkvKiBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworLyoqIFJlbW92ZXMgYW5kIGRlbGV0ZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIGlmIHByZXNlbnQuCisgKiAgVGhlIG5leHQgZWxlbWVudCBiZWNvbWVzIHRoZSBuZXcgdG9wLgorICogIAorICovCit2b2lkIHpjb25mcG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCkKK3sKKyAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKKwkJcmV0dXJuOworCisJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+IDApCisJCS0tKHl5X2J1ZmZlcl9zdGFja190b3ApOworCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7CisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7CisJfQorfQorCisvKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgorICovCitzdGF0aWMgdm9pZCB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQpCit7CisJaW50IG51bV90b19hbGxvYzsKKyAgICAKKwlpZiAoISh5eV9idWZmZXJfc3RhY2spKSB7CisKKwkJLyogRmlyc3QgYWxsb2NhdGlvbiBpcyBqdXN0IGZvciAyIGVsZW1lbnRzLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMKKwkJICogc2Nhbm5lciB3aWxsIGV2ZW4gbmVlZCBhIHN0YWNrLiBXZSB1c2UgMiBpbnN0ZWFkIG9mIDEgdG8gYXZvaWQgYW4KKwkJICogaW1tZWRpYXRlIHJlYWxsb2Mgb24gdGhlIG5leHQgY2FsbC4KKyAgICAgICAgICovCisJCW51bV90b19hbGxvYyA9IDE7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZmFsbG9jCisJCQkJCQkJCShudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisJCQorCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjayksIDAsIG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCQkJCQorCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJCSh5eV9idWZmZXJfc3RhY2tfdG9wKSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHl5X2J1ZmZlcl9zdGFja190b3ApID49ICgoeXlfYnVmZmVyX3N0YWNrX21heCkpIC0gMSl7CisKKwkJLyogSW5jcmVhc2UgdGhlIGJ1ZmZlciB0byBwcmVwYXJlIGZvciBhIHBvc3NpYmxlIHB1c2guICovCisJCWludCBncm93X3NpemUgPSA4IC8qIGFyYml0cmFyeSBncm93IHNpemUgKi87CisKKwkJbnVtX3RvX2FsbG9jID0gKHl5X2J1ZmZlcl9zdGFja19tYXgpICsgZ3Jvd19zaXplOworCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopemNvbmZyZWFsbG9jCisJCQkJCQkJCSgoeXlfYnVmZmVyX3N0YWNrKSwKKwkJCQkJCQkJbnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQkpOworCisJCS8qIHplcm8gb25seSB0aGUgbmV3IHNsb3RzLiovCisJCW1lbXNldCgoeXlfYnVmZmVyX3N0YWNrKSArICh5eV9idWZmZXJfc3RhY2tfbWF4KSwgMCwgZ3Jvd19zaXplICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKSk7CisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwl9Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gZGlyZWN0bHkgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNoYXJhY3RlciBidWZmZXIuCisgKiBAcGFyYW0gYmFzZSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICogQHBhcmFtIHNpemUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIAorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuIAorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKyAgICAKKwlpZiAoIHNpemUgPCAyIHx8CisJICAgICBiYXNlW3NpemUtMl0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSIHx8CisJICAgICBiYXNlW3NpemUtMV0gIT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkJLyogVGhleSBmb3Jnb3QgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIEVPQidzLiAqLworCQlyZXR1cm4gMDsKKworCWIgPSAoWVlfQlVGRkVSX1NUQVRFKSB6Y29uZmFsbG9jKHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZSAtIDI7CS8qICItIDIiIHRvIHRha2UgY2FyZSBvZiBFT0IncyAqLworCWItPnl5X2J1Zl9wb3MgPSBiLT55eV9jaF9idWYgPSBiYXNlOworCWItPnl5X2lzX291cl9idWZmZXIgPSAwOworCWItPnl5X2lucHV0X2ZpbGUgPSAwOworCWItPnl5X25fY2hhcnMgPSBiLT55eV9idWZfc2l6ZTsKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisJYi0+eXlfYXRfYm9sID0gMTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDA7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKGIgICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBhIHN0cmluZy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgc3RyLgorICogQHBhcmFtIHN0ciBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byBzY2FuCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICogQG5vdGUgSWYgeW91IHdhbnQgdG8gc2NhbiBieXRlcyB0aGF0IG1heSBjb250YWluIE5VTCB2YWx1ZXMsIHRoZW4gdXNlCisgKiAgICAgICB6Y29uZl9zY2FuX2J5dGVzKCkgaW5zdGVhZC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fc3RyaW5nICh5eWNvbnN0IGNoYXIgKiBzdHIgKQoreworICAgIAorCXJldHVybiB6Y29uZl9zY2FuX2J5dGVzKHN0cixzdHJsZW4oc3RyKSApOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCisgKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAgKHl5Y29uc3QgY2hhciAqIGJ5dGVzLCBpbnQgIGxlbiApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisJY2hhciAqYnVmOworCXl5X3NpemVfdCBuOworCWludCBpOworICAgIAorCS8qIEdldCBtZW1vcnkgZm9yIGZ1bGwgYnVmZmVyLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRyYWlsaW5nIEVPQidzLiAqLworCW4gPSBsZW4gKyAyOworCWJ1ZiA9IChjaGFyICopIHpjb25mYWxsb2MobiAgKTsKKwlpZiAoICEgYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOworCisJZm9yICggaSA9IDA7IGkgPCBsZW47ICsraSApCisJCWJ1ZltpXSA9IGJ5dGVzW2ldOworCisJYnVmW2xlbl0gPSBidWZbbGVuKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYiA9IHpjb25mX3NjYW5fYnVmZmVyKGJ1ZixuICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4gemNvbmZfc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7Cit9CisKKyNpZm5kZWYgWVlfRVhJVF9GQUlMVVJFCisjZGVmaW5lIFlZX0VYSVRfRkFJTFVSRSAyCisjZW5kaWYKKworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciogbXNnICkKK3sKKyAgICAJKHZvaWQpIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2cgKTsKKwlleGl0KCBZWV9FWElUX0ZBSUxVUkUgKTsKK30KKworLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCisKKyN1bmRlZiB5eWxlc3MKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQl6Y29uZnRleHRbemNvbmZsZW5nXSA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCSh5eV9jX2J1Zl9wKSA9IHpjb25mdGV4dCArIHl5bGVzc19tYWNyb19hcmc7IFwKKwkJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOyBcCisJCSooeXlfY19idWZfcCkgPSAnXDAnOyBcCisJCXpjb25mbGVuZyA9IHl5bGVzc19tYWNyb19hcmc7IFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworLyogQWNjZXNzb3IgIG1ldGhvZHMgKGdldC9zZXQgZnVuY3Rpb25zKSB0byBzdHJ1Y3QgbWVtYmVycy4gKi8KKworLyoqIEdldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIAorICovCitpbnQgemNvbmZnZXRfbGluZW5vICAodm9pZCkKK3sKKyAgICAgICAgCisgICAgcmV0dXJuIHpjb25mbGluZW5vOworfQorCisvKiogR2V0IHRoZSBpbnB1dCBzdHJlYW0uCisgKiAKKyAqLworRklMRSAqemNvbmZnZXRfaW4gICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZpbjsKK30KKworLyoqIEdldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqIAorICovCitGSUxFICp6Y29uZmdldF9vdXQgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZvdXQ7Cit9CisKKy8qKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbi4KKyAqIAorICovCitpbnQgemNvbmZnZXRfbGVuZyAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZmxlbmc7Cit9CisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgdG9rZW4uCisgKiAKKyAqLworCitjaGFyICp6Y29uZmdldF90ZXh0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mdGV4dDsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIEBwYXJhbSBsaW5lX251bWJlcgorICogCisgKi8KK3ZvaWQgemNvbmZzZXRfbGluZW5vIChpbnQgIGxpbmVfbnVtYmVyICkKK3sKKyAgICAKKyAgICB6Y29uZmxpbmVubyA9IGxpbmVfbnVtYmVyOworfQorCisvKiogU2V0IHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgZG9lcyBub3QgZGlzY2FyZCB0aGUgY3VycmVudAorICogaW5wdXQgYnVmZmVyLgorICogQHBhcmFtIGluX3N0ciBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIAorICogQHNlZSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgemNvbmZzZXRfaW4gKEZJTEUgKiAgaW5fc3RyICkKK3sKKyAgICAgICAgemNvbmZpbiA9IGluX3N0ciA7Cit9CisKK3ZvaWQgemNvbmZzZXRfb3V0IChGSUxFICogIG91dF9zdHIgKQoreworICAgICAgICB6Y29uZm91dCA9IG91dF9zdHIgOworfQorCitpbnQgemNvbmZnZXRfZGVidWcgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZfZmxleF9kZWJ1ZzsKK30KKwordm9pZCB6Y29uZnNldF9kZWJ1ZyAoaW50ICBiZGVidWcgKQoreworICAgICAgICB6Y29uZl9mbGV4X2RlYnVnID0gYmRlYnVnIDsKK30KKworLyogemNvbmZsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCitpbnQgemNvbmZsZXhfZGVzdHJveSAgKHZvaWQpCit7CisgICAgCisgICAgLyogUG9wIHRoZSBidWZmZXIgc3RhY2ssIGRlc3Ryb3lpbmcgZWFjaCBlbGVtZW50LiAqLworCXdoaWxlKFlZX0NVUlJFTlRfQlVGRkVSKXsKKwkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiAgKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gTlVMTDsKKwkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJfQorCisJLyogRGVzdHJveSB0aGUgc3RhY2sgaXRzZWxmLiAqLworCXpjb25mZnJlZSgoeXlfYnVmZmVyX3N0YWNrKSApOworCSh5eV9idWZmZXJfc3RhY2spID0gTlVMTDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogSW50ZXJuYWwgdXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfc3RybmNweSAoY2hhciogczEsIHl5Y29uc3QgY2hhciAqIHMyLCBpbnQgbiApCit7CisJcmVnaXN0ZXIgaW50IGk7CisgICAgCWZvciAoIGkgPSAwOyBpIDwgbjsgKytpICkKKwkJczFbaV0gPSBzMltpXTsKK30KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqIHMgKQoreworCXJlZ2lzdGVyIGludCBuOworICAgIAlmb3IgKCBuID0gMDsgc1tuXTsgKytuICkKKwkJOworCisJcmV0dXJuIG47Cit9CisjZW5kaWYKKwordm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICBzaXplICkKK3sKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7Cit9CisKK3ZvaWQgKnpjb25mcmVhbGxvYyAgKHZvaWQgKiBwdHIsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJLyogVGhlIGNhc3QgdG8gKGNoYXIgKikgaW4gdGhlIGZvbGxvd2luZyBhY2NvbW1vZGF0ZXMgYm90aAorCSAqIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSBjaGFyKiBnZW5lcmljIHBvaW50ZXJzLCBhbmQgdGhvc2UKKwkgKiB0aGF0IHVzZSB2b2lkKiBnZW5lcmljIHBvaW50ZXJzLiAgSXQgd29ya3Mgd2l0aCB0aGUgbGF0dGVyCisJICogYmVjYXVzZSBib3RoIEFOU0kgQyBhbmQgQysrIGFsbG93IGNhc3RsZXNzIGFzc2lnbm1lbnQgZnJvbQorCSAqIGFueSBwb2ludGVyIHR5cGUgdG8gdm9pZCosIGFuZCBkZWFsIHdpdGggYXJndW1lbnQgY29udmVyc2lvbnMKKwkgKiBhcyB0aG91Z2ggZG9pbmcgYW4gYXNzaWdubWVudC4KKwkgKi8KKwlyZXR1cm4gKHZvaWQgKikgcmVhbGxvYyggKGNoYXIgKikgcHRyLCBzaXplICk7Cit9CisKK3ZvaWQgemNvbmZmcmVlICh2b2lkICogcHRyICkKK3sKKwlmcmVlKCAoY2hhciAqKSBwdHIgKTsJLyogc2VlIHpjb25mcmVhbGxvYygpIGZvciAoY2hhciAqKSBjYXN0ICovCit9CisKKyNkZWZpbmUgWVlUQUJMRVNfTkFNRSAieXl0YWJsZXMiCisKKyN1bmRlZiBZWV9ORVdfRklMRQorI3VuZGVmIFlZX0ZMVVNIX0JVRkZFUgorI3VuZGVmIHl5X3NldF9ib2wKKyN1bmRlZiB5eV9uZXdfYnVmZmVyCisjdW5kZWYgeXlfc2V0X2ludGVyYWN0aXZlCisjdW5kZWYgeXl0ZXh0X3B0cgorI3VuZGVmIFlZX0RPX0JFRk9SRV9BQ1RJT04KKworI2lmZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0xfSVNfT1VSUworI3VuZGVmIFlZX0RFQ0wKKyNlbmRpZgorCit2b2lkIHpjb25mX3N0YXJ0aGVscCh2b2lkKQoreworCW5ld19zdHJpbmcoKTsKKwlsYXN0X3RzID0gZmlyc3RfdHMgPSAwOworCUJFR0lOKEhFTFApOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRoZWxwKHZvaWQpCit7CisJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJQkVHSU4oSU5JVElBTCk7Cit9CisKKy8qCisgKiBUcnkgdG8gb3BlbiBzcGVjaWZpZWQgZmlsZSB3aXRoIGZvbGxvd2luZyBuYW1lczoKKyAqIC4vbmFtZQorICogJChzcmN0cmVlKS9uYW1lCisgKiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbiBzcmN0cmVlIGlzIHNlcGFyYXRlIGZyb20gb2JqdHJlZQorICogd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbC4KKyAqIFJldHVybiBOVUxMIGlmIGZpbGUgaXMgbm90IGZvdW5kLgorICovCitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmVudiwgZnVsbG5hbWVbUEFUSF9NQVgrMV07CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihuYW1lLCAiciIpOworCWlmICghZiAmJiBuYW1lWzBdICE9ICcvJykgeworCQllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJCWlmIChlbnYpIHsKKwkJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCQlmID0gZm9wZW4oZnVsbG5hbWUsICJyIik7CisJCX0KKwl9CisJcmV0dXJuIGY7Cit9CisKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl6Y29uZmluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF6Y29uZmluKSB7CisJCXByaW50ZigiY2FuJ3QgZmluZCBmaWxlICVzXG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwljdXJyZW50X2J1ZiA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisJbWVtc2V0KGN1cnJlbnRfYnVmLCAwLCBzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisKKwljdXJyZW50X2ZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwljdXJyZW50X2ZpbGUtPmxpbmVubyA9IDE7CisJY3VycmVudF9maWxlLT5mbGFncyA9IEZJTEVfQlVTWTsKK30KKwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gbWFsbG9jKHNpemVvZigqYnVmKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKworCWN1cnJlbnRfYnVmLT5zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCXpjb25maW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCIlczolZDogY2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXpjb25mX3N3aXRjaF90b19idWZmZXIoemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFKSk7CisJYnVmLT5wYXJlbnQgPSBjdXJyZW50X2J1ZjsKKwljdXJyZW50X2J1ZiA9IGJ1ZjsKKworCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfQlVTWSkgeworCQlwcmludGYoInJlY3Vyc2l2ZSBzY2FuICglcyk/XG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9TQ0FOTkVEKSB7CisJCXByaW50ZigiZmlsZSAlcyBhbHJlYWR5IHNjYW5uZWQ/XG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJZmlsZS0+ZmxhZ3MgfD0gRklMRV9CVVNZOworCWZpbGUtPmxpbmVubyA9IDE7CisJZmlsZS0+cGFyZW50ID0gY3VycmVudF9maWxlOworCWN1cnJlbnRfZmlsZSA9IGZpbGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICp6Y29uZl9lbmRmaWxlKHZvaWQpCit7CisJc3RydWN0IGJ1ZmZlciAqcGFyZW50OworCisJY3VycmVudF9maWxlLT5mbGFncyB8PSBGSUxFX1NDQU5ORUQ7CisJY3VycmVudF9maWxlLT5mbGFncyAmPSB+RklMRV9CVVNZOworCWN1cnJlbnRfZmlsZSA9IGN1cnJlbnRfZmlsZS0+cGFyZW50OworCisJcGFyZW50ID0gY3VycmVudF9idWYtPnBhcmVudDsKKwlpZiAocGFyZW50KSB7CisJCWZjbG9zZSh6Y29uZmluKTsKKwkJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUik7CisJCXpjb25mX3N3aXRjaF90b19idWZmZXIocGFyZW50LT5zdGF0ZSk7CisJfQorCWZyZWUoY3VycmVudF9idWYpOworCWN1cnJlbnRfYnVmID0gcGFyZW50OworCisJcmV0dXJuIHBhcmVudDsKK30KKworaW50IHpjb25mX2xpbmVubyh2b2lkKQoreworCWlmIChjdXJyZW50X2J1ZikKKwkJcmV0dXJuIGN1cnJlbnRfZmlsZS0+bGluZW5vIC0gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpCit7CisJaWYgKGN1cnJlbnRfYnVmKQorCQlyZXR1cm4gY3VycmVudF9maWxlLT5uYW1lOworCWVsc2UKKwkJcmV0dXJuICI8bm9uZT4iOworfQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjLmggYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhNjdmYwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpZm5kZWYgTEtDX0gKKyNkZWZpbmUgTEtDX0gKKworI2luY2x1ZGUgImV4cHIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgTEtDX0RJUkVDVF9MSU5LCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgbmFtZSBhcmcKKyNlbHNlCisjaW5jbHVkZSAibGtjX2RlZnMuaCIKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSAoKm5hbWUgIyMgX3ApIGFyZworI2VuZGlmCisjaW5jbHVkZSAibGtjX3Byb3RvLmgiCisjdW5kZWYgUAorCisjZGVmaW5lIFNSQ1RSRUUgInNyY3RyZWUiCisKK2ludCB6Y29uZnBhcnNlKHZvaWQpOwordm9pZCB6Y29uZmR1bXAoRklMRSAqb3V0KTsKKworZXh0ZXJuIGludCB6Y29uZmRlYnVnOwordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCk7CitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHpjb25mX25leHRmaWxlKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHpjb25mX2xpbmVubyh2b2lkKTsKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCk7CisKKy8qIGNvbmZkYXRhLmMgKi8KK2V4dGVybiBjb25zdCBjaGFyIGNvbmZfZGVmX2ZpbGVuYW1lW107CitleHRlcm4gY2hhciBjb25mX2ZpbGVuYW1lW107CisKK2NoYXIgKmNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUodm9pZCk7CisKKy8qIGtjb25maWdfbG9hZC5jICovCit2b2lkIGtjb25maWdfbG9hZCh2b2lkKTsKKworLyogbWVudS5jICovCit2b2lkIG1lbnVfaW5pdCh2b2lkKTsKK3ZvaWQgbWVudV9hZGRfbWVudSh2b2lkKTsKK3ZvaWQgbWVudV9lbmRfbWVudSh2b2lkKTsKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3ZvaWQgbWVudV9lbmRfZW50cnkodm9pZCk7Cit2b2lkIG1lbnVfYWRkX2RlcChzdHJ1Y3QgZXhwciAqZGVwKTsKK3N0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvcChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9hZGRfcHJvbXB0KGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2FkZF9zeW1ib2woZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9maW5hbGl6ZShzdHJ1Y3QgbWVudSAqcGFyZW50KTsKK3ZvaWQgbWVudV9zZXRfdHlwZShpbnQgdHlwZSk7CisKKy8qIHV0aWwuYyAqLworc3RydWN0IGZpbGUgKmZpbGVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGZpbGVfd3JpdGVfZGVwKGNvbnN0IGNoYXIgKm5hbWUpOworCitzdHJ1Y3QgZ3N0ciB7CisJc2l6ZV90IGxlbjsKKwljaGFyICAqczsKK307CitzdHJ1Y3QgZ3N0ciBzdHJfbmV3KHZvaWQpOworc3RydWN0IGdzdHIgc3RyX2Fzc2lnbihjb25zdCBjaGFyICpzKTsKK3ZvaWQgc3RyX2ZyZWUoc3RydWN0IGdzdHIgKmdzKTsKK3ZvaWQgc3RyX2FwcGVuZChzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKnMpOwordm9pZCBzdHJfcHJpbnRmKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqZm10LCAuLi4pOworY29uc3QgY2hhciAqc3RyX2dldChzdHJ1Y3QgZ3N0ciAqZ3MpOworCisvKiBzeW1ib2wuYyAqLwordm9pZCBzeW1faW5pdCh2b2lkKTsKK3ZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKTsKK3ZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZGVwcyhzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHByb3BlcnR5ICpwcm9wX2FsbG9jKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3Qgc3ltYm9sICpwcm9wX2dldF9zeW1ib2woc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKKworc3RhdGljIGlubGluZSB0cmlzdGF0ZSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5jdXJyLnRyaTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeW1ib2wgKnN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzeW1ib2wgKilzeW0tPmN1cnIudmFsOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX3NldF9jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqY2gsIHN0cnVjdCBzeW1ib2wgKmNodmFsKQoreworCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKGNodmFsLCB5ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX2Nob2ljZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFVkFMID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX29wdGlvbmFsKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9PUFRJT05BTCA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9oYXNfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX05FVyA/IGZhbHNlIDogdHJ1ZTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExLQ19IICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmggYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjNmQwYwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaApAQCAtMCwwICsxLDQwIEBACisKKy8qIGNvbmZkYXRhLmMgKi8KK1AoY29uZl9wYXJzZSx2b2lkLChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfcmVhZCxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl93cml0ZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKKworLyogbWVudS5jICovCitQKHJvb3RtZW51LHN0cnVjdCBtZW51LCk7CisKK1AobWVudV9pc192aXNpYmxlLGJvb2wsKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3Byb21wdCxjb25zdCBjaGFyICosKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3Jvb3RfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9wYXJlbnRfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworCisvKiBzeW1ib2wuYyAqLworUChzeW1ib2xfaGFzaCxzdHJ1Y3Qgc3ltYm9sICosW1NZTUJPTF9IQVNIU0laRV0pOworUChzeW1fY2hhbmdlX2NvdW50LGludCwpOworCitQKHN5bV9sb29rdXAsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lLCBpbnQgaXNjb25zdCkpOworUChzeW1fZmluZCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1Aoc3ltX3JlX3NlYXJjaCxzdHJ1Y3Qgc3ltYm9sICoqLChjb25zdCBjaGFyICpwYXR0ZXJuKSk7CitQKHN5bV90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHN5bWJvbF90eXBlIHR5cGUpKTsKK1Aoc3ltX2NhbGNfdmFsdWUsdm9pZCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfdHlwZSxlbnVtIHN5bWJvbF90eXBlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sdHJpc3RhdGUgdHJpKSk7CitQKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSkpOworUChzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlLHRyaXN0YXRlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX3N0cmluZ192YWxpZCxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOworUChzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikpOworUChzeW1fc2V0X3N0cmluZ192YWx1ZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOworUChzeW1faXNfY2hhbmdhYmxlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X2Nob2ljZV9wcm9wLHN0cnVjdCBwcm9wZXJ0eSAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9kZWZhdWx0X3Byb3Asc3RydWN0IHByb3BlcnR5ICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X3N0cmluZ192YWx1ZSxjb25zdCBjaGFyICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworCitQKHByb3BfZ2V0X3R5cGVfbmFtZSxjb25zdCBjaGFyICosKGVudW0gcHJvcF90eXBlIHR5cGUpKTsKKworLyogZXhwci5jICovCitQKGV4cHJfY29tcGFyZV90eXBlLGludCwoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKSk7CitQKGV4cHJfcHJpbnQsdm9pZCwoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGQzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMCwwICsxLDEwOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqCisgKiBJbnRyb2R1Y2VkIHNpbmdsZSBtZW51IG1vZGUgKHNob3cgYWxsIHN1Yi1tZW51cyBpbiBvbmUgbGFyZ2UgdHJlZSkuCisgKiAyMDAyLTExLTA2IFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisgKi8KKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdGF0aWMgY2hhciBtZW51X2JhY2t0aXRsZVsxMjhdOworc3RhdGljIGNvbnN0IGNoYXIgbWNvbmZfcmVhZG1lW10gPQorIk92ZXJ2aWV3XG4iCisiLS0tLS0tLS1cbiIKKyJTb21lIGtlcm5lbCBmZWF0dXJlcyBtYXkgYmUgYnVpbHQgZGlyZWN0bHkgaW50byB0aGUga2VybmVsLlxuIgorIlNvbWUgbWF5IGJlIG1hZGUgaW50byBsb2FkYWJsZSBydW50aW1lIG1vZHVsZXMuICBTb21lIGZlYXR1cmVzXG4iCisibWF5IGJlIGNvbXBsZXRlbHkgcmVtb3ZlZCBhbHRvZ2V0aGVyLiAgVGhlcmUgYXJlIGFsc28gY2VydGFpblxuIgorImtlcm5lbCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBub3QgcmVhbGx5IGZlYXR1cmVzLCBidXQgbXVzdCBiZVxuIgorImVudGVyZWQgaW4gYXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCBudW1iZXJzIG9yIHBvc3NpYmx5IHRleHQuXG4iCisiXG4iCisiTWVudSBpdGVtcyBiZWdpbm5pbmcgd2l0aCBbKl0sIDxNPiBvciBbIF0gcmVwcmVzZW50IGZlYXR1cmVzXG4iCisiY29uZmlndXJlZCB0byBiZSBidWlsdCBpbiwgbW9kdWxhcml6ZWQgb3IgcmVtb3ZlZCByZXNwZWN0aXZlbHkuXG4iCisiUG9pbnRlZCBicmFja2V0cyA8PiByZXByZXNlbnQgbW9kdWxlIGNhcGFibGUgZmVhdHVyZXMuXG4iCisiXG4iCisiVG8gY2hhbmdlIGFueSBvZiB0aGVzZSBmZWF0dXJlcywgaGlnaGxpZ2h0IGl0IHdpdGggdGhlIGN1cnNvclxuIgorImtleXMgYW5kIHByZXNzIDxZPiB0byBidWlsZCBpdCBpbiwgPE0+IHRvIG1ha2UgaXQgYSBtb2R1bGUgb3JcbiIKKyI8Tj4gdG8gcmVtb3ZlZCBpdC4gIFlvdSBtYXkgYWxzbyBwcmVzcyB0aGUgPFNwYWNlIEJhcj4gdG8gY3ljbGVcbiIKKyJ0aHJvdWdoIHRoZSBhdmFpbGFibGUgb3B0aW9ucyAoaWUuIFktPk4tPk0tPlkpLlxuIgorIlxuIgorIlNvbWUgYWRkaXRpb25hbCBrZXlib2FyZCBoaW50czpcbiIKKyJcbiIKKyJNZW51c1xuIgorIi0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIFVwL0Rvd24gYXJyb3cga2V5cyAoY3Vyc29yIGtleXMpIHRvIGhpZ2hsaWdodCB0aGUgaXRlbVxuIgorIiAgIHlvdSB3aXNoIHRvIGNoYW5nZSBvciBzdWJtZW51IHdpc2ggdG8gc2VsZWN0IGFuZCBwcmVzcyA8RW50ZXI+LlxuIgorIiAgIFN1Ym1lbnVzIGFyZSBkZXNpZ25hdGVkIGJ5IFwiLS0tPlwiLlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgb3B0aW9uJ3MgaGlnaGxpZ2h0ZWQgbGV0dGVyIChob3RrZXkpLlxuIgorIiAgICAgICAgICAgICBQcmVzc2luZyBhIGhvdGtleSBtb3JlIHRoYW4gb25jZSB3aWxsIHNlcXVlbmNlXG4iCisiICAgICAgICAgICAgIHRocm91Z2ggYWxsIHZpc2libGUgaXRlbXMgd2hpY2ggdXNlIHRoYXQgaG90a2V5LlxuIgorIlxuIgorIiAgIFlvdSBtYXkgYWxzbyB1c2UgdGhlIDxQQUdFIFVQPiBhbmQgPFBBR0UgRE9XTj4ga2V5cyB0byBzY3JvbGxcbiIKKyIgICB1bnNlZW4gb3B0aW9ucyBpbnRvIHZpZXcuXG4iCisiXG4iCisibyAgVG8gZXhpdCBhIG1lbnUgdXNlIHRoZSBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgdGhlIDxFeGl0PiBidXR0b25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEVTQz48RVNDPiBvciA8RT4gb3IgPFg+IGlmIHRoZXJlIGlzIG5vIGhvdGtleVxuIgorIiAgICAgICAgICAgICB1c2luZyB0aG9zZSBsZXR0ZXJzLiAgWW91IG1heSBwcmVzcyBhIHNpbmdsZSA8RVNDPiwgYnV0XG4iCisiICAgICAgICAgICAgIHRoZXJlIGlzIGEgZGVsYXllZCByZXNwb25zZSB3aGljaCB5b3UgbWF5IGZpbmQgYW5ub3lpbmcuXG4iCisiXG4iCisiICAgQWxzbywgdGhlIDxUQUI+IGFuZCBjdXJzb3Iga2V5cyB3aWxsIGN5Y2xlIGJldHdlZW4gPFNlbGVjdD4sXG4iCisiICAgPEV4aXQ+IGFuZCA8SGVscD5cbiIKKyJcbiIKKyJvICBUbyBnZXQgaGVscCB3aXRoIGFuIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IDxIZWxwPlxuIgorIiAgIGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIlxuIgorIlJhZGlvbGlzdHMgIChDaG9pY2UgbGlzdHMpXG4iCisiLS0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIGN1cnNvciBrZXlzIHRvIHNlbGVjdCB0aGUgb3B0aW9uIHlvdSB3aXNoIHRvIHNldCBhbmQgcHJlc3NcbiIKKyIgICA8Uz4gb3IgdGhlIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBvcHRpb24geW91IHdpc2ggdG8gc2V0IHRoZW5cbiIKKyIgICAgICAgICAgICAgcHJlc3MgPFM+IG9yIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIm8gIFRvIHNlZSBhdmFpbGFibGUgaGVscCBmb3IgdGhlIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0XG4iCisiICAgPEhlbHA+IGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIiAgIEFsc28sIHRoZSA8VEFCPiBhbmQgY3Vyc29yIGtleXMgd2lsbCBjeWNsZSBiZXR3ZWVuIDxTZWxlY3Q+IGFuZFxuIgorIiAgIDxIZWxwPlxuIgorIlxuIgorIlxuIgorIkRhdGEgRW50cnlcbiIKKyItLS0tLS0tLS0tLVxuIgorIm8gIEVudGVyIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gYW5kIHByZXNzIDxFTlRFUj5cbiIKKyIgICBJZiB5b3UgYXJlIGVudGVyaW5nIGhleGFkZWNpbWFsIHZhbHVlcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0b1xuIgorIiAgIGFkZCB0aGUgJzB4JyBwcmVmaXggdG8gdGhlIGVudHJ5LlxuIgorIlxuIgorIm8gIEZvciBoZWxwLCB1c2UgdGhlIDxUQUI+IG9yIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCB0aGUgaGVscCBvcHRpb25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi4gIFlvdSBjYW4gdHJ5IDxUQUI+PEg+IGFzIHdlbGwuXG4iCisiXG4iCisiXG4iCisiVGV4dCBCb3ggICAgKEhlbHAgV2luZG93KVxuIgorIi0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBjdXJzb3Iga2V5cyB0byBzY3JvbGwgdXAvZG93bi9sZWZ0L3JpZ2h0LiAgVGhlIFZJIGVkaXRvclxuIgorIiAgIGtleXMgaCxqLGssbCBmdW5jdGlvbiBoZXJlIGFzIGRvIDxTUEFDRSBCQVI+IGFuZCA8Qj4gZm9yIHRob3NlXG4iCisiICAgd2hvIGFyZSBmYW1pbGlhciB3aXRoIGxlc3MgYW5kIGx5bnguXG4iCisiXG4iCisibyAgUHJlc3MgPEU+LCA8WD4sIDxFbnRlcj4gb3IgPEVzYz48RXNjPiB0byBleGl0LlxuIgorIlxuIgorIlxuIgorIkFsdGVybmF0ZSBDb25maWd1cmF0aW9uIEZpbGVzXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJNZW51Y29uZmlnIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yXG4iCisidGhvc2Ugd2hvLCBmb3IgdmFyaW91cyByZWFzb25zLCBmaW5kIGl0IG5lY2Vzc2FyeSB0byBzd2l0Y2hcbiIKKyJiZXR3ZWVuIGRpZmZlcmVudCBrZXJuZWwgY29uZmlndXJhdGlvbnMuXG4iCisiXG4iCisiQXQgdGhlIGVuZCBvZiB0aGUgbWFpbiBtZW51IHlvdSB3aWxsIGZpbmQgdHdvIG9wdGlvbnMuICBPbmUgaXNcbiIKKyJmb3Igc2F2aW5nIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSBmaWxlIG9mIHlvdXIgY2hvb3NpbmcuXG4iCisiVGhlIG90aGVyIG9wdGlvbiBpcyBmb3IgbG9hZGluZyBhIHByZXZpb3VzbHkgc2F2ZWQgYWx0ZXJuYXRlXG4iCisiY29uZmlndXJhdGlvbi5cbiIKKyJcbiIKKyJFdmVuIGlmIHlvdSBkb24ndCB1c2UgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGJ1dCB5b3VcbiIKKyJmaW5kIGR1cmluZyBhIE1lbnVjb25maWcgc2Vzc2lvbiB0aGF0IHlvdSBoYXZlIGNvbXBsZXRlbHkgbWVzc2VkXG4iCisidXAgeW91ciBzZXR0aW5ncywgeW91IG1heSB1c2UgdGhlIFwiTG9hZCBBbHRlcm5hdGUuLi5cIiBvcHRpb24gdG9cbiIKKyJyZXN0b3JlIHlvdXIgcHJldmlvdXNseSBzYXZlZCBzZXR0aW5ncyBmcm9tIFwiLmNvbmZpZ1wiIHdpdGhvdXRcbiIKKyJyZXN0YXJ0aW5nIE1lbnVjb25maWcuXG4iCisiXG4iCisiT3RoZXIgaW5mb3JtYXRpb25cbiIKKyItLS0tLS0tLS0tLS0tLS0tLVxuIgorIklmIHlvdSB1c2UgTWVudWNvbmZpZyBpbiBhbiBYVEVSTSB3aW5kb3cgbWFrZSBzdXJlIHlvdSBoYXZlIHlvdXJcbiIKKyIkVEVSTSB2YXJpYWJsZSBzZXQgdG8gcG9pbnQgdG8gYSB4dGVybSBkZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIGNvbG9yLlxuIgorIk90aGVyd2lzZSwgTWVudWNvbmZpZyB3aWxsIGxvb2sgcmF0aGVyIGJhZC4gIE1lbnVjb25maWcgd2lsbCBub3RcbiIKKyJkaXNwbGF5IGNvcnJlY3RseSBpbiBhIFJYVlQgd2luZG93IGJlY2F1c2Ugcnh2dCBkaXNwbGF5cyBvbmx5IG9uZVxuIgorImludGVuc2l0eSBvZiBjb2xvciwgYnJpZ2h0LlxuIgorIlxuIgorIk1lbnVjb25maWcgd2lsbCBkaXNwbGF5IGxhcmdlciBtZW51cyBvbiBzY3JlZW5zIG9yIHh0ZXJtcyB3aGljaCBhcmVcbiIKKyJzZXQgdG8gZGlzcGxheSBtb3JlIHRoYW4gdGhlIHN0YW5kYXJkIDI1IHJvdyBieSA4MCBjb2x1bW4gZ2VvbWV0cnkuXG4iCisiSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywgdGhlIFwic3R0eSBzaXplXCIgY29tbWFuZCBtdXN0IGJlIGFibGUgdG9cbiIKKyJkaXNwbGF5IHRoZSBzY3JlZW4ncyBjdXJyZW50IHJvdyBhbmQgY29sdW1uIGdlb21ldHJ5LiAgSSBTVFJPTkdMWVxuIgorIlJFQ09NTUVORCB0aGF0IHlvdSBtYWtlIHN1cmUgeW91IGRvIE5PVCBoYXZlIHRoZSBzaGVsbCB2YXJpYWJsZXNcbiIKKyJMSU5FUyBhbmQgQ09MVU1OUyBleHBvcnRlZCBpbnRvIHlvdXIgZW52aXJvbm1lbnQuICBTb21lIGRpc3RyaWJ1dGlvbnNcbiIKKyJleHBvcnQgdGhvc2UgdmFyaWFibGVzIHZpYSAvZXRjL3Byb2ZpbGUuICBTb21lIG5jdXJzZXMgcHJvZ3JhbXMgY2FuXG4iCisiYmVjb21lIGNvbmZ1c2VkIHdoZW4gdGhvc2UgdmFyaWFibGVzIChMSU5FUyAmIENPTFVNTlMpIGRvbid0IHJlZmxlY3RcbiIKKyJ0aGUgdHJ1ZSBzY3JlZW4gc2l6ZS5cbiIKKyJcbiIKKyJPcHRpb25hbCBwZXJzb25hbGl0eSBhdmFpbGFibGVcbiIKKyItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIG9mIHRoZSBrZXJuZWwgb3B0aW9ucyBsaXN0ZWQgaW4gYSBzaW5nbGVcbiIKKyJtZW51LCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBtdWx0aW1lbnUgaGllcmFyY2h5LCBydW4gdGhlIG1lbnVjb25maWdcbiIKKyJ3aXRoIE1FTlVDT05GSUdfTU9ERSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgdG8gc2luZ2xlX21lbnUuIEV4YW1wbGU6XG4iCisiXG4iCisibWFrZSBNRU5VQ09ORklHX01PREU9c2luZ2xlX21lbnUgbWVudWNvbmZpZ1xuIgorIlxuIgorIjxFbnRlcj4gd2lsbCB0aGVuIHVucm9sbCB0aGUgYXBwcm9wcmlhdGUgY2F0ZWdvcnksIG9yIGVuZm9sZCBpdCBpZiBpdFxuIgorImlzIGFscmVhZHkgdW5yb2xsZWQuXG4iCisiXG4iCisiTm90ZSB0aGF0IHRoaXMgbW9kZSBjYW4gZXZlbnR1YWxseSBiZSBhIGxpdHRsZSBtb3JlIENQVSBleHBlbnNpdmVcbiIKKyIoZXNwZWNpYWxseSB3aXRoIGEgbGFyZ2VyIG51bWJlciBvZiB1bnJvbGxlZCBjYXRlZ29yaWVzKSB0aGFuIHRoZVxuIgorImRlZmF1bHQgbW9kZS5cbiIsCittZW51X2luc3RydWN0aW9uc1tdID0KKwkiQXJyb3cga2V5cyBuYXZpZ2F0ZSB0aGUgbWVudS4gICIKKwkiPEVudGVyPiBzZWxlY3RzIHN1Ym1lbnVzIC0tLT4uICAiCisJIkhpZ2hsaWdodGVkIGxldHRlcnMgYXJlIGhvdGtleXMuICAiCisJIlByZXNzaW5nIDxZPiBpbmNsdWRlcywgPE4+IGV4Y2x1ZGVzLCA8TT4gbW9kdWxhcml6ZXMgZmVhdHVyZXMuICAiCisJIlByZXNzIDxFc2M+PEVzYz4gdG8gZXhpdCwgPD8+IGZvciBIZWxwLCA8Lz4gZm9yIFNlYXJjaC4gICIKKwkiTGVnZW5kOiBbKl0gYnVpbHQtaW4gIFsgXSBleGNsdWRlZCAgPE0+IG1vZHVsZSAgPCA+IG1vZHVsZSBjYXBhYmxlIiwKK3JhZGlvbGlzdF9pbnN0cnVjdGlvbnNbXSA9CisJIlVzZSB0aGUgYXJyb3cga2V5cyB0byBuYXZpZ2F0ZSB0aGlzIHdpbmRvdyBvciAiCisJInByZXNzIHRoZSBob3RrZXkgb2YgdGhlIGl0ZW0geW91IHdpc2ggdG8gc2VsZWN0ICIKKwkiZm9sbG93ZWQgYnkgdGhlIDxTUEFDRSBCQVI+LiAiCisJIlByZXNzIDw/PiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4iLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludFtdID0KKwkiUGxlYXNlIGVudGVyIGEgZGVjaW1hbCB2YWx1ZS4gIgorCSJGcmFjdGlvbnMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuICAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiwKK2lucHV0Ym94X2luc3RydWN0aW9uc19oZXhbXSA9CisJIlBsZWFzZSBlbnRlciBhIGhleGFkZWNpbWFsIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiwKK2lucHV0Ym94X2luc3RydWN0aW9uc19zdHJpbmdbXSA9CisJIlBsZWFzZSBlbnRlciBhIHN0cmluZyB2YWx1ZS4gIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIsCitzZXRtb2RfdGV4dFtdID0KKwkiVGhpcyBmZWF0dXJlIGRlcGVuZHMgb24gYW5vdGhlciB3aGljaCBoYXMgYmVlbiBjb25maWd1cmVkIGFzIGEgbW9kdWxlLlxuIgorCSJBcyBhIHJlc3VsdCwgdGhpcyBmZWF0dXJlIHdpbGwgYmUgYnVpbHQgYXMgYSBtb2R1bGUuIiwKK25vaGVscF90ZXh0W10gPQorCSJUaGVyZSBpcyBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBrZXJuZWwgb3B0aW9uLlxuIiwKK2xvYWRfY29uZmlnX3RleHRbXSA9CisJIkVudGVyIHRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgeW91IHdpc2ggdG8gbG9hZC4gICIKKwkiQWNjZXB0IHRoZSBuYW1lIHNob3duIHRvIHJlc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24geW91ICIKKwkibGFzdCByZXRyaWV2ZWQuICBMZWF2ZSBibGFuayB0byBhYm9ydC4iLAorbG9hZF9jb25maWdfaGVscFtdID0KKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIHNldmVyYWwgZGlmZmVyZW50IGtlcm5lbFxuIgorCSJjb25maWd1cmF0aW9ucyBhdmFpbGFibGUgb24gYSBzaW5nbGUgbWFjaGluZS5cbiIKKwkiXG4iCisJIklmIHlvdSBoYXZlIHNhdmVkIGEgcHJldmlvdXMgY29uZmlndXJhdGlvbiBpbiBhIGZpbGUgb3RoZXIgdGhhbiB0aGVcbiIKKwkia2VybmVsJ3MgZGVmYXVsdCwgZW50ZXJpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaGVyZSB3aWxsIGFsbG93IHlvdVxuIgorCSJ0byBtb2RpZnkgdGhhdCBjb25maWd1cmF0aW9uLlxuIgorCSJcbiIKKwkiSWYgeW91IGFyZSB1bmNlcnRhaW4sIHRoZW4geW91IGhhdmUgcHJvYmFibHkgbmV2ZXIgdXNlZCBhbHRlcm5hdGVcbiIKKwkiY29uZmlndXJhdGlvbiBmaWxlcy4gIFlvdSBzaG91bGQgdGhlcmVmb3IgbGVhdmUgdGhpcyBibGFuayB0byBhYm9ydC5cbiIsCitzYXZlX2NvbmZpZ190ZXh0W10gPQorCSJFbnRlciBhIGZpbGVuYW1lIHRvIHdoaWNoIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2F2ZWQgIgorCSJhcyBhbiBhbHRlcm5hdGUuICBMZWF2ZSBibGFuayB0byBhYm9ydC4iLAorc2F2ZV9jb25maWdfaGVscFtdID0KKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIGRpZmZlcmVudCBrZXJuZWxcbiIKKwkiY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIG9uIGEgc2luZ2xlIG1hY2hpbmUuXG4iCisJIlxuIgorCSJFbnRlcmluZyBhIGZpbGUgbmFtZSBoZXJlIHdpbGwgYWxsb3cgeW91IHRvIGxhdGVyIHJldHJpZXZlLCBtb2RpZnlcbiIKKwkiYW5kIHVzZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFzIGFuIGFsdGVybmF0ZSB0byB3aGF0ZXZlclxuIgorCSJjb25maWd1cmF0aW9uIG9wdGlvbnMgeW91IGhhdmUgc2VsZWN0ZWQgYXQgdGhhdCB0aW1lLlxuIgorCSJcbiIKKwkiSWYgeW91IGFyZSB1bmNlcnRhaW4gd2hhdCBhbGwgdGhpcyBtZWFucyB0aGVuIHlvdSBzaG91bGQgcHJvYmFibHlcbiIKKwkibGVhdmUgdGhpcyBibGFuay5cbiIsCitzZWFyY2hfaGVscFtdID0KKwkiXG4iCisJIlNlYXJjaCBmb3IgQ09ORklHXyBzeW1ib2xzIGFuZCBkaXNwbGF5IHRoZWlyIHJlbGF0aW9ucy5cbiIKKwkiRXhhbXBsZTogc2VhcmNoIGZvciBcIl5GT09cIlxuIgorCSJSZXN1bHQ6XG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIlN5bWJvbDogRk9PIFs9bV1cbiIKKwkiUHJvbXB0OiBGb28gYnVzIGlzIHVzZWQgdG8gZHJpdmUgdGhlIGJhciBIV1xuIgorCSJEZWZpbmVkIGF0IGRyaXZlcnMvcGNpL0tjb25maWc6NDdcbiIKKwkiRGVwZW5kcyBvbjogWDg2X0xPQ0FMX0FQSUMgJiYgWDg2X0lPX0FQSUMgfHwgSUE2NFxuIgorCSJMb2NhdGlvbjpcbiIKKwkiICAtPiBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKVxuIgorCSIgICAgLT4gUENJIHN1cHBvcnQgKFBDSSBbPXldKVxuIgorCSIgICAgICAtPiBQQ0kgYWNjZXNzIG1vZGUgKDxjaG9pY2U+IFs9eV0pXG4iCisJIlNlbGVjdHM6IExJQkNSQzMyXG4iCisJIlNlbGVjdGVkIGJ5OiBCQVJcbiIKKwkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkibyBUaGUgbGluZSAnUHJvbXB0Oicgc2hvd3MgdGhlIHRleHQgdXNlZCBpbiB0aGUgbWVudSBzdHJ1Y3R1cmUgZm9yXG4iCisJIiAgdGhpcyBDT05GSUdfIHN5bWJvbFxuIgorCSJvIFRoZSAnRGVmaW5lZCBhdCcgbGluZSB0ZWxsIGF0IHdoYXQgZmlsZSAvIGxpbmUgbnVtYmVyIHRoZSBzeW1ib2xcbiIKKwkiICBpcyBkZWZpbmVkXG4iCisJIm8gVGhlICdEZXBlbmRzIG9uOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9scyBuZWVkcyB0byBiZSBkZWZpbmVkIGZvclxuIgorCSIgIHRoaXMgc3ltYm9sIHRvIGJlIHZpc2libGUgaW4gdGhlIG1lbnUgKHNlbGVjdGFibGUpXG4iCisJIm8gVGhlICdMb2NhdGlvbjonIGxpbmVzIHRlbGwgd2hlcmUgaW4gdGhlIG1lbnUgc3RydWN0dXJlIHRoaXMgc3ltYm9sXG4iCisJIiAgaXMgbG9jYXRlZFxuIgorCSIgICAgQSBsb2NhdGlvbiBmb2xsb3dlZCBieSBhIFs9eV0gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgc2VsZWN0YWJsZVxuIgorCSIgICAgbWVudSBpdGVtIC0gYW5kIGN1cnJlbnQgdmFsdWUgaXMgZGlzcGxheWVkIGluc2lkZSBicmFja2V0cy5cbiIKKwkibyBUaGUgJ1NlbGVjdHM6JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4iCisJIiAgc2VsZWN0ZWQgaWYgdGhpcyBzeW1ib2wgaXMgc2VsZWN0ZWQgKHkgb3IgbSlcbiIKKwkibyBUaGUgJ1NlbGVjdGVkIGJ5JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgaGFzIHNlbGVjdGVkIHRoaXMgc3ltYm9sXG4iCisJIlxuIgorCSJPbmx5IHJlbGV2YW50IGxpbmVzIGFyZSBzaG93bi5cbiIKKwkiXG5cbiIKKwkiU2VhcmNoIGV4YW1wbGVzOlxuIgorCSJFeGFtcGxlczogVVNCCT0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBjb250YWluaW5nIFVTQlxuIgorCSIgICAgICAgICAgXlVTQiA9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBVU0JcbiIKKwkiICAgICAgICAgIFVTQiQgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIGVuZGluZyB3aXRoIFVTQlxuIgorCSJcbiI7CisKK3N0YXRpYyBzaWduZWQgY2hhciBidWZbNDA5Nl0sICpidWZwdHIgPSBidWY7CitzdGF0aWMgc2lnbmVkIGNoYXIgaW5wdXRfYnVmWzQwOTZdOworc3RhdGljIGNoYXIgZmlsZW5hbWVbUEFUSF9NQVgrMV0gPSAiLmNvbmZpZyI7CitzdGF0aWMgY2hhciAqYXJnc1sxMDI0XSwgKiphcmdwdHIgPSBhcmdzOworc3RhdGljIGludCBpbmRlbnQ7CitzdGF0aWMgc3RydWN0IHRlcm1pb3MgaW9zX29yZzsKK3N0YXRpYyBpbnQgcm93cyA9IDAsIGNvbHMgPSAwOworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50X21lbnU7CitzdGF0aWMgaW50IGNoaWxkX2NvdW50Oworc3RhdGljIGludCBkb19yZXNpemU7CitzdGF0aWMgaW50IHNpbmdsZV9tZW51X21vZGU7CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgY29uZl9sb2FkKHZvaWQpOworc3RhdGljIHZvaWQgY29uZl9zYXZlKHZvaWQpOworc3RhdGljIHZvaWQgc2hvd190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgciwgaW50IGMpOworc3RhdGljIHZvaWQgc2hvd19oZWxwdGV4dChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCk7CitzdGF0aWMgdm9pZCBzaG93X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHIsIGludCBjKTsKKworc3RhdGljIHZvaWQgY3ByaW50X2luaXQodm9pZCk7CitzdGF0aWMgaW50IGNwcmludDEoY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgY3ByaW50X2RvbmUodm9pZCk7CitzdGF0aWMgaW50IGNwcmludChjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK3N0YXRpYyB2b2lkIGluaXRfd3NpemUodm9pZCkKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3czsKKwljaGFyICplbnY7CisKKwlpZiAoIWlvY3RsKFNURElOX0ZJTEVOTywgVElPQ0dXSU5TWiwgJndzKSkgeworCQlyb3dzID0gd3Mud3Nfcm93OworCQljb2xzID0gd3Mud3NfY29sOworCX0KKworCWlmICghcm93cykgeworCQllbnYgPSBnZXRlbnYoIkxJTkVTIik7CisJCWlmIChlbnYpCisJCQlyb3dzID0gYXRvaShlbnYpOworCQlpZiAoIXJvd3MpCisJCQlyb3dzID0gMjQ7CisJfQorCWlmICghY29scykgeworCQllbnYgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKwkJaWYgKGVudikKKwkJCWNvbHMgPSBhdG9pKGVudik7CisJCWlmICghY29scykKKwkJCWNvbHMgPSA4MDsKKwl9CisKKwlpZiAocm93cyA8IDE5IHx8IGNvbHMgPCA4MCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIllvdXIgZGlzcGxheSBpcyB0b28gc21hbGwgdG8gcnVuIE1lbnVjb25maWchXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJJdCBtdXN0IGJlIGF0IGxlYXN0IDE5IGxpbmVzIGJ5IDgwIGNvbHVtbnMuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyb3dzIC09IDQ7CisJY29scyAtPSA1OworfQorCitzdGF0aWMgdm9pZCBjcHJpbnRfaW5pdCh2b2lkKQoreworCWJ1ZnB0ciA9IGJ1ZjsKKwlhcmdwdHIgPSBhcmdzOworCW1lbXNldChhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWluZGVudCA9IDA7CisJY2hpbGRfY291bnQgPSAwOworCWNwcmludCgiLi9zY3JpcHRzL2x4ZGlhbG9nL2x4ZGlhbG9nIik7CisJY3ByaW50KCItLWJhY2t0aXRsZSIpOworCWNwcmludChtZW51X2JhY2t0aXRsZSk7Cit9CisKK3N0YXRpYyBpbnQgY3ByaW50MShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXM7CisKKwlpZiAoISphcmdwdHIpCisJCSphcmdwdHIgPSBidWZwdHI7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmVzID0gdnNwcmludGYoYnVmcHRyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWJ1ZnB0ciArPSByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBjcHJpbnRfZG9uZSh2b2lkKQoreworCSpidWZwdHIrKyA9IDA7CisJYXJncHRyKys7Cit9CisKK3N0YXRpYyBpbnQgY3ByaW50KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJlczsKKworCSphcmdwdHIrKyA9IGJ1ZnB0cjsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXMgPSB2c3ByaW50ZihidWZwdHIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJYnVmcHRyICs9IHJlczsKKwkqYnVmcHRyKysgPSAwOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZ2V0X3Byb21wdF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgbWVudSAqc3VibWVudVs4XSwgKm1lbnU7CisKKwlzdHJfcHJpbnRmKHIsICJQcm9tcHQ6ICVzXG4iLCBwcm9wLT50ZXh0KTsKKwlzdHJfcHJpbnRmKHIsICIgIERlZmluZWQgYXQgJXM6JWRcbiIsIHByb3AtPm1lbnUtPmZpbGUtPm5hbWUsCisJCXByb3AtPm1lbnUtPmxpbmVubyk7CisJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCXN0cl9hcHBlbmQociwgIiAgRGVwZW5kcyBvbjogIik7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIHIpOworCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCX0KKwltZW51ID0gcHJvcC0+bWVudS0+cGFyZW50OworCWZvciAoaSA9IDA7IG1lbnUgIT0gJnJvb3RtZW51ICYmIGkgPCA4OyBtZW51ID0gbWVudS0+cGFyZW50KQorCQlzdWJtZW51W2krK10gPSBtZW51OworCWlmIChpID4gMCkgeworCQlzdHJfcHJpbnRmKHIsICIgIExvY2F0aW9uOlxuIik7CisJCWZvciAoaiA9IDQ7IC0taSA+PSAwOyBqICs9IDIpIHsKKwkJCW1lbnUgPSBzdWJtZW51W2ldOworCQkJc3RyX3ByaW50ZihyLCAiJSpjLT4gJXMiLCBqLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJc3RyX3ByaW50ZihyLCAiICglcyBbPSVzXSkiLCBtZW51LT5zeW0tPm5hbWUgPworCQkJCQltZW51LT5zeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCQkJCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJCX0KKwkJCXN0cl9hcHBlbmQociwgIlxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zeW1ib2xfc3RyKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJYm9vbCBoaXQ7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJc3RyX3ByaW50ZihyLCAiU3ltYm9sOiAlcyBbPSVzXVxuIiwgc3ltLT5uYW1lLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKwlmb3JfYWxsX3Byb21wdHMoc3ltLCBwcm9wKQorCQlnZXRfcHJvbXB0X3N0cihyLCBwcm9wKTsKKwloaXQgPSBmYWxzZTsKKwlmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBwcm9wLCBQX1NFTEVDVCkgeworCQlpZiAoIWhpdCkgeworCQkJc3RyX2FwcGVuZChyLCAiICBTZWxlY3RzOiAiKTsKKwkJCWhpdCA9IHRydWU7CisJCX0gZWxzZQorCQkJc3RyX3ByaW50ZihyLCAiICYmICIpOworCQlleHByX2dzdHJfcHJpbnQocHJvcC0+ZXhwciwgcik7CisJfQorCWlmIChoaXQpCisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJaWYgKHN5bS0+cmV2X2RlcC5leHByKSB7CisJCXN0cl9hcHBlbmQociwgIiAgU2VsZWN0ZWQgYnk6ICIpOworCQlleHByX2dzdHJfcHJpbnQoc3ltLT5yZXZfZGVwLmV4cHIsIHIpOworCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCX0KKwlzdHJfYXBwZW5kKHIsICJcblxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3N0ciBnZXRfcmVsYXRpb25zX3N0cihzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IGdzdHIgcmVzID0gc3RyX25ldygpOworCWludCBpOworCisJZm9yIChpID0gMDsgc3ltX2FyciAmJiAoc3ltID0gc3ltX2FycltpXSk7IGkrKykKKwkJZ2V0X3N5bWJvbF9zdHIoJnJlcywgc3ltKTsKKwlpZiAoIWkpCisJCXN0cl9hcHBlbmQoJnJlcywgIk5vIG1hdGNoZXMgZm91bmQuXG4iKTsKKwlyZXR1cm4gcmVzOworfQorCitwaWRfdCBwaWQ7CisKK3N0YXRpYyB2b2lkIHdpbmNoX2hhbmRsZXIoaW50IHNpZykKK3sKKwlpZiAoIWRvX3Jlc2l6ZSkgeworCQlraWxsKHBpZCwgU0lHSU5UKTsKKwkJZG9fcmVzaXplID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXhlY19jb25mKHZvaWQpCit7CisJaW50IHBpcGVmZFsyXSwgc3RhdCwgc2l6ZTsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXNpZ3NldF90IHNzZXQsIG9zc2V0OworCisJc2lnZW1wdHlzZXQoJnNzZXQpOworCXNpZ2FkZHNldCgmc3NldCwgU0lHSU5UKTsKKwlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzc2V0LCAmb3NzZXQpOworCisJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisKKwlzYS5zYV9oYW5kbGVyID0gd2luY2hfaGFuZGxlcjsKKwlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOworCXNpZ2FjdGlvbihTSUdXSU5DSCwgJnNhLCBOVUxMKTsKKworCSphcmdwdHIrKyA9IE5VTEw7CisKKwlwaXBlKHBpcGVmZCk7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKwkJZHVwMihwaXBlZmRbMV0sIDIpOworCQljbG9zZShwaXBlZmRbMF0pOworCQljbG9zZShwaXBlZmRbMV0pOworCQlleGVjdihhcmdzWzBdLCBhcmdzKTsKKwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwljbG9zZShwaXBlZmRbMV0pOworCWJ1ZnB0ciA9IGlucHV0X2J1ZjsKKwl3aGlsZSAoMSkgeworCQlzaXplID0gaW5wdXRfYnVmICsgc2l6ZW9mKGlucHV0X2J1ZikgLSBidWZwdHI7CisJCXNpemUgPSByZWFkKHBpcGVmZFswXSwgYnVmcHRyLCBzaXplKTsKKwkJaWYgKHNpemUgPD0gMCkgeworCQkJaWYgKHNpemUgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikKKwkJCQkJY29udGludWU7CisJCQkJcGVycm9yKCJyZWFkIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlidWZwdHIgKz0gc2l6ZTsKKwl9CisJKmJ1ZnB0cisrID0gMDsKKwljbG9zZShwaXBlZmRbMF0pOworCXdhaXRwaWQocGlkLCAmc3RhdCwgMCk7CisKKwlpZiAoZG9fcmVzaXplKSB7CisJCWluaXRfd3NpemUoKTsKKwkJZG9fcmVzaXplID0gMDsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKFdJRlNJR05BTEVEKHN0YXQpKSB7CisJCXByaW50ZigiXGZpbnRlcnJ1cHRlZCglZClcbiIsIFdURVJNU0lHKHN0YXQpKTsKKwkJZXhpdCgxKTsKKwl9CisjaWYgMAorCXByaW50ZigiXGZleGl0IHN0YXRlOiAlZFxuZXhpdCBkYXRhOiAnJXMnXG4iLCBXRVhJVFNUQVRVUyhzdGF0KSwgaW5wdXRfYnVmKTsKKwlzbGVlcCgxKTsKKyNlbmRpZgorCXNpZ3BlbmRpbmcoJnNzZXQpOworCWlmIChzaWdpc21lbWJlcigmc3NldCwgU0lHSU5UKSkgeworCQlwcmludGYoIlxmaW50ZXJydXB0ZWRcbiIpOworCQlleGl0KDEpOworCX0KKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKworCXJldHVybiBXRVhJVFNUQVRVUyhzdGF0KTsKK30KKworc3RhdGljIHZvaWQgc2VhcmNoX2NvbmYodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICoqc3ltX2FycjsKKwlpbnQgc3RhdDsKKwlzdHJ1Y3QgZ3N0ciByZXM7CisKK2FnYWluOgorCWNwcmludF9pbml0KCk7CisJY3ByaW50KCItLXRpdGxlIik7CisJY3ByaW50KCJTZWFyY2ggQ29uZmlndXJhdGlvbiBQYXJhbWV0ZXIiKTsKKwljcHJpbnQoIi0taW5wdXRib3giKTsKKwljcHJpbnQoIkVudGVyIEtleXdvcmQiKTsKKwljcHJpbnQoIjEwIik7CisJY3ByaW50KCI3NSIpOworCWNwcmludCgiIik7CisJc3RhdCA9IGV4ZWNfY29uZigpOworCWlmIChzdGF0IDwgMCkKKwkJZ290byBhZ2FpbjsKKwlzd2l0Y2ggKHN0YXQpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2hvd19oZWxwdGV4dCgiU2VhcmNoIENvbmZpZ3VyYXRpb24iLCBzZWFyY2hfaGVscCk7CisJCWdvdG8gYWdhaW47CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXN5bV9hcnIgPSBzeW1fcmVfc2VhcmNoKGlucHV0X2J1Zik7CisJcmVzID0gZ2V0X3JlbGF0aW9uc19zdHIoc3ltX2Fycik7CisJZnJlZShzeW1fYXJyKTsKKwlzaG93X3RleHRib3goIlNlYXJjaCBSZXN1bHRzIiwgc3RyX2dldCgmcmVzKSwgMCwgMCk7CisJc3RyX2ZyZWUoJnJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2NvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJaW50IHR5cGUsIHRtcCwgZG9pbnQgPSAyOworCXRyaXN0YXRlIHZhbDsKKwljaGFyIGNoOworCisJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCXJldHVybjsKKworCXN5bSA9IG1lbnUtPnN5bTsKKwlwcm9wID0gbWVudS0+cHJvbXB0OworCWlmICghc3ltKSB7CisJCWlmIChwcm9wICYmIG1lbnUgIT0gY3VycmVudF9tZW51KSB7CisJCQljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCWNhc2UgUF9NRU5VOgorCQkJCWNoaWxkX2NvdW50Kys7CisJCQkJY3ByaW50KCJtJXAiLCBtZW51KTsKKworCQkJCWlmIChzaW5nbGVfbWVudV9tb2RlKSB7CisJCQkJCWNwcmludDEoIiVzJSpjJXMiLAorCQkJCQkJbWVudS0+ZGF0YSA/ICItLT4iIDogIisrPiIsCisJCQkJCQlpbmRlbnQgKyAxLCAnICcsIHByb21wdCk7CisJCQkJfSBlbHNlCisJCQkJCWNwcmludDEoIiAgICUqYyVzICAtLS0+IiwgaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCisJCQkJY3ByaW50X2RvbmUoKTsKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSAmJiBtZW51LT5kYXRhKQorCQkJCQlnb3RvIGNvbmZfY2hpbGRzOworCQkJCXJldHVybjsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHByb21wdCkgeworCQkJCQljaGlsZF9jb3VudCsrOworCQkJCQljcHJpbnQoIjolcCIsIG1lbnUpOworCQkJCQljcHJpbnQoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQlkb2ludCA9IDA7CisJCWdvdG8gY29uZl9jaGlsZHM7CisJfQorCisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJc3RydWN0IHN5bWJvbCAqZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCXN0cnVjdCBtZW51ICpkZWZfbWVudSA9IE5VTEw7CisKKwkJY2hpbGRfY291bnQrKzsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKSAmJiBjaGlsZC0+c3ltID09IGRlZl9zeW0pCisJCQkJZGVmX21lbnUgPSBjaGlsZDsKKwkJfQorCisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQkJY3ByaW50KCJ0JXAiLCBtZW51KTsKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJY3ByaW50MSgiWyVjXSIsIHZhbCA9PSBubyA/ICcgJyA6ICcqJyk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3dpdGNoICh2YWwpIHsKKwkJCQljYXNlIHllczogY2ggPSAnKic7IGJyZWFrOworCQkJCWNhc2UgbW9kOiBjaCA9ICdNJzsgYnJlYWs7CisJCQkJZGVmYXVsdDogIGNoID0gJyAnOyBicmVhazsKKwkJCQl9CisJCQkJY3ByaW50MSgiPCVjPiIsIGNoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNwcmludCgiJWMlcCIsIGRlZl9tZW51ID8gJ3QnIDogJzonLCBtZW51KTsKKwkJCWNwcmludDEoIiAgICIpOworCQl9CisKKwkJY3ByaW50MSgiJSpjJXMiLCBpbmRlbnQgKyAxLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCWlmICh2YWwgPT0geWVzKSB7CisJCQlpZiAoZGVmX21lbnUpIHsKKwkJCQljcHJpbnQxKCIgKCVzKSIsIG1lbnVfZ2V0X3Byb21wdChkZWZfbWVudSkpOworCQkJCWNwcmludDEoIiAgLS0tPiIpOworCQkJCWNwcmludF9kb25lKCk7CisJCQkJaWYgKGRlZl9tZW51LT5saXN0KSB7CisJCQkJCWluZGVudCArPSAyOworCQkJCQlidWlsZF9jb25mKGRlZl9tZW51KTsKKwkJCQkJaW5kZW50IC09IDI7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJY3ByaW50X2RvbmUoKTsKKwkJCXJldHVybjsKKwkJfQorCQljcHJpbnRfZG9uZSgpOworCX0gZWxzZSB7CisJCWlmIChtZW51ID09IGN1cnJlbnRfbWVudSkgeworCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCWNwcmludCgiLS0tJSpjJXMiLCBpbmRlbnQgKyAxLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCQlnb3RvIGNvbmZfY2hpbGRzOworCQl9CisJCWNoaWxkX2NvdW50Kys7CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB2YWwgPT0geWVzKSB7CisJCQljcHJpbnQoIjolcCIsIG1lbnUpOworCQkJY3ByaW50MSgiICAgIik7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNwcmludCgidCVwIiwgbWVudSk7CisJCQkJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkKKwkJCQkJY3ByaW50MSgiWyVjXSIsIHZhbCA9PSBubyA/ICcgJyA6ICcqJyk7CisJCQkJZWxzZQorCQkJCQljcHJpbnQxKCItLS0iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQljcHJpbnQoInQlcCIsIG1lbnUpOworCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSB5ZXM6IGNoID0gJyonOyBicmVhazsKKwkJCQljYXNlIG1vZDogY2ggPSAnTSc7IGJyZWFrOworCQkJCWRlZmF1bHQ6ICBjaCA9ICcgJzsgYnJlYWs7CisJCQkJfQorCQkJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpCisJCQkJCWNwcmludDEoIjwlYz4iLCBjaCk7CisJCQkJZWxzZQorCQkJCQljcHJpbnQxKCItLS0iKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY3ByaW50KCJzJXAiLCBtZW51KTsKKwkJCQl0bXAgPSBjcHJpbnQxKCIoJXMpIiwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJCQkJdG1wID0gaW5kZW50IC0gdG1wICsgNDsKKwkJCQlpZiAodG1wIDwgMCkKKwkJCQkJdG1wID0gMDsKKwkJCQljcHJpbnQxKCIlKmMlcyVzIiwgdG1wLCAnICcsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCQkJKHN5bV9oYXNfdmFsdWUoc3ltKSB8fCAhc3ltX2lzX2NoYW5nYWJsZShzeW0pKSA/CisJCQkJCSIiIDogIiAoTkVXKSIpOworCQkJCWNwcmludF9kb25lKCk7CisJCQkJZ290byBjb25mX2NoaWxkczsKKwkJCX0KKwkJfQorCQljcHJpbnQxKCIlKmMlcyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkoc3ltX2hhc192YWx1ZShzeW0pIHx8ICFzeW1faXNfY2hhbmdhYmxlKHN5bSkpID8KKwkJCSIiIDogIiAoTkVXKSIpOworCQlpZiAobWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkgeworCQkJY3ByaW50MSgiICAtLS0+Iik7CisJCQljcHJpbnRfZG9uZSgpOworCQkJcmV0dXJuOworCQl9CisJCWNwcmludF9kb25lKCk7CisJfQorCitjb25mX2NoaWxkczoKKwlpbmRlbnQgKz0gZG9pbnQ7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQlidWlsZF9jb25mKGNoaWxkKTsKKwlpbmRlbnQgLT0gZG9pbnQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKnN1Ym1lbnU7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwljaGFyIGFjdGl2ZV9lbnRyeVs0MF07CisJaW50IHN0YXQsIHR5cGUsIGk7CisKKwl1bmxpbmsoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwlhY3RpdmVfZW50cnlbMF0gPSAwOworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS10aXRsZSIpOworCQljcHJpbnQoIiVzIiwgcHJvbXB0ID8gcHJvbXB0IDogIk1haW4gTWVudSIpOworCQljcHJpbnQoIi0tbWVudSIpOworCQljcHJpbnQobWVudV9pbnN0cnVjdGlvbnMpOworCQljcHJpbnQoIiVkIiwgcm93cyk7CisJCWNwcmludCgiJWQiLCBjb2xzKTsKKwkJY3ByaW50KCIlZCIsIHJvd3MgLSAxMCk7CisJCWNwcmludCgiJXMiLCBhY3RpdmVfZW50cnkpOworCQljdXJyZW50X21lbnUgPSBtZW51OworCQlidWlsZF9jb25mKG1lbnUpOworCQlpZiAoIWNoaWxkX2NvdW50KQorCQkJYnJlYWs7CisJCWlmIChtZW51ID09ICZyb290bWVudSkgeworCQkJY3ByaW50KCI6Iik7CisJCQljcHJpbnQoIi0tLSAiKTsKKwkJCWNwcmludCgiTCIpOworCQkJY3ByaW50KCIgICAgTG9hZCBhbiBBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlIik7CisJCQljcHJpbnQoIlMiKTsKKwkJCWNwcmludCgiICAgIFNhdmUgQ29uZmlndXJhdGlvbiB0byBhbiBBbHRlcm5hdGUgRmlsZSIpOworCQl9CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJaWYgKHN0YXQgPCAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0YXQgPT0gMSB8fCBzdGF0ID09IDI1NSkKKwkJCWJyZWFrOworCisJCXR5cGUgPSBpbnB1dF9idWZbMF07CisJCWlmICghdHlwZSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGlucHV0X2J1ZltpXSAmJiAhaXNzcGFjZShpbnB1dF9idWZbaV0pOyBpKyspCisJCQk7CisJCWlmIChpID49IHNpemVvZihhY3RpdmVfZW50cnkpKQorCQkJaSA9IHNpemVvZihhY3RpdmVfZW50cnkpIC0gMTsKKwkJaW5wdXRfYnVmW2ldID0gMDsKKwkJc3RyY3B5KGFjdGl2ZV9lbnRyeSwgaW5wdXRfYnVmKTsKKworCQlzeW0gPSBOVUxMOworCQlzdWJtZW51ID0gTlVMTDsKKwkJaWYgKHNzY2FuZihpbnB1dF9idWYgKyAxLCAiJXAiLCAmc3VibWVudSkgPT0gMSkKKwkJCXN5bSA9IHN1Ym1lbnUtPnN5bTsKKworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlICdtJzoKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSkKKwkJCQkJc3VibWVudS0+ZGF0YSA9ICh2b2lkICopIChsb25nKSAhc3VibWVudS0+ZGF0YTsKKwkJCQllbHNlCisJCQkJCWNvbmYoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICd0JzoKKwkJCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSB5ZXMpCisJCQkJCWNvbmZfY2hvaWNlKHN1Ym1lbnUpOworCQkJCWVsc2UgaWYgKHN1Ym1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpCisJCQkJCWNvbmYoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQljb25mX3N0cmluZyhzdWJtZW51KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ0wnOgorCQkJCWNvbmZfbG9hZCgpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUyc6CisJCQkJY29uZl9zYXZlKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKHN5bSkKKwkJCQlzaG93X2hlbHAoc3VibWVudSk7CisJCQllbHNlCisJCQkJc2hvd19oZWxwdGV4dCgiUkVBRE1FIiwgbWNvbmZfcmVhZG1lKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlpZiAodHlwZSA9PSAndCcpIHsKKwkJCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHllcykpCisJCQkJCWJyZWFrOworCQkJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKSkKKwkJCQkJc2hvd190ZXh0Ym94KE5VTEwsIHNldG1vZF90ZXh0LCA2LCA3NCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJaWYgKHR5cGUgPT0gJ3QnKQorCQkJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBubyk7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJaWYgKHR5cGUgPT0gJ3QnKQorCQkJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBtb2QpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCQllbHNlIGlmICh0eXBlID09ICdtJykKKwkJCQljb25mKHN1Ym1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJCXNlYXJjaF9jb25mKCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2hvd190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0LCBpbnQgciwgaW50IGMpCit7CisJaW50IGZkOworCisJZmQgPSBjcmVhdCgiLmhlbHAudG1wIiwgMDc3Nyk7CisJd3JpdGUoZmQsIHRleHQsIHN0cmxlbih0ZXh0KSk7CisJY2xvc2UoZmQpOworCXNob3dfZmlsZSgiLmhlbHAudG1wIiwgdGl0bGUsIHIsIGMpOworCXVubGluaygiLmhlbHAudG1wIik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscHRleHQoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc2hvd190ZXh0Ym94KHRpdGxlLCB0ZXh0LCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBnc3RyIGhlbHAgPSBzdHJfbmV3KCk7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCisJaWYgKHN5bS0+aGVscCkKKwl7CisJCWlmIChzeW0tPm5hbWUpIHsKKwkJCXN0cl9wcmludGYoJmhlbHAsICJDT05GSUdfJXM6XG5cbiIsIHN5bS0+bmFtZSk7CisJCQlzdHJfYXBwZW5kKCZoZWxwLCBzeW0tPmhlbHApOworCQkJc3RyX2FwcGVuZCgmaGVscCwgIlxuIik7CisJCX0KKwl9IGVsc2UgeworCQlzdHJfYXBwZW5kKCZoZWxwLCBub2hlbHBfdGV4dCk7CisJfQorCWdldF9zeW1ib2xfc3RyKCZoZWxwLCBzeW0pOworCXNob3dfaGVscHRleHQobWVudV9nZXRfcHJvbXB0KG1lbnUpLCBzdHJfZ2V0KCZoZWxwKSk7CisJc3RyX2ZyZWUoJmhlbHApOworfQorCitzdGF0aWMgdm9pZCBzaG93X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgciwgaW50IGMpCit7CisJZG8geworCQljcHJpbnRfaW5pdCgpOworCQlpZiAodGl0bGUpIHsKKwkJCWNwcmludCgiLS10aXRsZSIpOworCQkJY3ByaW50KCIlcyIsIHRpdGxlKTsKKwkJfQorCQljcHJpbnQoIi0tdGV4dGJveCIpOworCQljcHJpbnQoIiVzIiwgZmlsZW5hbWUpOworCQljcHJpbnQoIiVkIiwgciA/IHIgOiByb3dzKTsKKwkJY3ByaW50KCIlZCIsIGMgPyBjIDogY29scyk7CisJfSB3aGlsZSAoZXhlY19jb25mKCkgPCAwKTsKK30KKworc3RhdGljIHZvaWQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwlzdHJ1Y3Qgc3ltYm9sICphY3RpdmU7CisJaW50IHN0YXQ7CisKKwlhY3RpdmUgPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShtZW51LT5zeW0pOworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS10aXRsZSIpOworCQljcHJpbnQoIiVzIiwgcHJvbXB0ID8gcHJvbXB0IDogIk1haW4gTWVudSIpOworCQljcHJpbnQoIi0tcmFkaW9saXN0Iik7CisJCWNwcmludChyYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zKTsKKwkJY3ByaW50KCIxNSIpOworCQljcHJpbnQoIjcwIik7CisJCWNwcmludCgiNiIpOworCisJCWN1cnJlbnRfbWVudSA9IG1lbnU7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJCWNvbnRpbnVlOworCQkJY3ByaW50KCIlcCIsIGNoaWxkKTsKKwkJCWNwcmludCgiJXMiLCBtZW51X2dldF9wcm9tcHQoY2hpbGQpKTsKKwkJCWlmIChjaGlsZC0+c3ltID09IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKG1lbnUtPnN5bSkpCisJCQkJY3ByaW50KCJPTiIpOworCQkJZWxzZSBpZiAoY2hpbGQtPnN5bSA9PSBhY3RpdmUpCisJCQkJY3ByaW50KCJTRUxFQ1RFRCIpOworCQkJZWxzZQorCQkJCWNwcmludCgiT0ZGIik7CisJCX0KKworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaCAoc3RhdCkgeworCQljYXNlIDA6CisJCQlpZiAoc3NjYW5mKGlucHV0X2J1ZiwgIiVwIiwgJmNoaWxkKSAhPSAxKQorCQkJCWJyZWFrOworCQkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShjaGlsZC0+c3ltLCB5ZXMpOworCQkJcmV0dXJuOworCQljYXNlIDE6CisJCQlpZiAoc3NjYW5mKGlucHV0X2J1ZiwgIiVwIiwgJmNoaWxkKSA9PSAxKSB7CisJCQkJc2hvd19oZWxwKGNoaWxkKTsKKwkJCQlhY3RpdmUgPSBjaGlsZC0+c3ltOworCQkJfSBlbHNlCisJCQkJc2hvd19oZWxwKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX3N0cmluZyhzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJaW50IHN0YXQ7CisKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6ICJNYWluIE1lbnUiKTsKKwkJY3ByaW50KCItLWlucHV0Ym94Iik7CisJCXN3aXRjaCAoc3ltX2dldF90eXBlKG1lbnUtPnN5bSkpIHsKKwkJY2FzZSBTX0lOVDoKKwkJCWNwcmludChpbnB1dGJveF9pbnN0cnVjdGlvbnNfaW50KTsKKwkJCWJyZWFrOworCQljYXNlIFNfSEVYOgorCQkJY3ByaW50KGlucHV0Ym94X2luc3RydWN0aW9uc19oZXgpOworCQkJYnJlYWs7CisJCWNhc2UgU19TVFJJTkc6CisJCQljcHJpbnQoaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX3N0cmluZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHBhbmljPyAqLzsKKwkJfQorCQljcHJpbnQoIjEwIik7CisJCWNwcmludCgiNzUiKTsKKwkJY3ByaW50KCIlcyIsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSkpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaCAoc3RhdCkgeworCQljYXNlIDA6CisJCQlpZiAoc3ltX3NldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltLCBpbnB1dF9idWYpKQorCQkJCXJldHVybjsKKwkJCXNob3dfdGV4dGJveChOVUxMLCAiWW91IGhhdmUgbWFkZSBhbiBpbnZhbGlkIGVudHJ5LiIsIDUsIDQzKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHAobWVudSk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfbG9hZCh2b2lkKQoreworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLWlucHV0Ym94Iik7CisJCWNwcmludChsb2FkX2NvbmZpZ190ZXh0KTsKKwkJY3ByaW50KCIxMSIpOworCQljcHJpbnQoIjU1Iik7CisJCWNwcmludCgiJXMiLCBmaWxlbmFtZSk7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFpbnB1dF9idWZbMF0pCisJCQkJcmV0dXJuOworCQkJaWYgKCFjb25mX3JlYWQoaW5wdXRfYnVmKSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgIkZpbGUgZG9lcyBub3QgZXhpc3QhIiwgNSwgMzgpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNob3dfaGVscHRleHQoIkxvYWQgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iLCBsb2FkX2NvbmZpZ19oZWxwKTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9zYXZlKHZvaWQpCit7CisJaW50IHN0YXQ7CisKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0taW5wdXRib3giKTsKKwkJY3ByaW50KHNhdmVfY29uZmlnX3RleHQpOworCQljcHJpbnQoIjExIik7CisJCWNwcmludCgiNTUiKTsKKwkJY3ByaW50KCIlcyIsIGZpbGVuYW1lKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2goc3RhdCkgeworCQljYXNlIDA6CisJCQlpZiAoIWlucHV0X2J1ZlswXSkKKwkJCQlyZXR1cm47CisJCQlpZiAoIWNvbmZfd3JpdGUoaW5wdXRfYnVmKSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgIkNhbid0IGNyZWF0ZSBmaWxlISAgUHJvYmFibHkgYSBub25leGlzdGVudCBkaXJlY3RvcnkuIiwgNSwgNjApOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXNob3dfaGVscHRleHQoIlNhdmUgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iLCBzYXZlX2NvbmZpZ19oZWxwKTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9jbGVhbnVwKHZvaWQpCit7CisJdGNzZXRhdHRyKDEsIFRDU0FGTFVTSCwgJmlvc19vcmcpOworCXVubGluaygiLmhlbHAudG1wIik7CisJdW5saW5rKCJseGRpYWxvZy5zY3JsdG1wIik7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwljaGFyICptb2RlOworCWludCBzdGF0OworCisJY29uZl9wYXJzZShhdlsxXSk7CisJY29uZl9yZWFkKE5VTEwpOworCisJc3ltID0gc3ltX2xvb2t1cCgiS0VSTkVMUkVMRUFTRSIsIDApOworCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJc3ByaW50ZihtZW51X2JhY2t0aXRsZSwgIkxpbnV4IEtlcm5lbCB2JXMgQ29uZmlndXJhdGlvbiIsCisJCXN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCisJbW9kZSA9IGdldGVudigiTUVOVUNPTkZJR19NT0RFIik7CisJaWYgKG1vZGUpIHsKKwkJaWYgKCFzdHJjYXNlY21wKG1vZGUsICJzaW5nbGVfbWVudSIpKQorCQkJc2luZ2xlX21lbnVfbW9kZSA9IDE7CisJfQorCisJdGNnZXRhdHRyKDEsICZpb3Nfb3JnKTsKKwlhdGV4aXQoY29uZl9jbGVhbnVwKTsKKwlpbml0X3dzaXplKCk7CisJY29uZigmcm9vdG1lbnUpOworCisJZG8geworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0teWVzbm8iKTsKKwkJY3ByaW50KCJEbyB5b3Ugd2lzaCB0byBzYXZlIHlvdXIgbmV3IGtlcm5lbCBjb25maWd1cmF0aW9uPyIpOworCQljcHJpbnQoIjUiKTsKKwkJY3ByaW50KCI2MCIpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJfSB3aGlsZSAoc3RhdCA8IDApOworCisJaWYgKHN0YXQgPT0gMCkgeworCQlpZiAoY29uZl93cml0ZShOVUxMKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJcblxuIgorCQkJCSJFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uXG4iCisJCQkJIllvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJIlxuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCXByaW50ZigiXG5cbiIKKwkJCSIqKiogRW5kIG9mIExpbnV4IGtlcm5lbCBjb25maWd1cmF0aW9uLlxuIgorCQkJIioqKiBFeGVjdXRlICdtYWtlJyB0byBidWlsZCB0aGUga2VybmVsIG9yIHRyeSAnbWFrZSBoZWxwJy4iCisJCQkiXG5cbiIpOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5cbiIKKwkJCSJZb3VyIGtlcm5lbCBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJIlxuXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTMxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdHJ1Y3QgbWVudSByb290bWVudTsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqKmxhc3RfZW50cnlfcHRyOworCitzdHJ1Y3QgZmlsZSAqZmlsZV9saXN0Oworc3RydWN0IGZpbGUgKmN1cnJlbnRfZmlsZTsKKworc3RhdGljIHZvaWQgbWVudV93YXJuKHN0cnVjdCBtZW51ICptZW51LCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6d2FybmluZzogIiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQoYXApOworfQorCitzdGF0aWMgdm9pZCBwcm9wX3dhcm4oc3RydWN0IHByb3BlcnR5ICpwcm9wLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6d2FybmluZzogIiwgcHJvcC0+ZmlsZS0+bmFtZSwgcHJvcC0+bGluZW5vKTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQoYXApOworfQorCit2b2lkIG1lbnVfaW5pdCh2b2lkKQoreworCWN1cnJlbnRfZW50cnkgPSBjdXJyZW50X21lbnUgPSAmcm9vdG1lbnU7CisJbGFzdF9lbnRyeV9wdHIgPSAmcm9vdG1lbnUubGlzdDsKK30KKwordm9pZCBtZW51X2FkZF9lbnRyeShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwltZW51ID0gbWFsbG9jKHNpemVvZigqbWVudSkpOworCW1lbXNldChtZW51LCAwLCBzaXplb2YoKm1lbnUpKTsKKwltZW51LT5zeW0gPSBzeW07CisJbWVudS0+cGFyZW50ID0gY3VycmVudF9tZW51OworCW1lbnUtPmZpbGUgPSBjdXJyZW50X2ZpbGU7CisJbWVudS0+bGluZW5vID0gemNvbmZfbGluZW5vKCk7CisKKwkqbGFzdF9lbnRyeV9wdHIgPSBtZW51OworCWxhc3RfZW50cnlfcHRyID0gJm1lbnUtPm5leHQ7CisJY3VycmVudF9lbnRyeSA9IG1lbnU7Cit9CisKK3ZvaWQgbWVudV9lbmRfZW50cnkodm9pZCkKK3sKK30KKwordm9pZCBtZW51X2FkZF9tZW51KHZvaWQpCit7CisJY3VycmVudF9tZW51ID0gY3VycmVudF9lbnRyeTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X2VudHJ5LT5saXN0OworfQorCit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCkKK3sKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X21lbnUtPm5leHQ7CisJY3VycmVudF9tZW51ID0gY3VycmVudF9tZW51LT5wYXJlbnQ7Cit9CisKK3N0cnVjdCBleHByICptZW51X2NoZWNrX2RlcChzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gbWVudV9jaGVja19kZXAoZS0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJLyogY2hhbmdlICdtJyBpbnRvICdtJyAmJiBNT0RVTEVTICovCisJCWlmIChlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCXJldHVybiBleHByX2FsbG9jX2FuZChlLCBleHByX2FsbG9jX3N5bWJvbChtb2R1bGVzX3N5bSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApCit7CisJY3VycmVudF9lbnRyeS0+ZGVwID0gZXhwcl9hbGxvY19hbmQoY3VycmVudF9lbnRyeS0+ZGVwLCBtZW51X2NoZWNrX2RlcChkZXApKTsKK30KKwordm9pZCBtZW51X3NldF90eXBlKGludCB0eXBlKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IGN1cnJlbnRfZW50cnktPnN5bTsKKworCWlmIChzeW0tPnR5cGUgPT0gdHlwZSkKKwkJcmV0dXJuOworCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKSB7CisJCXN5bS0+dHlwZSA9IHR5cGU7CisJCXJldHVybjsKKwl9CisJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJ0eXBlIG9mICclcycgcmVkZWZpbmVkIGZyb20gJyVzJyB0byAnJXMnXG4iLAorCSAgICBzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCSAgICBzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSksIHN5bV90eXBlX25hbWUodHlwZSkpOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKHR5cGUsIGN1cnJlbnRfZW50cnktPnN5bSk7CisKKwlwcm9wLT5tZW51ID0gY3VycmVudF9lbnRyeTsKKwlwcm9wLT50ZXh0ID0gcHJvbXB0OworCXByb3AtPmV4cHIgPSBleHByOworCXByb3AtPnZpc2libGUuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGRlcCk7CisKKwlpZiAocHJvbXB0KSB7CisJCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCQltZW51X3dhcm4oY3VycmVudF9lbnRyeSwgInByb21wdCByZWRlZmluZWRcbiIpOworCQljdXJyZW50X2VudHJ5LT5wcm9tcHQgPSBwcm9wOworCX0KKworCXJldHVybiBwcm9wOworfQorCit2b2lkIG1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBwcm9tcHQsIE5VTEwsIGRlcCk7Cit9CisKK3ZvaWQgbWVudV9hZGRfZXhwcihlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCkKK3sKKwltZW51X2FkZF9wcm9wKHR5cGUsIE5VTEwsIGV4cHIsIGRlcCk7Cit9CisKK3ZvaWQgbWVudV9hZGRfc3ltYm9sKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IGV4cHIgKmRlcCkKK3sKKwltZW51X2FkZF9wcm9wKHR5cGUsIE5VTEwsIGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSksIGRlcCk7Cit9CisKK3ZvaWQgc3ltX2NoZWNrX3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0yOworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCWNhc2UgUF9ERUZBVUxUOgorCQkJaWYgKChzeW0tPnR5cGUgPT0gU19TVFJJTkcgfHwgc3ltLT50eXBlID09IFNfSU5UIHx8IHN5bS0+dHlwZSA9PSBTX0hFWCkgJiYKKwkJCSAgICBwcm9wLT5leHByLT50eXBlICE9IEVfU1lNQk9MKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiZGVmYXVsdCBmb3IgY29uZmlnIHN5bWJvbCAnJSciCisJCQkJICAgICIgbXVzdCBiZSBhIHNpbmdsZSBzeW1ib2wiLCBzeW0tPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgUF9TRUxFQ1Q6CisJCQlzeW0yID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQkJaWYgKHN5bS0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICJjb25maWcgc3ltYm9sICclcycgdXNlcyBzZWxlY3QsIGJ1dCBpcyAiCisJCQkJICAgICJub3QgYm9vbGVhbiBvciB0cmlzdGF0ZSIsIHN5bS0+bmFtZSk7CisJCQllbHNlIGlmIChzeW0yLT50eXBlID09IFNfVU5LTk9XTikKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgIidzZWxlY3QnIHVzZWQgYnkgY29uZmlnIHN5bWJvbCAnJXMnICIKKwkJCQkgICAgInJlZmVyIHRvIHVuZGVmaW5lZCBzeW1ib2wgJyVzJyIsCisJCQkJICAgIHN5bS0+bmFtZSwgc3ltMi0+bmFtZSk7CisJCQllbHNlIGlmIChzeW0yLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0yLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICInJXMnIGhhcyB3cm9uZyB0eXBlLiAnc2VsZWN0JyBvbmx5ICIKKwkJCQkgICAgImFjY2VwdCBhcmd1bWVudHMgb2YgYm9vbGVhbiBhbmQgIgorCQkJCSAgICAidHJpc3RhdGUgdHlwZSIsIHN5bTItPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgUF9SQU5HRToKKwkJCWlmIChzeW0tPnR5cGUgIT0gU19JTlQgJiYgc3ltLT50eXBlICE9IFNfSEVYKQorCQkJCXByb3Bfd2Fybihwcm9wLCAicmFuZ2UgaXMgb25seSBhbGxvd2VkICIKKwkJCQkgICAgICAgICAgICAgICAgImZvciBpbnQgb3IgaGV4IHN5bWJvbHMiKTsKKwkJCWlmICghc3ltX3N0cmluZ192YWxpZChzeW0sIHByb3AtPmV4cHItPmxlZnQuc3ltLT5uYW1lKSB8fAorCQkJICAgICFzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgcHJvcC0+ZXhwci0+cmlnaHQuc3ltLT5uYW1lKSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIGludmFsaWQiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorfQorCit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudSwgKmxhc3RfbWVudTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICpwYXJlbnRkZXAsICpiYXNlZGVwLCAqZGVwLCAqZGVwMiwgKiplcDsKKworCXN5bSA9IHBhcmVudC0+c3ltOworCWlmIChwYXJlbnQtPmxpc3QpIHsKKwkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCS8qIGZpbmQgdGhlIGZpcnN0IGNob2ljZSB2YWx1ZSBhbmQgZmluZCBvdXQgY2hvaWNlIHR5cGUgKi8KKwkJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBwYXJlbnQ7CisJCQkJCW1lbnVfc2V0X3R5cGUobWVudS0+c3ltLT50eXBlKTsKKwkJCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQkJCW1lbnVfc2V0X3R5cGUoc3ltLT50eXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcGFyZW50ZGVwID0gZXhwcl9hbGxvY19zeW1ib2woc3ltKTsKKwkJfSBlbHNlIGlmIChwYXJlbnQtPnByb21wdCkKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHI7CisJCWVsc2UKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+ZGVwOworCisJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWJhc2VkZXAgPSBleHByX3RyYW5zZm9ybShtZW51LT5kZXApOworCQkJYmFzZWRlcCA9IGV4cHJfYWxsb2NfYW5kKGV4cHJfY29weShwYXJlbnRkZXApLCBiYXNlZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGJhc2VkZXApOworCQkJbWVudS0+ZGVwID0gYmFzZWRlcDsKKwkJCWlmIChtZW51LT5zeW0pCisJCQkJcHJvcCA9IG1lbnUtPnN5bS0+cHJvcDsKKwkJCWVsc2UKKwkJCQlwcm9wID0gbWVudS0+cHJvbXB0OworCQkJZm9yICg7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCQkJY29udGludWU7CisJCQkJZGVwID0gZXhwcl90cmFuc2Zvcm0ocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJCQlkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkoYmFzZWRlcCksIGRlcCk7CisJCQkJZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhkZXApOworCQkJCWlmIChtZW51LT5zeW0gJiYgbWVudS0+c3ltLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCQkJCWRlcCA9IGV4cHJfdHJhbnNfYm9vbChkZXApOworCQkJCXByb3AtPnZpc2libGUuZXhwciA9IGRlcDsKKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkgeworCQkJCQlzdHJ1Y3Qgc3ltYm9sICplcyA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCQkJZXMtPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3IoZXMtPnJldl9kZXAuZXhwciwKKwkJCQkJCQlleHByX2FsbG9jX2FuZChleHByX2FsbG9jX3N5bWJvbChtZW51LT5zeW0pLCBleHByX2NvcHkoZGVwKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KQorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwl9IGVsc2UgaWYgKHN5bSkgeworCQliYXNlZGVwID0gcGFyZW50LT5wcm9tcHQgPyBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByIDogTlVMTDsKKwkJYmFzZWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShiYXNlZGVwLCBFX1VORVFVQUwsICZzeW1ib2xfbm8pOworCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhleHByX3RyYW5zZm9ybShiYXNlZGVwKSk7CisJCWxhc3RfbWVudSA9IE5VTEw7CisJCWZvciAobWVudSA9IHBhcmVudC0+bmV4dDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWRlcCA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dmlzaWJsZS5leHByIDogbWVudS0+ZGVwOworCQkJaWYgKCFleHByX2NvbnRhaW5zX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJYnJlYWs7CisJCQlpZiAoZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJZ290byBuZXh0OworCQkJZGVwID0gZXhwcl90cmFuc19jb21wYXJlKGRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oZGVwKSk7CisJCQlkZXAyID0gZXhwcl9jb3B5KGJhc2VkZXApOworCQkJZXhwcl9lbGltaW5hdGVfZXEoJmRlcCwgJmRlcDIpOworCQkJZXhwcl9mcmVlKGRlcCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKGRlcDIpKSB7CisJCQkJZXhwcl9mcmVlKGRlcDIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZXhwcl9mcmVlKGRlcDIpOworCQluZXh0OgorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwkJCW1lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCWxhc3RfbWVudSA9IG1lbnU7CisJCX0KKwkJaWYgKGxhc3RfbWVudSkgeworCQkJcGFyZW50LT5saXN0ID0gcGFyZW50LT5uZXh0OworCQkJcGFyZW50LT5uZXh0ID0gbGFzdF9tZW51LT5uZXh0OworCQkJbGFzdF9tZW51LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pICYmIG1lbnUtPnN5bSkgeworCQkJbWVudS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFVkFMOworCQkJaWYgKCFtZW51LT5wcm9tcHQpCisJCQkJbWVudV93YXJuKG1lbnUsICJjaG9pY2UgdmFsdWUgbXVzdCBoYXZlIGEgcHJvbXB0Iik7CisJCQlmb3IgKHByb3AgPSBtZW51LT5zeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9QUk9NUFQgJiYgcHJvcC0+bWVudSAhPSBtZW51KSB7CisJCQkJCXByb3Bfd2Fybihwcm9wLCAiY2hvaWNlIHZhbHVlcyAiCisJCQkJCSAgICAiY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhICIKKwkJCQkJICAgICJzaW5nbGUgcHJvbXB0Iik7CisJCQkJfQorCQkJCWlmIChwcm9wLT50eXBlID09IFBfREVGQVVMVCkKKwkJCQkJcHJvcF93YXJuKHByb3AsICJkZWZhdWx0cyBmb3IgY2hvaWNlICIKKwkJCQkJICAgICJ2YWx1ZXMgbm90IHN1cHBvcnRlZCIpOworCQkJfQorCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQltZW51X2FkZF9zeW1ib2woUF9DSE9JQ0UsIHN5bSwgTlVMTCk7CisJCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQkJZm9yIChlcCA9ICZwcm9wLT5leHByOyAqZXA7IGVwID0gJigqZXApLT5sZWZ0LmV4cHIpCisJCQkJOworCQkJKmVwID0gZXhwcl9hbGxvY19vbmUoRV9DSE9JQ0UsIE5VTEwpOworCQkJKCplcCktPnJpZ2h0LnN5bSA9IG1lbnUtPnN5bTsKKwkJfQorCQlpZiAobWVudS0+bGlzdCAmJiAoIW1lbnUtPnByb21wdCB8fCAhbWVudS0+cHJvbXB0LT50ZXh0KSkgeworCQkJZm9yIChsYXN0X21lbnUgPSBtZW51LT5saXN0OyA7IGxhc3RfbWVudSA9IGxhc3RfbWVudS0+bmV4dCkgeworCQkJCWxhc3RfbWVudS0+cGFyZW50ID0gcGFyZW50OworCQkJCWlmICghbGFzdF9tZW51LT5uZXh0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWxhc3RfbWVudS0+bmV4dCA9IG1lbnUtPm5leHQ7CisJCQltZW51LT5uZXh0ID0gbWVudS0+bGlzdDsKKwkJCW1lbnUtPmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHN5bSAmJiAhKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV0FSTkVEKSkgeworCQlpZiAoc3ltLT50eXBlID09IFNfVU5LTk9XTikKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjb25maWcgc3ltYm9sIGRlZmluZWQgIgorCQkJICAgICJ3aXRob3V0IHR5cGVcbiIpOworCisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgIXBhcmVudC0+cHJvbXB0KQorCQkJbWVudV93YXJuKHBhcmVudCwgImNob2ljZSBtdXN0IGhhdmUgYSBwcm9tcHRcbiIpOworCisJCS8qIENoZWNrIHByb3BlcnRpZXMgY29ubmVjdGVkIHRvIHRoaXMgc3ltYm9sICovCisJCXN5bV9jaGVja19wcm9wKHN5bSk7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dBUk5FRDsKKwl9CisKKwlpZiAoc3ltICYmICFzeW1faXNfb3B0aW9uYWwoc3ltKSAmJiBwYXJlbnQtPnByb21wdCkgeworCQlzeW0tPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3Ioc3ltLT5yZXZfZGVwLmV4cHIsCisJCQkJZXhwcl9hbGxvY19hbmQocGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciwKKwkJCQkJZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9tb2QpKSk7CisJfQorfQorCitib29sIG1lbnVfaXNfdmlzaWJsZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXRyaXN0YXRlIHZpc2libGU7CisKKwlpZiAoIW1lbnUtPnByb21wdCkKKwkJcmV0dXJuIGZhbHNlOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXZpc2libGUgPSBtZW51LT5wcm9tcHQtPnZpc2libGUudHJpOworCX0gZWxzZQorCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcik7CisKKwlpZiAodmlzaWJsZSAhPSBubykKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFzeW0gfHwgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBjaGFyICptZW51X2dldF9wcm9tcHQoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJaWYgKG1lbnUtPnByb21wdCkKKwkJcmV0dXJuIG1lbnUtPnByb21wdC0+dGV4dDsKKwllbHNlIGlmIChtZW51LT5zeW0pCisJCXJldHVybiBtZW51LT5zeW0tPm5hbWU7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9yb290X21lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJcmV0dXJuICZyb290bWVudTsKK30KKworc3RydWN0IG1lbnUgKm1lbnVfZ2V0X3BhcmVudF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlmb3IgKDsgbWVudSAhPSAmcm9vdG1lbnU7IG1lbnUgPSBtZW51LT5wYXJlbnQpIHsKKwkJdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IDA7CisJCWlmICh0eXBlID09IFBfTUVOVSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbWVudTsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZGJmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKQEAgLTAsMCArMSwxNDA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgorI2luY2x1ZGUgPHFtYWlud2luZG93Lmg+CisjaW5jbHVkZSA8cXRvb2xiYXIuaD4KKyNpbmNsdWRlIDxxdmJveC5oPgorI2luY2x1ZGUgPHFzcGxpdHRlci5oPgorI2luY2x1ZGUgPHFsaXN0dmlldy5oPgorI2luY2x1ZGUgPHF0ZXh0dmlldy5oPgorI2luY2x1ZGUgPHFsaW5lZWRpdC5oPgorI2luY2x1ZGUgPHFtZW51YmFyLmg+CisjaW5jbHVkZSA8cW1lc3NhZ2Vib3guaD4KKyNpbmNsdWRlIDxxYWN0aW9uLmg+CisjaW5jbHVkZSA8cWhlYWRlci5oPgorI2luY2x1ZGUgPHFmaWxlZGlhbG9nLmg+CisjaW5jbHVkZSA8cXJlZ2V4cC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsa2MuaCIKKyNpbmNsdWRlICJxY29uZi5oIgorCisjaW5jbHVkZSAicWNvbmYubW9jIgorI2luY2x1ZGUgImltYWdlcy5jIgorCitzdGF0aWMgUUFwcGxpY2F0aW9uICpjb25maWdBcHA7CisKK0NvbmZpZ1NldHRpbmdzOjpDb25maWdTZXR0aW5ncygpCisJOiBzaG93QWxsKGZhbHNlKSwgc2hvd05hbWUoZmFsc2UpLCBzaG93UmFuZ2UoZmFsc2UpLCBzaG93RGF0YShmYWxzZSkKK3sKK30KKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisvKioKKyAqIFJlYWRzIHRoZSBsaXN0IGNvbHVtbiBzZXR0aW5ncyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy4KKyAqLwordm9pZCBDb25maWdTZXR0aW5nczo6cmVhZExpc3RTZXR0aW5ncygpCit7CisJc2hvd0FsbCA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dBbGwiLCBmYWxzZSk7CisJc2hvd05hbWUgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93TmFtZSIsIGZhbHNlKTsKKwlzaG93UmFuZ2UgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93UmFuZ2UiLCBmYWxzZSk7CisJc2hvd0RhdGEgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGF0YSIsIGZhbHNlKTsKK30KKworLyoqCisgKiBSZWFkcyBhIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgZnJvbSB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MuCisgKi8KK1FWYWx1ZUxpc3Q8aW50PiBDb25maWdTZXR0aW5nczo6cmVhZFNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgYm9vbCAqb2spCit7CisJUVZhbHVlTGlzdDxpbnQ+IHJlc3VsdDsKKwlRU3RyaW5nTGlzdCBlbnRyeUxpc3QgPSByZWFkTGlzdEVudHJ5KGtleSwgb2spOworCWlmIChvaykgeworCQlRU3RyaW5nTGlzdDo6SXRlcmF0b3IgaXQ7CisJCWZvciAoaXQgPSBlbnRyeUxpc3QuYmVnaW4oKTsgaXQgIT0gZW50cnlMaXN0LmVuZCgpOyArK2l0KQorCQkJcmVzdWx0LnB1c2hfYmFjaygoKml0KS50b0ludCgpKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFdyaXRlcyBhIGxpc3Qgb2YgaW50ZWdlciB2YWx1ZXMgdG8gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgorICovCitib29sIENvbmZpZ1NldHRpbmdzOjp3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSkKK3sKKwlRU3RyaW5nTGlzdCBzdHJpbmdMaXN0OworCVFWYWx1ZUxpc3Q8aW50Pjo6Q29uc3RJdGVyYXRvciBpdDsKKworCWZvciAoaXQgPSB2YWx1ZS5iZWdpbigpOyBpdCAhPSB2YWx1ZS5lbmQoKTsgKytpdCkKKwkJc3RyaW5nTGlzdC5wdXNoX2JhY2soUVN0cmluZzo6bnVtYmVyKCppdCkpOworCXJldHVybiB3cml0ZUVudHJ5KGtleSwgc3RyaW5nTGlzdCk7Cit9CisjZW5kaWYKKworCisvKgorICogdXBkYXRlIGFsbCB0aGUgY2hpbGRyZW4gb2YgYSBtZW51IGVudHJ5CisgKiAgIHJlbW92ZXMvYWRkcyB0aGUgZW50cmllcyBmcm9tIHRoZSBwYXJlbnQgd2lkZ2V0IGFzIG5lY2Vzc2FyeQorICoKKyAqIHBhcmVudDogZWl0aGVyIHRoZSBtZW51IGxpc3Qgd2lkZ2V0IG9yIGEgbWVudSBlbnRyeSB3aWRnZXQKKyAqIG1lbnU6IGVudHJ5IHRvIGJlIHVwZGF0ZWQKKyAqLwordGVtcGxhdGUgPGNsYXNzIFA+Cit2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZU1lbnVMaXN0KFAqIHBhcmVudCwgc3RydWN0IG1lbnUqIG1lbnUpCit7CisJc3RydWN0IG1lbnUqIGNoaWxkOworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJQ29uZmlnSXRlbSogbGFzdDsKKwlib29sIHZpc2libGU7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmICghbWVudSkgeworCQl3aGlsZSAoKGl0ZW0gPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKSkpCisJCQlkZWxldGUgaXRlbTsKKwkJcmV0dXJuOworCX0KKworCWxhc3QgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKwlpZiAobGFzdCAmJiAhbGFzdC0+Z29QYXJlbnQpCisJCWxhc3QgPSAwOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlpdGVtID0gbGFzdCA/IGxhc3QtPm5leHRTaWJsaW5nKCkgOiBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKwkJdHlwZSA9IGNoaWxkLT5wcm9tcHQgPyBjaGlsZC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIG1lbnVNb2RlOgorCQkJaWYgKCEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJCQlnb3RvIGhpZGU7CisJCQlicmVhazsKKwkJY2FzZSBzeW1ib2xNb2RlOgorCQkJaWYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkKKwkJCQlnb3RvIGhpZGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJdmlzaWJsZSA9IG1lbnVfaXNfdmlzaWJsZShjaGlsZCk7CisJCWlmIChzaG93QWxsIHx8IHZpc2libGUpIHsKKwkJCWlmICghaXRlbSB8fCBpdGVtLT5tZW51ICE9IGNoaWxkKQorCQkJCWl0ZW0gPSBuZXcgQ29uZmlnSXRlbShwYXJlbnQsIGxhc3QsIGNoaWxkLCB2aXNpYmxlKTsKKwkJCWVsc2UKKwkJCQlpdGVtLT50ZXN0VXBkYXRlTWVudSh2aXNpYmxlKTsKKworCQkJaWYgKG1vZGUgPT0gZnVsbE1vZGUgfHwgbW9kZSA9PSBtZW51TW9kZSB8fCB0eXBlICE9IFBfTUVOVSkKKwkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCBjaGlsZCk7CisJCQllbHNlCisJCQkJdXBkYXRlTWVudUxpc3QoaXRlbSwgMCk7CisJCQlsYXN0ID0gaXRlbTsKKwkJCWNvbnRpbnVlOworCQl9CisJaGlkZToKKwkJaWYgKGl0ZW0gJiYgaXRlbS0+bWVudSA9PSBjaGlsZCkgeworCQkJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCQkJaWYgKGxhc3QgPT0gaXRlbSkKKwkJCQlsYXN0ID0gMDsKKwkJCWVsc2Ugd2hpbGUgKGxhc3QtPm5leHRTaWJsaW5nKCkgIT0gaXRlbSkKKwkJCQlsYXN0ID0gbGFzdC0+bmV4dFNpYmxpbmcoKTsKKwkJCWRlbGV0ZSBpdGVtOworCQl9CisJfQorfQorCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKy8qCisgKiBzZXQgdGhlIG5ldyBkYXRhCisgKiBUT0RPIGNoZWNrIHRoZSB2YWx1ZQorICovCit2b2lkIENvbmZpZ0l0ZW06Om9rUmVuYW1lKGludCBjb2wpCit7CisJUGFyZW50Ojpva1JlbmFtZShjb2wpOworCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgdGV4dChkYXRhQ29sSWR4KS5sYXRpbjEoKSk7Cit9CisjZW5kaWYKKworLyoKKyAqIHVwZGF0ZSB0aGUgZGlzcGxheWVkIG9mIGEgbWVudSBlbnRyeQorICovCit2b2lkIENvbmZpZ0l0ZW06OnVwZGF0ZU1lbnUodm9pZCkKK3sKKwlDb25maWdMaXN0KiBsaXN0OworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJUVN0cmluZyBwcm9tcHQ7CisJaW50IHR5cGU7CisJdHJpc3RhdGUgZXhwcjsKKworCWxpc3QgPSBsaXN0VmlldygpOworCWlmIChnb1BhcmVudCkgeworCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5tZW51QmFja1BpeCk7CisJCXByb21wdCA9ICIuLiI7CisJCWdvdG8gc2V0X3Byb21wdDsKKwl9CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisKKwlpZiAocHJvcCkgc3dpdGNoIChwcm9wLT50eXBlKSB7CisJY2FzZSBQX01FTlU6CisJCWlmIChsaXN0LT5tb2RlID09IHNpbmdsZU1vZGUgfHwgbGlzdC0+bW9kZSA9PSBzeW1ib2xNb2RlKSB7CisJCQkvKiBhIG1lbnVjb25maWcgZW50cnkgaXMgZGlzcGxheWVkIGRpZmZlcmVudGx5CisJCQkgKiBkZXBlbmRpbmcgd2hldGhlciBpdCdzIGF0IHRoZSB2aWV3IHJvb3Qgb3IgYSBjaGlsZC4KKwkJCSAqLworCQkJaWYgKHN5bSAmJiBsaXN0LT5yb290RW50cnkgPT0gbWVudSkKKwkJCQlicmVhazsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPm1lbnVQaXgpOworCQl9IGVsc2UgeworCQkJaWYgKHN5bSkKKwkJCQlicmVhazsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIDApOworCQl9CisJCWdvdG8gc2V0X3Byb21wdDsKKwljYXNlIFBfQ09NTUVOVDoKKwkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgMCk7CisJCWdvdG8gc2V0X3Byb21wdDsKKwlkZWZhdWx0OgorCQk7CisJfQorCWlmICghc3ltKQorCQlnb3RvIHNldF9wcm9tcHQ7CisKKwlzZXRUZXh0KG5hbWVDb2xJZHgsIHN5bS0+bmFtZSk7CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQljaGFyIGNoOworCisJCWlmICghc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmICFsaXN0LT5zaG93QWxsKSB7CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKKwkJCXNldFRleHQobm9Db2xJZHgsIDApOworCQkJc2V0VGV4dChtb2RDb2xJZHgsIDApOworCQkJc2V0VGV4dCh5ZXNDb2xJZHgsIDApOworCQkJYnJlYWs7CisJCX0KKwkJZXhwciA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChleHByKSB7CisJCWNhc2UgeWVzOgorCQkJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB0eXBlID09IFNfQk9PTEVBTikKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5jaG9pY2VZZXNQaXgpOworCQkJZWxzZQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPnN5bWJvbFllc1BpeCk7CisJCQlzZXRUZXh0KHllc0NvbElkeCwgIlkiKTsKKwkJCWNoID0gJ1knOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sTW9kUGl4KTsKKwkJCXNldFRleHQobW9kQ29sSWR4LCAiTSIpOworCQkJY2ggPSAnTSc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdHlwZSA9PSBTX0JPT0xFQU4pCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+Y2hvaWNlTm9QaXgpOworCQkJZWxzZQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPnN5bWJvbE5vUGl4KTsKKwkJCXNldFRleHQobm9Db2xJZHgsICJOIik7CisJCQljaCA9ICdOJzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChleHByICE9IG5vKQorCQkJc2V0VGV4dChub0NvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSA/ICJfIiA6IDApOworCQlpZiAoZXhwciAhPSBtb2QpCisJCQlzZXRUZXh0KG1vZENvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkgPyAiXyIgOiAwKTsKKwkJaWYgKGV4cHIgIT0geWVzKQorCQkJc2V0VGV4dCh5ZXNDb2xJZHgsIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpID8gIl8iIDogMCk7CisKKwkJc2V0VGV4dChkYXRhQ29sSWR4LCBRQ2hhcihjaCkpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJY29uc3QgY2hhciogZGF0YTsKKworCQlkYXRhID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCQlpbnQgaSA9IGxpc3QtPm1hcElkeChkYXRhQ29sSWR4KTsKKwkJaWYgKGkgPj0gMCkKKwkJCXNldFJlbmFtZUVuYWJsZWQoaSwgVFJVRSk7CisjZW5kaWYKKwkJc2V0VGV4dChkYXRhQ29sSWR4LCBkYXRhKTsKKwkJaWYgKHR5cGUgPT0gU19TVFJJTkcpCisJCQlwcm9tcHQuc3ByaW50ZigiJXM6ICVzIiwgcHJvbXB0LmxhdGluMSgpLCBkYXRhKTsKKwkJZWxzZQorCQkJcHJvbXB0LnNwcmludGYoIiglcykgJXMiLCBkYXRhLCBwcm9tcHQubGF0aW4xKCkpOworCQlicmVhazsKKwl9CisJaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkgJiYgdmlzaWJsZSkKKwkJcHJvbXB0ICs9ICIgKE5FVykiOworc2V0X3Byb21wdDoKKwlzZXRUZXh0KHByb21wdENvbElkeCwgcHJvbXB0KTsKK30KKwordm9pZCBDb25maWdJdGVtOjp0ZXN0VXBkYXRlTWVudShib29sIHYpCit7CisJQ29uZmlnSXRlbSogaTsKKworCXZpc2libGUgPSB2OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCisJc3ltX2NhbGNfdmFsdWUobWVudS0+c3ltKTsKKwlpZiAobWVudS0+ZmxhZ3MgJiBNRU5VX0NIQU5HRUQpIHsKKwkJLyogdGhlIG1lbnUgZW50cnkgY2hhbmdlZCwgc28gdXBkYXRlIGFsbCBsaXN0IGl0ZW1zICovCisJCW1lbnUtPmZsYWdzICY9IH5NRU5VX0NIQU5HRUQ7CisJCWZvciAoaSA9IChDb25maWdJdGVtKiltZW51LT5kYXRhOyBpOyBpID0gaS0+bmV4dEl0ZW0pCisJCQlpLT51cGRhdGVNZW51KCk7CisJfSBlbHNlIGlmIChsaXN0VmlldygpLT51cGRhdGVBbGwpCisJCXVwZGF0ZU1lbnUoKTsKK30KKwordm9pZCBDb25maWdJdGVtOjpwYWludENlbGwoUVBhaW50ZXIqIHAsIGNvbnN0IFFDb2xvckdyb3VwJiBjZywgaW50IGNvbHVtbiwgaW50IHdpZHRoLCBpbnQgYWxpZ24pCit7CisJQ29uZmlnTGlzdCogbGlzdCA9IGxpc3RWaWV3KCk7CisKKwlpZiAodmlzaWJsZSkgeworCQlpZiAoaXNTZWxlY3RlZCgpICYmICFsaXN0LT5oYXNGb2N1cygpICYmIGxpc3QtPm1vZGUgPT0gbWVudU1vZGUpCisJCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBsaXN0LT5pbmFjdGl2ZWRDb2xvckdyb3VwLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJCWVsc2UKKwkJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGNnLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJfSBlbHNlCisJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGxpc3QtPmRpc2FibGVkQ29sb3JHcm91cCwgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworfQorCisvKgorICogY29uc3RydWN0IGEgbWVudSBlbnRyeQorICovCit2b2lkIENvbmZpZ0l0ZW06OmluaXQodm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdMaXN0KiBsaXN0ID0gbGlzdFZpZXcoKTsKKwkJbmV4dEl0ZW0gPSAoQ29uZmlnSXRlbSopbWVudS0+ZGF0YTsKKwkJbWVudS0+ZGF0YSA9IHRoaXM7CisKKwkJaWYgKGxpc3QtPm1vZGUgIT0gZnVsbE1vZGUpCisJCQlzZXRPcGVuKFRSVUUpOworCQlzeW1fY2FsY192YWx1ZShtZW51LT5zeW0pOworCX0KKwl1cGRhdGVNZW51KCk7Cit9CisKKy8qCisgKiBkZXN0cnVjdCBhIG1lbnUgZW50cnkKKyAqLworQ29uZmlnSXRlbTo6fkNvbmZpZ0l0ZW0odm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdJdGVtKiogaXAgPSAoQ29uZmlnSXRlbSoqKSZtZW51LT5kYXRhOworCQlmb3IgKDsgKmlwOyBpcCA9ICYoKmlwKS0+bmV4dEl0ZW0pIHsKKwkJCWlmICgqaXAgPT0gdGhpcykgeworCQkJCSppcCA9IG5leHRJdGVtOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIENvbmZpZ0xpbmVFZGl0OjpzaG93KENvbmZpZ0l0ZW0qIGkpCit7CisJaXRlbSA9IGk7CisJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSkpCisJCXNldFRleHQoc3ltX2dldF9zdHJpbmdfdmFsdWUoaXRlbS0+bWVudS0+c3ltKSk7CisJZWxzZQorCQlzZXRUZXh0KDApOworCVBhcmVudDo6c2hvdygpOworCXNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTGluZUVkaXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBlKQoreworCXN3aXRjaCAoZS0+a2V5KCkpIHsKKwljYXNlIEtleV9Fc2NhcGU6CisJCWJyZWFrOworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJc3ltX3NldF9zdHJpbmdfdmFsdWUoaXRlbS0+bWVudS0+c3ltLCB0ZXh0KCkubGF0aW4xKCkpOworCQlwYXJlbnQoKS0+dXBkYXRlTGlzdChpdGVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGUpOworCQlyZXR1cm47CisJfQorCWUtPmFjY2VwdCgpOworCXBhcmVudCgpLT5saXN0LT5zZXRGb2N1cygpOworCWhpZGUoKTsKK30KKworQ29uZmlnTGlzdDo6Q29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdiwgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKQorCTogUGFyZW50KHApLCBjdmlldyhjdiksCisJICB1cGRhdGVBbGwoZmFsc2UpLAorCSAgc3ltYm9sWWVzUGl4KHhwbV9zeW1ib2xfeWVzKSwgc3ltYm9sTW9kUGl4KHhwbV9zeW1ib2xfbW9kKSwgc3ltYm9sTm9QaXgoeHBtX3N5bWJvbF9ubyksCisJICBjaG9pY2VZZXNQaXgoeHBtX2Nob2ljZV95ZXMpLCBjaG9pY2VOb1BpeCh4cG1fY2hvaWNlX25vKSwKKwkgIG1lbnVQaXgoeHBtX21lbnUpLCBtZW51SW52UGl4KHhwbV9tZW51X2ludiksIG1lbnVCYWNrUGl4KHhwbV9tZW51YmFjayksIHZvaWRQaXgoeHBtX3ZvaWQpLAorCSAgc2hvd0FsbChmYWxzZSksIHNob3dOYW1lKGZhbHNlKSwgc2hvd1JhbmdlKGZhbHNlKSwgc2hvd0RhdGEoZmFsc2UpLAorCSAgcm9vdEVudHJ5KDApCit7CisJaW50IGk7CisKKwlzZXRTb3J0aW5nKC0xKTsKKwlzZXRSb290SXNEZWNvcmF0ZWQoVFJVRSk7CisJZGlzYWJsZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWRpc2FibGVkQ29sb3JHcm91cC5zZXRDb2xvcihRQ29sb3JHcm91cDo6VGV4dCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkudGV4dCgpKTsKKwlpbmFjdGl2ZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWluYWN0aXZlZENvbG9yR3JvdXAuc2V0Q29sb3IoUUNvbG9yR3JvdXA6OkhpZ2hsaWdodCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkuaGlnaGxpZ2h0KCkpOworCisJY29ubmVjdCh0aGlzLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCh2b2lkKSksCisJCVNMT1QodXBkYXRlU2VsZWN0aW9uKHZvaWQpKSk7CisKKwlpZiAoY29uZmlnU2V0dGluZ3MpIHsKKwkJc2hvd0FsbCA9IGNvbmZpZ1NldHRpbmdzLT5zaG93QWxsOworCQlzaG93TmFtZSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93TmFtZTsKKwkJc2hvd1JhbmdlID0gY29uZmlnU2V0dGluZ3MtPnNob3dSYW5nZTsKKwkJc2hvd0RhdGEgPSBjb25maWdTZXR0aW5ncy0+c2hvd0RhdGE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvbE5yOyBpKyspCisJCWNvbE1hcFtpXSA9IGNvbFJldk1hcFtpXSA9IC0xOworCWFkZENvbHVtbihwcm9tcHRDb2xJZHgsICJPcHRpb24iKTsKKworCXJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnJlaW5pdCh2b2lkKQoreworCXJlbW92ZUNvbHVtbihkYXRhQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4oeWVzQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obW9kQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obm9Db2xJZHgpOworCXJlbW92ZUNvbHVtbihuYW1lQ29sSWR4KTsKKworCWlmIChzaG93TmFtZSkKKwkJYWRkQ29sdW1uKG5hbWVDb2xJZHgsICJOYW1lIik7CisJaWYgKHNob3dSYW5nZSkgeworCQlhZGRDb2x1bW4obm9Db2xJZHgsICJOIik7CisJCWFkZENvbHVtbihtb2RDb2xJZHgsICJNIik7CisJCWFkZENvbHVtbih5ZXNDb2xJZHgsICJZIik7CisJfQorCWlmIChzaG93RGF0YSkKKwkJYWRkQ29sdW1uKGRhdGFDb2xJZHgsICJWYWx1ZSIpOworCisJdXBkYXRlTGlzdEFsbCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZVNlbGVjdGlvbih2b2lkKQoreworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0qKXNlbGVjdGVkSXRlbSgpOworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJY3ZpZXctPnNldEhlbHAoaXRlbSk7CisKKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKwl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChtb2RlID09IG1lbnVNb2RlICYmIHR5cGUgPT0gUF9NRU5VKQorCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKK30KKwordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pCit7CisJQ29uZmlnSXRlbSogbGFzdCA9IDA7CisKKwlpZiAoIXJvb3RFbnRyeSkKKwkJZ290byB1cGRhdGU7CisKKwlpZiAocm9vdEVudHJ5ICE9ICZyb290bWVudSAmJiAobW9kZSA9PSBzaW5nbGVNb2RlIHx8CisJICAgIChtb2RlID09IHN5bWJvbE1vZGUgJiYgcm9vdEVudHJ5LT5wYXJlbnQgIT0gJnJvb3RtZW51KSkpIHsKKwkJaXRlbSA9IGZpcnN0Q2hpbGQoKTsKKwkJaWYgKCFpdGVtKQorCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHRoaXMsIDAsIHRydWUpOworCQlsYXN0ID0gaXRlbTsKKwl9CisJaWYgKChtb2RlID09IHNpbmdsZU1vZGUgfHwgKG1vZGUgPT0gc3ltYm9sTW9kZSAmJiAhKHJvb3RFbnRyeS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKSkgJiYKKwkgICAgcm9vdEVudHJ5LT5zeW0gJiYgcm9vdEVudHJ5LT5wcm9tcHQpIHsKKwkJaXRlbSA9IGxhc3QgPyBsYXN0LT5uZXh0U2libGluZygpIDogZmlyc3RDaGlsZCgpOworCQlpZiAoIWl0ZW0pCisJCQlpdGVtID0gbmV3IENvbmZpZ0l0ZW0odGhpcywgbGFzdCwgcm9vdEVudHJ5LCB0cnVlKTsKKwkJZWxzZQorCQkJaXRlbS0+dGVzdFVwZGF0ZU1lbnUodHJ1ZSk7CisKKwkJdXBkYXRlTWVudUxpc3QoaXRlbSwgcm9vdEVudHJ5KTsKKwkJdHJpZ2dlclVwZGF0ZSgpOworCQlyZXR1cm47CisJfQordXBkYXRlOgorCXVwZGF0ZU1lbnVMaXN0KHRoaXMsIHJvb3RFbnRyeSk7CisJdHJpZ2dlclVwZGF0ZSgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldEFsbE9wZW4oYm9vbCBvcGVuKQoreworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKworCWZvciAoOyBpdC5jdXJyZW50KCk7IGl0KyspCisJCWl0LmN1cnJlbnQoKS0+c2V0T3BlbihvcGVuKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRWYWx1ZShDb25maWdJdGVtKiBpdGVtLCB0cmlzdGF0ZSB2YWwpCit7CisJc3RydWN0IHN5bWJvbCogc3ltOworCWludCB0eXBlOworCXRyaXN0YXRlIG9sZHZhbDsKKworCXN5bSA9IGl0ZW0tPm1lbnUgPyBpdGVtLT5tZW51LT5zeW0gOiAwOworCWlmICghc3ltKQorCQlyZXR1cm47CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwkJaWYgKCFzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgdmFsKSkKKwkJCXJldHVybjsKKwkJaWYgKG9sZHZhbCA9PSBubyAmJiBpdGVtLT5tZW51LT5saXN0KQorCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBDb25maWdMaXN0OjpjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgbWVudSogbWVudTsKKwlpbnQgdHlwZSwgb2xkZXhwciwgbmV3ZXhwcjsKKworCW1lbnUgPSBpdGVtLT5tZW51OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoIXN5bSkgeworCQlpZiAoaXRlbS0+bWVudS0+bGlzdCkKKwkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJcmV0dXJuOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZGV4cHIgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCW5ld2V4cHIgPSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChpdGVtLT5tZW51LT5saXN0KSB7CisJCQlpZiAob2xkZXhwciA9PSBuZXdleHByKQorCQkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJCWVsc2UgaWYgKG9sZGV4cHIgPT0gbm8pCisJCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJfQorCQlpZiAob2xkZXhwciAhPSBuZXdleHByKQorCQkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJCWlmIChjb2xNYXBbZGF0YUNvbElkeF0gPj0gMCkKKwkJCWl0ZW0tPnN0YXJ0UmVuYW1lKGNvbE1hcFtkYXRhQ29sSWR4XSk7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFyZW50KCktPmxpbmVFZGl0LT5zaG93KGl0ZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0Um9vdE1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmIChyb290RW50cnkgPT0gbWVudSkKKwkJcmV0dXJuOworCXR5cGUgPSBtZW51ICYmIG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAodHlwZSAhPSBQX01FTlUpCisJCXJldHVybjsKKwl1cGRhdGVNZW51TGlzdCh0aGlzLCAwKTsKKwlyb290RW50cnkgPSBtZW51OworCXVwZGF0ZUxpc3RBbGwoKTsKKwlzZXRTZWxlY3RlZChjdXJyZW50SXRlbSgpLCBoYXNGb2N1cygpKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRQYXJlbnRNZW51KHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqb2xkcm9vdDsKKworCW9sZHJvb3QgPSByb290RW50cnk7CisJaWYgKHJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCXJldHVybjsKKwlzZXRSb290TWVudShtZW51X2dldF9wYXJlbnRfbWVudShyb290RW50cnktPnBhcmVudCkpOworCisJUUxpc3RWaWV3SXRlbUl0ZXJhdG9yIGl0KHRoaXMpOworCWZvciAoOyAoaXRlbSA9IChDb25maWdJdGVtKilpdC5jdXJyZW50KCkpOyBpdCsrKSB7CisJCWlmIChpdGVtLT5tZW51ID09IG9sZHJvb3QpIHsKKwkJCXNldEN1cnJlbnRJdGVtKGl0ZW0pOworCQkJZW5zdXJlSXRlbVZpc2libGUoaXRlbSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBDb25maWdMaXN0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZXYpCit7CisJUUxpc3RWaWV3SXRlbSogaSA9IGN1cnJlbnRJdGVtKCk7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKGV2LT5rZXkoKSA9PSBLZXlfRXNjYXBlICYmIG1vZGUgIT0gZnVsbE1vZGUpIHsKKwkJZW1pdCBwYXJlbnRTZWxlY3RlZCgpOworCQlldi0+YWNjZXB0KCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWkpIHsKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGV2KTsKKwkJcmV0dXJuOworCX0KKwlpdGVtID0gKENvbmZpZ0l0ZW0qKWk7CisKKwlzd2l0Y2ggKGV2LT5rZXkoKSkgeworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCQlicmVhazsKKwkJfQorCQltZW51ID0gaXRlbS0+bWVudTsKKwkJaWYgKCFtZW51KQorCQkJYnJlYWs7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCWlmICh0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkgICAgbW9kZSAhPSBmdWxsTW9kZSAmJiBtb2RlICE9IG1lbnVNb2RlKSB7CisJCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBLZXlfU3BhY2U6CisJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQlicmVhazsKKwljYXNlIEtleV9OOgorCQlzZXRWYWx1ZShpdGVtLCBubyk7CisJCWJyZWFrOworCWNhc2UgS2V5X006CisJCXNldFZhbHVlKGl0ZW0sIG1vZCk7CisJCWJyZWFrOworCWNhc2UgS2V5X1k6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChldik7CisJCXJldHVybjsKKwl9CisJZXYtPmFjY2VwdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCS8vUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VQcmVzc0V2ZW50OiAlZCwlZFxuIiwgcC54KCksIHAueSgpKTsKKwlQYXJlbnQ6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKilpdGVtQXQocCk7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJY29uc3QgUVBpeG1hcCogcG07CisJaW50IGlkeCwgeDsKKworCWlmICghaXRlbSkKKwkJZ290byBza2lwOworCisJbWVudSA9IGl0ZW0tPm1lbnU7CisJeCA9IGhlYWRlcigpLT5vZmZzZXQoKSArIHAueCgpOworCWlkeCA9IGNvbFJldk1hcFtoZWFkZXIoKS0+c2VjdGlvbkF0KHgpXTsKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgcHJvbXB0Q29sSWR4OgorCQlwbSA9IGl0ZW0tPnBpeG1hcChwcm9tcHRDb2xJZHgpOworCQlpZiAocG0pIHsKKwkJCWludCBvZmYgPSBoZWFkZXIoKS0+c2VjdGlvblBvcygwKSArIGl0ZW1NYXJnaW4oKSArCisJCQkJdHJlZVN0ZXBTaXplKCkgKiAoaXRlbS0+ZGVwdGgoKSArIChyb290SXNEZWNvcmF0ZWQoKSA/IDEgOiAwKSk7CisJCQlpZiAoeCA+PSBvZmYgJiYgeCA8IG9mZiArIHBtLT53aWR0aCgpKSB7CisJCQkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQkJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmICghbWVudSkKKwkJCQkJYnJlYWs7CisJCQkJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCQkJaWYgKHB0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkJCSAgICBtb2RlICE9IGZ1bGxNb2RlICYmIG1vZGUgIT0gbWVudU1vZGUpCisJCQkJCWVtaXQgbWVudVNlbGVjdGVkKG1lbnUpOworCQkJCWVsc2UKKwkJCQkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBub0NvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbm8pOworCQlicmVhazsKKwljYXNlIG1vZENvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbW9kKTsKKwkJYnJlYWs7CisJY2FzZSB5ZXNDb2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWNhc2UgZGF0YUNvbElkeDoKKwkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCWJyZWFrOworCX0KKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZVJlbGVhc2VFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJLy9RUG9pbnQgcChjb250ZW50c1RvVmlld3BvcnQoZS0+cG9zKCkpKTsKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZU1vdmVFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlTW92ZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCVFQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCUNvbmZpZ0l0ZW0qIGl0ZW0gPSAoQ29uZmlnSXRlbSopaXRlbUF0KHApOworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCisJaWYgKCFpdGVtKQorCQlnb3RvIHNraXA7CisJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJZ290byBza2lwOworCX0KKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCWdvdG8gc2tpcDsKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAocHR5cGUgPT0gUF9NRU5VICYmIChtb2RlID09IHNpbmdsZU1vZGUgfHwgbW9kZSA9PSBzeW1ib2xNb2RlKSkKKwkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQljaGFuZ2VWYWx1ZShpdGVtKTsKKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoZSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKQoreworCVBhcmVudDo6Zm9jdXNJbkV2ZW50KGUpOworCisJUUxpc3RWaWV3SXRlbSogaXRlbSA9IGN1cnJlbnRJdGVtKCk7CisJaWYgKCFpdGVtKQorCQlyZXR1cm47CisKKwlzZXRTZWxlY3RlZChpdGVtLCBUUlVFKTsKKwllbWl0IGdvdEZvY3VzKCk7Cit9CisKK0NvbmZpZ1ZpZXcqIENvbmZpZ1ZpZXc6OnZpZXdMaXN0OworCitDb25maWdWaWV3OjpDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsCisJCSAgICAgICBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpCisJOiBQYXJlbnQocGFyZW50KQoreworCWxpc3QgPSBuZXcgQ29uZmlnTGlzdCh0aGlzLCBjdmlldywgY29uZmlnU2V0dGluZ3MpOworCWxpbmVFZGl0ID0gbmV3IENvbmZpZ0xpbmVFZGl0KHRoaXMpOworCWxpbmVFZGl0LT5oaWRlKCk7CisKKwl0aGlzLT5uZXh0VmlldyA9IHZpZXdMaXN0OworCXZpZXdMaXN0ID0gdGhpczsKK30KKworQ29uZmlnVmlldzo6fkNvbmZpZ1ZpZXcodm9pZCkKK3sKKwlDb25maWdWaWV3KiogdnA7CisKKwlmb3IgKHZwID0gJnZpZXdMaXN0OyAqdnA7IHZwID0gJigqdnApLT5uZXh0VmlldykgeworCQlpZiAoKnZwID09IHRoaXMpIHsKKwkJCSp2cCA9IG5leHRWaWV3OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29uZmlnVmlldzo6dXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKQoreworCUNvbmZpZ1ZpZXcqIHY7CisKKwlmb3IgKHYgPSB2aWV3TGlzdDsgdjsgdiA9IHYtPm5leHRWaWV3KQorCQl2LT5saXN0LT51cGRhdGVMaXN0KGl0ZW0pOworfQorCit2b2lkIENvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3RBbGwodm9pZCkKK3sKKwlDb25maWdWaWV3KiB2OworCisJZm9yICh2ID0gdmlld0xpc3Q7IHY7IHYgPSB2LT5uZXh0VmlldykKKwkJdi0+bGlzdC0+dXBkYXRlTGlzdEFsbCgpOworfQorCisvKgorICogQ29uc3RydWN0IHRoZSBjb21wbGV0ZSBjb25maWcgd2lkZ2V0CisgKi8KK0NvbmZpZ01haW5XaW5kb3c6OkNvbmZpZ01haW5XaW5kb3codm9pZCkKK3sKKwlRTWVudUJhciogbWVudTsKKwlib29sIG9rOworCWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCisJUVdpZGdldCAqZCA9IGNvbmZpZ0FwcC0+ZGVza3RvcCgpOworCisJQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzID0gbmV3IENvbmZpZ1NldHRpbmdzKCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl3aWR0aCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIGQtPndpZHRoKCkgLSA2NCk7CisJaGVpZ2h0ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIGQtPmhlaWdodCgpIC0gNjQpOworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwl4ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCAwLCAmb2spOworCWlmIChvaykKKwkJeSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB5IiwgMCwgJm9rKTsKKwlpZiAob2spCisJCW1vdmUoeCwgeSk7CisJc2hvd0RlYnVnID0gY29uZmlnU2V0dGluZ3MtPnJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEZWJ1ZyIsIGZhbHNlKTsKKworCS8vIHJlYWQgbGlzdCBzZXR0aW5ncyBpbnRvIGNvbmZpZ1NldHRpbmdzLCB3aWxsIGJlIHVzZWQgbGF0ZXIgZm9yIENvbmZpZ0xpc3Qgc2V0dXAKKwljb25maWdTZXR0aW5ncy0+cmVhZExpc3RTZXR0aW5ncygpOworI2Vsc2UKKwl3aWR0aCA9IGQtPndpZHRoKCkgLSA2NDsKKwloZWlnaHQgPSBkLT5oZWlnaHQoKSAtIDY0OworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwlzaG93RGVidWcgPSBmYWxzZTsKKyNlbmRpZgorCisJc3BsaXQxID0gbmV3IFFTcGxpdHRlcih0aGlzKTsKKwlzcGxpdDEtPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6SG9yaXpvbnRhbCk7CisJc2V0Q2VudHJhbFdpZGdldChzcGxpdDEpOworCisJbWVudVZpZXcgPSBuZXcgQ29uZmlnVmlldyhzcGxpdDEsIHRoaXMsIGNvbmZpZ1NldHRpbmdzKTsKKwltZW51TGlzdCA9IG1lbnVWaWV3LT5saXN0OworCisJc3BsaXQyID0gbmV3IFFTcGxpdHRlcihzcGxpdDEpOworCXNwbGl0Mi0+c2V0T3JpZW50YXRpb24oUVNwbGl0dGVyOjpWZXJ0aWNhbCk7CisKKwkvLyBjcmVhdGUgY29uZmlnIHRyZWUKKwljb25maWdWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQyLCB0aGlzLCBjb25maWdTZXR0aW5ncyk7CisJY29uZmlnTGlzdCA9IGNvbmZpZ1ZpZXctPmxpc3Q7CisKKwloZWxwVGV4dCA9IG5ldyBRVGV4dFZpZXcoc3BsaXQyKTsKKwloZWxwVGV4dC0+c2V0VGV4dEZvcm1hdChRdDo6UmljaFRleHQpOworCisJc2V0VGFiT3JkZXIoY29uZmlnTGlzdCwgaGVscFRleHQpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7CisKKwltZW51ID0gbWVudUJhcigpOworCXRvb2xCYXIgPSBuZXcgUVRvb2xCYXIoIlRvb2xzIiwgdGhpcyk7CisKKwliYWNrQWN0aW9uID0gbmV3IFFBY3Rpb24oIkJhY2siLCBRUGl4bWFwKHhwbV9iYWNrKSwgIkJhY2siLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoYmFja0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChnb0JhY2soKSkpOworCSAgYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJUUFjdGlvbiAqcXVpdEFjdGlvbiA9IG5ldyBRQWN0aW9uKCJRdWl0IiwgIiZRdWl0IiwgQ1RSTCtLZXlfUSwgdGhpcyk7CisJICBjb25uZWN0KHF1aXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoY2xvc2UoKSkpOworCVFBY3Rpb24gKmxvYWRBY3Rpb24gPSBuZXcgUUFjdGlvbigiTG9hZCIsIFFQaXhtYXAoeHBtX2xvYWQpLCAiJkxvYWQiLCBDVFJMK0tleV9MLCB0aGlzKTsKKwkgIGNvbm5lY3QobG9hZEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChsb2FkQ29uZmlnKCkpKTsKKwlRQWN0aW9uICpzYXZlQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUiLCBRUGl4bWFwKHhwbV9zYXZlKSwgIiZTYXZlIiwgQ1RSTCtLZXlfUywgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2F2ZUNvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFzQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUgQXMuLi4iLCAiU2F2ZSAmQXMuLi4iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2F2ZUFzQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWdBcygpKSk7CisJUUFjdGlvbiAqc2luZ2xlVmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaW5nbGUgVmlldyIsIFFQaXhtYXAoeHBtX3NpbmdsZV92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2luZ2xlVmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93U2luZ2xlVmlldygpKSk7CisJUUFjdGlvbiAqc3BsaXRWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIlNwbGl0IFZpZXciLCBRUGl4bWFwKHhwbV9zcGxpdF92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc3BsaXRWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dTcGxpdFZpZXcoKSkpOworCVFBY3Rpb24gKmZ1bGxWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIkZ1bGwgVmlldyIsIFFQaXhtYXAoeHBtX3RyZWVfdmlldyksICJGdWxsIFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoZnVsbFZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0Z1bGxWaWV3KCkpKTsKKworCVFBY3Rpb24gKnNob3dOYW1lQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgTmFtZSIsIDAsIHRoaXMpOworCSAgc2hvd05hbWVBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dOYW1lQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93TmFtZSk7CisJICBjb25uZWN0KHNob3dOYW1lQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd05hbWUoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93UmFuZ2VBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBSYW5nZSIsIDAsIHRoaXMpOworCSAgc2hvd1JhbmdlQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93UmFuZ2VBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJICBjb25uZWN0KHNob3dSYW5nZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dSYW5nZShib29sKSkpOworCVFBY3Rpb24gKnNob3dEYXRhQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgRGF0YSIsIDAsIHRoaXMpOworCSAgc2hvd0RhdGFBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dEYXRhQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93RGF0YSk7CisJICBjb25uZWN0KHNob3dEYXRhQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RhdGEoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93QWxsQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgQWxsIE9wdGlvbnMiLCAwLCB0aGlzKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dBbGwpOworCSAgY29ubmVjdChzaG93QWxsQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0FsbChib29sKSkpOworCVFBY3Rpb24gKnNob3dEZWJ1Z0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERlYnVnIEluZm8iLCAwLCB0aGlzKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgc2hvd0RlYnVnQWN0aW9uLT5zZXRPbihzaG93RGVidWcpOworCSAgY29ubmVjdChzaG93RGVidWdBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93RGVidWcoYm9vbCkpKTsKKworCVFBY3Rpb24gKnNob3dJbnRyb0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJJbnRyb2R1Y3Rpb24iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2hvd0ludHJvQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dJbnRybygpKSk7CisJUUFjdGlvbiAqc2hvd0Fib3V0QWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIkFib3V0IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dBYm91dEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93QWJvdXQoKSkpOworCisJLy8gaW5pdCB0b29sIGJhcgorCWJhY2tBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCWxvYWRBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNhdmVBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCXNpbmdsZVZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNwbGl0Vmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7CisJZnVsbFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCisJLy8gY3JlYXRlIGNvbmZpZyBtZW51CisJUVBvcHVwTWVudSogY29uZmlnID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkZpbGUiLCBjb25maWcpOworCWxvYWRBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKwlzYXZlQXNBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJY29uZmlnLT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlxdWl0QWN0aW9uLT5hZGRUbyhjb25maWcpOworCisJLy8gY3JlYXRlIG9wdGlvbnMgbWVudQorCVFQb3B1cE1lbnUqIG9wdGlvbk1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRJdGVtKCImT3B0aW9uIiwgb3B0aW9uTWVudSk7CisJc2hvd05hbWVBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dSYW5nZUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisJc2hvd0RhdGFBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCW9wdGlvbk1lbnUtPmluc2VydFNlcGFyYXRvcigpOworCXNob3dBbGxBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEZWJ1Z0FjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisKKwkvLyBjcmVhdGUgaGVscCBtZW51CisJUVBvcHVwTWVudSogaGVscE1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwltZW51LT5pbnNlcnRJdGVtKCImSGVscCIsIGhlbHBNZW51KTsKKwlzaG93SW50cm9BY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKwlzaG93QWJvdXRBY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKHBhcmVudFNlbGVjdGVkKCkpLAorCQlTTE9UKGdvQmFjaygpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCisJY29ubmVjdChjb25maWdMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKwljb25uZWN0KG1lbnVMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJUVN0cmluZyBsaXN0TW9kZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgInN5bWJvbCIpOworCWlmIChsaXN0TW9kZSA9PSAic2luZ2xlIikKKwkJc2hvd1NpbmdsZVZpZXcoKTsKKwllbHNlIGlmIChsaXN0TW9kZSA9PSAiZnVsbCIpCisJCXNob3dGdWxsVmlldygpOworCWVsc2UgLyppZiAobGlzdE1vZGUgPT0gInNwbGl0IikqLworCQlzaG93U3BsaXRWaWV3KCk7CisKKwkvLyBVSSBzZXR1cCBkb25lLCByZXN0b3JlIHNwbGl0dGVyIHBvc2l0aW9ucworCVFWYWx1ZUxpc3Q8aW50PiBzaXplcyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MSIsICZvayk7CisJaWYgKG9rKQorCQlzcGxpdDEtPnNldFNpemVzKHNpemVzKTsKKworCXNpemVzID0gY29uZmlnU2V0dGluZ3MtPnJlYWRTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQyIiwgJm9rKTsKKwlpZiAob2spCisJCXNwbGl0Mi0+c2V0U2l6ZXMoc2l6ZXMpOworI2Vsc2UKKwlzaG93U3BsaXRWaWV3KCk7CisjZW5kaWYKKwlkZWxldGUgY29uZmlnU2V0dGluZ3M7Cit9CisKK3N0YXRpYyBRU3RyaW5nIHByaW50X2ZpbHRlcihjb25zdCBjaGFyICpzdHIpCit7CisJUVJlZ0V4cCByZSgiWzw+JlwiXFxuXSIpOworCVFTdHJpbmcgcmVzID0gc3RyOworCWZvciAoaW50IGkgPSAwOyAoaSA9IHJlcy5maW5kKHJlLCBpKSkgPj0gMDspIHsKKwkJc3dpdGNoIChyZXNbaV0ubGF0aW4xKCkpIHsKKwkJY2FzZSAnPCc6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiJmx0OyIpOworCQkJaSArPSA0OworCQkJYnJlYWs7CisJCWNhc2UgJz4nOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZndDsiKTsKKwkJCWkgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlICcmJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImYW1wOyIpOworCQkJaSArPSA1OworCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZxdW90OyIpOworCQkJaSArPSA2OworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICI8YnI+Iik7CisJCQlpICs9IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2hlbHAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCSgoUVN0cmluZyopZGF0YSktPmFwcGVuZChwcmludF9maWx0ZXIoc3RyKSk7Cit9CisKKy8qCisgKiBkaXNwbGF5IGEgbmV3IGhlbHAgZW50cnkgYXMgc29vbiBhcyBhIG5ldyBtZW51IGVudHJ5IGlzIHNlbGVjdGVkCisgKi8KK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0SGVscChRTGlzdFZpZXdJdGVtKiBpdGVtKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgbWVudSogbWVudSA9IDA7CisKKwljb25maWdMaXN0LT5wYXJlbnQoKS0+bGluZUVkaXQtPmhpZGUoKTsKKwlpZiAoaXRlbSkKKwkJbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7CisJaWYgKCFtZW51KSB7CisJCWhlbHBUZXh0LT5zZXRUZXh0KE5VTEwpOworCQlyZXR1cm47CisJfQorCisJUVN0cmluZyBoZWFkLCBkZWJ1ZywgaGVscDsKKwltZW51ID0gKChDb25maWdJdGVtKilpdGVtKS0+bWVudTsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlpZiAobWVudS0+cHJvbXB0KSB7CisJCQloZWFkICs9ICI8YmlnPjxiPiI7CisJCQloZWFkICs9IHByaW50X2ZpbHRlcihtZW51LT5wcm9tcHQtPnRleHQpOworCQkJaGVhZCArPSAiPC9iPjwvYmlnPiI7CisJCQlpZiAoc3ltLT5uYW1lKSB7CisJCQkJaGVhZCArPSAiICgiOworCQkJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKHN5bS0+bmFtZSk7CisJCQkJaGVhZCArPSAiKSI7CisJCQl9CisJCX0gZWxzZSBpZiAoc3ltLT5uYW1lKSB7CisJCQloZWFkICs9ICI8YmlnPjxiPiI7CisJCQloZWFkICs9IHByaW50X2ZpbHRlcihzeW0tPm5hbWUpOworCQkJaGVhZCArPSAiPC9iPjwvYmlnPiI7CisJCX0KKwkJaGVhZCArPSAiPGJyPjxicj4iOworCisJCWlmIChzaG93RGVidWcpIHsKKwkJCWRlYnVnICs9ICJ0eXBlOiAiOworCQkJZGVidWcgKz0gcHJpbnRfZmlsdGVyKHN5bV90eXBlX25hbWUoc3ltLT50eXBlKSk7CisJCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJCWRlYnVnICs9ICIgKGNob2ljZSkiOworCQkJZGVidWcgKz0gIjxicj4iOworCQkJaWYgKHN5bS0+cmV2X2RlcC5leHByKSB7CisJCQkJZGVidWcgKz0gInJldmVyc2UgZGVwOiAiOworCQkJCWV4cHJfcHJpbnQoc3ltLT5yZXZfZGVwLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCX0KKwkJCWZvciAoc3RydWN0IHByb3BlcnR5ICpwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJCWNhc2UgUF9QUk9NUFQ6CisJCQkJY2FzZSBQX01FTlU6CisJCQkJCWRlYnVnICs9ICJwcm9tcHQ6ICI7CisJCQkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihwcm9wLT50ZXh0KTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBfREVGQVVMVDoKKwkJCQkJZGVidWcgKz0gImRlZmF1bHQ6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX0NIT0lDRToKKwkJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJCQkJZGVidWcgKz0gImNob2ljZTogIjsKKwkJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX1NFTEVDVDoKKwkJCQkJZGVidWcgKz0gInNlbGVjdDogIjsKKwkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQlicmVhazsKKwkJCQljYXNlIFBfUkFOR0U6CisJCQkJCWRlYnVnICs9ICJyYW5nZTogIjsKKwkJCQkJZXhwcl9wcmludChwcm9wLT5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlkZWJ1ZyArPSAidW5rbm93biBwcm9wZXJ0eTogIjsKKwkJCQkJZGVidWcgKz0gcHJvcF9nZXRfdHlwZV9uYW1lKHByb3AtPnR5cGUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJfQorCQkJCWlmIChwcm9wLT52aXNpYmxlLmV4cHIpIHsKKwkJCQkJZGVidWcgKz0gIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2RlcDogIjsKKwkJCQkJZXhwcl9wcmludChwcm9wLT52aXNpYmxlLmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJfQorCQkJfQorCQkJZGVidWcgKz0gIjxicj4iOworCQl9CisKKwkJaGVscCA9IHByaW50X2ZpbHRlcihzeW0tPmhlbHApOworCX0gZWxzZSBpZiAobWVudS0+cHJvbXB0KSB7CisJCWhlYWQgKz0gIjxiaWc+PGI+IjsKKwkJaGVhZCArPSBwcmludF9maWx0ZXIobWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJaGVhZCArPSAiPC9iPjwvYmlnPjxicj48YnI+IjsKKwkJaWYgKHNob3dEZWJ1ZykgeworCQkJaWYgKG1lbnUtPnByb21wdC0+dmlzaWJsZS5leHByKSB7CisJCQkJZGVidWcgKz0gIiZuYnNwOyZuYnNwO2RlcDogIjsKKwkJCQlleHByX3ByaW50KG1lbnUtPnByb21wdC0+dmlzaWJsZS5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQlkZWJ1ZyArPSAiPGJyPjxicj4iOworCQkJfQorCQl9CisJfQorCWlmIChzaG93RGVidWcpCisJCWRlYnVnICs9IFFTdHJpbmcoKS5zcHJpbnRmKCJkZWZpbmVkIGF0ICVzOiVkPGJyPjxicj4iLCBtZW51LT5maWxlLT5uYW1lLCBtZW51LT5saW5lbm8pOworCWhlbHBUZXh0LT5zZXRUZXh0KGhlYWQgKyBkZWJ1ZyArIGhlbHApOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmxvYWRDb25maWcodm9pZCkKK3sKKwlRU3RyaW5nIHMgPSBRRmlsZURpYWxvZzo6Z2V0T3BlbkZpbGVOYW1lKCIuY29uZmlnIiwgTlVMTCwgdGhpcyk7CisJaWYgKHMuaXNOdWxsKCkpCisJCXJldHVybjsKKwlpZiAoY29uZl9yZWFkKHMubGF0aW4xKCkpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24hIik7CisJQ29uZmlnVmlldzo6dXBkYXRlTGlzdEFsbCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWcodm9pZCkKK3sKKwlpZiAoY29uZl93cml0ZShOVUxMKSkKKwkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWdBcyh2b2lkKQoreworCVFTdHJpbmcgcyA9IFFGaWxlRGlhbG9nOjpnZXRTYXZlRmlsZU5hbWUoIi5jb25maWciLCBOVUxMLCB0aGlzKTsKKwlpZiAocy5pc051bGwoKSkKKwkJcmV0dXJuOworCWlmIChjb25mX3dyaXRlKHMubGF0aW4xKCkpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Y2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25maWdMaXN0LT5zZXRSb290TWVudShtZW51KTsKKwliYWNrQWN0aW9uLT5zZXRFbmFibGVkKFRSVUUpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6Omxpc3RGb2N1c0NoYW5nZWQodm9pZCkKK3sKKwlpZiAobWVudUxpc3QtPmhhc0ZvY3VzKCkpIHsKKwkJaWYgKG1lbnVMaXN0LT5tb2RlID09IG1lbnVNb2RlKQorCQkJY29uZmlnTGlzdC0+Y2xlYXJTZWxlY3Rpb24oKTsKKwkJc2V0SGVscChtZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCkpOworCX0gZWxzZSBpZiAoY29uZmlnTGlzdC0+aGFzRm9jdXMoKSkgeworCQlzZXRIZWxwKGNvbmZpZ0xpc3QtPnNlbGVjdGVkSXRlbSgpKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Z29CYWNrKHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKworCWNvbmZpZ0xpc3QtPnNldFBhcmVudE1lbnUoKTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJaXRlbSA9IChDb25maWdJdGVtKiltZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCk7CisJd2hpbGUgKGl0ZW0pIHsKKwkJaWYgKGl0ZW0tPm1lbnUgPT0gY29uZmlnTGlzdC0+cm9vdEVudHJ5KSB7CisJCQltZW51TGlzdC0+c2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJCQlicmVhazsKKwkJfQorCQlpdGVtID0gKENvbmZpZ0l0ZW0qKWl0ZW0tPnBhcmVudCgpOworCX0KK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U2luZ2xlVmlldyh2b2lkKQoreworCW1lbnVWaWV3LT5oaWRlKCk7CisJbWVudUxpc3QtPnNldFJvb3RNZW51KDApOworCWNvbmZpZ0xpc3QtPm1vZGUgPSBzaW5nbGVNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oVFJVRSk7CisJY29uZmlnTGlzdC0+c2V0Rm9jdXMoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U3BsaXRWaWV3KHZvaWQpCit7CisJY29uZmlnTGlzdC0+bW9kZSA9IHN5bWJvbE1vZGU7CisJaWYgKGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwllbHNlCisJCWNvbmZpZ0xpc3QtPnNldFJvb3RNZW51KCZyb290bWVudSk7CisJY29uZmlnTGlzdC0+c2V0QWxsT3BlbihUUlVFKTsKKwljb25maWdBcHAtPnByb2Nlc3NFdmVudHMoKTsKKwltZW51TGlzdC0+bW9kZSA9IG1lbnVNb2RlOworCW1lbnVMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCW1lbnVMaXN0LT5zZXRBbGxPcGVuKFRSVUUpOworCW1lbnVWaWV3LT5zaG93KCk7CisJbWVudUxpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd0Z1bGxWaWV3KHZvaWQpCit7CisJbWVudVZpZXctPmhpZGUoKTsKKwltZW51TGlzdC0+c2V0Um9vdE1lbnUoMCk7CisJY29uZmlnTGlzdC0+bW9kZSA9IGZ1bGxNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oRkFMU0UpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0FsbChib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dBbGwgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dBbGwgPSBiOworCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwltZW51TGlzdC0+c2hvd0FsbCA9IGI7CisJbWVudUxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93RGVidWcoYm9vbCBiKQoreworCWlmIChzaG93RGVidWcgPT0gYikKKwkJcmV0dXJuOworCXNob3dEZWJ1ZyA9IGI7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd05hbWUoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93TmFtZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd05hbWUgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93TmFtZSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dSYW5nZShib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd1JhbmdlID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd1JhbmdlID0gYjsKKwltZW51TGlzdC0+cmVpbml0KCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RhdGEoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93RGF0YSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd0RhdGEgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93RGF0YSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCisvKgorICogYXNrIGZvciBzYXZpbmcgY29uZmlndXJhdGlvbiBiZWZvcmUgcXVpdHRpbmcKKyAqIFRPRE8gYXNrIG9ubHkgd2hlbiBzb21ldGhpbmcgY2hhbmdlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGUpCit7CisJaWYgKCFzeW1fY2hhbmdlX2NvdW50KSB7CisJCWUtPmFjY2VwdCgpOworCQlyZXR1cm47CisJfQorCVFNZXNzYWdlQm94IG1iKCJxY29uZiIsICJTYXZlIGNvbmZpZ3VyYXRpb24/IiwgUU1lc3NhZ2VCb3g6Oldhcm5pbmcsCisJCQlRTWVzc2FnZUJveDo6WWVzIHwgUU1lc3NhZ2VCb3g6OkRlZmF1bHQsIFFNZXNzYWdlQm94OjpObywgUU1lc3NhZ2VCb3g6OkNhbmNlbCB8IFFNZXNzYWdlQm94OjpFc2NhcGUpOworCW1iLnNldEJ1dHRvblRleHQoUU1lc3NhZ2VCb3g6OlllcywgIiZTYXZlIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpObywgIiZEaXNjYXJkIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpDYW5jZWwsICJDYW5jZWwgRXhpdCIpOworCXN3aXRjaCAobWIuZXhlYygpKSB7CisJY2FzZSBRTWVzc2FnZUJveDo6WWVzOgorCQljb25mX3dyaXRlKE5VTEwpOworCWNhc2UgUU1lc3NhZ2VCb3g6Ok5vOgorCQllLT5hY2NlcHQoKTsKKwkJYnJlYWs7CisJY2FzZSBRTWVzc2FnZUJveDo6Q2FuY2VsOgorCQllLT5pZ25vcmUoKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dJbnRybyh2b2lkKQoreworCXN0YXRpYyBjaGFyIHN0cltdID0gIldlbGNvbWUgdG8gdGhlIHFjb25mIGdyYXBoaWNhbCBrZXJuZWwgY29uZmlndXJhdGlvbiB0b29sIGZvciBMaW51eC5cblxuIgorCQkiRm9yIGVhY2ggb3B0aW9uLCBhIGJsYW5rIGJveCBpbmRpY2F0ZXMgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGEgY2hlY2tcbiIKKwkJImluZGljYXRlcyBpdCBpcyBlbmFibGVkLCBhbmQgYSBkb3QgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdG8gYmUgY29tcGlsZWRcbiIKKwkJImFzIGEgbW9kdWxlLiAgQ2xpY2tpbmcgb24gdGhlIGJveCB3aWxsIGN5Y2xlIHRocm91Z2ggdGhlIHRocmVlIHN0YXRlcy5cblxuIgorCQkiSWYgeW91IGRvIG5vdCBzZWUgYW4gb3B0aW9uIChlLmcuLCBhIGRldmljZSBkcml2ZXIpIHRoYXQgeW91IGJlbGlldmVcbiIKKwkJInNob3VsZCBiZSBwcmVzZW50LCB0cnkgdHVybmluZyBvbiBTaG93IEFsbCBPcHRpb25zIHVuZGVyIHRoZSBPcHRpb25zIG1lbnUuXG4iCisJCSJBbHRob3VnaCB0aGVyZSBpcyBubyBjcm9zcyByZWZlcmVuY2UgeWV0IHRvIGhlbHAgeW91IGZpZ3VyZSBvdXQgd2hhdCBvdGhlclxuIgorCQkib3B0aW9ucyBtdXN0IGJlIGVuYWJsZWQgdG8gc3VwcG9ydCB0aGUgb3B0aW9uIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiwgeW91IGNhblxuIgorCQkic3RpbGwgdmlldyB0aGUgaGVscCBvZiBhIGdyYXllZC1vdXQgb3B0aW9uLlxuXG4iCisJCSJUb2dnbGluZyBTaG93IERlYnVnIEluZm8gdW5kZXIgdGhlIE9wdGlvbnMgbWVudSB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyxcbiIKKwkJIndoaWNoIHlvdSBjYW4gdGhlbiBtYXRjaCBieSBleGFtaW5pbmcgb3RoZXIgb3B0aW9ucy5cblxuIjsKKworCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCBzdHIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dBYm91dCh2b2lkKQoreworCXN0YXRpYyBjaGFyIHN0cltdID0gInFjb25mIGlzIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4uXG5cbiIKKwkJIkJ1ZyByZXBvcnRzIGFuZCBmZWF0dXJlIHJlcXVlc3QgY2FuIGFsc28gYmUgZW50ZXJlZCBhdCBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy9cbiI7CisKKwlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgc3RyKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlU2V0dGluZ3Modm9pZCkKK3sKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCUNvbmZpZ1NldHRpbmdzICpjb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5nczsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCBwb3MoKS54KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeSIsIHBvcygpLnkoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIHNpemUoKS53aWR0aCgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIHNpemUoKS5oZWlnaHQoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgY29uZmlnTGlzdC0+c2hvd05hbWUpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93UmFuZ2UiLCBjb25maWdMaXN0LT5zaG93UmFuZ2UpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGF0YSIsIGNvbmZpZ0xpc3QtPnNob3dEYXRhKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGNvbmZpZ0xpc3QtPnNob3dBbGwpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGVidWciLCBzaG93RGVidWcpOworCisJUVN0cmluZyBlbnRyeTsKKwlzd2l0Y2goY29uZmlnTGlzdC0+bW9kZSkgeworCWNhc2Ugc2luZ2xlTW9kZSA6CisJCWVudHJ5ID0gInNpbmdsZSI7CisJCWJyZWFrOworCisJY2FzZSBzeW1ib2xNb2RlIDoKKwkJZW50cnkgPSAic3BsaXQiOworCQlicmVhazsKKworCWNhc2UgZnVsbE1vZGUgOgorCQllbnRyeSA9ICJmdWxsIjsKKwkJYnJlYWs7CisJfQorCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9saXN0TW9kZSIsIGVudHJ5KTsKKworCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDEiLCBzcGxpdDEtPnNpemVzKCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZVNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDIiLCBzcGxpdDItPnNpemVzKCkpOworCisJZGVsZXRlIGNvbmZpZ1NldHRpbmdzOworI2VuZGlmCit9CisKK3ZvaWQgZml4dXBfcm9vdG1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0YXRpYyBpbnQgbWVudV9jbnQgPSAwOworCisJbWVudS0+ZmxhZ3MgfD0gTUVOVV9ST09UOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlpZiAoY2hpbGQtPnByb21wdCAmJiBjaGlsZC0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkgeworCQkJbWVudV9jbnQrKzsKKwkJCWZpeHVwX3Jvb3RtZW51KGNoaWxkKTsKKwkJCW1lbnVfY250LS07CisJCX0gZWxzZSBpZiAoIW1lbnVfY250KQorCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2duYW1lOworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCXByaW50ZigiJXMgPGNvbmZpZz5cbiIsIHByb2duYW1lKTsKKwlleGl0KDApOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIqKiBhdikKK3sKKwlDb25maWdNYWluV2luZG93KiB2OworCWNvbnN0IGNoYXIgKm5hbWU7CisKKyNpZm5kZWYgTEtDX0RJUkVDVF9MSU5LCisJa2NvbmZpZ19sb2FkKCk7CisjZW5kaWYKKworCXByb2duYW1lID0gYXZbMF07CisJY29uZmlnQXBwID0gbmV3IFFBcHBsaWNhdGlvbihhYywgYXYpOworCWlmIChhYyA+IDEgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbMV1bMV0pIHsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoKTsKKwkJfQorCQluYW1lID0gYXZbMl07CisJfSBlbHNlCisJCW5hbWUgPSBhdlsxXTsKKwlpZiAoIW5hbWUpCisJCXVzYWdlKCk7CisKKwljb25mX3BhcnNlKG5hbWUpOworCWZpeHVwX3Jvb3RtZW51KCZyb290bWVudSk7CisJY29uZl9yZWFkKE5VTEwpOworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisKKwl2ID0gbmV3IENvbmZpZ01haW5XaW5kb3coKTsKKworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisJdi0+c2hvdygpOworCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChsYXN0V2luZG93Q2xvc2VkKCkpLCBTTE9UKHF1aXQoKSkpOworCWNvbmZpZ0FwcC0+Y29ubmVjdChjb25maWdBcHAsIFNJR05BTChhYm91dFRvUXVpdCgpKSwgdiwgU0xPVChzYXZlU2V0dGluZ3MoKSkpOworCWNvbmZpZ0FwcC0+ZXhlYygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuaCBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDM5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaApAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KKyNpZiBRVF9WRVJTSU9OID49IDMwMAorI2luY2x1ZGUgPHFzZXR0aW5ncy5oPgorI2Vsc2UKK2NsYXNzIFFTZXR0aW5ncyB7IH07CisjZW5kaWYKKworY2xhc3MgQ29uZmlnTGlzdDsKK2NsYXNzIENvbmZpZ0l0ZW07CitjbGFzcyBDb25maWdMaW5lRWRpdDsKK2NsYXNzIENvbmZpZ01haW5XaW5kb3c7CisKKworY2xhc3MgQ29uZmlnU2V0dGluZ3MgOiBwdWJsaWMgUVNldHRpbmdzIHsKK3B1YmxpYzoKKwlDb25maWdTZXR0aW5ncygpOworCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl2b2lkIHJlYWRMaXN0U2V0dGluZ3MoKTsKKwlRVmFsdWVMaXN0PGludD4gQ29uZmlnU2V0dGluZ3M6OnJlYWRTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGJvb2wgKm9rKTsKKwlib29sIENvbmZpZ1NldHRpbmdzOjp3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSk7CisjZW5kaWYKKworCWJvb2wgc2hvd0FsbDsKKwlib29sIHNob3dOYW1lOworCWJvb2wgc2hvd1JhbmdlOworCWJvb2wgc2hvd0RhdGE7Cit9OworCitjbGFzcyBDb25maWdWaWV3IDogcHVibGljIFFWQm94IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUVZCb3ggUGFyZW50OworcHVibGljOgorCUNvbmZpZ1ZpZXcoUVdpZGdldCogcGFyZW50LCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKTsKKwl+Q29uZmlnVmlldyh2b2lkKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pOworCXN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCk7CisKK3B1YmxpYzoKKwlDb25maWdMaXN0KiBsaXN0OworCUNvbmZpZ0xpbmVFZGl0KiBsaW5lRWRpdDsKKworCXN0YXRpYyBDb25maWdWaWV3KiB2aWV3TGlzdDsKKwlDb25maWdWaWV3KiBuZXh0VmlldzsKK307CisKK2VudW0gY29sSWR4IHsKKwlwcm9tcHRDb2xJZHgsIG5hbWVDb2xJZHgsIG5vQ29sSWR4LCBtb2RDb2xJZHgsIHllc0NvbElkeCwgZGF0YUNvbElkeCwgY29sTnIKK307CitlbnVtIGxpc3RNb2RlIHsKKwlzaW5nbGVNb2RlLCBtZW51TW9kZSwgc3ltYm9sTW9kZSwgZnVsbE1vZGUKK307CisKK2NsYXNzIENvbmZpZ0xpc3QgOiBwdWJsaWMgUUxpc3RWaWV3IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3IFBhcmVudDsKK3B1YmxpYzoKKwlDb25maWdMaXN0KENvbmZpZ1ZpZXcqIHAsIENvbmZpZ01haW5XaW5kb3cqIGN2aWV3LCBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpOworCXZvaWQgcmVpbml0KHZvaWQpOworCUNvbmZpZ1ZpZXcqIHBhcmVudCh2b2lkKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdWaWV3KilQYXJlbnQ6OnBhcmVudCgpOworCX0KKworcHJvdGVjdGVkOgorCUNvbmZpZ01haW5XaW5kb3cqIGN2aWV3OworCisJdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldFJvb3RNZW51KHN0cnVjdCBtZW51ICptZW51KTsKKworCXZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtICppdGVtKTsKKwl2b2lkIHNldFZhbHVlKENvbmZpZ0l0ZW0qIGl0ZW0sIHRyaXN0YXRlIHZhbCk7CisJdm9pZCBjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKTsKKwl2b2lkIHVwZGF0ZVNlbGVjdGlvbih2b2lkKTsKK3NpZ25hbHM6CisJdm9pZCBtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKm1lbnUpOworCXZvaWQgcGFyZW50U2VsZWN0ZWQodm9pZCk7CisJdm9pZCBnb3RGb2N1cyh2b2lkKTsKKworcHVibGljOgorCXZvaWQgdXBkYXRlTGlzdEFsbCh2b2lkKQorCXsKKwkJdXBkYXRlQWxsID0gdHJ1ZTsKKwkJdXBkYXRlTGlzdChOVUxMKTsKKwkJdXBkYXRlQWxsID0gZmFsc2U7CisJfQorCUNvbmZpZ0xpc3QqIGxpc3RWaWV3KCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKwlDb25maWdJdGVtKiBmaXJzdENoaWxkKCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnSXRlbSAqKVBhcmVudDo6Zmlyc3RDaGlsZCgpOworCX0KKwlpbnQgbWFwSWR4KGNvbElkeCBpZHgpCisJeworCQlyZXR1cm4gY29sTWFwW2lkeF07CisJfQorCXZvaWQgYWRkQ29sdW1uKGNvbElkeCBpZHgsIGNvbnN0IFFTdHJpbmcmIGxhYmVsKQorCXsKKwkJY29sTWFwW2lkeF0gPSBQYXJlbnQ6OmFkZENvbHVtbihsYWJlbCk7CisJCWNvbFJldk1hcFtjb2xNYXBbaWR4XV0gPSBpZHg7CisJfQorCXZvaWQgcmVtb3ZlQ29sdW1uKGNvbElkeCBpZHgpCisJeworCQlpbnQgY29sID0gY29sTWFwW2lkeF07CisJCWlmIChjb2wgPj0gMCkgeworCQkJUGFyZW50OjpyZW1vdmVDb2x1bW4oY29sKTsKKwkJCWNvbFJldk1hcFtjb2xdID0gY29sTWFwW2lkeF0gPSAtMTsKKwkJfQorCX0KKwl2b2lkIHNldEFsbE9wZW4oYm9vbCBvcGVuKTsKKwl2b2lkIHNldFBhcmVudE1lbnUodm9pZCk7CisKKwl0ZW1wbGF0ZSA8Y2xhc3MgUD4KKwl2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZU1lbnVMaXN0KFAqLCBzdHJ1Y3QgbWVudSopOworCisJYm9vbCB1cGRhdGVBbGw7CisKKwlRUGl4bWFwIHN5bWJvbFllc1BpeCwgc3ltYm9sTW9kUGl4LCBzeW1ib2xOb1BpeDsKKwlRUGl4bWFwIGNob2ljZVllc1BpeCwgY2hvaWNlTm9QaXg7CisJUVBpeG1hcCBtZW51UGl4LCBtZW51SW52UGl4LCBtZW51QmFja1BpeCwgdm9pZFBpeDsKKworCWJvb2wgc2hvd0FsbCwgc2hvd05hbWUsIHNob3dSYW5nZSwgc2hvd0RhdGE7CisJZW51bSBsaXN0TW9kZSBtb2RlOworCXN0cnVjdCBtZW51ICpyb290RW50cnk7CisJUUNvbG9yR3JvdXAgZGlzYWJsZWRDb2xvckdyb3VwOworCVFDb2xvckdyb3VwIGluYWN0aXZlZENvbG9yR3JvdXA7CisKK3ByaXZhdGU6CisJaW50IGNvbE1hcFtjb2xOcl07CisJaW50IGNvbFJldk1hcFtjb2xOcl07Cit9OworCitjbGFzcyBDb25maWdJdGVtIDogcHVibGljIFFMaXN0Vmlld0l0ZW0geworCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3SXRlbSBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnSXRlbShRTGlzdFZpZXcgKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKENvbmZpZ0l0ZW0gKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKFFMaXN0VmlldyAqcGFyZW50LCBDb25maWdJdGVtICphZnRlciwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KDApLCB2aXNpYmxlKHYpLCBnb1BhcmVudCh0cnVlKQorCXsKKwkJaW5pdCgpOworCX0KKwl+Q29uZmlnSXRlbSh2b2lkKTsKKwl2b2lkIGluaXQodm9pZCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl2b2lkIG9rUmVuYW1lKGludCBjb2wpOworI2VuZGlmCisJdm9pZCB1cGRhdGVNZW51KHZvaWQpOworCXZvaWQgdGVzdFVwZGF0ZU1lbnUoYm9vbCB2KTsKKwlDb25maWdMaXN0KiBsaXN0VmlldygpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0xpc3QqKVBhcmVudDo6bGlzdFZpZXcoKTsKKwl9CisJQ29uZmlnSXRlbSogZmlyc3RDaGlsZCgpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0l0ZW0gKilQYXJlbnQ6OmZpcnN0Q2hpbGQoKTsKKwl9CisJQ29uZmlnSXRlbSogbmV4dFNpYmxpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdJdGVtICopUGFyZW50OjpuZXh0U2libGluZygpOworCX0KKwl2b2lkIHNldFRleHQoY29sSWR4IGlkeCwgY29uc3QgUVN0cmluZyYgdGV4dCkKKwl7CisJCVBhcmVudDo6c2V0VGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSwgdGV4dCk7CisJfQorCVFTdHJpbmcgdGV4dChjb2xJZHggaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuIFBhcmVudDo6dGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSk7CisJfQorCXZvaWQgc2V0UGl4bWFwKGNvbElkeCBpZHgsIGNvbnN0IFFQaXhtYXAmIHBtKQorCXsKKwkJUGFyZW50OjpzZXRQaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCksIHBtKTsKKwl9CisJY29uc3QgUVBpeG1hcCogcGl4bWFwKGNvbElkeCBpZHgpIGNvbnN0CisJeworCQlyZXR1cm4gUGFyZW50OjpwaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCkpOworCX0KKwl2b2lkIHBhaW50Q2VsbChRUGFpbnRlciogcCwgY29uc3QgUUNvbG9yR3JvdXAmIGNnLCBpbnQgY29sdW1uLCBpbnQgd2lkdGgsIGludCBhbGlnbik7CisKKwlDb25maWdJdGVtKiBuZXh0SXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlib29sIHZpc2libGU7CisJYm9vbCBnb1BhcmVudDsKK307CisKK2NsYXNzIENvbmZpZ0xpbmVFZGl0IDogcHVibGljIFFMaW5lRWRpdCB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFMaW5lRWRpdCBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnTGluZUVkaXQoQ29uZmlnVmlldyogcGFyZW50KQorCTogUGFyZW50KHBhcmVudCkKKwl7IH0KKwlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKKwl9CisJdm9pZCBzaG93KENvbmZpZ0l0ZW0gKmkpOworCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOworCitwdWJsaWM6CisJQ29uZmlnSXRlbSAqaXRlbTsKK307CisKK2NsYXNzIENvbmZpZ01haW5XaW5kb3cgOiBwdWJsaWMgUU1haW5XaW5kb3cgeworCVFfT0JKRUNUCitwdWJsaWM6CisJQ29uZmlnTWFpbldpbmRvdyh2b2lkKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSk7CisJdm9pZCBjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICopOworCXZvaWQgbGlzdEZvY3VzQ2hhbmdlZCh2b2lkKTsKKwl2b2lkIGdvQmFjayh2b2lkKTsKKwl2b2lkIGxvYWRDb25maWcodm9pZCk7CisJdm9pZCBzYXZlQ29uZmlnKHZvaWQpOworCXZvaWQgc2F2ZUNvbmZpZ0FzKHZvaWQpOworCXZvaWQgc2hvd1NpbmdsZVZpZXcodm9pZCk7CisJdm9pZCBzaG93U3BsaXRWaWV3KHZvaWQpOworCXZvaWQgc2hvd0Z1bGxWaWV3KHZvaWQpOworCXZvaWQgc2V0U2hvd0FsbChib29sKTsKKwl2b2lkIHNldFNob3dEZWJ1Zyhib29sKTsKKwl2b2lkIHNldFNob3dSYW5nZShib29sKTsKKwl2b2lkIHNldFNob3dOYW1lKGJvb2wpOworCXZvaWQgc2V0U2hvd0RhdGEoYm9vbCk7CisJdm9pZCBzaG93SW50cm8odm9pZCk7CisJdm9pZCBzaG93QWJvdXQodm9pZCk7CisJdm9pZCBzYXZlU2V0dGluZ3Modm9pZCk7CisKK3Byb3RlY3RlZDoKKwl2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOworCisJQ29uZmlnVmlldyAqbWVudVZpZXc7CisJQ29uZmlnTGlzdCAqbWVudUxpc3Q7CisJQ29uZmlnVmlldyAqY29uZmlnVmlldzsKKwlDb25maWdMaXN0ICpjb25maWdMaXN0OworCVFUZXh0VmlldyAqaGVscFRleHQ7CisJUVRvb2xCYXIgKnRvb2xCYXI7CisJUUFjdGlvbiAqYmFja0FjdGlvbjsKKwlRU3BsaXR0ZXIqIHNwbGl0MTsKKwlRU3BsaXR0ZXIqIHNwbGl0MjsKKworCWJvb2wgc2hvd0RlYnVnOworfTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmZhNTJmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCkBAIC0wLDAgKzEsODE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CisJLm5hbWUgPSAieSIsCisJLmN1cnIgPSB7ICJ5IiwgeWVzIH0sCisJLmZsYWdzID0gU1lNQk9MX1lFU3xTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfbW9kID0geworCS5uYW1lID0gIm0iLAorCS5jdXJyID0geyAibSIsIG1vZCB9LAorCS5mbGFncyA9IFNZTUJPTF9NT0R8U1lNQk9MX1ZBTElELAorfSwgc3ltYm9sX25vID0geworCS5uYW1lID0gIm4iLAorCS5jdXJyID0geyAibiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX05PfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9lbXB0eSA9IHsKKwkubmFtZSA9ICIiLAorCS5jdXJyID0geyAiIiwgbm8gfSwKKwkuZmxhZ3MgPSBTWU1CT0xfVkFMSUQsCit9OworCitpbnQgc3ltX2NoYW5nZV9jb3VudDsKK3N0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOwordHJpc3RhdGUgbW9kdWxlc192YWw7CisKK3ZvaWQgc3ltX2FkZF9kZWZhdWx0KHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqZGVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHByb3BfYWxsb2MoUF9ERUZBVUxULCBzeW0pOworCisJcHJvcC0+ZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bV9sb29rdXAoZGVmLCAxKSk7Cit9CisKK3ZvaWQgc3ltX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHV0c25hbWUgdXRzOworCWNoYXIgKnA7CisJc3RhdGljIGJvb2wgaW5pdGVkID0gZmFsc2U7CisKKwlpZiAoaW5pdGVkKQorCQlyZXR1cm47CisJaW5pdGVkID0gdHJ1ZTsKKworCXVuYW1lKCZ1dHMpOworCisJc3ltID0gc3ltX2xvb2t1cCgiQVJDSCIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJcCA9IGdldGVudigiQVJDSCIpOworCWlmIChwKQorCQlzeW1fYWRkX2RlZmF1bHQoc3ltLCBwKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFJFTEVBU0UiLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIktFUk5FTFJFTEVBU0UiKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJVTkFNRV9SRUxFQVNFIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlzeW1fYWRkX2RlZmF1bHQoc3ltLCB1dHMucmVsZWFzZSk7Cit9CisKK2VudW0gc3ltYm9sX3R5cGUgc3ltX2dldF90eXBlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW0tPnR5cGU7CisKKwlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJCWVsc2UgaWYgKG1vZHVsZXNfdmFsID09IG5vKQorCQkJdHlwZSA9IFNfQk9PTEVBTjsKKwl9CisJcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IGNoYXIgKnN5bV90eXBlX25hbWUoZW51bSBzeW1ib2xfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlyZXR1cm4gImJvb2xlYW4iOworCWNhc2UgU19UUklTVEFURToKKwkJcmV0dXJuICJ0cmlzdGF0ZSI7CisJY2FzZSBTX0lOVDoKKwkJcmV0dXJuICJpbnRlZ2VyIjsKKwljYXNlIFNfSEVYOgorCQlyZXR1cm4gImhleCI7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuICJzdHJpbmciOworCWNhc2UgU19VTktOT1dOOgorCQlyZXR1cm4gInVua25vd24iOworCWNhc2UgU19PVEhFUjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAiPz8/IjsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2Nob2ljZV9wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlmb3JfYWxsX2Nob2ljZXMoc3ltLCBwcm9wKQorCQlyZXR1cm4gcHJvcDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2RlZmF1bHRfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnN5bV9nZXRfcmFuZ2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgcHJvcCwgUF9SQU5HRSkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAocHJvcC0+dmlzaWJsZS50cmkgIT0gbm8pCisJCQlyZXR1cm4gcHJvcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9jYWxjX3Zpc2liaWxpdHkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl0cmlzdGF0ZSB0cmk7CisKKwkvKiBhbnkgcHJvbXB0IHZpc2libGU/ICovCisJdHJpID0gbm87CisJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQl0cmkgPSBFX09SKHRyaSwgcHJvcC0+dmlzaWJsZS50cmkpOworCX0KKwlpZiAodHJpID09IG1vZCAmJiAoc3ltLT50eXBlICE9IFNfVFJJU1RBVEUgfHwgbW9kdWxlc192YWwgPT0gbm8pKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+dmlzaWJsZSAhPSB0cmkpIHsKKwkJc3ltLT52aXNpYmxlID0gdHJpOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkKKwkJcmV0dXJuOworCXRyaSA9IG5vOworCWlmIChzeW0tPnJldl9kZXAuZXhwcikKKwkJdHJpID0gZXhwcl9jYWxjX3ZhbHVlKHN5bS0+cmV2X2RlcC5leHByKTsKKwlpZiAodHJpID09IG1vZCAmJiBzeW1fZ2V0X3R5cGUoc3ltKSA9PSBTX0JPT0xFQU4pCisJCXRyaSA9IHllczsKKwlpZiAoc3ltLT5yZXZfZGVwLnRyaSAhPSB0cmkpIHsKKwkJc3ltLT5yZXZfZGVwLnRyaSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NhbGNfY2hvaWNlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZTsKKworCS8qIGlzIHRoZSB1c2VyIGNob2ljZSB2aXNpYmxlPyAqLworCWRlZl9zeW0gPSBzeW0tPnVzZXIudmFsOworCWlmIChkZWZfc3ltKSB7CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogYW55IG9mIHRoZSBkZWZhdWx0cyB2aXNpYmxlPyAqLworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSA9PSBubykKKwkJCWNvbnRpbnVlOworCQlkZWZfc3ltID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGp1c3QgZ2V0IHRoZSBmaXJzdCB2aXNpYmxlIHZhbHVlICovCisJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCWRlZl9zeW0gPSBlLT5yaWdodC5zeW07CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLworCXN5bS0+Y3Vyci50cmkgPSBubzsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzeW1fY2FsY192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBuZXd2YWwsIG9sZHZhbDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfVkFMSUQpCisJCXJldHVybjsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9WQUxJRDsKKworCW9sZHZhbCA9IHN5bS0+Y3VycjsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCW5ld3ZhbCA9IHN5bWJvbF9lbXB0eS5jdXJyOworCQlicmVhazsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW5ld3ZhbCA9IHN5bWJvbF9uby5jdXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzeW0tPmN1cnIudmFsID0gc3ltLT5uYW1lOworCQlzeW0tPmN1cnIudHJpID0gbm87CisJCXJldHVybjsKKwl9CisJaWYgKCFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKworCXN5bV9jYWxjX3Zpc2liaWxpdHkoc3ltKTsKKworCS8qIHNldCBkZWZhdWx0IGlmIHJlY3Vyc2l2ZWx5IGNhbGxlZCAqLworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykgeworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCW5ld3ZhbC50cmkgPSAocHJvcF9nZXRfc3ltYm9sKHByb3ApLT5jdXJyLnZhbCA9PSBzeW0pID8geWVzIDogbm87CisJCX0gZWxzZSBpZiAoRV9PUihzeW0tPnZpc2libGUsIHN5bS0+cmV2X2RlcC50cmkpICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpCisJCQkJbmV3dmFsLnRyaSA9IHN5bS0+dXNlci50cmk7CisJCQllbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJCQkJaWYgKHByb3ApCisJCQkJCW5ld3ZhbC50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwcik7CisJCQl9CisJCQluZXd2YWwudHJpID0gRV9PUihFX0FORChuZXd2YWwudHJpLCBzeW0tPnZpc2libGUpLCBzeW0tPnJldl9kZXAudHJpKTsKKwkJfSBlbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJCWlmIChwcm9wKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJbmV3dmFsLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT5leHByKTsKKwkJCX0KKwkJfQorCQlpZiAobmV3dmFsLnRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQkJbmV3dmFsLnRyaSA9IHllczsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19JTlQ6CisJCWlmIChzeW0tPnZpc2libGUgIT0gbm8pIHsKKwkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJCW5ld3ZhbC52YWwgPSBzeW0tPnVzZXIudmFsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQlpZiAocHJvcCkgeworCQkJc3RydWN0IHN5bWJvbCAqZHMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoZHMpIHsKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCQlzeW1fY2FsY192YWx1ZShkcyk7CisJCQkJbmV3dmFsLnZhbCA9IGRzLT5jdXJyLnZhbDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3ltLT5jdXJyID0gbmV3dmFsOworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgbmV3dmFsLnRyaSA9PSB5ZXMpCisJCXN5bS0+Y3Vyci52YWwgPSBzeW1fY2FsY19jaG9pY2Uoc3ltKTsKKworCWlmIChtZW1jbXAoJm9sZHZhbCwgJnN5bS0+Y3Vyciwgc2l6ZW9mKG9sZHZhbCkpKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwlpZiAobW9kdWxlc19zeW0gPT0gc3ltKQorCQltb2R1bGVzX3ZhbCA9IG1vZHVsZXNfc3ltLT5jdXJyLnRyaTsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJaW50IGZsYWdzID0gc3ltLT5mbGFncyAmIChTWU1CT0xfQ0hBTkdFRCB8IFNZTUJPTF9XUklURSk7CisJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpIHsKKwkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJCQlzeW1fc2V0X2NoYW5nZWQoZS0+cmlnaHQuc3ltKTsKKwkJfQorCX0KK30KKwordm9pZCBzeW1fY2xlYXJfYWxsX3ZhbGlkKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCXN5bV9jaGFuZ2VfY291bnQrKzsKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKK30KKwordm9pZCBzeW1fc2V0X2NoYW5nZWQoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIQU5HRUQ7CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSkKKwkJCXByb3AtPm1lbnUtPmZsYWdzIHw9IE1FTlVfQ0hBTkdFRDsKKwl9Cit9CisKK3ZvaWQgc3ltX3NldF9hbGxfY2hhbmdlZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworfQorCitib29sIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLCB0cmlzdGF0ZSB2YWwpCit7CisJaW50IHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKworCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlICE9IFNfQk9PTEVBTiAmJiB0eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlID09IFNfQk9PTEVBTiAmJiB2YWwgPT0gbW9kKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bS0+dmlzaWJsZSA8PSBzeW0tPnJldl9kZXAudHJpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiBzeW0tPnZpc2libGUgPT0geWVzKQorCQlyZXR1cm4gdmFsID09IHllczsKKwlyZXR1cm4gdmFsID49IHN5bS0+cmV2X2RlcC50cmkgJiYgdmFsIDw9IHN5bS0+dmlzaWJsZTsKK30KKworYm9vbCBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCXRyaXN0YXRlIG9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKworCWlmIChvbGR2YWwgIT0gdmFsICYmICFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgdmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKwlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHZhbCA9PSB5ZXMpIHsKKwkJc3RydWN0IHN5bWJvbCAqY3MgPSBwcm9wX2dldF9zeW1ib2woc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pKTsKKworCQljcy0+dXNlci52YWwgPSBzeW07CisJCWNzLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwl9CisKKwlzeW0tPnVzZXIudHJpID0gdmFsOworCWlmIChvbGR2YWwgIT0gdmFsKSB7CisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKwkJaWYgKHN5bSA9PSBtb2R1bGVzX3N5bSkKKwkJCXN5bV9zZXRfYWxsX2NoYW5nZWQoKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordHJpc3RhdGUgc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlvbGR2YWwgPSBuZXd2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJZG8geworCQlzd2l0Y2ggKG5ld3ZhbCkgeworCQljYXNlIG5vOgorCQkJbmV3dmFsID0gbW9kOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJbmV3dmFsID0geWVzOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJbmV3dmFsID0gbm87CisJCQlicmVhazsKKwkJfQorCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCkpCisJCQlicmVhazsKKwl9IHdoaWxlIChvbGR2YWwgIT0gbmV3dmFsKTsKKwlyZXR1cm4gbmV3dmFsOworfQorCitib29sIHN5bV9zdHJpbmdfdmFsaWQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc2lnbmVkIGNoYXIgY2g7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiB0cnVlOworCWNhc2UgU19JTlQ6CisJCWNoID0gKnN0cisrOworCQlpZiAoY2ggPT0gJy0nKQorCQkJY2ggPSAqc3RyKys7CisJCWlmICghaXNkaWdpdChjaCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjaCA9PSAnMCcgJiYgKnN0ciAhPSAwKQorCQkJcmV0dXJuIGZhbHNlOworCQl3aGlsZSAoKGNoID0gKnN0cisrKSkgeworCQkJaWYgKCFpc2RpZ2l0KGNoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0hFWDoKKwkJaWYgKHN0clswXSA9PSAnMCcgJiYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykpCisJCQlzdHIgKz0gMjsKKwkJY2ggPSAqc3RyKys7CisJCWRvIHsKKwkJCWlmICghaXN4ZGlnaXQoY2gpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSB3aGlsZSAoKGNoID0gKnN0cisrKSk7CisJCXJldHVybiB0cnVlOworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJc3dpdGNoIChzdHJbMF0pIHsKKwkJY2FzZSAneSc6IGNhc2UgJ1knOgorCQljYXNlICdtJzogY2FzZSAnTSc6CisJCWNhc2UgJ24nOiBjYXNlICdOJzoKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitib29sIHN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfU1RSSU5HOgorCQlyZXR1cm4gc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cik7CisJY2FzZSBTX0lOVDoKKwkJaWYgKCFzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3RyKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcHJvcCA9IHN5bV9nZXRfcmFuZ2VfcHJvcChzeW0pOworCQlpZiAoIXByb3ApCisJCQlyZXR1cm4gdHJ1ZTsKKwkJdmFsID0gc3RydG9sKHN0ciwgTlVMTCwgMTApOworCQlyZXR1cm4gdmFsID49IHN0cnRvbChwcm9wLT5leHByLT5sZWZ0LnN5bS0+bmFtZSwgTlVMTCwgMTApICYmCisJCSAgICAgICB2YWwgPD0gc3RydG9sKHByb3AtPmV4cHItPnJpZ2h0LnN5bS0+bmFtZSwgTlVMTCwgMTApOworCWNhc2UgU19IRVg6CisJCWlmICghc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cikpCisJCQlyZXR1cm4gZmFsc2U7CisJCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwkJaWYgKCFwcm9wKQorCQkJcmV0dXJuIHRydWU7CisJCXZhbCA9IHN0cnRvbChzdHIsIE5VTEwsIDE2KTsKKwkJcmV0dXJuIHZhbCA+PSBzdHJ0b2wocHJvcC0+ZXhwci0+bGVmdC5zeW0tPm5hbWUsIE5VTEwsIDE2KSAmJgorCQkgICAgICAgdmFsIDw9IHN0cnRvbChwcm9wLT5leHByLT5yaWdodC5zeW0tPm5hbWUsIE5VTEwsIDE2KTsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXN3aXRjaCAoc3RyWzBdKSB7CisJCWNhc2UgJ3knOiBjYXNlICdZJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKTsKKwkJY2FzZSAnbSc6IGNhc2UgJ00nOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpOworCQljYXNlICduJzogY2FzZSAnTic6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworYm9vbCBzeW1fc2V0X3N0cmluZ192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkKK3sKKwljb25zdCBjaGFyICpvbGR2YWw7CisJY2hhciAqdmFsOworCWludCBzaXplOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXN3aXRjaCAobmV3dmFsWzBdKSB7CisJCWNhc2UgJ3knOiBjYXNlICdZJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgeWVzKTsKKwkJY2FzZSAnbSc6IGNhc2UgJ00nOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBtb2QpOworCQljYXNlICduJzogY2FzZSAnTic6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5vKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJOworCX0KKworCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBuZXd2YWwpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcpIHsKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorCisJb2xkdmFsID0gc3ltLT51c2VyLnZhbDsKKwlzaXplID0gc3RybGVuKG5ld3ZhbCkgKyAxOworCWlmIChzeW0tPnR5cGUgPT0gU19IRVggJiYgKG5ld3ZhbFswXSAhPSAnMCcgfHwgKG5ld3ZhbFsxXSAhPSAneCcgJiYgbmV3dmFsWzFdICE9ICdYJykpKSB7CisJCXNpemUgKz0gMjsKKwkJc3ltLT51c2VyLnZhbCA9IHZhbCA9IG1hbGxvYyhzaXplKTsKKwkJKnZhbCsrID0gJzAnOworCQkqdmFsKysgPSAneCc7CisJfSBlbHNlIGlmICghb2xkdmFsIHx8IHN0cmNtcChvbGR2YWwsIG5ld3ZhbCkpCisJCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsKKworCXN0cmNweSh2YWwsIG5ld3ZhbCk7CisJZnJlZSgodm9pZCAqKW9sZHZhbCk7CisJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCisJcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IGNoYXIgKnN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwl0cmlzdGF0ZSB2YWw7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIG5vOgorCQkJcmV0dXJuICJuIjsKKwkJY2FzZSBtb2Q6CisJCQlyZXR1cm4gIm0iOworCQljYXNlIHllczoKKwkJCXJldHVybiAieSI7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gKGNvbnN0IGNoYXIgKilzeW0tPmN1cnIudmFsOworfQorCitib29sIHN5bV9pc19jaGFuZ2FibGUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPnZpc2libGUgPiBzeW0tPnJldl9kZXAudHJpOworfQorCitzdHJ1Y3Qgc3ltYm9sICpzeW1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpc2NvbnN0KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKwljb25zdCBjaGFyICpwdHI7CisJY2hhciAqbmV3X25hbWU7CisJaW50IGhhc2ggPSAwOworCisJaWYgKG5hbWUpIHsKKwkJaWYgKG5hbWVbMF0gJiYgIW5hbWVbMV0pIHsKKwkJCXN3aXRjaCAobmFtZVswXSkgeworCQkJY2FzZSAneSc6IHJldHVybiAmc3ltYm9sX3llczsKKwkJCWNhc2UgJ20nOiByZXR1cm4gJnN5bWJvbF9tb2Q7CisJCQljYXNlICduJzogcmV0dXJuICZzeW1ib2xfbm87CisJCQl9CisJCX0KKwkJZm9yIChwdHIgPSBuYW1lOyAqcHRyOyBwdHIrKykKKwkJCWhhc2ggKz0gKnB0cjsKKwkJaGFzaCAmPSAweGZmOworCisJCWZvciAoc3ltYm9sID0gc3ltYm9sX2hhc2hbaGFzaF07IHN5bWJvbDsgc3ltYm9sID0gc3ltYm9sLT5uZXh0KSB7CisJCQlpZiAoIXN0cmNtcChzeW1ib2wtPm5hbWUsIG5hbWUpKSB7CisJCQkJaWYgKChpc2NvbnN0ICYmIHN5bWJvbC0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpIHx8CisJCQkJICAgICghaXNjb25zdCAmJiAhKHN5bWJvbC0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKSkKKwkJCQkJcmV0dXJuIHN5bWJvbDsKKwkJCX0KKwkJfQorCQluZXdfbmFtZSA9IHN0cmR1cChuYW1lKTsKKwl9IGVsc2UgeworCQluZXdfbmFtZSA9IE5VTEw7CisJCWhhc2ggPSAyNTY7CisJfQorCisJc3ltYm9sID0gbWFsbG9jKHNpemVvZigqc3ltYm9sKSk7CisJbWVtc2V0KHN5bWJvbCwgMCwgc2l6ZW9mKCpzeW1ib2wpKTsKKwlzeW1ib2wtPm5hbWUgPSBuZXdfbmFtZTsKKwlzeW1ib2wtPnR5cGUgPSBTX1VOS05PV047CisJc3ltYm9sLT5mbGFncyA9IFNZTUJPTF9ORVc7CisJaWYgKGlzY29uc3QpCisJCXN5bWJvbC0+ZmxhZ3MgfD0gU1lNQk9MX0NPTlNUOworCisJc3ltYm9sLT5uZXh0ID0gc3ltYm9sX2hhc2hbaGFzaF07CisJc3ltYm9sX2hhc2hbaGFzaF0gPSBzeW1ib2w7CisKKwlyZXR1cm4gc3ltYm9sOworfQorCitzdHJ1Y3Qgc3ltYm9sICpzeW1fZmluZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHRyOworCWludCBoYXNoID0gMDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobmFtZVswXSAmJiAhbmFtZVsxXSkgeworCQlzd2l0Y2ggKG5hbWVbMF0pIHsKKwkJY2FzZSAneSc6IHJldHVybiAmc3ltYm9sX3llczsKKwkJY2FzZSAnbSc6IHJldHVybiAmc3ltYm9sX21vZDsKKwkJY2FzZSAnbic6IHJldHVybiAmc3ltYm9sX25vOworCQl9CisJfQorCWZvciAocHRyID0gbmFtZTsgKnB0cjsgcHRyKyspCisJCWhhc2ggKz0gKnB0cjsKKwloYXNoICY9IDB4ZmY7CisKKwlmb3IgKHN5bWJvbCA9IHN5bWJvbF9oYXNoW2hhc2hdOyBzeW1ib2w7IHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChzeW1ib2wtPm5hbWUsIG5hbWUpICYmCisJCSAgICAhKHN5bWJvbC0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QpKQorCQkJCWJyZWFrOworCX0KKworCXJldHVybiBzeW1ib2w7Cit9CisKK3N0cnVjdCBzeW1ib2wgKipzeW1fcmVfc2VhcmNoKGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltLCAqKnN5bV9hcnIgPSBOVUxMOworCWludCBpLCBjbnQsIHNpemU7CisJcmVnZXhfdCByZTsKKworCWNudCA9IHNpemUgPSAwOworCS8qIFNraXAgaWYgZW1wdHkgKi8KKwlpZiAoc3RybGVuKHBhdHRlcm4pID09IDApCisJCXJldHVybiBOVUxMOworCWlmIChyZWdjb21wKCZyZSwgcGF0dGVybiwgUkVHX0VYVEVOREVEfFJFR19OT1NVQnxSRUdfSUNBU0UpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ09OU1QgfHwgIXN5bS0+bmFtZSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmVnZXhlYygmcmUsIHN5bS0+bmFtZSwgMCwgTlVMTCwgMCkpCisJCQljb250aW51ZTsKKwkJaWYgKGNudCArIDEgPj0gc2l6ZSkgeworCQkJdm9pZCAqdG1wID0gc3ltX2FycjsKKwkJCXNpemUgKz0gMTY7CisJCQlzeW1fYXJyID0gcmVhbGxvYyhzeW1fYXJyLCBzaXplICogc2l6ZW9mKHN0cnVjdCBzeW1ib2wgKikpOworCQkJaWYgKCFzeW1fYXJyKSB7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJCXN5bV9hcnJbY250KytdID0gc3ltOworCX0KKwlpZiAoc3ltX2FycikKKwkJc3ltX2FycltjbnRdID0gTlVMTDsKKwlyZWdmcmVlKCZyZSk7CisKKwlyZXR1cm4gc3ltX2FycjsKK30KKworCitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZGVwcyhzdHJ1Y3Qgc3ltYm9sICpzeW0pOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2V4cHJfZGVwcyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKwlpZiAoIWUpCisJCXJldHVybiBOVUxMOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlzeW0gPSBzeW1fY2hlY2tfZXhwcl9kZXBzKGUtPmxlZnQuZXhwcik7CisJCWlmIChzeW0pCisJCQlyZXR1cm4gc3ltOworCQlyZXR1cm4gc3ltX2NoZWNrX2V4cHJfZGVwcyhlLT5yaWdodC5leHByKTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gc3ltX2NoZWNrX2V4cHJfZGVwcyhlLT5sZWZ0LmV4cHIpOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJc3ltID0gc3ltX2NoZWNrX2RlcHMoZS0+bGVmdC5zeW0pOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIHN5bTsKKwkJcmV0dXJuIHN5bV9jaGVja19kZXBzKGUtPnJpZ2h0LnN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIHN5bV9jaGVja19kZXBzKGUtPmxlZnQuc3ltKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRmKCJPb3BzISBIb3cgdG8gY2hlY2sgJWQ/XG4iLCBlLT50eXBlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTI7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hFQ0tfRE9ORSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hFQ0spIHsKKwkJcHJpbnRmKCJXYXJuaW5nISBGb3VuZCByZWN1cnNpdmUgZGVwZW5kZW5jeTogJXMiLCBzeW0tPm5hbWUpOworCQlyZXR1cm4gc3ltOworCX0KKworCXN5bS0+ZmxhZ3MgfD0gKFNZTUJPTF9DSEVDSyB8IFNZTUJPTF9DSEVDS0VEKTsKKwlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhzeW0tPnJldl9kZXAuZXhwcik7CisJaWYgKHN5bTIpCisJCWdvdG8gb3V0OworCisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+dHlwZSA9PSBQX0NIT0lDRSB8fCBwcm9wLT50eXBlID09IFBfU0VMRUNUKQorCQkJY29udGludWU7CisJCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChzeW0yKQorCQkJZ290byBvdXQ7CisJCWlmIChwcm9wLT50eXBlICE9IFBfREVGQVVMVCB8fCBzeW1faXNfY2hvaWNlKHN5bSkpCisJCQljb250aW51ZTsKKwkJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMocHJvcC0+ZXhwcik7CisJCWlmIChzeW0yKQorCQkJZ290byBvdXQ7CisJfQorb3V0OgorCWlmIChzeW0yKQorCQlwcmludGYoIiAlcyIsIHN5bS0+bmFtZSk7CisJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0NIRUNLOworCXJldHVybiBzeW0yOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnByb3BfYWxsb2MoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcm9wcDsKKworCXByb3AgPSBtYWxsb2Moc2l6ZW9mKCpwcm9wKSk7CisJbWVtc2V0KHByb3AsIDAsIHNpemVvZigqcHJvcCkpOworCXByb3AtPnR5cGUgPSB0eXBlOworCXByb3AtPnN5bSA9IHN5bTsKKwlwcm9wLT5maWxlID0gY3VycmVudF9maWxlOworCXByb3AtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJLyogYXBwZW5kIHByb3BlcnR5IHRvIHRoZSBwcm9wIGxpc3Qgb2Ygc3ltYm9sICovCisJaWYgKHN5bSkgeworCQlmb3IgKHByb3BwID0gJnN5bS0+cHJvcDsgKnByb3BwOyBwcm9wcCA9ICYoKnByb3BwKS0+bmV4dCkKKwkJCTsKKwkJKnByb3BwID0gcHJvcDsKKwl9CisKKwlyZXR1cm4gcHJvcDsKK30KKworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpZiAocHJvcC0+ZXhwciAmJiAocHJvcC0+ZXhwci0+dHlwZSA9PSBFX1NZTUJPTCB8fAorCQkJICAgcHJvcC0+ZXhwci0+dHlwZSA9PSBFX0NIT0lDRSkpCisJCXJldHVybiBwcm9wLT5leHByLT5sZWZ0LnN5bTsKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqcHJvcF9nZXRfdHlwZV9uYW1lKGVudW0gcHJvcF90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQX1BST01QVDoKKwkJcmV0dXJuICJwcm9tcHQiOworCWNhc2UgUF9DT01NRU5UOgorCQlyZXR1cm4gImNvbW1lbnQiOworCWNhc2UgUF9NRU5VOgorCQlyZXR1cm4gIm1lbnUiOworCWNhc2UgUF9ERUZBVUxUOgorCQlyZXR1cm4gImRlZmF1bHQiOworCWNhc2UgUF9DSE9JQ0U6CisJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFBfU0VMRUNUOgorCQlyZXR1cm4gInNlbGVjdCI7CisJY2FzZSBQX1JBTkdFOgorCQlyZXR1cm4gInJhbmdlIjsKKwljYXNlIFBfVU5LTk9XTjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvdXRpbC5jIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE0YzBiCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgU2FtIFJhdm5ib3JnIDxzYW1AcmF2bmJvcmcub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsa2MuaCIKKworLyogZmlsZSBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdD8gSWYgbm90IGFkZCBpdCAqLworc3RydWN0IGZpbGUgKmZpbGVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlmb3IgKGZpbGUgPSBmaWxlX2xpc3Q7IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KSB7CisJCWlmICghc3RyY21wKG5hbWUsIGZpbGUtPm5hbWUpKQorCQkJcmV0dXJuIGZpbGU7CisJfQorCisJZmlsZSA9IG1hbGxvYyhzaXplb2YoKmZpbGUpKTsKKwltZW1zZXQoZmlsZSwgMCwgc2l6ZW9mKCpmaWxlKSk7CisJZmlsZS0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKwlmaWxlLT5uZXh0ID0gZmlsZV9saXN0OworCWZpbGVfbGlzdCA9IGZpbGU7CisJcmV0dXJuIGZpbGU7Cit9CisKKy8qIHdyaXRlIGEgZGVwZW5kZW5jeSBmaWxlIGFzIHVzZWQgYnkga2J1aWxkIHRvIHRyYWNrIGRlcGVuZGVuY2llcyAqLworaW50IGZpbGVfd3JpdGVfZGVwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJRklMRSAqb3V0OworCisJaWYgKCFuYW1lKQorCQluYW1lID0gIi5jb25maWcuY21kIjsKKwlvdXQgPSBmb3BlbigiLi5jb25maWcudG1wIiwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJZnByaW50ZihvdXQsICJkZXBzX2NvbmZpZyA6PSBcXFxuIik7CisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoZmlsZS0+bmV4dCkKKwkJCWZwcmludGYob3V0LCAiXHQlcyBcXFxuIiwgZmlsZS0+bmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYob3V0LCAiXHQlc1xuIiwgZmlsZS0+bmFtZSk7CisJfQorCWZwcmludGYob3V0LCAiXG4uY29uZmlnIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaDogJChkZXBzX2NvbmZpZylcblxuJChkZXBzX2NvbmZpZyk6XG4iKTsKKwlmY2xvc2Uob3V0KTsKKwlyZW5hbWUoIi4uY29uZmlnLnRtcCIsIG5hbWUpOworCXJldHVybiAwOworfQorCisKKy8qIEFsbG9jYXRlIGluaXRpYWwgZ3Jvd2FibGUgc3RpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gbWFsbG9jKHNpemVvZihjaGFyKSAqIDY0KTsKKwlncy5sZW4gPSAxNjsKKwlzdHJjcHkoZ3MucywgIlwwIik7CisJcmV0dXJuIGdzOworfQorCisvKiBBbGxvY2F0ZSBhbmQgYXNzaWduIGdyb3dhYmxlIHN0cmluZyAqLworc3RydWN0IGdzdHIgc3RyX2Fzc2lnbihjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBnc3RyIGdzOworCWdzLnMgPSBzdHJkdXAocyk7CisJZ3MubGVuID0gc3RybGVuKHMpICsgMTsKKwlyZXR1cm4gZ3M7Cit9CisKKy8qIEZyZWUgc3RvcmFnZSBmb3IgZ3Jvd2FibGUgc3RyaW5nICovCit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncykKK3sKKwlpZiAoZ3MtPnMpCisJCWZyZWUoZ3MtPnMpOworCWdzLT5zID0gTlVMTDsKKwlncy0+bGVuID0gMDsKK30KKworLyogQXBwZW5kIHRvIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfYXBwZW5kKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqcykKK3sKKwlzaXplX3QgbCA9IHN0cmxlbihncy0+cykgKyBzdHJsZW4ocykgKyAxOworCWlmIChsID4gZ3MtPmxlbikgeworCQlncy0+cyAgID0gcmVhbGxvYyhncy0+cywgbCk7CisJCWdzLT5sZW4gPSBsOworCX0KKwlzdHJjYXQoZ3MtPnMsIHMpOworfQorCisvKiBBcHBlbmQgcHJpbnRmIGZvcm1hdHRlZCBzdHJpbmcgdG8gZ3Jvd2FibGUgc3RyaW5nICovCit2b2lkIHN0cl9wcmludGYoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgc1sxMDAwMF07IC8qIGJpZyBlbm91Z2guLi4gKi8KKwl2YV9zdGFydChhcCwgZm10KTsKKwl2c25wcmludGYocywgc2l6ZW9mKHMpLCBmbXQsIGFwKTsKKwlzdHJfYXBwZW5kKGdzLCBzKTsKKwl2YV9lbmQoYXApOworfQorCisvKiBSZXRyZWl2ZSB2YWx1ZSBvZiBncm93YWJsZSBzdHJpbmcgKi8KK2NvbnN0IGNoYXIgKnN0cl9nZXQoc3RydWN0IGdzdHIgKmdzKQoreworCXJldHVybiBncy0+czsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUxN2IyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKQEAgLTAsMCArMSwzNjYgQEAKKyVvcHRpb24gYmFja3VwIG5vc3RkaW5pdCBub3l5d3JhcCBuZXZlci1pbnRlcmFjdGl2ZSBmdWxsIGVjcworJW9wdGlvbiA4Yml0IGJhY2t1cCBub2RlZmF1bHQgcGVyZi1yZXBvcnQgcGVyZi1yZXBvcnQKKyV4IENPTU1BTkQgSEVMUCBTVFJJTkcgUEFSQU0KKyV7CisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgorCitjaGFyICp0ZXh0Oworc3RhdGljIGNoYXIgKnRleHRfcHRyOworc3RhdGljIGludCB0ZXh0X3NpemUsIHRleHRfYXNpemU7CisKK3N0cnVjdCBidWZmZXIgeworICAgICAgICBzdHJ1Y3QgYnVmZmVyICpwYXJlbnQ7CisgICAgICAgIFlZX0JVRkZFUl9TVEFURSBzdGF0ZTsKK307CisKK3N0cnVjdCBidWZmZXIgKmN1cnJlbnRfYnVmOworCitzdGF0aWMgaW50IGxhc3RfdHMsIGZpcnN0X3RzOworCitzdGF0aWMgdm9pZCB6Y29uZl9lbmRoZWxwKHZvaWQpOworc3RhdGljIHN0cnVjdCBidWZmZXIgKnpjb25mX2VuZGZpbGUodm9pZCk7CisKK3ZvaWQgbmV3X3N0cmluZyh2b2lkKQoreworCXRleHQgPSBtYWxsb2MoU1RBUlRfU1RSU0laRSk7CisJdGV4dF9hc2l6ZSA9IFNUQVJUX1NUUlNJWkU7CisJdGV4dF9wdHIgPSB0ZXh0OworCXRleHRfc2l6ZSA9IDA7CisJKnRleHRfcHRyID0gMDsKK30KKwordm9pZCBhcHBlbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJaW50IG5ld19zaXplID0gdGV4dF9zaXplICsgc2l6ZSArIDE7CisJaWYgKG5ld19zaXplID4gdGV4dF9hc2l6ZSkgeworCQl0ZXh0ID0gcmVhbGxvYyh0ZXh0LCBuZXdfc2l6ZSk7CisJCXRleHRfYXNpemUgPSBuZXdfc2l6ZTsKKwkJdGV4dF9wdHIgPSB0ZXh0ICsgdGV4dF9zaXplOworCX0KKwltZW1jcHkodGV4dF9wdHIsIHN0ciwgc2l6ZSk7CisJdGV4dF9wdHIgKz0gc2l6ZTsKKwl0ZXh0X3NpemUgKz0gc2l6ZTsKKwkqdGV4dF9wdHIgPSAwOworfQorCit2b2lkIGFsbG9jX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCXRleHQgPSBtYWxsb2Moc2l6ZSArIDEpOworCW1lbWNweSh0ZXh0LCBzdHIsIHNpemUpOworCXRleHRbc2l6ZV0gPSAwOworfQorJX0KKword3MJWyBcblx0XQorbglbQS1aYS16MC05X10KKworJSUKKwlpbnQgc3RyID0gMDsKKwlpbnQgdHMsIGk7CisKK1sgXHRdKiMuKlxuCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CitbIFx0XSojLioKKworWyBcdF0qXG4JY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOworCitbIFx0XSsJeworCUJFR0lOKENPTU1BTkQpOworfQorCisuCXsKKwl1bnB1dCh5eXRleHRbMF0pOworCUJFR0lOKENPTU1BTkQpOworfQorCisKKzxDT01NQU5EPnsKKwkibWFpbm1lbnUiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX01BSU5NRU5VOworCSJtZW51IgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfTUVOVTsKKwkiZW5kbWVudSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfRU5ETUVOVTsKKwkic291cmNlIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TT1VSQ0U7CisJImNob2ljZSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQ0hPSUNFOworCSJlbmRjaG9pY2UiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0VORENIT0lDRTsKKwkiY29tbWVudCIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQ09NTUVOVDsKKwkiY29uZmlnIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9DT05GSUc7CisJIm1lbnVjb25maWciCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX01FTlVDT05GSUc7CisJImhlbHAiCQkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9IRUxQOworCSJpZiIJCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0lGOworCSJlbmRpZiIJCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0VORElGOworCSJkZXBlbmRzIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERVBFTkRTOworCSJyZXF1aXJlcyIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfUkVRVUlSRVM7CisJIm9wdGlvbmFsIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9PUFRJT05BTDsKKwkiZGVmYXVsdCIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGQVVMVDsKKwkicHJvbXB0IgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9QUk9NUFQ7CisJInRyaXN0YXRlIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9UUklTVEFURTsKKwkiZGVmX3RyaXN0YXRlIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZfVFJJU1RBVEU7CisJImJvb2wiCQkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9CT09MRUFOOworCSJib29sZWFuIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9CT09MRUFOOworCSJkZWZfYm9vbCIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGX0JPT0xFQU47CisJImRlZl9ib29sZWFuIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZfQk9PTEVBTjsKKwkiaW50IgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfSU5UOworCSJoZXgiCQkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9IRVg7CisJInN0cmluZyIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU1RSSU5HOworCSJzZWxlY3QiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX1NFTEVDVDsKKwkiZW5hYmxlIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TRUxFQ1Q7CisJInJhbmdlIgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfUkFOR0U7CisJe259Kwl7CisJCWFsbG9jX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwkuCisJXG4JY3VycmVudF9maWxlLT5saW5lbm8rKzsgQkVHSU4oSU5JVElBTCk7Cit9CisKKzxQQVJBTT57CisJIiYmIglyZXR1cm4gVF9BTkQ7CisJInx8IglyZXR1cm4gVF9PUjsKKwkiKCIJcmV0dXJuIFRfT1BFTl9QQVJFTjsKKwkiKSIJcmV0dXJuIFRfQ0xPU0VfUEFSRU47CisJIiEiCXJldHVybiBUX05PVDsKKwkiPSIJcmV0dXJuIFRfRVFVQUw7CisJIiE9IglyZXR1cm4gVF9VTkVRVUFMOworCSJpZiIJcmV0dXJuIFRfSUY7CisJIm9uIglyZXR1cm4gVF9PTjsKKwlcInxcJwl7CisJCXN0ciA9IHl5dGV4dFswXTsKKwkJbmV3X3N0cmluZygpOworCQlCRUdJTihTVFJJTkcpOworCX0KKwlcbglCRUdJTihJTklUSUFMKTsgY3VycmVudF9maWxlLT5saW5lbm8rKzsgcmV0dXJuIFRfRU9MOworCS0tLQkvKiBpZ25vcmUgKi8KKwkoe259fFstLy5dKSsJeworCQlhbGxvY19zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJIy4qCS8qIGNvbW1lbnQgKi8KKwlcXFxuCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJLgorCTw8RU9GPj4geworCQlCRUdJTihJTklUSUFMKTsKKwl9Cit9CisKKzxTVFJJTkc+eworCVteJyJcXFxuXSsvXG4JeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVteJyJcXFxuXSsJeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwl9CisJXFwuPy9cbgl7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0ICsgMSwgeXlsZW5nIC0gMSk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlcXC4/CXsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQgKyAxLCB5eWxlbmcgLSAxKTsKKwl9CisJXCd8XCIJeworCQlpZiAoc3RyID09IHl5dGV4dFswXSkgeworCQkJQkVHSU4oUEFSQU0pOworCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCQl9IGVsc2UKKwkJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0LCAxKTsKKwl9CisJXG4JeworCQlwcmludGYoIiVzOiVkOndhcm5pbmc6IG11bHRpLWxpbmUgc3RyaW5ncyBub3Qgc3VwcG9ydGVkXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJQkVHSU4oSU5JVElBTCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJPDxFT0Y+Pgl7CisJCUJFR0lOKElOSVRJQUwpOworCX0KK30KKworPEhFTFA+eworCVsgXHRdKwl7CisJCXRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHl5bGVuZzsgaSsrKSB7CisJCQlpZiAoeXl0ZXh0W2ldID09ICdcdCcpCisJCQkJdHMgPSAodHMgJiB+NykgKyA4OworCQkJZWxzZQorCQkJCXRzKys7CisJCX0KKwkJbGFzdF90cyA9IHRzOworCQlpZiAoZmlyc3RfdHMpIHsKKwkJCWlmICh0cyA8IGZpcnN0X3RzKSB7CisJCQkJemNvbmZfZW5kaGVscCgpOworCQkJCXJldHVybiBUX0hFTFBURVhUOworCQkJfQorCQkJdHMgLT0gZmlyc3RfdHM7CisJCQl3aGlsZSAodHMgPiA4KSB7CisJCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCA4KTsKKwkJCQl0cyAtPSA4OworCQkJfQorCQkJYXBwZW5kX3N0cmluZygiICAgICAgICAiLCB0cyk7CisJCX0KKwl9CisJWyBcdF0qXG4vW14gXHRcbl0geworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KKwlbIFx0XSpcbgl7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCWFwcGVuZF9zdHJpbmcoIlxuIiwgMSk7CisJfQorCVteIFx0XG5dLiogeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwkJaWYgKCFmaXJzdF90cykKKwkJCWZpcnN0X3RzID0gbGFzdF90czsKKwl9CisJPDxFT0Y+Pgl7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorfQorCis8PEVPRj4+CXsKKwlpZiAoY3VycmVudF9idWYpIHsKKwkJemNvbmZfZW5kZmlsZSgpOworCQlyZXR1cm4gVF9FT0Y7CisJfQorCWZjbG9zZSh5eWluKTsKKwl5eXRlcm1pbmF0ZSgpOworfQorCislJQordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCkKK3sKKwluZXdfc3RyaW5nKCk7CisJbGFzdF90cyA9IGZpcnN0X3RzID0gMDsKKwlCRUdJTihIRUxQKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKQoreworCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCUJFR0lOKElOSVRJQUwpOworfQorCisKKy8qCisgKiBUcnkgdG8gb3BlbiBzcGVjaWZpZWQgZmlsZSB3aXRoIGZvbGxvd2luZyBuYW1lczoKKyAqIC4vbmFtZQorICogJChzcmN0cmVlKS9uYW1lCisgKiBUaGUgbGF0dGVyIGlzIHVzZWQgd2hlbiBzcmN0cmVlIGlzIHNlcGFyYXRlIGZyb20gb2JqdHJlZQorICogd2hlbiBjb21waWxpbmcgdGhlIGtlcm5lbC4KKyAqIFJldHVybiBOVUxMIGlmIGZpbGUgaXMgbm90IGZvdW5kLgorICovCitGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmVudiwgZnVsbG5hbWVbUEFUSF9NQVgrMV07CisJRklMRSAqZjsKKworCWYgPSBmb3BlbihuYW1lLCAiciIpOworCWlmICghZiAmJiBuYW1lWzBdICE9ICcvJykgeworCQllbnYgPSBnZXRlbnYoU1JDVFJFRSk7CisJCWlmIChlbnYpIHsKKwkJCXNwcmludGYoZnVsbG5hbWUsICIlcy8lcyIsIGVudiwgbmFtZSk7CisJCQlmID0gZm9wZW4oZnVsbG5hbWUsICJyIik7CisJCX0KKwl9CisJcmV0dXJuIGY7Cit9CisKK3ZvaWQgemNvbmZfaW5pdHNjYW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl5eWluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF5eWluKSB7CisJCXByaW50ZigiY2FuJ3QgZmluZCBmaWxlICVzXG4iLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwljdXJyZW50X2J1ZiA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisJbWVtc2V0KGN1cnJlbnRfYnVmLCAwLCBzaXplb2YoKmN1cnJlbnRfYnVmKSk7CisKKwljdXJyZW50X2ZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwljdXJyZW50X2ZpbGUtPmxpbmVubyA9IDE7CisJY3VycmVudF9maWxlLT5mbGFncyA9IEZJTEVfQlVTWTsKK30KKwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gbWFsbG9jKHNpemVvZigqYnVmKSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKCpidWYpKTsKKworCWN1cnJlbnRfYnVmLT5zdGF0ZSA9IFlZX0NVUlJFTlRfQlVGRkVSOworCXl5aW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXl5aW4pIHsKKwkJcHJpbnRmKCIlczolZDogY2FuJ3Qgb3BlbiBmaWxlIFwiJXNcIlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXl5X3N3aXRjaF90b19idWZmZXIoeXlfY3JlYXRlX2J1ZmZlcih5eWluLCBZWV9CVUZfU0laRSkpOworCWJ1Zi0+cGFyZW50ID0gY3VycmVudF9idWY7CisJY3VycmVudF9idWYgPSBidWY7CisKKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX0JVU1kpIHsKKwkJcHJpbnRmKCJyZWN1cnNpdmUgc2NhbiAoJXMpP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfU0NBTk5FRCkgeworCQlwcmludGYoImZpbGUgJXMgYWxyZWFkeSBzY2FubmVkP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWZpbGUtPmZsYWdzIHw9IEZJTEVfQlVTWTsKKwlmaWxlLT5saW5lbm8gPSAxOworCWZpbGUtPnBhcmVudCA9IGN1cnJlbnRfZmlsZTsKKwljdXJyZW50X2ZpbGUgPSBmaWxlOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqemNvbmZfZW5kZmlsZSh2b2lkKQoreworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgfD0gRklMRV9TQ0FOTkVEOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgJj0gfkZJTEVfQlVTWTsKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoeXlpbik7CisJCXl5X2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl5eV9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK2ludCB6Y29uZl9saW5lbm8odm9pZCkKK3sKKwlpZiAoY3VycmVudF9idWYpCisJCXJldHVybiBjdXJyZW50X2ZpbGUtPmxpbmVubyAtIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKQoreworCWlmIChjdXJyZW50X2J1ZikKKwkJcmV0dXJuIGN1cnJlbnRfZmlsZS0+bmFtZTsKKwllbHNlCisJCXJldHVybiAiPG5vbmU+IjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2M2Q4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCkBAIC0wLDAgKzEsMjEzMCBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgYnkgR05VIEJpc29uIDEuODc1YS4gICovCisKKy8qIFNrZWxldG9uIHBhcnNlciBmb3IgWWFjYy1saWtlIHBhcnNpbmcgd2l0aCBCaXNvbiwKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIG9yaWdpbmFsIHNvIGNhbGxlZAorICAgYGBzZW1hbnRpYycnIHBhcnNlci4gICovCisKKy8qIEFsbCBzeW1ib2xzIGRlZmluZWQgYmVsb3cgc2hvdWxkIGJlZ2luIHdpdGggeXkgb3IgWVksIHRvIGF2b2lkCisgICBpbmZyaW5naW5nIG9uIHVzZXIgbmFtZSBzcGFjZS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgZXZlbiBmb3IgbG9jYWwKKyAgIHZhcmlhYmxlcywgYXMgdGhleSBtaWdodCBvdGhlcndpc2UgYmUgZXhwYW5kZWQgYnkgdXNlciBtYWNyb3MuCisgICBUaGVyZSBhcmUgc29tZSB1bmF2b2lkYWJsZSBleGNlcHRpb25zIHdpdGhpbiBpbmNsdWRlIGZpbGVzIHRvCisgICBkZWZpbmUgbmVjZXNzYXJ5IGxpYnJhcnkgc3ltYm9sczsgdGhleSBhcmUgbm90ZWQgIklORlJJTkdFUyBPTgorICAgVVNFUiBOQU1FIFNQQUNFIiBiZWxvdy4gICovCisKKy8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisjZGVmaW5lIFlZQklTT04gMQorCisvKiBTa2VsZXRvbiBuYW1lLiAgKi8KKyNkZWZpbmUgWVlTS0VMRVRPTl9OQU1FICJ5YWNjLmMiCisKKy8qIFB1cmUgcGFyc2Vycy4gICovCisjZGVmaW5lIFlZUFVSRSAwCisKKy8qIFVzaW5nIGxvY2F0aW9ucy4gICovCisjZGVmaW5lIFlZTFNQX05FRURFRCAwCisKKy8qIElmIE5BTUVfUFJFRklYIGlzIHNwZWNpZmllZCBzdWJzdGl0dXRlIHRoZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucworICAgbmFtZXMuICAqLworI2RlZmluZSB5eXBhcnNlIHpjb25mcGFyc2UKKyNkZWZpbmUgeXlsZXggICB6Y29uZmxleAorI2RlZmluZSB5eWVycm9yIHpjb25mZXJyb3IKKyNkZWZpbmUgeXlsdmFsICB6Y29uZmx2YWwKKyNkZWZpbmUgeXljaGFyICB6Y29uZmNoYXIKKyNkZWZpbmUgeXlkZWJ1ZyB6Y29uZmRlYnVnCisjZGVmaW5lIHl5bmVycnMgemNvbmZuZXJycworCisKKy8qIFRva2Vucy4gICovCisjaWZuZGVmIFlZVE9LRU5UWVBFCisjIGRlZmluZSBZWVRPS0VOVFlQRQorICAgLyogUHV0IHRoZSB0b2tlbnMgaW50byB0aGUgc3ltYm9sIHRhYmxlLCBzbyB0aGF0IEdEQiBhbmQgb3RoZXIgZGVidWdnZXJzCisgICAgICBrbm93IGFib3V0IHRoZW0uICAqLworICAgZW51bSB5eXRva2VudHlwZSB7CisgICAgIFRfTUFJTk1FTlUgPSAyNTgsCisgICAgIFRfTUVOVSA9IDI1OSwKKyAgICAgVF9FTkRNRU5VID0gMjYwLAorICAgICBUX1NPVVJDRSA9IDI2MSwKKyAgICAgVF9DSE9JQ0UgPSAyNjIsCisgICAgIFRfRU5EQ0hPSUNFID0gMjYzLAorICAgICBUX0NPTU1FTlQgPSAyNjQsCisgICAgIFRfQ09ORklHID0gMjY1LAorICAgICBUX01FTlVDT05GSUcgPSAyNjYsCisgICAgIFRfSEVMUCA9IDI2NywKKyAgICAgVF9IRUxQVEVYVCA9IDI2OCwKKyAgICAgVF9JRiA9IDI2OSwKKyAgICAgVF9FTkRJRiA9IDI3MCwKKyAgICAgVF9ERVBFTkRTID0gMjcxLAorICAgICBUX1JFUVVJUkVTID0gMjcyLAorICAgICBUX09QVElPTkFMID0gMjczLAorICAgICBUX1BST01QVCA9IDI3NCwKKyAgICAgVF9ERUZBVUxUID0gMjc1LAorICAgICBUX1RSSVNUQVRFID0gMjc2LAorICAgICBUX0RFRl9UUklTVEFURSA9IDI3NywKKyAgICAgVF9CT09MRUFOID0gMjc4LAorICAgICBUX0RFRl9CT09MRUFOID0gMjc5LAorICAgICBUX1NUUklORyA9IDI4MCwKKyAgICAgVF9JTlQgPSAyODEsCisgICAgIFRfSEVYID0gMjgyLAorICAgICBUX1dPUkQgPSAyODMsCisgICAgIFRfV09SRF9RVU9URSA9IDI4NCwKKyAgICAgVF9VTkVRVUFMID0gMjg1LAorICAgICBUX0VPRiA9IDI4NiwKKyAgICAgVF9FT0wgPSAyODcsCisgICAgIFRfQ0xPU0VfUEFSRU4gPSAyODgsCisgICAgIFRfT1BFTl9QQVJFTiA9IDI4OSwKKyAgICAgVF9PTiA9IDI5MCwKKyAgICAgVF9TRUxFQ1QgPSAyOTEsCisgICAgIFRfUkFOR0UgPSAyOTIsCisgICAgIFRfT1IgPSAyOTMsCisgICAgIFRfQU5EID0gMjk0LAorICAgICBUX0VRVUFMID0gMjk1LAorICAgICBUX05PVCA9IDI5NgorICAgfTsKKyNlbmRpZgorI2RlZmluZSBUX01BSU5NRU5VIDI1OAorI2RlZmluZSBUX01FTlUgMjU5CisjZGVmaW5lIFRfRU5ETUVOVSAyNjAKKyNkZWZpbmUgVF9TT1VSQ0UgMjYxCisjZGVmaW5lIFRfQ0hPSUNFIDI2MgorI2RlZmluZSBUX0VORENIT0lDRSAyNjMKKyNkZWZpbmUgVF9DT01NRU5UIDI2NAorI2RlZmluZSBUX0NPTkZJRyAyNjUKKyNkZWZpbmUgVF9NRU5VQ09ORklHIDI2NgorI2RlZmluZSBUX0hFTFAgMjY3CisjZGVmaW5lIFRfSEVMUFRFWFQgMjY4CisjZGVmaW5lIFRfSUYgMjY5CisjZGVmaW5lIFRfRU5ESUYgMjcwCisjZGVmaW5lIFRfREVQRU5EUyAyNzEKKyNkZWZpbmUgVF9SRVFVSVJFUyAyNzIKKyNkZWZpbmUgVF9PUFRJT05BTCAyNzMKKyNkZWZpbmUgVF9QUk9NUFQgMjc0CisjZGVmaW5lIFRfREVGQVVMVCAyNzUKKyNkZWZpbmUgVF9UUklTVEFURSAyNzYKKyNkZWZpbmUgVF9ERUZfVFJJU1RBVEUgMjc3CisjZGVmaW5lIFRfQk9PTEVBTiAyNzgKKyNkZWZpbmUgVF9ERUZfQk9PTEVBTiAyNzkKKyNkZWZpbmUgVF9TVFJJTkcgMjgwCisjZGVmaW5lIFRfSU5UIDI4MQorI2RlZmluZSBUX0hFWCAyODIKKyNkZWZpbmUgVF9XT1JEIDI4MworI2RlZmluZSBUX1dPUkRfUVVPVEUgMjg0CisjZGVmaW5lIFRfVU5FUVVBTCAyODUKKyNkZWZpbmUgVF9FT0YgMjg2CisjZGVmaW5lIFRfRU9MIDI4NworI2RlZmluZSBUX0NMT1NFX1BBUkVOIDI4OAorI2RlZmluZSBUX09QRU5fUEFSRU4gMjg5CisjZGVmaW5lIFRfT04gMjkwCisjZGVmaW5lIFRfU0VMRUNUIDI5MQorI2RlZmluZSBUX1JBTkdFIDI5MgorI2RlZmluZSBUX09SIDI5MworI2RlZmluZSBUX0FORCAyOTQKKyNkZWZpbmUgVF9FUVVBTCAyOTUKKyNkZWZpbmUgVF9OT1QgMjk2CisKKworCisKKy8qIENvcHkgdGhlIGZpcnN0IHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQorCisjZGVmaW5lIFBSSU5URAkJMHgwMDAxCisjZGVmaW5lIERFQlVHX1BBUlNFCTB4MDAwMgorCitpbnQgY2RlYnVnID0gUFJJTlREOworCitleHRlcm4gaW50IHpjb25mbGV4KHZvaWQpOworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7CitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihpbnQgdG9rZW4sIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pOworCitzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfaGFzaFsyNTddOworCitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudSwgKmN1cnJlbnRfZW50cnk7CisKKyNkZWZpbmUgWVlFUlJPUl9WRVJCT1NFCisKKworLyogRW5hYmxpbmcgdHJhY2VzLiAgKi8KKyNpZm5kZWYgWVlERUJVRworIyBkZWZpbmUgWVlERUJVRyAwCisjZW5kaWYKKworLyogRW5hYmxpbmcgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gICovCisjaWZkZWYgWVlFUlJPUl9WRVJCT1NFCisjIHVuZGVmIFlZRVJST1JfVkVSQk9TRQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDEKKyNlbHNlCisjIGRlZmluZSBZWUVSUk9SX1ZFUkJPU0UgMAorI2VuZGlmCisKKyNpZiAhIGRlZmluZWQgKFlZU1RZUEUpICYmICEgZGVmaW5lZCAoWVlTVFlQRV9JU19ERUNMQVJFRCkKKwordHlwZWRlZiB1bmlvbiBZWVNUWVBFIHsKKwlpbnQgdG9rZW47CisJY2hhciAqc3RyaW5nOworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKK30gWVlTVFlQRTsKKy8qIExpbmUgMTkxIG9mIHlhY2MuYy4gICovCisKKyMgZGVmaW5lIHl5c3R5cGUgWVlTVFlQRSAvKiBvYnNvbGVzY2VudDsgd2lsbCBiZSB3aXRoZHJhd24gKi8KKyMgZGVmaW5lIFlZU1RZUEVfSVNfREVDTEFSRUQgMQorIyBkZWZpbmUgWVlTVFlQRV9JU19UUklWSUFMIDEKKyNlbmRpZgorCisKKworLyogQ29weSB0aGUgc2Vjb25kIHBhcnQgb2YgdXNlciBkZWNsYXJhdGlvbnMuICAqLworCisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKworLyogTGluZSAyMTQgb2YgeWFjYy5jLiAgKi8KKworCisjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UKKworLyogVGhlIHBhcnNlciBpbnZva2VzIGFsbG9jYSBvciBtYWxsb2M7IGRlZmluZSB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMuICAqLworCisjIGlmIFlZU1RBQ0tfVVNFX0FMTE9DQQorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjIGVsc2UKKyMgIGlmbmRlZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgICBpZiBkZWZpbmVkIChhbGxvY2EpIHx8IGRlZmluZWQgKF9BTExPQ0FfSCkKKyMgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZmRlZiBfX0dOVUNfXworIyAgICAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgX19idWlsdGluX2FsbG9jYQorIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmZGVmIFlZU1RBQ0tfQUxMT0MKKyAgIC8qIFBhY2lmeSBHQ0MncyBgZW1wdHkgaWYtYm9keScgd2FybmluZy4gKi8KKyMgIGRlZmluZSBZWVNUQUNLX0ZSRUUoUHRyKSBkbyB7IC8qIGVtcHR5ICovOyB9IHdoaWxlICgwKQorIyBlbHNlCisjICBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjICAgaW5jbHVkZSA8c3RkbGliLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjICBlbmRpZgorIyAgZGVmaW5lIFlZU1RBQ0tfQUxMT0MgbWFsbG9jCisjICBkZWZpbmUgWVlTVEFDS19GUkVFIGZyZWUKKyMgZW5kaWYKKyNlbmRpZiAvKiAhIGRlZmluZWQgKHl5b3ZlcmZsb3cpIHx8IFlZRVJST1JfVkVSQk9TRSAqLworCisKKyNpZiAoISBkZWZpbmVkICh5eW92ZXJmbG93KSBcCisgICAgICYmICghIGRlZmluZWQgKF9fY3BsdXNwbHVzKSBcCisJIHx8IChZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKworLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCit1bmlvbiB5eWFsbG9jCit7CisgIHNob3J0IHl5c3M7CisgIFlZU1RZUEUgeXl2czsKKyAgfTsKKworLyogVGhlIHNpemUgb2YgdGhlIG1heGltdW0gZ2FwIGJldHdlZW4gb25lIGFsaWduZWQgc3RhY2sgYW5kIHRoZSBuZXh0LiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfR0FQX01BWElNVU0gKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQorCisvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKKyAgIE4gZWxlbWVudHMuICAqLworIyBkZWZpbmUgWVlTVEFDS19CWVRFUyhOKSBcCisgICAgICgoTikgKiAoc2l6ZW9mIChzaG9ydCkgKyBzaXplb2YgKFlZU1RZUEUpKQkJCQlcCisgICAgICArIFlZU1RBQ0tfR0FQX01BWElNVU0pCisKKy8qIENvcHkgQ09VTlQgb2JqZWN0cyBmcm9tIEZST00gdG8gVE8uICBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkbworICAgbm90IG92ZXJsYXAuICAqLworIyBpZm5kZWYgWVlDT1BZCisjICBpZiAxIDwgX19HTlVDX18KKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkgXAorICAgICAgX19idWlsdGluX21lbWNweSAoVG8sIEZyb20sIChDb3VudCkgKiBzaXplb2YgKCooRnJvbSkpKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUNPUFkoVG8sIEZyb20sIENvdW50KQkJXAorICAgICAgZG8JCQkJCVwKKwl7CQkJCQlcCisJICByZWdpc3RlciBZWVNJWkVfVCB5eWk7CQlcCisJICBmb3IgKHl5aSA9IDA7IHl5aSA8IChDb3VudCk7IHl5aSsrKQlcCisJICAgIChUbylbeXlpXSA9IChGcm9tKVt5eWldOwkJXAorCX0JCQkJCVwKKyAgICAgIHdoaWxlICgwKQorIyAgZW5kaWYKKyMgZW5kaWYKKworLyogUmVsb2NhdGUgU1RBQ0sgZnJvbSBpdHMgb2xkIGxvY2F0aW9uIHRvIHRoZSBuZXcgb25lLiAgVGhlCisgICBsb2NhbCB2YXJpYWJsZXMgWVlTSVpFIGFuZCBZWVNUQUNLU0laRSBnaXZlIHRoZSBvbGQgYW5kIG5ldyBudW1iZXIgb2YKKyAgIGVsZW1lbnRzIGluIHRoZSBzdGFjaywgYW5kIFlZUFRSIGdpdmVzIHRoZSBuZXcgbG9jYXRpb24gb2YgdGhlCisgICBzdGFjay4gIEFkdmFuY2UgWVlQVFIgdG8gYSBwcm9wZXJseSBhbGlnbmVkIGxvY2F0aW9uIGZvciB0aGUgbmV4dAorICAgc3RhY2suICAqLworIyBkZWZpbmUgWVlTVEFDS19SRUxPQ0FURShTdGFjaykJCQkJCVwKKyAgICBkbwkJCQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJCQlcCisJWVlTSVpFX1QgeXluZXdieXRlczsJCQkJCQlcCisJWVlDT1BZICgmeXlwdHItPlN0YWNrLCBTdGFjaywgeXlzaXplKTsJCQkJXAorCVN0YWNrID0gJnl5cHRyLT5TdGFjazsJCQkJCQlcCisJeXluZXdieXRlcyA9IHl5c3RhY2tzaXplICogc2l6ZW9mICgqU3RhY2spICsgWVlTVEFDS19HQVBfTUFYSU1VTTsgXAorCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorICAgdHlwZWRlZiBzaWduZWQgY2hhciB5eXNpZ25lZF9jaGFyOworI2Vsc2UKKyAgIHR5cGVkZWYgc2hvcnQgeXlzaWduZWRfY2hhcjsKKyNlbmRpZgorCisvKiBZWUZJTkFMIC0tIFN0YXRlIG51bWJlciBvZiB0aGUgdGVybWluYXRpb24gc3RhdGUuICovCisjZGVmaW5lIFlZRklOQUwgIDIKKy8qIFlZTEFTVCAtLSBMYXN0IGluZGV4IGluIFlZVEFCTEUuICAqLworI2RlZmluZSBZWUxBU1QgICAyMDEKKworLyogWVlOVE9LRU5TIC0tIE51bWJlciBvZiB0ZXJtaW5hbHMuICovCisjZGVmaW5lIFlZTlRPS0VOUyAgNDIKKy8qIFlZTk5UUyAtLSBOdW1iZXIgb2Ygbm9udGVybWluYWxzLiAqLworI2RlZmluZSBZWU5OVFMgIDQxCisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2YgcnVsZXMuICovCisjZGVmaW5lIFlZTlJVTEVTICAxMDQKKy8qIFlZTlJVTEVTIC0tIE51bWJlciBvZiBzdGF0ZXMuICovCisjZGVmaW5lIFlZTlNUQVRFUyAgMTgyCisKKy8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLworI2RlZmluZSBZWVVOREVGVE9LICAyCisjZGVmaW5lIFlZTUFYVVRPSyAgIDI5NgorCisjZGVmaW5lIFlZVFJBTlNMQVRFKFlZWCkgCQkJCQkJXAorICAoKHVuc2lnbmVkIGludCkgKFlZWCkgPD0gWVlNQVhVVE9LID8geXl0cmFuc2xhdGVbWVlYXSA6IFlZVU5ERUZUT0spCisKKy8qIFlZVFJBTlNMQVRFW1lZTEVYXSAtLSBCaXNvbiBzeW1ib2wgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gWVlMRVguICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXl0cmFuc2xhdGVbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LAorICAgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwKKyAgICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LAorICAgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEKK307CisKKyNpZiBZWURFQlVHCisvKiBZWVBSSFNbWVlOXSAtLSBJbmRleCBvZiB0aGUgZmlyc3QgUkhTIHN5bWJvbCBvZiBydWxlIG51bWJlciBZWU4gaW4KKyAgIFlZUkhTLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB5eXByaHNbXSA9Cit7CisgICAgICAgMCwgICAgIDAsICAgICAzLCAgICAgNCwgICAgIDcsICAgICA5LCAgICAxMSwgICAgMTMsICAgIDE3LCAgICAxOSwKKyAgICAgIDIxLCAgICAyMywgICAgMjYsICAgIDI4LCAgICAzMCwgICAgMzIsICAgIDM0LCAgICAzNiwgICAgMzgsICAgIDQyLAorICAgICAgNDUsICAgIDQ5LCAgICA1MiwgICAgNTMsICAgIDU2LCAgICA1OSwgICAgNjIsICAgIDY1LCAgICA2OSwgICAgNzQsCisgICAgICA3OCwgICAgODMsICAgIDg3LCAgICA5MSwgICAgOTUsICAgMTAwLCAgIDEwNSwgICAxMTAsICAgMTE2LCAgIDExOSwKKyAgICAgMTIyLCAgIDEyNCwgICAxMjgsICAgMTMxLCAgIDEzMiwgICAxMzUsICAgMTM4LCAgIDE0MSwgICAxNDQsICAgMTQ5LAorICAgICAxNTMsICAgMTU3LCAgIDE2MCwgICAxNjUsICAgMTY2LCAgIDE2OSwgICAxNzMsICAgMTc1LCAgIDE3OSwgICAxODIsCisgICAgIDE4MywgICAxODYsICAgMTg5LCAgIDE5MiwgICAxOTYsICAgMTk5LCAgIDIwMSwgICAyMDUsICAgMjA4LCAgIDIwOSwKKyAgICAgMjEyLCAgIDIxNSwgICAyMTgsICAgMjIyLCAgIDIyNiwgICAyMjgsICAgMjMyLCAgIDIzNSwgICAyMzgsICAgMjQxLAorICAgICAyNDIsICAgMjQ1LCAgIDI0OCwgICAyNTMsICAgMjU3LCAgIDI2MSwgICAyNjIsICAgMjY1LCAgIDI2NywgICAyNjksCisgICAgIDI3MiwgICAyNzUsICAgMjc4LCAgIDI4MCwgICAyODIsICAgMjgzLCAgIDI4NiwgICAyODgsICAgMjkyLCAgIDI5NiwKKyAgICAgMzAwLCAgIDMwMywgICAzMDcsICAgMzExLCAgIDMxMworfTsKKworLyogWVlSSFMgLS0gQSBgLTEnLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBydWxlcycgUkhTLiAqLworc3RhdGljIGNvbnN0IHl5c2lnbmVkX2NoYXIgeXlyaHNbXSA9Cit7CisgICAgICA0MywgICAgIDAsICAgIC0xLCAgICAtMSwgICAgNDMsICAgIDQ0LCAgICAtMSwgICAgNDUsICAgIC0xLCAgICA1NSwKKyAgICAgIC0xLCAgICA2NiwgICAgLTEsICAgICAzLCAgICA3NywgICAgNzksICAgIC0xLCAgICAgNSwgICAgLTEsICAgIDE1LAorICAgICAgLTEsICAgICA4LCAgICAtMSwgICAgIDEsICAgIDc5LCAgICAtMSwgICAgNjEsICAgIC0xLCAgICA3MSwgICAgLTEsCisgICAgICA0NywgICAgLTEsICAgIDQ5LCAgICAtMSwgICAgNjksICAgIC0xLCAgICA3OSwgICAgLTEsICAgIDEwLCAgICAyOCwKKyAgICAgIDMyLCAgICAtMSwgICAgNDYsICAgIDUwLCAgICAtMSwgICAgMTEsICAgIDI4LCAgICAzMiwgICAgLTEsICAgIDQ4LAorICAgICAgNTAsICAgIC0xLCAgICAtMSwgICAgNTAsICAgIDUxLCAgICAtMSwgICAgNTAsICAgIDc1LCAgICAtMSwgICAgNTAsCisgICAgICA3MywgICAgLTEsICAgIDUwLCAgICAzMiwgICAgLTEsICAgIDIxLCAgICA3NiwgICAgMzIsICAgIC0xLCAgICAyMiwKKyAgICAgIDgxLCAgICA4MCwgICAgMzIsICAgIC0xLCAgICAyMywgICAgNzYsICAgIDMyLCAgICAtMSwgICAgMjQsICAgIDgxLAorICAgICAgODAsICAgIDMyLCAgICAtMSwgICAgMjYsICAgIDc2LCAgICAzMiwgICAgLTEsICAgIDI3LCAgICA3NiwgICAgMzIsCisgICAgICAtMSwgICAgMjUsICAgIDc2LCAgICAzMiwgICAgLTEsICAgIDE5LCAgICA3NywgICAgODAsICAgIDMyLCAgICAtMSwKKyAgICAgIDIwLCAgICA4MSwgICAgODAsICAgIDMyLCAgICAtMSwgICAgMzYsICAgIDI4LCAgICA4MCwgICAgMzIsICAgIC0xLAorICAgICAgMzcsICAgIDgyLCAgICA4MiwgICAgODAsICAgIDMyLCAgICAtMSwgICAgIDcsICAgIDMyLCAgICAtMSwgICAgNTIsCisgICAgICA1NiwgICAgLTEsICAgIDc4LCAgICAtMSwgICAgNTMsICAgIDU4LCAgICA1NCwgICAgLTEsICAgIDUzLCAgICA1OCwKKyAgICAgIC0xLCAgICAtMSwgICAgNTYsICAgIDU3LCAgICAtMSwgICAgNTYsICAgIDc1LCAgICAtMSwgICAgNTYsICAgIDczLAorICAgICAgLTEsICAgIDU2LCAgICAzMiwgICAgLTEsICAgIDE5LCAgICA3NywgICAgODAsICAgIDMyLCAgICAtMSwgICAgMjEsCisgICAgICA3NiwgICAgMzIsICAgIC0xLCAgICAyMywgICAgNzYsICAgIDMyLCAgICAtMSwgICAgMTgsICAgIDMyLCAgICAtMSwKKyAgICAgIDIwLCAgICAyOCwgICAgODAsICAgIDMyLCAgICAtMSwgICAgLTEsICAgIDU4LCAgICA0NSwgICAgLTEsICAgIDE0LAorICAgICAgODEsICAgIDMyLCAgICAtMSwgICAgNzgsICAgIC0xLCAgICA1OSwgICAgNjIsICAgIDYwLCAgICAtMSwgICAgNTksCisgICAgICA2MiwgICAgLTEsICAgIC0xLCAgICA2MiwgICAgNDUsICAgIC0xLCAgICA2MiwgICAgNjYsICAgIC0xLCAgICA2MiwKKyAgICAgIDU1LCAgICAtMSwgICAgIDQsICAgIDc3LCAgICAzMiwgICAgLTEsICAgIDYzLCAgICA3NCwgICAgLTEsICAgIDc4LAorICAgICAgLTEsICAgIDY0LCAgICA2NywgICAgNjUsICAgIC0xLCAgICA2NCwgICAgNjcsICAgIC0xLCAgICAtMSwgICAgNjcsCisgICAgICA0NSwgICAgLTEsICAgIDY3LCAgICA2NiwgICAgLTEsICAgIDY3LCAgICA1NSwgICAgLTEsICAgIDY3LCAgICAgMSwKKyAgICAgIDMyLCAgICAtMSwgICAgIDYsICAgIDc3LCAgICAzMiwgICAgLTEsICAgIDY4LCAgICAtMSwgICAgIDksICAgIDc3LAorICAgICAgMzIsICAgIC0xLCAgICA3MCwgICAgNzQsICAgIC0xLCAgICAxMiwgICAgMzIsICAgIC0xLCAgICA3MiwgICAgMTMsCisgICAgICAtMSwgICAgLTEsICAgIDc0LCAgICA3NSwgICAgLTEsICAgIDc0LCAgICAzMiwgICAgLTEsICAgIDE2LCAgICAzNSwKKyAgICAgIDgxLCAgICAzMiwgICAgLTEsICAgIDE2LCAgICA4MSwgICAgMzIsICAgIC0xLCAgICAxNywgICAgODEsICAgIDMyLAorICAgICAgLTEsICAgIC0xLCAgICA3NywgICAgODAsICAgIC0xLCAgICAyOCwgICAgLTEsICAgIDI5LCAgICAtMSwgICAgIDUsCisgICAgICA3OSwgICAgLTEsICAgICA4LCAgICA3OSwgICAgLTEsICAgIDE1LCAgICA3OSwgICAgLTEsICAgIDMyLCAgICAtMSwKKyAgICAgIDMxLCAgICAtMSwgICAgLTEsICAgIDE0LCAgICA4MSwgICAgLTEsICAgIDgyLCAgICAtMSwgICAgODIsICAgIDQwLAorICAgICAgODIsICAgIC0xLCAgICA4MiwgICAgMzAsICAgIDgyLCAgICAtMSwgICAgMzQsICAgIDgxLCAgICAzMywgICAgLTEsCisgICAgICA0MSwgICAgODEsICAgIC0xLCAgICA4MSwgICAgMzgsICAgIDgxLCAgICAtMSwgICAgODEsICAgIDM5LCAgICA4MSwKKyAgICAgIC0xLCAgICAyOCwgICAgLTEsICAgIDI5LCAgICAtMQorfTsKKworLyogWVlSTElORVtZWU5dIC0tIHNvdXJjZSBsaW5lIHdoZXJlIHJ1bGUgbnVtYmVyIFlZTiB3YXMgZGVmaW5lZC4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeXlybGluZVtdID0KK3sKKyAgICAgICAwLCAgICA5NCwgICAgOTQsICAgIDk1LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLAorICAgICAxMDQsICAgMTA1LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAxMTMsICAgMTE0LCAgIDEyMCwgICAxMjgsCisgICAgIDEzNCwgICAxNDIsICAgMTUyLCAgIDE1NCwgICAxNTUsICAgMTU2LCAgIDE1NywgICAxNjAsICAgMTY2LCAgIDE3MywKKyAgICAgMTc5LCAgIDE4NiwgICAxOTIsICAgMTk4LCAgIDIwNCwgICAyMTAsICAgMjE2LCAgIDIyMiwgICAyMzAsICAgMjM5LAorICAgICAyNDUsICAgMjU0LCAgIDI1NSwgICAyNjEsICAgMjYzLCAgIDI2NCwgICAyNjUsICAgMjY2LCAgIDI2OSwgICAyNzUsCisgICAgIDI4MSwgICAyODcsICAgMjkzLCAgIDI5OSwgICAzMDEsICAgMzA2LCAgIDMxNSwgICAzMjQsICAgMzI1LCAgIDMzMSwKKyAgICAgMzMzLCAgIDMzNCwgICAzMzUsICAgMzQwLCAgIDM0NywgICAzNTMsICAgMzYyLCAgIDM2MywgICAzNjksICAgMzcxLAorICAgICAzNzIsICAgMzczLCAgIDM3NCwgICAzNzcsICAgMzgzLCAgIDM5MCwgICAzOTcsICAgNDA0LCAgIDQxMCwgICA0MTcsCisgICAgIDQxOCwgICA0MTksICAgNDIyLCAgIDQyNywgICA0MzIsICAgNDQwLCAgIDQ0MiwgICA0NDcsICAgNDQ4LCAgIDQ1MSwKKyAgICAgNDUyLCAgIDQ1MywgICA0NTcsICAgNDU3LCAgIDQ1OSwgICA0NjAsICAgNDYzLCAgIDQ2NCwgICA0NjUsICAgNDY2LAorICAgICA0NjcsICAgNDY4LCAgIDQ2OSwgICA0NzIsICAgNDczCit9OworI2VuZGlmCisKKyNpZiBZWURFQlVHIHx8IFlZRVJST1JfVkVSQk9TRQorLyogWVlUTk1FW1NZTUJPTC1OVU1dIC0tIFN0cmluZyBuYW1lIG9mIHRoZSBzeW1ib2wgU1lNQk9MLU5VTS4KKyAgIEZpcnN0LCB0aGUgdGVybWluYWxzLCB0aGVuLCBzdGFydGluZyBhdCBZWU5UT0tFTlMsIG5vbnRlcm1pbmFscy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB5eXRuYW1lW10gPQoreworICAiJGVuZCIsICJlcnJvciIsICIkdW5kZWZpbmVkIiwgIlRfTUFJTk1FTlUiLCAiVF9NRU5VIiwgIlRfRU5ETUVOVSIsIAorICAiVF9TT1VSQ0UiLCAiVF9DSE9JQ0UiLCAiVF9FTkRDSE9JQ0UiLCAiVF9DT01NRU5UIiwgIlRfQ09ORklHIiwgCisgICJUX01FTlVDT05GSUciLCAiVF9IRUxQIiwgIlRfSEVMUFRFWFQiLCAiVF9JRiIsICJUX0VORElGIiwgIlRfREVQRU5EUyIsIAorICAiVF9SRVFVSVJFUyIsICJUX09QVElPTkFMIiwgIlRfUFJPTVBUIiwgIlRfREVGQVVMVCIsICJUX1RSSVNUQVRFIiwgCisgICJUX0RFRl9UUklTVEFURSIsICJUX0JPT0xFQU4iLCAiVF9ERUZfQk9PTEVBTiIsICJUX1NUUklORyIsICJUX0lOVCIsIAorICAiVF9IRVgiLCAiVF9XT1JEIiwgIlRfV09SRF9RVU9URSIsICJUX1VORVFVQUwiLCAiVF9FT0YiLCAiVF9FT0wiLCAKKyAgIlRfQ0xPU0VfUEFSRU4iLCAiVF9PUEVOX1BBUkVOIiwgIlRfT04iLCAiVF9TRUxFQ1QiLCAiVF9SQU5HRSIsICJUX09SIiwgCisgICJUX0FORCIsICJUX0VRVUFMIiwgIlRfTk9UIiwgIiRhY2NlcHQiLCAiaW5wdXQiLCAiYmxvY2siLCAKKyAgImNvbW1vbl9ibG9jayIsICJjb25maWdfZW50cnlfc3RhcnQiLCAiY29uZmlnX3N0bXQiLCAKKyAgIm1lbnVjb25maWdfZW50cnlfc3RhcnQiLCAibWVudWNvbmZpZ19zdG10IiwgImNvbmZpZ19vcHRpb25fbGlzdCIsIAorICAiY29uZmlnX29wdGlvbiIsICJjaG9pY2UiLCAiY2hvaWNlX2VudHJ5IiwgImNob2ljZV9lbmQiLCAiY2hvaWNlX3N0bXQiLCAKKyAgImNob2ljZV9vcHRpb25fbGlzdCIsICJjaG9pY2Vfb3B0aW9uIiwgImNob2ljZV9ibG9jayIsICJpZiIsICJpZl9lbmQiLCAKKyAgImlmX3N0bXQiLCAiaWZfYmxvY2siLCAibWVudSIsICJtZW51X2VudHJ5IiwgIm1lbnVfZW5kIiwgIm1lbnVfc3RtdCIsIAorICAibWVudV9ibG9jayIsICJzb3VyY2UiLCAic291cmNlX3N0bXQiLCAiY29tbWVudCIsICJjb21tZW50X3N0bXQiLCAKKyAgImhlbHBfc3RhcnQiLCAiaGVscCIsICJkZXBlbmRzX2xpc3QiLCAiZGVwZW5kcyIsICJwcm9tcHRfc3RtdF9vcHQiLCAKKyAgInByb21wdCIsICJlbmQiLCAibmxfb3JfZW9mIiwgImlmX2V4cHIiLCAiZXhwciIsICJzeW1ib2wiLCAwCit9OworI2VuZGlmCisKKyMgaWZkZWYgWVlQUklOVAorLyogWVlUT0tOVU1bWVlMRVgtTlVNXSAtLSBJbnRlcm5hbCB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0bworICAgdG9rZW4gWVlMRVgtTlVNLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB5eXRva251bVtdID0KK3sKKyAgICAgICAwLCAgIDI1NiwgICAyNTcsICAgMjU4LCAgIDI1OSwgICAyNjAsICAgMjYxLCAgIDI2MiwgICAyNjMsICAgMjY0LAorICAgICAyNjUsICAgMjY2LCAgIDI2NywgICAyNjgsICAgMjY5LCAgIDI3MCwgICAyNzEsICAgMjcyLCAgIDI3MywgICAyNzQsCisgICAgIDI3NSwgICAyNzYsICAgMjc3LCAgIDI3OCwgICAyNzksICAgMjgwLCAgIDI4MSwgICAyODIsICAgMjgzLCAgIDI4NCwKKyAgICAgMjg1LCAgIDI4NiwgICAyODcsICAgMjg4LCAgIDI4OSwgICAyOTAsICAgMjkxLCAgIDI5MiwgICAyOTMsICAgMjk0LAorICAgICAyOTUsICAgMjk2Cit9OworIyBlbmRpZgorCisvKiBZWVIxW1lZTl0gLS0gU3ltYm9sIG51bWJlciBvZiBzeW1ib2wgdGhhdCBydWxlIFlZTiBkZXJpdmVzLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5cjFbXSA9Cit7CisgICAgICAgMCwgICAgNDIsICAgIDQzLCAgICA0MywgICAgNDQsICAgIDQ0LCAgICA0NCwgICAgNDQsICAgIDQ0LCAgICA0NCwKKyAgICAgIDQ0LCAgICA0NCwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDYsICAgIDQ3LAorICAgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDUxLCAgICA1MSwgICAgNTEsCisgICAgICA1MSwgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsICAgIDUyLCAgICA1MywKKyAgICAgIDU0LCAgICA1NSwgICAgNTUsICAgIDU2LCAgICA1NiwgICAgNTYsICAgIDU2LCAgICA1NiwgICAgNTcsICAgIDU3LAorICAgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTgsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MSwgICAgNjIsCisgICAgICA2MiwgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjYsICAgIDY3LCAgICA2NywKKyAgICAgIDY3LCAgICA2NywgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LAorICAgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NiwgICAgNzYsICAgIDc3LCAgICA3NywgICAgNzgsCisgICAgICA3OCwgICAgNzgsICAgIDc5LCAgICA3OSwgICAgODAsICAgIDgwLCAgICA4MSwgICAgODEsICAgIDgxLCAgICA4MSwKKyAgICAgIDgxLCAgICA4MSwgICAgODEsICAgIDgyLCAgICA4MgorfTsKKworLyogWVlSMltZWU5dIC0tIE51bWJlciBvZiBzeW1ib2xzIGNvbXBvc2luZyByaWdodCBoYW5kIHNpZGUgb2YgcnVsZSBZWU4uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlyMltdID0KK3sKKyAgICAgICAwLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDEsICAgICAxLAorICAgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsCisgICAgICAgMywgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgMywKKyAgICAgICA0LCAgICAgMywgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNSwgICAgIDIsICAgICAyLAorICAgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsCisgICAgICAgMywgICAgIDIsICAgICA0LCAgICAgMCwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMCwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDAsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDAsCisgICAgICAgMiwgICAgIDIsICAgICA0LCAgICAgMywgICAgIDMsICAgICAwLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLAorICAgICAgIDIsICAgICAzLCAgICAgMywgICAgIDEsICAgICAxCit9OworCisvKiBZWURFRkFDVFtTVEFURS1OQU1FXSAtLSBEZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUKKyAgIFNUQVRFLU5VTSB3aGVuIFlZVEFCTEUgZG9lc24ndCBzcGVjaWZ5IHNvbWV0aGluZyBlbHNlIHRvIGRvLiAgWmVybworICAgbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4gZXJyb3IuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlkZWZhY3RbXSA9Cit7CisgICAgICAgMiwgICAgIDAsICAgICAxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOCwgICAgIDAsICAgICAwLCAgICAxMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgOTMsICAgIDkyLCAgICAgMywgICAgIDQsICAgIDIyLAorICAgICAgMTQsICAgIDIyLCAgICAxNSwgICAgNDMsICAgIDUzLCAgICAgNSwgICAgNTksICAgIDEyLCAgICA3OSwgICAgNjgsCisgICAgICAgNiwgICAgNzQsICAgIDE2LCAgICA3OSwgICAgMTMsICAgIDE3LCAgICAxMSwgICAgODcsICAgIDg4LCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgMzgsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTAzLCAgIDEwNCwgICAgIDAsICAgICAwLAorICAgICAgIDAsICAgIDk2LCAgICAxOSwgICAgMjEsICAgIDM5LCAgICA0MiwgICAgNTgsICAgIDY0LCAgICAgMCwgICAgNzYsCisgICAgICAgNywgICAgNjMsICAgIDczLCAgICA3NSwgICAgMTgsICAgIDIwLCAgICAgMCwgICAxMDAsICAgIDU1LCAgICAgMCwKKyAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgODUsICAgICAwLAorICAgICAgODUsICAgICAwLCAgICA4NSwgICAgODUsICAgIDg1LCAgICAyNiwgICAgIDAsICAgICAwLCAgICAyMywgICAgIDAsCisgICAgICAyNSwgICAgMjQsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg1LCAgICA4NSwgICAgNDcsICAgIDQ0LCAgICA0NiwKKyAgICAgIDQ1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1NCwgICAgNDEsICAgIDQwLCAgICA2MCwgICAgNjIsICAgIDU3LAorICAgICAgNjEsICAgIDU2LCAgICA4MSwgICAgODAsICAgICAwLCAgICA2OSwgICAgNzEsICAgIDY2LCAgICA3MCwgICAgNjUsCisgICAgICA5OSwgICAxMDEsICAgMTAyLCAgICA5OCwgICAgOTcsICAgIDc3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwKKyAgICAgIDk0LCAgICAgMCwgICAgOTQsICAgIDk0LCAgICAgMCwgICAgOTQsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDk0LAorICAgICAgIDAsICAgIDc4LCAgICA1MSwgICAgOTQsICAgIDk0LCAgICAgMCwgICAgIDAsICAgIDg5LCAgICA5MCwgICAgOTEsCisgICAgICA3MiwgICAgIDAsICAgIDgzLCAgICA4NCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjcsICAgIDg2LCAgICAgMCwKKyAgICAgIDI5LCAgICAgMCwgICAgMzMsICAgIDMxLCAgICAzMiwgICAgIDAsICAgIDk0LCAgICAgMCwgICAgIDAsICAgIDQ5LAorICAgICAgNTAsICAgIDgyLCAgICA5NSwgICAgMzQsICAgIDM1LCAgICAyOCwgICAgMzAsICAgIDM2LCAgICAgMCwgICAgNDgsCisgICAgICA1MiwgICAgMzcKK307CisKKy8qIFlZREVGR09UT1tOVEVSTS1OVU1dLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIC0xLCAgICAgMSwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgNTIsICAgIDg4LAorICAgICAgMjMsICAgIDI0LCAgIDEwNSwgICAgMjUsICAgIDU0LCAgICA5OCwgICAgNTUsICAgIDI2LCAgIDEwOSwgICAgMjcsCisgICAgICA1NiwgICAgMjgsICAgIDI5LCAgIDExNywgICAgMzAsICAgIDU4LCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwKKyAgICAgIDg5LCAgICA5MCwgICAgNTcsICAgIDkxLCAgIDEzMSwgICAxMzIsICAgMTA2LCAgICAzNSwgICAxNTUsICAgIDUwLAorICAgICAgNTEKK307CisKKy8qIFlZUEFDVFtTVEFURS1OVU1dIC0tIEluZGV4IGluIFlZVEFCTEUgb2YgdGhlIHBvcnRpb24gZGVzY3JpYmluZworICAgU1RBVEUtTlVNLiAgKi8KKyNkZWZpbmUgWVlQQUNUX05JTkYgLTk5CitzdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPQoreworICAgICAtOTksICAgIDQ4LCAgIC05OSwgICAgMzgsICAgIDQ2LCAgICA0NiwgICAtOTksICAgIDQ2LCAgIC0yOSwgICAtOTksCisgICAgICA0NiwgICAtMTcsICAgIC0zLCAgIC0xMSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAgMzgsCisgICAgICAxMiwgICAgMTUsICAgLTk5LCAgICAxOCwgICAgNTEsICAgIDYyLCAgIC05OSwgICAtOTksICAgLTExLCAgIC0xMSwKKyAgICAgICA0LCAgIC0yNCwgICAxMzgsICAgMTM4LCAgIDE2MCwgICAxMjEsICAgMTEwLCAgICAtNCwgICAgODEsICAgIC00LAorICAgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtMTksICAgLTk5LCAgIC05OSwgICAtMTEsCisgICAgIC0xMSwgICAgNzAsICAgIDcwLCAgICA3MywgICAgMzIsICAgLTExLCAgICA0NiwgICAtMTEsICAgIDQ2LCAgIC0xMSwKKyAgICAgIDQ2LCAgIC0xMSwgICAgNDYsICAgIDQ2LCAgICA0NiwgICAtOTksICAgIDM2LCAgICA3MCwgICAtOTksICAgIDk1LAorICAgICAtOTksICAgLTk5LCAgICA5NiwgICAgNDYsICAgMTA2LCAgICA0NiwgICAgNDYsICAgLTk5LCAgIC05OSwgICAtOTksCisgICAgIC05OSwgICAgMzgsICAgIDM4LCAgICAzOCwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIDExMiwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgMTE3LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtMTEsICAgIDMzLCAgICA2NSwgICAxMzEsCisgICAgICAgMSwgICAxMTksICAgMTMxLCAgICAgMSwgICAxMzYsICAgICAxLCAgIDE1MywgICAxNTQsICAgMTU1LCAgIDEzMSwKKyAgICAgIDcwLCAgIC05OSwgICAtOTksICAgMTMxLCAgIDEzMSwgICAxNTYsICAgMTU3LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgMTAxLCAgIC05OSwgICAtOTksICAgLTExLCAgIDE1OCwgICAxNTksICAgLTk5LCAgIC05OSwgICAxNjEsCisgICAgIC05OSwgICAxNjIsICAgLTk5LCAgIC05OSwgICAtOTksICAgMTYzLCAgIDEzMSwgICAxNjQsICAgMTY1LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAgOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAxNjYsICAgLTk5LAorICAgICAtOTksICAgLTk5Cit9OworCisvKiBZWVBHT1RPW05URVJNLU5VTV0uICAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9Cit7CisgICAgIC05OSwgICAtOTksICAgLTk5LCAgIDExMSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgMTc4LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgIDkxLCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgMTE1LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksCisgICAgIC05OSwgICAxNDYsICAgMTY4LCAgICA4OSwgICAgMjcsICAgICAwLCAgIDEyNiwgICAgLTEsICAgLTk4LCAgIC00OCwKKyAgICAgLTYzCit9OworCisvKiBZWVRBQkxFW1lZUEFDVFtTVEFURS1OVU1dXS4gIFdoYXQgdG8gZG8gaW4gc3RhdGUgU1RBVEUtTlVNLiAgSWYKKyAgIHBvc2l0aXZlLCBzaGlmdCB0aGF0IHRva2VuLiAgSWYgbmVnYXRpdmUsIHJlZHVjZSB0aGUgcnVsZSB3aGljaAorICAgbnVtYmVyIGlzIHRoZSBvcHBvc2l0ZS4gIElmIHplcm8sIGRvIHdoYXQgWVlERUZBQ1Qgc2F5cy4KKyAgIElmIFlZVEFCTEVfTklORiwgc3ludGF4IGVycm9yLiAgKi8KKyNkZWZpbmUgWVlUQUJMRV9OSU5GIC02OAorc3RhdGljIGNvbnN0IHNob3J0IHl5dGFibGVbXSA9Cit7CisgICAgICA2NiwgICAgNjcsICAgIDM2LCAgICA0MiwgICAgMzksICAgIDQwLCAgICA3MSwgICAgNDEsICAgMTIzLCAgIDEyNCwKKyAgICAgIDQzLCAgICA0NCwgICAgNzQsICAgIDc1LCAgIDEyMCwgICAxNTQsICAgIDcyLCAgICA0NiwgICAgNDcsICAgIDY5LAorICAgICAgNzAsICAgMTIxLCAgIDEyMiwgICAgNDgsICAgMTQwLCAgICA0NSwgICAxMjcsICAgMTI4LCAgIDExMiwgICAxMzAsCisgICAgICA0OSwgICAxMzMsICAgMTU2LCAgIDEzNSwgICAxNTgsICAgMTU5LCAgICA2OCwgICAxNjEsICAgIDYwLCAgICA2OSwKKyAgICAgIDcwLCAgIDE2NSwgICAgNjksICAgIDcwLCAgICA2MSwgICAxNjcsICAgMTY4LCAgICA2MiwgICAgIDIsICAgICAzLAorICAgICAgNjMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsCisgICAgICA0NiwgICAgNDcsICAgIDEzLCAgICAxNCwgICAxMzksICAgMTUyLCAgICA0OCwgICAxMjYsICAgMTc4LCAgICAxNSwKKyAgICAgIDE2LCAgICA2OSwgICAgNzAsICAgIDQ5LCAgICAzNywgICAgMzgsICAgMTI5LCAgIDE2NiwgICAxNTEsICAgIDE1LAorICAgICAgMTYsICAgLTY3LCAgIDExNCwgICAgNjQsICAgLTY3LCAgICAgNSwgICAxMDEsICAgICA3LCAgICAgOCwgICAxMDIsCisgICAgICAxMCwgICAgMTEsICAgIDEyLCAgIDE0MywgICAgNjUsICAgIDEzLCAgIDEwMywgICAxNTMsICAgIDQ2LCAgICA0NywKKyAgICAgMTQ3LCAgIDE0OCwgICAxNDksICAgIDY5LCAgICA3MCwgICAxMjUsICAgMTcyLCAgIDEzNCwgICAxNDEsICAgMTM2LAorICAgICAxMzcsICAgMTM4LCAgICAxNSwgICAgMTYsICAgICA1LCAgIDEwMSwgICAgIDcsICAgICA4LCAgIDEwMiwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgMTQ1LCAgIDE0NiwgICAgMTMsICAgMTAzLCAgIDEwMSwgICAgIDcsICAgMTQyLCAgIDEwMiwKKyAgICAgIDEwLCAgICAxMSwgICAgMTIsICAgMTcxLCAgIDE0NCwgICAgMTMsICAgMTAzLCAgICA2OSwgICAgNzAsICAgIDY5LAorICAgICAgNzAsICAgIDE1LCAgICAxNiwgICAxMDAsICAgMTUwLCAgIDE1NCwgICAxMTMsICAgMTA4LCAgIDExMywgICAxMTYsCisgICAgICA3MywgICAxNTcsICAgIDE1LCAgICAxNiwgICAgNzQsICAgIDc1LCAgICA3MCwgICAgNzYsICAgIDc3LCAgICA3OCwKKyAgICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgODQsICAgMTA0LCAgIDEwNywgICAxNjAsICAgMTE1LAorICAgICAgODUsICAgMTEwLCAgICA3MywgICAxMTgsICAgIDg2LCAgICA4NywgICAgNzQsICAgIDc1LCAgICA5MiwgICAgOTMsCisgICAgICA5NCwgICAgOTUsICAgMTExLCAgICA5NiwgICAxMTksICAgMTYyLCAgIDE2MywgICAxNjQsICAgMTY5LCAgIDE3MCwKKyAgICAgMTczLCAgIDE3NCwgICAgOTcsICAgMTc1LCAgIDE3NiwgICAxNzcsICAgMTc5LCAgIDE4MCwgICAxODEsICAgIDUzLAorICAgICAgOTksICAgIDU5Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eWNoZWNrW10gPQoreworICAgICAgNDgsICAgIDQ5LCAgICAgMywgICAgMzIsICAgICA0LCAgICAgNSwgICAgMzAsICAgICA3LCAgICA3MSwgICAgNzIsCisgICAgICAxMCwgICAgMjgsICAgIDE2LCAgICAxNywgICAgMzMsICAgIDE0LCAgICA0MCwgICAgMjgsICAgIDI5LCAgICAzOCwKKyAgICAgIDM5LCAgICA2OSwgICAgNzAsICAgIDM0LCAgICA4NywgICAgMjgsICAgIDc0LCAgICA3NSwgICAgMzIsICAgIDc3LAorICAgICAgNDEsICAgIDc5LCAgIDEzMCwgICAgODEsICAgMTMyLCAgIDEzMywgICAgMzIsICAgMTM1LCAgICAzOSwgICAgMzgsCisgICAgICAzOSwgICAxMzksICAgIDM4LCAgICAzOSwgICAgMzIsICAgMTQzLCAgIDE0NCwgICAgMzIsICAgICAwLCAgICAgMSwKKyAgICAgIDMyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgICAgMjgsICAgIDI5LCAgICAxNCwgICAgMTUsICAgIDI4LCAgICAzMiwgICAgMzQsICAgIDM1LCAgIDE2NiwgICAgMzEsCisgICAgICAzMiwgICAgMzgsICAgIDM5LCAgICA0MSwgICAgMjgsICAgIDI5LCAgICA3NiwgICAxNDAsICAgMTI2LCAgICAzMSwKKyAgICAgIDMyLCAgICAgMCwgICAgIDEsICAgIDMyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgOTMsICAgIDMyLCAgICAxNCwgICAgMTUsICAgIDMyLCAgICAyOCwgICAgMjksCisgICAgIDEwMSwgICAxMDIsICAgMTAzLCAgICAzOCwgICAgMzksICAgIDMyLCAgIDE1NCwgICAgODAsICAgIDEzLCAgICA4MiwKKyAgICAgIDgzLCAgICA4NCwgICAgMzEsICAgIDMyLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgICAgMTAsICAgIDExLCAgICA5NSwgICAgOTYsICAgIDE0LCAgICAxNSwgICAgIDUsICAgICA2LCAgICAzMiwgICAgIDgsCisgICAgICAgOSwgICAgMTAsICAgIDExLCAgICAzMiwgICAgMjgsICAgIDE0LCAgICAxNSwgICAgMzgsICAgIDM5LCAgICAzOCwKKyAgICAgIDM5LCAgICAzMSwgICAgMzIsICAgIDU0LCAgICAzMiwgICAgMTQsICAgIDU3LCAgICA1NiwgICAgNTksICAgIDU4LAorICAgICAgMTIsICAgIDMyLCAgICAzMSwgICAgMzIsICAgIDE2LCAgICAxNywgICAgMzksICAgIDE5LCAgICAyMCwgICAgMjEsCisgICAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICA1NSwgICAgNTYsICAgIDMyLCAgICA1OCwKKyAgICAgIDMyLCAgICA1NiwgICAgMTIsICAgIDU4LCAgICAzNiwgICAgMzcsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgICAgMjAsICAgIDIxLCAgICA1NiwgICAgMjMsICAgIDU4LCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsCisgICAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAyMSwKKyAgICAgIDU0LCAgICAzMworfTsKKworLyogWVlTVE9TW1NUQVRFLU5VTV0gLS0gVGhlIChpbnRlcm5hbCBudW1iZXIgb2YgdGhlKSBhY2Nlc3NpbmcKKyAgIHN5bWJvbCBvZiBzdGF0ZSBTVEFURS1OVU0uICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXlzdG9zW10gPQoreworICAgICAgIDAsICAgIDQzLCAgICAgMCwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCisgICAgICAgOSwgICAgMTAsICAgIDExLCAgICAxNCwgICAgMTUsICAgIDMxLCAgICAzMiwgICAgNDQsICAgIDQ1LCAgICA0NiwKKyAgICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUyLCAgICA1MywgICAgNTUsICAgIDU5LCAgICA2MSwgICAgNjMsICAgIDY0LAorICAgICAgNjYsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3OSwgICAgNzksICAgIDI4LCAgICAyOSwgICAgNzcsCisgICAgICA3NywgICAgNzcsICAgIDMyLCAgICA3NywgICAgMjgsICAgIDI4LCAgICAyOCwgICAgMjksICAgIDM0LCAgICA0MSwKKyAgICAgIDgxLCAgICA4MiwgICAgNTAsICAgIDUwLCAgICA1NiwgICAgNTgsICAgIDYyLCAgICA3NCwgICAgNjcsICAgIDc0LAorICAgICAgNzksICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgODEsICAgIDgxLCAgICAzMiwgICAgMzgsCisgICAgICAzOSwgICAgMzAsICAgIDQwLCAgICAxMiwgICAgMTYsICAgIDE3LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKKyAgICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMzIsICAgIDM2LCAgICAzNywgICAgNTEsICAgIDcyLAorICAgICAgNzMsICAgIDc1LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjMsICAgIDMyLCAgICA1NywgICAgNzMsCisgICAgICA3NSwgICAgIDUsICAgICA4LCAgICAxNSwgICAgNDUsICAgIDU0LCAgICA3OCwgICAgNDUsICAgIDU1LCAgICA2MCwKKyAgICAgIDY2LCAgICA3OCwgICAgMzIsICAgIDc1LCAgICAgMSwgICAgNDUsICAgIDU1LCAgICA2NSwgICAgNjYsICAgIDc4LAorICAgICAgMzMsICAgIDgxLCAgICA4MSwgICAgODIsICAgIDgyLCAgICAzMiwgICAgMzUsICAgIDgxLCAgICA4MSwgICAgNzcsCisgICAgICA4MSwgICAgNzYsICAgIDc3LCAgICA4MSwgICAgNzYsICAgIDgxLCAgICA3NiwgICAgNzYsICAgIDc2LCAgICAyOCwKKyAgICAgIDgyLCAgICAxMywgICAgMzIsICAgIDc3LCAgICAyOCwgICAgNzYsICAgIDc2LCAgICA3OSwgICAgNzksICAgIDc5LAorICAgICAgMzIsICAgIDgxLCAgICAzMiwgICAgMzIsICAgIDE0LCAgICA4MCwgICAgODAsICAgIDMyLCAgICA4MCwgICAgODAsCisgICAgICAzMiwgICAgODAsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDgwLCAgICA4MiwgICAgODAsICAgIDgwLCAgICAzMiwKKyAgICAgIDMyLCAgICAzMiwgICAgODEsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgODAsICAgIDMyLAorICAgICAgMzIsICAgIDMyCit9OworCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoX19TSVpFX1RZUEVfXykKKyMgZGVmaW5lIFlZU0laRV9UIF9fU0laRV9UWVBFX18KKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKHNpemVfdCkKKyMgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgaW5jbHVkZSA8c3RkZGVmLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyMgZW5kaWYKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGRlZmluZSBZWVNJWkVfVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJKC0yKQorI2RlZmluZSBZWUVPRgkJMAorCisjZGVmaW5lIFlZQUNDRVBUCWdvdG8geXlhY2NlcHRsYWIKKyNkZWZpbmUgWVlBQk9SVAkJZ290byB5eWFib3J0bGFiCisjZGVmaW5lIFlZRVJST1IJCWdvdG8geXllcnJsYWIxCisKKworLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQorICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKworI2RlZmluZSBZWUZBSUwJCWdvdG8geXllcnJsYWIKKworI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisKKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKKyAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAorICAgICAgeXl0b2tlbiA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsgCQkJCQkJCQlcCisgICAgICB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpO1wKKyAgICAgIFlZRVJST1I7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit3aGlsZSAoMCkKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworLyogWVlMTE9DX0RFRkFVTFQgLS0gQ29tcHV0ZSB0aGUgZGVmYXVsdCBsb2NhdGlvbiAoYmVmb3JlIHRoZSBhY3Rpb25zCisgICBhcmUgcnVuKS4gICovCisKKyNpZm5kZWYgWVlMTE9DX0RFRkFVTFQKKyMgZGVmaW5lIFlZTExPQ19ERUZBVUxUKEN1cnJlbnQsIFJocywgTikgICAgICAgICBcCisgIEN1cnJlbnQuZmlyc3RfbGluZSAgID0gUmhzWzFdLmZpcnN0X2xpbmU7ICAgICAgXAorICBDdXJyZW50LmZpcnN0X2NvbHVtbiA9IFJoc1sxXS5maXJzdF9jb2x1bW47ICAgIFwKKyAgQ3VycmVudC5sYXN0X2xpbmUgICAgPSBSaHNbTl0ubGFzdF9saW5lOyAgICAgICBcCisgIEN1cnJlbnQubGFzdF9jb2x1bW4gID0gUmhzW05dLmxhc3RfY29sdW1uOworI2VuZGlmCisKKy8qIFlZTEVYIC0tIGNhbGxpbmcgYHl5bGV4JyB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuICAqLworCisjaWZkZWYgWVlMRVhfUEFSQU0KKyMgZGVmaW5lIFlZTEVYIHl5bGV4IChZWUxFWF9QQVJBTSkKKyNlbHNlCisjIGRlZmluZSBZWUxFWCB5eWxleCAoKQorI2VuZGlmCisKKy8qIEVuYWJsZSBkZWJ1Z2dpbmcgaWYgcmVxdWVzdGVkLiAgKi8KKyNpZiBZWURFQlVHCisKKyMgaWZuZGVmIFlZRlBSSU5URgorIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCisjIGVuZGlmCisKKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKK2RvIHsJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJXAorICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCit9IHdoaWxlICgwKQorCisjIGRlZmluZSBZWURTWU1QUklOVChBcmdzKQkJCVwKK2RvIHsJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJXAorICAgIHl5c3ltcHJpbnQgQXJnczsJCQkJXAorfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgWVlEU1lNUFJJTlRGKFRpdGxlLCBUb2tlbiwgVmFsdWUsIExvY2F0aW9uKQkJXAorZG8gewkJCQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCQkJXAorICAgIHsJCQkJCQkJCVwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgVGl0bGUpOwkJCQlcCisgICAgICB5eXN5bXByaW50IChzdGRlcnIsIAkJCQkJXAorICAgICAgICAgICAgICAgICAgVG9rZW4sIFZhbHVlKTsJXAorICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJcbiIpOwkJCQkJXAorICAgIH0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eV9zdGFja19wcmludCAtLSBQcmludCB0aGUgc3RhdGUgc3RhY2sgZnJvbSBpdHMgQk9UVE9NIHVwIHRvIGl0cyB8Cit8IFRPUCAoY2lubHVkZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5X3N0YWNrX3ByaW50IChzaG9ydCAqYm90dG9tLCBzaG9ydCAqdG9wKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoYm90dG9tLCB0b3ApCisgICAgc2hvcnQgKmJvdHRvbTsKKyAgICBzaG9ydCAqdG9wOworI2VuZGlmCit7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiU3RhY2sgbm93Iik7CisgIGZvciAoLyogTm90aGluZy4gKi87IGJvdHRvbSA8PSB0b3A7ICsrYm90dG9tKQorICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKmJvdHRvbSk7CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKK30KKworIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCQkJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB5eV9zdGFja19wcmludCAoKEJvdHRvbSksIChUb3ApKTsJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgUmVwb3J0IHRoYXQgdGhlIFlZUlVMRSBpcyBnb2luZyB0byBiZSByZWR1Y2VkLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50IChpbnQgeXlydWxlKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eV9yZWR1Y2VfcHJpbnQgKHl5cnVsZSkKKyAgICBpbnQgeXlydWxlOworI2VuZGlmCit7CisgIGludCB5eWk7CisgIHVuc2lnbmVkIGludCB5eWxpbmVubyA9IHl5cmxpbmVbeXlydWxlXTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyBzdGFjayBieSBydWxlICVkIChsaW5lICV1KSwgIiwKKyAgICAgICAgICAgICB5eXJ1bGUgLSAxLCB5eWxpbmVubyk7CisgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICBmb3IgKHl5aSA9IHl5cHJoc1t5eXJ1bGVdOyAwIDw9IHl5cmhzW3l5aV07IHl5aSsrKQorICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZSBbeXlyaHNbeXlpXV0pOworICBZWUZQUklOVEYgKHN0ZGVyciwgIi0+ICVzXG4iLCB5eXRuYW1lIFt5eXIxW3l5cnVsZV1dKTsKK30KKworIyBkZWZpbmUgWVlfUkVEVUNFX1BSSU5UKFJ1bGUpCQlcCitkbyB7CQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQlcCisgICAgeXlfcmVkdWNlX3ByaW50IChSdWxlKTsJCVwKK30gd2hpbGUgKDApCisKKy8qIE5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UuICBJdCBpcyBsZWZ0IHVuaW5pdGlhbGl6ZWQgc28gdGhhdAorICAgbXVsdGlwbGUgcGFyc2VycyBjYW4gY29leGlzdC4gICovCitpbnQgeXlkZWJ1ZzsKKyNlbHNlIC8qICFZWURFQlVHICovCisjIGRlZmluZSBZWURQUklOVEYoQXJncykKKyMgZGVmaW5lIFlZRFNZTVBSSU5UKEFyZ3MpCisjIGRlZmluZSBZWURTWU1QUklOVEYoVGl0bGUsIFRva2VuLCBWYWx1ZSwgTG9jYXRpb24pCisjIGRlZmluZSBZWV9TVEFDS19QUklOVChCb3R0b20sIFRvcCkKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQorI2VuZGlmIC8qICFZWURFQlVHICovCisKKworLyogWVlJTklUREVQVEggLS0gaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MuICAqLworI2lmbmRlZglZWUlOSVRERVBUSAorIyBkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogWVlNQVhERVBUSCAtLSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrcyBjYW4gZ3JvdyB0byAoZWZmZWN0aXZlIG9ubHkKKyAgIGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLgorCisgICBEbyBub3QgbWFrZSB0aGlzIHZhbHVlIHRvbyBsYXJnZTsgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZCBpZgorICAgU0laRV9NQVggPCBZWVNUQUNLX0JZVEVTIChZWU1BWERFUFRIKQorICAgZXZhbHVhdGVkIHdpdGggaW5maW5pdGUtcHJlY2lzaW9uIGludGVnZXIgYXJpdGhtZXRpYy4gICovCisKKyNpZiBZWU1BWERFUFRIID09IDAKKyMgdW5kZWYgWVlNQVhERVBUSAorI2VuZGlmCisKKyNpZm5kZWYgWVlNQVhERVBUSAorIyBkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAorI2VuZGlmCisKKwwKKworI2lmIFlZRVJST1JfVkVSQk9TRQorCisjIGlmbmRlZiB5eXN0cmxlbgorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpCisjICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgorIyAgZWxzZQorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworc3RhdGljIFlZU0laRV9UCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorIyAgIGVsc2UKK3l5c3RybGVuICh5eXN0cikKKyAgICAgY29uc3QgY2hhciAqeXlzdHI7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzdHI7CisKKyAgd2hpbGUgKCp5eXMrKyAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eXMgLSB5eXN0ciAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXN0cGNweQorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpICYmIGRlZmluZWQgKF9HTlVfU09VUkNFKQorIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKyMgIGVsc2UKKy8qIENvcHkgWVlTUkMgdG8gWVlERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4KKyAgIFlZREVTVC4gICovCitzdGF0aWMgY2hhciAqCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisjICAgZWxzZQoreXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCisgICAgIGNoYXIgKnl5ZGVzdDsKKyAgICAgY29uc3QgY2hhciAqeXlzcmM7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY2hhciAqeXlkID0geXlkZXN0OworICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKKworICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlkIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisKKyNlbmRpZiAvKiAhWVlFUlJPUl9WRVJCT1NFICovCisKKwwKKworI2lmIFlZREVCVUcKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFByaW50IHRoaXMgc3ltYm9sIG9uIFlZT1VUUFVULiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eXN5bXByaW50IChGSUxFICp5eW91dHB1dCwgaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5c3ltcHJpbnQgKHl5b3V0cHV0LCB5eXR5cGUsIHl5dmFsdWVwKQorICAgIEZJTEUgKnl5b3V0cHV0OworICAgIGludCB5eXR5cGU7CisgICAgWVlTVFlQRSAqeXl2YWx1ZXA7CisjZW5kaWYKK3sKKyAgLyogUGFjaWZ5IGBgdW51c2VkIHZhcmlhYmxlJycgd2FybmluZ3MuICAqLworICAodm9pZCkgeXl2YWx1ZXA7CisKKyAgaWYgKHl5dHlwZSA8IFlZTlRPS0VOUykKKyAgICB7CisgICAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAidG9rZW4gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisjIGlmZGVmIFlZUFJJTlQKKyAgICAgIFlZUFJJTlQgKHl5b3V0cHV0LCB5eXRva251bVt5eXR5cGVdLCAqeXl2YWx1ZXApOworIyBlbmRpZgorICAgIH0KKyAgZWxzZQorICAgIFlZRlBSSU5URiAoeXlvdXRwdXQsICJudGVybSAlcyAoIiwgeXl0bmFtZVt5eXR5cGVdKTsKKworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIFlZRlBSSU5URiAoeXlvdXRwdXQsICIpIik7Cit9CisKKyNlbmRpZiAvKiAhIFlZREVCVUcgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlbGVhc2UgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIHRoaXMgc3ltYm9sLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eWRlc3RydWN0IChpbnQgeXl0eXBlLCBZWVNUWVBFICp5eXZhbHVlcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KKyAgKHZvaWQpIHl5dmFsdWVwOworCisgIHN3aXRjaCAoeXl0eXBlKQorICAgIHsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorDAorCisvKiBQcmV2ZW50IHdhcm5pbmdzIGZyb20gLVdtaXNzaW5nLXByb3RvdHlwZXMuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitpbnQgeXlwYXJzZSAodm9pZCAqWVlQQVJTRV9QQVJBTSk7CisjIGVsc2UKK2ludCB5eXBhcnNlICgpOworIyBlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50IHl5cGFyc2UgKHZvaWQpOworI2Vsc2UKK2ludCB5eXBhcnNlICgpOworI2VuZGlmCisjZW5kaWYgLyogISBZWVBBUlNFX1BBUkFNICovCisKKworCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCitpbnQgeXljaGFyOworCisvKiBUaGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworWVlTVFlQRSB5eWx2YWw7CisKKy8qIE51bWJlciBvZiBzeW50YXggZXJyb3JzIHNvIGZhci4gICovCitpbnQgeXluZXJyczsKKworCisKKy8qLS0tLS0tLS0tLS4KK3wgeXlwYXJzZS4gIHwKK2AtLS0tLS0tLS0tKi8KKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pCisjIGVsc2UKK2ludCB5eXBhcnNlIChZWVBBUlNFX1BBUkFNKQorICB2b2lkICpZWVBBUlNFX1BBUkFNOworIyBlbmRpZgorI2Vsc2UgLyogISBZWVBBUlNFX1BBUkFNICovCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50Cit5eXBhcnNlICh2b2lkKQorI2Vsc2UKK2ludAoreXlwYXJzZSAoKQorCisjZW5kaWYKKyNlbmRpZgoreworICAKKyAgcmVnaXN0ZXIgaW50IHl5c3RhdGU7CisgIHJlZ2lzdGVyIGludCB5eW47CisgIGludCB5eXJlc3VsdDsKKyAgLyogTnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZC4gICovCisgIGludCB5eWVycnN0YXR1czsKKyAgLyogTG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIuICAqLworICBpbnQgeXl0b2tlbiA9IDA7CisKKyAgLyogVGhyZWUgc3RhY2tzIGFuZCB0aGVpciB0b29sczoKKyAgICAgYHl5c3MnOiByZWxhdGVkIHRvIHN0YXRlcywKKyAgICAgYHl5dnMnOiByZWxhdGVkIHRvIHNlbWFudGljIHZhbHVlcywKKyAgICAgYHl5bHMnOiByZWxhdGVkIHRvIGxvY2F0aW9ucy4KKworICAgICBSZWZlciB0byB0aGUgc3RhY2tzIHRocnUgc2VwYXJhdGUgcG9pbnRlcnMsIHRvIGFsbG93IHl5b3ZlcmZsb3cKKyAgICAgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZS4gICovCisKKyAgLyogVGhlIHN0YXRlIHN0YWNrLiAgKi8KKyAgc2hvcnQJeXlzc2FbWVlJTklUREVQVEhdOworICBzaG9ydCAqeXlzcyA9IHl5c3NhOworICByZWdpc3RlciBzaG9ydCAqeXlzc3A7CisKKyAgLyogVGhlIHNlbWFudGljIHZhbHVlIHN0YWNrLiAgKi8KKyAgWVlTVFlQRSB5eXZzYVtZWUlOSVRERVBUSF07CisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsKKyAgcmVnaXN0ZXIgWVlTVFlQRSAqeXl2c3A7CisKKworCisjZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKKworICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisgIC8qIFRoZSB2YXJpYWJsZXMgdXNlZCB0byByZXR1cm4gc2VtYW50aWMgdmFsdWUgYW5kIGxvY2F0aW9uIGZyb20gdGhlCisgICAgIGFjdGlvbiByb3V0aW5lcy4gICovCisgIFlZU1RZUEUgeXl2YWw7CisKKworICAvKiBXaGVuIHJlZHVjaW5nLCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgb24gdGhlIFJIUyBvZiB0aGUgcmVkdWNlZAorICAgICBydWxlLiAgKi8KKyAgaW50IHl5bGVuOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YXJ0aW5nIHBhcnNlXG4iKSk7CisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3M7CisgIHl5dnNwID0geXl2czsKKworICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuCisgICAgICovCisgIHl5c3NwKys7CisKKyB5eXNldHN0YXRlOgorICAqeXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIHsKKwkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJc2hvcnQgKnl5c3MxID0geXlzczsKKworCisJLyogRWFjaCBzdGFjayBwb2ludGVyIGFkZHJlc3MgaXMgZm9sbG93ZWQgYnkgdGhlIHNpemUgb2YgdGhlCisJICAgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICBUaGlzIHVzZWQgdG8gYmUgYQorCSAgIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywgYnV0IHRoYXQgbWlnaHQKKwkgICBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eW92ZXJmbG93bGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmIChZWU1BWERFUFRIIDw9IHl5c3RhY2tzaXplKQorCWdvdG8geXlvdmVyZmxvd2xhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoWVlNQVhERVBUSCA8IHl5c3RhY2tzaXplKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlvdmVyZmxvd2xhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKworIyAgdW5kZWYgWVlTVEFDS19SRUxPQ0FURQorCWlmICh5eXNzMSAhPSB5eXNzYSkKKwkgIFlZU1RBQ0tfRlJFRSAoeXlzczEpOworICAgICAgfQorIyBlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgeXlzaXplIC0gMTsKKyAgICAgIHl5dnNwID0geXl2cyArIHl5c2l6ZSAtIDE7CisKKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWx1XG4iLAorCQkgICh1bnNpZ25lZCBsb25nIGludCkgeXlzdGFja3NpemUpKTsKKworICAgICAgaWYgKHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEgPD0geXlzc3ApCisJWVlBQk9SVDsKKyAgICB9CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpKTsKKworICBnb3RvIHl5YmFja3VwOworCisvKi0tLS0tLS0tLS0tLgorfCB5eWJhY2t1cC4gIHwKK2AtLS0tLS0tLS0tLSovCit5eWJhY2t1cDoKKworLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCisvKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKy8qIHl5cmVzdW1lOiAqLworCisgIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLworCisgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSBZWVBBQ1RfTklORikKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICAvKiBOb3Qga25vd24gPT4gZ2V0IGEgbG9va2FoZWFkIHRva2VuIGlmIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuICAqLworCisgIC8qIFlZQ0hBUiBpcyBlaXRoZXIgWVlFTVBUWSBvciBZWUVPRiBvciBhIHZhbGlkIGxvb2thaGVhZCBzeW1ib2wuICAqLworICBpZiAoeXljaGFyID09IFlZRU1QVFkpCisgICAgeworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKSk7CisgICAgICB5eWNoYXIgPSBZWUxFWDsKKyAgICB9CisKKyAgaWYgKHl5Y2hhciA8PSBZWUVPRikKKyAgICB7CisgICAgICB5eWNoYXIgPSB5eXRva2VuID0gWVlFT0Y7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIikpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKyAgICAgIFlZRFNZTVBSSU5URiAoIk5leHQgdG9rZW4gaXMiLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICB9CisKKyAgLyogSWYgdGhlIHByb3BlciBhY3Rpb24gb24gc2VlaW5nIHRva2VuIFlZVE9LRU4gaXMgdG8gcmVkdWNlIG9yIHRvCisgICAgIGRldGVjdCBhbiBlcnJvciwgdGFrZSB0aGF0IGFjdGlvbi4gICovCisgIHl5biArPSB5eXRva2VuOworICBpZiAoeXluIDwgMCB8fCBZWUxBU1QgPCB5eW4gfHwgeXljaGVja1t5eW5dICE9IHl5dG9rZW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8PSAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gMCB8fCB5eW4gPT0gWVlUQUJMRV9OSU5GKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlcywgIiwgeXl0bmFtZVt5eXRva2VuXSkpOworCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKworCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZGVmYXVsdDoKKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJybGFiOworICBnb3RvIHl5cmVkdWNlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5cmVkdWNlOgorICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworICB5eWxlbiA9IHl5cjJbeXluXTsKKworICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKKyAgICAgYCQkID0gJDEnLgorCisgICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gZ2FyYmFnZS4KKyAgICAgVGhpcyBiZWhhdmlvciBpcyB1bmRvY3VtZW50ZWQgYW5kIEJpc29uCisgICAgIHVzZXJzIHNob3VsZCBub3QgcmVseSB1cG9uIGl0LiAgQXNzaWduaW5nIHRvIFlZVkFMCisgICAgIHVuY29uZGl0aW9uYWxseSBtYWtlcyB0aGUgcGFyc2VyIGEgYml0IHNtYWxsZXIsIGFuZCBpdCBhdm9pZHMgYQorICAgICBHQ0Mgd2FybmluZyB0aGF0IFlZVkFMIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQuICAqLworICB5eXZhbCA9IHl5dnNwWzEteXlsZW5dOworCisKKyAgWVlfUkVEVUNFX1BSSU5UICh5eW4pOworICBzd2l0Y2ggKHl5bikKKyAgICB7CisgICAgICAgIGNhc2UgODoKKworICAgIHsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kbWVudScgc3RhdGVtZW50Iik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OgorCisgICAgeyB6Y29uZnByaW50KCJ1bmV4cGVjdGVkICdlbmRpZicgc3RhdGVtZW50Iik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDoKKworICAgIHsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kY2hvaWNlJyBzdGF0ZW1lbnQiKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDExOgorCisgICAgeyB6Y29uZnByaW50KCJzeW50YXggZXJyb3IiKTsgeXllcnJvazsgO30KKyAgICBicmVhazsKKworICBjYXNlIDE4OgorCisgICAgeworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoeXl2c3BbLTFdLnN0cmluZywgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb25maWcgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIHl5dnNwWy0xXS5zdHJpbmcpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDE5OgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAyMDoKKworICAgIHsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKHl5dnNwWy0xXS5zdHJpbmcsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudWNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgeXl2c3BbLTFdLnN0cmluZyk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjE6CisKKyAgICB7CisJaWYgKGN1cnJlbnRfZW50cnktPnByb21wdCkKKwkJY3VycmVudF9lbnRyeS0+cHJvbXB0LT50eXBlID0gUF9NRU5VOworCWVsc2UKKwkJemNvbmZwcmludCgid2FybmluZzogbWVudWNvbmZpZyBzdGF0ZW1lbnQgd2l0aG91dCBwcm9tcHQiKTsKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjc6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX1RSSVNUQVRFKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0cmlzdGF0ZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjg6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsIHl5dnNwWy0yXS5leHByLCB5eXZzcFstMV0uZXhwcik7CisJbWVudV9zZXRfdHlwZShTX1RSSVNUQVRFKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZfYm9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjk6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX0JPT0xFQU4pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmJvb2xlYW5cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDMwOgorCisgICAgeworCW1lbnVfYWRkX2V4cHIoUF9ERUZBVUxULCB5eXZzcFstMl0uZXhwciwgeXl2c3BbLTFdLmV4cHIpOworCW1lbnVfc2V0X3R5cGUoU19CT09MRUFOKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZfYm9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzE6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX0lOVCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aW50XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMjoKKworICAgIHsKKwltZW51X3NldF90eXBlKFNfSEVYKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpoZXhcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDMzOgorCisgICAgeworCW1lbnVfc2V0X3R5cGUoU19TVFJJTkcpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnN0cmluZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzQ6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCB5eXZzcFstMl0uc3RyaW5nLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cHJvbXB0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNToKKworICAgIHsKKwltZW51X2FkZF9leHByKFBfREVGQVVMVCwgeXl2c3BbLTJdLmV4cHIsIHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNjoKKworICAgIHsKKwltZW51X2FkZF9zeW1ib2woUF9TRUxFQ1QsIHN5bV9sb29rdXAoeXl2c3BbLTJdLnN0cmluZywgMCksIHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzZWxlY3RcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDM3OgorCisgICAgeworCW1lbnVfYWRkX2V4cHIoUF9SQU5HRSwgZXhwcl9hbGxvY19jb21wKEVfUkFOR0UseXl2c3BbLTNdLnN5bWJvbCwgeXl2c3BbLTJdLnN5bWJvbCksIHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpyYW5nZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzg6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cChOVUxMLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSE9JQ0U7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwltZW51X2FkZF9leHByKFBfQ0hPSUNFLCBOVUxMLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDM5OgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7CisJbWVudV9hZGRfbWVudSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDQwOgorCisgICAgeworCWlmICh6Y29uZl9lbmR0b2tlbih5eXZzcFswXS50b2tlbiwgVF9DSE9JQ0UsIFRfRU5EQ0hPSUNFKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorO30KKyAgICBicmVhazsKKworICBjYXNlIDQyOgorCisgICAgeworCXByaW50ZigiJXM6JWQ6IG1pc3NpbmcgJ2VuZGNob2ljZScgZm9yIHRoaXMgJ2Nob2ljZScgc3RhdGVtZW50XG4iLCBjdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vKTsKKwl6Y29uZm5lcnJzKys7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDg6CisKKyAgICB7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCB5eXZzcFstMl0uc3RyaW5nLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cHJvbXB0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0OToKKworICAgIHsKKwltZW51X3NldF90eXBlKFNfVFJJU1RBVEUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnRyaXN0YXRlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MDoKKworICAgIHsKKwltZW51X3NldF90eXBlKFNfQk9PTEVBTik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Ym9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTE6CisKKyAgICB7CisJY3VycmVudF9lbnRyeS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6b3B0aW9uYWxcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDUyOgorCisgICAgeworCW1lbnVfYWRkX3N5bWJvbChQX0RFRkFVTFQsIHN5bV9sb29rdXAoeXl2c3BbLTJdLnN0cmluZywgMCksIHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1NToKKworICAgIHsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfZGVwKHl5dnNwWy0xXS5leHByKTsKKwltZW51X2VuZF9lbnRyeSgpOworCW1lbnVfYWRkX21lbnUoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1NjoKKworICAgIHsKKwlpZiAoemNvbmZfZW5kdG9rZW4oeXl2c3BbMF0udG9rZW4sIFRfSUYsIFRfRU5ESUYpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kaWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1ODoKKworICAgIHsKKwlwcmludGYoIiVzOiVkOiBtaXNzaW5nICdlbmRpZicgZm9yIHRoaXMgJ2lmJyBzdGF0ZW1lbnRcbiIsIGN1cnJlbnRfbWVudS0+ZmlsZS0+bmFtZSwgY3VycmVudF9tZW51LT5saW5lbm8pOworCXpjb25mbmVycnMrKzsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA2MzoKKworICAgIHsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9wcm9wKFBfTUVOVSwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjQ6CisKKyAgICB7CisJbWVudV9lbmRfZW50cnkoKTsKKwltZW51X2FkZF9tZW51KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjU6CisKKyAgICB7CisJaWYgKHpjb25mX2VuZHRva2VuKHl5dnNwWzBdLnRva2VuLCBUX01FTlUsIFRfRU5ETUVOVSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRtZW51XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjc6CisKKyAgICB7CisJcHJpbnRmKCIlczolZDogbWlzc2luZyAnZW5kbWVudScgZm9yIHRoaXMgJ21lbnUnIHN0YXRlbWVudFxuIiwgY3VycmVudF9tZW51LT5maWxlLT5uYW1lLCBjdXJyZW50X21lbnUtPmxpbmVubyk7CisJemNvbmZuZXJycysrOworO30KKyAgICBicmVhazsKKworICBjYXNlIDcyOgorCisgICAgeyB6Y29uZnByaW50KCJpbnZhbGlkIG1lbnUgb3B0aW9uIik7IHl5ZXJyb2s7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MzoKKworICAgIHsKKwl5eXZhbC5zdHJpbmcgPSB5eXZzcFstMV0uc3RyaW5nOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNvdXJjZSAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgeXl2c3BbLTFdLnN0cmluZyk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzQ6CisKKyAgICB7CisJemNvbmZfbmV4dGZpbGUoeXl2c3BbMF0uc3RyaW5nKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NToKKworICAgIHsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9wcm9wKFBfQ09NTUVOVCwgeXl2c3BbLTFdLnN0cmluZywgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29tbWVudFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzY6CisKKyAgICB7CisJbWVudV9lbmRfZW50cnkoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3NzoKKworICAgIHsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpoZWxwXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl6Y29uZl9zdGFydGhlbHAoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3ODoKKworICAgIHsKKwljdXJyZW50X2VudHJ5LT5zeW0tPmhlbHAgPSB5eXZzcFswXS5zdHJpbmc7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODI6CisKKyAgICB7CisJbWVudV9hZGRfZGVwKHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzIG9uXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4MzoKKworICAgIHsKKwltZW51X2FkZF9kZXAoeXl2c3BbLTFdLmV4cHIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDg0OgorCisgICAgeworCW1lbnVfYWRkX2RlcCh5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmVxdWlyZXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDg2OgorCisgICAgeworCW1lbnVfYWRkX3Byb3AoUF9QUk9NUFQsIHl5dnNwWy0xXS5zdHJpbmcsIE5VTEwsIHl5dnNwWzBdLmV4cHIpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDg5OgorCisgICAgeyB5eXZhbC50b2tlbiA9IFRfRU5ETUVOVTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDkwOgorCisgICAgeyB5eXZhbC50b2tlbiA9IFRfRU5EQ0hPSUNFOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTE6CisKKyAgICB7IHl5dmFsLnRva2VuID0gVF9FTkRJRjsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk0OgorCisgICAgeyB5eXZhbC5leHByID0gTlVMTDsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk1OgorCisgICAgeyB5eXZhbC5leHByID0geXl2c3BbMF0uZXhwcjsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk2OgorCisgICAgeyB5eXZhbC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woeXl2c3BbMF0uc3ltYm9sKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDk3OgorCisgICAgeyB5eXZhbC5leHByID0gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHl5dnNwWy0yXS5zeW1ib2wsIHl5dnNwWzBdLnN5bWJvbCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5ODoKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsIHl5dnNwWy0yXS5zeW1ib2wsIHl5dnNwWzBdLnN5bWJvbCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5OToKKworICAgIHsgeXl2YWwuZXhwciA9IHl5dnNwWy0xXS5leHByOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAwOgorCisgICAgeyB5eXZhbC5leHByID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIHl5dnNwWzBdLmV4cHIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAxOgorCisgICAgeyB5eXZhbC5leHByID0gZXhwcl9hbGxvY190d28oRV9PUiwgeXl2c3BbLTJdLmV4cHIsIHl5dnNwWzBdLmV4cHIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTAyOgorCisgICAgeyB5eXZhbC5leHByID0gZXhwcl9hbGxvY190d28oRV9BTkQsIHl5dnNwWy0yXS5leHByLCB5eXZzcFswXS5leHByKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMzoKKworICAgIHsgeXl2YWwuc3ltYm9sID0gc3ltX2xvb2t1cCh5eXZzcFswXS5zdHJpbmcsIDApOyBmcmVlKHl5dnNwWzBdLnN0cmluZyk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDQ6CisKKyAgICB7IHl5dmFsLnN5bWJvbCA9IHN5bV9sb29rdXAoeXl2c3BbMF0uc3RyaW5nLCAxKTsgZnJlZSh5eXZzcFswXS5zdHJpbmcpOyA7fQorICAgIGJyZWFrOworCisKKyAgICB9CisKKy8qIExpbmUgOTk5IG9mIHlhY2MuYy4gICovCisKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworCisKKyAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVE9LRU5TXSArICp5eXNzcDsKKyAgaWYgKDAgPD0geXlzdGF0ZSAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVE9LRU5TXTsKKworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiIC0tIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWI6CisgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLworICBpZiAoIXl5ZXJyc3RhdHVzKQorICAgIHsKKyAgICAgICsreXluZXJyczsKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKFlZUEFDVF9OSU5GIDwgeXluICYmIHl5biA8IFlZTEFTVCkKKwl7CisJICBZWVNJWkVfVCB5eXNpemUgPSAwOworCSAgaW50IHl5dHlwZSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOworCSAgY2hhciAqeXltc2c7CisJICBpbnQgeXl4LCB5eWNvdW50OworCisJICB5eWNvdW50ID0gMDsKKwkgIC8qIFN0YXJ0IFlZWCBhdCAtWVlOIGlmIG5lZ2F0aXZlIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4KKwkgICAgIFlZQ0hFQ0suICAqLworCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7CisJICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsgeXl4KyspCisJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKKwkgICAgICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbeXl4XSkgKyAxNSwgeXljb3VudCsrOworCSAgeXlzaXplICs9IHl5c3RybGVuICgic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICIpICsgMTsKKwkgIHl5c2l6ZSArPSB5eXN0cmxlbiAoeXl0bmFtZVt5eXR5cGVdKTsKKwkgIHl5bXNnID0gKGNoYXIgKikgWVlTVEFDS19BTExPQyAoeXlzaXplKTsKKwkgIGlmICh5eW1zZyAhPSAwKQorCSAgICB7CisJICAgICAgY2hhciAqeXlwID0geXlzdHBjcHkgKHl5bXNnLCAic3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICIpOworCSAgICAgIHl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbeXl0eXBlXSk7CisKKwkgICAgICBpZiAoeXljb3VudCA8IDUpCisJCXsKKwkJICB5eWNvdW50ID0gMDsKKwkJICBmb3IgKHl5eCA9IHl5biA8IDAgPyAteXluIDogMDsKKwkJICAgICAgIHl5eCA8IChpbnQpIChzaXplb2YgKHl5dG5hbWUpIC8gc2l6ZW9mIChjaGFyICopKTsKKwkJICAgICAgIHl5eCsrKQorCQkgICAgaWYgKHl5Y2hlY2tbeXl4ICsgeXluXSA9PSB5eXggJiYgeXl4ICE9IFlZVEVSUk9SKQorCQkgICAgICB7CisJCQljb25zdCBjaGFyICp5eXEgPSAhIHl5Y291bnQgPyAiLCBleHBlY3RpbmcgIiA6ICIgb3IgIjsKKwkJCXl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5cSk7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5eF0pOworCQkJeXljb3VudCsrOworCQkgICAgICB9CisJCX0KKwkgICAgICB5eWVycm9yICh5eW1zZyk7CisJICAgICAgWVlTVEFDS19GUkVFICh5eW1zZyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeXllcnJvciAoInN5bnRheCBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCisJeXllcnJvciAoInN5bnRheCBlcnJvciIpOworICAgIH0KKworCisKKyAgaWYgKHl5ZXJyc3RhdHVzID09IDMpCisgICAgeworICAgICAgLyogSWYganVzdCB0cmllZCBhbmQgZmFpbGVkIHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBhbgorCSBlcnJvciwgZGlzY2FyZCBpdC4gICovCisKKyAgICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIGF0IGVuZCBvZiBpbnB1dC4gICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorICAgICAgICB7CisJICAvKiBQb3AgdGhlIGVycm9yIHRva2VuLiAgKi8KKyAgICAgICAgICBZWVBPUFNUQUNLOworCSAgLyogUG9wIHRoZSByZXN0IG9mIHRoZSBzdGFjay4gICovCisJICB3aGlsZSAoeXlzcyA8IHl5c3NwKQorCSAgICB7CisJICAgICAgWVlEU1lNUFJJTlRGICgiRXJyb3I6IHBvcHBpbmciLCB5eXN0b3NbKnl5c3NwXSwgeXl2c3AsIHl5bHNwKTsKKwkgICAgICB5eWRlc3RydWN0ICh5eXN0b3NbKnl5c3NwXSwgeXl2c3ApOworCSAgICAgIFlZUE9QU1RBQ0s7CisJICAgIH0KKwkgIFlZQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgWVlEU1lNUFJJTlRGICgiRXJyb3I6IGRpc2NhcmRpbmciLCB5eXRva2VuLCAmeXlsdmFsLCAmeXlsbG9jKTsKKyAgICAgIHl5ZGVzdHJ1Y3QgKHl5dG9rZW4sICZ5eWx2YWwpOworICAgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbiBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IKKyAgICAgdG9rZW4uICAqLworICBnb3RvIHl5ZXJybGFiMTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZXJybGFiMSAtLSBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24uICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWVycmxhYjE6CisgIHl5ZXJyc3RhdHVzID0gMzsJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzLiAgKi8KKworICBmb3IgKDs7KQorICAgIHsKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgICAgIGlmICh5eW4gIT0gWVlQQUNUX05JTkYpCisJeworCSAgeXluICs9IFlZVEVSUk9SOworCSAgaWYgKDAgPD0geXluICYmIHl5biA8PSBZWUxBU1QgJiYgeXljaGVja1t5eW5dID09IFlZVEVSUk9SKQorCSAgICB7CisJICAgICAgeXluID0geXl0YWJsZVt5eW5dOworCSAgICAgIGlmICgwIDwgeXluKQorCQlicmVhazsKKwkgICAgfQorCX0KKworICAgICAgLyogUG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgZXJyb3IgdG9rZW4uICAqLworICAgICAgaWYgKHl5c3NwID09IHl5c3MpCisJWVlBQk9SVDsKKworICAgICAgWVlEU1lNUFJJTlRGICgiRXJyb3I6IHBvcHBpbmciLCB5eXN0b3NbKnl5c3NwXSwgeXl2c3AsIHl5bHNwKTsKKyAgICAgIHl5ZGVzdHJ1Y3QgKHl5c3Rvc1t5eXN0YXRlXSwgeXl2c3ApOworICAgICAgeXl2c3AtLTsKKyAgICAgIHl5c3RhdGUgPSAqLS15eXNzcDsKKworICAgICAgWVlfU1RBQ0tfUFJJTlQgKHl5c3MsIHl5c3NwKTsKKyAgICB9CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlNoaWZ0aW5nIGVycm9yIHRva2VuLCAiKSk7CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisjaWZuZGVmIHl5b3ZlcmZsb3cKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlvdmVyZmxvd2xhYiAtLSBwYXJzZXIgb3ZlcmZsb3cgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5b3ZlcmZsb3dsYWI6CisgIHl5ZXJyb3IgKCJwYXJzZXIgc3RhY2sgb3ZlcmZsb3ciKTsKKyAgeXlyZXN1bHQgPSAyOworICAvKiBGYWxsIHRocm91Z2guICAqLworI2VuZGlmCisKK3l5cmV0dXJuOgorI2lmbmRlZiB5eW92ZXJmbG93CisgIGlmICh5eXNzICE9IHl5c3NhKQorICAgIFlZU1RBQ0tfRlJFRSAoeXlzcyk7CisjZW5kaWYKKyAgcmV0dXJuIHl5cmVzdWx0OworfQorCisKKworCisKK3ZvaWQgY29uZl9wYXJzZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCXpjb25mX2luaXRzY2FuKG5hbWUpOworCisJc3ltX2luaXQoKTsKKwltZW51X2luaXQoKTsKKwltb2R1bGVzX3N5bSA9IHN5bV9sb29rdXAoIk1PRFVMRVMiLCAwKTsKKwlyb290bWVudS5wcm9tcHQgPSBtZW51X2FkZF9wcm9wKFBfTUVOVSwgIkxpbnV4IEtlcm5lbCBDb25maWd1cmF0aW9uIiwgTlVMTCwgTlVMTCk7CisKKwkvL3pjb25mZGVidWcgPSAxOworCXpjb25mcGFyc2UoKTsKKwlpZiAoemNvbmZuZXJycykKKwkJZXhpdCgxKTsKKwltZW51X2ZpbmFsaXplKCZyb290bWVudSk7CisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworICAgICAgICAgICAgICAgIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hFQ0tFRCkgJiYgc3ltX2NoZWNrX2RlcHMoc3ltKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKwkJZWxzZQorCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hFQ0tfRE9ORTsKKyAgICAgICAgfQorCisJc3ltX2NoYW5nZV9jb3VudCA9IDE7Cit9CisKK2NvbnN0IGNoYXIgKnpjb25mX3Rva2VubmFtZShpbnQgdG9rZW4pCit7CisJc3dpdGNoICh0b2tlbikgeworCWNhc2UgVF9NRU5VOgkJcmV0dXJuICJtZW51IjsKKwljYXNlIFRfRU5ETUVOVToJCXJldHVybiAiZW5kbWVudSI7CisJY2FzZSBUX0NIT0lDRToJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFRfRU5EQ0hPSUNFOglyZXR1cm4gImVuZGNob2ljZSI7CisJY2FzZSBUX0lGOgkJcmV0dXJuICJpZiI7CisJY2FzZSBUX0VORElGOgkJcmV0dXJuICJlbmRpZiI7CisJfQorCXJldHVybiAiPHRva2VuPiI7Cit9CisKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGludCB0b2tlbiwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbikKK3sKKwlpZiAodG9rZW4gIT0gZW5kdG9rZW4pIHsKKwkJemNvbmZwcmludCgidW5leHBlY3RlZCAnJXMnIHdpdGhpbiAlcyBibG9jayIsIHpjb25mX3Rva2VubmFtZSh0b2tlbiksIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoY3VycmVudF9tZW51LT5maWxlICE9IGN1cnJlbnRfZmlsZSkgeworCQl6Y29uZnByaW50KCInJXMnIGluIGRpZmZlcmVudCBmaWxlIHRoYW4gJyVzJyIsIHpjb25mX3Rva2VubmFtZSh0b2tlbiksIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mcHJpbnQoImxvY2F0aW9uIG9mIHRoZSAnJXMnIiwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZuZXJycysrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCB6Y29uZnByaW50KGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAiLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSk7CisJdmFfc3RhcnQoYXAsIGVycik7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIGFwKTsKKwl2YV9lbmQoYXApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpCit7CisJZnByaW50ZihzdGRlcnIsICIlczolZDogJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkgKyAxLCBlcnIpOworfQorCit2b2lkIHByaW50X3F1b3RlZF9zdHJpbmcoRklMRSAqb3V0LCBjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgbGVuOworCisJcHV0YygnIicsIG91dCk7CisJd2hpbGUgKChwID0gc3RyY2hyKHN0ciwgJyInKSkpIHsKKwkJbGVuID0gcCAtIHN0cjsKKwkJaWYgKGxlbikKKwkJCWZwcmludGYob3V0LCAiJS4qcyIsIGxlbiwgc3RyKTsKKwkJZnB1dHMoIlxcXCIiLCBvdXQpOworCQlzdHIgPSBwICsgMTsKKwl9CisJZnB1dHMoc3RyLCBvdXQpOworCXB1dGMoJyInLCBvdXQpOworfQorCit2b2lkIHByaW50X3N5bWJvbChGSUxFICpvdXQsIHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQorCQlmcHJpbnRmKG91dCwgImNob2ljZVxuIik7CisJZWxzZQorCQlmcHJpbnRmKG91dCwgImNvbmZpZyAlc1xuIiwgc3ltLT5uYW1lKTsKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlmcHV0cygiICBib29sZWFuXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCWZwdXRzKCIgIHRyaXN0YXRlXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfU1RSSU5HOgorCQlmcHV0cygiICBzdHJpbmdcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJCWZwdXRzKCIgIGludGVnZXJcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19IRVg6CisJCWZwdXRzKCIgIGhleFxuIiwgb3V0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnB1dHMoIiAgPz8/XG4iLCBvdXQpOworCQlicmVhazsKKwl9CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSAhPSBtZW51KQorCQkJY29udGludWU7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfUFJPTVBUOgorCQkJZnB1dHMoIiAgcHJvbXB0ICIsIG91dCk7CisJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiIGlmICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJfQorCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFBfREVGQVVMVDoKKwkJCWZwdXRzKCAiICBkZWZhdWx0ICIsIG91dCk7CisJCQlleHByX2ZwcmludChwcm9wLT5leHByLCBvdXQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0NIT0lDRToKKwkJCWZwdXRzKCIgICNjaG9pY2UgdmFsdWVcbiIsIG91dCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYob3V0LCAiICB1bmtub3duIHByb3AgJWQhXG4iLCBwcm9wLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChzeW0tPmhlbHApIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzeW0tPmhlbHApOworCQl3aGlsZSAoc3ltLT5oZWxwWy0tbGVuXSA9PSAnXG4nKQorCQkJc3ltLT5oZWxwW2xlbl0gPSAwOworCQlmcHJpbnRmKG91dCwgIiAgaGVscFxuJXNcbiIsIHN5bS0+aGVscCk7CisJfQorCWZwdXRjKCdcbicsIG91dCk7Cit9CisKK3ZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJaWYgKChzeW0gPSBtZW51LT5zeW0pKQorCQkJcHJpbnRfc3ltYm9sKG91dCwgbWVudSk7CisJCWVsc2UgaWYgKChwcm9wID0gbWVudS0+cHJvbXB0KSkgeworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfQ09NTUVOVDoKKwkJCQlmcHV0cygiXG5jb21tZW50ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBfTUVOVToKKwkJCQlmcHV0cygiXG5tZW51ICIsIG91dCk7CisJCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJCWZwdXRzKCJcbiIsIG91dCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgIGRlcGVuZHMgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCX0KKwkJCWZwdXRzKCJcbiIsIG91dCk7CisJCX0KKworCQlpZiAobWVudS0+bGlzdCkKKwkJCW1lbnUgPSBtZW51LT5saXN0OworCQllbHNlIGlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPnByb21wdCAmJiBtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCWZwdXRzKCJcbmVuZG1lbnVcbiIsIG91dCk7CisJCQlpZiAobWVudS0+bmV4dCkgeworCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjaW5jbHVkZSAibGV4Lnpjb25mLmMiCisjaW5jbHVkZSAidXRpbC5jIgorI2luY2x1ZGUgImNvbmZkYXRhLmMiCisjaW5jbHVkZSAiZXhwci5jIgorI2luY2x1ZGUgInN5bWJvbC5jIgorI2luY2x1ZGUgIm1lbnUuYyIKKworCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmhfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuaF9zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTkxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmhfc2hpcHBlZApAQCAtMCwwICsxLDEyNSBAQAorLyogQSBCaXNvbiBwYXJzZXIsIG1hZGUgZnJvbSB6Y29uZi55LCBieSBHTlUgYmlzb24gMS43NS4gICovCisKKy8qIFNrZWxldG9uIHBhcnNlciBmb3IgWWFjYy1saWtlIHBhcnNpbmcgd2l0aCBCaXNvbiwKKyAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisjaWZuZGVmIEJJU09OX1pDT05GX1RBQl9ICisjIGRlZmluZSBCSVNPTl9aQ09ORl9UQUJfSAorCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBUX01BSU5NRU5VID0gMjU4LAorICAgICBUX01FTlUgPSAyNTksCisgICAgIFRfRU5ETUVOVSA9IDI2MCwKKyAgICAgVF9TT1VSQ0UgPSAyNjEsCisgICAgIFRfQ0hPSUNFID0gMjYyLAorICAgICBUX0VORENIT0lDRSA9IDI2MywKKyAgICAgVF9DT01NRU5UID0gMjY0LAorICAgICBUX0NPTkZJRyA9IDI2NSwKKyAgICAgVF9IRUxQID0gMjY2LAorICAgICBUX0hFTFBURVhUID0gMjY3LAorICAgICBUX0lGID0gMjY4LAorICAgICBUX0VORElGID0gMjY5LAorICAgICBUX0RFUEVORFMgPSAyNzAsCisgICAgIFRfUkVRVUlSRVMgPSAyNzEsCisgICAgIFRfT1BUSU9OQUwgPSAyNzIsCisgICAgIFRfUFJPTVBUID0gMjczLAorICAgICBUX0RFRkFVTFQgPSAyNzQsCisgICAgIFRfVFJJU1RBVEUgPSAyNzUsCisgICAgIFRfQk9PTEVBTiA9IDI3NiwKKyAgICAgVF9JTlQgPSAyNzcsCisgICAgIFRfSEVYID0gMjc4LAorICAgICBUX1dPUkQgPSAyNzksCisgICAgIFRfU1RSSU5HID0gMjgwLAorICAgICBUX1VORVFVQUwgPSAyODEsCisgICAgIFRfRU9GID0gMjgyLAorICAgICBUX0VPTCA9IDI4MywKKyAgICAgVF9DTE9TRV9QQVJFTiA9IDI4NCwKKyAgICAgVF9PUEVOX1BBUkVOID0gMjg1LAorICAgICBUX09OID0gMjg2LAorICAgICBUX09SID0gMjg3LAorICAgICBUX0FORCA9IDI4OCwKKyAgICAgVF9FUVVBTCA9IDI4OSwKKyAgICAgVF9OT1QgPSAyOTAKKyAgIH07CisjZW5kaWYKKyNkZWZpbmUgVF9NQUlOTUVOVSAyNTgKKyNkZWZpbmUgVF9NRU5VIDI1OQorI2RlZmluZSBUX0VORE1FTlUgMjYwCisjZGVmaW5lIFRfU09VUkNFIDI2MQorI2RlZmluZSBUX0NIT0lDRSAyNjIKKyNkZWZpbmUgVF9FTkRDSE9JQ0UgMjYzCisjZGVmaW5lIFRfQ09NTUVOVCAyNjQKKyNkZWZpbmUgVF9DT05GSUcgMjY1CisjZGVmaW5lIFRfSEVMUCAyNjYKKyNkZWZpbmUgVF9IRUxQVEVYVCAyNjcKKyNkZWZpbmUgVF9JRiAyNjgKKyNkZWZpbmUgVF9FTkRJRiAyNjkKKyNkZWZpbmUgVF9ERVBFTkRTIDI3MAorI2RlZmluZSBUX1JFUVVJUkVTIDI3MQorI2RlZmluZSBUX09QVElPTkFMIDI3MgorI2RlZmluZSBUX1BST01QVCAyNzMKKyNkZWZpbmUgVF9ERUZBVUxUIDI3NAorI2RlZmluZSBUX1RSSVNUQVRFIDI3NQorI2RlZmluZSBUX0JPT0xFQU4gMjc2CisjZGVmaW5lIFRfSU5UIDI3NworI2RlZmluZSBUX0hFWCAyNzgKKyNkZWZpbmUgVF9XT1JEIDI3OQorI2RlZmluZSBUX1NUUklORyAyODAKKyNkZWZpbmUgVF9VTkVRVUFMIDI4MQorI2RlZmluZSBUX0VPRiAyODIKKyNkZWZpbmUgVF9FT0wgMjgzCisjZGVmaW5lIFRfQ0xPU0VfUEFSRU4gMjg0CisjZGVmaW5lIFRfT1BFTl9QQVJFTiAyODUKKyNkZWZpbmUgVF9PTiAyODYKKyNkZWZpbmUgVF9PUiAyODcKKyNkZWZpbmUgVF9BTkQgMjg4CisjZGVmaW5lIFRfRVFVQUwgMjg5CisjZGVmaW5lIFRfTk9UIDI5MAorCisKKworCisjaWZuZGVmIFlZU1RZUEUKKyNsaW5lIDMzICJ6Y29uZi55IgordHlwZWRlZiB1bmlvbiB7CisJaW50IHRva2VuOworCWNoYXIgKnN0cmluZzsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7Cit9IHl5c3R5cGU7CisvKiBMaW5lIDEyODEgb2YgL3Vzci9zaGFyZS9iaXNvbi95YWNjLmMuICAqLworI2xpbmUgMTE4ICJ6Y29uZi50YWIuaCIKKyMgZGVmaW5lIFlZU1RZUEUgeXlzdHlwZQorI2VuZGlmCisKK2V4dGVybiBZWVNUWVBFIHpjb25mbHZhbDsKKworCisjZW5kaWYgLyogbm90IEJJU09OX1pDT05GX1RBQl9IICovCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55IGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NjBmOAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CkBAIC0wLDAgKzEsNjkwIEBACisleworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjZGVmaW5lIHByaW50ZChtYXNrLCBmbXQuLi4pIGlmIChjZGVidWcgJiAobWFzaykpIHByaW50ZihmbXQpCisKKyNkZWZpbmUgUFJJTlRECQkweDAwMDEKKyNkZWZpbmUgREVCVUdfUEFSU0UJMHgwMDAyCisKK2ludCBjZGVidWcgPSBQUklOVEQ7CisKK2V4dGVybiBpbnQgemNvbmZsZXgodm9pZCk7CitzdGF0aWMgdm9pZCB6Y29uZnByaW50KGNvbnN0IGNoYXIgKmVyciwgLi4uKTsKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKTsKK3N0YXRpYyBib29sIHpjb25mX2VuZHRva2VuKGludCB0b2tlbiwgaW50IHN0YXJ0dG9rZW4sIGludCBlbmR0b2tlbik7CisKK3N0cnVjdCBzeW1ib2wgKnN5bWJvbF9oYXNoWzI1N107CisKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51LCAqY3VycmVudF9lbnRyeTsKKworI2RlZmluZSBZWUVSUk9SX1ZFUkJPU0UKKyV9CislZXhwZWN0IDQwCisKKyV1bmlvbgoreworCWludCB0b2tlbjsKKwljaGFyICpzdHJpbmc7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworfQorCisldG9rZW4gVF9NQUlOTUVOVQorJXRva2VuIFRfTUVOVQorJXRva2VuIFRfRU5ETUVOVQorJXRva2VuIFRfU09VUkNFCisldG9rZW4gVF9DSE9JQ0UKKyV0b2tlbiBUX0VORENIT0lDRQorJXRva2VuIFRfQ09NTUVOVAorJXRva2VuIFRfQ09ORklHCisldG9rZW4gVF9NRU5VQ09ORklHCisldG9rZW4gVF9IRUxQCisldG9rZW4gPHN0cmluZz4gVF9IRUxQVEVYVAorJXRva2VuIFRfSUYKKyV0b2tlbiBUX0VORElGCisldG9rZW4gVF9ERVBFTkRTCisldG9rZW4gVF9SRVFVSVJFUworJXRva2VuIFRfT1BUSU9OQUwKKyV0b2tlbiBUX1BST01QVAorJXRva2VuIFRfREVGQVVMVAorJXRva2VuIFRfVFJJU1RBVEUKKyV0b2tlbiBUX0RFRl9UUklTVEFURQorJXRva2VuIFRfQk9PTEVBTgorJXRva2VuIFRfREVGX0JPT0xFQU4KKyV0b2tlbiBUX1NUUklORworJXRva2VuIFRfSU5UCisldG9rZW4gVF9IRVgKKyV0b2tlbiA8c3RyaW5nPiBUX1dPUkQKKyV0b2tlbiA8c3RyaW5nPiBUX1dPUkRfUVVPVEUKKyV0b2tlbiBUX1VORVFVQUwKKyV0b2tlbiBUX0VPRgorJXRva2VuIFRfRU9MCisldG9rZW4gVF9DTE9TRV9QQVJFTgorJXRva2VuIFRfT1BFTl9QQVJFTgorJXRva2VuIFRfT04KKyV0b2tlbiBUX1NFTEVDVAorJXRva2VuIFRfUkFOR0UKKworJWxlZnQgVF9PUgorJWxlZnQgVF9BTkQKKyVsZWZ0IFRfRVFVQUwgVF9VTkVRVUFMCislbm9uYXNzb2MgVF9OT1QKKworJXR5cGUgPHN0cmluZz4gcHJvbXB0CisldHlwZSA8c3RyaW5nPiBzb3VyY2UKKyV0eXBlIDxzeW1ib2w+IHN5bWJvbAorJXR5cGUgPGV4cHI+IGV4cHIKKyV0eXBlIDxleHByPiBpZl9leHByCisldHlwZSA8dG9rZW4+IGVuZAorCisleworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKyV9CislJQoraW5wdXQ6CSAgLyogZW1wdHkgKi8KKwl8IGlucHV0IGJsb2NrCis7CisKK2Jsb2NrOgkgIGNvbW1vbl9ibG9jaworCXwgY2hvaWNlX3N0bXQKKwl8IG1lbnVfc3RtdAorCXwgVF9NQUlOTUVOVSBwcm9tcHQgbmxfb3JfZW9mCisJfCBUX0VORE1FTlUJCXsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kbWVudScgc3RhdGVtZW50Iik7IH0KKwl8IFRfRU5ESUYJCXsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kaWYnIHN0YXRlbWVudCIpOyB9CisJfCBUX0VORENIT0lDRQkJeyB6Y29uZnByaW50KCJ1bmV4cGVjdGVkICdlbmRjaG9pY2UnIHN0YXRlbWVudCIpOyB9CisJfCBlcnJvciBubF9vcl9lb2YJeyB6Y29uZnByaW50KCJzeW50YXggZXJyb3IiKTsgeXllcnJvazsgfQorOworCitjb21tb25fYmxvY2s6CisJICBpZl9zdG10CisJfCBjb21tZW50X3N0bXQKKwl8IGNvbmZpZ19zdG10CisJfCBtZW51Y29uZmlnX3N0bXQKKwl8IHNvdXJjZV9zdG10CisJfCBubF9vcl9lb2YKKzsKKworCisvKiBjb25maWcvbWVudWNvbmZpZyBlbnRyeSAqLworCitjb25maWdfZW50cnlfc3RhcnQ6IFRfQ09ORklHIFRfV09SRCBUX0VPTAoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoJDIsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAkMik7Cit9OworCitjb25maWdfc3RtdDogY29uZmlnX2VudHJ5X3N0YXJ0IGNvbmZpZ19vcHRpb25fbGlzdAoreworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK21lbnVjb25maWdfZW50cnlfc3RhcnQ6IFRfTUVOVUNPTkZJRyBUX1dPUkQgVF9FT0wKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKCQyLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVjb25maWcgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksICQyKTsKK307CisKK21lbnVjb25maWdfc3RtdDogbWVudWNvbmZpZ19lbnRyeV9zdGFydCBjb25maWdfb3B0aW9uX2xpc3QKK3sKKwlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQljdXJyZW50X2VudHJ5LT5wcm9tcHQtPnR5cGUgPSBQX01FTlU7CisJZWxzZQorCQl6Y29uZnByaW50KCJ3YXJuaW5nOiBtZW51Y29uZmlnIHN0YXRlbWVudCB3aXRob3V0IHByb21wdCIpOworCW1lbnVfZW5kX2VudHJ5KCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY29uZmlnXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb25fbGlzdDoKKwkgIC8qIGVtcHR5ICovCisJfCBjb25maWdfb3B0aW9uX2xpc3QgY29uZmlnX29wdGlvbgorCXwgY29uZmlnX29wdGlvbl9saXN0IGRlcGVuZHMKKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBoZWxwCisJfCBjb25maWdfb3B0aW9uX2xpc3QgVF9FT0wKKzsKKworY29uZmlnX29wdGlvbjogVF9UUklTVEFURSBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfVFJJU1RBVEUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnRyaXN0YXRlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfREVGX1RSSVNUQVRFIGV4cHIgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2V4cHIoUF9ERUZBVUxULCAkMiwgJDMpOworCW1lbnVfc2V0X3R5cGUoU19UUklTVEFURSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmX2Jvb2xlYW5cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9CT09MRUFOIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoU19CT09MRUFOKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpib29sZWFuXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfREVGX0JPT0xFQU4gZXhwciBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICQyLCAkMyk7CisJbWVudV9zZXRfdHlwZShTX0JPT0xFQU4pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZl9ib29sZWFuXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfSU5UIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoU19JTlQpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmludFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0hFWCBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfSEVYKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpoZXhcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9TVFJJTkcgcHJvbXB0X3N0bXRfb3B0IFRfRU9MCit7CisJbWVudV9zZXRfdHlwZShTX1NUUklORyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c3RyaW5nXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfUFJPTVBUIHByb21wdCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAkMiwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0RFRkFVTFQgZXhwciBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsICQyLCAkMyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX1NFTEVDVCBUX1dPUkQgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX3N5bWJvbChQX1NFTEVDVCwgc3ltX2xvb2t1cCgkMiwgMCksICQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzZWxlY3RcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9SQU5HRSBzeW1ib2wgc3ltYm9sIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9leHByKFBfUkFOR0UsIGV4cHJfYWxsb2NfY29tcChFX1JBTkdFLCQyLCAkMyksICQ0KTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpyYW5nZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCisvKiBjaG9pY2UgZW50cnkgKi8KKworY2hvaWNlOiBUX0NIT0lDRSBUX0VPTAoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoTlVMTCwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJbWVudV9hZGRfZXhwcihQX0NIT0lDRSwgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y2hvaWNlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2Nob2ljZV9lbnRyeTogY2hvaWNlIGNob2ljZV9vcHRpb25fbGlzdAoreworCW1lbnVfZW5kX2VudHJ5KCk7CisJbWVudV9hZGRfbWVudSgpOworfTsKKworY2hvaWNlX2VuZDogZW5kCit7CisJaWYgKHpjb25mX2VuZHRva2VuKCQxLCBUX0NIT0lDRSwgVF9FTkRDSE9JQ0UpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kY2hvaWNlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cit9OworCitjaG9pY2Vfc3RtdDoKKwkgIGNob2ljZV9lbnRyeSBjaG9pY2VfYmxvY2sgY2hvaWNlX2VuZAorCXwgY2hvaWNlX2VudHJ5IGNob2ljZV9ibG9jaworeworCXByaW50ZigiJXM6JWQ6IG1pc3NpbmcgJ2VuZGNob2ljZScgZm9yIHRoaXMgJ2Nob2ljZScgc3RhdGVtZW50XG4iLCBjdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vKTsKKwl6Y29uZm5lcnJzKys7Cit9OworCitjaG9pY2Vfb3B0aW9uX2xpc3Q6CisJICAvKiBlbXB0eSAqLworCXwgY2hvaWNlX29wdGlvbl9saXN0IGNob2ljZV9vcHRpb24KKwl8IGNob2ljZV9vcHRpb25fbGlzdCBkZXBlbmRzCisJfCBjaG9pY2Vfb3B0aW9uX2xpc3QgaGVscAorCXwgY2hvaWNlX29wdGlvbl9saXN0IFRfRU9MCis7CisKK2Nob2ljZV9vcHRpb246IFRfUFJPTVBUIHByb21wdCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfcHJvbXB0KFBfUFJPTVBULCAkMiwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2Vfb3B0aW9uOiBUX1RSSVNUQVRFIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoU19UUklTVEFURSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHJpc3RhdGVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX29wdGlvbjogVF9CT09MRUFOIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoU19CT09MRUFOKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpib29sZWFuXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2Nob2ljZV9vcHRpb246IFRfT1BUSU9OQUwgVF9FT0wKK3sKKwljdXJyZW50X2VudHJ5LT5zeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpvcHRpb25hbFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2Vfb3B0aW9uOiBUX0RFRkFVTFQgVF9XT1JEIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9zeW1ib2woUF9ERUZBVUxULCBzeW1fbG9va3VwKCQyLCAwKSwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZmF1bHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX2Jsb2NrOgorCSAgLyogZW1wdHkgKi8KKwl8IGNob2ljZV9ibG9jayBjb21tb25fYmxvY2sKKzsKKworLyogaWYgZW50cnkgKi8KKworaWY6IFRfSUYgZXhwciBUX0VPTAoreworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwltZW51X2FkZF9lbnRyeShOVUxMKTsKKwltZW51X2FkZF9kZXAoJDIpOworCW1lbnVfZW5kX2VudHJ5KCk7CisJbWVudV9hZGRfbWVudSgpOworfTsKKworaWZfZW5kOiBlbmQKK3sKKwlpZiAoemNvbmZfZW5kdG9rZW4oJDEsIFRfSUYsIFRfRU5ESUYpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kaWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KK307CisKK2lmX3N0bXQ6CisJICBpZiBpZl9ibG9jayBpZl9lbmQKKwl8IGlmIGlmX2Jsb2NrCit7CisJcHJpbnRmKCIlczolZDogbWlzc2luZyAnZW5kaWYnIGZvciB0aGlzICdpZicgc3RhdGVtZW50XG4iLCBjdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vKTsKKwl6Y29uZm5lcnJzKys7Cit9OworCitpZl9ibG9jazoKKwkgIC8qIGVtcHR5ICovCisJfCBpZl9ibG9jayBjb21tb25fYmxvY2sKKwl8IGlmX2Jsb2NrIG1lbnVfc3RtdAorCXwgaWZfYmxvY2sgY2hvaWNlX3N0bXQKKzsKKworLyogbWVudSBlbnRyeSAqLworCittZW51OiBUX01FTlUgcHJvbXB0IFRfRU9MCit7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvcChQX01FTlUsICQyLCBOVUxMLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDptZW51XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK21lbnVfZW50cnk6IG1lbnUgZGVwZW5kc19saXN0Cit7CisJbWVudV9lbmRfZW50cnkoKTsKKwltZW51X2FkZF9tZW51KCk7Cit9OworCittZW51X2VuZDogZW5kCit7CisJaWYgKHpjb25mX2VuZHRva2VuKCQxLCBUX01FTlUsIFRfRU5ETUVOVSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRtZW51XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cit9OworCittZW51X3N0bXQ6CisJICBtZW51X2VudHJ5IG1lbnVfYmxvY2sgbWVudV9lbmQKKwl8IG1lbnVfZW50cnkgbWVudV9ibG9jaworeworCXByaW50ZigiJXM6JWQ6IG1pc3NpbmcgJ2VuZG1lbnUnIGZvciB0aGlzICdtZW51JyBzdGF0ZW1lbnRcbiIsIGN1cnJlbnRfbWVudS0+ZmlsZS0+bmFtZSwgY3VycmVudF9tZW51LT5saW5lbm8pOworCXpjb25mbmVycnMrKzsKK307CisKK21lbnVfYmxvY2s6CisJICAvKiBlbXB0eSAqLworCXwgbWVudV9ibG9jayBjb21tb25fYmxvY2sKKwl8IG1lbnVfYmxvY2sgbWVudV9zdG10CisJfCBtZW51X2Jsb2NrIGNob2ljZV9zdG10CisJfCBtZW51X2Jsb2NrIGVycm9yIFRfRU9MCQl7IHpjb25mcHJpbnQoImludmFsaWQgbWVudSBvcHRpb24iKTsgeXllcnJvazsgfQorOworCitzb3VyY2U6IFRfU09VUkNFIHByb21wdCBUX0VPTAoreworCSQkID0gJDI7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c291cmNlICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAkMik7Cit9OworCitzb3VyY2Vfc3RtdDogc291cmNlCit7CisJemNvbmZfbmV4dGZpbGUoJDEpOworfTsKKworLyogY29tbWVudCBlbnRyeSAqLworCitjb21tZW50OiBUX0NPTU1FTlQgcHJvbXB0IFRfRU9MCit7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvcChQX0NPTU1FTlQsICQyLCBOVUxMLCBOVUxMKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpjb21tZW50XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbW1lbnRfc3RtdDogY29tbWVudCBkZXBlbmRzX2xpc3QKK3sKKwltZW51X2VuZF9lbnRyeSgpOworfTsKKworLyogaGVscCBvcHRpb24gKi8KKworaGVscF9zdGFydDogVF9IRUxQIFRfRU9MCit7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGVscFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJemNvbmZfc3RhcnRoZWxwKCk7Cit9OworCitoZWxwOiBoZWxwX3N0YXJ0IFRfSEVMUFRFWFQKK3sKKwljdXJyZW50X2VudHJ5LT5zeW0tPmhlbHAgPSAkMjsKK307CisKKy8qIGRlcGVuZHMgb3B0aW9uICovCisKK2RlcGVuZHNfbGlzdDoJICAvKiBlbXB0eSAqLworCQl8IGRlcGVuZHNfbGlzdCBkZXBlbmRzCisJCXwgZGVwZW5kc19saXN0IFRfRU9MCis7CisKK2RlcGVuZHM6IFRfREVQRU5EUyBUX09OIGV4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9kZXAoJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHMgb25cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfQorCXwgVF9ERVBFTkRTIGV4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9kZXAoJDIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlcGVuZHNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfQorCXwgVF9SRVFVSVJFUyBleHByIFRfRU9MCit7CisJbWVudV9hZGRfZGVwKCQyKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpyZXF1aXJlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCisvKiBwcm9tcHQgc3RhdGVtZW50ICovCisKK3Byb21wdF9zdG10X29wdDoKKwkgIC8qIGVtcHR5ICovCisJfCBwcm9tcHQgaWZfZXhwcgoreworCW1lbnVfYWRkX3Byb3AoUF9QUk9NUFQsICQxLCBOVUxMLCAkMik7Cit9OworCitwcm9tcHQ6CSAgVF9XT1JECisJfCBUX1dPUkRfUVVPVEUKKzsKKworZW5kOgkgIFRfRU5ETUVOVSBubF9vcl9lb2YJeyAkJCA9IFRfRU5ETUVOVTsgfQorCXwgVF9FTkRDSE9JQ0Ugbmxfb3JfZW9mCXsgJCQgPSBUX0VORENIT0lDRTsgfQorCXwgVF9FTkRJRiBubF9vcl9lb2YJeyAkJCA9IFRfRU5ESUY7IH0KKzsKKworbmxfb3JfZW9mOgorCVRfRU9MIHwgVF9FT0Y7CisKK2lmX2V4cHI6ICAvKiBlbXB0eSAqLwkJCXsgJCQgPSBOVUxMOyB9CisJfCBUX0lGIGV4cHIJCQl7ICQkID0gJDI7IH0KKzsKKworZXhwcjoJICBzeW1ib2wJCQkJeyAkJCA9IGV4cHJfYWxsb2Nfc3ltYm9sKCQxKTsgfQorCXwgc3ltYm9sIFRfRVFVQUwgc3ltYm9sCQkJeyAkJCA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCAkMSwgJDMpOyB9CisJfCBzeW1ib2wgVF9VTkVRVUFMIHN5bWJvbAkJeyAkJCA9IGV4cHJfYWxsb2NfY29tcChFX1VORVFVQUwsICQxLCAkMyk7IH0KKwl8IFRfT1BFTl9QQVJFTiBleHByIFRfQ0xPU0VfUEFSRU4JeyAkJCA9ICQyOyB9CisJfCBUX05PVCBleHByCQkJCXsgJCQgPSBleHByX2FsbG9jX29uZShFX05PVCwgJDIpOyB9CisJfCBleHByIFRfT1IgZXhwcgkJCXsgJCQgPSBleHByX2FsbG9jX3R3byhFX09SLCAkMSwgJDMpOyB9CisJfCBleHByIFRfQU5EIGV4cHIJCQl7ICQkID0gZXhwcl9hbGxvY190d28oRV9BTkQsICQxLCAkMyk7IH0KKzsKKworc3ltYm9sOgkgIFRfV09SRAl7ICQkID0gc3ltX2xvb2t1cCgkMSwgMCk7IGZyZWUoJDEpOyB9CisJfCBUX1dPUkRfUVVPVEUJeyAkJCA9IHN5bV9sb29rdXAoJDEsIDEpOyBmcmVlKCQxKTsgfQorOworCislJQorCit2b2lkIGNvbmZfcGFyc2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGk7CisKKwl6Y29uZl9pbml0c2NhbihuYW1lKTsKKworCXN5bV9pbml0KCk7CisJbWVudV9pbml0KCk7CisJbW9kdWxlc19zeW0gPSBzeW1fbG9va3VwKCJNT0RVTEVTIiwgMCk7CisJcm9vdG1lbnUucHJvbXB0ID0gbWVudV9hZGRfcHJvcChQX01FTlUsICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIsIE5VTEwsIE5VTEwpOworCisJLy96Y29uZmRlYnVnID0gMTsKKwl6Y29uZnBhcnNlKCk7CisJaWYgKHpjb25mbmVycnMpCisJCWV4aXQoMSk7CisJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKyAgICAgICAgICAgICAgICBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLRUQpICYmIHN5bV9jaGVja19kZXBzKHN5bSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisJCWVsc2UKKwkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIRUNLX0RPTkU7CisgICAgICAgIH0KKworCXN5bV9jaGFuZ2VfY291bnQgPSAxOworfQorCitjb25zdCBjaGFyICp6Y29uZl90b2tlbm5hbWUoaW50IHRva2VuKQoreworCXN3aXRjaCAodG9rZW4pIHsKKwljYXNlIFRfTUVOVToJCXJldHVybiAibWVudSI7CisJY2FzZSBUX0VORE1FTlU6CQlyZXR1cm4gImVuZG1lbnUiOworCWNhc2UgVF9DSE9JQ0U6CQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBUX0VORENIT0lDRToJcmV0dXJuICJlbmRjaG9pY2UiOworCWNhc2UgVF9JRjoJCXJldHVybiAiaWYiOworCWNhc2UgVF9FTkRJRjoJCXJldHVybiAiZW5kaWYiOworCX0KKwlyZXR1cm4gIjx0b2tlbj4iOworfQorCitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihpbnQgdG9rZW4sIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCit7CisJaWYgKHRva2VuICE9IGVuZHRva2VuKSB7CisJCXpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJyVzJyB3aXRoaW4gJXMgYmxvY2siLCB6Y29uZl90b2tlbm5hbWUodG9rZW4pLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGN1cnJlbnRfbWVudS0+ZmlsZSAhPSBjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZwcmludCgiJyVzJyBpbiBkaWZmZXJlbnQgZmlsZSB0aGFuICclcyciLCB6Y29uZl90b2tlbm5hbWUodG9rZW4pLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZnByaW50KCJsb2NhdGlvbiBvZiB0aGUgJyVzJyIsIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJZnByaW50ZihzdGRlcnIsICIlczolZDogIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSArIDEpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSwgZXJyKTsKK30KKwordm9pZCBwcmludF9xdW90ZWRfc3RyaW5nKEZJTEUgKm91dCwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKworCXB1dGMoJyInLCBvdXQpOworCXdoaWxlICgocCA9IHN0cmNocihzdHIsICciJykpKSB7CisJCWxlbiA9IHAgLSBzdHI7CisJCWlmIChsZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBsZW4sIHN0cik7CisJCWZwdXRzKCJcXFwiIiwgb3V0KTsKKwkJc3RyID0gcCArIDE7CisJfQorCWZwdXRzKHN0ciwgb3V0KTsKKwlwdXRjKCciJywgb3V0KTsKK30KKwordm9pZCBwcmludF9zeW1ib2woRklMRSAqb3V0LCBzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJZnByaW50ZihvdXQsICJjaG9pY2VcbiIpOworCWVsc2UKKwkJZnByaW50ZihvdXQsICJjb25maWcgJXNcbiIsIHN5bS0+bmFtZSk7CisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJZnB1dHMoIiAgYm9vbGVhblxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1RSSVNUQVRFOgorCQlmcHV0cygiICB0cmlzdGF0ZVxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwkJZnB1dHMoIiAgc3RyaW5nXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCQlmcHV0cygiICBpbnRlZ2VyXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQlmcHV0cygiICBoZXhcbiIsIG91dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwdXRzKCIgID8/P1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJfQorCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX1BST01QVDoKKwkJCWZwdXRzKCIgIHByb21wdCAiLCBvdXQpOworCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlmcHV0cyggIiAgZGVmYXVsdCAiLCBvdXQpOworCQkJZXhwcl9mcHJpbnQocHJvcC0+ZXhwciwgb3V0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9DSE9JQ0U6CisJCQlmcHV0cygiICAjY2hvaWNlIHZhbHVlXG4iLCBvdXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKG91dCwgIiAgdW5rbm93biBwcm9wICVkIVxuIiwgcHJvcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc3ltLT5oZWxwKSB7CisJCWludCBsZW4gPSBzdHJsZW4oc3ltLT5oZWxwKTsKKwkJd2hpbGUgKHN5bS0+aGVscFstLWxlbl0gPT0gJ1xuJykKKwkJCXN5bS0+aGVscFtsZW5dID0gMDsKKwkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBzeW0tPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBvdXQpOworfQorCit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCWlmICgoc3ltID0gbWVudS0+c3ltKSkKKwkJCXByaW50X3N5bWJvbChvdXQsIG1lbnUpOworCQllbHNlIGlmICgocHJvcCA9IG1lbnUtPnByb21wdCkpIHsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX0NPTU1FTlQ6CisJCQkJZnB1dHMoIlxuY29tbWVudCAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBQX01FTlU6CisJCQkJZnB1dHMoIlxubWVudSAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiICBkZXBlbmRzICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJCWZwdXRjKCdcbicsIG91dCk7CisJCQl9CisJCQlmcHV0cygiXG4iLCBvdXQpOworCQl9CisKKwkJaWYgKG1lbnUtPmxpc3QpCisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJZWxzZSBpZiAobWVudS0+bmV4dCkKKwkJCW1lbnUgPSBtZW51LT5uZXh0OworCQllbHNlIHdoaWxlICgobWVudSA9IG1lbnUtPnBhcmVudCkpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQgJiYgbWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkKKwkJCQlmcHV0cygiXG5lbmRtZW51XG4iLCBvdXQpOworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2luY2x1ZGUgImxleC56Y29uZi5jIgorI2luY2x1ZGUgInV0aWwuYyIKKyNpbmNsdWRlICJjb25mZGF0YS5jIgorI2luY2x1ZGUgImV4cHIuYyIKKyNpbmNsdWRlICJzeW1ib2wuYyIKKyNpbmNsdWRlICJtZW51LmMiCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGIxZGFiNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMCwwICsxLDE4MzEgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCisjIyBDb3B5cmlnaHQgKGMpIDE5OTggTWljaGFlbCBadWNjaGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQgICAgICAgICMjCisjIyBDb3B5cmlnaHQgKEMpIDIwMDAsIDEgIFRpbSBXYXVnaCA8dHdhdWdoQHJlZGhhdC5jb20+ICAgICAgICAgICMjCisjIyBDb3B5cmlnaHQgKEMpIDIwMDEgIFNpbW9uIEh1Z2dpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjCisjIyAJCQkJCQkJCSAjIworIyMgI2RlZmluZSBlbmhhbmNlbWVudHMgYnkgQXJtaW4gS3VzdGVyIDxha3VzdGVyQG12aXN0YS5jb20+CSAjIworIyMgQ29weXJpZ2h0IChjKSAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4JCQkgIyMKKyMjIAkJCQkJCQkJICMjCisjIyBUaGlzIHNvZnR3YXJlIGZhbGxzIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gICAgICMjCisjIyBQbGVhc2UgcmVhZCB0aGUgQ09QWUlORyBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uICAgICAgICAgICAgICMjCisKKyMgdy5vLiAwMy0xMS0yMDAwOiBhZGRlZCB0aGUgJy1maWxlbGlzdCcgb3B0aW9uLgorCisjIDE4LzAxLzIwMDEgLSAJQ2xlYW51cHMKKyMgCQlGdW5jdGlvbnMgcHJvdG90eXBlZCBhcyBmb28odm9pZCkgc2FtZSBhcyBmb28oKQorIyAJCVN0b3AgZXZhbCdpbmcgd2hlcmUgd2UgZG9uJ3QgbmVlZCB0by4KKyMgLS0gaHVnZ2llQGVhcnRoLmxpCisKKyMgMjcvMDYvMjAwMSAtICBBbGxvd2VkIHdoaXRlc3BhY2UgYWZ0ZXIgaW5pdGlhbCAiLyoqIiBhbmQKKyMgICAgICAgICAgICAgICBhbGxvd2VkIGNvbW1lbnRzIGJlZm9yZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisjIC0tIENocmlzdGlhbiBLcmVpYmljaCA8Y2tAd2hvb3Aub3JnPgorCisjIFN0aWxsIHRvIGRvOgorIyAJLSBhZGQgcGVybGRvYyBkb2N1bWVudGF0aW9uCisjIAktIExvb2sgbW9yZSBjbG9zZWx5IGF0IHNvbWUgb2YgdGhlIHNjYXJpZXIgYml0cyA6KQorCisjIDI2LzA1LzIwMDEgLSAJU3VwcG9ydCBmb3Igc2VwYXJhdGUgc291cmNlIGFuZCBvYmplY3QgdHJlZXMuCisjCQlSZXR1cm4gZXJyb3IgY29kZS4KKyMgCQlLZWl0aCBPd2VucyA8a2Fvc0BvY3MuY29tLmF1PgorCisjIDIzLzA5LzIwMDEgLSBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmcywgc3RydWN0cywgZW51bXMgYW5kIHVuaW9ucworIyAgICAgICAgICAgICAgU3VwcG9ydCBmb3IgQ29udGV4dCBzZWN0aW9uOyBjYW4gYmUgdGVybWluYXRlZCB1c2luZyBlbXB0eSBsaW5lCisjICAgICAgICAgICAgICBTbWFsbCBmaXhlcyAobGlrZSBzcGFjZXMgdnMuIFxzIGluIHJlZ2V4KQorIyAtLSBUaW0gSmFuc2VuIDx0aW1AdGphbnNlbi5kZT4KKworCisjCisjIFRoaXMgd2lsbCByZWFkIGEgJ2MnIGZpbGUgYW5kIHNjYW4gZm9yIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZQorIyBzdHlsZSBvZiBnbm9tZSBjb21tZW50cyAoK21pbm9yIGV4dGVuc2lvbnMgLSBzZWUgYmVsb3cpLgorIworCisjIE5vdGU6IFRoaXMgb25seSBzdXBwb3J0cyAnYycuCisKKyMgdXNhZ2U6CisjIGtlcm5lbGRvYyBbIC1kb2Nib29rIHwgLWh0bWwgfCAtdGV4dCB8IC1tYW4gXQorIyAgICAgICAgICAgWyAtZnVuY3Rpb24gZnVuY25hbWUgWyAtZnVuY3Rpb24gZnVuY25hbWUgLi4uXSBdIGMgZmlsZShzKXMgPiBvdXRwdXRmaWxlCisjIG9yCisjICAgICAgICAgICBbIC1ub2Z1bmN0aW9uIGZ1bmNuYW1lIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXSBjIGZpbGUocylzID4gb3V0cHV0ZmlsZQorIworIyAgU2V0IG91dHB1dCBmb3JtYXQgdXNpbmcgb25lIG9mIC1kb2Nib29rIC1odG1sIC10ZXh0IG9yIC1tYW4uICBEZWZhdWx0IGlzIG1hbi4KKyMKKyMgIC1mdW5jdGlvbiBmdW5jbmFtZQorIwlJZiBzZXQsIHRoZW4gb25seSBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24ocykuICBBbGwKKyMJb3RoZXIgZnVuY3Rpb25zIGFyZSBpZ25vcmVkLgorIworIyAgLW5vZnVuY3Rpb24gZnVuY25hbWUKKyMJSWYgc2V0LCB0aGVuIG9ubHkgZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG90aGVyIGZ1bmN0aW9uKHMpLiAgQWxsCisjCW90aGVyIGZ1bmN0aW9ucyBhcmUgaWdub3JlZC4gQ2Fubm90IGJlIHVzZWQgd2l0aCAtZnVuY3Rpb24gdG9nZXRoZXIKKyMJKHllcyB0aGF0cyBhIGJ1ZyAtIHBlcmwgaGFja2VycyBjYW4gZml4IGl0IDgpKQorIworIyAgYyBmaWxlcyAtIGxpc3Qgb2YgJ2MnIGZpbGVzIHRvIHByb2Nlc3MKKyMKKyMgIEFsbCBvdXRwdXQgZ29lcyB0byBzdGRvdXQsIHdpdGggZXJyb3JzIHRvIHN0ZGVyci4KKworIworIyBmb3JtYXQgb2YgY29tbWVudHMuCisjIEluIHRoZSBmb2xsb3dpbmcgdGFibGUsICguLi4pPyBzaWduaWZpZXMgb3B0aW9uYWwgc3RydWN0dXJlLgorIyAgICAgICAgICAgICAgICAgICAgICAgICAoLi4uKSogc2lnbmlmaWVzIDAgb3IgbW9yZSBzdHJ1Y3R1cmUgZWxlbWVudHMKKyMgLyoqCisjICAqIGZ1bmN0aW9uX25hbWUoOik/ICgtIHNob3J0IGRlc2NyaXB0aW9uKT8KKyMgKCogQHBhcmFtZXRlcng6IChkZXNjcmlwdGlvbiBvZiBwYXJhbWV0ZXIgeCk/KSoKKyMgKCogYSBibGFuayBsaW5lKT8KKyMgICogKERlc2NyaXB0aW9uOik/IChEZXNjcmlwdGlvbiBvZiBmdW5jdGlvbik/CisjICAqIChzZWN0aW9uIGhlYWRlcjogKHNlY3Rpb24gZGVzY3JpcHRpb24pPyApKgorIyAgKCopPyovCisjCisjIFNvIC4uIHRoZSB0cml2aWFsIGV4YW1wbGUgd291bGQgYmU6CisjCisjIC8qKgorIyAgKiBteV9mdW5jdGlvbgorIyAgKiovCisjCisjIElmIHRoZSBEZXNjcmlwdGlvbjogaGVhZGVyIHRhZyBpcyBvbW1pdHRlZCwgdGhlbiB0aGVyZSBtdXN0IGJlIGEgYmxhbmsgbGluZQorIyBhZnRlciB0aGUgbGFzdCBwYXJhbWV0ZXIgc3BlY2lmaWNhdGlvbi4KKyMgZS5nLgorIyAvKioKKyMgICogbXlfZnVuY3Rpb24gLSBkb2VzIG15IHN0dWZmCisjICAqIEBteV9hcmc6IGl0cyBtaW5lIGRhbW5pdAorIyAgKgorIyAgKiBEb2VzIG15IHN0dWZmIGV4cGxhaW5lZC4gCisjICAqLworIworIyAgb3IsIGNvdWxkIGFsc28gdXNlOgorIyAvKioKKyMgICogbXlfZnVuY3Rpb24gLSBkb2VzIG15IHN0dWZmCisjICAqIEBteV9hcmc6IGl0cyBtaW5lIGRhbW5pdAorIyAgKiBEZXNjcmlwdGlvbjogRG9lcyBteSBzdHVmZiBleHBsYWluZWQuIAorIyAgKi8KKyMgZXRjLgorIworIyBCZXNpZGUgZnVuY3Rpb25zIHlvdSBjYW4gYWxzbyB3cml0ZSBkb2N1bWVudGF0aW9uIGZvciBzdHJ1Y3RzLCB1bmlvbnMsIAorIyBlbnVtcyBhbmQgdHlwZWRlZnMuIEluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG5hbWUgeW91IG11c3Qgd3JpdGUgdGhlIG5hbWUgCisjIG9mIHRoZSBkZWNsYXJhdGlvbjsgIHRoZSBzdHJ1Y3QvdW5pb24vZW51bS90eXBlZGVmIG11c3QgYWx3YXlzIHByZWNlZGUgCisjIHRoZSBuYW1lLiBOZXN0aW5nIG9mIGRlY2xhcmF0aW9ucyBpcyBub3Qgc3VwcG9ydGVkLiAKKyMgVXNlIHRoZSBhcmd1bWVudCBtZWNoYW5pc20gdG8gZG9jdW1lbnQgbWVtYmVycyBvciBjb25zdGFudHMuCisjIGUuZy4KKyMgLyoqCisjICAqIHN0cnVjdCBteV9zdHJ1Y3QgLSBzaG9ydCBkZXNjcmlwdGlvbgorIyAgKiBAYTogZmlyc3QgbWVtYmVyCisjICAqIEBiOiBzZWNvbmQgbWVtYmVyCisjICAqIAorIyAgKiBMb25nZXIgZGVzY3JpcHRpb24KKyMgICovCisjIHN0cnVjdCBteV9zdHJ1Y3QgeworIyAgICAgaW50IGE7CisjICAgICBpbnQgYjsKKyMgfTsKKyMKKyMgQWxsIGRlc2NyaXB0aW9ucyBjYW4gYmUgbXVsdGlsaW5lLCBleGNlcHQgdGhlIHNob3J0IGZ1bmN0aW9uIGRlc2NyaXB0aW9uLgorIyAKKyMgWW91IGNhbiBhbHNvIGFkZCBhZGRpdGlvbmFsIHNlY3Rpb25zLiBXaGVuIGRvY3VtZW50aW5nIGtlcm5lbCBmdW5jdGlvbnMgeW91IAorIyBzaG91bGQgZG9jdW1lbnQgdGhlICJDb250ZXh0OiIgb2YgdGhlIGZ1bmN0aW9uLCBlLmcuIHdoZXRoZXIgdGhlIGZ1bmN0aW9ucyAKKyMgY2FuIGJlIGNhbGxlZCBmb3JtIGludGVycnVwdHMuIFVubGlrZSBvdGhlciBzZWN0aW9ucyB5b3UgY2FuIGVuZCBpdCB3aXRoIGFuCisjIGVtcHR5IGxpbmUuIAorIyBFeGFtcGxlLXNlY3Rpb25zIHNob3VsZCBjb250YWluIHRoZSBzdHJpbmcgRVhBTVBMRSBzbyB0aGF0IHRoZXkgYXJlIG1hcmtlZCAKKyMgYXBwcm9wcmlhdGVseSBpbiBEb2NCb29rLgorIworIyBFeGFtcGxlOgorIyAvKioKKyMgICogdXNlcl9mdW5jdGlvbiAtIGZ1bmN0aW9uIHRoYXQgY2FuIG9ubHkgYmUgY2FsbGVkIGluIHVzZXIgY29udGV4dAorIyAgKiBAYTogc29tZSBhcmd1bWVudAorIyAgKiBDb250ZXh0OiAhaW5faW50ZXJydXB0KCkKKyMgICogCisjICAqIFNvbWUgZGVzY3JpcHRpb24KKyMgICogRXhhbXBsZToKKyMgICogICAgdXNlcl9mdW5jdGlvbigyMik7CisjICAqLworIyAuLi4KKyMKKyMKKyMgQWxsIGRlc2NyaXB0aXZlIHRleHQgaXMgZnVydGhlciBwcm9jZXNzZWQsIHNjYW5uaW5nIGZvciB0aGUgZm9sbG93aW5nIHNwZWNpYWwKKyMgcGF0dGVybnMsIHdoaWNoIGFyZSBoaWdobGlnaHRlZCBhcHByb3ByaWF0ZWx5LgorIworIyAnZnVuY25hbWUoKScgLSBmdW5jdGlvbgorIyAnJEVOVlZBUicgLSBlbnZpcm9ubWVudGFsIHZhcmlhYmxlCisjICcmc3RydWN0X25hbWUnIC0gbmFtZSBvZiBhIHN0cnVjdHVyZSAodXAgdG8gdHdvIHdvcmRzIGluY2x1ZGluZyAnc3RydWN0JykKKyMgJ0BwYXJhbWV0ZXInIC0gbmFtZSBvZiBhIHBhcmFtZXRlcgorIyAnJUNPTlNUJyAtIG5hbWUgb2YgYSBjb25zdGFudC4KKworbXkgJGVycm9ycyA9IDA7CitteSAkd2FybmluZ3MgPSAwOworCisjIG1hdGNoIGV4cHJlc3Npb25zIHVzZWQgdG8gZmluZCBlbWJlZGRlZCB0eXBlIGluZm9ybWF0aW9uCitteSAkdHlwZV9jb25zdGFudCA9ICdcJShbLV9cd10rKSc7CitteSAkdHlwZV9mdW5jID0gJyhcdyspXChcKSc7CitteSAkdHlwZV9wYXJhbSA9ICdcQChcdyspJzsKK215ICR0eXBlX3N0cnVjdCA9ICdcJigoc3RydWN0XHMqKT9bX1x3XSspJzsKK215ICR0eXBlX2VudiA9ICcoXCRcdyspJzsKKworIyBPdXRwdXQgY29udmVyc2lvbiBzdWJzdGl0dXRpb25zLgorIyAgT25lIGZvciBlYWNoIG91dHB1dCBmb3JtYXQKKworIyB0aGVzZSB3b3JrIGZhaXJseSB3ZWxsCitteSAlaGlnaGxpZ2h0c19odG1sID0gKCAkdHlwZV9jb25zdGFudCwgIjxpPlwkMTwvaT4iLAorCQkJJHR5cGVfZnVuYywgIjxiPlwkMTwvYj4iLAorCQkJJHR5cGVfc3RydWN0LCAiPGk+XCQxPC9pPiIsCisJCQkkdHlwZV9wYXJhbSwgIjx0dD48Yj5cJDE8L2I+PC90dD4iICk7CitteSAkYmxhbmtsaW5lX2h0bWwgPSAiPHA+IjsKKworIyBYTUwsIGRvY2Jvb2sgZm9ybWF0CitteSAlaGlnaGxpZ2h0c194bWwgPSAoICIoW149XSlcXFwiKFteXFxcIjxdKylcXFwiIiwgIlwkMTxxdW90ZT5cJDI8L3F1b3RlPiIsCisJCQkkdHlwZV9jb25zdGFudCwgIjxjb25zdGFudD5cJDE8L2NvbnN0YW50PiIsCisJCQkkdHlwZV9mdW5jLCAiPGZ1bmN0aW9uPlwkMTwvZnVuY3Rpb24+IiwKKwkJCSR0eXBlX3N0cnVjdCwgIjxzdHJ1Y3RuYW1lPlwkMTwvc3RydWN0bmFtZT4iLAorCQkJJHR5cGVfZW52LCAiPGVudmFyPlwkMTwvZW52YXI+IiwKKwkJCSR0eXBlX3BhcmFtLCAiPHBhcmFtZXRlcj5cJDE8L3BhcmFtZXRlcj4iICk7CitteSAkYmxhbmtsaW5lX3htbCA9ICI8L3BhcmE+PHBhcmE+XG4iOworCisjIGdub21lLCBkb2Nib29rIGZvcm1hdAorbXkgJWhpZ2hsaWdodHNfZ25vbWUgPSAoICR0eXBlX2NvbnN0YW50LCAiPHJlcGxhY2VhYmxlIGNsYXNzPVwib3B0aW9uXCI+XCQxPC9yZXBsYWNlYWJsZT4iLAorCQkJICR0eXBlX2Z1bmMsICI8ZnVuY3Rpb24+XCQxPC9mdW5jdGlvbj4iLAorCQkJICR0eXBlX3N0cnVjdCwgIjxzdHJ1Y3RuYW1lPlwkMTwvc3RydWN0bmFtZT4iLAorCQkJICR0eXBlX2VudiwgIjxlbnZhcj5cJDE8L2VudmFyPiIsCisJCQkgJHR5cGVfcGFyYW0sICI8cGFyYW1ldGVyPlwkMTwvcGFyYW1ldGVyPiIgKTsKK215ICRibGFua2xpbmVfZ25vbWUgPSAiPC9wYXJhPjxwYXJhPlxuIjsKKworIyB0aGVzZSBhcmUgcHJldHR5IHJvdWdoCitteSAlaGlnaGxpZ2h0c19tYW4gPSAoICR0eXBlX2NvbnN0YW50LCAiXCQxIiwKKwkJICAgICAgICR0eXBlX2Z1bmMsICJcXFxcZkJcJDFcXFxcZlAiLAorCQkgICAgICAgJHR5cGVfc3RydWN0LCAiXFxcXGZJXCQxXFxcXGZQIiwKKwkJICAgICAgICR0eXBlX3BhcmFtLCAiXFxcXGZJXCQxXFxcXGZQIiApOworbXkgJGJsYW5rbGluZV9tYW4gPSAiIjsKKworIyB0ZXh0LW1vZGUKK215ICVoaWdobGlnaHRzX3RleHQgPSAoICR0eXBlX2NvbnN0YW50LCAiXCQxIiwKKwkJCSR0eXBlX2Z1bmMsICJcJDEiLAorCQkJJHR5cGVfc3RydWN0LCAiXCQxIiwKKwkJCSR0eXBlX3BhcmFtLCAiXCQxIiApOworbXkgJGJsYW5rbGluZV90ZXh0ID0gIiI7CisKKworc3ViIHVzYWdlIHsKKyAgICBwcmludCAiVXNhZ2U6ICQwIFsgLXYgXSBbIC1kb2Nib29rIHwgLWh0bWwgfCAtdGV4dCB8IC1tYW4gXVxuIjsKKyAgICBwcmludCAiICAgICAgICAgWyAtZnVuY3Rpb24gZnVuY25hbWUgWyAtZnVuY3Rpb24gZnVuY25hbWUgLi4uXSBdXG4iOworICAgIHByaW50ICIgICAgICAgICBbIC1ub2Z1bmN0aW9uIGZ1bmNuYW1lIFsgLW5vZnVuY3Rpb24gZnVuY25hbWUgLi4uXSBdXG4iOworICAgIHByaW50ICIgICAgICAgICBjIHNvdXJjZSBmaWxlKHMpID4gb3V0cHV0ZmlsZVxuIjsKKyAgICBleGl0IDE7Cit9CisKKyMgcmVhZCBhcmd1bWVudHMKK2lmICgkI0FSR1Y9PS0xKSB7CisgICAgdXNhZ2UoKTsKK30KKworbXkgJHZlcmJvc2UgPSAwOworbXkgJG91dHB1dF9tb2RlID0gIm1hbiI7CitteSAlaGlnaGxpZ2h0cyA9ICVoaWdobGlnaHRzX21hbjsKK215ICRibGFua2xpbmUgPSAkYmxhbmtsaW5lX21hbjsKK215ICRtb2R1bGVuYW1lID0gIktlcm5lbCBBUEkiOworbXkgJGZ1bmN0aW9uX29ubHkgPSAwOworbXkgJG1hbl9kYXRlID0gKCdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgCisJCSdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsIAorCQknTm92ZW1iZXInLCAnRGVjZW1iZXInKVsobG9jYWx0aW1lKVs0XV0gLiAKKyAgIiAiIC4gKChsb2NhbHRpbWUpWzVdKzE5MDApOworCisjIEVzc2VudGlhbGx5IHRoZXNlIGFyZSBnbG9iYWxzCisjIFRoZXkgcHJvYmFibHkgd2FudCB0byBiZSB0aWRpZWQgdXAgbWFkZSBtb3JlIGxvY2FsaXNlZCBvciBzdW1tYXQuCisjIENBVkVBVCBFTVBUT1IhICBTb21lIG9mIHRoZSBvdGhlcnMgSSBsb2NhbGlzZWQgbWF5IG5vdCB3YW50IHRvIGJlIHdoaWNoCisjIGNvdWxkIGNhdXNlICJ1c2Ugb2YgdW5kZWZpbmVkIHZhbHVlIiBvciBvdGhlciBidWdzLgorbXkgKCRmdW5jdGlvbiwgJWZ1bmN0aW9uX3RhYmxlLCVwYXJhbWV0ZXJ0eXBlcywkZGVjbGFyYXRpb25fcHVycG9zZSk7CitteSAoJHR5cGUsJGRlY2xhcmF0aW9uX25hbWUsJHJldHVybl90eXBlKTsKK215ICgkbmV3c2VjdGlvbiwkbmV3Y29udGVudHMsJHByb3RvdHlwZSwkZmlsZWxpc3QsICRicmNvdW50LCAlc291cmNlX21hcCk7CisKKyMgR2VuZXJhdGVkIGRvY2Jvb2sgY29kZSBpcyBpbnNlcnRlZCBpbiBhIHRlbXBsYXRlIGF0IGEgcG9pbnQgd2hlcmUgCisjIGRvY2Jvb2sgdjMuMSByZXF1aXJlcyBhIG5vbi16ZXJvIHNlcXVlbmNlIG9mIFJlZkVudHJ5J3M7IHNlZToKKyMgaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL2RvY3VtZW50YXRpb24vcmVmZXJlbmNlL2h0bWwvcmVmZW50cnkuaHRtbAorIyBXZSBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBnZW5lcmF0ZWQgZW50cmllcyBhbmQgZ2VuZXJhdGUgYSBkdW1teQorIyBpZiBuZWVkcyBiZSB0byBlbnN1cmUgdGhlIGV4cGFuZGVkIHRlbXBsYXRlIGNhbiBiZSBwb3N0cHJvY2Vzc2VkCisjIGludG8gaHRtbC4KK215ICRzZWN0aW9uX2NvdW50ZXIgPSAwOworCitteSAkbGluZXByZWZpeD0iIjsKKworIyBzdGF0ZXMKKyMgMCAtIG5vcm1hbCBjb2RlCisjIDEgLSBsb29raW5nIGZvciBmdW5jdGlvbiBuYW1lCisjIDIgLSBzY2FubmluZyBmaWVsZCBzdGFydC4KKyMgMyAtIHNjYW5uaW5nIHByb3RvdHlwZS4KKyMgNCAtIGRvY3VtZW50YXRpb24gYmxvY2sKK215ICRzdGF0ZTsKKworI2RlY2xhcmF0aW9uIHR5cGVzOiBjYW4gYmUKKyMgJ2Z1bmN0aW9uJywgJ3N0cnVjdCcsICd1bmlvbicsICdlbnVtJywgJ3R5cGVkZWYnCitteSAkZGVjbF90eXBlOworCitteSAkZG9jX3NwZWNpYWwgPSAiXEBcJVwkXCYiOworCitteSAkZG9jX3N0YXJ0ID0gJ14vXCpcKlxzKiQnOyAjIEFsbG93IHdoaXRlc3BhY2UgYXQgZW5kIG9mIGNvbW1lbnQgc3RhcnQuCitteSAkZG9jX2VuZCA9ICdcKi8nOworbXkgJGRvY19jb20gPSAnXHMqXCpccyonOworbXkgJGRvY19kZWNsID0gJGRvY19jb20uJyhcdyspJzsKK215ICRkb2Nfc2VjdCA9ICRkb2NfY29tLicoWycuJGRvY19zcGVjaWFsLiddP1tcdyBdKyk6KC4qKSc7CitteSAkZG9jX2NvbnRlbnQgPSAkZG9jX2NvbS4nKC4qKSc7CitteSAkZG9jX2Jsb2NrID0gJGRvY19jb20uJ0RPQzpccyooLiopPyc7CisKK215ICVjb25zdGFudHM7CitteSAlcGFyYW1ldGVyZGVzY3M7CitteSBAcGFyYW1ldGVybGlzdDsKK215ICVzZWN0aW9uczsKK215IEBzZWN0aW9ubGlzdDsKKworbXkgJGNvbnRlbnRzID0gIiI7CitteSAkc2VjdGlvbl9kZWZhdWx0ID0gIkRlc2NyaXB0aW9uIjsJIyBkZWZhdWx0IHNlY3Rpb24KK215ICRzZWN0aW9uX2ludHJvID0gIkludHJvZHVjdGlvbiI7CitteSAkc2VjdGlvbiA9ICRzZWN0aW9uX2RlZmF1bHQ7CitteSAkc2VjdGlvbl9jb250ZXh0ID0gIkNvbnRleHQiOworCitteSAkdW5kZXNjcmliZWQgPSAiLS0gdW5kZXNjcmliZWQgLS0iOworCityZXNldF9zdGF0ZSgpOworCit3aGlsZSAoJEFSR1ZbMF0gPX4gbS9eLSguKikvKSB7CisgICAgbXkgJGNtZCA9IHNoaWZ0IEBBUkdWOworICAgIGlmICgkY21kIGVxICItaHRtbCIpIHsKKwkkb3V0cHV0X21vZGUgPSAiaHRtbCI7CisJJWhpZ2hsaWdodHMgPSAlaGlnaGxpZ2h0c19odG1sOworCSRibGFua2xpbmUgPSAkYmxhbmtsaW5lX2h0bWw7CisgICAgfSBlbHNpZiAoJGNtZCBlcSAiLW1hbiIpIHsKKwkkb3V0cHV0X21vZGUgPSAibWFuIjsKKwklaGlnaGxpZ2h0cyA9ICVoaWdobGlnaHRzX21hbjsKKwkkYmxhbmtsaW5lID0gJGJsYW5rbGluZV9tYW47CisgICAgfSBlbHNpZiAoJGNtZCBlcSAiLXRleHQiKSB7CisJJG91dHB1dF9tb2RlID0gInRleHQiOworCSVoaWdobGlnaHRzID0gJWhpZ2hsaWdodHNfdGV4dDsKKwkkYmxhbmtsaW5lID0gJGJsYW5rbGluZV90ZXh0OworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi1kb2Nib29rIikgeworCSRvdXRwdXRfbW9kZSA9ICJ4bWwiOworCSVoaWdobGlnaHRzID0gJWhpZ2hsaWdodHNfeG1sOworCSRibGFua2xpbmUgPSAkYmxhbmtsaW5lX3htbDsKKyAgICB9IGVsc2lmICgkY21kIGVxICItZ25vbWUiKSB7CisJJG91dHB1dF9tb2RlID0gImdub21lIjsKKwklaGlnaGxpZ2h0cyA9ICVoaWdobGlnaHRzX2dub21lOworCSRibGFua2xpbmUgPSAkYmxhbmtsaW5lX2dub21lOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi1tb2R1bGUiKSB7ICMgbm90IG5lZWRlZCBmb3IgWE1MLCBpbmhlcml0cyBmcm9tIGNhbGxpbmcgZG9jdW1lbnQKKwkkbW9kdWxlbmFtZSA9IHNoaWZ0IEBBUkdWOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi1mdW5jdGlvbiIpIHsgIyB0byBvbmx5IG91dHB1dCBzcGVjaWZpYyBmdW5jdGlvbnMKKwkkZnVuY3Rpb25fb25seSA9IDE7CisJJGZ1bmN0aW9uID0gc2hpZnQgQEFSR1Y7CisJJGZ1bmN0aW9uX3RhYmxleyRmdW5jdGlvbn0gPSAxOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi1ub2Z1bmN0aW9uIikgeyAjIHRvIG9ubHkgb3V0cHV0IHNwZWNpZmljIGZ1bmN0aW9ucworCSRmdW5jdGlvbl9vbmx5ID0gMjsKKwkkZnVuY3Rpb24gPSBzaGlmdCBAQVJHVjsKKwkkZnVuY3Rpb25fdGFibGV7JGZ1bmN0aW9ufSA9IDE7CisgICAgfSBlbHNpZiAoJGNtZCBlcSAiLXYiKSB7CisJJHZlcmJvc2UgPSAxOworICAgIH0gZWxzaWYgKCgkY21kIGVxICItaCIpIHx8ICgkY21kIGVxICItLWhlbHAiKSkgeworCXVzYWdlKCk7CisgICAgfSBlbHNpZiAoJGNtZCBlcSAnLWZpbGVsaXN0JykgeworCSAgICAkZmlsZWxpc3QgPSBzaGlmdCBAQVJHVjsKKyAgICB9Cit9CisKKworIyBnZW5lcmF0ZSBhIHNlcXVlbmNlIG9mIGNvZGUgdGhhdCB3aWxsIHNwbGljZSBpbiBoaWdobGlnaHRpbmcgaW5mb3JtYXRpb24KKyMgdXNpbmcgdGhlIHMvLyBvcGVyYXRvci4KK215ICRkb2hpZ2hsaWdodCA9ICIiOworZm9yZWFjaCBteSAkcGF0dGVybiAoa2V5cyAlaGlnaGxpZ2h0cykgeworIyAgICBwcmludCAic2Nhbm5pbmcgcGF0dGVybiAkcGF0dGVybiAoJGhpZ2hsaWdodHN7JHBhdHRlcm59KVxuIjsKKyAgICAkZG9oaWdobGlnaHQgLj0gICJcJGNvbnRlbnRzID1+IHM6JHBhdHRlcm46JGhpZ2hsaWdodHN7JHBhdHRlcm59OmdzO1xuIjsKK30KKworIyMKKyMgZHVtcHMgc2VjdGlvbiBjb250ZW50cyB0byBhcnJheXMvaGFzaGVzIGludGVuZGVkIGZvciB0aGF0IHB1cnBvc2UuCisjCitzdWIgZHVtcF9zZWN0aW9uIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRjb250ZW50cyA9IGpvaW4gIlxuIiwgQF87CisKKyAgICBpZiAoJG5hbWUgPX4gbS8kdHlwZV9jb25zdGFudC8pIHsKKwkkbmFtZSA9ICQxOworIwlwcmludCBTVERFUlIgImNvbnN0YW50IHNlY3Rpb24gJyQxJyA9ICckY29udGVudHMnXG4iOworCSRjb25zdGFudHN7JG5hbWV9ID0gJGNvbnRlbnRzOworICAgIH0gZWxzaWYgKCRuYW1lID1+IG0vJHR5cGVfcGFyYW0vKSB7CisjCXByaW50IFNUREVSUiAicGFyYW1ldGVyIGRlZiAnJDEnID0gJyRjb250ZW50cydcbiI7CisJJG5hbWUgPSAkMTsKKwkkcGFyYW1ldGVyZGVzY3N7JG5hbWV9ID0gJGNvbnRlbnRzOworICAgIH0gZWxzZSB7CisjCXByaW50IFNUREVSUiAib3RoZXIgc2VjdGlvbiAnJG5hbWUnID0gJyRjb250ZW50cydcbiI7CisJJHNlY3Rpb25zeyRuYW1lfSA9ICRjb250ZW50czsKKwlwdXNoIEBzZWN0aW9ubGlzdCwgJG5hbWU7CisgICAgfQorfQorCisjIworIyBvdXRwdXQgZnVuY3Rpb24KKyMKKyMgcGFyYW1ldGVyZGVzY3MsIGEgaGFzaC4KKyMgIGZ1bmN0aW9uID0+ICJmdW5jdGlvbiBuYW1lIgorIyAgcGFyYW1ldGVybGlzdCA9PiBAbGlzdCBvZiBwYXJhbWV0ZXJzCisjICBwYXJhbWV0ZXJkZXNjcyA9PiAlcGFyYW1ldGVyIGRlc2NyaXB0aW9ucworIyAgc2VjdGlvbmxpc3QgPT4gQGxpc3Qgb2Ygc2VjdGlvbnMKKyMgIHNlY3Rpb25zID0+ICVkZXNjcmlvbnQgZGVzY3JpcHRpb25zCisjICAKKworc3ViIG91dHB1dF9oaWdobGlnaHQgeworICAgIG15ICRjb250ZW50cyA9IGpvaW4gIlxuIixAXzsKKyAgICBteSAkbGluZTsKKworIyAgIERFQlVHCisjICAgaWYgKCFkZWZpbmVkICRjb250ZW50cykgeworIwl1c2UgQ2FycDsKKyMJY29uZmVzcyAib3V0cHV0X2hpZ2hsaWdodCBnb3QgY2FsbGVkIHdpdGggbm8gYXJncz9cbiI7CisjICAgfQorCisgICAgZXZhbCAkZG9oaWdobGlnaHQ7CisgICAgZGllICRAIGlmICRAOworICAgIGZvcmVhY2ggJGxpbmUgKHNwbGl0ICJcbiIsICRjb250ZW50cykgeworICAgICAgaWYgKCRsaW5lIGVxICIiKXsKKwkgICAgcHJpbnQgJGxpbmVwcmVmaXgsICRibGFua2xpbmU7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICRsaW5lID1+IHMvXFxcXFxcL1wmL2c7CisJICAgIHByaW50ICRsaW5lcHJlZml4LCAkbGluZTsKKwl9CisJcHJpbnQgIlxuIjsKKyAgICB9Cit9CisKKyNvdXRwdXQgc2VjdGlvbnMgaW4gaHRtbAorc3ViIG91dHB1dF9zZWN0aW9uX2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgJHNlY3Rpb247CisKKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICI8aDM+JHNlY3Rpb248L2gzPlxuIjsKKwlwcmludCAiPGJsb2NrcXVvdGU+XG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKwlwcmludCAiPC9ibG9ja3F1b3RlPlxuIjsKKyAgICB9ICAKK30KKworIyBvdXRwdXQgZW51bSBpbiBodG1sCitzdWIgb3V0cHV0X2VudW1faHRtbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlcik7CisgICAgbXkgJGNvdW50OworICAgIHByaW50ICI8aDI+ZW51bSAiLiRhcmdzeydlbnVtJ30uIjwvaDI+XG4iOworCisgICAgcHJpbnQgIjxiPmVudW0gIi4kYXJnc3snZW51bSd9LiI8L2I+IHs8YnI+XG4iOworICAgICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisgICAgICAgIHByaW50ICIgPGI+Ii4kcGFyYW1ldGVyLiI8L2I+IjsKKwlpZiAoJGNvdW50ICE9ICQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICRjb3VudCsrOworCSAgICBwcmludCAiLFxuIjsKKwl9CisJcHJpbnQgIjxicj4iOworICAgIH0KKyAgICBwcmludCAifTs8YnI+XG4iOworCisgICAgcHJpbnQgIjxoMz5Db25zdGFudHM8L2gzPlxuIjsKKyAgICBwcmludCAiPGRsPlxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlwcmludCAiPGR0PjxiPiIuJHBhcmFtZXRlci4iPC9iPlxuIjsKKwlwcmludCAiPGRkPiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyfSk7CisgICAgfQorICAgIHByaW50ICI8L2RsPlxuIjsKKyAgICBvdXRwdXRfc2VjdGlvbl9odG1sKEBfKTsKKyAgICBwcmludCAiPGhyPlxuIjsKK30KKworIyBvdXRwdXQgdHllcGRlZiBpbiBodG1sCitzdWIgb3V0cHV0X3R5cGVkZWZfaHRtbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlcik7CisgICAgbXkgJGNvdW50OworICAgIHByaW50ICI8aDI+dHlwZWRlZiAiLiRhcmdzeyd0eXBlZGVmJ30uIjwvaDI+XG4iOworCisgICAgcHJpbnQgIjxiPnR5cGVkZWYgIi4kYXJnc3sndHlwZWRlZid9LiI8L2I+XG4iOworICAgIG91dHB1dF9zZWN0aW9uX2h0bWwoQF8pOworICAgIHByaW50ICI8aHI+XG4iOworfQorCisjIG91dHB1dCBzdHJ1Y3QgaW4gaHRtbAorc3ViIG91dHB1dF9zdHJ1Y3RfaHRtbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlcik7CisKKyAgICBwcmludCAiPGgyPiIuJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiI8L2gyPlxuIjsKKyAgICBwcmludCAiPGI+Ii4kYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIjwvYj4gezxicj5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJaWYgKCRwYXJhbWV0ZXIgPX4gL14jLykgeworCQlwcmludCAiJHBhcmFtZXRlcjxicj5cbiI7CisJCW5leHQ7CisJfQorCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OworCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkgICAgcHJpbnQgIiA8aT4kMTwvaT48Yj4kcGFyYW1ldGVyPC9iPikgPGk+KCQyKTwvaT47PGJyPlxuIjsKKwl9IGVsc2lmICgkdHlwZSA9fiBtL14oLio/KVxzKig6LiopLykgeworCSAgICBwcmludCAiIDxpPiQxPC9pPiA8Yj4kcGFyYW1ldGVyPC9iPiQyOzxicj5cbiI7CisJfSBlbHNlIHsKKwkgICAgcHJpbnQgIiA8aT4kdHlwZTwvaT4gPGI+JHBhcmFtZXRlcjwvYj47PGJyPlxuIjsKKwl9CisgICAgfQorICAgIHByaW50ICJ9Ozxicj5cbiI7CisKKyAgICBwcmludCAiPGgzPk1lbWJlcnM8L2gzPlxuIjsKKyAgICBwcmludCAiPGRsPlxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkoJHBhcmFtZXRlciA9fiAvXiMvKSAmJiBuZXh0OworCisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKyAgICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworCXByaW50ICI8ZHQ+PGI+Ii4kcGFyYW1ldGVyLiI8L2I+XG4iOworCXByaW50ICI8ZGQ+IjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOworICAgIH0KKyAgICBwcmludCAiPC9kbD5cbiI7CisgICAgb3V0cHV0X3NlY3Rpb25faHRtbChAXyk7CisgICAgcHJpbnQgIjxocj5cbiI7Cit9CisKKyMgb3V0cHV0IGZ1bmN0aW9uIGluIGh0bWwKK3N1YiBvdXRwdXRfZnVuY3Rpb25faHRtbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRjb3VudDsKKyAgICBwcmludCAiPGgyPkZ1bmN0aW9uPC9oMj5cbiI7CisKKyAgICBwcmludCAiPGk+Ii4kYXJnc3snZnVuY3Rpb250eXBlJ30uIjwvaT5cbiI7CisgICAgcHJpbnQgIjxiPiIuJGFyZ3N7J2Z1bmN0aW9uJ30uIjwvYj5cbiI7CisgICAgcHJpbnQgIigiOworICAgICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJICAgIHByaW50ICI8aT4kMTwvaT48Yj4kcGFyYW1ldGVyPC9iPikgPGk+KCQyKTwvaT4iOworCX0gZWxzZSB7CisJICAgIHByaW50ICI8aT4iLiR0eXBlLiI8L2k+IDxiPiIuJHBhcmFtZXRlci4iPC9iPiI7CisJfQorCWlmICgkY291bnQgIT0gJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkgICAgJGNvdW50Kys7CisJICAgIHByaW50ICIsXG4iOworCX0KKyAgICB9CisgICAgcHJpbnQgIilcbiI7CisKKyAgICBwcmludCAiPGgzPkFyZ3VtZW50czwvaDM+XG4iOworICAgIHByaW50ICI8ZGw+XG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwlwcmludCAiPGR0PjxiPiIuJHBhcmFtZXRlci4iPC9iPlxuIjsKKwlwcmludCAiPGRkPiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICB9CisgICAgcHJpbnQgIjwvZGw+XG4iOworICAgIG91dHB1dF9zZWN0aW9uX2h0bWwoQF8pOworICAgIHByaW50ICI8aHI+XG4iOworfQorCisjIG91dHB1dCBpbnRybyBpbiBodG1sCitzdWIgb3V0cHV0X2ludHJvX2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisKKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICI8aDM+JHNlY3Rpb248L2gzPlxuIjsKKwlwcmludCAiPHVsPlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisJcHJpbnQgIjwvdWw+XG4iOworICAgIH0KKyAgICBwcmludCAiPGhyPlxuIjsKK30KKworc3ViIG91dHB1dF9zZWN0aW9uX3htbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAkc2VjdGlvbjsgICAgCisgICAgIyBwcmludCBvdXQgZWFjaCBzZWN0aW9uCisgICAgJGxpbmVwcmVmaXg9IiAgICI7CisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiPHJlZnNlY3QxPlxuIDx0aXRsZT4kc2VjdGlvbjwvdGl0bGU+XG4gPHBhcmE+XG4iOworCWlmICgkc2VjdGlvbiA9fiBtL0VYQU1QTEUvaSkgeworCSAgICBwcmludCAiPGV4YW1wbGU+PHBhcmE+XG4iOworCX0KKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisJaWYgKCRzZWN0aW9uID1+IG0vRVhBTVBMRS9pKSB7CisJICAgIHByaW50ICI8L3BhcmE+PC9leGFtcGxlPlxuIjsKKwl9CisJcHJpbnQgIiA8L3BhcmE+XG48L3JlZnNlY3QxPlxuIjsKKyAgICB9Cit9CisKKyMgb3V0cHV0IGZ1bmN0aW9uIGluIFhNTCBEb2NCb29rCitzdWIgb3V0cHV0X2Z1bmN0aW9uX3htbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRjb3VudDsKKyAgICBteSAkaWQ7CisKKyAgICAkaWQgPSAiQVBJLSIuJGFyZ3N7J2Z1bmN0aW9uJ307CisgICAgJGlkID1+IHMvW15BLVphLXowLTldLy0vZzsKKworICAgIHByaW50ICI8cmVmZW50cnk+XG4iOworICAgIHByaW50ICI8cmVmbWV0YT5cbiI7CisgICAgcHJpbnQgIjxyZWZlbnRyeXRpdGxlPjxwaHJhc2UgaWQ9XCIkaWRcIj4iLiRhcmdzeydmdW5jdGlvbid9LiI8L3BocmFzZT48L3JlZmVudHJ5dGl0bGU+XG4iOworICAgIHByaW50ICI8L3JlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmbmFtZWRpdj5cbiI7CisgICAgcHJpbnQgIiA8cmVmbmFtZT4iLiRhcmdzeydmdW5jdGlvbid9LiI8L3JlZm5hbWU+XG4iOworICAgIHByaW50ICIgPHJlZnB1cnBvc2U+XG4iOworICAgIHByaW50ICIgICI7CisgICAgb3V0cHV0X2hpZ2hsaWdodCAoJGFyZ3N7J3B1cnBvc2UnfSk7CisgICAgcHJpbnQgIiA8L3JlZnB1cnBvc2U+XG4iOworICAgIHByaW50ICI8L3JlZm5hbWVkaXY+XG4iOworCisgICAgcHJpbnQgIjxyZWZzeW5vcHNpc2Rpdj5cbiI7CisgICAgcHJpbnQgIiA8dGl0bGU+U3lub3BzaXM8L3RpdGxlPlxuIjsKKyAgICBwcmludCAiICA8ZnVuY3N5bm9wc2lzPjxmdW5jcHJvdG90eXBlPlxuIjsKKyAgICBwcmludCAiICAgPGZ1bmNkZWY+Ii4kYXJnc3snZnVuY3Rpb250eXBlJ30uIiAiOworICAgIHByaW50ICI8ZnVuY3Rpb24+Ii4kYXJnc3snZnVuY3Rpb24nfS4iIDwvZnVuY3Rpb24+PC9mdW5jZGVmPlxuIjsKKworICAgICRjb3VudCA9IDA7CisgICAgaWYgKCQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319ID49IDApIHsKKwlmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkgICAgJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwkgICAgaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJCSMgcG9pbnRlci10by1mdW5jdGlvbgorCQlwcmludCAiICAgPHBhcmFtZGVmPiQxPHBhcmFtZXRlcj4kcGFyYW1ldGVyPC9wYXJhbWV0ZXI+KVxuIjsKKwkJcHJpbnQgIiAgICAgPGZ1bmNwYXJhbXM+JDI8L2Z1bmNwYXJhbXM+PC9wYXJhbWRlZj5cbiI7CisJICAgIH0gZWxzZSB7CisJCXByaW50ICIgICA8cGFyYW1kZWY+Ii4kdHlwZTsKKwkJcHJpbnQgIiA8cGFyYW1ldGVyPiRwYXJhbWV0ZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPlxuIjsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCXByaW50ICIgIDx2b2lkPlxuIjsKKyAgICB9CisgICAgcHJpbnQgIiAgPC9mdW5jcHJvdG90eXBlPjwvZnVuY3N5bm9wc2lzPlxuIjsKKyAgICBwcmludCAiPC9yZWZzeW5vcHNpc2Rpdj5cbiI7CisKKyAgICAjIHByaW50IHBhcmFtZXRlcnMKKyAgICBwcmludCAiPHJlZnNlY3QxPlxuIDx0aXRsZT5Bcmd1bWVudHM8L3RpdGxlPlxuIjsKKyAgICBpZiAoJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0gPj0gMCkgeworCXByaW50ICIgPHZhcmlhYmxlbGlzdD5cbiI7CisJZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgIG15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJICAgICRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworCSAgICBwcmludCAiICA8dmFybGlzdGVudHJ5PlxuICAgPHRlcm0+PHBhcmFtZXRlcj4kcGFyYW1ldGVyPC9wYXJhbWV0ZXI+PC90ZXJtPlxuIjsKKwkgICAgcHJpbnQgIiAgIDxsaXN0aXRlbT5cbiAgICA8cGFyYT5cbiI7CisJICAgICRsaW5lcHJlZml4PSIgICAgICI7CisJICAgIG91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisJICAgIHByaW50ICIgICAgPC9wYXJhPlxuICAgPC9saXN0aXRlbT5cbiAgPC92YXJsaXN0ZW50cnk+XG4iOworCX0KKwlwcmludCAiIDwvdmFyaWFibGVsaXN0PlxuIjsKKyAgICB9IGVsc2UgeworCXByaW50ICIgPHBhcmE+XG4gIE5vbmVcbiA8L3BhcmE+XG4iOworICAgIH0KKyAgICBwcmludCAiPC9yZWZzZWN0MT5cbiI7CisKKyAgICBvdXRwdXRfc2VjdGlvbl94bWwoQF8pOworICAgIHByaW50ICI8L3JlZmVudHJ5PlxuXG4iOworfQorCisjIG91dHB1dCBzdHJ1Y3QgaW4gWE1MIERvY0Jvb2sKK3N1YiBvdXRwdXRfc3RydWN0X3htbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRpZDsKKworICAgICRpZCA9ICJBUEktc3RydWN0LSIuJGFyZ3N7J3N0cnVjdCd9OworICAgICRpZCA9fiBzL1teQS1aYS16MC05XS8tL2c7CisKKyAgICBwcmludCAiPHJlZmVudHJ5PlxuIjsKKyAgICBwcmludCAiPHJlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmZW50cnl0aXRsZT48cGhyYXNlIGlkPVwiJGlkXCI+Ii4kYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIjwvcGhyYXNlPjwvcmVmZW50cnl0aXRsZT5cbiI7CisgICAgcHJpbnQgIjwvcmVmbWV0YT5cbiI7CisgICAgcHJpbnQgIjxyZWZuYW1lZGl2PlxuIjsKKyAgICBwcmludCAiIDxyZWZuYW1lPiIuJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiI8L3JlZm5hbWU+XG4iOworICAgIHByaW50ICIgPHJlZnB1cnBvc2U+XG4iOworICAgIHByaW50ICIgICI7CisgICAgb3V0cHV0X2hpZ2hsaWdodCAoJGFyZ3N7J3B1cnBvc2UnfSk7CisgICAgcHJpbnQgIiA8L3JlZnB1cnBvc2U+XG4iOworICAgIHByaW50ICI8L3JlZm5hbWVkaXY+XG4iOworCisgICAgcHJpbnQgIjxyZWZzeW5vcHNpc2Rpdj5cbiI7CisgICAgcHJpbnQgIiA8dGl0bGU+U3lub3BzaXM8L3RpdGxlPlxuIjsKKyAgICBwcmludCAiICA8cHJvZ3JhbWxpc3Rpbmc+XG4iOworICAgIHByaW50ICRhcmdzeyd0eXBlJ30uIiAiLiRhcmdzeydzdHJ1Y3QnfS4iIHtcbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJaWYgKCRwYXJhbWV0ZXIgPX4gL14jLykgeworCSAgICBwcmludCAiJHBhcmFtZXRlclxuIjsKKwkgICAgbmV4dDsKKwl9CisKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworCWRlZmluZWQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSkgfHwgbmV4dDsKKyAgICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICBwcmludCAiICAkMSAkcGFyYW1ldGVyKSAoJDIpO1xuIjsKKwl9IGVsc2lmICgkdHlwZSA9fiBtL14oLio/KVxzKig6LiopLykgeworCSAgICBwcmludCAiICAkMSAkcGFyYW1ldGVyJDI7XG4iOworCX0gZWxzZSB7CisJICAgIHByaW50ICIgICIuJHR5cGUuIiAiLiRwYXJhbWV0ZXIuIjtcbiI7CisJfQorICAgIH0KKyAgICBwcmludCAifTsiOworICAgIHByaW50ICIgIDwvcHJvZ3JhbWxpc3Rpbmc+XG4iOworICAgIHByaW50ICI8L3JlZnN5bm9wc2lzZGl2PlxuIjsKKworICAgIHByaW50ICIgPHJlZnNlY3QxPlxuIjsKKyAgICBwcmludCAiICA8dGl0bGU+TWVtYmVyczwvdGl0bGU+XG4iOworCisgICAgcHJpbnQgIiAgPHZhcmlhYmxlbGlzdD5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisgICAgICAoJHBhcmFtZXRlciA9fiAvXiMvKSAmJiBuZXh0OworCisgICAgICBteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworICAgICAgJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICBkZWZpbmVkKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pIHx8IG5leHQ7CisgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisgICAgICBwcmludCAiICAgIDx2YXJsaXN0ZW50cnk+IjsKKyAgICAgIHByaW50ICIgICAgICA8dGVybT4kcGFyYW1ldGVyPC90ZXJtPlxuIjsKKyAgICAgIHByaW50ICIgICAgICA8bGlzdGl0ZW0+PHBhcmE+XG4iOworICAgICAgb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICAgIHByaW50ICIgICAgICA8L3BhcmE+PC9saXN0aXRlbT5cbiI7CisgICAgICBwcmludCAiICAgIDwvdmFybGlzdGVudHJ5PlxuIjsKKyAgICB9CisgICAgcHJpbnQgIiAgPC92YXJpYWJsZWxpc3Q+XG4iOworICAgIHByaW50ICIgPC9yZWZzZWN0MT5cbiI7CisKKyAgICBvdXRwdXRfc2VjdGlvbl94bWwoQF8pOworCisgICAgcHJpbnQgIjwvcmVmZW50cnk+XG5cbiI7Cit9CisKKyMgb3V0cHV0IGVudW0gaW4gWE1MIERvY0Jvb2sKK3N1YiBvdXRwdXRfZW51bV94bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisgICAgbXkgJGlkOworCisgICAgJGlkID0gIkFQSS1lbnVtLSIuJGFyZ3N7J2VudW0nfTsKKyAgICAkaWQgPX4gcy9bXkEtWmEtejAtOV0vLS9nOworCisgICAgcHJpbnQgIjxyZWZlbnRyeT5cbiI7CisgICAgcHJpbnQgIjxyZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZmVudHJ5dGl0bGU+PHBocmFzZSBpZD1cIiRpZFwiPmVudW0gIi4kYXJnc3snZW51bSd9LiI8L3BocmFzZT48L3JlZmVudHJ5dGl0bGU+XG4iOworICAgIHByaW50ICI8L3JlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmbmFtZWRpdj5cbiI7CisgICAgcHJpbnQgIiA8cmVmbmFtZT5lbnVtICIuJGFyZ3N7J2VudW0nfS4iPC9yZWZuYW1lPlxuIjsKKyAgICBwcmludCAiIDxyZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiICAiOworICAgIG91dHB1dF9oaWdobGlnaHQgKCRhcmdzeydwdXJwb3NlJ30pOworICAgIHByaW50ICIgPC9yZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiPC9yZWZuYW1lZGl2PlxuIjsKKworICAgIHByaW50ICI8cmVmc3lub3BzaXNkaXY+XG4iOworICAgIHByaW50ICIgPHRpdGxlPlN5bm9wc2lzPC90aXRsZT5cbiI7CisgICAgcHJpbnQgIiAgPHByb2dyYW1saXN0aW5nPlxuIjsKKyAgICBwcmludCAiZW51bSAiLiRhcmdzeydlbnVtJ30uIiB7XG4iOworICAgICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisgICAgICAgIHByaW50ICIgICRwYXJhbWV0ZXIiOworICAgICAgICBpZiAoJGNvdW50ICE9ICQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICRjb3VudCsrOworCSAgICBwcmludCAiLCI7CisgICAgICAgIH0KKwlwcmludCAiXG4iOworICAgIH0KKyAgICBwcmludCAifTsiOworICAgIHByaW50ICIgIDwvcHJvZ3JhbWxpc3Rpbmc+XG4iOworICAgIHByaW50ICI8L3JlZnN5bm9wc2lzZGl2PlxuIjsKKworICAgIHByaW50ICI8cmVmc2VjdDE+XG4iOworICAgIHByaW50ICIgPHRpdGxlPkNvbnN0YW50czwvdGl0bGU+XG4iOyAgICAKKyAgICBwcmludCAiICA8dmFyaWFibGVsaXN0PlxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKyAgICAgIG15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisgICAgICAkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKyAgICAgIHByaW50ICIgICAgPHZhcmxpc3RlbnRyeT4iOworICAgICAgcHJpbnQgIiAgICAgIDx0ZXJtPiRwYXJhbWV0ZXI8L3Rlcm0+XG4iOworICAgICAgcHJpbnQgIiAgICAgIDxsaXN0aXRlbT48cGFyYT5cbiI7CisgICAgICBvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOworICAgICAgcHJpbnQgIiAgICAgIDwvcGFyYT48L2xpc3RpdGVtPlxuIjsKKyAgICAgIHByaW50ICIgICAgPC92YXJsaXN0ZW50cnk+XG4iOworICAgIH0KKyAgICBwcmludCAiICA8L3ZhcmlhYmxlbGlzdD5cbiI7CisgICAgcHJpbnQgIjwvcmVmc2VjdDE+XG4iOworCisgICAgb3V0cHV0X3NlY3Rpb25feG1sKEBfKTsKKworICAgIHByaW50ICI8L3JlZmVudHJ5PlxuXG4iOworfQorCisjIG91dHB1dCB0eXBlZGVmIGluIFhNTCBEb2NCb29rCitzdWIgb3V0cHV0X3R5cGVkZWZfeG1sKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGlkOworCisgICAgJGlkID0gIkFQSS10eXBlZGVmLSIuJGFyZ3N7J3R5cGVkZWYnfTsKKyAgICAkaWQgPX4gcy9bXkEtWmEtejAtOV0vLS9nOworCisgICAgcHJpbnQgIjxyZWZlbnRyeT5cbiI7CisgICAgcHJpbnQgIjxyZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZmVudHJ5dGl0bGU+PHBocmFzZSBpZD1cIiRpZFwiPnR5cGVkZWYgIi4kYXJnc3sndHlwZWRlZid9LiI8L3BocmFzZT48L3JlZmVudHJ5dGl0bGU+XG4iOworICAgIHByaW50ICI8L3JlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmbmFtZWRpdj5cbiI7CisgICAgcHJpbnQgIiA8cmVmbmFtZT50eXBlZGVmICIuJGFyZ3N7J3R5cGVkZWYnfS4iPC9yZWZuYW1lPlxuIjsKKyAgICBwcmludCAiIDxyZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiICAiOworICAgIG91dHB1dF9oaWdobGlnaHQgKCRhcmdzeydwdXJwb3NlJ30pOworICAgIHByaW50ICIgPC9yZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiPC9yZWZuYW1lZGl2PlxuIjsKKworICAgIHByaW50ICI8cmVmc3lub3BzaXNkaXY+XG4iOworICAgIHByaW50ICIgPHRpdGxlPlN5bm9wc2lzPC90aXRsZT5cbiI7CisgICAgcHJpbnQgIiAgPHN5bm9wc2lzPnR5cGVkZWYgIi4kYXJnc3sndHlwZWRlZid9LiI7PC9zeW5vcHNpcz5cbiI7CisgICAgcHJpbnQgIjwvcmVmc3lub3BzaXNkaXY+XG4iOworCisgICAgb3V0cHV0X3NlY3Rpb25feG1sKEBfKTsKKworICAgIHByaW50ICI8L3JlZmVudHJ5PlxuXG4iOworfQorCisjIG91dHB1dCBpbiBYTUwgRG9jQm9vaworc3ViIG91dHB1dF9pbnRyb194bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisKKyAgICBteSAkaWQgPSAkYXJnc3snbW9kdWxlJ307CisgICAgJGlkID1+IHMvW15BLVphLXowLTldLy0vZzsKKworICAgICMgcHJpbnQgb3V0IGVhY2ggc2VjdGlvbgorICAgICRsaW5lcHJlZml4PSIgICAiOworICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIjxyZWZzZWN0MT5cbiA8dGl0bGU+JHNlY3Rpb248L3RpdGxlPlxuIDxwYXJhPlxuIjsKKwlpZiAoJHNlY3Rpb24gPX4gbS9FWEFNUExFL2kpIHsKKwkgICAgcHJpbnQgIjxleGFtcGxlPjxwYXJhPlxuIjsKKwl9CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworCWlmICgkc2VjdGlvbiA9fiBtL0VYQU1QTEUvaSkgeworCSAgICBwcmludCAiPC9wYXJhPjwvZXhhbXBsZT5cbiI7CisJfQorCXByaW50ICIgPC9wYXJhPlxuPC9yZWZzZWN0MT5cbiI7CisgICAgfQorCisgICAgcHJpbnQgIlxuXG4iOworfQorCisjIG91dHB1dCBpbiBYTUwgRG9jQm9vaworc3ViIG91dHB1dF9mdW5jdGlvbl9nbm9tZSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRjb3VudDsKKyAgICBteSAkaWQ7CisKKyAgICAkaWQgPSAkYXJnc3snbW9kdWxlJ30uIi0iLiRhcmdzeydmdW5jdGlvbid9OworICAgICRpZCA9fiBzL1teQS1aYS16MC05XS8tL2c7CisKKyAgICBwcmludCAiPHNlY3QyPlxuIjsKKyAgICBwcmludCAiIDx0aXRsZSBpZD1cIiRpZFwiPiIuJGFyZ3N7J2Z1bmN0aW9uJ30uIjwvdGl0bGU+XG4iOworCisgICAgcHJpbnQgIiAgPGZ1bmNzeW5vcHNpcz5cbiI7CisgICAgcHJpbnQgIiAgIDxmdW5jZGVmPiIuJGFyZ3N7J2Z1bmN0aW9udHlwZSd9LiIgIjsKKyAgICBwcmludCAiPGZ1bmN0aW9uPiIuJGFyZ3N7J2Z1bmN0aW9uJ30uIiAiOworICAgIHByaW50ICI8L2Z1bmN0aW9uPjwvZnVuY2RlZj5cbiI7CisKKyAgICAkY291bnQgPSAwOworICAgIGlmICgkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSA+PSAwKSB7CisJZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJICAgIGlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCQkjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkJcHJpbnQgIiAgIDxwYXJhbWRlZj4kMSA8cGFyYW1ldGVyPiRwYXJhbWV0ZXI8L3BhcmFtZXRlcj4pXG4iOworCQlwcmludCAiICAgICA8ZnVuY3BhcmFtcz4kMjwvZnVuY3BhcmFtcz48L3BhcmFtZGVmPlxuIjsKKwkgICAgfSBlbHNlIHsKKwkJcHJpbnQgIiAgIDxwYXJhbWRlZj4iLiR0eXBlOworCQlwcmludCAiIDxwYXJhbWV0ZXI+JHBhcmFtZXRlcjwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+XG4iOworCSAgICB9CisJfQorICAgIH0gZWxzZSB7CisJcHJpbnQgIiAgPHZvaWQ+XG4iOworICAgIH0KKyAgICBwcmludCAiICA8L2Z1bmNzeW5vcHNpcz5cbiI7CisgICAgaWYgKCQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319ID49IDApIHsKKwlwcmludCAiIDxpbmZvcm1hbHRhYmxlIHBnd2lkZT1cIjFcIiBmcmFtZT1cIm5vbmVcIiByb2xlPVwicGFyYW1zXCI+XG4iOworCXByaW50ICI8dGdyb3VwIGNvbHM9XCIyXCI+XG4iOworCXByaW50ICI8Y29sc3BlYyBjb2x3aWR0aD1cIjIqXCI+XG4iOworCXByaW50ICI8Y29sc3BlYyBjb2x3aWR0aD1cIjgqXCI+XG4iOworCXByaW50ICI8dGJvZHk+XG4iOworCWZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICBteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSAgICAkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKwkgICAgcHJpbnQgIiAgPHJvdz48ZW50cnkgYWxpZ249XCJyaWdodFwiPjxwYXJhbWV0ZXI+JHBhcmFtZXRlcjwvcGFyYW1ldGVyPjwvZW50cnk+XG4iOworCSAgICBwcmludCAiICAgPGVudHJ5PlxuIjsKKwkgICAgJGxpbmVwcmVmaXg9IiAgICAgIjsKKwkgICAgb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKwkgICAgcHJpbnQgIiAgICA8L2VudHJ5Pjwvcm93PlxuIjsKKwl9CisJcHJpbnQgIiA8L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT5cbiI7CisgICAgfSBlbHNlIHsKKwlwcmludCAiIDxwYXJhPlxuICBOb25lXG4gPC9wYXJhPlxuIjsKKyAgICB9CisKKyAgICAjIHByaW50IG91dCBlYWNoIHNlY3Rpb24KKyAgICAkbGluZXByZWZpeD0iICAgIjsKKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICI8c2ltcGxlc2VjdD5cbiA8dGl0bGU+JHNlY3Rpb248L3RpdGxlPlxuIjsKKwlpZiAoJHNlY3Rpb24gPX4gbS9FWEFNUExFL2kpIHsKKwkgICAgcHJpbnQgIjxleGFtcGxlPjxwcm9ncmFtbGlzdGluZz5cbiI7CisJfSBlbHNlIHsKKwl9CisJcHJpbnQgIjxwYXJhPlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisJcHJpbnQgIjwvcGFyYT5cbiI7CisJaWYgKCRzZWN0aW9uID1+IG0vRVhBTVBMRS9pKSB7CisJICAgIHByaW50ICI8L3Byb2dyYW1saXN0aW5nPjwvZXhhbXBsZT5cbiI7CisJfSBlbHNlIHsKKwl9CisJcHJpbnQgIiA8L3NpbXBsZXNlY3Q+XG4iOworICAgIH0KKworICAgIHByaW50ICI8L3NlY3QyPlxuXG4iOworfQorCisjIworIyBvdXRwdXQgZnVuY3Rpb24gaW4gbWFuCitzdWIgb3V0cHV0X2Z1bmN0aW9uX21hbiglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRjb3VudDsKKworICAgIHByaW50ICIuVEggXCIkYXJnc3snZnVuY3Rpb24nfVwiIDkgXCIkYXJnc3snZnVuY3Rpb24nfVwiIFwiJG1hbl9kYXRlXCIgXCJLZXJuZWwgSGFja2VyJ3MgTWFudWFsXCIgTElOVVhcbiI7CisKKyAgICBwcmludCAiLlNIIE5BTUVcbiI7CisgICAgcHJpbnQgJGFyZ3N7J2Z1bmN0aW9uJ30uIiBcXC0gIi4kYXJnc3sncHVycG9zZSd9LiJcbiI7CisKKyAgICBwcmludCAiLlNIIFNZTk9QU0lTXG4iOworICAgIHByaW50ICIuQiBcIiIuJGFyZ3N7J2Z1bmN0aW9udHlwZSd9LiJcIiAiLiRhcmdzeydmdW5jdGlvbid9LiJcbiI7CisgICAgJGNvdW50ID0gMDsKKyAgICBteSAkcGFyZW50aCA9ICIoIjsKKyAgICBteSAkcG9zdCA9ICIsIjsKKyAgICBmb3JlYWNoIG15ICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlpZiAoJGNvdW50ID09ICQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICRwb3N0ID0gIik7IjsKKwl9CisJJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJICAgIHByaW50ICIuQkkgXCIiLiRwYXJlbnRoLiQxLiJcIiAiLiRwYXJhbWV0ZXIuIiBcIikgKCIuJDIuIikiLiRwb3N0LiJcIlxuIjsKKwl9IGVsc2UgeworCSAgICAkdHlwZSA9fiBzLyhbXlwqXSkkLyQxIC87CisJICAgIHByaW50ICIuQkkgXCIiLiRwYXJlbnRoLiR0eXBlLiJcIiAiLiRwYXJhbWV0ZXIuIiBcIiIuJHBvc3QuIlwiXG4iOworCX0KKwkkY291bnQrKzsKKwkkcGFyZW50aCA9ICIiOworICAgIH0KKworICAgIHByaW50ICIuU0ggQVJHVU1FTlRTXG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisJcHJpbnQgIi5JUCBcIiIuJHBhcmFtZXRlci4iXCIgMTJcbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICB9CisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiLlNIIFwiIiwgdWMgJHNlY3Rpb24sICJcIlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisgICAgfQorfQorCisjIworIyBvdXRwdXQgZW51bSBpbiBtYW4KK3N1YiBvdXRwdXRfZW51bV9tYW4oJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisKKyAgICBwcmludCAiLlRIIFwiJGFyZ3N7J21vZHVsZSd9XCIgOSBcImVudW0gJGFyZ3N7J2VudW0nfVwiIFwiJG1hbl9kYXRlXCIgXCJBUEkgTWFudWFsXCIgTElOVVhcbiI7CisKKyAgICBwcmludCAiLlNIIE5BTUVcbiI7CisgICAgcHJpbnQgImVudW0gIi4kYXJnc3snZW51bSd9LiIgXFwtICIuJGFyZ3N7J3B1cnBvc2UnfS4iXG4iOworCisgICAgcHJpbnQgIi5TSCBTWU5PUFNJU1xuIjsKKyAgICBwcmludCAiZW51bSAiLiRhcmdzeydlbnVtJ30uIiB7XG4iOworICAgICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCBteSAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisgICAgICAgIHByaW50ICIuYnJcbi5CSSBcIiAgICAkcGFyYW1ldGVyXCJcbiI7CisJaWYgKCRjb3VudCA9PSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICBwcmludCAiXG59O1xuIjsKKwkgICAgbGFzdDsKKwl9CisJZWxzZSB7CisJICAgIHByaW50ICIsIFxuLmJyXG4iOworCX0KKwkkY291bnQrKzsKKyAgICB9CisKKyAgICBwcmludCAiLlNIIENvbnN0YW50c1xuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworCXByaW50ICIuSVAgXCIiLiRwYXJhbWV0ZXIuIlwiIDEyXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisgICAgfQorICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIi5TSCBcIiRzZWN0aW9uXCJcbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworICAgIH0KK30KKworIyMKKyMgb3V0cHV0IHN0cnVjdCBpbiBtYW4KK3N1YiBvdXRwdXRfc3RydWN0X21hbiglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworCisgICAgcHJpbnQgIi5USCBcIiRhcmdzeydtb2R1bGUnfVwiIDkgXCIiLiRhcmdzeyd0eXBlJ30uIiAiLiRhcmdzeydzdHJ1Y3QnfS4iXCIgXCIkbWFuX2RhdGVcIiBcIkFQSSBNYW51YWxcIiBMSU5VWFxuIjsKKworICAgIHByaW50ICIuU0ggTkFNRVxuIjsKKyAgICBwcmludCAkYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIiBcXC0gIi4kYXJnc3sncHVycG9zZSd9LiJcbiI7CisKKyAgICBwcmludCAiLlNIIFNZTk9QU0lTXG4iOworICAgIHByaW50ICRhcmdzeyd0eXBlJ30uIiAiLiRhcmdzeydzdHJ1Y3QnfS4iIHtcbi5iclxuIjsKKworICAgIGZvcmVhY2ggbXkgJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCWlmICgkcGFyYW1ldGVyID1+IC9eIy8pIHsKKwkgICAgcHJpbnQgIi5CSSBcIiRwYXJhbWV0ZXJcIlxuLmJyXG4iOworCSAgICBuZXh0OworCX0KKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisJJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJICAgIHByaW50ICIuQkkgXCIgICAgIi4kMS4iXCIgIi4kcGFyYW1ldGVyLiIgXCIpICgiLiQyLiIpIi4iXCJcbjtcbiI7CisJfSBlbHNpZiAoJHR5cGUgPX4gbS9eKC4qPylccyooOi4qKS8pIHsKKwkgICAgcHJpbnQgIi5CSSBcIiAgICAiLiQxLiJcIiAiLiRwYXJhbWV0ZXIuJDIuIiBcIiIuIlwiXG47XG4iOworCX0gZWxzZSB7CisJICAgICR0eXBlID1+IHMvKFteXCpdKSQvJDEgLzsKKwkgICAgcHJpbnQgIi5CSSBcIiAgICAiLiR0eXBlLiJcIiAiLiRwYXJhbWV0ZXIuIiBcIiIuIlwiXG47XG4iOworCX0KKwlwcmludCAiXG4uYnJcbiI7CisgICAgfQorICAgIHByaW50ICJ9O1xuLmJyXG4iOworCisgICAgcHJpbnQgIi5TSCBBcmd1bWVudHNcbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJKCRwYXJhbWV0ZXIgPX4gL14jLykgJiYgbmV4dDsKKworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwlwcmludCAiLklQIFwiIi4kcGFyYW1ldGVyLiJcIiAxMlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOworICAgIH0KKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICIuU0ggXCIkc2VjdGlvblwiXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKyAgICB9Cit9CisKKyMjCisjIG91dHB1dCB0eXBlZGVmIGluIG1hbgorc3ViIG91dHB1dF90eXBlZGVmX21hbiglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworCisgICAgcHJpbnQgIi5USCBcIiRhcmdzeydtb2R1bGUnfVwiIDkgXCIkYXJnc3sndHlwZWRlZid9XCIgXCIkbWFuX2RhdGVcIiBcIkFQSSBNYW51YWxcIiBMSU5VWFxuIjsKKworICAgIHByaW50ICIuU0ggTkFNRVxuIjsKKyAgICBwcmludCAidHlwZWRlZiAiLiRhcmdzeyd0eXBlZGVmJ30uIiBcXC0gIi4kYXJnc3sncHVycG9zZSd9LiJcbiI7CisKKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICIuU0ggXCIkc2VjdGlvblwiXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKyAgICB9Cit9CisKK3N1YiBvdXRwdXRfaW50cm9fbWFuKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGNvdW50OworCisgICAgcHJpbnQgIi5USCBcIiRhcmdzeydtb2R1bGUnfVwiIDkgXCIkYXJnc3snbW9kdWxlJ31cIiBcIiRtYW5fZGF0ZVwiIFwiQVBJIE1hbnVhbFwiIExJTlVYXG4iOworCisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiLlNIIFwiJHNlY3Rpb25cIlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisgICAgfQorfQorCisjIworIyBvdXRwdXQgaW4gdGV4dAorc3ViIG91dHB1dF9mdW5jdGlvbl90ZXh0KCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisKKyAgICBwcmludCAiRnVuY3Rpb246XG5cbiI7CisgICAgbXkgJHN0YXJ0PSRhcmdzeydmdW5jdGlvbnR5cGUnfS4iICIuJGFyZ3N7J2Z1bmN0aW9uJ30uIiAoIjsKKyAgICBwcmludCAkc3RhcnQ7CisgICAgbXkgJGNvdW50ID0gMDsKKyAgICBmb3JlYWNoIG15ICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OworCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkgICAgcHJpbnQgJDEuJHBhcmFtZXRlci4iKSAoIi4kMjsKKwl9IGVsc2UgeworCSAgICBwcmludCAkdHlwZS4iICIuJHBhcmFtZXRlcjsKKwl9CisJaWYgKCRjb3VudCAhPSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkY291bnQrKzsKKwkgICAgcHJpbnQgIixcbiI7CisJICAgIHByaW50ICIgIiB4IGxlbmd0aCgkc3RhcnQpOworCX0gZWxzZSB7CisJICAgIHByaW50ICIpO1xuXG4iOworCX0KKyAgICB9CisKKyAgICBwcmludCAiQXJndW1lbnRzOlxuXG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisJcHJpbnQgJHBhcmFtZXRlci4iXG5cdCIuJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfS4iXG4iOworICAgIH0KKyAgICBvdXRwdXRfc2VjdGlvbl90ZXh0KEBfKTsKK30KKworI291dHB1dCBzZWN0aW9ucyBpbiB0ZXh0CitzdWIgb3V0cHV0X3NlY3Rpb25fdGV4dCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAkc2VjdGlvbjsKKworICAgIHByaW50ICJcbiI7CisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiJHNlY3Rpb246XG5cbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworICAgIH0gIAorICAgIHByaW50ICJcblxuIjsKK30KKworIyBvdXRwdXQgZW51bSBpbiB0ZXh0CitzdWIgb3V0cHV0X2VudW1fdGV4dCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlcik7CisgICAgbXkgJGNvdW50OworICAgIHByaW50ICJFbnVtOlxuXG4iOworCisgICAgcHJpbnQgImVudW0gIi4kYXJnc3snZW51bSd9LiIge1xuIjsKKyAgICAkY291bnQgPSAwOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworICAgICAgICBwcmludCAiXHQkcGFyYW1ldGVyIjsKKwlpZiAoJGNvdW50ICE9ICQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICRjb3VudCsrOworCSAgICBwcmludCAiLCI7CisJfQorCXByaW50ICJcbiI7CisgICAgfQorICAgIHByaW50ICJ9O1xuXG4iOworCisgICAgcHJpbnQgIkNvbnN0YW50czpcblxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlwcmludCAiJHBhcmFtZXRlclxuXHQiOworCXByaW50ICRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJ9LiJcbiI7CisgICAgfQorCisgICAgb3V0cHV0X3NlY3Rpb25fdGV4dChAXyk7Cit9CisKKyMgb3V0cHV0IHR5cGVkZWYgaW4gdGV4dAorc3ViIG91dHB1dF90eXBlZGVmX3RleHQoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworICAgIG15ICRjb3VudDsKKyAgICBwcmludCAiVHlwZWRlZjpcblxuIjsKKworICAgIHByaW50ICJ0eXBlZGVmICIuJGFyZ3N7J3R5cGVkZWYnfS4iXG4iOworICAgIG91dHB1dF9zZWN0aW9uX3RleHQoQF8pOworfQorCisjIG91dHB1dCBzdHJ1Y3QgYXMgdGV4dAorc3ViIG91dHB1dF9zdHJ1Y3RfdGV4dCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlcik7CisKKyAgICBwcmludCAkYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIjpcblxuIjsKKyAgICBwcmludCAkYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIiB7XG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCWlmICgkcGFyYW1ldGVyID1+IC9eIy8pIHsKKwkgICAgcHJpbnQgIiRwYXJhbWV0ZXJcbiI7CisJICAgIG5leHQ7CisJfQorCisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKyAgICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICBwcmludCAiXHQkMSAkcGFyYW1ldGVyKSAoJDIpO1xuIjsKKwl9IGVsc2lmICgkdHlwZSA9fiBtL14oLio/KVxzKig6LiopLykgeworCSAgICBwcmludCAiXHQkMSAkcGFyYW1ldGVyJDI7XG4iOworCX0gZWxzZSB7CisJICAgIHByaW50ICJcdCIuJHR5cGUuIiAiLiRwYXJhbWV0ZXIuIjtcbiI7CisJfQorICAgIH0KKyAgICBwcmludCAifTtcblxuIjsKKworICAgIHByaW50ICJNZW1iZXJzOlxuXG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSgkcGFyYW1ldGVyID1+IC9eIy8pICYmIG5leHQ7CisKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisJcHJpbnQgIiRwYXJhbWV0ZXJcblx0IjsKKwlwcmludCAkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9LiJcbiI7CisgICAgfQorICAgIHByaW50ICJcbiI7CisgICAgb3V0cHV0X3NlY3Rpb25fdGV4dChAXyk7Cit9CisKK3N1YiBvdXRwdXRfaW50cm9fdGV4dCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworCisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiICRzZWN0aW9uOlxuIjsKKwlwcmludCAiICAgIC0+ICI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworICAgIH0KK30KKworIyMKKyMgZ2VuZXJpYyBvdXRwdXQgZnVuY3Rpb24gZm9yIHR5cGVkZWZzCitzdWIgb3V0cHV0X2RlY2xhcmF0aW9uIHsKKyAgICBubyBzdHJpY3QgJ3JlZnMnOworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgbXkgJGZ1bmN0eXBlID0gc2hpZnQ7CisgICAgbXkgJGZ1bmMgPSAib3V0cHV0XyR7ZnVuY3R5cGV9XyRvdXRwdXRfbW9kZSI7CisgICAgaWYgKCgkZnVuY3Rpb25fb25seT09MCkgfHwgCisJKCAkZnVuY3Rpb25fb25seSA9PSAxICYmIGRlZmluZWQoJGZ1bmN0aW9uX3RhYmxleyRuYW1lfSkpIHx8IAorCSggJGZ1bmN0aW9uX29ubHkgPT0gMiAmJiAhZGVmaW5lZCgkZnVuY3Rpb25fdGFibGV7JG5hbWV9KSkpCisgICAgeworICAgICAgICAmJGZ1bmMoQF8pOworCSRzZWN0aW9uX2NvdW50ZXIrKzsKKyAgICB9Cit9CisKKyMjCisjIGdlbmVyaWMgb3V0cHV0IGZ1bmN0aW9uIC0gY2FsbHMgdGhlIHJpZ2h0IG9uZSBiYXNlZAorIyBvbiBjdXJyZW50IG91dHB1dCBtb2RlLgorc3ViIG91dHB1dF9pbnRybyB7CisgICAgbm8gc3RyaWN0ICdyZWZzJzsKKyAgICBteSAkZnVuYyA9ICJvdXRwdXRfaW50cm9fIi4kb3V0cHV0X21vZGU7CisgICAgJiRmdW5jKEBfKTsKKyAgICAkc2VjdGlvbl9jb3VudGVyKys7Cit9CisKKyMjCisjIHRha2VzIGEgZGVjbGFyYXRpb24gKHN0cnVjdCwgdW5pb24sIGVudW0sIHR5cGVkZWYpIGFuZCAKKyMgaW52b2tlcyB0aGUgcmlnaHQgaGFuZGxlci4gTk9UIGNhbGxlZCBmb3IgZnVuY3Rpb25zLgorc3ViIGR1bXBfZGVjbGFyYXRpb24oJCQpIHsKKyAgICBubyBzdHJpY3QgJ3JlZnMnOworICAgIG15ICgkcHJvdG90eXBlLCAkZmlsZSkgPSBAXzsKKyAgICBteSAkZnVuYyA9ICJkdW1wXyIuJGRlY2xfdHlwZTsKKyAgICAmJGZ1bmMoQF8pOworfQorCitzdWIgZHVtcF91bmlvbigkJCkgeworICAgIGR1bXBfc3RydWN0KEBfKTsKK30KKworc3ViIGR1bXBfc3RydWN0KCQkKSB7CisgICAgbXkgJHggPSBzaGlmdDsKKyAgICBteSAkZmlsZSA9IHNoaWZ0OworCisgICAgaWYgKCR4ID1+LyhzdHJ1Y3R8dW5pb24pXHMrKFx3Kylccyp7KC4qKX0vKSB7CisgICAgICAgICRkZWNsYXJhdGlvbl9uYW1lID0gJDI7CisgICAgICAgIG15ICRtZW1iZXJzID0gJDM7CisKKwkjIGlnbm9yZSBlbWJlZGRlZCBzdHJ1Y3RzIG9yIHVuaW9ucworCSRtZW1iZXJzID1+IHMvey4qP30vL2c7CisKKwljcmVhdGVfcGFyYW1ldGVybGlzdCgkbWVtYmVycywgJzsnLCAkZmlsZSk7CisKKwlvdXRwdXRfZGVjbGFyYXRpb24oJGRlY2xhcmF0aW9uX25hbWUsCisJCQkgICAnc3RydWN0JywKKwkJCSAgIHsnc3RydWN0JyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICAnbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKKwkJCSAgICAncGFyYW1ldGVybGlzdCcgPT4gXEBwYXJhbWV0ZXJsaXN0LAorCQkJICAgICdwYXJhbWV0ZXJkZXNjcycgPT4gXCVwYXJhbWV0ZXJkZXNjcywKKwkJCSAgICAncGFyYW1ldGVydHlwZXMnID0+IFwlcGFyYW1ldGVydHlwZXMsCisJCQkgICAgJ3NlY3Rpb25saXN0JyA9PiBcQHNlY3Rpb25saXN0LAorCQkJICAgICdzZWN0aW9ucycgPT4gXCVzZWN0aW9ucywKKwkJCSAgICAncHVycG9zZScgPT4gJGRlY2xhcmF0aW9uX3B1cnBvc2UsCisJCQkgICAgJ3R5cGUnID0+ICRkZWNsX3R5cGUKKwkJCSAgIH0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICJFcnJvcigke2ZpbGV9OiQuKTogQ2Fubm90IHBhcnNlIHN0cnVjdCBvciB1bmlvbiFcbiI7CisJKyskZXJyb3JzOworICAgIH0KK30KKworc3ViIGR1bXBfZW51bSgkJCkgeworICAgIG15ICR4ID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKworICAgIGlmICgkeCA9fiAvZW51bVxzKyhcdyspXHMqeyguKil9LykgeworICAgICAgICAkZGVjbGFyYXRpb25fbmFtZSA9ICQxOworICAgICAgICBteSAkbWVtYmVycyA9ICQyOworCisJZm9yZWFjaCBteSAkYXJnIChzcGxpdCAnLCcsICRtZW1iZXJzKSB7CisJICAgICRhcmcgPX4gcy9eXHMqKFx3KykuKi8kMS87CisJICAgIHB1c2ggQHBhcmFtZXRlcmxpc3QsICRhcmc7CisJICAgIGlmICghJHBhcmFtZXRlcmRlc2NzeyRhcmd9KSB7CisJICAgICAgICAkcGFyYW1ldGVyZGVzY3N7JGFyZ30gPSAkdW5kZXNjcmliZWQ7CisJICAgICAgICBwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6IEVudW0gdmFsdWUgJyRhcmcnICIuCisJCSAgICAibm90IGRlc2NyaWJlZCBpbiBlbnVtICckZGVjbGFyYXRpb25fbmFtZSdcbiI7CisJICAgIH0KKworCX0KKwkKKwlvdXRwdXRfZGVjbGFyYXRpb24oJGRlY2xhcmF0aW9uX25hbWUsCisJCQkgICAnZW51bScsCisJCQkgICB7J2VudW0nID0+ICRkZWNsYXJhdGlvbl9uYW1lLAorCQkJICAgICdtb2R1bGUnID0+ICRtb2R1bGVuYW1lLAorCQkJICAgICdwYXJhbWV0ZXJsaXN0JyA9PiBcQHBhcmFtZXRlcmxpc3QsCisJCQkgICAgJ3BhcmFtZXRlcmRlc2NzJyA9PiBcJXBhcmFtZXRlcmRlc2NzLAorCQkJICAgICdzZWN0aW9ubGlzdCcgPT4gXEBzZWN0aW9ubGlzdCwKKwkJCSAgICAnc2VjdGlvbnMnID0+IFwlc2VjdGlvbnMsCisJCQkgICAgJ3B1cnBvc2UnID0+ICRkZWNsYXJhdGlvbl9wdXJwb3NlCisJCQkgICB9KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50IFNUREVSUiAiRXJyb3IoJHtmaWxlfTokLik6IENhbm5vdCBwYXJzZSBlbnVtIVxuIjsKKwkrKyRlcnJvcnM7CisgICAgfQorfQorCitzdWIgZHVtcF90eXBlZGVmKCQkKSB7CisgICAgbXkgJHggPSBzaGlmdDsKKyAgICBteSAkZmlsZSA9IHNoaWZ0OworCisgICAgd2hpbGUgKCgkeCA9fiAvXCgqLlwpXHMqOyQvKSB8fCAoJHggPX4gL1xbKi5cXVxzKjskLykpIHsKKyAgICAgICAgJHggPX4gcy9cKCouXClccyo7JC87LzsKKwkkeCA9fiBzL1xbKi5cXVxzKjskLzsvOworICAgIH0KKworICAgIGlmICgkeCA9fiAvdHlwZWRlZi4qXHMrKFx3Kylccyo7LykgeworICAgICAgICAkZGVjbGFyYXRpb25fbmFtZSA9ICQxOworCisJb3V0cHV0X2RlY2xhcmF0aW9uKCRkZWNsYXJhdGlvbl9uYW1lLAorCQkJICAgJ3R5cGVkZWYnLAorCQkJICAgeyd0eXBlZGVmJyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICAnbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKKwkJCSAgICAnc2VjdGlvbmxpc3QnID0+IFxAc2VjdGlvbmxpc3QsCisJCQkgICAgJ3NlY3Rpb25zJyA9PiBcJXNlY3Rpb25zLAorCQkJICAgICdwdXJwb3NlJyA9PiAkZGVjbGFyYXRpb25fcHVycG9zZQorCQkJICAgfSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCBTVERFUlIgIkVycm9yKCR7ZmlsZX06JC4pOiBDYW5ub3QgcGFyc2UgdHlwZWRlZiFcbiI7CisJKyskZXJyb3JzOworICAgIH0KK30KKworc3ViIGNyZWF0ZV9wYXJhbWV0ZXJsaXN0KCQkJCkgeworICAgIG15ICRhcmdzID0gc2hpZnQ7CisgICAgbXkgJHNwbGl0dGVyID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKyAgICBteSAkdHlwZTsKKyAgICBteSAkcGFyYW07CisKKyAgICB3aGlsZSAoJGFyZ3MgPX4gLyhcKFteXCksXSspLC8pIHsKKyAgICAgICAgJGFyZ3MgPX4gcy8oXChbXlwpLF0rKSwvJDEjL2c7CisgICAgfQorICAgIAorICAgIGZvcmVhY2ggbXkgJGFyZyAoc3BsaXQoJHNwbGl0dGVyLCAkYXJncykpIHsKKwkjIHN0cmlwIGNvbW1lbnRzCisJJGFyZyA9fiBzL1wvXCouKlwqXC8vLzsKKyAgICAgICAgIyBzdHJpcCBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcworICAgICAgICAkYXJnID1+IHMvXlxzKi8vOworCSRhcmcgPX4gcy9ccyokLy87CisJJGFyZyA9fiBzL1xzKy8gLzsKKworCWlmICgkYXJnID1+IC9eIy8pIHsKKwkgICAgIyBUcmVhdCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGFzIGEgdHlwZWxlc3MgdmFyaWFibGUganVzdCB0byBmaWxsCisJICAgICMgY29ycmVzcG9uZGluZyBkYXRhIHN0cnVjdHVyZXMgImNvcnJlY3RseSIuIENhdGNoIGl0IGxhdGVyIGluCisJICAgICMgb3V0cHV0Xyogc3Vicy4KKwkgICAgcHVzaF9wYXJhbWV0ZXIoJGFyZywgIiIsICRmaWxlKTsKKwl9IGVsc2lmICgkYXJnID1+IG0vXCgvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICAkYXJnID1+IHRyLyMvLC87CisJICAgICRhcmcgPX4gbS9bXlwoXStcKFwqKFteXCldKylcKS87CisJICAgICRwYXJhbSA9ICQxOworCSAgICAkdHlwZSA9ICRhcmc7CisJICAgICR0eXBlID1+IHMvKFteXChdK1woXCopJHBhcmFtLyQxLzsKKwkgICAgcHVzaF9wYXJhbWV0ZXIoJHBhcmFtLCAkdHlwZSwgJGZpbGUpOworCX0gZWxzZSB7CisJICAgICRhcmcgPX4gcy9ccyo6XHMqLzovZzsKKwkgICAgJGFyZyA9fiBzL1xzKlxbL1xbL2c7CisKKwkgICAgbXkgQGFyZ3MgPSBzcGxpdCgnXHMqLFxzKicsICRhcmcpOworCSAgICBpZiAoJGFyZ3NbMF0gPX4gbS9cKi8pIHsKKwkJJGFyZ3NbMF0gPX4gcy8oXCorKVxzKi8gJDEvOworCSAgICB9CisJICAgIG15IEBmaXJzdF9hcmcgPSBzcGxpdCgnXHMrJywgc2hpZnQgQGFyZ3MpOworCSAgICB1bnNoaWZ0KEBhcmdzLCBwb3AgQGZpcnN0X2FyZyk7CisJICAgICR0eXBlID0gam9pbiAiICIsIEBmaXJzdF9hcmc7CisKKwkgICAgZm9yZWFjaCAkcGFyYW0gKEBhcmdzKSB7CisJCWlmICgkcGFyYW0gPX4gbS9eKFwqKylccyooLiopLykgeworCQkgICAgcHVzaF9wYXJhbWV0ZXIoJDIsICIkdHlwZSAkMSIsICRmaWxlKTsKKwkJfQorCQllbHNpZiAoJHBhcmFtID1+IG0vKC4qPyk6KFxkKykvKSB7CisJCSAgICBwdXNoX3BhcmFtZXRlcigkMSwgIiR0eXBlOiQyIiwgJGZpbGUpCisJCX0KKwkJZWxzZSB7CisJCSAgICBwdXNoX3BhcmFtZXRlcigkcGFyYW0sICR0eXBlLCAkZmlsZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9Cit9CisKK3N1YiBwdXNoX3BhcmFtZXRlcigkJCQpIHsKKwlteSAkcGFyYW0gPSBzaGlmdDsKKwlteSAkdHlwZSA9IHNoaWZ0OworCW15ICRmaWxlID0gc2hpZnQ7CisKKwlteSAkcGFyYW1fbmFtZSA9ICRwYXJhbTsKKwkkcGFyYW1fbmFtZSA9fiBzL1xbLiovLzsKKworCWlmICgkdHlwZSBlcSAiIiAmJiAkcGFyYW0gZXEgIi4uLiIpCisJeworCSAgICAkdHlwZT0iIjsKKwkgICAgJHBhcmFtPSIuLi4iOworCSAgICAkcGFyYW1ldGVyZGVzY3N7Ii4uLiJ9ID0gInZhcmlhYmxlIGFyZ3VtZW50cyI7CisJfQorCWVsc2lmICgkdHlwZSBlcSAiIiAmJiAoJHBhcmFtIGVxICIiIG9yICRwYXJhbSBlcSAidm9pZCIpKQorCXsKKwkgICAgJHR5cGU9IiI7CisJICAgICRwYXJhbT0idm9pZCI7CisJICAgICRwYXJhbWV0ZXJkZXNjc3t2b2lkfSA9ICJubyBhcmd1bWVudHMiOworCX0KKwlpZiAoZGVmaW5lZCAkdHlwZSAmJiAkdHlwZSAmJiAhZGVmaW5lZCAkcGFyYW1ldGVyZGVzY3N7JHBhcmFtX25hbWV9KSB7CisJICAgICRwYXJhbWV0ZXJkZXNjc3skcGFyYW1fbmFtZX0gPSAkdW5kZXNjcmliZWQ7CisKKwkgICAgaWYgKCgkdHlwZSBlcSAnZnVuY3Rpb24nKSB8fCAoJHR5cGUgZXEgJ2VudW0nKSkgeworCSAgICAgICAgcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBGdW5jdGlvbiBwYXJhbWV0ZXIgIi4KKwkJICAgICJvciBtZW1iZXIgJyRwYXJhbScgbm90ICIgLgorCQkgICAgImRlc2NyaWJlZCBpbiAnJGRlY2xhcmF0aW9uX25hbWUnXG4iOworCSAgICB9CisJICAgIHByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKToiLgorCSAgICAgICAgICAgICAgICAgIiBObyBkZXNjcmlwdGlvbiBmb3VuZCBmb3IgcGFyYW1ldGVyICckcGFyYW0nXG4iOworCSAgICArKyR3YXJuaW5nczsKKyAgICAgICAgfQorCisJcHVzaCBAcGFyYW1ldGVybGlzdCwgJHBhcmFtOworCSRwYXJhbWV0ZXJ0eXBlc3skcGFyYW19ID0gJHR5cGU7Cit9CisKKyMjCisjIHRha2VzIGEgZnVuY3Rpb24gcHJvdG90eXBlIGFuZCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmaWxlIGJlaW5nCisjIHByb2Nlc3NlZCBhbmQgc3BpdHMgb3V0IGFsbCB0aGUgZGV0YWlscyBzdG9yZWQgaW4gdGhlIGdsb2JhbAorIyBhcnJheXMvaGFzaGVzLgorc3ViIGR1bXBfZnVuY3Rpb24oJCQpIHsKKyAgICBteSAkcHJvdG90eXBlID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKworICAgICRwcm90b3R5cGUgPX4gcy9ec3RhdGljICsvLzsKKyAgICAkcHJvdG90eXBlID1+IHMvXmV4dGVybiArLy87CisgICAgJHByb3RvdHlwZSA9fiBzL15pbmxpbmUgKy8vOworICAgICRwcm90b3R5cGUgPX4gcy9eX19pbmxpbmVfXyArLy87CisgICAgJHByb3RvdHlwZSA9fiBzL14jZGVmaW5lICsvLzsgI2FrIGFkZGVkCisgICAgJHByb3RvdHlwZSA9fiBzL19fYXR0cmlidXRlX18gXChcKFthLXosXSpcKVwpLy87CisKKyAgICAjIFllcywgdGhpcyB0cnVseSBpcyB2aWxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yOgorICAgICMgMS4gUmV0dXJuIHR5cGUgKG1heSBiZSBub3RoaW5nIGlmIHdlJ3JlIGxvb2tpbmcgYXQgYSBtYWNybykKKyAgICAjIDIuIEZ1bmN0aW9uIG5hbWUKKyAgICAjIDMuIEZ1bmN0aW9uIHBhcmFtZXRlcnMuCisgICAgIworICAgICMgQWxsIHRoZSB3aGlsZSB3ZSBoYXZlIHRvIHdhdGNoIG91dCBmb3IgZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXJzCisgICAgIyAod2hpY2ggSUlSQyBpcyB3aGF0IHRoZSB0d28gc2VjdGlvbnMgYXJlIGZvciksIEMgdHlwZXMgKHRoZXNlCisgICAgIyByZWdleHBzIGRvbid0IGV2ZW4gc3RhcnQgdG8gZXhwcmVzcyBhbGwgdGhlIHBvc3NpYmlsaXRpZXMpLCBhbmQKKyAgICAjIHNvIG9uLgorICAgICMKKyAgICAjIElmIHlvdSBtZXNzIHdpdGggdGhlc2UgcmVnZXhwcywgaXQncyBhIGdvb2QgaWRlYSB0byBjaGVjayB0aGF0CisgICAgIyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucycgZG9jdW1lbnRhdGlvbiBzdGlsbCBjb21lcyBvdXQgcmlnaHQ6CisgICAgIyAtIHBhcnBvcnRfcmVnaXN0ZXJfZGV2aWNlIChmdW5jdGlvbiBwb2ludGVyIHBhcmFtZXRlcnMpCisgICAgIyAtIGF0b21pY19zZXQgKG1hY3JvKQorICAgICMgLSBwY2lfbWF0Y2hfZGV2aWNlIChsb25nIHJldHVybiB0eXBlKQorCisgICAgaWYgKCRwcm90b3R5cGUgPX4gbS9eKCkoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdyspXHMrKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMqXCopXHMqKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3K1xzK1x3KylccysoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccytcdytccypcKilccyooW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXigpKFthLXpBLVowLTlffjpdKylccypcKChbXlx7XSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15ce10qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15ce10qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3KylccysoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXHtdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccypcKilccyooW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXHtdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccytcdyspXHMrKFthLXpBLVowLTlffjpdKylccypcKChbXlx7XSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrXHMrXHcrXHMqXCopXHMqKFthLXpBLVowLTlffjpdKylccypcKChbXlx7XSopXCkvKSAgeworCSRyZXR1cm5fdHlwZSA9ICQxOworCSRkZWNsYXJhdGlvbl9uYW1lID0gJDI7CisJbXkgJGFyZ3MgPSAkMzsKKworCWNyZWF0ZV9wYXJhbWV0ZXJsaXN0KCRhcmdzLCAnLCcsICRmaWxlKTsKKyAgICB9IGVsc2UgeworCXByaW50IFNUREVSUiAiRXJyb3IoJHtmaWxlfTokLik6IGNhbm5vdCB1bmRlcnN0YW5kIHByb3RvdHlwZTogJyRwcm90b3R5cGUnXG4iOworCSsrJGVycm9yczsKKwlyZXR1cm47CisgICAgfQorCisgICAgb3V0cHV0X2RlY2xhcmF0aW9uKCRkZWNsYXJhdGlvbl9uYW1lLCAKKwkJICAgICAgICdmdW5jdGlvbicsCisJCSAgICAgICB7J2Z1bmN0aW9uJyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSdtb2R1bGUnID0+ICRtb2R1bGVuYW1lLAorCQkJJ2Z1bmN0aW9udHlwZScgPT4gJHJldHVybl90eXBlLAorCQkJJ3BhcmFtZXRlcmxpc3QnID0+IFxAcGFyYW1ldGVybGlzdCwKKwkJCSdwYXJhbWV0ZXJkZXNjcycgPT4gXCVwYXJhbWV0ZXJkZXNjcywKKwkJCSdwYXJhbWV0ZXJ0eXBlcycgPT4gXCVwYXJhbWV0ZXJ0eXBlcywKKwkJCSdzZWN0aW9ubGlzdCcgPT4gXEBzZWN0aW9ubGlzdCwKKwkJCSdzZWN0aW9ucycgPT4gXCVzZWN0aW9ucywKKwkJCSdwdXJwb3NlJyA9PiAkZGVjbGFyYXRpb25fcHVycG9zZQorCQkgICAgICAgfSk7Cit9CisKK3N1YiBwcm9jZXNzX2ZpbGUoJCk7CisKKyMgUmVhZCB0aGUgZmlsZSB0aGF0IG1hcHMgcmVsYXRpdmUgbmFtZXMgdG8gYWJzb2x1dGUgbmFtZXMgZm9yCisjIHNlcGFyYXRlIHNvdXJjZSBhbmQgb2JqZWN0IGRpcmVjdG9yaWVzIGFuZCBmb3Igc2hhZG93IHRyZWVzLgoraWYgKG9wZW4oU09VUkNFX01BUCwgIjwudG1wX2ZpbGVsaXN0LnR4dCIpKSB7CisJbXkgKCRyZWxuYW1lLCAkYWJzbmFtZSk7CisJd2hpbGUoPFNPVVJDRV9NQVA+KSB7CisJCWNob3AoKTsKKwkJKCRyZWxuYW1lLCAkYWJzbmFtZSkgPSAoc3BsaXQoKSlbMC4uMV07CisJCSRyZWxuYW1lID1+IHM6Xi8rOjo7CisJCSRzb3VyY2VfbWFweyRyZWxuYW1lfSA9ICRhYnNuYW1lOworCX0KKwljbG9zZShTT1VSQ0VfTUFQKTsKK30KKworaWYgKCRmaWxlbGlzdCkgeworCW9wZW4oRkxJU1QsIjwkZmlsZWxpc3QiKSBvciBkaWUgIkNhbid0IG9wZW4gZmlsZSBsaXN0ICRmaWxlbGlzdCI7CisJd2hpbGUoPEZMSVNUPikgeworCQljaG9wOworCQlwcm9jZXNzX2ZpbGUoJF8pOworCX0KK30KKworZm9yZWFjaCAoQEFSR1YpIHsKKyAgICBjaG9tcDsKKyAgICBwcm9jZXNzX2ZpbGUoJF8pOworfQoraWYgKCR2ZXJib3NlICYmICRlcnJvcnMpIHsKKyAgcHJpbnQgU1RERVJSICIkZXJyb3JzIGVycm9yc1xuIjsKK30KK2lmICgkdmVyYm9zZSAmJiAkd2FybmluZ3MpIHsKKyAgcHJpbnQgU1RERVJSICIkd2FybmluZ3Mgd2FybmluZ3NcbiI7Cit9CisKK2V4aXQoJGVycm9ycyk7CisKK3N1YiByZXNldF9zdGF0ZSB7CisgICAgJGZ1bmN0aW9uID0gIiI7CisgICAgJWNvbnN0YW50cyA9ICgpOworICAgICVwYXJhbWV0ZXJkZXNjcyA9ICgpOworICAgICVwYXJhbWV0ZXJ0eXBlcyA9ICgpOworICAgIEBwYXJhbWV0ZXJsaXN0ID0gKCk7CisgICAgJXNlY3Rpb25zID0gKCk7CisgICAgQHNlY3Rpb25saXN0ID0gKCk7CisgICAgJHByb3RvdHlwZSA9ICIiOworICAgIAorICAgICRzdGF0ZSA9IDA7Cit9CisKK3N1YiBwcm9jZXNzX3N0YXRlM19mdW5jdGlvbigkJCkgeyAKKyAgICBteSAkeCA9IHNoaWZ0OworICAgIG15ICRmaWxlID0gc2hpZnQ7CisKKyAgICBpZiAoJHggPX4gbSNccyovXCpccytNQUNET0NccyojaW8gfHwgKCR4ID1+IC9eIy8gJiYgJHggIX4gL14jZGVmaW5lLykpIHsKKwkjIGRvIG5vdGhpbmcKKyAgICB9CisgICAgZWxzaWYgKCR4ID1+IC8oW15ce10qKS8pIHsKKyAgICAgICAgJHByb3RvdHlwZSAuPSAkMTsKKyAgICB9CisgICAgaWYgKCgkeCA9fiAvXHsvKSB8fCAoJHggPX4gL1wjZGVmaW5lLykgfHwgKCR4ID1+IC87LykpIHsKKyAgICAgICAgJHByb3RvdHlwZSA9fiBzQC9cKi4qP1wqL0BAZ29zOwkjIHN0cmlwIGNvbW1lbnRzLgorCSRwcm90b3R5cGUgPX4gc0BbXHJcbl0rQCBAZ29zOyAjIHN0cmlwIG5ld2xpbmVzL2NyJ3MuCisJJHByb3RvdHlwZSA9fiBzQF5ccytAQGdvczsgIyBzdHJpcCBsZWFkaW5nIHNwYWNlcworCWR1bXBfZnVuY3Rpb24oJHByb3RvdHlwZSwkZmlsZSk7CisJcmVzZXRfc3RhdGUoKTsKKyAgICB9Cit9CisKK3N1YiBwcm9jZXNzX3N0YXRlM190eXBlKCQkKSB7IAorICAgIG15ICR4ID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKworICAgICR4ID1+IHNAL1wqLio/XCovQEBnb3M7CSMgc3RyaXAgY29tbWVudHMuCisgICAgJHggPX4gc0BbXHJcbl0rQCBAZ29zOyAjIHN0cmlwIG5ld2xpbmVzL2NyJ3MuCisgICAgJHggPX4gc0BeXHMrQEBnb3M7ICMgc3RyaXAgbGVhZGluZyBzcGFjZXMKKyAgICAkeCA9fiBzQFxzKyRAQGdvczsgIyBzdHJpcCB0cmFpbGluZyBzcGFjZXMKKyAgICBpZiAoJHggPX4gL14jLykgeworCSMgVG8gZGlzdGluZ3Vpc2ggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBmcm9tIHJlZ3VsYXIgZGVjbGFyYXRpb24gbGF0ZXIuCisJJHggLj0gIjsiOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICggJHggPX4gLyhbXnt9O10qKShbe307XSkoLiopLyApIHsKKwkgICAgJHByb3RvdHlwZSAuPSAkMSAuICQyOworCSAgICAoJDIgZXEgJ3snKSAmJiAkYnJjb3VudCsrOworCSAgICAoJDIgZXEgJ30nKSAmJiAkYnJjb3VudC0tOworCSAgICBpZiAoKCQyIGVxICc7JykgJiYgKCRicmNvdW50ID09IDApKSB7CisJICAgICAgICBkdW1wX2RlY2xhcmF0aW9uKCRwcm90b3R5cGUsJGZpbGUpOworCQlyZXNldF9zdGF0ZSgpOworCSAgICAgICAgbGFzdDsKKwkgICAgfQorCSAgICAkeCA9ICQzOworICAgICAgICB9IGVsc2UgeworCSAgICAkcHJvdG90eXBlIC49ICR4OworCSAgICBsYXN0OworCX0KKyAgICB9Cit9CisKKyMgcmVwbGFjZSA8LCA+LCBhbmQgJgorc3ViIHhtbF9lc2NhcGUoJCkgeworCW15ICR0ZXh0ID0gc2hpZnQ7CisJJHRleHQgPX4gcy9cJi9cXFxcXFxhbXA7L2c7CisJJHRleHQgPX4gcy9cPC9cXFxcXFxsdDsvZzsKKwkkdGV4dCA9fiBzL1w+L1xcXFxcXGd0Oy9nOworCXJldHVybiAkdGV4dDsKK30KKworc3ViIHByb2Nlc3NfZmlsZSgkKSB7CisgICAgbXkgKCRmaWxlKSA9ICIkRU5WeydTUkNUUkVFJ31AXyI7CisgICAgbXkgJGlkZW50aWZpZXI7CisgICAgbXkgJGZ1bmM7CisgICAgbXkgJGluaXRpYWxfc2VjdGlvbl9jb3VudGVyID0gJHNlY3Rpb25fY291bnRlcjsKKworICAgIGlmIChkZWZpbmVkKCRzb3VyY2VfbWFweyRmaWxlfSkpIHsKKwkkZmlsZSA9ICRzb3VyY2VfbWFweyRmaWxlfTsKKyAgICB9CisKKyAgICBpZiAoIW9wZW4oSU4sIjwkZmlsZSIpKSB7CisJcHJpbnQgU1RERVJSICJFcnJvcjogQ2Fubm90IG9wZW4gZmlsZSAkZmlsZVxuIjsKKwkrKyRlcnJvcnM7CisJcmV0dXJuOworICAgIH0KKworICAgICRzZWN0aW9uX2NvdW50ZXIgPSAwOworICAgIHdoaWxlICg8SU4+KSB7CisJaWYgKCRzdGF0ZSA9PSAwKSB7CisJICAgIGlmICgvJGRvY19zdGFydC9vKSB7CisJCSRzdGF0ZSA9IDE7CQkjIG5leHQgbGluZSBpcyBhbHdheXMgdGhlIGZ1bmN0aW9uIG5hbWUKKwkgICAgfQorCX0gZWxzaWYgKCRzdGF0ZSA9PSAxKSB7CSMgdGhpcyBsaW5lIGlzIHRoZSBmdW5jdGlvbiBuYW1lIChhbHdheXMpCisJICAgIGlmICgvJGRvY19ibG9jay9vKSB7CisJCSRzdGF0ZSA9IDQ7CisJCSRjb250ZW50cyA9ICIiOworCQlpZiAoICQxIGVxICIiICkgeworCQkJJHNlY3Rpb24gPSAkc2VjdGlvbl9pbnRybzsKKwkJfSBlbHNlIHsKKwkJCSRzZWN0aW9uID0gJDE7CisJCX0KKyAgICAgICAgICAgIH0KKwkgICAgZWxzaWYgKC8kZG9jX2RlY2wvbykgeworCQkkaWRlbnRpZmllciA9ICQxOworCQlpZiAoL1xzKihbXHdcc10rPylccyotLykgeworCQkgICAgJGlkZW50aWZpZXIgPSAkMTsKKwkJfQorCisJCSRzdGF0ZSA9IDI7CisJCWlmICgvLSguKikvKSB7CisJCSAgICAkZGVjbGFyYXRpb25fcHVycG9zZSA9IHhtbF9lc2NhcGUoJDEpOworCQl9IGVsc2UgeworCQkgICAgJGRlY2xhcmF0aW9uX3B1cnBvc2UgPSAiIjsKKwkJfQorCQlpZiAoJGlkZW50aWZpZXIgPX4gbS9ec3RydWN0LykgeworCQkgICAgJGRlY2xfdHlwZSA9ICdzdHJ1Y3QnOworCQl9IGVsc2lmICgkaWRlbnRpZmllciA9fiBtL151bmlvbi8pIHsKKwkJICAgICRkZWNsX3R5cGUgPSAndW5pb24nOworCQl9IGVsc2lmICgkaWRlbnRpZmllciA9fiBtL15lbnVtLykgeworCQkgICAgJGRlY2xfdHlwZSA9ICdlbnVtJzsKKwkJfSBlbHNpZiAoJGlkZW50aWZpZXIgPX4gbS9edHlwZWRlZi8pIHsKKwkJICAgICRkZWNsX3R5cGUgPSAndHlwZWRlZic7CisJCX0gZWxzZSB7CisJCSAgICAkZGVjbF90eXBlID0gJ2Z1bmN0aW9uJzsKKwkJfQorCisJCWlmICgkdmVyYm9zZSkgeworCQkgICAgcHJpbnQgU1RERVJSICJJbmZvKCR7ZmlsZX06JC4pOiBTY2FubmluZyBkb2MgZm9yICRpZGVudGlmaWVyXG4iOworCQl9CisJICAgIH0gZWxzZSB7CisJCXByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKTogQ2Fubm90IHVuZGVyc3RhbmQgJF8gb24gbGluZSAkLiIsCisJCSIgLSBJIHRob3VnaHQgaXQgd2FzIGEgZG9jIGxpbmVcbiI7CisJCSsrJHdhcm5pbmdzOworCQkkc3RhdGUgPSAwOworCSAgICB9CisJfSBlbHNpZiAoJHN0YXRlID09IDIpIHsJIyBsb29rIGZvciBoZWFkOiBsaW5lcywgYW5kIGluY2x1ZGUgY29udGVudAorCSAgICBpZiAoLyRkb2Nfc2VjdC9vKSB7CisJCSRuZXdzZWN0aW9uID0gJDE7CisJCSRuZXdjb250ZW50cyA9ICQyOworCisJCWlmICgkY29udGVudHMgbmUgIiIpIHsKKwkJICAgIGR1bXBfc2VjdGlvbigkc2VjdGlvbiwgeG1sX2VzY2FwZSgkY29udGVudHMpKTsKKwkJICAgICRzZWN0aW9uID0gJHNlY3Rpb25fZGVmYXVsdDsKKwkJfQorCisJCSRjb250ZW50cyA9ICRuZXdjb250ZW50czsKKwkJaWYgKCRjb250ZW50cyBuZSAiIikgeworCQkgICAgJGNvbnRlbnRzIC49ICJcbiI7CisJCX0KKwkJJHNlY3Rpb24gPSAkbmV3c2VjdGlvbjsKKwkgICAgfSBlbHNpZiAoLyRkb2NfZW5kLykgeworCisJCWlmICgkY29udGVudHMgbmUgIiIpIHsKKwkJICAgIGR1bXBfc2VjdGlvbigkc2VjdGlvbiwgeG1sX2VzY2FwZSgkY29udGVudHMpKTsKKwkJICAgICRzZWN0aW9uID0gJHNlY3Rpb25fZGVmYXVsdDsKKwkJICAgICRjb250ZW50cyA9ICIiOworCQl9CisKKwkJJHByb3RvdHlwZSA9ICIiOworCQkkc3RhdGUgPSAzOworCQkkYnJjb3VudCA9IDA7CisjCSAgICBwcmludCBTVERFUlIgImVuZCBvZiBkb2MgY29tbWVudCwgbG9va2luZyBmb3IgcHJvdG90eXBlXG4iOworCSAgICB9IGVsc2lmICgvJGRvY19jb250ZW50LykgeworCQkjIG1pZ3VlbC1zdHlsZSBjb21tZW50IGtsdWRnZSwgbG9vayBmb3IgYmxhbmsgbGluZXMgYWZ0ZXIKKwkJIyBAcGFyYW1ldGVyIGxpbmUgdG8gc2lnbmlmeSBzdGFydCBvZiBkZXNjcmlwdGlvbgorCQlpZiAoJDEgZXEgIiIgJiYgCisJCQkoJHNlY3Rpb24gPX4gbS9eQC8gfHwgJHNlY3Rpb24gZXEgJHNlY3Rpb25fY29udGV4dCkpIHsKKwkJICAgIGR1bXBfc2VjdGlvbigkc2VjdGlvbiwgeG1sX2VzY2FwZSgkY29udGVudHMpKTsKKwkJICAgICRzZWN0aW9uID0gJHNlY3Rpb25fZGVmYXVsdDsKKwkJICAgICRjb250ZW50cyA9ICIiOworCQl9IGVsc2UgeworCQkgICAgJGNvbnRlbnRzIC49ICQxLiJcbiI7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJIyBpIGRvbnQga25vdyAtIGJhZCBsaW5lPyAgaWdub3JlLgorCQlwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6IGJhZCBsaW5lOiAkXyI7IAorCQkrKyR3YXJuaW5nczsKKwkgICAgfQorCX0gZWxzaWYgKCRzdGF0ZSA9PSAzKSB7CSMgc2Nhbm5pbmcgZm9yIGZ1bmN0aW9uIHsgKGVuZCBvZiBwcm90b3R5cGUpCisJICAgIGlmICgkZGVjbF90eXBlIGVxICdmdW5jdGlvbicpIHsKKwkgICAgICAgIHByb2Nlc3Nfc3RhdGUzX2Z1bmN0aW9uKCRfLCAkZmlsZSk7CisJICAgIH0gZWxzZSB7CisJICAgICAgICBwcm9jZXNzX3N0YXRlM190eXBlKCRfLCAkZmlsZSk7CisJICAgIH0KKwl9IGVsc2lmICgkc3RhdGUgPT0gNCkgeworCQkjIERvY3VtZW50YXRpb24gYmxvY2sKKwkgICAgICAgIGlmICgvJGRvY19ibG9jay8pIHsKKwkJCWR1bXBfc2VjdGlvbigkc2VjdGlvbiwgJGNvbnRlbnRzKTsKKwkJCW91dHB1dF9pbnRybyh7J3NlY3Rpb25saXN0JyA9PiBcQHNlY3Rpb25saXN0LAorCQkJCSAgICAgICdzZWN0aW9ucycgPT4gXCVzZWN0aW9ucyB9KTsKKwkJCSRjb250ZW50cyA9ICIiOworCQkJJGZ1bmN0aW9uID0gIiI7CisJCQklY29uc3RhbnRzID0gKCk7CisJCQklcGFyYW1ldGVyZGVzY3MgPSAoKTsKKwkJCSVwYXJhbWV0ZXJ0eXBlcyA9ICgpOworCQkJQHBhcmFtZXRlcmxpc3QgPSAoKTsKKwkJCSVzZWN0aW9ucyA9ICgpOworCQkJQHNlY3Rpb25saXN0ID0gKCk7CisJCQkkcHJvdG90eXBlID0gIiI7CisJCQlpZiAoICQxIGVxICIiICkgeworCQkJCSRzZWN0aW9uID0gJHNlY3Rpb25faW50cm87CisJCQl9IGVsc2UgeworCQkJCSRzZWN0aW9uID0gJDE7CisJCQl9CisgICAgICAgICAgICAgICAgfQorCQllbHNpZiAoLyRkb2NfZW5kLykKKwkJeworCQkJZHVtcF9zZWN0aW9uKCRzZWN0aW9uLCAkY29udGVudHMpOworCQkJb3V0cHV0X2ludHJvKHsnc2VjdGlvbmxpc3QnID0+IFxAc2VjdGlvbmxpc3QsCisJCQkJICAgICAgJ3NlY3Rpb25zJyA9PiBcJXNlY3Rpb25zIH0pOworCQkJJGNvbnRlbnRzID0gIiI7CisJCQkkZnVuY3Rpb24gPSAiIjsKKwkJCSVjb25zdGFudHMgPSAoKTsKKwkJCSVwYXJhbWV0ZXJkZXNjcyA9ICgpOworCQkJJXBhcmFtZXRlcnR5cGVzID0gKCk7CisJCQlAcGFyYW1ldGVybGlzdCA9ICgpOworCQkJJXNlY3Rpb25zID0gKCk7CisJCQlAc2VjdGlvbmxpc3QgPSAoKTsKKwkJCSRwcm90b3R5cGUgPSAiIjsKKwkJCSRzdGF0ZSA9IDA7CisJCX0KKwkJZWxzaWYgKC8kZG9jX2NvbnRlbnQvKQorCQl7CisJCQlpZiAoICQxIGVxICIiICkKKwkJCXsKKwkJCQkkY29udGVudHMgLj0gJGJsYW5rbGluZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkkY29udGVudHMgLj0gJDEgLiAiXG4iOworCQkJfQkKKyAgICAgICAgCX0KKyAgICAgICAgICB9CisgICAgfQorICAgIGlmICgkaW5pdGlhbF9zZWN0aW9uX2NvdW50ZXIgPT0gJHNlY3Rpb25fY291bnRlcikgeworCXByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9KTogbm8gc3RydWN0dXJlZCBjb21tZW50cyBmb3VuZFxuIjsKKwlpZiAoJG91dHB1dF9tb2RlIGVxICJ4bWwiKSB7CisJICAgICMgVGhlIHRlbXBsYXRlIHdhbnRzIGF0IGxlYXN0IG9uZSBSZWZFbnRyeSBoZXJlOyBtYWtlIG9uZS4KKwkgICAgcHJpbnQgIjxyZWZlbnRyeT5cbiI7CisJICAgIHByaW50ICIgPHJlZm5hbWVkaXY+XG4iOworCSAgICBwcmludCAiICA8cmVmbmFtZT5cbiI7CisJICAgIHByaW50ICIgICAke2ZpbGV9XG4iOworCSAgICBwcmludCAiICA8L3JlZm5hbWU+XG4iOworCSAgICBwcmludCAiICA8cmVmcHVycG9zZT5cbiI7CisJICAgIHByaW50ICIgICBEb2N1bWVudCBnZW5lcmF0aW9uIGluY29uc2lzdGVuY3lcbiI7CisJICAgIHByaW50ICIgIDwvcmVmcHVycG9zZT5cbiI7CisJICAgIHByaW50ICIgPC9yZWZuYW1lZGl2PlxuIjsKKwkgICAgcHJpbnQgIiA8cmVmc2VjdDE+XG4iOworCSAgICBwcmludCAiICA8dGl0bGU+XG4iOworCSAgICBwcmludCAiICAgT29wc1xuIjsKKwkgICAgcHJpbnQgIiAgPC90aXRsZT5cbiI7CisJICAgIHByaW50ICIgIDx3YXJuaW5nPlxuIjsKKwkgICAgcHJpbnQgIiAgIDxwYXJhPlxuIjsKKwkgICAgcHJpbnQgIiAgICBUaGUgdGVtcGxhdGUgZm9yIHRoaXMgZG9jdW1lbnQgdHJpZWQgdG8gaW5zZXJ0XG4iOworCSAgICBwcmludCAiICAgIHRoZSBzdHJ1Y3R1cmVkIGNvbW1lbnQgZnJvbSB0aGUgZmlsZVxuIjsKKwkgICAgcHJpbnQgIiAgICA8ZmlsZW5hbWU+JHtmaWxlfTwvZmlsZW5hbWU+IGF0IHRoaXMgcG9pbnQsXG4iOworCSAgICBwcmludCAiICAgIGJ1dCBub25lIHdhcyBmb3VuZC5cbiI7CisJICAgIHByaW50ICIgICAgVGhpcyBkdW1teSBzZWN0aW9uIGlzIGluc2VydGVkIHRvIGFsbG93XG4iOworCSAgICBwcmludCAiICAgIGdlbmVyYXRpb24gdG8gY29udGludWUuXG4iOworCSAgICBwcmludCAiICAgPC9wYXJhPlxuIjsKKwkgICAgcHJpbnQgIiAgPC93YXJuaW5nPlxuIjsKKwkgICAgcHJpbnQgIiA8L3JlZnNlY3QxPlxuIjsKKwkgICAgcHJpbnQgIjwvcmVmZW50cnk+XG4iOworCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tzeW1vb3BzL1JFQURNRSBiL3NjcmlwdHMva3N5bW9vcHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Y2IwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tzeW1vb3BzL1JFQURNRQpAQCAtMCwwICsxLDggQEAKK2tzeW1vb3BzIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsLiAgSXQgd2FzIGFsd2F5cyBtZWFudCB0byBiZSBhCitmcmVlIHN0YW5kaW5nIHV0aWxpdHksIG5vdCBsaW5rZWQgdG8gYW55IHBhcnRpY3VsYXIga2VybmVsIHZlcnNpb24uCitUaGUgbGF0ZXN0IHZlcnNpb24gY2FuIGJlIGZvdW5kIGluCitmdHA6Ly9mdHAuPGNvdW50cnk+Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9rc3ltb29wcyB0b2dldGhlcgord2l0aCBwYXRjaGVzIHRvIG90aGVyIHV0aWxpdGllcyBpbiBvcmRlciB0byBnaXZlIG1vcmUgYWNjdXJhdGUgT29wcworZGVidWdnaW5nLgorCitLZWl0aCBPd2VucyA8a2Fvc0BvY3MuY29tLmF1PiBTYXQgSnVuIDE5IDEwOjMwOjM0IEVTVCAxOTk5CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORyBiL3NjcmlwdHMvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OTk5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORwpAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgTk9UIHRoZSBvZmZpY2lhbCB2ZXJzaW9uIG9mIGRpYWxvZy4gIFRoaXMgdmVyc2lvbiBoYXMgYmVlbgorc2lnbmlmaWNhbnRseSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbC4gIEl0IGlzIGZvciB1c2UgYnkgdGhlIExpbnV4CitrZXJuZWwgY29uZmlndXJhdGlvbiBzY3JpcHQuICBQbGVhc2UgZG8gbm90IGJvdGhlciBTYXZpbyBMYW0gd2l0aCAKK3F1ZXN0aW9ucyBhYm91dCB0aGlzIHByb2dyYW0uCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL01ha2VmaWxlIGIvc2NyaXB0cy9seGRpYWxvZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDVhMTNmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy9NYWtlZmlsZQpAQCAtMCwwICsxLDQyIEBACitIT1NUX0VYVFJBQ0ZMQUdTIDo9IC1ETE9DQUxFIAoraWZlcSAoJChzaGVsbCB1bmFtZSksU3VuT1MpCitIT1NUX0xPQURMSUJFUyAgIDo9IC1sY3Vyc2VzCitlbHNlCitIT1NUX0xPQURMSUJFUyAgIDo9IC1sbmN1cnNlcworZW5kaWYKKworaWZlcSAoL3Vzci9pbmNsdWRlL25jdXJzZXMvbmN1cnNlcy5oLCAkKHdpbGRjYXJkIC91c3IvaW5jbHVkZS9uY3Vyc2VzL25jdXJzZXMuaCkpCisgICAgICAgIEhPU1RfRVhUUkFDRkxBR1MgKz0gLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IgorZWxzZQoraWZlcSAoL3Vzci9pbmNsdWRlL25jdXJzZXMvY3Vyc2VzLmgsICQod2lsZGNhcmQgL3Vzci9pbmNsdWRlL25jdXJzZXMvY3Vyc2VzLmgpKQorICAgICAgICBIT1NUX0VYVFJBQ0ZMQUdTICs9IC1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy9jdXJzZXMuaD4iCitlbHNlCitpZmVxICgvdXNyL2luY2x1ZGUvbmN1cnNlcy5oLCAkKHdpbGRjYXJkIC91c3IvaW5jbHVkZS9uY3Vyc2VzLmgpKQorICAgICAgICBIT1NUX0VYVFJBQ0ZMQUdTICs9IC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMuaD4iCitlbHNlCisJSE9TVF9FWFRSQUNGTEFHUyArPSAtRENVUlNFU19MT0M9IjxjdXJzZXMuaD4iCitlbmRpZgorZW5kaWYKK2VuZGlmCisKK2hvc3Rwcm9ncy15CTo9IGx4ZGlhbG9nCithbHdheXMJCTo9IG5jdXJzZXMgJChob3N0cHJvZ3MteSkKKworbHhkaWFsb2ctb2JqcyA6PSBjaGVja2xpc3QubyBtZW51Ym94Lm8gdGV4dGJveC5vIHllc25vLm8gaW5wdXRib3gubyBcCisJCSB1dGlsLm8gbHhkaWFsb2cubyBtc2dib3gubworCisuUEhPTlk6ICQob2JqKS9uY3Vyc2VzCiskKG9iaikvbmN1cnNlczoKKwlAZWNobyAibWFpbigpIHt9IiA+IGx4dGVtcC5jCisJQGlmICQoSE9TVENDKSBseHRlbXAuYyAgJChIT1NUX0xPQURMSUJFUyk7IHRoZW4gXAorCQlybSAtZiBseHRlbXAuYyBhLm91dDsgXAorCWVsc2UgXAorCQlybSAtZiBseHRlbXAuYzsgXAorCQllY2hvIC1lICJcMDA3IiA7XAorCQllY2hvICI+PiBVbmFibGUgdG8gZmluZCB0aGUgTmN1cnNlcyBsaWJyYXJpZXMuIiA7XAorCQllY2hvICI+PiIgO1wKKwkJZWNobyAiPj4gWW91IG11c3QgaW5zdGFsbCBuY3Vyc2VzLWRldmVsIGluIG9yZGVyIiA7XAorCQllY2hvICI+PiB0byB1c2UgJ21ha2UgbWVudWNvbmZpZyciIDtcCisJCWVjaG8gO1wKKwkJZXhpdCAxIDtcCisJZmkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvY2hlY2tsaXN0LmMgYi9zY3JpcHRzL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmExN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2NoZWNrbGlzdC5jCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogIGNoZWNrbGlzdC5jIC0tIGltcGxlbWVudHMgdGhlIGNoZWNrbGlzdCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogICAgIFN0dWFydCBIZXJiZXJ0IC0gUy5IZXJiZXJ0QHNoZWZmaWVsZC5hYy51azogcmFkaW9saXN0IGV4dGVuc2lvbgorICogICAgIEFsZXNzYW5kcm8gUnViaW5pIC0gcnViaW5pQGlwdnZpcy51bmlwdi5pdDogbWVyZ2VkIHRoZSB0d28KKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyBpbnQgbGlzdF93aWR0aCwgY2hlY2tfeCwgaXRlbV94LCBjaGVja2ZsYWc7CisKKy8qCisgKiBQcmludCBsaXN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2l0ZW0gKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqaXRlbSwgaW50IHN0YXR1cywKKwkgICAgaW50IGNob2ljZSwgaW50IHNlbGVjdGVkKQoreworICAgIGludCBpOworCisgICAgLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIGxhc3QgaXRlbSAqLworICAgIHdhdHRyc2V0ICh3aW4sIG1lbnVib3hfYXR0cik7CisgICAgd21vdmUgKHdpbiwgY2hvaWNlLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdF93aWR0aDsgaSsrKQorCXdhZGRjaCAod2luLCAnICcpOworCisgICAgd21vdmUgKHdpbiwgY2hvaWNlLCBjaGVja194KTsKKyAgICB3YXR0cnNldCAod2luLCBzZWxlY3RlZCA/IGNoZWNrX3NlbGVjdGVkX2F0dHIgOiBjaGVja19hdHRyKTsKKyAgICBpZiAoY2hlY2tmbGFnID09IEZMQUdfQ0hFQ0spCisJd3ByaW50dyAod2luLCAiWyVjXSIsIHN0YXR1cyA/ICdYJyA6ICcgJyk7CisgICAgZWxzZQorCXdwcmludHcgKHdpbiwgIiglYykiLCBzdGF0dXMgPyAnWCcgOiAnICcpOworCisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyB0YWdfc2VsZWN0ZWRfYXR0ciA6IHRhZ19hdHRyKTsKKyAgICBtdndhZGRjaCh3aW4sIGNob2ljZSwgaXRlbV94LCBpdGVtWzBdKTsKKyAgICB3YXR0cnNldCAod2luLCBzZWxlY3RlZCA/IGl0ZW1fc2VsZWN0ZWRfYXR0ciA6IGl0ZW1fYXR0cik7CisgICAgd2FkZHN0ciAod2luLCAoY2hhciAqKWl0ZW0rMSk7CisgICAgaWYgKHNlbGVjdGVkKSB7CisgICAgCXdtb3ZlICh3aW4sIGNob2ljZSwgY2hlY2tfeCsxKTsKKyAgICAJd3JlZnJlc2ggKHdpbik7CisgICAgfQorfQorCisvKgorICogUHJpbnQgdGhlIHNjcm9sbCBpbmRpY2F0b3JzLgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfYXJyb3dzIChXSU5ET1cgKiB3aW4sIGludCBjaG9pY2UsIGludCBpdGVtX25vLCBpbnQgc2Nyb2xsLAorCQlpbnQgeSwgaW50IHgsIGludCBoZWlnaHQpCit7CisgICAgd21vdmUod2luLCB5LCB4KTsKKworICAgIGlmIChzY3JvbGwgPiAwKSB7CisJd2F0dHJzZXQgKHdpbiwgdWFycm93X2F0dHIpOworCXdhZGRjaCAod2luLCBBQ1NfVUFSUk9XKTsKKwl3YWRkc3RyICh3aW4sICIoLSkiKTsKKyAgICB9CisgICAgZWxzZSB7CisJd2F0dHJzZXQgKHdpbiwgbWVudWJveF9hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKyAgICB9CisKKyAgIHkgPSB5ICsgaGVpZ2h0ICsgMTsKKyAgIHdtb3ZlKHdpbiwgeSwgeCk7CisKKyAgIGlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGNob2ljZSA8IGl0ZW1fbm8gLSAxKSkgeworCXdhdHRyc2V0ICh3aW4sIGRhcnJvd19hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0RBUlJPVyk7CisJd2FkZHN0ciAod2luLCAiKCspIik7CisgICAgfQorICAgIGVsc2UgeworCXdhdHRyc2V0ICh3aW4sIG1lbnVib3hfYm9yZGVyX2F0dHIpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworICAgfQorfQorCisvKgorICogIERpc3BsYXkgdGhlIHRlcm1pbmF0aW9uIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2J1dHRvbnMoIFdJTkRPVyAqZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKyAgICBpbnQgeCA9IHdpZHRoIC8gMiAtIDExOworICAgIGludCB5ID0gaGVpZ2h0IC0gMjsKKworICAgIHByaW50X2J1dHRvbiAoZGlhbG9nLCAiU2VsZWN0IiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisgICAgcHJpbnRfYnV0dG9uIChkaWFsb2csICIgSGVscCAiLCB5LCB4ICsgMTQsIHNlbGVjdGVkID09IDEpOworCisgICAgd21vdmUoZGlhbG9nLCB5LCB4KzEgKyAxNCpzZWxlY3RlZCk7CisgICAgd3JlZnJlc2ggKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCB3aXRoIGEgbGlzdCBvZiBvcHRpb25zIHRoYXQgY2FuIGJlIHR1cm5lZCBvbiBvciBvZmYKKyAqIFRoZSBgZmxhZycgcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2VsZWN0IGJldHdlZW4gcmFkaW9saXN0IGFuZCBjaGVja2xpc3QuCisgKi8KK2ludAorZGlhbG9nX2NoZWNrbGlzdCAoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCWludCBsaXN0X2hlaWdodCwgaW50IGl0ZW1fbm8sIGNvbnN0IGNoYXIgKiBjb25zdCAqIGl0ZW1zLCBpbnQgZmxhZykKKwkKK3sKKyAgICBpbnQgaSwgeCwgeSwgYm94X3gsIGJveF95OworICAgIGludCBrZXkgPSAwLCBidXR0b24gPSAwLCBjaG9pY2UgPSAwLCBzY3JvbGwgPSAwLCBtYXhfY2hvaWNlLCAqc3RhdHVzOworICAgIFdJTkRPVyAqZGlhbG9nLCAqbGlzdDsKKworICAgIGNoZWNrZmxhZyA9IGZsYWc7CisKKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc3RvcmluZyBpdGVtIG9uL29mZiBzdGF0dXMgKi8KKyAgICBpZiAoKHN0YXR1cyA9IG1hbGxvYyAoc2l6ZW9mIChpbnQpICogaXRlbV9ubykpID09IE5VTEwpIHsKKwllbmR3aW4gKCk7CisJZnByaW50ZiAoc3RkZXJyLAorCQkgIlxuQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGluIGRpYWxvZ19jaGVja2xpc3QoKS5cbiIpOworCWV4aXQgKC0xKTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplcyBzdGF0dXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKSB7CisJc3RhdHVzW2ldID0gIXN0cmNhc2VjbXAgKGl0ZW1zW2kgKiAzICsgMl0sICJvbiIpOworCWlmICgoIWNob2ljZSAmJiBzdGF0dXNbaV0pIHx8ICFzdHJjYXNlY21wIChpdGVtc1tpICogMyArIDJdLCAic2VsZWN0ZWQiKSkKKyAgICAgICAgICAgIGNob2ljZSA9IGkgKyAxOworICAgIH0KKyAgICBpZiAoY2hvaWNlKQorCSAgICBjaG9pY2UtLTsKKworICAgIG1heF9jaG9pY2UgPSBNSU4gKGxpc3RfaGVpZ2h0LCBpdGVtX25vKTsKKworICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworICAgIHggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisgICAgZHJhd19zaGFkb3cgKHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICBkaWFsb2cgPSBuZXd3aW4gKGhlaWdodCwgd2lkdGgsIHksIHgpOworICAgIGtleXBhZCAoZGlhbG9nLCBUUlVFKTsKKworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgYm9yZGVyX2F0dHIpOworICAgIG12d2FkZGNoIChkaWFsb2csIGhlaWdodC0zLCAwLCBBQ1NfTFRFRSk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCXdhZGRjaCAoZGlhbG9nLCBBQ1NfSExJTkUpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICB3YWRkY2ggKGRpYWxvZywgQUNTX1JURUUpOworCisgICAgaWYgKHRpdGxlICE9IE5VTEwgJiYgc3RybGVuKHRpdGxlKSA+PSB3aWR0aC0yICkgeworCS8qIHRydW5jYXRlIGxvbmcgdGl0bGUgLS0gbWVjICovCisJY2hhciAqIHRpdGxlMiA9IG1hbGxvYyh3aWR0aC0yKzEpOworCW1lbWNweSggdGl0bGUyLCB0aXRsZSwgd2lkdGgtMiApOworCXRpdGxlMlt3aWR0aC0yXSA9ICdcMCc7CisJdGl0bGUgPSB0aXRsZTI7CisgICAgfQorCisgICAgaWYgKHRpdGxlICE9IE5VTEwpIHsKKwl3YXR0cnNldCAoZGlhbG9nLCB0aXRsZV9hdHRyKTsKKwltdndhZGRjaCAoZGlhbG9nLCAwLCAod2lkdGggLSBzdHJsZW4odGl0bGUpKS8yIC0gMSwgJyAnKTsKKwl3YWRkc3RyIChkaWFsb2csIChjaGFyICopdGl0bGUpOworCXdhZGRjaCAoZGlhbG9nLCAnICcpOworICAgIH0KKworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICBwcmludF9hdXRvd3JhcCAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKyAgICBsaXN0X3dpZHRoID0gd2lkdGggLSA2OworICAgIGJveF95ID0gaGVpZ2h0IC0gbGlzdF9oZWlnaHQgLSA1OworICAgIGJveF94ID0gKHdpZHRoIC0gbGlzdF93aWR0aCkgLyAyIC0gMTsKKworICAgIC8qIGNyZWF0ZSBuZXcgd2luZG93IGZvciB0aGUgbGlzdCAqLworICAgIGxpc3QgPSBzdWJ3aW4gKGRpYWxvZywgbGlzdF9oZWlnaHQsIGxpc3Rfd2lkdGgsIHkrYm94X3krMSwgeCtib3hfeCsxKTsKKworICAgIGtleXBhZCAobGlzdCwgVFJVRSk7CisKKyAgICAvKiBkcmF3IGEgYm94IGFyb3VuZCB0aGUgbGlzdCBpdGVtcyAqLworICAgIGRyYXdfYm94IChkaWFsb2csIGJveF95LCBib3hfeCwgbGlzdF9oZWlnaHQgKyAyLCBsaXN0X3dpZHRoICsgMiwKKwkgICAgICBtZW51Ym94X2JvcmRlcl9hdHRyLCBtZW51Ym94X2F0dHIpOworCisgICAgLyogRmluZCBsZW5ndGggb2YgbG9uZ2VzdCBpdGVtIGluIG9yZGVyIHRvIGNlbnRlciBjaGVja2xpc3QgKi8KKyAgICBjaGVja194ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKSAKKwljaGVja194ID0gTUFYIChjaGVja194LCArIHN0cmxlbiAoaXRlbXNbaSAqIDMgKyAxXSkgKyA0KTsKKworICAgIGNoZWNrX3ggPSAobGlzdF93aWR0aCAtIGNoZWNrX3gpIC8gMjsKKyAgICBpdGVtX3ggPSBjaGVja194ICsgNDsKKworICAgIGlmIChjaG9pY2UgPj0gbGlzdF9oZWlnaHQpIHsKKwlzY3JvbGwgPSBjaG9pY2UgLSBsaXN0X2hlaWdodCArIDE7CisJY2hvaWNlIC09IHNjcm9sbDsKKyAgICB9CisKKyAgICAvKiBQcmludCB0aGUgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwlwcmludF9pdGVtIChsaXN0LCBpdGVtc1soc2Nyb2xsK2kpICogMyArIDFdLAorCQkgICAgc3RhdHVzW2krc2Nyb2xsXSwgaSwgaSA9PSBjaG9pY2UpOworICAgIH0KKworICAgIHByaW50X2Fycm93cyhkaWFsb2csIGNob2ljZSwgaXRlbV9ubywgc2Nyb2xsLAorCQkJYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworICAgIHByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworICAgIHdub3V0cmVmcmVzaCAobGlzdCk7CisgICAgd25vdXRyZWZyZXNoIChkaWFsb2cpOworICAgIGRvdXBkYXRlICgpOworCisgICAgd2hpbGUgKGtleSAhPSBFU0MpIHsKKwlrZXkgPSB3Z2V0Y2ggKGRpYWxvZyk7CisKKyAgICAJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykKKyAgICAgICAgICAgIGlmICh0b3VwcGVyKGtleSkgPT0gdG91cHBlcihpdGVtc1soc2Nyb2xsK2kpKjMrMV1bMF0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisKKwlpZiAoIGkgPCBtYXhfY2hvaWNlIHx8IGtleSA9PSBLRVlfVVAgfHwga2V5ID09IEtFWV9ET1dOIHx8IAorCSAgICBrZXkgPT0gJysnIHx8IGtleSA9PSAnLScgKSB7CisJICAgIGlmIChrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSAnLScpIHsKKwkJaWYgKCFjaG9pY2UpIHsKKwkJICAgIGlmICghc2Nyb2xsKQorCQkJY29udGludWU7CisJCSAgICAvKiBTY3JvbGwgbGlzdCBkb3duICovCisJCSAgICBpZiAobGlzdF9oZWlnaHQgPiAxKSB7CisJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBmaXJzdCBpdGVtICovCisJCQlwcmludF9pdGVtIChsaXN0LCBpdGVtc1tzY3JvbGwgKiAzICsgMV0sCisJCQkJCXN0YXR1c1tzY3JvbGxdLCAwLCBGQUxTRSk7CisJCQlzY3JvbGxvayAobGlzdCwgVFJVRSk7CisJCQl3c2NybCAobGlzdCwgLTEpOworCQkJc2Nyb2xsb2sgKGxpc3QsIEZBTFNFKTsKKwkJICAgIH0KKwkJICAgIHNjcm9sbC0tOworCQkgICAgcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbc2Nyb2xsICogMyArIDFdLAorCQkJCXN0YXR1c1tzY3JvbGxdLCAwLCBUUlVFKTsKKwkJICAgIHdub3V0cmVmcmVzaCAobGlzdCk7CisKKyAgICAJCSAgICBwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sIHNjcm9sbCwKKwkJCQlib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKworCQkgICAgY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCX0gZWxzZQorCQkgICAgaSA9IGNob2ljZSAtIDE7CisJICAgIH0gZWxzZSBpZiAoa2V5ID09IEtFWV9ET1dOIHx8IGtleSA9PSAnKycpIHsKKwkJaWYgKGNob2ljZSA9PSBtYXhfY2hvaWNlIC0gMSkgeworCQkgICAgaWYgKHNjcm9sbCArIGNob2ljZSA+PSBpdGVtX25vIC0gMSkKKwkJCWNvbnRpbnVlOworCQkgICAgLyogU2Nyb2xsIGxpc3QgdXAgKi8KKwkJICAgIGlmIChsaXN0X2hlaWdodCA+IDEpIHsKKwkJCS8qIERlLWhpZ2hsaWdodCBjdXJyZW50IGxhc3QgaXRlbSBiZWZvcmUgc2Nyb2xsaW5nIHVwICovCisJCQlwcmludF9pdGVtIChsaXN0LCBpdGVtc1soc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDEpICogMyArIDFdLAorCQkJCSAgICBzdGF0dXNbc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDFdLAorCQkJCSAgICBtYXhfY2hvaWNlIC0gMSwgRkFMU0UpOworCQkJc2Nyb2xsb2sgKGxpc3QsIFRSVUUpOworCQkJd3NjcmwgKGxpc3QsIDEpOworCQkJc2Nyb2xsb2sgKGxpc3QsIEZBTFNFKTsKKwkJICAgIH0KKwkJICAgIHNjcm9sbCsrOworCQkgICAgcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCArIG1heF9jaG9pY2UgLSAxKSAqIDMgKyAxXSwKKwkJCQlzdGF0dXNbc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDFdLAorCQkJCW1heF9jaG9pY2UgLSAxLCBUUlVFKTsKKwkJICAgIHdub3V0cmVmcmVzaCAobGlzdCk7CisKKyAgICAJCSAgICBwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sIHNjcm9sbCwKKwkJCQlib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKworCQkgICAgY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCX0gZWxzZQorCQkgICAgaSA9IGNob2ljZSArIDE7CisJICAgIH0KKwkgICAgaWYgKGkgIT0gY2hvaWNlKSB7CisJCS8qIERlLWhpZ2hsaWdodCBjdXJyZW50IGl0ZW0gKi8KKwkJcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzICsgMV0sCisJCQkgICAgc3RhdHVzW3Njcm9sbCArIGNob2ljZV0sIGNob2ljZSwgRkFMU0UpOworCQkvKiBIaWdobGlnaHQgbmV3IGl0ZW0gKi8KKwkJY2hvaWNlID0gaTsKKwkJcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzICsgMV0sCisJCQkgICAgc3RhdHVzW3Njcm9sbCArIGNob2ljZV0sIGNob2ljZSwgVFJVRSk7CisJCXdub3V0cmVmcmVzaCAobGlzdCk7CisJCXdyZWZyZXNoIChkaWFsb2cpOworCSAgICB9CisJICAgIGNvbnRpbnVlOwkJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwl9CisJc3dpdGNoIChrZXkpIHsKKwljYXNlICdIJzoKKwljYXNlICdoJzoKKwljYXNlICc/JzoKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDNdKTsKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICBmcmVlIChzdGF0dXMpOworCSAgICByZXR1cm4gMTsKKwljYXNlIFRBQjoKKwljYXNlIEtFWV9MRUZUOgorCWNhc2UgS0VZX1JJR0hUOgorCSAgICBidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkKKwkJCT8gMSA6IChidXR0b24gPiAxID8gMCA6IGJ1dHRvbik7CisKKwkgICAgcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIGJ1dHRvbik7CisJICAgIHdyZWZyZXNoIChkaWFsb2cpOworCSAgICBicmVhazsKKwljYXNlICdTJzoKKwljYXNlICdzJzoKKwljYXNlICcgJzoKKwljYXNlICdcbic6CisJICAgIGlmICghYnV0dG9uKSB7CisJCWlmIChmbGFnID09IEZMQUdfQ0hFQ0spIHsKKwkJICAgIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdID0gIXN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdOworCQkgICAgd21vdmUgKGxpc3QsIGNob2ljZSwgY2hlY2tfeCk7CisJCSAgICB3YXR0cnNldCAobGlzdCwgY2hlY2tfc2VsZWN0ZWRfYXR0cik7CisJCSAgICB3cHJpbnR3IChsaXN0LCAiWyVjXSIsIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdID8gJ1gnIDogJyAnKTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmICghc3RhdHVzW3Njcm9sbCArIGNob2ljZV0pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspCisJCQkgICAgc3RhdHVzW2ldID0gMDsKKwkJCXN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspCisJCQkgICAgcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCArIGkpICogMyArIDFdLAorCQkJCQlzdGF0dXNbc2Nyb2xsICsgaV0sIGksIGkgPT0gY2hvaWNlKTsKKwkJICAgIH0KKwkJfQorCQl3bm91dHJlZnJlc2ggKGxpc3QpOworCQl3cmVmcmVzaCAoZGlhbG9nKTsKKyAgICAgICAgICAgIAorCQlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKSB7CisJCSAgICBpZiAoc3RhdHVzW2ldKSB7CisJCQlpZiAoZmxhZyA9PSBGTEFHX0NIRUNLKSB7CisJCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXCIlc1wiICIsIGl0ZW1zW2kgKiAzXSk7CisJCQl9IGVsc2UgeworCQkJICAgIGZwcmludGYgKHN0ZGVyciwgIiVzIiwgaXRlbXNbaSAqIDNdKTsKKwkJCX0KKworCQkgICAgfQorCQl9CisgICAgICAgICAgICB9IGVsc2UKKwkJZnByaW50ZiAoc3RkZXJyLCAiJXMiLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDNdKTsKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICBmcmVlIChzdGF0dXMpOworCSAgICByZXR1cm4gYnV0dG9uOworCWNhc2UgJ1gnOgorCWNhc2UgJ3gnOgorCSAgICBrZXkgPSBFU0M7CisJY2FzZSBFU0M6CisJICAgIGJyZWFrOworCX0KKworCS8qIE5vdywgdXBkYXRlIGV2ZXJ5dGhpbmcuLi4gKi8KKwlkb3VwZGF0ZSAoKTsKKyAgICB9CisgICAgCisKKyAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgZnJlZSAoc3RhdHVzKTsKKyAgICByZXR1cm4gLTE7CQkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvY29sb3JzLmggYi9zY3JpcHRzL2x4ZGlhbG9nL2NvbG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzU5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2NvbG9ycy5oCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIGNvbG9ycy5oIC0tIGNvbG9yIGF0dHJpYnV0ZSBkZWZpbml0aW9ucworICoKKyAqICBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisKKy8qCisgKiAgIERlZmF1bHQgY29sb3IgZGVmaW5pdGlvbnMKKyAqCisgKiAgICpfRkcgPSBmb3JlZ3JvdW5kCisgKiAgICpfQkcgPSBiYWNrZ3JvdW5kCisgKiAgICpfSEwgPSBoaWdobGlnaHQ/CisgKi8KKyNkZWZpbmUgU0NSRUVOX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9DWUFOCisjZGVmaW5lIFNDUkVFTl9CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBTQ1JFRU5fSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBTSEFET1dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNIQURPV19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgU0hBRE9XX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgRElBTE9HX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBESUFMT0dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIERJQUxPR19ITCAgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBUSVRMRV9GRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUSVRMRV9CRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRJVExFX0hMICAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJPUkRFUl9GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQk9SREVSX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCT1JERVJfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fQUNUSVZFX0ZHICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9BQ1RJVkVfQkcgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fQUNUSVZFX0hMICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fSU5BQ1RJVkVfRkcgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIEJVVFRPTl9JTkFDVElWRV9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0lOQUNUSVZFX0hMICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0ZHICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0tFWV9BQ1RJVkVfQkcgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0hMICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfRkcgICAgICAgQ09MT1JfUkVECisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfQkcgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0tFWV9JTkFDVElWRV9ITCAgICAgICBGQUxTRQorCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9BQ1RJVkVfRkcgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9BQ1RJVkVfQkcgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0hMICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfRkcgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9CRyAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0hMICAgICBUUlVFCisKKyNkZWZpbmUgSU5QVVRCT1hfRkcgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJTlBVVEJPWF9CRyAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElOUFVUQk9YX0hMICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBJTlBVVEJPWF9CT1JERVJfRkcgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIElOUFVUQk9YX0JPUkRFUl9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSU5QVVRCT1hfQk9SREVSX0hMICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIFNFQVJDSEJPWF9GRyAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgU0VBUkNIQk9YX0JHICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfSEwgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0ZHICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0JHICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfVElUTEVfSEwgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBTRUFSQ0hCT1hfQk9SREVSX0ZHICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9CT1JERVJfQkcgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX0JPUkRFUl9ITCAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0ZHICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0JHICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBQT1NJVElPTl9JTkRJQ0FUT1JfSEwgICAgICAgIFRSVUUKKworI2RlZmluZSBNRU5VQk9YX0ZHICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIE1FTlVCT1hfQkcgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9ITCAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIE1FTlVCT1hfQk9SREVSX0ZHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9CT1JERVJfQkcgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBNRU5VQk9YX0JPUkRFUl9ITCAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBJVEVNX0ZHICAgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIElURU1fQkcgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSVRFTV9ITCAgICAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIElURU1fU0VMRUNURURfRkcgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSVRFTV9TRUxFQ1RFRF9CRyAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIElURU1fU0VMRUNURURfSEwgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19GRyAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19CRyAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVEFHX0hMICAgICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX1NFTEVDVEVEX0ZHICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX1NFTEVDVEVEX0JHICAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9ITCAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19LRVlfRkcgICAgICAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19LRVlfQkcgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVEFHX0tFWV9ITCAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX0tFWV9TRUxFQ1RFRF9GRyAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX0tFWV9TRUxFQ1RFRF9CRyAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfSEwgICAgICAgICAgVFJVRQorCisjZGVmaW5lIENIRUNLX0ZHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgQ0hFQ0tfQkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBDSEVDS19ITCAgICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfRkcgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBDSEVDS19TRUxFQ1RFRF9CRyAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfSEwgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVUFSUk9XX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9HUkVFTgorI2RlZmluZSBVQVJST1dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFVBUlJPV19ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIERBUlJPV19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfR1JFRU4KKyNkZWZpbmUgREFSUk9XX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBEQVJST1dfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworLyogRW5kIG9mIGRlZmF1bHQgY29sb3IgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDX0FUVFIoeCx5KSAgICAgICAgICAgICAgICAgICgoeCA/IEFfQk9MRCA6IDApIHwgQ09MT1JfUEFJUigoeSkpKQorI2RlZmluZSBDT0xPUl9OQU1FX0xFTiAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIENPTE9SX0NPVU5UICAgICAgICAgICAgICAgICAgOAorCisvKgorICogR2xvYmFsIHZhcmlhYmxlcworICovCisKK2V4dGVybiBpbnQgY29sb3JfdGFibGVbXVszXTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvZGlhbG9nLmggYi9zY3JpcHRzL2x4ZGlhbG9nL2RpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzE1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2RpYWxvZy5oCkBAIC0wLDAgKzEsMTg3IEBACisKKy8qCisgKiAgZGlhbG9nLmggLS0gY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGRpYWxvZyBtb2R1bGVzCisgKgorICogIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfX3N1bl9fCisjZGVmaW5lIENVUlNfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIENVUlNFU19MT0MKKworLyoKKyAqIENvbG9ycyBpbiBuY3Vyc2VzIDEuOS45ZSBkbyBub3Qgd29yayBwcm9wZXJseSBzaW5jZSBmb3JlZ3JvdW5kIGFuZAorICogYmFja2dyb3VuZCBjb2xvcnMgYXJlIE9SJ2QgcmF0aGVyIHRoYW4gc2VwYXJhdGVseSBtYXNrZWQuICBUaGlzIHZlcnNpb24KKyAqIG9mIGRpYWxvZyB3YXMgaGFja2VkIHRvIHdvcmsgd2l0aCBuY3Vyc2VzIDEuOS45ZSwgbWFraW5nIGl0IGluY29tcGF0aWJsZQorICogd2l0aCBzdGFuZGFyZCBjdXJzZXMuICBUaGUgc2ltcGxlc3QgZml4ICh0byBtYWtlIHRoaXMgd29yayB3aXRoIHN0YW5kYXJkCisgKiBjdXJzZXMpIHVzZXMgdGhlIHdia2dkc2V0KCkgZnVuY3Rpb24sIG5vdCB1c2VkIGluIHRoZSBvcmlnaW5hbCBoYWNrLgorICogVHVybiBpdCBvZmYgaWYgd2UncmUgYnVpbGRpbmcgd2l0aCAxLjkuOWUsIHNpbmNlIGl0IGp1c3QgY29uZnVzZXMgdGhpbmdzLgorICovCisjaWYgZGVmaW5lZChOQ1VSU0VTX1ZFUlNJT04pICYmIGRlZmluZWQoX05FRURfV1JBUCkgJiYgIWRlZmluZWQoR0NDX1BSSU5URkxJS0UpCisjZGVmaW5lIE9MRF9OQ1VSU0VTIDEKKyN1bmRlZiAgd2JrZ2RzZXQKKyNkZWZpbmUgd2JrZ2RzZXQodyxwKSAvKm5vdGhpbmcqLworI2Vsc2UKKyNkZWZpbmUgT0xEX05DVVJTRVMgMAorI2VuZGlmCisKKyNkZWZpbmUgVFIocGFyYW1zKSBfdHJhY2VmIHBhcmFtcworCisjZGVmaW5lIEVTQyAyNworI2RlZmluZSBUQUIgOQorI2RlZmluZSBNQVhfTEVOIDIwNDgKKyNkZWZpbmUgQlVGX1NJWkUgKDEwKjEwMjQpCisjZGVmaW5lIE1JTih4LHkpICh4IDwgeSA/IHggOiB5KQorI2RlZmluZSBNQVgoeCx5KSAoeCA+IHkgPyB4IDogeSkKKworCisjaWZuZGVmIEFDU19VTENPUk5FUgorI2RlZmluZSBBQ1NfVUxDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xMQ09STkVSCisjZGVmaW5lIEFDU19MTENPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVVJDT1JORVIKKyNkZWZpbmUgQUNTX1VSQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19MUkNPUk5FUgorI2RlZmluZSBBQ1NfTFJDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0hMSU5FCisjZGVmaW5lIEFDU19ITElORSAnLScKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVkxJTkUKKyNkZWZpbmUgQUNTX1ZMSU5FICd8JworI2VuZGlmCisjaWZuZGVmIEFDU19MVEVFCisjZGVmaW5lIEFDU19MVEVFICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19SVEVFCisjZGVmaW5lIEFDU19SVEVFICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19VQVJST1cKKyNkZWZpbmUgQUNTX1VBUlJPVyAnXicKKyNlbmRpZgorI2lmbmRlZiBBQ1NfREFSUk9XCisjZGVmaW5lIEFDU19EQVJST1cgJ3YnCisjZW5kaWYKKworLyogCisgKiBBdHRyaWJ1dGUgbmFtZXMKKyAqLworI2RlZmluZSBzY3JlZW5fYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzBdCisjZGVmaW5lIHNoYWRvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMV0KKyNkZWZpbmUgZGlhbG9nX2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syXQorI2RlZmluZSB0aXRsZV9hdHRyICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzNdCisjZGVmaW5lIGJvcmRlcl9hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbNF0KKyNkZWZpbmUgYnV0dG9uX2FjdGl2ZV9hdHRyICAgICAgICAgICAgYXR0cmlidXRlc1s1XQorI2RlZmluZSBidXR0b25faW5hY3RpdmVfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzZdCisjZGVmaW5lIGJ1dHRvbl9rZXlfYWN0aXZlX2F0dHIgICAgICAgIGF0dHJpYnV0ZXNbN10KKyNkZWZpbmUgYnV0dG9uX2tleV9pbmFjdGl2ZV9hdHRyICAgICAgYXR0cmlidXRlc1s4XQorI2RlZmluZSBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIgICAgICBhdHRyaWJ1dGVzWzldCisjZGVmaW5lIGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyICAgIGF0dHJpYnV0ZXNbMTBdCisjZGVmaW5lIGlucHV0Ym94X2F0dHIgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTFdCisjZGVmaW5lIGlucHV0Ym94X2JvcmRlcl9hdHRyICAgICAgICAgIGF0dHJpYnV0ZXNbMTJdCisjZGVmaW5lIHNlYXJjaGJveF9hdHRyICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTNdCisjZGVmaW5lIHNlYXJjaGJveF90aXRsZV9hdHRyICAgICAgICAgIGF0dHJpYnV0ZXNbMTRdCisjZGVmaW5lIHNlYXJjaGJveF9ib3JkZXJfYXR0ciAgICAgICAgIGF0dHJpYnV0ZXNbMTVdCisjZGVmaW5lIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyICAgICAgIGF0dHJpYnV0ZXNbMTZdCisjZGVmaW5lIG1lbnVib3hfYXR0ciAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTddCisjZGVmaW5lIG1lbnVib3hfYm9yZGVyX2F0dHIgICAgICAgICAgIGF0dHJpYnV0ZXNbMThdCisjZGVmaW5lIGl0ZW1fYXR0ciAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMTldCisjZGVmaW5lIGl0ZW1fc2VsZWN0ZWRfYXR0ciAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjBdCisjZGVmaW5lIHRhZ19hdHRyICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjFdCisjZGVmaW5lIHRhZ19zZWxlY3RlZF9hdHRyICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjJdCisjZGVmaW5lIHRhZ19rZXlfYXR0ciAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjNdCisjZGVmaW5lIHRhZ19rZXlfc2VsZWN0ZWRfYXR0ciAgICAgICAgIGF0dHJpYnV0ZXNbMjRdCisjZGVmaW5lIGNoZWNrX2F0dHIgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjVdCisjZGVmaW5lIGNoZWNrX3NlbGVjdGVkX2F0dHIgICAgICAgICAgIGF0dHJpYnV0ZXNbMjZdCisjZGVmaW5lIHVhcnJvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjddCisjZGVmaW5lIGRhcnJvd19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMjhdCisKKy8qIG51bWJlciBvZiBhdHRyaWJ1dGVzICovCisjZGVmaW5lIEFUVFJJQlVURV9DT1VOVCAgICAgICAgICAgICAgIDI5CisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KK2V4dGVybiBib29sIHVzZV9jb2xvcnM7CitleHRlcm4gYm9vbCB1c2Vfc2hhZG93OworCitleHRlcm4gY2h0eXBlIGF0dHJpYnV0ZXNbXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJhY2t0aXRsZTsKKworLyoKKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMKKyAqLworZXh0ZXJuIHZvaWQgY3JlYXRlX3JjIChjb25zdCBjaGFyICpmaWxlbmFtZSk7CitleHRlcm4gaW50IHBhcnNlX3JjICh2b2lkKTsKKworCit2b2lkIGluaXRfZGlhbG9nICh2b2lkKTsKK3ZvaWQgZW5kX2RpYWxvZyAodm9pZCk7Cit2b2lkIGF0dHJfY2xlYXIgKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cik7Cit2b2lkIGRpYWxvZ19jbGVhciAodm9pZCk7Cit2b2lkIGNvbG9yX3NldHVwICh2b2lkKTsKK3ZvaWQgcHJpbnRfYXV0b3dyYXAgKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgd2lkdGgsIGludCB5LCBpbnQgeCk7Cit2b2lkIHByaW50X2J1dHRvbiAoV0lORE9XICogd2luLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHksIGludCB4LCBpbnQgc2VsZWN0ZWQpOwordm9pZCBkcmF3X2JveCAoV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGJveCwKKwkJY2h0eXBlIGJvcmRlcik7Cit2b2lkIGRyYXdfc2hhZG93IChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKKworaW50IGZpcnN0X2FscGhhIChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmV4ZW1wdCk7CitpbnQgZGlhbG9nX3llc25vIChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworaW50IGRpYWxvZ19tc2dib3ggKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCWludCB3aWR0aCwgaW50IHBhdXNlKTsKK2ludCBkaWFsb2dfdGV4dGJveCAoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitpbnQgZGlhbG9nX21lbnUgKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJaW50IG1lbnVfaGVpZ2h0LCBjb25zdCBjaGFyICpjaG9pY2UsIGludCBpdGVtX25vLCAKKwkJY29uc3QgY2hhciAqIGNvbnN0ICogaXRlbXMpOworaW50IGRpYWxvZ19jaGVja2xpc3QgKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCWludCB3aWR0aCwgaW50IGxpc3RfaGVpZ2h0LCBpbnQgaXRlbV9ubywKKwkJY29uc3QgY2hhciAqIGNvbnN0ICogaXRlbXMsIGludCBmbGFnKTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbXTsKK2ludCBkaWFsb2dfaW5wdXRib3ggKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCWludCB3aWR0aCwgY29uc3QgY2hhciAqaW5pdCk7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBiYXNlIGZvciBmaWN0aXRpb3VzIGtleXMsIHdoaWNoIGFjdGl2YXRlCisgKiB0aGUgYnV0dG9ucy4KKyAqCisgKiBNb3VzZS1nZW5lcmF0ZWQga2V5cyBhcmUgdGhlIGZvbGxvd2luZzoKKyAqICAgLS0gdGhlIGZpcnN0IDMyIGFyZSB1c2VkIGFzIG51bWJlcnMsIGluIGFkZGl0aW9uIHRvICcwJy0nOScKKyAqICAgLS0gdGhlIGxvd2VyY2FzZSBhcmUgdXNlZCB0byBzaWduYWwgbW91c2UtZW50ZXIgZXZlbnRzIChNX0VWRU5UICsgJ28nKQorICogICAtLSB1cHBlcmNhc2UgY2hhcnMgYXJlIHVzZWQgdG8gaW52b2tlIHRoZSBidXR0b24gKE1fRVZFTlQgKyAnTycpCisgKi8KKyNkZWZpbmUgTV9FVkVOVCAoS0VZX01BWCsxKQorCisKKy8qCisgKiBUaGUgYGZsYWcnIHBhcmFtZXRlciBpbiBjaGVja2xpc3QgaXMgdXNlZCB0byBzZWxlY3QgYmV0d2VlbgorICogcmFkaW9saXN0IGFuZCBjaGVja2xpc3QKKyAqLworI2RlZmluZSBGTEFHX0NIRUNLIDEKKyNkZWZpbmUgRkxBR19SQURJTyAwCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2lucHV0Ym94LmMgYi9zY3JpcHRzL2x4ZGlhbG9nL2lucHV0Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3YmViYwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvaW5wdXRib3guYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqICBpbnB1dGJveC5jIC0tIGltcGxlbWVudHMgdGhlIGlucHV0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCit1bnNpZ25lZCBjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbTUFYX0xFTiArIDFdOworCisvKgorICogIFByaW50IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9idXR0b25zKFdJTkRPVyAqZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKyAgICBpbnQgeCA9IHdpZHRoIC8gMiAtIDExOworICAgIGludCB5ID0gaGVpZ2h0IC0gMjsKKworICAgIHByaW50X2J1dHRvbiAoZGlhbG9nLCAiICBPayAgIiwgeSwgeCwgc2VsZWN0ZWQ9PTApOworICAgIHByaW50X2J1dHRvbiAoZGlhbG9nLCAiIEhlbHAgIiwgeSwgeCArIDE0LCBzZWxlY3RlZD09MSk7CisKKyAgICB3bW92ZShkaWFsb2csIHksIHgrMSsxNCpzZWxlY3RlZCk7CisgICAgd3JlZnJlc2goZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IGZvciBpbnB1dGluZyBhIHN0cmluZworICovCitpbnQKK2RpYWxvZ19pbnB1dGJveCAoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCQkgY29uc3QgY2hhciAqaW5pdCkKK3sKKyAgICBpbnQgaSwgeCwgeSwgYm94X3ksIGJveF94LCBib3hfd2lkdGg7CisgICAgaW50IGlucHV0X3ggPSAwLCBzY3JvbGwgPSAwLCBrZXkgPSAwLCBidXR0b24gPSAtMTsKKyAgICB1bnNpZ25lZCBjaGFyICppbnN0ciA9IGRpYWxvZ19pbnB1dF9yZXN1bHQ7CisgICAgV0lORE9XICpkaWFsb2c7CisKKyAgICAvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKyAgICB4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworICAgIHkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCisgICAgZHJhd19zaGFkb3cgKHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICBkaWFsb2cgPSBuZXd3aW4gKGhlaWdodCwgd2lkdGgsIHksIHgpOworICAgIGtleXBhZCAoZGlhbG9nLCBUUlVFKTsKKworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgYm9yZGVyX2F0dHIpOworICAgIG12d2FkZGNoIChkaWFsb2csIGhlaWdodC0zLCAwLCBBQ1NfTFRFRSk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCXdhZGRjaCAoZGlhbG9nLCBBQ1NfSExJTkUpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICB3YWRkY2ggKGRpYWxvZywgQUNTX1JURUUpOworCisgICAgaWYgKHRpdGxlICE9IE5VTEwgJiYgc3RybGVuKHRpdGxlKSA+PSB3aWR0aC0yICkgeworCS8qIHRydW5jYXRlIGxvbmcgdGl0bGUgLS0gbWVjICovCisJY2hhciAqIHRpdGxlMiA9IG1hbGxvYyh3aWR0aC0yKzEpOworCW1lbWNweSggdGl0bGUyLCB0aXRsZSwgd2lkdGgtMiApOworCXRpdGxlMlt3aWR0aC0yXSA9ICdcMCc7CisJdGl0bGUgPSB0aXRsZTI7CisgICAgfQorCisgICAgaWYgKHRpdGxlICE9IE5VTEwpIHsKKwl3YXR0cnNldCAoZGlhbG9nLCB0aXRsZV9hdHRyKTsKKwltdndhZGRjaCAoZGlhbG9nLCAwLCAod2lkdGggLSBzdHJsZW4odGl0bGUpKS8yIC0gMSwgJyAnKTsKKwl3YWRkc3RyIChkaWFsb2csIChjaGFyICopdGl0bGUpOworCXdhZGRjaCAoZGlhbG9nLCAnICcpOworICAgIH0KKworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICBwcmludF9hdXRvd3JhcCAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKyAgICAvKiBEcmF3IHRoZSBpbnB1dCBmaWVsZCBib3ggKi8KKyAgICBib3hfd2lkdGggPSB3aWR0aCAtIDY7CisgICAgZ2V0eXggKGRpYWxvZywgeSwgeCk7CisgICAgYm94X3kgPSB5ICsgMjsKKyAgICBib3hfeCA9ICh3aWR0aCAtIGJveF93aWR0aCkgLyAyOworICAgIGRyYXdfYm94IChkaWFsb2csIHkgKyAxLCBib3hfeCAtIDEsIDMsIGJveF93aWR0aCArIDIsCisJICAgICAgYm9yZGVyX2F0dHIsIGRpYWxvZ19hdHRyKTsKKworICAgIHByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworICAgIC8qIFNldCB1cCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworICAgIHdtb3ZlIChkaWFsb2csIGJveF95LCBib3hfeCk7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgaW5wdXRib3hfYXR0cik7CisKKyAgICBpZiAoIWluaXQpCisJaW5zdHJbMF0gPSAnXDAnOworICAgIGVsc2UKKwlzdHJjcHkgKGluc3RyLCBpbml0KTsKKworICAgIGlucHV0X3ggPSBzdHJsZW4gKGluc3RyKTsKKworICAgIGlmIChpbnB1dF94ID49IGJveF93aWR0aCkgeworCXNjcm9sbCA9IGlucHV0X3ggLSBib3hfd2lkdGggKyAxOworCWlucHV0X3ggPSBib3hfd2lkdGggLSAxOworCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGggLSAxOyBpKyspCisJICAgIHdhZGRjaCAoZGlhbG9nLCBpbnN0cltzY3JvbGwgKyBpXSk7CisgICAgfSBlbHNlCisJd2FkZHN0ciAoZGlhbG9nLCBpbnN0cik7CisKKyAgICB3bW92ZSAoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKworICAgIHdyZWZyZXNoIChkaWFsb2cpOworCisgICAgd2hpbGUgKGtleSAhPSBFU0MpIHsKKwlrZXkgPSB3Z2V0Y2ggKGRpYWxvZyk7CisKKwlpZiAoYnV0dG9uID09IC0xKSB7CS8qIElucHV0IGJveCBzZWxlY3RlZCAqLworCSAgICBzd2l0Y2ggKGtleSkgeworCSAgICBjYXNlIFRBQjoKKwkgICAgY2FzZSBLRVlfVVA6CisJICAgIGNhc2UgS0VZX0RPV046CisJCWJyZWFrOworCSAgICBjYXNlIEtFWV9MRUZUOgorCQljb250aW51ZTsKKwkgICAgY2FzZSBLRVlfUklHSFQ6CisJCWNvbnRpbnVlOworCSAgICBjYXNlIEtFWV9CQUNLU1BBQ0U6CisJICAgIGNhc2UgMTI3OgorCQlpZiAoaW5wdXRfeCB8fCBzY3JvbGwpIHsKKwkJICAgIHdhdHRyc2V0IChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCQkgICAgaWYgKCFpbnB1dF94KSB7CisJCQlzY3JvbGwgPSBzY3JvbGwgPCBib3hfd2lkdGggLSAxID8KKwkJCSAgICAwIDogc2Nyb2xsIC0gKGJveF93aWR0aCAtIDEpOworCQkJd21vdmUgKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGg7IGkrKykKKwkJCSAgICB3YWRkY2ggKGRpYWxvZywgaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIGldID8KKwkJCQkgICAgaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIGldIDogJyAnKTsKKwkJCWlucHV0X3ggPSBzdHJsZW4gKGluc3RyKSAtIHNjcm9sbDsKKwkJICAgIH0gZWxzZQorCQkJaW5wdXRfeC0tOworCQkgICAgaW5zdHJbc2Nyb2xsICsgaW5wdXRfeF0gPSAnXDAnOworCQkgICAgbXZ3YWRkY2ggKGRpYWxvZywgYm94X3ksIGlucHV0X3ggKyBib3hfeCwgJyAnKTsKKwkJICAgIHdtb3ZlIChkaWFsb2csIGJveF95LCBpbnB1dF94ICsgYm94X3gpOworCQkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisJCX0KKwkJY29udGludWU7CisJICAgIGRlZmF1bHQ6CisJCWlmIChrZXkgPCAweDEwMCAmJiBpc3ByaW50IChrZXkpKSB7CisJCSAgICBpZiAoc2Nyb2xsICsgaW5wdXRfeCA8IE1BWF9MRU4pIHsKKwkJCXdhdHRyc2V0IChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeF0gPSBrZXk7CisJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgMV0gPSAnXDAnOworCQkJaWYgKGlucHV0X3ggPT0gYm94X3dpZHRoIC0gMSkgeworCQkJICAgIHNjcm9sbCsrOworCQkJICAgIHdtb3ZlIChkaWFsb2csIGJveF95LCBib3hfeCk7CisJCQkgICAgZm9yIChpID0gMDsgaSA8IGJveF93aWR0aCAtIDE7IGkrKykKKwkJCQl3YWRkY2ggKGRpYWxvZywgaW5zdHJbc2Nyb2xsICsgaV0pOworCQkJfSBlbHNlIHsKKwkJCSAgICB3bW92ZSAoZGlhbG9nLCBib3hfeSwgaW5wdXRfeCsrICsgYm94X3gpOworCQkJICAgIHdhZGRjaCAoZGlhbG9nLCBrZXkpOworCQkJfQorCQkJd3JlZnJlc2ggKGRpYWxvZyk7CisJCSAgICB9IGVsc2UKKwkJCWZsYXNoICgpOwkvKiBBbGFybSB1c2VyIGFib3V0IG92ZXJmbG93ICovCisJCSAgICBjb250aW51ZTsKKwkJfQorCSAgICB9CisJfQorCXN3aXRjaCAoa2V5KSB7CisJY2FzZSAnTyc6CisJY2FzZSAnbyc6CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgcmV0dXJuIDA7CisJY2FzZSAnSCc6CisJY2FzZSAnaCc6CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgcmV0dXJuIDE7CisJY2FzZSBLRVlfVVA6CisJY2FzZSBLRVlfTEVGVDoKKwkgICAgc3dpdGNoIChidXR0b24pIHsKKwkgICAgY2FzZSAtMToKKwkJYnV0dG9uID0gMTsJLyogSW5kaWNhdGVzICJDYW5jZWwiIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMSk7CisJCWJyZWFrOworCSAgICBjYXNlIDA6CisJCWJ1dHRvbiA9IC0xOwkvKiBJbmRpY2F0ZXMgaW5wdXQgYm94IGlzIHNlbGVjdGVkICovCisJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJd21vdmUgKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisJCXdyZWZyZXNoIChkaWFsb2cpOworCQlicmVhazsKKwkgICAgY2FzZSAxOgorCQlidXR0b24gPSAwOwkvKiBJbmRpY2F0ZXMgIk9LIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIFRBQjoKKwljYXNlIEtFWV9ET1dOOgorCWNhc2UgS0VZX1JJR0hUOgorCSAgICBzd2l0Y2ggKGJ1dHRvbikgeworCSAgICBjYXNlIC0xOgorCQlidXR0b24gPSAwOwkvKiBJbmRpY2F0ZXMgIk9LIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQlicmVhazsKKwkgICAgY2FzZSAwOgorCQlidXR0b24gPSAxOwkvKiBJbmRpY2F0ZXMgIkNhbmNlbCIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAxKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkJYnV0dG9uID0gLTE7CS8qIEluZGljYXRlcyBpbnB1dCBib3ggaXMgc2VsZWN0ZWQgKi8KKwkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQl3bW92ZSAoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKwkJd3JlZnJlc2ggKGRpYWxvZyk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJyAnOgorCWNhc2UgJ1xuJzoKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICByZXR1cm4gKGJ1dHRvbiA9PSAtMSA/IDAgOiBidXR0b24pOworCWNhc2UgJ1gnOgorCWNhc2UgJ3gnOgorCSAgICBrZXkgPSBFU0M7CisJY2FzZSBFU0M6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgcmV0dXJuIC0xOwkJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2x4ZGlhbG9nLmMgYi9zY3JpcHRzL2x4ZGlhbG9nL2x4ZGlhbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4M2E4NQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvbHhkaWFsb2cuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqICBkaWFsb2cgLSBEaXNwbGF5IHNpbXBsZSBkaWFsb2cgYm94ZXMgZnJvbSBzaGVsbCBzY3JpcHRzCisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyB2b2lkIFVzYWdlIChjb25zdCBjaGFyICpuYW1lKTsKKwordHlwZWRlZiBpbnQgKGp1bXBlckZuKSAoY29uc3QgY2hhciAqdGl0bGUsIGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKiBhcmd2KTsKKworc3RydWN0IE1vZGUgeworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGFyZ21pbiwgYXJnbWF4LCBhcmdtb2Q7CisgICAganVtcGVyRm4gKmp1bXBlcjsKK307CisKK2p1bXBlckZuIGpfbWVudSwgal9jaGVja2xpc3QsIGpfcmFkaW9saXN0LCBqX3llc25vLCBqX3RleHRib3gsIGpfaW5wdXRib3g7CitqdW1wZXJGbiBqX21zZ2JveCwgal9pbmZvYm94OworCitzdGF0aWMgc3RydWN0IE1vZGUgbW9kZXNbXSA9Cit7CisgICAgeyItLW1lbnUiLCA5LCAwLCAzLCBqX21lbnV9LAorICAgIHsiLS1jaGVja2xpc3QiLCA5LCAwLCAzLCBqX2NoZWNrbGlzdH0sCisgICAgeyItLXJhZGlvbGlzdCIsIDksIDAsIDMsIGpfcmFkaW9saXN0fSwKKyAgICB7Ii0teWVzbm8iLCAgICA1LDUsMSwgal95ZXNub30sCisgICAgeyItLXRleHRib3giLCAgNSw1LDEsIGpfdGV4dGJveH0sCisgICAgeyItLWlucHV0Ym94IiwgNSwgNiwgMSwgal9pbnB1dGJveH0sCisgICAgeyItLW1zZ2JveCIsIDUsIDUsIDEsIGpfbXNnYm94fSwKKyAgICB7Ii0taW5mb2JveCIsIDUsIDUsIDEsIGpfaW5mb2JveH0sCisgICAge05VTEwsIDAsIDAsIDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IE1vZGUgKm1vZGVQdHI7CisKKyNpZmRlZiBMT0NBTEUKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCitpbnQKK21haW4gKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QgKiBhcmd2KQoreworICAgIGludCBvZmZzZXQgPSAwLCBvcHRfY2xlYXIgPSAwLCBlbmRfY29tbW9uX29wdHMgPSAwLCByZXR2YWw7CisgICAgY29uc3QgY2hhciAqdGl0bGUgPSBOVUxMOworCisjaWZkZWYgTE9DQUxFCisgICAgKHZvaWQpIHNldGxvY2FsZSAoTENfQUxMLCAiIik7CisjZW5kaWYKKworI2lmZGVmIFRSQUNFCisgICAgdHJhY2UoVFJBQ0VfQ0FMTFN8VFJBQ0VfVVBEQVRFKTsKKyNlbmRpZgorICAgIGlmIChhcmdjIDwgMikgeworCVVzYWdlIChhcmd2WzBdKTsKKwlleGl0ICgtMSk7CisgICAgfQorCisgICAgd2hpbGUgKG9mZnNldCA8IGFyZ2MgLSAxICYmICFlbmRfY29tbW9uX29wdHMpIHsJLyogQ29tbW9uIG9wdGlvbnMgKi8KKwlpZiAoIXN0cmNtcCAoYXJndltvZmZzZXQgKyAxXSwgIi0tdGl0bGUiKSkgeworCSAgICBpZiAoYXJnYyAtIG9mZnNldCA8IDMgfHwgdGl0bGUgIT0gTlVMTCkgeworCQlVc2FnZSAoYXJndlswXSk7CisJCWV4aXQgKC0xKTsKKwkgICAgfSBlbHNlIHsKKwkJdGl0bGUgPSBhcmd2W29mZnNldCArIDJdOworCQlvZmZzZXQgKz0gMjsKKwkgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAgKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLWJhY2t0aXRsZSIpKSB7CisgICAgICAgICAgICBpZiAoYmFja3RpdGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBVc2FnZSAoYXJndlswXSk7CisgICAgICAgICAgICAgICAgZXhpdCAoLTEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYWNrdGl0bGUgPSBhcmd2W29mZnNldCArIDJdOworICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgfQorCX0gZWxzZSBpZiAoIXN0cmNtcCAoYXJndltvZmZzZXQgKyAxXSwgIi0tY2xlYXIiKSkgeworCSAgICBpZiAob3B0X2NsZWFyKSB7CQkvKiBIZXksICItLWNsZWFyIiBjYW4ndCBhcHBlYXIgdHdpY2UhICovCisJCVVzYWdlIChhcmd2WzBdKTsKKwkJZXhpdCAoLTEpOworCSAgICB9IGVsc2UgaWYgKGFyZ2MgPT0gMikgewkvKiB3ZSBvbmx5IHdhbnQgdG8gY2xlYXIgdGhlIHNjcmVlbiAqLworCQlpbml0X2RpYWxvZyAoKTsKKwkJcmVmcmVzaCAoKTsJLyogaW5pdF9kaWFsb2coKSB3aWxsIGNsZWFyIHRoZSBzY3JlZW4gZm9yIHVzICovCisJCWVuZF9kaWFsb2cgKCk7CisJCXJldHVybiAwOworCSAgICB9IGVsc2UgeworCQlvcHRfY2xlYXIgPSAxOworCQlvZmZzZXQrKzsKKwkgICAgfQorCX0gZWxzZQkJCS8qIG5vIG1vcmUgY29tbW9uIG9wdGlvbnMgKi8KKwkgICAgZW5kX2NvbW1vbl9vcHRzID0gMTsKKyAgICB9CisKKyAgICBpZiAoYXJnYyAtIDEgPT0gb2Zmc2V0KSB7CS8qIG5vIG1vcmUgb3B0aW9ucyAqLworCVVzYWdlIChhcmd2WzBdKTsKKwlleGl0ICgtMSk7CisgICAgfQorICAgIC8qIHVzZSBhIHRhYmxlIHRvIGxvb2sgZm9yIHRoZSByZXF1ZXN0ZWQgbW9kZSwgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiAqLworCisgICAgZm9yIChtb2RlUHRyID0gbW9kZXM7IG1vZGVQdHItPm5hbWU7IG1vZGVQdHIrKykJLyogbG9vayBmb3IgdGhlIG1vZGUgKi8KKwlpZiAoIXN0cmNtcCAoYXJndltvZmZzZXQgKyAxXSwgbW9kZVB0ci0+bmFtZSkpCisJICAgIGJyZWFrOworCisgICAgaWYgKCFtb2RlUHRyLT5uYW1lKQorCVVzYWdlIChhcmd2WzBdKTsKKyAgICBpZiAoYXJnYyAtIG9mZnNldCA8IG1vZGVQdHItPmFyZ21pbikKKwlVc2FnZSAoYXJndlswXSk7CisgICAgaWYgKG1vZGVQdHItPmFyZ21heCAmJiBhcmdjIC0gb2Zmc2V0ID4gbW9kZVB0ci0+YXJnbWF4KQorCVVzYWdlIChhcmd2WzBdKTsKKworCisKKyAgICBpbml0X2RpYWxvZyAoKTsKKyAgICByZXR2YWwgPSAoKihtb2RlUHRyLT5qdW1wZXIpKSAodGl0bGUsIGFyZ2MgLSBvZmZzZXQsIGFyZ3YgKyBvZmZzZXQpOworCisgICAgaWYgKG9wdF9jbGVhcikgewkJLyogY2xlYXIgc2NyZWVuIGJlZm9yZSBleGl0ICovCisJYXR0cl9jbGVhciAoc3Rkc2NyLCBMSU5FUywgQ09MUywgc2NyZWVuX2F0dHIpOworCXJlZnJlc2ggKCk7CisgICAgfQorICAgIGVuZF9kaWFsb2coKTsKKworICAgIGV4aXQgKHJldHZhbCk7Cit9CisKKy8qCisgKiBQcmludCBwcm9ncmFtIHVzYWdlCisgKi8KK3N0YXRpYyB2b2lkCitVc2FnZSAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBmcHJpbnRmIChzdGRlcnIsICJcCitcbmRpYWxvZywgYnkgU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykuXAorXG4gIHBhdGNoZWQgYnkgU3R1YXJ0IEhlcmJlcnQgKFMuSGVyYmVydEBzaGVmLmFjLnVrKVwKK1xuICBtb2RpZmllZC9ndXR0ZWQgZm9yIHVzZSBhcyBhIExpbnV4IGtlcm5lbCBjb25maWcgdG9vbCBieSBcCitcbiAgV2lsbGlhbSBSb2FkY2FwIChyb2FkY2Fwd0BjZncuY29tKVwKK1xuXAorXG4qIERpc3BsYXkgZGlhbG9nIGJveGVzIGZyb20gc2hlbGwgc2NyaXB0cyAqXAorXG5cCitcblVzYWdlOiAlcyAtLWNsZWFyXAorXG4gICAgICAgJXMgWy0tdGl0bGUgPHRpdGxlPl0gWy0tYmFja3RpdGxlIDxiYWNrdGl0bGU+XSAtLWNsZWFyIDxCb3ggb3B0aW9ucz5cCitcblwKK1xuQm94IG9wdGlvbnM6XAorXG5cCitcbiAgLS1tZW51ICAgICAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gPG1lbnUgaGVpZ2h0PiA8dGFnMT4gPGl0ZW0xPi4uLlwKK1xuICAtLWNoZWNrbGlzdCA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiA8bGlzdCBoZWlnaHQ+IDx0YWcxPiA8aXRlbTE+IDxzdGF0dXMxPi4uLlwKK1xuICAtLXJhZGlvbGlzdCA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiA8bGlzdCBoZWlnaHQ+IDx0YWcxPiA8aXRlbTE+IDxzdGF0dXMxPi4uLlwKK1xuICAtLXRleHRib3ggICA8ZmlsZT4gPGhlaWdodD4gPHdpZHRoPlwKK1xuICAtLWlucHV0Ym94ICA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPiBbPGluaXQ+XVwKK1xuICAtLXllc25vICAgICA8dGV4dD4gPGhlaWdodD4gPHdpZHRoPlwKK1xuIiwgbmFtZSwgbmFtZSk7CisgICAgZXhpdCAoLTEpOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBwcm9ncmFtIGp1bXBlcnMKKyAqLworCitpbnQKK2pfbWVudSAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX21lbnUgKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSwKKwkJCWF0b2kgKGF2WzVdKSwgYXZbNl0sIChhYyAtIDYpIC8gMiwgYXYgKyA3KTsKK30KKworaW50CitqX2NoZWNrbGlzdCAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX2NoZWNrbGlzdCAodCwgYXZbMl0sIGF0b2kgKGF2WzNdKSwgYXRvaSAoYXZbNF0pLAorCWF0b2kgKGF2WzVdKSwgKGFjIC0gNikgLyAzLCBhdiArIDYsIEZMQUdfQ0hFQ0spOworfQorCitpbnQKK2pfcmFkaW9saXN0IChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKiBjb25zdCAqIGF2KQoreworICAgIHJldHVybiBkaWFsb2dfY2hlY2tsaXN0ICh0LCBhdlsyXSwgYXRvaSAoYXZbM10pLCBhdG9pIChhdls0XSksCisJYXRvaSAoYXZbNV0pLCAoYWMgLSA2KSAvIDMsIGF2ICsgNiwgRkxBR19SQURJTyk7Cit9CisKK2ludAoral90ZXh0Ym94IChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKiBjb25zdCAqIGF2KQoreworICAgIHJldHVybiBkaWFsb2dfdGV4dGJveCAodCwgYXZbMl0sIGF0b2kgKGF2WzNdKSwgYXRvaSAoYXZbNF0pKTsKK30KKworaW50CitqX3llc25vIChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKiBjb25zdCAqIGF2KQoreworICAgIHJldHVybiBkaWFsb2dfeWVzbm8gKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSk7Cit9CisKK2ludAoral9pbnB1dGJveCAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICBpbnQgcmV0ID0gZGlhbG9nX2lucHV0Ym94ICh0LCBhdlsyXSwgYXRvaSAoYXZbM10pLCBhdG9pIChhdls0XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWMgPT0gNiA/IGF2WzVdIDogKGNoYXIgKikgTlVMTCk7CisgICAgaWYgKHJldCA9PSAwKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgZGlhbG9nX2lucHV0X3Jlc3VsdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50CitqX21zZ2JveCAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX21zZ2JveCAodCwgYXZbMl0sIGF0b2kgKGF2WzNdKSwgYXRvaSAoYXZbNF0pLCAxKTsKK30KKworaW50CitqX2luZm9ib3ggKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXYpCit7CisgICAgcmV0dXJuIGRpYWxvZ19tc2dib3ggKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSwgMCk7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvbWVudWJveC5jIGIvc2NyaXB0cy9seGRpYWxvZy9tZW51Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkODJiYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvbWVudWJveC5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogIG1lbnVib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBtZW51IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcHdAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiAgQ2hhbmdlcyBieSBDbGlmZm9yZCBXb2xmIChnb2RAY2xpZmZvcmQuYXQpCisgKgorICogIFsgMTk5OC0wNi0xMyBdCisgKgorICogICAgKikgIEEgYnVnZml4IGZvciB0aGUgUGFnZS1Eb3duIHByb2JsZW0KKyAqCisgKiAgICAqKSAgRm9ybWVybHkgd2hlbiBJIHVzZWQgUGFnZSBEb3duIGFuZCBQYWdlIFVwLCB0aGUgY3Vyc29yIHdvdWxkIGJlIHNldCAKKyAqICAgICAgICB0byB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIG1lbnUgYm94LiAgTm93IGx4ZGlhbG9nIGlzIGEgYml0CisgKiAgICAgICAgc21hcnRlciBhbmQgd29ya3MgbW9yZSBsaWtlIG90aGVyIG1lbnUgc3lzdGVtcyAoanVzdCBoYXZlIGEgbG9vayBhdAorICogICAgICAgIGl0KS4KKyAqCisgKiAgICAqKSAgRm9ybWVybHkgaWYgSSBzZWxlY3RlZCBzb21ldGhpbmcgbXkgc2Nyb2xsaW5nIHdvdWxkIGJlIGJyb2tlbiBiZWNhdXNlCisgKiAgICAgICAgbHhkaWFsb2cgaXMgcmUtaW52b2tlZCBieSB0aGUgTWVudWNvbmZpZyBzaGVsbCBzY3JpcHQsIGNhbid0CisgKiAgICAgICAgcmVtZW1iZXIgdGhlIGxhc3Qgc2Nyb2xsaW5nIHBvc2l0aW9uLCBhbmQganVzdCBzZXRzIGl0IHNvIHRoYXQgdGhlCisgKiAgICAgICAgY3Vyc29yIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIGJveC4gIE5vdyBpdCB3cml0ZXMgdGhlIHRlbXBvcmFyeSBmaWxlCisgKiAgICAgICAgbHhkaWFsb2cuc2NybHRtcCB3aGljaCBjb250YWlucyB0aGlzIGluZm9ybWF0aW9uLiBUaGUgZmlsZSBpcworICogICAgICAgIGRlbGV0ZWQgYnkgbHhkaWFsb2cgaWYgdGhlIHVzZXIgbGVhdmVzIGEgc3VibWVudSBvciBlbnRlcnMgYSBuZXcKKyAqICAgICAgICBvbmUsIGJ1dCBpdCB3b3VsZCBiZSBuaWNlIGlmIE1lbnVjb25maWcgY291bGQgbWFrZSBhbm90aGVyICJybSAtZiIKKyAqICAgICAgICBqdXN0IHRvIGJlIHN1cmUuICBKdXN0IHRyeSBpdCBvdXQgLSB5b3Ugd2lsbCByZWNvZ25pc2UgYSBkaWZmZXJlbmNlIQorICoKKyAqICBbIDE5OTgtMDYtMTQgXQorICoKKyAqICAgICopICBOb3cgbHhkaWFsb2cgaXMgY3Jhc2gtc2FmZSBhZ2FpbnN0IGJyb2tlbiAibHhkaWFsb2cuc2NybHRtcCIgZmlsZXMKKyAqICAgICAgICBhbmQgbWVudXMgY2hhbmdlIHRoZWlyIHNpemUgb24gdGhlIGZseS4KKyAqCisgKiAgICAqKSAgSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBsYXN0IHNjcm9sbGluZyBwb3NpdGlvbiBpcyBub3Qgc2F2ZWQgYnkKKyAqICAgICAgICBseGRpYWxvZywgaXQgc2V0cyB0aGUgc2Nyb2xsaW5nIHNvIHRoYXQgdGhlIHNlbGVjdGVkIGl0ZW0gaXMgaW4gdGhlCisgKiAgICAgICAgbWlkZGxlIG9mIHRoZSBtZW51IGJveCwgbm90IGF0IHRoZSBib3R0b20uCisgKgorICogMDIgSmFudWFyeSAxOTk5LCBNaWNoYWVsIEVsaXphYmV0aCBDaGFzdGFpbiAobWVjQHNob3V0Lm5ldCkKKyAqIFJlc2V0ICdzY3JvbGwnIHRvIDAgaWYgdGhlIHZhbHVlIGZyb20gbHhkaWFsb2cuc2NybHRtcCBpcyBib2d1cy4KKyAqIFRoaXMgZml4ZXMgYSBidWcgaW4gTWVudWNvbmZpZyB3aGVyZSB1c2luZyAnICcgdG8gZGVzY2VuZCBpbnRvIG1lbnVzCisgKiB3b3VsZCBsZWF2ZSBtaXMtc3luY2hyb25pemVkIGx4ZGlhbG9nLnNjcmx0bXAgZmlsZXMgbHlpbmcgYXJvdW5kLAorICogZnNjYW5mIHdvdWxkIHJlYWQgaW4gJ3Njcm9sbCcsIGFuZCBldmVudHVhbGx5IHRoYXQgdmFsdWUgd291bGQgZ2V0IHVzZWQuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgaW50IG1lbnVfd2lkdGgsIGl0ZW1feDsKKworLyoKKyAqIFByaW50IG1lbnUgaXRlbQorICovCitzdGF0aWMgdm9pZAorcHJpbnRfaXRlbSAoV0lORE9XICogd2luLCBjb25zdCBjaGFyICppdGVtLCBpbnQgY2hvaWNlLCBpbnQgc2VsZWN0ZWQsIGludCBob3RrZXkpCit7CisgICAgaW50IGo7CisgICAgY2hhciBtZW51X2l0ZW1bbWVudV93aWR0aCsxXTsKKworICAgIHN0cm5jcHkobWVudV9pdGVtLCBpdGVtLCBtZW51X3dpZHRoKTsKKyAgICBtZW51X2l0ZW1bbWVudV93aWR0aF0gPSAwOworICAgIGogPSBmaXJzdF9hbHBoYShtZW51X2l0ZW0sICJZeU5uTW1IaCIpOworCisgICAgLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIGxhc3QgaXRlbSAqLworICAgIHdhdHRyc2V0ICh3aW4sIG1lbnVib3hfYXR0cik7CisgICAgd21vdmUgKHdpbiwgY2hvaWNlLCAwKTsKKyNpZiBPTERfTkNVUlNFUworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtZW51X3dpZHRoOyBpKyspCisJICAgIHdhZGRjaCAod2luLCAnICcpOworICAgIH0KKyNlbHNlCisgICAgd2NscnRvZW9sKHdpbik7CisjZW5kaWYKKyAgICB3YXR0cnNldCAod2luLCBzZWxlY3RlZCA/IGl0ZW1fc2VsZWN0ZWRfYXR0ciA6IGl0ZW1fYXR0cik7CisgICAgbXZ3YWRkc3RyICh3aW4sIGNob2ljZSwgaXRlbV94LCBtZW51X2l0ZW0pOworICAgIGlmIChob3RrZXkpIHsKKyAgICAJd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgOiB0YWdfa2V5X2F0dHIpOworICAgIAltdndhZGRjaCh3aW4sIGNob2ljZSwgaXRlbV94K2osIG1lbnVfaXRlbVtqXSk7CisgICAgfQorICAgIGlmIChzZWxlY3RlZCkgeworCXdtb3ZlICh3aW4sIGNob2ljZSwgaXRlbV94KzEpOworCXdyZWZyZXNoICh3aW4pOworICAgIH0KK30KKworLyoKKyAqIFByaW50IHRoZSBzY3JvbGwgaW5kaWNhdG9ycy4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2Fycm93cyAoV0lORE9XICogd2luLCBpbnQgaXRlbV9ubywgaW50IHNjcm9sbCwKKwkJaW50IHksIGludCB4LCBpbnQgaGVpZ2h0KQoreworICAgIGludCBjdXJfeSwgY3VyX3g7CisKKyAgICBnZXR5eCh3aW4sIGN1cl95LCBjdXJfeCk7CisKKyAgICB3bW92ZSh3aW4sIHksIHgpOworCisgICAgaWYgKHNjcm9sbCA+IDApIHsKKwl3YXR0cnNldCAod2luLCB1YXJyb3dfYXR0cik7CisJd2FkZGNoICh3aW4sIEFDU19VQVJST1cpOworCXdhZGRzdHIgKHdpbiwgIigtKSIpOworICAgIH0KKyAgICBlbHNlIHsKKwl3YXR0cnNldCAod2luLCBtZW51Ym94X2F0dHIpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworCXdhZGRjaCAod2luLCBBQ1NfSExJTkUpOworICAgIH0KKworICAgeSA9IHkgKyBoZWlnaHQgKyAxOworICAgd21vdmUod2luLCB5LCB4KTsKKworICAgaWYgKChoZWlnaHQgPCBpdGVtX25vKSAmJiAoc2Nyb2xsICsgaGVpZ2h0IDwgaXRlbV9ubykpIHsKKwl3YXR0cnNldCAod2luLCBkYXJyb3dfYXR0cik7CisJd2FkZGNoICh3aW4sIEFDU19EQVJST1cpOworCXdhZGRzdHIgKHdpbiwgIigrKSIpOworICAgIH0KKyAgICBlbHNlIHsKKwl3YXR0cnNldCAod2luLCBtZW51Ym94X2JvcmRlcl9hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKyAgIH0KKworICAgd21vdmUod2luLCBjdXJfeSwgY3VyX3gpOworfQorCisvKgorICogRGlzcGxheSB0aGUgdGVybWluYXRpb24gYnV0dG9ucy4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2J1dHRvbnMgKFdJTkRPVyAqd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKyAgICBpbnQgeCA9IHdpZHRoIC8gMiAtIDE2OworICAgIGludCB5ID0gaGVpZ2h0IC0gMjsKKworICAgIHByaW50X2J1dHRvbiAod2luLCAiU2VsZWN0IiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisgICAgcHJpbnRfYnV0dG9uICh3aW4sICIgRXhpdCAiLCB5LCB4ICsgMTIsIHNlbGVjdGVkID09IDEpOworICAgIHByaW50X2J1dHRvbiAod2luLCAiIEhlbHAgIiwgeSwgeCArIDI0LCBzZWxlY3RlZCA9PSAyKTsKKworICAgIHdtb3ZlKHdpbiwgeSwgeCsxKzEyKnNlbGVjdGVkKTsKKyAgICB3cmVmcmVzaCAod2luKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBtZW51IGZvciBjaG9vc2luZyBhbW9uZyBhIG51bWJlciBvZiBvcHRpb25zCisgKi8KK2ludAorZGlhbG9nX21lbnUgKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJaW50IG1lbnVfaGVpZ2h0LCBjb25zdCBjaGFyICpjdXJyZW50LCBpbnQgaXRlbV9ubywKKwkJY29uc3QgY2hhciAqIGNvbnN0ICogaXRlbXMpCisKK3sKKyAgICBpbnQgaSwgaiwgeCwgeSwgYm94X3gsIGJveF95OworICAgIGludCBrZXkgPSAwLCBidXR0b24gPSAwLCBzY3JvbGwgPSAwLCBjaG9pY2UgPSAwLCBmaXJzdF9pdGVtID0gMCwgbWF4X2Nob2ljZTsKKyAgICBXSU5ET1cgKmRpYWxvZywgKm1lbnU7CisgICAgRklMRSAqZjsKKworICAgIG1heF9jaG9pY2UgPSBNSU4gKG1lbnVfaGVpZ2h0LCBpdGVtX25vKTsKKworICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworICAgIHggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisgICAgZHJhd19zaGFkb3cgKHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICBkaWFsb2cgPSBuZXd3aW4gKGhlaWdodCwgd2lkdGgsIHksIHgpOworICAgIGtleXBhZCAoZGlhbG9nLCBUUlVFKTsKKworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgYm9yZGVyX2F0dHIpOworICAgIG12d2FkZGNoIChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJd2FkZGNoIChkaWFsb2csIEFDU19ITElORSk7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIpOworICAgIHdia2dkc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyICYgQV9DT0xPUik7CisgICAgd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgcHJpbnRfYXV0b3dyYXAgKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisgICAgbWVudV93aWR0aCA9IHdpZHRoIC0gNjsKKyAgICBib3hfeSA9IGhlaWdodCAtIG1lbnVfaGVpZ2h0IC0gNTsKKyAgICBib3hfeCA9ICh3aWR0aCAtIG1lbnVfd2lkdGgpIC8gMiAtIDE7CisKKyAgICAvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIG1lbnUgKi8KKyAgICBtZW51ID0gc3Vid2luIChkaWFsb2csIG1lbnVfaGVpZ2h0LCBtZW51X3dpZHRoLAorCQl5ICsgYm94X3kgKyAxLCB4ICsgYm94X3ggKyAxKTsKKyAgICBrZXlwYWQgKG1lbnUsIFRSVUUpOworCisgICAgLyogZHJhdyBhIGJveCBhcm91bmQgdGhlIG1lbnUgaXRlbXMgKi8KKyAgICBkcmF3X2JveCAoZGlhbG9nLCBib3hfeSwgYm94X3gsIG1lbnVfaGVpZ2h0ICsgMiwgbWVudV93aWR0aCArIDIsCisJICAgICAgbWVudWJveF9ib3JkZXJfYXR0ciwgbWVudWJveF9hdHRyKTsKKworICAgIC8qCisgICAgICogRmluZCBsZW5ndGggb2YgbG9uZ2VzdCBpdGVtIGluIG9yZGVyIHRvIGNlbnRlciBtZW51LgorICAgICAqIFNldCAnY2hvaWNlJyB0byBkZWZhdWx0IGl0ZW0uIAorICAgICAqLworICAgIGl0ZW1feCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykgeworCWl0ZW1feCA9IE1BWCAoaXRlbV94LCBNSU4obWVudV93aWR0aCwgc3RybGVuIChpdGVtc1tpICogMiArIDFdKSArIDIpKTsKKwlpZiAoc3RyY21wKGN1cnJlbnQsIGl0ZW1zW2kqMl0pID09IDApIGNob2ljZSA9IGk7CisgICAgfQorCisgICAgaXRlbV94ID0gKG1lbnVfd2lkdGggLSBpdGVtX3gpIC8gMjsKKworICAgIC8qIGdldCB0aGUgc2Nyb2xsIGluZm8gZnJvbSB0aGUgdGVtcCBmaWxlICovCisgICAgaWYgKCAoZj1mb3BlbigibHhkaWFsb2cuc2NybHRtcCIsInIiKSkgIT0gTlVMTCApIHsKKwlpZiAoIChmc2NhbmYoZiwiJWRcbiIsJnNjcm9sbCkgPT0gMSkgJiYgKHNjcm9sbCA8PSBjaG9pY2UpICYmCisJICAgICAoc2Nyb2xsK21heF9jaG9pY2UgPiBjaG9pY2UpICYmIChzY3JvbGwgPj0gMCkgJiYKKwkgICAgIChzY3JvbGwrbWF4X2Nob2ljZSA8PSBpdGVtX25vKSApIHsKKwkgICAgZmlyc3RfaXRlbSA9IHNjcm9sbDsKKwkgICAgY2hvaWNlID0gY2hvaWNlIC0gc2Nyb2xsOworCSAgICBmY2xvc2UoZik7CisJfSBlbHNlIHsKKwkgICAgc2Nyb2xsPTA7CisJICAgIHJlbW92ZSgibHhkaWFsb2cuc2NybHRtcCIpOworCSAgICBmY2xvc2UoZik7CisJICAgIGY9TlVMTDsKKwl9CisgICAgfQorICAgIGlmICggKGNob2ljZSA+PSBtYXhfY2hvaWNlKSB8fCAoZj09TlVMTCAmJiBjaG9pY2UgPj0gbWF4X2Nob2ljZS8yKSApIHsKKwlpZiAoY2hvaWNlID49IGl0ZW1fbm8tbWF4X2Nob2ljZS8yKQorCSAgICBzY3JvbGwgPSBmaXJzdF9pdGVtID0gaXRlbV9uby1tYXhfY2hvaWNlOworCWVsc2UKKwkgICAgc2Nyb2xsID0gZmlyc3RfaXRlbSA9IGNob2ljZSAtIG1heF9jaG9pY2UvMjsKKwljaG9pY2UgPSBjaG9pY2UgLSBzY3JvbGw7CisgICAgfQorCisgICAgLyogUHJpbnQgdGhlIG1lbnUgKi8KKyAgICBmb3IgKGk9MDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCXByaW50X2l0ZW0gKG1lbnUsIGl0ZW1zWyhmaXJzdF9pdGVtICsgaSkgKiAyICsgMV0sIGksIGkgPT0gY2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAoaXRlbXNbKGZpcnN0X2l0ZW0gKyBpKSoyXVswXSAhPSAnOicpKTsKKyAgICB9CisKKyAgICB3bm91dHJlZnJlc2ggKG1lbnUpOworCisgICAgcHJpbnRfYXJyb3dzKGRpYWxvZywgaXRlbV9ubywgc2Nyb2xsLAorCQkgYm94X3ksIGJveF94K2l0ZW1feCsxLCBtZW51X2hlaWdodCk7CisKKyAgICBwcmludF9idXR0b25zIChkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworICAgIHdtb3ZlIChtZW51LCBjaG9pY2UsIGl0ZW1feCsxKTsKKyAgICB3cmVmcmVzaCAobWVudSk7CisKKyAgICB3aGlsZSAoa2V5ICE9IEVTQykgeworCWtleSA9IHdnZXRjaChtZW51KTsKKworCWlmIChrZXkgPCAyNTYgJiYgaXNhbHBoYShrZXkpKSBrZXkgPSB0b2xvd2VyKGtleSk7CisKKwlpZiAoc3RyY2hyKCJ5bm1oIiwga2V5KSkKKwkJaSA9IG1heF9jaG9pY2U7CisJZWxzZSB7CisgICAgICAgIGZvciAoaSA9IGNob2ljZSsxOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCWogPSBmaXJzdF9hbHBoYShpdGVtc1soc2Nyb2xsK2kpKjIrMV0sICJZeU5uTW1IaCIpOworCQlpZiAoa2V5ID09IHRvbG93ZXIoaXRlbXNbKHNjcm9sbCtpKSoyKzFdW2pdKSkKKyAgICAgICAgICAgICAgICAJYnJlYWs7CisJfQorCWlmIChpID09IG1heF9jaG9pY2UpCisgICAgICAgCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCQlqID0gZmlyc3RfYWxwaGEoaXRlbXNbKHNjcm9sbCtpKSoyKzFdLCAiWXlObk1tSGgiKTsKKwkJCWlmIChrZXkgPT0gdG9sb3dlcihpdGVtc1soc2Nyb2xsK2kpKjIrMV1bal0pKQorICAgICAgICAgICAgICAgIAkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaSA8IG1heF9jaG9pY2UgfHwgCisgICAgICAgICAgICBrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSBLRVlfRE9XTiB8fAorICAgICAgICAgICAga2V5ID09ICctJyB8fCBrZXkgPT0gJysnIHx8CisgICAgICAgICAgICBrZXkgPT0gS0VZX1BQQUdFIHx8IGtleSA9PSBLRVlfTlBBR0UpIHsKKworICAgICAgICAgICAgcHJpbnRfaXRlbSAobWVudSwgaXRlbXNbKHNjcm9sbCtjaG9pY2UpKjIrMV0sIGNob2ljZSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc1soc2Nyb2xsK2Nob2ljZSkqMl1bMF0gIT0gJzonKSk7CisKKwkgICAgaWYgKGtleSA9PSBLRVlfVVAgfHwga2V5ID09ICctJykgeworICAgICAgICAgICAgICAgIGlmIChjaG9pY2UgPCAyICYmIHNjcm9sbCkgeworCSAgICAgICAgICAgIC8qIFNjcm9sbCBtZW51IGRvd24gKi8KKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsb2sgKG1lbnUsIFRSVUUpOworICAgICAgICAgICAgICAgICAgICB3c2NybCAobWVudSwgLTEpOworICAgICAgICAgICAgICAgICAgICBzY3JvbGxvayAobWVudSwgRkFMU0UpOworCisgICAgICAgICAgICAgICAgICAgIHNjcm9sbC0tOworCisgICAgICAgICAgICAgICAgICAgIHByaW50X2l0ZW0gKG1lbnUsIGl0ZW1zW3Njcm9sbCAqIDIgKyAxXSwgMCwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zW3Njcm9sbCoyXVswXSAhPSAnOicpKTsKKwkJfSBlbHNlCisJCSAgICBjaG9pY2UgPSBNQVgoY2hvaWNlIC0gMSwgMCk7CisKKwkgICAgfSBlbHNlIGlmIChrZXkgPT0gS0VZX0RPV04gfHwga2V5ID09ICcrJykgIHsKKworCQlwcmludF9pdGVtIChtZW51LCBpdGVtc1soc2Nyb2xsK2Nob2ljZSkqMisxXSwgY2hvaWNlLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zWyhzY3JvbGwrY2hvaWNlKSoyXVswXSAhPSAnOicpKTsKKworICAgICAgICAgICAgICAgIGlmICgoY2hvaWNlID4gbWF4X2Nob2ljZS0zKSAmJgorICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8IGl0ZW1fbm8pCisgICAgICAgICAgICAgICAgICAgKSB7CisJCSAgICAvKiBTY3JvbGwgbWVudSB1cCAqLworCQkgICAgc2Nyb2xsb2sgKG1lbnUsIFRSVUUpOworCQkgICAgd3NjcmwgKG1lbnUsIDEpOworICAgICAgICAgICAgICAgICAgICBzY3JvbGxvayAobWVudSwgRkFMU0UpOworCisgICAgICAgICAgICAgICAgICAgIHNjcm9sbCsrOworCisgICAgICAgICAgICAgICAgICAgIHByaW50X2l0ZW0gKG1lbnUsIGl0ZW1zWyhzY3JvbGwrbWF4X2Nob2ljZS0xKSoyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jaG9pY2UtMSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zWyhzY3JvbGwrbWF4X2Nob2ljZS0xKSoyXVswXSAhPSAnOicpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2hvaWNlID0gTUlOKGNob2ljZSsxLCBtYXhfY2hvaWNlLTEpOworCisJICAgIH0gZWxzZSBpZiAoa2V5ID09IEtFWV9QUEFHRSkgeworCSAgICAgICAgc2Nyb2xsb2sgKG1lbnUsIFRSVUUpOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyAoaSA8IG1heF9jaG9pY2UpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjcm9sbCA+IDApIHsKKyAgICAgICAgICAgICAgICAJd3NjcmwgKG1lbnUsIC0xKTsKKyAgICAgICAgICAgICAgICAJc2Nyb2xsLS07CisgICAgICAgICAgICAgICAgCXByaW50X2l0ZW0gKG1lbnUsIGl0ZW1zW3Njcm9sbCAqIDIgKyAxXSwgMCwgRkFMU0UsCisgICAgICAgICAgICAgICAgCShpdGVtc1tzY3JvbGwqMl1bMF0gIT0gJzonKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hvaWNlID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2UtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY3JvbGxvayAobWVudSwgRkFMU0UpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSBLRVlfTlBBR0UpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgKGkgPCBtYXhfY2hvaWNlKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGwrbWF4X2Nob2ljZSA8IGl0ZW1fbm8pIHsKKwkJCXNjcm9sbG9rIChtZW51LCBUUlVFKTsKKwkJCXdzY3JsIChtZW51LCAxKTsKKwkJCXNjcm9sbG9rIChtZW51LCBGQUxTRSk7CisgICAgICAgICAgICAgICAgCXNjcm9sbCsrOworICAgICAgICAgICAgICAgIAlwcmludF9pdGVtIChtZW51LCBpdGVtc1soc2Nyb2xsK21heF9jaG9pY2UtMSkqMisxXSwKKwkJCSAgICAgICAgICAgIG1heF9jaG9pY2UtMSwgRkFMU0UsCisJCQkgICAgICAgICAgICAoaXRlbXNbKHNjcm9sbCttYXhfY2hvaWNlLTEpKjJdWzBdICE9ICc6JykpOworCQkgICAgfSBlbHNlIHsKKwkJCWlmIChjaG9pY2UrMSA8IG1heF9jaG9pY2UpCisJCQkgICAgY2hvaWNlKys7CisJCSAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBjaG9pY2UgPSBpOworCisgICAgICAgICAgICBwcmludF9pdGVtIChtZW51LCBpdGVtc1soc2Nyb2xsK2Nob2ljZSkqMisxXSwgY2hvaWNlLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAoaXRlbXNbKHNjcm9sbCtjaG9pY2UpKjJdWzBdICE9ICc6JykpOworCisgICAgICAgICAgICBwcmludF9hcnJvd3MoZGlhbG9nLCBpdGVtX25vLCBzY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm94X3ksIGJveF94K2l0ZW1feCsxLCBtZW51X2hlaWdodCk7CisKKyAgICAgICAgICAgIHdub3V0cmVmcmVzaCAoZGlhbG9nKTsKKyAgICAgICAgICAgIHdyZWZyZXNoIChtZW51KTsKKworCSAgICBjb250aW51ZTsJCS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisgICAgICAgIH0KKworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIFRBQjoKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApCisJCQk/IDIgOiAoYnV0dG9uID4gMiA/IDAgOiBidXR0b24pOworCisJICAgIHByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCSAgICB3cmVmcmVzaCAobWVudSk7CisJICAgIGJyZWFrOworCWNhc2UgJyAnOgorCWNhc2UgJ3MnOgorCWNhc2UgJ3knOgorCWNhc2UgJ24nOgorCWNhc2UgJ20nOgorCWNhc2UgJy8nOgorCSAgICAvKiBzYXZlIHNjcm9sbCBpbmZvICovCisJICAgIGlmICggKGY9Zm9wZW4oImx4ZGlhbG9nLnNjcmx0bXAiLCJ3IikpICE9IE5VTEwgKSB7CisJCWZwcmludGYoZiwiJWRcbiIsc2Nyb2xsKTsKKwkJZmNsb3NlKGYpOworCSAgICB9CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMl0pOworICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICAgIGNhc2UgJ3MnOiByZXR1cm4gMzsKKyAgICAgICAgICAgIGNhc2UgJ3knOiByZXR1cm4gMzsKKyAgICAgICAgICAgIGNhc2UgJ24nOiByZXR1cm4gNDsKKyAgICAgICAgICAgIGNhc2UgJ20nOiByZXR1cm4gNTsKKyAgICAgICAgICAgIGNhc2UgJyAnOiByZXR1cm4gNjsKKyAgICAgICAgICAgIGNhc2UgJy8nOiByZXR1cm4gNzsKKyAgICAgICAgICAgIH0KKwkgICAgcmV0dXJuIDA7CisJY2FzZSAnaCc6CisJY2FzZSAnPyc6CisJICAgIGJ1dHRvbiA9IDI7CisJY2FzZSAnXG4nOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIGlmIChidXR0b24gPT0gMikgCisgICAgICAgICAgICAJZnByaW50ZihzdGRlcnIsICIlcyBcIiVzXCJcbiIsIAorCQkJaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyXSwKKwkJCWl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMiArIDFdICsKKwkJCWZpcnN0X2FscGhhKGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMiArIDFdLCIiKSk7CisJICAgIGVsc2UKKyAgICAgICAgICAgIAlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDJdKTsKKworCSAgICByZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwkgICAgcmV0dXJuIGJ1dHRvbjsKKwljYXNlICdlJzoKKwljYXNlICd4JzoKKwkgICAga2V5ID0gRVNDOworCWNhc2UgRVNDOgorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgZGVsd2luIChkaWFsb2cpOworICAgIHJlbW92ZSgibHhkaWFsb2cuc2NybHRtcCIpOworICAgIHJldHVybiAtMTsJCQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9tc2dib3guYyBiL3NjcmlwdHMvbHhkaWFsb2cvbXNnYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2OTJlMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvbXNnYm94LmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqICBtc2dib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBtZXNzYWdlIGJveCBhbmQgaW5mbyBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKy8qCisgKiBEaXNwbGF5IGEgbWVzc2FnZSBib3guIFByb2dyYW0gd2lsbCBwYXVzZSBhbmQgZGlzcGxheSBhbiAiT0siIGJ1dHRvbgorICogaWYgdGhlIHBhcmFtZXRlciAncGF1c2UnIGlzIG5vbi16ZXJvLgorICovCitpbnQKK2RpYWxvZ19tc2dib3ggKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJaW50IHBhdXNlKQoreworICAgIGludCBpLCB4LCB5LCBrZXkgPSAwOworICAgIFdJTkRPVyAqZGlhbG9nOworCisgICAgLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisgICAgeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKyAgICB5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKyAgICBkcmF3X3NoYWRvdyAoc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworICAgIGRpYWxvZyA9IG5ld3dpbiAoaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisgICAga2V5cGFkIChkaWFsb2csIFRSVUUpOworCisgICAgZHJhd19ib3ggKGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisgICAgd2F0dHJzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIpOworICAgIHByaW50X2F1dG93cmFwIChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAyKTsKKworICAgIGlmIChwYXVzZSkgeworCXdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCSAgICB3YWRkY2ggKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworCXByaW50X2J1dHRvbiAoZGlhbG9nLCAiICBPayAgIiwKKwkJICAgICAgaGVpZ2h0IC0gMiwgd2lkdGggLyAyIC0gNCwgVFJVRSk7CisKKwl3cmVmcmVzaCAoZGlhbG9nKTsKKwl3aGlsZSAoa2V5ICE9IEVTQyAmJiBrZXkgIT0gJ1xuJyAmJiBrZXkgIT0gJyAnICYmCisgICAgICAgICAgICAgICBrZXkgIT0gJ08nICYmIGtleSAhPSAnbycgJiYga2V5ICE9ICdYJyAmJiBrZXkgIT0gJ3gnKQorCSAgICBrZXkgPSB3Z2V0Y2ggKGRpYWxvZyk7CisgICAgfSBlbHNlIHsKKwlrZXkgPSAnXG4nOworCXdyZWZyZXNoIChkaWFsb2cpOworICAgIH0KKworICAgIGRlbHdpbiAoZGlhbG9nKTsKKyAgICByZXR1cm4ga2V5ID09IEVTQyA/IC0xIDogMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvdGV4dGJveC5jIGIvc2NyaXB0cy9seGRpYWxvZy90ZXh0Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyM2RmMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvdGV4dGJveC5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogIHRleHRib3guYyAtLSBpbXBsZW1lbnRzIHRoZSB0ZXh0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgdm9pZCBiYWNrX2xpbmVzIChpbnQgbik7CitzdGF0aWMgdm9pZCBwcmludF9wYWdlIChXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitzdGF0aWMgdm9pZCBwcmludF9saW5lIChXSU5ET1cgKiB3aW4sIGludCByb3csIGludCB3aWR0aCk7CitzdGF0aWMgY2hhciAqZ2V0X2xpbmUgKHZvaWQpOworc3RhdGljIHZvaWQgcHJpbnRfcG9zaXRpb24gKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKKworc3RhdGljIGludCBoc2Nyb2xsLCBmZCwgZmlsZV9zaXplLCBieXRlc19yZWFkOworc3RhdGljIGludCBiZWdpbl9yZWFjaGVkID0gMSwgZW5kX3JlYWNoZWQsIHBhZ2VfbGVuZ3RoOworc3RhdGljIGNoYXIgKmJ1ZiwgKnBhZ2U7CisKKy8qCisgKiBEaXNwbGF5IHRleHQgZnJvbSBhIGZpbGUgaW4gYSBkaWFsb2cgYm94LgorICovCitpbnQKK2RpYWxvZ190ZXh0Ym94IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworICAgIGludCBpLCB4LCB5LCBjdXJfeCwgY3VyX3ksIGZwb3MsIGtleSA9IDA7CisgICAgaW50IHBhc3NlZF9lbmQ7CisgICAgY2hhciBzZWFyY2hfdGVybVtNQVhfTEVOICsgMV07CisgICAgV0lORE9XICpkaWFsb2csICp0ZXh0OworCisgICAgc2VhcmNoX3Rlcm1bMF0gPSAnXDAnOwkvKiBubyBzZWFyY2ggdGVybSBlbnRlcmVkIHlldCAqLworCisgICAgLyogT3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nICovCisgICAgaWYgKChmZCA9IG9wZW4gKGZpbGUsIE9fUkRPTkxZKSkgPT0gLTEpIHsKKwllbmR3aW4gKCk7CisJZnByaW50ZiAoc3RkZXJyLAorCQkgIlxuQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwlleGl0ICgtMSk7CisgICAgfQorICAgIC8qIEdldCBmaWxlIHNpemUuIEFjdHVhbGx5LCAnZmlsZV9zaXplJyBpcyB0aGUgcmVhbCBmaWxlIHNpemUgLSAxLAorICAgICAgIHNpbmNlIGl0J3Mgb25seSB0aGUgbGFzdCBieXRlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKyAgICBpZiAoKGZpbGVfc2l6ZSA9IGxzZWVrIChmZCwgMCwgU0VFS19FTkQpKSA9PSAtMSkgeworCWVuZHdpbiAoKTsKKwlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIGdldHRpbmcgZmlsZSBzaXplIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwlleGl0ICgtMSk7CisgICAgfQorICAgIC8qIFJlc3RvcmUgZmlsZSBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBmaWxlIGFmdGVyIGdldHRpbmcgZmlsZSBzaXplICovCisgICAgaWYgKGxzZWVrIChmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJZW5kd2luICgpOworCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgcmVhZCBidWZmZXIgKi8KKyAgICBpZiAoKGJ1ZiA9IG1hbGxvYyAoQlVGX1NJWkUgKyAxKSkgPT0gTlVMTCkgeworCWVuZHdpbiAoKTsKKwlmcHJpbnRmIChzdGRlcnIsICJcbkNhbid0IGFsbG9jYXRlIG1lbW9yeSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICBpZiAoKGJ5dGVzX3JlYWQgPSByZWFkIChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJZW5kd2luICgpOworCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwlleGl0ICgtMSk7CisgICAgfQorICAgIGJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CS8qIG1hcmsgZW5kIG9mIHZhbGlkIGRhdGEgKi8KKyAgICBwYWdlID0gYnVmOwkJCS8qIHBhZ2UgaXMgcG9pbnRlciB0byBzdGFydCBvZiBwYWdlIHRvIGJlIGRpc3BsYXllZCAqLworCisgICAgLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisgICAgeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKyAgICB5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKworICAgIGRyYXdfc2hhZG93IChzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisgICAgZGlhbG9nID0gbmV3d2luIChoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKyAgICBrZXlwYWQgKGRpYWxvZywgVFJVRSk7CisKKyAgICAvKiBDcmVhdGUgd2luZG93IGZvciB0ZXh0IHJlZ2lvbiwgdXNlZCBmb3Igc2Nyb2xsaW5nIHRleHQgKi8KKyAgICB0ZXh0ID0gc3Vid2luIChkaWFsb2csIGhlaWdodCAtIDQsIHdpZHRoIC0gMiwgeSArIDEsIHggKyAxKTsKKyAgICB3YXR0cnNldCAodGV4dCwgZGlhbG9nX2F0dHIpOworICAgIHdia2dkc2V0ICh0ZXh0LCBkaWFsb2dfYXR0ciAmIEFfQ09MT1IpOworCisgICAga2V5cGFkICh0ZXh0LCBUUlVFKTsKKworICAgIC8qIHJlZ2lzdGVyIHRoZSBuZXcgd2luZG93LCBhbG9uZyB3aXRoIGl0cyBib3JkZXJzICovCisgICAgZHJhd19ib3ggKGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKworICAgIHdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKyAgICBtdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQtMywgMCwgQUNTX0xURUUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwl3YWRkY2ggKGRpYWxvZywgQUNTX0hMSU5FKTsKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgd2JrZ2RzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIgJiBBX0NPTE9SKTsKKyAgICB3YWRkY2ggKGRpYWxvZywgQUNTX1JURUUpOworCisgICAgaWYgKHRpdGxlICE9IE5VTEwgJiYgc3RybGVuKHRpdGxlKSA+PSB3aWR0aC0yICkgeworCS8qIHRydW5jYXRlIGxvbmcgdGl0bGUgLS0gbWVjICovCisJY2hhciAqIHRpdGxlMiA9IG1hbGxvYyh3aWR0aC0yKzEpOworCW1lbWNweSggdGl0bGUyLCB0aXRsZSwgd2lkdGgtMiApOworCXRpdGxlMlt3aWR0aC0yXSA9ICdcMCc7CisJdGl0bGUgPSB0aXRsZTI7CisgICAgfQorCisgICAgaWYgKHRpdGxlICE9IE5VTEwpIHsKKwl3YXR0cnNldCAoZGlhbG9nLCB0aXRsZV9hdHRyKTsKKwltdndhZGRjaCAoZGlhbG9nLCAwLCAod2lkdGggLSBzdHJsZW4odGl0bGUpKS8yIC0gMSwgJyAnKTsKKwl3YWRkc3RyIChkaWFsb2csIChjaGFyICopdGl0bGUpOworCXdhZGRjaCAoZGlhbG9nLCAnICcpOworICAgIH0KKyAgICBwcmludF9idXR0b24gKGRpYWxvZywgIiBFeGl0ICIsIGhlaWdodCAtIDIsIHdpZHRoIC8gMiAtIDQsIFRSVUUpOworICAgIHdub3V0cmVmcmVzaCAoZGlhbG9nKTsKKyAgICBnZXR5eCAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBTYXZlIGN1cnNvciBwb3NpdGlvbiAqLworCisgICAgLyogUHJpbnQgZmlyc3QgcGFnZSBvZiB0ZXh0ICovCisgICAgYXR0cl9jbGVhciAodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyLCBkaWFsb2dfYXR0cik7CisgICAgcHJpbnRfcGFnZSAodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKyAgICBwcmludF9wb3NpdGlvbiAoZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKyAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworICAgIHdyZWZyZXNoIChkaWFsb2cpOworCisgICAgd2hpbGUgKChrZXkgIT0gRVNDKSAmJiAoa2V5ICE9ICdcbicpKSB7CisJa2V5ID0gd2dldGNoIChkaWFsb2cpOworCXN3aXRjaCAoa2V5KSB7CisJY2FzZSAnRSc6CQkvKiBFeGl0ICovCisJY2FzZSAnZSc6CisJY2FzZSAnWCc6CisJY2FzZSAneCc6CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgZnJlZSAoYnVmKTsKKwkgICAgY2xvc2UgKGZkKTsKKwkgICAgcmV0dXJuIDA7CisJY2FzZSAnZyc6CQkvKiBGaXJzdCBwYWdlICovCisJY2FzZSBLRVlfSE9NRToKKwkgICAgaWYgKCFiZWdpbl9yZWFjaGVkKSB7CisJCWJlZ2luX3JlYWNoZWQgPSAxOworCQkvKiBGaXJzdCBwYWdlIG5vdCBpbiBidWZmZXI/ICovCisJCWlmICgoZnBvcyA9IGxzZWVrIChmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkgICAgZW5kd2luICgpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJICAgIGV4aXQgKC0xKTsKKwkJfQorCQlpZiAoZnBvcyA+IGJ5dGVzX3JlYWQpIHsJLyogWWVzLCB3ZSBoYXZlIHRvIHJlYWQgaXQgaW4gKi8KKwkJICAgIGlmIChsc2VlayAoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJZW5kd2luICgpOworCQkJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkgImRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCWV4aXQgKC0xKTsKKwkJICAgIH0KKwkJICAgIGlmICgoYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCWVuZHdpbiAoKTsKKwkJCWZwcmludGYgKHN0ZGVyciwKKwkJCSAgICAgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCWV4aXQgKC0xKTsKKwkJICAgIH0KKwkJICAgIGJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCX0KKwkJcGFnZSA9IGJ1ZjsKKwkJcHJpbnRfcGFnZSAodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJcHJpbnRfcG9zaXRpb24gKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCXdtb3ZlIChkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCXdyZWZyZXNoIChkaWFsb2cpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJ0cnOgkJLyogTGFzdCBwYWdlICovCisJY2FzZSBLRVlfRU5EOgorCisJICAgIGVuZF9yZWFjaGVkID0gMTsKKwkgICAgLyogTGFzdCBwYWdlIG5vdCBpbiBidWZmZXI/ICovCisJICAgIGlmICgoZnBvcyA9IGxzZWVrIChmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQllbmR3aW4gKCk7CisJCWZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQgKC0xKTsKKwkgICAgfQorCSAgICBpZiAoZnBvcyA8IGZpbGVfc2l6ZSkgewkvKiBZZXMsIHdlIGhhdmUgdG8gcmVhZCBpdCBpbiAqLworCQlpZiAobHNlZWsgKGZkLCAtQlVGX1NJWkUsIFNFRUtfRU5EKSA9PSAtMSkgeworCQkgICAgZW5kd2luICgpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLAorCQkgICAgICAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJICAgIGV4aXQgKC0xKTsKKwkJfQorCQlpZiAoKGJ5dGVzX3JlYWQgPSByZWFkIChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCSAgICBlbmR3aW4gKCk7CisJCSAgICBmcHJpbnRmIChzdGRlcnIsCisJCQkgICAgICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCSAgICBleGl0ICgtMSk7CisJCX0KKwkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkgICAgfQorCSAgICBwYWdlID0gYnVmICsgYnl0ZXNfcmVhZDsKKwkgICAgYmFja19saW5lcyAoaGVpZ2h0IC0gNCk7CisJICAgIHByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJICAgIHByaW50X3Bvc2l0aW9uIChkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCSAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnSyc6CQkvKiBQcmV2aW91cyBsaW5lICovCisJY2FzZSAnayc6CisJY2FzZSBLRVlfVVA6CisJICAgIGlmICghYmVnaW5fcmVhY2hlZCkgeworCQliYWNrX2xpbmVzIChwYWdlX2xlbmd0aCArIDEpOworCisJCS8qIFdlIGRvbid0IGNhbGwgcHJpbnRfcGFnZSgpIGhlcmUgYnV0IHVzZSBzY3JvbGxpbmcgdG8gZW5zdXJlCisJCSAgIGZhc3RlciBzY3JlZW4gdXBkYXRlLiBIb3dldmVyLCAnZW5kX3JlYWNoZWQnIGFuZAorCQkgICAncGFnZV9sZW5ndGgnIHNob3VsZCBzdGlsbCBiZSB1cGRhdGVkLCBhbmQgJ3BhZ2UnIHNob3VsZAorCQkgICBwb2ludCB0byBzdGFydCBvZiBuZXh0IHBhZ2UuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCisJCSAgIGdldF9saW5lKCkgaW4gdGhlIGZvbGxvd2luZyAnZm9yJyBsb29wLiAqLworCQlzY3JvbGxvayAodGV4dCwgVFJVRSk7CisJCXdzY3JsICh0ZXh0LCAtMSk7CS8qIFNjcm9sbCB0ZXh0IHJlZ2lvbiBkb3duIG9uZSBsaW5lICovCisJCXNjcm9sbG9rICh0ZXh0LCBGQUxTRSk7CisJCXBhZ2VfbGVuZ3RoID0gMDsKKwkJcGFzc2VkX2VuZCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQgLSA0OyBpKyspIHsKKwkJICAgIGlmICghaSkgeworCQkJLyogcHJpbnQgZmlyc3QgbGluZSBvZiBwYWdlICovCisJCQlwcmludF9saW5lICh0ZXh0LCAwLCB3aWR0aCAtIDIpOworCQkJd25vdXRyZWZyZXNoICh0ZXh0KTsKKwkJICAgIH0gZWxzZQorCQkJLyogQ2FsbGVkIHRvIHVwZGF0ZSAnZW5kX3JlYWNoZWQnIGFuZCAncGFnZScgKi8KKwkJCWdldF9saW5lICgpOworCQkgICAgaWYgKCFwYXNzZWRfZW5kKQorCQkJcGFnZV9sZW5ndGgrKzsKKwkJICAgIGlmIChlbmRfcmVhY2hlZCAmJiAhcGFzc2VkX2VuZCkKKwkJCXBhc3NlZF9lbmQgPSAxOworCQl9CisKKwkJcHJpbnRfcG9zaXRpb24gKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCXdtb3ZlIChkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCXdyZWZyZXNoIChkaWFsb2cpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgJ0InOgkJLyogUHJldmlvdXMgcGFnZSAqLworCWNhc2UgJ2InOgorCWNhc2UgS0VZX1BQQUdFOgorCSAgICBpZiAoYmVnaW5fcmVhY2hlZCkKKwkJYnJlYWs7CisJICAgIGJhY2tfbGluZXMgKHBhZ2VfbGVuZ3RoICsgaGVpZ2h0IC0gNCk7CisJICAgIHByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJICAgIHByaW50X3Bvc2l0aW9uIChkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCSAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnSic6CQkvKiBOZXh0IGxpbmUgKi8KKwljYXNlICdqJzoKKwljYXNlIEtFWV9ET1dOOgorCSAgICBpZiAoIWVuZF9yZWFjaGVkKSB7CisJCWJlZ2luX3JlYWNoZWQgPSAwOworCQlzY3JvbGxvayAodGV4dCwgVFJVRSk7CisJCXNjcm9sbCAodGV4dCk7CS8qIFNjcm9sbCB0ZXh0IHJlZ2lvbiB1cCBvbmUgbGluZSAqLworCQlzY3JvbGxvayAodGV4dCwgRkFMU0UpOworCQlwcmludF9saW5lICh0ZXh0LCBoZWlnaHQgLSA1LCB3aWR0aCAtIDIpOworCQl3bm91dHJlZnJlc2ggKHRleHQpOworCQlwcmludF9wb3NpdGlvbiAoZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJd21vdmUgKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJd3JlZnJlc2ggKGRpYWxvZyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBLRVlfTlBBR0U6CQkvKiBOZXh0IHBhZ2UgKi8KKwljYXNlICcgJzoKKwkgICAgaWYgKGVuZF9yZWFjaGVkKQorCQlicmVhazsKKworCSAgICBiZWdpbl9yZWFjaGVkID0gMDsKKwkgICAgcHJpbnRfcGFnZSAodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkgICAgcHJpbnRfcG9zaXRpb24gKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJICAgIHdtb3ZlIChkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJICAgIHdyZWZyZXNoIChkaWFsb2cpOworCSAgICBicmVhazsKKwljYXNlICcwJzoJCS8qIEJlZ2lubmluZyBvZiBsaW5lICovCisJY2FzZSAnSCc6CQkvKiBTY3JvbGwgbGVmdCAqLworCWNhc2UgJ2gnOgorCWNhc2UgS0VZX0xFRlQ6CisJICAgIGlmIChoc2Nyb2xsIDw9IDApCisJCWJyZWFrOworCisJICAgIGlmIChrZXkgPT0gJzAnKQorCQloc2Nyb2xsID0gMDsKKwkgICAgZWxzZQorCQloc2Nyb2xsLS07CisJICAgIC8qIFJlcHJpbnQgY3VycmVudCBwYWdlIHRvIHNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwkgICAgYmFja19saW5lcyAocGFnZV9sZW5ndGgpOworCSAgICBwcmludF9wYWdlICh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCSAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnTCc6CQkvKiBTY3JvbGwgcmlnaHQgKi8KKwljYXNlICdsJzoKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgaWYgKGhzY3JvbGwgPj0gTUFYX0xFTikKKwkJYnJlYWs7CisJICAgIGhzY3JvbGwrKzsKKwkgICAgLyogUmVwcmludCBjdXJyZW50IHBhZ2UgdG8gc2Nyb2xsIGhvcml6b250YWxseSAqLworCSAgICBiYWNrX2xpbmVzIChwYWdlX2xlbmd0aCk7CisJICAgIHByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJICAgIHdtb3ZlIChkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJICAgIHdyZWZyZXNoIChkaWFsb2cpOworCSAgICBicmVhazsKKwljYXNlIEVTQzoKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGRlbHdpbiAoZGlhbG9nKTsKKyAgICBmcmVlIChidWYpOworICAgIGNsb3NlIChmZCk7CisgICAgcmV0dXJuIC0xOwkJCS8qIEVTQyBwcmVzc2VkICovCit9CisKKy8qCisgKiBHbyBiYWNrICduJyBsaW5lcyBpbiB0ZXh0IGZpbGUuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpLgorICogJ3BhZ2UnIHdpbGwgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZGVzaXJlZCBsaW5lIGluICdidWYnLgorICovCitzdGF0aWMgdm9pZAorYmFja19saW5lcyAoaW50IG4pCit7CisgICAgaW50IGksIGZwb3M7CisKKyAgICBiZWdpbl9yZWFjaGVkID0gMDsKKyAgICAvKiBXZSBoYXZlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW5kX3JlYWNoZWQgYW5kICFlbmRfcmVhY2hlZAorICAgICAgIHNpbmNlIGF0IGVuZCBvZiBmaWxlLCB0aGUgbGluZSBpcyBub3QgZW5kZWQgYnkgYSAnXG4nLgorICAgICAgIFRoZSBjb2RlIGluc2lkZSAnaWYnIGJhc2ljYWxseSBkb2VzIGEgJy0tcGFnZScgdG8gbW92ZSBvbmUKKyAgICAgICBjaGFyYWN0ZXIgYmFja3dhcmQgc28gYXMgdG8gc2tpcCAnXG4nIG9mIHRoZSBwcmV2aW91cyBsaW5lICovCisgICAgaWYgKCFlbmRfcmVhY2hlZCkgeworCS8qIEVpdGhlciBiZWdpbm5pbmcgb2YgYnVmZmVyIG9yIGJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQ/ICovCisJaWYgKHBhZ2UgPT0gYnVmKSB7CisJICAgIGlmICgoZnBvcyA9IGxzZWVrIChmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQllbmR3aW4gKCk7CisJCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkgImJhY2tfbGluZXMoKS5cbiIpOworCQlleGl0ICgtMSk7CisJICAgIH0KKwkgICAgaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CS8qIE5vdCBiZWdpbm5pbmcgb2YgZmlsZSB5ZXQgKi8KKwkJLyogV2UndmUgcmVhY2hlZCBiZWdpbm5pbmcgb2YgYnVmZmVyLCBidXQgbm90IGJlZ2lubmluZyBvZgorCQkgICBmaWxlIHlldCwgc28gcmVhZCBwcmV2aW91cyBwYXJ0IG9mIGZpbGUgaW50byBidWZmZXIuCisJCSAgIE5vdGUgdGhhdCB3ZSBvbmx5IG1vdmUgYmFja3dhcmQgZm9yIEJVRl9TSVpFLzIgYnl0ZXMsCisJCSAgIGJ1dCBub3QgQlVGX1NJWkUgYnl0ZXMgdG8gYXZvaWQgcmUtcmVhZGluZyBhZ2FpbiBpbgorCQkgICBwcmludF9wYWdlKCkgbGF0ZXIgKi8KKwkJLyogUmVhbGx5IHBvc3NpYmxlIHRvIG1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcz8gKi8KKwkJaWYgKGZwb3MgPCBCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSB7CisJCSAgICAvKiBObywgbW92ZSBsZXNzIHRoZW4gKi8KKwkJICAgIGlmIChsc2VlayAoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJZW5kd2luICgpOworCQkJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkgImJhY2tfbGluZXMoKS5cbiIpOworCQkJZXhpdCAoLTEpOworCQkgICAgfQorCQkgICAgcGFnZSA9IGJ1ZiArIGZwb3MgLSBieXRlc19yZWFkOworCQl9IGVsc2UgewkvKiBNb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXMgKi8KKwkJICAgIGlmIChsc2VlayAoZmQsIC0oQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCksIFNFRUtfQ1VSKQorCQkJPT0gLTEpIHsKKwkJCWVuZHdpbiAoKTsKKwkJCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciAiCisJCQkJICJpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCWV4aXQgKC0xKTsKKwkJICAgIH0KKwkJICAgIHBhZ2UgPSBidWYgKyBCVUZfU0laRSAvIDI7CisJCX0KKwkJaWYgKChieXRlc19yZWFkID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkgICAgZW5kd2luICgpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gYmFja19saW5lcygpLlxuIik7CisJCSAgICBleGl0ICgtMSk7CisJCX0KKwkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkgICAgfSBlbHNlIHsJCS8qIEJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQgKi8KKwkJYmVnaW5fcmVhY2hlZCA9IDE7CisJCXJldHVybjsKKwkgICAgfQorCX0KKwlpZiAoKigtLXBhZ2UpICE9ICdcbicpIHsJLyogJy0tcGFnZScgaGVyZSAqLworCSAgICAvKiBTb21ldGhpbmcncyB3cm9uZy4uLiAqLworCSAgICBlbmR3aW4gKCk7CisJICAgIGZwcmludGYgKHN0ZGVyciwgIlxuSW50ZXJuYWwgZXJyb3IgaW4gYmFja19saW5lcygpLlxuIik7CisJICAgIGV4aXQgKC0xKTsKKwl9CisgICAgfQorICAgIC8qIEdvIGJhY2sgJ24nIGxpbmVzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwlkbyB7CisJICAgIGlmIChwYWdlID09IGJ1ZikgeworCQlpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJICAgIGVuZHdpbiAoKTsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJCSAgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJICAgIGV4aXQgKC0xKTsKKwkJfQorCQlpZiAoZnBvcyA+IGJ5dGVzX3JlYWQpIHsKKwkJICAgIC8qIFJlYWxseSBwb3NzaWJsZSB0byBtb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXM/ICovCisJCSAgICBpZiAoZnBvcyA8IEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpIHsKKwkJCS8qIE5vLCBtb3ZlIGxlc3MgdGhlbiAqLworCQkJaWYgKGxzZWVrIChmZCwgMCwgU0VFS19TRVQpID09IC0xKSB7CisJCQkgICAgZW5kd2luICgpOworCQkJICAgIGZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciAiCisJCQkJICAgICAiaW4gYmFja19saW5lcygpLlxuIik7CisJCQkgICAgZXhpdCAoLTEpOworCQkJfQorCQkJcGFnZSA9IGJ1ZiArIGZwb3MgLSBieXRlc19yZWFkOworCQkgICAgfSBlbHNlIHsJLyogTW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzICovCisJCQlpZiAobHNlZWsgKGZkLCAtKEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpLAorCQkJCSAgIFNFRUtfQ1VSKSA9PSAtMSkgeworCQkJICAgIGVuZHdpbiAoKTsKKwkJCSAgICBmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIiCisJCQkJICAgICAiIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJICAgIGV4aXQgKC0xKTsKKwkJCX0KKwkJCXBhZ2UgPSBidWYgKyBCVUZfU0laRSAvIDI7CisJCSAgICB9CisJCSAgICBpZiAoKGJ5dGVzX3JlYWQgPSByZWFkIChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQllbmR3aW4gKCk7CisJCQlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiAiCisJCQkJICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCWV4aXQgKC0xKTsKKwkJICAgIH0KKwkJICAgIGJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCX0gZWxzZSB7CS8qIEJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQgKi8KKwkJICAgIGJlZ2luX3JlYWNoZWQgPSAxOworCQkgICAgcmV0dXJuOworCQl9CisJICAgIH0KKwl9IHdoaWxlICgqKC0tcGFnZSkgIT0gJ1xuJyk7CisgICAgcGFnZSsrOworfQorCisvKgorICogUHJpbnQgYSBuZXcgcGFnZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKS4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X3BhZ2UgKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworICAgIGludCBpLCBwYXNzZWRfZW5kID0gMDsKKworICAgIHBhZ2VfbGVuZ3RoID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwlwcmludF9saW5lICh3aW4sIGksIHdpZHRoKTsKKwlpZiAoIXBhc3NlZF9lbmQpCisJICAgIHBhZ2VfbGVuZ3RoKys7CisJaWYgKGVuZF9yZWFjaGVkICYmICFwYXNzZWRfZW5kKQorCSAgICBwYXNzZWRfZW5kID0gMTsKKyAgICB9CisgICAgd25vdXRyZWZyZXNoICh3aW4pOworfQorCisvKgorICogUHJpbnQgYSBuZXcgbGluZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKSBhbmQgcHJpbnRfcGFnZSgpLgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfbGluZSAoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpCit7CisgICAgaW50IHksIHg7CisgICAgY2hhciAqbGluZTsKKworICAgIGxpbmUgPSBnZXRfbGluZSAoKTsKKyAgICBsaW5lICs9IE1JTiAoc3RybGVuIChsaW5lKSwgaHNjcm9sbCk7CS8qIFNjcm9sbCBob3Jpem9udGFsbHkgKi8KKyAgICB3bW92ZSAod2luLCByb3csIDApOwkvKiBtb3ZlIGN1cnNvciB0byBjb3JyZWN0IGxpbmUgKi8KKyAgICB3YWRkY2ggKHdpbiwgJyAnKTsKKyAgICB3YWRkbnN0ciAod2luLCBsaW5lLCBNSU4gKHN0cmxlbiAobGluZSksIHdpZHRoIC0gMikpOworCisgICAgZ2V0eXggKHdpbiwgeSwgeCk7CisgICAgLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIHByZXZpb3VzIGxpbmUgKi8KKyNpZiBPTERfTkNVUlNFUworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIHg7IGkrKykKKwkgICAgd2FkZGNoICh3aW4sICcgJyk7CisgICAgfQorI2Vsc2UKKyAgICB3Y2xydG9lb2wod2luKTsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIGN1cnJlbnQgbGluZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKSBhbmQgcHJpbnRfbGluZSgpLgorICogJ3BhZ2UnIHNob3VsZCBwb2ludCB0byBzdGFydCBvZiBjdXJyZW50IGxpbmUgYmVmb3JlIGNhbGxpbmcsIGFuZCB3aWxsIGJlCisgKiB1cGRhdGVkIHRvIHBvaW50IHRvIHN0YXJ0IG9mIG5leHQgbGluZS4KKyAqLworc3RhdGljIGNoYXIgKgorZ2V0X2xpbmUgKHZvaWQpCit7CisgICAgaW50IGkgPSAwLCBmcG9zOworICAgIHN0YXRpYyBjaGFyIGxpbmVbTUFYX0xFTiArIDFdOworCisgICAgZW5kX3JlYWNoZWQgPSAwOworICAgIHdoaWxlICgqcGFnZSAhPSAnXG4nKSB7CisJaWYgKCpwYWdlID09ICdcMCcpIHsKKwkgICAgLyogRWl0aGVyIGVuZCBvZiBmaWxlIG9yIGVuZCBvZiBidWZmZXIgcmVhY2hlZCAqLworCSAgICBpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJZW5kd2luICgpOworCQlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJICJnZXRfbGluZSgpLlxuIik7CisJCWV4aXQgKC0xKTsKKwkgICAgfQorCSAgICBpZiAoZnBvcyA8IGZpbGVfc2l6ZSkgewkvKiBOb3QgZW5kIG9mIGZpbGUgeWV0ICovCisJCS8qIFdlJ3ZlIHJlYWNoZWQgZW5kIG9mIGJ1ZmZlciwgYnV0IG5vdCBlbmQgb2YgZmlsZSB5ZXQsCisJCSAgIHNvIHJlYWQgbmV4dCBwYXJ0IG9mIGZpbGUgaW50byBidWZmZXIgKi8KKwkJaWYgKChieXRlc19yZWFkID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkgICAgZW5kd2luICgpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZ2V0X2xpbmUoKS5cbiIpOworCQkgICAgZXhpdCAoLTEpOworCQl9CisJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJCXBhZ2UgPSBidWY7CisJICAgIH0gZWxzZSB7CisJCWlmICghZW5kX3JlYWNoZWQpCisJCSAgICBlbmRfcmVhY2hlZCA9IDE7CisJCWJyZWFrOworCSAgICB9CisJfSBlbHNlIGlmIChpIDwgTUFYX0xFTikKKwkgICAgbGluZVtpKytdID0gKihwYWdlKyspOworCWVsc2UgeworCSAgICAvKiBUcnVuY2F0ZSBsaW5lcyBsb25nZXIgdGhhbiBNQVhfTEVOIGNoYXJhY3RlcnMgKi8KKwkgICAgaWYgKGkgPT0gTUFYX0xFTikKKwkJbGluZVtpKytdID0gJ1wwJzsKKwkgICAgcGFnZSsrOworCX0KKyAgICB9CisgICAgaWYgKGkgPD0gTUFYX0xFTikKKwlsaW5lW2ldID0gJ1wwJzsKKyAgICBpZiAoIWVuZF9yZWFjaGVkKQorCXBhZ2UrKzsJCQkvKiBtb3ZlIHBhc3MgJ1xuJyAqLworCisgICAgcmV0dXJuIGxpbmU7Cit9CisKKy8qCisgKiBQcmludCBjdXJyZW50IHBvc2l0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9wb3NpdGlvbiAoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgaW50IGZwb3MsIHBlcmNlbnQ7CisKKyAgICBpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwllbmR3aW4gKCk7CisJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIHByaW50X3Bvc2l0aW9uKCkuXG4iKTsKKwlleGl0ICgtMSk7CisgICAgfQorICAgIHdhdHRyc2V0ICh3aW4sIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyKTsKKyAgICB3YmtnZHNldCAod2luLCBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAmIEFfQ09MT1IpOworICAgIHBlcmNlbnQgPSAhZmlsZV9zaXplID8KKwkxMDAgOiAoKGZwb3MgLSBieXRlc19yZWFkICsgcGFnZSAtIGJ1ZikgKiAxMDApIC8gZmlsZV9zaXplOworICAgIHdtb3ZlICh3aW4sIGhlaWdodCAtIDMsIHdpZHRoIC0gOSk7CisgICAgd3ByaW50dyAod2luLCAiKCUzZCUlKSIsIHBlcmNlbnQpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy91dGlsLmMgYi9zY3JpcHRzL2x4ZGlhbG9nL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JjZTliCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy91dGlsLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiAgdXRpbC5jCisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKworLyogdXNlIGNvbG9ycyBieSBkZWZhdWx0PyAqLworYm9vbCB1c2VfY29sb3JzID0gMTsKKworY29uc3QgY2hhciAqYmFja3RpdGxlID0gTlVMTDsKKworY29uc3QgY2hhciAqZGlhbG9nX3Jlc3VsdDsKKworLyogCisgKiBBdHRyaWJ1dGUgdmFsdWVzLCBkZWZhdWx0IGlzIGZvciBtb25vIGRpc3BsYXkKKyAqLworY2h0eXBlIGF0dHJpYnV0ZXNbXSA9Cit7CisgICAgQV9OT1JNQUwsCQkJLyogc2NyZWVuX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBzaGFkb3dfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIGRpYWxvZ19hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHRpdGxlX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBib3JkZXJfYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiBidXR0b25fYWN0aXZlX2F0dHIgKi8KKyAgICBBX0RJTSwJCQkvKiBidXR0b25faW5hY3RpdmVfYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiBidXR0b25fa2V5X2FjdGl2ZV9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIGlucHV0Ym94X2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBpbnB1dGJveF9ib3JkZXJfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIHNlYXJjaGJveF9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHNlYXJjaGJveF90aXRsZV9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogc2VhcmNoYm94X2JvcmRlcl9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogbWVudWJveF9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogbWVudWJveF9ib3JkZXJfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIGl0ZW1fYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiBpdGVtX3NlbGVjdGVkX2F0dHIgKi8KKyAgICBBX0JPTEQsCQkJLyogdGFnX2F0dHIgKi8KKyAgICBBX1JFVkVSU0UsCQkJLyogdGFnX3NlbGVjdGVkX2F0dHIgKi8KKyAgICBBX0JPTEQsCQkJLyogdGFnX2tleV9hdHRyICovCisgICAgQV9SRVZFUlNFLAkJCS8qIHRhZ19rZXlfc2VsZWN0ZWRfYXR0ciAqLworICAgIEFfQk9MRCwJCQkvKiBjaGVja19hdHRyICovCisgICAgQV9SRVZFUlNFLAkJCS8qIGNoZWNrX3NlbGVjdGVkX2F0dHIgKi8KKyAgICBBX0JPTEQsCQkJLyogdWFycm93X2F0dHIgKi8KKyAgICBBX0JPTEQJCQkvKiBkYXJyb3dfYXR0ciAqLworfTsKKworCisjaW5jbHVkZSAiY29sb3JzLmgiCisKKy8qCisgKiBUYWJsZSBvZiBjb2xvciB2YWx1ZXMKKyAqLworaW50IGNvbG9yX3RhYmxlW11bM10gPQoreworICAgIHtTQ1JFRU5fRkcsIFNDUkVFTl9CRywgU0NSRUVOX0hMfSwKKyAgICB7U0hBRE9XX0ZHLCBTSEFET1dfQkcsIFNIQURPV19ITH0sCisgICAge0RJQUxPR19GRywgRElBTE9HX0JHLCBESUFMT0dfSEx9LAorICAgIHtUSVRMRV9GRywgVElUTEVfQkcsIFRJVExFX0hMfSwKKyAgICB7Qk9SREVSX0ZHLCBCT1JERVJfQkcsIEJPUkRFUl9ITH0sCisgICAge0JVVFRPTl9BQ1RJVkVfRkcsIEJVVFRPTl9BQ1RJVkVfQkcsIEJVVFRPTl9BQ1RJVkVfSEx9LAorICAgIHtCVVRUT05fSU5BQ1RJVkVfRkcsIEJVVFRPTl9JTkFDVElWRV9CRywgQlVUVE9OX0lOQUNUSVZFX0hMfSwKKyAgICB7QlVUVE9OX0tFWV9BQ1RJVkVfRkcsIEJVVFRPTl9LRVlfQUNUSVZFX0JHLCBCVVRUT05fS0VZX0FDVElWRV9ITH0sCisgICAge0JVVFRPTl9LRVlfSU5BQ1RJVkVfRkcsIEJVVFRPTl9LRVlfSU5BQ1RJVkVfQkcsIEJVVFRPTl9LRVlfSU5BQ1RJVkVfSEx9LAorICAgIHtCVVRUT05fTEFCRUxfQUNUSVZFX0ZHLCBCVVRUT05fTEFCRUxfQUNUSVZFX0JHLCBCVVRUT05fTEFCRUxfQUNUSVZFX0hMfSwKKyAgICB7QlVUVE9OX0xBQkVMX0lOQUNUSVZFX0ZHLCBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfQkcsCisgICAgIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9ITH0sCisgICAge0lOUFVUQk9YX0ZHLCBJTlBVVEJPWF9CRywgSU5QVVRCT1hfSEx9LAorICAgIHtJTlBVVEJPWF9CT1JERVJfRkcsIElOUFVUQk9YX0JPUkRFUl9CRywgSU5QVVRCT1hfQk9SREVSX0hMfSwKKyAgICB7U0VBUkNIQk9YX0ZHLCBTRUFSQ0hCT1hfQkcsIFNFQVJDSEJPWF9ITH0sCisgICAge1NFQVJDSEJPWF9USVRMRV9GRywgU0VBUkNIQk9YX1RJVExFX0JHLCBTRUFSQ0hCT1hfVElUTEVfSEx9LAorICAgIHtTRUFSQ0hCT1hfQk9SREVSX0ZHLCBTRUFSQ0hCT1hfQk9SREVSX0JHLCBTRUFSQ0hCT1hfQk9SREVSX0hMfSwKKyAgICB7UE9TSVRJT05fSU5ESUNBVE9SX0ZHLCBQT1NJVElPTl9JTkRJQ0FUT1JfQkcsIFBPU0lUSU9OX0lORElDQVRPUl9ITH0sCisgICAge01FTlVCT1hfRkcsIE1FTlVCT1hfQkcsIE1FTlVCT1hfSEx9LAorICAgIHtNRU5VQk9YX0JPUkRFUl9GRywgTUVOVUJPWF9CT1JERVJfQkcsIE1FTlVCT1hfQk9SREVSX0hMfSwKKyAgICB7SVRFTV9GRywgSVRFTV9CRywgSVRFTV9ITH0sCisgICAge0lURU1fU0VMRUNURURfRkcsIElURU1fU0VMRUNURURfQkcsIElURU1fU0VMRUNURURfSEx9LAorICAgIHtUQUdfRkcsIFRBR19CRywgVEFHX0hMfSwKKyAgICB7VEFHX1NFTEVDVEVEX0ZHLCBUQUdfU0VMRUNURURfQkcsIFRBR19TRUxFQ1RFRF9ITH0sCisgICAge1RBR19LRVlfRkcsIFRBR19LRVlfQkcsIFRBR19LRVlfSEx9LAorICAgIHtUQUdfS0VZX1NFTEVDVEVEX0ZHLCBUQUdfS0VZX1NFTEVDVEVEX0JHLCBUQUdfS0VZX1NFTEVDVEVEX0hMfSwKKyAgICB7Q0hFQ0tfRkcsIENIRUNLX0JHLCBDSEVDS19ITH0sCisgICAge0NIRUNLX1NFTEVDVEVEX0ZHLCBDSEVDS19TRUxFQ1RFRF9CRywgQ0hFQ0tfU0VMRUNURURfSEx9LAorICAgIHtVQVJST1dfRkcsIFVBUlJPV19CRywgVUFSUk9XX0hMfSwKKyAgICB7REFSUk9XX0ZHLCBEQVJST1dfQkcsIERBUlJPV19ITH0sCit9OwkJCQkvKiBjb2xvcl90YWJsZSAqLworCisvKgorICogU2V0IHdpbmRvdyB0byBhdHRyaWJ1dGUgJ2F0dHInCisgKi8KK3ZvaWQKK2F0dHJfY2xlYXIgKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIHdhdHRyc2V0ICh3aW4sIGF0dHIpOworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCXdtb3ZlICh3aW4sIGksIDApOworCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCSAgICB3YWRkY2ggKHdpbiwgJyAnKTsKKyAgICB9CisgICAgdG91Y2h3aW4gKHdpbik7Cit9CisKK3ZvaWQgZGlhbG9nX2NsZWFyICh2b2lkKQoreworICAgIGF0dHJfY2xlYXIgKHN0ZHNjciwgTElORVMsIENPTFMsIHNjcmVlbl9hdHRyKTsKKyAgICAvKiBEaXNwbGF5IGJhY2tncm91bmQgdGl0bGUgaWYgaXQgZXhpc3RzIC4uLiAtIFNMSCAqLworICAgIGlmIChiYWNrdGl0bGUgIT0gTlVMTCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICB3YXR0cnNldCAoc3Rkc2NyLCBzY3JlZW5fYXR0cik7CisgICAgICAgIG12d2FkZHN0ciAoc3Rkc2NyLCAwLCAxLCAoY2hhciAqKWJhY2t0aXRsZSk7CisgICAgICAgIHdtb3ZlIChzdGRzY3IsIDEsIDEpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgQ09MUyAtIDE7IGkrKykKKyAgICAgICAgICAgIHdhZGRjaCAoc3Rkc2NyLCBBQ1NfSExJTkUpOworICAgIH0KKyAgICB3bm91dHJlZnJlc2ggKHN0ZHNjcik7Cit9CisKKy8qCisgKiBEbyBzb21lIGluaXRpYWxpemF0aW9uIGZvciBkaWFsb2cKKyAqLwordm9pZAoraW5pdF9kaWFsb2cgKHZvaWQpCit7CisgICAgaW5pdHNjciAoKTsJCQkvKiBJbml0IGN1cnNlcyAqLworICAgIGtleXBhZCAoc3Rkc2NyLCBUUlVFKTsKKyAgICBjYnJlYWsgKCk7CisgICAgbm9lY2hvICgpOworCisKKyAgICBpZiAodXNlX2NvbG9ycykJLyogU2V0IHVwIGNvbG9ycyAqLworCWNvbG9yX3NldHVwICgpOworCisKKyAgICBkaWFsb2dfY2xlYXIgKCk7Cit9CisKKy8qCisgKiBTZXR1cCBmb3IgY29sb3IgZGlzcGxheQorICovCit2b2lkCitjb2xvcl9zZXR1cCAodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChoYXNfY29sb3JzICgpKSB7CS8qIFRlcm1pbmFsIHN1cHBvcnRzIGNvbG9yPyAqLworCXN0YXJ0X2NvbG9yICgpOworCisJLyogSW5pdGlhbGl6ZSBjb2xvciBwYWlycyAqLworCWZvciAoaSA9IDA7IGkgPCBBVFRSSUJVVEVfQ09VTlQ7IGkrKykKKwkgICAgaW5pdF9wYWlyIChpICsgMSwgY29sb3JfdGFibGVbaV1bMF0sIGNvbG9yX3RhYmxlW2ldWzFdKTsKKworCS8qIFNldHVwIGNvbG9yIGF0dHJpYnV0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVRUUklCVVRFX0NPVU5UOyBpKyspCisJICAgIGF0dHJpYnV0ZXNbaV0gPSBDX0FUVFIgKGNvbG9yX3RhYmxlW2ldWzJdLCBpICsgMSk7CisgICAgfQorfQorCisvKgorICogRW5kIHVzaW5nIGRpYWxvZyBmdW5jdGlvbnMuCisgKi8KK3ZvaWQKK2VuZF9kaWFsb2cgKHZvaWQpCit7CisgICAgZW5kd2luICgpOworfQorCisKKy8qCisgKiBQcmludCBhIHN0cmluZyBvZiB0ZXh0IGluIGEgd2luZG93LCBhdXRvbWF0aWNhbGx5IHdyYXAgYXJvdW5kIHRvIHRoZQorICogbmV4dCBsaW5lIGlmIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcgdG8gZml0IG9uIG9uZSBsaW5lLiBOZXdsaW5lCisgKiBjaGFyYWN0ZXJzICdcbicgYXJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4gIFdlIHN0YXJ0IG9uIGEgbmV3IGxpbmUKKyAqIGlmIHRoZXJlIGlzIG5vIHJvb20gZm9yIGF0IGxlYXN0IDQgbm9uYmxhbmtzIGZvbGxvd2luZyBhIGRvdWJsZS1zcGFjZS4KKyAqLwordm9pZAorcHJpbnRfYXV0b3dyYXAgKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgd2lkdGgsIGludCB5LCBpbnQgeCkKK3sKKyAgICBpbnQgbmV3bCwgY3VyX3gsIGN1cl95OworICAgIGludCBpLCBwcm9tcHRfbGVuLCByb29tLCB3bGVuOworICAgIGNoYXIgdGVtcHN0cltNQVhfTEVOICsgMV0sICp3b3JkLCAqc3AsICpzcDI7CisKKyAgICBzdHJjcHkgKHRlbXBzdHIsIHByb21wdCk7CisKKyAgICBwcm9tcHRfbGVuID0gc3RybGVuKHRlbXBzdHIpOworCQorICAgIC8qCisgICAgICogUmVtb3ZlIG5ld2xpbmVzCisgICAgICovCisgICAgZm9yKGk9MDsgaTxwcm9tcHRfbGVuOyBpKyspIHsKKwlpZih0ZW1wc3RyW2ldID09ICdcbicpIHRlbXBzdHJbaV0gPSAnICc7CisgICAgfQorCisgICAgaWYgKHByb21wdF9sZW4gPD0gd2lkdGggLSB4ICogMikgewkvKiBJZiBwcm9tcHQgaXMgc2hvcnQgKi8KKwl3bW92ZSAod2luLCB5LCAod2lkdGggLSBwcm9tcHRfbGVuKSAvIDIpOworCXdhZGRzdHIgKHdpbiwgdGVtcHN0cik7CisgICAgfSBlbHNlIHsKKwljdXJfeCA9IHg7CisJY3VyX3kgPSB5OworCW5ld2wgPSAxOworCXdvcmQgPSB0ZW1wc3RyOworCXdoaWxlICh3b3JkICYmICp3b3JkKSB7CisJICAgIHNwID0gaW5kZXgod29yZCwgJyAnKTsKKwkgICAgaWYgKHNwKQorCSAgICAgICAgKnNwKysgPSAwOworCisJICAgIC8qIFdyYXAgdG8gbmV4dCBsaW5lIGlmIGVpdGhlciB0aGUgd29yZCBkb2VzIG5vdCBmaXQsCisJICAgICAgIG9yIGl0IGlzIHRoZSBmaXJzdCB3b3JkIG9mIGEgbmV3IHNlbnRlbmNlLCBhbmQgaXQgaXMKKwkgICAgICAgc2hvcnQsIGFuZCB0aGUgbmV4dCB3b3JkIGRvZXMgbm90IGZpdC4gKi8KKwkgICAgcm9vbSA9IHdpZHRoIC0gY3VyX3g7CisJICAgIHdsZW4gPSBzdHJsZW4od29yZCk7CisJICAgIGlmICh3bGVuID4gcm9vbSB8fAorCSAgICAgICAobmV3bCAmJiB3bGVuIDwgNCAmJiBzcCAmJiB3bGVuKzErc3RybGVuKHNwKSA+IHJvb20KKwkJICAgICAmJiAoIShzcDIgPSBpbmRleChzcCwgJyAnKSkgfHwgd2xlbisxKyhzcDItc3ApID4gcm9vbSkpKSB7CisJCWN1cl95Kys7CisJCWN1cl94ID0geDsKKwkgICAgfQorCSAgICB3bW92ZSAod2luLCBjdXJfeSwgY3VyX3gpOworCSAgICB3YWRkc3RyICh3aW4sIHdvcmQpOworCSAgICBnZXR5eCAod2luLCBjdXJfeSwgY3VyX3gpOworCSAgICBjdXJfeCsrOworCSAgICBpZiAoc3AgJiYgKnNwID09ICcgJykgeworCSAgICAgICAgY3VyX3grKzsJLyogZG91YmxlIHNwYWNlICovCisJCXdoaWxlICgqKytzcCA9PSAnICcpOworCQluZXdsID0gMTsKKwkgICAgfSBlbHNlCisJICAgICAgICBuZXdsID0gMDsKKwkgICAgd29yZCA9IHNwOworCX0KKyAgICB9Cit9CisKKy8qCisgKiBQcmludCBhIGJ1dHRvbgorICovCit2b2lkCitwcmludF9idXR0b24gKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKQoreworICAgIGludCBpLCB0ZW1wOworCisgICAgd21vdmUgKHdpbiwgeSwgeCk7CisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fYWN0aXZlX2F0dHIgOiBidXR0b25faW5hY3RpdmVfYXR0cik7CisgICAgd2FkZHN0ciAod2luLCAiPCIpOworICAgIHRlbXAgPSBzdHJzcG4gKGxhYmVsLCAiICIpOworICAgIGxhYmVsICs9IHRlbXA7CisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fbGFiZWxfYWN0aXZlX2F0dHIKKwkgICAgICA6IGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcDsgaSsrKQorCXdhZGRjaCAod2luLCAnICcpOworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2tleV9hY3RpdmVfYXR0cgorCSAgICAgIDogYnV0dG9uX2tleV9pbmFjdGl2ZV9hdHRyKTsKKyAgICB3YWRkY2ggKHdpbiwgbGFiZWxbMF0pOworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyCisJICAgICAgOiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0cik7CisgICAgd2FkZHN0ciAod2luLCAoY2hhciAqKWxhYmVsICsgMSk7CisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fYWN0aXZlX2F0dHIgOiBidXR0b25faW5hY3RpdmVfYXR0cik7CisgICAgd2FkZHN0ciAod2luLCAiPiIpOworICAgIHdtb3ZlICh3aW4sIHksIHggKyB0ZW1wICsgMSk7Cit9CisKKy8qCisgKiBEcmF3IGEgcmVjdGFuZ3VsYXIgYm94IHdpdGggbGluZSBkcmF3aW5nIGNoYXJhY3RlcnMKKyAqLwordm9pZAorZHJhd19ib3ggKFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJICBjaHR5cGUgYm94LCBjaHR5cGUgYm9yZGVyKQoreworICAgIGludCBpLCBqOworCisgICAgd2F0dHJzZXQgKHdpbiwgMCk7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJd21vdmUgKHdpbiwgeSArIGksIHgpOworCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCSAgICBpZiAoIWkgJiYgIWopCisJCXdhZGRjaCAod2luLCBib3JkZXIgfCBBQ1NfVUxDT1JORVIpOworCSAgICBlbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgIWopCisJCXdhZGRjaCAod2luLCBib3JkZXIgfCBBQ1NfTExDT1JORVIpOworCSAgICBlbHNlIGlmICghaSAmJiBqID09IHdpZHRoIC0gMSkKKwkJd2FkZGNoICh3aW4sIGJveCB8IEFDU19VUkNPUk5FUik7CisJICAgIGVsc2UgaWYgKGkgPT0gaGVpZ2h0IC0gMSAmJiBqID09IHdpZHRoIC0gMSkKKwkJd2FkZGNoICh3aW4sIGJveCB8IEFDU19MUkNPUk5FUik7CisJICAgIGVsc2UgaWYgKCFpKQorCQl3YWRkY2ggKHdpbiwgYm9yZGVyIHwgQUNTX0hMSU5FKTsKKwkgICAgZWxzZSBpZiAoaSA9PSBoZWlnaHQgLSAxKQorCQl3YWRkY2ggKHdpbiwgYm94IHwgQUNTX0hMSU5FKTsKKwkgICAgZWxzZSBpZiAoIWopCisJCXdhZGRjaCAod2luLCBib3JkZXIgfCBBQ1NfVkxJTkUpOworCSAgICBlbHNlIGlmIChqID09IHdpZHRoIC0gMSkKKwkJd2FkZGNoICh3aW4sIGJveCB8IEFDU19WTElORSk7CisJICAgIGVsc2UKKwkJd2FkZGNoICh3aW4sIGJveCB8ICcgJyk7CisgICAgfQorfQorCisvKgorICogRHJhdyBzaGFkb3dzIGFsb25nIHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2UgdG8gZ2l2ZSBhIG1vcmUgM0QgbG9vaworICogdG8gdGhlIGJveGVzCisgKi8KK3ZvaWQKK2RyYXdfc2hhZG93IChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworICAgIGludCBpOworCisgICAgaWYgKGhhc19jb2xvcnMgKCkpIHsJLyogV2hldGhlciB0ZXJtaW5hbCBzdXBwb3J0cyBjb2xvcj8gKi8KKwl3YXR0cnNldCAod2luLCBzaGFkb3dfYXR0cik7CisJd21vdmUgKHdpbiwgeSArIGhlaWdodCwgeCArIDIpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCSAgICB3YWRkY2ggKHdpbiwgd2luY2ggKHdpbikgJiBBX0NIQVJURVhUKTsKKwlmb3IgKGkgPSB5ICsgMTsgaSA8IHkgKyBoZWlnaHQgKyAxOyBpKyspIHsKKwkgICAgd21vdmUgKHdpbiwgaSwgeCArIHdpZHRoKTsKKwkgICAgd2FkZGNoICh3aW4sIHdpbmNoICh3aW4pICYgQV9DSEFSVEVYVCk7CisJICAgIHdhZGRjaCAod2luLCB3aW5jaCAod2luKSAmIEFfQ0hBUlRFWFQpOworCX0KKwl3bm91dHJlZnJlc2ggKHdpbik7CisgICAgfQorfQorCisvKgorICogIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGFscGhhYmV0aWMgY2hhcmFjdGVyIGluIGEgc3RyaW5nLgorICovCitpbnQKK2ZpcnN0X2FscGhhKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZXhlbXB0KQoreworCWludCBpLCBpbl9wYXJlbj0wLCBjOworCisJZm9yIChpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKwkJYyA9IHRvbG93ZXIoc3RyaW5nW2ldKTsKKworCQlpZiAoc3RyY2hyKCI8WygiLCBjKSkgKytpbl9wYXJlbjsKKwkJaWYgKHN0cmNocigiPl0pIiwgYykgJiYgaW5fcGFyZW4gPiAwKSAtLWluX3BhcmVuOworCisJCWlmICgoISBpbl9wYXJlbikgJiYgaXNhbHBoYShjKSAmJiAKKwkJICAgICBzdHJjaHIoZXhlbXB0LCBjKSA9PSAwKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL3llc25vLmMgYi9zY3JpcHRzL2x4ZGlhbG9nL3llc25vLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmY2MyNQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cveWVzbm8uYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqICB5ZXNuby5jIC0tIGltcGxlbWVudHMgdGhlIHllcy9ubyBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworLyoKKyAqIERpc3BsYXkgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZAorcHJpbnRfYnV0dG9ucyhXSU5ET1cgKmRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisgICAgaW50IHggPSB3aWR0aCAvIDIgLSAxMDsKKyAgICBpbnQgeSA9IGhlaWdodCAtIDI7CisKKyAgICBwcmludF9idXR0b24gKGRpYWxvZywgIiBZZXMgIiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisgICAgcHJpbnRfYnV0dG9uIChkaWFsb2csICIgIE5vICAiLCB5LCB4ICsgMTMsIHNlbGVjdGVkID09IDEpOworCisgICAgd21vdmUoZGlhbG9nLCB5LCB4KzEgKyAxMypzZWxlY3RlZCApOworICAgIHdyZWZyZXNoIChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggd2l0aCB0d28gYnV0dG9ucyAtIFllcyBhbmQgTm8KKyAqLworaW50CitkaWFsb2dfeWVzbm8gKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaSwgeCwgeSwga2V5ID0gMCwgYnV0dG9uID0gMDsKKyAgICBXSU5ET1cgKmRpYWxvZzsKKworICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworICAgIHggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisgICAgZHJhd19zaGFkb3cgKHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICBkaWFsb2cgPSBuZXd3aW4gKGhlaWdodCwgd2lkdGgsIHksIHgpOworICAgIGtleXBhZCAoZGlhbG9nLCBUUlVFKTsKKworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgYm9yZGVyX2F0dHIpOworICAgIG12d2FkZGNoIChkaWFsb2csIGhlaWdodC0zLCAwLCBBQ1NfTFRFRSk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCXdhZGRjaCAoZGlhbG9nLCBBQ1NfSExJTkUpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICB3YWRkY2ggKGRpYWxvZywgQUNTX1JURUUpOworCisgICAgaWYgKHRpdGxlICE9IE5VTEwgJiYgc3RybGVuKHRpdGxlKSA+PSB3aWR0aC0yICkgeworCS8qIHRydW5jYXRlIGxvbmcgdGl0bGUgLS0gbWVjICovCisJY2hhciAqIHRpdGxlMiA9IG1hbGxvYyh3aWR0aC0yKzEpOworCW1lbWNweSggdGl0bGUyLCB0aXRsZSwgd2lkdGgtMiApOworCXRpdGxlMlt3aWR0aC0yXSA9ICdcMCc7CisJdGl0bGUgPSB0aXRsZTI7CisgICAgfQorCisgICAgaWYgKHRpdGxlICE9IE5VTEwpIHsKKwl3YXR0cnNldCAoZGlhbG9nLCB0aXRsZV9hdHRyKTsKKwltdndhZGRjaCAoZGlhbG9nLCAwLCAod2lkdGggLSBzdHJsZW4odGl0bGUpKS8yIC0gMSwgJyAnKTsKKwl3YWRkc3RyIChkaWFsb2csIChjaGFyICopdGl0bGUpOworCXdhZGRjaCAoZGlhbG9nLCAnICcpOworICAgIH0KKworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICBwcmludF9hdXRvd3JhcCAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKyAgICBwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKyAgICB3aGlsZSAoa2V5ICE9IEVTQykgeworCWtleSA9IHdnZXRjaCAoZGlhbG9nKTsKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgJ1knOgorCWNhc2UgJ3knOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIHJldHVybiAwOworCWNhc2UgJ04nOgorCWNhc2UgJ24nOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIHJldHVybiAxOworCisJY2FzZSBUQUI6CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApCisJCQk/IDEgOiAoYnV0dG9uID4gMSA/IDAgOiBidXR0b24pOworCisJICAgIHByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnICc6CisJY2FzZSAnXG4nOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIHJldHVybiBidXR0b247CisJY2FzZSBFU0M6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgcmV0dXJuIC0xOwkJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL21ha2Vsc3QgYi9zY3JpcHRzL21ha2Vsc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzRiZDcyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21ha2Vsc3QKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKyMgQSBzY3JpcHQgdG8gZHVtcCBtaXhlZCBzb3VyY2UgY29kZSAmIGFzc2VtYmx5CisjIHdpdGggY29ycmVjdCByZWxvY2F0aW9ucyBmcm9tIFN5c3RlbS5tYXAKKyMgUmVxdWlyZXMgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiBSdWxlcy5tYWtlLgorIyBBdXRob3Iocyk6IERKIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKSAKKyMgICAgICAgICAgICBXaWxsaWFtIFN0ZWFybnMgPHdzdGVhcm5zQHBvYm94LmNvbT4KKyMlLmxzdDogJS5jCisjCSQoQ0MpICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgJChDRkxBR1NfJEApIC1nIC1jIC1vICQqLm8gJDwKKyMJJChUT1BESVIpL3NjcmlwdHMvbWFrZWxzdCAkKi5vICQoVE9QRElSKS9TeXN0ZW0ubWFwICQoT0JKRFVNUCkKKyMKKyMgICAgQ29weXJpZ2h0IChDKSAyMDAwIElCTSBDb3Jwb3JhdGlvbgorIyAgICBBdXRob3Iocyk6IERKIEJhcnJvdyAoZGpiYXJyb3dAZGUuaWJtLmNvbSxiYXJyb3dfZGpAeWFob28uY29tKSAKKyMKKwordDE9YCQzIC0tc3ltcyAkMSB8IGdyZXAgLnRleHQgfCBncmVwICIgRiAiIHwgaGVhZCAtbiAxYAoraWYgWyAtbiAiJHQxIiBdOyB0aGVuCisgIHQyPWBlY2hvICR0MSB8IGdhd2sgJ3sgcHJpbnQgJDYgfSdgCisgIGlmIFsgISAtciAkMiBdOyB0aGVuCisgICAgZWNobyAiTm8gU3lzdGVtLm1hcCIgPiYyCisgICAgdDc9MAorICBlbHNlCisgICAgdDM9YGdyZXAgJHQyICQyYAorICAgIHQ0PWBlY2hvICR0MyB8IGdhd2sgJ3sgcHJpbnQgJDEgfSdgCisgICAgdDU9YGVjaG8gJHQxIHwgZ2F3ayAneyBwcmludCAkMSB9J2AKKyAgICB0Nj1gZWNobyAkdDQgLSAkdDUgfCB0ciBhLWYgQS1GYAorICAgIHQ3PWAoIGVjaG8gIGliYXNlPTE2IDsgZWNobyAkdDYgKSB8IGJjYAorICBmaQorZWxzZQorICB0Nz0wCitmaQorJDMgLXIgLS1zb3VyY2UgLS1hZGp1c3Qtdm1hPSR0NyAkMQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlbWFuIGIvc2NyaXB0cy9tYWtlbWFuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiM2FmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21ha2VtYW4KQEAgLTAsMCArMSwxODUgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OworCisjIyBDb3B5cmlnaHQgKEMpIE1pY2hhZWwgU3RpbGwgKG1pa2FsQHN0aWxsaHEuY29tKQorIyMgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMCisjIworIyMgQSBzY3JpcHQgdG8gbWFrZSBvciBpbnN0YWxsIHRoZSBtYW5wYWdlcyBleHRyYWN0ZWQgYnkgc3BsaXQtbWFuCisjIworIyMgQXJndWVtZW50czogJDEgLS0gdGhlIHdvcmQgImNvbnZlcnQiIG9yICJpbnN0YWxsIgorIyMgICAgICAgICAgICAgJDIgLS0gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBTR01MIGZpbGVzIGZvciB0aGUgbWFucGFnZXMKKyMjICAgICAgICAgICAgICQzIC0tIHRoZSBmaWxlbmFtZSB3aGljaCBjb250YWluZWQgdGhlIHNnbWxkb2Mgb3V0cHV0CisjIyAgICAgICAgICAgICAgICAgICAgIChJIG5lZWQgdGhpcyBzbyBJIGtub3cgd2hpY2ggbWFucGFnZXMgdG8gY29udmVydCkKKworbXkoJExJU1RJTkcsICRHRU5FUkFURUQsICRJTlBVVCwgJE9VVFBVVCwgJGZyb250LCAkbW9kZSwgJGZpbGVuYW1lLCAkdG1wZGlyKTsKKworaWYoJEFSR1ZbMF0gZXEgIiIpeworICBkaWUgIlVzYWdlOiBtYWtlbWFuIFtjb252ZXJ0IHwgaW5zdGFsbF0gPGRpcj4gPGZpbGU+XG4iOworfQorCitpZiggISAtZCAiJEFSR1ZbMV0iICl7CisgIGRpZSAiT3V0cHV0IGRpcmVjdG9yeSBcIiRBUkdWWzFdXCIgZG9lcyBub3QgZXhpc3RcbiI7Cit9CisKK2lmKCRFTlZ7IlRNUERJUiJ9IG5lICIiKXsKKyAgJHRtcGRpciA9ICRFTlZ7IlRNUERJUiJ9OworfQorZWxzZXsKKyAgJHRtcGRpciA9ICIvdG1wIjsKK30KKworaWYoJEFSR1ZbMF0gZXEgImNvbnZlcnQiKXsKKyAgb3BlbiBMSVNUSU5HLCAiZ3JlcCBcIjxyZWZlbnRyeXRpdGxlPlwiICRBUkdWWzJdIHwiOworICB3aGlsZSg8TElTVElORz4peworICAgIHMvPFwvLiokLy87CisgICAgcy9eLio+Ly87CisgICAgcy9cLnNnbWwvLzsKKyAgICBzL3N0cnVjdCAvLzsKKyAgICBzL3R5cGVkZWYgLy87CisKKyAgICBjaG9tcDsKKyAgICAkZmlsZW5hbWUgPSAkXzsKKyAgICBwcmludCAiUHJvY2Vzc2luZyAkZmlsZW5hbWVcbiI7CisKKyAgICAjIE9wZW4gdGhlIGlucHV0IGZpbGUgdG8gZXh0cmFjdCB0aGUgZnJvbnQgbWF0dGVyLCBnZW5lcmF0ZSB0aGUgbWFuIHBhZ2UsCisgICAgIyBhbmQgb3BlbiBpdCwgYW5kIHRoZSByZWFycmFuZ2UgZXZlcnl0aGluZyB1bnRpbCBpdCBpcyBoYXBweQorICAgIG9wZW4gSU5QVVQsICI8ICRBUkdWWzFdLyRmaWxlbmFtZS5zZ21sIjsKKyAgICAkZnJvbnQgPSAiIjsKKyAgICAkbW9kZSA9IDA7CisKKyAgICAjIFRoZSBtb2RlcyB1c2VkIGhlcmUgYXJlOgorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMAorICAgICMgPCEtLSBCRUdJTkZST05UVEFHIC0tPgorICAgICMgPCEtLSA8Ym9va2luZm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMQorICAgICMgPCEtLSAgIDxsZWdhbG5vdGljZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMgorICAgICMgPCEtLSAgICAgLi4uR1BMIG9yIHdoYXRldmVyLi4uCisgICAgIyA8IS0tICAgPC9sZWdhbG5vdGljZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSA0CisgICAgIyA8IS0tIDwvYm9va2luZm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAzCisgICAgIyA8IS0tIEVOREZST05UVEFHIC0tPgorICAgICMKKyAgICAjIC4uLmRvY28uLi4KKworICAgICMgSSBrbm93IHRoYXQgc29tZSBvZiB0aGUgaWYgc3RhdGVtZW50cyBpbiB0aGlzIHdoaWxlIGxvb3AgYXJlIGluIGEgZnVubnkKKyAgICAjIG9yZGVyLCBidXQgdGhhdCBpcyBkZWxpYmVyYXRlLi4uCisgICAgd2hpbGUoPElOUFVUPil7CisgICAgICBpZigkbW9kZSA+IDApeworCXMvPCEtLSAvLzsKKwlzLyAtLT4vLzsKKwlzLzxkb2NpbmZvPi8vaTsKKwlzPFwvZG9jaW5mbz4vL2k7CisJcy9eWyBcdF0qLy9pOworICAgICAgfQorCisgICAgICBpZigkbW9kZSA9PSAyKXsKKwlpZigvPHBhcmE+L2kpeworCX0KKwllbHNpZigvPFwvcGFyYT4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250LlxcXCIgXG4iOworCX0KKwllbHNpZigvPFwvbGVnYWxub3RpY2U+L2kpeworCSAgJG1vZGUgPSA0OworCX0KKwllbHNpZigvXlsgXHRdKiQvKXsKKwl9CisJZWxzZXsKKwkgICRmcm9udCA9ICIkZnJvbnQuXFxcIiAgICAgJF8iOworCX0KKyAgICAgIH0KKworICAgICAgaWYoJG1vZGUgPT0gMSl7CisJaWYoLzx0aXRsZT4oLiopPFwvdGl0bGU+L2kpeworCSAgJGZyb250ID0gIiRmcm9udC5cXFwiIFRoaXMgZG9jdW1lbnRhdGlvbiB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGJvb2sgdGl0bGVkIFwiJDFcIiwgd2hpY2ggaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIHNvdXJjZS5cbi5cXFwiIFxuIjsKKwl9CisJZWxzaWYoLzxsZWdhbG5vdGljZT4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250LlxcXCIgVGhpcyBkb2N1bWVudGF0aW9uIGNvbWVzIHdpdGggdGhlIGZvbGxvd2luZyBsZWdhbCBub3RpY2U6XG4uXFxcIiBcbiI7CisJICAkbW9kZSA9IDI7CisJfQorCisJZWxzaWYoLzxhdXRob3I+L2kpeworCSAgJGZyb250ID0gIiRmcm9udC5cXFwiIERvY3VtZW50YXRpb24gYnk6ICI7CisJfQorCWVsc2lmKC88Zmlyc3RuYW1lPiguKik8XC9maXJzdG5hbWU+L2kpeworCSAgJGZyb250ID0gIiRmcm9udCQxICI7CisJfQorCWVsc2lmKC88c3VybmFtZT4oLiopPFwvc3VybmFtZT4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250JDEgIjsKKwl9CisJZWxzaWYoLzxlbWFpbD4oLiopPFwvZW1haWw+L2kpeworCSAgJGZyb250ID0gIiRmcm9udCgkMSkiOworCX0KKwllbHNpZigvXC9hdXRob3I+L2kpeworCSAgJGZyb250ID0gIiRmcm9udFxuIjsKKwl9CisKKwllbHNpZigvPGNvcHlyaWdodD4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250LlxcXCIgRG9jdW1lbnRhdGlvbiBjb3B5cmlnaHQ6ICI7CisJfQorCWVsc2lmKC88aG9sZGVyPiguKik8XC9ob2xkZXI+L2kpeworCSAgJGZyb250ID0gIiRmcm9udCQxICI7CisJfQorCWVsc2lmKC88eWVhcj4oLiopPFwveWVhcj4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250JDEgIjsKKwl9CisJZWxzaWYoL1wvY29weXJpZ2h0Pi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnRcbiI7CisJfQorCisJZWxzaWYoL15bIFx0XSokLworCSAgICAgIHx8IC88YWZmaWxpYXRpb24+L2kKKwkgICAgICB8fCAvPFwvYWZmaWxpYXRpb24+L2kKKwkgICAgICB8fCAvPGFkZHJlc3M+L2kKKwkgICAgICB8fCAvPFwvYWRkcmVzcz4vaQorCSAgICAgIHx8IC88YXV0aG9yZ3JvdXA+L2kKKwkgICAgICB8fCAvPFwvYXV0aG9yZ3JvdXA+L2kKKwkgICAgICB8fCAvPFwvbGVnYWxub3RpY2U+L2kKKyAgICAgICAgICAgICAgfHwgLzxkYXRlPi9pCisgICAgICAgICAgICAgIHx8IC88XC9kYXRlPi9pCisgICAgICAgICAgICAgIHx8IC88ZWRpdGlvbj4vaQorICAgICAgICAgICAgICB8fCAvPFwvZWRpdGlvbj4vaQorCSAgICAgIHx8IC88cHViZGF0ZT4vaQorCSAgICAgIHx8IC88XC9wdWJkYXRlPi9pKXsKKwl9CisJZWxzZXsKKwkgIHByaW50ICJVbmtub3duIHRhZyBpbiBtYW5wYWdlIGNvbnZlcnNpb246ICRfIjsKKwkgIH0KKyAgICAgIH0KKworICAgICAgaWYoJG1vZGUgPT0gMCl7CisJaWYoLzxib29raW5mbz4vaSl7CisJICAkbW9kZSA9IDE7CisJfQorICAgICAgfQorCisgICAgICBpZigkbW9kZSA9PSA0KXsKKwlpZigvPFwvYm9va2luZm8+L2kpeworCSAgJG1vZGUgPSAzOworCX0KKyAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgSU5QVVQ7CisKKyAgICBzeXN0ZW0oImNkICRBUkdWWzFdOyBkb2Nib29rMm1hbiAkZmlsZW5hbWUuc2dtbDsgbXYgJGZpbGVuYW1lLjkgJHRtcGRpci8kJC45XG4iKTsKKyAgICBvcGVuIEdFTkVSQVRFRCwgIjwgJHRtcGRpci8kJC45IjsKKyAgICBvcGVuIE9VVFBVVCwgIj4gJEFSR1ZbMV0vJGZpbGVuYW1lLjkiOworCisgICAgcHJpbnQgT1VUUFVUICIkZnJvbnQiOworICAgIHByaW50IE9VVFBVVCAiLlxcXCIgRm9yIGNvbW1lbnRzIG9uIHRoZSBmb3JtYXR0aW5nIG9mIHRoaXMgbWFucGFnZSwgcGxlYXNlIGNvbnRhY3QgTWljaGFlbCBTdGlsbCA8bWlrYWxcQHN0aWxsaHEuY29tPlxuXG4iOworICAgIHdoaWxlKDxHRU5FUkFURUQ+KXsKKyAgICAgIHByaW50IE9VVFBVVCAiJF8iOworICAgIH0KKyAgICBjbG9zZSBPVVRQVVQ7CisgICAgY2xvc2UgR0VORVJBVEVEOworCisgICAgc3lzdGVtKCJnemlwIC1mICRBUkdWWzFdLyRmaWxlbmFtZS45XG4iKTsKKyAgICB1bmxpbmsoIiR0bXBkaXIvJCQuOSIpOworICB9Cit9CitlbHNpZigkQVJHVlswXSBlcSAiaW5zdGFsbCIpeworICBzeXN0ZW0oIm1rZGlyIC1wIC91c3IvbG9jYWwvbWFuL21hbjkvOyBpbnN0YWxsICRBUkdWWzFdLyouOS5neiAvdXNyL2xvY2FsL21hbi9tYW45LyIpOworfQorZWxzZXsKKyAgZGllICJVc2FnZTogbWFrZW1hbiBbY29udmVydCB8IGluc3RhbGxdIDxkaXI+IDxmaWxlPlxuIjsKK30KKworcHJpbnQgIkRvbmVcbiI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL21rY29tcGlsZV9oIGIvc2NyaXB0cy9ta2NvbXBpbGVfaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDExOGQxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ta2NvbXBpbGVfaApAQCAtMCwwICsxLDc4IEBACitUQVJHRVQ9JDEKK0FSQ0g9JDIKK1NNUD0kMworQ0M9JDQKKworIyBJZiBjb21waWxlLmggZXhpc3RzIGFscmVhZHkgYW5kIHdlIGRvbid0IG93biBhdXRvY29uZi5oCisjIChpLmUuIHdlJ3JlIG5vdCB0aGUgc2FtZSB1c2VyIHdobyBkaWQgbWFrZSAqY29uZmlnKSwgZG9uJ3QKKyMgbW9kaWZ5IGNvbXBpbGUuaAorIyBTbyAic3VkbyBtYWtlIGluc3RhbGwiIHdvbid0IGNoYW5nZSB0aGUgImNvbXBpbGVkIGJ5IDx1c2VyPiIKKyMgZG8gImNvbXBpbGVkIGJ5IHJvb3QiCisKK2lmIFsgLXIgJFRBUkdFVCAtYSAhIC1PIGluY2x1ZGUvbGludXgvYXV0b2NvbmYuaCBdOyB0aGVuCisgIGVjaG8gIiAgU0tJUFBFRCAkVEFSR0VUIgorICBleGl0IDAKK2ZpCisKKyMgRG8gbm90IGV4cGFuZCBuYW1lcworc2V0IC1mCisKK2lmIFsgLXIgLnZlcnNpb24gXTsgdGhlbgorICBWRVJTSU9OPWBjYXQgLnZlcnNpb25gCitlbHNlCisgIFZFUlNJT049MAorICBlY2hvIDAgPiAudmVyc2lvbgorZmkKKworCitVVFNfVkVSU0lPTj0iIyRWRVJTSU9OIgoraWYgWyAtbiAiJFNNUCIgXSA7IHRoZW4gVVRTX1ZFUlNJT049IiRVVFNfVkVSU0lPTiBTTVAiOyBmaQorVVRTX1ZFUlNJT049IiRVVFNfVkVSU0lPTiBgTENfQUxMPUMgTEFORz1DIGRhdGVgIgorCisjIFRydW5jYXRlIHRvIG1heGltdW0gbGVuZ3RoCisKK1VUU19MRU49NjQKK1VUU19UUlVOQ0FURT0ic2VkIC1lIHMvXCguXHsxLCRVVFNfTEVOXH1cKS4qL1wxLyIKKworIyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBjb21waWxlLmgKKworKCBlY2hvIC9cKiBUaGlzIGZpbGUgaXMgYXV0byBnZW5lcmF0ZWQsIHZlcnNpb24gJFZFUlNJT04gXCovCisKKyAgZWNobyBcI2RlZmluZSBVVFNfTUFDSElORSBcIiRBUkNIXCIKKworICBlY2hvIFwjZGVmaW5lIFVUU19WRVJTSU9OIFwiYGVjaG8gJFVUU19WRVJTSU9OIHwgJFVUU19UUlVOQ0FURWBcIgorCisgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9USU1FIFwiYExDX0FMTD1DIExBTkc9QyBkYXRlICslVGBcIgorICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfQlkgXCJgd2hvYW1pYFwiCisgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9IT1NUIFwiYGhvc3RuYW1lIHwgJFVUU19UUlVOQ0FURWBcIgorCisgIGlmIFsgLXggL2Jpbi9kbnNkb21haW5uYW1lIF07IHRoZW4KKyAgICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfRE9NQUlOIFwiYGRuc2RvbWFpbm5hbWUgfCAkVVRTX1RSVU5DQVRFYFwiCisgIGVsaWYgWyAteCAvYmluL2RvbWFpbm5hbWUgXTsgdGhlbgorICAgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9ET01BSU4gXCJgZG9tYWlubmFtZSB8ICRVVFNfVFJVTkNBVEVgXCIKKyAgZWxzZQorICAgIGVjaG8gXCNkZWZpbmUgTElOVVhfQ09NUElMRV9ET01BSU4KKyAgZmkKKworICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVSIFwiYCRDQyAtdiAyPiYxIHwgdGFpbCAtbiAxYFwiCispID4gLnRtcGNvbXBpbGUKKworIyBPbmx5IHJlcGxhY2UgdGhlIHJlYWwgY29tcGlsZS5oIGlmIHRoZSBuZXcgb25lIGlzIGRpZmZlcmVudCwKKyMgaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIHRpbWVzdGFtcCBhbmQgYXZvaWQgdW5uZWNlc3NhcnkKKyMgcmVjb21waWxhdGlvbnMuCisjIFdlIGRvbid0IGNvbnNpZGVyIHRoZSBmaWxlIGNoYW5nZWQgaWYgb25seSB0aGUgZGF0ZS90aW1lIGNoYW5nZWQuCisjIEEga2VybmVsIGNvbmZpZyBjaGFuZ2Ugd2lsbCBpbmNyZWFzZSB0aGUgZ2VuZXJhdGlvbiBudW1iZXIsIHRodXMKKyMgY2F1c2luZyBjb21waWxlLmggdG8gYmUgdXBkYXRlZCAoaW5jbHVkaW5nIGRhdGUvdGltZSkgZHVlIHRvIHRoZSAKKyMgY2hhbmdlZCBjb21tZW50IGluIHRoZQorIyBmaXJzdCBsaW5lLgorCitpZiBbIC1yICRUQVJHRVQgXSAmJiBcCisgICAgICBncmVwIC12ICdVVFNfVkVSU0lPTlx8TElOVVhfQ09NUElMRV9USU1FJyAkVEFSR0VUID4gLnRtcHZlci4xICYmIFwKKyAgICAgIGdyZXAgLXYgJ1VUU19WRVJTSU9OXHxMSU5VWF9DT01QSUxFX1RJTUUnIC50bXBjb21waWxlID4gLnRtcHZlci4yICYmIFwKKyAgICAgIGNtcCAtcyAudG1wdmVyLjEgLnRtcHZlci4yOyB0aGVuCisgICBybSAtZiAudG1wY29tcGlsZQorZWxzZQorICAgZWNobyAiICBVUEQgICAgICRUQVJHRVQiCisgICBtdiAtZiAudG1wY29tcGlsZSAkVEFSR0VUCitmaQorcm0gLWYgLnRtcHZlci4xIC50bXB2ZXIuMgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta21ha2VmaWxlIGIvc2NyaXB0cy9ta21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDYyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rbWFrZWZpbGUKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL3NoCisjIEdlbmVyYXRlcyBhIHNtYWxsIE1ha2VmaWxlIHVzZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIG91dHB1dAorIyBkaXJlY3RvcnksIHRvIGFsbG93IG1ha2UgdG8gYmUgc3RhcnRlZCBmcm9tIHRoZXJlLgorIyBUaGUgTWFrZWZpbGUgYWxzbyBhbGxvdyBmb3IgbW9yZSBjb252aW5pZW50IGJ1aWxkIG9mIGV4dGVybmFsIG1vZHVsZXMKKworIyBVc2FnZQorIyAkMSAtIEtlcm5lbCBzcmMgZGlyZWN0b3J5CisjICQyIC0gT3V0cHV0IGRpcmVjdG9yeQorIyAkMyAtIHZlcnNpb24KKyMgJDQgLSBwYXRjaGxldmVsCisKKworY2F0IDw8IEVPRgorIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAkMDogZG9uJ3QgZWRpdAorCitWRVJTSU9OID0gJDMKK1BBVENITEVWRUwgPSAkNAorCitLRVJORUxTUkMgICAgOj0gJDEKK0tFUk5FTE9VVFBVVCA6PSAkMgorCitNQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKKworYWxsOgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpCisKKyU6OgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpIFwkQAorCitFT0YKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta3N5c21hcCBiL3NjcmlwdHMvbWtzeXNtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0MzBlMAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbWtzeXNtYXAKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoIC14CisjIEJhc2VkIG9uIHRoZSB2bWxpbnV4IGZpbGUgY3JlYXRlIHRoZSBTeXN0ZW0ubWFwIGZpbGUKKyMgU3lzdGVtLm1hcCBpcyB1c2VkIGJ5IG1vZHVsZS1pbml0IHRvb2xzIGFuZCBzb21lIGRlYnVnZ2luZworIyB0b29scyB0byByZXRyZWl2ZSB0aGUgYWN0dWFsIGFkZHJlc3NlcyBvZiBzeW1ib2xzIGluIHRoZSBrZXJuZWwuCisjCisjIFVzYWdlCisjIG1rc3lzbWFwIHZtbGludXggU3lzdGVtLm1hcAorCisKKyMjIyMjCisjIEdlbmVyYXRlIFN5c3RlbS5tYXAgKGFjdHVhbCBmaWxlbmFtZSBwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50KQorCisjICROTSBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIG91dHB1dDoKKyMgZjAwODFlODAgVCBhbGxvY192ZnNtbnQKKworIyAgIFRoZSBzZWNvbmQgcm93IHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIHN5bWJvbDoKKyMgICBBID0gQWJzb2x1dGUKKyMgICBCID0gVW5pbml0aWFsaXNlZCBkYXRhICguYnNzKQorIyAgIEMgPSBDb21vbiBzeW1ib2wKKyMgICBEID0gSW5pdGlhbGlzZWQgZGF0YQorIyAgIEcgPSBJbml0aWFsaXNlZCBkYXRhIGZvciBzbWFsbCBvYmplY3RzCisjICAgSSA9IEluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbAorIyAgIE4gPSBEZWJ1Z2dpbmcgc3ltYm9sCisjICAgUiA9IFJlYWQgb25seQorIyAgIFMgPSBVbmluaXRpYWxpc2VkIGRhdGEgZm9yIHNtYWxsIG9iamVjdHMKKyMgICBUID0gVGV4dCBjb2RlIHN5bWJvbAorIyAgIFUgPSBVbmRlZmluZWQgc3ltYm9sCisjICAgViA9IFdlYWsgc3ltYm9sCisjICAgVyA9IFdlYWsgc3ltYm9sCisjICAgQ29ycmVzcG9uZGluZyBzbWFsbCBsZXR0ZXJzIGFyZSBsb2NhbCBzeW1ib2xzCisKKyMgRm9yIFN5c3RlbS5tYXAgZmlsdGVyIGF3YXk6CisjICAgYSAtIGxvY2FsIGFic29sdXRlIHN5bWJvbHMKKyMgICBVIC0gdW5kZWZpbmVkIGdsb2JhbCBzeW1ib2xzCisjICAgdyAtIGxvY2FsIHdlYWsgc3ltYm9scworCisjIHJlYWRwcm9maWxlIHN0YXJ0cyByZWFkaW5nIHN5bWJvbHMgd2hlbiBfc3RleHQgaXMgZm91bmQsIGFuZAorIyBjb250aW51ZSB1bnRpbCBpdCBmaW5kcyBhIHN5bWJvbCB3aGljaCBpcyBub3QgZWl0aGVyIG9mICdUJywgJ3QnLAorIyAnVycgb3IgJ3cnLiBfX2NyY18gYXJlICdBJyBhbmQgcGxhY2VkIGluIHRoZSBtaWRkbGUKKyMgc28gd2UganVzdCBpZ25vcmUgdGhlbSB0byBsZXQgcmVhZHByb2ZpbGUgY29udGludWUgdG8gd29yay4KKyMgKEF0IGxlYXN0IHNwYXJjNjQgaGFzIF9fY3JjXyBpbiB0aGUgbWlkZGxlKS4KKworJE5NIC1uICQxIHwgZ3JlcCAtdiAnXCggW2FVd10gXClcfFwoX19jcmNfXClcfFwoIFwkW2FkdF1cKScgPiAkMgorCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rdWJvb3Quc2ggYi9zY3JpcHRzL21rdWJvb3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTJhMTdhYgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbWt1Ym9vdC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCisjCisjIEJ1aWxkIFUtQm9vdCBpbWFnZSB3aGVuIGBta2ltYWdlJyB0b29sIGlzIGF2YWlsYWJsZS4KKyMKKworTUtJTUFHRT0kKHR5cGUgLXBhdGggbWtpbWFnZSkKKworaWYgWyAteiAiJHtNS0lNQUdFfSIgXTsgdGhlbgorCSMgRG9lc24ndCBleGlzdAorCWVjaG8gJyJta2ltYWdlIiBjb21tYW5kIG5vdCBmb3VuZCAtIFUtQm9vdCBpbWFnZXMgd2lsbCBub3QgYmUgYnVpbHQnID4mMgorCWV4aXQgMDsKK2ZpCisKKyMgQ2FsbCAibWtpbWFnZSIgdG8gY3JlYXRlIFUtQm9vdCBpbWFnZQorJHtNS0lNQUdFfSAiJEAiCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rdmVyc2lvbiBiL3NjcmlwdHMvbWt2ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMmFkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rdmVyc2lvbgpAQCAtMCwwICsxLDYgQEAKK2lmIFsgISAtZiAudmVyc2lvbiBdCit0aGVuCisgICAgZWNobyAxCitlbHNlCisgICAgZXhwciAwYGNhdCAudmVyc2lvbmAgKyAxCitmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvTWFrZWZpbGUgYi9zY3JpcHRzL21vZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ2OWMzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tb2QvTWFrZWZpbGUKQEAgLTAsMCArMSwxNiBAQAoraG9zdHByb2dzLXkJOj0gbW9kcG9zdCBta19lbGZjb25maWcKK2Fsd2F5cwkJOj0gJChob3N0cHJvZ3MteSkgZW1wdHkubworCittb2Rwb3N0LW9ianMJOj0gbW9kcG9zdC5vIGZpbGUyYWxpYXMubyBzdW12ZXJzaW9uLm8KKworIyBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKKworJChvYmopL21vZHBvc3QubyAkKG9iaikvZmlsZTJhbGlhcy5vICQob2JqKS9zdW12ZXJzaW9uLm86ICQob2JqKS9lbGZjb25maWcuaAorCitxdWlldF9jbWRfZWxmY29uZmlnID0gTUtFTEYgICAkQAorICAgICAgY21kX2VsZmNvbmZpZyA9ICQob2JqKS9ta19lbGZjb25maWcgJChBUkNIKSA8ICQ8ID4gJEAKKworJChvYmopL2VsZmNvbmZpZy5oOiAkKG9iaikvZW1wdHkubyAkKG9iaikvbWtfZWxmY29uZmlnIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsZWxmY29uZmlnKQorCit0YXJnZXRzICs9IGVsZmNvbmZpZy5oCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9lbXB0eS5jIGIvc2NyaXB0cy9tb2QvZW1wdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTgzOWNjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tb2QvZW1wdHkuYwpAQCAtMCwwICsxIEBACisvKiBlbXB0eSBmaWxlIHRvIGZpZ3VyZSBvdXQgZW5kaWFubmVzcyAvIHdvcmQgc2l6ZSAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NGI1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTAsMCArMSwzMDggQEAKKy8qIFNpbXBsZSBjb2RlIHRvIHR1cm4gdmFyaW91cyB0YWJsZXMgaW4gYW4gRUxGIGZpbGUgaW50byBhbGlhcyBkZWZpbml0aW9ucy4KKyAqIFRoaXMgZGVhbHMgd2l0aCBrZXJuZWwgZGF0YXN0cnVjdHVyZXMgd2hlcmUgdGhleSBzaG91bGQgYmUKKyAqIGRlYWx0IHdpdGg6IGluIHRoZSBrZXJuZWwgc291cmNlLgorICoKKyAqIENvcHlyaWdodCAyMDAyLTIwMDMgIFJ1c3R5IFJ1c3NlbGwsIElCTSBDb3Jwb3JhdGlvbgorICogICAgICAgICAgIDIwMDMgICAgICAgS2FpIEdlcm1hc2NoZXdza2kKKyAqCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqLworCisjaW5jbHVkZSAibW9kcG9zdC5oIgorCisvKiBXZSB1c2UgdGhlIEVMRiB0eXBlZGVmcyBmb3Iga2VybmVsX3Vsb25nX3QgYnV0IGJpdGUgdGhlIGJ1bGxldCBhbmQKKyAqIHVzZSBlaXRoZXIgc3RkaW50Lmggb3IgaW50dHlwZXMuaCBmb3IgdGhlIHJlc3QuICovCisjaWYgS0VSTkVMX0VMRkNMQVNTID09IEVMRkNMQVNTMzIKK3R5cGVkZWYgRWxmMzJfQWRkcglrZXJuZWxfdWxvbmdfdDsKKyNlbHNlCit0eXBlZGVmIEVsZjY0X0FkZHIJa2VybmVsX3Vsb25nX3Q7CisjZW5kaWYKKyNpZmRlZiBfX3N1bl9fCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKwordHlwZWRlZiB1aW50MzJfdAlfX3UzMjsKK3R5cGVkZWYgdWludDE2X3QJX191MTY7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJX191ODsKKworLyogQmlnIGV4Y2VwdGlvbiB0byB0aGUgImRvbid0IGluY2x1ZGUga2VybmVsIGhlYWRlcnMgaW50byB1c2Vyc3BhY2UsIHdoaWNoCisgKiBldmVuIHBvdGVudGlhbGx5IGhhcyBkaWZmZXJlbnQgZW5kaWFubmVzcyBhbmQgd29yZCBzaXplcywgc2luY2UgCisgKiB3ZSBoYW5kbGUgdGhvc2UgZGlmZmVyZW5jZXMgZXhwbGljaXRseSBiZWxvdyAqLworI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgiCisKKyNkZWZpbmUgQUREKHN0ciwgc2VwLCBjb25kLCBmaWVsZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjYXQoc3RyLCBzZXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIgKyBzdHJsZW4oc3RyKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpZWxkKSA9PSAxID8gIiUwMlgiIDogICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmaWVsZCkgPT0gMiA/ICIlMDRYIiA6ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmllbGQpID09IDQgPyAiJTA4WCIgOiAiIiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIgKyBzdHJsZW4oc3RyKSwgIioiKTsgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisvKiBMb29rcyBsaWtlICJ1c2I6dk5wTmRsTmRoTmRjTmRzY05kcE5pY05pc2NOaXBOIiAqLworc3RhdGljIGludCBkb191c2JfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCWlkLT5tYXRjaF9mbGFncyA9IFRPX05BVElWRShpZC0+bWF0Y2hfZmxhZ3MpOworCWlkLT5pZFZlbmRvciA9IFRPX05BVElWRShpZC0+aWRWZW5kb3IpOworCWlkLT5pZFByb2R1Y3QgPSBUT19OQVRJVkUoaWQtPmlkUHJvZHVjdCk7CisJaWQtPmJjZERldmljZV9sbyA9IFRPX05BVElWRShpZC0+YmNkRGV2aWNlX2xvKTsKKwlpZC0+YmNkRGV2aWNlX2hpID0gVE9fTkFUSVZFKGlkLT5iY2REZXZpY2VfaGkpOworCisJLyoKKwkgKiBTb21lIG1vZHVsZXMgKHZpc29yKSBoYXZlIGVtcHR5IHNsb3RzIGFzIHBsYWNlaG9sZGVyIGZvcgorCSAqIHJ1bi10aW1lIHNwZWNpZmljYXRpb24gdGhhdCByZXN1bHRzIGluIGNhdGNoLWFsbCBhbGlhcworCSAqLworCWlmICghKGlkLT5pZFZlbmRvciB8IGlkLT5iRGV2aWNlQ2xhc3MgfCBpZC0+YkludGVyZmFjZUNsYXNzKSkKKwkJcmV0dXJuIDE7CisKKwlzdHJjcHkoYWxpYXMsICJ1c2I6Iik7CisJQUREKGFsaWFzLCAidiIsIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX1ZFTkRPUiwKKwkgICAgaWQtPmlkVmVuZG9yKTsKKwlBREQoYWxpYXMsICJwIiwgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfUFJPRFVDVCwKKwkgICAgaWQtPmlkUHJvZHVjdCk7CisJQUREKGFsaWFzLCAiZGwiLCBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfTE8sCisJICAgIGlkLT5iY2REZXZpY2VfbG8pOworCUFERChhbGlhcywgImRoIiwgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWX0hJLAorCSAgICBpZC0+YmNkRGV2aWNlX2hpKTsKKwlBREQoYWxpYXMsICJkYyIsIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX0RFVl9DTEFTUywKKwkgICAgaWQtPmJEZXZpY2VDbGFzcyk7CisJQUREKGFsaWFzLCAiZHNjIiwKKwkgICAgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWX1NVQkNMQVNTLAorCSAgICBpZC0+YkRldmljZVN1YkNsYXNzKTsKKwlBREQoYWxpYXMsICJkcCIsCisJICAgIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX0RFVl9QUk9UT0NPTCwKKwkgICAgaWQtPmJEZXZpY2VQcm90b2NvbCk7CisJQUREKGFsaWFzLCAiaWMiLAorCSAgICBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfQ0xBU1MsCisJICAgIGlkLT5iSW50ZXJmYWNlQ2xhc3MpOworCUFERChhbGlhcywgImlzYyIsCisJICAgIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX0lOVF9TVUJDTEFTUywKKwkgICAgaWQtPmJJbnRlcmZhY2VTdWJDbGFzcyk7CisJQUREKGFsaWFzLCAiaXAiLAorCSAgICBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfUFJPVE9DT0wsCisJICAgIGlkLT5iSW50ZXJmYWNlUHJvdG9jb2wpOworCXJldHVybiAxOworfQorCisvKiBMb29rcyBsaWtlOiBpZWVlMTM5NDp2ZW5ObW9Oc3BOdmVyTiAqLworc3RhdGljIGludCBkb19pZWVlMTM5NF9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCSAgICAgc3RydWN0IGllZWUxMzk0X2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCWlkLT5tYXRjaF9mbGFncyA9IFRPX05BVElWRShpZC0+bWF0Y2hfZmxhZ3MpOworCWlkLT52ZW5kb3JfaWQgPSBUT19OQVRJVkUoaWQtPnZlbmRvcl9pZCk7CisJaWQtPm1vZGVsX2lkID0gVE9fTkFUSVZFKGlkLT5tb2RlbF9pZCk7CisJaWQtPnNwZWNpZmllcl9pZCA9IFRPX05BVElWRShpZC0+c3BlY2lmaWVyX2lkKTsKKwlpZC0+dmVyc2lvbiA9IFRPX05BVElWRShpZC0+dmVyc2lvbik7CisKKwlzdHJjcHkoYWxpYXMsICJpZWVlMTM5NDoiKTsKKwlBREQoYWxpYXMsICJ2ZW4iLCBpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9WRU5ET1JfSUQsCisJICAgIGlkLT52ZW5kb3JfaWQpOworCUFERChhbGlhcywgIm1vIiwgaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfTU9ERUxfSUQsCisJICAgIGlkLT5tb2RlbF9pZCk7CisJQUREKGFsaWFzLCAic3AiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9TUEVDSUZJRVJfSUQsCisJICAgIGlkLT5zcGVjaWZpZXJfaWQpOworCUFERChhbGlhcywgInZlciIsIGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX1ZFUlNJT04sCisJICAgIGlkLT52ZXJzaW9uKTsKKworCXJldHVybiAxOworfQorCisvKiBMb29rcyBsaWtlOiBwY2k6dk5kTnN2TnNkTmJjTnNjTmlOLiAqLworc3RhdGljIGludCBkb19wY2lfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCS8qIENsYXNzIGZpZWxkIGNhbiBiZSBkaXZpZGVkIGludG8gdGhlc2UgdGhyZWUuICovCisJdW5zaWduZWQgY2hhciBiYXNlY2xhc3MsIHN1YmNsYXNzLCBpbnRlcmZhY2UsCisJCWJhc2VjbGFzc19tYXNrLCBzdWJjbGFzc19tYXNrLCBpbnRlcmZhY2VfbWFzazsKKworCWlkLT52ZW5kb3IgPSBUT19OQVRJVkUoaWQtPnZlbmRvcik7CisJaWQtPmRldmljZSA9IFRPX05BVElWRShpZC0+ZGV2aWNlKTsKKwlpZC0+c3VidmVuZG9yID0gVE9fTkFUSVZFKGlkLT5zdWJ2ZW5kb3IpOworCWlkLT5zdWJkZXZpY2UgPSBUT19OQVRJVkUoaWQtPnN1YmRldmljZSk7CisJaWQtPmNsYXNzID0gVE9fTkFUSVZFKGlkLT5jbGFzcyk7CisJaWQtPmNsYXNzX21hc2sgPSBUT19OQVRJVkUoaWQtPmNsYXNzX21hc2spOworCisJc3RyY3B5KGFsaWFzLCAicGNpOiIpOworCUFERChhbGlhcywgInYiLCBpZC0+dmVuZG9yICE9IFBDSV9BTllfSUQsIGlkLT52ZW5kb3IpOworCUFERChhbGlhcywgImQiLCBpZC0+ZGV2aWNlICE9IFBDSV9BTllfSUQsIGlkLT5kZXZpY2UpOworCUFERChhbGlhcywgInN2IiwgaWQtPnN1YnZlbmRvciAhPSBQQ0lfQU5ZX0lELCBpZC0+c3VidmVuZG9yKTsKKwlBREQoYWxpYXMsICJzZCIsIGlkLT5zdWJkZXZpY2UgIT0gUENJX0FOWV9JRCwgaWQtPnN1YmRldmljZSk7CisKKwliYXNlY2xhc3MgPSAoaWQtPmNsYXNzKSA+PiAxNjsKKwliYXNlY2xhc3NfbWFzayA9IChpZC0+Y2xhc3NfbWFzaykgPj4gMTY7CisJc3ViY2xhc3MgPSAoaWQtPmNsYXNzKSA+PiA4OworCXN1YmNsYXNzX21hc2sgPSAoaWQtPmNsYXNzX21hc2spID4+IDg7CisJaW50ZXJmYWNlID0gaWQtPmNsYXNzOworCWludGVyZmFjZV9tYXNrID0gaWQtPmNsYXNzX21hc2s7CisKKwlpZiAoKGJhc2VjbGFzc19tYXNrICE9IDAgJiYgYmFzZWNsYXNzX21hc2sgIT0gMHhGRikKKwkgICAgfHwgKHN1YmNsYXNzX21hc2sgIT0gMCAmJiBzdWJjbGFzc19tYXNrICE9IDB4RkYpCisJICAgIHx8IChpbnRlcmZhY2VfbWFzayAhPSAwICYmIGludGVyZmFjZV9tYXNrICE9IDB4RkYpKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIioqKiBXYXJuaW5nOiBDYW4ndCBoYW5kbGUgbWFza3MgaW4gJXM6JTA0WFxuIiwKKwkJCWZpbGVuYW1lLCBpZC0+Y2xhc3NfbWFzayk7CisJCXJldHVybiAwOworCX0KKworCUFERChhbGlhcywgImJjIiwgYmFzZWNsYXNzX21hc2sgPT0gMHhGRiwgYmFzZWNsYXNzKTsKKwlBREQoYWxpYXMsICJzYyIsIHN1YmNsYXNzX21hc2sgPT0gMHhGRiwgc3ViY2xhc3MpOworCUFERChhbGlhcywgImkiLCBpbnRlcmZhY2VfbWFzayA9PSAweEZGLCBpbnRlcmZhY2UpOworCXJldHVybiAxOworfQorCisvKiBsb29rcyBsaWtlOiAiY2N3OnRObU5kdE5kbU4iICovIAorc3RhdGljIGludCBkb19jY3dfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgY2N3X2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCWlkLT5tYXRjaF9mbGFncyA9IFRPX05BVElWRShpZC0+bWF0Y2hfZmxhZ3MpOworCWlkLT5jdV90eXBlID0gVE9fTkFUSVZFKGlkLT5jdV90eXBlKTsKKwlpZC0+Y3VfbW9kZWwgPSBUT19OQVRJVkUoaWQtPmN1X21vZGVsKTsKKwlpZC0+ZGV2X3R5cGUgPSBUT19OQVRJVkUoaWQtPmRldl90eXBlKTsKKwlpZC0+ZGV2X21vZGVsID0gVE9fTkFUSVZFKGlkLT5kZXZfbW9kZWwpOworCisJc3RyY3B5KGFsaWFzLCAiY2N3OiIpOworCUFERChhbGlhcywgInQiLCBpZC0+bWF0Y2hfZmxhZ3MmQ0NXX0RFVklDRV9JRF9NQVRDSF9DVV9UWVBFLAorCSAgICBpZC0+Y3VfdHlwZSk7CisJQUREKGFsaWFzLCAibSIsIGlkLT5tYXRjaF9mbGFncyZDQ1dfREVWSUNFX0lEX01BVENIX0NVX01PREVMLAorCSAgICBpZC0+Y3VfbW9kZWwpOworCUFERChhbGlhcywgImR0IiwgaWQtPm1hdGNoX2ZsYWdzJkNDV19ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX1RZUEUsCisJICAgIGlkLT5kZXZfdHlwZSk7CisJQUREKGFsaWFzLCAiZG0iLCBpZC0+bWF0Y2hfZmxhZ3MmQ0NXX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0VfVFlQRSwKKwkgICAgaWQtPmRldl9tb2RlbCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIExvb2tzIGxpa2U6ICJzZXJpbzp0eU5wck5pZE5leE4iICovCitzdGF0aWMgaW50IGRvX3NlcmlvX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJICBzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkICppZCwgY2hhciAqYWxpYXMpCit7CisJaWQtPnR5cGUgPSBUT19OQVRJVkUoaWQtPnR5cGUpOworCWlkLT5wcm90byA9IFRPX05BVElWRShpZC0+cHJvdG8pOworCWlkLT5pZCA9IFRPX05BVElWRShpZC0+aWQpOworCWlkLT5leHRyYSA9IFRPX05BVElWRShpZC0+ZXh0cmEpOworCisJc3RyY3B5KGFsaWFzLCAic2VyaW86Iik7CisJQUREKGFsaWFzLCAidHkiLCBpZC0+dHlwZSAhPSBTRVJJT19BTlksIGlkLT50eXBlKTsKKwlBREQoYWxpYXMsICJwciIsIGlkLT5wcm90byAhPSBTRVJJT19BTlksIGlkLT5wcm90byk7CisJQUREKGFsaWFzLCAiaWQiLCBpZC0+aWQgIT0gU0VSSU9fQU5ZLCBpZC0+aWQpOworCUFERChhbGlhcywgImV4IiwgaWQtPmV4dHJhICE9IFNFUklPX0FOWSwgaWQtPmV4dHJhKTsKKworCXJldHVybiAxOworfQorCisvKiBsb29rcyBsaWtlOiAicG5wOmREIiAqLworc3RhdGljIGludCBkb19wbnBfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgcG5wX2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCXNwcmludGYoYWxpYXMsICJwbnA6ZCVzIiwgaWQtPmlkKTsKKwlyZXR1cm4gMTsKK30KKworLyogbG9va3MgbGlrZTogInBucDpjQ2RELi4uIiAqLworc3RhdGljIGludCBkb19wbnBfY2FyZF9lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCXN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpbnQgaTsKKworCXNwcmludGYoYWxpYXMsICJwbnA6YyVzIiwgaWQtPmlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgUE5QX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKCEgKmlkLT5kZXZzW2ldLmlkKQorCQkJYnJlYWs7CisJCXNwcmludGYoYWxpYXMgKyBzdHJsZW4oYWxpYXMpLCAiZCVzIiwgaWQtPmRldnNbaV0uaWQpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogSWdub3JlIGFueSBwcmVmaXgsIGVnLiB2ODUwIHByZXBlbmRzIF8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHN5bV9pcyhjb25zdCBjaGFyICpzeW1ib2wsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqbWF0Y2g7CisKKwltYXRjaCA9IHN0cnN0cihzeW1ib2wsIG5hbWUpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAwOworCXJldHVybiBtYXRjaFtzdHJsZW4oc3ltYm9sKV0gPT0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgZG9fdGFibGUodm9pZCAqc3ltdmFsLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCSAgICAgdW5zaWduZWQgbG9uZyBpZF9zaXplLAorCQkgICAgIHZvaWQgKmZ1bmN0aW9uLAorCQkgICAgIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyIGFsaWFzWzUwMF07CisJaW50ICgqZG9fZW50cnkpKGNvbnN0IGNoYXIgKiwgdm9pZCAqZW50cnksIGNoYXIgKmFsaWFzKSA9IGZ1bmN0aW9uOworCisJaWYgKHNpemUgJSBpZF9zaXplIHx8IHNpemUgPCBpZF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiKioqIFdhcm5pbmc6ICVzIGlkcyAlbHUgYmFkIHNpemUgIgorCQkJIihlYWNoIG9uICVsdSlcbiIsIG1vZC0+bmFtZSwgc2l6ZSwgaWRfc2l6ZSk7CisJfQorCS8qIExlYXZlIGxhc3Qgb25lOiBpdCdzIHRoZSB0ZXJtaW5hdG9yLiAqLworCXNpemUgLT0gaWRfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IGlkX3NpemUpIHsKKwkJaWYgKGRvX2VudHJ5KG1vZC0+bmFtZSwgc3ltdmFsK2ksIGFsaWFzKSkgeworCQkJLyogQWx3YXlzIGVuZCBpbiBhIHdpbGRjYXJkLCBmb3IgZnV0dXJlIGV4dGVuc2lvbiAqLworCQkJaWYgKGFsaWFzW3N0cmxlbihhbGlhcyktMV0gIT0gJyonKQorCQkJCXN0cmNhdChhbGlhcywgIioiKTsKKwkJCWJ1Zl9wcmludGYoJm1vZC0+ZGV2X3RhYmxlX2J1ZiwKKwkJCQkgICAiTU9EVUxFX0FMSUFTKFwiJXNcIik7XG4iLCBhbGlhcyk7CisJCX0KKwl9Cit9CisKKy8qIENyZWF0ZSBNT0RVTEVfQUxJQVMoKSBzdGF0ZW1lbnRzLgorICogQXQgdGhpcyB0aW1lLCB3ZSBjYW5ub3Qgd3JpdGUgdGhlIGFjdHVhbCBvdXRwdXQgQyBzb3VyY2UgeWV0LAorICogc28gd2Ugd3JpdGUgaW50byB0aGUgbW9kLT5kZXZfdGFibGVfYnVmIGJ1ZmZlci4gKi8KK3ZvaWQgaGFuZGxlX21vZGRldnRhYmxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGVsZl9pbmZvICppbmZvLAorCQkJRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXZvaWQgKnN5bXZhbDsKKworCS8qIFdlJ3JlIGxvb2tpbmcgZm9yIGEgc2VjdGlvbiByZWxhdGl2ZSBzeW1ib2wgKi8KKwlpZiAoIXN5bS0+c3Rfc2huZHggfHwgc3ltLT5zdF9zaG5keCA+PSBpbmZvLT5oZHItPmVfc2hudW0pCisJCXJldHVybjsKKworCXN5bXZhbCA9ICh2b2lkICopaW5mby0+aGRyCisJCSsgaW5mby0+c2VjaGRyc1tzeW0tPnN0X3NobmR4XS5zaF9vZmZzZXQKKwkJKyBzeW0tPnN0X3ZhbHVlOworCisJaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfcGNpX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2aWNlX2lkKSwKKwkJCSBkb19wY2lfZW50cnksIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF91c2JfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IHVzYl9kZXZpY2VfaWQpLAorCQkJIGRvX3VzYl9lbnRyeSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX2llZWUxMzk0X2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQpLAorCQkJIGRvX2llZWUxMzk0X2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfY2N3X2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBjY3dfZGV2aWNlX2lkKSwKKwkJCSBkb19jY3dfZW50cnksIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9zZXJpb19kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3Qgc2VyaW9fZGV2aWNlX2lkKSwKKwkJCSBkb19zZXJpb19lbnRyeSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3BucF9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgcG5wX2RldmljZV9pZCksCisJCQkgZG9fcG5wX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfcG5wX2NhcmRfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCksCisJCQkgZG9fcG5wX2NhcmRfZW50cnksIG1vZCk7Cit9CisKKy8qIE5vdyBhZGQgb3V0IGJ1ZmZlcmVkIGluZm9ybWF0aW9uIHRvIHRoZSBnZW5lcmF0ZWQgQyBzb3VyY2UgKi8KK3ZvaWQgYWRkX21vZGRldnRhYmxlKHN0cnVjdCBidWZmZXIgKmJ1Ziwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCWJ1Zl9wcmludGYoYnVmLCAiXG4iKTsKKwlidWZfd3JpdGUoYnVmLCBtb2QtPmRldl90YWJsZV9idWYucCwgbW9kLT5kZXZfdGFibGVfYnVmLnBvcyk7CisJZnJlZShtb2QtPmRldl90YWJsZV9idWYucCk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYyBiL3NjcmlwdHMvbW9kL21rX2VsZmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMmFhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYwpAQCAtMCwwICsxLDY1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBjaGFyIGVpW0VJX05JREVOVF07CQorCXVuaW9uIHsgc2hvcnQgczsgY2hhciBjWzJdOyB9IGVuZGlhbl90ZXN0OworCisJaWYgKGFyZ2MgIT0gMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBhcmNoXG4iKTsKKwl9CisJaWYgKGZyZWFkKGVpLCAxLCBFSV9OSURFTlQsIHN0ZGluKSAhPSBFSV9OSURFTlQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogaW5wdXQgdHJ1bmNhdGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChtZW1jbXAoZWksIEVMRk1BRywgU0VMRk1BRykgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBub3QgRUxGXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXN3aXRjaCAoZWlbRUlfQ0xBU1NdKSB7CisJY2FzZSBFTEZDTEFTUzMyOgorCQlwcmludGYoIiNkZWZpbmUgS0VSTkVMX0VMRkNMQVNTIEVMRkNMQVNTMzJcbiIpOworCQlicmVhazsKKwljYXNlIEVMRkNMQVNTNjQ6CisJCXByaW50ZigiI2RlZmluZSBLRVJORUxfRUxGQ0xBU1MgRUxGQ0xBU1M2NFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCXN3aXRjaCAoZWlbRUlfREFUQV0pIHsKKwljYXNlIEVMRkRBVEEyTFNCOgorCQlwcmludGYoIiNkZWZpbmUgS0VSTkVMX0VMRkRBVEEgRUxGREFUQTJMU0JcbiIpOworCQlicmVhazsKKwljYXNlIEVMRkRBVEEyTVNCOgorCQlwcmludGYoIiNkZWZpbmUgS0VSTkVMX0VMRkRBVEEgRUxGREFUQTJNU0JcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKworCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCkgeworCQlwcmludGYoIiNkZWZpbmUgSE9TVF9FTEZDTEFTUyBFTEZDTEFTUzMyXG4iKTsKKwl9IGVsc2UgaWYgKHNpemVvZih1bnNpZ25lZCBsb25nKSA9PSA4KSB7CisJCXByaW50ZigiI2RlZmluZSBIT1NUX0VMRkNMQVNTIEVMRkNMQVNTNjRcbiIpOworCX0KKworCWVuZGlhbl90ZXN0LnMgPSAweDAxMDI7CisJaWYgKG1lbWNtcChlbmRpYW5fdGVzdC5jLCAiXHgwMVx4MDIiLCAyKSA9PSAwKQorCQlwcmludGYoIiNkZWZpbmUgSE9TVF9FTEZEQVRBIEVMRkRBVEEyTVNCXG4iKTsKKwllbHNlIGlmIChtZW1jbXAoZW5kaWFuX3Rlc3QuYywgIlx4MDJceDAxIiwgMikgPT0gMCkKKwkJcHJpbnRmKCIjZGVmaW5lIEhPU1RfRUxGREFUQSBFTEZEQVRBMkxTQlxuIik7CisJZWxzZQorCQlhYm9ydCgpOworCisJaWYgKChzdHJjbXAoYXJndlsxXSwgInY4NTAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICJoODMwMCIpID09IDApKQorCQlwcmludGYoIiNkZWZpbmUgTU9EVUxFX1NZTUJPTF9QUkVGSVggXCJfXCJcbiIpOworCWVsc2UgCisJCXByaW50ZigiI2RlZmluZSBNT0RVTEVfU1lNQk9MX1BSRUZJWCBcIlwiXG4iKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmMgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5Zjk0YwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuYwpAQCAtMCwwICsxLDc5NyBAQAorLyogUG9zdHByb2Nlc3MgbW9kdWxlIHN5bWJvbCB2ZXJzaW9ucworICoKKyAqIENvcHlyaWdodCAyMDAzICAgICAgIEthaSBHZXJtYXNjaGV3c2tpCisgKiBDb3B5cmlnaHQgMjAwMi0yMDA0ICBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIG1vZHVsZS1pbml0LXRvb2xzL2RlcG1vZC5jLGZpbGUyYWxpYXMKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIFVzYWdlOiBtb2Rwb3N0IHZtbGludXggbW9kdWxlMS5vIG1vZHVsZTIubyAuLi4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJtb2Rwb3N0LmgiCisKKy8qIEFyZSB3ZSB1c2luZyBDT05GSUdfTU9EVkVSU0lPTlM/ICovCitpbnQgbW9kdmVyc2lvbnMgPSAwOworLyogV2FybiBhYm91dCB1bmRlZmluZWQgc3ltYm9scz8gKGRvIHNvIGlmIHdlIGhhdmUgdm1saW51eCkgKi8KK2ludCBoYXZlX3ZtbGludXggPSAwOworLyogSXMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBzZXQ/ICovCitzdGF0aWMgaW50IGFsbF92ZXJzaW9ucyA9IDA7CisKK3ZvaWQKK2ZhdGFsKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnbGlzdDsKKworCWZwcmludGYoc3RkZXJyLCAiRkFUQUw6ICIpOworCisJdmFfc3RhcnQoYXJnbGlzdCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJnbGlzdCk7CisJdmFfZW5kKGFyZ2xpc3QpOworCisJZXhpdCgxKTsKK30KKwordm9pZAord2Fybihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ2xpc3Q7CisKKwlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICIpOworCisJdmFfc3RhcnQoYXJnbGlzdCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJnbGlzdCk7CisJdmFfZW5kKGFyZ2xpc3QpOworfQorCit2b2lkICpkb19ub2ZhaWwodm9pZCAqcHRyLCBjb25zdCBjaGFyICpleHByKQoreworCWlmICghcHRyKSB7CisJCWZhdGFsKCJtb2Rwb3N0OiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlOiAlcy5cbiIsIGV4cHIpOworCX0KKwlyZXR1cm4gcHRyOworfQorCisvKiBBIGxpc3Qgb2YgYWxsIG1vZHVsZXMgd2UgcHJvY2Vzc2VkICovCisKK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlICptb2R1bGVzOworCitzdHJ1Y3QgbW9kdWxlICoKK2ZpbmRfbW9kdWxlKGNoYXIgKm1vZG5hbWUpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCisJZm9yIChtb2QgPSBtb2R1bGVzOyBtb2Q7IG1vZCA9IG1vZC0+bmV4dCkKKwkJaWYgKHN0cmNtcChtb2QtPm5hbWUsIG1vZG5hbWUpID09IDApCisJCQlicmVhazsKKwlyZXR1cm4gbW9kOworfQorCitzdHJ1Y3QgbW9kdWxlICoKK25ld19tb2R1bGUoY2hhciAqbW9kbmFtZSkKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CisJY2hhciAqcCwgKnM7CisJCisJbW9kID0gTk9GQUlMKG1hbGxvYyhzaXplb2YoKm1vZCkpKTsKKwltZW1zZXQobW9kLCAwLCBzaXplb2YoKm1vZCkpOworCXAgPSBOT0ZBSUwoc3RyZHVwKG1vZG5hbWUpKTsKKworCS8qIHN0cmlwIHRyYWlsaW5nIC5vICovCisJaWYgKChzID0gc3RycmNocihwLCAnLicpKSAhPSBOVUxMKQorCQlpZiAoc3RyY21wKHMsICIubyIpID09IDApCisJCQkqcyA9ICdcMCc7CisKKwkvKiBhZGQgdG8gbGlzdCAqLworCW1vZC0+bmFtZSA9IHA7CisJbW9kLT5uZXh0ID0gbW9kdWxlczsKKwltb2R1bGVzID0gbW9kOworCisJcmV0dXJuIG1vZDsKK30KKworLyogQSBoYXNoIG9mIGFsbCBleHBvcnRlZCBzeW1ib2xzLAorICogc3RydWN0IHN5bWJvbCBpcyBhbHNvIHVzZWQgZm9yIGxpc3RzIG9mIHVucmVzb2x2ZWQgc3ltYm9scyAqLworCisjZGVmaW5lIFNZTUJPTF9IQVNIX1NJWkUgMTAyNAorCitzdHJ1Y3Qgc3ltYm9sIHsKKwlzdHJ1Y3Qgc3ltYm9sICpuZXh0OworCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKKwl1bnNpZ25lZCBpbnQgY3JjOworCWludCBjcmNfdmFsaWQ7CisJdW5zaWduZWQgaW50IHdlYWs6MTsKKwljaGFyIG5hbWVbMF07Cit9OworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9saGFzaFtTWU1CT0xfSEFTSF9TSVpFXTsKKworLyogVGhpcyBpcyBiYXNlZCBvbiB0aGUgaGFzaCBhZ29yaXRobSBmcm9tIGdkYm0sIHZpYSB0ZGIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRkYl9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgdmFsdWU7CS8qIFVzZWQgdG8gY29tcHV0ZSB0aGUgaGFzaCB2YWx1ZS4gICovCisJdW5zaWduZWQgICBpOwkvKiBVc2VkIHRvIGN5Y2xlIHRocm91Z2ggcmFuZG9tIHZhbHVlcy4gKi8KKworCS8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBrZXkgc2l6ZS4gKi8KKwlmb3IgKHZhbHVlID0gMHgyMzhGMTNBRiAqIHN0cmxlbihuYW1lKSwgaT0wOyBuYW1lW2ldOyBpKyspCisJCXZhbHVlID0gKHZhbHVlICsgKCgodW5zaWduZWQgY2hhciAqKW5hbWUpW2ldIDw8IChpKjUgJSAyNCkpKTsKKworCXJldHVybiAoMTEwMzUxNTI0MyAqIHZhbHVlICsgMTIzNDUpOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyBzeW1ib2xzIGZvciB1c2UgaW4gdGhlIGhhc2ggb2YgZXhwb3J0ZWQgc3ltYm9scyBvcgorICogdGhlIGxpc3Qgb2YgdW5yZXNvbHZlZCBzeW1ib2xzIHBlciBtb2R1bGUgKi8KKworc3RydWN0IHN5bWJvbCAqCithbGxvY19zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IHdlYWssIHN0cnVjdCBzeW1ib2wgKm5leHQpCit7CisJc3RydWN0IHN5bWJvbCAqcyA9IE5PRkFJTChtYWxsb2Moc2l6ZW9mKCpzKSArIHN0cmxlbihuYW1lKSArIDEpKTsKKworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKwlzdHJjcHkocy0+bmFtZSwgbmFtZSk7CisJcy0+d2VhayA9IHdlYWs7CisJcy0+bmV4dCA9IG5leHQ7CisJcmV0dXJuIHM7Cit9CisKKy8qIEZvciB0aGUgaGFzaCBvZiBleHBvcnRlZCBzeW1ib2xzICovCisKK3ZvaWQKK25ld19zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgKmNyYykKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKwlzdHJ1Y3Qgc3ltYm9sICpuZXc7CisKKwloYXNoID0gdGRiX2hhc2gobmFtZSkgJSBTWU1CT0xfSEFTSF9TSVpFOworCW5ldyA9IHN5bWJvbGhhc2hbaGFzaF0gPSBhbGxvY19zeW1ib2wobmFtZSwgMCwgc3ltYm9saGFzaFtoYXNoXSk7CisJbmV3LT5tb2R1bGUgPSBtb2R1bGU7CisJaWYgKGNyYykgeworCQluZXctPmNyYyA9ICpjcmM7CisJCW5ldy0+Y3JjX3ZhbGlkID0gMTsKKwl9Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorZmluZF9zeW1ib2woY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzOworCisJLyogRm9yIG91ciBwdXJwb3NlcywgLmZvbyBtYXRjaGVzIGZvby4gIFBQQzY0IG5lZWRzIHRoaXMuICovCisJaWYgKG5hbWVbMF0gPT0gJy4nKQorCQluYW1lKys7CisKKwlmb3IgKHMgPSBzeW1ib2xoYXNoW3RkYl9oYXNoKG5hbWUpICUgU1lNQk9MX0hBU0hfU0laRV07IHM7IHM9cy0+bmV4dCkgeworCQlpZiAoc3RyY21wKHMtPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFkZCBhbiBleHBvcnRlZCBzeW1ib2wgLSBpdCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgd2l0aG91dCBhCisgKiBDUkMsIGluIHRoaXMgY2FzZSBqdXN0IHVwZGF0ZSB0aGUgQ1JDICovCit2b2lkCithZGRfZXhwb3J0ZWRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgdW5zaWduZWQgaW50ICpjcmMpCit7CisJc3RydWN0IHN5bWJvbCAqcyA9IGZpbmRfc3ltYm9sKG5hbWUpOworCisJaWYgKCFzKSB7CisJCW5ld19zeW1ib2wobmFtZSwgbW9kdWxlLCBjcmMpOworCQlyZXR1cm47CisJfQorCWlmIChjcmMpIHsKKwkJcy0+Y3JjID0gKmNyYzsKKwkJcy0+Y3JjX3ZhbGlkID0gMTsKKwl9Cit9CisKK3ZvaWQgKgorZ3JhYl9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCXZvaWQgKm1hcDsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwIHx8IGZzdGF0KGZkLCAmc3QpICE9IDApCisJCXJldHVybiBOVUxMOworCisJKnNpemUgPSBzdC5zdF9zaXplOworCW1hcCA9IG1tYXAoTlVMTCwgKnNpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKworCWlmIChtYXAgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1hcDsKK30KKworLyoKKyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIG5leHQgbGluZSBpbiBhIG1tYXAnZWQgZmlsZS4KKyAgIHNwYWNlcyBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGlzIHRyaW1tZWQgYXdheS4KKyAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgYnVmZmVyLgorKi8KK2NoYXIqCitnZXRfbmV4dF9saW5lKHVuc2lnbmVkIGxvbmcgKnBvcywgdm9pZCAqZmlsZSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0YXRpYyBjaGFyIGxpbmVbNDA5Nl07CisJaW50IHNraXAgPSAxOworCXNpemVfdCBsZW4gPSAwOworCXNpZ25lZCBjaGFyICpwID0gKHNpZ25lZCBjaGFyICopZmlsZSArICpwb3M7CisJY2hhciAqcyA9IGxpbmU7CisKKwlmb3IgKDsgKnBvcyA8IHNpemUgOyAoKnBvcykrKykKKwl7CisJCWlmIChza2lwICYmIGlzc3BhY2UoKnApKSB7CisJCQlwKys7CisJCQljb250aW51ZTsKKwkJfQorCQlza2lwID0gMDsKKwkJaWYgKCpwICE9ICdcbicgJiYgKCpwb3MgPCBzaXplKSkgeworCQkJbGVuKys7CisJCQkqcysrID0gKnArKzsKKwkJCWlmIChsZW4gPiA0MDk1KQorCQkJCWJyZWFrOyAvKiBUb28gbG9uZywgc3RvcCAqLworCQl9IGVsc2UgeworCQkJLyogRW5kIG9mIHN0cmluZyAqLworCQkJKnMgPSAnXDAnOworCQkJcmV0dXJuIGxpbmU7CisJCX0KKwl9CisJLyogRW5kIG9mIGJ1ZmZlciAqLworCXJldHVybiBOVUxMOworfQorCit2b2lkCityZWxlYXNlX2ZpbGUodm9pZCAqZmlsZSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCW11bm1hcChmaWxlLCBzaXplKTsKK30KKwordm9pZAorcGFyc2VfZWxmKHN0cnVjdCBlbGZfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJRWxmX0VoZHIgKmhkciA9IGluZm8tPmhkcjsKKwlFbGZfU2hkciAqc2VjaGRyczsKKwlFbGZfU3ltICAqc3ltOworCisJaGRyID0gZ3JhYl9maWxlKGZpbGVuYW1lLCAmaW5mby0+c2l6ZSk7CisJaWYgKCFoZHIpIHsKKwkJcGVycm9yKGZpbGVuYW1lKTsKKwkJYWJvcnQoKTsKKwl9CisJaW5mby0+aGRyID0gaGRyOworCWlmIChpbmZvLT5zaXplIDwgc2l6ZW9mKCpoZHIpKQorCQlnb3RvIHRydW5jYXRlZDsKKworCS8qIEZpeCBlbmRpYW5uZXNzIGluIEVMRiBoZWFkZXIgKi8KKwloZHItPmVfc2hvZmYgICAgPSBUT19OQVRJVkUoaGRyLT5lX3Nob2ZmKTsKKwloZHItPmVfc2hzdHJuZHggPSBUT19OQVRJVkUoaGRyLT5lX3Noc3RybmR4KTsKKwloZHItPmVfc2hudW0gICAgPSBUT19OQVRJVkUoaGRyLT5lX3NobnVtKTsKKwloZHItPmVfbWFjaGluZSAgPSBUT19OQVRJVkUoaGRyLT5lX21hY2hpbmUpOworCXNlY2hkcnMgPSAodm9pZCAqKWhkciArIGhkci0+ZV9zaG9mZjsKKwlpbmZvLT5zZWNoZHJzID0gc2VjaGRyczsKKworCS8qIEZpeCBlbmRpYW5uZXNzIGluIHNlY3Rpb24gaGVhZGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlzZWNoZHJzW2ldLnNoX3R5cGUgICA9IFRPX05BVElWRShzZWNoZHJzW2ldLnNoX3R5cGUpOworCQlzZWNoZHJzW2ldLnNoX29mZnNldCA9IFRPX05BVElWRShzZWNoZHJzW2ldLnNoX29mZnNldCk7CisJCXNlY2hkcnNbaV0uc2hfc2l6ZSAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfc2l6ZSk7CisJCXNlY2hkcnNbaV0uc2hfbGluayAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfbGluayk7CisJCXNlY2hkcnNbaV0uc2hfbmFtZSAgID0gVE9fTkFUSVZFKHNlY2hkcnNbaV0uc2hfbmFtZSk7CisJfQorCS8qIEZpbmQgc3ltYm9sIHRhYmxlLiAqLworCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQljb25zdCBjaGFyICpzZWNzdHJpbmdzCisJCQk9ICh2b2lkICopaGRyICsgc2VjaGRyc1toZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKKworCQlpZiAoc2VjaGRyc1tpXS5zaF9vZmZzZXQgPiBpbmZvLT5zaXplKQorCQkJZ290byB0cnVuY2F0ZWQ7CisJCWlmIChzdHJjbXAoc2Vjc3RyaW5ncytzZWNoZHJzW2ldLnNoX25hbWUsICIubW9kaW5mbyIpID09IDApIHsKKwkJCWluZm8tPm1vZGluZm8gPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaV0uc2hfb2Zmc2V0OworCQkJaW5mby0+bW9kaW5mb19sZW4gPSBzZWNoZHJzW2ldLnNoX3NpemU7CisJCX0KKwkJaWYgKHNlY2hkcnNbaV0uc2hfdHlwZSAhPSBTSFRfU1lNVEFCKQorCQkJY29udGludWU7CisKKwkJaW5mby0+c3ltdGFiX3N0YXJ0ID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldDsKKwkJaW5mby0+c3ltdGFiX3N0b3AgID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldCAKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICArIHNlY2hkcnNbaV0uc2hfc2l6ZTsKKwkJaW5mby0+c3RydGFiICAgICAgID0gKHZvaWQgKiloZHIgKyAKKwkJCSAgICAgICAgICAgICBzZWNoZHJzW3NlY2hkcnNbaV0uc2hfbGlua10uc2hfb2Zmc2V0OworCX0KKwlpZiAoIWluZm8tPnN5bXRhYl9zdGFydCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm1vZHBvc3Q6ICVzIG5vIHN5bXRhYj9cbiIsIGZpbGVuYW1lKTsKKwkJYWJvcnQoKTsKKwl9CisJLyogRml4IGVuZGlhbm5lc3MgaW4gc3ltYm9scyAqLworCWZvciAoc3ltID0gaW5mby0+c3ltdGFiX3N0YXJ0OyBzeW0gPCBpbmZvLT5zeW10YWJfc3RvcDsgc3ltKyspIHsKKwkJc3ltLT5zdF9zaG5keCA9IFRPX05BVElWRShzeW0tPnN0X3NobmR4KTsKKwkJc3ltLT5zdF9uYW1lICA9IFRPX05BVElWRShzeW0tPnN0X25hbWUpOworCQlzeW0tPnN0X3ZhbHVlID0gVE9fTkFUSVZFKHN5bS0+c3RfdmFsdWUpOworCQlzeW0tPnN0X3NpemUgID0gVE9fTkFUSVZFKHN5bS0+c3Rfc2l6ZSk7CisJfQorCXJldHVybjsKKworIHRydW5jYXRlZDoKKwlmcHJpbnRmKHN0ZGVyciwgIm1vZHBvc3Q6ICVzIGlzIHRydW5jYXRlZC5cbiIsIGZpbGVuYW1lKTsKKwlhYm9ydCgpOworfQorCit2b2lkCitwYXJzZV9lbGZfZmluaXNoKHN0cnVjdCBlbGZfaW5mbyAqaW5mbykKK3sKKwlyZWxlYXNlX2ZpbGUoaW5mby0+aGRyLCBpbmZvLT5zaXplKTsKK30KKworI2RlZmluZSBDUkNfUEZYICAgICBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiX19jcmNfIgorI2RlZmluZSBLU1lNVEFCX1BGWCBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiX19rc3ltdGFiXyIKKwordm9pZAoraGFuZGxlX21vZHZlcnNpb25zKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGVsZl9pbmZvICppbmZvLAorCQkgICBFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJdW5zaWduZWQgaW50IGNyYzsKKworCXN3aXRjaCAoc3ltLT5zdF9zaG5keCkgeworCWNhc2UgU0hOX0NPTU1PTjoKKwkJZnByaW50ZihzdGRlcnIsICIqKiogV2FybmluZzogXCIlc1wiIFslc10gaXMgQ09NTU9OIHN5bWJvbFxuIiwKKwkJCXN5bW5hbWUsIG1vZC0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgU0hOX0FCUzoKKwkJLyogQ1JDJ2Qgc3ltYm9sICovCisJCWlmIChtZW1jbXAoc3ltbmFtZSwgQ1JDX1BGWCwgc3RybGVuKENSQ19QRlgpKSA9PSAwKSB7CisJCQljcmMgPSAodW5zaWduZWQgaW50KSBzeW0tPnN0X3ZhbHVlOworCQkJYWRkX2V4cG9ydGVkX3N5bWJvbChzeW1uYW1lICsgc3RybGVuKENSQ19QRlgpLAorCQkJCQkgICAgbW9kLCAmY3JjKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNITl9VTkRFRjoKKwkJLyogdW5kZWZpbmVkIHN5bWJvbCAqLworCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5zdF9pbmZvKSAhPSBTVEJfR0xPQkFMICYmCisJCSAgICBFTEZfU1RfQklORChzeW0tPnN0X2luZm8pICE9IFNUQl9XRUFLKQorCQkJYnJlYWs7CisJCS8qIGlnbm9yZSBnbG9iYWwgb2Zmc2V0IHRhYmxlICovCisJCWlmIChzdHJjbXAoc3ltbmFtZSwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCisJCQlicmVhazsKKwkJLyogaWdub3JlIF9fdGhpc19tb2R1bGUsIGl0IHdpbGwgYmUgcmVzb2x2ZWQgc2hvcnRseSAqLworCQlpZiAoc3RyY21wKHN5bW5hbWUsIE1PRFVMRV9TWU1CT0xfUFJFRklYICJfX3RoaXNfbW9kdWxlIikgPT0gMCkKKwkJCWJyZWFrOworI2lmZGVmIFNUVF9SRUdJU1RFUgorCQlpZiAoaW5mby0+aGRyLT5lX21hY2hpbmUgPT0gRU1fU1BBUkMgfHwKKwkJICAgIGluZm8tPmhkci0+ZV9tYWNoaW5lID09IEVNX1NQQVJDVjkpIHsKKwkJCS8qIElnbm9yZSByZWdpc3RlciBkaXJlY3RpdmVzLiAqLworCQkJaWYgKEVMRl9TVF9UWVBFKHN5bS0+c3RfaW5mbykgPT0gU1RUX1JFR0lTVEVSKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJCisJCWlmIChtZW1jbXAoc3ltbmFtZSwgTU9EVUxFX1NZTUJPTF9QUkVGSVgsCisJCQkgICBzdHJsZW4oTU9EVUxFX1NZTUJPTF9QUkVGSVgpKSA9PSAwKQorCQkJbW9kLT51bnJlcyA9IGFsbG9jX3N5bWJvbChzeW1uYW1lICsKKwkJCQkJCSAgc3RybGVuKE1PRFVMRV9TWU1CT0xfUFJFRklYKSwKKwkJCQkJCSAgRUxGX1NUX0JJTkQoc3ltLT5zdF9pbmZvKSA9PSBTVEJfV0VBSywKKwkJCQkJCSAgbW9kLT51bnJlcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIEFsbCBleHBvcnRlZCBzeW1ib2xzICovCisJCWlmIChtZW1jbXAoc3ltbmFtZSwgS1NZTVRBQl9QRlgsIHN0cmxlbihLU1lNVEFCX1BGWCkpID09IDApIHsKKwkJCWFkZF9leHBvcnRlZF9zeW1ib2woc3ltbmFtZSArIHN0cmxlbihLU1lNVEFCX1BGWCksCisJCQkJCSAgICBtb2QsIE5VTEwpOworCQl9CisJCWlmIChzdHJjbXAoc3ltbmFtZSwgTU9EVUxFX1NZTUJPTF9QUkVGSVggImluaXRfbW9kdWxlIikgPT0gMCkKKwkJCW1vZC0+aGFzX2luaXQgPSAxOworCQlpZiAoc3RyY21wKHN5bW5hbWUsIE1PRFVMRV9TWU1CT0xfUFJFRklYICJjbGVhbnVwX21vZHVsZSIpID09IDApCisJCQltb2QtPmhhc19jbGVhbnVwID0gMTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQKK2lzX3ZtbGludXgoY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKwljb25zdCBjaGFyICpteW5hbWU7CisKKwlpZiAoKG15bmFtZSA9IHN0cnJjaHIobW9kbmFtZSwgJy8nKSkpCisJCW15bmFtZSsrOworCWVsc2UKKwkJbXluYW1lID0gbW9kbmFtZTsKKworCXJldHVybiBzdHJjbXAobXluYW1lLCAidm1saW51eCIpID09IDA7Cit9CisKKy8qIFBhcnNlIHRhZz12YWx1ZSBzdHJpbmdzIGZyb20gLm1vZGluZm8gc2VjdGlvbiAqLworc3RhdGljIGNoYXIgKm5leHRfc3RyaW5nKGNoYXIgKnN0cmluZywgdW5zaWduZWQgbG9uZyAqc2Vjc2l6ZSkKK3sKKwkvKiBTa2lwIG5vbi16ZXJvIGNoYXJzICovCisJd2hpbGUgKHN0cmluZ1swXSkgeworCQlzdHJpbmcrKzsKKwkJaWYgKCgqc2Vjc2l6ZSktLSA8PSAxKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogU2tpcCBhbnkgemVybyBwYWRkaW5nLiAqLworCXdoaWxlICghc3RyaW5nWzBdKSB7CisJCXN0cmluZysrOworCQlpZiAoKCpzZWNzaXplKS0tIDw9IDEpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHN0cmluZzsKK30KKworc3RhdGljIGNoYXIgKmdldF9tb2RpbmZvKHZvaWQgKm1vZGluZm8sIHVuc2lnbmVkIGxvbmcgbW9kaW5mb19sZW4sCisJCQkgY29uc3QgY2hhciAqdGFnKQoreworCWNoYXIgKnA7CisJdW5zaWduZWQgaW50IHRhZ2xlbiA9IHN0cmxlbih0YWcpOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IG1vZGluZm9fbGVuOworCisJZm9yIChwID0gbW9kaW5mbzsgcDsgcCA9IG5leHRfc3RyaW5nKHAsICZzaXplKSkgeworCQlpZiAoc3RybmNtcChwLCB0YWcsIHRhZ2xlbikgPT0gMCAmJiBwW3RhZ2xlbl0gPT0gJz0nKQorCQkJcmV0dXJuIHAgKyB0YWdsZW4gKyAxOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorcmVhZF9zeW1ib2xzKGNoYXIgKm1vZG5hbWUpCit7CisJY29uc3QgY2hhciAqc3ltbmFtZTsKKwljaGFyICp2ZXJzaW9uOworCXN0cnVjdCBtb2R1bGUgKm1vZDsKKwlzdHJ1Y3QgZWxmX2luZm8gaW5mbyA9IHsgfTsKKwlFbGZfU3ltICpzeW07CisKKwlwYXJzZV9lbGYoJmluZm8sIG1vZG5hbWUpOworCisJbW9kID0gbmV3X21vZHVsZShtb2RuYW1lKTsKKworCS8qIFdoZW4gdGhlcmUncyBubyB2bWxpbnV4LCBkb24ndCBwcmludCB3YXJuaW5ncyBhYm91dAorCSAqIHVucmVzb2x2ZWQgc3ltYm9scyAoc2luY2UgdGhlcmUnbGwgYmUgdG9vIG1hbnkgOykgKi8KKwlpZiAoaXNfdm1saW51eChtb2RuYW1lKSkgeworCQl1bnNpZ25lZCBpbnQgZmFrZV9jcmMgPSAwOworCQloYXZlX3ZtbGludXggPSAxOworCQlhZGRfZXhwb3J0ZWRfc3ltYm9sKCJzdHJ1Y3RfbW9kdWxlIiwgbW9kLCAmZmFrZV9jcmMpOworCQltb2QtPnNraXAgPSAxOworCX0KKworCWZvciAoc3ltID0gaW5mby5zeW10YWJfc3RhcnQ7IHN5bSA8IGluZm8uc3ltdGFiX3N0b3A7IHN5bSsrKSB7CisJCXN5bW5hbWUgPSBpbmZvLnN0cnRhYiArIHN5bS0+c3RfbmFtZTsKKworCQloYW5kbGVfbW9kdmVyc2lvbnMobW9kLCAmaW5mbywgc3ltLCBzeW1uYW1lKTsKKwkJaGFuZGxlX21vZGRldnRhYmxlKG1vZCwgJmluZm8sIHN5bSwgc3ltbmFtZSk7CisJfQorCisJdmVyc2lvbiA9IGdldF9tb2RpbmZvKGluZm8ubW9kaW5mbywgaW5mby5tb2RpbmZvX2xlbiwgInZlcnNpb24iKTsKKwlpZiAodmVyc2lvbikKKwkJbWF5YmVfZnJvYl9yY3NfdmVyc2lvbihtb2RuYW1lLCB2ZXJzaW9uLCBpbmZvLm1vZGluZm8sCisJCQkJICAgICAgIHZlcnNpb24gLSAoY2hhciAqKWluZm8uaGRyKTsKKwlpZiAodmVyc2lvbiB8fCAoYWxsX3ZlcnNpb25zICYmICFpc192bWxpbnV4KG1vZG5hbWUpKSkKKwkJZ2V0X3NyY192ZXJzaW9uKG1vZG5hbWUsIG1vZC0+c3JjdmVyc2lvbiwKKwkJCQlzaXplb2YobW9kLT5zcmN2ZXJzaW9uKS0xKTsKKworCXBhcnNlX2VsZl9maW5pc2goJmluZm8pOworCisJLyogT3VyIHRyaWNrIHRvIGdldCB2ZXJzaW9uaW5nIGZvciBzdHJ1Y3RfbW9kdWxlIC0gaXQncworCSAqIG5ldmVyIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBhbiBleHBvcnRlZCBmdW5jdGlvbiwgc28KKwkgKiB0aGUgYXV0b21hdGljIHZlcnNpb25pbmcgZG9lc24ndCBwaWNrIGl0IHVwLCBidXQgaXQncyByZWFsbHkKKwkgKiBpbXBvcnRhbnQgYW55aG93ICovCisJaWYgKG1vZHZlcnNpb25zKQorCQltb2QtPnVucmVzID0gYWxsb2Nfc3ltYm9sKCJzdHJ1Y3RfbW9kdWxlIiwgMCwgbW9kLT51bnJlcyk7Cit9CisKKyNkZWZpbmUgU1ogNTAwCisKKy8qIFdlIGZpcnN0IHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSBpbnRvIG1lbW9yeSB1c2luZyB0aGUKKyAqIGZvbGxvd2luZyBoZWxwZXIsIHRoZW4gY29tcGFyZSB0byB0aGUgZmlsZSBvbiBkaXNrIGFuZAorICogb25seSB1cGRhdGUgdGhlIGxhdGVyIGlmIGFueXRoaW5nIGNoYW5nZWQgKi8KKwordm9pZCBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCitidWZfcHJpbnRmKHN0cnVjdCBidWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciB0bXBbU1pdOworCWludCBsZW47CisJdmFfbGlzdCBhcDsKKwkKKwl2YV9zdGFydChhcCwgZm10KTsKKwlsZW4gPSB2c25wcmludGYodG1wLCBTWiwgZm10LCBhcCk7CisJaWYgKGJ1Zi0+c2l6ZSAtIGJ1Zi0+cG9zIDwgbGVuICsgMSkgeworCQlidWYtPnNpemUgKz0gMTI4OworCQlidWYtPnAgPSByZWFsbG9jKGJ1Zi0+cCwgYnVmLT5zaXplKTsKKwl9CisJc3RybmNweShidWYtPnAgKyBidWYtPnBvcywgdG1wLCBsZW4gKyAxKTsKKwlidWYtPnBvcyArPSBsZW47CisJdmFfZW5kKGFwKTsKK30KKwordm9pZAorYnVmX3dyaXRlKHN0cnVjdCBidWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqcywgaW50IGxlbikKK3sKKwlpZiAoYnVmLT5zaXplIC0gYnVmLT5wb3MgPCBsZW4pIHsKKwkJYnVmLT5zaXplICs9IGxlbjsKKwkJYnVmLT5wID0gcmVhbGxvYyhidWYtPnAsIGJ1Zi0+c2l6ZSk7CisJfQorCXN0cm5jcHkoYnVmLT5wICsgYnVmLT5wb3MsIHMsIGxlbik7CisJYnVmLT5wb3MgKz0gbGVuOworfQorCisvKiBIZWFkZXIgZm9yIHRoZSBnZW5lcmF0ZWQgZmlsZSAqLworCit2b2lkCithZGRfaGVhZGVyKHN0cnVjdCBidWZmZXIgKmIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlidWZfcHJpbnRmKGIsICIjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+XG4iKTsKKwlidWZfcHJpbnRmKGIsICIjaW5jbHVkZSA8bGludXgvdmVybWFnaWMuaD5cbiIpOworCWJ1Zl9wcmludGYoYiwgIiNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPlxuIik7CisJYnVmX3ByaW50ZihiLCAiXG4iKTsKKwlidWZfcHJpbnRmKGIsICJNT0RVTEVfSU5GTyh2ZXJtYWdpYywgVkVSTUFHSUNfU1RSSU5HKTtcbiIpOworCWJ1Zl9wcmludGYoYiwgIlxuIik7CisJYnVmX3ByaW50ZihiLCAiI3VuZGVmIHVuaXhcbiIpOyAvKiBXZSBoYXZlIGEgbW9kdWxlIGNhbGxlZCAidW5peCIgKi8KKwlidWZfcHJpbnRmKGIsICJzdHJ1Y3QgbW9kdWxlIF9fdGhpc19tb2R1bGVcbiIpOworCWJ1Zl9wcmludGYoYiwgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oXCIuZ251LmxpbmtvbmNlLnRoaXNfbW9kdWxlXCIpKSkgPSB7XG4iKTsKKwlidWZfcHJpbnRmKGIsICIgLm5hbWUgPSBfX3N0cmluZ2lmeShLQlVJTERfTU9ETkFNRSksXG4iKTsKKwlpZiAobW9kLT5oYXNfaW5pdCkKKwkJYnVmX3ByaW50ZihiLCAiIC5pbml0ID0gaW5pdF9tb2R1bGUsXG4iKTsKKwlpZiAobW9kLT5oYXNfY2xlYW51cCkKKwkJYnVmX3ByaW50ZihiLCAiI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FEXG4iCisJCQkgICAgICAiIC5leGl0ID0gY2xlYW51cF9tb2R1bGUsXG4iCisJCQkgICAgICAiI2VuZGlmXG4iKTsKKwlidWZfcHJpbnRmKGIsICJ9O1xuIik7Cit9CisKKy8qIFJlY29yZCBDUkNzIGZvciB1bnJlc29sdmVkIHN5bWJvbHMgKi8KKwordm9pZAorYWRkX3ZlcnNpb25zKHN0cnVjdCBidWZmZXIgKmIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzLCAqZXhwOworCisJZm9yIChzID0gbW9kLT51bnJlczsgczsgcyA9IHMtPm5leHQpIHsKKwkJZXhwID0gZmluZF9zeW1ib2wocy0+bmFtZSk7CisJCWlmICghZXhwIHx8IGV4cC0+bW9kdWxlID09IG1vZCkgeworCQkJaWYgKGhhdmVfdm1saW51eCAmJiAhcy0+d2VhaykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBXYXJuaW5nOiBcIiVzXCIgWyVzLmtvXSAiCisJCQkJInVuZGVmaW5lZCFcbiIsCXMtPm5hbWUsIG1vZC0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlzLT5tb2R1bGUgPSBleHAtPm1vZHVsZTsKKwkJcy0+Y3JjX3ZhbGlkID0gZXhwLT5jcmNfdmFsaWQ7CisJCXMtPmNyYyA9IGV4cC0+Y3JjOworCX0KKworCWlmICghbW9kdmVyc2lvbnMpCisJCXJldHVybjsKKworCWJ1Zl9wcmludGYoYiwgIlxuIik7CisJYnVmX3ByaW50ZihiLCAic3RhdGljIGNvbnN0IHN0cnVjdCBtb2R2ZXJzaW9uX2luZm8gX19fX3ZlcnNpb25zW11cbiIpOworCWJ1Zl9wcmludGYoYiwgIl9fYXR0cmlidXRlX3VzZWRfX1xuIik7CisJYnVmX3ByaW50ZihiLCAiX19hdHRyaWJ1dGVfXygoc2VjdGlvbihcIl9fdmVyc2lvbnNcIikpKSA9IHtcbiIpOworCisJZm9yIChzID0gbW9kLT51bnJlczsgczsgcyA9IHMtPm5leHQpIHsKKwkJaWYgKCFzLT5tb2R1bGUpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcy0+Y3JjX3ZhbGlkKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBXYXJuaW5nOiBcIiVzXCIgWyVzLmtvXSAiCisJCQkJImhhcyBubyBDUkMhXG4iLAorCQkJCXMtPm5hbWUsIG1vZC0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlidWZfcHJpbnRmKGIsICJcdHsgJSM4eCwgXCIlc1wiIH0sXG4iLCBzLT5jcmMsIHMtPm5hbWUpOworCX0KKworCWJ1Zl9wcmludGYoYiwgIn07XG4iKTsKK30KKwordm9pZAorYWRkX2RlcGVuZHMoc3RydWN0IGJ1ZmZlciAqYiwgc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGVzKQoreworCXN0cnVjdCBzeW1ib2wgKnM7CisJc3RydWN0IG1vZHVsZSAqbTsKKwlpbnQgZmlyc3QgPSAxOworCisJZm9yIChtID0gbW9kdWxlczsgbTsgbSA9IG0tPm5leHQpIHsKKwkJbS0+c2VlbiA9IGlzX3ZtbGludXgobS0+bmFtZSk7CisJfQorCisJYnVmX3ByaW50ZihiLCAiXG4iKTsKKwlidWZfcHJpbnRmKGIsICJzdGF0aWMgY29uc3QgY2hhciBfX21vZHVsZV9kZXBlbmRzW11cbiIpOworCWJ1Zl9wcmludGYoYiwgIl9fYXR0cmlidXRlX3VzZWRfX1xuIik7CisJYnVmX3ByaW50ZihiLCAiX19hdHRyaWJ1dGVfXygoc2VjdGlvbihcIi5tb2RpbmZvXCIpKSkgPVxuIik7CisJYnVmX3ByaW50ZihiLCAiXCJkZXBlbmRzPSIpOworCWZvciAocyA9IG1vZC0+dW5yZXM7IHM7IHMgPSBzLT5uZXh0KSB7CisJCWlmICghcy0+bW9kdWxlKQorCQkJY29udGludWU7CisKKwkJaWYgKHMtPm1vZHVsZS0+c2VlbikKKwkJCWNvbnRpbnVlOworCisJCXMtPm1vZHVsZS0+c2VlbiA9IDE7CisJCWJ1Zl9wcmludGYoYiwgIiVzJXMiLCBmaXJzdCA/ICIiIDogIiwiLAorCQkJICAgc3RycmNocihzLT5tb2R1bGUtPm5hbWUsICcvJykgKyAxKTsKKwkJZmlyc3QgPSAwOworCX0KKwlidWZfcHJpbnRmKGIsICJcIjtcbiIpOworfQorCit2b2lkCithZGRfc3JjdmVyc2lvbihzdHJ1Y3QgYnVmZmVyICpiLCBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJaWYgKG1vZC0+c3JjdmVyc2lvblswXSkgeworCQlidWZfcHJpbnRmKGIsICJcbiIpOworCQlidWZfcHJpbnRmKGIsICJNT0RVTEVfSU5GTyhzcmN2ZXJzaW9uLCBcIiVzXCIpO1xuIiwKKwkJCSAgIG1vZC0+c3JjdmVyc2lvbik7CisJfQorfQorCit2b2lkCit3cml0ZV9pZl9jaGFuZ2VkKHN0cnVjdCBidWZmZXIgKmIsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWNoYXIgKnRtcDsKKwlGSUxFICpmaWxlOworCXN0cnVjdCBzdGF0IHN0OworCisJZmlsZSA9IGZvcGVuKGZuYW1lLCAiciIpOworCWlmICghZmlsZSkKKwkJZ290byB3cml0ZTsKKworCWlmIChmc3RhdChmaWxlbm8oZmlsZSksICZzdCkgPCAwKQorCQlnb3RvIGNsb3NlX3dyaXRlOworCisJaWYgKHN0LnN0X3NpemUgIT0gYi0+cG9zKQorCQlnb3RvIGNsb3NlX3dyaXRlOworCisJdG1wID0gTk9GQUlMKG1hbGxvYyhiLT5wb3MpKTsKKwlpZiAoZnJlYWQodG1wLCAxLCBiLT5wb3MsIGZpbGUpICE9IGItPnBvcykKKwkJZ290byBmcmVlX3dyaXRlOworCisJaWYgKG1lbWNtcCh0bXAsIGItPnAsIGItPnBvcykgIT0gMCkKKwkJZ290byBmcmVlX3dyaXRlOworCisJZnJlZSh0bXApOworCWZjbG9zZShmaWxlKTsKKwlyZXR1cm47CisKKyBmcmVlX3dyaXRlOgorCWZyZWUodG1wKTsKKyBjbG9zZV93cml0ZToKKwlmY2xvc2UoZmlsZSk7Cisgd3JpdGU6CisJZmlsZSA9IGZvcGVuKGZuYW1lLCAidyIpOworCWlmICghZmlsZSkgeworCQlwZXJyb3IoZm5hbWUpOworCQlleGl0KDEpOworCX0KKwlpZiAoZndyaXRlKGItPnAsIDEsIGItPnBvcywgZmlsZSkgIT0gYi0+cG9zKSB7CisJCXBlcnJvcihmbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWZjbG9zZShmaWxlKTsKK30KKwordm9pZAorcmVhZF9kdW1wKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcG9zID0gMDsKKwl2b2lkICpmaWxlID0gZ3JhYl9maWxlKGZuYW1lLCAmc2l6ZSk7CisJY2hhciAqbGluZTsKKworICAgICAgICBpZiAoIWZpbGUpCisJCS8qIE5vIHN5bWJvbCB2ZXJzaW9ucywgc2lsZW50bHkgaWdub3JlICovCisJCXJldHVybjsKKworCXdoaWxlICgobGluZSA9IGdldF9uZXh0X2xpbmUoJnBvcywgZmlsZSwgc2l6ZSkpKSB7CisJCWNoYXIgKnN5bW5hbWUsICptb2RuYW1lLCAqZDsKKwkJdW5zaWduZWQgaW50IGNyYzsKKwkJc3RydWN0IG1vZHVsZSAqbW9kOworCisJCWlmICghKHN5bW5hbWUgPSBzdHJjaHIobGluZSwgJ1x0JykpKQorCQkJZ290byBmYWlsOworCQkqc3ltbmFtZSsrID0gJ1wwJzsKKwkJaWYgKCEobW9kbmFtZSA9IHN0cmNocihzeW1uYW1lLCAnXHQnKSkpCisJCQlnb3RvIGZhaWw7CisJCSptb2RuYW1lKysgPSAnXDAnOworCQlpZiAoc3RyY2hyKG1vZG5hbWUsICdcdCcpKQorCQkJZ290byBmYWlsOworCQljcmMgPSBzdHJ0b3VsKGxpbmUsICZkLCAxNik7CisJCWlmICgqc3ltbmFtZSA9PSAnXDAnIHx8ICptb2RuYW1lID09ICdcMCcgfHwgKmQgIT0gJ1wwJykKKwkJCWdvdG8gZmFpbDsKKworCQlpZiAoIShtb2QgPSBmaW5kX21vZHVsZShtb2RuYW1lKSkpIHsKKwkJCWlmIChpc192bWxpbnV4KG1vZG5hbWUpKSB7CisJCQkJaGF2ZV92bWxpbnV4ID0gMTsKKwkJCX0KKwkJCW1vZCA9IG5ld19tb2R1bGUoTk9GQUlMKHN0cmR1cChtb2RuYW1lKSkpOworCQkJbW9kLT5za2lwID0gMTsKKwkJfQorCQlhZGRfZXhwb3J0ZWRfc3ltYm9sKHN5bW5hbWUsIG1vZCwgJmNyYyk7CisJfQorCXJldHVybjsKK2ZhaWw6CisJZmF0YWwoInBhcnNlIGVycm9yIGluIHN5bWJvbCBkdW1wIGZpbGVcbiIpOworfQorCit2b2lkCit3cml0ZV9kdW1wKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCXN0cnVjdCBidWZmZXIgYnVmID0geyB9OworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKwlpbnQgbjsKKworCWZvciAobiA9IDA7IG4gPCBTWU1CT0xfSEFTSF9TSVpFIDsgbisrKSB7CisJCXN5bWJvbCA9IHN5bWJvbGhhc2hbbl07CisJCXdoaWxlIChzeW1ib2wpIHsKKwkJCXN5bWJvbCA9IHN5bWJvbC0+bmV4dDsKKwkJfQorCX0KKworCWZvciAobiA9IDA7IG4gPCBTWU1CT0xfSEFTSF9TSVpFIDsgbisrKSB7CisJCXN5bWJvbCA9IHN5bWJvbGhhc2hbbl07CisJCXdoaWxlIChzeW1ib2wpIHsKKwkJCWJ1Zl9wcmludGYoJmJ1ZiwgIjB4JTA4eFx0JXNcdCVzXG4iLCBzeW1ib2wtPmNyYywKKwkJCQlzeW1ib2wtPm5hbWUsIHN5bWJvbC0+bW9kdWxlLT5uYW1lKTsKKwkJCXN5bWJvbCA9IHN5bWJvbC0+bmV4dDsKKwkJfQorCX0KKwl3cml0ZV9pZl9jaGFuZ2VkKCZidWYsIGZuYW1lKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CisJc3RydWN0IGJ1ZmZlciBidWYgPSB7IH07CisJY2hhciBmbmFtZVtTWl07CisJY2hhciAqZHVtcF9yZWFkID0gTlVMTCwgKmR1bXBfd3JpdGUgPSBOVUxMOworCWludCBvcHQ7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTptbzphIikpICE9IC0xKSB7CisJCXN3aXRjaChvcHQpIHsKKwkJCWNhc2UgJ2knOgorCQkJCWR1bXBfcmVhZCA9IG9wdGFyZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ20nOgorCQkJCW1vZHZlcnNpb25zID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ28nOgorCQkJCWR1bXBfd3JpdGUgPSBvcHRhcmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdhJzoKKwkJCQlhbGxfdmVyc2lvbnMgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKGR1bXBfcmVhZCkKKwkJcmVhZF9kdW1wKGR1bXBfcmVhZCk7CisKKwl3aGlsZSAob3B0aW5kIDwgYXJnYykgeworCQlyZWFkX3N5bWJvbHMoYXJndltvcHRpbmQrK10pOworCX0KKworCWZvciAobW9kID0gbW9kdWxlczsgbW9kOyBtb2QgPSBtb2QtPm5leHQpIHsKKwkJaWYgKG1vZC0+c2tpcCkKKwkJCWNvbnRpbnVlOworCisJCWJ1Zi5wb3MgPSAwOworCisJCWFkZF9oZWFkZXIoJmJ1ZiwgbW9kKTsKKwkJYWRkX3ZlcnNpb25zKCZidWYsIG1vZCk7CisJCWFkZF9kZXBlbmRzKCZidWYsIG1vZCwgbW9kdWxlcyk7CisJCWFkZF9tb2RkZXZ0YWJsZSgmYnVmLCBtb2QpOworCQlhZGRfc3JjdmVyc2lvbigmYnVmLCBtb2QpOworCisJCXNwcmludGYoZm5hbWUsICIlcy5tb2QuYyIsIG1vZC0+bmFtZSk7CisJCXdyaXRlX2lmX2NoYW5nZWQoJmJ1ZiwgZm5hbWUpOworCX0KKworCWlmIChkdW1wX3dyaXRlKQorCQl3cml0ZV9kdW1wKGR1bXBfd3JpdGUpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL21vZHBvc3QuaCBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM0ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5oCkBAIC0wLDAgKzEsMTA3IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKworI2luY2x1ZGUgImVsZmNvbmZpZy5oIgorCisjaWYgS0VSTkVMX0VMRkNMQVNTID09IEVMRkNMQVNTMzIKKworI2RlZmluZSBFbGZfRWhkciAgICBFbGYzMl9FaGRyIAorI2RlZmluZSBFbGZfU2hkciAgICBFbGYzMl9TaGRyIAorI2RlZmluZSBFbGZfU3ltICAgICBFbGYzMl9TeW0KKyNkZWZpbmUgRUxGX1NUX0JJTkQgRUxGMzJfU1RfQklORAorI2RlZmluZSBFTEZfU1RfVFlQRSBFTEYzMl9TVF9UWVBFCisKKyNlbHNlCisKKyNkZWZpbmUgRWxmX0VoZHIgICAgRWxmNjRfRWhkciAKKyNkZWZpbmUgRWxmX1NoZHIgICAgRWxmNjRfU2hkciAKKyNkZWZpbmUgRWxmX1N5bSAgICAgRWxmNjRfU3ltCisjZGVmaW5lIEVMRl9TVF9CSU5EIEVMRjY0X1NUX0JJTkQKKyNkZWZpbmUgRUxGX1NUX1RZUEUgRUxGNjRfU1RfVFlQRQorCisjZW5kaWYKKworI2lmIEtFUk5FTF9FTEZEQVRBICE9IEhPU1RfRUxGREFUQQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19lbmRpYW4oY29uc3Qgdm9pZCAqc3JjLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQkoKHVuc2lnbmVkIGNoYXIqKWRlc3QpW2ldID0gKCh1bnNpZ25lZCBjaGFyKilzcmMpW3NpemUgLSBpLTFdOworfQorCisKKworI2RlZmluZSBUT19OQVRJVkUoeCkJCQkJCQlcCisoewkJCQkJCQkJXAorCXR5cGVvZih4KSBfX3g7CQkJCQkJXAorCV9fZW5kaWFuKCYoeCksICYoX194KSwgc2l6ZW9mKF9feCkpOwkJCVwKKwlfX3g7CQkJCQkJCVwKK30pCisKKyNlbHNlIC8qIGVuZGlhbm5lc3MgbWF0Y2hlcyAqLworCisjZGVmaW5lIFRPX05BVElWRSh4KSAoeCkKKworI2VuZGlmCisKKyNkZWZpbmUgTk9GQUlMKHB0cikgICBkb19ub2ZhaWwoKHB0ciksICNwdHIpCit2b2lkICpkb19ub2ZhaWwodm9pZCAqcHRyLCBjb25zdCBjaGFyICpleHByKTsKKworc3RydWN0IGJ1ZmZlciB7CisJY2hhciAqcDsKKwlpbnQgcG9zOworCWludCBzaXplOworfTsKKwordm9pZCBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCitidWZfcHJpbnRmKHN0cnVjdCBidWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCit2b2lkCitidWZfd3JpdGUoc3RydWN0IGJ1ZmZlciAqYnVmLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuKTsKKworc3RydWN0IG1vZHVsZSB7CisJc3RydWN0IG1vZHVsZSAqbmV4dDsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzeW1ib2wgKnVucmVzOworCWludCBzZWVuOworCWludCBza2lwOworCWludCBoYXNfaW5pdDsKKwlpbnQgaGFzX2NsZWFudXA7CisJc3RydWN0IGJ1ZmZlciBkZXZfdGFibGVfYnVmOworCWNoYXIJICAgICBzcmN2ZXJzaW9uWzI1XTsKK307CisKK3N0cnVjdCBlbGZfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBzaXplOworCUVsZl9FaGRyICAgICAqaGRyOworCUVsZl9TaGRyICAgICAqc2VjaGRyczsKKwlFbGZfU3ltICAgICAgKnN5bXRhYl9zdGFydDsKKwlFbGZfU3ltICAgICAgKnN5bXRhYl9zdG9wOworCWNvbnN0IGNoYXIgICAqc3RydGFiOworCWNoYXIJICAgICAqbW9kaW5mbzsKKwl1bnNpZ25lZCBpbnQgbW9kaW5mb19sZW47Cit9OworCit2b2lkIGhhbmRsZV9tb2RkZXZ0YWJsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBlbGZfaW5mbyAqaW5mbywKKwkJCUVsZl9TeW0gKnN5bSwgY29uc3QgY2hhciAqc3ltbmFtZSk7CisKK3ZvaWQgYWRkX21vZGRldnRhYmxlKHN0cnVjdCBidWZmZXIgKmJ1Ziwgc3RydWN0IG1vZHVsZSAqbW9kKTsKKwordm9pZCBtYXliZV9mcm9iX3Jjc192ZXJzaW9uKGNvbnN0IGNoYXIgKm1vZGZpbGVuYW1lLAorCQkJICAgIGNoYXIgKnZlcnNpb24sCisJCQkgICAgdm9pZCAqbW9kaW5mbywKKwkJCSAgICB1bnNpZ25lZCBsb25nIG1vZGluZm9fb2Zmc2V0KTsKK3ZvaWQgZ2V0X3NyY192ZXJzaW9uKGNvbnN0IGNoYXIgKm1vZG5hbWUsIGNoYXIgc3VtW10sIHVuc2lnbmVkIHN1bWxlbik7CisKK3ZvaWQgKmdyYWJfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitjaGFyKiBnZXRfbmV4dF9saW5lKHVuc2lnbmVkIGxvbmcgKnBvcywgdm9pZCAqZmlsZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK3ZvaWQgcmVsZWFzZV9maWxlKHZvaWQgKmZpbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMgYi9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExMjM0NwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbW9kL3N1bXZlcnNpb24uYwpAQCAtMCwwICsxLDQ5OCBAQAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpZmRlZiBfX3N1bl9fCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibW9kcG9zdC5oIgorCisvKgorICogU3RvbGVuIGZvcm0gQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogTUQ0IE1lc3NhZ2UgRGlnZXN0IEFsZ29yaXRobSAoUkZDMTMyMCkuCisgKgorICogSW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIEFuZHJldyBUcmlkZ2VsbCBhbmQgU3RldmUgRnJlbmNoJ3MKKyAqIENJRlMgTUQ0IGltcGxlbWVudGF0aW9uLCBhbmQgdGhlIGNyeXB0b2FwaSBpbXBsZW1lbnRhdGlvbgorICogb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgcHVibGljIGRvbWFpbiBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBDb2xpbiBQbHVtYiBpbiAxOTkzLgorICoKKyAqIENvcHlyaWdodCAoYykgQW5kcmV3IFRyaWRnZWxsIDE5OTctMTk5OC4KKyAqIE1vZGlmaWVkIGJ5IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKSAyMDAyCisgKiBDb3B5cmlnaHQgKGMpIENyeXB0b2FwaSBkZXZlbG9wZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworI2RlZmluZSBNRDRfRElHRVNUX1NJWkUJCTE2CisjZGVmaW5lIE1ENF9ITUFDX0JMT0NLX1NJWkUJNjQKKyNkZWZpbmUgTUQ0X0JMT0NLX1dPUkRTCQkxNgorI2RlZmluZSBNRDRfSEFTSF9XT1JEUwkJNAorCitzdHJ1Y3QgbWQ0X2N0eCB7CisJdWludDMyX3QgaGFzaFtNRDRfSEFTSF9XT1JEU107CisJdWludDMyX3QgYmxvY2tbTUQ0X0JMT0NLX1dPUkRTXTsKKwl1aW50NjRfdCBieXRlX2NvdW50OworfTsKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBsc2hpZnQodWludDMyX3QgeCwgdW5zaWduZWQgaW50IHMpCit7CisJeCAmPSAweEZGRkZGRkZGOworCXJldHVybiAoKHggPDwgcykgJiAweEZGRkZGRkZGKSB8ICh4ID4+ICgzMiAtIHMpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBGKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopCit7CisJcmV0dXJuICh4ICYgeSkgfCAoKH54KSAmIHopOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEcodWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKK3sKKwlyZXR1cm4gKHggJiB5KSB8ICh4ICYgeikgfCAoeSAmIHopOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEgodWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgeikKK3sKKwlyZXR1cm4geCBeIHkgXiB6OworfQorCisjZGVmaW5lIFJPVU5EMShhLGIsYyxkLGsscykgKGEgPSBsc2hpZnQoYSArIEYoYixjLGQpICsgaywgcykpCisjZGVmaW5lIFJPVU5EMihhLGIsYyxkLGsscykgKGEgPSBsc2hpZnQoYSArIEcoYixjLGQpICsgayArICh1aW50MzJfdCkweDVBODI3OTk5LHMpKQorI2RlZmluZSBST1VORDMoYSxiLGMsZCxrLHMpIChhID0gbHNoaWZ0KGEgKyBIKGIsYyxkKSArIGsgKyAodWludDMyX3QpMHg2RUQ5RUJBMSxzKSkKKworLyogWFhYOiB0aGlzIHN0dWZmIGNhbiBiZSBvcHRpbWl6ZWQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsZTMyX3RvX2NwdV9hcnJheSh1aW50MzJfdCAqYnVmLCB1bnNpZ25lZCBpbnQgd29yZHMpCit7CisJd2hpbGUgKHdvcmRzLS0pIHsKKwkJKmJ1ZiA9IG50b2hsKCpidWYpOworCQlidWYrKzsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfdG9fbGUzMl9hcnJheSh1aW50MzJfdCAqYnVmLCB1bnNpZ25lZCBpbnQgd29yZHMpCit7CisJd2hpbGUgKHdvcmRzLS0pIHsKKwkJKmJ1ZiA9IGh0b25sKCpidWYpOworCQlidWYrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1kNF90cmFuc2Zvcm0odWludDMyX3QgKmhhc2gsIHVpbnQzMl90IGNvbnN0ICppbikKK3sKKwl1aW50MzJfdCBhLCBiLCBjLCBkOworCisJYSA9IGhhc2hbMF07CisJYiA9IGhhc2hbMV07CisJYyA9IGhhc2hbMl07CisJZCA9IGhhc2hbM107CisKKwlST1VORDEoYSwgYiwgYywgZCwgaW5bMF0sIDMpOworCVJPVU5EMShkLCBhLCBiLCBjLCBpblsxXSwgNyk7CisJUk9VTkQxKGMsIGQsIGEsIGIsIGluWzJdLCAxMSk7CisJUk9VTkQxKGIsIGMsIGQsIGEsIGluWzNdLCAxOSk7CisJUk9VTkQxKGEsIGIsIGMsIGQsIGluWzRdLCAzKTsKKwlST1VORDEoZCwgYSwgYiwgYywgaW5bNV0sIDcpOworCVJPVU5EMShjLCBkLCBhLCBiLCBpbls2XSwgMTEpOworCVJPVU5EMShiLCBjLCBkLCBhLCBpbls3XSwgMTkpOworCVJPVU5EMShhLCBiLCBjLCBkLCBpbls4XSwgMyk7CisJUk9VTkQxKGQsIGEsIGIsIGMsIGluWzldLCA3KTsKKwlST1VORDEoYywgZCwgYSwgYiwgaW5bMTBdLCAxMSk7CisJUk9VTkQxKGIsIGMsIGQsIGEsIGluWzExXSwgMTkpOworCVJPVU5EMShhLCBiLCBjLCBkLCBpblsxMl0sIDMpOworCVJPVU5EMShkLCBhLCBiLCBjLCBpblsxM10sIDcpOworCVJPVU5EMShjLCBkLCBhLCBiLCBpblsxNF0sIDExKTsKKwlST1VORDEoYiwgYywgZCwgYSwgaW5bMTVdLCAxOSk7CisKKwlST1VORDIoYSwgYiwgYywgZCxpblsgMF0sIDMpOworCVJPVU5EMihkLCBhLCBiLCBjLCBpbls0XSwgNSk7CisJUk9VTkQyKGMsIGQsIGEsIGIsIGluWzhdLCA5KTsKKwlST1VORDIoYiwgYywgZCwgYSwgaW5bMTJdLCAxMyk7CisJUk9VTkQyKGEsIGIsIGMsIGQsIGluWzFdLCAzKTsKKwlST1VORDIoZCwgYSwgYiwgYywgaW5bNV0sIDUpOworCVJPVU5EMihjLCBkLCBhLCBiLCBpbls5XSwgOSk7CisJUk9VTkQyKGIsIGMsIGQsIGEsIGluWzEzXSwgMTMpOworCVJPVU5EMihhLCBiLCBjLCBkLCBpblsyXSwgMyk7CisJUk9VTkQyKGQsIGEsIGIsIGMsIGluWzZdLCA1KTsKKwlST1VORDIoYywgZCwgYSwgYiwgaW5bMTBdLCA5KTsKKwlST1VORDIoYiwgYywgZCwgYSwgaW5bMTRdLCAxMyk7CisJUk9VTkQyKGEsIGIsIGMsIGQsIGluWzNdLCAzKTsKKwlST1VORDIoZCwgYSwgYiwgYywgaW5bN10sIDUpOworCVJPVU5EMihjLCBkLCBhLCBiLCBpblsxMV0sIDkpOworCVJPVU5EMihiLCBjLCBkLCBhLCBpblsxNV0sIDEzKTsKKworCVJPVU5EMyhhLCBiLCBjLCBkLGluWyAwXSwgMyk7CisJUk9VTkQzKGQsIGEsIGIsIGMsIGluWzhdLCA5KTsKKwlST1VORDMoYywgZCwgYSwgYiwgaW5bNF0sIDExKTsKKwlST1VORDMoYiwgYywgZCwgYSwgaW5bMTJdLCAxNSk7CisJUk9VTkQzKGEsIGIsIGMsIGQsIGluWzJdLCAzKTsKKwlST1VORDMoZCwgYSwgYiwgYywgaW5bMTBdLCA5KTsKKwlST1VORDMoYywgZCwgYSwgYiwgaW5bNl0sIDExKTsKKwlST1VORDMoYiwgYywgZCwgYSwgaW5bMTRdLCAxNSk7CisJUk9VTkQzKGEsIGIsIGMsIGQsIGluWzFdLCAzKTsKKwlST1VORDMoZCwgYSwgYiwgYywgaW5bOV0sIDkpOworCVJPVU5EMyhjLCBkLCBhLCBiLCBpbls1XSwgMTEpOworCVJPVU5EMyhiLCBjLCBkLCBhLCBpblsxM10sIDE1KTsKKwlST1VORDMoYSwgYiwgYywgZCwgaW5bM10sIDMpOworCVJPVU5EMyhkLCBhLCBiLCBjLCBpblsxMV0sIDkpOworCVJPVU5EMyhjLCBkLCBhLCBiLCBpbls3XSwgMTEpOworCVJPVU5EMyhiLCBjLCBkLCBhLCBpblsxNV0sIDE1KTsKKworCWhhc2hbMF0gKz0gYTsKKwloYXNoWzFdICs9IGI7CisJaGFzaFsyXSArPSBjOworCWhhc2hbM10gKz0gZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kNF90cmFuc2Zvcm1faGVscGVyKHN0cnVjdCBtZDRfY3R4ICpjdHgpCit7CisJbGUzMl90b19jcHVfYXJyYXkoY3R4LT5ibG9jaywgc2l6ZW9mKGN0eC0+YmxvY2spIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJbWQ0X3RyYW5zZm9ybShjdHgtPmhhc2gsIGN0eC0+YmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtZDRfaW5pdChzdHJ1Y3QgbWQ0X2N0eCAqbWN0eCkKK3sKKwltY3R4LT5oYXNoWzBdID0gMHg2NzQ1MjMwMTsKKwltY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKKwltY3R4LT5oYXNoWzJdID0gMHg5OGJhZGNmZTsKKwltY3R4LT5oYXNoWzNdID0gMHgxMDMyNTQ3NjsKKwltY3R4LT5ieXRlX2NvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgbWQ0X3VwZGF0ZShzdHJ1Y3QgbWQ0X2N0eCAqbWN0eCwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY29uc3QgdWludDMyX3QgYXZhaWwgPSBzaXplb2YobWN0eC0+YmxvY2spIC0gKG1jdHgtPmJ5dGVfY291bnQgJiAweDNmKTsKKworCW1jdHgtPmJ5dGVfY291bnQgKz0gbGVuOworCisJaWYgKGF2YWlsID4gbGVuKSB7CisJCW1lbWNweSgoY2hhciAqKW1jdHgtPmJsb2NrICsgKHNpemVvZihtY3R4LT5ibG9jaykgLSBhdmFpbCksCisJCSAgICAgICBkYXRhLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KChjaGFyICopbWN0eC0+YmxvY2sgKyAoc2l6ZW9mKG1jdHgtPmJsb2NrKSAtIGF2YWlsKSwKKwkgICAgICAgZGF0YSwgYXZhaWwpOworCisJbWQ0X3RyYW5zZm9ybV9oZWxwZXIobWN0eCk7CisJZGF0YSArPSBhdmFpbDsKKwlsZW4gLT0gYXZhaWw7CisKKwl3aGlsZSAobGVuID49IHNpemVvZihtY3R4LT5ibG9jaykpIHsKKwkJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBzaXplb2YobWN0eC0+YmxvY2spKTsKKwkJbWQ0X3RyYW5zZm9ybV9oZWxwZXIobWN0eCk7CisJCWRhdGEgKz0gc2l6ZW9mKG1jdHgtPmJsb2NrKTsKKwkJbGVuIC09IHNpemVvZihtY3R4LT5ibG9jayk7CisJfQorCisJbWVtY3B5KG1jdHgtPmJsb2NrLCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBtZDRfZmluYWxfYXNjaWkoc3RydWN0IG1kNF9jdHggKm1jdHgsIGNoYXIgKm91dCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gbWN0eC0+Ynl0ZV9jb3VudCAmIDB4M2Y7CisJY2hhciAqcCA9IChjaGFyICopbWN0eC0+YmxvY2sgKyBvZmZzZXQ7CisJaW50IHBhZGRpbmcgPSA1NiAtIChvZmZzZXQgKyAxKTsKKworCSpwKysgPSAweDgwOworCWlmIChwYWRkaW5nIDwgMCkgeworCQltZW1zZXQocCwgMHgwMCwgcGFkZGluZyArIHNpemVvZiAodWludDY0X3QpKTsKKwkJbWQ0X3RyYW5zZm9ybV9oZWxwZXIobWN0eCk7CisJCXAgPSAoY2hhciAqKW1jdHgtPmJsb2NrOworCQlwYWRkaW5nID0gNTY7CisJfQorCisJbWVtc2V0KHAsIDAsIHBhZGRpbmcpOworCW1jdHgtPmJsb2NrWzE0XSA9IG1jdHgtPmJ5dGVfY291bnQgPDwgMzsKKwltY3R4LT5ibG9ja1sxNV0gPSBtY3R4LT5ieXRlX2NvdW50ID4+IDI5OworCWxlMzJfdG9fY3B1X2FycmF5KG1jdHgtPmJsb2NrLCAoc2l6ZW9mKG1jdHgtPmJsb2NrKSAtCisJICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ2NF90KSkgLyBzaXplb2YodWludDMyX3QpKTsKKwltZDRfdHJhbnNmb3JtKG1jdHgtPmhhc2gsIG1jdHgtPmJsb2NrKTsKKwljcHVfdG9fbGUzMl9hcnJheShtY3R4LT5oYXNoLCBzaXplb2YobWN0eC0+aGFzaCkgLyBzaXplb2YodWludDMyX3QpKTsKKworCXNucHJpbnRmKG91dCwgbGVuLCAiJTA4WCUwOFglMDhYJTA4WCIsCisJCSBtY3R4LT5oYXNoWzBdLCBtY3R4LT5oYXNoWzFdLCBtY3R4LT5oYXNoWzJdLCBtY3R4LT5oYXNoWzNdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFyKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IG1kNF9jdHggKm1kKQoreworCW1kNF91cGRhdGUobWQsICZjLCAxKTsKK30KKworc3RhdGljIGludCBwYXJzZV9zdHJpbmcoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQlzdHJ1Y3QgbWQ0X2N0eCAqbWQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJYWRkX2NoYXIoZmlsZVswXSwgbWQpOworCWZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykgeworCQlhZGRfY2hhcihmaWxlW2ldLCBtZCk7CisJCWlmIChmaWxlW2ldID09ICciJyAmJiBmaWxlW2ktMV0gIT0gJ1xcJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBwYXJzZV9jb21tZW50KGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCWZvciAoaSA9IDI7IGkgPCBsZW47IGkrKykgeworCQlpZiAoZmlsZVtpLTFdID09ICcqJyAmJiBmaWxlW2ldID09ICcvJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogRklYTUU6IEhhbmRsZSAucyBmaWxlcyBkaWZmZXJlbnRseSAoZWcuICMgc3RhcnRzIGNvbW1lbnRzKSAtLVJSICovCitzdGF0aWMgaW50IHBhcnNlX2ZpbGUoY29uc3Qgc2lnbmVkIGNoYXIgKmZuYW1lLCBzdHJ1Y3QgbWQ0X2N0eCAqbWQpCit7CisJc2lnbmVkIGNoYXIgKmZpbGU7CisJdW5zaWduZWQgbG9uZyBpLCBsZW47CisKKwlmaWxlID0gZ3JhYl9maWxlKGZuYW1lLCAmbGVuKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCS8qIENvbGxhcHNlIGFuZCBpZ25vcmUgXCBhbmQgQ1IuICovCisJCWlmIChmaWxlW2ldID09ICdcXCcgJiYgKGkrMSA8IGxlbikgJiYgZmlsZVtpKzFdID09ICdcbicpIHsKKwkJCWkrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogSWdub3JlIHdoaXRlc3BhY2UgKi8KKwkJaWYgKGlzc3BhY2UoZmlsZVtpXSkpCisJCQljb250aW51ZTsKKworCQkvKiBIYW5kbGUgc3RyaW5ncyBhcyB3aG9sZSB1bml0cyAqLworCQlpZiAoZmlsZVtpXSA9PSAnIicpIHsKKwkJCWkgKz0gcGFyc2Vfc3RyaW5nKGZpbGUraSwgbGVuIC0gaSwgbWQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDb21tZW50czogaWdub3JlICovCisJCWlmIChmaWxlW2ldID09ICcvJyAmJiBmaWxlW2krMV0gPT0gJyonKSB7CisJCQlpICs9IHBhcnNlX2NvbW1lbnQoZmlsZStpLCBsZW4gLSBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYWRkX2NoYXIoZmlsZVtpXSwgbWQpOworCX0KKwlyZWxlYXNlX2ZpbGUoZmlsZSwgbGVuKTsKKwlyZXR1cm4gMTsKK30KKworLyogV2UgaGF2ZSBkaXIvZmlsZS5vLiAgT3BlbiBkaXIvLmZpbGUuby5jbWQsIGxvb2sgZm9yIGRlcHNfIGxpbmUgdG8KKyAqIGZpZ3VyZSBvdXQgc291cmNlIGZpbGUuICovCitzdGF0aWMgaW50IHBhcnNlX3NvdXJjZV9maWxlcyhjb25zdCBjaGFyICpvYmpmaWxlLCBzdHJ1Y3QgbWQ0X2N0eCAqbWQpCit7CisJY2hhciAqY21kLCAqZmlsZSwgKmxpbmUsICpkaXI7CisJY29uc3QgY2hhciAqYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsZW4sIHBvcyA9IDA7CisJaW50IGRpcmxlbiwgcmV0ID0gMCwgY2hlY2tfZmlsZXMgPSAwOworCisJY21kID0gTk9GQUlMKG1hbGxvYyhzdHJsZW4ob2JqZmlsZSkgKyBzaXplb2YoIi4uY21kIikpKTsKKworCWJhc2UgPSBzdHJyY2hyKG9iamZpbGUsICcvJyk7CisJaWYgKGJhc2UpIHsKKwkJYmFzZSsrOworCQlkaXJsZW4gPSBiYXNlIC0gb2JqZmlsZTsKKwkJc3ByaW50ZihjbWQsICIlLipzLiVzLmNtZCIsIGRpcmxlbiwgb2JqZmlsZSwgYmFzZSk7CisJfSBlbHNlIHsKKwkJZGlybGVuID0gMDsKKwkJc3ByaW50ZihjbWQsICIuJXMuY21kIiwgb2JqZmlsZSk7CisJfQorCWRpciA9IE5PRkFJTChtYWxsb2MoZGlybGVuICsgMSkpOworCXN0cm5jcHkoZGlyLCBvYmpmaWxlLCBkaXJsZW4pOworCWRpcltkaXJsZW5dID0gJ1wwJzsKKworCWZpbGUgPSBncmFiX2ZpbGUoY21kLCAmZmxlbik7CisJaWYgKCFmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGZpbmQgJXMgZm9yICVzXG4iLAorCQkJY21kLCBvYmpmaWxlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhlcmUgd2lsbCBiZSBhIGxpbmUgbGlrZSBzbzoKKwkJZGVwc19kcml2ZXJzL25ldC9kdW1teS5vIDo9IFwKKwkJICBkcml2ZXJzL25ldC9kdW1teS5jIFwKKwkJICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvbmV0L2Zhc3Ryb3V0ZS5oKSBcCisJCSAgaW5jbHVkZS9saW51eC9jb25maWcuaCBcCisJCSAgICAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2guaCkgXAorCQkgIGluY2x1ZGUvbGludXgvbW9kdWxlLmggXAorCisJICAgU3VtIGFsbCBmaWxlcyBpbiB0aGUgc2FtZSBkaXIgb3Igc3ViZGlycy4KKwkqLworCXdoaWxlICgobGluZSA9IGdldF9uZXh0X2xpbmUoJnBvcywgZmlsZSwgZmxlbikpICE9IE5VTEwpIHsKKwkJc2lnbmVkIGNoYXIqIHAgPSBsaW5lOworCQlpZiAoc3RybmNtcChsaW5lLCAiZGVwc18iLCBzaXplb2YoImRlcHNfIiktMSkgPT0gMCkgeworCQkJY2hlY2tfZmlsZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFjaGVja19maWxlcykKKwkJCWNvbnRpbnVlOworCisJCS8qIENvbnRpbnVlIHVudGlsIGxpbmUgZG9lcyBub3QgZW5kIHdpdGggJ1wnICovCisJCWlmICggKihwICsgc3RybGVuKHApLTEpICE9ICdcXCcpCisJCQlicmVhazsKKwkJLyogVGVybWluYXRlIGxpbmUgYXQgZmlyc3Qgc3BhY2UsIHRvIGdldCByaWQgb2YgZmluYWwgJyBcJyAqLworCQl3aGlsZSAoKnApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc3BhY2UoKnApKSB7CisJCQkJKnAgPSAnXDAnOworCQkJCWJyZWFrOworCQkJfQorCQkJcCsrOworCQl9CisKKwkJLyogQ2hlY2sgaWYgdGhpcyBmaWxlIGlzIGluIHNhbWUgZGlyIGFzIG9iamZpbGUgKi8KKwkJaWYgKChzdHJzdHIobGluZSwgZGlyKStzdHJsZW4oZGlyKS0xKSA9PSBzdHJyY2hyKGxpbmUsICcvJykpIHsKKwkJCWlmICghcGFyc2VfZmlsZShsaW5lLCBtZCkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIldhcm5pbmc6IGNvdWxkIG5vdCBvcGVuICVzOiAlc1xuIiwKKwkJCQkJbGluZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlnb3RvIG91dF9maWxlOworCQkJfQorCisJCX0KKworCX0KKworCS8qIEV2ZXJ5b25lIHBhcnNlZCBPSyAqLworCXJldCA9IDE7CitvdXRfZmlsZToKKwlyZWxlYXNlX2ZpbGUoZmlsZSwgZmxlbik7CitvdXQ6CisJZnJlZShkaXIpOworCWZyZWUoY21kKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDYWxjIGFuZCByZWNvcmQgc3JjIGNoZWNrc3VtLiAqLwordm9pZCBnZXRfc3JjX3ZlcnNpb24oY29uc3QgY2hhciAqbW9kbmFtZSwgY2hhciBzdW1bXSwgdW5zaWduZWQgc3VtbGVuKQoreworCXZvaWQgKmZpbGU7CisJdW5zaWduZWQgbG9uZyBsZW47CisJc3RydWN0IG1kNF9jdHggbWQ7CisJY2hhciAqc291cmNlcywgKmVuZCwgKmZuYW1lOworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWNoYXIgZmlsZWxpc3Rbc3RybGVuKGdldGVudigiTU9EVkVSRElSIikpICsgc3RybGVuKCIvIikgKworCQkgICAgICBzdHJsZW4obW9kbmFtZSkgLSBzdHJsZW4oIi5vIikgKyBzdHJsZW4oIi5tb2QiKSArIDEgXTsKKworCS8qIFNvdXJjZSBmaWxlcyBmb3IgbW9kdWxlIGFyZSBpbiAudG1wX3ZlcnNpb25zL21vZG5hbWUubW9kLAorCSAgIGFmdGVyIHRoZSBmaXJzdCBsaW5lLiAqLworCWlmIChzdHJyY2hyKG1vZG5hbWUsICcvJykpCisJCWJhc2VuYW1lID0gc3RycmNocihtb2RuYW1lLCAnLycpICsgMTsKKwllbHNlCisJCWJhc2VuYW1lID0gbW9kbmFtZTsKKwlzcHJpbnRmKGZpbGVsaXN0LCAiJXMvJS4qcy5tb2QiLCBnZXRlbnYoIk1PRFZFUkRJUiIpLAorCQkoaW50KSBzdHJsZW4oYmFzZW5hbWUpIC0gMiwgYmFzZW5hbWUpOworCisJZmlsZSA9IGdyYWJfZmlsZShmaWxlbGlzdCwgJmxlbik7CisJaWYgKCFmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGZpbmQgdmVyc2lvbnMgZm9yICVzXG4iLAorCQkJZmlsZWxpc3QpOworCQlyZXR1cm47CisJfQorCisJc291cmNlcyA9IHN0cmNocihmaWxlLCAnXG4nKTsKKwlpZiAoIXNvdXJjZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBtYWxmb3JtZWQgdmVyc2lvbnMgZmlsZSBmb3IgJXNcbiIsCisJCQltb2RuYW1lKTsKKwkJZ290byByZWxlYXNlOworCX0KKworCXNvdXJjZXMrKzsKKwllbmQgPSBzdHJjaHIoc291cmNlcywgJ1xuJyk7CisJaWYgKCFlbmQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBiYWQgZW5kaW5nIHZlcnNpb25zIGZpbGUgZm9yICVzXG4iLAorCQkJbW9kbmFtZSk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisJKmVuZCA9ICdcMCc7CisKKwltZDRfaW5pdCgmbWQpOworCXdoaWxlICgoZm5hbWUgPSBzdHJzZXAoJnNvdXJjZXMsICIgIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqZm5hbWUpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXJzZV9zb3VyY2VfZmlsZXMoZm5hbWUsICZtZCkpCisJCQlnb3RvIHJlbGVhc2U7CisJfQorCisJbWQ0X2ZpbmFsX2FzY2lpKCZtZCwgc3VtLCBzdW1sZW4pOworcmVsZWFzZToKKwlyZWxlYXNlX2ZpbGUoZmlsZSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdmVyc2lvbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqc3VtLAorCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNoYW5naW5nIHN1bSBpbiAlcyBmYWlsZWQ6ICVzXG4iLAorCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpID09IChvZmZfdCktMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNoYW5naW5nIHN1bSBpbiAlczolbHUgZmFpbGVkOiAlc1xuIiwKKwkJCWZpbGVuYW1lLCBvZmZzZXQsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh3cml0ZShmZCwgc3VtLCBzdHJsZW4oc3VtKSsxKSAhPSBzdHJsZW4oc3VtKSsxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogd3JpdGluZyBzdW0gaW4gJXMgZmFpbGVkOiAlc1xuIiwKKwkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJY2xvc2UoZmQpOworfQorCitzdGF0aWMgaW50IHN0cmlwX3Jjc19jcmFwKHNpZ25lZCBjaGFyICp2ZXJzaW9uKQoreworCXVuc2lnbmVkIGludCBsZW4sIGZ1bGxfbGVuOworCisJaWYgKHN0cm5jbXAodmVyc2lvbiwgIiRSZXZpc2lvbiIsIHN0cmxlbigiJFJldmlzaW9uIikpICE9IDApCisJCXJldHVybiAwOworCisJLyogU3BhY2UgZm9yIHZlcnNpb24gc3RyaW5nIGZvbGxvd3MuICovCisJZnVsbF9sZW4gPSBzdHJsZW4odmVyc2lvbikgKyBzdHJsZW4odmVyc2lvbiArIHN0cmxlbih2ZXJzaW9uKSArIDEpICsgMjsKKworCS8qIE1vdmUgc3RyaW5nIHRvIHN0YXJ0IHdpdGggdmVyc2lvbiBudW1iZXI6IHByZWZpeCB3aWxsIGJlCisJICogJFJldmlzaW9uJCBvciAkUmV2aXNpb246ICovCisJbGVuID0gc3RybGVuKCIkUmV2aXNpb24iKTsKKwlpZiAodmVyc2lvbltsZW5dID09ICc6JyB8fCB2ZXJzaW9uW2xlbl0gPT0gJyQnKQorCQlsZW4rKzsKKwl3aGlsZSAoaXNzcGFjZSh2ZXJzaW9uW2xlbl0pKQorCQlsZW4rKzsKKwltZW1tb3ZlKHZlcnNpb24sIHZlcnNpb24rbGVuLCBmdWxsX2xlbi1sZW4pOworCWZ1bGxfbGVuIC09IGxlbjsKKworCS8qIFByZXNlcnZlIHVwIHRvIG5leHQgd2hpdGVzcGFjZS4gKi8KKwlsZW4gPSAwOworCXdoaWxlICh2ZXJzaW9uW2xlbl0gJiYgIWlzc3BhY2UodmVyc2lvbltsZW5dKSkKKwkJbGVuKys7CisJbWVtbW92ZSh2ZXJzaW9uICsgbGVuLCB2ZXJzaW9uICsgc3RybGVuKHZlcnNpb24pLAorCQlmdWxsX2xlbiAtIHN0cmxlbih2ZXJzaW9uKSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIENsZWFuIHVwIFJDUy1zdHlsZSB2ZXJzaW9uIG51bWJlcnMuICovCit2b2lkIG1heWJlX2Zyb2JfcmNzX3ZlcnNpb24oY29uc3QgY2hhciAqbW9kZmlsZW5hbWUsCisJCQkgICAgY2hhciAqdmVyc2lvbiwKKwkJCSAgICB2b2lkICptb2RpbmZvLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgdmVyc2lvbl9vZmZzZXQpCit7CisJaWYgKHN0cmlwX3Jjc19jcmFwKHZlcnNpb24pKQorCQl3cml0ZV92ZXJzaW9uKG1vZGZpbGVuYW1lLCB2ZXJzaW9uLCB2ZXJzaW9uX29mZnNldCk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL25hbWVzcGFjZS5wbCBiL3NjcmlwdHMvbmFtZXNwYWNlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTMwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL25hbWVzcGFjZS5wbApAQCAtMCwwICsxLDQ1NCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjCW5hbWVzcGFjZS5wbC4gIE1vbiBBdWcgMzAgMjAwNAorIworIwlQZXJmb3JtIGEgbmFtZSBzcGFjZSBhbmFseXNpcyBvbiB0aGUgbGludXgga2VybmVsLgorIworIwlDb3B5cmlnaHQgS2VpdGggT3dlbnMgPGthb3NAb2NzLmNvbS5hdT4uICBHUEwuCisjCisjCUludm9rZSBieSBjaGFuZ2luZyBkaXJlY3RvcnkgdG8gdGhlIHRvcCBvZiB0aGUga2VybmVsIG9iamVjdAorIwl0cmVlIHRoZW4gbmFtZXNwYWNlLnBsLCBubyBwYXJhbWV0ZXJzLgorIworIwlUdW5lZCBmb3IgMi4xLngga2VybmVscyB3aXRoIHRoZSBuZXcgbW9kdWxlIGhhbmRsaW5nLCBpdCB3aWxsCisjCXdvcmsgd2l0aCAyLjAga2VybmVscyBhcyB3ZWxsLgorIworIwlMYXN0IGNoYW5nZSAyLjYuOS1yYzEsIGFkZGluZyBzdXBwb3J0IGZvciBzZXBhcmF0ZSBzb3VyY2UgYW5kIG9iamVjdAorIwl0cmVlcy4KKyMKKyMJVGhlIHNvdXJjZSBtdXN0IGJlIGNvbXBpbGVkL2Fzc2VtYmxlZCBmaXJzdCwgdGhlIG9iamVjdCBmaWxlcworIwlhcmUgdGhlIHByaW1hcnkgaW5wdXQgdG8gdGhpcyBzY3JpcHQuICBJbmNvbXBsZXRlIG9yIG1pc3NpbmcKKyMJb2JqZWN0cyB3aWxsIHJlc3VsdCBpbiBhIGZsYXdlZCBhbmFseXNpcy4gIENvbXBpbGUgYm90aCB2bWxpbnV4CisjCWFuZCBtb2R1bGVzLgorIworIwlFdmVuIHdpdGggY29tcGxldGUgb2JqZWN0cywgdHJlYXQgdGhlIHJlc3VsdCBvZiB0aGUgYW5hbHlzaXMKKyMJd2l0aCBjYXV0aW9uLiAgU29tZSBleHRlcm5hbCByZWZlcmVuY2VzIGFyZSBvbmx5IHVzZWQgYnkKKyMJY2VydGFpbiBhcmNoaXRlY3R1cmVzLCBvdGhlcnMgd2l0aCBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZgorIwljb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuICBJZGVhbGx5IHRoZSBzb3VyY2Ugc2hvdWxkIGluY2x1ZGUKKyMJc29tZXRoaW5nIGxpa2UKKyMKKyMJI2lmbmRlZiBDT05GSUdfLi4uCisjCXN0YXRpYworIwkjZW5kaWYKKyMJc3ltYm9sX2RlZmluaXRpb247CisjCisjCXNvIHRoZSBzeW1ib2xzIGFyZSBkZWZpbmVkIGFzIHN0YXRpYyB1bmxlc3MgYSBwYXJ0aWN1bGFyCisjCUNPTkZJR18uLi4gcmVxdWlyZXMgaXQgdG8gYmUgZXh0ZXJuYWwuCisjCisjCUEgc3ltYm9sIHRoYXQgaXMgc3VmZml4ZWQgd2l0aCAnKGV4cG9ydCBvbmx5KScgaGFzIHRoZXNlIHByb3BlcnRpZXMKKyMKKyMJKiBJdCBpcyBnbG9iYWwuCisjCSogSXQgaXMgbWFya2VkIEVYUE9SVF9TWU1CT0wgb3IgRVhQT1JUX1NZTUJPTF9HUEwsIGVpdGhlciBpbiB0aGUgc2FtZQorIwkgIHNvdXJjZSBmaWxlIG9yIGEgZGlmZmVyZW50IHNvdXJjZSBmaWxlLgorIwkqIEdpdmVuIHRoZSBjdXJyZW50IC5jb25maWcsIG5vdGhpbmcgdXNlcyB0aGUgc3ltYm9sLgorIworIwlUaGUgc3ltYm9sIGlzIGEgY2FuZGlkYXRlIGZvciBjb252ZXJzaW9uIHRvIHN0YXRpYywgcGx1cyByZW1vdmFsIG9mIHRoZQorIwlleHBvcnQuICBCdXQgYmUgY2FyZWZ1bCB0aGF0IGEgZGlmZmVyZW50IC5jb25maWcgbWlnaHQgdXNlIHRoZSBzeW1ib2wuCisjCisjCisjCU5hbWUgc3BhY2UgYW5hbHlzaXMgYW5kIGNsZWFudXAgaXMgYW4gaXRlcmF0aXZlIHByb2Nlc3MuICBZb3UgY2Fubm90CisjCWV4cGVjdCB0byBmaW5kIGFsbCB0aGUgcHJvYmxlbXMgaW4gYSBzaW5nbGUgcGFzcy4KKyMKKyMJKiBJZGVudGlmeSBwb3NzaWJseSB1bm5lY2Vzc2FyeSBnbG9iYWwgZGVjbGFyYXRpb25zLCB2ZXJpZnkgdGhhdCB0aGV5CisjCSAgcmVhbGx5IGFyZSB1bm5lY2Vzc2FyeSBhbmQgY2hhbmdlIHRoZW0gdG8gc3RhdGljLgorIwkqIENvbXBpbGUgYW5kIGZpeCB1cCBnY2Mgd2FybmluZ3MgYWJvdXQgc3RhdGljLCByZW1vdmluZyBkZWFkIHN5bWJvbHMKKyMJICBhcyBuZWNlc3NhcnkuCisjCSogbWFrZSBjbGVhbiBhbmQgcmVidWlsZCB3aXRoIGRpZmZlcmVudCBjb25maWdzIChlc3BlY2lhbGx5CisjCSAgQ09ORklHX01PRFVMRVM9bikgdG8gc2VlIHdoaWNoIHN5bWJvbHMgYXJlIGJlaW5nIGRlZmluZWQgd2hlbiB0aGUKKyMJICBjb25maWcgZG9lcyBub3QgcmVxdWlyZSB0aGVtLiAgVGhlc2Ugc3ltYm9scyBibG9hdCB0aGUga2VybmVsIG9iamVjdAorIwkgIGZvciBubyBnb29kIHJlYXNvbiwgd2hpY2ggaXMgZnJ1c3RyYXRpbmcgZm9yIGVtYmVkZGVkIHN5c3RlbXMuCisjCSogV3JhcCBjb25maWcgc2Vuc2l0aXZlIHN5bWJvbHMgaW4gI2lmZGVmIENPTkZJR19mb28sIGFzIGxvbmcgYXMgdGhlCisjCSAgY29kZSBkb2VzIG5vdCBnZXQgdG9vIHVnbHkuCisjCSogUmVwZWF0IHRoZSBuYW1lIHNwYWNlIGFuYWx5c2lzIHVudGlsIHlvdSBjYW4gbGl2ZSB3aXRoIHdpdGggdGhlCisjCSAgcmVzdWx0LgorIworCityZXF1aXJlIDU7CSMgYXQgbGVhc3QgcGVybCA1Cit1c2Ugc3RyaWN0OwordXNlIEZpbGU6OkZpbmQ7CisKK215ICRubSA9ICIvdXNyL2Jpbi9ubSAtcCI7CitteSAkb2JqZHVtcCA9ICIvdXNyL2Jpbi9vYmpkdW1wIC1zIC1qIC5jb21tZW50IjsKK215ICRzcmN0cmVlID0gIiI7CitteSAkb2JqdHJlZSA9ICIiOworJHNyY3RyZWUgPSAiJEVOVnsnc3JjdHJlZSd9LyIgaWYgKGV4aXN0cygkRU5WeydzcmN0cmVlJ30pKTsKKyRvYmp0cmVlID0gIiRFTlZ7J29ianRyZWUnfS8iIGlmIChleGlzdHMoJEVOVnsnb2JqdHJlZSd9KSk7CisKK2lmICgkI0FSR1YgIT0gLTEpIHsKKwlwcmludCBTVERFUlIgInVzYWdlOiAkMCB0YWtlcyBubyBwYXJhbWV0ZXJzXG4iOworCWRpZSgiZ2l2aW5nIHVwXG4iKTsKK30KKworbXkgJW5tZGF0YSA9ICgpOwkjIG5tIGRhdGEgZm9yIGVhY2ggb2JqZWN0CitteSAlZGVmID0gKCk7CQkjIGFsbCBkZWZpbml0aW9ucyBmb3IgZWFjaCBuYW1lCitteSAla3N5bXRhYiA9ICgpOwkjIG5hbWVzIHRoYXQgYXBwZWFyIGluIF9fa3N5bXRhYl8KK215ICVyZWYgPSAoKTsJCSMgJHJlZnskbmFtZX0gZXhpc3RzIGlmIHRoZXJlIGlzIGEgdHJ1ZSBleHRlcm5hbCByZWZlcmVuY2UgdG8gJG5hbWUKK215ICVleHBvcnQgPSAoKTsJIyAkZXhwb3J0eyRuYW1lfSBleGlzdHMgaWYgdGhlcmUgaXMgYW4gRVhQT1JUXy4uLiBvZiAkbmFtZQorCismZmluZChcJmxpbnV4X29iamVjdHMsICcuJyk7CSMgZmluZCB0aGUgb2JqZWN0cyBhbmQgZG9fbm0gb24gdGhlbQorJmxpc3RfbXVsdGlwbHlfZGVmaW5lZCgpOworJnJlc29sdmVfZXh0ZXJuYWxfcmVmZXJlbmNlcygpOworJmxpc3RfZXh0cmFfZXh0ZXJuYWxzKCk7CisKK2V4aXQoMCk7CisKK3N1YiBsaW51eF9vYmplY3RzCit7CisJIyBTZWxlY3Qgb2JqZWN0cywgaWdub3Jpbmcgb2JqZWN0cyB3aGljaCBhcmUgb25seSBjcmVhdGVkIGJ5CisJIyBtZXJnaW5nIG90aGVyIG9iamVjdHMuICBBbHNvIGlnbm9yZSBhbGwgb2YgbW9kdWxlcywgc2NyaXB0cworCSMgYW5kIGNvbXByZXNzZWQuICBNb3N0IGNvbmdsb21lcmF0ZSBvYmplY3RzIGFyZSBoYW5kbGVkIGJ5IGRvX25tLAorCSMgdGhpcyBsaXN0IG9ubHkgY29udGFpbnMgdGhlIHNwZWNpYWwgY2FzZXMuICBUaGVzZSBpbmNsdWRlIG9iamVjdHMKKwkjIHRoYXQgYXJlIGxpbmtlZCBmcm9tIGp1c3Qgb25lIG90aGVyIG9iamVjdCBhbmQgb2JqZWN0cyBmb3Igd2hpY2gKKwkjIHRoZXJlIGlzIHJlYWxseSBubyBwZXJtYW5lbnQgc291cmNlIGZpbGUuCisJbXkgJGJhc2VuYW1lID0gJF87CisJJF8gPSAkRmlsZTo6RmluZDo6bmFtZTsKKwlzOl5cLi86OjsKKwlpZiAoLy4qXC5vJC8gJiYKKwkJISAoCisJCW06L2J1aWx0LWluLm8kOgorCQl8fCBtOmFyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3ltcy5vJDoKKwkJfHwgbTphcmNoL2lhNjQvaWEzMi9pYTMyLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9rZXJuZWwvZ2F0ZS1zeW1zLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX19kaXZkaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX2RpdnNpMy5vJDoKKwkJfHwgbTphcmNoL2lhNjQvbGliL19fbW9kZGkzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX19tb2RzaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX3VkaXZkaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX3VkaXZzaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX3Vtb2RkaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX3Vtb2RzaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L3NjcmlwdHMvY2hlY2tfZ2FzX2Zvcl9oaW50Lm8kOgorCQl8fCBtOmFyY2gvaWE2NC9zbi9rZXJuZWwveHAubyQ6CisJCXx8IG06Ym9vdC9iYm9vdHNlY3QubyQ6CisJCXx8IG06Ym9vdC9ic2V0dXAubyQ6CisJCXx8IG06L2Jvb3RzZWN0Lm8kOgorCQl8fCBtOi9ib290L3NldHVwLm8kOgorCQl8fCBtOi9jb21wcmVzc2VkLzoKKwkJfHwgbTpkcml2ZXJzL2Nkcm9tL2RyaXZlci5vJDoKKwkJfHwgbTpkcml2ZXJzL2NoYXIvZHJtL3RkZnhfZHJ2Lm8kOgorCQl8fCBtOmRyaXZlcnMvaWRlL2lkZS1kZXRlY3QubyQ6CisJCXx8IG06ZHJpdmVycy9pZGUvcGNpL2lkZWRyaXZlci1wY2kubyQ6CisJCXx8IG06ZHJpdmVycy9tZWRpYS9tZWRpYS5vJDoKKwkJfHwgbTpkcml2ZXJzL3Njc2kvc2RfbW9kLm8kOgorCQl8fCBtOmRyaXZlcnMvdmlkZW8vdmlkZW8ubyQ6CisJCXx8IG06ZnMvZGV2cHRzL2RldnB0cy5vJDoKKwkJfHwgbTpmcy9leHBvcnRmcy9leHBvcnRmcy5vJDoKKwkJfHwgbTpmcy9odWdldGxiZnMvaHVnZXRsYmZzLm8kOgorCQl8fCBtOmZzL21zZG9zL21zZG9zLm8kOgorCQl8fCBtOmZzL25scy9ubHMubyQ6CisJCXx8IG06ZnMvcmFtZnMvcmFtZnMubyQ6CisJCXx8IG06ZnMvcm9tZnMvcm9tZnMubyQ6CisJCXx8IG06ZnMvdmZhdC92ZmF0Lm8kOgorCQl8fCBtOmluaXQvbW91bnRzLm8kOgorCQl8fCBtOl5tb2R1bGVzLzoKKwkJfHwgbTpuZXQvbmV0bGluay9uZXRsaW5rLm8kOgorCQl8fCBtOm5ldC9zY2hlZC9zY2hlZC5vJDoKKwkJfHwgbTovcGlnZ3kubyQ6CisJCXx8IG06XnNjcmlwdHMvOgorCQl8fCBtOnNvdW5kLy4qL3NuZC06CisJCXx8IG06Xi4qL1wudG1wXzoKKwkJfHwgbTpeXC50bXBfOgorCQl8fCBtOi92bWxpbnV4LW9iai5vJDoKKwkJKQorCSkgeworCQlkb19ubSgkYmFzZW5hbWUsICRfKTsKKwl9CisJJF8gPSAkYmFzZW5hbWU7CQkjIEZpbGU6OkZpbmQgZXhwZWN0cyAkXyB1bnRvdWNoZWQgKHVuZG9jdW1lbnRlZCkKK30KKworc3ViIGRvX25tCit7CisJbXkgKCRiYXNlbmFtZSwgJGZ1bGxuYW1lKSA9IEBfOworCW15ICgkc291cmNlLCAkdHlwZSwgJG5hbWUpOworCWlmICghIC1lICRiYXNlbmFtZSkgeworCQlwcmludGYgU1RERVJSICIkYmFzZW5hbWUgZG9lcyBub3QgZXhpc3RcbiI7CisJCXJldHVybjsKKwl9CisJaWYgKCRmdWxsbmFtZSAhfiAvXC5vJC8pIHsKKwkJcHJpbnRmIFNUREVSUiAiJGZ1bGxuYW1lIGlzIG5vdCBhbiBvYmplY3QgZmlsZVxuIjsKKwkJcmV0dXJuOworCX0KKwkoJHNvdXJjZSA9ICRmdWxsbmFtZSkgPX4gcy9cLm8kLy87CisJaWYgKC1lICIkb2JqdHJlZSRzb3VyY2UuYyIgfHwgLWUgIiRvYmp0cmVlJHNvdXJjZS5TIikgeworCQkkc291cmNlID0gIiRvYmp0cmVlJHNvdXJjZSI7CisJfSBlbHNlIHsKKwkJJHNvdXJjZSA9ICIkc3JjdHJlZSRzb3VyY2UiOworCX0KKwlpZiAoISAtZSAiJHNvdXJjZS5jIiAmJiAhIC1lICIkc291cmNlLlMiKSB7CisJCSMgTm8gb2J2aW91cyBzb3VyY2UsIGV4Y2x1ZGUgdGhlIG9iamVjdCBpZiBpdCBpcyBjb25nbG9tZXJhdGUKKwkJaWYgKCEgb3BlbihPQkpEVU1QREFUQSwgIiRvYmpkdW1wICRiYXNlbmFtZXwiKSkgeworCQkJcHJpbnRmIFNUREVSUiAiJG9iamR1bXAgJGZ1bGxuYW1lIGZhaWxlZCAkIVxuIjsKKwkJCXJldHVybjsKKwkJfQorCQlteSAkY29tbWVudDsKKwkJd2hpbGUgKDxPQkpEVU1QREFUQT4pIHsKKwkJCWNob21wKCk7CisJCQlpZiAoL15JbiBhcmNoaXZlLykgeworCQkJCSMgQXJjaGl2ZXMgYXJlIGFsd2F5cyBjb25nbG9tZXJhdGUKKwkJCQkkY29tbWVudCA9ICJHQ0M6R0NDOiI7CisJCQkJbGFzdDsKKwkJCX0KKwkJCW5leHQgaWYgKCEgL15bIDAtOWEtZl17NSx9IC8pOworCQkJJGNvbW1lbnQgLj0gc3Vic3RyKCRfLCA0Myk7CisJCX0KKwkJY2xvc2UoT0JKRFVNUERBVEEpOworCQlpZiAoIWRlZmluZWQoJGNvbW1lbnQpIHx8ICRjb21tZW50ICF+IC9HQ0NcOi4qR0NDXDovbSkgeworCQkJcHJpbnRmIFNUREVSUiAiTm8gc291cmNlIGZpbGUgZm91bmQgZm9yICRmdWxsbmFtZVxuIjsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICghIG9wZW4oTk1EQVRBLCAiJG5tICRiYXNlbmFtZXwiKSkgeworCQlwcmludGYgU1RERVJSICIkbm0gJGZ1bGxuYW1lIGZhaWxlZCAkIVxuIjsKKwkJcmV0dXJuOworCX0KKwlteSBAbm1kYXRhOworCXdoaWxlICg8Tk1EQVRBPikgeworCQljaG9wOworCQkoJHR5cGUsICRuYW1lKSA9IChzcGxpdCgvICsvLCAkXywgMykpWzEuLjJdOworCQkjIEV4cGVjdGVkIHR5cGVzCisJCSMgQSBhYnNvbHV0ZSBzeW1ib2wKKwkJIyBCIHdlYWsgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIGRhdGEgdGhhdCBoYXMgYmVlbiByZXNvbHZlZAorCQkjIEMgZ2xvYmFsIHZhcmlhYmxlLCB1bmluaXRpYWxpc2VkCisJCSMgRCBnbG9iYWwgdmFyaWFibGUsIGluaXRpYWxpc2VkCisJCSMgRyBnbG9iYWwgdmFyaWFibGUsIGluaXRpYWxpc2VkLCBzbWFsbCBkYXRhIHNlY3Rpb24KKwkJIyBSIGdsb2JhbCBhcnJheSwgaW5pdGlhbGlzZWQKKwkJIyBTIGdsb2JhbCB2YXJpYWJsZSwgdW5pbml0aWFsaXNlZCwgc21hbGwgYnNzCisJCSMgVCBnbG9iYWwgbGFiZWwvcHJvY2VkdXJlCisJCSMgVSBleHRlcm5hbCByZWZlcmVuY2UKKwkJIyBXIHdlYWsgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIHRleHQgdGhhdCBoYXMgYmVlbiByZXNvbHZlZAorCQkjIGEgYXNzZW1ibGVyIGVxdWF0ZQorCQkjIGIgc3RhdGljIHZhcmlhYmxlLCB1bmluaXRpYWxpc2VkCisJCSMgZCBzdGF0aWMgdmFyaWFibGUsIGluaXRpYWxpc2VkCisJCSMgZyBzdGF0aWMgdmFyaWFibGUsIGluaXRpYWxpc2VkLCBzbWFsbCBkYXRhIHNlY3Rpb24KKwkJIyByIHN0YXRpYyBhcnJheSwgaW5pdGlhbGlzZWQKKwkJIyBzIHN0YXRpYyB2YXJpYWJsZSwgdW5pbml0aWFsaXNlZCwgc21hbGwgYnNzCisJCSMgdCBzdGF0aWMgbGFiZWwvcHJvY2VkdXJlcworCQkjIHcgd2VhayBleHRlcm5hbCByZWZlcmVuY2UgdG8gdGV4dCB0aGF0IGhhcyBub3QgYmVlbiByZXNvbHZlZAorCQkjID8gdW5kZWZpbmVkIHR5cGUsIHVzZWQgYSBsb3QgYnkgbW9kdWxlcworCQlpZiAoJHR5cGUgIX4gL15bQUJDREdSU1RVV2FiZGdyc3R3P10kLykgeworCQkJcHJpbnRmIFNUREVSUiAibm0gb3V0cHV0IGZvciAkZnVsbG5hbWUgY29udGFpbnMgdW5rbm93biB0eXBlICckXydcbiI7CisJCX0KKwkJZWxzaWYgKCRuYW1lID1+IC9cLi8pIHsKKwkJCSMgbmFtZSB3aXRoICcuJyBpcyBsb2NhbCBzdGF0aWMKKwkJfQorCQllbHNlIHsKKwkJCSR0eXBlID0gJ1InIGlmICgkdHlwZSBlcSAnPycpOwkjIGJpbnV0aWxzIHJlcGxhY2VkID8gd2l0aCBSIGF0IG9uZSBwb2ludAorCQkJIyBiaW51dGlscyBrZWVwcyBjaGFuZ2luZyB0aGUgdHlwZSBmb3IgZXhwb3J0ZWQgc3ltYm9scywgZm9yY2UgaXQgdG8gUgorCQkJJHR5cGUgPSAnUicgaWYgKCRuYW1lID1+IC9eX19rc3ltdGFiLyB8fCAkbmFtZSA9fiAvXl9fa3N0cnRhYi8pOworCQkJJG5hbWUgPX4gcy9fUlthLWYwLTldezh9JC8vOwkjIG1vZHVsZSB2ZXJzaW9ucyBhZGRzIHRoaXMKKwkJCWlmICgkdHlwZSA9fiAvW0FCQ0RHUlNUV10vICYmCisJCQkJJG5hbWUgbmUgJ2luaXRfbW9kdWxlJyAmJgorCQkJCSRuYW1lIG5lICdjbGVhbnVwX21vZHVsZScgJiYKKwkJCQkkbmFtZSBuZSAnVXNpbmdfVmVyc2lvbnMnICYmCisJCQkJJG5hbWUgIX4gL15WZXJzaW9uX1swLTldKyQvICYmCisJCQkJJG5hbWUgIX4gL15fX3Bhcm1fLyAmJgorCQkJCSRuYW1lICF+IC9eX19rc3RydGFiLyAmJgorCQkJCSRuYW1lICF+IC9eX19rc3ltdGFiLyAmJgorCQkJCSRuYW1lICF+IC9eX19rY3JjdGFiXy8gJiYKKwkJCQkkbmFtZSAhfiAvXl9fZXhpdGNhbGxfLyAmJgorCQkJCSRuYW1lICF+IC9eX19pbml0Y2FsbF8vICYmCisJCQkJJG5hbWUgIX4gL15fX2tkYl9pbml0Y2FsbF8vICYmCisJCQkJJG5hbWUgIX4gL15fX2tkYl9leGl0Y2FsbF8vICYmCisJCQkJJG5hbWUgIX4gL15fX21vZHVsZV8vICYmCisJCQkJJG5hbWUgIX4gL15fX21vZF8vICYmCisJCQkJJG5hbWUgIX4gL15fX2NyY18vICYmCisJCQkJJG5hbWUgbmUgJ19fdGhpc19tb2R1bGUnICYmCisJCQkJJG5hbWUgbmUgJ2tlcm5lbF92ZXJzaW9uJykgeworCQkJCWlmICghZXhpc3RzKCRkZWZ7JG5hbWV9KSkgeworCQkJCQkkZGVmeyRuYW1lfSA9IFtdOworCQkJCX0KKwkJCQlwdXNoKEB7JGRlZnskbmFtZX19LCAkZnVsbG5hbWUpOworCQkJfQorCQkJcHVzaChAbm1kYXRhLCAiJHR5cGUgJG5hbWUiKTsKKwkJCWlmICgkbmFtZSA9fiAvXl9fa3N5bXRhYl8vKSB7CisJCQkJJG5hbWUgPSBzdWJzdHIoJG5hbWUsIDEwKTsKKwkJCQlpZiAoIWV4aXN0cygka3N5bXRhYnskbmFtZX0pKSB7CisJCQkJCSRrc3ltdGFieyRuYW1lfSA9IFtdOworCQkJCX0KKwkJCQlwdXNoKEB7JGtzeW10YWJ7JG5hbWV9fSwgJGZ1bGxuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZShOTURBVEEpOworCWlmICgkI25tZGF0YSA8IDApIHsKKwkJaWYgKAorCQkJJGZ1bGxuYW1lIG5lICJsaWIvYnJsb2NrLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImxpYi9kZWNfYW5kX2xvY2subyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZnMveGZzL3hmc19tYWNyb3MubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZHJpdmVycy9pZGUvaWRlLXByb2JlLW1pbmkubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAidXNyL2luaXRyYW1mc19kYXRhLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImRyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJkcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJhcmNoL2lhNjQvc24va2VybmVsL3NuMi9pby5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJhcmNoL2lhNjQva2VybmVsL2dhdGUtZGF0YS5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJkcml2ZXJzL2llZWUxMzk0L291aS5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJzZWN1cml0eS9jYXBhYmlsaXR5Lm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgInNvdW5kL2NvcmUvd3JhcHBlcnMubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZnMvbnRmcy9zeXNjdGwubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZnMvamZzL2pmc19kZWJ1Zy5vIgorCQkpIHsKKwkJCXByaW50ZiAiTm8gbm0gZGF0YSBmb3IgJGZ1bGxuYW1lXG4iOworCQl9CisJCXJldHVybjsKKwl9CisJJG5tZGF0YXskZnVsbG5hbWV9ID0gXEBubWRhdGE7Cit9CisKK3N1YiBkcm9wX2RlZgoreworCW15ICgkb2JqZWN0LCAkbmFtZSkgPSBAXzsKKwlteSAkbm1kYXRhID0gJG5tZGF0YXskb2JqZWN0fTsKKwlteSAoJGksICRqKTsKKwlmb3IgKCRpID0gMDsgJGkgPD0gJCN7JG5tZGF0YX07ICsrJGkpIHsKKwkJaWYgKCRuYW1lIGVxIChzcGxpdCgnICcsICRubWRhdGEtPlskaV0sIDIpKVsxXSkgeworCQkJc3BsaWNlKEB7JG5tZGF0YXskb2JqZWN0fX0sICRpLCAxKTsKKwkJCW15ICRkZWYgPSAkZGVmeyRuYW1lfTsKKwkJCWZvciAoJGogPSAwOyAkaiA8ICQjeyRkZWZ7JG5hbWV9fTsgKyskaikgeworCQkJCWlmICgkZGVmeyRuYW1lfVskal0gZXEgJG9iamVjdCkgeworCQkJCQlzcGxpY2UoQHskZGVmeyRuYW1lfX0sICRqLCAxKTsKKwkJCQl9CisJCQl9CisJCQlsYXN0OworCQl9CisJfQorfQorCitzdWIgbGlzdF9tdWx0aXBseV9kZWZpbmVkCit7CisJbXkgKCRuYW1lLCAkbW9kdWxlKTsKKwlmb3JlYWNoICRuYW1lIChrZXlzKCVkZWYpKSB7CisJCWlmICgkI3skZGVmeyRuYW1lfX0gPiAwKSB7CisJCQkjIFNwZWNpYWwgY2FzZSBmb3IgY29uZF9zeXNjYWxsCisJCQlpZiAoJCN7JGRlZnskbmFtZX19ID09IDEgJiYgJG5hbWUgPX4gL15zeXNfLyAmJgorCQkJICAgICgkZGVmeyRuYW1lfVswXSBlcSAia2VybmVsL3N5cy5vIiB8fAorCQkJICAgICAkZGVmeyRuYW1lfVsxXSBlcSAia2VybmVsL3N5cy5vIikpIHsKKwkJCQkmZHJvcF9kZWYoImtlcm5lbC9zeXMubyIsICRuYW1lKTsKKwkJCQluZXh0OworCQkJfQorCQkJIyBTcGVjaWFsIGNhc2UgZm9yIGkzODYgZW50cnkgY29kZQorCQkJaWYgKCQjeyRkZWZ7JG5hbWV9fSA9PSAxICYmICRuYW1lID1+IC9eX19rZXJuZWxfLyAmJgorCQkJICAgICRkZWZ7JG5hbWV9WzBdIGVxICJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLWludDgwLm8iICYmCisJCQkgICAgJGRlZnskbmFtZX1bMV0gZXEgImFyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIubyIpIHsKKwkJCQkmZHJvcF9kZWYoImFyY2gvaTM4Ni9rZXJuZWwvdnN5c2NhbGwtc3lzZW50ZXIubyIsICRuYW1lKTsKKwkJCQluZXh0OworCQkJfQorCQkJcHJpbnRmICIkbmFtZSBpcyBtdWx0aXBseSBkZWZpbmVkIGluIDotXG4iOworCQkJZm9yZWFjaCAkbW9kdWxlIChAeyRkZWZ7JG5hbWV9fSkgeworCQkJCXByaW50ZiAiXHQkbW9kdWxlXG4iOworCQkJfQorCQl9CisJfQorfQorCitzdWIgcmVzb2x2ZV9leHRlcm5hbF9yZWZlcmVuY2VzCit7CisJbXkgKCRvYmplY3QsICR0eXBlLCAkbmFtZSwgJGksICRqLCAka3N0cnRhYiwgJGtzeW10YWIsICRleHBvcnQpOworCXByaW50ZiAiXG4iOworCWZvcmVhY2ggJG9iamVjdCAoa2V5cyglbm1kYXRhKSkgeworCQlteSAkbm1kYXRhID0gJG5tZGF0YXskb2JqZWN0fTsKKwkJZm9yICgkaSA9IDA7ICRpIDw9ICQjeyRubWRhdGF9OyArKyRpKSB7CisJCQkoJHR5cGUsICRuYW1lKSA9IHNwbGl0KCcgJywgJG5tZGF0YS0+WyRpXSwgMik7CisJCQlpZiAoJHR5cGUgZXEgIlUiIHx8ICR0eXBlIGVxICJ3IikgeworCQkJCWlmIChleGlzdHMoJGRlZnskbmFtZX0pIHx8IGV4aXN0cygka3N5bXRhYnskbmFtZX0pKSB7CisJCQkJCSMgYWRkIHRoZSBvd25pbmcgb2JqZWN0IHRvIHRoZSBubWRhdGEKKwkJCQkJJG5tZGF0YS0+WyRpXSA9ICIkdHlwZSAkbmFtZSAkb2JqZWN0IjsKKwkJCQkJIyBvbmx5IGNvdW50IGFzIGEgcmVmZXJlbmNlIGlmIGl0IGlzIG5vdCBFWFBPUlRfLi4uCisJCQkJCSRrc3RydGFiID0gIlIgX19rc3RydGFiXyRuYW1lIjsKKwkJCQkJJGtzeW10YWIgPSAiUiBfX2tzeW10YWJfJG5hbWUiOworCQkJCQkkZXhwb3J0ID0gMDsKKwkJCQkJZm9yICgkaiA9IDA7ICRqIDw9ICQjeyRubWRhdGF9OyArKyRqKSB7CisJCQkJCQlpZiAoJG5tZGF0YS0+WyRqXSBlcSAka3N0cnRhYiB8fAorCQkJCQkJICAgICRubWRhdGEtPlskal0gZXEgJGtzeW10YWIpIHsKKwkJCQkJCQkkZXhwb3J0ID0gMTsKKwkJCQkJCQlsYXN0OworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmICgkZXhwb3J0KSB7CisJCQkJCQkkZXhwb3J0eyRuYW1lfSA9ICIiOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJJHJlZnskbmFtZX0gPSAiIgorCQkJCQl9CisJCQkJfQorCQkJCWVsc2lmICggICAgJG5hbWUgbmUgIm1vZF91c2VfY291bnRfIgorCQkJCQkmJiAkbmFtZSBuZSAiX19pbml0cmFtZnNfZW5kIgorCQkJCQkmJiAkbmFtZSBuZSAiX19pbml0cmFtZnNfc3RhcnQiCisJCQkJCSYmICRuYW1lIG5lICJfZWluaXR0ZXh0IgorCQkJCQkmJiAkbmFtZSBuZSAiX3Npbml0dGV4dCIKKwkJCQkJJiYgJG5hbWUgbmUgImthbGxzeW1zX25hbWVzIgorCQkJCQkmJiAkbmFtZSBuZSAia2FsbHN5bXNfbnVtX3N5bXMiCisJCQkJCSYmICRuYW1lIG5lICJrYWxsc3ltc19hZGRyZXNzZXMiCisJCQkJCSYmICRuYW1lIG5lICJfX3RoaXNfbW9kdWxlIgorCQkJCQkmJiAkbmFtZSBuZSAiX2V0ZXh0IgorCQkJCQkmJiAkbmFtZSBuZSAiX2VkYXRhIgorCQkJCQkmJiAkbmFtZSBuZSAiX2VuZCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9fYnNzX3N0YXJ0IgorCQkJCQkmJiAkbmFtZSBuZSAiX3RleHQiCisJCQkJCSYmICRuYW1lIG5lICJfc3RleHQiCisJCQkJCSYmICRuYW1lIG5lICJfX2dwIgorCQkJCQkmJiAkbmFtZSBuZSAiaWE2NF91bndfc3RhcnQiCisJCQkJCSYmICRuYW1lIG5lICJpYTY0X3Vud19lbmQiCisJCQkJCSYmICRuYW1lIG5lICJfX2luaXRfYmVnaW4iCisJCQkJCSYmICRuYW1lIG5lICJfX2luaXRfZW5kIgorCQkJCQkmJiAkbmFtZSBuZSAiX19ic3Nfc3RvcCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9fbm9zYXZlX2JlZ2luIgorCQkJCQkmJiAkbmFtZSBuZSAiX19ub3NhdmVfZW5kIgorCQkJCQkmJiAkbmFtZSBuZSAicGcwIgorCQkJCQkmJiAkbmFtZSBuZSAiX19tb2R1bGVfdGV4dF9hZGRyZXNzIgorCQkJCQkmJiAkbmFtZSAhfiAvXl9fc2NoZWRfdGV4dF8vCisJCQkJCSYmICRuYW1lICF+IC9eX19zdGFydF8vCisJCQkJCSYmICRuYW1lICF+IC9eX19lbmRfLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fc3RvcF8vCisJCQkJCSYmICRuYW1lICF+IC9eX19zY2hlZHVsaW5nX2Z1bmN0aW9uc18uKl9oZXJlLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fLippbml0Y2FsbF8vCisJCQkJCSYmICRuYW1lICF+IC9eX18uKnBlcl9jcHVfc3RhcnQvCisJCQkJCSYmICRuYW1lICF+IC9eX18uKnBlcl9jcHVfZW5kLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fYWx0X2luc3RydWN0aW9ucy8KKwkJCQkJJiYgJG5hbWUgIX4gL15fX3NldHVwXy8KKwkJCQkJJiYgJG5hbWUgIX4gL15qaWZmaWVzLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fbW9kX3RpbWVyLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fbW9kX3BhZ2Vfc3RhdGUvCisJCQkJCSYmICRuYW1lICF+IC9eaW5pdF9tb2R1bGUvCisJCQkJCSYmICRuYW1lICF+IC9eY2xlYW51cF9tb2R1bGUvCisJCQkJKSB7CisJCQkJCXByaW50ZiAiQ2Fubm90IHJlc29sdmUgIjsKKwkJCQkJcHJpbnRmICJ3ZWFrICIgaWYgKCR0eXBlIGVxICJ3Iik7CisJCQkJCXByaW50ZiAicmVmZXJlbmNlIHRvICRuYW1lIGZyb20gJG9iamVjdFxuIjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N1YiBsaXN0X2V4dHJhX2V4dGVybmFscworeworCW15ICVub3JlZiA9ICgpOworCW15ICgkbmFtZSwgQG1vZHVsZSwgJG1vZHVsZSwgJGV4cG9ydCk7CisJZm9yZWFjaCAkbmFtZSAoa2V5cyglZGVmKSkgeworCQlpZiAoISBleGlzdHMoJHJlZnskbmFtZX0pKSB7CisJCQlAbW9kdWxlID0gQHskZGVmeyRuYW1lfX07CisJCQlmb3JlYWNoICRtb2R1bGUgKEBtb2R1bGUpIHsKKwkJCQlpZiAoISBleGlzdHMoJG5vcmVmeyRtb2R1bGV9KSkgeworCQkJCQkkbm9yZWZ7JG1vZHVsZX0gPSBbXTsKKwkJCQl9CisJCQkJcHVzaChAeyRub3JlZnskbW9kdWxlfX0sICRuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoJW5vcmVmKSB7CisJCXByaW50ZiAiXG5FeHRlcm5hbGx5IGRlZmluZWQgc3ltYm9scyB3aXRoIG5vIGV4dGVybmFsIHJlZmVyZW5jZXNcbiI7CisJCWZvcmVhY2ggJG1vZHVsZSAoc29ydChrZXlzKCVub3JlZikpKSB7CisJCQlwcmludGYgIiAgJG1vZHVsZVxuIjsKKwkJCWZvcmVhY2ggKHNvcnQoQHskbm9yZWZ7JG1vZHVsZX19KSkgeworCQkJCWlmIChleGlzdHMoJGV4cG9ydHskX30pKSB7CisJCQkJCSRleHBvcnQgPSAiIChleHBvcnQgb25seSkiOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJJGV4cG9ydCA9ICIiOworCQkJCX0KKwkJCQlwcmludGYgIiAgICAkXyRleHBvcnRcbiI7CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxZjJlZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGFja2FnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDg5IEBACisjIE1ha2VmaWxlIGZvciB0aGUgZGlmZmVyZW50IHRhcmdldHMgdXNlZCB0byBnZW5lcmF0ZSBmdWxsIHBhY2thZ2VzIG9mIGEga2VybmVsCisjIEl0IHVzZXMgdGhlIGdlbmVyaWMgY2xlYW4gaW5mcmFzdHJ1Y3R1cmUgb2Yga2J1aWxkCisKKyMgSWdub3JlIHRoZSBmb2xsb3dpbmcgZmlsZXMvZGlyZWN0b3JpZXMgZHVyaW5nIHRhciBvcGVyYXRpb24KK1RBUl9JR05PUkUgOj0gLS1leGNsdWRlIFNDQ1MgLS1leGNsdWRlIEJpdEtlZXBlciAtLWV4Y2x1ZGUgLnN2biAtLWV4Y2x1ZGUgQ1ZTCisKKworIyBSUE0gdGFyZ2V0CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgcnBtIHRhcmdldCBnZW5lcmF0ZXMgdHdvIHJwbSBmaWxlczoKKyMgL3Vzci9zcmMvcGFja2FnZXMvU1JQTVMva2VybmVsLTIuNi43cmMyLTEuc3JjLnJwbQorIyAvdXNyL3NyYy9wYWNrYWdlcy9SUE1TL2kzODYva2VybmVsLTIuNi43cmMyLTEuPGFyY2g+LnJwbQorIyBUaGUgc3JjLnJwbSBmaWxlcyBpbmNsdWRlcyBhbGwgc291cmNlIGZvciB0aGUga2VybmVsIGJlaW5nIGJ1aWx0CisjIFRoZSA8YXJjaD4ucnBtIGluY2x1ZGVzIGtlcm5lbCBjb25maWd1cmF0aW9uLCBtb2R1bGVzIGV0Yy4KKyMKKyMgUHJvY2VzcyB0byBjcmVhdGUgdGhlIHJwbSBmaWxlcworIyBhKSBjbGVhbiB0aGUga2VybmVsCisjIGIpIEdlbmVyYXRlIC5zcGVjIGZpbGUKKyMgYykgQnVpbGQgYSB0YXIgYmFsbCwgdXNpbmcgc3ltbGluayB0byBtYWtlIGtlcm5lbCB2ZXJzaW9uCisjICAgIGZpcnN0IGVudHJ5IGluIHRoZSBwYXRoCisjIGQpIGFuZCBwYWNrIHRoZSByZXN1bHQgdG8gYSB0YXIuZ3ogZmlsZQorIyBlKSBnZW5lcmF0ZSB0aGUgcnBtIGZpbGVzLCBiYXNlZCBvbiBrZXJuZWwuc3BlYworIyAtIFVzZSAvLiB0byBhdm9pZCB0YXIgcGFja2luZyBqdXN0IHRoZSBzeW1saW5rCisKKyMgRG8gd2UgaGF2ZSBycG1idWlsZCwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgb2xkZXIgcnBtCitSUE0gOj0gJChzaGVsbCBpZiBbIC14ICIvdXNyL2Jpbi9ycG1idWlsZCIgXTsgdGhlbiBlY2hvIHJwbWJ1aWxkOyBcCisJICAgICAgICAgICBlbHNlIGVjaG8gcnBtOyBmaSkKKworIyBSZW1vdmUgaHlwaGVucyBzaW5jZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIFJQTSBmaWxlbmFtZXMKK0tFUk5FTFBBVEggOj0ga2VybmVsLSQoc3Vic3QgLSwsJChLRVJORUxSRUxFQVNFKSkKK01LU1BFQyAgICAgOj0gJChzcmN0cmVlKS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCitQUkVWICAgICAgIDo9IHNldCAtZTsgY2QgLi47CisKKyMgcnBtLXBrZworLlBIT05ZOiBycG0tcGtnIHJwbQorCiskKG9ianRyZWUpL2tlcm5lbC5zcGVjOiAkKE1LU1BFQykgJChzcmN0cmVlKS9NYWtlZmlsZQorCSQoQ09ORklHX1NIRUxMKSAkKE1LU1BFQykgPiAkQAorCitycG0tcGtnIHJwbTogJChvYmp0cmVlKS9rZXJuZWwuc3BlYworCSQoTUFLRSkgY2xlYW4KKwkkKFBSRVYpIGxuIC1zZiAkKHNyY3RyZWUpICQoS0VSTkVMUEFUSCkKKwkkKFBSRVYpIHRhciAtY3ogJChSQ1NfVEFSX0lHTk9SRSkgLWYgJChLRVJORUxQQVRIKS50YXIuZ3ogJChLRVJORUxQQVRIKS8uCisJJChQUkVWKSBybSAkKEtFUk5FTFBBVEgpCisKKwlzZXQgLWU7IFwKKwkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rdmVyc2lvbiA+ICQob2JqdHJlZSkvLnRtcF92ZXJzaW9uCisJc2V0IC1lOyBcCisJbXYgLWYgJChvYmp0cmVlKS8udG1wX3ZlcnNpb24gJChvYmp0cmVlKS8udmVyc2lvbgorCisJJChSUE0pIC0tdGFyZ2V0ICQoVVRTX01BQ0hJTkUpIC10YSAuLi8kKEtFUk5FTFBBVEgpLnRhci5negorCXJtIC4uLyQoS0VSTkVMUEFUSCkudGFyLmd6CisKK2NsZWFuLWZpbGVzIDo9ICQob2JqdHJlZSkva2VybmVsLnNwZWMKKworIyBiaW5ycG0tcGtnCisuUEhPTlk6IGJpbnJwbS1wa2cKKyQob2JqdHJlZSkvYmlua2VybmVsLnNwZWM6ICQoTUtTUEVDKSAkKHNyY3RyZWUpL01ha2VmaWxlCisJJChDT05GSUdfU0hFTEwpICQoTUtTUEVDKSBwcmVidWlsdCA+ICRACisJCitiaW5ycG0tcGtnOiAkKG9ianRyZWUpL2Jpbmtlcm5lbC5zcGVjCisJJChNQUtFKQorCXNldCAtZTsgXAorCSQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbWt2ZXJzaW9uID4gJChvYmp0cmVlKS8udG1wX3ZlcnNpb24KKwlzZXQgLWU7IFwKKwltdiAtZiAkKG9ianRyZWUpLy50bXBfdmVyc2lvbiAkKG9ianRyZWUpLy52ZXJzaW9uCisKKwkkKFJQTSkgLS1kZWZpbmUgIl9idWlsZGRpciAkKHNyY3RyZWUpIiAtLXRhcmdldCAkKFVUU19NQUNISU5FKSAtYmIgJDwKKworY2xlYW4tZmlsZXMgKz0gJChvYmp0cmVlKS9iaW5rZXJuZWwuc3BlYworCisjIERlYiB0YXJnZXQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisuUEhPTlk6IGRlYi1wa2cKK2RlYi1wa2c6CisJJChNQUtFKQorCSQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgorCitjbGVhbi1kaXJzICs9ICQob2JqdHJlZSkvZGViaWFuLworCisKKyMgSGVscCB0ZXh0IGRpc3BsYXllZCB3aGVuIGV4ZWN1dGluZyAnbWFrZSBoZWxwJworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hlbHA6CisJQGVjaG8gICcgIHJwbS1wa2cgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gUlBNIHBhY2thZ2UnCisJQGVjaG8gICcgIGJpbnJwbS1wa2cgICAgICAtIEJ1aWxkIGFuIHJwbSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGNvbXBpbGVkIGtlcm5lbCAmIG1vZHVsZXMnCisJQGVjaG8gICcgIGRlYi1wa2cgICAgICAgICAtIEJ1aWxkIHRoZSBrZXJuZWwgYXMgYW4gZGViIHBhY2thZ2UnCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYiBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc5YjYzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCkBAIC0wLDAgKzEsNzkgQEAKKyMhL2Jpbi9zaAorIworIyBidWlsZGRlYiAxLjIKKyMgQ29weXJpZ2h0IDIwMDMgV2ljaGVydCBBa2tlcm1hbiA8d2ljaGVydEB3aWdneS5uZXQ+CisjCisjIFNpbXBsZSBzY3JpcHQgdG8gZ2VuZXJhdGUgYSBkZWIgcGFja2FnZSBmb3IgYSBMaW51eCBrZXJuZWwuIEFsbCB0aGUKKyMgY29tcGxleGl0eSBvZiB3aGF0IHRvIGRvIHdpdGggYSBrZXJuZWwgYWZ0ZXIgaXQgaXMgaW5zdGFsbGVyIG9yIHJlbW92ZWQKKyMgaXMgbGVmdCB0byBvdGhlciBzY3JpcHRzIGFuZCBwYWNrYWdlczogdGhleSBjYW4gaW5zdGFsbCBzY3JpcHRzIGluIHRoZQorIyAvZXRjL2tlcm5lbC97cHJlLHBvc3R9e2luc3Qscm19LmQvIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24KKyMgcGFja2FnZSBpbnN0YWxsIGFuZCByZW1vdmFsLgorCitzZXQgLWUKKworIyBTb21lIHZhcmlhYmxlcyBhbmQgc2V0dGluZ3MgdXNlZCB0aHJvdWdob3V0IHRoZSBzY3JpcHQKK3ZlcnNpb249JEtFUk5FTFJFTEVBU0UKK3RtcGRpcj0iJG9ianRyZWUvZGViaWFuL3RtcCIKKworIyBTZXR1cCB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorcm0gLXJmICIkdG1wZGlyIgorbWtkaXIgLXAgIiR0bXBkaXIvREVCSUFOIiAiJHRtcGRpci9saWIiICIkdG1wZGlyL2Jvb3QiCisKKyMgQnVpbGQgYW5kIGluc3RhbGwgdGhlIGtlcm5lbAorY3AgU3lzdGVtLm1hcCAiJHRtcGRpci9ib290L1N5c3RlbS5tYXAtJHZlcnNpb24iCitjcCAuY29uZmlnICIkdG1wZGlyL2Jvb3QvY29uZmlnLSR2ZXJzaW9uIgorY3AgJEtCVUlMRF9JTUFHRSAiJHRtcGRpci9ib290L3ZtbGludXotJHZlcnNpb24iCisKK2lmIGdyZXAgLXEgJ15DT05GSUdfTU9EVUxFUz15JyAuY29uZmlnIDsgdGhlbgorCUlOU1RBTExfTU9EX1BBVEg9IiR0bXBkaXIiIG1ha2UgbW9kdWxlc19pbnN0YWxsCitmaQorCisjIEluc3RhbGwgdGhlIG1haW50YWluZXIgc2NyaXB0cworZm9yIHNjcmlwdCBpbiBwb3N0aW5zdCBwb3N0cm0gcHJlaW5zdCBwcmVybSA7IGRvCisJbWtkaXIgLXAgIiR0bXBkaXIvZXRjL2tlcm5lbC8kc2NyaXB0LmQiCisJY2F0IDw8RU9GID4gIiR0bXBkaXIvREVCSUFOLyRzY3JpcHQiCisjIS9iaW4vc2gKKworc2V0IC1lCisKK3Rlc3QgLWQgL2V0Yy9rZXJuZWwvJHNjcmlwdC5kICYmIHJ1bi1wYXJ0cyAtLWFyZz0iJHZlcnNpb24iIC9ldGMva2VybmVsLyRzY3JpcHQuZAorZXhpdCAwCitFT0YKKwljaG1vZCA3NTUgIiR0bXBkaXIvREVCSUFOLyRzY3JpcHQiCitkb25lCisKK25hbWU9Iktlcm5lbCBDb21waWxlciA8JChpZCAtbnUpQCQoaG9zdG5hbWUgLWYpPiIKKyMgR2VuZXJhdGUgYSBzaW1wbGUgY2hhbmdlbG9nIHRlbXBsYXRlCitjYXQgPDxFT0YgPiBkZWJpYW4vY2hhbmdlbG9nCitsaW51eCAoJHZlcnNpb24pIHVuc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogQSBzdGFuZGFyZCByZWxlYXNlCisKKyAtLSAkbmFtZSAgJChkYXRlIC1SKQorRU9GCisKKyMgR2VuZXJhdGUgYSBjb250cm9sIGZpbGUKK2NhdCA8PEVPRiA+IGRlYmlhbi9jb250cm9sCitTb3VyY2U6IGxpbnV4CitTZWN0aW9uOiBiYXNlCitQcmlvcml0eTogb3B0aW9uYWwKK01haW50YWluZXI6ICRuYW1lCitTdGFuZGFyZHMtVmVyc2lvbjogMy42LjEKKworUGFja2FnZTogbGludXgtJHZlcnNpb24KK0FyY2hpdGVjdHVyZTogYW55CitEZXNjcmlwdGlvbjogTGludXgga2VybmVsLCB2ZXJzaW9uICR2ZXJzaW9uCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBMaW51eCBrZXJuZWwsIG1vZHVsZXMgYW5kIGNvcnJlc3BvbmRpbmcgb3RoZXIKKyBmaWxlcyB2ZXJzaW9uICR2ZXJzaW9uLgorRU9GCisKKyMgRml4IHNvbWUgb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucworY2hvd24gLVIgcm9vdDpyb290ICIkdG1wZGlyIgorY2htb2QgLVIgZ28tdyAiJHRtcGRpciIKKworIyBQZXJmb3JtIHRoZSBmaW5hbCBtYWdpYworZHBrZy1nZW5jb250cm9sIC1pc3AKK2Rwa2cgLS1idWlsZCAiJHRtcGRpciIgLi4KKworZXhpdCAwCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9ta3NwZWMgYi9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlN2E1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9zaAorIworIwlPdXRwdXQgYSBzaW1wbGUgUlBNIHNwZWMgZmlsZSB0aGF0IHVzZXMgbm8gZmFuY3kgZmVhdHVyZXMgcmVxdXJpbmcKKyMJUlBNIHY0LiBUaGlzIGlzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBhbnkgUlBNIGRpc3Ryby4KKyMKKyMJVGhlIG9ubHkgZ290aGljIGJpdCBoZXJlIGlzIHJlZGVmaW5pbmcgaW5zdGFsbF9wb3N0IHRvIGF2b2lkCisjCXN0cmlwcGluZyB0aGUgc3ltYm9scyBmcm9tIGZpbGVzIGluIHRoZSBrZXJuZWwgd2hpY2ggd2Ugd2FudAorIworIwlQYXRjaGVkIGZvciBub24teDg2IGJ5IE9wZW5jb24gKEwpIDIwMDIgPG9wZW5jb25AcmlvLnNreWRvbWUubmV0PgorIworCisjIGhvdyB3ZSB3ZXJlIGNhbGxlZCBkZXRlcm1pbmVzIHdoaWNoIHJwbXMgd2UgYnVpbGQgYW5kIGhvdyB3ZSBidWlsZCB0aGVtCitpZiBbICIkMSIgPSAicHJlYnVpbHQiIF07IHRoZW4KKwlQUkVCVUlMVD10cnVlCitlbHNlCisJUFJFQlVJTFQ9ZmFsc2UKK2ZpCisKKyMgc3RhcnRpbmcgdG8gb3V0cHV0IHRoZSBzcGVjCitpZiBbICJgZ3JlcCBDT05GSUdfRFJNPXkgLmNvbmZpZyB8IGN1dCAtZjIgLWRcPWAiID0gInkiIF07IHRoZW4KKwlQUk9WSURFUz1rZXJuZWwtZHJtCitmaQorCitQUk9WSURFUz0iJFBST1ZJREVTIGtlcm5lbC0kS0VSTkVMUkVMRUFTRSIKK19fS0VSTkVMUkVMRUFTRT1gZWNobyAkS0VSTkVMUkVMRUFTRSB8IHNlZCAtZSAicy8tLy9nImAKKworZWNobyAiTmFtZToga2VybmVsIgorZWNobyAiU3VtbWFyeTogVGhlIExpbnV4IEtlcm5lbCIKK2VjaG8gIlZlcnNpb246ICRfX0tFUk5FTFJFTEVBU0UiCisjIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBORVhUIHZlcnNpb24gbnVtYmVyIHNvIHRoYXQgdW5hbWUgYW5kCisjIHJwbSAtcSB3aWxsIGFncmVlCitlY2hvICJSZWxlYXNlOiBgLiAkc3JjdHJlZS9zY3JpcHRzL21rdmVyc2lvbmAiCitlY2hvICJMaWNlbnNlOiBHUEwiCitlY2hvICJHcm91cDogU3lzdGVtIEVudmlyb25tZW50L0tlcm5lbCIKK2VjaG8gIlZlbmRvcjogVGhlIExpbnV4IENvbW11bml0eSIKK2VjaG8gIlVSTDogaHR0cDovL3d3dy5rZXJuZWwub3JnIgorCitpZiAhICRQUkVCVUlMVDsgdGhlbgorZWNobyAiU291cmNlOiBrZXJuZWwtJF9fS0VSTkVMUkVMRUFTRS50YXIuZ3oiCitmaQorCitlY2hvICJCdWlsZFJvb3Q6IC92YXIvdG1wLyV7bmFtZX0tJXtQQUNLQUdFX1ZFUlNJT059LXJvb3QiCitlY2hvICJQcm92aWRlczogJFBST1ZJREVTIgorZWNobyAiJWRlZmluZSBfX3NwZWNfaW5zdGFsbF9wb3N0IC91c3IvbGliL3JwbS9icnAtY29tcHJlc3MgfHwgOiIKK2VjaG8gIiVkZWZpbmUgZGVidWdfcGFja2FnZSAle25pbH0iCitlY2hvICIiCitlY2hvICIlZGVzY3JpcHRpb24iCitlY2hvICJUaGUgTGludXggS2VybmVsLCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBjb3JlIGl0c2VsZiIKK2VjaG8gIiIKKworaWYgISAkUFJFQlVJTFQ7IHRoZW4KK2VjaG8gIiVwcmVwIgorZWNobyAiJXNldHVwIC1xIgorZWNobyAiIgorZmkKKworZWNobyAiJWJ1aWxkIgorCitpZiAhICRQUkVCVUlMVDsgdGhlbgorZWNobyAibWFrZSBjbGVhbiAmJiBtYWtlICV7X3NtcF9tZmxhZ3N9IgorZWNobyAiIgorZmkKKworZWNobyAiJWluc3RhbGwiCitlY2hvICdta2RpciAtcCAkUlBNX0JVSUxEX1JPT1QvYm9vdCAkUlBNX0JVSUxEX1JPT1QvbGliICRSUE1fQlVJTERfUk9PVC9saWIvbW9kdWxlcycKKworZWNobyAnSU5TVEFMTF9NT0RfUEFUSD0kUlBNX0JVSUxEX1JPT1QgbWFrZSAle19zbXBfbWZsYWdzfSBtb2R1bGVzX2luc3RhbGwnCitlY2hvICdjcCAkS0JVSUxEX0lNQUdFICRSUE1fQlVJTERfUk9PVCciL2Jvb3Qvdm1saW51ei0kS0VSTkVMUkVMRUFTRSIKKworZWNobyAnY3AgU3lzdGVtLm1hcCAkUlBNX0JVSUxEX1JPT1QnIi9ib290L1N5c3RlbS5tYXAtJEtFUk5FTFJFTEVBU0UiCisKK2VjaG8gJ2NwIC5jb25maWcgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC9jb25maWctJEtFUk5FTFJFTEVBU0UiCitlY2hvICIiCitlY2hvICIlY2xlYW4iCitlY2hvICcjZWNobyAtcmYgJFJQTV9CVUlMRF9ST09UJworZWNobyAiIgorZWNobyAiJWZpbGVzIgorZWNobyAnJWRlZmF0dHIgKC0sIHJvb3QsIHJvb3QpJworZWNobyAiJWRpciAvbGliL21vZHVsZXMiCitlY2hvICIvbGliL21vZHVsZXMvJEtFUk5FTFJFTEVBU0UiCitlY2hvICIvYm9vdC8qIgorZWNobyAiIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYXRjaC1rZXJuZWwgYi9zY3JpcHRzL3BhdGNoLWtlcm5lbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40M2FmMDEwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wYXRjaC1rZXJuZWwKQEAgLTAsMCArMSwyNTcgQEAKKyMhIC9iaW4vc2gKKyMgU2NyaXB0IHRvIGFwcGx5IGtlcm5lbCBwYXRjaGVzLgorIyAgIHVzYWdlOiBwYXRjaC1rZXJuZWwgWyBzb3VyY2VkaXIgWyBwYXRjaGRpciBbIHN0b3B2ZXJzaW9uIF0gWyAtYWN4eCBdIF0gXQorIyAgICAgVGhlIHNvdXJjZSBkaXJlY3RvcnkgZGVmYXVsdHMgdG8gL3Vzci9zcmMvbGludXgsIGFuZCB0aGUgcGF0Y2gKKyMgICAgIGRpcmVjdG9yeSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisjIGUuZy4KKyMgICBzY3JpcHRzL3BhdGNoLWtlcm5lbCAuIC4uCisjICAgICAgVXBkYXRlIHRoZSBrZXJuZWwgdHJlZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgdXNpbmcgcGF0Y2hlcyBpbiB0aGUKKyMgICAgICBkaXJlY3RvcnkgYWJvdmUgdG8gdGhlIGxhdGVzdCBMaW51cyBrZXJuZWwKKyMgICBzY3JpcHRzL3BhdGNoLWtlcm5lbCAuIC4uIC1hYworIyAgICAgIEdldCB0aGUgbGF0ZXN0IExpbnV4IGtlcm5lbCBhbmQgcGF0Y2ggaXQgd2l0aCB0aGUgbGF0ZXN0IGFjIHBhdGNoCisjICAgc2NyaXB0cy9wYXRjaC1rZXJuZWwgLiAuLiAyLjQuOQorIyAgICAgIEdldHMgc3RhbmRhcmQga2VybmVsIDIuNC45CisjICAgc2NyaXB0cy9wYXRjaC1rZXJuZWwgLiAuLiAyLjQuOSAtYWMKKyMgICAgICBHZXRzIDIuNC45IHdpdGggbGF0ZXN0IGFjIHBhdGNoZXMKKyMgICBzY3JpcHRzL3BhdGNoLWtlcm5lbCAuIC4uIDIuNC45IC1hYzExCisjICAgICAgR2V0cyAyLjQuOSB3aXRoIGFjIHBhdGNoIGFjMTEKKyMgICBOb3RlOiBJdCB1c2VzIHRoZSBwYXRjaGVzIHJlbGF0aXZlIHRvIHRoZSBMaW51cyBrZXJuZWxzLCBub3QgdGhlCisjICAgYWMgdG8gYWMgcmVsYXRpdmUgcGF0Y2hlcworIworIyBJdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IGtlcm5lbCB2ZXJzaW9uIGZyb20gdGhlIHRvcC1sZXZlbCBNYWtlZmlsZS4KKyMgSXQgdGhlbiBsb29rcyBmb3IgcGF0Y2hlcyBmb3IgdGhlIG5leHQgc3VibGV2ZWwgaW4gdGhlIHBhdGNoIGRpcmVjdG9yeS4KKyMgVGhpcyBpcyBhcHBsaWVkIHVzaW5nICJwYXRjaCAtcDEgLXMiIGZyb20gd2l0aGluIHRoZSBrZXJuZWwgZGlyZWN0b3J5LgorIyBBIGNoZWNrIGlzIHRoZW4gbWFkZSBmb3IgIioucmVqIiBmaWxlcyB0byBzZWUgaWYgdGhlIHBhdGNoIHdhcworIyBzdWNjZXNzZnVsLiAgSWYgaXQgaXMsIHRoZW4gYWxsIG9mIHRoZSAiKi5vcmlnIiBmaWxlcyBhcmUgcmVtb3ZlZC4KKyMKKyMgICAgICAgTmljayBIb2xsb3dheSA8Tmljay5Ib2xsb3dheUBhbGZpZS5kZW1vbi5jby51az4sIDJuZCBKYW51YXJ5IDE5OTUuCisjCisjIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIG11bHRpcGxlIHR5cGVzIG9mIGNvbXByZXNzaW9uLiBXaGF0IGluY2x1ZGVzCisjIGd6aXAsIGJ6aXAsIGJ6aXAyLCB6aXAsIGNvbXByZXNzLCBhbmQgcGxhaW50ZXh0LiAKKyMKKyMgICAgICAgQWRhbSBTdWxtaWNraSA8YWRhbUBjZmFyLnVtZC5lZHU+LCAxc3QgSmFudWFyeSAxOTk3LgorIworIyBBZGRlZCBhYmlsaXR5IHRvIHN0b3AgYXQgYSBnaXZlbiB2ZXJzaW9uIG51bWJlcgorIyBQdXQgdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgKGkuZS4gMi4zLjMxKSBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIKKyMgICAgICAgRGF2ZSBHaWxiZXJ0IDxsaW51eEB0cmVibGlnLm9yZz4sIDExdGggRGVjZW1iZXIgMTk5OS4KKworIyBGaXhlZCBwcmV2aW91cyBwYXRjaCBzbyB0aGF0IGlmIHdlIGFyZSBhbHJlYWR5IGF0IHRoZSBjb3JyZWN0IHZlcnNpb24KKyMgbm90IHRvIHBhdGNoIHVwLgorIworIyBBZGRlZCAtYWMgb3B0aW9uLCB1c2UgLWFjIG9yIC1hYzkgKHNheSkgdG8gc3RvcCBhdCBhIHBhcnRpY3VsYXIgdmVyc2lvbgorIyAgICAgICBEYXZlIEdpbGJlcnQgPGxpbnV4QHRyZWJsaWcub3JnPiwgMjl0aCBTZXB0ZW1iZXIgMjAwMS4KKyMKKyMgQWRkIHN1cHBvcnQgZm9yICh1c2Ugb2YpIEVYVFJBVkVSU0lPTiAodG8gc3VwcG9ydCAyLjYuOC54LCBlLmcuKTsKKyMgdXBkYXRlIHVzYWdlIG1lc3NhZ2U7CisjIGZpeCBzb21lIHdoaXRlc3BhY2UgZGFtYWdlOworIyBiZSBzbWFydGVyIGFib3V0IHN0b3BwaW5nIHdoZW4gY3VycmVudCB2ZXJzaW9uIGlzIGxhcmdlciB0aGFuIHJlcXVlc3RlZDsKKyMJUmFuZHkgRHVubGFwIDxyZGR1bmxhcEBvc2RsLm9yZz4sIDIwMDQtQVVHLTE4LgorCisjIFNldCBkaXJlY3RvcmllcyBmcm9tIGFyZ3VtZW50cywgb3IgdXNlIGRlZmF1bHRzLgorc291cmNlZGlyPSR7MS0vdXNyL3NyYy9saW51eH0KK3BhdGNoZGlyPSR7Mi0ufQorc3RvcHZlcnM9JHszLWRlZmF1bHR9CisKK2lmIFsgIiQxIiA9PSAtaCAtbyAiJDEiID09IC0taGVscCAtbyAhIC1yICIkc291cmNlZGlyL01ha2VmaWxlIiBdOyB0aGVuCitjYXQgPDwgVVNBR0UKK3VzYWdlOiBwYXRjaC1rZXJuZWwgWy1oXSBbIHNvdXJjZWRpciBbIHBhdGNoZGlyIFsgc3RvcHZlcnNpb24gXSBbIC1hY3h4IF0gXSBdCisgIHNvdXJjZSBkaXJlY3RvcnkgZGVmYXVsdHMgdG8gL3Vzci9zcmMvbGludXgsCisgIHBhdGNoIGRpcmVjdG9yeSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksCisgIHN0b3B2ZXJzaW9uIGRlZmF1bHRzIHRvIDxhbGwgaW4gcGF0Y2hkaXI+LgorVVNBR0UKK2V4aXQgMQorZmkKKworIyBTZWUgaWYgd2UgaGF2ZSBhbnkgLWFjIG9wdGlvbnMKK2ZvciBQQVJNIGluICQqCitkbworICBjYXNlICRQQVJNIGluCisJICAtYWMqKQorCQkgIGdvdGFjPSRQQVJNOworCisJZXNhYzsKK2RvbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBhIGZpbGUsIGZpcnN0IHBhcmFtZXRlciBpcyBiYXNlbmFtZSBvZiBmaWxlCisjIGl0IHRyaWVzIG1hbnkgY29tcHJlc3Npb24gbWVjaGFuaXNtcyBhbmQgc2V0cyB2YXJpYWJsZXMgdG8gc2F5IGhvdyB0byBnZXQgaXQKK2ZpbmRGaWxlICgpIHsKKyAgZmlsZWJhc2U9JDE7CisKKyAgaWYgWyAtciAke2ZpbGViYXNlfS5neiBdOyB0aGVuCisJCWV4dD0iLmd6IgorCQluYW1lPSJnemlwIgorCQl1bmNvbXA9Imd1bnppcCAtZGMiCisgIGVsaWYgWyAtciAke2ZpbGViYXNlfS5ieiAgXTsgdGhlbgorCQlleHQ9Ii5ieiIKKwkJbmFtZT0iYnppcCIKKwkJdW5jb21wPSJidW56aXAgLWRjIgorICBlbGlmIFsgLXIgJHtmaWxlYmFzZX0uYnoyIF07IHRoZW4KKwkJZXh0PSIuYnoyIgorCQluYW1lPSJiemlwMiIKKwkJdW5jb21wPSJidW56aXAyIC1kYyIKKyAgZWxpZiBbIC1yICR7ZmlsZWJhc2V9LnppcCBdOyB0aGVuCisJCWV4dD0iLnppcCIKKwkJbmFtZT0iemlwIgorCQl1bmNvbXA9InVuemlwIC1kIgorICBlbGlmIFsgLXIgJHtmaWxlYmFzZX0uWiBdOyB0aGVuCisJCWV4dD0iLloiCisJCW5hbWU9InVuY29tcHJlc3MiCisJCXVuY29tcD0idW5jb21wcmVzcyAtYyIKKyAgZWxpZiBbIC1yICR7ZmlsZWJhc2V9IF07IHRoZW4KKwkJZXh0PSIiCisJCW5hbWU9InBsYWludGV4dCIKKwkJdW5jb21wPSJjYXQiCisgIGVsc2UKKwlyZXR1cm4gMTsKKyAgZmkKKworICByZXR1cm4gMDsKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwbHkgYSBwYXRjaCBhbmQgY2hlY2sgaXQgZ29lcyBpbiBjbGVhbmx5CisjIEZpcnN0IHBhcmFtIGlzIHBhdGNoIG5hbWUgKGUuZy4gcGF0Y2gtMi40LjktYWM1KSAtIHdpdGhvdXQgcGF0aCBvciBleHRlbnNpb24KKworYXBwbHlQYXRjaCAoKSB7CisgIGVjaG8gLW4gIkFwcGx5aW5nICQxICgke25hbWV9KS4uLiAiCisgIGlmICR1bmNvbXAgJHtwYXRjaGRpcn0vJDEke2V4dH0gfCBwYXRjaCAtcDEgLXMgLU4gLUUgLWQgJHNvdXJjZWRpcgorICB0aGVuCisgICAgZWNobyAiZG9uZS4iCisgIGVsc2UKKyAgICBlY2hvICJmYWlsZWQuICBDbGVhbiB1cCB5b3Vyc2VsZi4iCisgICAgcmV0dXJuIDE7CisgIGZpCisgIGlmIFsgImBmaW5kICRzb3VyY2VkaXIvICcoJyAtbmFtZSAnKi5yZWonIC1vIC1uYW1lICcuKi5yZWonICcpJyAtcHJpbnRgIiBdCisgIHRoZW4KKyAgICBlY2hvICJBYm9ydGluZy4gIFJlamVjdCBmaWxlcyBmb3VuZC4iCisgICAgcmV0dXJuIDE7CisgIGZpCisgICMgUmVtb3ZlIGJhY2t1cCBmaWxlcworICBmaW5kICRzb3VyY2VkaXIvICcoJyAtbmFtZSAnKi5vcmlnJyAtbyAtbmFtZSAnLioub3JpZycgJyknIC1leGVjIHJtIC1mIHt9IFw7CisgCisgIHJldHVybiAwOworfQorCisjIHNldCBjdXJyZW50IFZFUlNJT04sIFBBVENITEVWRUwsIFNVQkxFVkVMLCBFWFRSQVZFUlNJT04KK1RNUEZJTEU9YG1rdGVtcCAudG1wdmVyLlhYWFhYWGAgfHwgeyBlY2hvICJjYW5ub3QgbWFrZSB0ZW1wIGZpbGUiIDsgZXhpdCAxOyB9CitncmVwIC1FICJeKFZFUlNJT058UEFUQ0hMRVZFTHxTVUJMRVZFTHxFWFRSQVZFUlNJT04pIiAkc291cmNlZGlyL01ha2VmaWxlID4gJFRNUEZJTEUKK3RyIC1kIFs6Ymxhbms6XSA8ICRUTVBGSUxFID4gJFRNUEZJTEUuMQorc291cmNlICRUTVBGSUxFLjEKK3JtIC1mICRUTVBGSUxFKgoraWYgWyAteiAiJFZFUlNJT04iIC1vIC16ICIkUEFUQ0hMRVZFTCIgLW8gLXogIiRTVUJMRVZFTCIgXQordGhlbgorICAgIGVjaG8gInVuYWJsZSB0byBkZXRlcm1pbmUgY3VycmVudCBrZXJuZWwgdmVyc2lvbiIgPiYyCisgICAgZXhpdCAxCitmaQorCitOQU1FPWBncmVwIF5OQU1FICRzb3VyY2VkaXIvTWFrZWZpbGVgCitOQU1FPSR7TkFNRSMjKj19CisKK2VjaG8gIkN1cnJlbnQga2VybmVsIHZlcnNpb24gaXMgJFZFUlNJT04uJFBBVENITEVWRUwuJFNVQkxFVkVMJHtFWFRSQVZFUlNJT059ICgkTkFNRSkiCisKKyMgc3RyaXAgRVhUUkFWRVJTSU9OIHRvIGp1c3QgYSBudW1iZXIgKGRyb3AgbGVhZGluZyAnLicgYW5kIHRyYWlsaW5nIGFkZGl0aW9ucykKK0VYVFJBVkVSPQoraWYgWyB4JEVYVFJBVkVSU0lPTiAhPSAieCIgXQordGhlbgorCWlmIFsgJHtFWFRSQVZFUlNJT046MDoxfSA9PSAiLiIgXTsgdGhlbgorCQlFWFRSQVZFUj0ke0VYVFJBVkVSU0lPTjoxfQorCWVsc2UKKwkJRVhUUkFWRVI9JEVYVFJBVkVSU0lPTgorCWZpCisJRVhUUkFWRVI9JHtFWFRSQVZFUiUlW1s6cHVuY3Q6XV0qfQorCSNlY2hvICJwYXRjaC1rZXJuZWw6IGNoYW5naW5nIEVYVFJBVkVSU0lPTiBmcm9tICRFWFRSQVZFUlNJT04gdG8gJEVYVFJBVkVSIgorZmkKKworI2VjaG8gInN0b3B2ZXJzPSRzdG9wdmVycyIKK2lmIFsgJHN0b3B2ZXJzICE9ICJkZWZhdWx0IiBdOyB0aGVuCisJU1RPUFNVQkxFVkVMPWBlY2hvICRzdG9wdmVycyB8IGN1dCAtZC4gLWYzYAorCVNUT1BFWFRSQT1gZWNobyAkc3RvcHZlcnMgfCBjdXQgLWQuIC1mNGAKKwkjZWNobyAiU1RPUFNVQkxFVkVMPSRTVE9QU1VCTEVWRUwsIFNUT1BFWFRSQT0kU1RPUEVYVFJBIgorZWxzZQorCVNUT1BTVUJMRVZFTD05OTk5CisJU1RPUEVYVFJBPTk5OTkKK2ZpCisKK3doaWxlIDoJCQkJIyBpbmNyZW1lbnRpbmcgU1VCTEVWRUwgKHMgaW4gdi5wLnMpCitkbworICAgIGlmIFsgeCRFWFRSQVZFUiAhPSAieCIgXTsgdGhlbgorCUNVUlJFTlRGVUxMVkVSU0lPTj0iJFZFUlNJT04uJFBBVENITEVWRUwuJFNVQkxFVkVMLiRFWFRSQVZFUiIKKyAgICBlbHNlCisJQ1VSUkVOVEZVTExWRVJTSU9OPSIkVkVSU0lPTi4kUEFUQ0hMRVZFTC4kU1VCTEVWRUwiCisgICAgZmkKKworICAgIGlmIFsgJHN0b3B2ZXJzID09ICRDVVJSRU5URlVMTFZFUlNJT04gXTsgdGhlbgorICAgICAgICBlY2hvICJTdG9wcGluZyBhdCAkQ1VSUkVOVEZVTExWRVJTSU9OIGJhc2UgYXMgcmVxdWVzdGVkLiIKKyAgICAgICAgYnJlYWsKKyAgICBmaQorCisgICAgd2hpbGUgOgkJCSMgaW5jcmVtZW50aW5nIEVYVFJBVkVSICh4IGluIHYucC5zLngpCisgICAgZG8KKwlFWFRSQVZFUj0kKChFWFRSQVZFUiArIDEpKQorCUZVTExWRVJTSU9OPSIkVkVSU0lPTi4kUEFUQ0hMRVZFTC4kU1VCTEVWRUwuJEVYVFJBVkVSIgorCSNlY2hvICIuLi4gdHJ5aW5nICRGVUxMVkVSU0lPTiAuLi4iCisKKwlwYXRjaD1wYXRjaC0kRlVMTFZFUlNJT04KKworCSMgU2VlIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgZmluZCBleHRlbnNpb24KKwlmaW5kRmlsZSAkcGF0Y2hkaXIvJHtwYXRjaH0gfHwgYnJlYWsKKworCSMgQXBwbHkgdGhlIHBhdGNoIGFuZCBjaGVjayBhbGwgaXMgT0sKKwlhcHBseVBhdGNoICRwYXRjaCB8fCBicmVhaworCisJY29udGludWUgMgorICAgIGRvbmUKKworICAgIEVYVFJBVkVSPQorICAgIFNVQkxFVkVMPSQoKFNVQkxFVkVMICsgMSkpCisgICAgRlVMTFZFUlNJT049IiRWRVJTSU9OLiRQQVRDSExFVkVMLiRTVUJMRVZFTCIKKyAgICAjZWNobyAiX19fIHRyeWluZyAkRlVMTFZFUlNJT04gX19fIgorCisgICAgaWYgWyAkKChTVUJMRVZFTCkpIC1ndCAkKChTVE9QU1VCTEVWRUwpKSBdOyB0aGVuCisJZWNobyAiU3RvcHBpbmcgc2luY2Ugc3VibGV2ZWwgKCRTVUJMRVZFTCkgaXMgYmV5b25kIHN0b3Atc3VibGV2ZWwgKCRTVE9QU1VCTEVWRUwpIgorCWV4aXQgMQorICAgIGZpCisKKyAgICBwYXRjaD1wYXRjaC0kRlVMTFZFUlNJT04KKworICAgICMgU2VlIGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQgZmluZCBleHRlbnNpb24KKyAgICBmaW5kRmlsZSAkcGF0Y2hkaXIvJHtwYXRjaH0gfHwgYnJlYWsKKworICAgICMgQXBwbHkgdGhlIHBhdGNoIGFuZCBjaGVjayBhbGwgaXMgT0sKKyAgICBhcHBseVBhdGNoICRwYXRjaCB8fCBicmVhaworZG9uZQorI2VjaG8gImJhc2UgYWxsIGRvbmUiCisKK2lmIFsgeCRnb3RhYyAhPSB4IF07IHRoZW4KKyAgIyBPdXQgZ3JlYXQgdXNlciB3YW50cyB0aGUgLWFjIHBhdGNoZXMKKwkjIFRoZXkgY291bGQgaGF2ZSBkb25lIC1hYyAoZ2V0IGxhdGVzdCkgb3IgLWFjeHggd2hlcmUgeHg9dmVyc2lvbiB0aGV5IHdhbnQKKwlpZiBbICRnb3RhYyA9PSAiLWFjIiBdOyB0aGVuCisJICAjIFRoZXkgd2FudCB0aGUgbGF0ZXN0IHZlcnNpb24KKwkJSElHSEVTVFBBVENIPTAKKwkJZm9yIFBBVENITkFNRVMgaW4gJHBhdGNoZGlyL3BhdGNoLSR7Q1VSUkVOVEZVTExWRVJTSU9OfS1hYypcLioKKwkJZG8KKwkJCUFDVkFMVUU9YGVjaG8gJFBBVENITkFNRVMgfCBzZWQgLWUgJ3MvXi4qcGF0Y2gtWzAtOS5dKi1hY1woWzAtOV0qXCkuKi9cMS8nYAorCQkJIyBDaGVjayBpdCBpcyBhY3R1YWxseSBhIHJlY29nbmlzZWQgcGF0Y2ggdHlwZQorCQkJZmluZEZpbGUgJHBhdGNoZGlyL3BhdGNoLSR7Q1VSUkVOVEZVTExWRVJTSU9OfS1hYyR7QUNWQUxVRX0gfHwgYnJlYWsKKworCQkgIGlmIFsgJEFDVkFMVUUgLWd0ICRISUdIRVNUUEFUQ0ggXTsgdGhlbgorCQkJICBISUdIRVNUUEFUQ0g9JEFDVkFMVUUKKwkJICBmaQorCQlkb25lCisKKwkJaWYgWyAkSElHSEVTVFBBVENIIC1uZSAwIF07IHRoZW4KKwkJCWZpbmRGaWxlICRwYXRjaGRpci9wYXRjaC0ke0NVUlJFTlRGVUxMVkVSU0lPTn0tYWMke0hJR0hFU1RQQVRDSH0gfHwgYnJlYWsKKwkJCWFwcGx5UGF0Y2ggcGF0Y2gtJHtDVVJSRU5URlVMTFZFUlNJT059LWFjJHtISUdIRVNUUEFUQ0h9CisJCWVsc2UKKwkJICBlY2hvICJObyAtYWMgcGF0Y2hlcyBmb3VuZCIKKwkJZmkKKwllbHNlCisJICAjIFRoZXkgd2FudCBhbiBleGFjdCB2ZXJzaW9uCisJCWZpbmRGaWxlICRwYXRjaGRpci9wYXRjaC0ke0NVUlJFTlRGVUxMVkVSU0lPTn0ke2dvdGFjfSB8fCB7CisJCSAgZWNobyAiU29ycnksIEkgY291bGRuJ3QgZmluZCB0aGUgJGdvdGFjIHBhdGNoIGZvciAkQ1VSUkVOVEZVTExWRVJTSU9OLiAgSG9odW0uIgorCQkJZXhpdCAxCisJCX0KKwkJYXBwbHlQYXRjaCBwYXRjaC0ke0NVUlJFTlRGVUxMVkVSU0lPTn0ke2dvdGFjfQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wbm10b2xvZ28uYyBiL3NjcmlwdHMvcG5tdG9sb2dvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhMmEyNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcG5tdG9sb2dvLmMKQEAgLTAsMCArMSw1MDggQEAKKworLyoKKyAqICBDb252ZXJ0IGEgbG9nbyBpbiBBU0NJSSBQTk0gZm9ybWF0IHRvIEMgc291cmNlIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4KKyAqICB0aGUgTGludXgga2VybmVsCisgKgorICogIChDKSBDb3B5cmlnaHQgMjAwMS0yMDAzIGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnRAbGludXgtbTY4ay5vcmc+CisgKgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eAorICogIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ3JhbW5hbWU7CitzdGF0aWMgY29uc3QgY2hhciAqZmlsZW5hbWU7CitzdGF0aWMgY29uc3QgY2hhciAqbG9nb25hbWUgPSAibGludXhfbG9nbyI7CitzdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0bmFtZTsKK3N0YXRpYyBGSUxFICpvdXQ7CisKKworI2RlZmluZSBMSU5VWF9MT0dPX01PTk8JCTEJLyogbW9ub2Nocm9tZSBibGFjay93aGl0ZSAqLworI2RlZmluZSBMSU5VWF9MT0dPX1ZHQTE2CTIJLyogMTYgY29sb3JzIFZHQSB0ZXh0IHBhbGV0dGUgKi8KKyNkZWZpbmUgTElOVVhfTE9HT19DTFVUMjI0CTMJLyogMjI0IGNvbG9ycyAqLworI2RlZmluZSBMSU5VWF9MT0dPX0dSQVkyNTYJNAkvKiAyNTYgbGV2ZWxzIGdyYXlzY2FsZSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqbG9nb190eXBlc1tMSU5VWF9MT0dPX0dSQVkyNTYrMV0gPSB7CisgICAgW0xJTlVYX0xPR09fTU9OT10gPSAiTElOVVhfTE9HT19NT05PIiwKKyAgICBbTElOVVhfTE9HT19WR0ExNl0gPSAiTElOVVhfTE9HT19WR0ExNiIsCisgICAgW0xJTlVYX0xPR09fQ0xVVDIyNF0gPSAiTElOVVhfTE9HT19DTFVUMjI0IiwKKyAgICBbTElOVVhfTE9HT19HUkFZMjU2XSA9ICJMSU5VWF9MT0dPX0dSQVkyNTYiCit9OworCisjZGVmaW5lIE1BWF9MSU5VWF9MT0dPX0NPTE9SUwkyMjQKKworc3RydWN0IGNvbG9yIHsKKyAgICB1bnNpZ25lZCBjaGFyIHJlZDsKKyAgICB1bnNpZ25lZCBjaGFyIGdyZWVuOworICAgIHVuc2lnbmVkIGNoYXIgYmx1ZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29sb3IgY2x1dF92Z2ExNlsxNl0gPSB7CisgICAgeyAweDAwLCAweDAwLCAweDAwIH0sCisgICAgeyAweDAwLCAweDAwLCAweGFhIH0sCisgICAgeyAweDAwLCAweGFhLCAweDAwIH0sCisgICAgeyAweDAwLCAweGFhLCAweGFhIH0sCisgICAgeyAweGFhLCAweDAwLCAweDAwIH0sCisgICAgeyAweGFhLCAweDAwLCAweGFhIH0sCisgICAgeyAweGFhLCAweDU1LCAweDAwIH0sCisgICAgeyAweGFhLCAweGFhLCAweGFhIH0sCisgICAgeyAweDU1LCAweDU1LCAweDU1IH0sCisgICAgeyAweDU1LCAweDU1LCAweGZmIH0sCisgICAgeyAweDU1LCAweGZmLCAweDU1IH0sCisgICAgeyAweDU1LCAweGZmLCAweGZmIH0sCisgICAgeyAweGZmLCAweDU1LCAweDU1IH0sCisgICAgeyAweGZmLCAweDU1LCAweGZmIH0sCisgICAgeyAweGZmLCAweGZmLCAweDU1IH0sCisgICAgeyAweGZmLCAweGZmLCAweGZmIH0sCit9OworCisKK3N0YXRpYyBpbnQgbG9nb190eXBlID0gTElOVVhfTE9HT19DTFVUMjI0Oworc3RhdGljIHVuc2lnbmVkIGludCBsb2dvX3dpZHRoOworc3RhdGljIHVuc2lnbmVkIGludCBsb2dvX2hlaWdodDsKK3N0YXRpYyBzdHJ1Y3QgY29sb3IgKipsb2dvX2RhdGE7CitzdGF0aWMgc3RydWN0IGNvbG9yIGxvZ29fY2x1dFtNQVhfTElOVVhfTE9HT19DT0xPUlNdOworc3RhdGljIHVuc2lnbmVkIGludCBsb2dvX2NsdXRzaXplOworCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pCisgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkgX19hdHRyaWJ1dGUgKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlICgobm9yZXR1cm4pKTsKKworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9udW1iZXIoRklMRSAqZnApCit7CisgICAgaW50IGMsIHZhbDsKKworICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgZG8geworCWMgPSBmZ2V0YyhmcCk7CisJaWYgKGMgPT0gRU9GKQorCSAgICBkaWUoIiVzOiBlbmQgb2YgZmlsZVxuIiwgZmlsZW5hbWUpOworCWlmIChjID09ICcjJykgeworCSAgICAvKiBJZ25vcmUgY29tbWVudHMgJ3RpbGwgZW5kIG9mIGxpbmUgKi8KKwkgICAgZG8geworCQljID0gZmdldGMoZnApOworCQlpZiAoYyA9PSBFT0YpCisJCSAgICBkaWUoIiVzOiBlbmQgb2YgZmlsZVxuIiwgZmlsZW5hbWUpOworCSAgICB9IHdoaWxlIChjICE9ICdcbicpOworCX0KKyAgICB9IHdoaWxlIChpc3NwYWNlKGMpKTsKKworICAgIC8qIFBhcnNlIGRlY2ltYWwgbnVtYmVyICovCisgICAgdmFsID0gMDsKKyAgICB3aGlsZSAoaXNkaWdpdChjKSkgeworCXZhbCA9IDEwKnZhbCtjLScwJzsKKwljID0gZmdldGMoZnApOworCWlmIChjID09IEVPRikKKwkgICAgZGllKCIlczogZW5kIG9mIGZpbGVcbiIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbnVtYmVyMjU1KEZJTEUgKmZwLCB1bnNpZ25lZCBpbnQgbWF4dmFsKQoreworICAgIHVuc2lnbmVkIGludCB2YWwgPSBnZXRfbnVtYmVyKGZwKTsKKyAgICByZXR1cm4gKDI1NSp2YWwrbWF4dmFsLzIpL21heHZhbDsKK30KKworc3RhdGljIHZvaWQgcmVhZF9pbWFnZSh2b2lkKQoreworICAgIEZJTEUgKmZwOworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIGludCBtYWdpYzsKKyAgICB1bnNpZ25lZCBpbnQgbWF4dmFsOworCisgICAgLyogb3BlbiBpbWFnZSBmaWxlICovCisgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAoIWZwKQorCWRpZSgiQ2Fubm90IG9wZW4gZmlsZSAlczogJXNcbiIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCisgICAgLyogY2hlY2sgZmlsZSB0eXBlIGFuZCByZWFkIGZpbGUgaGVhZGVyICovCisgICAgbWFnaWMgPSBmZ2V0YyhmcCk7CisgICAgaWYgKG1hZ2ljICE9ICdQJykKKwlkaWUoIiVzIGlzIG5vdCBhIFBOTSBmaWxlXG4iLCBmaWxlbmFtZSk7CisgICAgbWFnaWMgPSBmZ2V0YyhmcCk7CisgICAgc3dpdGNoIChtYWdpYykgeworCWNhc2UgJzEnOgorCWNhc2UgJzInOgorCWNhc2UgJzMnOgorCSAgICAvKiBQbGFpbiBQQk0vUEdNL1BQTSAqLworCSAgICBicmVhazsKKworCWNhc2UgJzQnOgorCWNhc2UgJzUnOgorCWNhc2UgJzYnOgorCSAgICAvKiBCaW5hcnkgUEJNL1BHTS9QUE0gKi8KKwkgICAgZGllKCIlczogQmluYXJ5IFBOTSBpcyBub3Qgc3VwcG9ydGVkXG4iCisJCSJVc2UgcG5tbm9yYXcoMSkgdG8gY29udmVydCBpdCB0byBBU0NJSSBQTk1cbiIsIGZpbGVuYW1lKTsKKworCWRlZmF1bHQ6CisJICAgIGRpZSgiJXMgaXMgbm90IGEgUE5NIGZpbGVcbiIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgbG9nb193aWR0aCA9IGdldF9udW1iZXIoZnApOworICAgIGxvZ29faGVpZ2h0ID0gZ2V0X251bWJlcihmcCk7CisKKyAgICAvKiBhbGxvY2F0ZSBpbWFnZSBkYXRhICovCisgICAgbG9nb19kYXRhID0gKHN0cnVjdCBjb2xvciAqKiltYWxsb2MobG9nb19oZWlnaHQqc2l6ZW9mKHN0cnVjdCBjb2xvciAqKSk7CisgICAgaWYgKCFsb2dvX2RhdGEpCisJZGllKCIlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykgeworCWxvZ29fZGF0YVtpXSA9IG1hbGxvYyhsb2dvX3dpZHRoKnNpemVvZihzdHJ1Y3QgY29sb3IpKTsKKwlpZiAoIWxvZ29fZGF0YVtpXSkKKwkgICAgZGllKCIlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICAvKiByZWFkIGltYWdlIGRhdGEgKi8KKyAgICBzd2l0Y2ggKG1hZ2ljKSB7CisJY2FzZSAnMSc6CisJICAgIC8qIFBsYWluIFBCTSAqLworCSAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykKKwkJICAgIGxvZ29fZGF0YVtpXVtqXS5yZWQgPSBsb2dvX2RhdGFbaV1bal0uZ3JlZW4gPQorCQkJbG9nb19kYXRhW2ldW2pdLmJsdWUgPSAyNTUqKDEtZ2V0X251bWJlcihmcCkpOworCSAgICBicmVhazsKKworCWNhc2UgJzInOgorCSAgICAvKiBQbGFpbiBQR00gKi8KKwkgICAgbWF4dmFsID0gZ2V0X251bWJlcihmcCk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgbG9nb193aWR0aDsgaisrKQorCQkgICAgbG9nb19kYXRhW2ldW2pdLnJlZCA9IGxvZ29fZGF0YVtpXVtqXS5ncmVlbiA9CisJCQlsb2dvX2RhdGFbaV1bal0uYmx1ZSA9IGdldF9udW1iZXIyNTUoZnAsIG1heHZhbCk7CisJICAgIGJyZWFrOworCisJY2FzZSAnMyc6CisJICAgIC8qIFBsYWluIFBQTSAqLworCSAgICBtYXh2YWwgPSBnZXRfbnVtYmVyKGZwKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspIHsKKwkJICAgIGxvZ29fZGF0YVtpXVtqXS5yZWQgPSBnZXRfbnVtYmVyMjU1KGZwLCBtYXh2YWwpOworCQkgICAgbG9nb19kYXRhW2ldW2pdLmdyZWVuID0gZ2V0X251bWJlcjI1NShmcCwgbWF4dmFsKTsKKwkJICAgIGxvZ29fZGF0YVtpXVtqXS5ibHVlID0gZ2V0X251bWJlcjI1NShmcCwgbWF4dmFsKTsKKwkJfQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBjbG9zZSBmaWxlICovCisgICAgZmNsb3NlKGZwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYmxhY2soc3RydWN0IGNvbG9yIGMpCit7CisgICAgcmV0dXJuIGMucmVkID09IDAgJiYgYy5ncmVlbiA9PSAwICYmIGMuYmx1ZSA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc193aGl0ZShzdHJ1Y3QgY29sb3IgYykKK3sKKyAgICByZXR1cm4gYy5yZWQgPT0gMjU1ICYmIGMuZ3JlZW4gPT0gMjU1ICYmIGMuYmx1ZSA9PSAyNTU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2dyYXkoc3RydWN0IGNvbG9yIGMpCit7CisgICAgcmV0dXJuIGMucmVkID09IGMuZ3JlZW4gJiYgYy5yZWQgPT0gYy5ibHVlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19lcXVhbChzdHJ1Y3QgY29sb3IgYzEsIHN0cnVjdCBjb2xvciBjMikKK3sKKyAgICByZXR1cm4gYzEucmVkID09IGMyLnJlZCAmJiBjMS5ncmVlbiA9PSBjMi5ncmVlbiAmJiBjMS5ibHVlID09IGMyLmJsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2hlYWRlcih2b2lkKQoreworICAgIC8qIG9wZW4gbG9nbyBmaWxlICovCisgICAgaWYgKG91dHB1dG5hbWUpIHsKKwlvdXQgPSBmb3BlbihvdXRwdXRuYW1lLCAidyIpOworCWlmICghb3V0KQorCSAgICBkaWUoIkNhbm5vdCBjcmVhdGUgZmlsZSAlczogJXNcbiIsIG91dHB1dG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKwlvdXQgPSBzdGRvdXQ7CisgICAgfQorCisgICAgZnB1dHMoIi8qXG4iLCBvdXQpOworICAgIGZwdXRzKCIgKiAgRE8gTk9UIEVESVQgVEhJUyBGSUxFIVxuIiwgb3V0KTsKKyAgICBmcHV0cygiICpcbiIsIG91dCk7CisgICAgZnByaW50ZihvdXQsICIgKiAgSXQgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBmcHV0cygiICpcbiIsIG91dCk7CisgICAgZnByaW50ZihvdXQsICIgKiAgTGludXggbG9nbyAlc1xuIiwgbG9nb25hbWUpOworICAgIGZwdXRzKCIgKi9cblxuIiwgb3V0KTsKKyAgICBmcHV0cygiI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD5cblxuIiwgb3V0KTsKKyAgICBmcHJpbnRmKG91dCwgInN0YXRpYyB1bnNpZ25lZCBjaGFyICVzX2RhdGFbXSBfX2luaXRkYXRhID0ge1xuIiwKKwkgICAgbG9nb25hbWUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9mb290ZXIodm9pZCkKK3sKKyAgICBmcHV0cygiXG59O1xuXG4iLCBvdXQpOworICAgIGZwcmludGYob3V0LCAic3RydWN0IGxpbnV4X2xvZ28gJXMgX19pbml0ZGF0YSA9IHtcbiIsIGxvZ29uYW1lKTsKKyAgICBmcHJpbnRmKG91dCwgIiAgICAudHlwZVx0PSAlcyxcbiIsIGxvZ29fdHlwZXNbbG9nb190eXBlXSk7CisgICAgZnByaW50ZihvdXQsICIgICAgLndpZHRoXHQ9ICVkLFxuIiwgbG9nb193aWR0aCk7CisgICAgZnByaW50ZihvdXQsICIgICAgLmhlaWdodFx0PSAlZCxcbiIsIGxvZ29faGVpZ2h0KTsKKyAgICBpZiAobG9nb190eXBlID09IExJTlVYX0xPR09fQ0xVVDIyNCkgeworCWZwcmludGYob3V0LCAiICAgIC5jbHV0c2l6ZVx0PSAlZCxcbiIsIGxvZ29fY2x1dHNpemUpOworCWZwcmludGYob3V0LCAiICAgIC5jbHV0XHQ9ICVzX2NsdXQsXG4iLCBsb2dvbmFtZSk7CisgICAgfQorICAgIGZwcmludGYob3V0LCAiICAgIC5kYXRhXHQ9ICVzX2RhdGFcbiIsIGxvZ29uYW1lKTsKKyAgICBmcHV0cygifTtcblxuIiwgb3V0KTsKKworICAgIC8qIGNsb3NlIGxvZ28gZmlsZSAqLworICAgIGlmIChvdXRwdXRuYW1lKQorCWZjbG9zZShvdXQpOworfQorCitzdGF0aWMgaW50IHdyaXRlX2hleF9jbnQ7CisKK3N0YXRpYyB2b2lkIHdyaXRlX2hleCh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisgICAgaWYgKHdyaXRlX2hleF9jbnQgJSAxMikKKwlmcHJpbnRmKG91dCwgIiwgMHglMDJ4IiwgYnl0ZSk7CisgICAgZWxzZSBpZiAod3JpdGVfaGV4X2NudCkKKwlmcHJpbnRmKG91dCwgIixcblx0MHglMDJ4IiwgYnl0ZSk7CisgICAgZWxzZQorCWZwcmludGYob3V0LCAiXHQweCUwMngiLCBieXRlKTsKKyAgICB3cml0ZV9oZXhfY250Kys7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xvZ29fbW9ubyh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGNoYXIgdmFsLCBiaXQ7CisKKyAgICAvKiB2YWxpZGF0ZSBpbWFnZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspCisJICAgIGlmICghaXNfYmxhY2sobG9nb19kYXRhW2ldW2pdKSAmJiAhaXNfd2hpdGUobG9nb19kYXRhW2ldW2pdKSkKKwkJZGllKCJJbWFnZSBtdXN0IGJlIG1vbm9jaHJvbWVcbiIpOworCisgICAgLyogd3JpdGUgZmlsZSBoZWFkZXIgKi8KKyAgICB3cml0ZV9oZWFkZXIoKTsKKworICAgIC8qIHdyaXRlIGxvZ28gZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKSB7CisJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7KSB7CisJICAgIGZvciAodmFsID0gMCwgYml0ID0gMHg4MDsgYml0ICYmIGogPCBsb2dvX3dpZHRoOyBqKyssIGJpdCA+Pj0gMSkKKwkJaWYgKGxvZ29fZGF0YVtpXVtqXS5yZWQpCisJCSAgICB2YWwgfD0gYml0OworCSAgICB3cml0ZV9oZXgodmFsKTsKKwl9CisgICAgfQorCisgICAgLyogd3JpdGUgbG9nbyBzdHJ1Y3R1cmUgYW5kIGZpbGUgZm9vdGVyICovCisgICAgd3JpdGVfZm9vdGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xvZ29fdmdhMTYodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgaiwgazsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbDsKKworICAgIC8qIHZhbGlkYXRlIGltYWdlICovCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykgeworCSAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKwkJaWYgKGlzX2VxdWFsKGxvZ29fZGF0YVtpXVtqXSwgY2x1dF92Z2ExNltrXSkpCisJCSAgICBicmVhazsKKwkgICAgaWYgKGsgPT0gMTYpCisJCWRpZSgiSW1hZ2UgbXVzdCB1c2UgdGhlIDE2IGNvbnNvbGUgY29sb3JzIG9ubHlcbiIKKwkJICAgICJVc2UgcHBtcXVhbnQoMSkgLW1hcCBjbHV0X3ZnYTE2LnBwbSB0byByZWR1Y2UgdGhlIG51bWJlciAiCisJCSAgICAib2YgY29sb3JzXG4iKTsKKwl9CisKKyAgICAvKiB3cml0ZSBmaWxlIGhlYWRlciAqLworICAgIHdyaXRlX2hlYWRlcigpOworCisgICAgLyogd3JpdGUgbG9nbyBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykgeworCSAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKwkJaWYgKGlzX2VxdWFsKGxvZ29fZGF0YVtpXVtqXSwgY2x1dF92Z2ExNltrXSkpCisJCSAgICBicmVhazsKKwkgICAgdmFsID0gazw8NDsKKwkgICAgaWYgKCsraiA8IGxvZ29fd2lkdGgpIHsKKwkJZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisJCSAgICBpZiAoaXNfZXF1YWwobG9nb19kYXRhW2ldW2pdLCBjbHV0X3ZnYTE2W2tdKSkKKwkJCWJyZWFrOworCQl2YWwgfD0gazsKKwkgICAgfQorCSAgICB3cml0ZV9oZXgodmFsKTsKKwl9CisKKyAgICAvKiB3cml0ZSBsb2dvIHN0cnVjdHVyZSBhbmQgZmlsZSBmb290ZXIgKi8KKyAgICB3cml0ZV9mb290ZXIoKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfbG9nb19jbHV0MjI0KHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGosIGs7CisKKyAgICAvKiB2YWxpZGF0ZSBpbWFnZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspIHsKKwkgICAgZm9yIChrID0gMDsgayA8IGxvZ29fY2x1dHNpemU7IGsrKykKKwkJaWYgKGlzX2VxdWFsKGxvZ29fZGF0YVtpXVtqXSwgbG9nb19jbHV0W2tdKSkKKwkJICAgIGJyZWFrOworCSAgICBpZiAoayA9PSBsb2dvX2NsdXRzaXplKSB7CisJCWlmIChsb2dvX2NsdXRzaXplID09IE1BWF9MSU5VWF9MT0dPX0NPTE9SUykKKwkJICAgIGRpZSgiSW1hZ2UgaGFzIG1vcmUgdGhhbiAlZCBjb2xvcnNcbiIKKwkJCSJVc2UgcHBtcXVhbnQoMSkgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY29sb3JzXG4iLAorCQkJTUFYX0xJTlVYX0xPR09fQ09MT1JTKTsKKwkJbG9nb19jbHV0W2xvZ29fY2x1dHNpemUrK10gPSBsb2dvX2RhdGFbaV1bal07CisJICAgIH0KKwl9CisKKyAgICAvKiB3cml0ZSBmaWxlIGhlYWRlciAqLworICAgIHdyaXRlX2hlYWRlcigpOworCisgICAgLyogd3JpdGUgbG9nbyBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykgeworCSAgICBmb3IgKGsgPSAwOyBrIDwgbG9nb19jbHV0c2l6ZTsgaysrKQorCQlpZiAoaXNfZXF1YWwobG9nb19kYXRhW2ldW2pdLCBsb2dvX2NsdXRba10pKQorCQkgICAgYnJlYWs7CisJICAgIHdyaXRlX2hleChrKzMyKTsKKwl9CisgICAgZnB1dHMoIlxufTtcblxuIiwgb3V0KTsKKworICAgIC8qIHdyaXRlIGxvZ28gY2x1dCAqLworICAgIGZwcmludGYob3V0LCAic3RhdGljIHVuc2lnbmVkIGNoYXIgJXNfY2x1dFtdIF9faW5pdGRhdGEgPSB7XG4iLAorCSAgICBsb2dvbmFtZSk7CisgICAgd3JpdGVfaGV4X2NudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29fY2x1dHNpemU7IGkrKykgeworCXdyaXRlX2hleChsb2dvX2NsdXRbaV0ucmVkKTsKKwl3cml0ZV9oZXgobG9nb19jbHV0W2ldLmdyZWVuKTsKKwl3cml0ZV9oZXgobG9nb19jbHV0W2ldLmJsdWUpOworICAgIH0KKworICAgIC8qIHdyaXRlIGxvZ28gc3RydWN0dXJlIGFuZCBmaWxlIGZvb3RlciAqLworICAgIHdyaXRlX2Zvb3RlcigpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sb2dvX2dyYXkyNTYodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKworICAgIC8qIHZhbGlkYXRlIGltYWdlICovCisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykKKwkgICAgaWYgKCFpc19ncmF5KGxvZ29fZGF0YVtpXVtqXSkpCisJCWRpZSgiSW1hZ2UgbXVzdCBiZSBncmF5c2NhbGVcbiIpOworCisgICAgLyogd3JpdGUgZmlsZSBoZWFkZXIgKi8KKyAgICB3cml0ZV9oZWFkZXIoKTsKKworICAgIC8qIHdyaXRlIGxvZ28gZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspCisJICAgIHdyaXRlX2hleChsb2dvX2RhdGFbaV1bal0ucmVkKTsKKworICAgIC8qIHdyaXRlIGxvZ28gc3RydWN0dXJlIGFuZCBmaWxlIGZvb3RlciAqLworICAgIHdyaXRlX2Zvb3RlcigpOworfQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisgICAgZGllKCJcbiIKKwkiVXNhZ2U6ICVzIFtvcHRpb25zXSA8ZmlsZW5hbWU+XG4iCisJIlxuIgorCSJWYWxpZCBvcHRpb25zOlxuIgorCSIgICAgLWggICAgICAgICAgOiBkaXNwbGF5IHRoaXMgdXNhZ2UgaW5mb3JtYXRpb25cbiIKKwkiICAgIC1uIDxuYW1lPiAgIDogc3BlY2lmeSBsb2dvIG5hbWUgKGRlZmF1bHQ6IGxpbnV4X2xvZ28pXG4iCisJIiAgICAtbyA8b3V0cHV0PiA6IG91dHB1dCB0byBmaWxlIDxvdXRwdXQ+IGluc3RlYWQgb2Ygc3Rkb3V0XG4iCisJIiAgICAtdCA8dHlwZT4gICA6IHNwZWNpZnkgbG9nbyB0eXBlLCBvbmUgb2ZcbiIKKwkiICAgICAgICAgICAgICAgICAgICAgIG1vbm8gICAgOiBtb25vY2hyb21lIGJsYWNrL3doaXRlXG4iCisJIiAgICAgICAgICAgICAgICAgICAgICB2Z2ExNiAgIDogMTYgY29sb3JzIFZHQSB0ZXh0IHBhbGV0dGVcbiIKKwkiICAgICAgICAgICAgICAgICAgICAgIGNsdXQyMjQgOiAyMjQgY29sb3JzIChkZWZhdWx0KVxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgZ3JheTI1NiA6IDI1NiBsZXZlbHMgZ3JheXNjYWxlXG4iCisJIlxuIiwgcHJvZ3JhbW5hbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIGludCBvcHQ7CisKKyAgICBwcm9ncmFtbmFtZSA9IGFyZ3ZbMF07CisKKyAgICBvcHRlcnIgPSAwOworICAgIHdoaWxlICgxKSB7CisJb3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJobjpvOnQ6Iik7CisJaWYgKG9wdCA9PSAtMSkKKwkgICAgYnJlYWs7CisKKwlzd2l0Y2ggKG9wdCkgeworCSAgICBjYXNlICdoJzoKKwkJdXNhZ2UoKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnbic6CisJCWxvZ29uYW1lID0gb3B0YXJnOworCQlicmVhazsKKworCSAgICBjYXNlICdvJzoKKwkJb3V0cHV0bmFtZSA9IG9wdGFyZzsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAndCc6CisJCWlmICghc3RyY21wKG9wdGFyZywgIm1vbm8iKSkKKwkJICAgIGxvZ29fdHlwZSA9IExJTlVYX0xPR09fTU9OTzsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJ2Z2ExNiIpKQorCQkgICAgbG9nb190eXBlID0gTElOVVhfTE9HT19WR0ExNjsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJjbHV0MjI0IikpCisJCSAgICBsb2dvX3R5cGUgPSBMSU5VWF9MT0dPX0NMVVQyMjQ7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiZ3JheTI1NiIpKQorCQkgICAgbG9nb190eXBlID0gTElOVVhfTE9HT19HUkFZMjU2OworCQllbHNlCisJCSAgICB1c2FnZSgpOworCQlicmVhazsKKworCSAgICBkZWZhdWx0OgorCQl1c2FnZSgpOworCQlicmVhazsKKwl9CisgICAgfQorICAgIGlmIChvcHRpbmQgIT0gYXJnYy0xKQorCXVzYWdlKCk7CisKKyAgICBmaWxlbmFtZSA9IGFyZ3Zbb3B0aW5kXTsKKworICAgIHJlYWRfaW1hZ2UoKTsKKyAgICBzd2l0Y2ggKGxvZ29fdHlwZSkgeworCWNhc2UgTElOVVhfTE9HT19NT05POgorCSAgICB3cml0ZV9sb2dvX21vbm8oKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIExJTlVYX0xPR09fVkdBMTY6CisJICAgIHdyaXRlX2xvZ29fdmdhMTYoKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIExJTlVYX0xPR09fQ0xVVDIyNDoKKwkgICAgd3JpdGVfbG9nb19jbHV0MjI0KCk7CisJICAgIGJyZWFrOworCisJY2FzZSBMSU5VWF9MT0dPX0dSQVkyNTY6CisJICAgIHdyaXRlX2xvZ29fZ3JheTI1NigpOworCSAgICBicmVhazsKKyAgICB9CisgICAgZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsIGIvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2FiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3JlZmVyZW5jZV9kaXNjYXJkZWQucGwKQEAgLTAsMCArMSwxMTAgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyByZWZlcmVuY2VfZGlzY2FyZGVkLnBsIChDKSBLZWl0aCBPd2VucyAyMDAxIDxrYW9zQG9jcy5jb20uYXU+CisjCisjIFJlbGVhc2VkIHVuZGVyIEdQTCBWMi4KKyMKKyMgTGlzdCBkYW5nbGluZyByZWZlcmVuY2VzIHRvIHZtbGludXggZGlzY2FyZGVkIHNlY3Rpb25zLgorCit1c2Ugc3RyaWN0OworZGllKCQwIC4gIiB0YWtlcyBubyBhcmd1bWVudHNcbiIpIGlmKCQjQVJHViA+PSAwKTsKKworbXkgJW9iamVjdDsKK215ICRvYmplY3Q7CitteSAkbGluZTsKK215ICRpZ25vcmU7CitteSAkZXJyb3Jjb3VudDsKKworJHwgPSAxOworCisjIHByaW50ZigiRmluZGluZyBvYmplY3RzLCAiKTsKK29wZW4oT0JKRFVNUF9MSVNULCAiZmluZCAuIC1uYW1lICcqLm8nIHwgeGFyZ3Mgb2JqZHVtcCAtaCB8IikgfHwgZGllICJnZXR0aW5nIG9iamR1bXAgbGlzdCBmYWlsZWQiOword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8T0JKRFVNUF9MSVNUPikpIHsKKwljaG9tcCgkbGluZSk7CisJaWYgKCRsaW5lID1+IC86XHMrZmlsZSBmb3JtYXQvKSB7CisJCSgkb2JqZWN0ID0gJGxpbmUpID1+IHMvOi4qLy87CisJCSRvYmplY3R7JG9iamVjdH0tPnsnbW9kdWxlJ30gPSAwOworCQkkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSA9IDA7CisJCSRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30gPSAwOworCX0KKwlpZiAoJGxpbmUgPX4gL15ccypcZCtccytcLm1vZGluZm9ccysvKSB7CisJCSRvYmplY3R7JG9iamVjdH0tPnsnbW9kdWxlJ30gPSAxOworCX0KKwlpZiAoJGxpbmUgPX4gL15ccypcZCtccytcLmNvbW1lbnRccysvKSB7CisJCSgkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSwgJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSkgPSAoc3BsaXQoJyAnLCAkbGluZSkpWzIsNV07CisJfQorfQorY2xvc2UoT0JKRFVNUF9MSVNUKTsKKyMgcHJpbnRmKCIlZCBvYmplY3RzLCAiLCBzY2FsYXIga2V5cyglb2JqZWN0KSk7CiskaWdub3JlID0gMDsKK2ZvcmVhY2ggJG9iamVjdCAoa2V5cyglb2JqZWN0KSkgeworCWlmICgkb2JqZWN0eyRvYmplY3R9LT57J21vZHVsZSd9KSB7CisJCSsrJGlnbm9yZTsKKwkJZGVsZXRlKCRvYmplY3R7JG9iamVjdH0pOworCX0KK30KKyMgcHJpbnRmKCJpZ25vcmluZyAlZCBtb2R1bGUocylcbiIsICRpZ25vcmUpOworCisjIElnbm9yZSBjb25nbG9tZXJhdGUgb2JqZWN0cywgdGhleSBoYXZlIGJlZW4gYnVpbHQgZnJvbSBtdWx0aXBsZSBvYmplY3RzIGFuZCB3ZQorIyBvbmx5IGNhcmUgYWJvdXQgdGhlIGluZGl2aWR1YWwgb2JqZWN0cy4gIElmIGFuIG9iamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBHQ0M6CisjIHN0cmluZyBpbiB0aGUgY29tbWVudCBzZWN0aW9uIHRoZW4gaXQgaXMgY29uZ2xvbWVyYXRlLiAgVGhpcyBkb2VzIG5vdCBmaWx0ZXIKKyMgb3V0IGNvbmdsb21lcmF0ZXMgdGhhdCBjb25zaXN0IG9mIGV4YWN0bHkgb25lIG9iamVjdCwgY2FuJ3QgYmUgaGVscGVkLgorCisjIHByaW50ZigiRmluZGluZyBjb25nbG9tZXJhdGVzLCAiKTsKKyRpZ25vcmUgPSAwOworZm9yZWFjaCAkb2JqZWN0IChrZXlzKCVvYmplY3QpKSB7CisJaWYgKGV4aXN0cygkb2JqZWN0eyRvYmplY3R9LT57J29mZid9KSkgeworCQlteSAoJG9mZiwgJHNpemUsICRjb21tZW50LCAkbCk7CisJCSRvZmYgPSBoZXgoJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSk7CisJCSRzaXplID0gaGV4KCRvYmplY3R7JG9iamVjdH0tPnsnc2l6ZSd9KTsKKwkJb3BlbihPQkpFQ1QsICI8JG9iamVjdCIpIHx8IGRpZSAiY2Fubm90IHJlYWQgJG9iamVjdCI7CisJCXNlZWsoT0JKRUNULCAkb2ZmLCAwKSB8fCBkaWUgInNlZWsgdG8gJG9mZiBpbiAkb2JqZWN0IGZhaWxlZCI7CisJCSRsID0gcmVhZChPQkpFQ1QsICRjb21tZW50LCAkc2l6ZSk7CisJCWRpZSAicmVhZCAkc2l6ZSBieXRlcyBmcm9tICRvYmplY3QgLmNvbW1lbnQgZmFpbGVkIiBpZiAoJGwgIT0gJHNpemUpOworCQljbG9zZShPQkpFQ1QpOworCQlpZiAoJGNvbW1lbnQgPX4gL0dDQ1w6LipHQ0NcOi9tIHx8ICRvYmplY3QgPX4gL2J1aWx0LWluXC5vLykgeworCQkJKyskaWdub3JlOworCQkJZGVsZXRlKCRvYmplY3R7JG9iamVjdH0pOworCQl9CisJfQorfQorIyBwcmludGYoImlnbm9yaW5nICVkIGNvbmdsb21lcmF0ZShzKVxuIiwgJGlnbm9yZSk7CisKKyMgcHJpbnRmKCJTY2FubmluZyBvYmplY3RzXG4iKTsKKyRlcnJvcmNvdW50ID0gMDsKK2ZvcmVhY2ggJG9iamVjdCAoa2V5cyglb2JqZWN0KSkgeworCW15ICRmcm9tOworCW9wZW4oT0JKRFVNUCwgIm9iamR1bXAgLXIgJG9iamVjdHwiKSB8fCBkaWUgImNhbm5vdCBvYmpkdW1wIC1yICRvYmplY3QiOworCXdoaWxlIChkZWZpbmVkKCRsaW5lID0gPE9CSkRVTVA+KSkgeworCQljaG9tcCgkbGluZSk7CisJCWlmICgkbGluZSA9fiAvUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAvKSB7CisJCQkoJGZyb20gPSAkbGluZSkgPX4gcy8uKlxbKFteXV0qKS4qLyQxLzsKKwkJfQorCQlpZiAoKCRsaW5lID1+IC9cLnRleHRcLmV4aXQkLyB8fAorCQkgICAgICRsaW5lID1+IC9cLmV4aXRcLnRleHQkLyB8fAorCQkgICAgICRsaW5lID1+IC9cLmRhdGFcLmV4aXQkLyB8fAorCQkgICAgICRsaW5lID1+IC9cLmV4aXRcLmRhdGEkLyB8fAorCQkgICAgICRsaW5lID1+IC9cLmV4aXRjYWxsXC5leGl0JC8pICYmCisJCSAgICAoJGZyb20gIX4gL1wudGV4dFwuZXhpdCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZXhpdFwudGV4dCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZGF0YVwuZXhpdCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZXhpdFwuZGF0YSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuYWx0aW5zdHJ1Y3Rpb25zJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5wZHIkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2luZm8kLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2FyYW5nZXMkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX3JhbmdlcyQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZGVidWdfbGluZSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZGVidWdfZnJhbWUkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmV4aXRjYWxsXC5leGl0JC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5laF9mcmFtZSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuc3RhYiQvKSkgeworCQkJcHJpbnRmKCJFcnJvcjogJXMgJXMgcmVmZXJzIHRvICVzXG4iLCAkb2JqZWN0LCAkZnJvbSwgJGxpbmUpOworCQkJJGVycm9yY291bnQgPSAkZXJyb3Jjb3VudCArIDE7CisJCX0KKwl9CisJY2xvc2UoT0JKRFVNUCk7Cit9CisjIHByaW50ZigiRG9uZVxuIik7CisKK2V4aXQoMCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlZmVyZW5jZV9pbml0LnBsIGIvc2NyaXB0cy9yZWZlcmVuY2VfaW5pdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI0MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9yZWZlcmVuY2VfaW5pdC5wbApAQCAtMCwwICsxLDEwNyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIHJlZmVyZW5jZV9pbml0LnBsIChDKSBLZWl0aCBPd2VucyAyMDAyIDxrYW9zQG9jcy5jb20uYXU+CisjCisjIExpc3QgcmVmZXJlbmNlcyB0byB2bWxpbnV4IGluaXQgc2VjdGlvbnMgZnJvbSBub24taW5pdCBzZWN0aW9ucy4KKworIyBVbmZvcnR1bmF0ZWx5IEkgaGFkIHRvIGV4Y2x1ZGUgcmVmZXJlbmNlcyBmcm9tIHJlYWQgb25seSBkYXRhIHRvIC5pbml0CisjIHNlY3Rpb25zLCBhbG1vc3QgYWxsIG9mIHRoZXNlIGFyZSBmYWxzZSBwb3NpdGl2ZXMsIHRoZXkgYXJlIGNyZWF0ZWQgYnkKKyMgZ2NjLiAgVGhlIGRvd25zaWRlIG9mIGV4Y2x1ZGluZyByb2RhdGEgaXMgdGhhdCB0aGVyZSByZWFsbHkgYXJlIHNvbWUKKyMgdXNlciByZWZlcmVuY2VzIGZyb20gcm9kYXRhIHRvIGluaXQgY29kZSwgZS5nLiBkcml2ZXJzL3ZpZGVvL3ZnYWNvbi5jCisjCisjIGNvbnN0IHN0cnVjdCBjb25zdyB2Z2FfY29uID0geworIyAgICAgICAgY29uX3N0YXJ0dXA6ICAgICAgICAgICAgdmdhY29uX3N0YXJ0dXAsCisjCisjIHdoZXJlIHZnYWNvbl9zdGFydHVwIGlzIF9faW5pdC4gIElmIHlvdSB3YW50IHRvIHdhZGUgdGhyb3VnaCB0aGUgZmFsc2UKKyMgcG9zaXRpdmVzLCB0YWtlIG91dCB0aGUgY2hlY2sgZm9yIHJvZGF0YS4KKwordXNlIHN0cmljdDsKK2RpZSgkMCAuICIgdGFrZXMgbm8gYXJndW1lbnRzXG4iKSBpZigkI0FSR1YgPj0gMCk7CisKK215ICVvYmplY3Q7CitteSAkb2JqZWN0OworbXkgJGxpbmU7CitteSAkaWdub3JlOworCiskfCA9IDE7CisKK3ByaW50ZigiRmluZGluZyBvYmplY3RzLCAiKTsKK29wZW4oT0JKRFVNUF9MSVNULCAiZmluZCAuIC1uYW1lICcqLm8nIHwgeGFyZ3Mgb2JqZHVtcCAtaCB8IikgfHwgZGllICJnZXR0aW5nIG9iamR1bXAgbGlzdCBmYWlsZWQiOword2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8T0JKRFVNUF9MSVNUPikpIHsKKwljaG9tcCgkbGluZSk7CisJaWYgKCRsaW5lID1+IC86XHMrZmlsZSBmb3JtYXQvKSB7CisJCSgkb2JqZWN0ID0gJGxpbmUpID1+IHMvOi4qLy87CisJCSRvYmplY3R7JG9iamVjdH0tPnsnbW9kdWxlJ30gPSAwOworCQkkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSA9IDA7CisJCSRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30gPSAwOworCX0KKwlpZiAoJGxpbmUgPX4gL15ccypcZCtccytcLm1vZGluZm9ccysvKSB7CisJCSRvYmplY3R7JG9iamVjdH0tPnsnbW9kdWxlJ30gPSAxOworCX0KKwlpZiAoJGxpbmUgPX4gL15ccypcZCtccytcLmNvbW1lbnRccysvKSB7CisJCSgkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSwgJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSkgPSAoc3BsaXQoJyAnLCAkbGluZSkpWzIsNV07CisJfQorfQorY2xvc2UoT0JKRFVNUF9MSVNUKTsKK3ByaW50ZigiJWQgb2JqZWN0cywgIiwgc2NhbGFyIGtleXMoJW9iamVjdCkpOworJGlnbm9yZSA9IDA7Citmb3JlYWNoICRvYmplY3QgKGtleXMoJW9iamVjdCkpIHsKKwlpZiAoJG9iamVjdHskb2JqZWN0fS0+eydtb2R1bGUnfSkgeworCQkrKyRpZ25vcmU7CisJCWRlbGV0ZSgkb2JqZWN0eyRvYmplY3R9KTsKKwl9Cit9CitwcmludGYoImlnbm9yaW5nICVkIG1vZHVsZShzKVxuIiwgJGlnbm9yZSk7CisKKyMgSWdub3JlIGNvbmdsb21lcmF0ZSBvYmplY3RzLCB0aGV5IGhhdmUgYmVlbiBidWlsdCBmcm9tIG11bHRpcGxlIG9iamVjdHMgYW5kIHdlCisjIG9ubHkgY2FyZSBhYm91dCB0aGUgaW5kaXZpZHVhbCBvYmplY3RzLiAgSWYgYW4gb2JqZWN0IGhhcyBtb3JlIHRoYW4gb25lIEdDQzoKKyMgc3RyaW5nIGluIHRoZSBjb21tZW50IHNlY3Rpb24gdGhlbiBpdCBpcyBjb25nbG9tZXJhdGUuICBUaGlzIGRvZXMgbm90IGZpbHRlcgorIyBvdXQgY29uZ2xvbWVyYXRlcyB0aGF0IGNvbnNpc3Qgb2YgZXhhY3RseSBvbmUgb2JqZWN0LCBjYW4ndCBiZSBoZWxwZWQuCisKK3ByaW50ZigiRmluZGluZyBjb25nbG9tZXJhdGVzLCAiKTsKKyRpZ25vcmUgPSAwOworZm9yZWFjaCAkb2JqZWN0IChrZXlzKCVvYmplY3QpKSB7CisJaWYgKGV4aXN0cygkb2JqZWN0eyRvYmplY3R9LT57J29mZid9KSkgeworCQlteSAoJG9mZiwgJHNpemUsICRjb21tZW50LCAkbCk7CisJCSRvZmYgPSBoZXgoJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSk7CisJCSRzaXplID0gaGV4KCRvYmplY3R7JG9iamVjdH0tPnsnc2l6ZSd9KTsKKwkJb3BlbihPQkpFQ1QsICI8JG9iamVjdCIpIHx8IGRpZSAiY2Fubm90IHJlYWQgJG9iamVjdCI7CisJCXNlZWsoT0JKRUNULCAkb2ZmLCAwKSB8fCBkaWUgInNlZWsgdG8gJG9mZiBpbiAkb2JqZWN0IGZhaWxlZCI7CisJCSRsID0gcmVhZChPQkpFQ1QsICRjb21tZW50LCAkc2l6ZSk7CisJCWRpZSAicmVhZCAkc2l6ZSBieXRlcyBmcm9tICRvYmplY3QgLmNvbW1lbnQgZmFpbGVkIiBpZiAoJGwgIT0gJHNpemUpOworCQljbG9zZShPQkpFQ1QpOworCQlpZiAoJGNvbW1lbnQgPX4gL0dDQ1w6LipHQ0NcOi9tIHx8ICRvYmplY3QgPX4gL2J1aWx0LWluXC5vLykgeworCQkJKyskaWdub3JlOworCQkJZGVsZXRlKCRvYmplY3R7JG9iamVjdH0pOworCQl9CisJfQorfQorcHJpbnRmKCJpZ25vcmluZyAlZCBjb25nbG9tZXJhdGUocylcbiIsICRpZ25vcmUpOworCitwcmludGYoIlNjYW5uaW5nIG9iamVjdHNcbiIpOworZm9yZWFjaCAkb2JqZWN0IChzb3J0KGtleXMoJW9iamVjdCkpKSB7CisJbXkgJGZyb207CisJb3BlbihPQkpEVU1QLCAib2JqZHVtcCAtciAkb2JqZWN0fCIpIHx8IGRpZSAiY2Fubm90IG9iamR1bXAgLXIgJG9iamVjdCI7CisJd2hpbGUgKGRlZmluZWQoJGxpbmUgPSA8T0JKRFVNUD4pKSB7CisJCWNob21wKCRsaW5lKTsKKwkJaWYgKCRsaW5lID1+IC9SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC8pIHsKKwkJCSgkZnJvbSA9ICRsaW5lKSA9fiBzLy4qXFsoW15dXSopLiovJDEvOworCQl9CisJCWlmICgoJGxpbmUgPX4gL1wuaW5pdCQvIHx8ICRsaW5lID1+IC9cLmluaXRcLi8pICYmCisJCSAgICAoJGZyb20gIX4gL1wuaW5pdCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuaW5pdFwuLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnN0YWIkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnJvZGF0YSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wudGV4dFwubG9jayQvICYmCisJCSAgICAgJGZyb20gIX4gL1wucGNpX2ZpeHVwX2hlYWRlciQvICYmCisJCSAgICAgJGZyb20gIX4gL1wucGNpX2ZpeHVwX2ZpbmFsJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5wZHIkLyAmJgorCQkgICAgICRmcm9tICF+IC9cX19wYXJhbSQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuYWx0aW5zdHJ1Y3Rpb25zLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnXy8pKSB7CisJCQlwcmludGYoIkVycm9yOiAlcyAlcyByZWZlcnMgdG8gJXNcbiIsICRvYmplY3QsICRmcm9tLCAkbGluZSk7CisJCX0KKwl9CisJY2xvc2UoT0JKRFVNUCk7Cit9CitwcmludGYoIkRvbmVcbiIpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9zaG93X2RlbHRhIGIvc2NyaXB0cy9zaG93X2RlbHRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTcwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Nob3dfZGVsdGEKQEAgLTAsMCArMSwxMjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBzaG93X2RlbHRhczogUmVhZCBsaXN0IG9mIHByaW50ayBtZXNzYWdlcyBpbnN0cnVtZW50ZWQgd2l0aAorIyB0aW1lIGRhdGEsIGFuZCBmb3JtYXQgd2l0aCB0aW1lIGRlbHRhcy4KKyMKKyMgQWxzbywgeW91IGNhbiBzaG93IHRoZSB0aW1lcyByZWxhdGl2ZSB0byBhIGZpeGVkIHBvaW50LgorIworIyBDb3B5cmlnaHQgMjAwMyBTb255IENvcnBvcmF0aW9uCisjCisjIEdQTCAyLjAgYXBwbGllcy4KKworaW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworCitkZWYgdXNhZ2UoKToKKwlwcmludCAiIiJ1c2FnZTogc2hvd19kZWx0YSBbPG9wdGlvbnM+XSA8ZmlsZW5hbWU+CisKK1RoaXMgcHJvZ3JhbSBwYXJzZXMgdGhlIG91dHB1dCBmcm9tIGEgc2V0IG9mIHByaW50ayBtZXNzYWdlIGxpbmVzIHdoaWNoCitoYXZlIHRpbWUgZGF0YSBwcmVmaXhlZCBiZWNhdXNlIHRoZSBDT05GSUdfUFJJTlRLX1RJTUUgb3B0aW9uIGlzIHNldCwgb3IKK3RoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiAidGltZSIgaXMgc3BlY2lmaWVkLiBXaGVuIHJ1biB3aXRoIG5vCitvcHRpb25zLCB0aGUgdGltZSBpbmZvcm1hdGlvbiBpcyBjb252ZXJ0ZWQgdG8gc2hvdyB0aGUgdGltZSBkZWx0YSBiZXR3ZWVuCitlYWNoIHByaW50ayBsaW5lIGFuZCB0aGUgbmV4dC4gIFdoZW4gcnVuIHdpdGggdGhlICctYicgb3B0aW9uLCBhbGwgdGltZXMKK2FyZSByZWxhdGl2ZSB0byBhIHNpbmdsZSAoYmFzZSkgcG9pbnQgaW4gdGltZS4KKworT3B0aW9uczoKKyAgLWggICAgICAgICAgICBTaG93IHRoaXMgdXNhZ2UgaGVscC4KKyAgLWIgPGJhc2U+CVNwZWNpZnkgYSBiYXNlIGZvciB0aW1lIHJlZmVyZW5jZXMuCisJCTxiYXNlPiBjYW4gYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcuCisJCUlmIGl0IGlzIGEgc3RyaW5nLCB0aGUgZmlyc3QgbWVzc2FnZSBsaW5lCisJCXdoaWNoIG1hdGNoZXMgKGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCisJCWxpbmUpIGlzIHVzZWQgYXMgdGhlIHRpbWUgcmVmZXJlbmNlLgorCitleDogJCBkbWVzZyA+dGltZWZpbGUKKyAgICAkIHNob3dfZGVsdGEgLWIgTkVUNCB0aW1lZmlsZQorCit3aWxsIHNob3cgdGltZXMgcmVsYXRpdmUgdG8gdGhlIGxpbmUgaW4gdGhlIGtlcm5lbCBvdXRwdXQKK3N0YXJ0aW5nIHdpdGggIk5FVDQiLgorIiIiCisJc3lzLmV4aXQoMSkKKworIyByZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0aGUgc2Vjb25kcyBhbmQgdGV4dCBmb3IgZWFjaCBtZXNzYWdlIGxpbmUKKyMgc2Vjb25kcyBpcyByZXR1cm5lZCBhcyBhIGZsb2F0CisjIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBubyB0aW1pbmcgZGF0YSB3YXMgZm91bmQKK2RlZiBnZXRfdGltZShsaW5lKToKKwlpZiBsaW5lWzBdIT0iWyI6CisJCXJhaXNlIFZhbHVlRXJyb3IKKworCSMgc3BsaXQgb24gY2xvc2luZyBicmFja2V0CisJKHRpbWVfc3RyLCByZXN0KSA9IHN0cmluZy5zcGxpdChsaW5lWzE6XSwnXScsMSkKKwl0aW1lID0gc3RyaW5nLmF0b2YodGltZV9zdHIpCisKKwkjcHJpbnQgInRpbWU9IiwgdGltZQorCXJldHVybiAodGltZSwgcmVzdCkKKworCisjIGF2ZXJhZ2UgbGluZSBsb29rcyBsaWtlOgorIyBbICAgIDAuMDg0MjgyXSBWRlM6IE1vdW50ZWQgcm9vdCAocm9tZnMgZmlsZXN5c3RlbSkgcmVhZG9ubHkKKyMgdGltZSBkYXRhIGlzIGV4cHJlc3NlZCBpbiBzZWNvbmRzLnVzZWNvbmRzLAorIyBjb252ZXJ0X2xpbmUgYWRkcyBhIGRlbHRhIGZvciBlYWNoIGxpbmUKK2xhc3RfdGltZSA9IDAuMAorZGVmIGNvbnZlcnRfbGluZShsaW5lLCBiYXNlX3RpbWUpOgorCWdsb2JhbCBsYXN0X3RpbWUKKworCXRyeToKKwkJKHRpbWUsIHJlc3QpID0gZ2V0X3RpbWUobGluZSkKKwlleGNlcHQ6CisJCSMgaWYgYW55IHByb2JsZW0gcGFyc2luZyB0aW1lLCBkb24ndCBjb252ZXJ0IGFueXRoaW5nCisJCXJldHVybiBsaW5lCisKKwlpZiBiYXNlX3RpbWU6CisJCSMgc2hvdyB0aW1lIGZyb20gYmFzZQorCQlkZWx0YSA9IHRpbWUgLSBiYXNlX3RpbWUKKwllbHNlOgorCQkjIGp1c3Qgc2hvdyB0aW1lIGZyb20gbGFzdCBsaW5lCisJCWRlbHRhID0gdGltZSAtIGxhc3RfdGltZQorCQlsYXN0X3RpbWUgPSB0aW1lCisKKwlyZXR1cm4gKCJbJTUuNmYgPCAlNS42ZiA+XSIgJSAodGltZSwgZGVsdGEpKSArIHJlc3QKKworZGVmIG1haW4oKToKKwliYXNlX3N0ciA9ICIiCisJZmlsZWluID0gIiIKKwlmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKKwkJaWYgYXJnPT0iLWIiOgorCQkJYmFzZV9zdHIgPSBzeXMuYXJndltzeXMuYXJndi5pbmRleCgiLWIiKSsxXQorCQllbGlmIGFyZz09Ii1oIjoKKwkJCXVzYWdlKCkKKwkJZWxzZToKKwkJCWZpbGVpbiA9IGFyZworCisJaWYgbm90IGZpbGVpbjoKKwkJdXNhZ2UoKQorCisJdHJ5OgorCQlsaW5lcyA9IG9wZW4oZmlsZWluLCJyIikucmVhZGxpbmVzKCkKKwlleGNlcHQ6CisJCXByaW50ICJQcm9ibGVtIG9wZW5pbmcgZmlsZTogJXMiICUgZmlsZWluCisJCXN5cy5leGl0KDEpCisKKwlpZiBiYXNlX3N0cjoKKwkJcHJpbnQgJ2Jhc2U9ICIlcyInICUgYmFzZV9zdHIKKwkJIyBhc3N1bWUgYSBudW1lcmljIGJhc2UuICBJZiB0aGF0IGZhaWxzLCB0cnkgc2VhcmNoaW5nCisJCSMgZm9yIGEgbWF0Y2hpbmcgbGluZS4KKwkJdHJ5OgorCQkJYmFzZV90aW1lID0gZmxvYXQoYmFzZV9zdHIpCisJCWV4Y2VwdDoKKwkJCSMgc2VhcmNoIGZvciBsaW5lIG1hdGNoaW5nIDxiYXNlPiBzdHJpbmcKKwkJCWZvdW5kID0gMAorCQkJZm9yIGxpbmUgaW4gbGluZXM6CisJCQkJdHJ5OgorCQkJCQkodGltZSwgcmVzdCkgPSBnZXRfdGltZShsaW5lKQorCQkJCWV4Y2VwdDoKKwkJCQkJY29udGludWUKKwkJCQlpZiBzdHJpbmcuZmluZChyZXN0LCBiYXNlX3N0cik9PTE6CisJCQkJCWJhc2VfdGltZSA9IHRpbWUKKwkJCQkJZm91bmQgPSAxCisJCQkJCSMgc3RvcCBhdCBmaXJzdCBtYXRjaAorCQkJCQlicmVhaworCQkJaWYgbm90IGZvdW5kOgorCQkJCXByaW50ICdDb3VsZG5cJ3QgZmluZCBsaW5lIG1hdGNoaW5nIGJhc2UgcGF0dGVybiAiJXMiJyAlIGJhc2Vfc3RyCisJCQkJc3lzLmV4aXQoMSkKKwllbHNlOgorCQliYXNlX3RpbWUgPSAwLjAKKworCWZvciBsaW5lIGluIGxpbmVzOgorCQlwcmludCBjb252ZXJ0X2xpbmUobGluZSwgYmFzZV90aW1lKSwKKworbWFpbigpCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc3BsaXQtbWFuIGIvc2NyaXB0cy9zcGxpdC1tYW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDM4OTdmZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvc3BsaXQtbWFuCkBAIC0wLDAgKzEsMTEyIEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKKworIyMgQ29weXJpZ2h0IChDKSBNaWNoYWVsIFN0aWxsIChtaWthbEBzdGlsbGhxLmNvbSkKKyMjIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTAorIyMKKyMjIEhvb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIERvY0Jvb2sgU0dNTCBmaWxlLCBhbmQgc3BsaXQgb3V0IHRoZQorIyMgbWFuIHBhZ2VzLiBUaGVzZSBjYW4gdGhlbiBiZSBwcm9jZXNzZWQgaW50byBncm9mZiBmb3JtYXQsIGFuZAorIyMgaW5zdGFsbGVkIGlmIGRlc2lyZWQuLi4KKyMjCisjIyBBcmd1ZW1lbnRzOiAkMSAtLSB0aGUgbmFtZSBvZiB0aGUgc2dtbCBmaWxlCisjIyAgICAgICAgICAgICAkMiAtLSB0aGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgZ2VuZXJhdGVkIFNHTUwgZmlsZXMgaW4KKyMjICAgICAgICAgICAgICQzIC0tIGtlcm5lbCB2ZXJzaW9uCisKK215KCRTR01MLCAkUkVGLCAkZnJvbnQsICRyZWZkYXRhLCAkbW9kZSwgJGZpbGVuYW1lKTsKKworaWYoKCRBUkdWWzBdIGVxICIiKSB8fCAoJEFSR1ZbMV0gZXEgIiIpIHx8ICgkQVJHVlsyXSBlcSAiIikpeworICBkaWUgIlVzYWdlOiBzcGxpdC1tYW4gPHNnbWwgZmlsZT4gPG91dHB1dCBkaXI+IDxrZXJuZWwgdmVyc2lvbj5cbiI7Cit9CisKK29wZW4gU0dNTCwgIjwgJEFSR1ZbMF0iIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSBcIiRBUkdWWzBdXCJcbiI7CitpZiggISAtZCAiJEFSR1ZbMV0iICl7CisgIGRpZSAiT3V0cHV0IGRpcmVjdG9yeSBcIiRBUkdWWzFdXCIgZG9lcyBub3QgZXhpc3RcbiI7Cit9CisKKyMgUG9zc2libGUgbW9kZXM6CisjICAgMDogTG9va2luZyBmb3IgaW5wdXQgSSBjYXJlIGFib3V0CisjICAgMTogSW5zaWRlIGJvb2sgZnJvbnQgbWF0dGVyCisjICAgMjogSW5zaWRlIGEgcmVmZW50cnkKKyMgICAzOiBJbnNpZGUgYSByZWZlbnRyeSwgYW5kIHdlIGtub3cgdGhlIGZpbGVuYW1lCisKKyRtb2RlID0gMDsKKyRyZWZkYXRhID0gIiI7CiskZnJvbnQgPSAiIjsKK3doaWxlKDxTR01MPil7CisgICMgU3RhcnRpbmcgbW9kZXMKKyAgaWYoLzxib29raW5mbz4vIHx8IC88ZG9jaW5mbz4vKXsKKyAgICAkbW9kZSA9IDE7CisgIH0KKyAgZWxzaWYoLzxyZWZlbnRyeT4vKXsKKyAgICAkbW9kZSA9IDI7CisgIH0KKyAgZWxzaWYoLzxyZWZlbnRyeXRpdGxlPjxwaHJhc2VbXj5dKj4oW148XSopPC4qJC8peworICAgICRtb2RlID0gMzsKKyAgICAkZmlsZW5hbWUgPSAkMTsKKworICAgICRmaWxlbmFtZSA9fiBzL3N0cnVjdCAvLzsKKyAgICAkZmlsZW5hbWUgPX4gcy90eXBlZGVmIC8vOworCisgICAgcHJpbnQgIkZvdW5kIG1hbnBhZ2UgZm9yICRmaWxlbmFtZVxuIjsKKyAgICBvcGVuIFJFRiwgIj4gJEFSR1ZbMV0vJGZpbGVuYW1lLnNnbWwiIG9yCisgICAgICBkaWUgIkNvdWxkbid0IG9wZW4gb3V0cHV0IGZpbGUgXCIkQVJHVlsxXS8kZmlsZW5hbWUuc2dtbFwiOiAkIVxuIjsKKyAgICBwcmludCBSRUYgPDxFT0Y7Cis8IURPQ1RZUEUgcmVmZW50cnkgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgVjQuMS8vRU4iPgorCis8IS0tIEJFR0lORlJPTlRUQUc6IFRoZSBmb2xsb3dpbmcgaXMgZnJvbnQgbWF0dGVyIGZvciB0aGUgcGFyZW50IGJvb2sgLS0+CiskZnJvbnQKKzwhLS0gRU5ERlJPTlRUQUc6IEVuZCBmcm9udCBtYXR0ZXIgLS0+CisKKyRyZWZkYXRhCitFT0YKKyAgICAkcmVmZGF0YSA9ICIiOworICB9CisKKyAgIyBFeHRyYWN0aW9uCisgIGlmKCRtb2RlID09IDEpeworICAgIGNob21wICRfOworICAgICRmcm9udCA9ICIkZnJvbnQ8IS0tICRfIC0tPlxuIjsKKyAgfQorICBlbHNpZigkbW9kZSA9PSAyKXsKKyAgICAkcmVmZGF0YSA9ICIkcmVmZGF0YSRfIjsKKyAgfQorICBlbHNpZigkbW9kZSA9PSAzKXsKKyAgICAjIFRoZXJlIGFyZSBzb21lIGZpeHVwcyB3aGljaCBuZWVkIHRvIGJlIGFwcGxpZWQKKyAgICBpZigvPFwvcmVmbWV0YT4vKXsKKyAgICAgIHByaW50IFJFRiAiPG1hbnZvbG51bT45PC9tYW52b2xudW0+XG4iOworICAgIH0KKyAgICBpZigvPFwvcmVmZW50cnk+Lyl7CisgICAgICBwcmludCBSRUYgPDxFT0Y7Cis8cmVmc2VjdDE+PHRpdGxlPkFib3V0IHRoaXMgZG9jdW1lbnQ8L3RpdGxlPgorPHBhcmE+CitUaGlzIGRvY3VtZW50YXRpb24gd2FzIGdlbmVyYXRlZCB3aXRoIGtlcm5lbCB2ZXJzaW9uICRBUkdWWzJdLgorPC9wYXJhPgorPC9yZWZzZWN0MT4KK0VPRgorICAgIH0KKworICAgICMgRm9yIHNvbWUgcmVhc29uLCB3ZSB0aXRsZSB0aGUgc3lub3BzaXMgdHdpY2UgaW4gdGhlIG1haW4gRG9jQm9vaworICAgIGlmKCEgLzx0aXRsZT5TeW5vcHNpczxcL3RpdGxlPi8peworICAgICAgaWYoLzxyZWZlbnRyeXRpdGxlPi8peworCXMvc3RydWN0IC8vOworCXMvdHlwZWRlZiAvLzsKKyAgICAgIH0KKworICAgICAgcHJpbnQgUkVGICIkXyI7CisgICAgfQorICB9CisKKyAgIyBFbmRpbmcgbW9kZXMKKyAgaWYoLzxcL2Jvb2tpbmZvPi8gfHwgLzxcL2RvY2luZm8+Lyl7CisgICAgJG1vZGUgPSAwOworICB9CisgIGVsc2lmKC88XC9yZWZlbnRyeT4vKXsKKyAgICAkbW9kZSA9IDA7CisgICAgY2xvc2UgUkVGOworICB9Cit9CisKKyMgQW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBwcm9jZXNzIHRoaXMgdW5uZXNzZXNhcmlseQorJEFSR1ZbMF0gPX4gcy9cLnNnbWwvLjkvOworYHRvdWNoICRBUkdWWzBdYDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdmVyX2xpbnV4IGIvc2NyaXB0cy92ZXJfbGludXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmIxOTVhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Zlcl9saW51eApAQCAtMCwwICsxLDk1IEBACisjIS9iaW4vc2gKKyMgQmVmb3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQgcGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgUEFUSCBpcworIyB0eXBpY2FsIGFzIHlvdSB1c2UgZm9yIGNvbXBpbGF0aW9uL2lzdGFsbGF0aW9uLiBJIHVzZQorIyAvYmluIC9zYmluIC91c3IvYmluIC91c3Ivc2JpbiAvdXNyL2xvY2FsL2JpbiwgYnV0IGl0IG1heQorIyBkaWZmZXIgb24geW91ciBzeXN0ZW0uCisjCitQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjokUEFUSAorZWNobyAnSWYgc29tZSBmaWVsZHMgYXJlIGVtcHR5IG9yIGxvb2sgdW51c3VhbCB5b3UgbWF5IGhhdmUgYW4gb2xkIHZlcnNpb24uJworZWNobyAnQ29tcGFyZSB0byB0aGUgY3VycmVudCBtaW5pbWFsIHJlcXVpcmVtZW50cyBpbiBEb2N1bWVudGF0aW9uL0NoYW5nZXMuJworZWNobyAnICcKKwordW5hbWUgLWEKK2VjaG8gJyAnCisKK2djYyAtLXZlcnNpb24gMj4mMXwgaGVhZCAtbiAxIHwgZ3JlcCAtdiBnY2MgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJHbnUgQyAgICAgICAgICAgICAgICAgIiwgJDF9JworCitnY2MgLS12ZXJzaW9uIDI+JjF8IGdyZXAgZ2NjIHwgYXdrIFwKKydOUj09MXtwcmludCAiR251IEMgICAgICAgICAgICAgICAgICIsICQzfScKKworbWFrZSAtLXZlcnNpb24gMj4mMSB8IGF3ayAtRiwgJ3twcmludCAkMX0nIHwgYXdrIFwKKyAgICAgICcvR05VIE1ha2Uve3ByaW50ICJHbnUgbWFrZSAgICAgICAgICAgICAgIiwkTkZ9JworCitsZCAtdiB8IGF3ayAtRlwpICd7cHJpbnQgJDF9JyB8IGF3ayBcCisnL0JGRC97cHJpbnQgImJpbnV0aWxzICAgICAgICAgICAgICAiLCRORn0gXAorL15HTlUve3ByaW50ICJiaW51dGlscyAgICAgICAgICAgICAgIiwkNH0nCisKK2ZkZm9ybWF0IC0tdmVyc2lvbiB8IGF3ayAtRlwtICd7cHJpbnQgInV0aWwtbGludXggICAgICAgICAgICAiLCAkTkZ9JworCittb3VudCAtLXZlcnNpb24gfCBhd2sgLUZcLSAne3ByaW50ICJtb3VudCAgICAgICAgICAgICAgICAgIiwgJE5GfScKKworZGVwbW9kIC1WICAyPiYxIHwgYXdrICdOUj09MSB7cHJpbnQgIm1vZHVsZS1pbml0LXRvb2xzICAgICAiLCRORn0nCisKK3R1bmUyZnMgMj4mMSB8IGdyZXAgIl50dW5lMmZzIiB8IHNlZCAncy8sLy8nIHwgIGF3ayBcCisnTlI9PTEge3ByaW50ICJlMmZzcHJvZ3MgICAgICAgICAgICAgIiwgJDJ9JworCitmc2NrLmpmcyAtViAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgc2VkICdzLywvLycgfCAgYXdrIFwKKydOUj09MSB7cHJpbnQgImpmc3V0aWxzICAgICAgICAgICAgICAiLCAkM30nCisKK3JlaXNlcmZzY2sgLVYgMj4mMSB8IGdyZXAgcmVpc2VyZnNjayB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInJlaXNlcmZzcHJvZ3MgICAgICAgICAiLCAkMn0nCisKK2ZzY2sucmVpc2VyNCAtViAyPiYxIHwgZ3JlcCBmc2NrLnJlaXNlcjQgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJyZWlzZXI0cHJvZ3MgICAgICAgICAgIiwgJDJ9JworCit4ZnNfZGIgLVYgMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInhmc3Byb2dzICAgICAgICAgICAgICAiLCAkM30nCisKK2NhcmRtZ3IgLVYgMj4mMXwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKKydOUj09MXtwcmludCAicGNtY2lhLWNzICAgICAgICAgICAgICIsICQzfScKKworcXVvdGEgLVYgMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInF1b3RhLXRvb2xzICAgICAgICAgICAiLCAkTkZ9JworCitwcHBkIC0tdmVyc2lvbiAyPiYxfCBncmVwIHZlcnNpb24gfCBhd2sgXAorJ05SPT0xe3ByaW50ICJQUFAgICAgICAgICAgICAgICAgICAgIiwgJDN9JworCitpc2RuY3RybCAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKKydOUj09MXtwcmludCAiaXNkbjRrLXV0aWxzICAgICAgICAgICIsICRORn0nCisKK3Nob3dtb3VudCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgbmZzLXV0aWxzIHwgYXdrIFwKKydOUj09MXtwcmludCAibmZzLXV0aWxzICAgICAgICAgICAgICIsICRORn0nCisKK2xzIC1sIGBsZGQgL2Jpbi9zaCB8IGF3ayAnL2xpYmMve3ByaW50ICQzfSdgIHwgc2VkIFwKKy1lICdzL1wuc28kLy8nIHwgYXdrIC1GJ1suLV0nICAgJ3twcmludCAiTGludXggQyBMaWJyYXJ5ICAgICAgICAiIFwKKyQoTkYtMikiLiIkKE5GLTEpIi4iJE5GfScKKworbGRkIC12ID4gL2Rldi9udWxsIDI+JjEgJiYgbGRkIC12IHx8IGxkZCAtLXZlcnNpb24gfGhlYWQgLW4gMSB8IGF3ayBcCisnTlI9PTF7cHJpbnQgIkR5bmFtaWMgbGlua2VyIChsZGQpICAiLCAkTkZ9JworCitscyAtbCAvdXNyL2xpYi9saWJ7ZyxzdGRjfSsrLnNvICAyPi9kZXYvbnVsbCB8IGF3ayAtRi4gXAorICAgICAgICd7cHJpbnQgIkxpbnV4IEMrKyBMaWJyYXJ5ICAgICAgIiAkNCIuIiQ1Ii4iJDZ9JworCitwcyAtLXZlcnNpb24gMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgIlByb2NwcyAgICAgICAgICAgICAgICAiLCAkTkZ9JworCitpZmNvbmZpZyAtLXZlcnNpb24gMj4mMSB8IGdyZXAgdG9vbHMgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJOZXQtdG9vbHMgICAgICAgICAgICAgIiwgJE5GfScKKworIyBLYmQgbmVlZHMgJ2xvYWRrZXlzIC1oJywKK2xvYWRrZXlzIC1oIDI+JjEgfCBhd2sgXAorJyhOUj09MSAmJiAoJDMgIX4gL29wdGlvbi8pKSB7cHJpbnQgIktiZCAgICAgICAgICAgICAgICAgICAiLCAkM30nCisKKyMgd2hpbGUgY29uc29sZS10b29scyBuZWVkcyAnbG9hZGtleXMgLVYnLgorbG9hZGtleXMgLVYgMj4mMSB8IGF3ayBcCisnKE5SPT0xICYmICgkMiB+IC9jb25zb2xlLXRvb2xzLykpIHtwcmludCAiQ29uc29sZS10b29scyAgICAgICAgICIsICQzfScKKworZXhwciAtLXYgMj4mMSB8IGF3ayAnTlI9PTF7cHJpbnQgIlNoLXV0aWxzICAgICAgICAgICAgICAiLCAkTkZ9JworCit1ZGV2aW5mbyAtViB8IGF3ayAne3ByaW50ICJ1ZGV2ICAgICAgICAgICAgICAgICAgIiwgJDN9JworCitpZiBbIC1lIC9wcm9jL21vZHVsZXMgXTsgdGhlbgorICAgIFg9YGNhdCAvcHJvYy9tb2R1bGVzIHwgc2VkIC1lICJzLyAuKiQvLyJgCisgICAgZWNobyAiTW9kdWxlcyBMb2FkZWQgICAgICAgICAiJFgKK2ZpCg==