ICAgICAgICAgICAgICAgSmF2YSh0bSkgQmluYXJ5IEtlcm5lbCBTdXBwb3J0IGZvciBMaW51eCB2MS4wMwogICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpMaW51eCBiZWF0cyB0aGVtIEFMTCEgV2hpbGUgYWxsIG90aGVyIE9TJ3MgYXJlIFRBTEtJTkcgYWJvdXQgZGlyZWN0CnN1cHBvcnQgb2YgSmF2YSBCaW5hcmllcyBpbiB0aGUgT1MsIExpbnV4IGlzIGRvaW5nIGl0IQoKWW91IGNhbiBleGVjdXRlIEphdmEgYXBwbGljYXRpb25zIGFuZCBKYXZhIEFwcGxldHMganVzdCBsaWtlIGFueQpvdGhlciBwcm9ncmFtIGFmdGVyIHlvdSBoYXZlIGRvbmUgdGhlIGZvbGxvd2luZzoKCjEpIFlvdSBNVVNUIEZJUlNUIGluc3RhbGwgdGhlIEphdmEgRGV2ZWxvcGVycyBLaXQgZm9yIExpbnV4LgogICBUaGUgSmF2YSBvbiBMaW51eCBIT1dUTyBnaXZlcyB0aGUgZGV0YWlscyBvbiBnZXR0aW5nIGFuZAogICBpbnN0YWxsaW5nIHRoaXMuIFRoaXMgSE9XVE8gY2FuIGJlIGZvdW5kIGF0OgoKCWZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvZG9jcy9IT1dUTy9KYXZhLUhPV1RPCgogICBZb3Ugc2hvdWxkIGFsc28gc2V0IHVwIGEgcmVhc29uYWJsZSBDTEFTU1BBVEggZW52aXJvbm1lbnQKICAgdmFyaWFibGUgdG8gdXNlIEphdmEgYXBwbGljYXRpb25zIHRoYXQgbWFrZSB1c2Ugb2YgYW55CiAgIG5vbnN0YW5kYXJkIGNsYXNzZXMgKG5vdCBpbmNsdWRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKICAgYXMgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZikuCgoyKSBZb3UgaGF2ZSB0byBjb21waWxlIEJJTkZNVF9NSVNDIGVpdGhlciBhcyBhIG1vZHVsZSBvciBpbnRvCiAgIHRoZSBrZXJuZWwgKENPTkZJR19CSU5GTVRfTUlTQykgYW5kIHNldCBpdCB1cCBwcm9wZXJseS4KICAgSWYgeW91IGNob29zZSB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCB5b3Ugd2lsbCBoYXZlCiAgIHRvIGluc2VydCBpdCBtYW51YWxseSB3aXRoIG1vZHByb2JlL2luc21vZCwgYXMga21vZAogICBjYW5ub3QgZWFzaWx5IGJlIHN1cHBvcnRlZCB3aXRoIGJpbmZtdF9taXNjLiAKICAgUmVhZCB0aGUgZmlsZSAnYmluZm10X21pc2MudHh0JyBpbiB0aGlzIGRpcmVjdG9yeSB0byBrbm93CiAgIG1vcmUgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KCjMpIEFkZCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gaXRlbXMgdG8gYmluZm10X21pc2MKICAgKHlvdSBzaG91bGQgcmVhbGx5IGhhdmUgcmVhZCBiaW5mbXRfbWlzYy50eHQgbm93KToKICAgc3VwcG9ydCBmb3IgSmF2YSBhcHBsaWNhdGlvbnM6CiAgICAgJzpKYXZhOk06Olx4Y2FceGZlXHhiYVx4YmU6Oi91c3IvbG9jYWwvYmluL2phdmF3cmFwcGVyOicKICAgc3VwcG9ydCBmb3IgZXhlY3V0YWJsZSBKYXIgZmlsZXM6CiAgICAgJzpFeGVjdXRhYmxlSkFSOkU6Omphcjo6L3Vzci9sb2NhbC9iaW4vamFyd3JhcHBlcjonCiAgIHN1cHBvcnQgZm9yIEphdmEgQXBwbGV0czoKICAgICAnOkFwcGxldDpFOjpodG1sOjovdXNyL2Jpbi9hcHBsZXR2aWV3ZXI6JwogICBvciB0aGUgZm9sbG93aW5nLCBpZiB5b3Ugd2FudCB0byBiZSBtb3JlIHNlbGVjdGl2ZToKICAgICAnOkFwcGxldDpNOjo8IS0tYXBwbGV0OjovdXNyL2Jpbi9hcHBsZXR2aWV3ZXI6JwoKICAgT2YgY2F1c2UgeW91IGhhdmUgdG8gZml4IHRoZSBwYXRoIG5hbWVzLiBHaXZlbiBwYXRoL2ZpbGUgbmFtZXMgaW4gdGhpcwogICBkb2N1bWVudCBtYXRjaCB0aGUgRGViaWFuIDIuMSBzeXN0ZW0uIChpLmUuIGpkayBpbnN0YWxsZWQgaW4gL3VzciwKICAgY3VzdG9tIHdyYXBwZXJzIGZyb20gdGhpcyBkb2N1bWVudCBpbiAvdXNyL2xvY2FsKQoKICAgTm90ZSwgdGhhdCBmb3IgdGhlIG1vcmUgc2VsZWN0aXZlIGFwcGxldCBzdXBwb3J0IHlvdSBoYXZlIHRvIG1vZGlmeQogICBleGlzdGluZyBodG1sLWZpbGVzIHRvIGNvbnRhaW4gPCEtLWFwcGxldC0tPiBpbiB0aGUgZmlyc3QgbGluZQogICAoJzwnIGhhcyB0byBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyISkgdG8gbGV0IHRoaXMgd29yayEKCiAgIEZvciB0aGUgY29tcGlsZWQgSmF2YSBwcm9ncmFtcyB5b3UgbmVlZCBhIHdyYXBwZXIgc2NyaXB0IGxpa2UgdGhlCiAgIGZvbGxvd2luZyAodGhpcyBpcyBiZWNhdXNlIEphdmEgaXMgYnJva2VuIGluIGNhc2Ugb2YgdGhlIGZpbGVuYW1lCiAgIGhhbmRsaW5nKSwgYWdhaW4gZml4IHRoZSBwYXRoIG5hbWVzLCBib3RoIGluIHRoZSBzY3JpcHQgYW5kIGluIHRoZQogICBhYm92ZSBnaXZlbiBjb25maWd1cmF0aW9uIHN0cmluZy4KCiAgIFlvdSwgdG9vLCBuZWVkIHRoZSBsaXR0bGUgcHJvZ3JhbSBhZnRlciB0aGUgc2NyaXB0LiBDb21waWxlIGxpa2UKICAgZ2NjIC1PMiAtbyBqYXZhY2xhc3NuYW1lIGphdmFjbGFzc25hbWUuYwogICBhbmQgc3RpY2sgaXQgdG8gL3Vzci9sb2NhbC9iaW4uCgogICBCb3RoIHRoZSBqYXZhd3JhcHBlciBzaGVsbHNjcmlwdCBhbmQgdGhlIGphdmFjbGFzc25hbWUgcHJvZ3JhbQogICB3ZXJlIHN1cHBsaWVkIGJ5IENvbGluIEouIFdhdHNvbiA8Y2p3NDRAY2FtLmFjLnVrPi4KCj09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQojIS9iaW4vYmFzaAojIC91c3IvbG9jYWwvYmluL2phdmF3cmFwcGVyIC0gdGhlIHdyYXBwZXIgZm9yIGJpbmZtdF9taXNjL2phdmEKCmlmIFsgLXogIiQxIiBdOyB0aGVuCglleGVjIDE+JjIKCWVjaG8gVXNhZ2U6ICQwIGNsYXNzLWZpbGUKCWV4aXQgMQpmaQoKQ0xBU1M9JDEKRlFDTEFTUz1gL3Vzci9sb2NhbC9iaW4vamF2YWNsYXNzbmFtZSAkMWAKRlFDTEFTU049YGVjaG8gJEZRQ0xBU1MgfCBzZWQgLWUgJ3MvXi4qXC5cKFteLl0qXCkkL1wxLydgCkZRQ0xBU1NQPWBlY2hvICRGUUNMQVNTIHwgc2VkIC1lICdzLVwuLS8tZycgLWUgJ3MtXlteL10qJC0tJyAtZSAncy0vW14vXSokLS0nYAoKIyBmb3IgZXhhbXBsZToKIyBDTEFTUz1UZXN0LmNsYXNzCiMgRlFDTEFTUz1mb28uYmFyLlRlc3QKIyBGUUNMQVNTTj1UZXN0CiMgRlFDTEFTU1A9Zm9vL2JhcgoKdW5zZXQgQ0xBU1NCQVNFCgpkZWNsYXJlIC1pIExJTktMRVZFTD0wCgp3aGlsZSA6OyBkbwoJaWYgWyAiYGJhc2VuYW1lICRDTEFTUyAuY2xhc3NgIiA9PSAiJEZRQ0xBU1NOIiBdOyB0aGVuCgkJIyBTZWUgaWYgdGhpcyBkaXJlY3Rvcnkgd29ya3Mgc3RyYWlnaHQgb2ZmCgkJY2QgLUwgYGRpcm5hbWUgJENMQVNTYAoJCUNMQVNTRElSPSRQV0QKCQljZCAkT0xEUFdECgkJaWYgZWNobyAkQ0xBU1NESVIgfCBncmVwIC1xICIkRlFDTEFTU1AkIjsgdGhlbgoJCQlDTEFTU0JBU0U9YGVjaG8gJENMQVNTRElSIHwgc2VkIC1lICJzLiRGUUNMQVNTUCQuLiJgCgkJCWJyZWFrOwoJCWZpCgkJIyBUcnkgZGVyZWZlcmVuY2luZyB0aGUgZGlyZWN0b3J5IG5hbWUKCQljZCAtUCBgZGlybmFtZSAkQ0xBU1NgCgkJQ0xBU1NESVI9JFBXRAoJCWNkICRPTERQV0QKCQlpZiBlY2hvICRDTEFTU0RJUiB8IGdyZXAgLXEgIiRGUUNMQVNTUCQiOyB0aGVuCgkJCUNMQVNTQkFTRT1gZWNobyAkQ0xBU1NESVIgfCBzZWQgLWUgInMuJEZRQ0xBU1NQJC4uImAKCQkJYnJlYWs7CgkJZmkKCQkjIElmIG5vIG90aGVyIHBvc3NpYmxlIGZpbGVuYW1lIGV4aXN0cwoJCWlmIFsgISAtTCAkQ0xBU1MgXTsgdGhlbgoJCQlleGVjIDE+JjIKCQkJZWNobyAkMDoKCQkJZWNobyAiICAkQ0xBU1Mgc2hvdWxkIGJlIGluIGEiIFwKCQkJICAgICAiZGlyZWN0b3J5IHRyZWUgY2FsbGVkICRGUUNMQVNTUCIKCQkJZXhpdCAxCgkJZmkKCWZpCglpZiBbICEgLUwgJENMQVNTIF07IHRoZW4gYnJlYWs7IGZpCgkjIEdvIGRvd24gb25lIG1vcmUgbGV2ZWwgb2Ygc3ltYm9saWMgbGlua3MKCWxldCBMSU5LTEVWRUwrPTEKCWlmIFsgJExJTktMRVZFTCAtZ3QgNSBdOyB0aGVuCgkJZXhlYyAxPiYyCgkJZWNobyAkMDoKCQllY2hvICIgIFRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIgoJCWV4aXQgMQoJZmkKCUNMQVNTPWBscyAtLWNvbG9yPW5vIC1sICRDTEFTUyB8IHNlZCAtZSAncy9eLiogXChbXiBdKlwpJC9cMS8nYApkb25lCgppZiBbIC16ICIkQ0xBU1NCQVNFIiBdOyB0aGVuCglpZiBbIC16ICIkRlFDTEFTU1AiIF07IHRoZW4KCQlHT09ETkFNRT0kRlFDTEFTU04uY2xhc3MKCWVsc2UKCQlHT09ETkFNRT0kRlFDTEFTU1AvJEZRQ0xBU1NOLmNsYXNzCglmaQoJZXhlYyAxPiYyCgllY2hvICQwOgoJZWNobyAiICAkRlFDTEFTUyBzaG91bGQgYmUgaW4gYSBmaWxlIGNhbGxlZCAkR09PRE5BTUUiCglleGl0IDEKZmkKCmlmICEgZWNobyAkQ0xBU1NQQVRIIHwgZ3JlcCAtcSAiXlwoLio6XCkqJENMQVNTQkFTRVwoOi4qXCkqIjsgdGhlbgoJIyBjbGFzcyBpcyBub3QgaW4gQ0xBU1NQQVRILCBzbyBwcmVwZW5kIGRpciBvZiBjbGFzcyB0byBDTEFTU1BBVEgKCWlmIFsgLXogIiR7Q0xBU1NQQVRIfSIgXSA7IHRoZW4KCQlleHBvcnQgQ0xBU1NQQVRIPSRDTEFTU0JBU0UKCWVsc2UKCQlleHBvcnQgQ0xBU1NQQVRIPSRDTEFTU0JBU0U6JENMQVNTUEFUSAoJZmkKZmkKCnNoaWZ0Ci91c3IvYmluL2phdmEgJEZRQ0xBU1MgIiRAIgo9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KCgo9PT09PT09PT09PT09PT09PT09PT09IEN1dCBoZXJlID09PT09PT09PT09PT09PT09PT0KLyogamF2YWNsYXNzbmFtZS5jCiAqCiAqIEV4dHJhY3RzIHRoZSBjbGFzcyBuYW1lIGZyb20gYSBKYXZhIGNsYXNzIGZpbGU7IGludGVuZGVkIGZvciB1c2UgaW4gYSBKYXZhCiAqIHdyYXBwZXIgb2YgdGhlIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBiaW5mbXRfbWlzYyBvcHRpb24gaW4gdGhlIExpbnV4IGtlcm5lbC4KICoKICogQ29weXJpZ2h0IChDKSAxOTk5IENvbGluIEouIFdhdHNvbiA8Y2p3NDRAY2FtLmFjLnVrPi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKLyogRnJvbSBTdW4ncyBKYXZhIFZNIFNwZWNpZmljYXRpb24sIGFzIHRhZyBlbnRyaWVzIGluIHRoZSBjb25zdGFudCBwb29sLiAqLwoKI2RlZmluZSBDUF9VVEY4IDEKI2RlZmluZSBDUF9JTlRFR0VSIDMKI2RlZmluZSBDUF9GTE9BVCA0CiNkZWZpbmUgQ1BfTE9ORyA1CiNkZWZpbmUgQ1BfRE9VQkxFIDYKI2RlZmluZSBDUF9DTEFTUyA3CiNkZWZpbmUgQ1BfU1RSSU5HIDgKI2RlZmluZSBDUF9GSUVMRFJFRiA5CiNkZWZpbmUgQ1BfTUVUSE9EUkVGIDEwCiNkZWZpbmUgQ1BfSU5URVJGQUNFTUVUSE9EUkVGIDExCiNkZWZpbmUgQ1BfTkFNRUFORFRZUEUgMTIKCi8qIERlZmluZSBzb21lIGNvbW1vbmx5IHVzZWQgZXJyb3IgbWVzc2FnZXMgKi8KCiNkZWZpbmUgc2Vla19lcnJvcigpIGVycm9yKCIlczogQ2Fubm90IHNlZWtcbiIsIHByb2dyYW0pCiNkZWZpbmUgY29ycnVwdF9lcnJvcigpIGVycm9yKCIlczogQ2xhc3MgZmlsZSBjb3JydXB0XG4iLCBwcm9ncmFtKQojZGVmaW5lIGVvZl9lcnJvcigpIGVycm9yKCIlczogVW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiwgcHJvZ3JhbSkKI2RlZmluZSB1dGY4X2Vycm9yKCkgZXJyb3IoIiVzOiBPbmx5IEFTQ0lJIDEtMjU1IHN1cHBvcnRlZFxuIiwgcHJvZ3JhbSk7CgpjaGFyICpwcm9ncmFtOwoKbG9uZyAqcG9vbDsKCnVfaW50OF90IHJlYWRfOChGSUxFICpjbGFzc2ZpbGUpOwp1X2ludDE2X3QgcmVhZF8xNihGSUxFICpjbGFzc2ZpbGUpOwp2b2lkIHNraXBfY29uc3RhbnQoRklMRSAqY2xhc3NmaWxlLCB1X2ludDE2X3QgKmN1cik7CnZvaWQgZXJyb3IoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwoKLyogUmVhZHMgaW4gYW4gdW5zaWduZWQgOC1iaXQgaW50ZWdlci4gKi8KdV9pbnQ4X3QgcmVhZF84KEZJTEUgKmNsYXNzZmlsZSkKewoJaW50IGIgPSBmZ2V0YyhjbGFzc2ZpbGUpOwoJaWYoYiA9PSBFT0YpCgkJZW9mX2Vycm9yKCk7CglyZXR1cm4gKHVfaW50OF90KWI7Cn0KCi8qIFJlYWRzIGluIGFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyLiAqLwp1X2ludDE2X3QgcmVhZF8xNihGSUxFICpjbGFzc2ZpbGUpCnsKCWludCBiMSwgYjI7CgliMSA9IGZnZXRjKGNsYXNzZmlsZSk7CglpZihiMSA9PSBFT0YpCgkJZW9mX2Vycm9yKCk7CgliMiA9IGZnZXRjKGNsYXNzZmlsZSk7CglpZihiMiA9PSBFT0YpCgkJZW9mX2Vycm9yKCk7CglyZXR1cm4gKHVfaW50MTZfdCkoKGIxIDw8IDgpIHwgYjIpOwp9CgovKiBSZWFkcyBpbiBhIHZhbHVlIGZyb20gdGhlIGNvbnN0YW50IHBvb2wuICovCnZvaWQgc2tpcF9jb25zdGFudChGSUxFICpjbGFzc2ZpbGUsIHVfaW50MTZfdCAqY3VyKQp7Cgl1X2ludDE2X3QgbGVuOwoJaW50IHNlZWtlcnIgPSAxOwoJcG9vbFsqY3VyXSA9IGZ0ZWxsKGNsYXNzZmlsZSk7Cglzd2l0Y2gocmVhZF84KGNsYXNzZmlsZSkpCgl7CgljYXNlIENQX1VURjg6CgkJbGVuID0gcmVhZF8xNihjbGFzc2ZpbGUpOwoJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIGxlbiwgU0VFS19DVVIpOwoJCWJyZWFrOwoJY2FzZSBDUF9DTEFTUzoKCWNhc2UgQ1BfU1RSSU5HOgoJCXNlZWtlcnIgPSBmc2VlayhjbGFzc2ZpbGUsIDIsIFNFRUtfQ1VSKTsKCQlicmVhazsKCWNhc2UgQ1BfSU5URUdFUjoKCWNhc2UgQ1BfRkxPQVQ6CgljYXNlIENQX0ZJRUxEUkVGOgoJY2FzZSBDUF9NRVRIT0RSRUY6CgljYXNlIENQX0lOVEVSRkFDRU1FVEhPRFJFRjoKCWNhc2UgQ1BfTkFNRUFORFRZUEU6CgkJc2Vla2VyciA9IGZzZWVrKGNsYXNzZmlsZSwgNCwgU0VFS19DVVIpOwoJCWJyZWFrOwoJY2FzZSBDUF9MT05HOgoJY2FzZSBDUF9ET1VCTEU6CgkJc2Vla2VyciA9IGZzZWVrKGNsYXNzZmlsZSwgOCwgU0VFS19DVVIpOwoJCSsrKCpjdXIpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQljb3JydXB0X2Vycm9yKCk7Cgl9CglpZihzZWVrZXJyKQoJCXNlZWtfZXJyb3IoKTsKfQoKdm9pZCBlcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKewoJdmFfbGlzdCBhcDsKCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOwoJdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFwKTsKCXZhX2VuZChhcCk7CglleGl0KDEpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCUZJTEUgKmNsYXNzZmlsZTsKCXVfaW50MTZfdCBjcF9jb3VudCwgaSwgdGhpc19jbGFzcywgY2xhc3NpbmZvX3B0cjsKCXVfaW50OF90IGxlbmd0aDsKCglwcm9ncmFtID0gYXJndlswXTsKCglpZighYXJndlsxXSkKCQllcnJvcigiJXM6IE1pc3NpbmcgaW5wdXQgZmlsZVxuIiwgcHJvZ3JhbSk7CgljbGFzc2ZpbGUgPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKCWlmKCFjbGFzc2ZpbGUpCgkJZXJyb3IoIiVzOiBFcnJvciBvcGVuaW5nICVzXG4iLCBwcm9ncmFtLCBhcmd2WzFdKTsKCglpZihmc2VlayhjbGFzc2ZpbGUsIDgsIFNFRUtfU0VUKSkgIC8qIHNraXAgbWFnaWMgYW5kIHZlcnNpb24gbnVtYmVycyAqLwoJCXNlZWtfZXJyb3IoKTsKCWNwX2NvdW50ID0gcmVhZF8xNihjbGFzc2ZpbGUpOwoJcG9vbCA9IGNhbGxvYyhjcF9jb3VudCwgc2l6ZW9mKGxvbmcpKTsKCWlmKCFwb29sKQoJCWVycm9yKCIlczogT3V0IG9mIG1lbW9yeSBmb3IgY29uc3RhbnQgcG9vbFxuIiwgcHJvZ3JhbSk7CgoJZm9yKGkgPSAxOyBpIDwgY3BfY291bnQ7ICsraSkKCQlza2lwX2NvbnN0YW50KGNsYXNzZmlsZSwgJmkpOwoJaWYoZnNlZWsoY2xhc3NmaWxlLCAyLCBTRUVLX0NVUikpCS8qIHNraXAgYWNjZXNzIGZsYWdzICovCgkJc2Vla19lcnJvcigpOwoKCXRoaXNfY2xhc3MgPSByZWFkXzE2KGNsYXNzZmlsZSk7CglpZih0aGlzX2NsYXNzIDwgMSB8fCB0aGlzX2NsYXNzID49IGNwX2NvdW50KQoJCWNvcnJ1cHRfZXJyb3IoKTsKCWlmKCFwb29sW3RoaXNfY2xhc3NdIHx8IHBvb2xbdGhpc19jbGFzc10gPT0gLTEpCgkJY29ycnVwdF9lcnJvcigpOwoJaWYoZnNlZWsoY2xhc3NmaWxlLCBwb29sW3RoaXNfY2xhc3NdICsgMSwgU0VFS19TRVQpKQoJCXNlZWtfZXJyb3IoKTsKCgljbGFzc2luZm9fcHRyID0gcmVhZF8xNihjbGFzc2ZpbGUpOwoJaWYoY2xhc3NpbmZvX3B0ciA8IDEgfHwgY2xhc3NpbmZvX3B0ciA+PSBjcF9jb3VudCkKCQljb3JydXB0X2Vycm9yKCk7CglpZighcG9vbFtjbGFzc2luZm9fcHRyXSB8fCBwb29sW2NsYXNzaW5mb19wdHJdID09IC0xKQoJCWNvcnJ1cHRfZXJyb3IoKTsKCWlmKGZzZWVrKGNsYXNzZmlsZSwgcG9vbFtjbGFzc2luZm9fcHRyXSArIDEsIFNFRUtfU0VUKSkKCQlzZWVrX2Vycm9yKCk7CgoJbGVuZ3RoID0gcmVhZF8xNihjbGFzc2ZpbGUpOwoJZm9yKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCgl7CgkJdV9pbnQ4X3QgeCA9IHJlYWRfOChjbGFzc2ZpbGUpOwoJCWlmKCh4ICYgMHg4MCkgfHwgIXgpCgkJewoJCQlpZigoeCAmIDB4RTApID09IDB4QzApCgkJCXsKCQkJCXVfaW50OF90IHkgPSByZWFkXzgoY2xhc3NmaWxlKTsKCQkJCWlmKCh5ICYgMHhDMCkgPT0gMHg4MCkKCQkJCXsKCQkJCQlpbnQgYyA9ICgoeCAmIDB4MWYpIDw8IDYpICsgKHkgJiAweDNmKTsKCQkJCQlpZihjKSBwdXRjaGFyKGMpOwoJCQkJCWVsc2UgdXRmOF9lcnJvcigpOwoJCQkJfQoJCQkJZWxzZSB1dGY4X2Vycm9yKCk7CgkJCX0KCQkJZWxzZSB1dGY4X2Vycm9yKCk7CgkJfQoJCWVsc2UgaWYoeCA9PSAnLycpIHB1dGNoYXIoJy4nKTsKCQllbHNlIHB1dGNoYXIoeCk7Cgl9CglwdXRjaGFyKCdcbicpOwoJZnJlZShwb29sKTsKCWZjbG9zZShjbGFzc2ZpbGUpOwoJcmV0dXJuIDA7Cn0KPT09PT09PT09PT09PT09PT09PT09PSBDdXQgaGVyZSA9PT09PT09PT09PT09PT09PT09CgoKPT09PT09PT09PT09PT09PT09PT09PSBDdXQgaGVyZSA9PT09PT09PT09PT09PT09PT09CiMhL2Jpbi9iYXNoCiMgL3Vzci9sb2NhbC9qYXZhL2Jpbi9qYXJ3cmFwcGVyIC0gdGhlIHdyYXBwZXIgZm9yIGJpbmZtdF9taXNjL2phcgoKamF2YSAtamFyICQxCj09PT09PT09PT09PT09PT09PT09PT0gQ3V0IGhlcmUgPT09PT09PT09PT09PT09PT09PQoKCk5vdyBzaW1wbHkgY2htb2QgK3ggdGhlIC5jbGFzcywgLmphciBhbmQvb3IgLmh0bWwgZmlsZXMgeW91IHdhbnQgdG8gZXhlY3V0ZS4KVG8gYWRkIGEgSmF2YSBwcm9ncmFtIHRvIHlvdXIgcGF0aCBiZXN0IHB1dCBhIHN5bWJvbGljIGxpbmsgdG8gdGhlIG1haW4KLmNsYXNzIGZpbGUgaW50byAvdXNyL2JpbiAob3IgYW5vdGhlciBwbGFjZSB5b3UgbGlrZSkgb21pdHRpbmcgdGhlIC5jbGFzcwpleHRlbnNpb24uIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgLmNsYXNzIGZpbGUgd2lsbCBiZQphZGRlZCB0byB5b3VyIENMQVNTUEFUSCBkdXJpbmcgZXhlY3V0aW9uLgoKClRvIHRlc3QgeW91ciBuZXcgc2V0dXAsIGVudGVyIGluIHRoZSBmb2xsb3dpbmcgc2ltcGxlIEphdmEgYXBwLCBhbmQgbmFtZQppdCAiSGVsbG9Xb3JsZC5qYXZhIjoKCgljbGFzcyBIZWxsb1dvcmxkIHsKCQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQhIik7CgkJfQoJfQoKTm93IGNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uIHdpdGg6CglqYXZhYyBIZWxsb1dvcmxkLmphdmEKClNldCB0aGUgZXhlY3V0YWJsZSBwZXJtaXNzaW9ucyBvZiB0aGUgYmluYXJ5IGZpbGUsIHdpdGg6CgljaG1vZCA3NTUgSGVsbG9Xb3JsZC5jbGFzcwoKQW5kIHRoZW4gZXhlY3V0ZSBpdDoKCS4vSGVsbG9Xb3JsZC5jbGFzcwoKClRvIGV4ZWN1dGUgSmF2YSBKYXIgZmlsZXMsIHNpbXBsZSBjaG1vZCB0aGUgKi5qYXIgZmlsZXMgdG8gaW5jbHVkZQp0aGUgZXhlY3V0aW9uIGJpdCwgdGhlbiBqdXN0IGRvCiAgICAgICAuL0FwcGxpY2F0aW9uLmphcgoKClRvIGV4ZWN1dGUgSmF2YSBBcHBsZXRzLCBzaW1wbGUgY2htb2QgdGhlICouaHRtbCBmaWxlcyB0byBpbmNsdWRlCnRoZSBleGVjdXRpb24gYml0LCB0aGVuIGp1c3QgZG8KCS4vQXBwbGV0Lmh0bWwKCgpvcmlnaW5hbGx5IGJ5IEJyaWFuIEEuIExhbnR6LCBicmlhbkBsYW50ei5jb20KaGVhdmlseSBlZGl0ZWQgZm9yIGJpbmZtdF9taXNjIGJ5IFJpY2hhcmQgR/xudGhlcgpuZXcgc2NyaXB0cyBieSBDb2xpbiBKLiBXYXRzb24gPGNqdzQ0QGNhbS5hYy51az4KYWRkZWQgZXhlY3V0YWJsZSBKYXIgZmlsZSBzdXBwb3J0IGJ5IEt1cnQgSHV3aWcgPGt1cnRAaWt1LW5ldHouZGU+Cgo=