LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBTSU1QTEVUWi5ICioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA0LzIxLzk3ICAgIGFsaXUgICAgICAgIE92ZXJoYXVsZWQgaGVhZGVyLgoqICAgIDA4LzEwLzk4ICAgIHN0ZXBoZW4gICAgICAgIEpESyAxLjIgc3luYwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHNldFN0YXJ0UnVsZSgpIC8gc2V0RW5kUnVsZSgpIG92ZXJsb2FkcwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIGhhc1NhbWVSdWxlcygpCiogICAgMDkvMDIvOTggICAgc3RlcGhlbiAgICAgICAgQWRkZWQgZ2V0T2Zmc2V0KG1vbnRoTGVuKQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgZ2V0T2Zmc2V0KCkgdG8gdGFrZSBVRXJyb3JDb2RlCiogICAgMDcvMDkvOTkgICAgc3RlcGhlbiAgICAgUmVtb3ZlZCBtaWxsaXNQZXJIb3VyICh1bnVzZWQsIGZvciBIUCBjb21waWxlcikKKiAgIDEyLzAyLzk5ICAgIGFsaXUgICAgICAgIEFkZGVkIFRpbWVNb2RlIGFuZCBjb25zdHJ1Y3RvciBhbmQgc2V0U3RhcnQvRW5kUnVsZQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyB0aGF0IHRha2UgVGltZU1vZGUuIEFkZGVkIHRvIGRvY3MuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIFNJTVBMRVRaX0gKI2RlZmluZSBTSU1QTEVUWl9ICgojaW5jbHVkZSAidW5pY29kZS90aW1lem9uZS5oIgoKc3RydWN0IFN0YW5kYXJkWm9uZTsKc3RydWN0IERTVFpvbmU7CmNsYXNzIFRpbWVab25lOwoKLyoqCiAqIDxjb2RlPlNpbXBsZVRpbWVab25lPC9jb2RlPiBpcyBhIGNvbmNyZXRlIHN1YmNsYXNzIG9mIDxjb2RlPlRpbWVab25lPC9jb2RlPgogKiB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIHpvbmUgZm9yIHVzZSB3aXRoIGEgR3JlZ29yaWFuIGNhbGVuZGFyLiBUaGlzCiAqIGNsYXNzIGRvZXMgbm90IGhhbmRsZSBoaXN0b3JpY2FsIGNoYW5nZXMuCiAqIDxQPgogKiBXaGVuIHNwZWNpZnlpbmcgZGF5bGlnaHQtc2F2aW5ncy10aW1lIGJlZ2luIGFuZCBlbmQgZGF0ZXMsIHVzZSBhIG5lZ2F0aXZlIHZhbHVlIGZvcgogKiA8Y29kZT5kYXlPZldlZWtJbk1vbnRoPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IDxjb2RlPlNpbXBsZVRpbWVab25lPC9jb2RlPiBzaG91bGQKICogY291bnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBtb250aCBiYWNrd2FyZHMuIEZvciBleGFtcGxlLCBpbiB0aGUgVS5TLiwgRGF5bGlnaHQgU2F2aW5ncwogKiBUaW1lIGVuZHMgYXQgdGhlIGxhc3QgKGRheU9mV2Vla0luTW9udGggPSAtMSkgU3VuZGF5IGluIE9jdG9iZXIsIGF0IDIgQU0gaW4gc3RhbmRhcmQKICogdGltZS4KICoKICogQHNlZSAgICAgIENhbGVuZGFyCiAqIEBzZWUgICAgICBHcmVnb3JpYW5DYWxlbmRhcgogKiBAc2VlICAgICAgVGltZVpvbmUKICogQGF1dGhvciAgIERhdmlkIEdvbGRzbWl0aCwgTWFyayBEYXZpcywgQ2hlbi1MaWVoIEh1YW5nLCBBbGFuIExpdQogKi8KY2xhc3MgVV9JMThOX0FQSSBTaW1wbGVUaW1lWm9uZTogcHVibGljIFRpbWVab25lIHsKcHVibGljOgoKICAgIC8qKgogICAgICogVGltZU1vZGUgaXMgdXNlZCwgdG9nZXRoZXIgd2l0aCBhIG1pbGxpc2Vjb25kIG9mZnNldCBhZnRlcgogICAgICogbWlkbmlnaHQsIHRvIHNwZWNpZnkgYSBydWxlIHRyYW5zaXRpb24gdGltZS4gIE1vc3QgcnVsZXMKICAgICAqIHRyYW5zaXRpb24gYXQgYSBsb2NhbCB3YWxsIHRpbWUsIHRoYXQgaXMsIGFjY29yZGluZyB0byB0aGUKICAgICAqIGN1cnJlbnQgdGltZSBpbiBlZmZlY3QsIGVpdGhlciBzdGFuZGFyZCwgb3IgRFNULiAgSG93ZXZlciwgc29tZQogICAgICogcnVsZXMgdHJhbnNpdGlvbiBhdCBsb2NhbCBzdGFuZGFyZCB0aW1lLCBhbmQgc29tZSBhdCBhIHNwZWNpZmljCiAgICAgKiBVVEMgdGltZS4gIEFsdGhvdWdoIGl0IG1pZ2h0IHNlZW0gdGhhdCBhbGwgdGltZXMgY291bGQgYmUKICAgICAqIGNvbnZlcnRlZCB0byB3YWxsIHRpbWUsIHRodXMgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIHRoaXMKICAgICAqIHBhcmFtZXRlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UuCiAgICAgKi8KICAgIGVudW0gVGltZU1vZGUgewogICAgICAgIFdBTExfVElNRSA9IDAsCiAgICAgICAgU1RBTkRBUkRfVElNRSwKICAgICAgICBVVENfVElNRQogICAgfTsKCiAgICAvKioKICAgICAqIENvcHkgY29uc3RydWN0b3IKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUoY29uc3QgU2ltcGxlVGltZVpvbmUmIHNvdXJjZSk7CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IGFzc2lnbm1lbnQgb3BlcmF0b3IKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUmIG9wZXJhdG9yPShjb25zdCBTaW1wbGVUaW1lWm9uZSYgcmlnaHQpOwoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RvcgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIH5TaW1wbGVUaW1lWm9uZSgpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gVGltZVpvbmUgb2JqZWN0cyBhcmUgZXF1YWw7IHRoYXQgaXMsIHRoZXkgaGF2ZQogICAgICogdGhlIHNhbWUgSUQsIHJhdyBHTVQgb2Zmc2V0LCBhbmQgRFNUIHJ1bGVzLgogICAgICoKICAgICAqIEBwYXJhbSB0aGF0ICBUaGUgU2ltcGxlVGltZVpvbmUgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgICAgKiBAcmV0dXJuICAgICAgVHJ1ZSBpZiB0aGUgZ2l2ZW4gdGltZSB6b25lIGlzIGVxdWFsIHRvIHRoaXMgdGltZSB6b25lOyBmYWxzZQogICAgICogICAgICAgICAgICAgIG90aGVyd2lzZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBib29sX3Qgb3BlcmF0b3I9PShjb25zdCBUaW1lWm9uZSYgdGhhdCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgU2ltcGxlVGltZVpvbmUgd2l0aCB0aGUgZ2l2ZW4gcmF3IEdNVCBvZmZzZXQgYW5kIHRpbWUgem9uZSBJRCwKICAgICAqIGFuZCB3aGljaCBkb2Vzbid0IG9ic2VydmUgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLiAgTm9ybWFsbHkgeW91IHNob3VsZCB1c2UKICAgICAqIFRpbWVab25lOjpjcmVhdGVJbnN0YW5jZSgpIHRvIGNyZWF0ZSBhIFRpbWVab25lIGluc3RlYWQgb2YgY3JlYXRpbmcgYQogICAgICogU2ltcGxlVGltZVpvbmUgZGlyZWN0bHkgd2l0aCB0aGlzIGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSByYXdPZmZzZXQgIFRoZSBnaXZlbiBiYXNlIHRpbWUgem9uZSBvZmZzZXQgdG8gR01ULgogICAgICogQHBhcmFtIElEICAgICAgICAgVGhlIHRpbWV6b25lIElEIHdoaWNoIGlzIG9idGFpbmVkIGZyb20KICAgICAqICAgICAgICAgICAgICAgICAgIFRpbWVab25lLmdldEF2YWlsYWJsZUlEcy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgU2ltcGxlVGltZVpvbmUoaW50MzJfdCByYXdPZmZzZXQsIGNvbnN0IFVuaWNvZGVTdHJpbmcmIElEKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdCBhIFNpbXBsZVRpbWVab25lIHdpdGggdGhlIGdpdmVuIHJhdyBHTVQgb2Zmc2V0LCB0aW1lIHpvbmUgSUQsCiAgICAgKiBhbmQgdGltZXMgdG8gc3RhcnQgYW5kIGVuZCBkYXlsaWdodCBzYXZpbmdzIHRpbWUuIFRvIGNyZWF0ZSBhIFRpbWVab25lIHRoYXQKICAgICAqIGRvZXNuJ3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGRvbid0IHVzZSB0aGlzIGNvbnN0cnVjdG9yOyB1c2UgCiAgICAgKiBTaW1wbGVUaW1lWm9uZShyYXdPZmZzZXQsIElEKSBpbnN0ZWFkLiBOb3JtYWxseSwgeW91IHNob3VsZCB1c2UKICAgICAqIFRpbWVab25lLmNyZWF0ZUluc3RhbmNlKCkgdG8gY3JlYXRlIGEgVGltZVpvbmUgaW5zdGVhZCBvZiBjcmVhdGluZyBhCiAgICAgKiBTaW1wbGVUaW1lWm9uZSBkaXJlY3RseSB3aXRoIHRoaXMgY29uc3RydWN0b3IuCiAgICAgKiA8UD4KICAgICAqIFZhcmlvdXMgdHlwZXMgb2YgZGF5bGlnaHQtc2F2aW5ncyB0aW1lIHJ1bGVzIGNhbiBiZSBzcGVjZmllZCBieSB1c2luZyBkaWZmZXJlbnQKICAgICAqIHZhbHVlcyBmb3Igc3RhcnREYXkgYW5kIHN0YXJ0RGF5T2ZXZWVrIGFuZCBlbmREYXkgYW5kIGVuZERheU9mV2Vlay4gIEZvciBhCiAgICAgKiBjb21wbGV0ZSBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UgcGFyYW1ldGVycyB3b3JrLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCiAgICAgKiBzZXRTdGFydFJ1bGUoKS4KICAgICAqCiAgICAgKiBAcGFyYW0gcmF3T2Zmc2V0ICAgICAgIFRoZSBuZXcgU2ltcGxlVGltZVpvbmUncyByYXcgR01UIG9mZnNldAogICAgICogQHBhcmFtIElEICAgICAgICAgICAgICBUaGUgbmV3IFNpbXBsZVRpbWVab25lJ3MgdGltZSB6b25lIElELgogICAgICogQHBhcmFtIHN0YXJ0TW9udGggICAgICBUaGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyBtb250aC4gTW9udGggaXMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgMC1iYXNlZC4gZWcsIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gc3RhcnREYXkgICAgICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGRheS1vZi13ZWVrLWluLW1vbnRoLiBTZWUgc2V0U3RhcnRSdWxlKCkgZm9yIGEKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gc3RhcnREYXlPZldlZWsgIFRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIGRheS1vZi13ZWVrLiBTZWUgc2V0U3RhcnRSdWxlKCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gc3RhcnRUaW1lICAgICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIHRpbWUsIGV4cHJlc3NlZCBhcyB0aGUKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciBtaWRuaWdodC4KICAgICAqIEBwYXJhbSBzdGFydFRpbWVNb2RlICAgV2hldGhlciB0aGUgc3RhcnQgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIHRpbWUsIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBlbmRNb250aCAgICAgICAgVGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIG1vbnRoLiBNb250aCBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAwLWJhc2VkLiBlZywgMCBmb3IgSmFudWFyeS4KICAgICAqIEBwYXJhbSBlbmREYXkgICAgICAgICAgVGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIGRheS1vZi13ZWVrLWluLW1vbnRoLgogICAgICogICAgICAgICAgICAgICAgICAgICAgICBTZWUgc2V0U3RhcnRSdWxlKCkgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gZW5kRGF5T2ZXZWVrICAgIFRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay4gU2VlIHNldFN0YXJ0UnVsZSgpCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uLgogICAgICogQHBhcmFtIGVuZFRpbWUgICAgICAgICBUaGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcgdGltZSwgZXhwcmVzc2VkIGFzIHRoZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIG1pZG5pZ2h0LgogICAgICogQHBhcmFtIGVuZFRpbWVNb2RlICAgICBXaGV0aGVyIHRoZSBlbmQgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIHRpbWUsIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBkc3RTYXZpbmdzICAgICAgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWRkZWQgdG8gc3RhbmRhcmQgdGltZQogICAgICogICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQgRFNUIHRpbWUuIERlZmF1bHQgaXMgb25lIGhvdXIuCiAgICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICAgIEFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSB0aGUgc3RhdHVzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBTaW1wbGVUaW1lWm9uZShpbnQzMl90IHJhd09mZnNldCwgY29uc3QgVW5pY29kZVN0cmluZyYgSUQsCiAgICAgICAgaW50OF90IHN0YXJ0TW9udGgsIGludDhfdCBzdGFydERheU9mV2Vla0luTW9udGgsCiAgICAgICAgaW50OF90IHN0YXJ0RGF5T2ZXZWVrLCBpbnQzMl90IHN0YXJ0VGltZSwKICAgICAgICBpbnQ4X3QgZW5kTW9udGgsIGludDhfdCBlbmREYXlPZldlZWtJbk1vbnRoLAogICAgICAgIGludDhfdCBlbmREYXlPZldlZWssIGludDMyX3QgZW5kVGltZSwKICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIFNpbXBsZVRpbWVab25lKGludDMyX3QgcmF3T2Zmc2V0LCBjb25zdCBVbmljb2RlU3RyaW5nJiBJRCwKICAgICAgICBpbnQ4X3Qgc3RhcnRNb250aCwgaW50OF90IHN0YXJ0RGF5T2ZXZWVrSW5Nb250aCwKICAgICAgICBpbnQ4X3Qgc3RhcnREYXlPZldlZWssIGludDMyX3Qgc3RhcnRUaW1lLAogICAgICAgIGludDhfdCBlbmRNb250aCwgaW50OF90IGVuZERheU9mV2Vla0luTW9udGgsCiAgICAgICAgaW50OF90IGVuZERheU9mV2VlaywgaW50MzJfdCBlbmRUaW1lLAogICAgICAgIGludDMyX3QgZHN0U2F2aW5ncywgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICBTaW1wbGVUaW1lWm9uZShpbnQzMl90IHJhd09mZnNldCwgY29uc3QgVW5pY29kZVN0cmluZyYgSUQsCiAgICAgICAgaW50OF90IHN0YXJ0TW9udGgsIGludDhfdCBzdGFydERheU9mV2Vla0luTW9udGgsCiAgICAgICAgaW50OF90IHN0YXJ0RGF5T2ZXZWVrLCBpbnQzMl90IHN0YXJ0VGltZSwgVGltZU1vZGUgc3RhcnRUaW1lTW9kZSwKICAgICAgICBpbnQ4X3QgZW5kTW9udGgsIGludDhfdCBlbmREYXlPZldlZWtJbk1vbnRoLAogICAgICAgIGludDhfdCBlbmREYXlPZldlZWssIGludDMyX3QgZW5kVGltZSwgVGltZU1vZGUgZW5kVGltZU1vZGUsCiAgICAgICAgaW50MzJfdCBkc3RTYXZpbmdzLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyB5ZWFyLCB0aGF0IGlzLCB0aGUgeWVhciB0aGlzIHRpbWUgem9uZSBiZWdhbgogICAgICogb2JzZXJ2aW5nIGl0cyBzcGVjaWZpZWQgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIHJ1bGVzLiAgVGhlIHRpbWUgem9uZSBpcyBjb25zaWRlcmVkCiAgICAgKiBub3QgdG8gb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmdzIHRpbWUgcHJpb3IgdG8gdGhhdCB5ZWFyOyBTaW1wbGVUaW1lWm9uZSBkb2Vzbid0CiAgICAgKiBzdXBwb3J0IGhpc3RvcmljYWwgZGF5bGlnaHQtc2F2aW5ncy10aW1lIHJ1bGVzLgogICAgICogQHBhcmFtIHllYXIgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgeWVhci4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRTdGFydFllYXIoaW50MzJfdCB5ZWFyKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgcnVsZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBVLlMuLCBEYXlsaWdodCBTYXZpbmdzCiAgICAgKiBUaW1lIHN0YXJ0cyBhdCB0aGUgZmlyc3QgU3VuZGF5IGluIEFwcmlsLCBhdCAyIEFNIGluIHN0YW5kYXJkIHRpbWUuCiAgICAgKiBUaGVyZWZvcmUsIHlvdSBjYW4gc2V0IHRoZSBzdGFydCBydWxlIGJ5IGNhbGxpbmc6CiAgICAgKiBzZXRTdGFydFJ1bGUoVGltZUZpZWxkcy5BUFJJTCwgMSwgVGltZUZpZWxkcy5TVU5EQVksIDIqNjAqNjAqMTAwMCk7CiAgICAgKiBUaGUgZGF5T2ZXZWVrSW5Nb250aCBhbmQgZGF5T2ZXZWVrIHBhcmFtZXRlcnMgdG9nZXRoZXIgc3BlY2lmeSBob3cgdG8gY2FsY3VsYXRlCiAgICAgKiB0aGUgZXhhY3Qgc3RhcnRpbmcgZGF0ZS4gIFRoZWlyIGV4YWN0IG1lYW5pbmcgZGVwZW5kIG9uIHRoZWlyIHJlc3BlY3RpdmUgc2lnbnMsCiAgICAgKiBhbGxvd2luZyB2YXJpb3VzIHR5cGVzIG9mIHJ1bGVzIHRvIGJlIGNvbnN0cnVjdGVkLCBhcyBmb2xsb3dzOjx1bD4KICAgICAqICAgPGxpPklmIGJvdGggZGF5T2ZXZWVrSW5Nb250aCBhbmQgZGF5T2ZXZWVrIGFyZSBwb3NpdGl2ZSwgdGhleSBzcGVjaWZ5IHRoZQogICAgICogICAgICAgZGF5IG9mIHdlZWsgaW4gdGhlIG1vbnRoIChlLmcuLCAoMiwgV0VETkVTREFZKSBpcyB0aGUgc2Vjb25kIFdlZG5lc2RheQogICAgICogICAgICAgb2YgdGhlIG1vbnRoKS4KICAgICAqICAgPGxpPklmIGRheU9mV2VlayBpcyBwb3NpdGl2ZSBhbmQgZGF5T2ZXZWVrSW5Nb250aCBpcyBuZWdhdGl2ZSwgdGhleSBzcGVjaWZ5CiAgICAgKiAgICAgICB0aGUgZGF5IG9mIHdlZWsgaW4gdGhlIG1vbnRoIGNvdW50aW5nIGJhY2t3YXJkIGZyb20gdGhlIGVuZCBvZiB0aGUgbW9udGguCiAgICAgKiAgICAgICAoZS5nLiwgKC0xLCBNT05EQVkpIGlzIHRoZSBsYXN0IE1vbmRheSBpbiB0aGUgbW9udGgpCiAgICAgKiAgIDxsaT5JZiBkYXlPZldlZWsgaXMgemVybyBhbmQgZGF5T2ZXZWVrSW5Nb250aCBpcyBwb3NpdGl2ZSwgZGF5T2ZXZWVrSW5Nb250aAogICAgICogICAgICAgc3BlY2lmaWVzIHRoZSBkYXkgb2YgdGhlIG1vbnRoLCByZWdhcmRsZXNzIG9mIHdoYXQgZGF5IG9mIHRoZSB3ZWVrIGl0IGlzLgogICAgICogICAgICAgKGUuZy4sICgxMCwgMCkgaXMgdGhlIHRlbnRoIGRheSBvZiB0aGUgbW9udGgpCiAgICAgKiAgIDxsaT5JZiBkYXlPZldlZWsgaXMgemVybyBhbmQgZGF5T2ZXZWVrSW5Nb250aCBpcyBuZWdhdGl2ZSwgZGF5T2ZXZWVrSW5Nb250aAogICAgICogICAgICAgc3BlY2lmaWVzIHRoZSBkYXkgb2YgdGhlIG1vbnRoIGNvdW50aW5nIGJhY2t3YXJkIGZyb20gdGhlIGVuZCBvZiB0aGUKICAgICAqICAgICAgIG1vbnRoLCByZWdhcmRsZXNzIG9mIHdoYXQgZGF5IG9mIHRoZSB3ZWVrIGl0IGlzIChlLmcuLCAoLTIsIDApIGlzIHRoZQogICAgICogICAgICAgbmV4dC10by1sYXN0IGRheSBvZiB0aGUgbW9udGgpLgogICAgICogICA8bGk+SWYgZGF5T2ZXZWVrIGlzIG5lZ2F0aXZlIGFuZCBkYXlPZldlZWtJbk1vbnRoIGlzIHBvc2l0aXZlLCB0aGV5IHNwZWNpZnkgdGhlCiAgICAgKiAgICAgICBmaXJzdCBzcGVjaWZpZWQgZGF5IG9mIHRoZSB3ZWVrIG9uIG9yIGFmdGVyIHRoZSBzcGVjZmllZCBkYXkgb2YgdGhlIG1vbnRoLgogICAgICogICAgICAgKGUuZy4sICgxNSwgLVNVTkRBWSkgaXMgdGhlIGZpcnN0IFN1bmRheSBhZnRlciB0aGUgMTV0aCBvZiB0aGUgbW9udGgKICAgICAqICAgICAgIFtvciB0aGUgMTV0aCBpdHNlbGYgaWYgdGhlIDE1dGggaXMgYSBTdW5kYXldLikKICAgICAqICAgPGxpPklmIGRheU9mV2VlayBhbmQgRGF5T2ZXZWVrSW5Nb250aCBhcmUgYm90aCBuZWdhdGl2ZSwgdGhleSBzcGVjaWZ5IHRoZQogICAgICogICAgICAgbGFzdCBzcGVjaWZpZWQgZGF5IG9mIHRoZSB3ZWVrIG9uIG9yIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGRheSBvZiB0aGUgbW9udGguCiAgICAgKiAgICAgICAoZS5nLiwgKC0yMCwgLVRVRVNEQVkpIGlzIHRoZSBsYXN0IFR1ZXNkYXkgYmVmb3JlIHRoZSAyMHRoIG9mIHRoZSBtb250aAogICAgICogICAgICAgW29yIHRoZSAyMHRoIGl0c2VsZiBpZiB0aGUgMjB0aCBpcyBhIFR1ZXNkYXldLik8L3VsPgogICAgICogQHBhcmFtIG1vbnRoIHRoZSBkYXlsaWdodCBzYXZpbmdzIHN0YXJ0aW5nIG1vbnRoLiBNb250aCBpcyAwLWJhc2VkLgogICAgICogZWcsIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrSW5Nb250aCB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZwogICAgICogZGF5LW9mLXdlZWstaW4tbW9udGguIFBsZWFzZSBzZWUgdGhlIG1lbWJlciBkZXNjcmlwdGlvbiBmb3IgYW4gZXhhbXBsZS4KICAgICAqIEBwYXJhbSBkYXlPZldlZWsgdGhlIGRheWxpZ2h0IHNhdmluZ3Mgc3RhcnRpbmcgZGF5LW9mLXdlZWsuIFBsZWFzZSBzZWUKICAgICAqIHRoZSBtZW1iZXIgZGVzY3JpcHRpb24gZm9yIGFuIGV4YW1wbGUuCiAgICAgKiBAcGFyYW0gdGltZSB0aGUgZGF5bGlnaHQgc2F2aW5ncyBzdGFydGluZyB0aW1lLiBQbGVhc2Ugc2VlIHRoZSBtZW1iZXIKICAgICAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZldlZWtJbk1vbnRoLCBpbnQzMl90IGRheU9mV2VlaywKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICB2b2lkIHNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBUaW1lTW9kZSBtb2RlLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgRFNUIHN0YXJ0IHJ1bGUgdG8gYSBmaXhlZCBkYXRlIHdpdGhpbiBhIG1vbnRoLgogICAgICoKICAgICAqIEBwYXJhbSBtb250aCAgICAgICAgIFRoZSBtb250aCBpbiB3aGljaCB0aGlzIHJ1bGUgb2NjdXJzICgwLWJhc2VkKS4KICAgICAqIEBwYXJhbSBkYXlPZk1vbnRoICAgIFRoZSBkYXRlIGluIHRoYXQgbW9udGggKDEtYmFzZWQpLgogICAgICogQHBhcmFtIHRpbWUgICAgICAgICAgVGhlIHRpbWUgb2YgdGhhdCBkYXkgKG51bWJlciBvZiBtaWxsaXMgYWZ0ZXIgbWlkbmlnaHQpCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aGVuIERTVCB0YWtlcyBlZmZlY3QgaW4gbG9jYWwgd2FsbCB0aW1lLCB3aGljaCBpcwogICAgICogICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgdGltZSBpbiB0aGlzIGNhc2UuCiAgICAgKiBAcGFyYW0gbW9kZSB3aGV0aGVyIHRoZSB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwgc3RhbmRhcmQgdGltZSwKICAgICAqIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBzdGF0dXMgQW4gVUVycm9yQ29kZQogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mTW9udGgsIGludDMyX3QgdGltZSwgCiAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0U3RhcnRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCB0aW1lLCAKICAgICAgICAgICAgICAgICAgICAgIFRpbWVNb2RlIG1vZGUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBEU1Qgc3RhcnQgcnVsZSB0byBhIHdlZWtkYXkgYmVmb3JlIG9yIGFmdGVyIGEgZ2l2ZSBkYXRlIHdpdGhpbgogICAgICogYSBtb250aCwgZS5nLiwgdGhlIGZpcnN0IE1vbmRheSBvbiBvciBhZnRlciB0aGUgOHRoLgogICAgICoKICAgICAqIEBwYXJhbSBtb250aCAgICAgICAgIFRoZSBtb250aCBpbiB3aGljaCB0aGlzIHJ1bGUgb2NjdXJzICgwLWJhc2VkKS4KICAgICAqIEBwYXJhbSBkYXlPZk1vbnRoICAgIEEgZGF0ZSB3aXRoaW4gdGhhdCBtb250aCAoMS1iYXNlZCkuCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrICAgICBUaGUgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIHRoaXMgcnVsZSBvY2N1cnMuCiAgICAgKiBAcGFyYW0gdGltZSAgICAgICAgICBUaGUgdGltZSBvZiB0aGF0IGRheSAobnVtYmVyIG9mIG1pbGxpcyBhZnRlciBtaWRuaWdodCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gRFNUIHRha2VzIGVmZmVjdCBpbiBsb2NhbCB3YWxsIHRpbWUsIHdoaWNoIGlzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCB0aW1lIGluIHRoaXMgY2FzZS4KICAgICAqIEBwYXJhbSBtb2RlIHdoZXRoZXIgdGhlIHRpbWUgaXMgbG9jYWwgd2FsbCB0aW1lLCBsb2NhbCBzdGFuZGFyZCB0aW1lLAogICAgICogb3IgVVRDIHRpbWUuIERlZmF1bHQgaXMgbG9jYWwgd2FsbCB0aW1lLgogICAgICogQHBhcmFtIGFmdGVyICAgICAgICAgSWYgdHJ1ZSwgdGhpcyBydWxlIHNlbGVjdHMgdGhlIGZpcnN0IGRheU9mV2VlayBvbgogICAgICogICAgICAgICAgICAgICAgICAgICAgb3IgYWZ0ZXIgZGF5T2ZNb250aC4gIElmIGZhbHNlLCB0aGlzIHJ1bGUgc2VsZWN0cwogICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgZGF5T2ZXZWVrIG9uIG9yIGJlZm9yZSBkYXlPZk1vbnRoLgogICAgICogQHBhcmFtIHN0YXR1cyBBbiBVRXJyb3JDb2RlCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZvaWQgc2V0U3RhcnRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBib29sX3QgYWZ0ZXIsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgdm9pZCBzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IGRheU9mV2VlaywgCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFRpbWVNb2RlIG1vZGUsIGJvb2xfdCBhZnRlciwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIHJ1bGUuIEZvciBleGFtcGxlLCBpbiB0aGUgVS5TLiwgRGF5bGlnaHQKICAgICAqIFNhdmluZ3MgVGltZSBlbmRzIGF0IHRoZSBsYXN0ICgtMSkgU3VuZGF5IGluIE9jdG9iZXIsIGF0IDIgQU0gaW4gc3RhbmRhcmQgdGltZS4KICAgICAqIFRoZXJlZm9yZSwgeW91IGNhbiBzZXQgdGhlIGVuZCBydWxlIGJ5IGNhbGxpbmc6CiAgICAgKiA8cHJlPgogICAgICogLiAgIHNldEVuZFJ1bGUoVGltZUZpZWxkcy5PQ1RPQkVSLCAtMSwgVGltZUZpZWxkcy5TVU5EQVksIDIqNjAqNjAqMTAwMCk7CiAgICAgKiA8L3ByZT4KICAgICAqIFZhcmlvdXMgb3RoZXIgdHlwZXMgb2YgcnVsZXMgY2FuIGJlIHNwZWNpZmllZCBieSBtYW5pcHVsYXRpbmcgdGhlIGRheU9mV2VlawogICAgICogYW5kIGRheU9mV2Vla0luTW9udGggcGFyYW1ldGVycy4gIEZvciBjb21wbGV0ZSBkZXRhaWxzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24KICAgICAqIGZvciBzZXRTdGFydFJ1bGUoKS4KICAgICAqCiAgICAgKiBAcGFyYW0gbW9udGggdGhlIGRheWxpZ2h0IHNhdmluZ3MgZW5kaW5nIG1vbnRoLiBNb250aCBpcyAwLWJhc2VkLgogICAgICogZWcsIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrSW5Nb250aCB0aGUgZGF5bGlnaHQgc2F2aW5ncyBlbmRpbmcKICAgICAqIGRheS1vZi13ZWVrLWluLW1vbnRoLiBTZWUgc2V0U3RhcnRSdWxlKCkgZm9yIGEgY29tcGxldGUgZXhwbGFuYXRpb24uCiAgICAgKiBAcGFyYW0gZGF5T2ZXZWVrIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyBkYXktb2Ytd2Vlay4gU2VlIHNldFN0YXJ0UnVsZSgpCiAgICAgKiBmb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbi4KICAgICAqIEBwYXJhbSB0aW1lIHRoZSBkYXlsaWdodCBzYXZpbmdzIGVuZGluZyB0aW1lLiBQbGVhc2Ugc2VlIHRoZSBtZW1iZXIKICAgICAqIGRlc2NyaXB0aW9uIGZvciBhbiBleGFtcGxlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZXZWVrSW5Nb250aCwgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0RW5kUnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgVGltZU1vZGUgbW9kZSwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIERTVCBlbmQgcnVsZSB0byBhIGZpeGVkIGRhdGUgd2l0aGluIGEgbW9udGguCiAgICAgKgogICAgICogQHBhcmFtIG1vbnRoICAgICAgICAgVGhlIG1vbnRoIGluIHdoaWNoIHRoaXMgcnVsZSBvY2N1cnMgKDAtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mTW9udGggICAgVGhlIGRhdGUgaW4gdGhhdCBtb250aCAoMS1iYXNlZCkuCiAgICAgKiBAcGFyYW0gdGltZSAgICAgICAgICBUaGUgdGltZSBvZiB0aGF0IGRheSAobnVtYmVyIG9mIG1pbGxpcyBhZnRlciBtaWRuaWdodCkKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdoZW4gRFNUIGVuZHMgaW4gbG9jYWwgd2FsbCB0aW1lLCB3aGljaCBpcyBkYXlsaWdodAogICAgICogICAgICAgICAgICAgICAgICAgICAgdGltZSBpbiB0aGlzIGNhc2UuCiAgICAgKiBAcGFyYW0gbW9kZSB3aGV0aGVyIHRoZSB0aW1lIGlzIGxvY2FsIHdhbGwgdGltZSwgbG9jYWwgc3RhbmRhcmQgdGltZSwKICAgICAqIG9yIFVUQyB0aW1lLiBEZWZhdWx0IGlzIGxvY2FsIHdhbGwgdGltZS4KICAgICAqIEBwYXJhbSBzdGF0dXMgQW4gVUVycm9yQ29kZQogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldEVuZFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IHRpbWUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCB0aW1lLAogICAgICAgICAgICAgICAgICAgIFRpbWVNb2RlIG1vZGUsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBEU1QgZW5kIHJ1bGUgdG8gYSB3ZWVrZGF5IGJlZm9yZSBvciBhZnRlciBhIGdpdmUgZGF0ZSB3aXRoaW4KICAgICAqIGEgbW9udGgsIGUuZy4sIHRoZSBmaXJzdCBNb25kYXkgb24gb3IgYWZ0ZXIgdGhlIDh0aC4KICAgICAqCiAgICAgKiBAcGFyYW0gbW9udGggICAgICAgICBUaGUgbW9udGggaW4gd2hpY2ggdGhpcyBydWxlIG9jY3VycyAoMC1iYXNlZCkuCiAgICAgKiBAcGFyYW0gZGF5T2ZNb250aCAgICBBIGRhdGUgd2l0aGluIHRoYXQgbW9udGggKDEtYmFzZWQpLgogICAgICogQHBhcmFtIGRheU9mV2VlayAgICAgVGhlIGRheSBvZiB0aGUgd2VlayBvbiB3aGljaCB0aGlzIHJ1bGUgb2NjdXJzLgogICAgICogQHBhcmFtIHRpbWUgICAgICAgICAgVGhlIHRpbWUgb2YgdGhhdCBkYXkgKG51bWJlciBvZiBtaWxsaXMgYWZ0ZXIgbWlkbmlnaHQpCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aGVuIERTVCBlbmRzIGluIGxvY2FsIHdhbGwgdGltZSwgd2hpY2ggaXMgZGF5bGlnaHQKICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRpbWUgaW4gdGhpcyBjYXNlLgogICAgICogQHBhcmFtIG1vZGUgd2hldGhlciB0aGUgdGltZSBpcyBsb2NhbCB3YWxsIHRpbWUsIGxvY2FsIHN0YW5kYXJkIHRpbWUsCiAgICAgKiBvciBVVEMgdGltZS4gRGVmYXVsdCBpcyBsb2NhbCB3YWxsIHRpbWUuCiAgICAgKiBAcGFyYW0gYWZ0ZXIgICAgICAgICBJZiB0cnVlLCB0aGlzIHJ1bGUgc2VsZWN0cyB0aGUgZmlyc3QgZGF5T2ZXZWVrIG9uCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBhZnRlciBkYXlPZk1vbnRoLiAgSWYgZmFsc2UsIHRoaXMgcnVsZSBzZWxlY3RzCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCBkYXlPZldlZWsgb24gb3IgYmVmb3JlIGRheU9mTW9udGguCiAgICAgKiBAcGFyYW0gc3RhdHVzIEFuIFVFcnJvckNvZGUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdm9pZCBzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgYm9vbF90IGFmdGVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHZvaWQgc2V0RW5kUnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mTW9udGgsIGludDMyX3QgZGF5T2ZXZWVrLCAKICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFRpbWVNb2RlIG1vZGUsIGJvb2xfdCBhZnRlciwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFRpbWVab25lJ3MgYWRqdXN0ZWQgR01UIG9mZnNldCAoaS5lLiwgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYWRkCiAgICAgKiB0byBHTVQgdG8gZ2V0IGxvY2FsIHRpbWUgaW4gdGhpcyB0aW1lIHpvbmUsIHRha2luZyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW50bwogICAgICogYWNjb3VudCkgYXMgb2YgYSBwYXJ0aWN1bGFyIHJlZmVyZW5jZSBkYXRlLiAgVGhlIHJlZmVyZW5jZSBkYXRlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCiAgICAgKiB3aGV0aGVyIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpcyBpbiBlZmZlY3QgYW5kIG5lZWRzIHRvIGJlIGZpZ3VyZWQgaW50byB0aGUgb2Zmc2V0CiAgICAgKiB0aGF0IGlzIHJldHVybmVkIChpbiBvdGhlciB3b3Jkcywgd2hhdCBpcyB0aGUgYWRqdXN0ZWQgR01UIG9mZnNldCBpbiB0aGlzIHRpbWUgem9uZQogICAgICogYXQgdGhpcyBwYXJ0aWN1bGFyIGRhdGUgYW5kIHRpbWU/KS4gIEZvciB0aGUgdGltZSB6b25lcyBwcm9kdWNlZCBieSBjcmVhdGVUaW1lWm9uZSgpLAogICAgICogdGhlIHJlZmVyZW5jZSBkYXRhIGlzIHNwZWNpZmllZCBhY2NvcmRpbmcgdG8gdGhlIEdyZWdvcmlhbiBjYWxlbmRhciwgYW5kIHRoZSBkYXRlCiAgICAgKiBhbmQgdGltZSBmaWVsZHMgYXJlIGluIEdNVCwgTk9UIGxvY2FsIHRpbWUuCiAgICAgKgogICAgICogQHBhcmFtIGVyYSAgICAgICAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgZXJhCiAgICAgKiBAcGFyYW0geWVhciAgICAgICBUaGUgcmVmZXJlbmNlIGRhdGUncyB5ZWFyCiAgICAgKiBAcGFyYW0gbW9udGggICAgICBUaGUgcmVmZXJlbmNlIGRhdGUncyBtb250aCAoMC1iYXNlZDsgMCBpcyBKYW51YXJ5KQogICAgICogQHBhcmFtIGRheSAgICAgICAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgZGF5LWluLW1vbnRoICgxLWJhc2VkKQogICAgICogQHBhcmFtIGRheU9mV2VlayAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgZGF5LW9mLXdlZWsgKDEtYmFzZWQ7IDEgaXMgU3VuZGF5KQogICAgICogQHBhcmFtIG1pbGxpcyAgICAgVGhlIHJlZmVyZW5jZSBkYXRlJ3MgbWlsbGlzZWNvbmRzIGluIGRheSwgVVRUIChOT1QgbG9jYWwgdGltZSkuCiAgICAgKiBAcmV0dXJuICAgICAgICAgICBUaGUgb2Zmc2V0IGluIG1pbGxpc2Vjb25kcyB0byBhZGQgdG8gR01UIHRvIGdldCBsb2NhbCB0aW1lLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgZ2V0T2Zmc2V0KHVpbnQ4X3QgZXJhLCBpbnQzMl90IHllYXIsIGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRheU9mV2VlaywgaW50MzJfdCBtaWxsaXMsIFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgogICAgdmlydHVhbCBpbnQzMl90IGdldE9mZnNldCh1aW50OF90IGVyYSwgaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXlPZldlZWssIGludDMyX3QgbWlsbGlzKSBjb25zdDsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIHRpbWUgem9uZSBvZmZzZXQsIGZvciBjdXJyZW50IGRhdGUsIG1vZGlmaWVkIGluIGNhc2Ugb2YKICAgICAqIGRheWxpZ2h0IHNhdmluZ3MuIFRoaXMgaXMgdGhlIG9mZnNldCB0byBhZGQgKnRvKiBVVEMgdG8gZ2V0IGxvY2FsIHRpbWUuCiAgICAgKiBAcGFyYW0gZXJhIHRoZSBlcmEgb2YgdGhlIGdpdmVuIGRhdGUuCiAgICAgKiBAcGFyYW0geWVhciB0aGUgeWVhciBpbiB0aGUgZ2l2ZW4gZGF0ZS4KICAgICAqIEBwYXJhbSBtb250aCB0aGUgbW9udGggaW4gdGhlIGdpdmVuIGRhdGUuCiAgICAgKiBNb250aCBpcyAwLWJhc2VkLiBlLmcuLCAwIGZvciBKYW51YXJ5LgogICAgICogQHBhcmFtIGRheSB0aGUgZGF5LWluLW1vbnRoIG9mIHRoZSBnaXZlbiBkYXRlLgogICAgICogQHBhcmFtIGRheU9mV2VlayB0aGUgZGF5LW9mLXdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuCiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIHRoZSBtaWxsaXMgaW4gZGF5IGluIDxlbT5zdGFuZGFyZDwvZW0+IGxvY2FsIHRpbWUuCiAgICAgKiBAcGFyYW0gbW9udGhMZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gbW9udGggaW4gZGF5cy4KICAgICAqIEBwYXJhbSBwcmV2TW9udGhMZW5ndGggbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBtb250aCBpbiBkYXlzLgogICAgICogQHJldHVybiB0aGUgb2Zmc2V0IHRvIGFkZCAqdG8qIEdNVCB0byBnZXQgbG9jYWwgdGltZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGdldE9mZnNldCh1aW50OF90IGVyYSwgaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXlPZldlZWssIGludDMyX3QgbWlsbGlzZWNvbmRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtb250aExlbmd0aCwgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICB2aXJ0dWFsIGludDMyX3QgZ2V0T2Zmc2V0KHVpbnQ4X3QgZXJhLCBpbnQzMl90IHllYXIsIGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRheU9mV2VlaywgaW50MzJfdCBtaWxsaXNlY29uZHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1vbnRoTGVuZ3RoLCBpbnQzMl90IHByZXZNb250aExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFRpbWVab25lJ3MgcmF3IEdNVCBvZmZzZXQgKGkuZS4sIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGFkZAogICAgICogdG8gR01UIHRvIGdldCBsb2NhbCB0aW1lLCBiZWZvcmUgdGFraW5nIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpbnRvIGFjY291bnQpLgogICAgICoKICAgICAqIEByZXR1cm4gICBUaGUgVGltZVpvbmUncyByYXcgR01UIG9mZnNldC4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGdldFJhd09mZnNldCh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIFRpbWVab25lJ3MgcmF3IEdNVCBvZmZzZXQgKGkuZS4sIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGFkZAogICAgICogdG8gR01UIHRvIGdldCBsb2NhbCB0aW1lLCBiZWZvcmUgdGFraW5nIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpbnRvIGFjY291bnQpLgogICAgICoKICAgICAqIEBwYXJhbSBvZmZzZXRNaWxsaXMgIFRoZSBuZXcgcmF3IEdNVCBvZmZzZXQgZm9yIHRoaXMgdGltZSB6b25lLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIHZvaWQgc2V0UmF3T2Zmc2V0KGludDMyX3Qgb2Zmc2V0TWlsbGlzKTsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIGNsb2NrIGlzIGFkdmFuY2VkIGR1cmluZyBEU1QuCiAgICAgKiBAcGFyYW0gbWlsbGlzU2F2ZWREdXJpbmdEU1QgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhlIHRpbWUgaXMKICAgICAqIGFkdmFuY2VkIHdpdGggcmVzcGVjdCB0byBzdGFuZGFyZCB0aW1lIHdoZW4gdGhlIGRheWxpZ2h0IHNhdmluZ3MgcnVsZXMKICAgICAqIGFyZSBpbiBlZmZlY3QuIEEgcG9zaXRpdmUgbnVtYmVyLCB0eXBpY2FsbHkgb25lIGhvdXIgKDM2MDAwMDApLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2b2lkIHNldERTVFNhdmluZ3MoaW50MzJfdCBtaWxsaXNTYXZlZER1cmluZ0RTVCwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHZvaWQgc2V0RFNUU2F2aW5ncyhpbnQzMl90IG1pbGxpc1NhdmVkRHVyaW5nRFNUKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiB0aW1lIGluIG1zIHRoYXQgdGhlIGNsb2NrIGlzIGFkdmFuY2VkIGR1cmluZyBEU1QuCiAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoZSB0aW1lIGlzCiAgICAgKiBhZHZhbmNlZCB3aXRoIHJlc3BlY3QgdG8gc3RhbmRhcmQgdGltZSB3aGVuIHRoZSBkYXlsaWdodCBzYXZpbmdzIHJ1bGVzCiAgICAgKiBhcmUgaW4gZWZmZWN0LiBBIHBvc2l0aXZlIG51bWJlciwgdHlwaWNhbGx5IG9uZSBob3VyICgzNjAwMDAwKS4KICAgICAqLwogICAgaW50MzJfdCBnZXREU1RTYXZpbmdzKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUXVlcmllcyBpZiB0aGlzIFRpbWVab25lIHVzZXMgRGF5bGlnaHQgU2F2aW5ncyBUaW1lLgogICAgICoKICAgICAqIEByZXR1cm4gICBUcnVlIGlmIHRoaXMgVGltZVpvbmUgdXNlcyBEYXlsaWdodCBTYXZpbmdzIFRpbWU7IGZhbHNlIG90aGVyd2lzZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBib29sX3QgdXNlRGF5bGlnaHRUaW1lKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBkYXRlIGlzIHdpdGhpbiB0aGUgcGVyaW9kIHdoZW4gZGF5bGlnaHQgc2F2aW5ncyB0aW1lCiAgICAgKiBpcyBpbiBlZmZlY3Q7IGZhbHNlIG90aGVyd2lzZS4gIElmIHRoZSBUaW1lWm9uZSBkb2Vzbid0IG9ic2VydmUgZGF5bGlnaHQgc2F2aW5ncwogICAgICogdGltZSwgdGhpcyBmdW5jdGlvbnMgYWx3YXlzIHJldHVybnMgZmFsc2UuCiAgICAgKiBAcGFyYW0gZGF0ZSBUaGUgZGF0ZSB0byB0ZXN0LgogICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBkYXRlIGlzIGluIERheWxpZ2h0IFNhdmluZ3MgVGltZTsKICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBib29sX3QgaW5EYXlsaWdodFRpbWUoVURhdGUgZGF0ZSwgVUVycm9yQ29kZSYgc3RhdHVzKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybiB0cnVlIGlmIHRoaXMgem9uZSBoYXMgdGhlIHNhbWUgcnVsZXMgYW5kIG9mZnNldCBhcyBhbm90aGVyIHpvbmUuCiAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIFRpbWVab25lIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHpvbmUgaGFzIHRoZSBzYW1lIHJ1bGVzIGFuZCBvZmZzZXQgYXMgdGhpcyBvbmUKICAgICAqIEBzdGFibGUKICAgICAqLwogICAgYm9vbF90IGhhc1NhbWVSdWxlcyhjb25zdCBUaW1lWm9uZSYgb3RoZXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ2xvbmVzIFRpbWVab25lIG9iamVjdHMgcG9seW1vcnBoaWNhbGx5LiBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcKICAgICAqIHRoZSBUaW1lWm9uZSBvYmplY3QgY2xvbmVkLgogICAgICoKICAgICAqIEByZXR1cm4gICBBIG5ldyBjb3B5IG9mIHRoaXMgVGltZVpvbmUgb2JqZWN0LgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIFRpbWVab25lKiBjbG9uZSh2b2lkKSBjb25zdDsKCnB1YmxpYzoKCiAgICAvKioKICAgICAqIE92ZXJyaWRlIFRpbWVab25lIFJldHVybnMgYSB1bmlxdWUgY2xhc3MgSUQgUE9MWU1PUlBISUNBTExZLiBQdXJlIHZpcnR1YWwKICAgICAqIG92ZXJyaWRlLiBUaGlzIG1ldGhvZCBpcyB0byBpbXBsZW1lbnQgYSBzaW1wbGUgdmVyc2lvbiBvZiBSVFRJLCBzaW5jZSBub3QgYWxsIEMrKwogICAgICogY29tcGlsZXJzIHN1cHBvcnQgZ2VudWluZSBSVFRJLiBQb2x5bW9ycGhpYyBvcGVyYXRvcj09KCkgYW5kIGNsb25lKCkgbWV0aG9kcyBjYWxsCiAgICAgKiB0aGlzIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcmV0dXJuICAgVGhlIGNsYXNzIElEIGZvciB0aGlzIG9iamVjdC4gQWxsIG9iamVjdHMgb2YgYSBnaXZlbiBjbGFzcyBoYXZlIHRoZQogICAgICogICAgICAgICAgIHNhbWUgY2xhc3MgSUQuIE9iamVjdHMgb2Ygb3RoZXIgY2xhc3NlcyBoYXZlIGRpZmZlcmVudCBjbGFzcyBJRHMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgVUNsYXNzSUQgZ2V0RHluYW1pY0NsYXNzSUQodm9pZCkgY29uc3QgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY2xhc3MgSUQgZm9yIHRoaXMgY2xhc3MuIFRoaXMgaXMgdXNlZnVsIG9ubHkgZm9yIGNvbXBhcmluZyB0byBhIHJldHVybgogICAgICogdmFsdWUgZnJvbSBnZXREeW5hbWljQ2xhc3NJRCgpLiBGb3IgZXhhbXBsZToKICAgICAqIDxwcmU+CiAgICAgKiAuICAgQmFzZSogcG9seW1vcnBoaWNfcG9pbnRlciA9IGNyZWF0ZVBvbHltb3JwaGljT2JqZWN0KCk7CiAgICAgKiAuICAgaWYgKHBvbHltb3JwaGljX3BvaW50ZXItPmdldER5bmFtaWNDbGFzc0lEKCkgPT0KICAgICAqIC4gICAgICAgRGVyaXZlZDo6Z2V0U3RhdGljQ2xhc3NJRCgpKSAuLi4KICAgICAqIDwvcHJlPgogICAgICogQHJldHVybiAgIFRoZSBjbGFzcyBJRCBmb3IgYWxsIG9iamVjdHMgb2YgdGhpcyBjbGFzcy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgc3RhdGljIFVDbGFzc0lEIGdldFN0YXRpY0NsYXNzSUQodm9pZCkgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KCnByaXZhdGU6CiAgICAvKiogCiAgICAgKiBDb25zdGFudHMgc3BlY2lmeWluZyB2YWx1ZXMgb2Ygc3RhcnRNb2RlIGFuZCBlbmRNb2RlLgogICAgICovCiAgICBlbnVtIEVNb2RlCiAgICB7CiAgICAgICAgRE9NX01PREUgPSAxLAogICAgICAgIERPV19JTl9NT05USF9NT0RFLAogICAgICAgIERPV19HRV9ET01fTU9ERSwKICAgICAgICBET1dfTEVfRE9NX01PREUKICAgIH07CgogICAgZnJpZW5kIGNsYXNzIFRpbWVab25lOyAvLyBmb3IgYWNjZXNzIHRvIHRoZXNlIDIgY29uc3RydWN0b3JzOgoKICAgIC8qKgogICAgICogQ29uc3RydWN0IGZyb20gbWVtb3J5LW1hcHBlZCBkYXRhLgogICAgICovCiAgICBTaW1wbGVUaW1lWm9uZShjb25zdCBTdGFuZGFyZFpvbmUmIHN0ZFpvbmUsIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGlkKTsKICAgIFNpbXBsZVRpbWVab25lKGNvbnN0IERTVFpvbmUmIGRzdFpvbmUsIGNvbnN0IFVuaWNvZGVTdHJpbmcmIGlkKTsKCiAgICAvKioKICAgICAqIEludGVybmFsIGNvbnN0cnVjdGlvbiBtZXRob2QuCiAgICAgKi8KICAgIHZvaWQgY29uc3RydWN0KGludDMyX3QgcmF3T2Zmc2V0LCBjb25zdCBVbmljb2RlU3RyaW5nJiBJRCwKICAgICAgICAgICAgICAgICAgIGludDhfdCBzdGFydE1vbnRoLCBpbnQ4X3Qgc3RhcnREYXksIGludDhfdCBzdGFydERheU9mV2VlaywKICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRUaW1lLCBUaW1lTW9kZSBzdGFydFRpbWVNb2RlLAogICAgICAgICAgICAgICAgICAgaW50OF90IGVuZE1vbnRoLCBpbnQ4X3QgZW5kRGF5LCBpbnQ4X3QgZW5kRGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmRUaW1lLCBUaW1lTW9kZSBlbmRUaW1lTW9kZSwKICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0U2F2aW5ncywgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICAqIENvbXBhcmUgYSBnaXZlbiBkYXRlIGluIHRoZSB5ZWFyIHRvIGEgcnVsZS4gUmV0dXJuIDEsIDAsIG9yIC0xLCBkZXBlbmRpbmcKICAgICAqIG9uIHdoZXRoZXIgdGhlIGRhdGUgaXMgYWZ0ZXIsIGVxdWFsIHRvLCBvciBiZWZvcmUgdGhlIHJ1bGUgZGF0ZS4gVGhlCiAgICAgKiBtaWxsaXMgYXJlIGNvbXBhcmVkIGRpcmVjdGx5IGFnYWluc3QgdGhlIHJ1bGVNaWxsaXMsIHNvIGFueQogICAgICogc3RhbmRhcmQtZGF5bGlnaHQgYWRqdXN0bWVudHMgbXVzdCBiZSBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIuCiAgICAgKgogICAgICogQHJldHVybiAgMSBpZiB0aGUgZGF0ZSBpcyBhZnRlciB0aGUgcnVsZSBkYXRlLCAtMSBpZiB0aGUgZGF0ZSBpcyBiZWZvcmUKICAgICAqICAgICAgICAgIHRoZSBydWxlIGRhdGUsIG9yIDAgaWYgdGhlIGRhdGUgaXMgZXF1YWwgdG8gdGhlIHJ1bGUgZGF0ZS4KICAgICAqLwogICAgc3RhdGljIGludDMyX3QgY29tcGFyZVRvUnVsZShpbnQ4X3QgbW9udGgsIGludDhfdCBtb250aExlbiwgaW50OF90IHByZXZNb250aExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90IGRheU9mTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBkYXlPZldlZWssIGludDMyX3QgbWlsbGlzLCBpbnQzMl90IG1pbGxpc0RlbHRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTW9kZSBydWxlTW9kZSwgaW50OF90IHJ1bGVNb250aCwgaW50OF90IHJ1bGVEYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBydWxlRGF5LCBpbnQzMl90IHJ1bGVNaWxsaXMpOwoKICAgIC8qKgogICAgICogR2l2ZW4gYSBzZXQgb2YgZW5jb2RlZCBydWxlcyBpbiBzdGFydERheSBhbmQgc3RhcnREYXlPZk1vbnRoLCBkZWNvZGUKICAgICAqIHRoZW0gYW5kIHNldCB0aGUgc3RhcnRNb2RlIGFwcHJvcHJpYXRlbHkuICBEbyB0aGUgc2FtZSBmb3IgZW5kRGF5IGFuZAogICAgICogZW5kRGF5T2ZNb250aC4gIAogICAgICogPFA+CiAgICAgKiBVcG9uIGVudHJ5LCB0aGUgZGF5IG9mIHdlZWsgdmFyaWFibGVzIG1heSBiZSB6ZXJvIG9yCiAgICAgKiBuZWdhdGl2ZSwgaW4gb3JkZXIgdG8gaW5kaWNhdGUgc3BlY2lhbCBtb2Rlcy4gIFRoZSBkYXkgb2YgbW9udGgKICAgICAqIHZhcmlhYmxlcyBtYXkgYWxzbyBiZSBuZWdhdGl2ZS4KICAgICAqIDxQPgogICAgICogVXBvbiBleGl0LCB0aGUgbW9kZSB2YXJpYWJsZXMgd2lsbCBiZQogICAgICogc2V0LCBhbmQgdGhlIGRheSBvZiB3ZWVrIGFuZCBkYXkgb2YgbW9udGggdmFyaWFibGVzIHdpbGwgYmUgcG9zaXRpdmUuCiAgICAgKiA8UD4KICAgICAqIFRoaXMgbWV0aG9kIGFsc28gcmVjb2duaXplcyBhIHN0YXJ0RGF5IG9yIGVuZERheSBvZiB6ZXJvIGFzIGluZGljYXRpbmcKICAgICAqIG5vIERTVC4KICAgICAqLwogICAgdm9pZCBkZWNvZGVSdWxlcyhVRXJyb3JDb2RlJiBzdGF0dXMpOwogICAgdm9pZCBkZWNvZGVTdGFydFJ1bGUoVUVycm9yQ29kZSYgc3RhdHVzKTsKICAgIHZvaWQgZGVjb2RlRW5kUnVsZShVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHN0YXRpYyBjaGFyICAgICBmZ0NsYXNzSUQ7CgogICAgaW50OF90IHN0YXJ0TW9udGgsIHN0YXJ0RGF5LCBzdGFydERheU9mV2VlazsgICAvLyB0aGUgbW9udGgsIGRheSwgRE9XLCBhbmQgdGltZSBEU1Qgc3RhcnRzCiAgICBpbnQzMl90IHN0YXJ0VGltZTsKICAgIFRpbWVNb2RlIHN0YXJ0VGltZU1vZGUsIGVuZFRpbWVNb2RlOyAvLyBNb2RlIGZvciBzdGFydFRpbWUsIGVuZFRpbWU7IHNlZSBUaW1lTW9kZQogICAgaW50OF90IGVuZE1vbnRoLCBlbmREYXksIGVuZERheU9mV2VlazsgLy8gdGhlIG1vbnRoLCBkYXksIERPVywgYW5kIHRpbWUgRFNUIGVuZHMKICAgIGludDMyX3QgZW5kVGltZTsKICAgIGludDMyX3Qgc3RhcnRZZWFyOyAgLy8gdGhlIHllYXIgdGhlc2UgRFNUIHJ1bGVzIHRvb2sgZWZmZWN0CiAgICBpbnQzMl90IHJhd09mZnNldDsgIC8vIHRoZSBUaW1lWm9uZSdzIHJhdyBHTVQgb2Zmc2V0CiAgICBib29sX3QgdXNlRGF5bGlnaHQ7IC8vIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgVGltZVpvbmUgdXNlcyBEU1QKICAgIHN0YXRpYyBjb25zdCBpbnQ4X3Qgc3RhdGljTW9udGhMZW5ndGhbMTJdOyAvLyBsZW5ndGhzIG9mIHRoZSBtb250aHMKICAgIEVNb2RlIHN0YXJ0TW9kZSwgZW5kTW9kZTsgICAvLyBmbGFncyBpbmRpY2F0aW5nIHdoYXQga2luZCBvZiBydWxlcyB0aGUgRFNUIHJ1bGVzIGFyZQoKICAgIC8qKgogICAgICogQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2YgdGltZSBzYXZlZCBkdXJpbmcgRFNUIGluIG1zLgogICAgICogVHlwaWNhbGx5IG9uZSBob3VyOyBzb21ldGltZXMgMzAgbWludXRlcy4KICAgICAqLwogICAgaW50MzJfdCBkc3RTYXZpbmdzOwp9OwoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKICAgIHNldFN0YXJ0UnVsZShtb250aCwgZGF5T2ZXZWVrSW5Nb250aCwgZGF5T2ZXZWVrLCB0aW1lLCBXQUxMX1RJTUUsIHN0YXR1cyk7Cn0KCmlubGluZSB2b2lkIFNpbXBsZVRpbWVab25lOjpzZXRTdGFydFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSYgc3RhdHVzKSB7CiAgICBzZXRTdGFydFJ1bGUobW9udGgsIGRheU9mTW9udGgsIHRpbWUsIFdBTExfVElNRSwgc3RhdHVzKTsKfQoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldFN0YXJ0UnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXlPZldlZWssIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgYm9vbF90IGFmdGVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKICAgIHNldFN0YXJ0UnVsZShtb250aCwgZGF5T2ZNb250aCwgZGF5T2ZXZWVrLCB0aW1lLCBXQUxMX1RJTUUsIGFmdGVyLCBzdGF0dXMpOwp9CgppbmxpbmUgdm9pZCBTaW1wbGVUaW1lWm9uZTo6c2V0RW5kUnVsZShpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRheU9mV2Vla0luTW9udGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF5T2ZXZWVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWUsIFVFcnJvckNvZGUmIHN0YXR1cykgewogICAgc2V0RW5kUnVsZShtb250aCwgZGF5T2ZXZWVrSW5Nb250aCwgZGF5T2ZXZWVrLCB0aW1lLCBXQUxMX1RJTUUsIHN0YXR1cyk7Cn0KCmlubGluZSB2b2lkIFNpbXBsZVRpbWVab25lOjpzZXRFbmRSdWxlKGludDMyX3QgbW9udGgsIGludDMyX3QgZGF5T2ZNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKICAgIHNldEVuZFJ1bGUobW9udGgsIGRheU9mTW9udGgsIHRpbWUsIFdBTExfVElNRSwgc3RhdHVzKTsKfQoKaW5saW5lIHZvaWQgU2ltcGxlVGltZVpvbmU6OnNldEVuZFJ1bGUoaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXlPZk1vbnRoLCBpbnQzMl90IGRheU9mV2VlaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZSwgYm9vbF90IGFmdGVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpIHsKICAgIHNldEVuZFJ1bGUobW9udGgsIGRheU9mTW9udGgsIGRheU9mV2VlaywgdGltZSwgV0FMTF9USU1FLCBhZnRlciwgc3RhdHVzKTsKfQoKI2VuZGlmIC8vIF9TSU1QTEVUWgo=