FHIR IG analytics| Package | cms.fhir.mct |
| Resource Type | Library |
| Id | Library-MATGlobalCommonFunctionsQICore4.json |
| FHIR Version | R4 |
No resources found
No resources found
Note: links and images are rebased to the (stated) source
| Id: | MATGlobalCommonFunctionsQICore4 | ||
|---|---|---|---|
| Url: | MAT Global Common Functions QICore4 | ||
| Version: | 0.1.0 | ||
| Name: | MATGlobalCommonFunctionsQICore4 | ||
| Title: | MAT Global Common Functions QICore4 | ||
| Status: | draft | ||
| Type: |
system: http://terminology.hl7.org/CodeSystem/library-type code: logic-library |
||
| Date: | 2026-02-27 18:11:00+0000 | ||
| Publisher: | HL7 International - [Some] Work Group | ||
| Jurisdiction: | US | ||
|
|||
{
"resourceType": "Library",
"id": "MATGlobalCommonFunctionsQICore4",
"text": {
"status": "extensions",
"div": "<!-- snip (see above) -->"
},
"extension": [
{
"url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-softwaresystem",
"valueReference": {
"reference": "Device/cqf-tooling"
}
}
],
"url": "http://cms.gov/fhir/mct/Library/MATGlobalCommonFunctionsQICore4",
"version": "0.1.0",
"name": "MATGlobalCommonFunctionsQICore4",
"title": "MAT Global Common Functions QICore4",
"status": "draft",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/library-type",
"code": "logic-library"
}
]
},
"date": "2026-02-27T18:11:00+00:00",
"publisher": "HL7 International - [Some] Work Group",
"contact": [
{
"telecom": [
{
"system": "url",
"value": "http://hl7.org/Special/committees/[something]"
}
]
}
],
"jurisdiction": [
{
"coding": [
{
"system": "urn:iso:std:iso:3166",
"code": "US"
}
]
}
],
"content": [
{
"contentType": "text/cql",
"data": "LyoNCkB1cGRhdGU6IEJUUiAyMDIwLTAzLTMxIC0+DQpJbmNyZW1lbnRlZCB2ZXJzaW9uIHRvIDUuMC4wMDANClVwZGF0ZWQgRkhJUiB2ZXJzaW9uIHRvIDQuMC4xDQpDaGFuZ2VkIHRpbWV6b25lIGtleXdvcmQgdG8gdGltZXpvbmVvZmZzZXQgZm9yIHVzZSB3aXRoIENRTCAxLjQNClJlbW92ZWQgTm9ybWFsaXplIE9uc2V0IGluIGZhdm9yIG9mIG1vcmUgZ2VuZXJhbCBOb3JtYWxpemUgSW50ZXJ2YWwNClVwZGF0ZWQgQ29kZVN5c3RlbXMgZm9yIENvbmRpdGlvblZlcmlmaWNhdGlvblN0YXR1c0NvZGVzIGFuZCBSb2xlQ29kZXMNCg0KQHVwZGF0ZTogQlRSIDIwMjEtMDUtMTMgLT4NCkFkZGVkIEFjdGl2ZUNvbmRpdGlvbiBDb2RlcyBhbmQgSW5hY3RpdmUgQ29uZGl0aW9uIENvZGVzIHZhbHVlIHNldHMNCkFkZGVkIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24gdGhyb3VnaG91dA0KRml4ZWQgRURWaXNpdCBub3QgdXNpbmcgTGFzdA0KVXBkYXRlZCBwcmV2YWxlbmNlIHBlcmlvZCB0byB1c2UgYW4gaW5jbHVzaXZlIGJvdW5kYXJ5IGlmIHRoZSBjb25kaXRpb24gaXMgYWN0aXZlDQpBZGRlZCBIYXNTdGFydCwgSGFzRW5kLCBFYXJsaWVzdCwgYW5kIExhdGVzdCBmdW5jdGlvbnMNClJlbW92ZWQgVG9EYXRlIGFuZCBBZ2UgY2FsY3VsYXRpb24gZnVuY3Rpb25zDQoNCkB1cGRhdGU6IEJUUiAyMDIxLTA2LTI1IC0+DQpBZGRlZCBHZXRCYXNlRXh0ZW5zaW9uIG92ZXJsb2FkcyBmb3IgRWxlbWVudA0KDQpAdXBkYXRlOiBCVFIgMjAyMi0wNS0yNCAtPg0KVXBkYXRlIGZvciAyMDIyIEFVIGNvbnRlbnQNClJlZmFjdG9yIHRvIHVzZSBDUUYuRkhJUkNvbW1vbg0KDQpAdXBkYXRlOiBCVFIgMjAyMi0wNi0xNCAtPg0KVXBkYXRlIHRvIHVzZSBRSUNvcmUNClJlbmFtZSBmcm9tIE1BVEdsb2JhbENvbW1vbkZ1bmN0aW9uc0ZISVI0IHRvIE1BVEdsb2JhbENvbW1vbkZ1bmN0aW9uc1FJQ29yZTQNCkFkZGVkIGZsdWVudCBmdW5jdGlvbnMNClJlbW92ZWQgTm9ybWFsaXplIEludGVydmFsDQoqLw0KbGlicmFyeSBNQVRHbG9iYWxDb21tb25GdW5jdGlvbnNRSUNvcmU0IHZlcnNpb24gJzcuMC4wMDAnDQoNCnVzaW5nIFFJQ29yZSB2ZXJzaW9uICc0LjEuMScNCg0KaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMDEzJyBjYWxsZWQgRkhJUkhlbHBlcnMNCmluY2x1ZGUgUUlDb3JlQ29tbW9uIHZlcnNpb24gJzEuMC4wMDAnIGNhbGxlZCBRSUNvcmVDb21tb24NCg0KdmFsdWVzZXQgIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yOTInDQp2YWx1ZXNldCAiRW5jb3VudGVyIElucGF0aWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4zMDcnDQp2YWx1ZXNldCAiSW50ZW5zaXZlIENhcmUgVW5pdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwMjkuMjA2Jw0KdmFsdWVzZXQgIk9ic2VydmF0aW9uIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTExMS4xNDMnDQp2YWx1ZXNldCAiT3V0cGF0aWVudCBTdXJnZXJ5IFNlcnZpY2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTEwLjM4Jw0KdmFsdWVzZXQgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xOTcnDQoNCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4NCiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyMi0wMS0wMVQwMDowMDowMC4wLCBAMjAyMy0wMS0wMVQwMDowMDowMC4wKQ0KDQpjb250ZXh0IFBhdGllbnQNCg0KZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIjoNCiAgW0VuY291bnRlcjogIkVuY291bnRlciBJbnBhdGllbnQiXSBFbmNvdW50ZXJJbnBhdGllbnQNCgkJd2hlcmUgRW5jb3VudGVySW5wYXRpZW50LnN0YXR1cyA9ICdmaW5pc2hlZCcNCgkgICAgYW5kICJMZW5ndGhJbkRheXMiKEVuY291bnRlcklucGF0aWVudC5wZXJpb2QpIDw9IDEyMA0KCQkJYW5kIEVuY291bnRlcklucGF0aWVudC5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiDQoNCi8qDQpAZGVzY3JpcHRpb246IFJldHVybnMgYW4gaW50ZXJ2YWwgb2YgZGF0ZSB2YWx1ZXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGludGVydmFsIG9mIGRhdGUtdGltZSB2YWx1ZXMNCkBjb21tZW50OiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZXJ2YWwgY29uc3RydWN0ZWQgdXNpbmcgdGhlIGBkYXRlIGZyb21gIGV4dHJhY3RvciBvbiB0aGUgc3RhcnQNCmFuZCBlbmQgdmFsdWVzIG9mIHRoZSBpbnB1dCBkYXRlLXRpbWUgaW50ZXJ2YWwuIE5vdGUgdGhhdCB1c2luZyBhIHByZWNpc2lvbiBzcGVjaWZpZXIgc3VjaCBhcyBgZGF5IG9mYA0KYXMgcGFydCBvZiBhIHRpbWluZyBwaHJhc2UgaXMgcHJlZmVycmVkIHRvIGNvbW11bmljYXRlIGludGVudCB0byBwZXJmb3JtIGRheS1sZXZlbCBjb21wYXJpc29uLCBhcyB3ZWxsDQphcyBmb3IgZ2VuZXJhbCByZWFkYWJpbGl0eS4NCiovDQpkZWZpbmUgZnVuY3Rpb24gIlRvRGF0ZUludGVydmFsIihwZXJpb2QgSW50ZXJ2YWw8RGF0ZVRpbWU+KToNCiAgSW50ZXJ2YWxbZGF0ZSBmcm9tIHN0YXJ0IG9mIHBlcmlvZCwgZGF0ZSBmcm9tIGVuZCBvZiBwZXJpb2RdDQoNCi8qDQpDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ2l2ZW4gaW50ZXJ2YWwuDQoqLw0KZGVmaW5lIGZ1bmN0aW9uICJMZW5ndGhJbkRheXMiKFZhbHVlIEludGVydmFsPERhdGVUaW1lPiApOg0KICBkaWZmZXJlbmNlIGluIGRheXMgYmV0d2VlbiBzdGFydCBvZiBWYWx1ZSBhbmQgZW5kIG9mIFZhbHVlDQoNCi8qDQpDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ2l2ZW4gaW50ZXJ2YWwuDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBsZW5ndGhJbkRheXMoVmFsdWUgSW50ZXJ2YWw8RGF0ZVRpbWU+ICk6DQogIGRpZmZlcmVuY2UgaW4gZGF5cyBiZXR3ZWVuIHN0YXJ0IG9mIFZhbHVlIGFuZCBlbmQgb2YgVmFsdWUNCg0KLyoNClJldHVybnMgdGhlIG1vc3QgcmVjZW50IGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0LCBpZiBhbnksIHRoYXQgb2NjdXJzIDEgaG91ciBvciBsZXNzIHByaW9yIHRvIHRoZSBnaXZlbiBlbmNvdW50ZXIuDQoqLw0KZGVmaW5lIGZ1bmN0aW9uICJFRCBWaXNpdCIoVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICBMYXN0KA0KICAgIFtFbmNvdW50ZXI6ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCJdIEVEVmlzaXQNCiAgICAgIHdoZXJlIEVEVmlzaXQuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KICAgICAgICBhbmQgRURWaXNpdC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZA0KICAgICAgc29ydCBieSBlbmQgb2YgcGVyaW9kDQogICAgKQ0KDQovKg0KUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQsIGlmIGFueSwgdGhhdCBvY2N1cnMgMSBob3VyIG9yIGxlc3MgcHJpb3IgdG8gdGhlIGdpdmVuIGVuY291bnRlci4NCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGVkVmlzaXQoVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICBMYXN0KA0KICAgIFtFbmNvdW50ZXI6ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCJdIEVEVmlzaXQNCiAgICAgIHdoZXJlIEVEVmlzaXQuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KICAgICAgICBhbmQgRURWaXNpdC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZA0KICAgICAgc29ydCBieSBlbmQgb2YgcGVyaW9kDQogICAgKQ0KDQovKg0KSG9zcGl0YWxpemF0aW9uIHJldHVybnMgdGhlIHRvdGFsIGludGVydmFsIGZvciBhZG1pc3Npb24gdG8gZGlzY2hhcmdlIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCBvciBmb3IgdGhlIGFkbWlzc2lvbiBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyLg0KKi8NCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWxpemF0aW9uIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogICggIkVEIFZpc2l0IihUaGVFbmNvdW50ZXIpICkgWA0KICAgIHJldHVybg0KICAgICAgICBpZiBYIGlzIG51bGwgdGhlbiBUaGVFbmNvdW50ZXIucGVyaW9kDQogICAgICAgIGVsc2UgSW50ZXJ2YWxbc3RhcnQgb2YgWC5wZXJpb2QsIGVuZCBvZiBUaGVFbmNvdW50ZXIucGVyaW9kKQ0KDQovKg0KSG9zcGl0YWxpemF0aW9uIHJldHVybnMgdGhlIHRvdGFsIGludGVydmFsIGZvciBhZG1pc3Npb24gdG8gZGlzY2hhcmdlIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCBvciBmb3IgdGhlIGFkbWlzc2lvbiBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyLg0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxpemF0aW9uKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgKCAiRUQgVmlzaXQiKFRoZUVuY291bnRlcikgKSBYDQogICAgcmV0dXJuDQogICAgICAgIGlmIFggaXMgbnVsbCB0aGVuIFRoZUVuY291bnRlci5wZXJpb2QNCiAgICAgICAgZWxzZSBJbnRlcnZhbFtzdGFydCBvZiBYLnBlcmlvZCwgZW5kIG9mIFRoZUVuY291bnRlci5wZXJpb2RdDQoNCi8qDQpSZXR1cm5zIGxpc3Qgb2YgYWxsIGxvY2F0aW9ucyB3aXRoaW4gYW4gZW5jb3VudGVyLCBpbmNsdWRpbmcgbG9jYXRpb25zIGZvciBpbW1lZGlhdGVseSBwcmlvciBFRCB2aXNpdC4NCiovDQpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgKCAiRUQgVmlzaXQiKFRoZUVuY291bnRlcikgKSBFREVuY291bnRlcg0KICAgIHJldHVybg0KICAgICAgICBpZiBFREVuY291bnRlciBpcyBudWxsIHRoZW4gVGhlRW5jb3VudGVyLmxvY2F0aW9uDQogICAgICAgIGVsc2UgZmxhdHRlbiB7IEVERW5jb3VudGVyLmxvY2F0aW9uLCBUaGVFbmNvdW50ZXIubG9jYXRpb24gfQ0KDQovKg0KUmV0dXJucyBsaXN0IG9mIGFsbCBsb2NhdGlvbnMgd2l0aGluIGFuIGVuY291bnRlciwgaW5jbHVkaW5nIGxvY2F0aW9ucyBmb3IgaW1tZWRpYXRlbHkgcHJpb3IgRUQgdmlzaXQuDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25Mb2NhdGlvbnMoVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICAoICJFRCBWaXNpdCIoVGhlRW5jb3VudGVyKSApIEVERW5jb3VudGVyDQogICAgcmV0dXJuDQogICAgICAgIGlmIEVERW5jb3VudGVyIGlzIG51bGwgdGhlbiBUaGVFbmNvdW50ZXIubG9jYXRpb24NCiAgICAgICAgZWxzZSBmbGF0dGVuIHsgRURFbmNvdW50ZXIubG9jYXRpb24sIFRoZUVuY291bnRlci5sb2NhdGlvbiB9DQoNCi8qDQpSZXR1cm5zIHRoZSBsZW5ndGggb2Ygc3RheSBpbiBkYXlzIChpLmUuIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGFkbWlzc2lvbiBhbmQgZGlzY2hhcmdlKSBmb3IgdGhlIGdpdmVuIGVuY291bnRlciwgb3IgZnJvbSB0aGUgYWRtaXNzaW9uIG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBlbmNvdW50ZXINCiovDQpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbiBMZW5ndGggb2YgU3RheSIoVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICBMZW5ndGhJbkRheXMoIkhvc3BpdGFsaXphdGlvbiIoVGhlRW5jb3VudGVyKSkNCg0KLyoNClJldHVybnMgdGhlIGxlbmd0aCBvZiBzdGF5IGluIGRheXMgKGkuZS4gdGhlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gYWRtaXNzaW9uIGFuZCBkaXNjaGFyZ2UpIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCBvciBmcm9tIHRoZSBhZG1pc3Npb24gb2YgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0IHRvIHRoZSBkaXNjaGFyZ2Ugb2YgdGhlIGVuY291bnRlcg0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxpemF0aW9uTGVuZ3RoT2ZTdGF5KFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgTGVuZ3RoSW5EYXlzKCJIb3NwaXRhbGl6YXRpb24iKFRoZUVuY291bnRlcikpDQoNCi8qDQpSZXR1cm5zIGFkbWlzc2lvbiB0aW1lIGZvciBhbiBlbmNvdW50ZXIgb3IgZm9yIGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0Lg0KKi8NCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWwgQWRtaXNzaW9uIFRpbWUiKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgc3RhcnQgb2YgIkhvc3BpdGFsaXphdGlvbiIoVGhlRW5jb3VudGVyKQ0KDQovKg0KUmV0dXJucyBhZG1pc3Npb24gdGltZSBmb3IgYW4gZW5jb3VudGVyIG9yIGZvciBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdC4NCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsQWRtaXNzaW9uVGltZShUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogIHN0YXJ0IG9mICJIb3NwaXRhbGl6YXRpb24iKFRoZUVuY291bnRlcikNCg0KLyoNCkhvc3BpdGFsIERpc2NoYXJnZSBUaW1lIHJldHVybnMgdGhlIGRpc2NoYXJnZSB0aW1lIGZvciBhbiBlbmNvdW50ZXINCiovDQpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsIERpc2NoYXJnZSBUaW1lIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogIGVuZCBvZiBUaGVFbmNvdW50ZXIucGVyaW9kDQoNCi8qDQpIb3NwaXRhbCBEaXNjaGFyZ2UgVGltZSByZXR1cm5zIHRoZSBkaXNjaGFyZ2UgdGltZSBmb3IgYW4gZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbERpc2NoYXJnZVRpbWUoVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICBlbmQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZA0KDQovKg0KUmV0dXJucyBlYXJsaWVzdCBhcnJpdmFsIHRpbWUgZm9yIGFuIGVuY291bnRlciBpbmNsdWRpbmcgYW55IHByaW9yIEVEIHZpc2l0Lg0KKi8NCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWwgQXJyaXZhbCBUaW1lIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogIHN0YXJ0IG9mIEZpcnN0KA0KICAJICAgICggIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uDQogIAkJCXNvcnQgYnkgc3RhcnQgb2YgcGVyaW9kDQogIAkpLnBlcmlvZA0KDQovKg0KUmV0dXJucyBlYXJsaWVzdCBhcnJpdmFsIHRpbWUgZm9yIGFuIGVuY291bnRlciBpbmNsdWRpbmcgYW55IHByaW9yIEVEIHZpc2l0Lg0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxBcnJpdmFsVGltZShUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogIHN0YXJ0IG9mIEZpcnN0KA0KICAJICAgICggIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uDQogIAkJCXNvcnQgYnkgc3RhcnQgb2YgcGVyaW9kDQogIAkpLnBlcmlvZA0KDQovKg0KUmV0dXJucyB0aGUgbGF0ZXN0IGRlcGFydHVyZSB0aW1lIGZvciBlbmNvdW50ZXIgaW5jbHVkaW5nIGFueSBwcmlvciBFRCB2aXNpdC4gDQoqLw0KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbCBEZXBhcnR1cmUgVGltZSIoVGhlRW5jb3VudGVyIEVuY291bnRlcik6DQoJZW5kIG9mIExhc3QoDQoJICAgICggIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uDQoJCQlzb3J0IGJ5IHN0YXJ0IG9mIHBlcmlvZA0KCSkucGVyaW9kDQoNCi8qDQpSZXR1cm5zIHRoZSBsYXRlc3QgZGVwYXJ0dXJlIHRpbWUgZm9yIGVuY291bnRlciBpbmNsdWRpbmcgYW55IHByaW9yIEVEIHZpc2l0LiANCiovDQpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsRGVwYXJ0dXJlVGltZShUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToNCgllbmQgb2YgTGFzdCgNCgkgICAgKCAiSG9zcGl0YWxpemF0aW9uIExvY2F0aW9ucyIoVGhlRW5jb3VudGVyKSApIEhvc3BpdGFsTG9jYXRpb24NCgkJCXNvcnQgYnkgc3RhcnQgb2YgcGVyaW9kDQoJKS5wZXJpb2QNCg0KZGVmaW5lIGZ1bmN0aW9uICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBBcnJpdmFsIFRpbWUiKFRoZUVuY291bnRlciBFbmNvdW50ZXIpOg0KCXN0YXJ0IG9mICgNCgkgICAgc2luZ2xldG9uIGZyb20gKA0KCSAgICAgICAgKCAiSG9zcGl0YWxpemF0aW9uIExvY2F0aW9ucyIoVGhlRW5jb3VudGVyKSApIEhvc3BpdGFsTG9jYXRpb24NCgkJCQl3aGVyZSBHZXRMb2NhdGlvbihIb3NwaXRhbExvY2F0aW9uLmxvY2F0aW9uKS50eXBlIGluICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCINCgkJKQ0KCSkucGVyaW9kDQoNCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZW1lcmdlbmN5RGVwYXJ0bWVudEFycml2YWxUaW1lKFRoZUVuY291bnRlciBFbmNvdW50ZXIpOg0KCXN0YXJ0IG9mICgNCgkgICAgc2luZ2xldG9uIGZyb20gKA0KCSAgICAgICAgKCAiSG9zcGl0YWxpemF0aW9uIExvY2F0aW9ucyIoVGhlRW5jb3VudGVyKSApIEhvc3BpdGFsTG9jYXRpb24NCgkJCQl3aGVyZSBHZXRMb2NhdGlvbihIb3NwaXRhbExvY2F0aW9uLmxvY2F0aW9uKS50eXBlIGluICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCINCgkJKQ0KCSkucGVyaW9kDQoNCi8qDQpIb3NwaXRhbGl6YXRpb24gd2l0aCBPYnNlcnZhdGlvbiBhbmQgT3V0cGF0aWVudCBTdXJnZXJ5IFNlcnZpY2UgcmV0dXJucyB0aGUgdG90YWwgaW50ZXJ2YWwgZnJvbSB0aGUgc3RhcnQgb2YgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0LCBvdXRwYXRpZW50IHN1cmdlcnkgdmlzaXQgb3Igb2JzZXJ2YXRpb24gdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyLg0KKi8NCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlIihUaGVFbmNvdW50ZXIgIkVuY291bnRlciIgKToNCiAgVGhlRW5jb3VudGVyIFZpc2l0DQoJICBsZXQgT2JzVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIk9ic2VydmF0aW9uIFNlcnZpY2VzIl0gTGFzdE9icw0KCQkgIAl3aGVyZSBMYXN0T2JzLnN0YXR1cyA9ICdmaW5pc2hlZCcNCiAgICAgICAgICBhbmQgTGFzdE9icy5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVmlzaXQucGVyaW9kDQoJCQkgIHNvcnQgYnkJZW5kIG9mIHBlcmlvZA0KICAgIAkpLA0KICAgIAlWaXNpdFN0YXJ0OiBDb2FsZXNjZShzdGFydCBvZiBPYnNWaXNpdC5wZXJpb2QsIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZCksDQogICAgCUVEVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0Il0gTGFzdEVEDQoJCQkgIHdoZXJlIExhc3RFRC5zdGF0dXMgPSAnZmluaXNoZWQnDQogICAgICAgICAgYW5kIExhc3RFRC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgVmlzaXRTdGFydA0KCQkJICBzb3J0IGJ5CWVuZCBvZiBwZXJpb2QNCiAgICAJKSwNCiAgICAJVmlzaXRTdGFydFdpdGhFRDogQ29hbGVzY2Uoc3RhcnQgb2YgRURWaXNpdC5wZXJpb2QsIFZpc2l0U3RhcnQpLA0KICAgIAlPdXRwYXRpZW50U3VyZ2VyeVZpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IFN1cmdlcnkgU2VydmljZSJdIExhc3RTdXJnZXJ5T1ANCgkJCSAgd2hlcmUgTGFzdFN1cmdlcnlPUC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgVmlzaXRTdGFydFdpdGhFRA0KCQkJICBzb3J0IGJ5CWVuZCBvZiBwZXJpb2QNCiAgICAJKQ0KICAJcmV0dXJuIEludGVydmFsW0NvYWxlc2NlKHN0YXJ0IG9mIE91dHBhdGllbnRTdXJnZXJ5VmlzaXQucGVyaW9kLCBWaXNpdFN0YXJ0V2l0aEVEKSwgZW5kIG9mIFZpc2l0LnBlcmlvZF0NCg0KLyoNCkhvc3BpdGFsaXphdGlvbiB3aXRoIE9ic2VydmF0aW9uIGFuZCBPdXRwYXRpZW50IFN1cmdlcnkgU2VydmljZSByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQsIG91dHBhdGllbnQgc3VyZ2VyeSB2aXNpdCBvciBvYnNlcnZhdGlvbiB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBnaXZlbiBlbmNvdW50ZXIuDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25BbmRPdXRwYXRpZW50U3VyZ2VyeVNlcnZpY2UoVGhlRW5jb3VudGVyICJFbmNvdW50ZXIiICk6DQogIFRoZUVuY291bnRlciBWaXNpdA0KCSAgbGV0IE9ic1Zpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJPYnNlcnZhdGlvbiBTZXJ2aWNlcyJdIExhc3RPYnMNCgkJICAJd2hlcmUgTGFzdE9icy5zdGF0dXMgPSAnZmluaXNoZWQnDQogICAgICAgICAgYW5kIExhc3RPYnMucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZA0KCQkJICBzb3J0IGJ5CWVuZCBvZiBwZXJpb2QNCiAgICAJKSwNCiAgICAJVmlzaXRTdGFydDogQ29hbGVzY2Uoc3RhcnQgb2YgT2JzVmlzaXQucGVyaW9kLCBzdGFydCBvZiBWaXNpdC5wZXJpb2QpLA0KICAgIAlFRFZpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCJdIExhc3RFRA0KCQkJICB3aGVyZSBMYXN0RUQuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KICAgICAgICAgIGFuZCBMYXN0RUQucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnQNCgkJCSAgc29ydCBieQllbmQgb2YgcGVyaW9kDQogICAgCSksDQogICAgCVZpc2l0U3RhcnRXaXRoRUQ6IENvYWxlc2NlKHN0YXJ0IG9mIEVEVmlzaXQucGVyaW9kLCBWaXNpdFN0YXJ0KSwNCiAgICAJT3V0cGF0aWVudFN1cmdlcnlWaXNpdDogTGFzdChbRW5jb3VudGVyOiAiT3V0cGF0aWVudCBTdXJnZXJ5IFNlcnZpY2UiXSBMYXN0U3VyZ2VyeU9QDQoJCQkgIHdoZXJlIExhc3RTdXJnZXJ5T1AucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnRXaXRoRUQNCgkJCSAgc29ydCBieQllbmQgb2YgcGVyaW9kDQogICAgCSkNCiAgCXJldHVybiBJbnRlcnZhbFtDb2FsZXNjZShzdGFydCBvZiBPdXRwYXRpZW50U3VyZ2VyeVZpc2l0LnBlcmlvZCwgVmlzaXRTdGFydFdpdGhFRCksIGVuZCBvZiBWaXNpdC5wZXJpb2RdDQoNCi8qDQpIb3NwaXRhbGl6YXRpb24gd2l0aCBPYnNlcnZhdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdGhyb3VnaCB0aGUgb2JzZXJ2YXRpb24gdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgVGhlRW5jb3VudGVyIFZpc2l0DQogIAkJbGV0IE9ic1Zpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJPYnNlcnZhdGlvbiBTZXJ2aWNlcyJdIExhc3RPYnMNCiAgCQkJCXdoZXJlIExhc3RPYnMuc3RhdHVzID0gJ2ZpbmlzaGVkJw0KICAgICAgICAgICAgYW5kIExhc3RPYnMucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZA0KICAJCQkJc29ydCBieSBlbmQgb2YgcGVyaW9kDQogIAkJCSksDQogIAkJCVZpc2l0U3RhcnQ6IENvYWxlc2NlKHN0YXJ0IG9mIE9ic1Zpc2l0LnBlcmlvZCwgc3RhcnQgb2YgVmlzaXQucGVyaW9kKSwNCiAgCQkJRURWaXNpdDogTGFzdChbRW5jb3VudGVyOiAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiXSBMYXN0RUQNCiAgCQkJCXdoZXJlIExhc3RFRC5zdGF0dXMgPSAnZmluaXNoZWQnDQogICAgICAgICAgICBhbmQgTGFzdEVELnBlcmlvZCBlbmRzIDEgaG91ciBvciBsZXNzIG9uIG9yIGJlZm9yZSBWaXNpdFN0YXJ0DQogIAkJCQlzb3J0IGJ5IGVuZCBvZiBwZXJpb2QNCiAgCQkJKQ0KICAJCXJldHVybiBJbnRlcnZhbFtDb2FsZXNjZShzdGFydCBvZiBFRFZpc2l0LnBlcmlvZCwgVmlzaXRTdGFydCksIGVuZCBvZiBWaXNpdC5wZXJpb2RdDQoNCi8qDQpIb3NwaXRhbGl6YXRpb24gd2l0aCBPYnNlcnZhdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdGhyb3VnaCB0aGUgb2JzZXJ2YXRpb24gdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oVGhlRW5jb3VudGVyIEVuY291bnRlciApOg0KICBUaGVFbmNvdW50ZXIgVmlzaXQNCiAgCQlsZXQgT2JzVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIk9ic2VydmF0aW9uIFNlcnZpY2VzIl0gTGFzdE9icw0KICAJCQkJd2hlcmUgTGFzdE9icy5zdGF0dXMgPSAnZmluaXNoZWQnDQogICAgICAgICAgICBhbmQgTGFzdE9icy5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVmlzaXQucGVyaW9kDQogIAkJCQlzb3J0IGJ5IGVuZCBvZiBwZXJpb2QNCiAgCQkJKSwNCiAgCQkJVmlzaXRTdGFydDogQ29hbGVzY2Uoc3RhcnQgb2YgT2JzVmlzaXQucGVyaW9kLCBzdGFydCBvZiBWaXNpdC5wZXJpb2QpLA0KICAJCQlFRFZpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCJdIExhc3RFRA0KICAJCQkJd2hlcmUgTGFzdEVELnN0YXR1cyA9ICdmaW5pc2hlZCcNCiAgICAgICAgICAgIGFuZCBMYXN0RUQucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnQNCiAgCQkJCXNvcnQgYnkgZW5kIG9mIHBlcmlvZA0KICAJCQkpDQogIAkJcmV0dXJuIEludGVydmFsW0NvYWxlc2NlKHN0YXJ0IG9mIEVEVmlzaXQucGVyaW9kLCBWaXNpdFN0YXJ0KSwgZW5kIG9mIFZpc2l0LnBlcmlvZF0NCg0KLyoNCkhvc3BpdGFsaXphdGlvbiB3aXRoIE9ic2VydmF0aW9uIExlbmd0aCBvZiBTdGF5IHJldHVybnMgdGhlIGxlbmd0aCBpbiBkYXlzIGZyb20gdGhlIHN0YXJ0IG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCB0aHJvdWdoIHRoZSBvYnNlcnZhdGlvbiB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBnaXZlbiBlbmNvdW50ZXINCiovDQpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkxlbmd0aG9mU3RheSIoVGhlRW5jb3VudGVyICJFbmNvdW50ZXIiICk6DQogICJMZW5ndGhJbkRheXMiKCJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iKFRoZUVuY291bnRlcikpDQoNCi8qDQpIb3NwaXRhbGl6YXRpb24gd2l0aCBPYnNlcnZhdGlvbiBMZW5ndGggb2YgU3RheSByZXR1cm5zIHRoZSBsZW5ndGggaW4gZGF5cyBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdGhyb3VnaCB0aGUgb2JzZXJ2YXRpb24gdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb25MZW5ndGhvZlN0YXkoVGhlRW5jb3VudGVyICJFbmNvdW50ZXIiICk6DQogICJMZW5ndGhJbkRheXMiKCJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iKFRoZUVuY291bnRlcikpDQoNCi8qDQpGaXJzdCBJbnBhdGllbnQgSW50ZW5zaXZlIENhcmUgVW5pdCByZXR1cm5zIHRoZSBmaXJzdCBpbnRlbnNpdmUgY2FyZSB1bml0IGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCB3aXRob3V0IGNvbnNpZGVyaW5nIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdC4NCiovDQpkZWZpbmUgZnVuY3Rpb24gIkZpcnN0SW5wYXRpZW50SW50ZW5zaXZlQ2FyZVVuaXQiKEVuY291bnRlciBFbmNvdW50ZXIgKToNCiAgRmlyc3QoKEVuY291bnRlci5sb2NhdGlvbilIb3NwaXRhbExvY2F0aW9uDQogIAkJCXdoZXJlIEdldExvY2F0aW9uKEhvc3BpdGFsTG9jYXRpb24ubG9jYXRpb24pLnR5cGUgaW4gIkludGVuc2l2ZSBDYXJlIFVuaXQiDQogIAkJCQlhbmQgSG9zcGl0YWxMb2NhdGlvbi5wZXJpb2QgZHVyaW5nIEVuY291bnRlci5wZXJpb2QNCiAgCQkJc29ydCBieSBzdGFydCBvZiBwZXJpb2QNCiAgCSkNCg0KLyoNCkZpcnN0IElucGF0aWVudCBJbnRlbnNpdmUgQ2FyZSBVbml0IHJldHVybnMgdGhlIGZpcnN0IGludGVuc2l2ZSBjYXJlIHVuaXQgZm9yIHRoZSBnaXZlbiBlbmNvdW50ZXIsIHdpdGhvdXQgY29uc2lkZXJpbmcgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0Lg0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZmlyc3RJbnBhdGllbnRJbnRlbnNpdmVDYXJlVW5pdChFbmNvdW50ZXIgRW5jb3VudGVyICk6DQogIEZpcnN0KChFbmNvdW50ZXIubG9jYXRpb24pSG9zcGl0YWxMb2NhdGlvbg0KICAJCQl3aGVyZSBHZXRMb2NhdGlvbihIb3NwaXRhbExvY2F0aW9uLmxvY2F0aW9uKS50eXBlIGluICJJbnRlbnNpdmUgQ2FyZSBVbml0Ig0KICAJCQkJYW5kIEhvc3BpdGFsTG9jYXRpb24ucGVyaW9kIGR1cmluZyBFbmNvdW50ZXIucGVyaW9kDQogIAkJCXNvcnQgYnkgc3RhcnQgb2YgcGVyaW9kDQogIAkpDQoNCi8qDQpSZXR1cm5zIHRoZSBDb25kaXRpb24gcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGRpYWdub3NpcyBlbGVtZW50IG9mIHRoZSBFbmNvdW50ZXINCiovDQpkZWZpbmUgZnVuY3Rpb24gIkVuY291bnRlckRpYWdub3NpcyIoRW5jb3VudGVyIEVuY291bnRlciApOg0KICBFbmNvdW50ZXIuZGlhZ25vc2lzIEQNCglyZXR1cm4gc2luZ2xldG9uIGZyb20gKFtDb25kaXRpb25dIEMgd2hlcmUgQy5pZCA9IEQuY29uZGl0aW9uLnJlZmVyZW5jZS5nZXRJZCgpKQ0KDQovKg0KUmV0dXJucyB0aGUgQ29uZGl0aW9uIHJlc291cmNlcyByZWZlcmVuY2VkIGJ5IHRoZSBkaWFnbm9zaXMgZWxlbWVudCBvZiB0aGUgRW5jb3VudGVyDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlbmNvdW50ZXJEaWFnbm9zaXMoRW5jb3VudGVyIEVuY291bnRlciApOg0KICBFbmNvdW50ZXIuZGlhZ25vc2lzIEQNCiAgICByZXR1cm4gc2luZ2xldG9uIGZyb20gKFtDb25kaXRpb25dIEMgd2hlcmUgQy5pZCA9IEQuY29uZGl0aW9uLnJlZmVyZW5jZS5nZXRJZCgpKQ0KDQovKg0KUmV0dXJucyB0aGUgQ29uZGl0aW9uIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlDQpAZGVwcmVjYXRlZA0KKi8NCmRlZmluZSBmdW5jdGlvbiAiR2V0Q29uZGl0aW9uIihyZWZlcmVuY2UgUmVmZXJlbmNlKToNCiAgc2luZ2xldG9uIGZyb20gKFtDb25kaXRpb25dIEMgd2hlcmUgQy5pZCA9IHJlZmVyZW5jZS5yZWZlcmVuY2UuZ2V0SWQoKSkNCg0KLyoNClJldHVybnMgdGhlIENvbmRpdGlvbiByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIHJlZmVyZW5jZQ0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKHJlZmVyZW5jZSBSZWZlcmVuY2UpOg0KICBzaW5nbGV0b24gZnJvbSAoW0NvbmRpdGlvbl0gQyB3aGVyZSBDLmlkID0gcmVmZXJlbmNlLnJlZmVyZW5jZS5nZXRJZCgpKQ0KDQovKg0KUmV0dXJucyB0aGUgY29uZGl0aW9uIHRoYXQgaXMgc3BlY2lmaWVkIGFzIHRoZSBwcmluY2lwYWwgZGlhZ25vc2lzIGZvciB0aGUgZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZ1bmN0aW9uICJQcmluY2lwYWxEaWFnbm9zaXMiKEVuY291bnRlciBFbmNvdW50ZXIgKToNCglzaW5nbGV0b24gZnJvbSAoKEVuY291bnRlci5kaWFnbm9zaXMgRCB3aGVyZSBELnJhbmsgPSAxKSBQRA0KICAgICAgcmV0dXJuIHNpbmdsZXRvbiBmcm9tIChbQ29uZGl0aW9uXSBDIHdoZXJlIEMuaWQgPSBQRC5jb25kaXRpb24ucmVmZXJlbmNlLmdldElkKCkpDQoJKQ0KDQovKg0KUmV0dXJucyB0aGUgY29uZGl0aW9uIHRoYXQgaXMgc3BlY2lmaWVkIGFzIHRoZSBwcmluY2lwYWwgZGlhZ25vc2lzIGZvciB0aGUgZW5jb3VudGVyDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBwcmluY2lwYWxEaWFnbm9zaXMoRW5jb3VudGVyIEVuY291bnRlciApOg0KCXNpbmdsZXRvbiBmcm9tICgoRW5jb3VudGVyLmRpYWdub3NpcyBEIHdoZXJlIEQucmFuayA9IDEpIFBEDQogICAgICByZXR1cm4gc2luZ2xldG9uIGZyb20gKFtDb25kaXRpb25dIEMgd2hlcmUgQy5pZCA9IFBELmNvbmRpdGlvbi5yZWZlcmVuY2UuZ2V0SWQoKSkNCgkpDQoNCi8qDQpSZXR1cm5zIHRoZSBMb2NhdGlvbiByZXNvdXJjZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHJlZmVyZW5jZQ0KKi8NCmRlZmluZSBmdW5jdGlvbiAiR2V0TG9jYXRpb24iKHJlZmVyZW5jZSBSZWZlcmVuY2UgKToNCiAgc2luZ2xldG9uIGZyb20gKA0KICAgIFtMb2NhdGlvbl0gTCB3aGVyZSBMLmlkID0gcmVmZXJlbmNlLnJlZmVyZW5jZS5nZXRJZCgpDQogICkNCg0KLyoNClJldHVybnMgdGhlIExvY2F0aW9uIHJlc291cmNlIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gcmVmZXJlbmNlDQoqLw0KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBnZXRMb2NhdGlvbihyZWZlcmVuY2UgUmVmZXJlbmNlICk6DQogIHNpbmdsZXRvbiBmcm9tICgNCiAgICBbTG9jYXRpb25dIEwgd2hlcmUgTC5pZCA9IHJlZmVyZW5jZS5yZWZlcmVuY2UuZ2V0SWQoKQ0KICApDQoNCi8qDQpSZXR1cm5zIHRoZSBtZWRpY2F0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBNZWRpY2F0aW9uUmVxdWVzdA0KKi8NCmRlZmluZSBmdW5jdGlvbiAiR2V0TWVkaWNhdGlvbkNvZGUiKHJlcXVlc3QgTWVkaWNhdGlvblJlcXVlc3QgKToNCiAgaWYgcmVxdWVzdC5tZWRpY2F0aW9uIGlzIENvbmNlcHQgdGhlbg0KICAJICByZXF1ZXN0Lm1lZGljYXRpb24gYXMgQ29uY2VwdA0KICAJZWxzZQ0KICAJICAoc2luZ2xldG9uIGZyb20gKFtNZWRpY2F0aW9uXSBNIHdoZXJlIE0uaWQgPSAocmVxdWVzdC5tZWRpY2F0aW9uIGFzIFJlZmVyZW5jZSkucmVmZXJlbmNlLmdldElkKCkpKS5jb2RlDQoNCi8qDQpSZXR1cm5zIHRoZSBtZWRpY2F0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBNZWRpY2F0aW9uUmVxdWVzdA0KKi8NCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZ2V0TWVkaWNhdGlvbkNvZGUocmVxdWVzdCBNZWRpY2F0aW9uUmVxdWVzdCApOg0KICBpZiByZXF1ZXN0Lm1lZGljYXRpb24gaXMgQ29uY2VwdCB0aGVuDQogIAkgIHJlcXVlc3QubWVkaWNhdGlvbiBhcyBDb25jZXB0DQogIAllbHNlDQogIAkgIChzaW5nbGV0b24gZnJvbSAoW01lZGljYXRpb25dIE0gd2hlcmUgTS5pZCA9IChyZXF1ZXN0Lm1lZGljYXRpb24gYXMgUmVmZXJlbmNlKS5yZWZlcmVuY2UuZ2V0SWQoKSkpLmNvZGUNCg0K"
}
]
}