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

: CQMCommon - JSON Representation

Active as of 2025-10-02

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CQMCommon",
  "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"
    ]
  },
  "language" : "en",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"col-12\">\n  <table class=\"narrative-table\">\n    <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Metadata</th>\n\n\n</tr>\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Title</th>\n\n\n<td class=\"content-container\">CQMCommon</td>\n</tr>\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n<td class=\"content-container\">4.1.000</td>\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<td class=\"content-container\">67dda0df9e9ab93ec36dad4f</td>\n</tr>\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\">Steward (Publisher)</th>\n\n\n<td class=\"content-container\">ICF</td>\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<td class=\"content-container\">This library contains declarations that are commonly used in eCQMs and shared across the logic of multiple measures, such as the Encounter Inpatient value set, and the Inpatient Encounter population criteria definition. This library also contains functions for calculating hospitalization duration as well as hospital arrival and departure times.</td>\n</tr>\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n<td class=\"content-container\">[http://terminology.hl7.org/CodeSystem/library-type#logic-library]</td>\n</tr>\n\n\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Location\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-location\n    <br/>        \n  \n   \n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Condition\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-condition-encounter-diagnosis\n    <br/>        \n  \n   \n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Condition\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-condition-problems-health-concerns\n    <br/>        \n  \n   \n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Encounter\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: type, status, status.value, period, rank, rank.value, use, condition, location, location.type, diagnosis, diagnosis.code, onAdmission\n    <br/>\n   \n  \n    <em>Code Filter(s)</em>: \n    <br/>\n  \n  \n    <span class=\"tab-one\"><em>Path</em>: type</span>\n    <br/>\n  \n  \n  \n    <span class=\"tab-one\"><em>ValueSet</em>:</span> http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307\n    <br/> \n  \n  \n  \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Encounter\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: type, status, status.value, period, rank, rank.value, use, condition, location, location.type, diagnosis, diagnosis.code, onAdmission\n    <br/>\n   \n  \n    <em>Code Filter(s)</em>: \n    <br/>\n  \n  \n    <span class=\"tab-one\"><em>Path</em>: type</span>\n    <br/>\n  \n  \n  \n    <span class=\"tab-one\"><em>ValueSet</em>:</span> http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1111.143\n    <br/> \n  \n  \n  \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Encounter\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: type, status, status.value, period, rank, rank.value, use, condition, location, location.type, diagnosis, diagnosis.code, onAdmission\n    <br/>\n   \n  \n    <em>Code Filter(s)</em>: \n    <br/>\n  \n  \n    <span class=\"tab-one\"><em>Path</em>: type</span>\n    <br/>\n  \n  \n  \n    <span class=\"tab-one\"><em>ValueSet</em>:</span> http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292\n    <br/> \n  \n  \n  \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Encounter\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: type, period, rank, rank.value, use, condition, location, location.type, diagnosis, diagnosis.code, onAdmission\n    <br/>\n   \n  \n    <em>Code Filter(s)</em>: \n    <br/>\n  \n  \n    <span class=\"tab-one\"><em>Path</em>: type</span>\n    <br/>\n  \n  \n  \n    <span class=\"tab-one\"><em>ValueSet</em>:</span> http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.38\n    <br/> \n  \n  \n  \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Encounter\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-encounter\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: period, rank, rank.value, use, condition, location, location.type, diagnosis, diagnosis.code, type, onAdmission\n    <br/>\n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Claim\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-claim\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: status, status.value, use, use.value, item\n    <br/>\n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: MedicationRequest\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medicationrequest\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: medication\n    <br/>\n   \n   \n  </td>\n</tr>\n\n<tr>\n  <th scope=\"row\" class=\"row-header\">Data Requirement</th>\n  <td class=\"content-container\">\n    <em>Type</em>: Medication\n    <br/>\n  \n    <em>Profile(s)</em>: \n  \n    http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-medication\n    <br/>        \n  \n   \n   \n    <em>Must Support Elements</em>: code\n    <br/>\n   \n   \n  </td>\n</tr>\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\">library CQMCommon version '4.1.000'\n\nusing QICore version '6.0.0'\n\ninclude FHIRHelpers version '4.4.000' called FHIRHelpers\ninclude QICoreCommon version '4.0.000' called QICoreCommon\n\ncodesystem DiagnosisRole: 'http://terminology.hl7.org/CodeSystem/diagnosis-role'\ncodesystem &quot;Diagnosis Type&quot;: 'http://terminology.hl7.org/CodeSystem/ex-diagnosistype'\ncodesystem &quot;Procedure Type&quot;: 'http://terminology.hl7.org/CodeSystem/ex-procedure-type'\ncodesystem &quot;Present On Admission Indicators&quot;: 'https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Payment/HospitalAcqCond/Coding'\n\nvalueset &quot;Emergency Department Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'\nvalueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\nvalueset &quot;Intensive Care Unit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1029.206'\nvalueset &quot;Observation Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1111.143'\nvalueset &quot;Outpatient Surgery Service&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.38'\nvalueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'\n\ncode &quot;Billing&quot;: 'billing' from DiagnosisRole display 'Billing'\ncode &quot;Admitting Diagnosis&quot;: 'admitting' from &quot;Diagnosis Type&quot; display 'Admitting Diagnosis'\ncode &quot;Clinical Diagnosis&quot;: 'clinical' from &quot;Diagnosis Type&quot; display 'Clinical Diagnosis'\ncode &quot;Differential Diagnosis&quot;: 'differential' from &quot;Diagnosis Type&quot; display 'Differential Diagnosis'\ncode &quot;Discharge Diagnosis&quot;: 'discharge' from &quot;Diagnosis Type&quot; display 'Discharge Diagnosis'\ncode &quot;Laboratory Diagnosis&quot;: 'laboratory' from &quot;Diagnosis Type&quot; display 'Laboratory Diagnosis'\ncode &quot;Nursing Diagnosis&quot;: 'nursing' from &quot;Diagnosis Type&quot; display 'Nursing Diagnosis'\ncode &quot;Prenatal Diagnosis&quot;: 'prenatal' from &quot;Diagnosis Type&quot; display 'Prenatal Diagnosis'\ncode &quot;Principal Diagnosis&quot;: 'principal' from &quot;Diagnosis Type&quot; display 'Principal Diagnosis'\ncode &quot;Radiology Diagnosis&quot;: 'radiology' from &quot;Diagnosis Type&quot; display 'Radiology Diagnosis'\ncode &quot;Remote Diagnosis&quot;: 'remote' from &quot;Diagnosis Type&quot; display 'Remote Diagnosis'\ncode &quot;Retrospective Diagnosis&quot;: 'retrospective' from &quot;Diagnosis Type&quot; display 'Retrospetive Diagnosis'\ncode &quot;Self Diagnosis&quot;: 'self' from &quot;Diagnosis Type&quot; display 'Self Diagnosis'\ncode &quot;Primary procedure&quot;: 'primary' from &quot;Procedure Type&quot; display 'Primary procedure'\ncode &quot;POA-Y&quot;: 'Y' from &quot;Present On Admission Indicators&quot; display 'POA-Y'\ncode &quot;POA-N&quot;: 'N' from &quot;Present On Admission Indicators&quot; display 'POA-N'\ncode &quot;POA-W&quot;: 'W' from &quot;Present On Admission Indicators&quot; display 'POA-W'\ncode &quot;POA-1&quot;: '1' from &quot;Present On Admission Indicators&quot; display 'POA-1'\ncode &quot;POA-U&quot;: 'U' from &quot;Present On Admission Indicators&quot; display 'POA-U'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n\ncontext Patient\n\ndefine &quot;Inpatient Encounter&quot;:\n  [Encounter: &quot;Encounter Inpatient&quot;] EncounterInpatient\n    where EncounterInpatient.status = 'finished'\n      and EncounterInpatient.period ends during day of &quot;Measurement Period&quot;\n\n/*\n@description: Returns an interval of date values extracted from the input interval of date-time values\n@comment: This function returns an interval constructed using the `date from` extractor on the start\nand end values of the input date-time interval. Note that using a precision specifier such as `day of`\nas part of a timing phrase is preferred to communicate intent to perform day-level comparison, as well\nas for general readability.\n*/\ndefine function &quot;ToDateInterval&quot;(period Interval&lt;DateTime&gt;):\n  Interval[date from start of period, date from end of period]\n\n/*\n@description: Calculates the difference in calendar days between the start and end of the given interval.\n@deprecated: This function in deprecated. Use the fluent function `lengthInDays()` instead.\n*/\ndefine function &quot;LengthInDays&quot;(Value Interval&lt;DateTime&gt; ):\n  difference in days between start of Value and end of Value\n\n/*\n@description: Calculates the difference in calendar days between the start and end of the given interval.\n*/\ndefine fluent function lengthInDays(Value Interval&lt;DateTime&gt; ):\n  difference in days between start of Value and end of Value\n\n/*\n@description: Returns the most recent emergency department visit, if any, that occurs 1 hour or less prior to the given encounter.\n@deprecated: This function is deprecated. Use the fluent function `edVisit()` instead.\n*/\ndefine function &quot;ED Visit&quot;(TheEncounter Encounter ):\n  Last(\n    [Encounter: &quot;Emergency Department Visit&quot;] EDVisit\n      where EDVisit.status = 'finished'\n        and EDVisit.period ends 1 hour or less on or before start of TheEncounter.period\n      sort by end of period\n    )\n\n/*\n@description: Returns the most recent emergency department visit, if any, that occurs 1 hour or less prior to the given encounter.\n*/\ndefine fluent function edVisit(TheEncounter Encounter ):\n  Last(\n    [Encounter: &quot;Emergency Department Visit&quot;] EDVisit\n      where EDVisit.status = 'finished'\n        and EDVisit.period ends 1 hour or less on or before start of TheEncounter.period\n      sort by end of period\n    )\n\n/*\n@description: Hospitalization returns the total interval for admission to discharge for the given encounter, or for the admission of any immediately prior emergency department visit to the discharge of the given encounter.\n@deprecated: This function is deprecated. Use the fluent function `hospitalization()` instead.\n*/\ndefine function &quot;Hospitalization&quot;(TheEncounter Encounter ):\n  ( &quot;ED Visit&quot;(TheEncounter) ) X\n    return\n        if X is null then TheEncounter.period\n        else Interval[start of X.period, end of TheEncounter.period)\n\n/*\n@description: Hospitalization returns the total interval for admission to discharge for the given encounter, or for the admission of any immediately prior emergency department visit to the discharge of the given encounter.\n*/\ndefine fluent function hospitalization(TheEncounter Encounter ):\n  (TheEncounter.&quot;edVisit&quot;()) X\n    return\n        if X is null then TheEncounter.period\n        else Interval[start of X.period, end of TheEncounter.period]\n\n/*\n@description: Returns list of all locations within an encounter, including locations for immediately prior ED visit.\n@deprecated: This function is deprecated. Use the fluent function `hospitalizationLocations()` instead.\n*/\ndefine function &quot;Hospitalization Locations&quot;(TheEncounter Encounter ):\n  ( &quot;ED Visit&quot;(TheEncounter) ) EDEncounter\n    return\n        if EDEncounter is null then TheEncounter.location\n        else flatten { EDEncounter.location, TheEncounter.location }\n\n/*\n@description: Returns list of all locations within an encounter, including locations for immediately prior ED visit.\n*/\ndefine fluent function hospitalizationLocations(TheEncounter Encounter ):\n  ( TheEncounter.&quot;edVisit&quot;()) EDEncounter\n    return\n        if EDEncounter is null then TheEncounter.location\n        else flatten { EDEncounter.location, TheEncounter.location }\n\n/*\n@description: Returns the length of stay in days (i.e. the number of days between admission and discharge) for the given encounter, or from the admission of any immediately prior emergency department visit to the discharge of the encounter\n@deprecated: This function is deprecated. Use the fluent function `hospitalizationLengthOfStay()` instead.\n*/\ndefine function &quot;Hospitalization Length of Stay&quot;(TheEncounter Encounter ):\n  LengthInDays(&quot;Hospitalization&quot;(TheEncounter))\n\n/*\n@description: Returns the length of stay in days (i.e. the number of days between admission and discharge) for the given encounter, or from the admission of any immediately prior emergency department visit to the discharge of the encounter\n*/\ndefine fluent function hospitalizationLengthOfStay(TheEncounter Encounter ):\n   TheEncounter.&quot;hospitalization&quot;().&quot;lengthInDays&quot;()\n\n/*\n@description: Returns admission time for an encounter or for immediately prior emergency department visit.\n@deprecated: This function is deprecated. Use the fluent function `hospitalAdmissionTime()` instead.\n*/\ndefine function &quot;Hospital Admission Time&quot;(TheEncounter Encounter ):\n  start of &quot;Hospitalization&quot;(TheEncounter)\n\n/*\n@description: Returns admission time for an encounter or for immediately prior emergency department visit.\n*/\ndefine fluent function hospitalAdmissionTime(TheEncounter Encounter ):\n  start of (TheEncounter.&quot;hospitalization&quot;())\n\n/*\n@description: Hospital Discharge Time returns the discharge time for an encounter\n@deprecated: This function is deprecated. Use the fluent function `hospitalDischargeTime()` instead.\n*/\ndefine function &quot;Hospital Discharge Time&quot;(TheEncounter Encounter ):\n  end of TheEncounter.period\n\n/*\n@description: Hospital Discharge Time returns the discharge time for an encounter\n*/\ndefine fluent function hospitalDischargeTime(TheEncounter Encounter ):\n  end of TheEncounter.period\n\n/*\n@description: Returns earliest arrival time for an encounter including any prior ED visit.\n@deprecated: This function is deprecated. Use the fluent function `hospitalArrivalTime()` instead.\n*/\ndefine function &quot;Hospital Arrival Time&quot;(TheEncounter Encounter ):\n  start of First(\n  \t    (&quot;Hospitalization Locations&quot;(TheEncounter) ) HospitalLocation\n  \t\t\tsort by start of period\n  \t).period\n\n/*\n@description: Returns earliest arrival time for an encounter including any prior ED visit.\n*/\ndefine fluent function hospitalArrivalTime(TheEncounter Encounter ):\n  start of First(\n  \t    (TheEncounter.&quot;hospitalizationLocations&quot;()) HospitalLocation\n  \t\t\tsort by start of period\n  \t).period\n\n/*\n@description: Returns the latest departure time for encounter including any prior ED visit.\n@deprecated: This function is deprecated. Use the fluent function `hospitalDepartureTime()` instead.\n*/\ndefine function &quot;Hospital Departure Time&quot;(TheEncounter Encounter):\n\tend of Last(\n\t    ( &quot;Hospitalization Locations&quot;(TheEncounter) ) HospitalLocation\n\t\t\tsort by start of period\n\t).period\n\n/*\n@description: Returns the latest departure time for encounter including any prior ED visit.\n*/\ndefine fluent function hospitalDepartureTime(TheEncounter Encounter):\n\tend of Last(\n\t    (TheEncounter.&quot;hospitalizationLocations&quot;()) HospitalLocation\n\t\t\tsort by start of period\n\t).period\n\n/*\n@description: Returns the emergency department arrival time for the encounter.\n@deprecated. This function is deprecated. Use the fluent function `emergencyDepartmentArrivalTime()` instead.\n*/\ndefine function &quot;Emergency Department Arrival Time&quot;(TheEncounter Encounter):\n\tstart of (\n\t    singleton from (\n\t        ( &quot;Hospitalization Locations&quot;(TheEncounter) ) HospitalLocation\n\t\t\t\twhere GetLocation(HospitalLocation.location).type in &quot;Emergency Department Visit&quot;\n\t\t)\n\t).period\n\n/*\n@description: Returns the emergency department arrival time for the encounter.\n*/\ndefine fluent function emergencyDepartmentArrivalTime(TheEncounter Encounter):\n\tstart of (\n\t    singleton from (\n\t        ( (TheEncounter.&quot;hospitalizationLocations&quot;()) ) HospitalLocation\n\t\t\t\twhere GetLocation(HospitalLocation.location).type in &quot;Emergency Department Visit&quot;\n\t\t)\n\t).period\n\n/*\n@description: Hospitalization with Observation and Outpatient Surgery Service returns the total interval from the start of any immediately prior emergency department visit, outpatient surgery visit or observation visit to the discharge of the given encounter.\n@deprecated: This function is deprecated. Use the fluent function `hospitalizationWithObservationAndOutpatientSurgeryService()` instead.\n*/\ndefine function &quot;HospitalizationWithObservationAndOutpatientSurgeryService&quot;(TheEncounter &quot;Encounter&quot; ):\n  TheEncounter Visit\n\t  let ObsVisit: Last([Encounter: &quot;Observation Services&quot;] LastObs\n\t\t  \twhere LastObs.status = 'finished'\n          and LastObs.period ends 1 hour or less on or before start of Visit.period\n\t\t\t  sort by\tend of period\n    \t),\n    \tVisitStart: Coalesce(start of ObsVisit.period, start of Visit.period),\n    \tEDVisit: Last([Encounter: &quot;Emergency Department Visit&quot;] LastED\n\t\t\t  where LastED.status = 'finished'\n          and LastED.period ends 1 hour or less on or before VisitStart\n\t\t\t  sort by\tend of period\n    \t),\n    \tVisitStartWithED: Coalesce(start of EDVisit.period, VisitStart),\n    \tOutpatientSurgeryVisit: Last([Encounter: &quot;Outpatient Surgery Service&quot;] LastSurgeryOP\n\t\t\t  where LastSurgeryOP.period ends 1 hour or less on or before VisitStartWithED\n\t\t\t  sort by\tend of period\n    \t)\n  \treturn Interval[Coalesce(start of OutpatientSurgeryVisit.period, VisitStartWithED), end of Visit.period]\n\n/*\n@description: Hospitalization with Observation and Outpatient Surgery Service returns the total interval from the start of any immediately prior emergency department visit, outpatient surgery visit or observation visit to the discharge of the given encounter.\n*/\ndefine fluent function hospitalizationWithObservationAndOutpatientSurgeryService(TheEncounter &quot;Encounter&quot; ):\n  TheEncounter Visit\n\t  let ObsVisit: Last([Encounter: &quot;Observation Services&quot;] LastObs\n\t\t  \twhere LastObs.status = 'finished'\n          and LastObs.period ends 1 hour or less on or before start of Visit.period\n\t\t\t  sort by\tend of period\n    \t),\n    \tVisitStart: Coalesce(start of ObsVisit.period, start of Visit.period),\n    \tEDVisit: Last([Encounter: &quot;Emergency Department Visit&quot;] LastED\n\t\t\t  where LastED.status = 'finished'\n          and LastED.period ends 1 hour or less on or before VisitStart\n\t\t\t  sort by\tend of period\n    \t),\n    \tVisitStartWithED: Coalesce(start of EDVisit.period, VisitStart),\n    \tOutpatientSurgeryVisit: Last([Encounter: &quot;Outpatient Surgery Service&quot;] LastSurgeryOP\n\t\t\t  where LastSurgeryOP.period ends 1 hour or less on or before VisitStartWithED\n\t\t\t  sort by\tend of period\n    \t)\n  \treturn Interval[Coalesce(start of OutpatientSurgeryVisit.period, VisitStartWithED), end of Visit.period]\n\n/*\n@description: Hospitalization with Observation returns the total interval from the start of any immediately prior emergency department visit through the observation visit to the discharge of the given encounter\n@deprecated: This function is deprecated. Use the fluent function `hospitalizationWithObservation()` instead.\n*/\ndefine function &quot;HospitalizationWithObservation&quot;(TheEncounter Encounter ):\n  TheEncounter Visit\n  \t\tlet ObsVisit: Last([Encounter: &quot;Observation Services&quot;] LastObs\n  \t\t\t\twhere LastObs.status = 'finished'\n            and LastObs.period ends 1 hour or less on or before start of Visit.period\n  \t\t\t\tsort by end of period\n  \t\t\t),\n  \t\t\tVisitStart: Coalesce(start of ObsVisit.period, start of Visit.period),\n  \t\t\tEDVisit: Last([Encounter: &quot;Emergency Department Visit&quot;] LastED\n  \t\t\t\twhere LastED.status = 'finished'\n            and LastED.period ends 1 hour or less on or before VisitStart\n  \t\t\t\tsort by end of period\n  \t\t\t)\n  \t\treturn Interval[Coalesce(start of EDVisit.period, VisitStart), end of Visit.period]\n\n/*\n@description: Hospitalization with Observation returns the total interval from the start of any immediately prior emergency department visit through the observation visit to the discharge of the given encounter\n*/\ndefine fluent function hospitalizationWithObservation(TheEncounter Encounter ):\n  TheEncounter Visit\n  \t\tlet ObsVisit: Last([Encounter: &quot;Observation Services&quot;] LastObs\n  \t\t\t\twhere LastObs.status = 'finished'\n            and LastObs.period ends 1 hour or less on or before start of Visit.period\n  \t\t\t\tsort by end of period\n  \t\t\t),\n  \t\t\tVisitStart: Coalesce(start of ObsVisit.period, start of Visit.period),\n  \t\t\tEDVisit: Last([Encounter: &quot;Emergency Department Visit&quot;] LastED\n  \t\t\t\twhere LastED.status = 'finished'\n            and LastED.period ends 1 hour or less on or before VisitStart\n  \t\t\t\tsort by end of period\n  \t\t\t)\n  \t\treturn Interval[Coalesce(start of EDVisit.period, VisitStart), end of Visit.period]\n\n/*\n@description: Hospitalization with Observation Length of Stay returns the length in days from the start of any immediately prior emergency department visit through the observation visit to the discharge of the given encounter\n@deprecated: This function is deprecated. Use the fluent function `hospitalizationWithObservationLengthofStay()` instead.\n*/\ndefine function &quot;HospitalizationWithObservationLengthofStay&quot;(TheEncounter &quot;Encounter&quot; ):\n  &quot;LengthInDays&quot;(&quot;HospitalizationWithObservation&quot;(TheEncounter))\n\n/*\n@description: Hospitalization with Observation Length of Stay returns the length in days from the start of any immediately prior emergency department visit through the observation visit to the discharge of the given encounter\n*/\ndefine fluent function hospitalizationWithObservationLengthofStay(TheEncounter &quot;Encounter&quot; ):\n  ((TheEncounter.&quot;hospitalizationWithObservation&quot;().&quot;lengthInDays&quot;()))\n\n/*\n@description: First Inpatient Intensive Care Unit returns the first intensive care unit for the given encounter, without considering any immediately prior emergency department visit.\n@deprecated: This function is deprecated. Use the fluent function `firstInpatientIntensiveCareUnit()` instead.\n*/\ndefine function &quot;FirstInpatientIntensiveCareUnit&quot;(Encounter Encounter ):\n  First((Encounter.location)HospitalLocation\n  \t\t\twhere GetLocation(HospitalLocation.location).type in &quot;Intensive Care Unit&quot;\n  \t\t\t\tand HospitalLocation.period during Encounter.period\n  \t\t\tsort by start of period\n  \t)\n\n/*\n@description: First Inpatient Intensive Care Unit returns the first intensive care unit for the given encounter, without considering any immediately prior emergency department visit.\n*/\ndefine fluent function firstInpatientIntensiveCareUnit(Encounter Encounter ):\n  First((Encounter.location)HospitalLocation\n  \t\t\twhere GetLocation(HospitalLocation.location).type in &quot;Intensive Care Unit&quot;\n  \t\t\t\tand HospitalLocation.period during Encounter.period\n  \t\t\tsort by start of period\n  \t)\n\n/*\n@description: Returns the Condition resource referenced by the `diagnosis.condition` element of the Encounter\n@deprecated: This function is deprecated. Use the fluent function `encounterDiagnosis()` instead.\n*/\ndefine function &quot;EncounterDiagnosis&quot;(Encounter Encounter ):\n  Encounter.diagnosis D\n\treturn singleton from (([ConditionEncounterDiagnosis] union [ConditionProblemsHealthConcerns]) C where D.condition.references(C.id))\n\n/*  \n@description: Returns the Condition resources referenced by the diagnosis element of the Encounter  \n*/\ndefine fluent function encounterDiagnosis(Encounter Encounter ):\n  Encounter.reasonReference D\n    return singleton from (([ConditionEncounterDiagnosis] union [ConditionProblemsHealthConcerns]) C where D.references(C.id))\n\n\n/*\n@description: Returns the Condition resource for the given reference\n@deprecated: This function is deprecated. Use the fluent function `getCondition()` instead\n*/\ndefine function &quot;GetCondition&quot;(reference Reference):\n  singleton from (([ConditionEncounterDiagnosis] union [ConditionProblemsHealthConcerns]) C where reference.references(C.id))\n\n/*\n@description: Returns the Condition resource for the given reference\n*/\ndefine fluent function getCondition(reference Reference):\n  singleton from (([ConditionEncounterDiagnosis] union [ConditionProblemsHealthConcerns]) C where reference.references(C.id))\n\n/*\n@description: Returns the condition that is specified as the principal diagnosis for the encounter\n@deprecated: This function is deprecated. Use the fluent function `principalDiagnosis()` instead.\n*/\ndefine function &quot;PrincipalDiagnosis&quot;(Encounter Encounter):\n\tsingleton from (\n\t(Encounter.diagnosis D where D.rank = 1 and D.use ~ &quot;Billing&quot;) PD\n      return singleton from (([ConditionEncounterDiagnosis] union [ConditionProblemsHealthConcerns]) C where PD.condition.references(C.id))\n\t)\n\n/*\n@description: Returns the claim diagnosis element that is specified as the principal diagnosis for the encounter\n @comment: See the QICore 6 Authoring Patterns discussion on [Principal Diagnosis and Present on Admission](https://github.com/cqframework/CQL-Formatting-and-Usage-Wiki/wiki/Authoring-Patterns-QICore-v6.0.0#conditions-present-on-admission-and-principal-diagnoses) for more information\n*/\ndefine fluent function principalDiagnosis(encounter Encounter):\nsingleton from (\n     (encounter.claimDiagnosis()) CD\n       where CD.type.includesCode(&quot;Principal Diagnosis&quot;)\n   )\n/*\n@description: Returns the claim diagnosis elements for the given encounter\n@comment: See the QICore 6 Authoring Patterns discussion on [Principal Diagnosis and Present on Admission](https://github.com/cqframework/CQL-Formatting-and-Usage-Wiki/wiki/Authoring-Patterns-QICore-v6.0.0#conditions-present-on-admission-and-principal-diagnoses) for more information\n*/\ndefine fluent function claimDiagnosis(encounter Encounter):\n  encounter E\n    let \n      claim: ([Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E))),\n      claimItem: (claim.item I where I.encounter.references(E))\n    return claim.diagnosis D where D.sequence in claimItem.diagnosisSequence\n\n\n/*\n @description: Returns the condition that is specified as the principal diagnosis for the encounter and has a code in the given valueSet.\n @comment: See the QICore 6 Authoring Patterns discussion on [Principal Diagnosis and Present on Admission](https://github.com/cqframework/CQL-Formatting-and-Usage-Wiki/wiki/Authoring-Patterns-QICore-v6.0.0#conditions-present-on-admission-and-principal-diagnoses) for more information\n */\n define fluent function hasPrincipalDiagnosisOf(encounter Encounter, valueSet ValueSet):\n   (encounter.principalDiagnosis()) PD\n     return PD.diagnosis in valueSet\n       or PD.diagnosis.getCondition().code in valueSet\n\n/*\n @description: Returns true if the given diagnosis is present on admission, based on the given poaValueSet\n @comment: See the QICore 6 Authoring Patterns discussion on [Principal Diagnosis and Present on Admission](https://github.com/cqframework/CQL-Formatting-and-Usage-Wiki/wiki/Authoring-Patterns-QICore-v6.0.0#conditions-present-on-admission-and-principal-diagnoses) for more information\n */\n define fluent function isDiagnosisPresentOnAdmission(encounter Encounter, diagnosisValueSet ValueSet, poaValueSet ValueSet):\n   exists (\n     (encounter.claimDiagnosis()) CD\n       where CD.onAdmission in poaValueSet\n         and (\n           CD.diagnosis in diagnosisValueSet\n             or CD.diagnosis.getCondition().code in diagnosisValueSet\n         )\n   )\n\n/*\n@description: Returns the Location resource specified by the given reference\n@deprecated: This function is deprecated. Use the fluent function `getLocation()` instead.\n*/\ndefine function &quot;GetLocation&quot;(reference Reference):\n  singleton from (\n    [Location] L where reference.references(L)\n  )\n\n/*\n@description: Returns the Location resource specified by the given reference.\n*/\ndefine fluent function getLocation(reference Reference):\n  singleton from (\n    [Location] L where reference.references(L)\n  )\n\n/*\n@description: Returns the medication code for the given MedicationRequest\n@deprecated: This function is deprecated. Use the fluent function `getMedicationCode()` instead.\n*/\ndefine function &quot;GetMedicationCode&quot;(request MedicationRequest):\n  if request.medication is Concept then\n  \t  request.medication as Concept\n  \telse\n  \t  (singleton from ([Medication] M where request.medication.references(M))).code\n\n/*\n@description: Returns the medication code for the given MedicationRequest\n*/\ndefine fluent function getMedicationCode(request MedicationRequest):\n  if request.medication is Concept then\n  \t  request.medication as Concept\n  \telse\n  \t  (singleton from ([Medication] M where request.medication.references(M))).code\n  \t  \n/*\n@description: Returns the claim procedure elements for the given encounter\n*/\ndefine fluent function principalProcedure(encounter Encounter):  \t  \n  \t encounter E\n  \t let \n        claim: [Claim] C where C.status = 'active' and C.use = 'claim' and exists (C.item I where I.encounter.references(E)),\n        claimItem: claim.item I where I.encounter.references(E),\n        princProcedure: singleton from (claim.procedure P where P.sequence in claimItem.procedureSequence and P.type.includesCode(&quot;Primary procedure&quot;))\n    return princProcedure</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.4.9 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/CQMCommon",
  "version" : "5.1.000",
  "name" : "CQMCommon",
  "title" : "CQMCommon",
  "status" : "active",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2025-10-02T13:51:39+00:00",
  "publisher" : "ICF",
  "description" : "This library contains declarations that are commonly used in eCQMs and shared across the logic of multiple measures, such as the Encounter Inpatient value set, and the Inpatient Encounter population criteria definition. This library also contains functions for calculating hospitalization duration as well as hospital arrival and departure times.",
  "topic" : [
    {
      "text" : "FHIR"
    },
    {
      "text" : "CQL"
    }
  ],
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "LyoKQGRlc2NyaXB0aW9uOiBDb21tb24gRnVuY3Rpb25zIGZvciB1c2UgaW4gcXVhbGl0eSBtZWFzdXJlcwoKTk9URTogVGhpcyBsaWJyYXJ5IGlzIG5vdCBwdWJsaXNoZWQgaW4gdGhpcyBJRywgaXQgaXMgaW5jbHVkZWQgaGVyZSBmb3IgY29udmVuaWVuY2UuIFRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yCnRoaXMgbGlicmFyeSB3aWxsIGJlIHRoZSBNQURpRSBlbnZpcm9ubWVudCBvbmNlIGl0IGZ1bGx5IHN1cHBvcnRzIHVzZSBvZiBRSUNvcmUgU1RVNi1kZXJpdmVkLgoqLwpsaWJyYXJ5IENRTUNvbW1vbiB2ZXJzaW9uICc1LjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKY29kZXN5c3RlbSBEaWFnbm9zaXNSb2xlOiAnaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9kaWFnbm9zaXMtcm9sZScKY29kZXN5c3RlbSAiRGlhZ25vc2lzIFR5cGUiOiAnaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9leC1kaWFnbm9zaXN0eXBlJwpjb2Rlc3lzdGVtICJQcm9jZWR1cmUgVHlwZSI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL2V4LXByb2NlZHVyZS10eXBlJwpjb2Rlc3lzdGVtICJQcmVzZW50IE9uIEFkbWlzc2lvbiBJbmRpY2F0b3JzIjogJ2h0dHBzOi8vd3d3LmNtcy5nb3YvTWVkaWNhcmUvTWVkaWNhcmUtRmVlLWZvci1TZXJ2aWNlLVBheW1lbnQvSG9zcGl0YWxBY3FDb25kL0NvZGluZycKCnZhbHVlc2V0ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjkyJwp2YWx1ZXNldCAiRW5jb3VudGVyIElucGF0aWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4zMDcnCnZhbHVlc2V0ICJJbnRlbnNpdmUgQ2FyZSBVbml0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTAyOS4yMDYnCnZhbHVlc2V0ICJPYnNlcnZhdGlvbiBTZXJ2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTEuMTQzJwp2YWx1ZXNldCAiT3V0cGF0aWVudCBTdXJnZXJ5IFNlcnZpY2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTEwLjM4Jwp2YWx1ZXNldCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTQ3LjE5NycKCmNvZGUgIkJpbGxpbmciOiAnYmlsbGluZycgZnJvbSBEaWFnbm9zaXNSb2xlIGRpc3BsYXkgJ0JpbGxpbmcnCmNvZGUgIkFkbWl0dGluZyBEaWFnbm9zaXMiOiAnYWRtaXR0aW5nJyBmcm9tICJEaWFnbm9zaXMgVHlwZSIgZGlzcGxheSAnQWRtaXR0aW5nIERpYWdub3NpcycKY29kZSAiQ2xpbmljYWwgRGlhZ25vc2lzIjogJ2NsaW5pY2FsJyBmcm9tICJEaWFnbm9zaXMgVHlwZSIgZGlzcGxheSAnQ2xpbmljYWwgRGlhZ25vc2lzJwpjb2RlICJEaWZmZXJlbnRpYWwgRGlhZ25vc2lzIjogJ2RpZmZlcmVudGlhbCcgZnJvbSAiRGlhZ25vc2lzIFR5cGUiIGRpc3BsYXkgJ0RpZmZlcmVudGlhbCBEaWFnbm9zaXMnCmNvZGUgIkRpc2NoYXJnZSBEaWFnbm9zaXMiOiAnZGlzY2hhcmdlJyBmcm9tICJEaWFnbm9zaXMgVHlwZSIgZGlzcGxheSAnRGlzY2hhcmdlIERpYWdub3NpcycKY29kZSAiTGFib3JhdG9yeSBEaWFnbm9zaXMiOiAnbGFib3JhdG9yeScgZnJvbSAiRGlhZ25vc2lzIFR5cGUiIGRpc3BsYXkgJ0xhYm9yYXRvcnkgRGlhZ25vc2lzJwpjb2RlICJOdXJzaW5nIERpYWdub3NpcyI6ICdudXJzaW5nJyBmcm9tICJEaWFnbm9zaXMgVHlwZSIgZGlzcGxheSAnTnVyc2luZyBEaWFnbm9zaXMnCmNvZGUgIlByZW5hdGFsIERpYWdub3NpcyI6ICdwcmVuYXRhbCcgZnJvbSAiRGlhZ25vc2lzIFR5cGUiIGRpc3BsYXkgJ1ByZW5hdGFsIERpYWdub3NpcycKY29kZSAiUHJpbmNpcGFsIERpYWdub3NpcyI6ICdwcmluY2lwYWwnIGZyb20gIkRpYWdub3NpcyBUeXBlIiBkaXNwbGF5ICdQcmluY2lwYWwgRGlhZ25vc2lzJwpjb2RlICJSYWRpb2xvZ3kgRGlhZ25vc2lzIjogJ3JhZGlvbG9neScgZnJvbSAiRGlhZ25vc2lzIFR5cGUiIGRpc3BsYXkgJ1JhZGlvbG9neSBEaWFnbm9zaXMnCmNvZGUgIlJlbW90ZSBEaWFnbm9zaXMiOiAncmVtb3RlJyBmcm9tICJEaWFnbm9zaXMgVHlwZSIgZGlzcGxheSAnUmVtb3RlIERpYWdub3NpcycKY29kZSAiUmV0cm9zcGVjdGl2ZSBEaWFnbm9zaXMiOiAncmV0cm9zcGVjdGl2ZScgZnJvbSAiRGlhZ25vc2lzIFR5cGUiIGRpc3BsYXkgJ1JldHJvc3BldGl2ZSBEaWFnbm9zaXMnCmNvZGUgIlNlbGYgRGlhZ25vc2lzIjogJ3NlbGYnIGZyb20gIkRpYWdub3NpcyBUeXBlIiBkaXNwbGF5ICdTZWxmIERpYWdub3NpcycKY29kZSAiUHJpbWFyeSBwcm9jZWR1cmUiOiAncHJpbWFyeScgZnJvbSAiUHJvY2VkdXJlIFR5cGUiIGRpc3BsYXkgJ1ByaW1hcnkgcHJvY2VkdXJlJwpjb2RlICJQT0EtWSI6ICdZJyBmcm9tICJQcmVzZW50IE9uIEFkbWlzc2lvbiBJbmRpY2F0b3JzIiBkaXNwbGF5ICdQT0EtWScKY29kZSAiUE9BLU4iOiAnTicgZnJvbSAiUHJlc2VudCBPbiBBZG1pc3Npb24gSW5kaWNhdG9ycyIgZGlzcGxheSAnUE9BLU4nCmNvZGUgIlBPQS1XIjogJ1cnIGZyb20gIlByZXNlbnQgT24gQWRtaXNzaW9uIEluZGljYXRvcnMiIGRpc3BsYXkgJ1BPQS1XJwpjb2RlICJQT0EtMSI6ICcxJyBmcm9tICJQcmVzZW50IE9uIEFkbWlzc2lvbiBJbmRpY2F0b3JzIiBkaXNwbGF5ICdQT0EtMScKY29kZSAiUE9BLVUiOiAnVScgZnJvbSAiUHJlc2VudCBPbiBBZG1pc3Npb24gSW5kaWNhdG9ycyIgZGlzcGxheSAnUE9BLVUnCgpwYXJhbWV0ZXIgIk1lYXN1cmVtZW50IFBlcmlvZCIgSW50ZXJ2YWw8RGF0ZVRpbWU+CiAgZGVmYXVsdCBJbnRlcnZhbFtAMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaLCBAMjAyNy0wMS0wMVQwMDowMDowMC4wMDBaKQoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgIklucGF0aWVudCBFbmNvdW50ZXIiOgogIFtFbmNvdW50ZXI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gRW5jb3VudGVySW5wYXRpZW50CiAgICB3aGVyZSBFbmNvdW50ZXJJbnBhdGllbnQuc3RhdHVzID0gJ2ZpbmlzaGVkJwogICAgICBhbmQgRW5jb3VudGVySW5wYXRpZW50LnBlcmlvZCBlbmRzIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBhbiBpbnRlcnZhbCBvZiBkYXRlIHZhbHVlcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgaW50ZXJ2YWwgb2YgZGF0ZS10aW1lIHZhbHVlcwpAY29tbWVudDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVydmFsIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBgZGF0ZSBmcm9tYCBleHRyYWN0b3Igb24gdGhlIHN0YXJ0CmFuZCBlbmQgdmFsdWVzIG9mIHRoZSBpbnB1dCBkYXRlLXRpbWUgaW50ZXJ2YWwuIE5vdGUgdGhhdCB1c2luZyBhIHByZWNpc2lvbiBzcGVjaWZpZXIgc3VjaCBhcyBgZGF5IG9mYAphcyBwYXJ0IG9mIGEgdGltaW5nIHBocmFzZSBpcyBwcmVmZXJyZWQgdG8gY29tbXVuaWNhdGUgaW50ZW50IHRvIHBlcmZvcm0gZGF5LWxldmVsIGNvbXBhcmlzb24sIGFzIHdlbGwKYXMgZm9yIGdlbmVyYWwgcmVhZGFiaWxpdHkuCiovCmRlZmluZSBmdW5jdGlvbiAiVG9EYXRlSW50ZXJ2YWwiKHBlcmlvZCBJbnRlcnZhbDxEYXRlVGltZT4pOgogIEludGVydmFsW2RhdGUgZnJvbSBzdGFydCBvZiBwZXJpb2QsIGRhdGUgZnJvbSBlbmQgb2YgcGVyaW9kXQoKLyoKQGRlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGluIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZ2l2ZW4gaW50ZXJ2YWwuCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGluIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBsZW5ndGhJbkRheXMoKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJMZW5ndGhJbkRheXMiKFZhbHVlIEludGVydmFsPERhdGVUaW1lPiApOgogIGRpZmZlcmVuY2UgaW4gZGF5cyBiZXR3ZWVuIHN0YXJ0IG9mIFZhbHVlIGFuZCBlbmQgb2YgVmFsdWUKCi8qCkBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlcyB0aGUgZGlmZmVyZW5jZSBpbiBjYWxlbmRhciBkYXlzIGJldHdlZW4gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGdpdmVuIGludGVydmFsLgoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGxlbmd0aEluRGF5cyhWYWx1ZSBJbnRlcnZhbDxEYXRlVGltZT4gKToKICBkaWZmZXJlbmNlIGluIGRheXMgYmV0d2VlbiBzdGFydCBvZiBWYWx1ZSBhbmQgZW5kIG9mIFZhbHVlCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIG1vc3QgcmVjZW50IGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0LCBpZiBhbnksIHRoYXQgb2NjdXJzIDEgaG91ciBvciBsZXNzIHByaW9yIHRvIHRoZSBnaXZlbiBlbmNvdW50ZXIuCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBlZFZpc2l0KClgIGluc3RlYWQuCiovCmRlZmluZSBmdW5jdGlvbiAiRUQgVmlzaXQiKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToKICBMYXN0KAogICAgW0VuY291bnRlcjogIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0Il0gRURWaXNpdAogICAgICB3aGVyZSBFRFZpc2l0LnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgICBhbmQgRURWaXNpdC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZAogICAgICBzb3J0IGJ5IGVuZCBvZiBwZXJpb2QKICAgICkKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQsIGlmIGFueSwgdGhhdCBvY2N1cnMgMSBob3VyIG9yIGxlc3MgcHJpb3IgdG8gdGhlIGdpdmVuIGVuY291bnRlci4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlZFZpc2l0KFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToKICBMYXN0KAogICAgW0VuY291bnRlcjogIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0Il0gRURWaXNpdAogICAgICB3aGVyZSBFRFZpc2l0LnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgICBhbmQgRURWaXNpdC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZAogICAgICBzb3J0IGJ5IGVuZCBvZiBwZXJpb2QKICAgICkKCi8qCkBkZXNjcmlwdGlvbjogSG9zcGl0YWxpemF0aW9uIHJldHVybnMgdGhlIHRvdGFsIGludGVydmFsIGZvciBhZG1pc3Npb24gdG8gZGlzY2hhcmdlIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCBvciBmb3IgdGhlIGFkbWlzc2lvbiBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyLgpAZGVwcmVjYXRlZDogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGZsdWVudCBmdW5jdGlvbiBgaG9zcGl0YWxpemF0aW9uKClgIGluc3RlYWQuCiovCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWxpemF0aW9uIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6CiAgKCAiRUQgVmlzaXQiKFRoZUVuY291bnRlcikgKSBYCiAgICByZXR1cm4KICAgICAgICBpZiBYIGlzIG51bGwgdGhlbiBUaGVFbmNvdW50ZXIucGVyaW9kCiAgICAgICAgZWxzZSBJbnRlcnZhbFtzdGFydCBvZiBYLnBlcmlvZCwgZW5kIG9mIFRoZUVuY291bnRlci5wZXJpb2QpCgovKgpAZGVzY3JpcHRpb246IEhvc3BpdGFsaXphdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmb3IgYWRtaXNzaW9uIHRvIGRpc2NoYXJnZSBmb3IgdGhlIGdpdmVuIGVuY291bnRlciwgb3IgZm9yIHRoZSBhZG1pc3Npb24gb2YgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0IHRvIHRoZSBkaXNjaGFyZ2Ugb2YgdGhlIGdpdmVuIGVuY291bnRlci4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb24oVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogIChUaGVFbmNvdW50ZXIuImVkVmlzaXQiKCkpIFgKICAgIHJldHVybgogICAgICAgIGlmIFggaXMgbnVsbCB0aGVuIFRoZUVuY291bnRlci5wZXJpb2QKICAgICAgICBlbHNlIEludGVydmFsW3N0YXJ0IG9mIFgucGVyaW9kLCBlbmQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZF0KCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBsaXN0IG9mIGFsbCBsb2NhdGlvbnMgd2l0aGluIGFuIGVuY291bnRlciwgaW5jbHVkaW5nIGxvY2F0aW9ucyBmb3IgaW1tZWRpYXRlbHkgcHJpb3IgRUQgdmlzaXQuCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBob3NwaXRhbGl6YXRpb25Mb2NhdGlvbnMoKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbGl6YXRpb24gTG9jYXRpb25zIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6CiAgKCAiRUQgVmlzaXQiKFRoZUVuY291bnRlcikgKSBFREVuY291bnRlcgogICAgcmV0dXJuCiAgICAgICAgaWYgRURFbmNvdW50ZXIgaXMgbnVsbCB0aGVuIFRoZUVuY291bnRlci5sb2NhdGlvbgogICAgICAgIGVsc2UgZmxhdHRlbiB7IEVERW5jb3VudGVyLmxvY2F0aW9uLCBUaGVFbmNvdW50ZXIubG9jYXRpb24gfQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIGxpc3Qgb2YgYWxsIGxvY2F0aW9ucyB3aXRoaW4gYW4gZW5jb3VudGVyLCBpbmNsdWRpbmcgbG9jYXRpb25zIGZvciBpbW1lZGlhdGVseSBwcmlvciBFRCB2aXNpdC4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25Mb2NhdGlvbnMoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogICggVGhlRW5jb3VudGVyLiJlZFZpc2l0IigpKSBFREVuY291bnRlcgogICAgcmV0dXJuCiAgICAgICAgaWYgRURFbmNvdW50ZXIgaXMgbnVsbCB0aGVuIFRoZUVuY291bnRlci5sb2NhdGlvbgogICAgICAgIGVsc2UgZmxhdHRlbiB7IEVERW5jb3VudGVyLmxvY2F0aW9uLCBUaGVFbmNvdW50ZXIubG9jYXRpb24gfQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBsZW5ndGggb2Ygc3RheSBpbiBkYXlzIChpLmUuIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGFkbWlzc2lvbiBhbmQgZGlzY2hhcmdlKSBmb3IgdGhlIGdpdmVuIGVuY291bnRlciwgb3IgZnJvbSB0aGUgYWRtaXNzaW9uIG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBlbmNvdW50ZXIKQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGhvc3BpdGFsaXphdGlvbkxlbmd0aE9mU3RheSgpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbiBMZW5ndGggb2YgU3RheSIoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogIExlbmd0aEluRGF5cygiSG9zcGl0YWxpemF0aW9uIihUaGVFbmNvdW50ZXIpKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBsZW5ndGggb2Ygc3RheSBpbiBkYXlzIChpLmUuIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGFkbWlzc2lvbiBhbmQgZGlzY2hhcmdlKSBmb3IgdGhlIGdpdmVuIGVuY291bnRlciwgb3IgZnJvbSB0aGUgYWRtaXNzaW9uIG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBlbmNvdW50ZXIKKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbGl6YXRpb25MZW5ndGhPZlN0YXkoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogICBUaGVFbmNvdW50ZXIuImhvc3BpdGFsaXphdGlvbiIoKS4ibGVuZ3RoSW5EYXlzIigpCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgYWRtaXNzaW9uIHRpbWUgZm9yIGFuIGVuY291bnRlciBvciBmb3IgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQuCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBob3NwaXRhbEFkbWlzc2lvblRpbWUoKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbCBBZG1pc3Npb24gVGltZSIoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogIHN0YXJ0IG9mICJIb3NwaXRhbGl6YXRpb24iKFRoZUVuY291bnRlcikKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBhZG1pc3Npb24gdGltZSBmb3IgYW4gZW5jb3VudGVyIG9yIGZvciBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdC4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbEFkbWlzc2lvblRpbWUoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogIHN0YXJ0IG9mIChUaGVFbmNvdW50ZXIuImhvc3BpdGFsaXphdGlvbiIoKSkKCi8qCkBkZXNjcmlwdGlvbjogSG9zcGl0YWwgRGlzY2hhcmdlIFRpbWUgcmV0dXJucyB0aGUgZGlzY2hhcmdlIHRpbWUgZm9yIGFuIGVuY291bnRlcgpAZGVwcmVjYXRlZDogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGZsdWVudCBmdW5jdGlvbiBgaG9zcGl0YWxEaXNjaGFyZ2VUaW1lKClgIGluc3RlYWQuCiovCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWwgRGlzY2hhcmdlIFRpbWUiKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToKICBlbmQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZAoKLyoKQGRlc2NyaXB0aW9uOiBIb3NwaXRhbCBEaXNjaGFyZ2UgVGltZSByZXR1cm5zIHRoZSBkaXNjaGFyZ2UgdGltZSBmb3IgYW4gZW5jb3VudGVyCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxEaXNjaGFyZ2VUaW1lKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToKICBlbmQgb2YgVGhlRW5jb3VudGVyLnBlcmlvZAoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIGVhcmxpZXN0IGFycml2YWwgdGltZSBmb3IgYW4gZW5jb3VudGVyIGluY2x1ZGluZyBhbnkgcHJpb3IgRUQgdmlzaXQuCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBob3NwaXRhbEFycml2YWxUaW1lKClgIGluc3RlYWQuCiovCmRlZmluZSBmdW5jdGlvbiAiSG9zcGl0YWwgQXJyaXZhbCBUaW1lIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6CiAgc3RhcnQgb2YgRmlyc3QoCiAgCSAgICAoIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uCiAgCQkJc29ydCBieSBzdGFydCBvZiBwZXJpb2QKICAJKS5wZXJpb2QKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyBlYXJsaWVzdCBhcnJpdmFsIHRpbWUgZm9yIGFuIGVuY291bnRlciBpbmNsdWRpbmcgYW55IHByaW9yIEVEIHZpc2l0LgoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsQXJyaXZhbFRpbWUoVGhlRW5jb3VudGVyIEVuY291bnRlciApOgogIHN0YXJ0IG9mIEZpcnN0KAogIAkgICAgKFRoZUVuY291bnRlci4iaG9zcGl0YWxpemF0aW9uTG9jYXRpb25zIigpKSBIb3NwaXRhbExvY2F0aW9uCiAgCQkJc29ydCBieSBzdGFydCBvZiBwZXJpb2QKICAJKS5wZXJpb2QKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgbGF0ZXN0IGRlcGFydHVyZSB0aW1lIGZvciBlbmNvdW50ZXIgaW5jbHVkaW5nIGFueSBwcmlvciBFRCB2aXNpdC4KQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGhvc3BpdGFsRGVwYXJ0dXJlVGltZSgpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsIERlcGFydHVyZSBUaW1lIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKCWVuZCBvZiBMYXN0KAoJICAgICggIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uCgkJCXNvcnQgYnkgc3RhcnQgb2YgcGVyaW9kCgkpLnBlcmlvZAoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBsYXRlc3QgZGVwYXJ0dXJlIHRpbWUgZm9yIGVuY291bnRlciBpbmNsdWRpbmcgYW55IHByaW9yIEVEIHZpc2l0LgoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsRGVwYXJ0dXJlVGltZShUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKCWVuZCBvZiBMYXN0KAoJICAgIChUaGVFbmNvdW50ZXIuImhvc3BpdGFsaXphdGlvbkxvY2F0aW9ucyIoKSkgSG9zcGl0YWxMb2NhdGlvbgoJCQlzb3J0IGJ5IHN0YXJ0IG9mIHBlcmlvZAoJKS5wZXJpb2QKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgZW1lcmdlbmN5IGRlcGFydG1lbnQgYXJyaXZhbCB0aW1lIGZvciB0aGUgZW5jb3VudGVyLgpAZGVwcmVjYXRlZC4gVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGZsdWVudCBmdW5jdGlvbiBgZW1lcmdlbmN5RGVwYXJ0bWVudEFycml2YWxUaW1lKClgIGluc3RlYWQuCiovCmRlZmluZSBmdW5jdGlvbiAiRW1lcmdlbmN5IERlcGFydG1lbnQgQXJyaXZhbCBUaW1lIihUaGVFbmNvdW50ZXIgRW5jb3VudGVyKToKCXN0YXJ0IG9mICgKCSAgICBzaW5nbGV0b24gZnJvbSAoCgkgICAgICAgICggIkhvc3BpdGFsaXphdGlvbiBMb2NhdGlvbnMiKFRoZUVuY291bnRlcikgKSBIb3NwaXRhbExvY2F0aW9uCgkJCQl3aGVyZSBHZXRMb2NhdGlvbihIb3NwaXRhbExvY2F0aW9uLmxvY2F0aW9uKS50eXBlIGluICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCIKCQkpCgkpLnBlcmlvZAoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBlbWVyZ2VuY3kgZGVwYXJ0bWVudCBhcnJpdmFsIHRpbWUgZm9yIHRoZSBlbmNvdW50ZXIuCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZW1lcmdlbmN5RGVwYXJ0bWVudEFycml2YWxUaW1lKFRoZUVuY291bnRlciBFbmNvdW50ZXIpOgoJc3RhcnQgb2YgKAoJICAgIHNpbmdsZXRvbiBmcm9tICgKCSAgICAgICAgKCAoVGhlRW5jb3VudGVyLiJob3NwaXRhbGl6YXRpb25Mb2NhdGlvbnMiKCkpICkgSG9zcGl0YWxMb2NhdGlvbgoJCQkJd2hlcmUgR2V0TG9jYXRpb24oSG9zcGl0YWxMb2NhdGlvbi5sb2NhdGlvbikudHlwZSBpbiAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiCgkJKQoJKS5wZXJpb2QKCi8qCkBkZXNjcmlwdGlvbjogSG9zcGl0YWxpemF0aW9uIHdpdGggT2JzZXJ2YXRpb24gYW5kIE91dHBhdGllbnQgU3VyZ2VyeSBTZXJ2aWNlIHJldHVybnMgdGhlIHRvdGFsIGludGVydmFsIGZyb20gdGhlIHN0YXJ0IG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCwgb3V0cGF0aWVudCBzdXJnZXJ5IHZpc2l0IG9yIG9ic2VydmF0aW9uIHZpc2l0IHRvIHRoZSBkaXNjaGFyZ2Ugb2YgdGhlIGdpdmVuIGVuY291bnRlci4KQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSgpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkFuZE91dHBhdGllbnRTdXJnZXJ5U2VydmljZSIoVGhlRW5jb3VudGVyICJFbmNvdW50ZXIiICk6CiAgVGhlRW5jb3VudGVyIFZpc2l0CgkgIGxldCBPYnNWaXNpdDogTGFzdChbRW5jb3VudGVyOiAiT2JzZXJ2YXRpb24gU2VydmljZXMiXSBMYXN0T2JzCgkJICAJd2hlcmUgTGFzdE9icy5zdGF0dXMgPSAnZmluaXNoZWQnCiAgICAgICAgICBhbmQgTGFzdE9icy5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVmlzaXQucGVyaW9kCgkJCSAgc29ydCBieQllbmQgb2YgcGVyaW9kCiAgICAJKSwKICAgIAlWaXNpdFN0YXJ0OiBDb2FsZXNjZShzdGFydCBvZiBPYnNWaXNpdC5wZXJpb2QsIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZCksCiAgICAJRURWaXNpdDogTGFzdChbRW5jb3VudGVyOiAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiXSBMYXN0RUQKCQkJICB3aGVyZSBMYXN0RUQuc3RhdHVzID0gJ2ZpbmlzaGVkJwogICAgICAgICAgYW5kIExhc3RFRC5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgVmlzaXRTdGFydAoJCQkgIHNvcnQgYnkJZW5kIG9mIHBlcmlvZAogICAgCSksCiAgICAJVmlzaXRTdGFydFdpdGhFRDogQ29hbGVzY2Uoc3RhcnQgb2YgRURWaXNpdC5wZXJpb2QsIFZpc2l0U3RhcnQpLAogICAgCU91dHBhdGllbnRTdXJnZXJ5VmlzaXQ6IExhc3QoW0VuY291bnRlcjogIk91dHBhdGllbnQgU3VyZ2VyeSBTZXJ2aWNlIl0gTGFzdFN1cmdlcnlPUAoJCQkgIHdoZXJlIExhc3RTdXJnZXJ5T1AucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnRXaXRoRUQKCQkJICBzb3J0IGJ5CWVuZCBvZiBwZXJpb2QKICAgIAkpCiAgCXJldHVybiBJbnRlcnZhbFtDb2FsZXNjZShzdGFydCBvZiBPdXRwYXRpZW50U3VyZ2VyeVZpc2l0LnBlcmlvZCwgVmlzaXRTdGFydFdpdGhFRCksIGVuZCBvZiBWaXNpdC5wZXJpb2RdCgovKgpAZGVzY3JpcHRpb246IEhvc3BpdGFsaXphdGlvbiB3aXRoIE9ic2VydmF0aW9uIGFuZCBPdXRwYXRpZW50IFN1cmdlcnkgU2VydmljZSByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQsIG91dHBhdGllbnQgc3VyZ2VyeSB2aXNpdCBvciBvYnNlcnZhdGlvbiB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBnaXZlbiBlbmNvdW50ZXIuCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uQW5kT3V0cGF0aWVudFN1cmdlcnlTZXJ2aWNlKFRoZUVuY291bnRlciAiRW5jb3VudGVyIiApOgogIFRoZUVuY291bnRlciBWaXNpdAoJICBsZXQgT2JzVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIk9ic2VydmF0aW9uIFNlcnZpY2VzIl0gTGFzdE9icwoJCSAgCXdoZXJlIExhc3RPYnMuc3RhdHVzID0gJ2ZpbmlzaGVkJwogICAgICAgICAgYW5kIExhc3RPYnMucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZAoJCQkgIHNvcnQgYnkJZW5kIG9mIHBlcmlvZAogICAgCSksCiAgICAJVmlzaXRTdGFydDogQ29hbGVzY2Uoc3RhcnQgb2YgT2JzVmlzaXQucGVyaW9kLCBzdGFydCBvZiBWaXNpdC5wZXJpb2QpLAogICAgCUVEVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0Il0gTGFzdEVECgkJCSAgd2hlcmUgTGFzdEVELnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgICAgIGFuZCBMYXN0RUQucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnQKCQkJICBzb3J0IGJ5CWVuZCBvZiBwZXJpb2QKICAgIAkpLAogICAgCVZpc2l0U3RhcnRXaXRoRUQ6IENvYWxlc2NlKHN0YXJ0IG9mIEVEVmlzaXQucGVyaW9kLCBWaXNpdFN0YXJ0KSwKICAgIAlPdXRwYXRpZW50U3VyZ2VyeVZpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJPdXRwYXRpZW50IFN1cmdlcnkgU2VydmljZSJdIExhc3RTdXJnZXJ5T1AKCQkJICB3aGVyZSBMYXN0U3VyZ2VyeU9QLnBlcmlvZCBlbmRzIDEgaG91ciBvciBsZXNzIG9uIG9yIGJlZm9yZSBWaXNpdFN0YXJ0V2l0aEVECgkJCSAgc29ydCBieQllbmQgb2YgcGVyaW9kCiAgICAJKQogIAlyZXR1cm4gSW50ZXJ2YWxbQ29hbGVzY2Uoc3RhcnQgb2YgT3V0cGF0aWVudFN1cmdlcnlWaXNpdC5wZXJpb2QsIFZpc2l0U3RhcnRXaXRoRUQpLCBlbmQgb2YgVmlzaXQucGVyaW9kXQoKLyoKQGRlc2NyaXB0aW9uOiBIb3NwaXRhbGl6YXRpb24gd2l0aCBPYnNlcnZhdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBpbnRlcnZhbCBmcm9tIHRoZSBzdGFydCBvZiBhbnkgaW1tZWRpYXRlbHkgcHJpb3IgZW1lcmdlbmN5IGRlcGFydG1lbnQgdmlzaXQgdGhyb3VnaCB0aGUgb2JzZXJ2YXRpb24gdmlzaXQgdG8gdGhlIGRpc2NoYXJnZSBvZiB0aGUgZ2l2ZW4gZW5jb3VudGVyCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iKFRoZUVuY291bnRlciBFbmNvdW50ZXIgKToKICBUaGVFbmNvdW50ZXIgVmlzaXQKICAJCWxldCBPYnNWaXNpdDogTGFzdChbRW5jb3VudGVyOiAiT2JzZXJ2YXRpb24gU2VydmljZXMiXSBMYXN0T2JzCiAgCQkJCXdoZXJlIExhc3RPYnMuc3RhdHVzID0gJ2ZpbmlzaGVkJwogICAgICAgICAgICBhbmQgTGFzdE9icy5wZXJpb2QgZW5kcyAxIGhvdXIgb3IgbGVzcyBvbiBvciBiZWZvcmUgc3RhcnQgb2YgVmlzaXQucGVyaW9kCiAgCQkJCXNvcnQgYnkgZW5kIG9mIHBlcmlvZAogIAkJCSksCiAgCQkJVmlzaXRTdGFydDogQ29hbGVzY2Uoc3RhcnQgb2YgT2JzVmlzaXQucGVyaW9kLCBzdGFydCBvZiBWaXNpdC5wZXJpb2QpLAogIAkJCUVEVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0Il0gTGFzdEVECiAgCQkJCXdoZXJlIExhc3RFRC5zdGF0dXMgPSAnZmluaXNoZWQnCiAgICAgICAgICAgIGFuZCBMYXN0RUQucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIFZpc2l0U3RhcnQKICAJCQkJc29ydCBieSBlbmQgb2YgcGVyaW9kCiAgCQkJKQogIAkJcmV0dXJuIEludGVydmFsW0NvYWxlc2NlKHN0YXJ0IG9mIEVEVmlzaXQucGVyaW9kLCBWaXNpdFN0YXJ0KSwgZW5kIG9mIFZpc2l0LnBlcmlvZF0KCi8qCkBkZXNjcmlwdGlvbjogSG9zcGl0YWxpemF0aW9uIHdpdGggT2JzZXJ2YXRpb24gcmV0dXJucyB0aGUgdG90YWwgaW50ZXJ2YWwgZnJvbSB0aGUgc3RhcnQgb2YgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0IHRocm91Z2ggdGhlIG9ic2VydmF0aW9uIHZpc2l0IHRvIHRoZSBkaXNjaGFyZ2Ugb2YgdGhlIGdpdmVuIGVuY291bnRlcgoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbihUaGVFbmNvdW50ZXIgRW5jb3VudGVyICk6CiAgVGhlRW5jb3VudGVyIFZpc2l0CiAgCQlsZXQgT2JzVmlzaXQ6IExhc3QoW0VuY291bnRlcjogIk9ic2VydmF0aW9uIFNlcnZpY2VzIl0gTGFzdE9icwogIAkJCQl3aGVyZSBMYXN0T2JzLnN0YXR1cyA9ICdmaW5pc2hlZCcKICAgICAgICAgICAgYW5kIExhc3RPYnMucGVyaW9kIGVuZHMgMSBob3VyIG9yIGxlc3Mgb24gb3IgYmVmb3JlIHN0YXJ0IG9mIFZpc2l0LnBlcmlvZAogIAkJCQlzb3J0IGJ5IGVuZCBvZiBwZXJpb2QKICAJCQkpLAogIAkJCVZpc2l0U3RhcnQ6IENvYWxlc2NlKHN0YXJ0IG9mIE9ic1Zpc2l0LnBlcmlvZCwgc3RhcnQgb2YgVmlzaXQucGVyaW9kKSwKICAJCQlFRFZpc2l0OiBMYXN0KFtFbmNvdW50ZXI6ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCJdIExhc3RFRAogIAkJCQl3aGVyZSBMYXN0RUQuc3RhdHVzID0gJ2ZpbmlzaGVkJwogICAgICAgICAgICBhbmQgTGFzdEVELnBlcmlvZCBlbmRzIDEgaG91ciBvciBsZXNzIG9uIG9yIGJlZm9yZSBWaXNpdFN0YXJ0CiAgCQkJCXNvcnQgYnkgZW5kIG9mIHBlcmlvZAogIAkJCSkKICAJCXJldHVybiBJbnRlcnZhbFtDb2FsZXNjZShzdGFydCBvZiBFRFZpc2l0LnBlcmlvZCwgVmlzaXRTdGFydCksIGVuZCBvZiBWaXNpdC5wZXJpb2RdCgovKgpAZGVzY3JpcHRpb246IEhvc3BpdGFsaXphdGlvbiB3aXRoIE9ic2VydmF0aW9uIExlbmd0aCBvZiBTdGF5IHJldHVybnMgdGhlIGxlbmd0aCBpbiBkYXlzIGZyb20gdGhlIHN0YXJ0IG9mIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdCB0aHJvdWdoIHRoZSBvYnNlcnZhdGlvbiB2aXNpdCB0byB0aGUgZGlzY2hhcmdlIG9mIHRoZSBnaXZlbiBlbmNvdW50ZXIKQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkxlbmd0aG9mU3RheSgpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkxlbmd0aG9mU3RheSIoVGhlRW5jb3VudGVyICJFbmNvdW50ZXIiICk6CiAgIkxlbmd0aEluRGF5cyIoIkhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiIoVGhlRW5jb3VudGVyKSkKCi8qCkBkZXNjcmlwdGlvbjogSG9zcGl0YWxpemF0aW9uIHdpdGggT2JzZXJ2YXRpb24gTGVuZ3RoIG9mIFN0YXkgcmV0dXJucyB0aGUgbGVuZ3RoIGluIGRheXMgZnJvbSB0aGUgc3RhcnQgb2YgYW55IGltbWVkaWF0ZWx5IHByaW9yIGVtZXJnZW5jeSBkZXBhcnRtZW50IHZpc2l0IHRocm91Z2ggdGhlIG9ic2VydmF0aW9uIHZpc2l0IHRvIHRoZSBkaXNjaGFyZ2Ugb2YgdGhlIGdpdmVuIGVuY291bnRlcgoqLwpkZWZpbmUgZmx1ZW50IGZ1bmN0aW9uIGhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbkxlbmd0aG9mU3RheShUaGVFbmNvdW50ZXIgIkVuY291bnRlciIgKToKICAoKFRoZUVuY291bnRlci4iaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uIigpLiJsZW5ndGhJbkRheXMiKCkpKQoKLyoKQGRlc2NyaXB0aW9uOiBGaXJzdCBJbnBhdGllbnQgSW50ZW5zaXZlIENhcmUgVW5pdCByZXR1cm5zIHRoZSBmaXJzdCBpbnRlbnNpdmUgY2FyZSB1bml0IGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCB3aXRob3V0IGNvbnNpZGVyaW5nIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdC4KQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGZpcnN0SW5wYXRpZW50SW50ZW5zaXZlQ2FyZVVuaXQoKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJGaXJzdElucGF0aWVudEludGVuc2l2ZUNhcmVVbml0IihFbmNvdW50ZXIgRW5jb3VudGVyICk6CiAgRmlyc3QoKEVuY291bnRlci5sb2NhdGlvbilIb3NwaXRhbExvY2F0aW9uCiAgCQkJd2hlcmUgR2V0TG9jYXRpb24oSG9zcGl0YWxMb2NhdGlvbi5sb2NhdGlvbikudHlwZSBpbiAiSW50ZW5zaXZlIENhcmUgVW5pdCIKICAJCQkJYW5kIEhvc3BpdGFsTG9jYXRpb24ucGVyaW9kIGR1cmluZyBFbmNvdW50ZXIucGVyaW9kCiAgCQkJc29ydCBieSBzdGFydCBvZiBwZXJpb2QKICAJKQoKLyoKQGRlc2NyaXB0aW9uOiBGaXJzdCBJbnBhdGllbnQgSW50ZW5zaXZlIENhcmUgVW5pdCByZXR1cm5zIHRoZSBmaXJzdCBpbnRlbnNpdmUgY2FyZSB1bml0IGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyLCB3aXRob3V0IGNvbnNpZGVyaW5nIGFueSBpbW1lZGlhdGVseSBwcmlvciBlbWVyZ2VuY3kgZGVwYXJ0bWVudCB2aXNpdC4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBmaXJzdElucGF0aWVudEludGVuc2l2ZUNhcmVVbml0KEVuY291bnRlciBFbmNvdW50ZXIgKToKICBGaXJzdCgoRW5jb3VudGVyLmxvY2F0aW9uKUhvc3BpdGFsTG9jYXRpb24KICAJCQl3aGVyZSBHZXRMb2NhdGlvbihIb3NwaXRhbExvY2F0aW9uLmxvY2F0aW9uKS50eXBlIGluICJJbnRlbnNpdmUgQ2FyZSBVbml0IgogIAkJCQlhbmQgSG9zcGl0YWxMb2NhdGlvbi5wZXJpb2QgZHVyaW5nIEVuY291bnRlci5wZXJpb2QKICAJCQlzb3J0IGJ5IHN0YXJ0IG9mIHBlcmlvZAogIAkpCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIENvbmRpdGlvbiByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IHRoZSBgZGlhZ25vc2lzLmNvbmRpdGlvbmAgZWxlbWVudCBvZiB0aGUgRW5jb3VudGVyCkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBlbmNvdW50ZXJEaWFnbm9zaXMoKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJFbmNvdW50ZXJEaWFnbm9zaXMiKEVuY291bnRlciBFbmNvdW50ZXIgKToKICBFbmNvdW50ZXIuZGlhZ25vc2lzIEQKCXJldHVybiBzaW5nbGV0b24gZnJvbSAoKFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXNdIHVuaW9uIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zXSkgQyB3aGVyZSBELmNvbmRpdGlvbi5yZWZlcmVuY2VzKEMuaWQpKQoKLyogIApAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIENvbmRpdGlvbiByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgZGlhZ25vc2lzIGVsZW1lbnQgb2YgdGhlIEVuY291bnRlciAgCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZW5jb3VudGVyRGlhZ25vc2lzKEVuY291bnRlciBFbmNvdW50ZXIgKToKICBFbmNvdW50ZXIucmVhc29uUmVmZXJlbmNlIEQKICAgIHJldHVybiBzaW5nbGV0b24gZnJvbSAoKFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXNdIHVuaW9uIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zXSkgQyB3aGVyZSBELnJlZmVyZW5jZXMoQy5pZCkpCgoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBDb25kaXRpb24gcmVzb3VyY2UgZm9yIHRoZSBnaXZlbiByZWZlcmVuY2UKQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYGdldENvbmRpdGlvbigpYCBpbnN0ZWFkCiovCmRlZmluZSBmdW5jdGlvbiAiR2V0Q29uZGl0aW9uIihyZWZlcmVuY2UgUmVmZXJlbmNlKToKICBzaW5nbGV0b24gZnJvbSAoKFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXNdIHVuaW9uIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zXSkgQyB3aGVyZSByZWZlcmVuY2UucmVmZXJlbmNlcyhDLmlkKSkKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgQ29uZGl0aW9uIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKHJlZmVyZW5jZSBSZWZlcmVuY2UpOgogIHNpbmdsZXRvbiBmcm9tICgoW0NvbmRpdGlvbkVuY291bnRlckRpYWdub3Npc10gdW5pb24gW0NvbmRpdGlvblByb2JsZW1zSGVhbHRoQ29uY2VybnNdKSBDIHdoZXJlIHJlZmVyZW5jZS5yZWZlcmVuY2VzKEMuaWQpKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBjb25kaXRpb24gdGhhdCBpcyBzcGVjaWZpZWQgYXMgdGhlIHByaW5jaXBhbCBkaWFnbm9zaXMgZm9yIHRoZSBlbmNvdW50ZXIKQGRlcHJlY2F0ZWQ6IFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSBmbHVlbnQgZnVuY3Rpb24gYHByaW5jaXBhbERpYWdub3NpcygpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIlByaW5jaXBhbERpYWdub3NpcyIoRW5jb3VudGVyIEVuY291bnRlcik6CglzaW5nbGV0b24gZnJvbSAoCgkoRW5jb3VudGVyLmRpYWdub3NpcyBEIHdoZXJlIEQucmFuayA9IDEgYW5kIEQudXNlIH4gIkJpbGxpbmciKSBQRAogICAgICByZXR1cm4gc2luZ2xldG9uIGZyb20gKChbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzXSB1bmlvbiBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuc10pIEMgd2hlcmUgUEQuY29uZGl0aW9uLnJlZmVyZW5jZXMoQy5pZCkpCgkpCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIGNsYWltIGRpYWdub3NpcyBlbGVtZW50IHRoYXQgaXMgc3BlY2lmaWVkIGFzIHRoZSBwcmluY2lwYWwgZGlhZ25vc2lzIGZvciB0aGUgZW5jb3VudGVyCiBAY29tbWVudDogU2VlIHRoZSBRSUNvcmUgNiBBdXRob3JpbmcgUGF0dGVybnMgZGlzY3Vzc2lvbiBvbiBbUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgUHJlc2VudCBvbiBBZG1pc3Npb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9jcWZyYW1ld29yay9DUUwtRm9ybWF0dGluZy1hbmQtVXNhZ2UtV2lraS93aWtpL0F1dGhvcmluZy1QYXR0ZXJucy1RSUNvcmUtdjYuMC4wI2NvbmRpdGlvbnMtcHJlc2VudC1vbi1hZG1pc3Npb24tYW5kLXByaW5jaXBhbC1kaWFnbm9zZXMpIGZvciBtb3JlIGluZm9ybWF0aW9uCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gcHJpbmNpcGFsRGlhZ25vc2lzKGVuY291bnRlciBFbmNvdW50ZXIpOgpzaW5nbGV0b24gZnJvbSAoCiAgICAgKGVuY291bnRlci5jbGFpbURpYWdub3NpcygpKSBDRAogICAgICAgd2hlcmUgQ0QudHlwZS5pbmNsdWRlc0NvZGUoIlByaW5jaXBhbCBEaWFnbm9zaXMiKQogICApCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgY2xhaW0gZGlhZ25vc2lzIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyCkBjb21tZW50OiBTZWUgdGhlIFFJQ29yZSA2IEF1dGhvcmluZyBQYXR0ZXJucyBkaXNjdXNzaW9uIG9uIFtQcmluY2lwYWwgRGlhZ25vc2lzIGFuZCBQcmVzZW50IG9uIEFkbWlzc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2NxZnJhbWV3b3JrL0NRTC1Gb3JtYXR0aW5nLWFuZC1Vc2FnZS1XaWtpL3dpa2kvQXV0aG9yaW5nLVBhdHRlcm5zLVFJQ29yZS12Ni4wLjAjY29uZGl0aW9ucy1wcmVzZW50LW9uLWFkbWlzc2lvbi1hbmQtcHJpbmNpcGFsLWRpYWdub3NlcykgZm9yIG1vcmUgaW5mb3JtYXRpb24KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBjbGFpbURpYWdub3NpcyhlbmNvdW50ZXIgRW5jb3VudGVyKToKICBlbmNvdW50ZXIgRQogICAgbGV0IAogICAgICBjbGFpbTogKFtDbGFpbV0gQyB3aGVyZSBDLnN0YXR1cyA9ICdhY3RpdmUnIGFuZCBDLnVzZSA9ICdjbGFpbScgYW5kIGV4aXN0cyAoQy5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkpLAogICAgICBjbGFpbUl0ZW06IChjbGFpbS5pdGVtIEkgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyhFKSkKICAgIHJldHVybiBjbGFpbS5kaWFnbm9zaXMgRCB3aGVyZSBELnNlcXVlbmNlIGluIGNsYWltSXRlbS5kaWFnbm9zaXNTZXF1ZW5jZQoKCi8qCiBAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIGNvbmRpdGlvbiB0aGF0IGlzIHNwZWNpZmllZCBhcyB0aGUgcHJpbmNpcGFsIGRpYWdub3NpcyBmb3IgdGhlIGVuY291bnRlciBhbmQgaGFzIGEgY29kZSBpbiB0aGUgZ2l2ZW4gdmFsdWVTZXQuCiBAY29tbWVudDogU2VlIHRoZSBRSUNvcmUgNiBBdXRob3JpbmcgUGF0dGVybnMgZGlzY3Vzc2lvbiBvbiBbUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgUHJlc2VudCBvbiBBZG1pc3Npb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9jcWZyYW1ld29yay9DUUwtRm9ybWF0dGluZy1hbmQtVXNhZ2UtV2lraS93aWtpL0F1dGhvcmluZy1QYXR0ZXJucy1RSUNvcmUtdjYuMC4wI2NvbmRpdGlvbnMtcHJlc2VudC1vbi1hZG1pc3Npb24tYW5kLXByaW5jaXBhbC1kaWFnbm9zZXMpIGZvciBtb3JlIGluZm9ybWF0aW9uCiAqLwogZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBoYXNQcmluY2lwYWxEaWFnbm9zaXNPZihlbmNvdW50ZXIgRW5jb3VudGVyLCB2YWx1ZVNldCBTeXN0ZW0uVmFsdWVTZXQpOgogICAoZW5jb3VudGVyLnByaW5jaXBhbERpYWdub3NpcygpKSBQRAogICAgIHJldHVybiBQRC5kaWFnbm9zaXMgaW4gdmFsdWVTZXQKICAgICAgIG9yIFBELmRpYWdub3Npcy5nZXRDb25kaXRpb24oKS5jb2RlIGluIHZhbHVlU2V0CgovKgogQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGRpYWdub3NpcyBpcyBwcmVzZW50IG9uIGFkbWlzc2lvbiwgYmFzZWQgb24gdGhlIGdpdmVuIHBvYVZhbHVlU2V0CiBAY29tbWVudDogU2VlIHRoZSBRSUNvcmUgNiBBdXRob3JpbmcgUGF0dGVybnMgZGlzY3Vzc2lvbiBvbiBbUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgUHJlc2VudCBvbiBBZG1pc3Npb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9jcWZyYW1ld29yay9DUUwtRm9ybWF0dGluZy1hbmQtVXNhZ2UtV2lraS93aWtpL0F1dGhvcmluZy1QYXR0ZXJucy1RSUNvcmUtdjYuMC4wI2NvbmRpdGlvbnMtcHJlc2VudC1vbi1hZG1pc3Npb24tYW5kLXByaW5jaXBhbC1kaWFnbm9zZXMpIGZvciBtb3JlIGluZm9ybWF0aW9uCiAqLwogZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBpc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbihlbmNvdW50ZXIgRW5jb3VudGVyLCBkaWFnbm9zaXNWYWx1ZVNldCBTeXN0ZW0uVmFsdWVTZXQsIHBvYVZhbHVlU2V0IFN5c3RlbS5WYWx1ZVNldCk6CiAgIGV4aXN0cyAoCiAgICAgKGVuY291bnRlci5jbGFpbURpYWdub3NpcygpKSBDRAogICAgICAgd2hlcmUgQ0Qub25BZG1pc3Npb24gaW4gcG9hVmFsdWVTZXQKICAgICAgICAgYW5kICgKICAgICAgICAgICBDRC5kaWFnbm9zaXMgaW4gZGlhZ25vc2lzVmFsdWVTZXQKICAgICAgICAgICAgIG9yIENELmRpYWdub3Npcy5nZXRDb25kaXRpb24oKS5jb2RlIGluIGRpYWdub3Npc1ZhbHVlU2V0CiAgICAgICAgICkKICAgKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBMb2NhdGlvbiByZXNvdXJjZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHJlZmVyZW5jZQpAZGVwcmVjYXRlZDogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGZsdWVudCBmdW5jdGlvbiBgZ2V0TG9jYXRpb24oKWAgaW5zdGVhZC4KKi8KZGVmaW5lIGZ1bmN0aW9uICJHZXRMb2NhdGlvbiIocmVmZXJlbmNlIFJlZmVyZW5jZSk6CiAgc2luZ2xldG9uIGZyb20gKAogICAgW0xvY2F0aW9uXSBMIHdoZXJlIHJlZmVyZW5jZS5yZWZlcmVuY2VzKEwpCiAgKQoKLyoKQGRlc2NyaXB0aW9uOiBSZXR1cm5zIHRoZSBMb2NhdGlvbiByZXNvdXJjZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHJlZmVyZW5jZS4KKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBnZXRMb2NhdGlvbihyZWZlcmVuY2UgUmVmZXJlbmNlKToKICBzaW5nbGV0b24gZnJvbSAoCiAgICBbTG9jYXRpb25dIEwgd2hlcmUgcmVmZXJlbmNlLnJlZmVyZW5jZXMoTCkKICApCgovKgpAZGVzY3JpcHRpb246IFJldHVybnMgdGhlIG1lZGljYXRpb24gY29kZSBmb3IgdGhlIGdpdmVuIE1lZGljYXRpb25SZXF1ZXN0CkBkZXByZWNhdGVkOiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgZmx1ZW50IGZ1bmN0aW9uIGBnZXRNZWRpY2F0aW9uQ29kZSgpYCBpbnN0ZWFkLgoqLwpkZWZpbmUgZnVuY3Rpb24gIkdldE1lZGljYXRpb25Db2RlIihyZXF1ZXN0IE1lZGljYXRpb25SZXF1ZXN0KToKICBpZiByZXF1ZXN0Lm1lZGljYXRpb24gaXMgRkhJUi5Db2RlYWJsZUNvbmNlcHQgdGhlbgogIAkgIHJlcXVlc3QubWVkaWNhdGlvbiBhcyBGSElSLkNvZGVhYmxlQ29uY2VwdAogIAllbHNlCiAgCSAgKHNpbmdsZXRvbiBmcm9tIChbTWVkaWNhdGlvbl0gTSB3aGVyZSByZXF1ZXN0Lm1lZGljYXRpb24ucmVmZXJlbmNlcyhNKSkpLmNvZGUKCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgbWVkaWNhdGlvbiBjb2RlIGZvciB0aGUgZ2l2ZW4gTWVkaWNhdGlvblJlcXVlc3QKKi8KZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBnZXRNZWRpY2F0aW9uQ29kZShyZXF1ZXN0IENob2ljZTxNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24sIE1lZGljYXRpb25SZXF1ZXN0Pik6CiAgaWYgcmVxdWVzdC5tZWRpY2F0aW9uIGlzIEZISVIuQ29kZWFibGVDb25jZXB0IHRoZW4KICAJICByZXF1ZXN0Lm1lZGljYXRpb24gYXMgRkhJUi5Db2RlYWJsZUNvbmNlcHQKICAJZWxzZQogIAkgIChzaW5nbGV0b24gZnJvbSAoW01lZGljYXRpb25dIE0gd2hlcmUgcmVxdWVzdC5tZWRpY2F0aW9uLnJlZmVyZW5jZXMoTSkpKS5jb2RlCiAgCSAgCi8qCkBkZXNjcmlwdGlvbjogUmV0dXJucyB0aGUgY2xhaW0gcHJvY2VkdXJlIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gZW5jb3VudGVyCiovCmRlZmluZSBmbHVlbnQgZnVuY3Rpb24gcHJpbmNpcGFsUHJvY2VkdXJlKGVuY291bnRlciBFbmNvdW50ZXIpOiAgCSAgCiAgCSBlbmNvdW50ZXIgRQogIAkgbGV0IAogICAgICAgIGNsYWltOiBbQ2xhaW1dIEMgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJyBhbmQgQy51c2UgPSAnY2xhaW0nIGFuZCBleGlzdHMgKEMuaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSkpLAogICAgICAgIGNsYWltSXRlbTogY2xhaW0uaXRlbSBJIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMoRSksCiAgICAgICAgcHJpbmNQcm9jZWR1cmU6IHNpbmdsZXRvbiBmcm9tIChjbGFpbS5wcm9jZWR1cmUgUCB3aGVyZSBQLnNlcXVlbmNlIGluIGNsYWltSXRlbS5wcm9jZWR1cmVTZXF1ZW5jZSBhbmQgUC50eXBlLmluY2x1ZGVzQ29kZSgiUHJpbWFyeSBwcm9jZWR1cmUiKSkKICAgIHJldHVybiBwcmluY1Byb2NlZHVyZQ==",
      "url" : "https://madie.cms.gov/Library-CQMCommon.cql"
    }
  ]
}