IyEgL2Jpbi9zaAouICIke3NyY2Rpcj0ufS9pbml0LnNoIjsgcGF0aF9wcmVwZW5kXyAuIC4uL3NyYwoKIyBUZXN0IG9mIGdldHRleHQgZmFjaWxpdGllcyBpbiB0aGUgQysrIGxhbmd1YWdlLgojIEFzc3VtZXMgYW4gZnJfRlIgbG9jYWxlIGlzIGluc3RhbGxlZC4KIyBBc3N1bWVzIHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIGluc3RhbGxlZDogZ2NjIGcrKy4KCiMgVGhpcyB0ZXN0IGZhaWxzIGlmIHRoZSBnZXR0ZXh0IHBhY2thZ2Ugd2FzIGNvbmZpZ3VyZWQgd2l0aCAtLWRpc2FibGUtbmxzLAojIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBnZXR0ZXh0LXJ1bnRpbWUvaW50bC8gZGlyZWN0b3J5IGRvZXMgbm90IHByb2R1Y2UKIyBhIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLgoKIyBUZXN0IHdoZXRoZXIgYSBDKysgY29tcGlsZXIgaXMgZm91bmQgYW5kIGxpYmFzcHJpbnRmIGlzIGJ1aWx0Lgp0ZXN0ICIke0NYWH0iICE9ICJubyIgfHwgewogIGVjaG8gIlNraXBwaW5nIHRlc3Q6IG5vIEMrKyBjb21waWxlciBmb3VuZCIKICBFeGl0IDc3Cn0KdGVzdCAiJHtURVNUTElCQVNQUklOVEZ9IiA9IHllcyB8fCB7CiAgZWNobyAiU2tpcHBpbmcgdGVzdDogY29uZmlndXJlZCB3aXRoIC0tZGlzYWJsZS1saWJhc3ByaW50ZiIKICBFeGl0IDc3Cn0KCmNhdCA8PFxFT0YgPiBwcm9nLmNjCiNpbmNsdWRlICJjb25maWcuaCIKCi8qIEF2b2lkIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGZyb20gZysrIDMuMSBvciBuZXdlci4gICovCiNpZiAoZGVmaW5lZCBfX0dOVUdfXyAmJiBkZWZpbmVkIF9fREVQUkVDQVRFRCkgfHwgZGVmaW5lZCBfTVNDX1ZFUgojIGluY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZWxzZQojIGluY2x1ZGUgPGlvc3RyZWFtLmg+CiNlbmRpZgoKI2luY2x1ZGUgPGxpYmludGwuaD4KI2luY2x1ZGUgPGxvY2FsZS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAieHNldGVudi5oIgojaW5jbHVkZSAiYXV0b3NwcmludGYuaCIKdXNpbmcgZ251OjphdXRvc3ByaW50ZjsKI2RlZmluZSBfKHN0cmluZykgZ2V0dGV4dCAoc3RyaW5nKQoKaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICBpbnQgbiA9IGF0b2kgKGFyZ3ZbMl0pOwoKICB4c2V0ZW52ICgiTENfQUxMIiwgYXJndlsxXSwgMSk7CiAgaWYgKHNldGxvY2FsZSAoTENfQUxMLCAiIikgPT0gTlVMTCkKICAgIC8vIENvdWxkbid0IHNldCBsb2NhbGUuCiAgICBleGl0ICg3Nyk7CgogIHRleHRkb21haW4gKCJwcm9nIik7CiAgYmluZHRleHRkb21haW4gKCJwcm9nIiwgIi4iKTsKCiAgY291dCA8PCBfKCInWW91ciBjb21tYW5kLCBwbGVhc2U/JywgYXNrZWQgdGhlIHdhaXRlci4iKSA8PCBlbmRsOwoKICBjb3V0IDw8IGF1dG9zcHJpbnRmIChuZ2V0dGV4dCAoImEgcGllY2Ugb2YgY2FrZSIsICIlZCBwaWVjZXMgb2YgY2FrZSIsIG4pLCBuKQogICAgICAgPDwgZW5kbDsKCiAgY291dCA8PCBhdXRvc3ByaW50ZiAoXygiJXMgaXMgcmVwbGFjZWQgYnkgJXMuIiksICJGRiIsICJFVVIiKSA8PCBlbmRsOwp9CkVPRgoKIyBDb21waWxlIGluIHR3byBzdGVwcyBmcm9tIC5jYyB0byAubyBhbmQgZnJvbSAubyB0byAncHJvZycuIFRoaXMgd2F5LAojIHJlbGlua2luZyBpcyBmYXN0ZXIgYmVjYXVzZSBkb2Vzbid0IG5lZWQgdG8gcmVkbyB0aGUgZmlyc3Qgc3RlcC4KIyBQdXQgdGhlIC1JIGZsYWdzIGJlZm9yZSAke0NYWEZMQUdTfSAke0NQUEZMQUdTfSwgdG8gbWFrZSBzdXJlIHRoYXQgbGliaW50bC5oCiMgaXMgZm91bmQgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgcmVnYXJkbGVzcyBvZiAtSSBvcHRpb25zIHByZXNlbnQgaW4KIyAke0NYWEZMQUdTfSBvciAke0NQUEZMQUdTfS4KJHtDWFh9IC1JLi4vLi4gLUkuLi8uLi8uLi9nZXR0ZXh0LXJ1bnRpbWUvbGliYXNwcmludGYgLUkiJGFic190b3Bfc3JjZGlyIi9nbnVsaWItbGliIC1JLi4vLi4vLi4vZ2V0dGV4dC1ydW50aW1lL2ludGwgJHtDWFhGTEFHU30gJHtDUFBGTEFHU30gLWMgcHJvZy5jYyBcCiAgfHwgRXhpdCAxCiMgUmVtb3ZlIHRoZSAtV2wsLS1kaXNhYmxlLWF1dG8taW1wb3J0IG9wdGlvbiBoZXJlIHRoYXQgaXMgYWRkZWQgYnkKIyB3b2UzMi1kbGwubTQuIEN5Z3dpbiAxLjcuMiBkb2VzIG5vdCBzdXBwb3J0IGl0IGluIEMrKyBtb2RlOiBJdCBnaXZlcwojIGEgbGluayBlcnJvciBhYm91dCAnc3RkOjpjb3V0Jy4KOiAke0NPTkZJR19TSEVMTD0ke1NIRUxMLS9iaW4vc2h9fQoke0NPTkZJR19TSEVMTH0gIiR0b3BfYnVpbGRkaXIiL2xpYnRvb2wgLS1xdWlldCAtLXRhZz1DWFggLS1tb2RlPWxpbmsgXAogICR7Q1hYfSAke0NYWEZMQUdTfSBgZWNobyAiWCAke0xERkxBR1N9ICIgfCBzZWQgLWUgJ3MvXlgvLycgLWUgJ3MvIC1XbCwtLWRpc2FibGUtYXV0by1pbXBvcnQgLyAvJ2AgLW8gcHJvZyBwcm9nLiR7T0JKRVhUfSBcCiAgICAgICAgIC4uLy4uLy4uL2dldHRleHQtcnVudGltZS9saWJhc3ByaW50Zi9saWJhc3ByaW50Zi5sYSBcCiAgICAgICAgIC4uLy4uL2dudWxpYi1saWIvbGliZ2V0dGV4dGxpYi5sYSAke0xUTElCSU5UTH0gXAogIHx8IEV4aXQgMQoKOiAke1hHRVRURVhUPXhnZXR0ZXh0fQoke1hHRVRURVhUfSAtbyBwcm9nLnRtcCAtLW9taXQtaGVhZGVyIC0tbm8tbG9jYXRpb24gLWtfIHByb2cuY2MgfHwgRXhpdCAxCkxDX0FMTD1DIHRyIC1kICdccicgPCBwcm9nLnRtcCA+IHByb2cucG90IHx8IEV4aXQgMQoKY2F0IDw8RU9GID4gcHJvZy5vawptc2dpZCAiJ1lvdXIgY29tbWFuZCwgcGxlYXNlPycsIGFza2VkIHRoZSB3YWl0ZXIuIgptc2dzdHIgIiIKCiMsIGMtZm9ybWF0Cm1zZ2lkICJhIHBpZWNlIG9mIGNha2UiCm1zZ2lkX3BsdXJhbCAiJWQgcGllY2VzIG9mIGNha2UiCm1zZ3N0clswXSAiIgptc2dzdHJbMV0gIiIKCiMsIGMtZm9ybWF0Cm1zZ2lkICIlcyBpcyByZXBsYWNlZCBieSAlcy4iCm1zZ3N0ciAiIgpFT0YKCjogJHtESUZGPWRpZmZ9CiR7RElGRn0gcHJvZy5vayBwcm9nLnBvdCB8fCBFeGl0IDEKCmNhdCA8PFxFT0YgPiBmci5wbwptc2dpZCAiIgptc2dzdHIgIiIKIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCiJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiA+IDEpO1xuIgoKbXNnaWQgIidZb3VyIGNvbW1hbmQsIHBsZWFzZT8nLCBhc2tlZCB0aGUgd2FpdGVyLiIKbXNnc3RyICKrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uIgoKIyBMZXMgZ2F0ZWF1eCBhbGxlbWFuZHMgc29udCBsZXMgbWVpbGxldXJzIGR1IG1vbmRlLgojLCBjLWZvcm1hdAptc2dpZCAiYSBwaWVjZSBvZiBjYWtlIgptc2dpZF9wbHVyYWwgIiVkIHBpZWNlcyBvZiBjYWtlIgptc2dzdHJbMF0gInVuIG1vcmNlYXUgZGUgZ2F0ZWF1Igptc2dzdHJbMV0gIiVkIG1vcmNlYXV4IGRlIGdhdGVhdSIKCiMgUmV2ZXJzZSB0aGUgYXJndW1lbnRzLgojLCBjLWZvcm1hdAptc2dpZCAiJXMgaXMgcmVwbGFjZWQgYnkgJXMuIgptc2dzdHIgIiUyJHMgcmVtcGxhY2UgJTEkcy4iCkVPRgoKOiAke01TR01FUkdFPW1zZ21lcmdlfQoke01TR01FUkdFfSAtcSAtbyBmci5wby50bXAgZnIucG8gcHJvZy5wb3QgfHwgRXhpdCAxCkxDX0FMTD1DIHRyIC1kICdccicgPCBmci5wby50bXAgPiBmci5wby5uZXcgfHwgRXhpdCAxCgo6ICR7RElGRj1kaWZmfQoke0RJRkZ9IGZyLnBvIGZyLnBvLm5ldyB8fCBFeGl0IDEKCnRlc3QgLWQgZnIgfHwgbWtkaXIgZnIKdGVzdCAtZCBmci9MQ19NRVNTQUdFUyB8fCBta2RpciBmci9MQ19NRVNTQUdFUwoKOiAke01TR0ZNVD1tc2dmbXR9CiR7TVNHRk1UfSAtbyBmci9MQ19NRVNTQUdFUy9wcm9nLm1vIGZyLnBvCgo6ICR7RElGRj1kaWZmfQpjYXQgPDxcRU9GID4gcHJvZy5vawqrVm90cmUgY29tbWFuZGUsIHMnaWwgdm91cyBwbGFpdLssIGRpdCBsZSBnYXLnb24uCjIgbW9yY2VhdXggZGUgZ2F0ZWF1CkVVUiByZW1wbGFjZSBGRi4KRU9GCmNhdCA8PFxFT0YgPiBwcm9nLm9rdQrCq1ZvdHJlIGNvbW1hbmRlLCBzJ2lsIHZvdXMgcGxhaXTCuywgZGl0IGxlIGdhcsOnb24uCjIgbW9yY2VhdXggZGUgZ2F0ZWF1CkVVUiByZW1wbGFjZSBGRi4KRU9GCgo6ICR7TE9DQUxFX0ZSPWZyX0ZSfQo6ICR7TE9DQUxFX0ZSX1VURjg9ZnJfRlIuVVRGLTh9CmlmIHRlc3QgJExPQ0FMRV9GUiAhPSBub25lOyB0aGVuCiAgcHJlcGFyZV9sb2NhbGVfIGZyICRMT0NBTEVfRlIKICBMQU5HVUFHRT0gLi9wcm9nICRMT0NBTEVfRlIgMiA+IHByb2cudG1wCiAgY2FzZSAkPyBpbgogICAgMCkgY2FzZSAiJGhvc3Rfb3MiIGluCiAgICAgICAgIG1pbmd3KikgTENfQUxMPUMgdHIgLWQgJ1xyJyA8IHByb2cudG1wID4gcHJvZy5vdXQgfHwgRXhpdCAxIDs7CiAgICAgICAgICopIGNwIHByb2cudG1wIHByb2cub3V0IHx8IEV4aXQgMSA7OwogICAgICAgZXNhYwogICAgICAgJHtESUZGfSBwcm9nLm9rIHByb2cub3V0IHx8IEV4aXQgMTs7CiAgICA3NykgTE9DQUxFX0ZSPW5vbmU7OwogICAgKikgRXhpdCAxOzsKICBlc2FjCmZpCmlmIHRlc3QgJExPQ0FMRV9GUl9VVEY4ICE9IG5vbmU7IHRoZW4KICBwcmVwYXJlX2xvY2FsZV8gZnIgJExPQ0FMRV9GUl9VVEY4CiAgTEFOR1VBR0U9IC4vcHJvZyAkTE9DQUxFX0ZSX1VURjggMiA+IHByb2cudG1wCiAgY2FzZSAkPyBpbgogICAgMCkgY2FzZSAiJGhvc3Rfb3MiIGluCiAgICAgICAgIG1pbmd3KikgTENfQUxMPUMgdHIgLWQgJ1xyJyA8IHByb2cudG1wID4gcHJvZy5vdXQgfHwgRXhpdCAxIDs7CiAgICAgICAgICopIGNwIHByb2cudG1wIHByb2cub3V0IHx8IEV4aXQgMSA7OwogICAgICAgZXNhYwogICAgICAgJHtESUZGfSBwcm9nLm9rdSBwcm9nLm91dCB8fCBFeGl0IDE7OwogICAgNzcpIExPQ0FMRV9GUl9VVEY4PW5vbmU7OwogICAgKikgRXhpdCAxOzsKICBlc2FjCmZpCmlmIHRlc3QgJExPQ0FMRV9GUiA9IG5vbmUgJiYgdGVzdCAkTE9DQUxFX0ZSX1VURjggPSBub25lOyB0aGVuCiAgaWYgdGVzdCAtZiAvdXNyL2Jpbi9sb2NhbGVkZWY7IHRoZW4KICAgIGVjaG8gIlNraXBwaW5nIHRlc3Q6IG5vIGZyZW5jaCBsb2NhbGUgaXMgaW5zdGFsbGVkIgogIGVsc2UKICAgIGVjaG8gIlNraXBwaW5nIHRlc3Q6IG5vIGZyZW5jaCBsb2NhbGUgaXMgc3VwcG9ydGVkIgogIGZpCiAgRXhpdCA3NwpmaQoKRXhpdCAwCg==