Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build
Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions
| Draft as of 2026-09-19 |
{
"resourceType" : "Library",
"id" : "CMS871FHIRHHHyper",
"text" : {
"status" : "extensions",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n <table class=\"narrative-table\">\n <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n \n \n <tr>\n <th scope=\"row\" class=\"row-header\">CQL Content</th>\n <td>\n <a name=\"cql-content\"> </a>\n <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS871FHIRHHHyper version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\nvalueset "Comfort Measures": 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset "Diabetes": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'\nvalueset "Discharged to Health Care Facility for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'\nvalueset "Discharged to Home for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'\nvalueset "Encounter Inpatient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\nvalueset "Glucose Lab Test Mass Per Volume": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'\nvalueset "Hypoglycemics Treatment Medications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "Comfort Measures Care":\n ( ["Procedure": "Comfort Measures"] ProcedureCM\n where ProcedureCM.status = 'completed'\n )\n union ( ["ServiceRequest": "Comfort Measures"] ServiceReq\n where ServiceReq.status in { 'active', 'completed' }\n )\n\ndefine "Days in Hospitalization":\n "Measurement Population" EligibleInpatientHospitalization\n let period: EligibleInpatientHospitalization.hospitalizationWithObservation ( ),\n relevantPeriod: period.hospitalDaysMax10 ( )\n return Tuple {\n encounter: EligibleInpatientHospitalization,\n hospitalizationPeriod: period,\n relevantPeriod: relevantPeriod,\n relevantDays: relevantPeriod.daysInPeriod ( )\n }\n\ndefine "Days with Glucose Results":\n "Days in Hospitalization" InpatientHospitalDays\n return Tuple {\n encounter: InpatientHospitalDays.encounter,\n relevantPeriod: InpatientHospitalDays.relevantPeriod,\n relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay\n return Tuple {\n dayNumber: EncounterDay.dayIndex,\n dayPeriod: EncounterDay.dayPeriod,\n hasSevereResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest\n where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n and GlucoseTest.value > 300 'mg/dL'\n and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n ),\n hasElevatedResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest\n where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n and GlucoseTest.value >= 200 'mg/dL'\n and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n ),\n hasNoGlucoseTest: not exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest\n where GlucoseTest.status in { 'final', 'amended', 'corrected' }\n and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod\n )\n }\n )\n }\n\ndefine "Days with Hyperglycemic Events":\n "Days with Glucose Results" EncounterWithResultDays\n let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay\n where EncounterDay.dayNumber > 1\n return Tuple {\n dayIndex: EncounterDay.dayNumber,\n dayPeriod: EncounterDay.dayPeriod,\n hasHyperglycemicEvent: ( EncounterDay.hasSevereResult\n or ( EncounterDay.hasNoGlucoseTest\n and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult\n and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult\n )\n )\n }\n return Tuple {\n encounter: EncounterWithResultDays.encounter,\n relevantPeriod: EncounterWithResultDays.relevantPeriod,\n eligibleEventDays: eligibleEventDays\n }\n\ndefine "Denominator":\n "Initial Population"\n\ndefine "Denominator Exclusions":\n "Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"\n\ndefine "Encounter with Comfort Measures during Hospitalization":\n "Initial Population" InpatientHospitalization\n with "Comfort Measures Care" ComfortCare\n such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) starts during InpatientHospitalization.hospitalizationWithObservation ( )\n\ndefine "Encounter with Discharge for Hospice Care":\n "Initial Population" InpatientHospitalization\n where InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Home for Hospice Care"\n or InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Health Care Facility for Hospice Care"\n\ndefine "Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care":\n "Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start"\n union "Encounter with Comfort Measures during Hospitalization"\n union "Encounter with Discharge for Hospice Care"\n\ndefine "Encounter with Elevated Glucose Greater Than or Equal to 200":\n "Encounter with Hospitalization Period" Hospitalization\n with ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest\n such that GlucoseTest.effective.earliest ( ) during Hospitalization.hospitalizationPeriod\n and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n and GlucoseTest.value >= 200 'mg/dL'\n return Hospitalization.encounter\n\ndefine "Encounter with Existing Diabetes Diagnosis":\n "Encounter with Hospitalization Period" Hospitalization\n with ( ( [ConditionEncounterDiagnosis: "Diabetes"] DiabetesEncounter\n where ( Hospitalization.encounter.reasonReference.references ( DiabetesEncounter )\n or Hospitalization.encounter.reasonCode in "Diabetes"\n )\n and DiabetesEncounter.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod\n )\n union ( [ConditionProblemsHealthConcerns: "Diabetes"] DiabetesProblem\n where DiabetesProblem.verificationStatus is not null implies ( DiabetesProblem.verificationStatus ~ Status."confirmed"\n or DiabetesProblem.verificationStatus ~ Status."unconfirmed"\n or DiabetesProblem.verificationStatus ~ Status."provisional"\n or DiabetesProblem.verificationStatus ~ Status."differential"\n )\n and DiabetesProblem.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod\n ) ) DiabetesCondition\n such that DiabetesCondition.subject.reference = Hospitalization.encounter.subject.reference\n return Hospitalization.encounter\n\ndefine "Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":\n from\n "Initial Population" InpatientHospitalization,\n "Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" EarlyGlucoseResult\n where EarlyGlucoseResult.value as Quantity > 600 'mg/dL'\n and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }\n and EarlyGlucoseResult.effective.earliest ( ) during Interval[( start of InpatientHospitalization.hospitalizationWithObservation ( ) - 1 hour ), ( start of InpatientHospitalization.hospitalizationWithObservation ( ) + 6 hours )]\n return InpatientHospitalization\n\ndefine "Encounter with Hospitalization Period":\n "Qualifying Encounter" QualifyingHospitalization\n return Tuple {\n encounter: QualifyingHospitalization,\n hospitalizationPeriod: QualifyingHospitalization.hospitalizationWithObservation ( )\n }\n\ndefine "Encounter with Hyperglycemic Events":\n "Days with Hyperglycemic Events" HyperglycemicEventDays\n where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay\n where EligibleEventDay.hasHyperglycemicEvent\n )\n return HyperglycemicEventDays.encounter\n\ndefine "Encounter with Hypoglycemic Medication":\n from\n "Encounter with Hospitalization Period" Hospitalization,\n ["MedicationAdministration": "Hypoglycemics Treatment Medications"] HypoglycemicMed\n where HypoglycemicMed.status in { 'completed', 'in-progress' }\n and HypoglycemicMed.effective.toInterval ( ) during Hospitalization.hospitalizationPeriod\n return Hospitalization.encounter\n\ndefine "Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":\n from\n "Initial Population" InpatientHospitalization,\n ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest\n let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),\n GlucoseTestTime: GlucoseTest.effective.earliest ( )\n where GlucoseTest.value as Quantity > 600 'mg/dL'\n and GlucoseTest.status in { 'final', 'amended', 'corrected' }\n and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]\n return GlucoseTest\n\ndefine "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":\n from\n "Initial Population" InpatientHospitalization,\n "Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600,\n ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] EarlierGlucoseTest\n let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),\n GlucoseTest600Time: GlucoseResult600.effective.earliest ( ),\n EarlierGlucoseTestTime: EarlierGlucoseTest.effective.earliest ( )\n where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]\n and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )\n and EarlierGlucoseTest.id !~ GlucoseResult600.id\n return GlucoseResult600\n\ndefine "Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":\n "Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600\n where not ( GlucoseResult600.id in "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start".id )\n\ndefine "Initial Population":\n "Encounter with Existing Diabetes Diagnosis"\n union "Encounter with Hypoglycemic Medication"\n union "Encounter with Elevated Glucose Greater Than or Equal to 200"\n\ndefine "Measurement Population":\n "Denominator"\n\ndefine "Numerator":\n "Encounter with Hyperglycemic Events"\n\ndefine "Numerator Exclusions":\n "Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"\n\ndefine "Qualifying Encounter":\n ["Encounter": "Encounter Inpatient"] InpatientEncounter\n where AgeInYearsAt(date from start of InpatientEncounter.period) >= 18\n and InpatientEncounter.period ends during day of "Measurement Period"\n and InpatientEncounter.status = 'finished'\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"\n\ndefine fluent function hospitalDaysMax10(Period Interval<DateTime>):\n Interval[start of Period, Min({ \n end of Period, start of Period + 10 days }\n )]\n\ndefine function "Denominator Observations"(QualifyingEncounter Encounter):\n if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays\n where EncounterWithEventDays.encounter = QualifyingEncounter\n return 0\n ) \n else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays\n where EncounterWithEventDays.encounter = QualifyingEncounter\n return Count(EncounterWithEventDays.eligibleEventDays)\n )\n\ndefine function "Numerator Observations"(QualifyingEncounter Encounter):\n if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays\n where EncounterWithEventDays.encounter = QualifyingEncounter\n return 0\n ) \n else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays\n where EncounterWithEventDays.encounter = QualifyingEncounter\n return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay\n where EligibleEventDay.hasHyperglycemicEvent\n )\n )</code></pre>\n </td>\n </tr>\n \n \n\n\n\n<tr>\n <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n </tbody>\n </table>\n</div>"
},
"extension" : [
{
"url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
"valueReference" : {
"reference" : "Device/cqf-tooling"
}
}
],
"url" : "https://madie.cms.gov/Library/CMS871FHIRHHHyper",
"version" : "1.1.000",
"name" : "CMS871FHIRHHHyper",
"status" : "draft",
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2026-09-19T16:31:14+00:00",
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4NzFGSElSSEhIeXBlciB2ZXJzaW9uICcxLjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCgp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnCnZhbHVlc2V0ICJEaWFiZXRlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDMuMTIuMTAwMScKdmFsdWVzZXQgIkRpc2NoYXJnZWQgdG8gSGVhbHRoIENhcmUgRmFjaWxpdHkgZm9yIEhvc3BpY2UgQ2FyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA3Jwp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3Jwp2YWx1ZXNldCAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM0Jwp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIjoKICAoIFsiUHJvY2VkdXJlIjogIkNvbWZvcnQgTWVhc3VyZXMiXSBQcm9jZWR1cmVDTQogICAgICB3aGVyZSBQcm9jZWR1cmVDTS5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKICAgIHVuaW9uICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJDb21mb3J0IE1lYXN1cmVzIl0gU2VydmljZVJlcQogICAgICAgIHdoZXJlIFNlcnZpY2VSZXEuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICkKCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOgogICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbgogICAgbGV0IHBlcmlvZDogRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIHJlbGV2YW50UGVyaW9kOiBwZXJpb2QuaG9zcGl0YWxEYXlzTWF4MTAgKCApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVsaWdpYmxlSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IHBlcmlvZCwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLAogICAgICByZWxldmFudERheXM6IHJlbGV2YW50UGVyaW9kLmRheXNJblBlcmlvZCAoICkKICAgIH0KCmRlZmluZSAiRGF5cyB3aXRoIEdsdWNvc2UgUmVzdWx0cyI6CiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcjogSW5wYXRpZW50SG9zcGl0YWxEYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwKICAgICAgcmVsZXZhbnREYXlzOiAoIElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgICAgICByZXR1cm4gVHVwbGUgewogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlJbmRleCwKICAgICAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIHdoZXJlIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPiAzMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNFbGV2YXRlZFJlc3VsdDogZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+PSAyMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNOb0dsdWNvc2VUZXN0OiBub3QgZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kCiAgICAgICAgICAgICkKICAgICAgICAgIH0KICAgICAgKQogICAgfQoKZGVmaW5lICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiOgogICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cwogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgIHdoZXJlIEVuY291bnRlckRheS5kYXlOdW1iZXIgPiAxCiAgICAgIHJldHVybiBUdXBsZSB7CiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsCiAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgIGhhc0h5cGVyZ2x5Y2VtaWNFdmVudDogKCBFbmNvdW50ZXJEYXkuaGFzU2V2ZXJlUmVzdWx0CiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDJdLmhhc0VsZXZhdGVkUmVzdWx0CiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAzXS5oYXNFbGV2YXRlZFJlc3VsdAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICB9CiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLnJlbGV2YW50UGVyaW9kLAogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMKICAgIH0KCmRlZmluZSAiRGVub21pbmF0b3IiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSIgQ29tZm9ydENhcmUKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIERpc2NoYXJnZSBmb3IgSG9zcGljZSBDYXJlIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIgogICAgICBvciBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uLmRpc2NoYXJnZURpc3Bvc2l0aW9uIGluICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoKICAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IgogICAgdW5pb24gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggRWxldmF0ZWQgR2x1Y29zZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgdG8gMjAwIjoKICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgc3VjaCB0aGF0IEdsdWNvc2VUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICAgICBhbmQgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOgogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggKCAoIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJEaWFiZXRlcyJdIERpYWJldGVzRW5jb3VudGVyCiAgICAgICAgd2hlcmUgKCBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvblJlZmVyZW5jZS5yZWZlcmVuY2VzICggRGlhYmV0ZXNFbmNvdW50ZXIgKQogICAgICAgICAgICBvciBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIkRpYWJldGVzIgogICAgICAgICkKICAgICAgICAgIGFuZCBEaWFiZXRlc0VuY291bnRlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICkKICAgICAgdW5pb24gKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkRpYWJldGVzIl0gRGlhYmV0ZXNQcm9ibGVtCiAgICAgICAgICB3aGVyZSBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4idW5jb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4icHJvdmlzaW9uYWwiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgRGlhYmV0ZXNQcm9ibGVtLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgICApICkgRGlhYmV0ZXNDb25kaXRpb24KICAgICAgc3VjaCB0aGF0IERpYWJldGVzQ29uZGl0aW9uLnN1YmplY3QucmVmZXJlbmNlID0gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlci5zdWJqZWN0LnJlZmVyZW5jZQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiIEVhcmx5R2x1Y29zZVJlc3VsdAogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcKICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApIC0gMSBob3VyICksICggc3RhcnQgb2YgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA2IGhvdXJzICldCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVyOiBRdWFsaWZ5aW5nSG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgfQoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyI6CiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cwogICAgd2hlcmUgZXhpc3RzICggSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cyBFbGlnaWJsZUV2ZW50RGF5CiAgICAgICAgd2hlcmUgRWxpZ2libGVFdmVudERheS5oYXNIeXBlcmdseWNlbWljRXZlbnQKICAgICkKICAgIHJldHVybiBIeXBlcmdseWNlbWljRXZlbnREYXlzLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6CiAgZnJvbQogICAgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiIEhvc3BpdGFsaXphdGlvbiwKICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkCiAgICB3aGVyZSBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICBhbmQgSHlwb2dseWNlbWljTWVkLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3RUaW1lOiBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApCiAgICB3aGVyZSBHbHVjb3NlVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDYwMCAnbWcvZEwnCiAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQogICAgcmV0dXJuIEdsdWNvc2VUZXN0CgpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgZnJvbQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gRWFybGllckdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBHbHVjb3NlUmVzdWx0NjAwLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBFYXJsaWVyR2x1Y29zZVRlc3RUaW1lOiBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgd2hlcmUgR2x1Y29zZVRlc3Q2MDBUaW1lIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsIC0gMSBob3VyICksICggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgKyA2IGhvdXIgKV0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkKICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdC5pZCAhfiBHbHVjb3NlUmVzdWx0NjAwLmlkCiAgICByZXR1cm4gR2x1Y29zZVJlc3VsdDYwMAoKZGVmaW5lICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMAogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApCgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBFbGV2YXRlZCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB0byAyMDAiCgpkZWZpbmUgIk1lYXN1cmVtZW50IFBvcHVsYXRpb24iOgogICJEZW5vbWluYXRvciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiCgpkZWZpbmUgIk51bWVyYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIjoKICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbERheXNNYXgxMChQZXJpb2QgSW50ZXJ2YWw8RGF0ZVRpbWU+KToKICBJbnRlcnZhbFtzdGFydCBvZiBQZXJpb2QsIE1pbih7IAogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9CiAgKV0KCmRlZmluZSBmdW5jdGlvbiAiRGVub21pbmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgaWYgUXVhbGlmeWluZ0VuY291bnRlci5pZCBpbiAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyIuaWQgdGhlbiBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiAwCiAgKSAKICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcgogICAgICByZXR1cm4gQ291bnQoRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cykKICApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cwogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgcmV0dXJuIDAKICApIAogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzIEVsaWdpYmxlRXZlbnREYXkKICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50CiAgICAgICkKICAp",
"url" : "https://madie.cms.gov/Library-CMS871FHIRHHHyper.cql"
}
]
}