Ly8gQm9vc3QuVW5pdHMgLSBBIEMrKyBsaWJyYXJ5IGZvciB6ZXJvLW92ZXJoZWFkIGRpbWVuc2lvbmFsIGFuYWx5c2lzIGFuZCAKLy8gdW5pdC9xdWFudGl0eSBtYW5pcHVsYXRpb24gYW5kIGNvbnZlcnNpb24KLy8KLy8gQ29weXJpZ2h0IChDKSAyMDAzLTIwMDggTWF0dGhpYXMgQ2hyaXN0aWFuIFNjaGFiZWwKLy8gQ29weXJpZ2h0IChDKSAyMDA4IFN0ZXZlbiBXYXRhbmFiZQovLwovLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKLy8gaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQoKLyoqIApcZmlsZQogICAgClxicmllZiBFeGFtcGxlIG9mIHVzaW5nIGF1dG9wcmVmaXhlcy4KClxkZXRhaWxzCkV4YW1wbGUgb2YgdXNpbmcgZW5naW5lZXJpbmcgKDEwXjMpIGFuZCBiaW5hcnkgKDJeMTApIGF1dG9wcmVmaXhlcy4KCk91dHB1dDoKQHZlcmJhdGltCmF1dG9wcmVmaXhlcy5jcHAKdXNpbmcgbmF0aXZlIHR5cGVvZgpMaW5raW5nLi4uCkVtYmVkZGluZyBtYW5pZmVzdC4uLgpBdXRvcnVuICJqOlxDcHBcTWlzY1xkZWJ1Z1xhdXRvcHJlZml4ZXMuZXhlIiAKMi4zNDUgbQoyLjM0NSBrbQo1LjQ5OTAyIE1KCjUuNDk5MDIgbWVnYWpvdWxlCjIuMDQ4IGtiCjIgS2liCjIzNDUuNgoyMzQ1NgoyMzQ1LjYKMjM0NTYKbQptZXRlcgowCjEKQGVuZHZlcmJhdGltCi8vW2F1dG9wcmVmaXhlc19vdXRwdXQKCi8vXSBbL2F1dG9wcmVmaXhlc19vdXRwdXQKCioqLwoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKI2luY2x1ZGUgPGJvb3N0L3VuaXRzL2lvLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3VuaXRzL3Bvdy5ocHA+CiNpbmNsdWRlIDxib29zdC91bml0cy9zeXN0ZW1zL3NpLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3VuaXRzL3N5c3RlbXMvc2kvaW8uaHBwPgojaW5jbHVkZSA8Ym9vc3QvdW5pdHMvcXVhbnRpdHkuaHBwPgoKc3RydWN0IGJ5dGVfYmFzZV91bml0IDogYm9vc3Q6OnVuaXRzOjpiYXNlX3VuaXQ8Ynl0ZV9iYXNlX3VuaXQsIGJvb3N0Ojp1bml0czo6ZGltZW5zaW9ubGVzc190eXBlLCAzPgp7CiAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybigiYnl0ZSIpOyB9CiAgc3RhdGljIGNvbnN0IGNoYXIqIHN5bWJvbCgpIHsgcmV0dXJuKCJiIik7IH0KfTsKCnN0cnVjdCB0aGluZ19iYXNlX3VuaXQgOiBib29zdDo6dW5pdHM6OmJhc2VfdW5pdDx0aGluZ19iYXNlX3VuaXQsIGJvb3N0Ojp1bml0czo6ZGltZW5zaW9ubGVzc190eXBlLCA0Pgp7CiAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybigidGhpbmciKTsgfQogIHN0YXRpYyBjb25zdCBjaGFyKiBzeW1ib2woKSB7IHJldHVybigiIik7IH0KfTsKCnN0cnVjdCBldXJvX2Jhc2VfdW5pdCA6IGJvb3N0Ojp1bml0czo6YmFzZV91bml0PGV1cm9fYmFzZV91bml0LCBib29zdDo6dW5pdHM6OmRpbWVuc2lvbmxlc3NfdHlwZSwgNT4KewogIHN0YXRpYyBjb25zdCBjaGFyKiBuYW1lKCkgeyByZXR1cm4oIkVVUiIpOyB9CiAgc3RhdGljIGNvbnN0IGNoYXIqIHN5bWJvbCgpIHsgcmV0dXJuKCKAIik7IH0KfTsKCmludCBtYWluKCkKewogIHVzaW5nIHN0ZDo6Y291dDsKICB1c2luZyBzdGQ6OmVuZGw7CgogIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdHM7CiAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0czo6c2k7CgogLy9bYXV0b3ByZWZpeGVzX3NuaXBwZXRfMQogIHVzaW5nIGJvb3N0Ojp1bml0czo6YmluYXJ5X3ByZWZpeDsKICB1c2luZyBib29zdDo6dW5pdHM6OmVuZ2luZWVyaW5nX3ByZWZpeDsKICB1c2luZyBib29zdDo6dW5pdHM6Om5vX3ByZWZpeDsKCiAgcXVhbnRpdHk8bGVuZ3RoPiBsID0gMi4zNDUgKiBtZXRlcnM7ICAgLy8gQSBxdWFudGl0eSBvZiBsZW5ndGgsIGluIHVuaXRzIG9mIG1ldGVycy4KICBjb3V0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCBsIDw8IGVuZGw7IC8vIE91dHB1dHMgIjIuMzQ1IG0iLgogIGwgPSAgMTAwMC4wICogbDsgLy8gSW5jcmVhc2UgaXQgYnkgMTAwMCwgc28gZXhwZWN0IGEgayBwcmVmaXguCiAgLy8gTm90ZSB0aGF0IGEgZG91YmxlIDEwMDAuMCBpcyByZXF1aXJlZCAtIGFuIGludGVnZXIgd2lsbCBmYWlsIHRvIGNvbXBpbGUuCiAgY291dCA8PCBlbmdpbmVlcmluZ19wcmVmaXggPDwgbCA8PCBlbmRsOyAvLyBPdXRwdXQgYXV0b3ByZWZpeGVkIHdpdGggayB0byAiMi4zNDUga20iLgoKICBxdWFudGl0eTxlbmVyZ3k+IGUgPSBraWxvZ3JhbXMgKiBwb3c8Mj4obCAvIHNlY29uZHMpOyAvLyBBIHF1YW50aXR5IG9mIGVuZXJneS4KICBjb3V0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCBlIDw8IGVuZGw7IC8vIDUuNDk5MDIgTUoKICBjb3V0IDw8IG5hbWVfZm9ybWF0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCBlIDw8IGVuZGw7IC8vIDUuNDk5MDIgbWVnYUpvdWxlCiAgLy9dIFsvYXV0b3ByZWZpeGVzX3NuaXBwZXRfMV0KCiAgLy9bYXV0b3ByZWZpeGVzX3NuaXBwZXRfMgogIC8vIERvbid0IGZvcmdldCB0aGF0IHRoZSB1bml0cyBuYW1lIG9yIHN5bWJvbCBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyBwZXJzaXN0ZW50LgogIGNvdXQgPDwgc3ltYm9sX2Zvcm1hdCA8PCBlbmRsOyAvLyBSZXNldHMgdGhlIGZvcm1hdCB0byB0aGUgZGVmYXVsdCBzeW1ib2wgZm9ybWF0LgoKICBxdWFudGl0eTxieXRlX2Jhc2VfdW5pdDo6dW5pdF90eXBlPiBiID0gMjA0OC4gKiBieXRlX2Jhc2VfdW5pdDo6dW5pdF90eXBlKCk7CiAgY291dCA8PCBlbmdpbmVlcmluZ19wcmVmaXggPDwgYiA8PCBlbmRsOyAgLy8gMi4wNDgga2IKICBjb3V0IDw8IHN5bWJvbF9mb3JtYXQgPDwgYmluYXJ5X3ByZWZpeCA8PCBiIDw8IGVuZGw7IC8vICAiMiBLaWIiIAogIC8vXSBbL2F1dG9wcmVmaXhlc19zbmlwcGV0XzJdCgogIC8vIE5vdGUgdGhhdCBzY2FsYXIgZGltZW5zaW9ubGVzcyB2YWx1ZXMgYXJlICpub3QqIHByZWZpeGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGVuZ2luZWVyaW5nX3ByZWZpeCBvciBiaW5hcnlfcHJlZml4IGlvc3RyZWFtIG1hbmlwdWxhdG9ycy4KICAvL1thdXRvcHJlZml4ZXNfc25pcHBldF8zCiAgY29uc3QgZG91YmxlIHMxID0gMjM0NS42OwogIGNvbnN0IGxvbmcgeDEgPSAyMzQ1NjsKICBjb3V0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCBzMSA8PCBlbmRsOyAvLyAyMzQ1LjYKICBjb3V0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCB4MSA8PCBlbmRsOyAvLyAyMzQ1NgoKICBjb3V0IDw8IGJpbmFyeV9wcmVmaXggPDwgczEgPDwgZW5kbDsgLy8gMjM0NS42CiAgY291dCA8PCBiaW5hcnlfcHJlZml4IDw8IHgxIDw8IGVuZGw7IC8vIDIzNDU2CiAgLy9dIFsvYXV0b3ByZWZpeGVzX3NuaXBwZXRfM10KCiAgLy9bYXV0b3ByZWZpeGVzX3NuaXBwZXRfNAogIGNvbnN0IGxlbmd0aCBMOyAvLyBBIHVuaXQgb2YgbGVuZ3RoIChidXQgbm90IGEgcXVhbnRpdHkgb2YgbGVuZ3RoKS4KICBjb3V0IDw8IEwgPDwgZW5kbDsgLy8gRGVmYXVsdCBsZW5ndGggdW5pdCBpcyBtZXRlciwKICAvLyBidXQgZGVmYXVsdCBpcyBzeW1ib2wgZm9ybWF0IHNvIG91dHB1dCBpcyBqdXN0ICJtIi4KICBjb3V0IDw8IG5hbWVfZm9ybWF0IDw8IEwgPDwgZW5kbDsgLy8gZGVmYXVsdCBsZW5ndGggbmFtZSBpcyAibWV0ZXIiLgogIC8vXSBbL2F1dG9wcmVmaXhlc19zbmlwcGV0XzRdCgogIC8vW2F1dG9wcmVmaXhlc19zbmlwcGV0XzUKICBub19wcmVmaXgoY291dCk7IC8vIENsZWFyIGFueSBwcmVmaXggZmxhZy4KICBjb3V0IDw8IG5vX3ByZWZpeCA8PCBlbmRsOyAvLyBDbGVhciBhbnkgcHJlZml4IGZsYWcgdXNpbmcgYG5vX3ByZWZpeGAgbWFuaXB1bGF0b3IuCiAgLy9dIFsvYXV0b3ByZWZpeGVzX3NuaXBwZXRfNV0KCiAgLy9bYXV0b3ByZWZpeGVzX3NuaXBwZXRfNgogIGNvdXQgPDwgYm9vc3Q6OnVuaXRzOjpnZXRfYXV0b3ByZWZpeChjb3V0KSA8PCBlbmRsOyAvLyA4IGlzIGBhdXRvcHJlZml4X2JpbmFyeWAgZnJvbSBgZW51bSBhdXRvcHJlZml4X21vZGVgLgogIGNvdXQgPDwgYm9vc3Q6OnVuaXRzOjpnZXRfZm9ybWF0KGNvdXQpIDw8IGVuZGw7IC8vIDEgaXMgYG5hbWVfZm10YCBmcm9tIGBlbnVtIGZvcm1hdF9tb2RlYC4KICAvL10gWy9hdXRvcHJlZml4ZXNfc25pcHBldF82XQoKCiAgcXVhbnRpdHk8dGhpbmdfYmFzZV91bml0Ojp1bml0X3R5cGU+IHQgPSAyMDQ4LiAqIHRoaW5nX2Jhc2VfdW5pdDo6dW5pdF90eXBlKCk7CiAgY291dCA8PCBuYW1lX2Zvcm1hdCA8PCBlbmdpbmVlcmluZ19wcmVmaXggPDwgdCA8PCBlbmRsOyAgLy8gMi4wNDgga2lsb3RoaW5nCiAgY291dCA8PCBzeW1ib2xfZm9ybWF0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCB0IDw8IGVuZGw7ICAvLyAyLjA0OCBrCiAKICBjb3V0ICA8PCBiaW5hcnlfcHJlZml4IDw8IHQgPDwgZW5kbDsgLy8gICIyIEtpIiAKCiAgcXVhbnRpdHk8ZXVyb19iYXNlX3VuaXQ6OnVuaXRfdHlwZT4gY2UgPSAyMDQ4LiAqIGV1cm9fYmFzZV91bml0Ojp1bml0X3R5cGUoKTsKICBjb3V0IDw8IG5hbWVfZm9ybWF0IDw8IGVuZ2luZWVyaW5nX3ByZWZpeCA8PCBjZSA8PCBlbmRsOyAgLy8gMi4wNDgga2lsb0VVUgogIGNvdXQgPDwgc3ltYm9sX2Zvcm1hdCA8PCBlbmdpbmVlcmluZ19wcmVmaXggPDwgY2UgPDwgZW5kbDsgIC8vIDIuMDQ4IGuACgoKICAgIHJldHVybiAwOwp9IC8vIGludCBtYWluKCkKCg==