Ly8gIENvcHlyaWdodCAoYykgMjAwMS0yMDEwIEhhcnRtdXQgS2Fpc2VyCi8vCi8vICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCi8vICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKCi8vIHRoaXMgZmlsZSBkZWxpYmVyYXRlbHkgY29udGFpbnMgbm9uLWFzY2lpIGNoYXJhY3RlcnMKLy8gYm9vc3RpbnNwZWN0Om5vYXNjaWkKCiNpbmNsdWRlIDxib29zdC9jb25maWcvd2FybmluZ19kaXNhYmxlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2RldGFpbC9saWdodHdlaWdodF90ZXN0LmhwcD4KCiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9vcGVyYXRvci5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9jaGFyLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL2thcm1hX2F1eGlsaWFyeS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9zdHJpbmcuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWFfbnVtZXJpYy5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9ub250ZXJtaW5hbC5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9hY3Rpb24uaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWFfZGlyZWN0aXZlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfY29yZS5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9waG9lbml4X29wZXJhdG9yLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfc3RhdGVtZW50LmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL3Bob2VuaXhfZnVzaW9uLmhwcD4KCiNpbmNsdWRlICJ0ZXN0LmhwcCIKCnVzaW5nIG5hbWVzcGFjZSBzcGlyaXRfdGVzdDsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KaW50IG1haW4oKQp7CiAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnNwaXJpdDsKICAgIHVzaW5nIG5hbWVzcGFjZSBib29zdDo6c3Bpcml0Ojphc2NpaTsKCiAgICB0eXBlZGVmIHNwaXJpdF90ZXN0OjpvdXRwdXRfaXRlcmF0b3I8Y2hhcj46OnR5cGUgb3V0aXRlcl90eXBlOwoKICAgIHsKICAgICAgICBrYXJtYTo6cnVsZTxvdXRpdGVyX3R5cGUsIHZvaWQoY2hhciwgaW50LCBkb3VibGUpPiBzdGFydDsKICAgICAgICBmdXNpb246OnZlY3RvcjxjaGFyLCBpbnQsIGRvdWJsZT4gdmVjKCdhJywgMTAsIDEyLjQpOwoKICAgICAgICBzdGFydCA9IGNoYXJfW18xID0gX3IxXSA8PCBpbnRfW18xID0gX3IyXSA8PCBkb3VibGVfW18xID0gX3IzXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoImExMDEyLjQiLCBzdGFydCgnYScsIDEwLCAxMi40KSkpOwoKICAgICAgICBzdGFydCA9IChjaGFyXyA8PCBpbnRfIDw8IGRvdWJsZV8pW18xID0gX3IxLCBfMiA9IF9yMiwgXzMgPSBfcjNdOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYTEwMTIuNCIsIHN0YXJ0KCdhJywgMTAsIDEyLjQpKSk7CgogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZSwgdm9pZChjaGFyKT4gYTsKICAgICAgICBrYXJtYTo6cnVsZTxvdXRpdGVyX3R5cGUsIHZvaWQoaW50KT4gYjsKICAgICAgICBrYXJtYTo6cnVsZTxvdXRpdGVyX3R5cGUsIHZvaWQoZG91YmxlKT4gYzsKCiAgICAgICAgYSA9IGNoYXJfW18xID0gX3IxXTsKICAgICAgICBiID0gaW50X1tfMSA9IF9yMV07CiAgICAgICAgYyA9IGRvdWJsZV9bXzEgPSBfcjFdOwogICAgICAgIHN0YXJ0ID0gYShfcjEpIDw8IGIoX3IyKSA8PCBjKF9yMyk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCJhMTAxMi40Iiwgc3RhcnQoJ2EnLCAxMCwgMTIuNCkpKTsKICAgIH0KCiAgICB7CiAgICAgICAga2FybWE6OnJ1bGU8b3V0aXRlcl90eXBlLCBzcGFjZV90eXBlLCB2b2lkKGNoYXIsIGludCwgZG91YmxlKT4gc3RhcnQ7CiAgICAgICAgZnVzaW9uOjp2ZWN0b3I8Y2hhciwgaW50LCBkb3VibGU+IHZlYygnYScsIDEwLCAxMi40KTsKCiAgICAgICAgc3RhcnQgPSBjaGFyX1tfMSA9IF9yMV0gPDwgaW50X1tfMSA9IF9yMl0gPDwgZG91YmxlX1tfMSA9IF9yM107CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0X2RlbGltaXRlZCgiYSAxMCAxMi40ICIsIHN0YXJ0KCdhJywgMTAsIDEyLjQpLCBzcGFjZSkpOwoKICAgICAgICBzdGFydCA9IChjaGFyXyA8PCBpbnRfIDw8IGRvdWJsZV8pW18xID0gX3IxLCBfMiA9IF9yMiwgXzMgPSBfcjNdOwogICAgICAgIEJPT1NUX1RFU1QodGVzdF9kZWxpbWl0ZWQoImEgMTAgMTIuNCAiLCBzdGFydCgnYScsIDEwLCAxMi40KSwgc3BhY2UpKTsKCiAgICAgICAga2FybWE6OnJ1bGU8b3V0aXRlcl90eXBlLCBzcGFjZV90eXBlLCB2b2lkKGNoYXIpPiBhOwogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZSwgc3BhY2VfdHlwZSwgdm9pZChpbnQpPiBiOwogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZSwgc3BhY2VfdHlwZSwgdm9pZChkb3VibGUpPiBjOwoKICAgICAgICBhID0gY2hhcl9bXzEgPSBfcjFdOwogICAgICAgIGIgPSBpbnRfW18xID0gX3IxXTsKICAgICAgICBjID0gZG91YmxlX1tfMSA9IF9yMV07CiAgICAgICAgc3RhcnQgPSBhKF9yMSkgPDwgYihfcjIpIDw8IGMoX3IzKTsKICAgICAgICBCT09TVF9URVNUKHRlc3RfZGVsaW1pdGVkKCJhIDEwIDEyLjQgIiwgc3RhcnQoJ2EnLCAxMCwgMTIuNCksIHNwYWNlKSk7CiAgICB9CgogICAgLy8gY29weSB0ZXN0cwogICAgewogICAgICAgIHR5cGVkZWYgdmFyaWFudDxjaGFyLCBpbnQsIGRvdWJsZT4gdmFyX3R5cGU7CgogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZT4gYSwgYiwgYywgc3RhcnQ7CgogICAgICAgIGEgPSAnYSc7CiAgICAgICAgYiA9IGludF8oMTApOwogICAgICAgIGMgPSBkb3VibGVfKDEyLjQpOwoKICAgICAgICAvLyBUaGUgRkYgaXMgdGhlIGR5bmFtaWMgZXF1aXZhbGVudCBvZiBzdGFydCA9IGEgPDwgYiA8PCBjOwogICAgICAgIHN0YXJ0ID0gYTsKICAgICAgICBzdGFydCA9IHN0YXJ0LmNvcHkoKSA8PCBiOwogICAgICAgIHN0YXJ0ID0gc3RhcnQuY29weSgpIDw8IGM7CiAgICAgICAgc3RhcnQgPSBzdGFydC5jb3B5KCk7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiYTEwMTIuNCIsIHN0YXJ0KSk7CiAgICB9CgogICAgewogICAgICAgIHR5cGVkZWYgdmFyaWFudDxjaGFyLCBpbnQsIGRvdWJsZT4gdmFyX3R5cGU7CgogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZSwgc3BhY2VfdHlwZT4gYSwgYiwgYywgc3RhcnQ7CgogICAgICAgIGEgPSAnYSc7CiAgICAgICAgYiA9IGludF8oMTApOwogICAgICAgIGMgPSBkb3VibGVfKDEyLjQpOwoKICAgICAgICAvLyBUaGUgRkYgaXMgdGhlIGR5bmFtaWMgZXF1aXZhbGVudCBvZiBzdGFydCA9IGEgPDwgYiA8PCBjOwogICAgICAgIHN0YXJ0ID0gYTsKICAgICAgICBzdGFydCA9IHN0YXJ0LmNvcHkoKSA8PCBiOwogICAgICAgIHN0YXJ0ID0gc3RhcnQuY29weSgpIDw8IGM7CiAgICAgICAgc3RhcnQgPSBzdGFydC5jb3B5KCk7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdF9kZWxpbWl0ZWQoImEgMTAgMTIuNCAiLCBzdGFydCwgc3BhY2UpKTsKICAgIH0KCiNpZiBCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIEJPT1NUX1RFU1RFRF9BVCgxMzEwKSkKI3ByYWdtYSBzZXRsb2NhbGUoImZyZW5jaCIpCiNlbmRpZgogICAgeyAvLyBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZwogICAgICAgIHVzaW5nIGthcm1hOjpsb3dlcjsKICAgICAgICB1c2luZyBrYXJtYTo6dXBwZXI7CiAgICAgICAgdXNpbmcga2FybWE6OnN0cmluZzsKCiAgICAgICAgdHlwZWRlZiBib29zdDo6c3Bpcml0OjpjaGFyX2VuY29kaW5nOjppc284ODU5XzEgaXNvODg1OV8xOwogICAgICAgIGthcm1hOjpydWxlPG91dGl0ZXJfdHlwZSwgaXNvODg1OV8xPiByOwoKICAgICAgICByID0gbG93ZXJbJ+EnXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuEiLCByKSk7CiAgICAgICAgciA9IGxvd2VyW2NoYXJfKCfBJyldOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgi4SIsIHIpKTsKICAgICAgICByID0gdXBwZXJbJ+EnXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsEiLCByKSk7CiAgICAgICAgciA9IHVwcGVyW2NoYXJfKCfBJyldOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiwSIsIHIpKTsKCiAgICAgICAgciA9IGxvd2VyWyLhwSJdOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgi4eEiLCByKSk7CiAgICAgICAgciA9IGxvd2VyW2xpdCgi4cEiKV07CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLh4SIsIHIpKTsKICAgICAgICByID0gbG93ZXJbc3RyaW5nKCLhwSIpXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuHhIiwgcikpOwogICAgICAgIHIgPSB1cHBlclsi4cEiXTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsHBIiwgcikpOwogICAgICAgIHIgPSB1cHBlcltsaXQoIuHBIildOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiwcEiLCByKSk7CiAgICAgICAgciA9IHVwcGVyW3N0cmluZygi4cEiKV07CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLBwSIsIHIpKTsKICAgIH0KCiNpZiBCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIEJPT1NUX1RFU1RFRF9BVCgxMzEwKSkKI3ByYWdtYSBzZXRsb2NhbGUoIiIpCiNlbmRpZgoKICAgIHJldHVybiBib29zdDo6cmVwb3J0X2Vycm9ycygpOwp9Cgo=