JCEKJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgdGhlIGJmZCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBvcGVuVk1TLgokIQokISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCiQhIHRvIGV4ZWN1dGUgaXQuCiQhCiQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKJCEgUmV3cml0dGVuIGJ5IFRyaXN0YW4gR2luZ29sZCAoZ2luZ29sZEBhZGFjb3JlLmNvbSkKJCEKJCEgICBDb3B5cmlnaHQgKEMpIDIwMTItMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KJCEKJCEgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKJCEgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKJCEgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKJCEgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KJCEKJCEgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiQhIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiQhIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKJCEgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KJCEKJCEgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKJCEgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5vdCBzZWUKJCEgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgokIQokIGFyY2g9RiRHRVRTWUkoIkFSQ0hfTkFNRSIpCiQgYXJjaD1GJEVESVQoYXJjaCwiTE9XRVJDQVNFIikKJGlmIGFyY2ggLmVxcy4gImFscGhhIiB0aGVuIHRhcmdldCA9ICJhbHBoYSIKJGlmIGFyY2ggLmVxcy4gImlhNjQiIHRoZW4gdGFyZ2V0ID0gImlhNjQiCiQhCiRpZiAoYXJjaCAuZXFzLiAiYWxwaGEiKSAub3IuIChhcmNoIC5lcXMuICJpYTY0IikKJHRoZW4KJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBCRkQgZm9yICcndGFyZ2V0JyB0YXJnZXQiCiQhCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnNjQnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF9kZWZhdWx0X3RhcmdldF9zaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzY0Jyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF9maWxlX3B0ckAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdiZmRfc2lnbmVkX3ZtYScpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3VmaWxlX3B0ckAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCdiZmRfdm1hJyk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BzdXBwb3J0c19wbHVnaW5zQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQoJzAnKTsKICAgRU5ESUY7CiAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7CiAgIFFVSVQKJCAgRU9ECiQKJGVsc2UKJAokIHdyaXRlIHN5cyRvdXRwdXQgIkNvbmZpZ3VyaW5nIGZvciBWYXggdGFyZ2V0IgokIHRhcmdldCA9ICJ2YXgiCiQhCiQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKJCEKJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGJmZC5oJyBmcm9tIGBiZmQtaW4yLmgnLiIKJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCiAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCiRERUNLCiEKISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCiEKIQogICBzZXQgKHN1Y2Nlc3Msb2ZmKTsKCiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwoKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAd29yZHNpemVAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMzInKTsKICAgRU5ESUY7CiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0QklUX0xPTkdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnMCcpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJGVuZGlmCiQKJCEKJCEgY3JlYXRlIGJmZHZlci5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYGJmZHZlci5oJyBmcm9tICd2ZXJzaW9uLmgnIGFuZCBgY29uZmlndXJlLmluJy4iCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zeXMkaW5wdXQgLQogICAgICAgIFtddmVyc2lvbi5oIC9vdXRwdXQ9W11iZmR2ZXIuaAokREVDSwohCiEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQohCiEKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIHZmaWxlIDo9IENSRUFURV9CVUZGRVIoInZmaWxlIiwgImNvbmZpZ3VyZS5pbiIpOwogICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBQ19JTklUKFtiZmRdLCBbJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSJdKSI7CiAgIEVMU0U7CiAgICAgdmVycyA6PSAidW5rbm93biI7CiAgIEVORElGOwogICB2ZXJzbnVtIDo9IHZlcnMgLSAiLiIgLSAiLiI7CgogICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7CiAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKCiAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQGJmZF92ZXJzaW9uQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgICBFUkFTRShtYXRjaF9wb3MpOwogICAgICBDT1BZX1RFWFQodmVyc251bSk7CiAgIEVORElGOwogICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BiZmRfdmVyc2lvbl9zdHJpbmdAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnIicpOwogICAgICBDT1BZX1RFWFQodmVycyk7CiAgICAgIENPUFlfVEVYVCgnIicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAYmZkX3ZlcnNpb25fcGFja2FnZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47CiAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKICAgICAgQ09QWV9URVhUKCciKEdOVSBCaW51dGlscykgIicpOwogICBFTkRJRjsKICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAcmVwb3J0X2J1Z3NfdG9AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwogICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwogICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7CiAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgIENPUFlfVEVYVCgnIjxodHRwczovL3d3dy5zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS8+IicpOwogICBFTkRJRjsKICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKICAgUVVJVAokICBFT0QKJCEKJCEKJCEgY3JlYXRlIHRhcmdtYXRjaC5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYHRhcmdtYXRjaC5oJyIKJCBvcGVuL3dyaXRlIHRmaWxlIFtddGFyZ21hdGNoLmgKJCB3cml0ZSB0ZmlsZSAieyAiIiIgKyB0YXJnZXQgKyAiLSotKnZtcyoiIiIgKyAiLCIKJCB3cml0ZSB0ZmlsZSAiI2lmIGRlZmluZWQgKFNFTEVDVF9WRUNTKSIKJCB3cml0ZSB0ZmlsZSAiU0VMRUNUX1ZFQ1MiCiQgd3JpdGUgdGZpbGUgIiNlbHNlIgokIHdyaXRlIHRmaWxlICJVTlNVUFBPUlRFRF9UQVJHRVQiCiQgd3JpdGUgdGZpbGUgIiNlbmRpZiIKJCB3cml0ZSB0ZmlsZSAifSwiCiQgY2xvc2UgdGZpbGUKJCEKJCEKJCEgY3JlYXRlIGNvbmZpZy5oCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYGNvbmZpZy5oJyIKJCBjcmVhdGUgW11jb25maWcuaAovKiBjb25maWcuaC12bXMuICBHZW5lcmF0ZWQgYnkgaGFuZCBieSBLbGF1cyBL5G1wZiwga2thZW1wZkBkaWR5bXVzLnJtaS5kZS4gICovCi8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwovKiBXaGV0aGVyIG1hbGxvYyBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGxpYi5oPiBpcyBpbmNsdWRlZC4gICovCi8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAqLwovKiBXaGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCBldmVuIGlmIDxzdGRsaWIuaD4gaXMgaW5jbHVkZWQuICAqLwovKiAjdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFICovCi8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLyogI2RlZmluZSBIQVZFX01NQVAgMSAqLwovKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLyogI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4gKi8KLyogTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuICAqLwovKiAjdW5kZWYgVFJBRF9IRUFERVIgKi8KLyogRGVmaW5lIG9ubHkgaWYgPHN5cy9wcm9jZnMuaD4gaXMgYXZhaWxhYmxlICphbmQqIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4gICovCi8qICN1bmRlZiBIQVZFX1NZU19QUk9DRlNfSCAqLwovKiBEbyB3ZSByZWFsbHkgd2FudCB0byB1c2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT8gICovCi8qICN1bmRlZiBVU0VfTU1BUCAqLwovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZjbnRsIGZ1bmN0aW9uLiAgKi8KI2RlZmluZSBIQVZFX0ZDTlRMIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWFkdmlzZSBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9NQURWSVNFIDEKLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtcHJvdGVjdCBmdW5jdGlvbi4gICovCiNkZWZpbmUgSEFWRV9NUFJPVEVDVCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRkZWYuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1REREVGX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RETElCX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwojZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQovKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KI2RlZmluZSBIQVZFX1RJTUVfSCAxCi8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCiNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi8qIERpc2FibGUgTkxTICAqLwojdW5kZWYgRU5BQkxFX05MUwovKiBOYW1lIG9mIHBhY2thZ2UgKi8KI2RlZmluZSBQQUNLQUdFICJiZmQiCi8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwojZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIiCi8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX05BTUUgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJiZmQiCi8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgImJmZCIKLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KI2RlZmluZSBQQUNLQUdFX1VSTCAiIgovKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwojZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiKHBhY2thZ2UgdmVyc2lvbikiCiQhCiQgd3JpdGUgc3lzJG91dHB1dCAiQ29weSBzeXNkZXAuaCIKJCBjb3B5IFsuaG9zdHNdYWxwaGF2bXMuaCBzeXNkZXAuaAokCiQgd3JpdGUgc3lzJG91dHB1dCAiR2VuZXJhdGUgYnVpbGQuY29tIgokIQokIGlmIEFSQ0guZXFzLiJhbHBoYSIKJCB0aGVuCiQgICBjcmVhdGUgYnVpbGQuY29tCiRERUNLCiQgREVGUz0iIiJTRUxFQ1RfVkVDUz0mYWxwaGFfdm1zX3ZlYyIiLCIrLQogICIiIlNFTEVDVF9BUkNISVRFQ1RVUkVTPSZiZmRfYWxwaGFfYXJjaCIiIgokIEZJTEVTPSJjcHUtYWxwaGEsdm1zLHZtcy1oZHIsdm1zLWdzZCx2bXMtdGlyLHZtcy1taXNjLCIKJEVPRAokIGVuZGlmCiQgaWYgQVJDSC5lcXMuImlhNjQiCiQgdGhlbgokICAgY3JlYXRlIGJ1aWxkLmNvbQokREVDSwokIERFRlM9IiIiU0VMRUNUX1ZFQ1M9JmlhNjRfZWxmNjRfdm1zX3ZlYyIiLCIrLQogICIiIlNFTEVDVF9BUkNISVRFQ1RVUkVTPSZiZmRfaWE2NF9hcmNoIiIiCiQgRklMRVM9ImNwdS1pYTY0LGVsZjY0LWlhNjQsZWxmLXN0cnRhYixjb3JlZmlsZSxzdGFicyxtZXJnZSxlbGYtZWgtZnJhbWUsIistCiAgImVsZmxpbmssZWxmLWF0dHJzLGR3YXJmMSxlbGY2NCwiCiRFT0QKJCBjcmVhdGUgc3Vic3R4eC50cHUKJERFQ0sKICAgc2V0IChzdWNjZXNzLG9mZik7CiAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKICAgZm91bmRfcmFuZ2UgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgQkVHSU5OSU5HX09GKGZpbGUpKTsKCiAgIExPT1AKICAgICByYW5nIDo9IENSRUFURV9SQU5HRSAoRU5EX09GKGZvdW5kX3JhbmdlKSxFTkRfT0YoZmlsZSkpOwogICAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnTk4nLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7CiAgICAgRVhJVElGIG1hdGNoX3BvcyA9IDA7CiAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwogICAgIEVSQVNFKG1hdGNoX3Bvcyk7CiAgICAgQ09QWV9URVhUKCc2NCcpOwogICBFTkRMT09QOwogICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwogICBRVUlUCiQgIEVPRAokIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlIGVsZjY0LXRhcmdldC5oIGZyb20gZWxmeHgtdGFyZ2V0LmgiCiQgZWRpdC90cHUvbm9qb3VybmFsL25vc2VjdGlvbi9ub2Rpc3BsYXkvY29tbWFuZD1zdWJzdHh4LnRwdSAtCiAgICAgICAgW11lbGZYWC10YXJnZXQuaCAvb3V0cHV0PVtdZWxmNjQtdGFyZ2V0LmgKJCBkZWwgc3Vic3R4eC50cHU7KgokIGVuZGlmCiQgYXBwZW5kIHN5cyRpbnB1dCBidWlsZC5jb20KJERFQ0sKJCBERUZTPURFRlMgKyAiLCIidW5saW5rPXJlbW92ZSIiLCIiREVCVUdESVI9IiIiIkdOVSRERUJVR0RJUjoiIiIiIiIiCiQgT1BUPSIvbm9vcHQvZGVidWciCiQgQ0ZMQUdTPSIvbmFtZT0oYXNfaXMsc2hvcnRlbmVkKSIgKyAtCiAgIi9pbmNsdWRlPShbXSwiIi4uLyIiLCIiLi4vaW5jbHVkZSIiKSIgKyAtCiAgIi9kZWZpbmU9KCIgKyBERUZTICsgIikiICsgT1BUCiQgRklMRVM9RklMRVMgKyAiYXJjaGl2ZSxhcmNoaXZlNjQsYXJjaHVyZXMsYmZkLGJmZGlvLGJpbmFyeSxjYWNoZSxjb2ZmZ2VuLCIrLQogICJjb21wcmVzcyxjb3JlZmlsZSxkd2FyZjIsZWxmLGZvcm1hdCxoYXNoLGloZXgsaW5pdCxsaWJiZmQsbGlua2VyLCIrLQogICJvcG5jbHMscmVsb2Msc2VjdGlvbixzaW1wbGUsc3JlYyxzdGFiLXN5bXMsc3ltcyx0YXJnZXRzLHRla2hleCx2ZXJpbG9nIgokIHdyaXRlIHN5cyRvdXRwdXQgIkNGTEFHUz0iLENGTEFHUwokIGNmbGFnc19saWJiZmQ9Ii93YXJuaW5nPShkaXNhYmxlPW1pc3NpbmdyZXR1cm4pIgokIGNmbGFnc19uaWw9IiIKJCBOVU0gPSAwCiQgT0JKUz0iIgokIExPT1A6CiQgICBGID0gRiRFTEVNRU5UKE5VTSwiLCIsRklMRVMpCiQgICBJRiBGLkVRUy4iLCIgVEhFTiBHT1RPIEVORAokICAgZWZsYWdzX25hbWU9ImNmbGFnc18nJ2YnIgokICAgbmFtZV9sZW49ZiRsZW5ndGgoZWZsYWdzX25hbWUpCiQgICBkYXNoX3Bvcz1mJGxvY2F0ZSgiLSIsZWZsYWdzX25hbWUpCiQgICBpZiBkYXNoX3Bvcy5uZS5uYW1lX2xlbgokICAgdGhlbgokICAgICBlZmxhZ3NfbmFtZVsnZGFzaF9wb3MsMV06PSJfIgokICAgICBkYXNoX3Bvcz1mJGxvY2F0ZSgiLSIsZWZsYWdzX25hbWUpCiQgICAgIGlmIGRhc2hfcG9zLm5lLm5hbWVfbGVuIHRoZW4gZWZsYWdzX25hbWVbJ2Rhc2hfcG9zLDFdOj0iXyIKJCAgIGVuZGlmCiQgICBpZiBmJHR5cGUoJ2VmbGFnc19uYW1lKS5lcXMuIiIgdGhlbiBlZmxhZ3NfbmFtZT0iY2ZsYWdzX25pbCIKJCAgIGVmbGFncz0nZWZsYWdzX25hbWUKJCAgIHdyaXRlIHN5cyRvdXRwdXQgIkNvbXBpbGluZyAiLCBGLCAiLmMiLCBlZmxhZ3MKJCAgIGNjICdDRkxBR1MgJ2VmbGFncyAnRi5jCiQgICBJRiBPQkpTLk5FUy4iIiBUSEVOIE9CSlM9T0JKUyArICIsIgokICAgT0JKUz1PQkpTICsgRiArICIub2JqIgokICAgTlVNID0gTlVNICsgMQokICAgR09UTyBMT09QCiQgRU5EOgokIHB1cmdlCiQgbGliL2NyZWF0ZSBsaWJiZmQgJ09CSlMKJEVPRAo=