LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBHUkVHT0NBTC5ICioKKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDA0LzIyLzk3ICAgIGFsaXUgICAgICAgIE92ZXJoYXVsZWQgaGVhZGVyLgoqICAgIDA3LzI4Lzk4ICAgIHN0ZXBoZW4gICAgICAgIFN5bmMgd2l0aCBKREsgMS4yCiogICAgMDkvMDQvOTggICAgc3RlcGhlbiAgICAgICAgUmUtc3luYyB3aXRoIEpESyA4LzMxIHB1dGJhY2sKKiAgICAwOS8xNC85OCAgICBzdGVwaGVuICAgICAgICBDaGFuZ2VkIHR5cGUgb2Yga09uZURheSwga09uZVdlZWsgdG8gZG91YmxlLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiByb2xsKCkgCiogICAxMC8xNS85OSAgICBhbGl1ICAgICAgICBGaXhlZCBqMzEsIGluY29ycmVjdCBXRUVLX09GX1lFQVIgY29tcHV0YXRpb24uCiogICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIFdFRUtfT0ZfWUVBUiBjb21wdXRhdGlvbi4KKiAgIDEwLzE1Lzk5ICAgIGFsaXUgICAgICAgIEZpeGVkIGozMiwgY2Fubm90IHNldCBkYXRlIHRvIEZlYiAyOSAyMDAwIEFELgoqICAgICAgICAgICAgICAgICAgICAgICAgICAge0pESyBidWcgNDIxMDIwOSA0MjA5MjcyfQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwogICAgICAgICAKI2lmbmRlZiBHUkVHT0NBTF9ICiNkZWZpbmUgR1JFR09DQUxfSAoKCiNpbmNsdWRlICJ1bmljb2RlL2NhbGVuZGFyLmgiCgovKioKICogQ29uY3JldGUgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgdGhlIHN0YW5kYXJkIGNhbGVuZGFyIHVzZWQgYnkgbW9zdCBvZiB0aGUgd29ybGQuCiAqIDxQPgogKiBUaGUgc3RhbmRhcmQgKEdyZWdvcmlhbikgY2FsZW5kYXIgaGFzIDIgZXJhcywgQkMgYW5kIEFELgogKiA8UD4KICogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIGEgc2luZ2xlIGRpc2NvbnRpbnVpdHksIHdoaWNoIGNvcnJlc3BvbmRzIGJ5IGRlZmF1bHQgdG8KICogdGhlIGRhdGUgdGhlIEdyZWdvcmlhbiBjYWxlbmRhciB3YXMgb3JpZ2luYWxseSBpbnN0aXR1dGVkIChPY3RvYmVyIDE1LCAxNTgyKS4gTm90IGFsbAogKiBjb3VudHJpZXMgYWRvcHRlZCB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHRoZW4sIHNvIHRoaXMgY3V0b3ZlciBkYXRlIG1heSBiZSBjaGFuZ2VkIGJ5CiAqIHRoZSBjYWxsZXIuCiAqIDxQPgogKiBQcmlvciB0byB0aGUgaW5zdGl0dXRpb24gb2YgdGhlIEdyZWdvcmlhbiBDYWxlbmRhciwgTmV3IFllYXIncyBEYXkgd2FzIE1hcmNoIDI1LiBUbwogKiBhdm9pZCBjb25mdXNpb24sIHRoaXMgQ2FsZW5kYXIgYWx3YXlzIHVzZXMgSmFudWFyeSAxLiBBIG1hbnVhbCBhZGp1c3RtZW50IG1heSBiZSBtYWRlCiAqIGlmIGRlc2lyZWQgZm9yIGRhdGVzIHRoYXQgYXJlIHByaW9yIHRvIHRoZSBHcmVnb3JpYW4gY2hhbmdlb3ZlciBhbmQgd2hpY2ggZmFsbAogKiBiZXR3ZWVuIEphbnVhcnkgMSBhbmQgTWFyY2ggMjQuCiAqCiAqIDxwPlZhbHVlcyBjYWxjdWxhdGVkIGZvciB0aGUgPGNvZGU+V0VFS19PRl9ZRUFSPC9jb2RlPiBmaWVsZCByYW5nZSBmcm9tIDEgdG8KICogNTMuICBXZWVrIDEgZm9yIGEgeWVhciBpcyB0aGUgZmlyc3Qgd2VlayB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0CiAqIDxjb2RlPmdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKTwvY29kZT4gZGF5cyBmcm9tIHRoYXQgeWVhci4gIEl0IHRodXMKICogZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mIDxjb2RlPmdldE1pbmltYWxEYXlzSW5GaXJzdFdlZWsoKTwvY29kZT4sCiAqIDxjb2RlPmdldEZpcnN0RGF5T2ZXZWVrKCk8L2NvZGU+LCBhbmQgdGhlIGRheSBvZiB0aGUgd2VlayBvZiBKYW51YXJ5IDEuCiAqIFdlZWtzIGJldHdlZW4gd2VlayAxIG9mIG9uZSB5ZWFyIGFuZCB3ZWVrIDEgb2YgdGhlIGZvbGxvd2luZyB5ZWFyIGFyZQogKiBudW1iZXJlZCBzZXF1ZW50aWFsbHkgZnJvbSAyIHRvIDUyIG9yIDUzIChhcyBuZWVkZWQpLgogKgogKiA8cD5Gb3IgZXhhbXBsZSwgSmFudWFyeSAxLCAxOTk4IHdhcyBhIFRodXJzZGF5LiAgSWYKICogPGNvZGU+Z2V0Rmlyc3REYXlPZldlZWsoKTwvY29kZT4gaXMgPGNvZGU+TU9OREFZPC9jb2RlPiBhbmQKICogPGNvZGU+Z2V0TWluaW1hbERheXNJbkZpcnN0V2VlaygpPC9jb2RlPiBpcyA0ICh0aGVzZSBhcmUgdGhlIHZhbHVlcwogKiByZWZsZWN0aW5nIElTTyA4NjAxIGFuZCBtYW55IG5hdGlvbmFsIHN0YW5kYXJkcyksIHRoZW4gd2VlayAxIG9mIDE5OTggc3RhcnRzCiAqIG9uIERlY2VtYmVyIDI5LCAxOTk3LCBhbmQgZW5kcyBvbiBKYW51YXJ5IDQsIDE5OTguICBJZiwgaG93ZXZlciwKICogPGNvZGU+Z2V0Rmlyc3REYXlPZldlZWsoKTwvY29kZT4gaXMgPGNvZGU+U1VOREFZPC9jb2RlPiwgdGhlbiB3ZWVrIDEgb2YgMTk5OAogKiBzdGFydHMgb24gSmFudWFyeSA0LCAxOTk4LCBhbmQgZW5kcyBvbiBKYW51YXJ5IDEwLCAxOTk4OyB0aGUgZmlyc3QgdGhyZWUgZGF5cwogKiBvZiAxOTk4IHRoZW4gYXJlIHBhcnQgb2Ygd2VlayA1MyBvZiAxOTk3LgogKgogKiA8cD5FeGFtcGxlIGZvciB1c2luZyBHcmVnb3JpYW5DYWxlbmRhcjoKICogPHByZT4KICogLiAgICAvLyBnZXQgdGhlIHN1cHBvcnRlZCBpZHMgZm9yIEdNVC0wODowMCAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKQogKiAuICAgIGludDMyX3QgaWRzQ291bnQ7CiAqIC4gICAgY29uc3QgVW5pY29kZVN0cmluZyoqIGlkcyA9IFRpbWVab25lOjpjcmVhdGVBdmFpbGFibGVJRHMoLTggKiA2MCAqIDYwICogMTAwMCwgaWRzQ291bnQpOwogKiAuICAgIC8vIGlmIG5vIGlkcyB3ZXJlIHJldHVybmVkLCBzb21ldGhpbmcgaXMgd3JvbmcuIGdldCBvdXQuCiAqIC4gICAgaWYgKGlkc0NvdW50ID09IDApIHsKICogLiAgICAgICAgcmV0dXJuOwogKiAuICAgIH0KICogLgogKiAuICAgIC8vIGJlZ2luIG91dHB1dAogKiAuICAgIGNvdXQgPDwgIkN1cnJlbnQgVGltZSIgPDwgZW5kbDsKICogLgogKiAuICAgIC8vIGNyZWF0ZSBhIFBhY2lmaWMgU3RhbmRhcmQgVGltZSB0aW1lIHpvbmUKICogLiAgICBTaW1wbGVUaW1lWm9uZSogcGR0ID0gbmV3IFNpbXBsZVRpbWVab25lKC04ICogNjAgKiA2MCAqIDEwMDAsICooaWRzWzBdKSk7CiAqIC4gICAgCiAqIC4gICAgLy8gc2V0IHVwIHJ1bGVzIGZvciBkYXlsaWdodCBzYXZpbmdzIHRpbWUKICogLiAgICBwZHQtPnNldFN0YXJ0UnVsZShDYWxlbmRhcjo6QVBSSUwsIDEsIENhbGVuZGFyOjpTVU5EQVksIDIgKiA2MCAqIDYwICogMTAwMCk7CiAqIC4gICAgcGR0LT5zZXRFbmRSdWxlKENhbGVuZGFyOjpPQ1RPQkVSLCAtMSwgQ2FsZW5kYXI6OlNVTkRBWSwgMiAqIDYwICogNjAgKiAxMDAwKTsKICogLiAgICAKICogLiAgICAvLyBjcmVhdGUgYSBHcmVnb3JpYW5DYWxlbmRhciB3aXRoIHRoZSBQYWNpZmljIERheWxpZ2h0IHRpbWUgem9uZQogKiAuICAgIC8vIGFuZCB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lCiAqIC4gICAgVUVycm9yQ29kZSBzdWNjZXNzID0gVV9aRVJPX0VSUk9SOwogKiAuICAgIENhbGVuZGFyKiBjYWxlbmRhciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhciggcGR0LCBzdWNjZXNzICk7CiAqIC4gICAgCiAqIC4gICAgLy8gcHJpbnQgb3V0IGEgYnVuY2ggb2YgaW50ZXJlc3RpbmcgdGhpbmdzCiAqIC4gICAgY291dCA8PCAiRVJBOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpFUkEsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIllFQVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OllFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIk1PTlRIOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNT05USCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiV0VFS19PRl9ZRUFSOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpXRUVLX09GX1lFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIldFRUtfT0ZfTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OldFRUtfT0ZfTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBVEU6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBVEUsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX01PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJEQVlfT0ZfWUVBUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX1lFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9XRUVLOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfV0VFSywgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX1dFRUtfSU5fTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBWV9PRl9XRUVLX0lOX01PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJBTV9QTTogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6QU1fUE0sIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkhPVVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkhPVVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkhPVVJfT0ZfREFZOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpIT1VSX09GX0RBWSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiTUlOVVRFOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNSU5VVEUsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIlNFQ09ORDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6U0VDT05ELCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJNSUxMSVNFQ09ORDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6TUlMTElTRUNPTkQsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIlpPTkVfT0ZGU0VUOiAiIDw8IChjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6Wk9ORV9PRkZTRVQsIHN1Y2Nlc3MgKS8oNjAqNjAqMTAwMCkpIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiRFNUX09GRlNFVDogIiA8PCAoY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRTVF9PRkZTRVQsIHN1Y2Nlc3MgKS8oNjAqNjAqMTAwMCkpIDw8IGVuZGw7CiAqIC4KICogLiAgICBjb3V0IDw8ICJDdXJyZW50IFRpbWUsIHdpdGggaG91ciByZXNldCB0byAzIiA8PCBlbmRsOwogKiAuICAgIGNhbGVuZGFyLT5jbGVhcihDYWxlbmRhcjo6SE9VUl9PRl9EQVkpOyAvLyBzbyBkb2Vzbid0IG92ZXJyaWRlCiAqIC4gICAgY2FsZW5kYXItPnNldChDYWxlbmRhcjo6SE9VUiwgMyk7CiAqIC4gICAgY291dCA8PCAiRVJBOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpFUkEsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIllFQVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OllFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIk1PTlRIOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNT05USCwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiV0VFS19PRl9ZRUFSOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpXRUVLX09GX1lFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIldFRUtfT0ZfTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OldFRUtfT0ZfTU9OVEgsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBVEU6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBVEUsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9NT05USDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX01PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJEQVlfT0ZfWUVBUjogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6REFZX09GX1lFQVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkRBWV9PRl9XRUVLOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpEQVlfT0ZfV0VFSywgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiREFZX09GX1dFRUtfSU5fTU9OVEg6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRBWV9PRl9XRUVLX0lOX01PTlRILCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJBTV9QTTogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6QU1fUE0sIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkhPVVI6ICIgPDwgY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkhPVVIsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIkhPVVJfT0ZfREFZOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpIT1VSX09GX0RBWSwgc3VjY2VzcyApIDw8IGVuZGw7CiAqIC4gICAgY291dCA8PCAiTUlOVVRFOiAiIDw8IGNhbGVuZGFyLT5nZXQoIENhbGVuZGFyOjpNSU5VVEUsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIlNFQ09ORDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6U0VDT05ELCBzdWNjZXNzICkgPDwgZW5kbDsKICogLiAgICBjb3V0IDw8ICJNSUxMSVNFQ09ORDogIiA8PCBjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6TUlMTElTRUNPTkQsIHN1Y2Nlc3MgKSA8PCBlbmRsOwogKiAuICAgIGNvdXQgPDwgIlpPTkVfT0ZGU0VUOiAiIDw8IChjYWxlbmRhci0+Z2V0KCBDYWxlbmRhcjo6Wk9ORV9PRkZTRVQsIHN1Y2Nlc3MgKS8oNjAqNjAqMTAwMCkpIDw8IGVuZGw7IC8vIGluIGhvdXJzCiAqIC4gICAgY291dCA8PCAiRFNUX09GRlNFVDogIiA8PCAoY2FsZW5kYXItPmdldCggQ2FsZW5kYXI6OkRTVF9PRkZTRVQsIHN1Y2Nlc3MgKS8oNjAqNjAqMTAwMCkpIDw8IGVuZGw7IC8vIGluIGhvdXJzCiAqIC4KICogLiAgICBkZWxldGVbXSBpZHM7CiAqIC4gICAgZGVsZXRlIGNhbGVuZGFyOyAvLyBhbHNvIGRlbGV0ZXMgcGR0CiAqIC4KICogPC9wcmU+CiAqLwpjbGFzcyBVX0kxOE5fQVBJIEdyZWdvcmlhbkNhbGVuZGFyOiBwdWJsaWMgQ2FsZW5kYXIgewpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBVc2VmdWwgY29uc3RhbnRzIGZvciBHcmVnb3JpYW5DYWxlbmRhciBhbmQgVGltZVpvbmUuCiAgICAgKi8KICAgIGVudW0gRUVyYXMgewogICAgICAgIEJDLAogICAgICAgIEFECiAgICB9OwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIGRlZmF1bHQgR3JlZ29yaWFuQ2FsZW5kYXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZGVmYXVsdCB0aW1lCiAgICAgKiB6b25lIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICoKICAgICAqIEBwYXJhbSBzdWNjZXNzICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgY29uc3RydWN0aW9uLgogICAgICogICAgICAgICAgICAgICAgIFJldHVybnMgVV9aRVJPX0VSUk9SIGlmIGNvbnN0cnVjdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gdGltZSB6b25lCiAgICAgKiB3aXRoIHRoZSBkZWZhdWx0IGxvY2FsZS4gQ2xpZW50cyBhcmUgbm8gbG9uZ2VyIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgZ2l2ZW4KICAgICAqIHRpbWUgem9uZSBvYmplY3QgYWZ0ZXIgaXQncyBhZG9wdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB6b25lVG9BZG9wdCAgICAgVGhlIGdpdmVuIHRpbWV6b25lLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICogQHN0YWJsZQogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZSogem9uZVRvQWRvcHQsIFVFcnJvckNvZGUmIHN1Y2Nlc3MpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIEdyZWdvcmlhbkNhbGVuZGFyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgaW4gdGhlIGdpdmVuIHRpbWUgem9uZQogICAgICogd2l0aCB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHpvbmUgICAgIFRoZSBnaXZlbiB0aW1lem9uZS4KICAgICAqIEBwYXJhbSBzdWNjZXNzICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgY29uc3RydWN0aW9uLgogICAgICogICAgICAgICAgICAgICAgIFJldHVybnMgVV9aRVJPX0VSUk9SIGlmIGNvbnN0cnVjdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoY29uc3QgVGltZVpvbmUmIHpvbmUsIFVFcnJvckNvZGUmIHN1Y2Nlc3MpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIEdyZWdvcmlhbkNhbGVuZGFyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbWUgaW4gdGhlIGRlZmF1bHQgdGltZSB6b25lCiAgICAgKiB3aXRoIHRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIGFMb2NhbGUgIFRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKGNvbnN0IExvY2FsZSYgYUxvY2FsZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gdGltZSB6b25lCiAgICAgKiB3aXRoIHRoZSBnaXZlbiBsb2NhbGUuIENsaWVudHMgYXJlIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIGdpdmVuCiAgICAgKiB0aW1lIHpvbmUgb2JqZWN0IGFmdGVyIGl0J3MgYWRvcHRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gem9uZVRvQWRvcHQgICAgIFRoZSBnaXZlbiB0aW1lem9uZS4KICAgICAqIEBwYXJhbSBhTG9jYWxlICBUaGUgZ2l2ZW4gbG9jYWxlLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICogQHN0YWJsZQogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZSogem9uZVRvQWRvcHQsIGNvbnN0IExvY2FsZSYgYUxvY2FsZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdGltZSBpbiB0aGUgZ2l2ZW4gdGltZSB6b25lCiAgICAgKiB3aXRoIHRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHpvbmUgICAgIFRoZSBnaXZlbiB0aW1lem9uZS4KICAgICAqIEBwYXJhbSBhTG9jYWxlICBUaGUgZ2l2ZW4gbG9jYWxlLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICogQHN0YWJsZQogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihjb25zdCBUaW1lWm9uZSYgem9uZSwgY29uc3QgTG9jYWxlJiBhTG9jYWxlLCBVRXJyb3JDb2RlJiBzdWNjZXNzKTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYSBHcmVnb3JpYW5DYWxlbmRhciB3aXRoIHRoZSBnaXZlbiBBRCBkYXRlIHNldCBpbiB0aGUgZGVmYXVsdCB0aW1lCiAgICAgKiB6b25lIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICoKICAgICAqIEBwYXJhbSB5ZWFyICAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIFlFQVIgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gbW9udGggICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBNT05USCB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4gTW9udGgKICAgICAqICAgICAgICAgICAgICAgICB2YWx1ZSBpcyAwLWJhc2VkLiBlLmcuLCAwIGZvciBKYW51YXJ5LgogICAgICogQHBhcmFtIGRhdGUgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgREFURSB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBzdWNjZXNzICBJbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3QgY29uc3RydWN0aW9uLgogICAgICogICAgICAgICAgICAgICAgIFJldHVybnMgVV9aRVJPX0VSUk9SIGlmIGNvbnN0cnVjdGVkIHN1Y2Nlc3NmdWxseS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgR3JlZ29yaWFuQ2FsZW5kYXIoaW50MzJfdCB5ZWFyLCBpbnQzMl90IG1vbnRoLCBpbnQzMl90IGRhdGUsIFVFcnJvckNvZGUmIHN1Y2Nlc3MpOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIEdyZWdvcmlhbkNhbGVuZGFyIHdpdGggdGhlIGdpdmVuIEFEIGRhdGUgYW5kIHRpbWUgc2V0IGZvciB0aGUKICAgICAqIGRlZmF1bHQgdGltZSB6b25lIHdpdGggdGhlIGRlZmF1bHQgbG9jYWxlLgogICAgICoKICAgICAqIEBwYXJhbSB5ZWFyICAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIFlFQVIgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gbW9udGggICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBNT05USCB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4gTW9udGgKICAgICAqICAgICAgICAgICAgICAgICB2YWx1ZSBpcyAwLWJhc2VkLiBlLmcuLCAwIGZvciBKYW51YXJ5LgogICAgICogQHBhcmFtIGRhdGUgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgREFURSB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBob3VyICAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIEhPVVJfT0ZfREFZIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIG1pbnV0ZSAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgTUlOVVRFIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIHN1Y2Nlc3MgIEluZGljYXRlcyB0aGUgc3RhdHVzIG9mIEdyZWdvcmlhbkNhbGVuZGFyIG9iamVjdCBjb25zdHJ1Y3Rpb24uCiAgICAgKiAgICAgICAgICAgICAgICAgUmV0dXJucyBVX1pFUk9fRVJST1IgaWYgY29uc3RydWN0ZWQgc3VjY2Vzc2Z1bGx5LgogICAgICogQHN0YWJsZQogICAgICovCiAgICBHcmVnb3JpYW5DYWxlbmRhcihpbnQzMl90IHllYXIsIGludDMyX3QgbW9udGgsIGludDMyX3QgZGF0ZSwgaW50MzJfdCBob3VyLCBpbnQzMl90IG1pbnV0ZSwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGEgR3JlZ29yaWFuQ2FsZW5kYXIgd2l0aCB0aGUgZ2l2ZW4gQUQgZGF0ZSBhbmQgdGltZSBzZXQgZm9yIHRoZQogICAgICogZGVmYXVsdCB0aW1lIHpvbmUgd2l0aCB0aGUgZGVmYXVsdCBsb2NhbGUuCiAgICAgKgogICAgICogQHBhcmFtIHllYXIgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgWUVBUiB0aW1lIGZpZWxkIGluIHRoZSBjYWxlbmRhci4KICAgICAqIEBwYXJhbSBtb250aCAgICBUaGUgdmFsdWUgdXNlZCB0byBzZXQgdGhlIE1PTlRIIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLiBNb250aAogICAgICogICAgICAgICAgICAgICAgIHZhbHVlIGlzIDAtYmFzZWQuIGUuZy4sIDAgZm9yIEphbnVhcnkuCiAgICAgKiBAcGFyYW0gZGF0ZSAgICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBEQVRFIHRpbWUgZmllbGQgaW4gdGhlIGNhbGVuZGFyLgogICAgICogQHBhcmFtIGhvdXIgICAgIFRoZSB2YWx1ZSB1c2VkIHRvIHNldCB0aGUgSE9VUl9PRl9EQVkgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gbWludXRlICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBNSU5VVEUgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gc2Vjb25kICAgVGhlIHZhbHVlIHVzZWQgdG8gc2V0IHRoZSBTRUNPTkQgdGltZSBmaWVsZCBpbiB0aGUgY2FsZW5kYXIuCiAgICAgKiBAcGFyYW0gc3VjY2VzcyAgSW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IGNvbnN0cnVjdGlvbi4KICAgICAqICAgICAgICAgICAgICAgICBSZXR1cm5zIFVfWkVST19FUlJPUiBpZiBjb25zdHJ1Y3RlZCBzdWNjZXNzZnVsbHkuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKGludDMyX3QgeWVhciwgaW50MzJfdCBtb250aCwgaW50MzJfdCBkYXRlLCBpbnQzMl90IGhvdXIsIGludDMyX3QgbWludXRlLCBpbnQzMl90IHNlY29uZCwgVUVycm9yQ29kZSYgc3VjY2Vzcyk7CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgfkdyZWdvcmlhbkNhbGVuZGFyKCk7CgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyKGNvbnN0IEdyZWdvcmlhbkNhbGVuZGFyJiBzb3VyY2UpOwoKICAgIC8qKgogICAgICogRGVmYXVsdCBhc3NpZ25tZW50IG9wZXJhdG9yCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIEdyZWdvcmlhbkNhbGVuZGFyJiBvcGVyYXRvcj0oY29uc3QgR3JlZ29yaWFuQ2FsZW5kYXImIHJpZ2h0KTsKCiAgICAvKioKICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgcG9seW1vcnBoaWMgY29weSBvZiB0aGlzIGNhbGVuZGFyLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIENhbGVuZGFyKiBjbG9uZSh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIEdyZWdvcmlhbkNhbGVuZGFyIGNoYW5nZSBkYXRlLiBUaGlzIGlzIHRoZSBwb2ludCB3aGVuIHRoZSBzd2l0Y2ggZnJvbQogICAgICogSnVsaWFuIGRhdGVzIHRvIEdyZWdvcmlhbiBkYXRlcyBvY2N1cnJlZC4gRGVmYXVsdCBpcyAwMDowMDowMCBsb2NhbCB0aW1lLCBPY3RvYmVyCiAgICAgKiAxNSwgMTU4Mi4gUHJldmlvdXMgdG8gdGhpcyB0aW1lIGFuZCBkYXRlIHdpbGwgYmUgSnVsaWFuIGRhdGVzLgogICAgICoKICAgICAqIEBwYXJhbSBkYXRlICAgICBUaGUgZ2l2ZW4gR3JlZ29yaWFuIGN1dG92ZXIgZGF0ZS4KICAgICAqIEBwYXJhbSBzdWNjZXNzICBPdXRwdXQgcGFyYW0gc2V0IHRvIHN1Y2Nlc3MvZmFpbHVyZSBjb2RlIG9uIGV4aXQuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZvaWQgc2V0R3JlZ29yaWFuQ2hhbmdlKFVEYXRlIGRhdGUsIFVFcnJvckNvZGUmIHN1Y2Nlc3MpOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgR3JlZ29yaWFuIENhbGVuZGFyIGNoYW5nZSBkYXRlLiBUaGlzIGlzIHRoZSBwb2ludCB3aGVuIHRoZSBzd2l0Y2ggZnJvbQogICAgICogSnVsaWFuIGRhdGVzIHRvIEdyZWdvcmlhbiBkYXRlcyBvY2N1cnJlZC4gRGVmYXVsdCBpcyAwMDowMDowMCBsb2NhbCB0aW1lLCBPY3RvYmVyCiAgICAgKiAxNSwgMTU4Mi4gUHJldmlvdXMgdG8gdGhpcyB0aW1lIGFuZCBkYXRlIHdpbGwgYmUgSnVsaWFuIGRhdGVzLgogICAgICoKICAgICAqIEByZXR1cm4gICBUaGUgR3JlZ29yaWFuIGN1dG92ZXIgdGltZSBmb3IgdGhpcyBjYWxlbmRhci4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgVURhdGUgZ2V0R3JlZ29yaWFuQ2hhbmdlKHZvaWQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHllYXIgaXMgYSBsZWFwIHllYXIuIERldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHllYXIgaXMKICAgICAqIGEgbGVhcCB5ZWFyIGlzIGFjdHVhbGx5IHZlcnkgY29tcGxpY2F0ZWQuIFdlIGRvIHNvbWV0aGluZyBjcnVkZSBhbmQgbW9zdGx5CiAgICAgKiBjb3JyZWN0IGhlcmUsIGJ1dCBmb3IgYSByZWFsIGRldGVybWluYXRpb24geW91IG5lZWQgYSBsb3Qgb2YgY29udGV4dHVhbAogICAgICogaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBpbiBTd2VkZW4sIHRoZSBjaGFuZ2UgZnJvbSBKdWxpYW4gdG8gR3JlZ29yaWFuIGhhcHBlbmVkCiAgICAgKiBpbiBhIGNvbXBsZXggd2F5IHJlc3VsdGluZyBpbiBtaXNzZWQgbGVhcCB5ZWFycyBhbmQgZG91YmxlIGxlYXAgeWVhcnMgYmV0d2VlbgogICAgICogMTcwMCBhbmQgMTc1My4gQW5vdGhlciBleGFtcGxlIGlzIHRoYXQgYWZ0ZXIgdGhlIHN0YXJ0IG9mIHRoZSBKdWxpYW4gY2FsZW5kYXIgaW4KICAgICAqIDQ1IEIuQy4sIHRoZSBsZWFwIHllYXJzIGRpZCBub3QgcmVndWxhcml6ZSB1bnRpbCA4IEEuRC4gVGhpcyBtZXRob2QgaWdub3JlcyB0aGVzZQogICAgICogcXVpcmtzLCBhbmQgcGF5cyBhdHRlbnRpb24gb25seSB0byB0aGUgSnVsaWFuIG9uc2V0IGRhdGUgYW5kIHRoZSBHcmVnb3JpYW4KICAgICAqIGN1dG92ZXIgKHdoaWNoIGNhbiBiZSBjaGFuZ2VkKS4KICAgICAqCiAgICAgKiBAcGFyYW0geWVhciAgVGhlIGdpdmVuIHllYXIuCiAgICAgKiBAcmV0dXJuICAgICAgVHJ1ZSBpZiB0aGUgZ2l2ZW4geWVhciBpcyBhIGxlYXAgeWVhcjsgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICogQHN0YWJsZQogICAgICovCiAgICBib29sX3QgaXNMZWFwWWVhcihpbnQzMl90IHllYXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29tcGFyZXMgdGhlIGVxdWFsaXR5IG9mIHR3byBHcmVnb3JpYW5DYWxlbmRhciBvYmplY3RzLiBPYmplY3RzIG9mIGRpZmZlcmVudAogICAgICogc3ViY2xhc3NlcyBhcmUgY29uc2lkZXJlZCB1bmVxdWFsLiAgVGhpcyBpcyBhIHN0cmljdCBlcXVhbGl0eSB0ZXN0OyBzZWUgdGhlCiAgICAgKiBkb2N1bWVudGF0aW9uIGZvciBDYWxlbmRhcjo6b3BlcmF0b3I9PSgpLgogICAgICoKICAgICAqIEBwYXJhbSB0aGF0ICBUaGUgR3JlZ29yaWFuQ2FsZW5kYXIgb2JqZWN0IHRvIGJlIGNvbXBhcmVkIHdpdGguCiAgICAgKiBAcmV0dXJuICAgICAgVHJ1ZSBpZiB0aGUgZ2l2ZW4gR3JlZ29yaWFuQ2FsZW5kYXIgaXMgdGhlIHNhbWUgYXMgdGhpcwogICAgICogICAgICAgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyOyBmYWxzZSBvdGhlcndpc2UuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgYm9vbF90IG9wZXJhdG9yPT0oY29uc3QgQ2FsZW5kYXImIHRoYXQpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ2FsZW5kYXIgb3ZlcnJpZGUuCiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbm90aGVyIENhbGVuZGFyIG9iamVjdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMgb25lLiAgQW4gZXF1aXZhbGVudAogICAgICogQ2FsZW5kYXIgd2lsbCBiZWhhdmUgZXhhY3RseSBhcyB0aGlzIG9uZSBkb2VzLCBidXQgbWF5IGJlIHNldCB0byBhIGRpZmZlcmVudCB0aW1lLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIGJvb2xfdCBlcXVpdmFsZW50VG8oY29uc3QgQ2FsZW5kYXImIG90aGVyKSBjb25zdDsKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIFVEYXRlIEFyaXRobWV0aWMgZnVuY3Rpb24uIEFkZHMgdGhlIHNwZWNpZmllZCAoc2lnbmVkKSBhbW91bnQKICAgICAqIG9mIHRpbWUgdG8gdGhlIGdpdmVuIHRpbWUgZmllbGQsIGJhc2VkIG9uIHRoZSBjYWxlbmRhcidzIHJ1bGVzLiAgRm9yIG1vcmUKICAgICAqIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIENhbGVuZGFyOjphZGQoKS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmllbGQgICBUaGUgdGltZSBmaWVsZC4KICAgICAqIEBwYXJhbSBhbW91bnQgIFRoZSBhbW91bnQgb2YgZGF0ZSBvciB0aW1lIHRvIGJlIGFkZGVkIHRvIHRoZSBmaWVsZC4KICAgICAqIEBwYXJhbSBzdGF0dXMgIE91dHB1dCBwYXJhbSBzZXQgdG8gc3VjY2Vzcy9mYWlsdXJlIGNvZGUgb24gZXhpdC4gSWYgYW55IHZhbHVlCiAgICAgKiAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNldCBpbiB0aGUgdGltZSBmaWVsZCBpcyBpbnZhbGlkLCB0aGlzIHdpbGwgYmUgc2V0IHRvCiAgICAgKiAgICAgICAgICAgICAgICBhbiBlcnJvciBzdGF0dXMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBhZGQoRURhdGVGaWVsZHMgZmllbGQsIGludDMyX3QgYW1vdW50LCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogKE92ZXJyaWRlcyBDYWxlbmRhcikgUm9sbHMgdXAgb3IgZG93biBieSB0aGUgZ2l2ZW4gYW1vdW50IGluIHRoZSBzcGVjaWZpZWQgZmllbGQuCiAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBDYWxlbmRhcjo6cm9sbCgpLgogICAgICoKICAgICAqIEBwYXJhbSBmaWVsZCAgIFRoZSB0aW1lIGZpZWxkLgogICAgICogQHBhcmFtIGFtb3VudCAgSW5kaWNhdGVzIGFtb3VudCB0byByb2xsLgogICAgICogQHBhcmFtIHN0YXR1cyAgT3V0cHV0IHBhcmFtIHNldCB0byBzdWNjZXNzL2ZhaWx1cmUgY29kZSBvbiBleGl0LiBJZiBhbnkgdmFsdWUKICAgICAqICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgc2V0IGluIHRoZSB0aW1lIGZpZWxkIGlzIGludmFsaWQsIHRoaXMgd2lsbCBiZSBzZXQgdG8KICAgICAqICAgICAgICAgICAgICAgIGFuIGVycm9yIHN0YXR1cy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCB2b2lkIHJvbGwoRURhdGVGaWVsZHMgZmllbGQsIGludDMyX3QgYW1vdW50LCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgICogKE92ZXJyaWRlcyBDYWxlbmRhcikgUmV0dXJucyBtaW5pbXVtIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQuIGUuZy4gZm9yCiAgICAgKiBHcmVnb3JpYW4gREFZX09GX01PTlRILCAxLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TWluaW11bShFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSZXR1cm5zIG1heGltdW0gdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4gZS5nLiBmb3IKICAgICAqIEdyZWdvcmlhbiBEQVlfT0ZfTU9OVEgsIDMxLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TWF4aW11bShFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSZXR1cm5zIGhpZ2hlc3QgbWluaW11bSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGlmIHZhcmllcy4KICAgICAqIE90aGVyd2lzZSBzYW1lIGFzIGdldE1pbmltdW0oKS4gRm9yIEdyZWdvcmlhbiwgbm8gZGlmZmVyZW5jZS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgdmlydHVhbCBpbnQzMl90IGdldEdyZWF0ZXN0TWluaW11bShFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSZXR1cm5zIGxvd2VzdCBtYXhpbXVtIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgaWYgdmFyaWVzLgogICAgICogT3RoZXJ3aXNlIHNhbWUgYXMgZ2V0TWF4aW11bSgpLiBGb3IgR3JlZ29yaWFuIERBWV9PRl9NT05USCwgMjguCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgaW50MzJfdCBnZXRMZWFzdE1heGltdW0oRURhdGVGaWVsZHMgZmllbGQpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhpcyBmaWVsZCBjb3VsZCBoYXZlLCBnaXZlbiB0aGUgY3VycmVudCBkYXRlLgogICAgICogRm9yIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIsIHRoaXMgaXMgdGhlIHNhbWUgYXMgZ2V0TWluaW11bSgpIGFuZCBnZXRHcmVhdGVzdE1pbmltdW0oKS4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgaW50MzJfdCBnZXRBY3R1YWxNaW5pbXVtKEVEYXRlRmllbGRzIGZpZWxkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoaXMgZmllbGQgY291bGQgaGF2ZSwgZ2l2ZW4gdGhlIGN1cnJlbnQgZGF0ZS4KICAgICAqIEZvciBleGFtcGxlLCB3aXRoIHRoZSBkYXRlICJGZWIgMywgMTk5NyIgYW5kIHRoZSBEQVlfT0ZfTU9OVEggZmllbGQsIHRoZSBhY3R1YWwKICAgICAqIG1heGltdW0gd291bGQgYmUgMjg7IGZvciAiRmViIDMsIDE5OTYiIGl0IHMgMjkuICBTaW1pbGFybHkgZm9yIGEgSGVicmV3IGNhbGVuZGFyLAogICAgICogZm9yIHNvbWUgeWVhcnMgdGhlIGFjdHVhbCBtYXhpbXVtIGZvciBNT05USCBpcyAxMiwgYW5kIGZvciBvdGhlcnMgMTMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIGludDMyX3QgZ2V0QWN0dWFsTWF4aW11bShFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBkYXRlIGZvciB0aGlzIENhbGVuZGFyIGlzIGluCiAgICAgKiBEYXlsaWdodCBTYXZpbmdzIFRpbWUuIFJlY29nbml6ZXMgRFNUX09GRlNFVCwgaWYgaXQgaXMgc2V0LgogICAgICoKICAgICAqIEBwYXJhbSBzdGF0dXMgRmlsbC1pbiBwYXJhbWV0ZXIgd2hpY2ggcmVjZWl2ZXMgdGhlIHN0YXR1cyBvZiB0aGlzIG9wZXJhdGlvbi4KICAgICAqIEByZXR1cm4gICBUcnVlIGlmIHRoZSBjdXJyZW50IGRhdGUgZm9yIHRoaXMgQ2FsZW5kYXIgaXMgaW4gRGF5bGlnaHQgU2F2aW5ncyBUaW1lLAogICAgICogICAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgYm9vbF90IGluRGF5bGlnaHRUaW1lKFVFcnJvckNvZGUmIHN0YXR1cykgY29uc3Q7CgpwdWJsaWM6CgogICAgLyoqCiAgICAgKiBPdmVycmlkZSBDYWxlbmRhciBSZXR1cm5zIGEgdW5pcXVlIGNsYXNzIElEIFBPTFlNT1JQSElDQUxMWS4gUHVyZSB2aXJ0dWFsCiAgICAgKiBvdmVycmlkZS4gVGhpcyBtZXRob2QgaXMgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHZlcnNpb24gb2YgUlRUSSwgc2luY2Ugbm90IGFsbCBDKysKICAgICAqIGNvbXBpbGVycyBzdXBwb3J0IGdlbnVpbmUgUlRUSS4gUG9seW1vcnBoaWMgb3BlcmF0b3I9PSgpIGFuZCBjbG9uZSgpIG1ldGhvZHMgY2FsbAogICAgICogdGhpcyBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiAgIFRoZSBjbGFzcyBJRCBmb3IgdGhpcyBvYmplY3QuIEFsbCBvYmplY3RzIG9mIGEgZ2l2ZW4gY2xhc3MgaGF2ZSB0aGUKICAgICAqICAgICAgICAgICBzYW1lIGNsYXNzIElELiBPYmplY3RzIG9mIG90aGVyIGNsYXNzZXMgaGF2ZSBkaWZmZXJlbnQgY2xhc3MgSURzLgogICAgICogQHN0YWJsZQogICAgICovCiAgICB2aXJ0dWFsIFVDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKHZvaWQpIGNvbnN0IHsgcmV0dXJuIChVQ2xhc3NJRCkmZmdDbGFzc0lEOyB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIElEIGZvciB0aGlzIGNsYXNzLiBUaGlzIGlzIHVzZWZ1bCBvbmx5IGZvciBjb21wYXJpbmcgdG8gYSByZXR1cm4KICAgICAqIHZhbHVlIGZyb20gZ2V0RHluYW1pY0NsYXNzSUQoKS4gRm9yIGV4YW1wbGU6CiAgICAgKgogICAgICogICAgICBCYXNlKiBwb2x5bW9ycGhpY19wb2ludGVyID0gY3JlYXRlUG9seW1vcnBoaWNPYmplY3QoKTsKICAgICAqICAgICAgaWYgKHBvbHltb3JwaGljX3BvaW50ZXItPmdldER5bmFtaWNDbGFzc0lEKCkgPT0KICAgICAqICAgICAgICAgIERlcml2ZWQ6OmdldFN0YXRpY0NsYXNzSUQoKSkgLi4uCiAgICAgKgogICAgICogQHJldHVybiAgIFRoZSBjbGFzcyBJRCBmb3IgYWxsIG9iamVjdHMgb2YgdGhpcyBjbGFzcy4KICAgICAqIEBzdGFibGUKICAgICAqLwogICAgc3RhdGljIFVDbGFzc0lEIGdldFN0YXRpY0NsYXNzSUQodm9pZCkgeyByZXR1cm4gKFVDbGFzc0lEKSZmZ0NsYXNzSUQ7IH0KCnByb3RlY3RlZDoKCiAgICAvKioKICAgICAqIChPdmVycmlkZXMgQ2FsZW5kYXIpIENvbnZlcnRzIEdNVCBhcyBtaWxsaXNlY29uZHMgdG8gdGltZSBmaWVsZCB2YWx1ZXMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlRmllbGRzKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAgKiAoT3ZlcnJpZGVzIENhbGVuZGFyKSBDb252ZXJ0cyBDYWxlbmRhcidzIHRpbWUgZmllbGQgdmFsdWVzIHRvIEdNVCBhcwogICAgICogbWlsbGlzZWNvbmRzLgogICAgICoKICAgICAqIEBwYXJhbSBzdGF0dXMgIE91dHB1dCBwYXJhbSBzZXQgdG8gc3VjY2Vzcy9mYWlsdXJlIGNvZGUgb24gZXhpdC4gSWYgYW55IHZhbHVlCiAgICAgKiAgICAgICAgICAgICAgICBwcmV2aW91c2x5IHNldCBpbiB0aGUgdGltZSBmaWVsZCBpcyBpbnZhbGlkLCB0aGlzIHdpbGwgYmUgc2V0IHRvCiAgICAgKiAgICAgICAgICAgICAgICBhbiBlcnJvciBzdGF0dXMuCiAgICAgKiBAc3RhYmxlCiAgICAgKi8KICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlVGltZShVRXJyb3JDb2RlJiBzdGF0dXMpOwoKcHJpdmF0ZTogCgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIEVSQS4gIFdlIG5lZWQgYSBzcGVjaWFsIG1ldGhvZCBmb3IgdGhpcyBiZWNhdXNlIHRoZQogICAgICogZGVmYXVsdCBFUkEgaXMgQUQsIGJ1dCBhIHplcm8gKHVuc2V0KSBFUkEgaXMgQkMuCiAgICAgKi8KICAgIGludDMyX3QgaW50ZXJuYWxHZXRFcmEoKSBjb25zdDsKCiAgICAvLyB0aGlzIGlzIDJeNTIgLSAxLCB0aGUgbGFyZ2VzdCBhbGxvd2FibGUgbWFudGlzc2Egd2l0aCBhIDAgZXhwb25lbnQgaW4gYSA2NC1iaXQgZG91YmxlCiAgICBzdGF0aWMgY29uc3QgVURhdGUgRUFSTElFU1RfU1VQUE9SVEVEX01JTExJUzsKICAgIHN0YXRpYyBjb25zdCBVRGF0ZSBMQVRFU1RfU1VQUE9SVEVEX01JTExJUzsKCiAgICBpbnQzMl90IG1vbnRoTGVuZ3RoKGludDMyX3QgbW9udGgpIGNvbnN0OwogICAgaW50MzJfdCBtb250aExlbmd0aChpbnQzMl90IG1vbnRoLCBpbnQzMl90IHllYXIpIGNvbnN0OwoKICAgIGludDMyX3QgeWVhckxlbmd0aChpbnQzMl90IHllYXIpIGNvbnN0OwoKICAgIGludDMyX3QgeWVhckxlbmd0aCh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIEFmdGVyIGFkanVzdG1lbnRzIHN1Y2ggYXMgYWRkKE1PTlRIKSwgYWRkKFlFQVIpLCB3ZSBkb24ndCB3YW50IHRoZQogICAgICogbW9udGggdG8ganVtcCBhcm91bmQuICBFLmcuLCB3ZSBkb24ndCB3YW50IEphbiAzMSArIDEgbW9udGggdG8gZ28gdG8gTWFyCiAgICAgKiAzLCB3ZSB3YW50IGl0IHRvIGdvIHRvIEZlYiAyOC4gIEFkanVzdG1lbnRzIHdoaWNoIG1pZ2h0IHJ1biBpbnRvIHRoaXMKICAgICAqIHByb2JsZW0gY2FsbCB0aGlzIG1ldGhvZCB0byByZXRhaW4gdGhlIHByb3BlciBtb250aC4KICAgICAqLwogICAgdm9pZCBwaW5EYXlPZk1vbnRoKHZvaWQpOwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBkYXkgbnVtYmVyIHdpdGggcmVzcGVjdCB0byB0aGUgZXBvY2guICBKYW51YXJ5IDEsIDE5NzAgKEdyZWdvcmlhbikKICAgICAqIGlzIGRheSB6ZXJvLgogICAgICovCiAgICBVRGF0ZSBnZXRFcG9jaERheShVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIHN0YXRpYyBkb3VibGUgY29tcHV0ZUp1bGlhbkRheU9mWWVhcihib29sX3QgaXNHcmVnb3JpYW4sIGludDMyX3QgeWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sX3QmIGlzTGVhcCk7CgogICAgaW50MzJfdCBjb21wdXRlUmVsYXRpdmVET1coKSBjb25zdDsKCiAgICBpbnQzMl90IGNvbXB1dGVSZWxhdGl2ZURPVyhkb3VibGUganVsaWFuRGF5KSBjb25zdDsKCiAgICBpbnQzMl90IGNvbXB1dGVET1lmcm9tV09ZKGRvdWJsZSBqdWxpYW5EYXlPZlllYXIpIGNvbnN0OwoKICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgSnVsaWFuIGRheSBudW1iZXIgdW5kZXIgZWl0aGVyIHRoZSBHcmVnb3JpYW4gb3IgdGhlCiAgICAgKiBKdWxpYW4gY2FsZW5kYXIsIHVzaW5nIHRoZSBnaXZlbiB5ZWFyIGFuZCB0aGUgcmVtYWluaW5nIGZpZWxkcy4KICAgICAqIEBwYXJhbSBpc0dyZWdvcmlhbiBpZiB0cnVlLCB1c2UgdGhlIEdyZWdvcmlhbiBjYWxlbmRhcgogICAgICogQHBhcmFtIHllYXIgdGhlIGFkanVzdGVkIHllYXIgbnVtYmVyLCB3aXRoIDAgaW5kaWNhdGluZyB0aGUKICAgICAqIHllYXIgMSBCQywgLTEgaW5kaWNhdGluZyAyIEJDLCBldGMuCiAgICAgKiBAcmV0dXJuIHRoZSBKdWxpYW4gZGF5IG51bWJlcgogICAgICovCiAgICBkb3VibGUgY29tcHV0ZUp1bGlhbkRheShib29sX3QgaXNHcmVnb3JpYW4sIGludDMyX3QgeWVhcik7CgogICAgLyoqCiAgICAgKiBDb21wdXRlIHRoZSBkYXRlLWJhc2VkIGZpZWxkcyBnaXZlbiB0aGUgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCBzdGFydC4gRG8KICAgICAqIG5vdCBjb21wdXRlIHRoZSB0aW1lLWJhc2VkIGZpZWxkcyAoSE9VUiwgTUlOVVRFLCBldGMuKS4KICAgICAqCiAgICAgKiBAcGFyYW0gdGhlVGltZSB0aGUgdGltZSBpbiB3YWxsIG1pbGxpcyAoZWl0aGVyIFN0YW5kYXJkIG9yIERTVCksCiAgICAgKiB3aGljaGV2ZXIgaXMgaW4gZWZmZWN0CiAgICAgKiBAcGFyYW0gcXVpY2sgaWYgdHJ1ZSwgb25seSBjb21wdXRlIHRoZSBFUkEsIFlFQVIsIE1PTlRILCBEQVRFLAogICAgICogREFZX09GX1dFRUssIGFuZCBEQVlfT0ZfWUVBUi4KICAgICAqLwogICAgdm9pZCB0aW1lVG9GaWVsZHMoVURhdGUgdGhlVGltZSwgYm9vbF90IHF1aWNrLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgd2VlayBudW1iZXIgb2YgYSBkYXksIHdpdGhpbiBhIHBlcmlvZC4gVGhpcyBtYXkgYmUgdGhlIHdlZWsgbnVtYmVyIGluCiAgICAgKiBhIHllYXIsIG9yIHRoZSB3ZWVrIG51bWJlciBpbiBhIG1vbnRoLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIHZhbHVlID49IDEsIGJ1dCBpZgogICAgICogc29tZSBpbml0aWFsIGRheXMgb2YgdGhlIHBlcmlvZCBhcmUgZXhjbHVkZWQgZnJvbSB3ZWVrIDEsIGJlY2F1c2UKICAgICAqIG1pbmltYWxEYXlzSW5GaXJzdFdlZWsgaXMgPiAxLCB0aGVuIHRoZSB3ZWVrIG51bWJlciB3aWxsIGJlIHplcm8gZm9yIHRob3NlCiAgICAgKiBpbml0aWFsIGRheXMuIFJlcXVpcmVzIHRoZSBkYXkgb2Ygd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lCiAgICAgKiB0aGUgZGF5IG9mIHdlZWsgb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgcGVyaW9kLgogICAgICoKICAgICAqIEBwYXJhbSBkYXRlICBEYXktb2YteWVhciBvciBkYXktb2YtbW9udGguIFNob3VsZCBiZSAxIGZvciBmaXJzdCBkYXkgb2YgcGVyaW9kLgogICAgICogQHBhcmFtIGRheSAgIERheS1vZi13ZWVrIGZvciBnaXZlbiBkYXlPZlBlcmlvZC4gMS1iYXNlZCB3aXRoIDE9U3VuZGF5LgogICAgICogQHJldHVybiAgICAgIFdlZWsgbnVtYmVyLCBvbmUtYmFzZWQsIG9yIHplcm8gaWYgdGhlIGRheSBmYWxscyBpbiBwYXJ0IG9mIHRoZQogICAgICogICAgICAgICAgICAgIG1vbnRoIGJlZm9yZSB0aGUgZmlyc3Qgd2Vlaywgd2hlbiB0aGVyZSBhcmUgZGF5cyBiZWZvcmUgdGhlIGZpcnN0CiAgICAgKiAgICAgICAgICAgICAgd2VlayBiZWNhdXNlIHRoZSBtaW5pbXVtIGRheXMgaW4gdGhlIGZpcnN0IHdlZWsgaXMgbW9yZSB0aGFuIG9uZS4KICAgICAqLwogICAgaW50MzJfdCB3ZWVrTnVtYmVyKGludDMyX3QgZGF0ZSwgaW50MzJfdCBkYXkpOwoKICAgIC8qKgogICAgICogVmFsaWRhdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIHNldCB0aW1lIGZpZWxkcy4gIFRydWUgaWYgdGhleSdyZSBhbGwgdmFsaWQuCiAgICAgKi8KICAgIGJvb2xfdCB2YWxpZGF0ZUZpZWxkcyh2b2lkKSBjb25zdDsKCiAgICAvKioKICAgICAqIFZhbGlkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHRpbWUgZmllbGQuICBUcnVlIGlmIGl0J3MgdmFsaWQuCiAgICAgKi8KICAgIGJvb2xfdCBib3VuZHNDaGVjayhpbnQzMl90IHZhbHVlLCBFRGF0ZUZpZWxkcyBmaWVsZCkgY29uc3Q7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHBzZXVkby10aW1lLXN0YW1wIGZvciB0d28gZmllbGRzLCBnaXZlbiB0aGVpcgogICAgICogaW5kaXZpZHVhbCBwc2V1ZG8tdGltZS1zdGFtcHMuICBJZiBlaXRoZXIgb2YgdGhlIGZpZWxkcwogICAgICogaXMgdW5zZXQsIHRoZW4gdGhlIGFnZ3JlZ2F0ZSBpcyB1bnNldC4gIE90aGVyd2lzZSwgdGhlCiAgICAgKiBhZ2dyZWdhdGUgaXMgdGhlIGxhdGVyIG9mIHRoZSB0d28gc3RhbXBzLgogICAgICovCiAgICBpbnQzMl90IGFnZ3JlZ2F0ZVN0YW1wKGludDMyX3Qgc3RhbXBfYSwgaW50MzJfdCBzdGFtcF9iKTsKCiAgICAvKioKICAgICAqIFRoZSBwb2ludCBhdCB3aGljaCB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIHJ1bGVzIGFyZSB1c2VkLCBtZWFzdXJlZCBpbgogICAgICogbWlsbGlzZWNvbmRzIGZyb20gdGhlIHN0YW5kYXJkIGVwb2NoLiAgRGVmYXVsdCBpcyBPY3RvYmVyIDE1LCAxNTgyCiAgICAgKiAoR3JlZ29yaWFuKSAwMDowMDowMCBVVEMsIHRoYXQgaXMsIE9jdG9iZXIgNCwgMTU4MiAoSnVsaWFuKSBpcyBmb2xsb3dlZAogICAgICogYnkgT2N0b2JlciAxNSwgMTU4MiAoR3JlZ29yaWFuKS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gSnVsaWFuIGRheSBudW1iZXIKICAgICAqIDIyOTkxNjEuCiAgICAgKi8KICAgIC8vIFRoaXMgaXMgbWVhc3VyZWQgZnJvbSB0aGUgc3RhbmRhcmQgZXBvY2gsIG5vdCBpbiBKdWxpYW4gRGF5cy4KICAgIFVEYXRlICAgICAgICAgICAgICAgIGZHcmVnb3JpYW5DdXRvdmVyOwoKICAgIC8qKgogICAgICogTWlkbmlnaHQsIGxvY2FsIHRpbWUgKHVzaW5nIHRoaXMgQ2FsZW5kYXIncyBUaW1lWm9uZSkgYXQgb3IgYmVmb3JlIHRoZQogICAgICogZ3JlZ29yaWFuQ3V0b3Zlci4gVGhpcyBpcyBhIHB1cmUgZGF0ZSB2YWx1ZSB3aXRoIG5vIHRpbWUgb2YgZGF5IG9yCiAgICAgKiB0aW1lem9uZSBjb21wb25lbnQuCiAgICAgKi8KICAgIFVEYXRlICAgICAgICAgICAgICAgICBmTm9ybWFsaXplZEdyZWdvcmlhbkN1dG92ZXI7Ly8gPSBncmVnb3JpYW5DdXRvdmVyOwoKICAgIC8qKgogICAgICogVGhlIHllYXIgb2YgdGhlIGdyZWdvcmlhbkN1dG92ZXIsIHdpdGggMCByZXByZXNlbnRpbmcKICAgICAqIDEgQkMsIC0xIHJlcHJlc2VudGluZyAyIEJDLCBldGMuCiAgICAgKi8KICAgIGludDMyX3QgZkdyZWdvcmlhbkN1dG92ZXJZZWFyOy8vID0gMTU4MjsKCiAgICBzdGF0aWMgY2hhciBmZ0NsYXNzSUQ7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aW1lIGFzIG1pbGxpc2Vjb25kcyB0byBKdWxpYW4gZGF0ZS4gVGhlIEp1bGlhbiBkYXRlIHVzZWQgaGVyZSBpcyBub3QgYQogICAgICogdHJ1ZSBKdWxpYW4gZGF0ZSwgc2luY2UgaXQgaXMgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCwgbm90IG5vb24uCiAgICAgKgogICAgICogQHBhcmFtIG1pbGxpcyAgVGhlIGdpdmVuIG1pbGxpc2Vjb25kcy4KICAgICAqIEByZXR1cm4gICAgICAgIFRoZSBKdWxpYW4gZGF0ZSBudW1iZXIuCiAgICAgKi8KICAgIHN0YXRpYyBkb3VibGUgbWlsbGlzVG9KdWxpYW5EYXkoVURhdGUgbWlsbGlzKTsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIEp1bGlhbiBkYXRlIHRvIHRpbWUgYXMgbWlsbGlzZWNvbmRzLiBUaGUgSnVsaWFuIGRhdGUgdXNlZCBoZXJlIGlzIG5vdCBhCiAgICAgKiB0cnVlIEp1bGlhbiBkYXRlLCBzaW5jZSBpdCBpcyBtZWFzdXJlZCBmcm9tIG1pZG5pZ2h0LCBub3Qgbm9vbi4KICAgICAqCiAgICAgKiBAcGFyYW0ganVsaWFuICBUaGUgZ2l2ZW4gSnVsaWFuIGRhdGUgbnVtYmVyLgogICAgICogQHJldHVybiAgICAgICAgVGltZSBhcyBtaWxsaXNlY29uZHMuCiAgICAgKi8KICAgIHN0YXRpYyBVRGF0ZSBqdWxpYW5EYXlUb01pbGxpcyhkb3VibGUganVsaWFuKTsKCiAgICAvKioKICAgICAqIENvbnZlcnQgYSBxdWFzaSBKdWxpYW4gZGF0ZSB0byB0aGUgZGF5IG9mIHRoZSB3ZWVrLiBUaGUgSnVsaWFuIGRhdGUgdXNlZCBoZXJlIGlzCiAgICAgKiBub3QgYSB0cnVlIEp1bGlhbiBkYXRlLCBzaW5jZSBpdCBpcyBtZWFzdXJlZCBmcm9tIG1pZG5pZ2h0LCBub3Qgbm9vbi4gUmV0dXJuCiAgICAgKiB2YWx1ZSBpcyBvbmUtYmFzZWQuCiAgICAgKgogICAgICogQHJldHVybiAgIERheSBudW1iZXIgZnJvbSAxLi43IChTVU4uLlNBVCkuCiAgICAgKi8KICAgIHN0YXRpYyB1aW50OF90IGp1bGlhbkRheVRvRGF5T2ZXZWVrKGRvdWJsZSBqdWxpYW4pOwoKICAgIC8qKgogICAgICogRGl2aWRlIHR3byBsb25nIGludGVnZXJzLCByZXR1cm5pbmcgdGhlIGZsb29yIG9mIHRoZSBxdW90aWVudC4KICAgICAqIDxwPgogICAgICogVW5saWtlIHRoZSBidWlsdC1pbiBkaXZpc2lvbiwgdGhpcyBpcyBtYXRoZW1hdGljYWxseSB3ZWxsLWJlaGF2ZWQuCiAgICAgKiBFLmcuLCA8Y29kZT4tMS80PC9jb2RlPiA9PiAwCiAgICAgKiBidXQgPGNvZGU+Zmxvb3JEaXZpZGUoLTEsNCk8L2NvZGU+ID0+IC0xLgogICAgICogQHBhcmFtIG51bWVyYXRvciB0aGUgbnVtZXJhdG9yCiAgICAgKiBAcGFyYW0gZGVub21pbmF0b3IgYSBkaXZpc29yIHdoaWNoIG11c3QgYmUgPiAwCiAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQuCiAgICAgKi8KICAgIHN0YXRpYyBkb3VibGUgZmxvb3JEaXZpZGUoZG91YmxlIG51bWVyYXRvciwgZG91YmxlIGRlbm9taW5hdG9yKTsKCiAgICAvKioKICAgICAqIERpdmlkZSB0d28gaW50ZWdlcnMsIHJldHVybmluZyB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LgogICAgICogPHA+CiAgICAgKiBVbmxpa2UgdGhlIGJ1aWx0LWluIGRpdmlzaW9uLCB0aGlzIGlzIG1hdGhlbWF0aWNhbGx5IHdlbGwtYmVoYXZlZC4KICAgICAqIEUuZy4sIDxjb2RlPi0xLzQ8L2NvZGU+ID0+IDAKICAgICAqIGJ1dCA8Y29kZT5mbG9vckRpdmlkZSgtMSw0KTwvY29kZT4gPT4gLTEuCiAgICAgKiBAcGFyYW0gbnVtZXJhdG9yIHRoZSBudW1lcmF0b3IKICAgICAqIEBwYXJhbSBkZW5vbWluYXRvciBhIGRpdmlzb3Igd2hpY2ggbXVzdCBiZSA+IDAKICAgICAqIEByZXR1cm4gdGhlIGZsb29yIG9mIHRoZSBxdW90aWVudC4KICAgICAqLwogICAgc3RhdGljIGludDMyX3QgZmxvb3JEaXZpZGUoaW50MzJfdCBudW1lcmF0b3IsIGludDMyX3QgZGVub21pbmF0b3IpOwoKICAgIC8qKgogICAgICogRGl2aWRlIHR3byBpbnRlZ2VycywgcmV0dXJuaW5nIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQsIGFuZAogICAgICogdGhlIG1vZHVsdXMgcmVtYWluZGVyLgogICAgICogPHA+CiAgICAgKiBVbmxpa2UgdGhlIGJ1aWx0LWluIGRpdmlzaW9uLCB0aGlzIGlzIG1hdGhlbWF0aWNhbGx5IHdlbGwtYmVoYXZlZC4KICAgICAqIEUuZy4sIDxjb2RlPi0xLzQ8L2NvZGU+ID0+IDAgYW5kIDxjb2RlPi0xJTQ8L2NvZGU+ID0+IC0xLAogICAgICogYnV0IDxjb2RlPmZsb29yRGl2aWRlKC0xLDQpPC9jb2RlPiA9PiAtMSB3aXRoIDxjb2RlPnJlbWFpbmRlclswXTwvY29kZT4gPT4gMy4KICAgICAqIEBwYXJhbSBudW1lcmF0b3IgdGhlIG51bWVyYXRvcgogICAgICogQHBhcmFtIGRlbm9taW5hdG9yIGEgZGl2aXNvciB3aGljaCBtdXN0IGJlID4gMAogICAgICogQHBhcmFtIHJlbWFpbmRlciBhbiBhcnJheSBvZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB3aGljaCB0aGUgdmFsdWUKICAgICAqIDxjb2RlPm51bWVyYXRvciBtb2QgZGVub21pbmF0b3I8L2NvZGU+IGlzIHJldHVybmVkLiBVbmxpa2UgPGNvZGU+bnVtZXJhdG9yCiAgICAgKiAlIGRlbm9taW5hdG9yPC9jb2RlPiwgdGhpcyB3aWxsIGFsd2F5cyBiZSBub24tbmVnYXRpdmUuCiAgICAgKiBAcmV0dXJuIHRoZSBmbG9vciBvZiB0aGUgcXVvdGllbnQuCiAgICAgKi8KICAgIHN0YXRpYyBpbnQzMl90IGZsb29yRGl2aWRlKGludDMyX3QgbnVtZXJhdG9yLCBpbnQzMl90IGRlbm9taW5hdG9yLCBpbnQzMl90IHJlbWFpbmRlcltdKTsKCiAgICAvKioKICAgICAqIERpdmlkZSB0d28gaW50ZWdlcnMsIHJldHVybmluZyB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LCBhbmQKICAgICAqIHRoZSBtb2R1bHVzIHJlbWFpbmRlci4KICAgICAqIDxwPgogICAgICogVW5saWtlIHRoZSBidWlsdC1pbiBkaXZpc2lvbiwgdGhpcyBpcyBtYXRoZW1hdGljYWxseSB3ZWxsLWJlaGF2ZWQuCiAgICAgKiBFLmcuLCA8Y29kZT4tMS80PC9jb2RlPiA9PiAwIGFuZCA8Y29kZT4tMSU0PC9jb2RlPiA9PiAtMSwKICAgICAqIGJ1dCA8Y29kZT5mbG9vckRpdmlkZSgtMSw0KTwvY29kZT4gPT4gLTEgd2l0aCA8Y29kZT5yZW1haW5kZXJbMF08L2NvZGU+ID0+IDMuCiAgICAgKiBAcGFyYW0gbnVtZXJhdG9yIHRoZSBudW1lcmF0b3IKICAgICAqIEBwYXJhbSBkZW5vbWluYXRvciBhIGRpdmlzb3Igd2hpY2ggbXVzdCBiZSA+IDAKICAgICAqIEBwYXJhbSByZW1haW5kZXIgYW4gYXJyYXkgb2YgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gd2hpY2ggdGhlIHZhbHVlCiAgICAgKiA8Y29kZT5udW1lcmF0b3IgbW9kIGRlbm9taW5hdG9yPC9jb2RlPiBpcyByZXR1cm5lZC4gVW5saWtlIDxjb2RlPm51bWVyYXRvcgogICAgICogJSBkZW5vbWluYXRvcjwvY29kZT4sIHRoaXMgd2lsbCBhbHdheXMgYmUgbm9uLW5lZ2F0aXZlLgogICAgICogQHJldHVybiB0aGUgZmxvb3Igb2YgdGhlIHF1b3RpZW50LgogICAgICovCiAgICBzdGF0aWMgaW50MzJfdCBmbG9vckRpdmlkZShkb3VibGUgbnVtZXJhdG9yLCBpbnQzMl90IGRlbm9taW5hdG9yLCBpbnQzMl90IHJlbWFpbmRlcltdKTsKCgogICAgc3RhdGljIGNvbnN0IFVEYXRlICAgICAgIGtQYXBhbEN1dG92ZXI7ICAgICAgICAgICAgIC8vIEN1dG92ZXIgZGVjcmVlZCBieSBQb3BlIEdyZWdvcnkKCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0phbjFfMUp1bGlhbkRheTsgICAgICAgIC8vIEphbnVhcnkgMSwgeWVhciAxIChHcmVnb3JpYW4pCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0Vwb2NoU3RhcnRBc0p1bGlhbkRheTsgLy8gSmFudWFyeSAxLCAxOTcwIChHcmVnb3JpYW4pCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0Vwb2NoWWVhcjsKCiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga051bURheXMgW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAga0xlYXBOdW1EYXlzIFtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgIGtNb250aExlbmd0aCBbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTGVhcE1vbnRoTGVuZ3RoIFtdOwoKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTWluVmFsdWVzIFtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgIGtMZWFzdE1heFZhbHVlcyBbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICBrTWF4VmFsdWVzIFtdOwoKICAgIC8vIFVzZWZ1bCBtaWxsaXNlY29uZCBjb25zdGFudHMKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgIGtPbmVTZWNvbmQ7CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICBrT25lTWludXRlOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAga09uZUhvdXI7CiAgICBzdGF0aWMgY29uc3QgZG91YmxlICAgICAgICBrT25lRGF5OwogICAgc3RhdGljIGNvbnN0IGRvdWJsZSAgICAgICAga09uZVdlZWs7Cn07CgoKaW5saW5lIHVpbnQ4X3QgR3JlZ29yaWFuQ2FsZW5kYXI6Omp1bGlhbkRheVRvRGF5T2ZXZWVrKGRvdWJsZSBqdWxpYW4pCnsKICAvLyBJZiBqdWxpYW4gaXMgbmVnYXRpdmUsIHRoZW4ganVsaWFuJTcgd2lsbCBiZSBuZWdhdGl2ZSwgc28gd2UgYWRqdXN0CiAgLy8gYWNjb3JkaW5nbHkuICBXZSBhZGQgMSBiZWNhdXNlIEp1bGlhbiBkYXkgMCBpcyBNb25kYXkuCiAgaW50OF90IGRheU9mV2VlayA9IChpbnQ4X3QpIHVwcnZfZm1vZChqdWxpYW4gKyAxLCA3KTsKICAKICB1aW50OF90IHJlc3VsdCA9IGRheU9mV2VlayArICgoZGF5T2ZXZWVrIDwgMCkgPyAoNyArIFNVTkRBWSkgOiBTVU5EQVkpOwogIHJldHVybiByZXN1bHQ7Cn0KCiNlbmRpZiAvLyBfR1JFR09DQUwKLy9lb2YKICAgICAgICAK