I2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKLyohIFxtYWlucGFnZQogKgogKiA8cHJlPgogKiBaWDc1MjBWM8a9zKhBUL3Tv9qjrLD8uqzS1M/CzbfOxLz+o7oKICogc29mdGFwX2FwaS5oo7ogyc+y49Om08O5q7myzbfOxLz+o6zJz7Lj06bTw7+qt6Kw/LqstMvOxLz+vLS/yQogKiBtZXNzYWdlLmijuiAgICC2qNLl06bTw7mrubLP+8+ittPB0GtleSwgz/vPoszlLCDP+8+iw/zB7klELCC3osvNz/vPorXEQVBJvdO/2gogKiBzb2Z0YXBfbG9nLmijuiDJz7Lj06bTw2xvZ8/gudi907/aCiAqIG5ldGFwaS5oo7ogICAgIM34wufEo7/pttTN4rmrubK907/aCiAqIGNmZ19hcGkuaKO6ICAgIEFQsuDTptPDTla2wdC0vdO/2gogKiBzb2Z0X3RpbWVyLmijuiDI7bz+tqjKscb3vdO/2gogKiBydGNfdGltZXIuaDogICBydGO2qMqxxve907/ao6zKtcqxtqjKscb3o6y74bu90NHPtc2zCiAqIGF0X21zZy5oo7ogICAgIGF0X2N0bMSjv+m1xM/7z6JpZLrNz/vPor3hubm2qNLlCiAqIGF0X3JlZy5oo7ogICAgIGF0X2N0bMSjv+m/zbuntsu6zbf+zvG2y9eisuG907/aCiAqIGF0X3V0aWxzLmijuiAgIGF0X2N0bMSjv+nJ+rPJQVS2r9f3wOChorLp0a/A4Mfrx/O8sM/s06a907/aCiAqIHVzZXJfbXNnLmijuiAgIEFUv827p7bLoaK3/s7xtsu/qreiyr7A/bT6wuujrL32uamyzr+8CiAqIDwvcHJlPgogKi8KI2VuZGlmCgovKioKICogQGZpbGUgc29mdGFwX2FwaS5oCiAqIEBicmllZiDJz7Lj06bTw7mrubLNt87EvP6jrMnPsuPTptPDv6q3orD8uqy0y87EvP68tL/JCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNyBTYW5lY2hpcHMgVGVjaG5vbG9neSBDby4sIEx0ZC4KICogQGF1dGhvcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICoKICovCiNpZm5kZWYgX19TT0ZUQVBfQVBJX0hfXwojZGVmaW5lIF9fU09GVEFQX0FQSV9IX18KCiNpbmNsdWRlICJvc190eXBlX2RlZi5oIgojaW5jbHVkZSAienhpY19saXN0LmgiCiNpbmNsdWRlICJjZmdfYXBpLmgiCiNpbmNsdWRlICJydGNfdGltZXIuaCIKI2luY2x1ZGUgInNvZnRfdGltZXIuaCIKI2luY2x1ZGUgIndsYW5faW50ZXJmYWNlLmgiCiNpbmNsdWRlICJ6eGljX2Vycm5vLmgiCiNpbmNsdWRlICJuZXRhcGkuaCIKI2luY2x1ZGUgIm5ldGlvY3RsLmgiCiNpbmNsdWRlICJuZXRvdGhlcmFwaS5oIgojaW5jbHVkZSAiYXRfcmVnLmgiCiNpbmNsdWRlICJhdF91dGlscy5oIgojaW5jbHVkZSAiYXRfbXNnLmgiCiNpbmNsdWRlICJhdF9wZHBfYXBpLmgiCiNpbmNsdWRlICJhdF9vdGhlcl9hcGkuaCIKI2luY2x1ZGUgInNtc19tc2cuaCIKI2luY2x1ZGUgInBiX21zZy5oIgojaW5jbHVkZSAibWFpbmN0bF9tc2cuaCIKI2luY2x1ZGUgIm1taV9tc2cuaCIKI2luY2x1ZGUgIndpZmlfbXNnLmgiCiNpbmNsdWRlICJvdGhlcl9tc2cuaCIKI2luY2x1ZGUgIm1heF9tYWNyby5oIgojaW5jbHVkZSA8c3lzbG9nLmg+CiNpbmNsdWRlICJzb2Z0YXBfbG9nLmgiCiNpbmNsdWRlICJhdWRpb19yZXNfY3RybC5oIgojaW5jbHVkZSAibHFfbXNnLmgiCiNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KI2luY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CgojZGVmaW5lIF9HTlVfU09VUkNFCgovKioKKiBAYnJpZWYgtqjS5ca9zKi07c7zwusKKiAzR1BQserXvEFUw/zB7rXEtO3O88Lrt7bOpzAtMjc3LCA2MDAwLTgwMDAsvt/M5bTtzvPUrdLyv8my6b+0obZaWDI5NzUyMFYzxr3MqEFUw/zB7srWsuEuZG9jobe4vcK8QQoqIEBwYXJhbSBBVF9QQVJTRV9PSwkJCQlwYXJzZV9wYXJhbbLOyv294s721f3ItwoqIEBwYXJhbSBBVEVSUl9aWElDX0VSUgkJCQnW0NDLzqLQvsast6LJ+tLss6OjrMfSzt63qLvWuLSjrNDo0qq9+NDQ1fu7+tbYxvQKKiBAcGFyYW0gQVRFUlJfUEFSQU1fSU5WQUxJRAkJw/zB7rLOyv3PuL3asru21KOs0+u+38zlQVTD/MHuvfS52MGqCiogQHBhcmFtIEFURVJSX05PVF9BTExPV0VECQkJ0+u+38zl0rXO8cH3s8yz5c27o6yy2df3srvUytDtCiogQHBhcmFtIEFURVJSX1BST0NfRkFJTEVECQkJw/zB7rSmwO3Kp7Dco6zK9NPac29mdGFwz7XNs9Lss6OjrMjnz/vPoreiy83Kp7DctcgKKiBAcGFyYW0gQVRFUlJfRFJPUF9NQVJLCQkJy6vS/brFtqrKp9K7uPajrL/JxNzKx7aqtrq6xdTss8m1xMar0sYKKiBAcGFyYW0gQVRFUlJfTk9fUFJJTlQJCQkJ19a3+7SuxNrI3bfHQVNDSUnD987Eo6y/ycTcyse2qra6usXU7LPJtcTGq9LGCiogQHBhcmFtIEFURVJSX1NUUl9UT09fTE9ORwkJCUFTQ0lJ19a3+7SutsHIobXEs6S2yLOsuf294s721Ly2qLXEs6S2yKOsv8nE3MrHzeKyv8rkyOu1xEFUw/zB7rK7us+3qAoqIEBwYXJhbSBBVFdBUk5fRFJPUF9STgkJCQnKtbzK19a3+7Suss7K/bj2yv2089PaZm10uPHKvbuvuPbK/aOsv8nE3MrHtffTw9Xf1ru52NDEsr+31rLOyv2jrNDovffJ97SmwO24w7rq1rUKKiBAcGFyYW0gQVRXQVJOX0xBQ0tfUEFSQU0JCQmwtNXVyOuyzrjxyr1mbXS94s72o6zE2sjdyLHJ2bLOyv2jrNPJ09qyzsr9v8nRoaOsv8nE3MrH1f2zo7XEo6zQ6L33yffKudPDuMO66ta1CiogQHBhcmFtIEFURVJSX01FTV9MRVNTCQkJCdbQ0MvOotC+xqzE2rK/xNq05rK71+PU7LPJzt63qL3TytW1scewQVTD/MHuCiogQHBhcmFtIEFURVJSX1dBSVRfUkVRX0VORF9USU1FT1VUCbXItP3N4rK/yuTI67XEUkVRx+vH88P8we694cr4t/tccrOsyrEKKiBAcGFyYW0gQVRFUlJfV0FJVF9SU1BfVElNRU9VVAkJt6LLzc3qQVTH68fzuvOjrLXItP3UtrbLUlNQ06a08L3hufuzrMqxCiogQHBhcmFtIEFURVJSX0NIQU5ORUxfQlVTWQkJCbWxx7BBVM2otcDV/dTatKbA7UFUx+vH86Os09bK1bW90rvM9UFUx+vH87GotO0KKiBAcGFyYW0gQVRFUlJfVU5LTk9XTl9DTUQJCQnN4rK/yuTI67XEw/zB7rK7v8nKtrHwo6zOqrfHt6i1xEFUw/zB7goqIEBwYXJhbSBBVEVSUl9QQVJBTV9DSEVDS1NVTQkJttTT2r3TytW1vbXEQVTD/MHuss7K/b340NBjaGVja3N1bdCj0enKp7DcCiogQHBhcmFtIEFURVJSX1BQUF9GSUxFX0ZBSUxFRAkJUFBQzsS8/rLZ1/fKp7DcCiogQHBhcmFtIEFURVJSX1BQUF9OT1RfRVhJU1RFRAkJUFBQRLK7tObU2goqIEBwYXJhbSBBVEVSUl9QUFBfV1JPTkdfQ0hBTgkJUFBQzai1wLTtzvMKKiBAcGFyYW0gQVRFUlJfUERQX0lQQUREUl9GQUlMRUQJu/HIoVBEULXY1rfKp7DcCiogQHBhcmFtIFVTRVJfRVhUQU5EX0VSUl9CQVNFCQmzrLn9OTAwMLXEzqrT683isr9NQ1XP4LnYtcS2qNbGtO3O88Lro6zQ6NKqzeKyv01DVdPDu6ewtNXVtO3O88LrvfjQ0M/gudjI3bTttq/X9woqLwplbnVtIFNBUF9FUlIgewogICAgQVRfUEFSU0VfT0sgICAgICAgICAgICAgPSAwLCAgICAgIC8qcGFyc2VfcGFyYW2yzsr9veLO9tX9yLcqLwogICAgQVRFUlJfWlhJQ19FUlIgICAgICAgICAgPSA4MDAwLCAgIC8q1tDQy86i0L7GrLeiyfrS7LOjo6zH0s7et6i71ri0o6zQ6NKqvfjQ0NX7u/rW2Mb0Ki8KICAgIEFURVJSX1BBUkFNX0lOVkFMSUQgICAgID0gODAwMSwgICAvKsP8we6yzsr9z7i92rK7ttSjrNPrvt/M5UFUw/zB7r30udjBqiovCiAgICBBVEVSUl9OT1RfQUxMT1dFRCAgICAgICA9IDgwMDIsICAgLyrT677fzOXStc7xwfezzLPlzbujrLLZ1/eyu9TK0O0qLwogICAgQVRFUlJfUFJPQ19GQUlMRUQgICAgICAgPSA4MDAzLCAgIC8qw/zB7rSmwO3Kp7Dco6zK9NPac29mdGFwz7XNs9Lss6OjrMjnz/vPoreiy83Kp7DctcgqLwogICAgQVRFUlJfRFJPUF9NQVJLICAgICAgICAgPSA4MDA0LCAgIC8qy6vS/brFtqrKp9K7uPajrL/JxNzKx7aqtrq6xdTss8m1xMar0sYqLwogICAgQVRFUlJfTk9fUFJJTlQgICAgICAgICAgPSA4MDA1LCAgIC8q19a3+7SuxNrI3bfHQVNDSUnD987Eo6y/ycTcyse2qra6usXU7LPJtcTGq9LGKi8KICAgIEFURVJSX1NUUl9UT09fTE9ORyAgICAgID0gODAwNiwgICAvKkFTQ0lJ19a3+7SutsHIobXEs6S2yLOsuf294s721Ly2qLXEs6S2yKOsv8nE3MrHzeKyv8rkyOu1xEFUw/zB7rK7us+3qCovCiAgICBBVFdBUk5fRFJPUF9STiAgICAgICAgICA9IDgwMDcsICAgLyrKtbzK19a3+7Suss7K/bj2yv2089PaZm10uPHKvbuvuPbK/aOsv8nE3MrHtffTw9Xf1ru52NDEsr+31rLOyv2jrNDovffJ97SmwO24w7rq1rUqLwogICAgQVRXQVJOX0xBQ0tfUEFSQU0gICAgICAgPSA4MDA4LCAgIC8qsLTV1cjrss648cq9Zm10veLO9qOsxNrI3cixydmyzsr9o6zTydPass7K/b/J0aGjrL/JxNzKx9X9s6O1xKOs0Oi998n3yrnTw7jDuurWtSovCiAgICBBVEVSUl9NRU1fTEVTUyAgICAgICAgICA9IDgwMDksICAgLyrW0NDLzqLQvsasxNqyv8TatOayu9fj1Oyzyc7et6i908rVtbHHsEFUw/zB7iovCiAgICBBVEVSUl9XQUlUX1JFUV9FTkRfVElNRU9VVCA9IDgwMTAsIC8qtci0/c3isr/K5MjrtcRSRVHH68fzw/zB7r3hyvi3+1xys6zKsSovCiAgICBBVEVSUl9XQUlUX1JTUF9USU1FT1VUICA9IDgwMTEsICAgLyq3osvNzepBVMfrx/O686Ostci0/dS2tstSU1DTprTwveG5+7OsyrEqLwogICAgQVRFUlJfQ0hBTk5FTF9CVVNZICAgICAgPSA4MDEyLCAgIC8qtbHHsEFUzai1wNX91Nq0psDtQVTH68fzo6zT1srVtb3Su8z1QVTH68fzsai07SovCiAgICBBVEVSUl9VTktOT1dOX0NNRCAgICAgICA9IDgwMTMsICAgLyrN4rK/yuTI67XEw/zB7rK7v8nKtrHwo6zOqrfHt6i1xEFUw/zB7iovCiAgICBBVEVSUl9QQVJBTV9DSEVDS1NVTSAgICA9IDgwMTQsICAgLyq21NPavdPK1bW9tcRBVMP8we6yzsr9vfjQ0GNoZWNrc3Vt0KPR6cqnsNwqLwogICAgQVRFUlJfUFBQX0ZJTEVfRkFJTEVEICAgPSA4MTAwLCAgIC8qUFBQzsS8/rLZ1/fKp7DcKi8KICAgIEFURVJSX1BQUF9OT1RfRVhJU1RFRCAgID0gODEwMSwgICAvKlBQUESyu7Tm1NoqLwogICAgQVRFUlJfUFBQX1dST05HX0NIQU4gICAgPSA4MTAyLCAgIC8qUFBQzai1wLTtzvMqLwogICAgQVRFUlJfUERQX0lQQUREUl9GQUlMRUQgPSA4MjAwLCAgIC8qu/HIoVBEULXY1rfKp7DcKi8KICAgIFVTRVJfRVhUQU5EX0VSUl9CQVNFICAgID0gOTAwMCwgICAvKrOsuf05MDAwtcTOqtPrzeKyv01DVc/gudi1xLao1sa07c7zwuujrNDo0qrN4rK/TUNV08O7p7C01dW07c7zwuu9+NDQz+C52MjdtO22r9f3Ki8KfTsKCgovKioKICogQGJyaWVmILSmwO3X986qt/7O8bbLtcTK1bW9tcTH68fzw/zB7qGjYXRfcGFyYXPOqkFUw/zB7rLOyv3K17XY1rejrHJzcF9jbWTOqtOmtPC94bn719a3+7Suo6zX986qs/ayzrTm1Nqju9K7sOO1xKOs08O7p9TauMO907/atcS+38zlyrXP1sqxo6wKICogxNqyv7X308NwYXJzZV9wYXJhbb3Tv9q9+NDQss7K/b3izvajrLKiuPm+3be1u9jWtb340NCyzsr909DQp9DUvOyy6aOs0tS3wNa5zeKyv01DVdPrWlhJQ9C+xqy85LXEzu/A7bSuv9rNqNDF0uyzo9Tss8lBVMP8we7K/b7dtO3O86GjCiAqILbU09rNrLK906a08MCp1blBVMfrx/OjrLHY0OvU2r3Tv9rE2rK/zqpyc3BfY21kyerH68TatOa/1bzko6yyoriz1rXW0Lzkyc+xqLrNveG5+8Lro6yyore1u9hBVF9FTkSjuwogKiC21NPa0OjSqreiy824+L/Nu6fTptPDvfizzL340NC0psDttcSjrNPJv827p9Ta16Ky4bqvyv3E2rK/vfjQ0NLssr29u7ulo6yyore1u9hBVF9DT05USU5VRSxhdGN0bNb3v9jX6Mj7tbHHsEFUzai1wKO71rG1vdPDu6e9+LPMtffTwwogKiBzZW5kX3JzcF9zdHJfdG9fZmFycHO907/avavTprTwveG5+7eiy824+GF0Y3Rso6zU2dPJYXRjdGy3osvNuPjN4rK/TUNVo6yyosrNt8VBVM2otcAKICogQHBhcmFtIHJlc19tc2cJCSC1scrHzayyvdOmtPC3vcq9yrGjrMj0KnJlc19tc2eyu86qTlVMTKOs1PLE2sjdzqrTprTwveG5+8Lro6zTyWF0X2N0bLeiy824+M3isr9NQ1W688rNt8VBVM2otcCjuwogCQkJCQkJIMj0KnJlc19tc2fOqk5VTEyjrNPJYXRfY3Rs1rG907vYuLRcclxuT0tcclxut6LLzbj4zeKyv01DVbrzys23xUFUzai1wAogKgkJCQkJCSC1scrH06bTw734s8zS7LK9t73KvbSmwO3KsaOsKnJlc19tc2ex2NDrzqpOVUxMo6y0y8qxu+GzpMqxvOS2wsj716FBVM2otcCjrNax1sHTw7unvfizzLX308NzZW5kX3JzcF9zdHJfdG9fZmFycHO907/aveLX6Mj7QVTNqLXACiAqIEByZXR1cm4gaW500M294bn7wuujrEFUX0VORLHtyr7NrLK906a08Le9yr2ju0FUX0NPTlRJTlVFse3KvtLssr3TprTwt73KvaOs0OjSqtOm08O9+LPM0uyyvb27u6UKICogQG5vdGUKICovCnR5cGVkZWYgaW50ICgqc2VyX3JlcV9mdW5jKShjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKTsKCi8qKgogKiBAYnJpZWYgttTT2snPsahhdMP8we60psDtuq/K/aOssPy6rLLp0a/W0LzkveG5+7rN1ve2r8nPsai1xGF0w/zB7rSmwO0KICoJttTT2nBzz+C52LXE1ve2r8nPsai6zbLp0a/W0LzkveG5+8nPsaijrNK7sOPO3tDovavJz7GoxNrI3beiy824+Mbky/vEo7/p06bTw6Os0vK0y76hwb/KudPDbna6zcirvtax5MG/tcS3vcq9tOa3xQogKgm21NPawKnVuWF0tcTW0LzkveG5+8nPsaijrNK7sOPQ6NKqvauy6dGvveG5+7eiy824+Mbky/vEo7/p06bTw6Ostq/MrMnqx+vE2rTmo6y3xdTaY29udGV4dMnPz8LOxNbQtcRhcHBfcGFyYbHkwb/W0AogKiBAcGFyYW0gYXRfcGFyYXMJQVTD/MHu19a3+7SuCiAqIEBwYXJhbSBpc19xdWVyeV9yZXBvcnQKICogQHJldHVybiBpbnTQzdfWt/u0rgogKi8KCnR5cGVkZWYgaW50ICgqaW5mb3JtX2FjdF9mdW5jKShjaGFyICphdF9wYXJhcywgaW50IGlzX3F1ZXJ5X3JlcG9ydCk7CgoKLyoqCiogQGJyaWVmIL34s8y85M2o0MXP+8+it6LLzb3Tv9qjrMjnufvP+8+ittPB0M60tLS9qKOst7W72MqnsNzWtc6qLTEKKiBAcGFyYW0gc291cmNlX2lkKElOKQk6z/vPoreiy83Eo7/pSUQKKiBAcGFyYW0gdGFyZ2V0X2lkKElOKQk6z/vPor3TytXEo7/pSUQKKiBAcGFyYW0gTXNnX2NtZChJTikgIAk6z/vPosP8we6jrNPD09q908rVxKO/6bSmwO3P+8+iyrGjrMi3tqjP+8+itKbA7bXEt73KvQoqIEBwYXJhbSB1c19EYXRhTGVuKElOKQk6z/vPotbQ0K+0+Mr9vt21xLOktsgKKiBAcGFyYW0gcERhdGEoSU4pCQk6z/vPotbQ0K+0+LXEyv2+3cTayN0KKiBAcGFyYW0gbXNnZmxhZyhJTikJCTrP+8+itcS3osvNt73KvaOsMLHtyr7X6Mj7t6LLzaOsSVBDX05PV0FJVLHtyr63x9foyPu3osvNCiogQHJldHVybiC3osvNs8m5pre1u9gwo6y3osvNyqew3Le1u9i3xzCjrL7fzOW07c7zwODQzcfrss6/vGxpbnV4serXvLXEZXJybm/A4NDNCiogQG5vdGUgt6LLzcqnsNyjrNOm08PF0LbPZXJybm8gPT0gRU5PRU5ULCCx7cq+ttPB0ML6o7vI9L3TytW3vdK7tqi74bG7xvS2r6Ost6LLzbe9v8m8zND4tffTw2lwY19zZW5kX21zZzK907/aCiovCmludCBpcGNfc2VuZF9tZXNzYWdlKGludCBzcmNfaWQsIGludCBkc3RfaWQsIHVuc2lnbmVkIHNob3J0IE1zZ19jbWQsIHVuc2lnbmVkIHNob3J0IHVzX0RhdGFMZW4sIHVuc2lnbmVkIGNoYXIgKnBEYXRhLCBpbnQgbXNnZmxhZyk7CgovKioKKiBAYnJpZWYgvfizzLzkzajQxc/7z6K3osvNvdO/2qOsyOe908rV06bTw9K7tqi74cb0tq/KsaOst6LLzbe9tffTw7jDvdO/2qOsyOe5+8/7z6K208HQzrS0tL2oo6y74dfUtq+0tL2oz/vPorbTwdAKKiBAcGFyYW0gc291cmNlX2lkKElOKQk6z/vPoreiy83Eo7/pSUQKKiBAcGFyYW0gdGFyZ2V0X2lkKElOKQk6z/vPor3TytXEo7/pSUQKKiBAcGFyYW0gTXNnX2NtZChJTikgIAk6z/vPosP8we6jrNPD09q908rVxKO/6bSmwO3P+8+iyrGjrMi3tqjP+8+itKbA7bXEt73KvQoqIEBwYXJhbSB1c19EYXRhTGVuKElOKQk6z/vPotbQ0K+0+Mr9vt21xLOktsgKKiBAcGFyYW0gcERhdGEoSU4pCQk6z/vPotbQ0K+0+LXEyv2+3cTayN0KKiBAcGFyYW0gbXNnZmxhZyhJTikJCTrP+8+itcS3osvNt73KvaOsMLHtyr7X6Mj7t6LLzaOsSVBDX05PV0FJVLHtyr63x9foyPu3osvNCiogQHJldHVybiC3osvNs8m5pre1u9gwo6y3osvNyqew3Le1u9i3xzCjrL7fzOW07c7zwODQzcfrss6/vGxpbnV4serXvLXEZXJybm/A4NDNCiogQG5vdGUgtMu907/a08PT2s/7z6Kyu9e8tqrKp7XEs6G+sKOsvLQ6IMS/serTptPD0ru2qLvhxvS2r7SmwO20y8/7z6KjrLWr09DKsbTm1Nq3osvNz/vPosqxxL+x6tOm08PJ0M60xvS2rwoqICAgICAgIMjnOiC/qrv6s/XKvLuvyrHSu9CpzNjK4s/7z6LI58jIsuWwzsrCvP7Jz7Gotvi908rV06bTw8nQzrTG9Lavo6y908rVttPB0MnQzrS0tL2oCiovCmludCBpcGNfc2VuZF9tZXNzYWdlMihpbnQgc3JjX2lkLCBpbnQgZHN0X2lkLCB1bnNpZ25lZCBzaG9ydCBNc2dfY21kLCB1bnNpZ25lZCBzaG9ydCB1c19EYXRhTGVuLCB1bnNpZ25lZCBjaGFyICpwRGF0YSwgaW50IG1zZ2ZsYWcpOwoKCi8qKgogKiBAYnJpZWYgQVTD/MHuveLO9r3Tv9oKICogQHBhcmFtIGZtdCBBVMfrx/O78s/s06a1xLjxyr27r7e9yr0KICogQHBhcmFtIGJ1ZiAgQVTH68fzu/LP7NOmtcTX1rf7tK7WuNXrsru6rM23sr+6zb/VuPEKICogQHBhcmFtIHB2YWwJuPHKvbuvuvO1xEFUw/zB7gogKiBAcmV0dXJuIDCx7cq+veLO9rLOyv3V/bOjo6yyu7340NCyzsr9uPbK/bXE09DQp9DUvOyy6aOsvt/M5be1u9jWtbLOv7S4w823zsS8/lNBUF9FUlLDtr7ZwODQzdbQQVRfUEFSU0VfT0u1yLrq1rUKICogQG5vdGUgIAogKiAxLiC94s72tcRBVMP8we6x2NDrsLTV1TNHUFAyNzAwN7Hq17zQrdLpo6yyzsr90tS2urrFuPS/qqOs19a3+7Su0Oi0+Mur0v26xaOst/HU8rvhts/R1AogKiAyLiDX1rf7tK694s72yrG1xMjrss6zpLbIsdjQ67Tz09q/ycTcveKz9rXE19a3+7Sus6S2yKOst/HU8rvh1L295wogKiAzLiC3tbvY1rXH67LOv7zDtr7ZZW51bSBTQVBfRVJSLLK7vfjQ0LLOyv249sr9tcTT0NCn0NS87LLpCiAqIDQuIMj0Zm101ri2qLXEss7K/cDg0M2x2NDr0+twdmFs1tDWuNXrtcTSu9K7ttTTpgogKiA1LiDKvsD9CjxwcmU+CgljaGFyIGJ1ZltdPSIxLDIsXCJ0ZXN0XCIiOwoJaW50IG4xID0gMDsKCWludCBuMiA9IDA7CgljaGFyICpuMyA9IG1hbGxvYyhzdHJsZW4oYnVmKSk7CgljaGFyICpwW10gPSB7Jm4xLCZuMixuM307CglyZXQgPSBwYXJzZV9wYXJhbSgiJWQsJWQsJXMiLCBidWYsICh2b2lkKiopcCk7CgkvL73izva6824xPT0xIG4yPT0yIG4zPT0idGVzdCIJIAoJcmV0ID0gcGFyc2VfcGFyYW0oIiU0ZCwlZCwlM3MiLCBidWYsICh2b2lkKiopcCk7CgkvL73izva6824xPT0xIG4yPT0yIG4zPT0idGUiCSAKPC9wcmU+CiAqIEB3YXJuaW5nIAogKi8KaW50ICBwYXJzZV9wYXJhbShjaGFyICpmbXQsIGNoYXIgKmJ1Ziwgdm9pZCAqKnB2YWwpOwoKCi8qKgogKiBAYnJpZWYg06bTw7eiy822r9f3wOC78rLp0a/A4EFUx+vH87j4M0dQUNCt0unVu6OssqLX6Mj7tci0/bav1/e94bn7o7vXotLio7q4w73Tv9rWu8Tc08PT2rLp0a+6zcno1sO6zda00NDH68fzo6zNqLn9yOuyzr340NDW0LzkveG5+7XExNqyv73izva0psDto6yyosfSCgkJICDT0NbQvOS94bn7yc+xqMqxo6zWu9ans9bSu8z11tC85L3hufu1xMnPsai94s72o7sKICogQHBhcmFtIHJlcV9hdCAgx+vH80FUw/zB7qOstPPQodC0w/S40KOssdjQ67Tz0LQKICogQHBhcmFtIGluZm9fZm10IEFUz+zTprXEuPHKvbuvt73KvQogKiBAcGFyYW0gcHZhbAm48cq9u6+687XEQVTP7NOmo6y+38zlyrnTw7LOv7RwYXJzZV9wYXJhbb3Tv9oKICogQHJldHVybiAwse3Kvre1u9izybmmo6zG5Mv71rWx7cq+yqew3LTtzvPC6wogKiBAbm90ZSAgCiAqIDEuINPDu6fKudPDyrGjrMj0srvP69PJuMO907/axNqyv7340NCyzsr9tcS48cq9u6+94s72o6y/ydLUvatpbmZvX2ZtdLiz1rXOqiIlcyKjrHB2YWy4s9a1zqpjaGFyICoqcMur1rjV66Os1eLR+bLOyv29q9f3zqrV+8zl19a3+7Sut7W72Lj4tffTw9XfCiAqIDIuILbU09paTUdMLENQQlIsIENPUFM9P7XI0rvM9cfrx/O74dPQtuDM9dbQvOS94bn7x+m/9qOsuMO6r8r9srvKytPDCiAqIDMuINfWt/u0rr3izvbKsbXEyOuyzrOktsix2NDrtPPT2r/JxNy94rP2tcTX1rf7tK6zpLbIo6y38dTyu+HUvb3nCiAqIDQuILWxtObU2tbQvOTJz7GoyrGjrHB2YWy6zWluZm9fZm10srvOqr/Vo7u1sc6q1tC85MnPsajKsaOswb249rHY0Ou91M6qv9UKICogNS4gcHZhbLrNaW5mb19mbXTBvdXf0qrDtLa8zqpOVUxMLNKqw7S2vLK7zqpOVUxMo6yyu8TctObU2sbk1tDSu7j2zqpOVUxMo6zB7dK7uPayu86qTlVMTLXEx+m/9gogKiA2LiDKvsD9CjxwcmU+CglpbnQgcmV0ID0gMDsKCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtDRlVOPTFcciIsIE5VTEwsICBOVUxMKTsKCS8vt7W72Ly0se3Kvta00NCzybmmCgoJY2hhciAqcHN0ciA9IG1hbGxvYyg1MCk7CgltZW1zZXQocHN0ciwwLDUwKTsKCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtDSU1JXHIiLCAiJXMiLCAgKHZvaWQqKikmcHN0cik7CgkvL7e1u9i683BzdHI9PTExMTExMTExMTExMTExMQoKCWludCBuMSA9IDA7CglpbnQgbjIgPSAwOwoJaW50IG4zID0gMDsKCWNoYXIgKnAyW10gPSB7Jm4xLCZuMiwmbjN9OwoJcmV0ID0gZ2V0X21vZGVtX2luZm8oIkFUK0NDSU9UT1BUP1xyIiwgIiVkLCVkLCVkIiwJKHZvaWQqKilwMik7CgkvLytDQ0lPVE9QVDogMSwyLDO94s72uvNuMT09MSBuMj09MiBuMz09Mwo8L3ByZT4KICogQHdhcm5pbmcgCiAqLwppbnQgIGdldF9tb2RlbV9pbmZvKGNoYXIgKnJlcV9hdCxjaGFyICppbmZvX2ZtdCx2b2lkICoqcHZhbCk7CgoKLyoqCiAqIEBicmllZiDTptPDt6LLzbav1/fA4LvysunRr8DgQVTH68fzuPjN4rK/TUNVo6yyotfoyPu1yLT9tq/X973hufujrNa71qez1tK7zPXW0LzkveG5+7XEyc+xqL3izvajuwogKiDTydPatK6/2s2o0MW05tTatqrK/b7dv8nE3KOsvOyy4rW91tC85MnPsai78tOmtPC94bn709C07c7zyrGjrLvhvfjQ0NbYt6KzosrUo6zEv8ew1ti3ojO0zrrzu+G2z9HUo7sKICogwKnVuUFUw/zB7rao0uW1xLTtzvPC67Osuf05MDAwo6yyu7340NDW2Leis6LK1AogKiBAcGFyYW0gcmVxX2F0ICDH68fzQVTD/MHuo6y089Ch0LTD9LjQo6yx2NDrtPPQtAogKiBAcGFyYW0gbGVuICAgICDH68fzQVTD/MHutcSzpLbICiAqIEBwYXJhbSBpbmZvX2ZtdCBBVM/s06a1xLjxyr27r7e9yr0KICogQHBhcmFtIHB2YWwJuPHKvbuvuvO1xEFUz+zTpqOso6y+38zlyrnTw7LOv7RwYXJzZV9wYXJhbb3Tv9oKICogQHBhcmFtIHNhZmVfcGFybV9jaGVjawnWuMq+yse38bbUss7K/bj2yv29+NDQ0rvWwtDUvOyy6aOsMLHtyr66rL/J0aGyzsr9o6yyu7bUss7K/bj2yv29+NDQvOyy6Tsxse3KvrbUss7K/bj2yv29+NDQ0c+48bzssukKICogQHBhcmFtIHRpbWVvdXQgdGltZW91dD09MCCx7cq+08C+w7XItP294bn7wuujrLfx1PK1yLT9yrG85M6qW3RpbWVvdXRdw+sKICogQHJldHVybiAwse3Kvre1u9izybmmo6zG5Mv71rWx7cq+yqew3LTtzvPC6wogKiBAbm90ZSAgCiAqIDEuINPDu6fKudPDyrGjrMj0srvP69PJuMO907/axNqyv7340NCyzsr9tcS48cq9u6+94s72o6y/ydLUvatpbmZvX2ZtdLiz1rXOqiIlcyKjrHB2YWy4s9a1zqpjaGFyICoqcMur1rjV66Os1eLR+bLOyv29q9f3zqrV+8zl19a3+7Sut7W72Lj4tffTw9XfCiAqIDIuILbU09paTUdMLENQQlIsIENPUFM9P7XI0rvM9cfrx/O74dPQtuDM9dbQvOS94bn7x+m/9qOsuMO6r8r9srvKytPDCiAqIDMuINfWt/u0rr3izvbKsbXEyOuyzrOktsix2NDrtPPT2r/JxNy94rP2tcTX1rf7tK6zpLbIo6y38dTyu+HUvb3nCiAqIDQuILWxtObU2tbQvOTJz7GoyrGjrHB2YWy6zWluZm9fZm10srvOqr/Vo7u1sc6q1tC85MnPsajKsaOswb249rHY0Ou91M6qv9UKICogNS4gcHZhbLrNaW5mb19mbXTBvdXf0qrDtLa8zqpOVUxMLNKqw7S2vLK7zqpOVUxMo6yyu8TctObU2sbk1tDSu7j2zqpOVUxMo6zB7dK7uPayu86qTlVMTLXEx+m/9gogKiA2LiDKvsD9CjxwcmU+CglpbnQgcmV0ID0gMDsKCXJldCA9IHNlbmRfcmVxYXRfdG9fZmFycHMoIkFUK0NGVU49MVxyIiwgTlVMTCwgIE5VTEwsIDApOwoJLy+3tbvYvLSx7cq+1rTQ0LPJuaYKCgljaGFyICpwc3RyID0gbWFsbG9jKDUwKTsKCW1lbXNldChwc3RyLDAsNTApOwoJcmV0ID0gc2VuZF9yZXFhdF90b19mYXJwcygiQVQrQ0lNSVxyIiwgIiUzcyIsICAodm9pZCoqKSZwc3RyLCAzMDAwKTsKCS8vt7W72LrzcHN0cj09MTExMTExMTExMTExMTExLCBwc3Ry1tDX1rf7yv3Ev9futPPOqjIKCglpbnQgbjEgPSAwOwoJaW50IG4yID0gMDsKCWludCBuMyA9IDA7CgljaGFyICpwMltdID0geyZuMSwmbjIsJm4zfTsKCXJldCA9IHNlbmRfcmVxYXRfdG9fZmFycHMoIkFUK0NDSU9UT1BUP1xyIiwgIiVkLCVkLCVkIiwJKHZvaWQqKilwMiwgNTAwMCk7CgkvLytDQ0lPVE9QVDogMSwyLDO94s72uvNuMT09MSBuMj09MiBuMz09MyzX7rTztcjKsbzkzqo1MDAwbXMKPC9wcmU+CiAqIEB3YXJuaW5nIAogKi8KaW50ICBzZW5kX3JlcWF0X3RvX2ZhcnBzKGNoYXIgKnJlcV9hdCxpbnQgbGVuLGNoYXIgKmluZm9fZm10LHZvaWQgKipwdmFsLCBpbnQgc2FmZV9wYXJtX2NoZWNrLCBpbnQgdGltZW91dCk7CgoKLyoqCiAqIEBicmllZiDTw9Pav6q7+teisuHL+dPQtcS3/s7xtsu+38zlQVTD/MHuysK8/qOss6PTw9Payc+y47ywv827p7ao1sajrLK717zTw9PaUFPQrdLp1buhowogKiBAcGFyYW0gYXRfY21kX3ByZWZpeAkgQVTD/MHux7DXuta41esKICogQHBhcmFtIG1vZHVsZV9pZCAgICAgINS0xKO/6bbTwdBpZAogKiBAcGFyYW0gcmVxX3Jjdl9hY3QgICAgvt/M5bqs0uWyzrz7dHlwZWRlZiBpbnQgKCpzZXJfcmVxX2Z1bmMpKGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2cpvdO/2su1w/cKICogQHJldHVybiBpbnTQzb3hufvC6wogKiBAcmV0dmFsILPJuaYgMAogKiBAbm90ZSC4w9eisuG6r8r90+tyZWdpc3Rlcl9zZXJ2X2Z1bmMytcTH+LHwysfI67LO1rvT0GF0X2NtZF9wcmVmaXihom1vZHVsZV9pZLrNcmVxX3Jjdl9hY3QKICogIGF0X2N0bMrVtb1BVMP8we6686OstffTw9eisuG1xHJlcV9yY3ZfYWN0o6xhdF9jdGzE3Le1u9i0psDtveG5+6Os1rG9072rveG5+8Lrt6LLzbj4zeKyv01DVaOsCiC38dTyo6zK1bW9zeKyv7eiy821xEFUx+vH86Oszai5/c/7z6JNU0dfQ01EX1NFTkRfUkVRX1RPX0FQULeiy824+NOm08OjrCAKINOm08O0psDtuvPNqLn9tffTw7qvyv1zZW5kX3JzcF9zdHJfdG9fZmFycHOjrNPJYXRfY3RsvavTprTwveG5+7eiy821vc3isr9NQ1UKICovCmludCAgcmVnaXN0ZXJfc2Vydl9mdW5jKGNoYXIgKmF0X2NtZF9wcmVmaXgsIGludCAgbW9kdWxlX2lkLCBzZXJfcmVxX2Z1bmMgcmVxX3Jjdl9hY3QpOwoKCi8qKgogKiBAYnJpZWYg16Ky4cnPsahBVMP8we61xMrCvP60psDto6yw/MCosunRr9bQvOS94bn7yc+xqLrN1ve2r8nPsaihowogKiBAcGFyYW0gYXRfY21kX3ByZWZpeAkgQVTD/MHux7DXuta41esKICogQHBhcmFtIGluZm9ybV9hY3QgICAgIL3TytW1vUFUw/zB7tbQvOS94bn7us3W97avyc+xqLrztcS0psDtuq/K/QogKiBAcmV0dXJuIGludNDNveG5+8LrCiAqIEByZXR2YWwgs8m5piAwLCDKp7DcIC0xCiAqIEBub3RlIM/gzay1xMP8we7HsNe6v8nS1NbYuLTXorLhtuC49qOsYXRfY3Rsv/K83NTaytW1vdb3tq/Jz7Gou/LW0LzkveG5+8qxo6yx6cD6wbSx7aOsw7+49ta00NC6r8r9try74da00NDSu7HpoaMKICog1eLR+aOsyOe5+8rH1tC85L3hufujrL7Nv8nE3LG7tbGzydb3tq/Jz7Goyc+xqLj406bTw6Os08nTptPDuf3Cy87e0Ke1xNb3tq/Jz7Goz/vPogogKi8KaW50ICByZWdpc3Rlcl9pbmZvcm1fZnVuYyhjaGFyICphdF9jbWRfcHJlZml4LCBpbmZvcm1fYWN0X2Z1bmMgaW5mb3JtX2FjdCk7CgoKLyoqCiAgKiBAYnJpZWYgt/7O8bbL06bTw7PM0PKjrLeiy83W0LzkveG5+7rNz+zTprW9zeKyv01DVQogICogQHBhcmFtIG1vZHVsZV9pZAkgINOm08PEo7/pttPB0GlkCiAgKiBAcGFyYW0gcnNwX2NtZAkJICC0/beiy821vc3isr9NQ1W1xMr9vt0KICAqIEBwYXJhbSByc3BfbGVuCQkgIMP8we6zpLbICiAgKiBAcmV0dXJuIGludNDNveG5+8LrCiAgKiBAcmV0dmFsILPJuaYgMCwgyqew3CAtMQogICogQG5vdGUgCiAgKi8KaW50IHNlbmRfcnNwX3N0cl90b19mYXJwcyhpbnQJbW9kdWxlX2lkLCBjaGFyICpyc3BfY21kLGludCByc3BfbGVuKTsKCgovKioKICogQGJyaWVmIMn6s8lhdM/s06a94bn7RVJST1K6r8r9CiAqIEBwYXJhbSBwYXJhbSAgRVJST1K1xLTtzvPC6wogKiBAcmV0dXJuIGF0z+zTpr3huftFUlJPUtfWt/u0rrXE1rjV6wogKiBAbm90ZSDTyWF0X2N0bLi61PDKzbfFxNq05gogKi8KY2hhciogYXRfZXJyX2J1aWxkKGludCBwYXJhbSk7CgovKioKICogQGJyaWVmILeixvC52Lv6x+vH8wogKiBAcGFyYW0gc3JjX2lkILeixvC3vcSjv+lpZKOszrTJ6sfrv8nS1MzuMAogKiBAcmV0dXJuILeiy8294bn7o6wws8m5pqOst8cwyqew3AogKi8KaW50IHBvd2Vyb2ZmX3JlcXVlc3QoaW50IHNyY19pZCk7CgovKioKICogQGJyaWVmILeixvDW2Mb0x+vH8wogKiBAcGFyYW0gc3JjX2lkILeixvC3vcSjv+lpZKOszrTJ6sfrv8nS1MzuMAogKiBAcmV0dXJuILeiy8294bn7o6wws8m5pqOst8cwyqew3AogKi8KaW50IHJlc3RhcnRfcmVxdWVzdChpbnQgc3JjX2lkKTsKCi8qKgogKiBAYnJpZWYgt6LG8LvWuLSz9rOnyejWw8frx/MKICogQHBhcmFtIHNyY19pZCC3osbwt73Eo7/paWSjrM60yerH67/J0tTM7jAKICogQHJldHVybiC3osvNveG5+6OsMLPJuaajrLfHMMqnsNwKICovCmludCByZXNldF9yZXF1ZXN0KGludCBzcmNfaWQpOwoKI2lmbmRlZiBET1hZR0VOX1NIT1VMRF9TS0lQX1RISVMKLyoqCiogQGJyaWVmIL34s8y85M2o0MXP+8+it6LLzb3Tv9oKKiBAcGFyYW0gcG9zaXRpb24oSU4pCTrP+8+it6LLzbe9z/IKKiBAcGFyYW0gbXNnX2NtZChJTikJOs/7z6LD/MHuo6zTw9PavdPK1cSjv+m0psDtz/vPosqxo6zIt7aoz/vPorSmwO21xLe9yr0KKiBAcGFyYW0gbGVuKElOKSAgCSAgICA6z/vPorbU06a94bm5zOXK/b7ds6S2yAoqIEBwYXJhbSBtc2coSU4pCSAJOs/7z6K21NOmveG5uczlyv2+3QoqIEByZXR1cm4gt6LLzbPJuaa3tbvYMKOst6LLzcqnsNy3tbvYt8cwo6y+38zltO3O88Dg0M3H67LOv7xsaW51eLHq17y1xGVycm5vwODQzQoqIEBub3RlIMnmvLC6y7z1z/vPorSrtd2jrL32xNqyv8q508OhowoqLwppbnQgc2VuZF9zb2NfbXNnKHVuc2lnbmVkIHNob3J0IHBvc2l0aW9uLCBpbnQgZHN0X2lkLCB1bnNpZ25lZCBzaG9ydCBtc2dfY21kLCB1bnNpZ25lZCBzaG9ydCBsZW4sIHZvaWQgKm1zZyk7CgovKioKKiBAYnJpZWYgvfizzLzkzajQxbywusu85M2o0MXP+8+it6LLzc2o08O907/aCiogQHBhcmFtIHNyY19pZChJTikJCTrP+8+it6LLzcSjv+lJRAoqIEBwYXJhbSBkc3RfaWQoSU4pCQk6z/vPor3TytXEo7/pSUQKKiBAcGFyYW0gbXNnX2NtZChJTikJOs/7z6LD/MHuo6zTw9PavdPK1cSjv+m0psDtz/vPosqxo6zIt7aoz/vPorSmwO21xLe9yr0KKiBAcGFyYW0gZGF0YWxlbihJTikJOs/7z6K21NOmveG5uczlyv2+3bOktsgKKiBAcGFyYW0gcERhdGEoSU4pCQk6z/vPorbU06a94bm5zOXK/b7dCiogQHJldHVybiC3osvNs8m5pre1u9gwo6y3osvNyqew3Le1u9i3xzCjrL7fzOW07c7zwODQzcfrss6/vGxpbnV4serXvLXEZXJybm/A4NDNCiogQG5vdGUgyea8sLrLvPXP+8+itKu13aOsvfbE2rK/yrnTw6GjCiovCmludCBwbGF0Zm9ybV9zZW5kX21zZyhpbnQgc3JjX2lkLCBpbnQgZHN0X2lkLCB1bnNpZ25lZCBzaG9ydCBtc2dfY21kLCB1bnNpZ25lZCBzaG9ydCBkYXRhbGVuLCB1bnNpZ25lZCBjaGFyICpwRGF0YSk7CgovKioKKiBAYnJpZWYgICDGvcyoxNq07c7zuPrX2QoqIEBwYXJhbSAgIGVycihJTik6CiogQHJldHVybgoqLwp2b2lkIHp4aWNfZXJyX3RyYWNrKGludCBlcnIpOwoKLyoqCiogQGJyaWVmICAgILzssunErMjPwrfTycrHt/HF5NbDs8m5pgoqIEByZXR1cm4gIMXk1sOzybmmt7W72DEsILK7s8m5pre1u9gtMQoqLwppbnQgZGVmYXVsdF9yb3V0ZV9jaGVjaygpOwoKZXh0ZXJuIGxvbmcgbG9uZyBpbnQgZ2V0X3RpbWVfdXMoKTsKCmV4dGVybiBpbnQgc29mdF9zeXN0ZW0oY29uc3QgY2hhciAqY29tbWFuZCk7CgojZW5kaWYKCi8qKgoqYnJpZWYgCbvxyKHPtc2zxvS2r8qxvOQKKnJldHVybiC3tbvYz7XNs9fUv6q7+rW9z9bU2rXEyrG85LzkuPSjrLWlzrvOqsPrCiovCmxvbmcgZ2V0X3N5c191cHRpbWUoKTsKCiNlbmRpZgo=