LyogbXBuL2djZC5jOiBtcG5fZ2NkIGZvciBnY2Qgb2YgdHdvIG9kZCBpbnRlZ2Vycy4KCkNvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLAoyMDA0LCAyMDA1LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBNUCBMaWJyYXJ5LgoKVGhlIEdOVSBNUCBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCm9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGUgR05VIE1QIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CldJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCm9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoZSBHTlUgTVAgTGlicmFyeS4gIElmIG5vdCwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8uICAqLwoKI2luY2x1ZGUgImdtcC5oIgojaW5jbHVkZSAiZ21wLWltcGwuaCIKI2luY2x1ZGUgImxvbmdsb25nLmgiCgovKiBVc2VzIHRoZSBIR0NEIG9wZXJhdGlvbiBkZXNjcmliZWQgaW4KCiAgICAgTi4gTfZsbGVyLCBPbiBTY2j2bmhhZ2UncyBhbGdvcml0aG0gYW5kIHN1YnF1YWRyYXRpYyBpbnRlZ2VyIGdjZAogICAgIGNvbXB1dGF0aW9uLCBNYXRoLiBDb21wLiA3NyAoMjAwOCksIDU4OS02MDcuCgogIHRvIHJlZHVjZSBpbnB1dHMgdW50aWwgdGhleSBhcmUgb2Ygc2l6ZSBiZWxvdyBHQ0RfRENfVEhSRVNIT0xELCBhbmQKICB0aGVuIHVzZXMgTGVobWVyJ3MgYWxnb3JpdGhtLgoqLwoKLyogU29tZSByZWFzb25hYmxlIGNob2ljZXMgYXJlIG4gLyAyIChzYW1lIGFzIGluIGhnY2QpLCBhbmQgcCA9IChuICsKICogMikvMywgd2hpY2ggZ2l2ZXMgYSBiYWxhbmNlZCBtdWx0aXBsaWNhdGlvbiBpbgogKiBtcG5faGdjZF9tYXRyaXhfYWRqdXN0LiBIb3dldmVyLCBwID0gMiBuLzMgZ2l2ZXMgc2xpZ2h0bHkgYmV0dGVyCiAqIHBlcmZvcm1hbmNlLiBUaGUgbWF0cml4LXZlY3RvciBtdWx0aXBsaWNhdGlvbiBpcyB0aGVuCiAqIDQ6MS11bmJhbGFuY2VkLCB3aXRoIG1hdHJpeCBlbGVtZW50cyBvZiBzaXplIG4vNiwgYW5kIHZlY3RvcgogKiBlbGVtZW50cyBvZiBzaXplIHAgPSAybi8zLiAqLwoKLyogRnJvbSBhbmFseXNpcyBvZiB0aGUgdGhlb3JldGljYWwgcnVubmluZyB0aW1lLCBpdCBhcHBlYXJzIHRoYXQgd2hlbgogKiBtdWx0aXBsaWNhdGlvbiB0YWtlcyB0aW1lIE8obl5hbHBoYSksIHAgc2hvdWxkIGJlIGNob3NlbiBzbyB0aGF0CiAqIHRoZSByYXRpbyBvZiB0aGUgdGltZSBmb3IgdGhlIG1wbl9oZ2NkIGNhbGwsIGFuZCB0aGUgdGltZSBmb3IgdGhlCiAqIG11bHRpcGxpY2F0aW9uIGluIG1wbl9oZ2NkX21hdHJpeF9hZGp1c3QsIGlzIHJvdWdobHkgMS8oYWxwaGEgLQogKiAxKS4gKi8KI2lmZGVmIFRVTkVfR0NEX1AKI2RlZmluZSBQX1RBQkxFX1NJWkUgMTAwMDAKbXBfc2l6ZV90IHBfdGFibGVbUF9UQUJMRV9TSVpFXTsKI2RlZmluZSBDSE9PU0VfUChuKSAoIChuKSA8IFBfVEFCTEVfU0laRSA/IHBfdGFibGVbbl0gOiAyKihuKS8zKQojZWxzZQojZGVmaW5lIENIT09TRV9QKG4pICgyKihuKSAvIDMpCiNlbmRpZgoKbXBfc2l6ZV90Cm1wbl9nY2QgKG1wX3B0ciBncCwgbXBfcHRyIHVwLCBtcF9zaXplX3QgdXNpemUsIG1wX3B0ciB2cCwgbXBfc2l6ZV90IG4pCnsKICBtcF9zaXplX3QgdGFsbG9jOwogIG1wX3NpemVfdCBzY3JhdGNoOwogIG1wX3NpemVfdCBtYXRyaXhfc2NyYXRjaDsKCiAgbXBfc2l6ZV90IGduOwogIG1wX3B0ciB0cDsKICBUTVBfREVDTDsKCiAgLyogRklYTUU6IENoZWNrIGZvciBzbWFsbCBzaXplcyBmaXJzdCwgYmVmb3JlIHNldHRpbmcgdXAgdGVtcG9yYXJ5CiAgICAgc3RvcmFnZSBldGMuICovCiAgdGFsbG9jID0gTVBOX0dDRF9MRUhNRVJfTl9JVENIKG4pOwoKICAvKiBGb3IgaW5pdGlhbCBkaXZpc2lvbiAqLwogIHNjcmF0Y2ggPSB1c2l6ZSAtIG4gKyAxOwogIGlmIChzY3JhdGNoID4gdGFsbG9jKQogICAgdGFsbG9jID0gc2NyYXRjaDsKCiNpZiBUVU5FX0dDRF9QCiAgaWYgKENIT09TRV9QIChuKSA+IDApCiNlbHNlCiAgaWYgKEFCT1ZFX1RIUkVTSE9MRCAobiwgR0NEX0RDX1RIUkVTSE9MRCkpCiNlbmRpZgogICAgewogICAgICBtcF9zaXplX3QgaGdjZF9zY3JhdGNoOwogICAgICBtcF9zaXplX3QgdXBkYXRlX3NjcmF0Y2g7CiAgICAgIG1wX3NpemVfdCBwID0gQ0hPT1NFX1AgKG4pOwogICAgICBtcF9zaXplX3Qgc2NyYXRjaDsKI2lmIFRVTkVfR0NEX1AKICAgICAgLyogV29yc3QgY2FzZSwgc2luY2Ugd2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgbiAtIENIT09TRV9QKG4pCgkgaXMgaW5jcmVhc2luZyAqLwogICAgICBtYXRyaXhfc2NyYXRjaCA9IE1QTl9IR0NEX01BVFJJWF9JTklUX0lUQ0ggKG4pOwogICAgICBoZ2NkX3NjcmF0Y2ggPSBtcG5faGdjZF9pdGNoIChuKTsKICAgICAgdXBkYXRlX3NjcmF0Y2ggPSAyKihuIC0gMSk7CiNlbHNlCiAgICAgIG1hdHJpeF9zY3JhdGNoID0gTVBOX0hHQ0RfTUFUUklYX0lOSVRfSVRDSCAobiAtIHApOwogICAgICBoZ2NkX3NjcmF0Y2ggPSBtcG5faGdjZF9pdGNoIChuIC0gcCk7CiAgICAgIHVwZGF0ZV9zY3JhdGNoID0gcCArIG4gLSAxOwojZW5kaWYKICAgICAgc2NyYXRjaCA9IG1hdHJpeF9zY3JhdGNoICsgTUFYKGhnY2Rfc2NyYXRjaCwgdXBkYXRlX3NjcmF0Y2gpOwogICAgICBpZiAoc2NyYXRjaCA+IHRhbGxvYykKCXRhbGxvYyA9IHNjcmF0Y2g7CiAgICB9CgogIFRNUF9NQVJLOwogIHRwID0gVE1QX0FMTE9DX0xJTUJTKHRhbGxvYyk7CgogIGlmICh1c2l6ZSA+IG4pCiAgICB7CiAgICAgIG1wbl90ZGl2X3FyICh0cCwgdXAsIDAsIHVwLCB1c2l6ZSwgdnAsIG4pOwoKICAgICAgaWYgKG1wbl96ZXJvX3AgKHVwLCBuKSkKCXsKCSAgTVBOX0NPUFkgKGdwLCB2cCwgbik7CgkgIFRNUF9GUkVFOwoJICByZXR1cm4gbjsKCX0KICAgIH0KCiNpZiBUVU5FX0dDRF9QCiAgd2hpbGUgKENIT09TRV9QIChuKSA+IDApCiNlbHNlCiAgd2hpbGUgKEFCT1ZFX1RIUkVTSE9MRCAobiwgR0NEX0RDX1RIUkVTSE9MRCkpCiNlbmRpZgogICAgewogICAgICBzdHJ1Y3QgaGdjZF9tYXRyaXggTTsKICAgICAgbXBfc2l6ZV90IHAgPSBDSE9PU0VfUCAobik7CiAgICAgIG1wX3NpemVfdCBtYXRyaXhfc2NyYXRjaCA9IE1QTl9IR0NEX01BVFJJWF9JTklUX0lUQ0ggKG4gLSBwKTsKICAgICAgbXBfc2l6ZV90IG5uOwogICAgICBtcG5faGdjZF9tYXRyaXhfaW5pdCAoJk0sIG4gLSBwLCB0cCk7CiAgICAgIG5uID0gbXBuX2hnY2QgKHVwICsgcCwgdnAgKyBwLCBuIC0gcCwgJk0sIHRwICsgbWF0cml4X3NjcmF0Y2gpOwogICAgICBpZiAobm4gPiAwKQoJewoJICBBU1NFUlQgKE0ubiA8PSAobiAtIHAgLSAxKS8yKTsKCSAgQVNTRVJUIChNLm4gKyBwIDw9IChwICsgbiAtIDEpIC8gMik7CgkgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIDIgKHAgKyBNLT5uKSA8PSBwICsgbiAtIDEuICovCgkgIG4gPSBtcG5faGdjZF9tYXRyaXhfYWRqdXN0ICgmTSwgcCArIG5uLCB1cCwgdnAsIHAsIHRwICsgbWF0cml4X3NjcmF0Y2gpOwoJfQogICAgICBlbHNlCgl7CgkgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIG4gKi8KCSAgbiA9IG1wbl9nY2Rfc3ViZGl2X3N0ZXAgKGdwLCAmZ24sIHVwLCB2cCwgbiwgdHApOwoJICBpZiAobiA9PSAwKQoJICAgIHsKCSAgICAgIFRNUF9GUkVFOwoJICAgICAgcmV0dXJuIGduOwoJICAgIH0KCX0KICAgIH0KCiAgZ24gPSBtcG5fZ2NkX2xlaG1lcl9uIChncCwgdXAsIHZwLCBuLCB0cCk7CiAgVE1QX0ZSRUU7CiAgcmV0dXJuIGduOwp9CgojaWZkZWYgVFVORV9HQ0RfUAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSAic3BlZWQuaCIKCnN0YXRpYyBpbnQKY29tcGFyZV9kb3VibGUoY29uc3Qgdm9pZCAqYXAsIGNvbnN0IHZvaWQgKmJwKQp7CiAgZG91YmxlIGEgPSAqIChjb25zdCBkb3VibGUgKikgYXA7CiAgZG91YmxlIGIgPSAqIChjb25zdCBkb3VibGUgKikgYnA7CgogIGlmIChhIDwgYikKICAgIHJldHVybiAtMTsKICBlbHNlIGlmIChhID4gYikKICAgIHJldHVybiAxOwogIGVsc2UKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgZG91YmxlCm1lZGlhbiAoZG91YmxlICp2LCBzaXplX3QgbikKewogIHFzb3J0KHYsIG4sIHNpemVvZigqdiksIGNvbXBhcmVfZG91YmxlKTsKCiAgcmV0dXJuIHZbbi8yXTsKfQoKI2RlZmluZSBUSU1FKHJlcywgY29kZSkgZG8gewkJCQlcCiAgZG91YmxlIHRpbWVfbWVhc3VyZW1lbnRbNV07CQkJCVwKICB1bnNpZ25lZCB0aW1lX2k7CQkJCQlcCgkJCQkJCQlcCiAgZm9yICh0aW1lX2kgPSAwOyB0aW1lX2kgPCA1OyB0aW1lX2krKykJCVwKICAgIHsJCQkJCQkJXAogICAgICBzcGVlZF9zdGFydHRpbWUoKTsJCQkJXAogICAgICBjb2RlOwkJCQkJCVwKICAgICAgdGltZV9tZWFzdXJlbWVudFt0aW1lX2ldID0gc3BlZWRfZW5kdGltZSgpOwlcCiAgICB9CQkJCQkJCVwKICByZXMgPSBtZWRpYW4odGltZV9tZWFzdXJlbWVudCwgNSk7CQkJXAp9IHdoaWxlICgwKQoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3YpCnsKICBnbXBfcmFuZHN0YXRlX3QgcmFuZHM7CiAgbXBfc2l6ZV90IG47CiAgbXBfcHRyIGFwOwogIG1wX3B0ciBicDsKICBtcF9wdHIgdXA7CiAgbXBfcHRyIHZwOwogIG1wX3B0ciBncDsKICBtcF9wdHIgdHA7CiAgVE1QX0RFQ0w7CgogIC8qIFVuYnVmZmVyZWQgc28gaWYgb3V0cHV0IGlzIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIGl0IGlzbid0IGxvc3QgaWYgdGhlCiAgICAgcHJvZ3JhbSBpcyBraWxsZWQgcGFydCB3YXkgdGhyb3VnaC4gICovCiAgc2V0YnVmIChzdGRvdXQsIE5VTEwpOwogIHNldGJ1ZiAoc3RkZXJyLCBOVUxMKTsKCiAgZ21wX3JhbmRpbml0X2RlZmF1bHQgKHJhbmRzKTsKCiAgVE1QX01BUks7CgogIGFwID0gVE1QX0FMTE9DX0xJTUJTIChQX1RBQkxFX1NJWkUpOwogIGJwID0gVE1QX0FMTE9DX0xJTUJTIChQX1RBQkxFX1NJWkUpOwogIHVwID0gVE1QX0FMTE9DX0xJTUJTIChQX1RBQkxFX1NJWkUpOwogIHZwID0gVE1QX0FMTE9DX0xJTUJTIChQX1RBQkxFX1NJWkUpOwogIGdwID0gVE1QX0FMTE9DX0xJTUJTIChQX1RBQkxFX1NJWkUpOwogIHRwID0gVE1QX0FMTE9DX0xJTUJTIChNUE5fR0NEX0xFSE1FUl9OX0lUQ0ggKFBfVEFCTEVfU0laRSkpOwoKICBtcG5fcmFuZG9tIChhcCwgUF9UQUJMRV9TSVpFKTsKICBtcG5fcmFuZG9tIChicCwgUF9UQUJMRV9TSVpFKTsKCiAgbWVtc2V0IChwX3RhYmxlLCAwLCBzaXplb2YocF90YWJsZSkpOwoKICBmb3IgKG4gPSAxMDA7IG4rKzsgbiA8IFBfVEFCTEVfU0laRSkKICAgIHsKICAgICAgbXBfc2l6ZV90IHA7CiAgICAgIG1wX3NpemVfdCBiZXN0X3A7CiAgICAgIGRvdWJsZSBiZXN0X3RpbWU7CiAgICAgIGRvdWJsZSBsZWhtZXJfdGltZTsKCiAgICAgIGlmIChhcFtuLTFdID09IDApCglhcFtuLTFdID0gMTsKCiAgICAgIGlmIChicFtuLTFdID09IDApCglicFtuLTFdID0gMTsKCiAgICAgIHBfdGFibGVbbl0gPSAwOwogICAgICBUSU1FKGxlaG1lcl90aW1lLCB7CgkgIE1QTl9DT1BZICh1cCwgYXAsIG4pOwoJICBNUE5fQ09QWSAodnAsIGJwLCBuKTsKCSAgbXBuX2djZF9sZWhtZXJfbiAoZ3AsIHVwLCB2cCwgbiwgdHApOwoJfSk7CgogICAgICBiZXN0X3RpbWUgPSBsZWhtZXJfdGltZTsKICAgICAgYmVzdF9wID0gMDsKCiAgICAgIGZvciAocCA9IG4gKiAwLjQ4OyBwIDwgbiAqIDAuNzc7IHArKykKCXsKCSAgZG91YmxlIHQ7CgoJICBwX3RhYmxlW25dID0gcDsKCgkgIFRJTUUodCwgewoJICAgICAgTVBOX0NPUFkgKHVwLCBhcCwgbik7CgkgICAgICBNUE5fQ09QWSAodnAsIGJwLCBuKTsKCSAgICAgIG1wbl9nY2QgKGdwLCB1cCwgbiwgdnAsIG4pOwoJICAgIH0pOwoKCSAgaWYgKHQgPCBiZXN0X3RpbWUpCgkgICAgewoJICAgICAgYmVzdF90aW1lID0gdDsKCSAgICAgIGJlc3RfcCA9IHA7CgkgICAgfQoJfQogICAgICBwcmludGYoIiU2ZCAlNmQgJTUuM2ciLCBuLCBiZXN0X3AsIChkb3VibGUpIGJlc3RfcCAvIG4pOwogICAgICBpZiAoYmVzdF9wID4gMCkKCXsKCSAgZG91YmxlIHNwZWVkdXAgPSAxMDAgKiAobGVobWVyX3RpbWUgLSBiZXN0X3RpbWUpIC8gbGVobWVyX3RpbWU7CgkgIHByaW50ZigiICU1LjNnJSUiLCBzcGVlZHVwKTsKCSAgaWYgKHNwZWVkdXAgPCAxLjApCgkgICAgewoJICAgICAgcHJpbnRmKCIgKGlnbm9yZWQpIik7CgkgICAgICBiZXN0X3AgPSAwOwoJICAgIH0KCX0KICAgICAgcHJpbnRmKCJcbiIpOwoKICAgICAgcF90YWJsZVtuXSA9IGJlc3RfcDsKICAgIH0KICBUTVBfRlJFRTsKICBnbXBfcmFuZGNsZWFyKHJhbmRzKTsKICByZXR1cm4gMDsKfQojZW5kaWYgLyogVFVORV9HQ0RfUCAqLwo=