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

: CMS108FHIRVTEProphylaxis - JSON Representation

Active as of 2025-08-25

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS108FHIRVTEProphylaxis",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
    ]
  },
  "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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n\n<td class=\"content-container\">CMS108FHIRVTEProphylaxis</td>\n\n\n</tr>\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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Identifier</th>\n\n\n\n<td class=\"content-container\">CMS108FHIRVTEProphylaxis</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<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">FHIR\n</td>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Topic</th>\n\n\n\n<td class=\"content-container\">CQL\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Steward (Publisher)</th>\n\n\n\n<td class=\"content-container\">The Joint Commission</td>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Description</th>\n\n\n\n<td class=\"content-container\"><div><p>CMS108FHIRVTEProphylaxis</p>\n</div></td>\n\n\n</tr>\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 CMS108FHIRVTEProphylaxis 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 USCommon\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 TJCOverall version '9.1.000' called TJC\ninclude VTE version '9.1.000' called VTE\n\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\n\ncode &quot;Risk for venous thromboembolism&quot;: '72136-5' from &quot;LOINC&quot; display 'Risk for venous thromboembolism'\n\nvalueset &quot;Application of Graduated Compression Stockings&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.66'\nvalueset &quot;Application of Intermittent Pneumatic Compression Devices&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.65'\nvalueset &quot;Application of Venous Foot Pumps&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.64'\nvalueset &quot;Atrial Fibrillation or Flutter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.202'\nvalueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset &quot;Direct Thrombin Inhibitor&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.205'\nvalueset &quot;General or Neuraxial Anesthesia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.1743'\nvalueset &quot;General Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.255'\nvalueset &quot;Glycoprotein IIb IIIa Inhibitors&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.41'\nvalueset &quot;Graduated compression stockings&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.256'\nvalueset &quot;Gynecological Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.257'\nvalueset &quot;Hemorrhagic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.212'\nvalueset &quot;Ischemic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.247'\nvalueset &quot;Hip Fracture Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.258'\nvalueset &quot;Hip Replacement Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.259'\nvalueset &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.211'\nvalueset &quot;INR&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.213'\nvalueset &quot;Intensive Care Unit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1029.206'\nvalueset &quot;Intermittent pneumatic compression devices&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.214'\nvalueset &quot;Intracranial Neurosurgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.260'\nvalueset &quot;Intravenous route&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.222'\nvalueset &quot;Knee Replacement Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.261'\nvalueset &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.39'\nvalueset &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.219'\nvalueset &quot;Low Risk&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.400'\nvalueset &quot;Medical Reason For Not Providing Treatment&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.473'\nvalueset &quot;Mental Health Diagnoses&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.105.12.1004'\nvalueset &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.134'\nvalueset &quot;Patient Refusal&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.93'\nvalueset &quot;Rivaroxaban for VTE Prophylaxis&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.50'\nvalueset &quot;Subcutaneous route&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.223'\nvalueset &quot;Unfractionated Heparin&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.218'\nvalueset &quot;Urological Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.272'\nvalueset &quot;Venous foot pumps&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.230'\nvalueset &quot;Venous Thromboembolism&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.279'\nvalueset &quot;Warfarin&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.232'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine &quot;SDE Ethnicity&quot;:\n  SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n  SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n  SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n  SDE.&quot;SDE Sex&quot;\n\ndefine &quot;Initial Population&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot;\n\ndefine &quot;Denominator&quot;:\n  &quot;Initial Population&quot;\n\ndefine &quot;Denominator Exclusions&quot;:\n  &quot;Encounter Less Than 2 Days&quot;\n    union &quot;Encounter With ICU Location Stay 1 Day Or More&quot;\n    union &quot;Encounter With Principal Diagnosis Of Mental Disorder Or Stroke&quot;\n    union &quot;Encounter With Principal Procedure Of Selected Surgery&quot;\n    union &quot;Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission&quot;\n    union &quot;Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure&quot;\n\ndefine &quot;Encounter Less Than 2 Days&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    where QualifyingEncounter.period.lengthInDays ( ) &lt; 2\n\ndefine &quot;Encounter With ICU Location Stay 1 Day Or More&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    where exists ( QualifyingEncounter.location Location\n        where Location.location.getLocation ( ).type in &quot;Intensive Care Unit&quot;\n          and Location.period.lengthInDays ( ) &gt;= 1\n          and Location.period starts on or after start of QualifyingEncounter.period\n          and date from ( start of Location.period ) during ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )\n    )\n\ndefine &quot;Encounter With Principal Diagnosis Of Mental Disorder Or Stroke&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    where QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Mental Health Diagnoses&quot; )\n      or QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Hemorrhagic Stroke&quot; )\n      or QualifyingEncounter.hasPrincipalDiagnosisOf ( &quot;Ischemic Stroke&quot; )\n\ndefine &quot;Encounter With Principal Procedure Of Selected Surgery&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    where QualifyingEncounter.hasPrincipalProcedureOf ( &quot;General Surgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Gynecological Surgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Hip Fracture Surgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Hip Replacement Surgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Intracranial Neurosurgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Knee Replacement Surgery&quot; )\n      or QualifyingEncounter.hasPrincipalProcedureOf ( &quot;Urological Surgery&quot; )\n\ndefine &quot;Intervention Comfort Measures&quot;:\n  ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] InterventionRequest\n      where InterventionRequest.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n        and InterventionRequest.status in { 'active', 'completed' }\n  )\n    union ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] InterventionPerformed\n        where InterventionPerformed.status in { 'completed', 'in-progress' }\n    )\n\ndefine &quot;Encounter With Intervention Comfort Measures On Day Of Or Day After Procedure&quot;:\n  from\n    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n    &quot;Intervention Comfort Measures&quot; ComfortMeasure\n    where AnesthesiaProcedure.status = 'completed'\n      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n      and Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n    return QualifyingEncounter\n\ndefine &quot;Encounter With Intervention Comfort Measures From Day Of Start Of Hospitalization To Day After Admission&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with &quot;Intervention Comfort Measures&quot; ComfortMeasure\n      such that Coalesce(start of ComfortMeasure.performed.toInterval(), ComfortMeasure.authoredOn) during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine &quot;Numerator&quot;:\n  &quot;Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure&quot;\n    union ( &quot;Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure&quot;\n        intersect ( &quot;Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE&quot;\n            union &quot;Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery&quot;\n        )\n    )\n    union &quot;Encounter With Low Risk For VTE Or Anticoagulant Administered&quot;\n    union &quot;Encounter With No VTE Prophylaxis Due To Medical Reason&quot;\n    union &quot;Encounter With No VTE Prophylaxis Due To Patient Refusal&quot;\n\ndefine &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot;:\n  ( [&quot;MedicationAdministration&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;] VTEMedication\n      where VTEMedication.status = 'completed'\n        and VTEMedication.dosage.route in &quot;Subcutaneous route&quot;\n  )\n    union ( [&quot;MedicationAdministration&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;] LMWH\n        where LMWH.status = 'completed'\n    )\n    union ( [&quot;MedicationAdministration&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;] FactorXa\n        where FactorXa.status = 'completed'\n    )\n    union ( [&quot;MedicationAdministration&quot;: &quot;Warfarin&quot;] WarfarinAdm\n        where WarfarinAdm.status = 'completed'\n    )\n    union ( [&quot;MedicationAdministration&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] Rivaroxaban\n        where Rivaroxaban.status = 'completed'\n    )\n    union ( ( [&quot;Procedure&quot;: &quot;Application of Intermittent Pneumatic Compression Devices&quot;]\n        union [&quot;Procedure&quot;: &quot;Application of Venous Foot Pumps&quot;]\n        union [&quot;Procedure&quot;: &quot;Application of Graduated Compression Stockings&quot;] ) DeviceApplied\n        where DeviceApplied.status = 'completed'\n    )\n\ndefine &quot;Encounter With VTE Prophylaxis Received From Day Of Start Of Hospitalization To Day After Admission Or Procedure&quot;:\n  ( from\n      VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n      &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot; VTEProphylaxis\n      where Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n      return QualifyingEncounter\n  )\n    union ( from\n        VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n        [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n        &quot;Pharmacological or Mechanical VTE Prophylaxis Received&quot; VTEProphylaxis\n        where AnesthesiaProcedure.status = 'completed'\n          and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n          and Coalesce(VTEProphylaxis.effective.toInterval(), VTEProphylaxis.performed.toInterval()) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n        return QualifyingEncounter\n    )\n\ndefine &quot;Encounter With Medication Oral Factor Xa Inhibitor Administered On Day Of Or Day After Admission Or Procedure&quot;:\n  ( from\n      VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n      [&quot;MedicationAdministration&quot;: &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;] FactorXaMedication\n      where FactorXaMedication.status = 'completed'\n        and FactorXaMedication.effective.toInterval ( ) starts during day of ( start of QualifyingEncounter.period ).calendarDayOfOrDayAfter ( )\n      return QualifyingEncounter\n  )\n    union ( from\n        VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n        [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n        [&quot;MedicationAdministration&quot;: &quot;Oral Factor Xa Inhibitor for VTE Prophylaxis or VTE Treatment&quot;] FactorXaMedication\n        where FactorXaMedication.status = 'completed'\n          and AnesthesiaProcedure.status = 'completed'\n          and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n          and FactorXaMedication.effective.toInterval ( ) starts during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n        return QualifyingEncounter\n    )\n\ndefine &quot;Encounter With Prior Or Present Diagnosis Of Atrial Fibrillation Or Prior Diagnosis Of VTE&quot;:\n  ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n      with [&quot;ConditionProblemsHealthConcerns&quot;: &quot;Atrial Fibrillation or Flutter&quot;] AtrialFibrillation\n        such that AtrialFibrillation.verificationStatus is not null implies ( AtrialFibrillation.verificationStatus !~ FHIRCommon.&quot;refuted&quot;\n            and AtrialFibrillation.verificationStatus !~ FHIRCommon.&quot;entered-in-error&quot;\n        )\n          and AtrialFibrillation.prevalenceInterval ( ) starts on or before end of QualifyingEncounter.period\n  )\n    union ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n        where QualifyingEncounter.hasEncDiagnosisOf ( &quot;Atrial Fibrillation or Flutter&quot; )\n    )\n    union ( VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n        with [&quot;ConditionProblemsHealthConcerns&quot;: &quot;Venous Thromboembolism&quot;] VTEDiagnosis\n          such that ( VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;inactive&quot;\n              or VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;remission&quot;\n              or VTEDiagnosis.clinicalStatus ~ FHIRCommon.&quot;resolved&quot;\n          )\n            and VTEDiagnosis.verificationStatus is not null implies ( VTEDiagnosis.verificationStatus !~ FHIRCommon.&quot;refuted&quot;\n              and VTEDiagnosis.verificationStatus !~ FHIRCommon.&quot;entered-in-error&quot;\n          )\n            and VTEDiagnosis.prevalenceInterval ( ) before start of QualifyingEncounter.period\n    )\n\ndefine &quot;Encounter With Prior Or Present Procedure Of Hip Or Knee Replacement Surgery&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with ( [&quot;Procedure&quot;: &quot;Hip Replacement Surgery&quot;]\n      union [&quot;Procedure&quot;: &quot;Knee Replacement Surgery&quot;] ) HipKneeProcedure\n      such that HipKneeProcedure.status = 'completed'\n        and HipKneeProcedure.performed.toInterval ( ) starts on or before end of QualifyingEncounter.period\n\ndefine &quot;Encounter With Low Risk For VTE Or Anticoagulant Administered&quot;:\n  &quot;Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission&quot;\n    union &quot;Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure&quot;\n\ndefine &quot;Low Risk Indicator For VTE&quot;:\n  ( [&quot;SimpleObservation&quot;: &quot;Risk for venous thromboembolism&quot;] VTERiskAssessment\n      where VTERiskAssessment.value as FHIR.CodeableConcept in &quot;Low Risk&quot;\n        and VTERiskAssessment.status in { 'final', 'amended', 'corrected' }\n      return {\n        id: VTERiskAssessment.id,\n        LowRiskDatetime: VTERiskAssessment.effective.earliest ( )\n      }\n  )\n    union ( [&quot;LaboratoryResultObservation&quot;: &quot;INR&quot;] INRLabTest\n        where INRLabTest.value as Quantity &gt; 3.0\n          and INRLabTest.status in { 'final', 'amended', 'corrected' }\n        return {\n          id: INRLabTest.id,\n          LowRiskDatetime: INRLabTest.issued\n        }\n    )\n    union ( ( ( [&quot;MedicationAdministration&quot;: &quot;Unfractionated Heparin&quot;] UnfractionatedHeparin\n          where UnfractionatedHeparin.dosage.route in &quot;Intravenous route&quot;\n      )\n        union [&quot;MedicationAdministration&quot;: &quot;Direct Thrombin Inhibitor&quot;]\n        union [&quot;MedicationAdministration&quot;: &quot;Glycoprotein IIb IIIa Inhibitors&quot;] ) AnticoagulantMedication\n        where AnticoagulantMedication.status = 'completed'\n        return {\n          id: AnticoagulantMedication.id,\n          LowRiskDatetime: start of AnticoagulantMedication.effective.toInterval ( )\n        }\n    )\n\ndefine &quot;Low Risk For VTE Or Anticoagulant Administered From Day Of Start Of Hospitalization To Day After Admission&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with &quot;Low Risk Indicator For VTE&quot; LowRiskForVTE\n      such that LowRiskForVTE.LowRiskDatetime during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine &quot;Low Risk For VTE Or Anticoagulant Administered On Day Of Or Day After Procedure&quot;:\n  from\n    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n    &quot;Low Risk Indicator For VTE&quot; LowRiskForVTE\n    where AnesthesiaProcedure.status = 'completed'\n      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n      and LowRiskForVTE.LowRiskDatetime during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n    return QualifyingEncounter\n\ndefine &quot;Encounter With No VTE Prophylaxis Due To Medical Reason&quot;:\n  ( &quot;No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;\n      intersect &quot;No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;\n  )\n    union ( &quot;No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure&quot;\n        intersect &quot;No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure&quot;\n    )\n\ndefine &quot;No VTE Prophylaxis Medication Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication\n      such that NoVTEMedication.medicationStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;\n        and NoVTEMedication.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine &quot;No VTE Prophylaxis Medication Due To Medical Reason On Day Of Or Day After Procedure&quot;:\n  from\n    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n    &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication\n    where NoVTEMedication.medicationStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;\n      and AnesthesiaProcedure.status = 'completed'\n      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n      and NoVTEMedication.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n    return QualifyingEncounter\n\ndefine &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot;:\n  ( ( [MedicationAdministrationNotDone: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]\n      union [MedicationAdministrationNotDone: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]\n      union [MedicationAdministrationNotDone: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]\n      union [MedicationAdministrationNotDone: &quot;Warfarin&quot;]\n      union [MedicationAdministrationNotDone: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) NoMedicationAdm\n      return {\n        id: NoMedicationAdm.id,\n        medicationStatusReason: NoMedicationAdm.statusReason,\n        authoredOn: NoMedicationAdm.recorded()\n      }\n  )\n    union ( ( [&quot;MedicationNotRequested&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]\n        union [&quot;MedicationNotRequested&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]\n        union [&quot;MedicationNotRequested&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]\n        union [&quot;MedicationNotRequested&quot;: &quot;Warfarin&quot;]\n        union [&quot;MedicationNotRequested&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) NoMedicationOrder\n        where NoMedicationOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n          and NoMedicationOrder.status in { 'active', 'completed' }\n        return {\n          id: NoMedicationOrder.id,\n          medicationStatusReason: NoMedicationOrder.reasonCode,\n          authoredOn: NoMedicationOrder.authoredOn\n        }\n    )\n    union ( from\n        ( [&quot;MedicationRequest&quot;: &quot;Low Dose Unfractionated Heparin for VTE Prophylaxis&quot;]\n          union [&quot;MedicationRequest&quot;: &quot;Low Molecular Weight Heparin for VTE Prophylaxis&quot;]\n          union [&quot;MedicationRequest&quot;: &quot;Injectable Factor Xa Inhibitor for VTE Prophylaxis&quot;]\n          union [&quot;MedicationRequest&quot;: &quot;Warfarin&quot;]\n          union [&quot;MedicationRequest&quot;: &quot;Rivaroxaban for VTE Prophylaxis&quot;] ) MedicationOrderReject,\n        [TaskRejected] T\n        where T.focus.references ( MedicationOrderReject )\n          and T.code ~ USQualityCoreCommon.&quot;Fulfill&quot;\n          and MedicationOrderReject.status = 'active'\n        return {\n          id: MedicationOrderReject.id,\n          medicationStatusReason: { T.statusReason },\n          authoredOn: MedicationOrderReject.authoredOn\n        }\n    )\n\ndefine &quot;No Mechanical VTE Prophylaxis Due To Medical Reason From Day Of Start Of Hospitalization To Day After Admission&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice\n      such that NoVTEDevice.requestStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;\n        and NoVTEDevice.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine &quot;No Mechanical VTE Prophylaxis Due To Medical Reason On Day Of Or Day After Procedure&quot;:\n  from\n    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n    &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice\n    where NoVTEDevice.requestStatusReason in &quot;Medical Reason For Not Providing Treatment&quot;\n      and AnesthesiaProcedure.status = 'completed'\n      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n      and NoVTEDevice.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n    return QualifyingEncounter\n\ndefine &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot;:\n  ( ( [ServiceNotRequested: &quot;Venous foot pumps&quot;]\n      union [ServiceNotRequested: &quot;Intermittent pneumatic compression devices&quot;]\n      union [ServiceNotRequested: &quot;Graduated compression stockings&quot;] ) DeviceNotOrder\n      where DeviceNotOrder.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n      return {\n        id: DeviceNotOrder.id,\n        requestStatusReason: DeviceNotOrder.reasonRefused(),\n        authoredOn: DeviceNotOrder.authoredOn\n      }\n  )\n    union ( from\n        ( [ServiceRequest: &quot;Venous foot pumps&quot;]\n          union [ServiceRequest: &quot;Intermittent pneumatic compression devices&quot;]\n          union [ServiceRequest: &quot;Graduated compression stockings&quot;] ) DeviceOrderReject,\n        [TaskRejected] T\n        where DeviceOrderReject.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }\n          and DeviceOrderReject.status = 'active'\n          and T.focus.references ( DeviceOrderReject )\n          and T.code ~ USQualityCoreCommon.&quot;Fulfill&quot;\n        return {\n          id: DeviceOrderReject.id,\n          requestStatusReason: T.statusReason,\n          authoredOn: DeviceOrderReject.authoredOn\n        }\n    )\n    union ( ( [ProcedureNotDone: &quot;Application of Intermittent Pneumatic Compression Devices&quot;]\n        union [ProcedureNotDone: &quot;Application of Venous Foot Pumps&quot;]\n        union [ProcedureNotDone: &quot;Application of Graduated Compression Stockings&quot;] ) DeviceNotApplied\n        return {\n          id: DeviceNotApplied.id,\n          requestStatusReason: DeviceNotApplied.statusReason,\n          authoredOn: DeviceNotApplied.performed\n        }\n    )\n\ndefine &quot;Encounter With No VTE Prophylaxis Due To Patient Refusal&quot;:\n  &quot;No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission&quot;\n    union &quot;No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure&quot;\n\ndefine &quot;No VTE Prophylaxis Due To Patient Refusal From Day Of Start Of Hospitalization To Day After Admission&quot;:\n  VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter\n    with &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot; PatientRefusal\n      such that PatientRefusal.authoredOn during day of QualifyingEncounter.fromDayOfStartOfHospitalizationToDayAfterAdmission ( )\n\ndefine &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot;:\n  ( &quot;No VTE Prophylaxis Medication Administered Or Ordered&quot; NoVTEMedication\n      where exists ( NoVTEMedication.medicationStatusReason MedRsn\n          where MedRsn in &quot;Patient Refusal&quot;\n      )\n  )\n    union ( &quot;No Mechanical VTE Prophylaxis Performed Or Ordered&quot; NoVTEDevice\n        where NoVTEDevice.requestStatusReason in &quot;Patient Refusal&quot;\n    )\n\ndefine &quot;No VTE Prophylaxis Due To Patient Refusal On Day Of Or Day After Procedure&quot;:\n  from\n    VTE.&quot;Encounter With Age Range And Without VTE Diagnosis Or Obstetrical Conditions&quot; QualifyingEncounter,\n    [&quot;Procedure&quot;: &quot;General or Neuraxial Anesthesia&quot;] AnesthesiaProcedure,\n    &quot;No Mechanical Or Pharmacological VTE Prophylaxis Due To Patient Refusal&quot; PatientRefusal\n    where AnesthesiaProcedure.status = 'completed'\n      and AnesthesiaProcedure.performed.toInterval ( ) ends 1 day after day of start of QualifyingEncounter.period\n      and PatientRefusal.authoredOn during day of ( end of AnesthesiaProcedure.performed.toInterval ( ) ).calendarDayOfOrDayAfter ( )\n    return QualifyingEncounter\n\ndefine fluent function &quot;fromDayOfStartOfHospitalizationToDayAfterAdmission&quot;(Encounter Encounter):\n  Interval[date from ( start of Encounter.hospitalizationWithObservation ( ) ), date from ( start of Encounter.period ) + 1 days]</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/CMS108FHIRVTEProphylaxis",
  "identifier" : [
    {
      "use" : "official",
      "system" : "https://madie.cms.gov/login",
      "value" : "CMS108FHIRVTEProphylaxis"
    }
  ],
  "version" : "1.1.000",
  "name" : "CMS108FHIRVTEProphylaxis",
  "title" : "CMS108FHIRVTEProphylaxis",
  "status" : "active",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2025-08-25T14:51:49+00:00",
  "publisher" : "The Joint Commission",
  "description" : "CMS108FHIRVTEProphylaxis",
  "topic" : [
    {
      "text" : "FHIR"
    },
    {
      "text" : "CQL"
    }
  ],
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMDhGSElSVlRFUHJvcGh5bGF4aXMgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvbW1vbgoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFRKQ092ZXJhbGwgdmVyc2lvbiAnOS4xLjAwMCcgY2FsbGVkIFRKQwppbmNsdWRlIFZURSB2ZXJzaW9uICc5LjEuMDAwJyBjYWxsZWQgVlRFCgpjb2Rlc3lzdGVtICJMT0lOQyI6ICdodHRwOi8vbG9pbmMub3JnJwoKY29kZSAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSI6ICc3MjEzNi01JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbScKCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBHcmFkdWF0ZWQgQ29tcHJlc3Npb24gU3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTExMC42NicKdmFsdWVzZXQgIkFwcGxpY2F0aW9uIG9mIEludGVybWl0dGVudCBQbmV1bWF0aWMgQ29tcHJlc3Npb24gRGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjUnCnZhbHVlc2V0ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjQnCnZhbHVlc2V0ICJBdHJpYWwgRmlicmlsbGF0aW9uIG9yIEZsdXR0ZXIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwMicKdmFsdWVzZXQgIkNvbWZvcnQgTWVhc3VyZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzEuMy42LjEuNC4xLjMzODk1LjEuMy4wLjQ1Jwp2YWx1ZXNldCAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA1Jwp2YWx1ZXNldCAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4xNzQzJwp2YWx1ZXNldCAiR2VuZXJhbCBTdXJnZXJ5IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTUnCnZhbHVlc2V0ICJHbHljb3Byb3RlaW4gSUliIElJSWEgSW5oaWJpdG9ycyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEwNDUuNDEnCnZhbHVlc2V0ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNTYnCnZhbHVlc2V0ICJHeW5lY29sb2dpY2FsIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1NycKdmFsdWVzZXQgIkhlbW9ycmhhZ2ljIFN0cm9rZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjEyJwp2YWx1ZXNldCAiSXNjaGVtaWMgU3Ryb2tlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yNDcnCnZhbHVlc2V0ICJIaXAgRnJhY3R1cmUgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjU4Jwp2YWx1ZXNldCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI1OScKdmFsdWVzZXQgIkluamVjdGFibGUgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMTEnCnZhbHVlc2V0ICJJTlIiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxMycKdmFsdWVzZXQgIkludGVuc2l2ZSBDYXJlIFVuaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMDI5LjIwNicKdmFsdWVzZXQgIkludGVybWl0dGVudCBwbmV1bWF0aWMgY29tcHJlc3Npb24gZGV2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE0Jwp2YWx1ZXNldCAiSW50cmFjcmFuaWFsIE5ldXJvc3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYwJwp2YWx1ZXNldCAiSW50cmF2ZW5vdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMicKdmFsdWVzZXQgIktuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjYxJwp2YWx1ZXNldCAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4zOScKdmFsdWVzZXQgIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjE5Jwp2YWx1ZXNldCAiTG93IFJpc2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjQwMCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuNDczJwp2YWx1ZXNldCAiTWVudGFsIEhlYWx0aCBEaWFnbm9zZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTA1LjEyLjEwMDQnCnZhbHVlc2V0ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4xMzQnCnZhbHVlc2V0ICJQYXRpZW50IFJlZnVzYWwiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjkzJwp2YWx1ZXNldCAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNTAnCnZhbHVlc2V0ICJTdWJjdXRhbmVvdXMgcm91dGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIyMycKdmFsdWVzZXQgIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxOCcKdmFsdWVzZXQgIlVyb2xvZ2ljYWwgU3VyZ2VyeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjcyJwp2YWx1ZXNldCAiVmVub3VzIGZvb3QgcHVtcHMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIzMCcKdmFsdWVzZXQgIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI3OScKdmFsdWVzZXQgIldhcmZhcmluIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMzInCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIlNERSBFdGhuaWNpdHkiOgogIFNERS4iU0RFIEV0aG5pY2l0eSIKCmRlZmluZSAiU0RFIFBheWVyIjoKICBTREUuIlNERSBQYXllciIKCmRlZmluZSAiU0RFIFJhY2UiOgogIFNERS4iU0RFIFJhY2UiCgpkZWZpbmUgIlNERSBTZXgiOgogIFNERS4iU0RFIFNleCIKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIExlc3MgVGhhbiAyIERheXMiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggSUNVIExvY2F0aW9uIFN0YXkgMSBEYXkgT3IgTW9yZSIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBQcmluY2lwYWwgRGlhZ25vc2lzIE9mIE1lbnRhbCBEaXNvcmRlciBPciBTdHJva2UiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpbmNpcGFsIFByb2NlZHVyZSBPZiBTZWxlY3RlZCBTdXJnZXJ5IgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJFbmNvdW50ZXIgTGVzcyBUaGFuIDIgRGF5cyI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZC5sZW5ndGhJbkRheXMgKCApIDwgMgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBJQ1UgTG9jYXRpb24gU3RheSAxIERheSBPciBNb3JlIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdoZXJlIGV4aXN0cyAoIFF1YWxpZnlpbmdFbmNvdW50ZXIubG9jYXRpb24gTG9jYXRpb24KICAgICAgICB3aGVyZSBMb2NhdGlvbi5sb2NhdGlvbi5nZXRMb2NhdGlvbiAoICkudHlwZSBpbiAiSW50ZW5zaXZlIENhcmUgVW5pdCIKICAgICAgICAgIGFuZCBMb2NhdGlvbi5wZXJpb2QubGVuZ3RoSW5EYXlzICggKSA+PSAxCiAgICAgICAgICBhbmQgTG9jYXRpb24ucGVyaW9kIHN0YXJ0cyBvbiBvciBhZnRlciBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICAgICAgYW5kIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIExvY2F0aW9uLnBlcmlvZCApIGR1cmluZyAoIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBEaWFnbm9zaXMgT2YgTWVudGFsIERpc29yZGVyIE9yIFN0cm9rZSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbERpYWdub3Npc09mICggIk1lbnRhbCBIZWFsdGggRGlhZ25vc2VzIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSGVtb3JyaGFnaWMgU3Ryb2tlIiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsRGlhZ25vc2lzT2YgKCAiSXNjaGVtaWMgU3Ryb2tlIiApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW5jaXBhbCBQcm9jZWR1cmUgT2YgU2VsZWN0ZWQgU3VyZ2VyeSI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aGVyZSBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkdlbmVyYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkd5bmVjb2xvZ2ljYWwgU3VyZ2VyeSIgKQogICAgICBvciBRdWFsaWZ5aW5nRW5jb3VudGVyLmhhc1ByaW5jaXBhbFByb2NlZHVyZU9mICggIkhpcCBGcmFjdHVyZSBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiSGlwIFJlcGxhY2VtZW50IFN1cmdlcnkiICkKICAgICAgb3IgUXVhbGlmeWluZ0VuY291bnRlci5oYXNQcmluY2lwYWxQcm9jZWR1cmVPZiAoICJJbnRyYWNyYW5pYWwgTmV1cm9zdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5IiApCiAgICAgIG9yIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzUHJpbmNpcGFsUHJvY2VkdXJlT2YgKCAiVXJvbG9naWNhbCBTdXJnZXJ5IiApCgpkZWZpbmUgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIjoKICAoIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdIEludGVydmVudGlvblJlcXVlc3QKICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUmVxdWVzdC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICAgIGFuZCBJbnRlcnZlbnRpb25SZXF1ZXN0LnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJDb21mb3J0IE1lYXN1cmVzIl0gSW50ZXJ2ZW50aW9uUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUGVyZm9ybWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0KICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggSW50ZXJ2ZW50aW9uIENvbWZvcnQgTWVhc3VyZXMgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiOgogIGZyb20KICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgIFsiUHJvY2VkdXJlIjogIkdlbmVyYWwgb3IgTmV1cmF4aWFsIEFuZXN0aGVzaWEiXSBBbmVzdGhlc2lhUHJvY2VkdXJlLAogICAgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgd2hlcmUgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIENvYWxlc2NlKHN0YXJ0IG9mIENvbWZvcnRNZWFzdXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRNZWFzdXJlLmF1dGhvcmVkT24pIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgICBzdWNoIHRoYXQgQ29hbGVzY2Uoc3RhcnQgb2YgQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSwgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbikgZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJOdW1lcmF0b3IiOgogICJFbmNvdW50ZXIgV2l0aCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24gT3IgUHJvY2VkdXJlIgogICAgdW5pb24gKCAiRW5jb3VudGVyIFdpdGggTWVkaWNhdGlvbiBPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgQWRtaW5pc3RlcmVkIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgKCAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBEaWFnbm9zaXMgT2YgQXRyaWFsIEZpYnJpbGxhdGlvbiBPciBQcmlvciBEaWFnbm9zaXMgT2YgVlRFIgogICAgICAgICAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggUHJpb3IgT3IgUHJlc2VudCBQcm9jZWR1cmUgT2YgSGlwIE9yIEtuZWUgUmVwbGFjZW1lbnQgU3VyZ2VyeSIKICAgICAgICApCiAgICApCiAgICB1bmlvbiAiRW5jb3VudGVyIFdpdGggTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCIKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIgogICAgdW5pb24gIkVuY291bnRlciBXaXRoIE5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIgoKZGVmaW5lICJQaGFybWFjb2xvZ2ljYWwgb3IgTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUmVjZWl2ZWQiOgogICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBWVEVNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIFZURU1lZGljYXRpb24uZG9zYWdlLnJvdXRlIGluICJTdWJjdXRhbmVvdXMgcm91dGUiCiAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBMTVdICiAgICAgICAgd2hlcmUgTE1XSC5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgKQogICAgdW5pb24gKCBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdIEZhY3RvclhhCiAgICAgICAgd2hlcmUgRmFjdG9yWGEuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKICAgIHVuaW9uICggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiV2FyZmFyaW4iXSBXYXJmYXJpbkFkbQogICAgICAgIHdoZXJlIFdhcmZhcmluQWRtLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSBSaXZhcm94YWJhbgogICAgICAgIHdoZXJlIFJpdmFyb3hhYmFuLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICApCiAgICB1bmlvbiAoICggWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbIlByb2NlZHVyZSI6ICJBcHBsaWNhdGlvbiBvZiBWZW5vdXMgRm9vdCBQdW1wcyJdCiAgICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiQXBwbGljYXRpb24gb2YgR3JhZHVhdGVkIENvbXByZXNzaW9uIFN0b2NraW5ncyJdICkgRGV2aWNlQXBwbGllZAogICAgICAgIHdoZXJlIERldmljZUFwcGxpZWQuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdpdGggVlRFIFByb3BoeWxheGlzIFJlY2VpdmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIE9yIFByb2NlZHVyZSI6CiAgKCBmcm9tCiAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgd2hlcmUgQ29hbGVzY2UoVlRFUHJvcGh5bGF4aXMuZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSwgVlRFUHJvcGh5bGF4aXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwoKSkgc3RhcnRzIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKICAgICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIKICApCiAgICB1bmlvbiAoIGZyb20KICAgICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAgICAgIlBoYXJtYWNvbG9naWNhbCBvciBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBSZWNlaXZlZCIgVlRFUHJvcGh5bGF4aXMKICAgICAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICAgIGFuZCBDb2FsZXNjZShWVEVQcm9waHlsYXhpcy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpLCBWVEVQcm9waHlsYXhpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIE1lZGljYXRpb24gT3JhbCBGYWN0b3IgWGEgSW5oaWJpdG9yIEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIEFkbWlzc2lvbiBPciBQcm9jZWR1cmUiOgogICggZnJvbQogICAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIk9yYWwgRmFjdG9yIFhhIEluaGliaXRvciBmb3IgVlRFIFByb3BoeWxheGlzIG9yIFZURSBUcmVhdG1lbnQiXSBGYWN0b3JYYU1lZGljYXRpb24KICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEZhY3RvclhhTWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBkYXkgb2YgKCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZCApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgogICkKICAgIHVuaW9uICggZnJvbQogICAgICAgIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwKICAgICAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICAgICBbIk1lZGljYXRpb25BZG1pbmlzdHJhdGlvbiI6ICJPcmFsIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyBvciBWVEUgVHJlYXRtZW50Il0gRmFjdG9yWGFNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgRmFjdG9yWGFNZWRpY2F0aW9uLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgICBhbmQgRmFjdG9yWGFNZWRpY2F0aW9uLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBzdGFydHMgZHVyaW5nIGRheSBvZiAoIGVuZCBvZiBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSApLmNhbGVuZGFyRGF5T2ZPckRheUFmdGVyICggKQogICAgICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgRGlhZ25vc2lzIE9mIEF0cmlhbCBGaWJyaWxsYXRpb24gT3IgUHJpb3IgRGlhZ25vc2lzIE9mIFZURSI6CiAgKCBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgd2l0aCBbIkNvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnMiOiAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIl0gQXRyaWFsRmlicmlsbGF0aW9uCiAgICAgICAgc3VjaCB0aGF0IEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgYW5kIEF0cmlhbEZpYnJpbGxhdGlvbi52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4iZW50ZXJlZC1pbi1lcnJvciIKICAgICAgICApCiAgICAgICAgICBhbmQgQXRyaWFsRmlicmlsbGF0aW9uLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIG9uIG9yIGJlZm9yZSBlbmQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdoZXJlIFF1YWxpZnlpbmdFbmNvdW50ZXIuaGFzRW5jRGlhZ25vc2lzT2YgKCAiQXRyaWFsIEZpYnJpbGxhdGlvbiBvciBGbHV0dGVyIiApCiAgICApCiAgICB1bmlvbiAoIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgICAgIHdpdGggWyJDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zIjogIlZlbm91cyBUaHJvbWJvZW1ib2xpc20iXSBWVEVEaWFnbm9zaXMKICAgICAgICAgIHN1Y2ggdGhhdCAoIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uImluYWN0aXZlIgogICAgICAgICAgICAgIG9yIFZURURpYWdub3Npcy5jbGluaWNhbFN0YXR1cyB+IEZISVJDb21tb24uInJlbWlzc2lvbiIKICAgICAgICAgICAgICBvciBWVEVEaWFnbm9zaXMuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJyZXNvbHZlZCIKICAgICAgICAgICkKICAgICAgICAgICAgYW5kIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgaXMgbm90IG51bGwgaW1wbGllcyAoIFZURURpYWdub3Npcy52ZXJpZmljYXRpb25TdGF0dXMgIX4gRkhJUkNvbW1vbi4icmVmdXRlZCIKICAgICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnZlcmlmaWNhdGlvblN0YXR1cyAhfiBGSElSQ29tbW9uLiJlbnRlcmVkLWluLWVycm9yIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgVlRFRGlhZ25vc2lzLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgYmVmb3JlIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIFByaW9yIE9yIFByZXNlbnQgUHJvY2VkdXJlIE9mIEhpcCBPciBLbmVlIFJlcGxhY2VtZW50IFN1cmdlcnkiOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAoIFsiUHJvY2VkdXJlIjogIkhpcCBSZXBsYWNlbWVudCBTdXJnZXJ5Il0KICAgICAgdW5pb24gWyJQcm9jZWR1cmUiOiAiS25lZSBSZXBsYWNlbWVudCBTdXJnZXJ5Il0gKSBIaXBLbmVlUHJvY2VkdXJlCiAgICAgIHN1Y2ggdGhhdCBIaXBLbmVlUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgICAgYW5kIEhpcEtuZWVQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBvbiBvciBiZWZvcmUgZW5kIG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIExvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQiOgogICJMb3cgUmlzayBGb3IgVlRFIE9yIEFudGljb2FndWxhbnQgQWRtaW5pc3RlcmVkIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgT24gRGF5IE9mIE9yIERheSBBZnRlciBQcm9jZWR1cmUiCgpkZWZpbmUgIkxvdyBSaXNrIEluZGljYXRvciBGb3IgVlRFIjoKICAoIFsiU2ltcGxlT2JzZXJ2YXRpb24iOiAiUmlzayBmb3IgdmVub3VzIHRocm9tYm9lbWJvbGlzbSJdIFZURVJpc2tBc3Nlc3NtZW50CiAgICAgIHdoZXJlIFZURVJpc2tBc3Nlc3NtZW50LnZhbHVlIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluICJMb3cgUmlzayIKICAgICAgICBhbmQgVlRFUmlza0Fzc2Vzc21lbnQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgIHJldHVybiB7CiAgICAgICAgaWQ6IFZURVJpc2tBc3Nlc3NtZW50LmlkLAogICAgICAgIExvd1Jpc2tEYXRldGltZTogVlRFUmlza0Fzc2Vzc21lbnQuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgICB9CiAgKQogICAgdW5pb24gKCBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJJTlIiXSBJTlJMYWJUZXN0CiAgICAgICAgd2hlcmUgSU5STGFiVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDMuMAogICAgICAgICAgYW5kIElOUkxhYlRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBJTlJMYWJUZXN0LmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBJTlJMYWJUZXN0Lmlzc3VlZAogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggKCAoIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIlVuZnJhY3Rpb25hdGVkIEhlcGFyaW4iXSBVbmZyYWN0aW9uYXRlZEhlcGFyaW4KICAgICAgICAgIHdoZXJlIFVuZnJhY3Rpb25hdGVkSGVwYXJpbi5kb3NhZ2Uucm91dGUgaW4gIkludHJhdmVub3VzIHJvdXRlIgogICAgICApCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiRGlyZWN0IFRocm9tYmluIEluaGliaXRvciJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiR2x5Y29wcm90ZWluIElJYiBJSUlhIEluaGliaXRvcnMiXSApIEFudGljb2FndWxhbnRNZWRpY2F0aW9uCiAgICAgICAgd2hlcmUgQW50aWNvYWd1bGFudE1lZGljYXRpb24uc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IEFudGljb2FndWxhbnRNZWRpY2F0aW9uLmlkLAogICAgICAgICAgTG93Umlza0RhdGV0aW1lOiBzdGFydCBvZiBBbnRpY29hZ3VsYW50TWVkaWNhdGlvbi5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkKICAgICAgICB9CiAgICApCgpkZWZpbmUgIkxvdyBSaXNrIEZvciBWVEUgT3IgQW50aWNvYWd1bGFudCBBZG1pbmlzdGVyZWQgRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iOgogIFZURS4iRW5jb3VudGVyIFdpdGggQWdlIFJhbmdlIEFuZCBXaXRob3V0IFZURSBEaWFnbm9zaXMgT3IgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2l0aCAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgICAgc3VjaCB0aGF0IExvd1Jpc2tGb3JWVEUuTG93Umlza0RhdGV0aW1lIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTG93IFJpc2sgRm9yIFZURSBPciBBbnRpY29hZ3VsYW50IEFkbWluaXN0ZXJlZCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTG93IFJpc2sgSW5kaWNhdG9yIEZvciBWVEUiIExvd1Jpc2tGb3JWVEUKICAgIHdoZXJlIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBMb3dSaXNrRm9yVlRFLkxvd1Jpc2tEYXRldGltZSBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIjoKICAoICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBEdWUgVG8gTWVkaWNhbCBSZWFzb24gRnJvbSBEYXkgT2YgU3RhcnQgT2YgSG9zcGl0YWxpemF0aW9uIFRvIERheSBBZnRlciBBZG1pc3Npb24iCiAgICAgIGludGVyc2VjdCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICkKICAgIHVuaW9uICggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICAgICBpbnRlcnNlY3QgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBNZWRpY2FsIFJlYXNvbiBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSIKICAgICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIiBOb1ZURU1lZGljYXRpb24KICAgICAgc3VjaCB0aGF0IE5vVlRFTWVkaWNhdGlvbi5tZWRpY2F0aW9uU3RhdHVzUmVhc29uIGluICJNZWRpY2FsIFJlYXNvbiBGb3IgTm90IFByb3ZpZGluZyBUcmVhdG1lbnQiCiAgICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBWVEUgUHJvcGh5bGF4aXMgTWVkaWNhdGlvbiBBZG1pbmlzdGVyZWQgT3IgT3JkZXJlZCIgTm9WVEVNZWRpY2F0aW9uCiAgICB3aGVyZSBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5zdGF0dXMgPSAnY29tcGxldGVkJwogICAgICBhbmQgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgZW5kcyAxIGRheSBhZnRlciBkYXkgb2Ygc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgYW5kIE5vVlRFTWVkaWNhdGlvbi5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIFZURSBQcm9waHlsYXhpcyBNZWRpY2F0aW9uIEFkbWluaXN0ZXJlZCBPciBPcmRlcmVkIjoKICAoICggW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIkxvdyBNb2xlY3VsYXIgV2VpZ2h0IEhlcGFyaW4gZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgIHVuaW9uIFtNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb25Ob3REb25lOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICB1bmlvbiBbTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uTm90RG9uZTogIldhcmZhcmluIl0KICAgICAgdW5pb24gW01lZGljYXRpb25BZG1pbmlzdHJhdGlvbk5vdERvbmU6ICJSaXZhcm94YWJhbiBmb3IgVlRFIFByb3BoeWxheGlzIl0gKSBOb01lZGljYXRpb25BZG0KICAgICAgcmV0dXJuIHsKICAgICAgICBpZDogTm9NZWRpY2F0aW9uQWRtLmlkLAogICAgICAgIG1lZGljYXRpb25TdGF0dXNSZWFzb246IE5vTWVkaWNhdGlvbkFkbS5zdGF0dXNSZWFzb24sCiAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uQWRtLnJlY29yZGVkKCkKICAgICAgfQogICkKICAgIHVuaW9uICggKCBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IERvc2UgVW5mcmFjdGlvbmF0ZWQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiTG93IE1vbGVjdWxhciBXZWlnaHQgSGVwYXJpbiBmb3IgVlRFIFByb3BoeWxheGlzIl0KICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQiOiAiSW5qZWN0YWJsZSBGYWN0b3IgWGEgSW5oaWJpdG9yIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvbk5vdFJlcXVlc3RlZCI6ICJXYXJmYXJpbiJdCiAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uTm90UmVxdWVzdGVkIjogIlJpdmFyb3hhYmFuIGZvciBWVEUgUHJvcGh5bGF4aXMiXSApIE5vTWVkaWNhdGlvbk9yZGVyCiAgICAgICAgd2hlcmUgTm9NZWRpY2F0aW9uT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBOb01lZGljYXRpb25PcmRlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogTm9NZWRpY2F0aW9uT3JkZXIuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiBOb01lZGljYXRpb25PcmRlci5yZWFzb25Db2RlLAogICAgICAgICAgYXV0aG9yZWRPbjogTm9NZWRpY2F0aW9uT3JkZXIuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKICAgIHVuaW9uICggZnJvbQogICAgICAgICggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgRG9zZSBVbmZyYWN0aW9uYXRlZCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJMb3cgTW9sZWN1bGFyIFdlaWdodCBIZXBhcmluIGZvciBWVEUgUHJvcGh5bGF4aXMiXQogICAgICAgICAgdW5pb24gWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJJbmplY3RhYmxlIEZhY3RvciBYYSBJbmhpYml0b3IgZm9yIFZURSBQcm9waHlsYXhpcyJdCiAgICAgICAgICB1bmlvbiBbIk1lZGljYXRpb25SZXF1ZXN0IjogIldhcmZhcmluIl0KICAgICAgICAgIHVuaW9uIFsiTWVkaWNhdGlvblJlcXVlc3QiOiAiUml2YXJveGFiYW4gZm9yIFZURSBQcm9waHlsYXhpcyJdICkgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LAogICAgICAgIFtUYXNrUmVqZWN0ZWRdIFQKICAgICAgICB3aGVyZSBULmZvY3VzLnJlZmVyZW5jZXMgKCBNZWRpY2F0aW9uT3JkZXJSZWplY3QgKQogICAgICAgICAgYW5kIFQuY29kZSB+IFVTUXVhbGl0eUNvcmVDb21tb24uIkZ1bGZpbGwiCiAgICAgICAgICBhbmQgTWVkaWNhdGlvbk9yZGVyUmVqZWN0LnN0YXR1cyA9ICdhY3RpdmUnCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGlkOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuaWQsCiAgICAgICAgICBtZWRpY2F0aW9uU3RhdHVzUmVhc29uOiB7IFQuc3RhdHVzUmVhc29uIH0sCiAgICAgICAgICBhdXRob3JlZE9uOiBNZWRpY2F0aW9uT3JkZXJSZWplY3QuYXV0aG9yZWRPbgogICAgICAgIH0KICAgICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIjoKICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIiBOb1ZURURldmljZQogICAgICBzdWNoIHRoYXQgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiTWVkaWNhbCBSZWFzb24gRm9yIE5vdCBQcm92aWRpbmcgVHJlYXRtZW50IgogICAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUXVhbGlmeWluZ0VuY291bnRlci5mcm9tRGF5T2ZTdGFydE9mSG9zcGl0YWxpemF0aW9uVG9EYXlBZnRlckFkbWlzc2lvbiAoICkKCmRlZmluZSAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIE1lZGljYWwgUmVhc29uIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIjoKICBmcm9tCiAgICBWVEUuIkVuY291bnRlciBXaXRoIEFnZSBSYW5nZSBBbmQgV2l0aG91dCBWVEUgRGlhZ25vc2lzIE9yIE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsCiAgICBbIlByb2NlZHVyZSI6ICJHZW5lcmFsIG9yIE5ldXJheGlhbCBBbmVzdGhlc2lhIl0gQW5lc3RoZXNpYVByb2NlZHVyZSwKICAgICJObyBNZWNoYW5pY2FsIFZURSBQcm9waHlsYXhpcyBQZXJmb3JtZWQgT3IgT3JkZXJlZCIgTm9WVEVEZXZpY2UKICAgIHdoZXJlIE5vVlRFRGV2aWNlLnJlcXVlc3RTdGF0dXNSZWFzb24gaW4gIk1lZGljYWwgUmVhc29uIEZvciBOb3QgUHJvdmlkaW5nIFRyZWF0bWVudCIKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKICAgICAgYW5kIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIGVuZHMgMSBkYXkgYWZ0ZXIgZGF5IG9mIHN0YXJ0IG9mIFF1YWxpZnlpbmdFbmNvdW50ZXIucGVyaW9kCiAgICAgIGFuZCBOb1ZURURldmljZS5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgKCBlbmQgb2YgQW5lc3RoZXNpYVByb2NlZHVyZS5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgKS5jYWxlbmRhckRheU9mT3JEYXlBZnRlciAoICkKICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyCgpkZWZpbmUgIk5vIE1lY2hhbmljYWwgVlRFIFByb3BoeWxheGlzIFBlcmZvcm1lZCBPciBPcmRlcmVkIjoKICAoICggW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgIHVuaW9uIFtTZXJ2aWNlTm90UmVxdWVzdGVkOiAiSW50ZXJtaXR0ZW50IHBuZXVtYXRpYyBjb21wcmVzc2lvbiBkZXZpY2VzIl0KICAgICAgdW5pb24gW1NlcnZpY2VOb3RSZXF1ZXN0ZWQ6ICJHcmFkdWF0ZWQgY29tcHJlc3Npb24gc3RvY2tpbmdzIl0gKSBEZXZpY2VOb3RPcmRlcgogICAgICB3aGVyZSBEZXZpY2VOb3RPcmRlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICAgICByZXR1cm4gewogICAgICAgIGlkOiBEZXZpY2VOb3RPcmRlci5pZCwKICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RPcmRlci5yZWFzb25SZWZ1c2VkKCksCiAgICAgICAgYXV0aG9yZWRPbjogRGV2aWNlTm90T3JkZXIuYXV0aG9yZWRPbgogICAgICB9CiAgKQogICAgdW5pb24gKCBmcm9tCiAgICAgICAgKCBbU2VydmljZVJlcXVlc3Q6ICJWZW5vdXMgZm9vdCBwdW1wcyJdCiAgICAgICAgICB1bmlvbiBbU2VydmljZVJlcXVlc3Q6ICJJbnRlcm1pdHRlbnQgcG5ldW1hdGljIGNvbXByZXNzaW9uIGRldmljZXMiXQogICAgICAgICAgdW5pb24gW1NlcnZpY2VSZXF1ZXN0OiAiR3JhZHVhdGVkIGNvbXByZXNzaW9uIHN0b2NraW5ncyJdICkgRGV2aWNlT3JkZXJSZWplY3QsCiAgICAgICAgW1Rhc2tSZWplY3RlZF0gVAogICAgICAgIHdoZXJlIERldmljZU9yZGVyUmVqZWN0LmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgICBhbmQgRGV2aWNlT3JkZXJSZWplY3Quc3RhdHVzID0gJ2FjdGl2ZScKICAgICAgICAgIGFuZCBULmZvY3VzLnJlZmVyZW5jZXMgKCBEZXZpY2VPcmRlclJlamVjdCApCiAgICAgICAgICBhbmQgVC5jb2RlIH4gVVNRdWFsaXR5Q29yZUNvbW1vbi4iRnVsZmlsbCIKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU9yZGVyUmVqZWN0LmlkLAogICAgICAgICAgcmVxdWVzdFN0YXR1c1JlYXNvbjogVC5zdGF0dXNSZWFzb24sCiAgICAgICAgICBhdXRob3JlZE9uOiBEZXZpY2VPcmRlclJlamVjdC5hdXRob3JlZE9uCiAgICAgICAgfQogICAgKQogICAgdW5pb24gKCAoIFtQcm9jZWR1cmVOb3REb25lOiAiQXBwbGljYXRpb24gb2YgSW50ZXJtaXR0ZW50IFBuZXVtYXRpYyBDb21wcmVzc2lvbiBEZXZpY2VzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIFZlbm91cyBGb290IFB1bXBzIl0KICAgICAgICB1bmlvbiBbUHJvY2VkdXJlTm90RG9uZTogIkFwcGxpY2F0aW9uIG9mIEdyYWR1YXRlZCBDb21wcmVzc2lvbiBTdG9ja2luZ3MiXSApIERldmljZU5vdEFwcGxpZWQKICAgICAgICByZXR1cm4gewogICAgICAgICAgaWQ6IERldmljZU5vdEFwcGxpZWQuaWQsCiAgICAgICAgICByZXF1ZXN0U3RhdHVzUmVhc29uOiBEZXZpY2VOb3RBcHBsaWVkLnN0YXR1c1JlYXNvbiwKICAgICAgICAgIGF1dGhvcmVkT246IERldmljZU5vdEFwcGxpZWQucGVyZm9ybWVkCiAgICAgICAgfQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIEZyb20gRGF5IE9mIFN0YXJ0IE9mIEhvc3BpdGFsaXphdGlvbiBUbyBEYXkgQWZ0ZXIgQWRtaXNzaW9uIgogICAgdW5pb24gIk5vIFZURSBQcm9waHlsYXhpcyBEdWUgVG8gUGF0aWVudCBSZWZ1c2FsIE9uIERheSBPZiBPciBEYXkgQWZ0ZXIgUHJvY2VkdXJlIgoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBGcm9tIERheSBPZiBTdGFydCBPZiBIb3NwaXRhbGl6YXRpb24gVG8gRGF5IEFmdGVyIEFkbWlzc2lvbiI6CiAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCIgUGF0aWVudFJlZnVzYWwKICAgICAgc3VjaCB0aGF0IFBhdGllbnRSZWZ1c2FsLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmZyb21EYXlPZlN0YXJ0T2ZIb3NwaXRhbGl6YXRpb25Ub0RheUFmdGVyQWRtaXNzaW9uICggKQoKZGVmaW5lICJObyBNZWNoYW5pY2FsIE9yIFBoYXJtYWNvbG9naWNhbCBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCI6CiAgKCAiTm8gVlRFIFByb3BoeWxheGlzIE1lZGljYXRpb24gQWRtaW5pc3RlcmVkIE9yIE9yZGVyZWQiIE5vVlRFTWVkaWNhdGlvbgogICAgICB3aGVyZSBleGlzdHMgKCBOb1ZURU1lZGljYXRpb24ubWVkaWNhdGlvblN0YXR1c1JlYXNvbiBNZWRSc24KICAgICAgICAgIHdoZXJlIE1lZFJzbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgICApCiAgKQogICAgdW5pb24gKCAiTm8gTWVjaGFuaWNhbCBWVEUgUHJvcGh5bGF4aXMgUGVyZm9ybWVkIE9yIE9yZGVyZWQiIE5vVlRFRGV2aWNlCiAgICAgICAgd2hlcmUgTm9WVEVEZXZpY2UucmVxdWVzdFN0YXR1c1JlYXNvbiBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgKQoKZGVmaW5lICJObyBWVEUgUHJvcGh5bGF4aXMgRHVlIFRvIFBhdGllbnQgUmVmdXNhbCBPbiBEYXkgT2YgT3IgRGF5IEFmdGVyIFByb2NlZHVyZSI6CiAgZnJvbQogICAgVlRFLiJFbmNvdW50ZXIgV2l0aCBBZ2UgUmFuZ2UgQW5kIFdpdGhvdXQgVlRFIERpYWdub3NpcyBPciBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLAogICAgWyJQcm9jZWR1cmUiOiAiR2VuZXJhbCBvciBOZXVyYXhpYWwgQW5lc3RoZXNpYSJdIEFuZXN0aGVzaWFQcm9jZWR1cmUsCiAgICAiTm8gTWVjaGFuaWNhbCBPciBQaGFybWFjb2xvZ2ljYWwgVlRFIFByb3BoeWxheGlzIER1ZSBUbyBQYXRpZW50IFJlZnVzYWwiIFBhdGllbnRSZWZ1c2FsCiAgICB3aGVyZSBBbmVzdGhlc2lhUHJvY2VkdXJlLnN0YXR1cyA9ICdjb21wbGV0ZWQnCiAgICAgIGFuZCBBbmVzdGhlc2lhUHJvY2VkdXJlLnBlcmZvcm1lZC50b0ludGVydmFsICggKSBlbmRzIDEgZGF5IGFmdGVyIGRheSBvZiBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLnBlcmlvZAogICAgICBhbmQgUGF0aWVudFJlZnVzYWwuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mICggZW5kIG9mIEFuZXN0aGVzaWFQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApICkuY2FsZW5kYXJEYXlPZk9yRGF5QWZ0ZXIgKCApCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiAiZnJvbURheU9mU3RhcnRPZkhvc3BpdGFsaXphdGlvblRvRGF5QWZ0ZXJBZG1pc3Npb24iKEVuY291bnRlciBFbmNvdW50ZXIpOgogIEludGVydmFsW2RhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApICksIGRhdGUgZnJvbSAoIHN0YXJ0IG9mIEVuY291bnRlci5wZXJpb2QgKSArIDEgZGF5c10=",
      "url" : "https://madie.cms.gov/Library-CMS108FHIRVTEProphylaxis.cql"
    }
  ]
}