<?xml version="1.0" encoding="UTF-8"?>

<Library xmlns="http://hl7.org/fhir">
  <id value="CMS145FHIRCADBBlockerTPMIorLVSD"/>
  <text>
    <status value="extensions"/><div xmlns="http://www.w3.org/1999/xhtml">
  <table class="narrative-table">
    <tbody>
<tr>


<th colspan="2" scope="row" class="row-header"><a name="metadata"> </a>Metadata</th>


</tr>







<tr>


<th scope="row" class="row-header">Version</th>



<td class="content-container">1.0.000</td>


</tr>
















<tr>


<th scope="row" class="row-header">Status</th>



<td class="content-container">Draft</td>


</tr>







































<tr>


<th scope="row" class="row-header">Type</th>



<td class="content-container">
    <a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library


</td>


</tr>













<tr>


<th colspan="2" scope="row" class="row-header"><a name="parameters"> </a>Parameters</th>


</tr>


<tr>


<th scope="row" class="row-header">Parameter</th>



<td class="content-container">None</td>


</tr>








  <tr>


<th colspan="2" scope="row" class="row-header">Library Content</th>


</tr>
  
    
    <tr>
      <th scope="row" class="row-header">CQL Content</th>
      <td>
        <a name="cql-content"> </a>
        <pre style="border: none;" class="content-container highlight language-cql"><code class="language-cql">library CMS145FHIRCADBBlockerTPMIorLVSD version '1.0.000'

using USQualityCore version '0.1.0-cibuild'
using USCore version '6.1.0-derived'
using FHIR version '4.0.1'

include hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers
include hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon
include hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements

include SupplementalDataElements version '6.1.000' called SDE
include AHAOverall version '5.1.000' called AHA

codesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'

valueset &quot;Allergy to Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1177'
valueset &quot;Arrhythmia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.366'
valueset &quot;Asthma&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.362'
valueset &quot;Atrioventricular Block&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.367'
valueset &quot;Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1174'
valueset &quot;Beta Blocker Therapy for LVSD&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1184'
valueset &quot;Beta Blocker Therapy Ingredient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1493'
valueset &quot;Bradycardia&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.412'
valueset &quot;Cardiac Pacer&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1178.53'
valueset &quot;Cardiac Pacer in Situ&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.368'
valueset &quot;Cardiac Surgery&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.371'
valueset &quot;Care Services in Long Term Residential Facility&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1014'
valueset &quot;Coronary Artery Disease No MI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.369'
valueset &quot;Ejection Fraction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1134'
valueset &quot;Face-to-Face Interaction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1048'
valueset &quot;Home Healthcare Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1016'
valueset &quot;Hypotension&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.370'
valueset &quot;Intolerance to Beta Blocker Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1178'
valueset &quot;Medical Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1007'
valueset &quot;Moderate or Severe&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1092'
valueset &quot;Moderate or Severe LVSD&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1090'
valueset &quot;Myocardial Infarction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.403'
valueset &quot;Nursing Facility Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1012'
valueset &quot;Office Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1001'
valueset &quot;Outpatient Consultation&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.101.12.1008'
valueset &quot;Patient Provider Interaction&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1012'
valueset &quot;Patient Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1008'
// TODO: Remove this value set reference since it is not referenced in the logic
valueset &quot;System Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.526.3.1009'

code &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;: '373254001' from &quot;SNOMEDCT&quot; display 'Substance with beta adrenergic receptor antagonist mechanism of action (substance)'

parameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;
  default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)

context Patient

define &quot;Denominator 2&quot;:
  &quot;Initial Population&quot;
    and exists &quot;Qualifying CAD Encounter and Prior MI&quot;

define &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer&quot;:
  &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI&quot;
    and not &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI&quot;
    and not &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI&quot;

/*
* @code: Heart rate - 8867-4
* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate 
*/


define &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( from
      // TODO: Consider best practice of always qualifying type names
      [&quot;HeartRateProfile&quot;] HeartRateExam,
      &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI
      let PriorHeartRateExam: Last([&quot;HeartRateProfile&quot;] MostRecentPriorHeartRateExam
          where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterMI.period
            and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }
            and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()
          sort by start of effective.toInterval()
      )
      where HeartRateExam.effective.toInterval ( ) during CADEncounterMI.period
        and HeartRateExam.status in { 'final', 'amended', 'corrected' }
        and HeartRateExam.value &lt; 50 '/min'
        and PriorHeartRateExam.value &lt; 50 '/min'
  )

define &quot;Numerator 1&quot;:
  &quot;Has Beta Blocker Therapy for LVSD Ordered&quot;
    or &quot;Is Currently Taking Beta Blocker Therapy for LVSD&quot;

define &quot;Numerator 2&quot;:
  &quot;Has Beta Blocker Therapy Ordered&quot;
    or &quot;Is Currently Taking Beta Blocker Therapy&quot;

define &quot;SDE Ethnicity&quot;:
  SDE.&quot;SDE Ethnicity&quot;

define &quot;SDE Payer&quot;:
  SDE.&quot;SDE Payer&quot;

define &quot;SDE Race&quot;:
  SDE.&quot;SDE Race&quot;

define &quot;SDE Sex&quot;:
  SDE.&quot;SDE Sex&quot;

define &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [Procedure: &quot;Cardiac Pacer&quot;] ImplantedCardiacPacer
      with &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI
        such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterMI.period
          and ImplantedCardiacPacer.status = 'completed'
  )

define &quot;Qualifying CAD Encounter and Prior MI&quot;:
  &quot;Qualifying CAD Encounter&quot; EncounterWithCADProxy
    with ( [FHIR.Condition: &quot;Myocardial Infarction&quot;] ) MyocardialInfarction
      such that MyocardialInfarction.prevalenceInterval ( ) starts 3 years or less before day of start of EncounterWithCADProxy.period
        and not exists AHA.&quot;Moderate or Severe LVSD Findings&quot;
        and MyocardialInfarction.isVerified ( )

define &quot;Denominator 1&quot;:
  &quot;Initial Population&quot;
    and exists &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;

define &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer&quot;:
  &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    and not &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    and not &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;

/*
* @code: Heart rate - 8867-4
* @profile: http://hl7.org/fhir/us/core/StructureDefinition/us-core-heart-rate
*/


define &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( from
      [&quot;HeartRateProfile&quot;] HeartRateExam,
      &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD
      let PriorHeartRateExam: Last([&quot;HeartRateProfile&quot;] MostRecentPriorHeartRateExam
          where MostRecentPriorHeartRateExam.effective.toInterval() during CADEncounterModerateOrSevereLVSD.period
            and MostRecentPriorHeartRateExam.status in { 'final', 'amended', 'corrected' }
            and MostRecentPriorHeartRateExam.effective.toInterval() before HeartRateExam.effective.toInterval()
          sort by start of effective.toInterval()
      )
      where HeartRateExam.effective.toInterval ( ) during CADEncounterModerateOrSevereLVSD.period
        and HeartRateExam.status in { 'final', 'amended', 'corrected' }
        and HeartRateExam.value &lt; 50 '/min'
        and PriorHeartRateExam.value &lt; 50 '/min'
  )

define &quot;Has Cardiac Pacer Device Implanted with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [Procedure: &quot;Cardiac Pacer&quot;] ImplantedCardiacPacer
      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD
        such that ImplantedCardiacPacer.performed.toInterval ( ) starts before end of CADEncounterModerateOrSevereLVSD.period
  )

define &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Cardiac Pacer in Situ&quot;] CardiacPacerDiagnosis
      where CardiacPacerDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Diagnosis of Cardiac Pacer in Situ with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Cardiac Pacer in Situ&quot;] CardiacPacerDiagnosis
      where CardiacPacerDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( ( [AllergyIntolerance: &quot;Beta Blocker Therapy Ingredient&quot;]
      union [AllergyIntolerance: &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;] ) BetaBlockerAllergyIntolerance
      where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Beta Blocker Therapy for LVSD Ordered&quot;:
  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy for LVSD&quot;] BetaBlockerForLVSDOrdered
      where BetaBlockerForLVSDOrdered.authoredDuringDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Beta Blocker Therapy Ordered&quot;:
  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy&quot;] BetaBlockerOrdered
      where BetaBlockerOrdered.authoredDuringDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Is Currently Taking Beta Blocker Therapy&quot;:
  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy&quot;] ActiveBetaBlocker
      with &quot;Qualifying CAD Encounter and Prior MI&quot; CADEncounterMI
        such that First((collapse(ActiveBetaBlocker.dosageInstruction.timing.repeat.bounds DoseTime
              return DoseTime.toInterval()
          )) DrugPeriod
            sort by start of $this
        ) overlaps after day of CADEncounterMI.period
      where ActiveBetaBlocker.status in { 'active', 'completed' }
        and ActiveBetaBlocker.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
  )

define &quot;Is Currently Taking Beta Blocker Therapy for LVSD&quot;:
  exists ( [MedicationRequest: medication in &quot;Beta Blocker Therapy for LVSD&quot;] ActiveBetaBlockerForLVSD
      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; CADEncounterModerateOrSevereLVSD
        such that First((collapse(ActiveBetaBlockerForLVSD.dosageInstruction.timing.repeat.bounds DoseTime
              return DoseTime.toInterval()
          )) DrugPeriod
            sort by start of $this
        ) overlaps after day of CADEncounterModerateOrSevereLVSD.period
      where ActiveBetaBlockerForLVSD.status in { 'active', 'completed' }
        and ActiveBetaBlockerForLVSD.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
  )

define &quot;Outpatient Encounter During Measurement Period&quot;:
  ( [Encounter: &quot;Office Visit&quot;]
    union [Encounter: &quot;Outpatient Consultation&quot;]
    union [Encounter: &quot;Care Services in Long Term Residential Facility&quot;]
    union [Encounter: &quot;Home Healthcare Services&quot;]
    union [Encounter: &quot;Nursing Facility Visit&quot;] ) QualifyingEncounter
    where QualifyingEncounter.period during day of &quot;Measurement Period&quot;
      and QualifyingEncounter.status = 'finished'

define &quot;Qualifying Encounter During Measurement Period&quot;:
  ( [Encounter: &quot;Office Visit&quot;]
    union [Encounter: &quot;Outpatient Consultation&quot;]
    union [Encounter: &quot;Nursing Facility Visit&quot;]
    union [Encounter: &quot;Care Services in Long Term Residential Facility&quot;]
    union [Encounter: &quot;Home Healthcare Services&quot;]
    union [Encounter: &quot;Patient Provider Interaction&quot;] ) ValidEncounter
    where ValidEncounter.period during day of &quot;Measurement Period&quot;
      and ValidEncounter.status = 'finished'

define &quot;Coronary Artery Disease Encounter&quot;:
  &quot;Outpatient Encounter During Measurement Period&quot; ValidQualifyingEncounter
    with ( [ConditionProblemsHealthConcerns: &quot;Coronary Artery Disease No MI&quot;]
      union [ConditionEncounterDiagnosis: &quot;Coronary Artery Disease No MI&quot;] ) CoronaryArteryDisease
      such that CoronaryArteryDisease.overlapsDayOfEncounter ( ValidQualifyingEncounter )

define &quot;Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Arrhythmia&quot;] ArrhythmiaDiagnosis
      where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Arrhythmia with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Arrhythmia&quot;] ArrhythmiaDiagnosis
      where ArrhythmiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Asthma&quot;] AsthmaDiagnosis
      where AsthmaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Asthma with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Asthma&quot;] AsthmaDiagnosis
      where AsthmaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Atrioventricular Block&quot;] AtrioventricularBlock
      where AtrioventricularBlock.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Atrioventricular Block&quot;] AtrioventricularBlockDiagnosis
      where AtrioventricularBlockDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Bradycardia&quot;] BradycardiaDiagnosis
      where BradycardiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Bradycardia with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Bradycardia&quot;] BradycardiaDiagnosis
      where BradycardiaDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( ( [ConditionProblemsHealthConcerns: &quot;Allergy to Beta Blocker Therapy&quot;]
      union [ConditionProblemsHealthConcerns: &quot;Intolerance to Beta Blocker Therapy&quot;] ) BetaBlockerAllergyOrIntoleranceDiagnosis
      where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( ( [ConditionProblemsHealthConcerns: &quot;Allergy to Beta Blocker Therapy&quot;]
      union [ConditionProblemsHealthConcerns: &quot;Intolerance to Beta Blocker Therapy&quot;] ) BetaBlockerAllergyOrIntoleranceDiagnosis
      where BetaBlockerAllergyOrIntoleranceDiagnosis.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( [ConditionProblemsHealthConcerns: &quot;Hypotension&quot;] HypotensionDiagnosis
      where HypotensionDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Hypotension with Qualifying CAD Encounter and Prior MI&quot;:
  exists ( ( [ConditionProblemsHealthConcerns: &quot;Hypotension&quot;]
      union [ConditionEncounterDiagnosis: &quot;Hypotension&quot;] ) HypotensionDiagnosis
      where HypotensionDiagnosis.overlapsDayOfEncounter ( &quot;Qualifying CAD Encounter and Prior MI&quot; )
  )

define &quot;Denominator Exceptions 1&quot;:
  &quot;Has Arrhythmia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Asthma with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Bradycardia with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Hypotension with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;
    or &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD&quot;
    or &quot;Has Atrioventricular Block with Qualifying CAD Encounter and History of Moderate or Severe LVSD without Cardiac Pacer&quot;

define &quot;Denominator Exceptions 2&quot;:
  &quot;Has Arrhythmia with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Asthma with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Bradycardia with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Hypotension with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Consecutive Heart Rates Less than 50 with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Diagnosis of Allergy or Intolerance to Beta Blocker Therapy with Qualifying CAD Encounter and Prior MI&quot;
    or &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy&quot;
    or &quot;Has Atrioventricular Block with Qualifying CAD Encounter and Prior MI without Cardiac Pacer&quot;

define &quot;Has Allergy or Intolerance to Beta Blocker Therapy Ingredient with Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  exists ( ( [AllergyIntolerance: &quot;Beta Blocker Therapy Ingredient&quot;]
      union [AllergyIntolerance: &quot;Substance with beta adrenergic receptor antagonist mechanism of action (substance)&quot;] ) BetaBlockerAllergyIntolerance
      where BetaBlockerAllergyIntolerance.overlapsAfterDayOfEncounter ( &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; )
  )

define &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker for LVSD&quot;:
  exists ( [MedicationNotRequested: medication in &quot;Beta Blocker Therapy for LVSD&quot;] NoBetaBlockerForLVSDOrdered
      with &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot; LVSDVisit
        such that NoBetaBlockerForLVSDOrdered.authoredOn during day of LVSDVisit.period
      where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }
        and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and ( NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Medical Reason&quot;
            or NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Patient Reason&quot;
        )
  )

define &quot;Has Medical or Patient Reason for Not Ordering Beta Blocker Therapy&quot;:
  exists ( [MedicationNotRequested: medication in &quot;Beta Blocker Therapy for LVSD&quot;] NoBetaBlockerForLVSDOrdered
      with &quot;Qualifying CAD Encounter and Prior MI&quot; PriorMIVisit
        such that NoBetaBlockerForLVSDOrdered.authoredOn during day of PriorMIVisit.period
      where NoBetaBlockerForLVSDOrdered.status in { 'active', 'completed' }
        and NoBetaBlockerForLVSDOrdered.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
        and ( NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Medical Reason&quot;
            or NoBetaBlockerForLVSDOrdered.reasonCode in &quot;Patient Reason&quot;
        )
  )

define &quot;Initial Population&quot;:
  AgeInYearsAt(date from start of &quot;Measurement Period&quot;) &gt;= 18
    and exists ( &quot;Qualifying Encounter During Measurement Period&quot; Encounter1
        with &quot;Qualifying Encounter During Measurement Period&quot; Encounter2
          such that Encounter2.id !~ Encounter1.id
    )
    and exists &quot;Qualifying CAD Encounter&quot;

define &quot;Qualifying CAD Encounter and History of Moderate or Severe LVSD&quot;:
  &quot;Qualifying CAD Encounter&quot; EncounterWithCADProxy
    with AHA.&quot;Moderate or Severe LVSD Findings&quot; LVSDFindings
      such that Coalesce(LVSDFindings.prevalenceInterval(), LVSDFindings.effective.toInterval()) starts before end of EncounterWithCADProxy.period

define &quot;History of Cardiac Surgery Prior to Encounter&quot;:
  &quot;Outpatient Encounter During Measurement Period&quot; ValidQualifyingEncounter
    with [Procedure: &quot;Cardiac Surgery&quot;] CardiacSurgeryProcedure
      such that CardiacSurgeryProcedure.performed.toInterval ( ) starts before end of ValidQualifyingEncounter.period
        and CardiacSurgeryProcedure.status = 'completed'

define &quot;Qualifying CAD Encounter&quot;:
  &quot;Coronary Artery Disease Encounter&quot;
    union &quot;History of Cardiac Surgery Prior to Encounter&quot;

define fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, EncounterList List&lt;Encounter&gt;):
  AnyTrue(EncounterList Visit
      return Diagnosis.overlapsDayOfEncounter(Visit)
  )

define fluent function overlapsDayOfEncounter(Diagnosis ConditionProblemsHealthConcerns, TheEncounter Encounter):
  TheEncounter Visit
    where Diagnosis.isVerified ( )
    return Diagnosis.prevalenceInterval ( ) overlaps day of Visit.period

define fluent function overlapsAfterDayOfEncounter(Event Choice&lt;AllergyIntolerance, ConditionProblemsHealthConcerns&gt;, EncounterList List&lt;Encounter&gt;):
  AnyTrue(EncounterList Visit
      return
      case
        when Event is AllergyIntolerance then Interval[start of Event.onset.toInterval(), Event.lastOccurrence]overlaps after day of Visit.period
          and(Event.clinicalStatus is null
              or Event.clinicalStatus ~ FHIRCommon.&quot;allergy-active&quot;
          )
          and(Event.verificationStatus is null
              or Event.verificationStatus ~ FHIRCommon.&quot;allergy-confirmed&quot;
          )
        when Event is ConditionProblemsHealthConcerns then Event.isVerified()
          and Event.prevalenceInterval() overlaps after day of Visit.period 
        else false 
      end
  )

define fluent function authoredDuringDayOfEncounter(Order Choice&lt;MedicationRequest, MedicationNotRequested&gt;, EncounterList List&lt;Encounter&gt;):
  AnyTrue(EncounterList Visit
      return
      case
        when Order is MedicationRequest then Order.authoredOn during day of Visit.period
          and Order.status in { 'active', 'completed' }
          and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' }
          and Order.doNotPerform is not true
        when Order is MedicationNotRequested then Order.authoredOn during day of Visit.period
          and Order.intent in { 'order', 'original-order', 'reflex-order', 'filler-order', 'instance-order' } 
        else false 
      end
  )</code></pre>
      </td>
    </tr>
    
  



<tr>
  <th colspan="2" scope="row" class="row-header">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>
</tr>

    </tbody>
  </table>
</div>
  </text>
  <extension url="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem">
    <valueReference>
      <reference value="Device/cqf-tooling"/>
    </valueReference>
  </extension>
  <url value="https://madie.cms.gov/Library/CMS145FHIRCADBBlockerTPMIorLVSD"/>
  <version value="1.0.000"/>
  <name value="CMS145FHIRCADBBlockerTPMIorLVSD"/>
  <status value="draft"/>
  <type>
    <coding>
      <system value="http://terminology.hl7.org/CodeSystem/library-type"/>
      <code value="logic-library"/>
    </coding>
  </type>
  <date value="2026-09-19T16:31:14+00:00"/>
  <content>
    <contentType value="text/cql"/>
    <data value="bGlicmFyeSBDTVMxNDVGSElSQ0FEQkJsb2NrZXJUUE1Jb3JMVlNEIHZlcnNpb24gJzEuMC4wMDAnCgp1c2luZyBVU1F1YWxpdHlDb3JlIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnCnVzaW5nIFVTQ29yZSB2ZXJzaW9uICc2LjEuMC1kZXJpdmVkJwp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSQ29tbW9uIHZlcnNpb24gJzIuMC4wJyBjYWxsZWQgRkhJUkNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVDb21tb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUVsZW1lbnRzIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUVsZW1lbnRzCgppbmNsdWRlIFN1cHBsZW1lbnRhbERhdGFFbGVtZW50cyB2ZXJzaW9uICc2LjEuMDAwJyBjYWxsZWQgU0RFCmluY2x1ZGUgQUhBT3ZlcmFsbCB2ZXJzaW9uICc1LjEuMDAwJyBjYWxsZWQgQUhBCgpjb2Rlc3lzdGVtICJTTk9NRURDVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0JwoKdmFsdWVzZXQgIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NycKdmFsdWVzZXQgIkFycmh5dGhtaWEiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY2Jwp2YWx1ZXNldCAiQXN0aG1hIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjM2MicKdmFsdWVzZXQgIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzY3Jwp2YWx1ZXNldCAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3NCcKdmFsdWVzZXQgIkJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjExODQnCnZhbHVlc2V0ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjE0OTMnCnZhbHVlc2V0ICJCcmFkeWNhcmRpYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy40MTInCnZhbHVlc2V0ICJDYXJkaWFjIFBhY2VyIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE3OC41MycKdmFsdWVzZXQgIkNhcmRpYWMgUGFjZXIgaW4gU2l0dSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjgnCnZhbHVlc2V0ICJDYXJkaWFjIFN1cmdlcnkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcxJwp2YWx1ZXNldCAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNDY0LjEwMDMuMTAxLjEyLjEwMTQnCnZhbHVlc2V0ICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBObyBNSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4zNjknCnZhbHVlc2V0ICJFamVjdGlvbiBGcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMTM0Jwp2YWx1ZXNldCAiRmFjZS10by1GYWNlIEludGVyYWN0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDQ4Jwp2YWx1ZXNldCAiSG9tZSBIZWFsdGhjYXJlIFNlcnZpY2VzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDE2Jwp2YWx1ZXNldCAiSHlwb3RlbnNpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMzcwJwp2YWx1ZXNldCAiSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTE3OCcKdmFsdWVzZXQgIk1lZGljYWwgUmVhc29uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwMDcnCnZhbHVlc2V0ICJNb2RlcmF0ZSBvciBTZXZlcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTA5MicKdmFsdWVzZXQgIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjUyNi4zLjEwOTAnCnZhbHVlc2V0ICJNeW9jYXJkaWFsIEluZmFyY3Rpb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuNDAzJwp2YWx1ZXNldCAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAxMicKdmFsdWVzZXQgIk9mZmljZSBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDEuMTIuMTAwMScKdmFsdWVzZXQgIk91dHBhdGllbnQgQ29uc3VsdGF0aW9uIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjQ2NC4xMDAzLjEwMS4xMi4xMDA4Jwp2YWx1ZXNldCAiUGF0aWVudCBQcm92aWRlciBJbnRlcmFjdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy41MjYuMy4xMDEyJwp2YWx1ZXNldCAiUGF0aWVudCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOCcKLy8gVE9ETzogUmVtb3ZlIHRoaXMgdmFsdWUgc2V0IHJlZmVyZW5jZSBzaW5jZSBpdCBpcyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgbG9naWMKdmFsdWVzZXQgIlN5c3RlbSBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNTI2LjMuMTAwOScKCmNvZGUgIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiOiAnMzczMjU0MDAxJyBmcm9tICJTTk9NRURDVCIgZGlzcGxheSAnU3Vic3RhbmNlIHdpdGggYmV0YSBhZHJlbmVyZ2ljIHJlY2VwdG9yIGFudGFnb25pc3QgbWVjaGFuaXNtIG9mIGFjdGlvbiAoc3Vic3RhbmNlKScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiRGVub21pbmF0b3IgMiI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKICAgIGFuZCBleGlzdHMgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSB3aXRob3V0IENhcmRpYWMgUGFjZXIiOgogICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKCi8qCiogQGNvZGU6IEhlYXJ0IHJhdGUgLSA4ODY3LTQKKiBAcHJvZmlsZTogaHR0cDovL2hsNy5vcmcvZmhpci91cy9jb3JlL1N0cnVjdHVyZURlZmluaXRpb24vdXMtY29yZS1oZWFydC1yYXRlIAoqLwoKCmRlZmluZSAiSGFzIENvbnNlY3V0aXZlIEhlYXJ0IFJhdGVzIExlc3MgdGhhbiA1MCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIGZyb20KICAgICAgLy8gVE9ETzogQ29uc2lkZXIgYmVzdCBwcmFjdGljZSBvZiBhbHdheXMgcXVhbGlmeWluZyB0eXBlIG5hbWVzCiAgICAgIFsiSGVhcnRSYXRlUHJvZmlsZSJdIEhlYXJ0UmF0ZUV4YW0sCiAgICAgICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICBsZXQgUHJpb3JIZWFydFJhdGVFeGFtOiBMYXN0KFsiSGVhcnRSYXRlUHJvZmlsZSJdIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0KICAgICAgICAgIHdoZXJlIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBkdXJpbmcgQ0FERW5jb3VudGVyTUkucGVyaW9kCiAgICAgICAgICAgIGFuZCBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIGJlZm9yZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKQogICAgICApCiAgICAgIHdoZXJlIEhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwgKCApIGR1cmluZyBDQURFbmNvdW50ZXJNSS5wZXJpb2QKICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICBhbmQgSGVhcnRSYXRlRXhhbS52YWx1ZSA8IDUwICcvbWluJwogICAgICAgIGFuZCBQcmlvckhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICApCgpkZWZpbmUgIk51bWVyYXRvciAxIjoKICAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IGZvciBMVlNEIE9yZGVyZWQiCiAgICBvciAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCIKCmRlZmluZSAiTnVtZXJhdG9yIDIiOgogICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgT3JkZXJlZCIKICAgIG9yICJJcyBDdXJyZW50bHkgVGFraW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IgoKZGVmaW5lICJTREUgRXRobmljaXR5IjoKICBTREUuIlNERSBFdGhuaWNpdHkiCgpkZWZpbmUgIlNERSBQYXllciI6CiAgU0RFLiJTREUgUGF5ZXIiCgpkZWZpbmUgIlNERSBSYWNlIjoKICBTREUuIlNERSBSYWNlIgoKZGVmaW5lICJTREUgU2V4IjoKICBTREUuIlNERSBTZXgiCgpkZWZpbmUgIkhhcyBDYXJkaWFjIFBhY2VyIERldmljZSBJbXBsYW50ZWQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiBDQURFbmNvdW50ZXJNSQogICAgICAgIHN1Y2ggdGhhdCBJbXBsYW50ZWRDYXJkaWFjUGFjZXIucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICAgICAgYW5kIEltcGxhbnRlZENhcmRpYWNQYWNlci5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciIgRW5jb3VudGVyV2l0aENBRFByb3h5CiAgICB3aXRoICggW0ZISVIuQ29uZGl0aW9uOiAiTXlvY2FyZGlhbCBJbmZhcmN0aW9uIl0gKSBNeW9jYXJkaWFsSW5mYXJjdGlvbgogICAgICBzdWNoIHRoYXQgTXlvY2FyZGlhbEluZmFyY3Rpb24ucHJldmFsZW5jZUludGVydmFsICggKSBzdGFydHMgMyB5ZWFycyBvciBsZXNzIGJlZm9yZSBkYXkgb2Ygc3RhcnQgb2YgRW5jb3VudGVyV2l0aENBRFByb3h5LnBlcmlvZAogICAgICAgIGFuZCBub3QgZXhpc3RzIEFIQS4iTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QgRmluZGluZ3MiCiAgICAgICAgYW5kIE15b2NhcmRpYWxJbmZhcmN0aW9uLmlzVmVyaWZpZWQgKCApCgpkZWZpbmUgIkRlbm9taW5hdG9yIDEiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCiAgICBhbmQgZXhpc3RzICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCgpkZWZpbmUgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIHdpdGhvdXQgQ2FyZGlhYyBQYWNlciI6CiAgIkhhcyBBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgYW5kIG5vdCAiSGFzIERpYWdub3NpcyBvZiBDYXJkaWFjIFBhY2VyIGluIFNpdHUgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBhbmQgbm90ICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgoKLyoKKiBAY29kZTogSGVhcnQgcmF0ZSAtIDg4NjctNAoqIEBwcm9maWxlOiBodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NvcmUvU3RydWN0dXJlRGVmaW5pdGlvbi91cy1jb3JlLWhlYXJ0LXJhdGUKKi8KCgpkZWZpbmUgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIGZyb20KICAgICAgWyJIZWFydFJhdGVQcm9maWxlIl0gSGVhcnRSYXRlRXhhbSwKICAgICAgIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QKICAgICAgbGV0IFByaW9ySGVhcnRSYXRlRXhhbTogTGFzdChbIkhlYXJ0UmF0ZVByb2ZpbGUiXSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtCiAgICAgICAgICB3aGVyZSBNb3N0UmVjZW50UHJpb3JIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNELnBlcmlvZAogICAgICAgICAgICBhbmQgTW9zdFJlY2VudFByaW9ySGVhcnRSYXRlRXhhbS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgICAgICAgYW5kIE1vc3RSZWNlbnRQcmlvckhlYXJ0UmF0ZUV4YW0uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBiZWZvcmUgSGVhcnRSYXRlRXhhbS5lZmZlY3RpdmUudG9JbnRlcnZhbCgpCiAgICAgICAgICBzb3J0IGJ5IHN0YXJ0IG9mIGVmZmVjdGl2ZS50b0ludGVydmFsKCkKICAgICAgKQogICAgICB3aGVyZSBIZWFydFJhdGVFeGFtLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0uc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEhlYXJ0UmF0ZUV4YW0udmFsdWUgPCA1MCAnL21pbicKICAgICAgICBhbmQgUHJpb3JIZWFydFJhdGVFeGFtLnZhbHVlIDwgNTAgJy9taW4nCiAgKQoKZGVmaW5lICJIYXMgQ2FyZGlhYyBQYWNlciBEZXZpY2UgSW1wbGFudGVkIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbUHJvY2VkdXJlOiAiQ2FyZGlhYyBQYWNlciJdIEltcGxhbnRlZENhcmRpYWNQYWNlcgogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEltcGxhbnRlZENhcmRpYWNQYWNlci5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgQ0FERW5jb3VudGVyTW9kZXJhdGVPclNldmVyZUxWU0QucGVyaW9kCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJDYXJkaWFjIFBhY2VyIGluIFNpdHUiXSBDYXJkaWFjUGFjZXJEaWFnbm9zaXMKICAgICAgd2hlcmUgQ2FyZGlhY1BhY2VyRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgRGlhZ25vc2lzIG9mIENhcmRpYWMgUGFjZXIgaW4gU2l0dSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQ2FyZGlhYyBQYWNlciBpbiBTaXR1Il0gQ2FyZGlhY1BhY2VyRGlhZ25vc2lzCiAgICAgIHdoZXJlIENhcmRpYWNQYWNlckRpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QgT3JkZXJlZCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEJldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEJldGEgQmxvY2tlciBUaGVyYXB5IE9yZGVyZWQiOgogIGV4aXN0cyAoIFtNZWRpY2F0aW9uUmVxdWVzdDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkiXSBCZXRhQmxvY2tlck9yZGVyZWQKICAgICAgd2hlcmUgQmV0YUJsb2NrZXJPcmRlcmVkLmF1dGhvcmVkRHVyaW5nRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSJdIEFjdGl2ZUJldGFCbG9ja2VyCiAgICAgIHdpdGggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiIENBREVuY291bnRlck1JCiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlci5kb3NhZ2VJbnN0cnVjdGlvbi50aW1pbmcucmVwZWF0LmJvdW5kcyBEb3NlVGltZQogICAgICAgICAgICAgIHJldHVybiBEb3NlVGltZS50b0ludGVydmFsKCkKICAgICAgICAgICkpIERydWdQZXJpb2QKICAgICAgICAgICAgc29ydCBieSBzdGFydCBvZiAkdGhpcwogICAgICAgICkgb3ZlcmxhcHMgYWZ0ZXIgZGF5IG9mIENBREVuY291bnRlck1JLnBlcmlvZAogICAgICB3aGVyZSBBY3RpdmVCZXRhQmxvY2tlci5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBBY3RpdmVCZXRhQmxvY2tlci5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiSXMgQ3VycmVudGx5IFRha2luZyBCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCI6CiAgZXhpc3RzICggW01lZGljYXRpb25SZXF1ZXN0OiBtZWRpY2F0aW9uIGluICJCZXRhIEJsb2NrZXIgVGhlcmFweSBmb3IgTFZTRCJdIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRAogICAgICB3aXRoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiIENBREVuY291bnRlck1vZGVyYXRlT3JTZXZlcmVMVlNECiAgICAgICAgc3VjaCB0aGF0IEZpcnN0KChjb2xsYXBzZShBY3RpdmVCZXRhQmxvY2tlckZvckxWU0QuZG9zYWdlSW5zdHJ1Y3Rpb24udGltaW5nLnJlcGVhdC5ib3VuZHMgRG9zZVRpbWUKICAgICAgICAgICAgICByZXR1cm4gRG9zZVRpbWUudG9JbnRlcnZhbCgpCiAgICAgICAgICApKSBEcnVnUGVyaW9kCiAgICAgICAgICAgIHNvcnQgYnkgc3RhcnQgb2YgJHRoaXMKICAgICAgICApIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBDQURFbmNvdW50ZXJNb2RlcmF0ZU9yU2V2ZXJlTFZTRC5wZXJpb2QKICAgICAgd2hlcmUgQWN0aXZlQmV0YUJsb2NrZXJGb3JMVlNELnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kIEFjdGl2ZUJldGFCbG9ja2VyRm9yTFZTRC5pbnRlbnQgaW4geyAnb3JkZXInLCAnb3JpZ2luYWwtb3JkZXInLCAncmVmbGV4LW9yZGVyJywgJ2ZpbGxlci1vcmRlcicsICdpbnN0YW5jZS1vcmRlcicgfQogICkKCmRlZmluZSAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgKCBbRW5jb3VudGVyOiAiT2ZmaWNlIFZpc2l0Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IENvbnN1bHRhdGlvbiJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiQ2FyZSBTZXJ2aWNlcyBpbiBMb25nIFRlcm0gUmVzaWRlbnRpYWwgRmFjaWxpdHkiXQogICAgdW5pb24gW0VuY291bnRlcjogIkhvbWUgSGVhbHRoY2FyZSBTZXJ2aWNlcyJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiTnVyc2luZyBGYWNpbGl0eSBWaXNpdCJdICkgUXVhbGlmeWluZ0VuY291bnRlcgogICAgd2hlcmUgUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgUXVhbGlmeWluZ0VuY291bnRlci5zdGF0dXMgPSAnZmluaXNoZWQnCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICggW0VuY291bnRlcjogIk9mZmljZSBWaXNpdCJdCiAgICB1bmlvbiBbRW5jb3VudGVyOiAiT3V0cGF0aWVudCBDb25zdWx0YXRpb24iXQogICAgdW5pb24gW0VuY291bnRlcjogIk51cnNpbmcgRmFjaWxpdHkgVmlzaXQiXQogICAgdW5pb24gW0VuY291bnRlcjogIkNhcmUgU2VydmljZXMgaW4gTG9uZyBUZXJtIFJlc2lkZW50aWFsIEZhY2lsaXR5Il0KICAgIHVuaW9uIFtFbmNvdW50ZXI6ICJIb21lIEhlYWx0aGNhcmUgU2VydmljZXMiXQogICAgdW5pb24gW0VuY291bnRlcjogIlBhdGllbnQgUHJvdmlkZXIgSW50ZXJhY3Rpb24iXSApIFZhbGlkRW5jb3VudGVyCiAgICB3aGVyZSBWYWxpZEVuY291bnRlci5wZXJpb2QgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgVmFsaWRFbmNvdW50ZXIuc3RhdHVzID0gJ2ZpbmlzaGVkJwoKZGVmaW5lICJDb3JvbmFyeSBBcnRlcnkgRGlzZWFzZSBFbmNvdW50ZXIiOgogICJPdXRwYXRpZW50IEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBWYWxpZFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgIHdpdGggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0KICAgICAgdW5pb24gW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3NpczogIkNvcm9uYXJ5IEFydGVyeSBEaXNlYXNlIE5vIE1JIl0gKSBDb3JvbmFyeUFydGVyeURpc2Vhc2UKICAgICAgc3VjaCB0aGF0IENvcm9uYXJ5QXJ0ZXJ5RGlzZWFzZS5vdmVybGFwc0RheU9mRW5jb3VudGVyICggVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQXJyaHl0aG1pYSJdIEFycmh5dGhtaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQXJyaHl0aG1pYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFycmh5dGhtaWEiXSBBcnJoeXRobWlhRGlhZ25vc2lzCiAgICAgIHdoZXJlIEFycmh5dGhtaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXN0aG1hIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBBc3RobWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFzdGhtYSJdIEFzdGhtYURpYWdub3NpcwogICAgICB3aGVyZSBBc3RobWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIiApCiAgKQoKZGVmaW5lICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJBdHJpb3ZlbnRyaWN1bGFyIEJsb2NrIl0gQXRyaW92ZW50cmljdWxhckJsb2NrCiAgICAgIHdoZXJlIEF0cmlvdmVudHJpY3VsYXJCbG9jay5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkF0cmlvdmVudHJpY3VsYXIgQmxvY2siXSBBdHJpb3ZlbnRyaWN1bGFyQmxvY2tEaWFnbm9zaXMKICAgICAgd2hlcmUgQXRyaW92ZW50cmljdWxhckJsb2NrRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkJyYWR5Y2FyZGlhIl0gQnJhZHljYXJkaWFEaWFnbm9zaXMKICAgICAgd2hlcmUgQnJhZHljYXJkaWFEaWFnbm9zaXMub3ZlcmxhcHNEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBCcmFkeWNhcmRpYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiOgogIGV4aXN0cyAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiQnJhZHljYXJkaWEiXSBCcmFkeWNhcmRpYURpYWdub3NpcwogICAgICB3aGVyZSBCcmFkeWNhcmRpYURpYWdub3Npcy5vdmVybGFwc0RheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIgKQogICkKCmRlZmluZSAiSGFzIERpYWdub3NpcyBvZiBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSI6CiAgZXhpc3RzICggKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkFsbGVyZ3kgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkiXQogICAgICB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5Il0gKSBCZXRhQmxvY2tlckFsbGVyZ3lPckludG9sZXJhbmNlRGlhZ25vc2lzCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneU9ySW50b2xlcmFuY2VEaWFnbm9zaXMub3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyICggIlF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiICkKICApCgpkZWZpbmUgIkhhcyBIeXBvdGVuc2lvbiB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCI6CiAgZXhpc3RzICggW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM6ICJIeXBvdGVuc2lvbiJdIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiApCiAgKQoKZGVmaW5lICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIjoKICBleGlzdHMgKCAoIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zOiAiSHlwb3RlbnNpb24iXQogICAgICB1bmlvbiBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzOiAiSHlwb3RlbnNpb24iXSApIEh5cG90ZW5zaW9uRGlhZ25vc2lzCiAgICAgIHdoZXJlIEh5cG90ZW5zaW9uRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIgKCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgKQogICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjZXB0aW9ucyAxIjoKICAiSGFzIEFycmh5dGhtaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgQnJhZHljYXJkaWEgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEh5cG90ZW5zaW9uIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgSW5ncmVkaWVudCB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgSGlzdG9yeSBvZiBNb2RlcmF0ZSBvciBTZXZlcmUgTFZTRCIKICAgIG9yICJIYXMgRGlhZ25vc2lzIG9mIEFsbGVyZ3kgb3IgSW50b2xlcmFuY2UgdG8gQmV0YSBCbG9ja2VyIFRoZXJhcHkgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgZm9yIExWU0QiCiAgICBvciAiSGFzIEF0cmlvdmVudHJpY3VsYXIgQmxvY2sgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0Qgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJEZW5vbWluYXRvciBFeGNlcHRpb25zIDIiOgogICJIYXMgQXJyaHl0aG1pYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEFzdGhtYSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIEJyYWR5Y2FyZGlhIHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIKICAgIG9yICJIYXMgSHlwb3RlbnNpb24gd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBDb25zZWN1dGl2ZSBIZWFydCBSYXRlcyBMZXNzIHRoYW4gNTAgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBBbGxlcmd5IG9yIEludG9sZXJhbmNlIHRvIEJldGEgQmxvY2tlciBUaGVyYXB5IEluZ3JlZGllbnQgd2l0aCBRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIFByaW9yIE1JIgogICAgb3IgIkhhcyBEaWFnbm9zaXMgb2YgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkiCiAgICBvciAiSGFzIE1lZGljYWwgb3IgUGF0aWVudCBSZWFzb24gZm9yIE5vdCBPcmRlcmluZyBCZXRhIEJsb2NrZXIgVGhlcmFweSIKICAgIG9yICJIYXMgQXRyaW92ZW50cmljdWxhciBCbG9jayB3aXRoIFF1YWxpZnlpbmcgQ0FEIEVuY291bnRlciBhbmQgUHJpb3IgTUkgd2l0aG91dCBDYXJkaWFjIFBhY2VyIgoKZGVmaW5lICJIYXMgQWxsZXJneSBvciBJbnRvbGVyYW5jZSB0byBCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50IHdpdGggUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIjoKICBleGlzdHMgKCAoIFtBbGxlcmd5SW50b2xlcmFuY2U6ICJCZXRhIEJsb2NrZXIgVGhlcmFweSBJbmdyZWRpZW50Il0KICAgICAgdW5pb24gW0FsbGVyZ3lJbnRvbGVyYW5jZTogIlN1YnN0YW5jZSB3aXRoIGJldGEgYWRyZW5lcmdpYyByZWNlcHRvciBhbnRhZ29uaXN0IG1lY2hhbmlzbSBvZiBhY3Rpb24gKHN1YnN0YW5jZSkiXSApIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlCiAgICAgIHdoZXJlIEJldGFCbG9ja2VyQWxsZXJneUludG9sZXJhbmNlLm92ZXJsYXBzQWZ0ZXJEYXlPZkVuY291bnRlciAoICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiICkKICApCgpkZWZpbmUgIkhhcyBNZWRpY2FsIG9yIFBhdGllbnQgUmVhc29uIGZvciBOb3QgT3JkZXJpbmcgQmV0YSBCbG9ja2VyIGZvciBMVlNEIjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBIaXN0b3J5IG9mIE1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIiBMVlNEVmlzaXQKICAgICAgICBzdWNoIHRoYXQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmF1dGhvcmVkT24gZHVyaW5nIGRheSBvZiBMVlNEVmlzaXQucGVyaW9kCiAgICAgIHdoZXJlIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICBhbmQgKCBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiTWVkaWNhbCBSZWFzb24iCiAgICAgICAgICAgIG9yIE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5yZWFzb25Db2RlIGluICJQYXRpZW50IFJlYXNvbiIKICAgICAgICApCiAgKQoKZGVmaW5lICJIYXMgTWVkaWNhbCBvciBQYXRpZW50IFJlYXNvbiBmb3IgTm90IE9yZGVyaW5nIEJldGEgQmxvY2tlciBUaGVyYXB5IjoKICBleGlzdHMgKCBbTWVkaWNhdGlvbk5vdFJlcXVlc3RlZDogbWVkaWNhdGlvbiBpbiAiQmV0YSBCbG9ja2VyIFRoZXJhcHkgZm9yIExWU0QiXSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQKICAgICAgd2l0aCAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIGFuZCBQcmlvciBNSSIgUHJpb3JNSVZpc2l0CiAgICAgICAgc3VjaCB0aGF0IE5vQmV0YUJsb2NrZXJGb3JMVlNET3JkZXJlZC5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgUHJpb3JNSVZpc2l0LnBlcmlvZAogICAgICB3aGVyZSBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLmludGVudCBpbiB7ICdvcmRlcicsICdvcmlnaW5hbC1vcmRlcicsICdyZWZsZXgtb3JkZXInLCAnZmlsbGVyLW9yZGVyJywgJ2luc3RhbmNlLW9yZGVyJyB9CiAgICAgICAgYW5kICggTm9CZXRhQmxvY2tlckZvckxWU0RPcmRlcmVkLnJlYXNvbkNvZGUgaW4gIk1lZGljYWwgUmVhc29uIgogICAgICAgICAgICBvciBOb0JldGFCbG9ja2VyRm9yTFZTRE9yZGVyZWQucmVhc29uQ29kZSBpbiAiUGF0aWVudCBSZWFzb24iCiAgICAgICAgKQogICkKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxOAogICAgYW5kIGV4aXN0cyAoICJRdWFsaWZ5aW5nIEVuY291bnRlciBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBFbmNvdW50ZXIxCiAgICAgICAgd2l0aCAiUXVhbGlmeWluZyBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgRW5jb3VudGVyMgogICAgICAgICAgc3VjaCB0aGF0IEVuY291bnRlcjIuaWQgIX4gRW5jb3VudGVyMS5pZAogICAgKQogICAgYW5kIGV4aXN0cyAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIgoKZGVmaW5lICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIgYW5kIEhpc3Rvcnkgb2YgTW9kZXJhdGUgb3IgU2V2ZXJlIExWU0QiOgogICJRdWFsaWZ5aW5nIENBRCBFbmNvdW50ZXIiIEVuY291bnRlcldpdGhDQURQcm94eQogICAgd2l0aCBBSEEuIk1vZGVyYXRlIG9yIFNldmVyZSBMVlNEIEZpbmRpbmdzIiBMVlNERmluZGluZ3MKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKExWU0RGaW5kaW5ncy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSwgTFZTREZpbmRpbmdzLmVmZmVjdGl2ZS50b0ludGVydmFsKCkpIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEVuY291bnRlcldpdGhDQURQcm94eS5wZXJpb2QKCmRlZmluZSAiSGlzdG9yeSBvZiBDYXJkaWFjIFN1cmdlcnkgUHJpb3IgdG8gRW5jb3VudGVyIjoKICAiT3V0cGF0aWVudCBFbmNvdW50ZXIgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCIgVmFsaWRRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICB3aXRoIFtQcm9jZWR1cmU6ICJDYXJkaWFjIFN1cmdlcnkiXSBDYXJkaWFjU3VyZ2VyeVByb2NlZHVyZQogICAgICBzdWNoIHRoYXQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIFZhbGlkUXVhbGlmeWluZ0VuY291bnRlci5wZXJpb2QKICAgICAgICBhbmQgQ2FyZGlhY1N1cmdlcnlQcm9jZWR1cmUuc3RhdHVzID0gJ2NvbXBsZXRlZCcKCmRlZmluZSAiUXVhbGlmeWluZyBDQUQgRW5jb3VudGVyIjoKICAiQ29yb25hcnkgQXJ0ZXJ5IERpc2Vhc2UgRW5jb3VudGVyIgogICAgdW5pb24gIkhpc3Rvcnkgb2YgQ2FyZGlhYyBTdXJnZXJ5IFByaW9yIHRvIEVuY291bnRlciIKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNEYXlPZkVuY291bnRlcihEaWFnbm9zaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucywgRW5jb3VudGVyTGlzdCBMaXN0PEVuY291bnRlcj4pOgogIEFueVRydWUoRW5jb3VudGVyTGlzdCBWaXNpdAogICAgICByZXR1cm4gRGlhZ25vc2lzLm92ZXJsYXBzRGF5T2ZFbmNvdW50ZXIoVmlzaXQpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBvdmVybGFwc0RheU9mRW5jb3VudGVyKERpYWdub3NpcyBDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zLCBUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKICBUaGVFbmNvdW50ZXIgVmlzaXQKICAgIHdoZXJlIERpYWdub3Npcy5pc1ZlcmlmaWVkICggKQogICAgcmV0dXJuIERpYWdub3Npcy5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIG92ZXJsYXBzIGRheSBvZiBWaXNpdC5wZXJpb2QKCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gb3ZlcmxhcHNBZnRlckRheU9mRW5jb3VudGVyKEV2ZW50IENob2ljZTxBbGxlcmd5SW50b2xlcmFuY2UsIENvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnM+LCBFbmNvdW50ZXJMaXN0IExpc3Q8RW5jb3VudGVyPik6CiAgQW55VHJ1ZShFbmNvdW50ZXJMaXN0IFZpc2l0CiAgICAgIHJldHVybgogICAgICBjYXNlCiAgICAgICAgd2hlbiBFdmVudCBpcyBBbGxlcmd5SW50b2xlcmFuY2UgdGhlbiBJbnRlcnZhbFtzdGFydCBvZiBFdmVudC5vbnNldC50b0ludGVydmFsKCksIEV2ZW50Lmxhc3RPY2N1cnJlbmNlXW92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QKICAgICAgICAgIGFuZChFdmVudC5jbGluaWNhbFN0YXR1cyBpcyBudWxsCiAgICAgICAgICAgICAgb3IgRXZlbnQuY2xpbmljYWxTdGF0dXMgfiBGSElSQ29tbW9uLiJhbGxlcmd5LWFjdGl2ZSIKICAgICAgICAgICkKICAgICAgICAgIGFuZChFdmVudC52ZXJpZmljYXRpb25TdGF0dXMgaXMgbnVsbAogICAgICAgICAgICAgIG9yIEV2ZW50LnZlcmlmaWNhdGlvblN0YXR1cyB+IEZISVJDb21tb24uImFsbGVyZ3ktY29uZmlybWVkIgogICAgICAgICAgKQogICAgICAgIHdoZW4gRXZlbnQgaXMgQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJucyB0aGVuIEV2ZW50LmlzVmVyaWZpZWQoKQogICAgICAgICAgYW5kIEV2ZW50LnByZXZhbGVuY2VJbnRlcnZhbCgpIG92ZXJsYXBzIGFmdGVyIGRheSBvZiBWaXNpdC5wZXJpb2QgCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBhdXRob3JlZER1cmluZ0RheU9mRW5jb3VudGVyKE9yZGVyIENob2ljZTxNZWRpY2F0aW9uUmVxdWVzdCwgTWVkaWNhdGlvbk5vdFJlcXVlc3RlZD4sIEVuY291bnRlckxpc3QgTGlzdDxFbmNvdW50ZXI+KToKICBBbnlUcnVlKEVuY291bnRlckxpc3QgVmlzaXQKICAgICAgcmV0dXJuCiAgICAgIGNhc2UKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25SZXF1ZXN0IHRoZW4gT3JkZXIuYXV0aG9yZWRPbiBkdXJpbmcgZGF5IG9mIFZpc2l0LnBlcmlvZAogICAgICAgICAgYW5kIE9yZGVyLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0KICAgICAgICAgIGFuZCBPcmRlci5kb05vdFBlcmZvcm0gaXMgbm90IHRydWUKICAgICAgICB3aGVuIE9yZGVyIGlzIE1lZGljYXRpb25Ob3RSZXF1ZXN0ZWQgdGhlbiBPcmRlci5hdXRob3JlZE9uIGR1cmluZyBkYXkgb2YgVmlzaXQucGVyaW9kCiAgICAgICAgICBhbmQgT3JkZXIuaW50ZW50IGluIHsgJ29yZGVyJywgJ29yaWdpbmFsLW9yZGVyJywgJ3JlZmxleC1vcmRlcicsICdmaWxsZXItb3JkZXInLCAnaW5zdGFuY2Utb3JkZXInIH0gCiAgICAgICAgZWxzZSBmYWxzZSAKICAgICAgZW5kCiAgKQ=="/>
    <url value="https://madie.cms.gov/Library-CMS145FHIRCADBBlockerTPMIorLVSD.cql"/>
  </content>
</Library>