CMS FHIR Prototype Measure Calculation Tool IG
0.1.0 - CI Build
CMS FHIR Prototype Measure Calculation Tool IG, published by HL7 International - [Some] Work Group. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/mct-ig/ and changes regularly. See the Directory of published versions
Active as of 2021-08-24 |
{
"resourceType" : "Library",
"id" : "DischargedonAntithromboticTherapyQICore4",
"meta" : {
"versionId" : "24",
"lastUpdated" : "2021-08-24T13:12:30.000-06:00",
"source" : "#M4MHZMhmMYNUtjQP",
"profile" : [
🔗 "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/computable-library-cqfm"
]
},
"language" : "en",
"text" : {
"status" : "extensions",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n <table class=\"grid dict\">\n \n <tr>\n <th scope=\"row\"><b>Id: </b></th>\n <td style=\"padding-left: 4px;\">DischargedonAntithromboticTherapyQICore4</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Url: </b></th>\n <td style=\"padding-left: 4px;\"><a href=\"Library-DischargedonAntithromboticTherapyQICore4.html\">Discharged on Antithrombotic Therapy QICore</a></td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Version: </b></th>\n <td style=\"padding-left: 4px;\">0.1.0</td>\n </tr>\n \n \n \n <tr>\n <th scope=\"row\"><b>Name: </b></th>\n <td style=\"padding-left: 4px;\">DischargedonAntithromboticTherapyQICore4</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Title: </b></th>\n <td style=\"padding-left: 4px;\">Discharged on Antithrombotic Therapy QICore</td>\n </tr>\n \n \n \n <tr>\n <th scope=\"row\"><b>Status: </b></th>\n <td style=\"padding-left: 4px;\">active</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Experimental: </b></th>\n <td style=\"padding-left: 4px;\">false</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Type: </b></th>\n <td style=\"padding-left: 4px;\">\n \n \n \n <p style=\"margin-bottom: 5px;\">\n <b>system: </b> <span><a href=\"http://terminology.hl7.org/5.5.0/CodeSystem-library-type.html\">LibraryType</a></span>\n </p>\n \n \n <p style=\"margin-bottom: 5px;\">\n <b>code: </b> <span>logic-library</span>\n </p>\n \n \n \n \n \n </td>\n </tr>\n \n \n \n <tr>\n <th scope=\"row\"><b>Date: </b></th>\n <td style=\"padding-left: 4px;\">2021-08-24 19:12:29+0000</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Publisher: </b></th>\n <td style=\"padding-left: 4px;\">HL7 International - [Some] Work Group</td>\n </tr>\n \n \n <tr>\n <th scope=\"row\"><b>Description: </b></th>\n <td style=\"padding-left: 4px;\">Discharged on Antithrombotic Therapy QICore</td>\n </tr>\n \n \n \n \n \n <tr>\n <th scope=\"row\"><b>Jurisdiction: </b></th>\n <td style=\"padding-left: 4px;\">US</td>\n </tr>\n \n \n \n \n \n \n \n \n \n \n \n \n <tr>\n <td colspan=\"2\">\n <table>\n <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n <tr><td><pre><code class=\"language-cql\">library DischargedonAntithromboticTherapyQICore4 version '0.0.010'\n\n/* based upon FHIR library DischargedonAntithromboticTherapyFHIR4 version '0.4.000'\nPJM - updated to QICore, shared libraries, valuesets, default Interval to 2022\nDefinition names with 'DISPLAY' are used to display pertinent data\n*/\n\nusing QICore version '4.1.1'\n\ninclude FHIRHelpers version '4.0.013' called FHIRHelpers\ninclude MATGlobalCommonFunctionsQICore4 version '7.0.000' called Global\ninclude QICoreCommon version '1.0.000' called QICoreCommon\ninclude SupplementalDataElementsQICore4 version '3.0.000' called SDE\n//include TJCOverallQICore4 version '6.0.000' called TJC\n\nvalueset &quot;Antithrombotic Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.62' \nvalueset &quot;Medical Reason&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.473' \nvalueset &quot;Patient Refusal&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.93' \nvalueset &quot;Pharmacological Contraindications For Antithrombotic Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.52'\n\n//from TJCOverall\nvalueset &quot;Comfort Measures&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'\nvalueset &quot;Discharge To Acute Care Facility&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.87'\nvalueset &quot;Discharged to Health Care Facility for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'\nvalueset &quot;Discharged to Home for Hospice Care&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'\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;Hemorrhagic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.212'\nvalueset &quot;Ischemic Stroke&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.247'\nvalueset &quot;Left Against Medical Advice&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.308'\nvalueset &quot;Non-Elective Inpatient Encounter&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.424'\nvalueset &quot;Observation Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1111.143'\nvalueset &quot;Patient Expired&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.309'\nvalueset &quot;Ticagrelor Therapy&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.39'\n\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\n default Interval[@2022-01-01T00:00:00.0, @2023-01-01T00:00:00.0)\n\ncontext Patient\n\ndefine &quot;Initial Population&quot;:\n &quot;Encounter with Principal Diagnosis and Age&quot; \n//ORIG TJC.&quot;Encounter with Principal Diagnosis and Age&quot; \n\n// PJM - fix for AgeInYearsAt issue\n//FIX current problem with AgeInYearsAt required a modified approach - refer to https://github.com/cqframework/ecqm-content-qicore-2022/issues/6\ndefine &quot;Encounter with Principal Diagnosis and Age&quot;:\n &quot;All Stroke Encounter&quot; AllStrokeEncounter\n where CalculateAgeInYearsAt ( Patient.birthDate, date from start of AllStrokeEncounter.period ) &gt;= 18\n//ORIG where AgeInYearsAt(date from(start of AllStrokeEncounter.period))&gt;= 18\n\n//TJCOverall\ndefine &quot;Non Elective Inpatient Encounter&quot;:\n [&quot;Encounter&quot;: &quot;Non-Elective Inpatient Encounter&quot;] NonElectiveEncounter\n\t\twhere Global.&quot;LengthInDays&quot;(NonElectiveEncounter.period) &lt;= 120\n\t\t\tand NonElectiveEncounter.period ends during day of &quot;Measurement Period&quot;\n\n//TJCOverall\ndefine &quot;All Stroke Encounter&quot;:\n &quot;Non Elective Inpatient Encounter&quot; NonElectiveEncounter\n let EncPrincipalDx: Global.&quot;PrincipalDiagnosis&quot;(NonElectiveEncounter)\n where NonElectiveEncounter.status ~ 'finished'\n and EncPrincipalDx.verificationStatus ~ QICoreCommon.&quot;confirmed&quot;\n and (EncPrincipalDx.code in &quot;Hemorrhagic Stroke&quot;\n or EncPrincipalDx.code in &quot;Ischemic Stroke&quot;\n )\n\ndefine &quot;Denominator&quot;:\n &quot;Ischemic Stroke Encounter&quot;\n\n//TJCOverall\ndefine &quot;Ischemic Stroke Encounter&quot;:\n &quot;Encounter with Principal Diagnosis and Age&quot; EncounterWithAge\n let EncPrincipalDx: Global.&quot;PrincipalDiagnosis&quot;(EncounterWithAge)\n where EncounterWithAge.status = 'finished'\n and EncPrincipalDx.code in &quot;Ischemic Stroke&quot;\n\n//TJCOverall\n//See if can work old way after Bryn gets Coalesce to work\ndefine &quot;Denominator Exclusions&quot;:\n &quot;Ischemic Stroke Encounters with Discharge Disposition&quot;\n union &quot;Encounter with Comfort Measure Procedure during Hospitalization&quot;\n union &quot;Encounter with Comfort Measure ServiceRequest during Hospitalization&quot;\n/*Original before QICore\ndefine &quot;Denominator Exclusions&quot;:\n TJC.&quot;Ischemic Stroke Encounters with Discharge Disposition&quot;\n union TJC.&quot;Encounter with Comfort Measures during Hospitalization&quot;\n*/\n\n//TJCOverall\ndefine &quot;Ischemic Stroke Encounters with Discharge Disposition&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n let EncDischDisp: IschemicStrokeEncounter.hospitalization.dischargeDisposition\n where EncDischDisp in &quot;Discharge To Acute Care Facility&quot;\n or EncDischDisp in &quot;Left Against Medical Advice&quot;\n or EncDischDisp in &quot;Patient Expired&quot;\n or EncDischDisp in &quot;Discharged to Home for Hospice Care&quot;\n or EncDischDisp in &quot;Discharged to Health Care Facility for Hospice Care&quot;\n\ndefine &quot;DISPLAY Comfort Measures during Hospitalization&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n let ComfortMeasure: &quot;Intervention Comfort Measures&quot; ComfortMeasure\n where Coalesce(ComfortMeasure.performed, ComfortMeasure.authoredOn) during Global.&quot;HospitalizationWithObservation&quot;(IschemicStrokeEncounter)\n return Tuple {\n comfMeasPerformed: ComfortMeasure.performed,\n comfmeasPerfToInt: QICoreCommon.&quot;ToInterval&quot;(ComfortMeasure.performed),\n comfMeasAuthoredOn: ComfortMeasure.authoredOn,\n comfMeasCoalesce: Coalesce((start of QICoreCommon.&quot;ToInterval&quot;(ComfortMeasure.performed)), ComfortMeasure.authoredOn),\n hospitalization: Global.&quot;HospitalizationWithObservation&quot; ( IschemicStrokeEncounter )\n } \n\n\n//TJCOverall - needs Coalesce fix\ndefine &quot;Encounter with Comfort Measures during Hospitalization&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Intervention Comfort Measures&quot; ComfortMeasure\n such that Coalesce((start of QICoreCommon.&quot;ToInterval&quot;(ComfortMeasure.performed)), ComfortMeasure.authoredOn) during Global.&quot;HospitalizationWithObservation&quot; ( IschemicStrokeEncounter )\n/*Original before QICore...Note: This is not used, could not get coalesce to work...instead split (see below)\ndefine &quot;Encounter with Comfort Measures during Hospitalization&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Intervention Comfort Measures&quot; ComfortMeasure\n such that Coalesce((start of Global.&quot;Normalize Interval&quot;(ComfortMeasure.performed)), ComfortMeasure.authoredOn)during Global.&quot;HospitalizationWithObservation&quot; ( IschemicStrokeEncounter )\n*/\n\n//Note: Below does not have 'as dateTime' after performed because it errored, and tried many variations\ndefine &quot;Encounter with Comfort Measure Procedure during Hospitalization&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Intervention Comfort Measures Procedure&quot; ComfortMeasure\n such that start of QICoreCommon.&quot;ToInterval&quot;(ComfortMeasure.performed) during Global.&quot;HospitalizationWithObservation&quot; ( IschemicStrokeEncounter )\n\ndefine &quot;Encounter with Comfort Measure ServiceRequest during Hospitalization&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Intervention Comfort Measures ServiceRequest&quot; ComfortMeasure\n such that ComfortMeasure.authoredOn during Global.&quot;HospitalizationWithObservation&quot; ( IschemicStrokeEncounter )\n\n//TJCOverall\n//Note: Below is not used because could not get coalesce to work in &quot;Encounter with Comfort Measures during Hospitalization&quot;\ndefine &quot;Intervention Comfort Measures&quot;:\n ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] P\n where P.intent = 'order'\n and P.status in { 'active', 'on-hold', 'completed'}\n )\n union ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] InterventionPerformed\n where InterventionPerformed.status in { 'completed', 'in-progress' }\n )\n\n//Instead split ServiceRequest and Procedure into two different definitions\ndefine &quot;Intervention Comfort Measures ServiceRequest&quot;:\n ( [&quot;ServiceRequest&quot;: &quot;Comfort Measures&quot;] P\n where P.intent = 'order'\n and P.status in { 'active', 'on-hold', 'completed'}\n )\n\ndefine &quot;Intervention Comfort Measures Procedure&quot;:\n ( [&quot;Procedure&quot;: &quot;Comfort Measures&quot;] InterventionPerformed\n where InterventionPerformed.status in { 'completed', 'in-progress' }\n )\n\ndefine &quot;Numerator&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Antithrombotic Therapy at Discharge&quot; DischargeAntithrombotic\n such that DischargeAntithrombotic.authoredOn during IschemicStrokeEncounter.period\n\n//Note: QICore manual says to constrain status to 'active' and category to 'Community' and does not mention intent.\n// ask Yanyan if should follow that or what is below.\ndefine &quot;Antithrombotic Therapy at Discharge&quot;:\n [&quot;MedicationRequest&quot;: medication in &quot;Antithrombotic Therapy&quot;] Antithrombotic\n where Antithrombotic.doNotPerform is not true\n and Antithrombotic.status in { 'active', 'completed' } \n and Antithrombotic.intent = 'order'\n and exists (Antithrombotic.category C \n where C ~ QICoreCommon.&quot;Discharge&quot; or C ~ QICoreCommon.&quot;Community&quot;\n )\n\ndefine &quot;Denominator Exceptions&quot;:\n &quot;Encounter with No Antithrombotic At Discharge&quot;\n union &quot;Encounter with Pharmacological Contraindications for Antithrombotic Therapy at Discharge&quot;\n\ndefine &quot;Reason for Not Giving Antithrombotic at Discharge&quot;:\n [&quot;MedicationRequest&quot;: &quot;Antithrombotic Therapy&quot;] NoAntithromboticDischarge\n where NoAntithromboticDischarge.doNotPerform is true\n and ( NoAntithromboticDischarge.reasonCode in &quot;Medical Reason&quot;\n or NoAntithromboticDischarge.reasonCode in &quot;Patient Refusal&quot;\n )\n and NoAntithromboticDischarge.status in { 'completed', 'cancelled' }\n and NoAntithromboticDischarge.intent = 'order'\n and exists (NoAntithromboticDischarge.category C where \n C ~ QICoreCommon.Discharge or C ~ QICoreCommon.Community)\n// [&quot;MedicationRequest&quot;: medication in &quot;Antithrombotic Therapy&quot;] NoAntithromboticDischarge\n\ndefine &quot;zDISPLAY Medication Request&quot;:\n [&quot;MedicationRequest&quot;: medication in &quot;Antithrombotic Therapy&quot;] NoAntithromboticDischarge\n return Tuple {\n doNotPerform: NoAntithromboticDischarge.doNotPerform,\n medication: NoAntithromboticDischarge.medication,\n reasonCode: NoAntithromboticDischarge.reasonCode,\n reasonInMed: ( NoAntithromboticDischarge.reasonCode in &quot;Medical Reason&quot;),\n reasonInPatRef: (NoAntithromboticDischarge.reasonCode in &quot;Patient Refusal&quot;),\n category: NoAntithromboticDischarge.category,\n dischargeStatus: NoAntithromboticDischarge.status,\n intent: NoAntithromboticDischarge.intent\n }\n\ndefine &quot;Encounter with No Antithrombotic At Discharge&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n \twith &quot;Reason for Not Giving Antithrombotic at Discharge&quot; NoDischargeAntithrombotic\n \tsuch that NoDischargeAntithrombotic.authoredOn during IschemicStrokeEncounter.period\n\ndefine &quot;Encounter with Pharmacological Contraindications for Antithrombotic Therapy at Discharge&quot;:\n &quot;Ischemic Stroke Encounter&quot; IschemicStrokeEncounter\n with &quot;Pharmacological Contraindications for Antithrombotic Therapy at Discharge&quot; DischargePharmacological\n such that DischargePharmacological.authoredOn during IschemicStrokeEncounter.period\n\ndefine &quot;Pharmacological Contraindications for Antithrombotic Therapy at Discharge&quot;:\n [&quot;MedicationRequest&quot;: medication in &quot;Pharmacological Contraindications For Antithrombotic Therapy&quot;] Pharmacological\n where Pharmacological.doNotPerform is not true\n and exists (Pharmacological.category C where \n C ~ QICoreCommon.Discharge or C ~ QICoreCommon.Community)\n and Pharmacological.status in { 'active', 'completed' }\n and Pharmacological.intent = 'order'\n\ndefine &quot;SDE Ethnicity&quot;:\n SDE.&quot;SDE Ethnicity&quot;\n\ndefine &quot;SDE Payer&quot;:\n SDE.&quot;SDE Payer&quot;\n\ndefine &quot;SDE Race&quot;:\n SDE.&quot;SDE Race&quot;\n\ndefine &quot;SDE Sex&quot;:\n SDE.&quot;SDE Sex&quot;</code></pre></td></tr>\n </table>\n </td>\n </tr>\n \n \n \n </table>\n</div>"
},
"extension" : [
{
"url" : "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-softwaresystem",
"valueReference" : {
🔗 "reference" : "Device/cqf-tooling"
}
}
],
"url" : "http://cms.gov/fhir/mct/Library/DischargedonAntithromboticTherapyQICore4",
"version" : "0.1.0",
"name" : "DischargedonAntithromboticTherapyQICore4",
"title" : "Discharged on Antithrombotic Therapy QICore",
"status" : "active",
"experimental" : false,
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2021-08-24T19:12:29+00:00",
"publisher" : "HL7 International - [Some] Work Group",
"contact" : [
{
"telecom" : [
{
"system" : "url",
"value" : "http://hl7.org/Special/committees/[something]"
}
]
}
],
"description" : "Discharged on Antithrombotic Therapy QICore",
"jurisdiction" : [
{
"coding" : [
{
"system" : "urn:iso:std:iso:3166",
"code" : "US"
}
]
}
],
"content" : [
{
"contentType" : "text/cql",
"data" : "bGlicmFyeSBEaXNjaGFyZ2Vkb25BbnRpdGhyb21ib3RpY1RoZXJhcHlRSUNvcmU0IHZlcnNpb24gJzAuMC4wMTAnCgovKiBiYXNlZCB1cG9uIEZISVIgbGlicmFyeSBEaXNjaGFyZ2Vkb25BbnRpdGhyb21ib3RpY1RoZXJhcHlGSElSNCB2ZXJzaW9uICcwLjQuMDAwJwpQSk0gLSB1cGRhdGVkIHRvIFFJQ29yZSwgc2hhcmVkIGxpYnJhcmllcywgdmFsdWVzZXRzLCBkZWZhdWx0IEludGVydmFsIHRvIDIwMjIKRGVmaW5pdGlvbiBuYW1lcyB3aXRoICdESVNQTEFZJyBhcmUgdXNlZCB0byBkaXNwbGF5IHBlcnRpbmVudCBkYXRhCiovCgp1c2luZyBRSUNvcmUgdmVyc2lvbiAnNC4xLjEnCgppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4wMTMnIGNhbGxlZCBGSElSSGVscGVycwppbmNsdWRlIE1BVEdsb2JhbENvbW1vbkZ1bmN0aW9uc1FJQ29yZTQgdmVyc2lvbiAnNy4wLjAwMCcgY2FsbGVkIEdsb2JhbAppbmNsdWRlIFFJQ29yZUNvbW1vbiB2ZXJzaW9uICcxLjAuMDAwJyBjYWxsZWQgUUlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzUUlDb3JlNCB2ZXJzaW9uICczLjAuMDAwJyBjYWxsZWQgU0RFCi8vaW5jbHVkZSBUSkNPdmVyYWxsUUlDb3JlNCB2ZXJzaW9uICc2LjAuMDAwJyBjYWxsZWQgVEpDCgp2YWx1ZXNldCAiQW50aXRocm9tYm90aWMgVGhlcmFweSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNjInIAp2YWx1ZXNldCAiTWVkaWNhbCBSZWFzb24iOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjQ3MycgCnZhbHVlc2V0ICJQYXRpZW50IFJlZnVzYWwiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjkzJyAKdmFsdWVzZXQgIlBoYXJtYWNvbG9naWNhbCBDb250cmFpbmRpY2F0aW9ucyBGb3IgQW50aXRocm9tYm90aWMgVGhlcmFweSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTAuNTInCgovL2Zyb20gVEpDT3ZlcmFsbAp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnCnZhbHVlc2V0ICJEaXNjaGFyZ2UgVG8gQWN1dGUgQ2FyZSBGYWNpbGl0eSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuODcnCnZhbHVlc2V0ICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwNycKdmFsdWVzZXQgIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yMDknCnZhbHVlc2V0ICJFbWVyZ2VuY3kgRGVwYXJ0bWVudCBWaXNpdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjkyJwp2YWx1ZXNldCAiRW5jb3VudGVyIElucGF0aWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4zMDcnCnZhbHVlc2V0ICJIZW1vcnJoYWdpYyBTdHJva2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIxMicKdmFsdWVzZXQgIklzY2hlbWljIFN0cm9rZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjQ3Jwp2YWx1ZXNldCAiTGVmdCBBZ2FpbnN0IE1lZGljYWwgQWR2aWNlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4zMDgnCnZhbHVlc2V0ICJOb24tRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuNDI0Jwp2YWx1ZXNldCAiT2JzZXJ2YXRpb24gU2VydmljZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTExLjE0MycKdmFsdWVzZXQgIlBhdGllbnQgRXhwaXJlZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMzA5Jwp2YWx1ZXNldCAiVGljYWdyZWxvciBUaGVyYXB5IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTExMC4zOScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDIyLTAxLTAxVDAwOjAwOjAwLjAsIEAyMDIzLTAxLTAxVDAwOjAwOjAwLjApCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiSW5pdGlhbCBQb3B1bGF0aW9uIjoKICAiRW5jb3VudGVyIHdpdGggUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgQWdlIiAKLy9PUklHIFRKQy4iRW5jb3VudGVyIHdpdGggUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgQWdlIiAgIAoKLy8gUEpNIC0gZml4IGZvciBBZ2VJblllYXJzQXQgaXNzdWUKLy9GSVggY3VycmVudCBwcm9ibGVtIHdpdGggQWdlSW5ZZWFyc0F0IHJlcXVpcmVkIGEgbW9kaWZpZWQgYXBwcm9hY2ggLSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vY3FmcmFtZXdvcmsvZWNxbS1jb250ZW50LXFpY29yZS0yMDIyL2lzc3Vlcy82CmRlZmluZSAiRW5jb3VudGVyIHdpdGggUHJpbmNpcGFsIERpYWdub3NpcyBhbmQgQWdlIjoKICAiQWxsIFN0cm9rZSBFbmNvdW50ZXIiIEFsbFN0cm9rZUVuY291bnRlcgogICAgd2hlcmUgQ2FsY3VsYXRlQWdlSW5ZZWFyc0F0ICggUGF0aWVudC5iaXJ0aERhdGUsIGRhdGUgZnJvbSBzdGFydCBvZiBBbGxTdHJva2VFbmNvdW50ZXIucGVyaW9kICkgPj0gMTgKLy9PUklHICAgIHdoZXJlIEFnZUluWWVhcnNBdChkYXRlIGZyb20oc3RhcnQgb2YgQWxsU3Ryb2tlRW5jb3VudGVyLnBlcmlvZCkpPj0gMTgKCi8vVEpDT3ZlcmFsbApkZWZpbmUgIk5vbiBFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIjoKICBbIkVuY291bnRlciI6ICJOb24tRWxlY3RpdmUgSW5wYXRpZW50IEVuY291bnRlciJdIE5vbkVsZWN0aXZlRW5jb3VudGVyCgkJd2hlcmUgR2xvYmFsLiJMZW5ndGhJbkRheXMiKE5vbkVsZWN0aXZlRW5jb3VudGVyLnBlcmlvZCkgPD0gMTIwCgkJCWFuZCBOb25FbGVjdGl2ZUVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovL1RKQ092ZXJhbGwKZGVmaW5lICJBbGwgU3Ryb2tlIEVuY291bnRlciI6CiAgIk5vbiBFbGVjdGl2ZSBJbnBhdGllbnQgRW5jb3VudGVyIiBOb25FbGVjdGl2ZUVuY291bnRlcgogICAgbGV0IEVuY1ByaW5jaXBhbER4OiBHbG9iYWwuIlByaW5jaXBhbERpYWdub3NpcyIoTm9uRWxlY3RpdmVFbmNvdW50ZXIpCiAgICB3aGVyZSBOb25FbGVjdGl2ZUVuY291bnRlci5zdGF0dXMgfiAnZmluaXNoZWQnCiAgICAgIGFuZCBFbmNQcmluY2lwYWxEeC52ZXJpZmljYXRpb25TdGF0dXMgfiBRSUNvcmVDb21tb24uImNvbmZpcm1lZCIKICAgICAgYW5kIChFbmNQcmluY2lwYWxEeC5jb2RlIGluICJIZW1vcnJoYWdpYyBTdHJva2UiCiAgICAgICAgb3IgRW5jUHJpbmNpcGFsRHguY29kZSBpbiAiSXNjaGVtaWMgU3Ryb2tlIgogICAgICApCgpkZWZpbmUgIkRlbm9taW5hdG9yIjoKICAiSXNjaGVtaWMgU3Ryb2tlIEVuY291bnRlciIKCi8vVEpDT3ZlcmFsbApkZWZpbmUgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiOgogICJFbmNvdW50ZXIgd2l0aCBQcmluY2lwYWwgRGlhZ25vc2lzIGFuZCBBZ2UiIEVuY291bnRlcldpdGhBZ2UKICAgIGxldCBFbmNQcmluY2lwYWxEeDogR2xvYmFsLiJQcmluY2lwYWxEaWFnbm9zaXMiKEVuY291bnRlcldpdGhBZ2UpCiAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEFnZS5zdGF0dXMgPSAnZmluaXNoZWQnCiAgICAgICBhbmQgRW5jUHJpbmNpcGFsRHguY29kZSBpbiAiSXNjaGVtaWMgU3Ryb2tlIgoKLy9USkNPdmVyYWxsCi8vU2VlIGlmIGNhbiB3b3JrIG9sZCB3YXkgYWZ0ZXIgQnJ5biBnZXRzIENvYWxlc2NlIHRvIHdvcmsKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICAiSXNjaGVtaWMgU3Ryb2tlIEVuY291bnRlcnMgd2l0aCBEaXNjaGFyZ2UgRGlzcG9zaXRpb24iCiAgICB1bmlvbiAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlIFByb2NlZHVyZSBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIgogICAgdW5pb24gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZSBTZXJ2aWNlUmVxdWVzdCBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIgovKk9yaWdpbmFsIGJlZm9yZSBRSUNvcmUKZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb25zIjoKICBUSkMuIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXJzIHdpdGggRGlzY2hhcmdlIERpc3Bvc2l0aW9uIgogICAgdW5pb24gVEpDLiJFbmNvdW50ZXIgd2l0aCBDb21mb3J0IE1lYXN1cmVzIGR1cmluZyBIb3NwaXRhbGl6YXRpb24iCiovCgovL1RKQ092ZXJhbGwKZGVmaW5lICJJc2NoZW1pYyBTdHJva2UgRW5jb3VudGVycyB3aXRoIERpc2NoYXJnZSBEaXNwb3NpdGlvbiI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgICBsZXQgRW5jRGlzY2hEaXNwOiBJc2NoZW1pY1N0cm9rZUVuY291bnRlci5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24KICAgICAgICB3aGVyZSBFbmNEaXNjaERpc3AgaW4gIkRpc2NoYXJnZSBUbyBBY3V0ZSBDYXJlIEZhY2lsaXR5IgogICAgICAgICAgIG9yIEVuY0Rpc2NoRGlzcCBpbiAiTGVmdCBBZ2FpbnN0IE1lZGljYWwgQWR2aWNlIgogICAgICAgICAgIG9yIEVuY0Rpc2NoRGlzcCBpbiAiUGF0aWVudCBFeHBpcmVkIgogICAgICAgICAgIG9yIEVuY0Rpc2NoRGlzcCBpbiAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiCiAgICAgICAgICAgb3IgRW5jRGlzY2hEaXNwIGluICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIkRJU1BMQVkgQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSXNjaGVtaWMgU3Ryb2tlIEVuY291bnRlciIgSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIKICAgIGxldCBDb21mb3J0TWVhc3VyZTogIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgICAgd2hlcmUgQ29hbGVzY2UoQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkLCBDb21mb3J0TWVhc3VyZS5hdXRob3JlZE9uKSBkdXJpbmcgR2xvYmFsLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iKElzY2hlbWljU3Ryb2tlRW5jb3VudGVyKQogICAgIHJldHVybiBUdXBsZSB7CiAgICAgICBjb21mTWVhc1BlcmZvcm1lZDogQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkLAogICAgICAgY29tZm1lYXNQZXJmVG9JbnQ6IFFJQ29yZUNvbW1vbi4iVG9JbnRlcnZhbCIoQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkKSwKICAgICAgIGNvbWZNZWFzQXV0aG9yZWRPbjogQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbiwKICAgICAgIGNvbWZNZWFzQ29hbGVzY2U6IENvYWxlc2NlKChzdGFydCBvZiBRSUNvcmVDb21tb24uIlRvSW50ZXJ2YWwiKENvbWZvcnRNZWFzdXJlLnBlcmZvcm1lZCkpLCBDb21mb3J0TWVhc3VyZS5hdXRob3JlZE9uKSwKICAgICAgIGhvc3BpdGFsaXphdGlvbjogR2xvYmFsLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIgKQogICAgIH0gCgoKLy9USkNPdmVyYWxsIC0gbmVlZHMgQ29hbGVzY2UgZml4CmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSXNjaGVtaWMgU3Ryb2tlIEVuY291bnRlciIgSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIKICAgIHdpdGggIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIiBDb21mb3J0TWVhc3VyZQogICAgIHN1Y2ggdGhhdCBDb2FsZXNjZSgoc3RhcnQgb2YgUUlDb3JlQ29tbW9uLiJUb0ludGVydmFsIihDb21mb3J0TWVhc3VyZS5wZXJmb3JtZWQpKSwgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbikgZHVyaW5nIEdsb2JhbC4iSG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uIiAoIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyICkKLypPcmlnaW5hbCBiZWZvcmUgUUlDb3JlLi4uTm90ZTogVGhpcyBpcyBub3QgdXNlZCwgY291bGQgbm90IGdldCBjb2FsZXNjZSB0byB3b3JrLi4uaW5zdGVhZCBzcGxpdCAoc2VlIGJlbG93KQpkZWZpbmUgIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgICAgICAgICB3aXRoICJJbnRlcnZlbnRpb24gQ29tZm9ydCBNZWFzdXJlcyIgQ29tZm9ydE1lYXN1cmUKICAgICAgICAgICAgICBzdWNoIHRoYXQgQ29hbGVzY2UoKHN0YXJ0IG9mIEdsb2JhbC4iTm9ybWFsaXplIEludGVydmFsIihDb21mb3J0TWVhc3VyZS5wZXJmb3JtZWQpKSwgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbilkdXJpbmcgR2xvYmFsLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIgKQoqLwoKLy9Ob3RlOiBCZWxvdyBkb2VzIG5vdCBoYXZlICdhcyBkYXRlVGltZScgYWZ0ZXIgcGVyZm9ybWVkIGJlY2F1c2UgaXQgZXJyb3JlZCwgYW5kIHRyaWVkIG1hbnkgdmFyaWF0aW9ucwpkZWZpbmUgIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZSBQcm9jZWR1cmUgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgICB3aXRoICJJbnRlcnZlbnRpb24gQ29tZm9ydCBNZWFzdXJlcyBQcm9jZWR1cmUiIENvbWZvcnRNZWFzdXJlCiAgICAgc3VjaCB0aGF0IHN0YXJ0IG9mIFFJQ29yZUNvbW1vbi4iVG9JbnRlcnZhbCIoQ29tZm9ydE1lYXN1cmUucGVyZm9ybWVkKSBkdXJpbmcgR2xvYmFsLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIgKQoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBDb21mb3J0IE1lYXN1cmUgU2VydmljZVJlcXVlc3QgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgICB3aXRoICJJbnRlcnZlbnRpb24gQ29tZm9ydCBNZWFzdXJlcyBTZXJ2aWNlUmVxdWVzdCIgQ29tZm9ydE1lYXN1cmUKICAgICBzdWNoIHRoYXQgQ29tZm9ydE1lYXN1cmUuYXV0aG9yZWRPbiBkdXJpbmcgR2xvYmFsLiJIb3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24iICggSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIgKQoKLy9USkNPdmVyYWxsCi8vTm90ZTogQmVsb3cgaXMgbm90IHVzZWQgYmVjYXVzZSBjb3VsZCBub3QgZ2V0IGNvYWxlc2NlIHRvIHdvcmsgaW4gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiIKZGVmaW5lICJJbnRlcnZlbnRpb24gQ29tZm9ydCBNZWFzdXJlcyI6CiAgKCBbIlNlcnZpY2VSZXF1ZXN0IjogIkNvbWZvcnQgTWVhc3VyZXMiXSBQCiAgICAgIHdoZXJlIFAuaW50ZW50ID0gJ29yZGVyJwogICAgICAgYW5kIFAuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdvbi1ob2xkJywgJ2NvbXBsZXRlZCd9CiAgKQogICAgdW5pb24gKCBbIlByb2NlZHVyZSI6ICJDb21mb3J0IE1lYXN1cmVzIl0gSW50ZXJ2ZW50aW9uUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUGVyZm9ybWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0KICAgICkKCi8vSW5zdGVhZCBzcGxpdCBTZXJ2aWNlUmVxdWVzdCBhbmQgUHJvY2VkdXJlIGludG8gdHdvIGRpZmZlcmVudCBkZWZpbml0aW9ucwpkZWZpbmUgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIFNlcnZpY2VSZXF1ZXN0IjoKICAoIFsiU2VydmljZVJlcXVlc3QiOiAiQ29tZm9ydCBNZWFzdXJlcyJdIFAKICAgICAgd2hlcmUgUC5pbnRlbnQgPSAnb3JkZXInCiAgICAgICBhbmQgUC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ29uLWhvbGQnLCAnY29tcGxldGVkJ30KICApCgpkZWZpbmUgIkludGVydmVudGlvbiBDb21mb3J0IE1lYXN1cmVzIFByb2NlZHVyZSI6CiAgKCBbIlByb2NlZHVyZSI6ICJDb21mb3J0IE1lYXN1cmVzIl0gSW50ZXJ2ZW50aW9uUGVyZm9ybWVkCiAgICAgICAgd2hlcmUgSW50ZXJ2ZW50aW9uUGVyZm9ybWVkLnN0YXR1cyBpbiB7ICdjb21wbGV0ZWQnLCAnaW4tcHJvZ3Jlc3MnIH0KICApCgpkZWZpbmUgIk51bWVyYXRvciI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgICB3aXRoICJBbnRpdGhyb21ib3RpYyBUaGVyYXB5IGF0IERpc2NoYXJnZSIgRGlzY2hhcmdlQW50aXRocm9tYm90aWMKICAgICAgc3VjaCB0aGF0IERpc2NoYXJnZUFudGl0aHJvbWJvdGljLmF1dGhvcmVkT24gZHVyaW5nIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyLnBlcmlvZAoKLy9Ob3RlOiBRSUNvcmUgbWFudWFsIHNheXMgdG8gY29uc3RyYWluIHN0YXR1cyB0byAnYWN0aXZlJyBhbmQgY2F0ZWdvcnkgdG8gJ0NvbW11bml0eScgYW5kIGRvZXMgbm90IG1lbnRpb24gaW50ZW50LgovLyAgICAgIGFzayBZYW55YW4gaWYgc2hvdWxkIGZvbGxvdyB0aGF0IG9yIHdoYXQgaXMgYmVsb3cuCmRlZmluZSAiQW50aXRocm9tYm90aWMgVGhlcmFweSBhdCBEaXNjaGFyZ2UiOgogIFsiTWVkaWNhdGlvblJlcXVlc3QiOiBtZWRpY2F0aW9uIGluICJBbnRpdGhyb21ib3RpYyBUaGVyYXB5Il0gQW50aXRocm9tYm90aWMKICAgICAgd2hlcmUgQW50aXRocm9tYm90aWMuZG9Ob3RQZXJmb3JtIGlzIG5vdCB0cnVlCiAgICAgICAgYW5kIEFudGl0aHJvbWJvdGljLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9IAogICAgICAgIGFuZCBBbnRpdGhyb21ib3RpYy5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgYW5kIGV4aXN0cyAoQW50aXRocm9tYm90aWMuY2F0ZWdvcnkgQyAKICAgICAgICAgIHdoZXJlIEMgfiBRSUNvcmVDb21tb24uIkRpc2NoYXJnZSIgb3IgQyB+IFFJQ29yZUNvbW1vbi4iQ29tbXVuaXR5IgogICAgICAgICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjZXB0aW9ucyI6CiAgIkVuY291bnRlciB3aXRoIE5vIEFudGl0aHJvbWJvdGljIEF0IERpc2NoYXJnZSIKICB1bmlvbiAiRW5jb3VudGVyIHdpdGggUGhhcm1hY29sb2dpY2FsIENvbnRyYWluZGljYXRpb25zIGZvciBBbnRpdGhyb21ib3RpYyBUaGVyYXB5IGF0IERpc2NoYXJnZSIKCmRlZmluZSAiUmVhc29uIGZvciBOb3QgR2l2aW5nIEFudGl0aHJvbWJvdGljIGF0IERpc2NoYXJnZSI6CiAgWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJBbnRpdGhyb21ib3RpYyBUaGVyYXB5Il0gTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZQogICAgICB3aGVyZSBOb0FudGl0aHJvbWJvdGljRGlzY2hhcmdlLmRvTm90UGVyZm9ybSBpcyB0cnVlCiAgICAgICAgYW5kICggTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZS5yZWFzb25Db2RlIGluICJNZWRpY2FsIFJlYXNvbiIKICAgICAgICAgICAgICAgIG9yIE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UucmVhc29uQ29kZSBpbiAiUGF0aWVudCBSZWZ1c2FsIgogICAgICAgICAgICApCiAgICAgICAgYW5kIE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2Uuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdjYW5jZWxsZWQnIH0KICAgICAgICBhbmQgTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZS5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgYW5kIGV4aXN0cyAoTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZS5jYXRlZ29yeSBDIHdoZXJlIAogICAgICAgICAgICAgICAgICAgQyB+IFFJQ29yZUNvbW1vbi5EaXNjaGFyZ2Ugb3IgQyB+IFFJQ29yZUNvbW1vbi5Db21tdW5pdHkpCi8vICBbIk1lZGljYXRpb25SZXF1ZXN0IjogbWVkaWNhdGlvbiBpbiAiQW50aXRocm9tYm90aWMgVGhlcmFweSJdIE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UKCmRlZmluZSAiekRJU1BMQVkgTWVkaWNhdGlvbiBSZXF1ZXN0IjoKICBbIk1lZGljYXRpb25SZXF1ZXN0IjogbWVkaWNhdGlvbiBpbiAiQW50aXRocm9tYm90aWMgVGhlcmFweSJdIE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UKICByZXR1cm4gVHVwbGUgewogICAgZG9Ob3RQZXJmb3JtOiBOb0FudGl0aHJvbWJvdGljRGlzY2hhcmdlLmRvTm90UGVyZm9ybSwKICAgIG1lZGljYXRpb246IE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UubWVkaWNhdGlvbiwKICAgIHJlYXNvbkNvZGU6IE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UucmVhc29uQ29kZSwKICAgIHJlYXNvbkluTWVkOiAoIE5vQW50aXRocm9tYm90aWNEaXNjaGFyZ2UucmVhc29uQ29kZSBpbiAiTWVkaWNhbCBSZWFzb24iKSwKICAgIHJlYXNvbkluUGF0UmVmOiAoTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZS5yZWFzb25Db2RlIGluICJQYXRpZW50IFJlZnVzYWwiKSwKICAgIGNhdGVnb3J5OiBOb0FudGl0aHJvbWJvdGljRGlzY2hhcmdlLmNhdGVnb3J5LAogICAgZGlzY2hhcmdlU3RhdHVzOiBOb0FudGl0aHJvbWJvdGljRGlzY2hhcmdlLnN0YXR1cywKICAgIGludGVudDogTm9BbnRpdGhyb21ib3RpY0Rpc2NoYXJnZS5pbnRlbnQKICB9CgpkZWZpbmUgIkVuY291bnRlciB3aXRoIE5vIEFudGl0aHJvbWJvdGljIEF0IERpc2NoYXJnZSI6CiAgIklzY2hlbWljIFN0cm9rZSBFbmNvdW50ZXIiIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyCiAgCXdpdGggIlJlYXNvbiBmb3IgTm90IEdpdmluZyBBbnRpdGhyb21ib3RpYyBhdCBEaXNjaGFyZ2UiIE5vRGlzY2hhcmdlQW50aXRocm9tYm90aWMKICAJc3VjaCB0aGF0IE5vRGlzY2hhcmdlQW50aXRocm9tYm90aWMuYXV0aG9yZWRPbiBkdXJpbmcgSXNjaGVtaWNTdHJva2VFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIFBoYXJtYWNvbG9naWNhbCBDb250cmFpbmRpY2F0aW9ucyBmb3IgQW50aXRocm9tYm90aWMgVGhlcmFweSBhdCBEaXNjaGFyZ2UiOgogICJJc2NoZW1pYyBTdHJva2UgRW5jb3VudGVyIiBJc2NoZW1pY1N0cm9rZUVuY291bnRlcgogICAgICB3aXRoICJQaGFybWFjb2xvZ2ljYWwgQ29udHJhaW5kaWNhdGlvbnMgZm9yIEFudGl0aHJvbWJvdGljIFRoZXJhcHkgYXQgRGlzY2hhcmdlIiBEaXNjaGFyZ2VQaGFybWFjb2xvZ2ljYWwKICAgICAgICBzdWNoIHRoYXQgRGlzY2hhcmdlUGhhcm1hY29sb2dpY2FsLmF1dGhvcmVkT24gZHVyaW5nIElzY2hlbWljU3Ryb2tlRW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJQaGFybWFjb2xvZ2ljYWwgQ29udHJhaW5kaWNhdGlvbnMgZm9yIEFudGl0aHJvbWJvdGljIFRoZXJhcHkgYXQgRGlzY2hhcmdlIjoKICBbIk1lZGljYXRpb25SZXF1ZXN0IjogbWVkaWNhdGlvbiBpbiAiUGhhcm1hY29sb2dpY2FsIENvbnRyYWluZGljYXRpb25zIEZvciBBbnRpdGhyb21ib3RpYyBUaGVyYXB5Il0gUGhhcm1hY29sb2dpY2FsCiAgICAgIHdoZXJlIFBoYXJtYWNvbG9naWNhbC5kb05vdFBlcmZvcm0gaXMgbm90IHRydWUKICAgICAgICBhbmQgZXhpc3RzIChQaGFybWFjb2xvZ2ljYWwuY2F0ZWdvcnkgQyB3aGVyZSAKICAgICAgICAgICAgICAgICAgIEMgfiBRSUNvcmVDb21tb24uRGlzY2hhcmdlIG9yIEMgfiBRSUNvcmVDb21tb24uQ29tbXVuaXR5KQogICAgICAgIGFuZCBQaGFybWFjb2xvZ2ljYWwuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgUGhhcm1hY29sb2dpY2FsLmludGVudCA9ICdvcmRlcicKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4Ig=="
}
]
}