LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8gQEBAIFNUQVJUIENPUFlSSUdIVCBAQEAKLy8KLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQovLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQovLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLy8gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQovLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwovLyB1bmRlciB0aGUgTGljZW5zZS4KLy8KLy8gQEBAIEVORCBDT1BZUklHSFQgQEBACioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZm5kZWYgQ09TVF9IRFIKI2RlZmluZSBDT1NUX0hEUgovKiAtKi1DKystKi0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIEZpbGU6ICAgICAgICAgQ29zdC5oCiogRGVzY3JpcHRpb246ICBDb3N0CiogQ3JlYXRlZDogICAgICAxMS8xMi85NgoqIExhbmd1YWdlOiAgICAgQysrCioKKiBMYXN0IE1vZGlmaWVkOiBNYXkgMjAwMQoqIFB1cnBvc2U6CSBTaW1wbGUgQ29zdCBWZWN0b3IgUmVkdWN0aW9uCioKKgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2luY2x1ZGUgIk5BRGVmYXVsdHMuaCIKI2luY2x1ZGUgIkJhc2VUeXBlcy5oIgojaW5jbHVkZSAiTkFUeXBlLmgiCiNpbmNsdWRlICJWYWx1ZURlc2MuaCIKI2luY2x1ZGUgIlBoeVByb3AuaCIKI2luY2x1ZGUgIlBoeVByb3AuaCIKI2luY2x1ZGUgIkNvc3RTY2FsYXIuaCIKI2luY2x1ZGUgIkNvc3RWZWN0b3IuaCIKCiNpbmNsdWRlICJEZWZhdWx0Q29uc3RhbnRzLmgiCiNpbmNsdWRlICJvcHQuaCIKCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBGb3J3YXJkIHJlZmVyZW5jZXMuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIE5BVHlwZTsKY2xhc3MgVmFsdWVJZDsKY2xhc3MgVmFsdWVJZFNldDsKY2xhc3MgVmFsdWVJZExpc3Q7CmNsYXNzIEl0ZW1FeHByOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIENvc3Q7CmNsYXNzIEhhc2hKb2luQ29zdDsKY2xhc3MgSGFzaEdyb3VwQnlDb3N0OwpjbGFzcyBDb3N0V2VpZ2h0OwpjbGFzcyBSZXNvdXJjZUNvbnN1bXB0aW9uV2VpZ2h0OwpjbGFzcyBDb3N0TGltaXQ7CmNsYXNzIEVsYXBzZWRUaW1lQ29zdExpbWl0OwpjbGFzcyBTY21FbGFwc2VkVGltZUNvc3RMaW1pdDsKY2xhc3MgQ29zdFByaW1pdGl2ZXM7CmNsYXNzIFBlcmZvcm1hbmNlR29hbDsKCgoKY29uc3QgTG5nMzIgTk9STUFMX1BMQU5fUFJJT1JJVFkgPSAwOyAgLy8gbXVzdCByZW1haW4gemVybwpjb25zdCBMbmczMiBJTkRFWF9ISU5UX1BSSU9SSVRZID0gMTAwOwpjb25zdCBMbmczMiBKT0lOX0lNUExFTUVOVEFUSU9OX0hJTlRfUFJJT1JJVFkgPSAxMDA7CmNvbnN0IExuZzMyIEdST1VQQllfSU1QTEVNRU5UQVRJT05fSElOVF9QUklPUklUWSA9IDEwMDsKY29uc3QgTG5nMzIgSU5URVJBQ1RJVkVfQUNDRVNTX1BSSU9SSVRZID0gMTsKY29uc3QgTG5nMzIgSU5URVJBQ1RJVkVfQUNDRVNTX01EQU1fUFJJT1JJVFkgPSAxOwpjb25zdCBMbmczMiBCTE9DS0lOR19PUFNfRklSU1RfTl9QUklPUklUWSA9IC0xOwpjb25zdCBMbmczMiBIQVNIX0pPSU5fRklSU1RfTl9QUklPUklUWSA9IEJMT0NLSU5HX09QU19GSVJTVF9OX1BSSU9SSVRZOwpjb25zdCBMbmczMiBIQVNIX0dST1VQX0JZX0ZJUlNUX05fUFJJT1JJVFkgPSBCTE9DS0lOR19PUFNfRklSU1RfTl9QUklPUklUWTsKY29uc3QgTG5nMzIgU09SVF9GSVJTVF9OX1BSSU9SSVRZID0gQkxPQ0tJTkdfT1BTX0ZJUlNUX05fUFJJT1JJVFk7CmNvbnN0IExuZzMyIE1BVEVSSUFMSVpFX0ZJUlNUX05fUFJJT1JJVFkgPSBCTE9DS0lOR19PUFNfRklSU1RfTl9QUklPUklUWTsKY29uc3QgTG5nMzIgTVZRUl9GQVZPUklURV9QUklPUklUWSA9IElOVEVSQUNUSVZFX0FDQ0VTU19QUklPUklUWTsKCmNsYXNzIFBsYW5Qcmlvcml0eQp7CgpwdWJsaWM6CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBjb25zdHJ1Y3RvcnMgKG5vIG5lZWQgZm9yIGEgZGVzdHJ1Y3RvciwgaXQncyBqdXN0IGEgbG9uZy13cmFwcGVyKSB4eHgKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICBQbGFuUHJpb3JpdHkoKQogICAgOiBsZXZlbF8oMCksIGRlbW90aW9uTGV2ZWxfKDApLCByaXNrUHJlbWl1bV8oMS4wKQogIHt9CgogIFBsYW5Qcmlvcml0eShjb25zdCBMbmczMiB2YWwsIGNvbnN0IExuZzMyIGRlbW90aW9uLCBDb3N0U2NhbGFyIHByZW1pdW09MS4wKQogICAgOiBsZXZlbF8odmFsKSwgICAvL3h4eCBtYWtlIGRlZiB2YWx1ZQogICAgICBkZW1vdGlvbkxldmVsXyhkZW1vdGlvbiksIC8veHh4IG1ha2UgZGVmIHZhbHVlCiAgICAgIHJpc2tQcmVtaXVtXyhwcmVtaXVtKQogIHt9CgogIC8vIENvcHkgY29uc3RydWN0b3IuCiAgUGxhblByaW9yaXR5KGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpCiAgICA6IGxldmVsXyhvdGhlci5sZXZlbF8pLAogICAgICBkZW1vdGlvbkxldmVsXyhvdGhlci5kZW1vdGlvbkxldmVsXyksCiAgICAgIHJpc2tQcmVtaXVtXyhvdGhlci5yaXNrUHJlbWl1bV8pCiAge30KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIG92ZXJsb2FkZWQgb3BlcmF0b3JzCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyBhc3NpZ25tZW50CiAgaW5saW5lIFBsYW5Qcmlvcml0eSAmIG9wZXJhdG9yID0gKGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpCiAgewogICAgbGV2ZWxfID0gb3RoZXIubGV2ZWxfIDsKICAgIGRlbW90aW9uTGV2ZWxfID0gb3RoZXIuZGVtb3Rpb25MZXZlbF87CiAgICByaXNrUHJlbWl1bV8gPSBvdGhlci5yaXNrUHJlbWl1bV87CiAgICByZXR1cm4gKnRoaXM7CiAgfQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gUGxhblByaW9yaXR5IGFyaXRobWV0aWMKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIG9wICsKICBpbmxpbmUgUGxhblByaW9yaXR5IG9wZXJhdG9yICsgKGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpIGNvbnN0CiAgewogICAgUGxhblByaW9yaXR5IHJlc3VsdChsZXZlbF8gKyBvdGhlci5sZXZlbF8sIAogICAgICAgICAgICAgICAgICAgICAgICBkZW1vdGlvbkxldmVsXyArIG90aGVyLmRlbW90aW9uTGV2ZWxfKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICAvLyBvcCArPQogIGlubGluZSBQbGFuUHJpb3JpdHkgJiBvcGVyYXRvciArPSAoY29uc3QgUGxhblByaW9yaXR5ICZvdGhlcikKICB7CiAgICBsZXZlbF8gPSBsZXZlbF8gKyBvdGhlci5sZXZlbF8gOwogICAgZGVtb3Rpb25MZXZlbF8gPSBkZW1vdGlvbkxldmVsXyArIG90aGVyLmRlbW90aW9uTGV2ZWxfIDsKICAgIHJldHVybiAqdGhpcyA7CiAgfQoKICAvLyBvcCAtCiAgaW5saW5lIFBsYW5Qcmlvcml0eSBvcGVyYXRvciAtIChjb25zdCBQbGFuUHJpb3JpdHkgJm90aGVyKSBjb25zdAogIHsKICAgIFBsYW5Qcmlvcml0eSByZXN1bHQobGV2ZWxfIC0gb3RoZXIubGV2ZWxfLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGVtb3Rpb25MZXZlbF8gLSBvdGhlci5kZW1vdGlvbkxldmVsXyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBjb21wYXJpc29uIG9mIFBsYW5Qcmlvcml0eSBvYmplY3RzCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvLyBvcCA9PQogIGlubGluZSBOQUJvb2xlYW4gb3BlcmF0b3IgPT0gKGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpIGNvbnN0CiAgewogICAgcmV0dXJuICgobGV2ZWxfID09IG90aGVyLmxldmVsXykgJiYgKGRlbW90aW9uTGV2ZWxfID09IG90aGVyLmRlbW90aW9uTGV2ZWxfKSkgOwogIH0KCiAgLy8gb3AgIT0KICBpbmxpbmUgTkFCb29sZWFuIG9wZXJhdG9yICE9IChjb25zdCBQbGFuUHJpb3JpdHkgJm90aGVyKSBjb25zdAogIHsKICAgIHJldHVybiBOT1QgKCAqdGhpcyA9PSBvdGhlciApIDsKICB9CgogIC8vIG9wIDwKICBpbmxpbmUgTkFCb29sZWFuIG9wZXJhdG9yIDwgIChjb25zdCBQbGFuUHJpb3JpdHkgJm90aGVyKSBjb25zdAogIHsKICAgIGlmIChsZXZlbF8gPT0gb3RoZXIubGV2ZWxfKQogICAgICByZXR1cm4gKGRlbW90aW9uTGV2ZWxfIDwgb3RoZXIuZGVtb3Rpb25MZXZlbF8pOwogICAgZWxzZQogICAgICByZXR1cm4gKCBsZXZlbF8gPCBvdGhlci5sZXZlbF8gKSA7CiAgfQoKICAvLyBvcCA8PQogIGlubGluZSBOQUJvb2xlYW4gb3BlcmF0b3IgPD0gIChjb25zdCBQbGFuUHJpb3JpdHkgJm90aGVyKSBjb25zdAogIHsKICAgIGlmIChsZXZlbF8gPT0gb3RoZXIubGV2ZWxfKQogICAgICByZXR1cm4gKGRlbW90aW9uTGV2ZWxfIDw9IG90aGVyLmRlbW90aW9uTGV2ZWxfKTsKICAgIGVsc2UKICAgICAgcmV0dXJuICggbGV2ZWxfIDwgb3RoZXIubGV2ZWxfICkgOwogIH0KCiAgLy8gb3AgPgogIGlubGluZSBOQUJvb2xlYW4gb3BlcmF0b3IgPiAgKGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpIGNvbnN0CiAgewogICAgaWYgKGxldmVsXyA9PSBvdGhlci5sZXZlbF8pCiAgICAgIHJldHVybiAoZGVtb3Rpb25MZXZlbF8gPiBvdGhlci5kZW1vdGlvbkxldmVsXyk7CiAgICBlbHNlCiAgICAgIHJldHVybiAoIGxldmVsXyA+IG90aGVyLmxldmVsXyApIDsKICB9CgogIC8vIG9wID49CiAgaW5saW5lIE5BQm9vbGVhbiBvcGVyYXRvciA+PSAgKGNvbnN0IFBsYW5Qcmlvcml0eSAmb3RoZXIpIGNvbnN0CiAgewogICAgaWYgKGxldmVsXyA9PSBvdGhlci5sZXZlbF8pCiAgICAgIHJldHVybiAoZGVtb3Rpb25MZXZlbF8gPj0gb3RoZXIuZGVtb3Rpb25MZXZlbF8pOwogICAgZWxzZQogICAgICByZXR1cm4gKCBsZXZlbF8gPiBvdGhlci5sZXZlbF8gKSA7CiAgfQoKICBpbmxpbmUgTkFCb29sZWFuIGlzTm9ybWFsICgpIGNvbnN0CiAgewogICAgICByZXR1cm4gKChsZXZlbF8gPT0gTk9STUFMX1BMQU5fUFJJT1JJVFkpIEFORCAKICAgICAgICAgICAgICAgZGVtb3Rpb25MZXZlbF8gPT0gTk9STUFMX1BMQU5fUFJJT1JJVFkpOwogIH0KCiAgLy8gUmVzZXQgdG8gbm9ybWFsIHByaW9yaXR5IGxldmVscwogIGlubGluZSB2b2lkIHJlc2V0VG9Ob3JtYWwoKQogIHsKICAgIGxldmVsXyA9IE5PUk1BTF9QTEFOX1BSSU9SSVRZOwogICAgZGVtb3Rpb25MZXZlbF8gPSBOT1JNQUxfUExBTl9QUklPUklUWTsKICB9CgogIC8vIFJvbGx1cCBpcyBzaW1wbGUgbm93LiBBZGQgcHJpb3JpdHkgbGV2ZWwKICBpbmxpbmUgdm9pZCByb2xsVXBVbmFyeShjb25zdCBQbGFuUHJpb3JpdHkgJmNoaWxkUHJpb3JpdHkpCiAgewogICAgbGV2ZWxfICs9IGNoaWxkUHJpb3JpdHkubGV2ZWxfOwogICAgZGVtb3Rpb25MZXZlbF8gKz0gY2hpbGRQcmlvcml0eS5kZW1vdGlvbkxldmVsXzsKICAgIC8vIGEgd2F5IG9mIHJvbGxpbmcgdXAgcmlzayBwcmVtaXVtcyB3aXRob3V0IGludHJ1ZGluZyBpbnRvIGNvc3QgZGV0YWlscwogICAgaWYgKENtcENvbW1vbjo6Z2V0RGVmYXVsdChDT01QX0JPT0xfMTc4KSA9PSBERl9PRkYpCiAgICAgIHJpc2tQcmVtaXVtXyAqPSBjaGlsZFByaW9yaXR5LnJpc2tQcmVtaXVtXzsKICB9CgogIGlubGluZSB2b2lkIHJvbGxVcEJpbmFyeShjb25zdCBQbGFuUHJpb3JpdHkgJmNoaWxkUHJpb3JpdHkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGFuUHJpb3JpdHkgJmNoaWxkUHJpb3JpdHkxKQogIHsKICAgIGxldmVsXyArPSBjaGlsZFByaW9yaXR5MC5sZXZlbF8gKyBjaGlsZFByaW9yaXR5MS5sZXZlbF87CiAgICBkZW1vdGlvbkxldmVsXyArPSBjaGlsZFByaW9yaXR5MC5kZW1vdGlvbkxldmVsXyArIGNoaWxkUHJpb3JpdHkxLmRlbW90aW9uTGV2ZWxfOwogIH0KCiAgLy8gQ29tYmluZSBzaWJsaW5ncyBpcyBzaW1wbGUgbm93LiBBZGQgcHJpb3JpdHkgbGV2ZWwKICBpbmxpbmUgdm9pZCBjb21iaW5lKGNvbnN0IFBsYW5Qcmlvcml0eSAmY2hpbGRQcmlvcml0eSkKICB7CiAgICBsZXZlbF8gKz0gY2hpbGRQcmlvcml0eS5sZXZlbF87CiAgICBkZW1vdGlvbkxldmVsXyArPSBjaGlsZFByaW9yaXR5LmRlbW90aW9uTGV2ZWxfOwogIH0KCiAgLy8gSW5jcmVtZW50IHRoZSBwcmlvcml0eSBsZXZlbCBieSBhIGNlcnRhaW4gdmFsdWUKICBpbmxpbmUgdm9pZCBpbmNyZW1lbnRMZXZlbHMoTG5nMzIgdmFsLCBMbmczMiBkZW0pCiAgewogICAgbGV2ZWxfICs9IHZhbDsKICAgIGRlbW90aW9uTGV2ZWxfICs9IGRlbTsKICB9CgogIC8vIEF2b2lkIHVzaW5nIHRoaXMgbWV0aG9kIGFzIG11Y2ggYXMgcG9zc2libGUgZXhjZXB0IGZvciBkaXNwbGF5IHB1cnBvc2VzCiAgaW5saW5lIExuZzMyIGdldExldmVsKCkgY29uc3QKICB7CiAgICByZXR1cm4gbGV2ZWxfIDsKICB9CgogIC8vIEF2b2lkIHVzaW5nIHRoaXMgbWV0aG9kIGFzIG11Y2ggYXMgcG9zc2libGUgZXhjZXB0IGZvciBkaXNwbGF5IHB1cnBvc2VzCiAgLy8gV2l0aCBjdXJyZW50IGV4Y2VwdGlvbiBvZiB1c2luZyBpdCBpbiBjb3N0IGJhc2VkIHBydW5pbmcKICBpbmxpbmUgTG5nMzIgZ2V0RGVtb3Rpb25MZXZlbCgpIGNvbnN0CiAgewogICAgcmV0dXJuIGRlbW90aW9uTGV2ZWxfIDsKICB9CgogIC8vIHJpc2sgcHJlbWl1bSBhY2Nlc3NvcgogIENvc3RTY2FsYXIgcmlza1ByZW1pdW0oKSBjb25zdCB7IHJldHVybiByaXNrUHJlbWl1bV87IH0KCnByaXZhdGU6CgogIExuZzMyIGxldmVsXzsKICBMbmczMiBkZW1vdGlvbkxldmVsXzsgIC8vIG1vbm90b25pY2FsbHkgZGVjcmVhc2luZyBsZXZlbAogIC8vIHh4eCBmb3Igbm93IGxldmVsXyBvdmVycmlkZSBkZW1vdGlvbkxldmVsXy4gTGF0ZXIgb24gd2Ugd2lsbCBvcnRob2dhbmFsaXplIHRoaXMKICBDb3N0U2NhbGFyIHJpc2tQcmVtaXVtXzsgCiAgLy8gbXVsdGlwbGljYXRpdmUgZmFjdG9yIHVzZWQgdG8gaW5mbGF0ZSBjb3N0IG9mIHJpc2t5IG9wZXJhdG9yLgogIC8vID0gMS4wIGZvciBub24tcmlza3kgKGllLCByb2J1c3QpIG9wZXJhdG9yLgogIC8vID4gMS4wIGZvciByaXNreSBvcGVyYXRvciBsaWtlIG5lc3RlZCBqb2luLgoKfTsgLy8gY2xhc3MgUGxhblByaW9yaXR5CgovLzxwYj4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gVGhlIENvc3Qgb2JqZWN0IGV4cHJlc3NlcyB0aGUgcmVzb3VyY2UgY29uc3VtcHRpb24gY2hhcmFjdGVyaXN0aWNzIG9mCi8vIGFuIG9wZXJhdGlvbi4gSXQgaXMgYSB2ZWhpY2xlIGNyZWF0ZWQgYnkgdGhlIGNvc3Rpbmcgcm91dGluZXMgdG8gY2FycnkKLy8gaW5mb3JtYXRpb24gb24gdGhlIHJlc291cmNlIHVzYWdlIG9mIGFuIG9wZXJhdGlvbiB0byBDYXNjYWRlcy4KLy8KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgQ29zdCA6IHB1YmxpYyBOQUJhc2ljT2JqZWN0CnsKcHVibGljOgoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDb25zdHJ1Y3RvcnMuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdHlwaWNhbGx5IHVzZWQgYnkgYW4gb3BlcmF0b3IgdG8gc3RvcmUgaXRzIGxvY2FsCiAgLy8gcHJvY2Vzc2luZyBjb3N0cy4KICAvLwogIC8vIFRoZSBzaW1wbGUgY29zdCB2ZWN0b3JzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cyBzaG91bGQgcmVwcmVzZW50IHRoZQogIC8vIHJlc291cmNlIHVzYWdlIG9mIGFuIGluc3RhbmNlIG9mIHRoZSBvcGVyYXRvciBpbiBvbmUgcGxhbiBmcmFnbWVudAogIC8vIG9uIG9uZSBDUFUuIHBsYW5GcmFnbWVudHNQZXJDUFUgaXMgdGhlIHRvdGFsIG5vIG9mIGluc3RhbmNlcyBvZiB0aGUKICAvLyBvcGVyYXRvciB0aGF0IGlzIGV4ZWN1dGluZyBvbiBvbmUgQ1BVLiBjb3VudE9mQ1BVcyBpcyB0aGUgdG90YWwgbm8KICAvLyBvZiBDUFVzIGF2YWlsYWJsZSBmb3IgYWxsIHBsYW4gZnJhZ21lbnRzIHRvIGV4ZWN1dGUgb24uCiAgLy8gMTAtMTYtMjAwNjogSW4gb3JkZXIgdG8gaW50ZWdyYXRlIFNDTSwgd2UgYXJlIGFkZGluZyBhbm90aGVyIG1lbWJlcgogIC8vIHRvIENvc3QgY2xhc3MuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdChjb25zdCBTaW1wbGVDb3N0VmVjdG9yKiBjdXJyZW50UHJvY2Vzc0ZpcnN0Um93Q29zdCwKICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRQcm9jZXNzTGFzdFJvd0Nvc3QsCiAgICAgICBjb25zdCBTaW1wbGVDb3N0VmVjdG9yKiBjdXJyZW50UHJvY2Vzc0Jsb2NraW5nQ29zdCwKICAgICAgIGNvbnN0IExuZzMyIGNvdW50T2ZDUFVzLAogICAgICAgY29uc3QgTG5nMzIgcGxhbkZyYWdtZW50c1BlckNQVSk7CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgQ29uc3RydWN0b3IgZm9yIFNDTS4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdChjb25zdCBTaW1wbGVDb3N0VmVjdG9yKiBjdXJyZW50UHJvY2Vzc1NjbUNvc3QpOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIENvc3QgQ29uc3RydWN0b3IgdXNlZCBpbiBTQ00gY29kZS4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdChjb25zdCBTaW1wbGVDb3N0VmVjdG9yKiBjdXJyZW50UHJvY2Vzc1NjbUNvc3QsCgkgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRPcERlYnVnSW5mbyk7CgogICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIENvbnN0cnVjdG9yIGZvciBhbiBlbXB0eSBDb3N0IG9iamVjdC4gIFVzZWQgcHJpbWFyaWx5IGZvcgogIC8vIGluaXRpYWxpemluZyBhIHJlc3VsdGluZyBDb3N0IG9iamVjdCBkdXJpbmcgYSByb2xsLXVwLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDb3N0KCkKICAgIDoKICAgICAgY3Bmcl8oKSwKICAgICAgY3Bscl8oKSwKICAgICAgY3BTY21scl8oKSwKICAgICAgY3BTY21EYmdfKCksCiAgICAgIGNwYmMxXygpLAogICAgICBjcGJjVG90YWxfKCksCiAgICAgIC8vam9wZnJfKCksCiAgICAgIC8vam9wbHJfKCksCiAgICAgIHRvdGFsQ29zdF8oKSwKICAgICAgY291bnRPZkNQVXNfKDEpLAogICAgICBwbGFuRnJhZ21lbnRzUGVyQ1BVXygxKSwKICAgICAgcHJpb3JpdHlfKCkge30KCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDb3N0KGNvbnN0IENvc3QgJm90aGVyKQogICAgOiBjcGZyXyhvdGhlci5jcGZyXyksCiAgICAgIGNwbHJfKG90aGVyLmNwbHJfKSwKICAgICAgY3BTY21scl8ob3RoZXIuY3BTY21scl8pLAogICAgICBjcFNjbURiZ18ob3RoZXIuY3BTY21EYmdfKSwKICAgICAgY3BiYzFfKG90aGVyLmNwYmMxXyksCiAgICAgIGNwYmNUb3RhbF8ob3RoZXIuY3BiY1RvdGFsXyksCiAgICAgIC8vam9wZnJfKG90aGVyLm9wZnJfKSwKICAgICAgLy9qb3Bscl8ob3RoZXIub3Bscl8pLAogICAgICB0b3RhbENvc3RfKG90aGVyLnRvdGFsQ29zdF8pLAogICAgICBjb3VudE9mQ1BVc18ob3RoZXIuY291bnRPZkNQVXNfKSwKICAgICAgcGxhbkZyYWdtZW50c1BlckNQVV8ob3RoZXIucGxhbkZyYWdtZW50c1BlckNQVV8pLAogICAgICBwcmlvcml0eV8ob3RoZXIucHJpb3JpdHlfKSB7fQoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIEVmZmVjdGl2ZSB2aXJ0dWFsIGNvbnN0cnVjdG9yLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIENvc3QqIGR1cGxpY2F0ZSgpOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBWaXJ0dWFsIGRlc3RydWN0b3IgZnVuY3Rpb24uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCB+Q29zdCAoKTsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQWNjZXNzb3IgbWV0aG9kcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0Q3BmcigpICAgICAgICBjb25zdCB7IHJldHVybiBjcGZyXzsgfQogIGlubGluZSBjb25zdCBTaW1wbGVDb3N0VmVjdG9yJiBnZXRDcGxyKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuIGNwbHJfOyB9CiAgaW5saW5lIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3ImIGdldFNjbUNwbHIoKSAgICAgY29uc3QgeyByZXR1cm4gY3BTY21scl87IH0KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0U2NtRGJnKCkgICAgIGNvbnN0IHsgcmV0dXJuIGNwU2NtRGJnXzsgfQogIGlubGluZSBjb25zdCBTaW1wbGVDb3N0VmVjdG9yJiBnZXRDcGJjVG90YWwoKSAgIGNvbnN0IHsgcmV0dXJuIGNwYmNUb3RhbF87IH0KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0Q3BiYzEoKSAgICAgICBjb25zdCB7IHJldHVybiBjcGJjMV87IH0KLy9qbyAgaW5saW5lIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3ImIGdldE9wZnIoKSAgICAgICAgY29uc3QgeyByZXR1cm4gb3Bmcl87IH0KLy9qbyAgaW5saW5lIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3ImIGdldE9wbHIoKSAgICAgICAgY29uc3QgeyByZXR1cm4gb3Bscl87IH0KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0VG90YWxDb3N0KCkgICBjb25zdCB7IHJldHVybiB0b3RhbENvc3RfOyB9CgogIGlubGluZSBMbmczMiAgICAgICAgICAgICAgICAgICAgZ2V0Q291bnRPZkNQVXMoKSBjb25zdCB7cmV0dXJuIGNvdW50T2ZDUFVzXzt9CgogIGlubGluZSBMbmczMiAgICAgICAgICAgICAgICAgICAgZ2V0UGxhbkZyYWdtZW50c1BlckNQVSgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBwbGFuRnJhZ21lbnRzUGVyQ1BVXzt9CiAgaW5saW5lIGNvbnN0IFBsYW5Qcmlvcml0eSYgZ2V0UGxhblByaW9yaXR5KCkgICBjb25zdCB7cmV0dXJuIHByaW9yaXR5Xzt9CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE11dGF0b3IgbWV0aG9kcy4KICAvLwogIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBwcm92aWRlIGFuIGludGVyZmFjZSAobWFpbmx5IGZvciBjbGllbnRzIHdobwogIC8vIGNvbWJpbmUgY29zdCBvYmplY3QgaW4gYW4gb3BlcmF0b3Itc3BlY2lmaWMgbWFubmVyKSB0byByZXRyaWV2ZQogIC8vIGhhbmRsZXMgKHRocm91Z2ggd2hpY2ggdGhlIHZlY3RvcnMgbWF5IGJlIG1vZGlmaWVkKSB0byB0aGUgdmFyaW91cwogIC8vIGNvc3QgdmVjdG9ycyBzdG9yZWQgaW4gdGhlIG9iamVjdC4KICAvLwogIC8vIEhhbmRsZXMgcmV0cmlldmVkIGJ5IHRoZXNlIG1ldGhvZHMgc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXJlIHNpbmNlCiAgLy8gYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgdmVjdG9yIG9mIHRoZSBoYW5kbGUgYXJlIGRpcmVjdGx5IHByb3BhZ2F0ZWQKICAvLyB0byB0aGUgY29ycmVzcG9uZGluZyB2ZWN0b3Igc3RvcmVkIGluIHRoZSBDb3N0IG9iamVjdCBpdHNlbGYuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIGNwZnIoKSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNwZnJfOyB9CiAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIGNwbHIoKSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNwbHJfOyB9CiAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIGNwU2NtbHIoKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNwU2NtbHJfOyB9CiAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIGNwU2NtRGJnKCkgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjcFNjbURiZ187IH0KICBpbmxpbmUgU2ltcGxlQ29zdFZlY3RvciYgY3BiY1RvdGFsKCkgICAgICAgICAgICAgeyByZXR1cm4gY3BiY1RvdGFsXzsgfQogIGlubGluZSBTaW1wbGVDb3N0VmVjdG9yJiBjcGJjMSgpICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGNwYmMxXzsgfQovL2pvICBpbmxpbmUgU2ltcGxlQ29zdFZlY3RvciYgb3BmcigpICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gb3Bmcl87IH0KLy9qbyAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIG9wbHIoKSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG9wbHJfOyB9CiAgaW5saW5lIFNpbXBsZUNvc3RWZWN0b3ImIHRvdGFsQ29zdCgpICAgICAgICAgICAgICB7IHJldHVybiB0b3RhbENvc3RfOyB9CiAgaW5saW5lIExuZzMyJiBjb3VudE9mQ1BVcygpICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGNvdW50T2ZDUFVzXzsgfQogIGlubGluZSBMbmczMiYgcGxhbkZyYWdtZW50c1BlckNQVSgpICAgICAgIHtyZXR1cm4gcGxhbkZyYWdtZW50c1BlckNQVV87IH0KICBpbmxpbmUgUGxhblByaW9yaXR5JiBwbGFuUHJpb3JpdHkoKSAgICAgICAgICAgICAgICB7IHJldHVybiBwcmlvcml0eV87IH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gTWV0aG9kIGZvciBhY2Nlc3NpbmcgYSBjb3N0IHZlY3RvciBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBnaXZlbgogIC8vIHBlcmZvcm1hbmNlIGdvYWwuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0Q29zdFZlY3RvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFBlcmZvcm1hbmNlR29hbCogY29uc3QgcGVyZkdvYWwpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDb21wYXJpc29uIGZ1bmN0aW9uLCBtYW5kYXRlZCBieSBDYXNjYWRlcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDT01QQVJFX1JFU1VMVCBjb21wYXJlQ29zdHMKCSAgICAgICAgICAgICAoY29uc3QgQ29zdCAmIG90aGVyLAoJICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE1ldGhvZCBmb3IgcmVwcmVzZW50aW5nIHRoZSBjb3N0IGluIHRlcm1zIG9mIGFuIGVsYXBzZWQgdGltZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBFbGFwc2VkVGltZSBjb252ZXJ0VG9FbGFwc2VkVGltZQoJICAgICAgICAgICAgIChjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgY29uc3Q7CgogIC8vIFRoaXMgbWV0aG9kIGlzIHRvIGJlIHVzZWQgb25seSBmb3IgZGlzcGxheWluZyB0b3RhbCBjb3N0IGluZm9ybWF0aW9uCiAgLy8gaW4gdGhlIGNvbnRleHQgb2YgZXhwbGFpbiwgdmlzdWFsIGRlYnVnZ2VyLCBldGMuIFRoaXMgaXMgTk9UIHRvIGJlIHVzZWQKICAvLyBmb3IgY29tcHV0aW5nIGFuZC9vciBjb21wYXJpbmcgcGxhbiBjb3N0IGluZm9ybWF0aW9uLiBJbiB0aGUgY29udGV4dCBvZiBOQ00sCiAgLy8gaW50ZXJuYWwgY29zdHMgdXNlZCBkdXJpbmcgcGxhbiBjb21wdXRhdGlvbiB1c2UgdmVyeSBkaWZmZXJlbnQgdW5pdHMgdGhhbgogIC8vIHRoZSB0b3RhbCBjb3N0IGRpc3BsYXllZCBleHRlcm5hbGx5IHRvIHRoZSB1c2VyLCBhbmQgc28gdGhlc2UgY2Fubm90IGJlCiAgLy8gdXNlZCBpbnRlcmNoYW5nYWJseS4KICBFbGFwc2VkVGltZSBkaXNwbGF5VG90YWxDb3N0IAogICAgICAgICAgICAgICAgICAgIChjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE1ldGhvZCBmb3IgcmV0dXJuaW5nIHRoZSBkZXRhaWxlZCBjb3N0IGNvbXBvbmVudHMgYXMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBjb25zdCBOQVN0cmluZyBnZXREZXRhaWxEZXNjKCkgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBjb3N0IGluZm9ybWF0aW9uIHRvIFdNUyAoYW5kIHBvc3NpYmx5IG90aGVyIGNhbGxlcnMpLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdm9pZCBnZXRFeHRlcm5hbENvc3RBdHRyKGRvdWJsZSAmY3B1VGltZSwgZG91YmxlICZpb1RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAmbXNnVGltZSwgZG91YmxlICZpZGxlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICZudW1TZXFJT3MsIGRvdWJsZSAmbnVtUmFuZElPcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICZ0b3RhbFRpbWUsIExuZzMyICZwcm9iZXMpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNZXRob2QgZm9yIHJldHVybmluZyBPQ00gY29zdCBhdHJyaWJ1dGVzLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZvaWQgZ2V0T2NtQ29zdEF0dHIoZG91YmxlICZjcHUsIGRvdWJsZSAmaW8sIAogICAgICAgICAgICAgICAgICAgICAgZG91YmxlICZtc2csIGRvdWJsZSAmaWRsZVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICBMbmczMiAmcHJvYmVzKSBjb25zdDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gTWV0aG9kIGZvciByZXR1cm5pbmcgTkNNIGNvc3QgYXRycmlidXRlcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2b2lkIGdldFNjbUNvc3RBdHRyKGRvdWJsZSAmdGNQcm9jLCBkb3VibGUgJnRjUHJvZCwKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAmdGNTZW50LCBkb3VibGUgJmlvUmFuZCwKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAmaW9TZXEsIExuZzMyICZwcm9iZXMpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNZXRob2QgZm9yIHJldHVybmluZyBOQ00gZGVidWcgaW5mb3JtYXRpb24uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdm9pZCBnZXRTY21EZWJ1Z0F0dHIoZG91YmxlICZkYmcxLCBkb3VibGUgJmRiZzIsCgkJICAgICAgIGRvdWJsZSAmZGJnMywgZG91YmxlICZkYmc0KSBjb25zdDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgU0NNLCBtYW5kYXRlZCBieSBDYXNjYWRlcy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDT01QQVJFX1JFU1VMVCBzY21Db21wYXJlQ29zdHMKCSAgICAgICAgICAgICAoY29uc3QgQ29zdCAmIG90aGVyLAoJICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIE1ldGhvZCB0byBjb21wdXRlIHRoZSB0b3RhbCBjb3N0IHJlcHJlc2VudGVkIGJ5IHRoZSAKICAvLyBjcFNjbWxyIFNpbXBsZUNvc3RWZWN0b3Igb2YgInRoaXMiIENvc3Qgb2JqZWN0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIENvc3RTY2FsYXIgc2NtQ29tcHV0ZVRvdGFsQ29zdCAKCSAgICAgICAgICAgICAoY29uc3QgUmVxZFBoeXNpY2FsUHJvcGVydHkqIGNvbnN0IHJwcCA9IE5VTEwpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNZXRob2QgZm9yIGNvbnZlcnRpbmcgYSBjb3N0IHRvIGNvc3QgbGltaXQuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdExpbWl0KiBjb252ZXJ0VG9Db3N0TGltaXQKCSAgICAgICAgICAgICAoY29uc3QgUmVxZFBoeXNpY2FsUHJvcGVydHkqIGNvbnN0IHJwcCA9IE5VTEwpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBPdmVybG9hZGVkIGFkZGl0aW9uIGZvciBDb3N0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIENvc3QmIG9wZXJhdG9yICs9KGNvbnN0IENvc3QgJiBvdGhlcik7CgogIHZvaWQgbWVyZ2VPdGhlckNoaWxkQ29zdChjb25zdCBDb3N0JiBvdGhlckNoaWxkQ29zdCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHBsYW4gcHJpb3JpdHkgY29tcHV0YXRpb24KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8gRm9yIHVzZSB3aXRoIGxlYWYgb3BlcmF0b3JzCiAgUGxhblByaW9yaXR5IGNvbXB1dGVQbGFuUHJpb3JpdHkoIFJlbEV4cHIqIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250ZXh0KiBteUNvbnRleHQpOwoKICAvLyBGb3IgdXNlIHdpdGggdW5hcnkgb3BlcmF0b3JzCiAgUGxhblByaW9yaXR5IGNvbXB1dGVQbGFuUHJpb3JpdHkoIFJlbEV4cHIqIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250ZXh0KiBteUNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqIGNoaWxkQ29zdCk7CgogIC8vIEZvciB1c2Ugd2l0aCBiaW5hcnkgb3BlcmF0b3JzCiAgUGxhblByaW9yaXR5IGNvbXB1dGVQbGFuUHJpb3JpdHkoIFJlbEV4cHIqIG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250ZXh0KiBteUNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqIGNoaWxkMENvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqIGNoaWxkMUNvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYW5Xb3JrU3BhY2UgKnB3cz1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMbmczMiBwbGFuTnVtYmVyPTApOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBGdW5jdGlvbnMgZm9yIGRlYnVnZ2luZy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgdm9pZCBwcmludChGSUxFICogZiA9IHN0ZG91dCwKCSAgICAgY29uc3QgY2hhciAqIHByZWZpeCA9ICIiLCBjb25zdCBjaGFyICogc3VmZml4ID0gIiIpIGNvbnN0OwoKICB2b2lkIGRpc3BsYXkoKSBjb25zdDsKLy88cGI+CnByaXZhdGU6CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFBSSVZBVEUgREFUQS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gY3Bmcl86ICBDdXJyZW50IFByb2Nlc3MgRmlyc3QgUm93IENvc3QuCiAgLy8KICAvLyAgVGhpcyB2ZWN0b3IgcmVmbGVjdHMgdGhlIHJlc291cmNlIHVzYWdlIG5lY2Vzc2FyeSBmb3IgdGhlIGN1cnJlbnQKICAvLyBvcGVyYXRvciBpbiB0aGUgZXhwcmVzc2lvbiB0cmVlIHRvIHByb2R1Y2UgaXRzIGZpcnN0IHJvdy4KICAvLwogIC8vICBOb3RlIHRoYXQgdGhpcyBpcyBzbGlnaHRseSBpbmFjY3VyYXRlIGJlY2F1c2UgRFAyIHdpbGwgdHlwaWNhbGx5CiAgLy8gcmV0dXJuIGEgYnVmZmVyIGZ1bGwgb2Ygcm93cyBpbiByZXNwb25zZSB0byBpdHMgZmlyc3QgcmVxdWVzdCBiZWNhdXNlCiAgLy8gb2YgVmlydHVhbCBTZXF1ZW50aWFsIEJsb2NrIEJ1ZmZlcmluZyAoVlNCQikgYnV0IGZvciBhbGwgcHJhY3RpY2FsCiAgLy8gcHVycG9zZXMgd2UgY2FuIHN0aWxsIHZpZXcgdGhpcyByZXNvdXJjZSB1c2FnZSB2ZWN0b3IgYXMgcGVydGFpbmluZwogIC8vIHRvIG9ubHkgdGhlIGZpcnN0IHJvdy4KICAvLwogIC8vICBOb3RlIGFsc28gdGhhdCBmb3IgcmVwZWF0IGNvdW50cyBncmVhdGVyIHRoYW4gb25lLCB0aGlzIHZlY3RvcgogIC8vIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgdXNhZ2UgcGVyIHByb2JlLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3IgY3Bmcl87CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIGNwbHJfOiAgQ3VycmVudCBQcm9jZXNzIExhc3QgUm93IENvc3QuCiAgLy8KICAvLyAgVGhpcyB2ZWN0b3IgcmVmbGVjdHMgdGhlIHJlc291cmNlIHVzYWdlIG5lY2Vzc2FyeSBmb3IgdGhlIGN1cnJlbnQKICAvLyBvcGVyYXRvciBpbiB0aGUgZXhwcmVzc2lvbiB0cmVlIHRvIHByb2R1Y2UgaXRzIGxhc3Qgcm93LgogIC8vCiAgLy8gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhIG5lc3RlZCBsb29wcyBqb2luIHdlIHJlYWxseSBkbyBtZWFuIHRoZQogIC8vIHZlcnkgbGFzdCByb3cgKGkuZS4gdGhlIGxhc3Qgcm93IG9mIHRoZSBsYXN0IHByb2JlKS4gIFRodXMsIGZvcgogIC8vIHJlcGVhdCBjb3VudHMgZ3JlYXRlciB0aGFuIG9uZSwgdGhpcyB2ZWN0b3IgcmVwcmVzZW50cyB0aGUgdG90YWwgdXNhZ2UKICAvLyBmb3IgYWxsIHByb2JlcyB3aGVyZWFzIGluIENQRlIgYWJvdmUgYW5kIENQVEIgYW5kIENQQmxvY2tpbmcgYmVsb3cKICAvLyByZXByZXNlbnQgYXZlcmFnZSB1c2FnZSBmb3Igb25lIG9mIHRoZSBwcm9iZXMuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgU2ltcGxlQ29zdFZlY3RvciBjcGxyXzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gY3BTY21scl86ICBDdXJyZW50IFByb2Nlc3MgU2ltcGxlIENvc3QgTW9kZWwncyBMYXN0IFJvdyBDb3N0LgogIC8vCiAgLy8gIFRoaXMgdmVjdG9yIHJlZmxlY3RzIHRoZSByZXNvdXJjZSB1c2FnZSBuZWNlc3NhcnkgZm9yIHRoZSBjdXJyZW50CiAgLy8gb3BlcmF0b3IgaW4gdGhlIGV4cHJlc3Npb24gdHJlZSB0byBwcm9kdWNlIGl0cyBsYXN0IHJvdy4KICAvLyBUaGlzIHZlY3RvciBjb250YWlucyB0dXBsZXMgcHJvY2Vzc2VkLCBwcm9kdWNlZCwgYW5kIHNlbnQgYnkgYW4gb3BlcmF0b3IKICAvLyBpbiBhZGRpdGlvbiB0byBJT3MgaWYgYW55LgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3IgY3BTY21scl87CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIGNwU2NtRGJnXzogIEV4dHJhIG1lbWJlciBmb3IgU2ltcGxlIENvc3QgTW9kZWwgRGVidWdnaW5nCiAgLy8gVXNlZCBvbmx5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxseSBieSBkZXZlbG9wZXJzLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3IgY3BTY21EYmdfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBjcGJjVG90YWxfOiBDdXJyZW50IFByb2Nlc3MgVG90YWwgQmxvY2tpbmcgQ29zdC4KICAvLwogIC8vICBBbiBvcGVyYXRvciBpbiBhbiBleHByZXNzaW9uIHRyZWUgaXMgY2FsbGVkIGEgImJsb2NraW5nIiBvcGVyYXRvciBpZgogIC8vIGl0IG11c3Qgd2FpdCBmb3IgYWxsIGl0cyBjaGlsZHJlbiBvcGVyYXRvcnMgdG8gZnVsbHkgY29tcGxldGUgYmVmb3JlCiAgLy8gaXQgY2FuIHByb2R1Y2UgaXRzIGZpcnN0IHJvdy4gIEV4YW1wbGVzIGluY2x1ZGUgc29ydCBhbmQKICAvLyBzb3J0LWdyb3VwLWJ5LiAgVGhpcyB2ZWN0b3IgcmVmbGVjdHMgYWxsIHJlc291cmNlcyB1c2VkIGJ5CiAgLy8gZGVzY2VuZGFudHMgb2YgdGhlIGN1cnJlbnQgb3BlcmF0b3IgZXhlY3V0aW5nIHdpdGhpbiB0aGUgY3VycmVudAogIC8vIG9wZXJhdG9yknMgcHJvY2VzcyB3aGlsZSB0aGUgY3VycmVudCBvcGVyYXRvciB3YXMgYmxvY2tlZC4gIElmCiAgLy8gbmVpdGhlciB0aGUgY3VycmVudCBvcGVyYXRvciBub3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBpcyBhIGJsb2NraW5nCiAgLy8gb3BlcmF0b3IsIHRoaXMgdmVjdG9yIHdpbGwgYmUgYWxsIHplcm9zLgogIC8vCiAgLy8gIE5vdGUgdGhhdCBmb3IgcmVwZWF0IGNvdW50cyBncmVhdGVyIHRoYW4gb25lLCB0aGlzIHZlY3RvciByZXByZXNlbnRzCiAgLy8gdGhlIGF2ZXJhZ2UgdXNhZ2UgcGVyIHByb2JlLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3IgY3BiY1RvdGFsXzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gY3BiYzFfOiAgQ3VycmVudCBQcm9jZXNzIEJsb2NraW5nIENvc3QgZm9yIGZpcnN0IGJsb2NraW5nIG9wZXJhdG9yLgogIC8vCiAgLy8gIENvbnNpZGVyIGFuIG9wZXJhdG9yIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGJsb2NraW5nIGJ1dCB3aGljaCBoYXMKICAvLyBhdCBsZWFzdCBvbmUgZGVzY2VuZGFudCB3aGljaCBleGVjdXRlcyB3aXRoaW4gdGhpcyBvcGVyYXRvcpJzIHByb2Nlc3MKICAvLyBhbmQgd2hpY2ggaXMgYmxvY2tpbmcuICBDaG9vc2UgdGhlIGxvd2VzdCBzdWNoIGRlc2NlbmRhbnQuICBUaGUKICAvLyBjcGJjVG90YWxfIHZlY3RvciBmb3IgdGhhdCBvcGVyYXRvciBiZWNvbWVzIGNwYmMxXyBmb3IgYWxsIG9mIGl0cwogIC8vIGFuY2VzdG9ycy4KICAvLwogIC8vICBOb3RlIHRoYXQgbXVsdGlwbGUgY2hpbGRyZW4gZm9yIGFuIG9wZXJhdG9yIHdpbGwgY29tcGxpY2F0ZSB0aGUKICAvLyBjYWxjdWxhdGlvbiBvZiBib3RoIENQQmxvY2tpbmcgYW5kIENQVEIgYWJvdmUuICBXZSBkZWFsIHdpdGggdGhpcyBieQogIC8vIGNvbWJpbmluZyBib3RoIGNoaWxkcmVuIHRvIGxvb2sgbGlrZSBvbmUgY2hpbGQuCiAgLy8KICAvLyAgTm90ZSBhbHNvIHRoYXQgZm9yIHJlcGVhdCBjb3VudHMgZ3JlYXRlciB0aGFuIG9uZSwgdGhpcyB2ZWN0b3IKICAvLyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIHVzYWdlIHBlciBwcm9iZS4KICAvLwogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3IgY3BiYzFfOwoKICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgLy8gIEN1cnJlbnRseSBvcGZyXyBhbmQgb3Bscl8gYXJlIG5vdCB1c2VkLiAgV2hlbiBDUFUgbWFwcyBiZWNvbWUKICAvLyBhdmFpbGFibGUgYW5kIHdlIGNhbiBkZXRlcm1pbmUgaW4gd2hpY2ggQ1BVIGFuIG9wZXJhdG9yIGlzIGV4ZWN1dGluZywKICAvLyB3ZSBjYW4gdGhlbiBtYWtlIHVzZSBvZiB0aGVzZSB2ZWN0b3JzIGluIGNvc3QgYWNjdW11bGF0aW9uIChyb2xsLXVwKQogIC8vIGZvcm11bGFzLgogIC8vCiAgLy8gIFRoZSBkZXNjcmlwdGlvbnMgYmVsb3csIHRoZXJlZm9yZSwgZGVzY3JpYmUgaW50ZW5kZWQgdXNhZ2Ugbm90CiAgLy8geWV0IGZ1bGx5IGltcGxlbWVudGVkLgogIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gb3Bscl86ICBPdmVybGFwcGVkIFByb2Nlc3MgRmlyc3QgUm93IENvc3QuCiAgLy8KICAvLyAgQW5hbG9nb3VzIHRvIF9jcGZyIGV4Y2VwdCBpdCByZXByZXNlbnRzIHRoZSByZXNvdXJjZSB1c2FnZSBmb3IgY2hpbGQKICAvLyBvcGVyYXRvcnMgZXhlY3V0aW5nIGluIGEgZGlmZmVyZW50IENQVS4gIER1cmluZyB0aGUgdGltZSB0aGUgY2hpbGQKICAvLyBvcGVyYXRvcnMgdXNlIHRoZXNlIHJlc291cmNlcywgdGhlIGN1cnJlbnQgb3BlcmF0b3IgY2FuIG5vdCBwcm9jZWVkCiAgLy8gKGkuZS4gaXMgaWRsZSkgYmVjYXVzZSBpdCB3aWxsIG5vdCBoYXZlIHJlY2VpdmVkIGFueSByb3dzIGZyb20gaXRzCiAgLy8gY2hpbGRyZW4uCiAgLy8KICAvLyAgTm90ZSB0aGF0IGZvciByZXBlYXQgY291bnRzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoaXMgdmVjdG9yIHJlcHJlc2VudHMKICAvLyB0aGUgYXZlcmFnZSB1c2FnZSBwZXIgcHJvYmUuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy9qbyBTaW1wbGVDb3N0VmVjdG9yIG9wZnJfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBvcGxyXzogIE92ZXJsYXBwZWQgUHJvY2VzcyBMYXN0IFJvdyBDb3N0LgogIC8vCiAgLy8gIEFuYWxvZ291cyB0byBfY3BsciBleGNlcHQgaXQgcmVwcmVzZW50cyB0aGUgcmVzb3VyY2UgdXNhZ2UgZm9yIGNoaWxkCiAgLy8gb3BlcmF0b3JzIGV4ZWN1dGluZyBpbiBhIGRpZmZlcmVudCBDUFUuCiAgLy8KICAvLyAgTm90ZSB0aGF0IGZvciByZXBlYXQgY291bnRzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoaXMgdmVjdG9yIHJlcHJlc2VudHMKICAvLyB0aGUgdG90YWwgdXNhZ2UgZm9yIGFsbCBwcm9iZXMuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy9qbyBTaW1wbGVDb3N0VmVjdG9yIG9wbHJfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyB0b3RhbENvc3RfOiAgdGhlIHRvdGFsIGNvc3QgZm9yIHBlcmZvcm1pbmcgYW4gb3BlcmF0aW9uLgogIC8vCiAgLy8gIEEgdmVjdG9yIG9mIHJlc291cmNlIHVzYWdlIGRlc2NyaWJpbmcgYWxsIHJlc291cmNlcyBuZWNlc3NhcnkgZm9yCiAgLy8gdGhlIGN1cnJlbnQgb3BlcmF0b3IgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgdG8gZXhlY3V0ZS4gIFF1ZXJ5CiAgLy8gcGFyYWxsZWxpc20gaGFzIG5vIGVmZmVjdCBvbiB0b3RhbENvc3RfIGFzIGl0IGRvZXMgb24gY3Bscl8uICBGb3IgdGhlCiAgLy8gdG90YWxDb3N0XyB2ZWN0b3IsIGFsbCBwYXJhbGxlbCBhY3Rpdml0eSBpcyBhY2NvdW50ZWQgZm9yIGFzIGlmIGl0CiAgLy8gYWN0dWFsbHkgb2NjdXJyZWQgc2VyaWFsbHkuCiAgLy8KICAvLyAgTm90ZSB0aGF0IGZvciByZXBlYXQgY291bnRzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoaXMgdmVjdG9yIHJlcHJlc2VudHMKICAvLyB0aGUgdG90YWwgdXNhZ2UgZm9yIGFsbCBwcm9iZXMuCiAgLy8KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBTaW1wbGVDb3N0VmVjdG9yIHRvdGFsQ29zdF87CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gTnVtYmVyIG9mIENQVXMgdXNlZCBieSB0aGlzIG9wZXJhdG9yCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgTG5nMzIgY291bnRPZkNQVXNfOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBOdW1iZXIgb2YgcGxhbiBmcmFnbWVudHMgdGhhdCBjb21wZXRlIGZvciB0aGUgc2FtZSBDUFUKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBMbmczMiBwbGFuRnJhZ21lbnRzUGVyQ1BVXzsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVGhlIHBsYW4gcHJpb3JpdHkgaXMgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gb2YgcHJlZmVycmVkIHBsYW5zIHN1Y2gKICAvLyBhcyBwbGFucyBnZW5lcmF0ZWQgZm9yIG9wdGltaXplciBoaW50cywgaW50ZXJhY3RpdmUgYWNjZXNzLCBhbmQgZnV0dXJlCiAgLy8gb3B0aW1pemVyIGhldXJpc3RpY3MuCiAgLy8gUGxhbnMgdGhhdCBoYXZlIHNpbWlsYXIgcHJpb3JpdHkgYXJlIGNvbXBhcmVkIGFzIHVzdWFsLiBQbGFucyB3aXRoCiAgLy8gZGlmZmVyZW50IHByaW9yaXRpZXMgYXJlIGp1ZGdlZCBpbiBmYXZvciBvZiB0aGUgcGxhbiB3aXRoIHRoZSBoaWdoZXIKICAvLyBwcmlvcml0eSByZWdhcmRsZXNzIG9mIHRoZSBjb3N0IHZlY3RvciB2YWx1ZXMuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgUGxhblByaW9yaXR5IHByaW9yaXR5XzsKCn07IC8vIGNsYXNzIENvc3QKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBOZWVkZWQgZm9yIHBhc3NpbmcgcG9pbnRlcnMgdG8gY29zdHMgYXMgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnR5cGVkZWYgQ29zdCogQ29zdFB0cjsKLy88cGI+Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBBIEhhc2hKb2luQ29zdCBvYmplY3QgY29udGFpbnMgaW50ZXJtZWRpYXRlIHJlc291cmNlIHVzYWdlIHZlY3RvcnMgYW5kCi8vIHZhcmlhYmxlcyBjb21wdXRlZCBkdXJpbmcgaGFzaCBqb2luIHByZWxpbWluYXJ5IGNvc3Rpbmcgd2hpY2ggZmluYWwKLy8gcm9sbC11cCBjb3N0aW5nIHdpbGwgYWxzbyB1c2UuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIEhhc2hKb2luQ29zdCA6IHB1YmxpYyBDb3N0CnsKcHVibGljOgoKICAvLy0tLS0tLS0tLS0tLS0tLQogIC8vICBDb25zdHJ1Y3RvcnMuCiAgLy8tLS0tLS0tLS0tLS0tLS0KICBIYXNoSm9pbkNvc3QoY29uc3QgU2ltcGxlQ29zdFZlY3RvciogY3VycmVudFByb2Nlc3NGaXJzdFJvd0Nvc3QsCiAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRQcm9jZXNzTGFzdFJvd0Nvc3QsCiAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRQcm9jZXNzQmxvY2tpbmdDb3N0LAogICAgICAgICAgICAgICBjb25zdCBMbmczMiAgICAgICAgICAgICAgY291bnRPZkNQVXMsCiAgICAgICAgICAgICAgIGNvbnN0IExuZzMyICAgICAgICAgICAgICBwbGFuRnJhZ21lbnRzUGVyQ1BVLAogICAgICAgICAgICAgICBjb25zdCBDb3N0U2NhbGFyICYgICAgICBzdGFnZTJXb3JrRnJhY3Rpb25Gb3JGUl8sCiAgICAgICAgICAgICAgIGNvbnN0IENvc3RTY2FsYXIgJiAgICAgIHN0YWdlM1dvcmtGcmFjdGlvbkZvckZSXywKICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlQ29zdFZlY3Rvciogc3RhZ2UyQ29zdCwKICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlQ29zdFZlY3Rvciogc3RhZ2UzQ29zdCwKICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlQ29zdFZlY3Rvciogc3RhZ2UxQmtDb3N0LAogICAgICAgICAgICAgICBjb25zdCBTaW1wbGVDb3N0VmVjdG9yKiBzdGFnZTJCa0Nvc3QsCiAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIHN0YWdlM0JrQ29zdCk7CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgQ29uc3RydWN0b3IgZm9yIGFuIGVtcHR5IEhhc2hKb2luQ29zdCBvYmplY3QuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEhhc2hKb2luQ29zdCgpCiAgICA6IENvc3QoKSwKICAgICAgc3RhZ2UyV29ya0ZyYWN0aW9uRm9yRlJfKCBjc09uZSApLAogICAgICBzdGFnZTNXb3JrRnJhY3Rpb25Gb3JGUl8oIGNzWmVybyApLAogICAgICBzdGFnZTJDb3N0XygpLAogICAgICBzdGFnZTNDb3N0XygpLAogICAgICBzdGFnZTFCa0Nvc3RfKCksCiAgICAgIHN0YWdlMkJrQ29zdF8oKSwKICAgICAgc3RhZ2UzQmtDb3N0XygpCiAge30KCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIENvcHkgY29uc3RydWN0b3IuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tCiAgSGFzaEpvaW5Db3N0KGNvbnN0IEhhc2hKb2luQ29zdCAmb3RoZXIpCiAgICA6IENvc3Qob3RoZXIpLAogICAgICBzdGFnZTJXb3JrRnJhY3Rpb25Gb3JGUl8ob3RoZXIuc3RhZ2UyV29ya0ZyYWN0aW9uRm9yRlJfKSwKICAgICAgc3RhZ2UzV29ya0ZyYWN0aW9uRm9yRlJfKG90aGVyLnN0YWdlM1dvcmtGcmFjdGlvbkZvckZSXyksCiAgICAgIHN0YWdlMkNvc3RfKG90aGVyLnN0YWdlMkNvc3RfKSwKICAgICAgc3RhZ2UzQ29zdF8ob3RoZXIuc3RhZ2UzQ29zdF8pLAogICAgICBzdGFnZTFCa0Nvc3RfKG90aGVyLnN0YWdlMUJrQ29zdF8pLAogICAgICBzdGFnZTJCa0Nvc3RfKG90aGVyLnN0YWdlMkJrQ29zdF8pLAogICAgICBzdGFnZTNCa0Nvc3RfKG90aGVyLnN0YWdlM0JrQ29zdF8pCiAge30KCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBFZmZlY3RpdmUgdmlydHVhbCBjb25zdHJ1Y3Rvci4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCBDb3N0KiBkdXBsaWNhdGUoKTsKCiAgLy8tLS0tLS0tLS0tLS0tCiAgLy8gIERlc3RydWN0b3IuCiAgLy8tLS0tLS0tLS0tLS0tCiAgfkhhc2hKb2luQ29zdCgpOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBBY2Nlc3NvciBGdW5jdGlvbnMuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0U3RhZ2UyQ29zdCgpIGNvbnN0IHsgcmV0dXJuIHN0YWdlMkNvc3RfOyB9CiAgaW5saW5lIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3ImIGdldFN0YWdlM0Nvc3QoKSBjb25zdCB7IHJldHVybiBzdGFnZTNDb3N0XzsgfQoKICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0U3RhZ2UxQktDb3N0KCkgY29uc3Qge3JldHVybiBzdGFnZTFCa0Nvc3RfO30KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0U3RhZ2UyQktDb3N0KCkgY29uc3Qge3JldHVybiBzdGFnZTJCa0Nvc3RfO30KICBpbmxpbmUgY29uc3QgU2ltcGxlQ29zdFZlY3RvciYgZ2V0U3RhZ2UzQktDb3N0KCkgY29uc3Qge3JldHVybiBzdGFnZTNCa0Nvc3RfO30KCiAgaW5saW5lIGNvbnN0IENvc3RTY2FsYXImIGdldFN0YWdlMldvcmtGcmFjdGlvbkZvckZSKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdGFnZTJXb3JrRnJhY3Rpb25Gb3JGUl87IH0KCiAgaW5saW5lIGNvbnN0IENvc3RTY2FsYXImIGdldFN0YWdlM1dvcmtGcmFjdGlvbkZvckZSKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBzdGFnZTNXb3JrRnJhY3Rpb25Gb3JGUl87IH0KCnByaXZhdGU6CgogIC8vIC0tLS0tLS0tLS0tLS0KICAvLyBQUklWQVRFIERBVEEuCiAgLy8gLS0tLS0tLS0tLS0tLQoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBGcmFjdGlvbiBvZiBzdGFnZSAyIHdvcmsgbmVjZXNzYXJ5IHRvIHByb2R1Y2UgdGhpcyBoYXNoIGpvaW4ncyBmaXJzdCByb3cuCiAgLy8gVGhlIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8gYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLiAgRnVydGhlciwKICAvLyB0aGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc3RhZ2UzV29ya0ZyYWN0aW9uRm9yRlJfCiAgLy8gYmVsb3cuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDb3N0U2NhbGFyIHN0YWdlMldvcmtGcmFjdGlvbkZvckZSXzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgRnJhY3Rpb24gb2Ygc3RhZ2UgMyB3b3JrIG5lY2Vzc2FyeSB0byBwcm9kdWNlIHRoaXMgaGFzaCBqb2luJ3MgZmlyc3Qgcm93LgogIC8vIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAvLyAxLiAgRnVydGhlciwgdGhlIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCiAgLy8gc3RhZ2UyV29ya0ZyYWN0aW9uRm9yRlJfIGFib3ZlLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdFNjYWxhciBzdGFnZTNXb3JrRnJhY3Rpb25Gb3JGUl87CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBUaGlzIHZlY3RvciByZXByZXNlbnRzIHJlc291cmNlIHVzYWdlIGZvciBzdGFnZSAyIG9mIGEgaGFzaCBqb2luLiAgU3RhZ2UgMgogIC8vIGludm9sdmVzIHRha2luZyByb3dzIHByb2R1Y2VkIGJ5IHRoZSBsZWZ0IGNoaWxkIChvdXRlciB0YWJsZSksIGNvbXB1dGluZyBhCiAgLy8gaGFzaCBmdW5jdGlvbiBmb3IgZWFjaCByb3csIHByb2JpbmcgdGhlIGhhc2ggdGFibGUgYnVpbHQgaW4gc3RhZ2UgMSB3aGVuCiAgLy8gdGhlIHJvdyBoYXNoZXMgdG8gYSBtYWluIG1lbW9yeSBjbHVzdGVyIG9yIHdyaXRpbmcgdGhlIHJvdyB0byBkaXNrIHdoZW4gaXQKICAvLyBoYXNoZXMgdG8gYW4gb3ZlcmZsb3cgY2x1c3Rlci4KICAvLwogIC8vICBOb3RlIHRoYXQgZm9yIHJlcGVhdCBjb3VudHMgZ3JlYXRlciB0aGFuIG9uZSwgdGhpcyB2ZWN0b3IgcmVwcmVzZW50cwogIC8vIHRoZSBjdW11bGF0aXZlIHVzYWdlIGZvciBhbGwgcHJvYmVzLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFNpbXBsZUNvc3RWZWN0b3Igc3RhZ2UyQ29zdF87CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBUaGlzIHZlY3RvciByZXByZXNlbnRzIHJlc291cmNlIHVzYWdlIGZvciBzdGFnZSAzIG9mIGEgaGFzaCBqb2luLiAgU3RhZ2UgMwogIC8vIGludm9sdmVzIGpvaW5pbmcgdGhlIHJvd3Mgb3ZlcmZsb3dlZCB0byBkaXNrIGluIHN0YWdlIDEgYW5kIHN0YWdlIDIuCiAgLy8KICAvLyAgTm90ZSB0aGF0IGZvciByZXBlYXQgY291bnRzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoaXMgdmVjdG9yIHJlcHJlc2VudHMKICAvLyB0aGUgY3VtdWxhdGl2ZSB1c2FnZSBmb3IgYWxsIHByb2Jlcy4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBTaW1wbGVDb3N0VmVjdG9yIHN0YWdlM0Nvc3RfOwoKICBTaW1wbGVDb3N0VmVjdG9yIHN0YWdlMUJrQ29zdF87CgogIFNpbXBsZUNvc3RWZWN0b3Igc3RhZ2UyQmtDb3N0XzsKCiAgU2ltcGxlQ29zdFZlY3RvciBzdGFnZTNCa0Nvc3RfOwp9OyAvLyBjbGFzcyBIYXNoSm9pbkNvc3QKLy88cGI+Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICBBIEhhc2hHcm91cEJ5Q29zdCBvYmplY3QgY29udGFpbnMgdGhlIGdyb3VwaW5nIGZhY3RvciBmb3IgdGhpcyBIYXNoIEdyb3VwQnkKLy8gb3BlcmF0b3ItLWkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgZ3JvdXBzIHdoaWNoIGZpdCBpbiBtZW1vcnkuICBGaW5hbCByb2xsLXVwCi8vIGNvc3RpbmcgdXNlcyB0aGlzIG51bWJlciBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBwZXJjZW50YWdlIG9mIGxhc3Qgcm93IGFjdGl2aXR5Ci8vIGJlbG93IHRoZSBIYXNoIEdyb3VwQnkgb3BlcmF0b3IgYmVjb21lcyBibG9ja2luZyBhY3Rpdml0eSBhcyBwYXJ0IG9mIHRoZQovLyByb2xsLXVwCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIEhhc2hHcm91cEJ5Q29zdCA6IHB1YmxpYyBDb3N0CnsKcHVibGljOgoKICAvLy0tLS0tLS0tLS0tLS0tLQogIC8vICBDb25zdHJ1Y3RvcnMuCiAgLy8tLS0tLS0tLS0tLS0tLS0KICBIYXNoR3JvdXBCeUNvc3QoY29uc3QgU2ltcGxlQ29zdFZlY3RvciogY3VycmVudFByb2Nlc3NGaXJzdFJvd0Nvc3QsCiAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRQcm9jZXNzTGFzdFJvd0Nvc3QsCiAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsZUNvc3RWZWN0b3IqIGN1cnJlbnRQcm9jZXNzQmxvY2tpbmdDb3N0LAogICAgICAgICAgICAgICAgICBjb25zdCBMbmczMiAgICAgICAgICAgICAgY291bnRPZkNQVXMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IExuZzMyICAgICAgICAgICAgICBwbGFuRnJhZ21lbnRzUGVyQ1BVLAogICAgICAgICAgICAgICAgICBjb25zdCBDb3N0U2NhbGFyICYgICAgICBncm91cGluZ0ZhY3Rvcik7CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgQ29uc3RydWN0b3IgZm9yIGFuIGVtcHR5IEhhc2hHcm91cEJ5Q29zdCBvYmplY3QuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEhhc2hHcm91cEJ5Q29zdCgpCiAgICA6IENvc3QoKSwKICAgICAgZ3JvdXBpbmdGYWN0b3JfKCBjc09uZSApCiAge30KCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIENvcHkgY29uc3RydWN0b3IuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tCiAgSGFzaEdyb3VwQnlDb3N0KGNvbnN0IEhhc2hHcm91cEJ5Q29zdCAmb3RoZXIpCiAgICA6IENvc3Qob3RoZXIpLAogICAgICBncm91cGluZ0ZhY3Rvcl8ob3RoZXIuZ3JvdXBpbmdGYWN0b3JfKQogIHt9CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgRWZmZWN0aXZlIHZpcnR1YWwgY29uc3RydWN0b3IuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgQ29zdCogZHVwbGljYXRlKCk7CgogIC8vLS0tLS0tLS0tLS0tLQogIC8vICBEZXN0cnVjdG9yLgogIC8vLS0tLS0tLS0tLS0tLQogIH5IYXNoR3JvdXBCeUNvc3QoKTsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgQWNjZXNzb3IgRnVuY3Rpb25zLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgaW5saW5lIENvc3RTY2FsYXIgZ2V0R3JvdXBpbmdGYWN0b3IoKSBjb25zdCB7IHJldHVybiBncm91cGluZ0ZhY3Rvcl87IH0KCnByaXZhdGU6CgogIC8vIC0tLS0tLS0tLS0tLS0KICAvLyBQUklWQVRFIERBVEEuCiAgLy8gLS0tLS0tLS0tLS0tLQoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIFBlcmNlbnRhZ2Ugb2YgZ3JvdXBzIHdoaWNoIGZpdCBpbiBtZW1vcnkuICBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMQogIC8vIGluY2x1c2l2ZS4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdFNjYWxhciBncm91cGluZ0ZhY3Rvcl87Cgp9OwovLzxwYj4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BlY2lmeSBob3cgdG8gd2VpZ2ggKGFuZCB0aGVyZWZvcmUsIHRvIGNvbXBhcmUpIGNvc3Qgb2JqZWN0cwovLyAtLS0gYWJzdHJhY3QgYmFzZSBjbGFzcyAtLS0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgQ29zdFdlaWdodCA6IHB1YmxpYyBOQUJhc2ljT2JqZWN0CnsKcHVibGljOgoKICB2aXJ0dWFsIH5Db3N0V2VpZ2h0KCkge30KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVHlwZS1zYWZlIHBvaW50ZXIgY2FzdHMgdXNlZCBmb3IgcnVuLXRpbWUgdHlwZSBpZGVudGlmaWNhdGlvbi4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIFJlc291cmNlQ29uc3VtcHRpb25XZWlnaHQqIGNhc3RUb1Jlc291cmNlQ29uc3VtcHRpb25XZWlnaHQoKSBjb25zdDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVmlydHVhbCBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIENvc3RXZWlnaHQuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCBMbmczMiBlbnRyaWVzKCkgY29uc3QgPSAwOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBWaXJ0dWFsIG1ldGhvZCBmb3IgY29udmVydGluZyBhIENvc3RWZWN0b3IgdG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIGRvdWJsZSBjb252ZXJ0VG9GbG9hdGluZ1BvaW50VmFsdWUoY29uc3QgQ29zdFZlY3RvciYgY3YpIGNvbnN0ID0gMDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVmlydHVhbCBtZXRob2QgZm9yIGNvbnZlcnRpbmcgYSBDb3N0VmVjdG9yIHRvIGFuIGVsYXBzZWQgdGltZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIEVsYXBzZWRUaW1lIGNvbnZlcnRUb0VsYXBzZWRUaW1lKGNvbnN0IENvc3RWZWN0b3ImIGN2KSBjb25zdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFZpcnR1YWwgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgQ29zdFZlY3RvciB0byBhIENvc3RMaW1pdC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIENvc3RMaW1pdCogY29udmVydFRvQ29zdExpbWl0KGNvbnN0IENvc3RWZWN0b3ImIGN2KSBjb25zdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFZpcnR1YWwgbWV0aG9kIGZvciBjb21hcHJpbmcgdHdvIGNvc3QgdmVjdG9ycy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIENPTVBBUkVfUkVTVUxUIGNvbXBhcmVDb3N0VmVjdG9ycyhjb25zdCBDb3N0VmVjdG9yJiBjdjEsCgkJCQkgICAgICAgICAgICBjb25zdCBDb3N0VmVjdG9yJiBjdjIpIGNvbnN0ID0gMDsKCn07IC8vIGNsYXNzIENvc3RXZWlnaHQKLy88cGI+Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHVzZSB3ZWlnaGluZyBmYWN0b3JzIHRvIGRldGVybWluZSB0aGUgc2NhbGFyIGNvc3QKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgUmVzb3VyY2VDb25zdW1wdGlvbldlaWdodCA6IHB1YmxpYyBDb3N0V2VpZ2h0CnsKcHVibGljOgoKICBSZXNvdXJjZUNvbnN1bXB0aW9uV2VpZ2h0KAogICAgY29uc3QgQ29zdFNjYWxhciAmIGNwdVdlaWdodCA9CWNzWmVybywKICAgIGNvbnN0IENvc3RTY2FsYXIgJiBJT1dlaWdodCAgICAgICAgICAgICA9IGNzWmVybywKICAgIGNvbnN0IENvc3RTY2FsYXIgJiBNU0dXZWlnaHQgICAgICAgICAgICA9IGNzWmVybywKICAgIGNvbnN0IENvc3RTY2FsYXIgJiBJZGxlVGltZVdlaWdodCAgICAgICAgID0gY3NaZXJvLAogICAgY29uc3QgQ29zdFNjYWxhciAmIG51bVByb2Jlc1dlaWdodCAgICAgPSBjc1plcm8KICAgICk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR5cGUtc2FmZSBwb2ludGVyIGNhc3RzIHVzZWQgZm9yIHJ1bi10aW1lIHR5cGUgaWRlbnRpZmljYXRpb24uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCBSZXNvdXJjZUNvbnN1bXB0aW9uV2VpZ2h0KiBjYXN0VG9SZXNvdXJjZUNvbnN1bXB0aW9uV2VpZ2h0KCkgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFZpcnR1YWwgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBDb3N0V2VpZ2h0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgTG5nMzIgZW50cmllcygpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBWaXJ0dWFsIG1ldGhvZCBmb3IgY29udmVydGluZyBhIENvc3RWZWN0b3IgdG8gYSBmbG9hdGluZyBwb2ludCB2YWx1ZS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIGRvdWJsZSBjb252ZXJ0VG9GbG9hdGluZ1BvaW50VmFsdWUoY29uc3QgQ29zdFZlY3RvciYgY3YpIGNvbnN0OwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBDb252ZXJ0IHRoZSBnaXZlbiBDb3N0VmVjdG9yIHRvIGFuIGVsYXBzZWQgdGltZSBwcm92aWRlZCBpdAogIC8vIGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcygpIGFzIHRoaXMgQ29zdFdlaWdodC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIEVsYXBzZWRUaW1lIGNvbnZlcnRUb0VsYXBzZWRUaW1lKGNvbnN0IENvc3RWZWN0b3ImIHNjdikgY29uc3Q7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFZpcnR1YWwgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGEgQ29zdCB0byBhIENvc3RMaW1pdC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICB2aXJ0dWFsIENvc3RMaW1pdCogY29udmVydFRvQ29zdExpbWl0KGNvbnN0IENvc3RWZWN0b3ImIGN2KSBjb25zdDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVmlydHVhbCBtZXRob2QgZm9yIGNvbXBhcmluZyB0d28gY29zdCB2ZWN0b3JzLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgQ09NUEFSRV9SRVNVTFQgY29tcGFyZUNvc3RWZWN0b3JzKGNvbnN0IENvc3RWZWN0b3ImIGN2MSwKCQkJCSAgICAgICAgICAgIGNvbnN0IENvc3RWZWN0b3ImIGN2MikgY29uc3Q7CgogIC8vIEEgbWV0aG9kIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgc3BlY2lmaWMgZW50cnkuCiAgQ29zdFNjYWxhciBvcGVyYXRvcltdIChMbmczMiBpeCkgY29uc3Q7Cgpwcml2YXRlOgogIENvc3RTY2FsYXIgd2VpZ2hGYWN0b3JzX1tDT1VOVF9PRl9TSU1QTEVfQ09TVF9DT1VOVEVSU107Cgp9OyAvLyBjbGFzcyBSZXNvdXJjZUNvbnN1bXB0aW9uV2VpZ2h0Ci8vPHBiPgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTcGVjaWZ5ICBhIGNvc3QgbGltaXQKLy8gLS0tIGFic3RyYWN0IGJhc2UgY2xhc3MgLS0tCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIENvc3RMaW1pdCA6IHB1YmxpYyBOQUJhc2ljT2JqZWN0CnsKcHVibGljOgoKICB2aXJ0dWFsIH5Db3N0TGltaXQoKSB7fQoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBWaXJ0dWFsIGNvcHkgY29uc3RydWN0b3IuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCBDb3N0TGltaXQqIGNvcHkoKSBjb25zdCA9IDA7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFR5cGUtc2FmZSBwb2ludGVyIGNhc3RzIHVzZWQgZm9yIHJ1bi10aW1lIHR5cGUgaWRlbnRpZmljYXRpb24uCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgdmlydHVhbCBFbGFwc2VkVGltZUNvc3RMaW1pdCogY2FzdFRvRWxhcHNlZFRpbWVDb3N0TGltaXQoKSBjb25zdDsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gR2V0IGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBmb3IgdGhlIGxpbWl0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgZG91YmxlIGdldFZhbHVlKGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHApIGNvbnN0ID0gMDsKCiAgdmlydHVhbCBkb3VibGUgZ2V0Q2FjaGVkVmFsdWUgKCkgPSAwOwogIHZpcnR1YWwgdm9pZCAgIHNldENhY2hlZFZhbHVlIChkb3VibGUgdmFsKSA9IDA7CiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgY29zdHMgYW5kIGNvc3QgbGltaXRzLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgQ09NUEFSRV9SRVNVTFQgY29tcGFyZUNvc3RMaW1pdHMKICAgICAgICAgICAgICAgICAgICAgICAoQ29zdExpbWl0KiBvdGhlciwKCSAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgPSAwOwoKICB2aXJ0dWFsIENPTVBBUkVfUkVTVUxUIGNvbXBhcmVXaXRoQ29zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgQ29zdCAmIG90aGVyLAoJICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgPSAwOwoKICB2aXJ0dWFsIENPTVBBUkVfUkVTVUxUIGNvbXBhcmVXaXRoUGxhbkNvc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKENhc2NhZGVzUGxhbiogcGxhbiwKCSAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVxZFBoeXNpY2FsUHJvcGVydHkqIGNvbnN0IHJwcCA9IE5VTEwpID0gMDsKCiAgdmlydHVhbCB2b2lkIGFuY2VzdG9yQWNjdW0oY29uc3QgQ29zdCYgb3RoZXJDb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHAgPSBOVUxMKSA9IDA7CgogIHZpcnR1YWwgdm9pZCBvdGhlcktpbkFjY3VtKGNvbnN0IENvc3QmIG90aGVyQ29zdCkgPSAwOwoKICB2aXJ0dWFsIHZvaWQgdHJ5VG9SZWR1Y2UoY29uc3QgQ29zdCYgb3RoZXJDb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCkgPSAwOwoKICB2aXJ0dWFsIHZvaWQgdW5pbGF0ZXJhbGx5UmVkdWNlKGNvbnN0IEVsYXBzZWRUaW1lICYgdGltZVJlZHVjdGlvbikgPSAwOwoKICB2aXJ0dWFsIGNvbnN0IFBsYW5Qcmlvcml0eSYgcHJpb3JpdHlMaW1pdCgpIGNvbnN0ID0gMDsKCiAgdmlydHVhbCB2b2lkIHNldFVwcGVyTGltaXQoRWxhcHNlZFRpbWUgdWwpID0gMDsKCnByaXZhdGU6Cgp9OyAvLyBjbGFzcyBDb3N0TGltaXQKLy88cGI+Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNsYXNzIEVsYXBzZWRUaW1lQ29zdExpbWl0Ci8vCi8vICBBbiBlbGFwc2VkIHRpbWUgY29zdCBsaW1pdCBjb25zaXN0cyBvZiB0aHJlZSBjb21wb25lbnRzOiAgYW4gaW5pdGlhbAovLyBlbGFwc2VkIHRpbWUgYW5kIHR3byBwb2ludGVycyB0byBhY2N1bXVsYXRlZCBjb3N0IG9iamVjdHMuCi8vCi8vICBUaGUgaW5pdGlhbCBlbGFwc2VkIHRpbWUgcmVwcmVzZW50cyB0aGUgdXBwZXIgbGltaXQgZm9yIHRoZSBjdW11bGF0aXZlCi8vIGVsYXBzZWQgdGltZSBvZiBhbGwgcGh5c2ljYWwgb3BlcmF0b3JzIGluIHRoZSBmaW5hbCBxdWVyeSB0cmVlLgovLwovLyAgT25lIGFjY3VtdWxhdGVkIGNvc3Qgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHJlc291cmNlIHVzYWdlIG9mIGFsbAovLyBvcGVyYXRvcnMgb24gdGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgY3VycmVudCBvcGVyYXRvci4gIFdlIGNhbGwKLy8gdGhpcyBhbmNlc3RvciBjb3N0LgovLwovLyAgVGhlIHNlY29uZCBjb3N0IG9iamVjdCByZXByZXNlbnRzIHJlc291cmNlIHVzYWdlIGZvciBhbGwga25vd24gc2libGluZ3MsCi8vIGNvdXNpbnMsIHVuY2xlcywgZXRjIG9mIHRoZSBjdXJyZW50IG9wZXJhdG9yLiAgV2UgY2FsbCB0aGlzIG90aGVyIGtpbiBjb3N0LgovLwovLyAgVG8gZmluZCB0aGUgcmVtYWluaW5nIGVsYXBzZWQgdGltZSBhdmFpbGFibGUgZm9yIGRlc2NlbmRhbnQgb3BlcmF0b3JzIG9mIHRoZQovLyBjdXJyZW50IG9wZXJhdG9yLCB3ZSBmaXJzdCByb2xsIHVwIHRoZSBvdGhlciBraW4gY29zdCB3aXRoIHRoZSBhbmNlc3RvciBjb3N0Ci8vIGFuZCBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBjb3N0J3MgZWxhcHNlZCB0aW1lLiAgV2UgdGhlbiBzdWJ0cmFjdCB0aGlzCi8vIHJlc3VsdGluZyBlbGFwc2VkIHRpbWUgZnJvbSB0aGUgdXBwZXIgbGltaXQuCi8vCi8vICBXZSBhY2N1bXVsYXRlIGNvc3RzIGF0IGVhY2ggbGV2ZWwgb2YgdGhlIHF1ZXJ5IHRyZWUsIGFuZCB3ZSBwb3RlbnRpYWxseQovLyByZWR1Y2UgdGhlIHVwcGVyIGxpbWl0IHdpdGggdGhlIGRpc2NvdmVyeSBvZiBiZXR0ZXIgcGxhbnMuCi8vCi8vICBXZSBjYW4gYWxzbyByZWR1Y2UgdGhlIHVwcGVyIGxpbWl0IHVuaWxhdGVyYWxseSBmb3Igc29tZSBvcGVyYXRvcnMgd2l0aAovLyBrbm93biBjaGlsZCBjb3N0cy4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgRWxhcHNlZFRpbWVDb3N0TGltaXQgOiBwdWJsaWMgQ29zdExpbWl0CnsKcHVibGljOgoKICAvLy0tLS0tLS0tLS0tLS0tCiAgLy8gIENvbnN0cnVjdG9ycwogIC8vLS0tLS0tLS0tLS0tLS0KICBFbGFwc2VkVGltZUNvc3RMaW1pdChjb25zdCBFbGFwc2VkVGltZSYgbGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhblByaW9yaXR5JiBwcmlvcml0eUxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqICAgICAgICBhbmNlc3RvckNvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdCogICAgICAgIG90aGVyS2luQ29zdCkKICA6IHVwcGVyTGltaXRfKGxpbWl0KSxjYWNoZWRWYWx1ZV8oMC4wKSxwcmlvcml0eUxpbWl0Xyhwcmlvcml0eUxpbWl0KQogIHsKICAgIENNUEFTU0VSVCggICBhbmNlc3RvckNvc3QgIT0gTlVMTAogICAgICAgICAgICAgICYmIG90aGVyS2luQ29zdCAhPSBOVUxMCiAgICAgICAgICAgICAgJiYgYW5jZXN0b3JDb3N0ICE9IG90aGVyS2luQ29zdCk7CgogICAgYW5jZXN0b3JDb3N0XyA9IG5ldyBTVE1USEVBUCBDb3N0KCphbmNlc3RvckNvc3QpOwogICAgb3RoZXJLaW5Db3N0XyA9IG5ldyBTVE1USEVBUCBDb3N0KCpvdGhlcktpbkNvc3QpOwogIH0KCiAgRWxhcHNlZFRpbWVDb3N0TGltaXQoY29uc3QgRWxhcHNlZFRpbWVDb3N0TGltaXQmIG90aGVyKQogIDogdXBwZXJMaW1pdF8ob3RoZXIudXBwZXJMaW1pdF8pLAogICAgcHJpb3JpdHlMaW1pdF8ob3RoZXIucHJpb3JpdHlMaW1pdF8pLAogICAgYW5jZXN0b3JDb3N0XyhuZXcoQ21wQ29tbW9uOjpzdGF0ZW1lbnRIZWFwKCkpIENvc3QoKm90aGVyLmFuY2VzdG9yQ29zdF8pKSwKICAgIG90aGVyS2luQ29zdF8obmV3KENtcENvbW1vbjo6c3RhdGVtZW50SGVhcCgpKSBDb3N0KCpvdGhlci5vdGhlcktpbkNvc3RfKSksCiAgICBjYWNoZWRWYWx1ZV8ob3RoZXIuY2FjaGVkVmFsdWVfKQogICAge307CgogIC8vLS0tLS0tLS0tLS0tCiAgLy8gIERlc3RydWN0b3IKICAvLy0tLS0tLS0tLS0tLQogIHZpcnR1YWwgfkVsYXBzZWRUaW1lQ29zdExpbWl0KCkKICAgIHsgZGVsZXRlIGFuY2VzdG9yQ29zdF87IGRlbGV0ZSBvdGhlcktpbkNvc3RfOyB9CgoKICB2aXJ0dWFsIENvc3RMaW1pdCogY29weSgpIGNvbnN0CiAgICB7IHJldHVybiBuZXcoQ21wQ29tbW9uOjpzdGF0ZW1lbnRIZWFwKCkpIEVsYXBzZWRUaW1lQ29zdExpbWl0KCp0aGlzKTsgfQoKICB2aXJ0dWFsIGRvdWJsZSBnZXRWYWx1ZShjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwKSBjb25zdDsKCiAgZG91YmxlIGdldENhY2hlZFZhbHVlICgpeyByZXR1cm4gY2FjaGVkVmFsdWVfOyB9CiAgdm9pZCAgIHNldENhY2hlZFZhbHVlIChkb3VibGUgdmFsKSB7IGNhY2hlZFZhbHVlXyA9IHZhbDsgfQoKICB2aXJ0dWFsIENPTVBBUkVfUkVTVUxUIGNvbXBhcmVDb3N0TGltaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb3N0TGltaXQqIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVxZFBoeXNpY2FsUHJvcGVydHkqIGNvbnN0IHJwcCA9IE5VTEwpOwoKICB2aXJ0dWFsIENPTVBBUkVfUkVTVUxUIGNvbXBhcmVXaXRoQ29zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgQ29zdCAmIG90aGVyLAoJICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCk7CgogIHZpcnR1YWwgQ09NUEFSRV9SRVNVTFQgY29tcGFyZVdpdGhQbGFuQ29zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2FzY2FkZXNQbGFuKiBwbGFuLAoJICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCk7CgogIHZpcnR1YWwgdm9pZCBhbmNlc3RvckFjY3VtKGNvbnN0IENvc3QmIG90aGVyQ29zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCk7CgogIHZpcnR1YWwgdm9pZCBvdGhlcktpbkFjY3VtKGNvbnN0IENvc3QmIG90aGVyQ29zdCk7CgogIHZpcnR1YWwgdm9pZCB0cnlUb1JlZHVjZShjb25zdCBDb3N0JiBvdGhlckNvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHAgPSBOVUxMKTsKCiAgdmlydHVhbCB2b2lkIHVuaWxhdGVyYWxseVJlZHVjZShjb25zdCBFbGFwc2VkVGltZSAmIHRpbWVSZWR1Y3Rpb24pOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUeXBlLXNhZmUgcG9pbnRlciBjYXN0cyB1c2VkIGZvciBydW4tdGltZSB0eXBlIGlkZW50aWZpY2F0aW9uLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHZpcnR1YWwgRWxhcHNlZFRpbWVDb3N0TGltaXQqIGNhc3RUb0VsYXBzZWRUaW1lQ29zdExpbWl0KCkgY29uc3Q7CgogIHZpcnR1YWwgY29uc3QgUGxhblByaW9yaXR5JiBwcmlvcml0eUxpbWl0KCkgY29uc3Qge3JldHVybiBwcmlvcml0eUxpbWl0Xzt9CgogIHZvaWQgc2V0VXBwZXJMaW1pdChFbGFwc2VkVGltZSB1bCkgeyB1cHBlckxpbWl0XyA9IHVsOyB9Cgpwcml2YXRlOgoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIFVwcGVyIGxpbWl0IGZvciBlbGFwc2VkIHRpbWUgb2YgYWxsIG9wZXJhdG9ycyBpbiBmaW5hbCBxdWVyeSB0cmVlLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBFbGFwc2VkVGltZSB1cHBlckxpbWl0XzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBVcHBlciBsaW1pdCBmb3IgcGxhbiBwcmlvcml0eSBvZiBhbGwgb3BlcmF0b3JzIGluIGZpbmFsIHF1ZXJ5IHRyZWUuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIFBsYW5Qcmlvcml0eSBwcmlvcml0eUxpbWl0XzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vICBBY2N1bXVsYXRlZCBjb3N0IG9mIGFsbCBvcGVyYXRvcnMgb24gcGF0aCBmcm9tIHJvb3QgdG8gY3VycmVudCBvcGVyYXRvci4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdCogYW5jZXN0b3JDb3N0XzsKCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIEFjY3VtdWxhdGVkIGNvc3Qgb2YgYWxsIGtub3duIHNpYmxpbmdzLCBjb3VzaW5zIGFuZCB1bmNsZXMuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgQ29zdCogb3RoZXJLaW5Db3N0XzsKCiAgLy8gVGhpcyBpcyBjYWNoZWQgdmFsdWUgb2YgZ2V0VmFsdWUoKSBtZXRob2QgZm9yIHRoaXMgY29zdExpbWl0LgogIC8vIEl0IGlzIHVzZWQgdG8gY3BlZWQgdXAgY29tcGFyZSBvcGVyYXRpb25zLgogIGRvdWJsZSBjYWNoZWRWYWx1ZV87Cgp9OyAvLyBjbGFzcyBFbGFwc2VkVGltZUNvc3RMaW1pdAoKCi8vPHBiPgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIGNsYXNzIFNjbUVsYXBzZWRUaW1lQ29zdExpbWl0Ci8vIFRoZSBTY21FbGFwc2VkVGltZUNvc3RMaW1pdCBpcyBOQ00gKE5ldyBDb3N0IE1vZGVsKSBpbXBsZW1lbnRhdGlvbgovLyBvZiBDb3N0TGltaXQgYWJzdHJhY3QgY2xhc3MuIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIE9DTSAoT2xkIENvc3QgTW9kZWwpCi8vIGltcGxlbWVudGF0aW9uIEVsYXBzZWRUaW1lQ29zdExpbWl0LgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgU2NtRWxhcHNlZFRpbWVDb3N0TGltaXQgOiBwdWJsaWMgQ29zdExpbWl0CnsKcHVibGljOgoKICAvLy0tLS0tLS0tLS0tLS0tCiAgLy8gIENvbnN0cnVjdG9ycwogIC8vLS0tLS0tLS0tLS0tLS0KICBTY21FbGFwc2VkVGltZUNvc3RMaW1pdChjb25zdCBFbGFwc2VkVGltZSYgbGltaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhblByaW9yaXR5JiBwcmlvcml0eUxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqICAgICAgICAgYW5jZXN0b3JDb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3QqICAgICAgICAgb3RoZXJLaW5Db3N0KQogIDogdXBwZXJMaW1pdF8obGltaXQpLGNhY2hlZFZhbHVlXygwLjApLHByaW9yaXR5TGltaXRfKHByaW9yaXR5TGltaXQpCiAgewogICAgQ01QQVNTRVJUKCAgIGFuY2VzdG9yQ29zdCAhPSBOVUxMCiAgICAgICAgICAgICAgJiYgb3RoZXJLaW5Db3N0ICE9IE5VTEwKICAgICAgICAgICAgICAmJiBhbmNlc3RvckNvc3QgIT0gb3RoZXJLaW5Db3N0KTsKCiAgICBhbmNlc3RvckNvc3RfID0gbmV3IFNUTVRIRUFQIENvc3QoKmFuY2VzdG9yQ29zdCk7CiAgICBvdGhlcktpbkNvc3RfID0gbmV3IFNUTVRIRUFQIENvc3QoKm90aGVyS2luQ29zdCk7CiAgfQoKICBTY21FbGFwc2VkVGltZUNvc3RMaW1pdChjb25zdCBTY21FbGFwc2VkVGltZUNvc3RMaW1pdCYgb3RoZXIpCiAgOiB1cHBlckxpbWl0XyhvdGhlci51cHBlckxpbWl0XyksCiAgICBwcmlvcml0eUxpbWl0XyhvdGhlci5wcmlvcml0eUxpbWl0XyksCiAgICBhbmNlc3RvckNvc3RfKG5ldyhDbXBDb21tb246OnN0YXRlbWVudEhlYXAoKSkgQ29zdCgqb3RoZXIuYW5jZXN0b3JDb3N0XykpLAogICAgb3RoZXJLaW5Db3N0XyhuZXcoQ21wQ29tbW9uOjpzdGF0ZW1lbnRIZWFwKCkpIENvc3QoKm90aGVyLm90aGVyS2luQ29zdF8pKSwKICAgIGNhY2hlZFZhbHVlXyhvdGhlci5jYWNoZWRWYWx1ZV8pCiAgICB7fTsKCiAgLy8tLS0tLS0tLS0tLS0KICAvLyAgRGVzdHJ1Y3RvcgogIC8vLS0tLS0tLS0tLS0tCiAgdmlydHVhbCB+U2NtRWxhcHNlZFRpbWVDb3N0TGltaXQoKQogICAgeyBkZWxldGUgYW5jZXN0b3JDb3N0XzsgZGVsZXRlIG90aGVyS2luQ29zdF87IH0KCiAgdmlydHVhbCBDb3N0TGltaXQqIGNvcHkoKSBjb25zdAogICAgeyByZXR1cm4gbmV3KENtcENvbW1vbjo6c3RhdGVtZW50SGVhcCgpKSBTY21FbGFwc2VkVGltZUNvc3RMaW1pdCgqdGhpcyk7IH0KCiAgdmlydHVhbCBkb3VibGUgZ2V0VmFsdWUoY29uc3QgUmVxZFBoeXNpY2FsUHJvcGVydHkqIGNvbnN0IHJwcCkgY29uc3Q7CgogIGRvdWJsZSBnZXRDYWNoZWRWYWx1ZSAoKXsgcmV0dXJuIGNhY2hlZFZhbHVlXzsgfQogIHZvaWQgICBzZXRDYWNoZWRWYWx1ZSAoZG91YmxlIHZhbCkgeyBjYWNoZWRWYWx1ZV8gPSB2YWw7IH0KCiAgdmlydHVhbCBDT01QQVJFX1JFU1VMVCBjb21wYXJlQ29zdExpbWl0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29zdExpbWl0KiBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHAgPSBOVUxMKTsKCiAgdmlydHVhbCBDT01QQVJFX1JFU1VMVCBjb21wYXJlV2l0aENvc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IENvc3QgJiBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHAgPSBOVUxMKTsKCiAgdmlydHVhbCBDT01QQVJFX1JFU1VMVCBjb21wYXJlV2l0aFBsYW5Db3N0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChDYXNjYWRlc1BsYW4qIHBsYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCk7CgogIHZpcnR1YWwgdm9pZCBhbmNlc3RvckFjY3VtKGNvbnN0IENvc3QmIG90aGVyQ29zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXFkUGh5c2ljYWxQcm9wZXJ0eSogY29uc3QgcnBwID0gTlVMTCk7CgogIHZpcnR1YWwgdm9pZCBvdGhlcktpbkFjY3VtKGNvbnN0IENvc3QmIG90aGVyQ29zdCk7CgogIHZpcnR1YWwgdm9pZCB0cnlUb1JlZHVjZShjb25zdCBDb3N0JiBvdGhlckNvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlcWRQaHlzaWNhbFByb3BlcnR5KiBjb25zdCBycHAgPSBOVUxMKTsKCiAgdmlydHVhbCB2b2lkIHVuaWxhdGVyYWxseVJlZHVjZShjb25zdCBFbGFwc2VkVGltZSAmIHRpbWVSZWR1Y3Rpb24pOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUeXBlLXNhZmUgcG9pbnRlciBjYXN0cyB1c2VkIGZvciBydW4tdGltZSB0eXBlIGlkZW50aWZpY2F0aW9uLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vdmlydHVhbCBTY21FbGFwc2VkVGltZUNvc3RMaW1pdCogY2FzdFRvU2NtRWxhcHNlZFRpbWVDb3N0TGltaXQoKSBjb25zdDsKCiAgdmlydHVhbCBjb25zdCBQbGFuUHJpb3JpdHkmIHByaW9yaXR5TGltaXQoKSBjb25zdCB7cmV0dXJuIHByaW9yaXR5TGltaXRfO30KCiAgdm9pZCBzZXRVcHBlckxpbWl0KEVsYXBzZWRUaW1lIHVsKSB7IHVwcGVyTGltaXRfID0gdWw7IH0KCnByaXZhdGU6CgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgVXBwZXIgbGltaXQgZm9yIGVsYXBzZWQgdGltZSBvZiBhbGwgb3BlcmF0b3JzIGluIGZpbmFsIHF1ZXJ5IHRyZWUuCiAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIEVsYXBzZWRUaW1lIHVwcGVyTGltaXRfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIFVwcGVyIGxpbWl0IGZvciBwbGFuIHByaW9yaXR5IG9mIGFsbCBvcGVyYXRvcnMgaW4gZmluYWwgcXVlcnkgdHJlZS4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgUGxhblByaW9yaXR5IHByaW9yaXR5TGltaXRfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gIEFjY3VtdWxhdGVkIGNvc3Qgb2YgYWxsIG9wZXJhdG9ycyBvbiBwYXRoIGZyb20gcm9vdCB0byBjdXJyZW50IG9wZXJhdG9yLgogIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDb3N0KiBhbmNlc3RvckNvc3RfOwoKICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyAgQWNjdW11bGF0ZWQgY29zdCBvZiBhbGwga25vd24gc2libGluZ3MsIGNvdXNpbnMgYW5kIHVuY2xlcy4KICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBDb3N0KiBvdGhlcktpbkNvc3RfOwoKICAvLyBUaGlzIGlzIGNhY2hlZCB2YWx1ZSBvZiBnZXRWYWx1ZSgpIG1ldGhvZCBmb3IgdGhpcyBjb3N0TGltaXQuCiAgLy8gSXQgaXMgdXNlZCB0byBjcGVlZCB1cCBjb21wYXJlIG9wZXJhdGlvbnMuCiAgZG91YmxlIGNhY2hlZFZhbHVlXzsKCn07IC8vIGNsYXNzIFNjbUVsYXBzZWRUaW1lQ29zdExpbWl0CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RBTlRTCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT0KLy8gJCQkJCBDb252ZXJ0IGFsbCBvZiB0aGVzZSB0byBiZWNvbWUgQ29zdFNjYWxhcnMgYWZ0ZXIgdGhlIGxhdHRlcgovLyAkJCQkIGlzIGVuaGFuY2VkIHRvIHN1cHBvcnQgYXJpdGhtZXRpY2FsIG9wZXJhdGlvbnMgd2l0aCBkaWZmZXJlbnQKLy8gJCQkJCBudW1lcmljIGRhdGF0eXBlcyBzdXBwb3J0ZWQgaW4gQysrLi4KLy8KLy8gVGhlc2UgaGF2ZSBhbGwgYmVlbiBhZGRlZCB0byB0aGUgRGVmYXVsdHMgdGFibGUgKDcvMjEvOTcpCi8vCi8vIFRoZXkgYXJlIGFycmFuZ2VkIGluIGFuIGFscGhhYmV0aWNhbCBvcmRlciB0byBhaWQgdmlzdWFsIHNlYXJjaGVzLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIGV4ZWN1dG9yIGluIERQMiBpcyBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgNTZLYiB0cmFuc2ZlcnMsCi8vIEFjdHVhbGx5LCA1NmsgICA1NzM0NCBieXRlcywgYnV0IHdlIGFzc3VtZSB0aGF0IDEzNDQgYnl0ZXMgYXJlIHVzZWQKLy8gZm9yIHN0b3JpbmcgZGF0YSB0aGF0IGlzIHByaXZhdGUgdG8gRFAyL21lc3NhZ2Ugc3lzdGVtLgovLyBXaXRoIEd1YXJkaWFuLCB0aGUgNTZLIGxpbWl0IGFwcGxpZXMgdG8gdGhlIGxvY2FsIEVTUDwtPkRQMgovLyBhbmQgMzJLIGZvciB0aGUgbm9uLWxvY2FsIEVTUDwtPkRQMi4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8jZGVmaW5lIERQMl9NRVNTQUdFX0JVRkZFUl9TSVpFICg1NkUrMykgIC8vIHVzZWQgZm9yIEVTUDwtPkRQMgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQWN0dWFsbHksIDMyayAgIDMzNTY4IGJ5dGVzLCBidXQgd2UgYXNzdW1lIHRoYXQgMTU2OCBieXRlcyBhcmUgdXNlZAovLyBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgcHJpdmF0ZSB0byB0aGUgT1MvbWVzc2FnZSBzeXN0ZW0uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vI2RlZmluZSBPU19NRVNTQUdFX0JVRkZFUl9TSVpFICgzMkUrMykgIC8vIHVzZWQgZm9yIEVTUDwtPkVTUAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TVCBGQUNUT1JTCi8vCi8vICQkJCQgQ29udmVydCBhbGwgb2YgdGhlc2UgdG8gYmVjb21lIENvc3RTY2FsYXJzIGFmdGVyIHRoZSBsYXR0ZXIKLy8gJCQkJCBpcyBlbmhhbmNlZCB0byBzdXBwb3J0IGFyaXRobWV0aWNhbCBvcGVyYXRpb25zIHdpdGggZGlmZmVyZW50Ci8vICQkJCQgbnVtZXJpYyBkYXRhdHlwZXMgc3VwcG9ydGVkIGluIEMrKy4uCi8vCi8vIFRoZXNlIHdlcmUgYWxsIGJlZW4gYWRkZWQgdG8gdGhlIERlZmF1bHRzIHRhYmxlICg3LzIxLzk3KQovLwovLyBUaGV5IGFyZSBhcnJhbmdlZCBpbiBhbiBhbHBoYWJldGljYWwgb3JkZXIgdG8gYWlkIHZpc3VhbCBzZWFyY2hlcy4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc3VtZSAxMCBpbnN0cnVjdGlvbnMgZm9yIGNvcHlpbmcgYSByb3cuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vI2RlZmluZSBDUFVDT1NUX0NPUFlfUk9XICgwLjAxKQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXNzdW1lIDEwMCBpbnN0cnVjdGlvbnMgZm9yIHVwZGF0aW5nL2RlbGV0aW5nIGEgcm93IGFjcm9zcyB0aGUgRE0KLy8gICBpbnRlcmZhY2UgKGV4ZWN1dG9yIGRvZXMgYSBETV5VUERBVEUgaW4gRFAyKQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyNkZWZpbmUgQ1BVQ09TVF9ETV9VUERBVEUgKDAuMSkKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc3VtZSAyMDAwIGluc3RydWN0aW9ucyAgKDIwbXMgPT4gc2FtZSBlbGFwc2VkIHRpbWUgYXMgcGVyZm9ybWluZwovLyAxIHJhbmRvbSBJTykgZm9yIHByb2Nlc3Mgc3RhcnR1cCBhbmQgaW5pdGlhbGl6YXRpb24uCi8vIFRoaXMgbnVtYmVyIHNob3VsZCBiZSByZWR1Y2VkIHdoZW4gcGVyc2lzdGVudCBFU1AgbWFuYWdlbWVudCBzZXJ2aWNlcwovLyBhcmUgaW1wbGVtZW50ZWQuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vI2RlZmluZSBDUFVDT1NUX0VTUF9JTklUSUFMSVpBVElPTiAoMi4wMDApCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3N1bWUgMTAgaW5zdHJ1Y3Rpb25zIGZvciBtYXBwaW5nIGEgcGFydGljdWxhciBkYXRhIHN0cmVhbSB0bwovLyBhIHBhcnRpY3VsYXIgY29uc3VtZXIgcHJvY2Vzcy4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8jZGVmaW5lIENQVUNPU1RfRVhDSEFOR0VfTUFQUElOR19GVU5DVElPTiAoMC4wMSkKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc3VtZSAxMCBpbnN0cnVjdGlvbnMgcGVyIHBhcnRpdGlvbmluZyBrZXkgY29sdW1uIGZvciBjb21wdXRpbmcgdGhlCi8vIGlkZW50aWZpZXIgZm9yIHRoZSBoYXNoIG9yIHJhbmdlIHBhcnRpdGlvbi4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8jZGVmaW5lIENQVUNPU1RfRVhDSEFOR0VfU1BMSVRfRlVOQ1RJT04gKDAuMDEpCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3N1bWUgMjUwIGluc3RydWN0aW9ucyBmb3IgbG9ja2luZyBhIHJvdwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyNkZWZpbmUgQ1BVQ09TVF9MT0NLX1JPVyAoMC4yNSkKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFzc3VtZSAxMDAgaW5zdHJ1Y3Rpb25zIGZvciBwZXJmb3JtaW5nIGEgcHJlZGljYXRlIGNvbXBhcmlzb24uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vI2RlZmluZSBDUFVDT1NUX1BSRURJQ0FURV9DT01QQVJJU09OICgwLjEpCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3N1bWUgMjAsMDAwIGluc3RydWN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGEgc3Vic2V0LgovLyBJbmNsdWRlcyB0aGUgY29zdCBvZiBvcGVuaW5nIGEgZmlsZSBhbmQgaW5pdGlhbGl6aW5nIGNvbnRyb2wKLy8gc3RydWN0dXJlcywgYnV0IE5PVCBwb3NpdGlvbmluZyBvbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBzdWJzZXQuCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vI2RlZmluZSBDUFVDT1NUX1NVQlNFVF9PUEVOICgyMCkKCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3N1bWUgMTAgaW5zdHJ1Y3Rpb25zIGZvciBlc3RhYmxpc2hpbmcgYSByZWZlcmVuY2UgdG8gYSB0dXBsZQovLyBpbiB0aGUgZXhlY3V0b3IncyBhZGRyZXNzIHNwYWNlLiBUaGlzIGluY2x1ZGVzIHRoZSBjb3B5aW5nIG9mCi8vIHBvaW50ZXJzIHRvIHRoZSB0dXBsZSBpbnRvIHRoZSBleGVjdXRvcidzIGRhdGEgc3RydWN0dXJlcy4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8jZGVmaW5lIENQVUNPU1RfVFVQTEVfUkVGRVJFTkNFICgwLjAxKQoKLy88cGI+Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBkZWNsYXJhdGlvbiBmb3IgY2xhc3MgQ29zdCBQcmltaXRpdmVzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRoZXJlIGFyZSBjdXJyZW50bHkgZm91ciBtYWpvciB0eXBlcyBvZiBDb3N0IHByaW1pdGl2ZXMuCi8vCi8vIDEuIENvc3QgcHJpbWl0aXZlcyBmb3IgYmFzaWMgZXhlY3V0b3Igb3BlcmF0aW9uczogdGhleSByZXByZXNlbnQgdGhlIGNvc3RzCi8vICAgIG9mIGNvbW1vbiBleGVjdXRvciBvcGVyYXRpb25zIHR5cGljYWxseSBwZXJmb3JtZWQgYnkgZXZlcnkgb3BlcmF0b3IuCi8vICAgIEV4YW1wbGVzIGluY2x1ZGUgYWxsb2NhdGlvbiBvZiBidWZmZXIgcG9vbHMgYW5kIGJ1ZmZlcnMsIGZyZWUgdHVwbGVzCi8vICAgIGZyb20gYSBidWZmZXIgYW5kIEFUUHMsIGV0Yy4gVGhleSBhcmUgYmVpbmcgcmVwcmVzZW50ZWQgYXMgY29uc3RhbnQKLy8gICAgY29zdHMgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZ2V0QmFzaWNDb3N0RmFjdG9yKG9wRW51bSkgd2hlcmUKLy8gICAgb3BFbnVtIGlzIGEgbWVtYmVyIG9mIHRoZSBlbnVtZXJhdGlvbiB0eXBlIG9mIG9wZXJhdGlvbnMgKHNlZQovLyAgICBEZWZhdWx0c1RhYmxlLmggaW4gc3FsY29tcCBkaXJlY3RvcnkpLgovLwovLyAyLiBDb3N0IHByaW1pdGl2ZXMgZm9yIGV2YWx1YXRpb24gb2YgZXhlY3V0b3IgZXhwcmVzc2lvbnM6IGVhY2ggcmVwcmVzZW50Ci8vICAgIHRoZSBjb3N0IG9mIGV2YWx1YXRpbmcgYW4gZXhwcmVzc2lvbiBvciBzdWJleHByZXNzaW9uIHVzaW5nIHRoZSBnZW5lcmFsCi8vICAgIGV4cHJlc3Npb24gZXZhbHVhdG9yLiBFeGFtcGxlcyBhcmUgZXZhbHVhdGlvbnMgb2YgcHJlZGljYXRlcywgY29weWluZwovLyAgICBhIHJvdywgaGFzaGluZyBhIHNldCBvZiBrZXlzLCBldGMuIFRoZXNlIGFyZSBwYXJhbWV0ZXJpc2VkIHByaW1pdGl2ZXMKLy8gICAgd2hpY2ggYXJlIGFjY2Vzc2VkIGluZGl2aWR1YWxseSB1c2luZyBkaWZmZXJlbnQgaW50ZXJmYWNlcy4gVG8gcmV0cmlldmUKLy8gICAgdGhlIGNvc3Qgb2YgY29weWluZyBhIHNldCBvZiBjb2x1bW5zIGZvciBleGFtcGxlLCBhIGNhbGwgY2FuIGJlIG1hZGUgdG8KLy8gICAgY3B1Q29zdEZvckNvcHlTZXQodmlzKSB3aGVyZSB2aXMgaXMgdGhlIFZhbHVlSWRTZXQgcmVwcmVzZW50aW5nIHRob3NlCi8vICAgIGNvbHVtbnMuIChJbiB0aGUgbG9uZyBydW4sIHdlIG1pZ2h0IGNvbnNpZGVyIGhhdmluZyB0aGVzZSBwcmltaXRpdmVzCi8vICAgIHN0b3JlZCB1bmRlciBlYWNoIEl0ZW1FeHByLikKLy8KLy8gMy4gQ29zdCBQcmltaXRpdmVzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgcmVsYXRpb25hbCBvcGVyYXRvcnMuIERpZmZlcmVudAovLyAgICByZWxhdGlvbmFsIG9wZXJhdG9ycyBoYXZlIGRpZmZlcmVudCBwcmltaXRpdmVzIG9wZXJhdGlvbnMgd2hpY2ggYXJlIG5vdAovLyAgICBjYXB0dXJlZCBieSB0aGUgZ2VuZXJhbCBmcmFtZXdvcmsgb2YgdGhlIGV4ZWN1dG9yLCBhcyBkZWZpbmVkIGJ5IHRoZQovLyAgICBwcmltaXRpdmVzIG9wZXJhdGlvbnMgaW4gKDEpIGFuZCAoMikuIEZvciBleGFtcGxlLCBzb21lIGF1eGlsbGFyeSBkYXRhCi8vICAgIHN0cnVjdHVyZXMgbWF5IGJlIGFsbG9jYXRlZCAoaGFzaCB0YWJsZSBhbmQgbGlua2VkIGxpc3QpLiBBbHNvLCBtaXNjCi8vICAgIGNvc3RzIHN1Y2ggYXMgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdmVyaGVhZCBvZiB0aGUgdGFzayBzY2hlZHVsZXIsCi8vICAgIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZm9yIGRpZmZlcmVudCBvcGVyYXRvcnMsIGFyZSBhbHNvIGNvbnNpZGVyZWQgYXMKLy8gICAgdGhpcyB0eXBlLiAoSW4gdGhlIGxvbmcgcnVuLCB3ZSBtaWdodCBjb25zaWRlciBoYXZpbmcgdGhlc2UgcHJpbWl0aXZlcwovLyAgICBzdG9yZWQgdW5kZXIgZWFjaCBSZWxFeHByLikKLy8KLy8gNC4gQmFzaWMgY29zdCBmYWN0b3JzLiBUaGlzIGlzIGEgbGlzdCBvZiBmdWRnZSBmYWN0b3JzIHVzZWQgaW4gdGhlIGZvcm11bGFlCi8vICAgIGZvciBjb21iaW5pbmcgY29zdHMgb2YgYW4gb3BlcmF0b3IgYW5kIGl0cyBjaGlsZHJlbi4gRXhhbXBsZXMgYXJlIHRob3NlCi8vICAgIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIEkvTyBvZiBvbmUgb3BlcmF0b3IgY2FuIG92ZXJsYXAgd2l0aCBJL08gb2YKLy8gICAgYW5vdGhlciBvcGVyYXRvci4KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBDb3N0UHJpbWl0aXZlcwp7CnB1YmxpYzoKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFRvIGNvcHkgb25lIGluc3RhbmNlIG9mIHZpZHNldCBmcm9tIG9uZSBtZW1vcnkgbG9jYXRpb24gdG8gYW5vdGhlci4KICAvLwogIC8vIFRoZSBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlIHZpZHNldCBhcmUgTk9UIG5lY2Vzc2FyaWx5CiAgLy8gc3RvcmVkIHRvZ2V0aGVyIGluIGEgY29udGlndW91cyBwaWVjZSBvZiBtZW1vcnkuIFRodXMsIHdlIG5lZWQgdG8gY29weQogIC8vIGVhY2ggaW5kaXZpZHVhbCB2YWx1ZSBvdmVyIG9uZSBhZnRlciBhbm90aGVyLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBzdGF0aWMgZG91YmxlIGNwdUNvc3RGb3JDb3B5U2V0IChjb25zdCBWYWx1ZUlkU2V0ICYgdmlkc2V0KTsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFRvIGNvcHkgYSByb3cgZnJvbSBvbmUgbWVtb3J5IGxvY2F0aW9uIHRvIGFub3RoZXIuCiAgLy8KICAvLyBBcyBvcHBvc2VkIHRvIHRoZSBhYm92ZSBtZXRob2QsIHRoaXMgbWV0aG9kIGFzc3VtZSB0aGF0IHRoZSByb3cgaXMgc3RvcmVkCiAgLy8gaW4gYSBjb250aWd1b3VzIHBpZWNlIG9mIG1lbW9yeS4gV2UgY291bGQgZXhwbG9pdCB0aGUgbWVtY3B5IGZ1bmN0aW9uIGFuZAogIC8vIHNhdmUgc29tZSBvdmVyaGVhZCBpbiB0aGVvcnkuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXRpYyBkb3VibGUgY3B1Q29zdEZvckNvcHlSb3cgKExuZzMyIGJ5dGVDb3VudCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUbyBjb21wYXJlIHR3byBpbnN0YW5jZXMgb2Ygdmlkc2V0LiBDb21wYXJpc29uIG9wZXJhdG9ycyByZXByZXNlbnRlZAogIC8vIGhlcmUgaW5jbHVkZTogRVEsIE5FLCBHVCwgR0UsIExULCBMRSwgYnV0IG5vdCBMSUtFLgogIC8vCiAgLy8gVGhpcyBkb2VzIE5PVCBhY2NvdW50IGZvciB0aGUgY29zdCBvZiBldmFsdWF0aW5nIHRoZSBtZW1iZXJzIG9mIHZpZHNldAogIC8vIHdoaWNoIG1pZ2h0IGJlIGV4cHJlc3Npb25zIGluc3RlYWQgb2YgY29sdW1uIHJlZmVyZW5jZXMgb3Igc2NhbGFycy4gVGhlCiAgLy8gbWVtYmVycyBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gZXZhbHVhdGVkIGFuZCB0aGVpciB2YWx1ZXMgc3RvcmVkIGluCiAgLy8gbWVtb3J5IGJlZm9yZSB0aGV5IGFyZSBjb21wYXJlZCBieSB0aGlzIG9wZXJhdGlvbi4KICAvLwogIC8vIE5vIHNob3J0IGNpcmN1aXQgbWVjaGFuaXNtIGlzIGFzc3VtZWQuIFRoYXQgaXMsIHRoZSBjb3N0IHJldHVybmVkIGlzIG9uZQogIC8vIGlmIHRoZSB0d28gaW5zdGFuY2VzIGFyZSBlcXVhbC4gSWYgdGhlIGNsaWVudCBvZiB0aGlzIG1ldGhvZCBhcHBsaWVzIHRoaXMKICAvLyBvcGVyYXRpb24gb24gbXVsdGlwbGUgcm93cyBhbmQgaGFzIHNvbWUgaWRlYXMgb2YgaG93IG9mdGVuIGl0IGV2YWx1YXRlcwogIC8vIHRvIFRSVUUgYW5kIEZBTFNFLCBpdCBjYW4gYWRqdXN0IHRoaXMgdG8gYW4gYXZlcmFnZSB2YWx1ZSBhc3N1bWluZyBvbmx5CiAgLy8gaGFsZiB0aGUgY29zdCBpcyBpbmN1cnJlZCB3aGVuIGV2YWx1YXRlZCB0byBGQUxTRS4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgc3RhdGljIGRvdWJsZSBjcHVDb3N0Rm9yQ29tcGFyZSAoY29uc3QgVmFsdWVJZFNldCAmIHZpZHNldCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUbyBldmFsdWF0ZSB0aGUgTGlrZSBjb21wYXJpc29uIG9wZXJhdGlvbi4gdmlkIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoCiAgLy8gdGhlIExpa2UgYnVpbHRpbiBmdW5jdGlvbi4KICAvLwogIC8vICQkJCBUaGlzIGlzIGEgdGVudGF0aXZlIG1lYXN1cmUgYmVmb3JlIGNwdUNvc3RGb3JFdmFsRnVuYygpIGlzIGluIHBsYWNlLgogIC8vICQkJCBMaWtlIGlzIGEgc3ViY2xhc3Mgb2YgRnVuY3Rpb24gYW5kIHdlIHNob3VsZCBiZSBhYmxlIHRvIG9idGFpbiBpdHMKICAvLyAkJCQgY29zdCBmcm9tIHRoZXJlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBzdGF0aWMgZG91YmxlIGNwdUNvc3RGb3JMaWtlQ29tcGFyZSAoY29uc3QgVmFsdWVJZCAmIHZpZCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUbyBldmFsdWF0ZSBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24gc3BlY2lmaWVkIGJ5IHZpZC4KICAvLwogIC8vIFRoaXMgbWV0aG9kIHdhbGtzIHRoZSBza2VsZXRvbiBvZiB0aGUgaXRlbSBleHByZXNzaW9uIG9mIHZpZCB3aGljaCBjYW4KICAvLyBiZSBtYWRlIHVwIG9mICssLSwqLC8sKiosIHN1bW1pbmcgdXAgdGhlIHRoZWlyIGNvc3RzIGFsb25nIHRoZSB3YXkuIEl0CiAgLy8gdHJlYXRzIGFueSBub2RlcyBvdGhlciB0aGFuIHRob3NlIGdpdmVuIGFib3ZlIGFzIGxlYWYgbm9kZXMuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXRpYyBkb3VibGUgY3B1Q29zdEZvckV2YWxBcml0aEV4cHIgKGNvbnN0IFZhbHVlSWQgJiB2aWQpOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG8gZXZhbHVhdGUgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSB2aWQuIHZpZCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aAogIC8vIGFuIG9iamVjdCBvZiBhIHN1YmNsYXNzIG9mIEZ1bmN0aW9uIChkZWZpbmVkIGluIEl0ZW1GdW5jLmgpLiBUaGUgbWV0aG9kCiAgLy8gcmV0dXJucyB0aGUgY29zdCBvZiBldmFsdWF0aW5nIHRoZSBmdW5jdGlvbiBnaXZlbiB0aGF0IGFsbCBpdHMgYXJndW1lbnRzCiAgLy8gaGF2ZSBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkLgogIC8vCiAgLy8gJCQkIEluIHRoZSBmaXJzdCByZWxlYXNlIG9mIENvc3RQcmltaXRpdmVzLkMsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCiAgLy8gJCQkIG1ldGhvZCBpcyBqdXN0IGEgc3R1YiB3aGljaCByZXR1cm5zIGEgY29zdCBvZiAwLiBUaGUgcGxhbiBpcyB0byBzdG9yZQogIC8vICQkJCB0aGUgY29zdCBvZiBldmFsdWF0aW5nIGEgZnVuY3Rpb24gYXMgcHJpdmF0ZSBtZW1iZXJzIG9mIHRoZSBjbGFzcyBvZgogIC8vICQkJCB0aGUgZnVuY3Rpb24gaXRzZWxmLiBDaGFuZ2VzIGluIEl0ZW1GdW5jLmggbmVlZCB0byBiZSBtYWRlLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBzdGF0aWMgZG91YmxlIGNwdUNvc3RGb3JFdmFsRnVuYyAoY29uc3QgVmFsdWVJZCAmIHZpZCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUbyBldmFsdWF0ZSB0aGUgc2V0IG9mIHByZWRpY2F0ZXMgZ2l2ZW4gYXMgdmlkc2V0IGFuZCBBTkQgdGhlIHJlc3VsdHMuCiAgLy8KICAvLyBUaGlzIG1ldGhvZCB3YWxrcyB0aGUgQU5EL09SL05PVCBza2VsZXRvbiBvZiB0aGUgaXRlbSBleHByZXNzaW9uIHRyZWUgb2YKICAvLyBlYWNoIHByZWRpY2F0ZSBpbiB0aGUgc2V0IHVwIHRvIHRoZSBwb2ludCB3aGVyZSBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUKICAvLyBsb2NhdGVkLiBUaGVyZSwgaXQgdXNlcyBjcHVDb3N0Rm9yQ29tcGFyZSgpIG9yIGNwdUNvc3RGb3JMaWtlQ29tcGFyZSgpIHRvCiAgLy8gZGV0ZXJtaW5lIHRoZSBjb3N0cyBvZiB0aGUgY29tcGFyaXNvbnMsIGFuZCBhZGRzIHRoZSBjb3N0cyB0byB0aGUgY29zdHMKICAvLyBmb3IgZXZhbHVhdGluZyB0aGUgQU5EL09SL05PVCBvcGVyYXRpb25zIHRoZW1zZWx2ZXMuCiAgLy8KICAvLyBTaW5jZSBpdCBjYWxscyBjcHVDb3N0Rm9yQ29tcGFyZSgpIG9yIGNwdUNvc3RGb3JMaWtlQ29tcGFyZSBvbmNlIGl0IHNlZXMKICAvLyBhIGNvbXBhcmlzb24gb3BlcmF0b3IsIGl0IGhhcyB0aGUgc2FtZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGV2YWx1YXRpb24gb2YKICAvLyBleHByZXNzaW9ucyBvbiB0aGUgdHdvIHNpZGVzIG9mIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIG5vdCBhY2NvdW50ZWQKICAvLyBmb3IgaW4gdGhlIGNvc3QgY29tcHV0ZWQuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXRpYyBkb3VibGUgY3B1Q29zdEZvckV2YWxQcmVkIChjb25zdCBWYWx1ZUlkU2V0ICYgdmlkc2V0KTsKCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIC8vIFRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIHNwZWNpZmllZCBieSB2aWQuIFRoZSBtZXRob2QgaXMgZ29pbmcgdG8gd2FsawogIC8vIHRoZSB0cmVlIHJvb3RlZCBhdCB2aWQsIGdldCB0aGUgY29zdHMgb2YgZXZhbHVhdGluZyBlYWNoIG5vZGUgb24gaXRzIHdheQogIC8vIGFuZCBzdW0gdXAgdGhlIGNvc3RzLgogIC8vCiAgLy8gJCQkIEluIHRoZSBmaXJzdCByZWxlYXNlIG9mIENvc3RQcmltaXRpdmVzLkMsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCiAgLy8gJCQkIG1ldGhvZCBpcyBqdXN0IGEgc3R1YiB3aGljaCByZXR1cm5zIGEgY29zdCBvZiAwLgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBzdGF0aWMgZG91YmxlIGNwdUNvc3RGb3JFdmFsRXhwciAoY29uc3QgVmFsdWVJZCAmIHZpZCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBUbyBlbmNvZGUgYW4gaW5zdGFuY2Ugb2Ygdmlkc2V0LgogIC8vCiAgLy8gVGhlIGVuY29kZSBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBpbiBTb3J0IHRvIG1hcCBhIGxpc3Qgb2Ygc29ydCBrZXlzIHRvCiAgLy8gc2luZ2xlIHZhbHVlIHdoaWNoIHByZXNlcnZlcyBvcmRlci4gVGhlIHNpbmdsZSB2YWx1ZSBpcyB1c2VkIGJ5IEFya1NvcnQKICAvLyBhcyBhIHNpbmdsZSBrZXkgYmFzZWQgb24gd2hpY2ggdGhlIHJlY29yZHMgYXJlIHNvcnRlZC4KICAvLwogIC8vICQkJCBUaGlzIGZ1bmN0aW9uIG1heSBiZSByZXBsYWNlZCBieSBhIGNhbGwgdG8gY29zdGluZyBtZXRob2QgYXQgdGhlCiAgLy8gJCQkIENvbXBFbmNvZGUgbm9kZSBzdWJzZXF1ZW50bHkgaWYgd2UgbW92ZSBjb3N0cyB0byBpbmRpdmlkdWFsIGZ1bmN0aW9uCiAgLy8gJCQkIHN1YmNsYXNzZXMuIEl0IG1pZ2h0IHN0aWxsIGJlIHdvcnRod2hpbGUgdG8gaGF2ZSBhbiBpbnRlcmZhY2UgaGVyZQogIC8vICQkJCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3ludGhlc2l6ZSBhIENvbXBFbmNvZGUgb2JqZWN0IGp1c3QgdG8gZ2V0CiAgLy8gJCQkIGl0cyBjb3N0LgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBzdGF0aWMgZG91YmxlIGNwdUNvc3RGb3JFbmNvZGUgKGNvbnN0IFZhbHVlSWRTZXQgJiB2aWRzZXQpOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG8gaGFzaCBhIHNldCBvZiBrZXlzIHN0b3JlZCBhcyB2aWRzZXQuCiAgLy8KICAvLyBUaGUgaGFzaCBmdW5jdGlvbiBpcyB1c2VkIGJ5IGFsbCBoYXNoIG9wZXJhdG9ycyB0byBwcm9kdWNlIGEgaGFzaCB2YWx1ZQogIC8vIGZyb20gYSBzZXQgb2YgaGFzaCBrZXlzLgogIC8vCiAgLy8gJCQkIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHJlcGxhY2VkIGJ5IGEgY2FsbCB0byBjb3N0aW5nIG1ldGhvZCBhdCB0aGUKICAvLyAkJCQgSGFzaCBub2RlIHN1YnNlcXVlbnRseSBpZiB3ZSBtb3ZlIGNvc3RzIHRvIGluZGl2aWR1YWwgZnVuY3Rpb24KICAvLyAkJCQgc3ViY2xhc3Nlcy4gSXQgbWlnaHQgc3RpbGwgYmUgd29ydGh3aGlsZSB0byBoYXZlIGFuIGludGVyZmFjZSBoZXJlCiAgLy8gJCQkIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBzeW50aGVzaXplIGEgSGFzaCBvYmplY3QganVzdCB0byBnZXQgaXRzCiAgLy8gJCQkIGNvc3QuCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHN0YXRpYyBkb3VibGUgY3B1Q29zdEZvckhhc2ggKGNvbnN0IFZhbHVlSWRTZXQgJiB2aWRzZXQpOwoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gVG8gYWdncmVnYXRlIGEgcm93IGluY3JlbWVudGFsbHkgdG8gdGhlIHNldCBvZiBhZ2dyZWdhdGVzIGluIHZpZHNldC4KICAvLwogIC8vIEFzc3VtZSB3ZSBhbHJlYWR5IGhhdmUgc29tZXdoZXJlIGluIG1lbW9yeSB0aGUgYWdncmVnYXRlcyB1cCB0byB0aGUgbGFzdAogIC8vIHJvdywgdGhlIG1ldGhvZCBjb3N0cyB0aGUgaW5jcmVtZW50YWwgZWZmb3J0IG9mIGFnZ3JlZ2F0aW5nIGEgbmV3IHJvdyB0bwogIC8vIHRoYXQgc2V0IG9mIGFnZ3JlZ2F0ZXMgYWxyZWFkeSBzdG9yZWQuIFdlIGFsc28gYXNzdW1lIHRoZSBhZ2dyZWdhdGVzIGFyZQogIC8vIG5vdCBuZXN0ZWQgYW5kIGFueSBhcml0aG1ldGljIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgYWdncmVnYXRlcyBoYXZlIGJlZW4KICAvLyBldmFsdWF0ZWQgYW5kIHN0b3JlZC4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgc3RhdGljIGRvdWJsZSBjcHVDb3N0Rm9yQWdnclJvdyAoY29uc3QgVmFsdWVJZFNldCAmIHZpZHNldCk7CgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBCYXNpYyBjb3N0IGZhY3RvcnMgdXNlZCBpbiB0aGUgZm9ybXVsYWUgdG8gY29tYmluZSBjb3N0cy4KICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgc3RhdGljIGRvdWJsZSBnZXRCYXNpY0Nvc3RGYWN0b3IgKExuZzMyIG1zY2YpOwoKcHJpdmF0ZToKCn07CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBzdG9yaW5nIGFuZCBwcm9wYWdhdGluZyBEUDIgY29zdGluZwovLyBkYXRhIHRoYXQgaXMgY29tcHV0ZWQgZHVyaW5nIHN5bnRoZXNpcyBvZiB0aGUgRFAyIGxlYWYgb3BlcmF0b3JzLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBEUDJDb3N0RGF0YVRoYXREZXBlbmRzT25TUFAgOiBwdWJsaWMgTkFCYXNpY09iamVjdAp7CnB1YmxpYzoKICBEUDJDb3N0RGF0YVRoYXREZXBlbmRzT25TUFAoKQogICAgIDogaGlnaGVzdExlYWRpbmdQYXJ0aXRpb25Db2x1bW5Db3ZlcmVkXygtMSkKICAgICxyZXBlYXRDb3VudEZvck9wZXJhdG9yc0luRFAyXyggY3NNaW51c09uZSApCiAgICAsY291bnRPZkNQVXNFeGVjdXRpbmdEUDJzXygtMSkKICAgICxwcm9iZXNBdEJ1c2llc3RTdHJlYW1fIChjc09uZSkKICAgICxyQ291bnRTdGF0ZShVTktOT1dOKQogIHt9CgoKCmVudW0gcmVwZWF0Q291bnRTVEFURQp7CiAgIEtFWUNPTFNfQ09WRVJFRF9CWV9DT05TVD0xLAogICBLRVlDT0xTX0NPVkVSRURfQllfUFJPQkVfQ09MU19DT05TVCwKICAgS0VZQ09MU19OT1RfQ09WRVJFRCwKICAgVVBEQVRFX09QRVJBVElPTiwKICAgVU5LTk9XTgp9OwogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgLy8gQWNjZXNzb3JzOgogIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIENvc3RTY2FsYXIgZ2V0UHJvYmVzQXRCdXNpZXN0U3RyZWFtKCkgY29uc3QKICB7IHJldHVybiBwcm9iZXNBdEJ1c2llc3RTdHJlYW1fO30KICBMbmczMiBnZXRIaWdoZXN0TGVhZGluZ1BhcnRpdGlvbkNvbHVtbkNvdmVyZWQoKSBjb25zdAogIHsgcmV0dXJuIGhpZ2hlc3RMZWFkaW5nUGFydGl0aW9uQ29sdW1uQ292ZXJlZF87IH0KCiAgQ29zdFNjYWxhciBnZXRSZXBlYXRDb3VudEZvck9wZXJhdG9yc0luRFAyKCkgY29uc3QKICB7IHJldHVybiByZXBlYXRDb3VudEZvck9wZXJhdG9yc0luRFAyXzsgfQoKICBMbmczMiBnZXRDb3VudE9mQ1BVc0V4ZWN1dGluZ0RQMnMoKSBjb25zdAogIHsgcmV0dXJuIGNvdW50T2ZDUFVzRXhlY3V0aW5nRFAyc187IH0KCiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAvLyBNdXRhdG9yczoKICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICB2b2lkIHNldFByb2Jlc0F0QnVzaWVzdFN0cmVhbShjb25zdCBDb3N0U2NhbGFyICYgcmMpCiAgICAgIHsgcHJvYmVzQXRCdXNpZXN0U3RyZWFtXyA9IHJjO30KICB2b2lkIHNldEhpZ2hlc3RMZWFkaW5nUGFydGl0aW9uQ29sdW1uQ292ZXJlZChMbmczMiBobHBjYykKICB7ICBoaWdoZXN0TGVhZGluZ1BhcnRpdGlvbkNvbHVtbkNvdmVyZWRfID0gaGxwY2M7IH0KCiAgdm9pZCAgc2V0UmVwZWF0Q291bnRGb3JPcGVyYXRvcnNJbkRQMihjb25zdCBDb3N0U2NhbGFyICYgcmMpCiAgeyAgcmVwZWF0Q291bnRGb3JPcGVyYXRvcnNJbkRQMl8gPSByYzsgfQoKICB2b2lkIHNldFJlcGVhdENvdW50U3RhdGUoY29uc3QgcmVwZWF0Q291bnRTVEFURSBycykKICB7IHJDb3VudFN0YXRlPXJzO30KICAKICByZXBlYXRDb3VudFNUQVRFIGdldFJlcGVhdENvdW50U3RhdGUoKQogIHsgcmV0dXJuIHJDb3VudFN0YXRlO30KCiAgdm9pZCAgc2V0Q291bnRPZkNQVXNFeGVjdXRpbmdEUDJzKExuZzMyIGNvdW50Q3B1cykKICB7IGNvdW50T2ZDUFVzRXhlY3V0aW5nRFAyc18gPSBjb3VudENwdXM7IH0KCgpwcml2YXRlOgogIExuZzMyIGhpZ2hlc3RMZWFkaW5nUGFydGl0aW9uQ29sdW1uQ292ZXJlZF87CiAgQ29zdFNjYWxhciByZXBlYXRDb3VudEZvck9wZXJhdG9yc0luRFAyXzsKICBMbmczMiBjb3VudE9mQ1BVc0V4ZWN1dGluZ0RQMnNfOwogIENvc3RTY2FsYXIgcHJvYmVzQXRCdXNpZXN0U3RyZWFtXzsKICByZXBlYXRDb3VudFNUQVRFIHJDb3VudFN0YXRlOwoKfTsKCgoKI2VuZGlmIC8qIENPU1RfSERSICovCg==