LyoKICogbG9nZ2luZy5jIC0gZ2VuZXJpYyBsb2dnaW5nIGZvciBzbm1wLWFnZW50CiAqICogQ29udHJpYnV0ZWQgYnkgUmFnbmFyIEtq+HJzdGFkLCB1Y2RAcmFnbmFyay52ZXN0ZGF0YS5ubyAxOTk5LTA2LTI2IAogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qKiBAZGVmZ3JvdXAgc25tcF9sb2dnaW5nIGdlbmVyaWMgbG9nZ2luZyBmb3IgbmV0LXNubXAgCiAqICBAaW5ncm91cCBsaWJyYXJ5CiAqIAogKiAgQHsKICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWZlYXR1cmVzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaWYgSEFWRV9NQUxMT0NfSAojaW5jbHVkZSA8bWFsbG9jLmg+CiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8Y3R5cGUuaD4KI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWYgSEFWRV9TWVNMT0dfSAojaW5jbHVkZSA8c3lzbG9nLmg+CiNpZm5kZWYgTE9HX0NPTlMgICAgICAgICAgICAgICAgLyogSW50ZXJlc3RpbmcgVWx0cml4IGZlYXR1cmUgKi8KI2luY2x1ZGUgPHN5cy9zeXNsb2cuaD4KI2VuZGlmCiNlbmRpZgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2xvZ2dpbmcuaD4gICAgICAvKiBGb3IgdGhpcyBmaWxlJ3MgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwojaW5jbHVkZSA8bmV0LXNubXAvY29uZmlnX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojZGVmaW5lIExPR0xFTkdUSCAxMDI0CgojaWZkZWYgdmFfY29weQojZGVmaW5lIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKI2Vsc2UKI2lmZGVmIF9fdmFjb3B5CiNkZWZpbmUgdmFjb3B5IF9fdmFjb3B5CiNkZWZpbmUgTkVFRF9WQV9FTkRfQUZURVJfVkFfQ09QWQojZWxzZQojZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSBtZW1jcHkgKCZkZXN0LCAmc3JjLCBzaXplb2YgKHZhX2xpc3QpKQojZW5kaWYKI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobG9nZ2luZ19hbGwsIGxpYm5ldHNubXApCgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobG9nZ2luZ19vdXRwdXRzLCBsb2dnaW5nX2FsbCkKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGxvZ2dpbmdfZmlsZSwgbG9nZ2luZ19vdXRwdXRzKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobG9nZ2luZ19zdGRpbywgbG9nZ2luZ19vdXRwdXRzKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobG9nZ2luZ19zeXNsb2csIGxvZ2dpbmdfb3V0cHV0cykKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGxvZ2dpbmdfZXh0ZXJuYWwsIGxvZ2dpbmdfYWxsKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGVuYWJsZV9zdGRlcnJsb2csIGxvZ2dpbmdfYWxsKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGxvZ2dpbmdfZW5hYmxlX2NhbGxsb2csIG5ldHNubXBfdW51c2VkKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YobG9nZ2luZ19lbmFibGVfbG9naGFuZGxlciwgbmV0c25tcF91bnVzZWQpCgovKiBkZWZhdWx0IHRvIHRoZSBmaWxlL3N0ZGlvL3N5c2xvZyBzZXQgKi8KbmV0c25tcF9mZWF0dXJlX3dhbnQobG9nZ2luZ19vdXRwdXRzKQoKLyoKICogbG9naF9oZWFkOiAgQSBsaXN0IG9mIGFsbCBsb2cgaGFuZGxlcnMsIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgcHJpb3JpdHkKICogbG9naF9wcmlvcml0aWVzOiAgJ0luZGV4ZXMnIGludG8gdGhpcyBsaXN0LCBieSBwcmlvcml0eQogKi8KbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naF9oZWFkID0gTlVMTDsKbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naF9wcmlvcml0aWVzW0xPR19ERUJVRysxXTsKc3RhdGljIGludCAgbG9naF9lbmFibGVkID0gMDsKCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwpzdGF0aWMgY2hhciBzeXNsb2duYW1lWzY0XSA9IERFRkFVTFRfTE9HX0lEOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRyAqLwoKdm9pZApuZXRzbm1wX2Rpc2FibGVfdGhpc19sb2doYW5kbGVyKG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2gpCnsKICAgIGlmICghbG9naCB8fCAoMCA9PSBsb2doLT5lbmFibGVkKSkKICAgICAgICByZXR1cm47CiAgICBsb2doLT5lbmFibGVkID0gMDsKICAgIC0tbG9naF9lbmFibGVkOwogICAgbmV0c25tcF9hc3NlcnQobG9naF9lbmFibGVkID49IDApOwp9Cgp2b2lkCm5ldHNubXBfZW5hYmxlX3RoaXNfbG9naGFuZGxlcihuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doKQp7CiAgICBpZiAoIWxvZ2ggfHwgKDAgIT0gbG9naC0+ZW5hYmxlZCkpCiAgICAgICAgcmV0dXJuOwogICAgbG9naC0+ZW5hYmxlZCA9IDE7CiAgICArK2xvZ2hfZW5hYmxlZDsKfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRQp2b2lkCm5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCwgaW50IGRvbnRfemVyb19sb2cpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUgKi8KCiNpZm5kZWYgSEFWRV9WU05QUklOVEYKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBOZWVkIHRvIHVzZSB0aGUgVUNELXByb3ZpZGVkIG9uZSAKICAgICAgICAgICAgICAgICAqLwppbnQgICAgICAgICAgICAgdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICpmbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmcpOwojZW5kaWYKCnZvaWQKcGFyc2VfY29uZmlnX2xvZ09wdGlvbihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY3B0cikKewogIGludCBteV9hcmdjID0gMCA7CiAgY2hhciAqKm15X2FyZ3YgPSBOVUxMOwoKICBzbm1wX2xvZ19vcHRpb25zKCBjcHRyLCBteV9hcmdjLCBteV9hcmd2ICk7Cn0KCnZvaWQKaW5pdF9zbm1wX2xvZ2dpbmcodm9pZCkKewogICAgbmV0c25tcF9kc19yZWdpc3Rlcl9wcmVtaWIoQVNOX0JPT0xFQU4sICJzbm1wIiwgImxvZ1RpbWVzdGFtcCIsIAoJCQkgTkVUU05NUF9EU19MSUJSQVJZX0lELCBORVRTTk1QX0RTX0xJQl9MT0dfVElNRVNUQU1QKTsKICAgIHJlZ2lzdGVyX3ByZW5ldHNubXBfbWliX2hhbmRsZXIoInNubXAiLCAibG9nT3B0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VfY29uZmlnX2xvZ09wdGlvbiwgTlVMTCwgInN0cmluZyIpOwoKfQoKdm9pZApzaHV0ZG93bl9zbm1wX2xvZ2dpbmcodm9pZCkKewogICBzbm1wX2Rpc2FibGVfbG9nKCk7CiAgIHdoaWxlKE5VTEwgIT0gbG9naF9oZWFkKQogICAgICBuZXRzbm1wX3JlbW92ZV9sb2doYW5kbGVyKCBsb2doX2hlYWQgKTsKfQoKLyoKICogVGhlc2UgZGVmaW5pdGlvbnMgaGFuZGxlIDQuMiBzeXN0ZW1zIHdpdGhvdXQgYWRkaXRpb25hbCBzeXNsb2cgZmFjaWxpdGllcy4KICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgojaWZuZGVmIExPR19VU0VSCiNkZWZpbmUgTE9HX1VTRVIJMAojZW5kaWYKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cgKi8KCi8qIFNldCBsaW5lIGJ1ZmZlcmluZyBtb2RlIGZvciBhIHN0cmVhbS4gKi8Kdm9pZApuZXRzbm1wX3NldF9saW5lX2J1ZmZlcmluZyhGSUxFICpzdHJlYW0pCnsKI2lmIGRlZmluZWQoV0lOMzIpCiAgICAvKgogICAgICogQWNjb3JkaW5nIHRvIE1TRE4sIHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBDIHJ1bnRpbWUgbGlicmFyeSBkb2VzCiAgICAgKiBub3Qgc3VwcG9ydCBsaW5lIGJ1ZmZlcmluZywgc28gdHVybiBvZmYgYnVmZmVyaW5nIGNvbXBsZXRlbHkuCiAgICAgKiBTZWUgYWxzbyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvODZjZWJoZnMoVlMuNzEpLmFzcHguCiAgICAgKi8KICAgIHNldHZidWYoc3RyZWFtLCBOVUxMLCBfSU9OQkYsIEJVRlNJWik7CiNlbGlmIGRlZmluZWQoSEFWRV9TRVRMSU5FQlVGKQogICAgLyogc2V0bGluZWZ1bmN0aW9uKCkgaXMgYSBmdW5jdGlvbiBmcm9tIHRoZSBCU0QgVW5peCBBUEkuICovCiAgICBzZXRsaW5lYnVmKHN0cmVhbSk7CiNlbHNlCiAgICAvKiBTZWUgYWxzbyB0aGUgQzg5IG9yIEM5OSBzdGFuZGFyZCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZXR2YnVmKCkuICovCiAgICBzZXR2YnVmKHN0cmVhbSwgTlVMTCwgX0lPTEJGLCBCVUZTSVopOwojZW5kaWYKfQoKLyoKICogRGVjb2RlcyBsb2cgcHJpb3JpdHkuCiAqIEBwYXJhbSBvcHRhcmcgLSBJTiAtIHByaW9yaXR5IHRvIGRlY29kZSwgIjAiIG9yICIwLTciCiAqICAgICAgICAgICAgICAgICBPVVQgLSBwb2ludHMgdG8gbGFzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGRlY29kZWQgcHJpb3JpdHkKICogQHBhcmFtIHByaV9tYXggLSBPVVQgLSBtYXhpbXVtIHByaW9yaXR5IChpLmUuIDB4NyBmcm9tICIwLTciKQogKi8KaW50CmRlY29kZV9wcmlvcml0eSggY2hhciAqKm9wdGFyZywgaW50ICpwcmlfbWF4ICkKewogICAgaW50IHByaV9sb3cgPSBMT0dfREVCVUc7CgogICAgaWYgKCpvcHRhcmcgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CgogICAgc3dpdGNoICgqKm9wdGFyZykgewogICAgICAgIGNhc2UgJzAnOiAKICAgICAgICBjYXNlICchJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfRU1FUkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzEnOiAKICAgICAgICBjYXNlICdhJzogCiAgICAgICAgY2FzZSAnQSc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX0FMRVJUOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICcyJzogCiAgICAgICAgY2FzZSAnYyc6IAogICAgICAgIGNhc2UgJ0MnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19DUklUOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICczJzogCiAgICAgICAgY2FzZSAnZSc6IAogICAgICAgIGNhc2UgJ0UnOiAKICAgICAgICAgICAgcHJpX2xvdyA9IExPR19FUlI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzQnOiAKICAgICAgICBjYXNlICd3JzogCiAgICAgICAgY2FzZSAnVyc6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX1dBUk5JTkc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJzUnOiAKICAgICAgICBjYXNlICduJzogCiAgICAgICAgY2FzZSAnTic6IAogICAgICAgICAgICBwcmlfbG93ID0gTE9HX05PVElDRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNic6IAogICAgICAgIGNhc2UgJ2knOiAKICAgICAgICBjYXNlICdJJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfSU5GTzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnNyc6IAogICAgICAgIGNhc2UgJ2QnOiAKICAgICAgICBjYXNlICdEJzogCiAgICAgICAgICAgIHByaV9sb3cgPSBMT0dfREVCVUc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IAogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgcHJpb3JpdHk6ICVjXG4iLCoqb3B0YXJnKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgKm9wdGFyZyA9ICpvcHRhcmcrMTsKCiAgICBpZiAocHJpX21heCAmJiAqKm9wdGFyZz09Jy0nKSB7CiAgICAgICAgKm9wdGFyZyA9ICpvcHRhcmcgKyAxOyAvKiBza2lwICctJyAqLwogICAgICAgICpwcmlfbWF4ID0gZGVjb2RlX3ByaW9yaXR5KCBvcHRhcmcsIE5VTEwgKTsKICAgICAgICBpZiAoKnByaV9tYXggPT0gLTEpIHJldHVybiAtMTsKICAgICAgICBpZiAocHJpX2xvdyA8ICpwcmlfbWF4KSB7IAogICAgICAgICAgICBpbnQgdG1wID0gcHJpX2xvdzsgCiAgICAgICAgICAgIHByaV9sb3cgPSAqcHJpX21heDsgCiAgICAgICAgICAgICpwcmlfbWF4ID0gdG1wOyAKICAgICAgICB9CgogICAgfQogICAgcmV0dXJuIHByaV9sb3c7Cn0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwppbnQKZGVjb2RlX2ZhY2lsaXR5KCBjaGFyICpvcHRhcmcgKQp7CiAgICBpZiAob3B0YXJnID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIHN3aXRjaCAoKm9wdGFyZykgewogICAgY2FzZSAnZCc6CiAgICBjYXNlICdEJzoKICAgICAgICByZXR1cm4gTE9HX0RBRU1PTjsKICAgIGNhc2UgJ3UnOgogICAgY2FzZSAnVSc6CiAgICAgICAgcmV0dXJuIExPR19VU0VSOwogICAgY2FzZSAnMCc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDA7CiAgICBjYXNlICcxJzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMMTsKICAgIGNhc2UgJzInOgogICAgICAgIHJldHVybiBMT0dfTE9DQUwyOwogICAgY2FzZSAnMyc6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDM7CiAgICBjYXNlICc0JzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMNDsKICAgIGNhc2UgJzUnOgogICAgICAgIHJldHVybiBMT0dfTE9DQUw1OwogICAgY2FzZSAnNic6CiAgICAgICAgcmV0dXJuIExPR19MT0NBTDY7CiAgICBjYXNlICc3JzoKICAgICAgICByZXR1cm4gTE9HX0xPQ0FMNzsKICAgIGRlZmF1bHQ6CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHN5c2xvZyBmYWNpbGl0eTogJWNcbiIsKm9wdGFyZyk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgppbnQKc25tcF9sb2dfb3B0aW9ucyhjaGFyICpvcHRhcmcsIGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKewogICAgY2hhciAgICAgICAgICAgKmNwID0gb3B0YXJnOwogICAgICAgIC8qCgkgKiBIbW1tLi4uIHRoaXMgZG9lc24ndCBzZWVtIHRvIHdvcmsuCgkgKiBUaGUgbWFpbiBhZ2VudCAnZ2V0b3B0JyBoYW5kbGluZyBhc3N1bWVzCgkgKiAgIHRoYXQgdGhlIC1MIG9wdGlvbiB0YWtlcyBhbiBhcmd1bWVudCwKCSAqICAgYW5kIG9iamVjdHMgaWYgdGhpcyBpcyBtaXNzaW5nLgoJICogVHJ5aW5nIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbgoJICogICBuZXctc3R5bGUgIi1MeCIsIGFuZCBvbGQtc3R5bGUgIi1MIHh4IgoJICogICBpcyBsaWtlbHkgdG8gYmUgYSBtYWpvciBoZWFkYWNoZS4KCSAqLwogICAgY2hhciAgICAgICAgICAgIG1pc3Npbmdfb3B0ID0gJ2UnOwkvKiBvbGQgLUwgaXMgbmV3IC1MZSAqLwogICAgaW50ICAgICAgICAgICAgIHByaW9yaXR5ID0gTE9HX0RFQlVHOwogICAgaW50ICAgICAgICAgICAgIHByaV9tYXggID0gTE9HX0VNRVJHOwogICAgaW50ICAgICAgICAgICAgIGluY19vcHRpbmQgPSAwOwogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBERUJVR01TR1QoKCJsb2dnaW5nOm9wdGlvbnMiLCAib3B0YXJnOiAnJXMnLCBhcmdjICVkLCBhcmd2ICclcydcbiIsCiAgICAgICAgICAgICAgIG9wdGFyZywgYXJnYywgYXJndiA/IGFyZ3ZbMF0gOiAiTlVMTCIpKTsKICAgIG9wdGFyZysrOwogICAgaWYgKCEqY3ApCiAgICAgICAgY3AgPSAmbWlzc2luZ19vcHQ7CgogICAgLyoKICAgICAqIFN1cHBvcnQgJy4uLiAtTHg9dmFsdWUgLi4uLicgc3ludGF4CiAgICAgKi8KICAgIGlmICgqb3B0YXJnID09ICc9JykgewogICAgICAgIG9wdGFyZysrOwogICAgfQogICAgLyoKICAgICAqIGFuZCAnLi4uLiAiLUx4IHZhbHVlIiAuLi4uJyAgKCp3aXRoKiB0aGUgcXVvdGVzKQogICAgICovCiAgICB3aGlsZSAoKm9wdGFyZyAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSgqb3B0YXJnKSkpIHsKICAgICAgICBvcHRhcmcrKzsKICAgIH0KICAgIC8qCiAgICAgKiBGaW5hbGx5LCBoYW5kbGUgIi4uLi4gLUx4IHZhbHVlIC4uLi4iIHN5bnRheAogICAgICogICAoKndpdGhvdXQqIHN1cnJvdW5kaW5nIHF1b3RlcykKICAgICAqLwogICAgaWYgKCghKm9wdGFyZykgJiYgKE5VTEwgIT0gYXJndikpIHsKICAgICAgICAvKgogICAgICAgICAqIFdlJ3ZlIHJ1biBvZmYgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQKICAgICAgICAgKiAgc28gbW92ZSBvbiB0byB0aGUgbmV4dC4KICAgICAgICAgKiBCdXQgd2UgbWlnaHQgbm90IGFjdHVhbGx5IG5lZWQgaXQsIHNvIGRvbid0CgkgKiAgaW5jcmVtZW50IG9wdGluZCBqdXN0IHlldCEKICAgICAgICAgKi8KICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZF07CiAgICAgICAgaW5jX29wdGluZCA9IDE7CiAgICB9CgogICAgREVCVUdNU0dUKCgibG9nZ2luZzpvcHRpb25zIiwgIipjcDogJyVjJ1xuIiwgKmNwKSk7CiAgICBzd2l0Y2ggKCpjcCkgewoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KICAgIC8qCiAgICAgKiBMb2cgdG8gU3RhbmRhcmQgRXJyb3IKICAgICAqLwogICAgY2FzZSAnRSc6CiAgICAgICAgcHJpb3JpdHkgPSBkZWNvZGVfcHJpb3JpdHkoICZvcHRhcmcsICZwcmlfbWF4ICk7CiAgICAgICAgaWYgKHByaW9yaXR5ID09IC0xKSAgcmV0dXJuIC0xOwogICAgICAgIGlmIChpbmNfb3B0aW5kKQogICAgICAgICAgICBvcHRpbmQrKzsKICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwogICAgY2FzZSAnZSc6CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbmV0c25tcF9zZXRfbGluZV9idWZmZXJpbmcoc3RkZXJyKTsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgPSBzdHJkdXAoInN0ZGVyciIpOwoJfQogICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiBMb2cgdG8gU3RhbmRhcmQgT3V0cHV0CiAgICAgKi8KICAgIGNhc2UgJ08nOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSkgIHJldHVybiAtMTsKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KICAgIGNhc2UgJ28nOgogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUiwgcHJpb3JpdHkpOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIG5ldHNubXBfc2V0X2xpbmVfYnVmZmVyaW5nKHN0ZG91dCk7CiAgICAgICAgICAgIGxvZ2gtPnByaV9tYXggPSBwcmlfbWF4OwogICAgICAgICAgICBsb2doLT50b2tlbiAgID0gc3RyZHVwKCJzdGRvdXQiKTsKICAgICAgICAgICAgbG9naC0+aW1hZ2ljICA9IDE7CSAgICAvKiBzdGRvdXQsIG5vdCBzdGRlcnIgKi8KCX0KICAgICAgICBicmVhazsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwoKICAgIC8qCiAgICAgKiBMb2cgdG8gYSBuYW1lZCBmaWxlCiAgICAgKi8KICAgIGNhc2UgJ0YnOgogICAgICAgIHByaW9yaXR5ID0gZGVjb2RlX3ByaW9yaXR5KCAmb3B0YXJnLCAmcHJpX21heCApOwogICAgICAgIGlmIChwcmlvcml0eSA9PSAtMSB8fCAhYXJndikgIHJldHVybiAtMTsKICAgICAgICBvcHRhcmcgPSBhcmd2Wysrb3B0aW5kXTsKICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCiAgICBjYXNlICdmJzoKICAgICAgICBpZiAoaW5jX29wdGluZCkKICAgICAgICAgICAgb3B0aW5kKys7CiAgICAgICAgaWYgKCFvcHRhcmcpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGxvZyBmaWxlXG4iKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9GSUxFLCBwcmlvcml0eSk7CiAgICAgICAgaWYgKGxvZ2gpIHsKICAgICAgICAgICAgbG9naC0+cHJpX21heCA9IHByaV9tYXg7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgPSBzdHJkdXAob3B0YXJnKTsKICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfZmlsZWxvZyhsb2doLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQRU5EX0xPR0ZJTEVTKSk7Cgl9CiAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiAgICAvKgogICAgICogTG9nIHRvIHN5c2xvZwogICAgICovCiAgICBjYXNlICdTJzoKICAgICAgICBwcmlvcml0eSA9IGRlY29kZV9wcmlvcml0eSggJm9wdGFyZywgJnByaV9tYXggKTsKICAgICAgICBpZiAocHJpb3JpdHkgPT0gLTEgfHwgIWFyZ3YpICByZXR1cm4gLTE7CiAgICAgICAgaWYgKCFvcHRhcmdbMF0pIHsKICAgICAgICAgICAgLyogVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aXRoIHByaW9yaXR5IGRvZXMgbm90IGNvbnRhaW4gbG9nCiAgICAgICAgICAgICAqIGZhY2lsaXR5LiBUaGUgZmFjaWxpdHkgbXVzdCBiZSBpbiBuZXh0IGFyZ3VtZW50IHRoZW4uICovCiAgICAgICAgICAgIG9wdGluZCsrOwogICAgICAgICAgICBpZiAob3B0aW5kIDwgYXJnYykKICAgICAgICAgICAgICAgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kXTsKICAgICAgICB9CiAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KICAgIGNhc2UgJ3MnOgogICAgICAgIGlmIChpbmNfb3B0aW5kKQogICAgICAgICAgICBvcHRpbmQrKzsKICAgICAgICBpZiAoIW9wdGFyZykgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3Npbmcgc3lzbG9nIGZhY2lsaXR5XG4iKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBsb2doID0gbmV0c25tcF9yZWdpc3Rlcl9sb2doYW5kbGVyKE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0csIHByaW9yaXR5KTsKICAgICAgICBpZiAobG9naCkgewogICAgICAgICAgICBpbnQgZmFjaWxpdHkgPSBkZWNvZGVfZmFjaWxpdHkob3B0YXJnKTsKICAgICAgICAgICAgaWYgKGZhY2lsaXR5ID09IC0xKSAgcmV0dXJuIC0xOwogICAgICAgICAgICBsb2doLT5wcmlfbWF4ID0gcHJpX21heDsKICAgICAgICAgICAgbG9naC0+dG9rZW4gICA9IHN0cmR1cChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpKTsKICAgICAgICAgICAgbG9naC0+bWFnaWMgICA9ICh2b2lkICopKGludHB0cl90KWZhY2lsaXR5OwoJICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBmYWNpbGl0eSk7Cgl9CiAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgogICAgLyoKICAgICAqIERvbid0IGxvZyAKICAgICAqLwogICAgY2FzZSAnTic6CiAgICAgICAgcHJpb3JpdHkgPSBkZWNvZGVfcHJpb3JpdHkoICZvcHRhcmcsICZwcmlfbWF4ICk7CiAgICAgICAgaWYgKHByaW9yaXR5ID09IC0xKSAgcmV0dXJuIC0xOwogICAgICAgIGlmIChpbmNfb3B0aW5kKQogICAgICAgICAgICBvcHRpbmQrKzsKICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLwogICAgY2FzZSAnbic6CiAgICAgICAgLyoKICAgICAgICAgKiBkaXNhYmxlIGFsbCBsb2dzIHRvIGNsZWFuIHRoZW0gdXAgKGNsb3NlIGZpbGVzLCBldGMpLAogICAgICAgICAqIHJlbW92ZSBhbGwgbG9nIGhhbmRsZXJzLCB0aGVuIHJlZ2lzdGVyIGEgbnVsbCBoYW5kbGVyLgogICAgICAgICAqLwogICAgICAgIHNubXBfZGlzYWJsZV9sb2coKTsKICAgICAgICB3aGlsZShOVUxMICE9IGxvZ2hfaGVhZCkKICAgICAgICAgICAgbmV0c25tcF9yZW1vdmVfbG9naGFuZGxlciggbG9naF9oZWFkICk7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfTk9ORSwgcHJpb3JpdHkpOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGxvZ2gtPnByaV9tYXggPSBwcmlfbWF4OwoJfQogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGxvZ2dpbmcgb3B0aW9uIHBhc3NlZCB0byAtTDogJWMuXG4iLCAqY3ApOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIHJldHVybiAwOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cKY2hhciAqCnNubXBfbG9nX3N5c2xvZ25hbWUoY29uc3QgY2hhciAqcHN0cikKewogIGlmIChwc3RyKQogICAgc3RybGNweSAoc3lzbG9nbmFtZSwgcHN0ciwgc2l6ZW9mKHN5c2xvZ25hbWUpKTsKCiAgcmV0dXJuIHN5c2xvZ25hbWU7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cgKi8KCnZvaWQKc25tcF9sb2dfb3B0aW9uc191c2FnZShjb25zdCBjaGFyICpsZWFkLCBGSUxFICogb3V0ZikKewogICAgY29uc3QgY2hhciAqcHJpMV9tc2cgPSAiIGZvciBsZXZlbCAncHJpJyBhbmQgYWJvdmUiOwogICAgY29uc3QgY2hhciAqcHJpMl9tc2cgPSAiIGZvciBsZXZlbHMgJ3AxJyB0byAncDInIjsKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KICAgIGZwcmludGYob3V0ZiwgIiVzZTogICAgICAgICAgIGxvZyB0byBzdGFuZGFyZCBlcnJvclxuIiwgbGVhZCk7CiAgICBmcHJpbnRmKG91dGYsICIlc286ICAgICAgICAgICBsb2cgdG8gc3RhbmRhcmQgb3V0cHV0XG4iLCBsZWFkKTsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwogICAgZnByaW50ZihvdXRmLCAiJXNuOiAgICAgICAgICAgZG9uJ3QgbG9nIGF0IGFsbFxuIiwgbGVhZCk7CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUKICAgIGZwcmludGYob3V0ZiwgIiVzZiBmaWxlOiAgICAgIGxvZyB0byB0aGUgc3BlY2lmaWVkIGZpbGVcbiIsIGxlYWQpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUgKi8KI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiAgICBmcHJpbnRmKG91dGYsICIlc3MgZmFjaWxpdHk6ICBsb2cgdG8gc3lzbG9nICh2aWEgdGhlIHNwZWNpZmllZCBmYWNpbGl0eSlcbiIsIGxlYWQpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRyAqLwogICAgZnByaW50ZihvdXRmLCAiXG4lcyh2YXJpYW50cylcbiIsIGxlYWQpOwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCiAgICBmcHJpbnRmKG91dGYsICIlc1tFT05dIHByaTogICBsb2cgdG8gc3RhbmRhcmQgZXJyb3IsIG91dHB1dCBvciAvZGV2L251bGwlc1xuIiwgbGVhZCwgcHJpMV9tc2cpOwogICAgZnByaW50ZihvdXRmLCAiJXNbRU9OXSBwMS1wMjogbG9nIHRvIHN0YW5kYXJkIGVycm9yLCBvdXRwdXQgb3IgL2Rldi9udWxsJXNcbiIsIGxlYWQsIHByaTJfbXNnKTsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCiAgICBmcHJpbnRmKG91dGYsICIlc1tGU10gcHJpIHRva2VuOiAgICBsb2cgdG8gZmlsZS9zeXNsb2clc1xuIiwgbGVhZCwgcHJpMV9tc2cpOwogICAgZnByaW50ZihvdXRmLCAiJXNbRlNdIHAxLXAyIHRva2VuOiAgbG9nIHRvIGZpbGUvc3lzbG9nJXNcbiIsIGxlYWQsIHByaTJfbXNnKTsKfQoKLyoqCiAqIElzIGxvZ2dpbmcgZG9uZT8KICoKICogQHJldHVybiBSZXR1cm5zIDAgaWYgbG9nZ2luZyBpcyBvZmYsIDEgd2hlbiBpdCBpcyBkb25lLgogKgogKi8KaW50CnNubXBfZ2V0X2RvX2xvZ2dpbmcodm9pZCkKewogICAgcmV0dXJuIChsb2doX2VuYWJsZWQgPiAwKTsKfQoKCnN0YXRpYyBjaGFyICAgICoKc3ByaW50Zl9zdGFtcCh0aW1lX3QgKiBub3csIGNoYXIgKnNidWYpCnsKICAgIHRpbWVfdCAgICAgICAgICBOb3c7CiAgICBzdHJ1Y3QgdG0gICAgICAqdG07CgogICAgaWYgKG5vdyA9PSBOVUxMKSB7CiAgICAgICAgbm93ID0gJk5vdzsKICAgICAgICB0aW1lKG5vdyk7CiAgICB9CiAgICB0bSA9IGxvY2FsdGltZShub3cpOwogICAgc3ByaW50ZihzYnVmLCAiJS40ZC0lLjJkLSUuMmQgJS4yZDolLjJkOiUuMmQgIiwKICAgICAgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCiAgICAgICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKICAgIHJldHVybiBzYnVmOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cKdm9pZApzbm1wX2Rpc2FibGVfc3lzbG9nX2VudHJ5KG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2gpCnsKICAgIGlmICghbG9naCB8fCAhbG9naC0+ZW5hYmxlZCB8fCBsb2doLT50eXBlICE9IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpCiAgICAgICAgcmV0dXJuOwoKI2lmZGVmIFdJTjMyCiAgICBpZiAobG9naC0+bWFnaWMpIHsKICAgICAgICBIQU5ETEUgZXZlbnRsb2dfaCA9IChIQU5ETEUpbG9naC0+bWFnaWM7CiAgICAgICAgQ2xvc2VFdmVudExvZyhldmVudGxvZ19oKTsKICAgICAgICBsb2doLT5tYWdpYyA9IE5VTEw7CiAgICB9CiNlbHNlCiAgICBjbG9zZWxvZygpOwogICAgbG9naC0+aW1hZ2ljICA9IDA7CiNlbmRpZgoKICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX3N5c2xvZyh2b2lkKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQgJiYgbG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HKQogICAgICAgICAgICBzbm1wX2Rpc2FibGVfc3lzbG9nX2VudHJ5KGxvZ2gpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCnZvaWQKc25tcF9kaXNhYmxlX2ZpbGVsb2dfZW50cnkobmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCkKewogICAgaWYgKCFsb2doIC8qIHx8ICFsb2doLT5lbmFibGVkICovIHx8IGxvZ2gtPnR5cGUgIT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmIChsb2doLT5tYWdpYykgewogICAgICAgIGZwdXRzKCJcbiIsIChGSUxFKilsb2doLT5tYWdpYyk7CS8qIFhYWCAtIHdoeT8gKi8KICAgICAgICBmY2xvc2UoKEZJTEUqKWxvZ2gtPm1hZ2ljKTsKICAgICAgICBsb2doLT5tYWdpYyAgID0gTlVMTDsKICAgIH0KICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCnZvaWQKc25tcF9kaXNhYmxlX2ZpbGVsb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9maWxlbG9nX2VudHJ5KGxvZ2gpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KLyoKICogcmV0dXJucyB0aGF0IHN0YXR1cyBvZiBzdGRlcnIgbG9nZ2luZwogKgogKiBAcmV0dmFsIDAgOiBzdGRlcnIgbG9nZ2luZyBkaXNhYmxlZAogKiBAcmV0dmFsIDEgOiBzdGRlcnIgbG9nZ2luZyBlbmFibGVkCiAqLwppbnQKc25tcF9zdGRlcnJsb2dfc3RhdHVzKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUikpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQKc25tcF9kaXNhYmxlX3N0ZGVycmxvZyh2b2lkKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQgJiYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NURE9VVCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlIpKSB7CiAgICAgICAgICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7Cgl9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRU5BQkxFX0NBTExMT0cKdm9pZApzbm1wX2Rpc2FibGVfY2FsbGxvZyh2b2lkKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGZvciAobG9naCA9IGxvZ2hfaGVhZDsgbG9naDsgbG9naCA9IGxvZ2gtPm5leHQpCiAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQgJiYgbG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfQ0FMTEJBQ0spIHsKICAgICAgICAgICAgbmV0c25tcF9kaXNhYmxlX3RoaXNfbG9naGFuZGxlcihsb2doKTsKCX0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0VOQUJMRV9DQUxMTE9HICovCgp2b2lkCnNubXBfZGlzYWJsZV9sb2codm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KSB7CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpCiAgICAgICAgICAgIHNubXBfZGlzYWJsZV9zeXNsb2dfZW50cnkobG9naCk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkKICAgICAgICAgICAgc25tcF9kaXNhYmxlX2ZpbGVsb2dfZW50cnkobG9naCk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwogICAgICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICB9Cn0KCi8qCiAqIGNsb3NlIGFuZCByZW9wZW4gYWxsIGZpbGUgYmFzZWQgbG9ncywgdG8gYWxsb3cgbG9nZmlsZQogKiByb3RhdGlvbi4KICovCnZvaWQKbmV0c25tcF9sb2dnaW5nX3Jlc3RhcnQodm9pZCkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGludCBkb25lb25lID0gMDsKCiAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KSB7CiAgICAgICAgaWYgKDAgPT0gbG9naC0+ZW5hYmxlZCkKICAgICAgICAgICAgY29udGludWU7CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwogICAgICAgIGlmIChsb2doLT50eXBlID09IE5FVFNOTVBfTE9HSEFORExFUl9TWVNMT0cpIHsKICAgICAgICAgICAgc25tcF9kaXNhYmxlX3N5c2xvZ19lbnRyeShsb2doKTsKICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KGxvZ2gtPnRva2VuLChpbnQpKGludHB0cl90KWxvZ2gtPm1hZ2ljKTsKICAgICAgICAgICAgZG9uZW9uZSA9IDE7CiAgICAgICAgfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRyAqLwojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCiAgICAgICAgaWYgKGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUgJiYgIWRvbmVvbmUpIHsKICAgICAgICAgICAgc25tcF9kaXNhYmxlX2ZpbGVsb2dfZW50cnkobG9naCk7CiAgICAgICAgICAgIC8qKiBobW0sIGRvbid0IHplcm8gc3RhdHVzIGlzbid0IHNhdmVkLi4gaSB0aGluayBpdCdzCiAgICAgICAgICAgICAqIHNhZmVyIG5vdCB0byBvdmVyd3JpdGUsIGluIGNhc2UgYSBodXAgaXMganVzdCB0bwogICAgICAgICAgICAgKiByZS1yZWFkIGNvbmZpZyBmaWxlcy4uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfZmlsZWxvZyhsb2doLCAxKTsKICAgICAgICB9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwogICAgfQp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCnZvaWQKc25tcF9lbmFibGVfc3lzbG9nKHZvaWQpCnsKICAgIHNubXBfZW5hYmxlX3N5c2xvZ19pZGVudChzbm1wX2xvZ19zeXNsb2duYW1lKE5VTEwpLCBMT0dfREFFTU9OKTsKfQoKdm9pZApzbm1wX2VuYWJsZV9zeXNsb2dfaWRlbnQoY29uc3QgY2hhciAqaWRlbnQsIGNvbnN0IGludCBmYWNpbGl0eSkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGludCAgICAgICAgICAgICAgICAgIGZvdW5kID0gMDsKICAgIGludCAgICAgICAgICAgICAgICAgIGVuYWJsZSA9IDE7CiNpZmRlZiBXSU4zMgogICAgSEFORExFICAgICAgICAgICAgICAgZXZlbnRsb2dfaDsKI2Vsc2UKICAgIHZvaWQgICAgICAgICAgICAgICAgKmV2ZW50bG9nX2ggPSBOVUxMOwojZW5kaWYKCiAgICBzbm1wX2Rpc2FibGVfc3lzbG9nKCk7CS8qID8/PyAqLwojaWZkZWYgV0lOMzIKICAgIGV2ZW50bG9nX2ggPSBPcGVuRXZlbnRMb2coTlVMTCwgaWRlbnQpOwogICAgaWYgKGV2ZW50bG9nX2ggPT0gTlVMTCkgewoJICAgIC8qCgkgICAgICogSG1tbS4uLi4uCgkgICAgICogTWF5YmUgZGlzYWJsZSB0aGlzIGhhbmRsZXIsIGFuZCBsb2cgdGhlIGVycm9yID8KCSAgICAgKi8KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGV2ZW50IGxvZyBmb3IgJXMuICIKICAgICAgICAgICAgICAgICJMYXN0IGVycm9yOiAweCV4XG4iLCBpZGVudCwgR2V0TGFzdEVycm9yKCkpOwogICAgICAgIGVuYWJsZSA9IDA7CiAgICB9CiNlbHNlCiAgICBvcGVubG9nKHNubXBfbG9nX3N5c2xvZ25hbWUoaWRlbnQpLCBMT0dfQ09OUyB8IExPR19QSUQsIGZhY2lsaXR5KTsKI2VuZGlmCgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HKSB7CiAgICAgICAgICAgIGxvZ2gtPm1hZ2ljICAgPSAodm9pZCopZXZlbnRsb2dfaDsKICAgICAgICAgICAgbG9naC0+aW1hZ2ljICA9IGVuYWJsZTsJLyogc3lzbG9nIG9wZW4gKi8KICAgICAgICAgICAgaWYgKGxvZ2gtPmVuYWJsZWQgJiYgKDAgPT0gZW5hYmxlKSkKICAgICAgICAgICAgICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCgwID09IGxvZ2gtPmVuYWJsZWQpICYmIGVuYWJsZSkKICAgICAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX3RoaXNfbG9naGFuZGxlcihsb2doKTsKICAgICAgICAgICAgZm91bmQgICAgICAgICA9IDE7Cgl9CgogICAgaWYgKCFmb3VuZCkgewogICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX1NZU0xPRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19ERUJVRyApOwogICAgICAgIGlmIChsb2doKSB7CiAgICAgICAgICAgIGxvZ2gtPm1hZ2ljICAgID0gKHZvaWQqKWV2ZW50bG9nX2g7CiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgID0gc3RyZHVwKGlkZW50KTsKICAgICAgICAgICAgbG9naC0+aW1hZ2ljICAgPSBlbmFibGU7CS8qIHN5c2xvZyBvcGVuICovCiAgICAgICAgICAgIGlmIChsb2doLT5lbmFibGVkICYmICgwID09IGVuYWJsZSkpCiAgICAgICAgICAgICAgICBuZXRzbm1wX2Rpc2FibGVfdGhpc19sb2doYW5kbGVyKGxvZ2gpOwogICAgICAgICAgICBlbHNlIGlmICgoMCA9PSBsb2doLT5lbmFibGVkKSAmJiBlbmFibGUpCiAgICAgICAgICAgICAgICBuZXRzbm1wX2VuYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICAgICAgfQogICAgfQp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCnZvaWQKbmV0c25tcF9lbmFibGVfZmlsZWxvZyhuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doLCBpbnQgZG9udF96ZXJvX2xvZykKewogICAgRklMRSAqbG9nZmlsZTsKCiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmICghbG9naC0+bWFnaWMpIHsKICAgICAgICBsb2dmaWxlID0gZm9wZW4obG9naC0+dG9rZW4sIGRvbnRfemVyb19sb2cgPyAiYSIgOiAidyIpOwogICAgICAgIGlmICghbG9nZmlsZSkgewoJICAgIHNubXBfbG9nX3BlcnJvcihsb2doLT50b2tlbik7CiAgICAgICAgICAgIHJldHVybjsKCX0KICAgICAgICBsb2doLT5tYWdpYyA9ICh2b2lkKilsb2dmaWxlOwogICAgICAgIG5ldHNubXBfc2V0X2xpbmVfYnVmZmVyaW5nKGxvZ2ZpbGUpOwogICAgfQogICAgbmV0c25tcF9lbmFibGVfdGhpc19sb2doYW5kbGVyKGxvZ2gpOwp9Cgp2b2lkCnNubXBfZW5hYmxlX2ZpbGVsb2coY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsIGludCBkb250X3plcm9fbG9nKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIC8qCiAgICAgKiBkb24ndCBkaXNhYmxlIEFMTCBmaWxlbG9ncyB3aGVuZXZlciBhIG5ldyBvbmUgaXMgZW5hYmxlZC4KICAgICAqIHRoaXMgcHJldmVudHMgJy1MZiBmaWxlJyBmcm9tIHdvcmtpbmcgaW4gc25tcGQsIGFzIHRoZQogICAgICogY2FsbCB0byBzZXQgdXAgL3Zhci9sb2cvc25tcGQubG9nIHdpbGwgZGlzYWJsZSB0aGUgcHJldmlvdXMKICAgICAqIGxvZyBzZXR1cC4KICAgICAqIHNubXBfZGlzYWJsZV9maWxlbG9nKCk7CiAgICAgKi8KCiAgICBpZiAobG9nZmlsZW5hbWUpIHsKICAgICAgICBsb2doID0gbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIGxvZ2ZpbGVuYW1lICk7CiAgICAgICAgaWYgKCFsb2doKSB7CiAgICAgICAgICAgIGxvZ2ggPSBuZXRzbm1wX3JlZ2lzdGVyX2xvZ2hhbmRsZXIoTkVUU05NUF9MT0dIQU5ETEVSX0ZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgICAgIGlmIChsb2doKQogICAgICAgICAgICAgICAgbG9naC0+dG9rZW4gPSBzdHJkdXAobG9nZmlsZW5hbWUpOwoJfQogICAgICAgIGlmIChsb2doKQogICAgICAgICAgICBuZXRzbm1wX2VuYWJsZV9maWxlbG9nKGxvZ2gsIGRvbnRfemVyb19sb2cpOwogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGxvZ2ggPSBsb2doX2hlYWQ7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0KQogICAgICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRSkKICAgICAgICAgICAgICAgIG5ldHNubXBfZW5hYmxlX2ZpbGVsb2cobG9naCwgZG9udF96ZXJvX2xvZyk7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCgoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0VOQUJMRV9TVERFUlJMT0cKLyogdXNlZCBpbiB0aGUgcGVybCBtb2R1bGVzIGFuZCBpcC1taWIvaXB2NEludGVyZmFjZVRhYmxlL2lwdjRJbnRlcmZhY2VUYWJsZV9zdWJhZ2VudC5jICovCnZvaWQKc25tcF9lbmFibGVfc3RkZXJybG9nKHZvaWQpCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CiAgICBpbnQgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUIHx8CiAgICAgICAgICAgIGxvZ2gtPnR5cGUgPT0gTkVUU05NUF9MT0dIQU5ETEVSX1NUREVSUikgewogICAgICAgICAgICBuZXRzbm1wX2VuYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICAgICAgICAgIGZvdW5kICAgICAgICAgPSAxOwogICAgICAgIH0KCiAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfU1RERVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0RFQlVHICk7CiAgICAgICAgaWYgKGxvZ2gpCiAgICAgICAgICAgIGxvZ2gtPnRva2VuICAgID0gc3RyZHVwKCJzdGRlcnIiKTsKICAgIH0KfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9FTkFCTEVfU1RERVJSTE9HICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19FTkFCTEVfQ0FMTExPRwp2b2lkCnNubXBfZW5hYmxlX2NhbGxsb2codm9pZCkJLyogWFhYIC0gb3IgdGFrZSBhIGNhbGxiYWNrIHJvdXRpbmUgPz8/ICovCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CiAgICBpbnQgICAgICAgICAgICAgICAgICBmb3VuZCA9IDA7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dHlwZSA9PSBORVRTTk1QX0xPR0hBTkRMRVJfQ0FMTEJBQ0spIHsKICAgICAgICAgICAgbmV0c25tcF9lbmFibGVfdGhpc19sb2doYW5kbGVyKGxvZ2gpOwogICAgICAgICAgICBmb3VuZCAgICAgICAgID0gMTsKCX0KCiAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgbG9naCA9IG5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlcihORVRTTk1QX0xPR0hBTkRMRVJfQ0FMTEJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfREVCVUcgKTsKICAgICAgICBpZiAobG9naCkKICAgICAgICAgICAgbG9naC0+dG9rZW4gICAgPSBzdHJkdXAoImNhbGxiYWNrIik7CiAgICB9Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19FTkFCTEVfQ0FMTExPRyAqLwoKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCgpuZXRzbm1wX2xvZ19oYW5kbGVyICoKbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIGNvbnN0IGNoYXIgKnRva2VuICkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKICAgIGlmICghdG9rZW4pCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgZm9yIChsb2doID0gbG9naF9oZWFkOyBsb2doOyBsb2doID0gbG9naC0+bmV4dCkKICAgICAgICBpZiAobG9naC0+dG9rZW4gJiYgIXN0cmNtcCggdG9rZW4sIGxvZ2gtPnRva2VuICkpCiAgICAgICAgICAgIGJyZWFrOwoKICAgIHJldHVybiBsb2doOwp9CgppbnQKbmV0c25tcF9hZGRfbG9naGFuZGxlciggbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCApCnsKICAgIGludCBpOwogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDI7CgogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBwb2ludCBmb3IgdGhlIG5ldyBlbnRyeS4uLgogICAgICogICAobG9naDIgd2lsbCBwb2ludCB0byB0aGUgZW50cnkgaW1tZWRpYXRlbHkgZm9sbG93aW5nKQogICAgICovCiAgICBmb3IgKGxvZ2gyID0gbG9naF9oZWFkOyBsb2doMjsgbG9naDIgPSBsb2doMi0+bmV4dCkKICAgICAgICBpZiAoIGxvZ2gyLT5wcmlvcml0eSA+PSBsb2doLT5wcmlvcml0eSApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIC8qCiAgICAgKiAuLi4gYW5kIGxpbmsgaXQgaW50byB0aGUgbWFpbiBsaXN0LgogICAgICovCiAgICBpZiAobG9naDIpIHsKICAgICAgICBpZiAobG9naDItPnByZXYpCiAgICAgICAgICAgIGxvZ2gyLT5wcmV2LT5uZXh0ID0gbG9naDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvZ2hfaGVhZCA9IGxvZ2g7CiAgICAgICAgbG9naC0+bmV4dCAgPSBsb2doMjsKICAgICAgICBsb2doMi0+cHJldiA9IGxvZ2g7CiAgICB9IGVsc2UgaWYgKGxvZ2hfaGVhZCApIHsKICAgICAgICAvKgogICAgICAgICAqIElmIGxvZ2gyIGlzIE5VTEwsIHdlJ3JlIHRhZ2dpbmcgb24gdG8gdGhlIGVuZAogICAgICAgICAqLwogICAgICAgIGZvciAobG9naDIgPSBsb2doX2hlYWQ7IGxvZ2gyLT5uZXh0OyBsb2doMiA9IGxvZ2gyLT5uZXh0KQogICAgICAgICAgICA7CiAgICAgICAgbG9naDItPm5leHQgPSBsb2doOwogICAgfSBlbHNlIHsKICAgICAgICBsb2doX2hlYWQgPSBsb2doOwogICAgfQoKICAgIC8qCiAgICAgKiBBbHNvIHR3ZWFrIHRoZSByZWxldmFudCBwcmlvcml0eS0naW5kZXgnIGFycmF5LgogICAgICovCiAgICBmb3IgKGk9TE9HX0VNRVJHOyBpPD1sb2doLT5wcmlvcml0eTsgaSsrKQogICAgICAgIGlmICghbG9naF9wcmlvcml0aWVzW2ldIHx8CiAgICAgICAgICAgICBsb2doX3ByaW9yaXRpZXNbaV0tPnByaW9yaXR5ID49IGxvZ2gtPnByaW9yaXR5KQogICAgICAgICAgICAgbG9naF9wcmlvcml0aWVzW2ldID0gbG9naDsKCiAgICByZXR1cm4gMTsKfQoKbmV0c25tcF9sb2dfaGFuZGxlciAqCm5ldHNubXBfcmVnaXN0ZXJfbG9naGFuZGxlciggaW50IHR5cGUsIGludCBwcmlvcml0eSApCnsKICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgbG9naCA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9sb2dfaGFuZGxlcik7CiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgREVCVUdNU0dUKCgibG9nZ2luZzpyZWdpc3RlciIsICJyZWdpc3RlcmluZyBsb2cgdHlwZSAlZCB3aXRoIHByaSAlZFxuIiwKICAgICAgICAgICAgICAgdHlwZSwgcHJpb3JpdHkpKTsKCiAgICBsb2doLT50eXBlICAgICA9IHR5cGU7CiAgICBzd2l0Y2ggKCB0eXBlICkgewogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfU1RET1VUOgogICAgICAgIGxvZ2gtPmltYWdpYyAgPSAxOwogICAgICAgIC8qIGZhbGx0aHJvdWdoICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NURElPCiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9TVERFUlI6CiAgICAgICAgbG9naC0+aGFuZGxlciA9IGxvZ19oYW5kbGVyX3N0ZG91dGVycjsKICAgICAgICBicmVhazsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRQogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfRklMRToKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfZmlsZTsKICAgICAgICBsb2doLT5pbWFnaWMgID0gMTsKICAgICAgICBicmVhazsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwogICAgY2FzZSBORVRTTk1QX0xPR0hBTkRMRVJfU1lTTE9HOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9zeXNsb2c7CiAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9DQUxMQkFDSzoKICAgICAgICBsb2doLT5oYW5kbGVyID0gbG9nX2hhbmRsZXJfY2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE5FVFNOTVBfTE9HSEFORExFUl9OT05FOgogICAgICAgIGxvZ2gtPmhhbmRsZXIgPSBsb2dfaGFuZGxlcl9udWxsOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBmcmVlKGxvZ2gpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbG9naC0+cHJpb3JpdHkgPSBwcmlvcml0eTsKICAgIG5ldHNubXBfZW5hYmxlX3RoaXNfbG9naGFuZGxlcihsb2doKTsKICAgIG5ldHNubXBfYWRkX2xvZ2hhbmRsZXIoIGxvZ2ggKTsKICAgIHJldHVybiBsb2doOwp9CgoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRU5BQkxFX0xPR0hBTkRMRVIKaW50Cm5ldHNubXBfZW5hYmxlX2xvZ2hhbmRsZXIoIGNvbnN0IGNoYXIgKnRva2VuICkKewogICAgbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naDsKCiAgICBsb2doID0gbmV0c25tcF9maW5kX2xvZ2hhbmRsZXIoIHRva2VuICk7CiAgICBpZiAoIWxvZ2gpCiAgICAgICAgcmV0dXJuIDA7CiAgICBuZXRzbm1wX2VuYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICByZXR1cm4gMTsKfQoKCmludApuZXRzbm1wX2Rpc2FibGVfbG9naGFuZGxlciggY29uc3QgY2hhciAqdG9rZW4gKQp7CiAgICBuZXRzbm1wX2xvZ19oYW5kbGVyICpsb2doOwoKICAgIGxvZ2ggPSBuZXRzbm1wX2ZpbmRfbG9naGFuZGxlciggdG9rZW4gKTsKICAgIGlmICghbG9naCkKICAgICAgICByZXR1cm4gMDsKICAgIG5ldHNubXBfZGlzYWJsZV90aGlzX2xvZ2hhbmRsZXIobG9naCk7CiAgICByZXR1cm4gMTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0VOQUJMRV9MT0dIQU5ETEVSICovCgppbnQKbmV0c25tcF9yZW1vdmVfbG9naGFuZGxlciggbmV0c25tcF9sb2dfaGFuZGxlciAqbG9naCApCnsKICAgIGludCBpOwogICAgaWYgKCFsb2doKQogICAgICAgIHJldHVybiAwOwoKICAgIGlmIChsb2doLT5wcmV2KQogICAgICAgIGxvZ2gtPnByZXYtPm5leHQgPSBsb2doLT5uZXh0OwogICAgZWxzZQogICAgICAgIGxvZ2hfaGVhZCA9IGxvZ2gtPm5leHQ7CgogICAgaWYgKGxvZ2gtPm5leHQpCiAgICAgICAgbG9naC0+bmV4dC0+cHJldiA9IGxvZ2gtPnByZXY7CgogICAgZm9yIChpPUxPR19FTUVSRzsgaTw9bG9naC0+cHJpb3JpdHk7IGkrKykKICAgICAgICBsb2doX3ByaW9yaXRpZXNbaV0gPSBOVUxMOwogICAgZnJlZShORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyKiwgbG9naC0+dG9rZW4pKTsKICAgIFNOTVBfRlJFRShsb2doKTsKCiAgICByZXR1cm4gMTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KaW50CmxvZ19oYW5kbGVyX3N0ZG91dGVyciggIG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewogICAgc3RhdGljIGludCAgICAgIG5ld2xpbmUgPSAxOwkgLyogTVRDUklUSUNBTF9SRVNPVVJDRSAqLwogICAgY29uc3QgY2hhciAgICAgKm5ld2xpbmVfcHRyOwogICAgY2hhciAgICAgICAgICAgIHNidWZbNDBdOwoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9MT0dfVElNRVNUQU1QKSAmJiBuZXdsaW5lKSB7CiAgICAgICAgc3ByaW50Zl9zdGFtcChOVUxMLCBzYnVmKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RyY3B5KHNidWYsICIiKTsKICAgIH0KICAgIC8qCiAgICAgKiBSZW1lbWJlciB3aGV0aGVyIG9yIG5vdCB0aGUgY3VycmVudCBsaW5lIGVuZHMgd2l0aCBhIG5ld2xpbmUgZm9yIHRoZQogICAgICogbmV4dCBjYWxsIG9mIGxvZ19oYW5kbGVyX3N0ZG91dGVycigpLgogICAgICovCiAgICBuZXdsaW5lX3B0ciA9IHN0cnJjaHIoc3RyLCAnXG4nKTsKICAgIG5ld2xpbmUgPSBuZXdsaW5lX3B0ciAmJiBuZXdsaW5lX3B0clsxXSA9PSAwOwoKICAgIGlmIChsb2doLT5pbWFnaWMpCiAgICAgICBwcmludGYoICAgICAgICAgIiVzJXMiLCBzYnVmLCBzdHIpOwogICAgZWxzZQogICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVzIiwgc2J1Ziwgc3RyKTsKCiAgICByZXR1cm4gMTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NURElPICovCgoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiNpZmRlZiBXSU4zMgppbnQKbG9nX2hhbmRsZXJfc3lzbG9nKCAgbmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CiAgICBXT1JEICAgICAgICAgICAgZXR5cGU7CiAgICBMUENUU1RSICAgICAgICAgZXZlbnRfbXNnWzJdOwogICAgSEFORExFICAgICAgICAgIGV2ZW50bG9nX2ggPSBsb2doLT5tYWdpYzsKCiAgICAgICAgLyoKICAgICAgICAgKiogIEVWRU5UIFRZUEVTOgogICAgICAgICAqKgogICAgICAgICAqKiAgSW5mb3JtYXRpb24gKEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUpCiAgICAgICAgICoqICAgICAgSW5mb3JtYXRpb24gZXZlbnRzIGluZGljYXRlIGluZnJlcXVlbnQgYnV0IHNpZ25pZmljYW50CiAgICAgICAgICoqICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb25zLgogICAgICAgICAqKiAgV2FybmluZyAoRVZFTlRMT0dfV0FSTklOR19UWVBFKQogICAgICAgICAqKiAgICAgIFdhcm5pbmcgZXZlbnRzIGluZGljYXRlIHByb2JsZW1zIHRoYXQgYXJlIG5vdCBpbW1lZGlhdGVseQogICAgICAgICAqKiAgICAgIHNpZ25pZmljYW50LCBidXQgdGhhdCBtYXkgaW5kaWNhdGUgY29uZGl0aW9ucyB0aGF0IGNvdWxkCiAgICAgICAgICoqICAgICAgY2F1c2UgZnV0dXJlIHByb2JsZW1zLiBSZXNvdXJjZSBjb25zdW1wdGlvbiBpcyBhIGdvb2QKICAgICAgICAgKiogICAgICBjYW5kaWRhdGUgZm9yIGEgd2FybmluZyBldmVudC4KICAgICAgICAgKiogIEVycm9yIChFVkVOVExPR19FUlJPUl9UWVBFKQogICAgICAgICAqKiAgICAgIEVycm9yIGV2ZW50cyBpbmRpY2F0ZSBzaWduaWZpY2FudCBwcm9ibGVtcyB0aGF0IHRoZSB1c2VyCiAgICAgICAgICoqICAgICAgc2hvdWxkIGtub3cgYWJvdXQuIEVycm9yIGV2ZW50cyB1c3VhbGx5IGluZGljYXRlIGEgbG9zcyBvZgogICAgICAgICAqKiAgICAgIGZ1bmN0aW9uYWxpdHkgb3IgZGF0YS4KICAgICAgICAgKi8KICAgIHN3aXRjaCAocHJpKSB7CiAgICAgICAgY2FzZSBMT0dfRU1FUkc6CiAgICAgICAgY2FzZSBMT0dfQUxFUlQ6CiAgICAgICAgY2FzZSBMT0dfQ1JJVDoKICAgICAgICBjYXNlIExPR19FUlI6CiAgICAgICAgICAgIGV0eXBlID0gRVZFTlRMT0dfRVJST1JfVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBMT0dfV0FSTklORzoKICAgICAgICAgICAgZXR5cGUgPSBFVkVOVExPR19XQVJOSU5HX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTE9HX05PVElDRToKICAgICAgICBjYXNlIExPR19JTkZPOgogICAgICAgIGNhc2UgTE9HX0RFQlVHOgogICAgICAgICAgICBldHlwZSA9IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGV0eXBlID0gRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBldmVudF9tc2dbMF0gPSBzdHI7CiAgICBldmVudF9tc2dbMV0gPSBOVUxMOwogICAgLyogTk9URTogNHRoIHBhcmFtZXRlciBtdXN0IG1hdGNoIHdpbnNlcnZpY2UubWM6TWVzc2FnZUlkIHZhbHVlICovCiAgICBpZiAoIVJlcG9ydEV2ZW50KGV2ZW50bG9nX2gsIGV0eXBlLCAwLCAxMDAsIE5VTEwsIDEsIDAsIGV2ZW50X21zZywgTlVMTCkpIHsKCSAgICAvKgoJICAgICAqIEhtbW0uLi4uLgoJICAgICAqIE1heWJlIGRpc2FibGUgdGhpcyBoYW5kbGVyLCBhbmQgbG9nIHRoZSBlcnJvciA/CgkgICAgICovCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVwb3J0IGV2ZW50LiAgTGFzdCBlcnJvcjogMHgleFxuIiwKCQkJR2V0TGFzdEVycm9yKCkpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIDE7Cn0KI2Vsc2UKaW50CmxvZ19oYW5kbGVyX3N5c2xvZyggIG5ldHNubXBfbG9nX2hhbmRsZXIqIGxvZ2gsIGludCBwcmksIGNvbnN0IGNoYXIgKnN0cikKewoJLyoKCSAqIFhYWAoJICogV2UndmUgZ290IHRocmVlIGl0ZW1zIG9mIGluZm9ybWF0aW9uIHRvIHdvcmsgd2l0aDoKCSAqICAgICBJcyB0aGUgc3lzbG9nIGN1cnJlbnRseSBvcGVuPwoJICogICAgIFdoYXQgaWRlbnQgc3RyaW5nIHRvIHVzZT8KCSAqICAgICBXaGF0IGZhY2lsaXR5IHRvIGxvZyB0bz8KCSAqCgkgKiBXZSd2ZSBnb3QgdHdvICJtYWdpYyIgbG9jYXRpb25zIChpbWFnaWMgJiBtYWdpYykgcGx1cyB0aGUgdG9rZW4KCSAqLwogICAgaWYgKCEobG9naC0+aW1hZ2ljKSkgewogICAgICAgIGNvbnN0IGNoYXIgKmlkZW50ICAgID0gbG9naC0+dG9rZW47CiAgICAgICAgaW50ICAgZmFjaWxpdHkgPSAoaW50KShpbnRwdHJfdClsb2doLT5tYWdpYzsKICAgICAgICBpZiAoIWlkZW50KQogICAgICAgICAgICBpZGVudCA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUpOwogICAgICAgIG9wZW5sb2coaWRlbnQsIExPR19DT05TIHwgTE9HX1BJRCwgZmFjaWxpdHkpOwogICAgICAgIGxvZ2gtPmltYWdpYyA9IDE7CiAgICB9CiAgICBzeXNsb2coIHByaSwgIiVzIiwgc3RyICk7CiAgICByZXR1cm4gMTsKfQojZW5kaWYgLyogIVdJTjMyICovCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRQppbnQKbG9nX2hhbmRsZXJfZmlsZSggICAgbmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CiAgICBGSUxFICAgICAgICAgICAqZmhhbmRsZTsKICAgIGNoYXIgICAgICAgICAgICBzYnVmWzQwXTsKCiAgICAvKgogICAgICogV2UgdXNlIGltYWdpYyB0byBzYXZlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdGhlIG5leHQgb3V0cHV0CiAgICAgKiB3aWxsIHN0YXJ0IGEgbmV3IGxpbmUsIGFuZCB0aHVzIG1pZ2h0IG5lZWQgYSB0aW1lc3RhbXAKICAgICAqLwogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0xPR19USU1FU1RBTVApICYmIGxvZ2gtPmltYWdpYykgewogICAgICAgIHNwcmludGZfc3RhbXAoTlVMTCwgc2J1Zik7CiAgICB9IGVsc2UgewogICAgICAgIHN0cmNweShzYnVmLCAiIik7CiAgICB9CgogICAgLyoKICAgICAqIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBvcGVuZWQgdGhlIGZpbGUsIHRoZW4gZG8gc28uCiAgICAgKiBTYXZlIHRoZSBmaWxlaGFuZGxlIHBvaW50ZXIgZm9yIG5leHQgdGltZS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBzaG91bGQgc3RpbGwgd29yaywgZXZlbiBpZiB0aGUgZmlsZQogICAgICogaXMgY2xvc2VkIGluIHRoZSBtZWFudGltZSAoZS5nLiBhIHJlZ3VsYXIgImNsZWFudXAiIHN3ZWVwKQogICAgICovCiAgICBmaGFuZGxlID0gKEZJTEUqKWxvZ2gtPm1hZ2ljOwogICAgaWYgKCFsb2doLT5tYWdpYykgewogICAgICAgIGZoYW5kbGUgPSBmb3Blbihsb2doLT50b2tlbiwgImErIik7CiAgICAgICAgaWYgKCFmaGFuZGxlKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBsb2doLT5tYWdpYyA9ICh2b2lkKilmaGFuZGxlOwogICAgfQogICAgZnByaW50ZihmaGFuZGxlLCAiJXMlcyIsIHNidWYsIHN0cik7CiAgICBmZmx1c2goZmhhbmRsZSk7CiAgICBsb2doLT5pbWFnaWMgPSBzdHJbc3RybGVuKHN0cikgLSAxXSA9PSAnXG4nOwogICAgcmV0dXJuIDE7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFICovCgppbnQKbG9nX2hhbmRsZXJfY2FsbGJhY2sobmV0c25tcF9sb2dfaGFuZGxlciogbG9naCwgaW50IHByaSwgY29uc3QgY2hhciAqc3RyKQp7CgkvKgoJICogWFhYIC0gcGVyaGFwcyByZXBsYWNlICdzbm1wX2NhbGxfY2FsbGJhY2tzJyBwcm9jZXNzaW5nCgkgKiAgICAgICB3aXRoIGluZGl2aWR1YWwgY2FsbGJhY2sgbG9nX2hhbmRsZXJzID8/CgkgKi8KICAgIHN0cnVjdCBzbm1wX2xvZ19tZXNzYWdlIHNsbTsKICAgIGludCAgICAgICAgICAgICBkb2RlYnVnID0gc25tcF9nZXRfZG9fZGVidWdnaW5nKCk7CgogICAgc2xtLnByaW9yaXR5ID0gcHJpOwogICAgc2xtLm1zZyA9IHN0cjsKICAgIGlmIChkb2RlYnVnKSAgICAgICAgICAgIC8qIHR1cm4gb2ZmIGRlYnVnZ2luZyBpbnNpZGUgdGhlIGNhbGxiYWNrcyBlbHNlIHdpbGwgbG9vcCAqLwogICAgICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygwKTsKICAgIHNubXBfY2FsbF9jYWxsYmFja3MoU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX0xPR0dJTkcsICZzbG0pOwogICAgaWYgKGRvZGVidWcpCiAgICAgICAgc25tcF9zZXRfZG9fZGVidWdnaW5nKGRvZGVidWcpOwogICAgcmV0dXJuIDE7Cn0KCmludApsb2dfaGFuZGxlcl9udWxsKCAgICBuZXRzbm1wX2xvZ19oYW5kbGVyKiBsb2doLCBpbnQgcHJpLCBjb25zdCBjaGFyICpzdHIpCnsKICAgIC8qCiAgICAgKiBEdW1teSBsb2cgaGFuZGxlciAtIGp1c3QgdGhyb3cgYXdheSB0aGUgZXJyb3IgY29tcGxldGVseQogICAgICogWW91IHByb2JhYmx5IGRvbid0IHJlYWxseSB3YW50IHRvIGRvIHRoaXMhCiAgICAgKi8KICAgIHJldHVybiAxOwp9Cgp2b2lkCnNubXBfbG9nX3N0cmluZyhpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKnN0cikKewojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTwogICAgc3RhdGljIGludCBzdGRlcnJfZW5hYmxlZCA9IDA7CiAgICBzdGF0aWMgbmV0c25tcF9sb2dfaGFuZGxlciBsaCA9IHsgMSwgMCwgMCwgMCwgInN0ZGVyciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2hhbmRsZXJfc3Rkb3V0ZXJyLCAwLCBOVUxMLCAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH07CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8gKi8KICAgIG5ldHNubXBfbG9nX2hhbmRsZXIgKmxvZ2g7CgogICAgLyoKICAgICAqIFdlJ3ZlIGdvdCB0byBiZSBhYmxlIHRvIGxvZyBtZXNzYWdlcyAqc29tZXdoZXJlKiEKICAgICAqIElmIHlvdSBkb24ndCB3YW50IHN0ZGVyciBsb2dnaW5nLCB0aGVuIGVuYWJsZSBzb21ldGhpbmcgZWxzZS4KICAgICAqLwogICAgaWYgKDAgPT0gbG9naF9lbmFibGVkKSB7CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NURElPCiAgICAgICAgaWYgKCFzdGRlcnJfZW5hYmxlZCkgewogICAgICAgICAgICArK3N0ZGVycl9lbmFibGVkOwogICAgICAgICAgICBuZXRzbm1wX3NldF9saW5lX2J1ZmZlcmluZyhzdGRlcnIpOwogICAgICAgIH0KICAgICAgICBsb2dfaGFuZGxlcl9zdGRvdXRlcnIoICZsaCwgcHJpb3JpdHksIHN0ciApOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NURElPICovCgogICAgICAgIHJldHVybjsKICAgIH0KI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KICAgIGVsc2UgaWYgKHN0ZGVycl9lbmFibGVkKSB7CiAgICAgICAgc3RkZXJyX2VuYWJsZWQgPSAwOwogICAgICAgIGxvZ19oYW5kbGVyX3N0ZG91dGVyciggJmxoLCBMT0dfSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2cgaGFuZGxpbmcgZGVmaW5lZCAtIGRpc2FibGluZyBzdGRlcnJcbiIgKTsKICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TVERJTyAqLwogICAgICAgIAoKICAgIC8qCiAgICAgKiBTdGFydCBhdCB0aGUgZ2l2ZW4gcHJpb3JpdHksIGFuZCB3b3JrICJ1cHdhcmRzIi4uLi4KICAgICAqLwogICAgbG9naCA9IGxvZ2hfcHJpb3JpdGllc1twcmlvcml0eV07CiAgICBmb3IgKCA7IGxvZ2g7IGxvZ2ggPSBsb2doLT5uZXh0ICkgewogICAgICAgIC8qCiAgICAgICAgICogLi4uIGJ1dCBza2lwcGluZyBhbnkgaGFuZGxlcnMgd2l0aCBhICJtYXhpbXVtIHByaW9yaXR5IgogICAgICAgICAqICAgICB0aGF0IHdlIGhhdmUgYWxyZWFkeSBleGNlZWRlZC4gQW5kIGRvbid0IGZvcmdldCB0bwogICAgICAgICAqICAgICBlbnN1cmUgdGhpcyBsb2dnaW5nIGlzIHR1cm5lZCBvbiAoc2VlIHNubXBfZGlzYWJsZV9zdGRlcnJsb2cKICAgICAgICAgKiAgICAgYW5kIGl0cyBjb2hvcnRzKS4KICAgICAgICAgKi8KICAgICAgICBpZiAobG9naC0+ZW5hYmxlZCAmJiAocHJpb3JpdHkgPj0gbG9naC0+cHJpX21heCkpCiAgICAgICAgICAgIGxvZ2gtPmhhbmRsZXIoIGxvZ2gsIHByaW9yaXR5LCBzdHIgKTsKICAgIH0KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKCi8qKgogKiBUaGlzIHNubXAgbG9nZ2luZyBmdW5jdGlvbiBhbGxvd3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBnaXZlbiB0aGUKICogc3BlY2lmaWVkIHByaW9yaXR5LCBmb3JtYXQgYW5kIGEgcG9wdWxhdGVkIHZhX2xpc3Qgc3RydWN0dXJlLgogKiBUaGUgZGVmYXVsdCBsb2dmaWxlIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIGlzIC92YXIvbG9nL3NubXBkLmxvZy4KICoKICogQHBhcmFtIHByaW9yaXR5IGlzIGFuIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbgogKgl0byB0aGUgc25tcCBsb2cgZmlsZS4gIFRoZSB0eXBlcyBhcmUgZXJyb3JzLCB3YXJuaW5nLCBhbmQgaW5mb3JtYXRpb24uCiAqICAgICAgLSBUaGUgZXJyb3IgdHlwZXMgYXJlOgogKiAgICAgICAgLSBMT0dfRU1FUkcgICAgICAgc3lzdGVtIGlzIHVudXNhYmxlIAogKiAgICAgICAgLSBMT0dfQUxFUlQgICAgICAgYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgCiAqICAgICAgICAtIExPR19DUklUICAgICAgICBjcml0aWNhbCBjb25kaXRpb25zIAogKiAgICAgICAgLSBMT0dfRVJSICAgICAgICAgZXJyb3IgY29uZGl0aW9ucwogKiAgICAgIC0gVGhlIHdhcm5pbmcgdHlwZSBpczoKICogICAgICAgIC0gTE9HX1dBUk5JTkcgICAgIHdhcm5pbmcgY29uZGl0aW9ucyAKICogICAgICAtIFRoZSBpbmZvcm1hdGlvbiB0eXBlcyBhcmU6CiAqICAgICAgICAtIExPR19OT1RJQ0UgICAgICBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbgogKiAgICAgICAgLSBMT0dfSU5GTyAgICAgICAgaW5mb3JtYXRpb25hbAogKiAgICAgICAgLSBMT0dfREVCVUcgICAgICAgZGVidWctbGV2ZWwgbWVzc2FnZXMKICoKICogQHBhcmFtIGZvcm1hdCBpcyBhIHBvaW50ZXIgdG8gYSBjaGFyIHJlcHJlc2VudGluZyB0aGUgdmFyaWFibGUgYXJndW1lbnQgbGlzdAogKglmb3JtYXQgdXNlZC4KICoKICogQHBhcmFtIGFwIGlzIGEgdmFfbGlzdCB0eXBlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxpc3Qgb2YgYXJndW1lbnRzLgogKgogKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSB3aGVuIHRoZSBjb2RlIGNvdWxkIG5vdCBmb3JtYXQgdGhlIGxvZy0KICogICAgICAgICBzdHJpbmcsIC0yIHdoZW4gZHluYW1pYyBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZCBpZiB0aGUgbGVuZ3RoCiAqICAgICAgICAgb2YgdGhlIGxvZyBidWZmZXIgaXMgZ3JlYXRlciB0aGVuIDEwMjQgYnl0ZXMuICBGb3IgZWFjaCBvZiB0aGVzZQogKiAgICAgICAgIGVycm9ycyBhIExPR19FUlIgbWVzc2dhZSBpcyB3cml0dGVuIHRvIHRoZSBsb2dmaWxlLgogKgogKiBAc2VlIHNubXBfbG9nCiAqLwppbnQKc25tcF92bG9nKGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQp7CiAgICBjaGFyICAgICAgICAgICAgYnVmZmVyW0xPR0xFTkdUSF07CiAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwogICAgY2hhciAgICAgICAgICAgKmR5bmFtaWM7CiAgICB2YV9saXN0ICAgICAgICAgYXE7CgogICAgdmFfY29weShhcSwgYXApOwogICAgbGVuZ3RoID0gdnNucHJpbnRmKGJ1ZmZlciwgTE9HTEVOR1RILCBmb3JtYXQsIGFwKTsKICAgIHZhX2VuZChhcCk7CgogICAgaWYgKGxlbmd0aCA9PSAwKSB7CiNpZmRlZiBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiAgICAgICAgdmFfZW5kKGFxKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogRW1wdHkgc3RyaW5nICovCiAgICB9CgogICAgaWYgKGxlbmd0aCA9PSAtMSkgewogICAgICAgIHNubXBfbG9nX3N0cmluZyhMT0dfRVJSLCAiQ291bGQgbm90IGZvcm1hdCBsb2ctc3RyaW5nXG4iKTsKI2lmZGVmIE5FRURfVkFfRU5EX0FGVEVSX1ZBX0NPUFkKICAgICAgICB2YV9lbmQoYXEpOwojZW5kaWYKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KCiAgICBpZiAobGVuZ3RoIDwgTE9HTEVOR1RIKSB7CiAgICAgICAgc25tcF9sb2dfc3RyaW5nKHByaW9yaXR5LCBidWZmZXIpOwojaWZkZWYgTkVFRF9WQV9FTkRfQUZURVJfVkFfQ09QWQogICAgICAgIHZhX2VuZChhcSk7CiNlbmRpZgogICAgICAgIHJldHVybiAoMCk7CiAgICB9CgogICAgZHluYW1pYyA9IChjaGFyICopIG1hbGxvYyhsZW5ndGggKyAxKTsKICAgIGlmIChkeW5hbWljID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcoTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxvZy1tZXNzYWdlXG4iKTsKICAgICAgICBzbm1wX2xvZ19zdHJpbmcocHJpb3JpdHksIGJ1ZmZlcik7CiNpZmRlZiBORUVEX1ZBX0VORF9BRlRFUl9WQV9DT1BZCiAgICAgICAgdmFfZW5kKGFxKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICgtMik7CiAgICB9CgogICAgdnNucHJpbnRmKGR5bmFtaWMsIGxlbmd0aCArIDEsIGZvcm1hdCwgYXEpOwogICAgc25tcF9sb2dfc3RyaW5nKHByaW9yaXR5LCBkeW5hbWljKTsKICAgIGZyZWUoZHluYW1pYyk7CiAgICB2YV9lbmQoYXEpOwogICAgcmV0dXJuIDA7Cn0KCi8qKgogKiBUaGlzIHNubXAgbG9nZ2luZyBmdW5jdGlvbiBhbGxvd3MgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBnaXZlbiB0aGUKICogc3BlY2lmaWVkIGZvcm1hdCBhbmQgcHJpb3JpdHkuICBDYWxscyB0aGUgc25tcF92bG9nIGZ1bmN0aW9uLgogKiBUaGUgZGVmYXVsdCBsb2dmaWxlIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIGlzIC92YXIvbG9nL3NubXBkLmxvZy4KICoKICogQHNlZSBzbm1wX3Zsb2cKICovCmludApzbm1wX2xvZyhpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQp7CiAgICB2YV9saXN0ICAgICAgICAgYXA7CiAgICBpbnQgICAgICAgICAgICAgcmV0OwogICAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CiAgICByZXQgPSBzbm1wX3Zsb2cocHJpb3JpdHksIGZvcm1hdCwgYXApOwogICAgdmFfZW5kKGFwKTsKICAgIHJldHVybiAocmV0KTsKfQoKLyoKICogbG9nIGEgY3JpdGljYWwgZXJyb3IuCiAqLwp2b2lkCnNubXBfbG9nX3BlcnJvcihjb25zdCBjaGFyICpzKQp7CiAgICBjaGFyICAgICAgICAgICAqZXJyb3IgPSBzdHJlcnJvcihlcnJubyk7CiAgICBpZiAocykgewogICAgICAgIGlmIChlcnJvcikKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiAlc1xuIiwgcywgZXJyb3IpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiBFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIHMsIGVycm5vKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiJXNcbiIsIGVycm9yKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJFcnJvciAlZCBvdXQtb2YtcmFuZ2VcbiIsIGVycm5vKTsKICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRVhURVJOQUwKLyogZXh0ZXJuYWwgYWNjZXNzIHRvIGxvZ2hfaGVhZCB2YXJpYWJsZSAqLwpuZXRzbm1wX2xvZ19oYW5kbGVyICAqCmdldF9sb2doX2hlYWQodm9pZCkKewoJcmV0dXJuIGxvZ2hfaGVhZDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0VYVEVSTkFMICovCgovKiogIEB9ICovCg==