{
  "resourceType" : "Library",
  "id" : "IMMZIndicatorElements",
  "meta" : {
    "profile" : ["http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary",
    "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary",
    "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library",
    "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"]
  },
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n<div>\n    <table class=\"grid dict\">\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Title: </b></th>\n            <td style=\"padding-left: 4px;\">IMMZIndicatorElements</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Id: </b></th>\n            <td style=\"padding-left: 4px;\">IMMZIndicatorElements</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Version: </b></th>\n            <td style=\"padding-left: 4px;\">1.0.0</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Url: </b></th>\n            <td style=\"padding-left: 4px;\"><a href=\"Library-IMMZIndicatorElements.html\">IMMZIndicatorElements</a></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Status: </b></th>\n            <td style=\"padding-left: 4px;\">draft</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Experimental: </b></th>\n            <td style=\"padding-left: 4px;\">true</td>\n        </tr>\n        \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/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</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\n        \n        <tr>\n            <th scope=\"row\"><b>Date: </b></th>\n            <td style=\"padding-left: 4px;\">2026-03-31 13:54:17+0000</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Publisher: </b></th>\n            <td style=\"padding-left: 4px;\">WHO</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Description: </b></th>\n            <td style=\"padding-left: 4px;\"><div><p>This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators</p>\n</div></td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Related Artifacts: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                \n                \n                <p><b>Dependencies</b></p>\n                <ul>\n                  \n                    <li><a href=\"Library-WHOConcepts.html\">WHOConcepts</a></li>\n                  \n                    <li><a href=\"Library-WHOCommon.html\">WHOCommon</a></li>\n                  \n                    <li><a href=\"Library-IMMZConcepts.html\">IMMZConcepts</a></li>\n                  \n                    <li><a href=\"Library-IMMZAgeConcepts.html\">IMMZAgeConcepts</a></li>\n                  \n                    <li><a href=\"Library-IMMZCommon.html\">IMMZCommon</a></li>\n                  \n                    <li><a href=\"Library-IMMZElements.html\">IMMZElements</a></li>\n                  \n                    <li><a href=\"http://hl7.org/fhir/R4/codesystem-administrative-gender.html\">AdministrativeGender</a></li>\n                  \n                </ul>\n                \n                \n                \n                \n                \n            </td>\n        </tr>\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Parameters: </b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Name</b></th><th><b>Type</b></th><th><b>Min</b></th><th><b>Max</b></th><th><b>In/Out</b></th></tr>\n              \n                <tr><th>Measurement Period</th><th>Period</th><th>0</th><th>1</th><th>In</th></tr>\n              \n                <tr><th>Patient</th><th>Patient</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Newborn By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Infant By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Toddler By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Child By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Adolescent By Age Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>By Age Group Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>By Administrative Gender Stratifier</th><th>Coding</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>By Geographic Region Stratifier</th><th>string</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Patient Deceased During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Patient Born During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Patient Under 12 Months Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Patient Under 2 Years Old During Measurement Period</th><th>boolean</th><th>0</th><th>1</th><th>Out</th></tr>\n              \n                <tr><th>Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Adverse Events During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Immunizations And Adverse Events During Measurement Period</th><th>Resource</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Pentavalent Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Pentavalent Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Measles and Rubella Doses Administered to Patient</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Measles and Rubella Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>COVID-19 Doses Administered to Patient During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Adverse Events for Immunization</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Immunizations with Adverse Events During Measurement Period</th><th>Immunization</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n                <tr><th>Adverse Event Reactions During Measurement Period</th><th>AdverseEvent</th><th>0</th><th>*</th><th>Out</th></tr>\n              \n            </table>\n          </td>\n        </tr>\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Data Requirements:</b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>\n              \n                <tr>\n                  <th>AdverseEvent</th>\n                  <th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>\n                  <th/>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n                <tr>\n                  <th>AdverseEvent</th>\n                  <th>http://hl7.org/fhir/StructureDefinition/AdverseEvent</th>\n                  <th/>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n                <tr>\n                  <th>Location</th>\n                  <th>http://hl7.org/fhir/StructureDefinition/Location</th>\n                  <th/>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n                <tr>\n                  <th>Location</th>\n                  <th>http://hl7.org/fhir/StructureDefinition/Location</th>\n                  <th/>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n            </table>\n          </td>\n        </tr>\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\">/**\n * Immunization Indicator Elements by Patients as Context\n */\n\nlibrary IMMZIndicatorElements\n\nusing FHIR version '4.0.1'\n\ninclude FHIRHelpers version '4.0.1'\n\ninclude WHOConcepts\ninclude WHOCommon called WC\n\ninclude IMMZConcepts called Concepts\ninclude IMMZAgeConcepts called Age\ninclude IMMZCommon called Common\ninclude IMMZElements called Elements\n\n\n\ncodesystem &quot;Administrative Gender Codes&quot;: 'http://hl7.org/fhir/administrative-gender'\ncode &quot;Males&quot; : 'male' from &quot;Administrative Gender Codes&quot; display 'Males'\ncode &quot;Females&quot; : 'female' from &quot;Administrative Gender Codes&quot; display 'Females'\ncode &quot;Other&quot; : 'other' from &quot;Administrative Gender Codes&quot; display 'Other/NA'\n\nparameter &quot;Measurement Period&quot; Interval&lt;Date&gt; default Interval[@2025-01-01, @2025-12-31]\n\ncontext Patient\n\n/*\n@stratifier: Age in Years\n*/\ndefine &quot;Age Stratifier&quot;:\n  case\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 1 then Age.&quot;P0Y--P1Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 2 then Age.&quot;P1Y--P2Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 3 then Age.&quot;P2Y--P3Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 4 then Age.&quot;P3Y--P4Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 5 then Age.&quot;P4Y--P5Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 6 then Age.&quot;P5Y--P6Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 7 then Age.&quot;P6Y--P7Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 8 then Age.&quot;P7Y--P8Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 9 then Age.&quot;P8Y--P9Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 10 then Age.&quot;P9Y--P10Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 11 then Age.&quot;P10Y--P11Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 12 then Age.&quot;P11Y--P12Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 13 then Age.&quot;P12Y--P13Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 14 then Age.&quot;P13Y--P14Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 15 then Age.&quot;P14Y--P15Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 16 then Age.&quot;P15Y--P16Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 17 then Age.&quot;P16Y--P17Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 18 then Age.&quot;P17Y--P18Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 19 then Age.&quot;P18Y--P19Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 20 then Age.&quot;P19Y--P20Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 21 then Age.&quot;P20Y--P21Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 22 then Age.&quot;P21Y--P22Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 23 then Age.&quot;P22Y--P23Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 24 then Age.&quot;P23Y--P24Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 25 then Age.&quot;P24Y--P25Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 26 then Age.&quot;P25Y--P26Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 27 then Age.&quot;P26Y--P27Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 28 then Age.&quot;P27Y--P28Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 29 then Age.&quot;P28Y--P29Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 30 then Age.&quot;P29Y--P30Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 31 then Age.&quot;P30Y--P31Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 32 then Age.&quot;P31Y--P32Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 33 then Age.&quot;P32Y--P33Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 34 then Age.&quot;P33Y--P34Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 35 then Age.&quot;P34Y--P35Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 36 then Age.&quot;P35Y--P36Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 37 then Age.&quot;P36Y--P37Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 38 then Age.&quot;P37Y--P38Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 39 then Age.&quot;P38Y--P39Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 40 then Age.&quot;P39Y--P40Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 41 then Age.&quot;P40Y--P41Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 42 then Age.&quot;P41Y--P42Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 43 then Age.&quot;P42Y--P43Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 44 then Age.&quot;P43Y--P44Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 45 then Age.&quot;P44Y--P45Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 46 then Age.&quot;P45Y--P46Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 47 then Age.&quot;P46Y--P47Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 48 then Age.&quot;P47Y--P48Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 49 then Age.&quot;P48Y--P49Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 50 then Age.&quot;P49Y--P50Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 51 then Age.&quot;P50Y--P51Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 52 then Age.&quot;P51Y--P52Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 53 then Age.&quot;P52Y--P53Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 54 then Age.&quot;P53Y--P54Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 55 then Age.&quot;P54Y--P55Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 56 then Age.&quot;P55Y--P56Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 57 then Age.&quot;P56Y--P57Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 58 then Age.&quot;P57Y--P58Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 59 then Age.&quot;P58Y--P59Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 60 then Age.&quot;P59Y--P60Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 61 then Age.&quot;P60Y--P61Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 62 then Age.&quot;P61Y--P62Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 63 then Age.&quot;P62Y--P63Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 64 then Age.&quot;P63Y--P64Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 65 then Age.&quot;P64Y--P65Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 66 then Age.&quot;P65Y--P66Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 67 then Age.&quot;P66Y--P67Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 68 then Age.&quot;P67Y--P68Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 69 then Age.&quot;P68Y--P69Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 70 then Age.&quot;P69Y--P70Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 71 then Age.&quot;P70Y--P71Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 72 then Age.&quot;P71Y--P72Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 73 then Age.&quot;P72Y--P73Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 74 then Age.&quot;P73Y--P74Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 75 then Age.&quot;P74Y--P75Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 76 then Age.&quot;P75Y--P76Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 77 then Age.&quot;P76Y--P77Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 78 then Age.&quot;P77Y--P78Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 79 then Age.&quot;P78Y--P79Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 80 then Age.&quot;P79Y--P80Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 81 then Age.&quot;P80Y--P81Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 82 then Age.&quot;P81Y--P82Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 83 then Age.&quot;P82Y--P83Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 84 then Age.&quot;P83Y--P84Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 85 then Age.&quot;P84Y--P85Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 86 then Age.&quot;P85Y--P86Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 87 then Age.&quot;P86Y--P87Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 88 then Age.&quot;P87Y--P88Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 89 then Age.&quot;P88Y--P89Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 90 then Age.&quot;P89Y--P90Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 91 then Age.&quot;P90Y--P91Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 92 then Age.&quot;P91Y--P92Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 93 then Age.&quot;P92Y--P93Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 94 then Age.&quot;P93Y--P94Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 95 then Age.&quot;P94Y--P95Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 96 then Age.&quot;P95Y--P96Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 97 then Age.&quot;P96Y--P97Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 98 then Age.&quot;P97Y--P98Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 99 then Age.&quot;P98Y--P99Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 100 then Age.&quot;P99Y--P100Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt;= 100 then Age.&quot;P100Y--P9999Y&quot;\n    else null\n  end\n\n/* \n@stratifier: Infant disaggregations by age\n*/\ndefine &quot;Newborn By Age Stratifier&quot;:\n    case \n        when AgeInHoursAt(end of &quot;Measurement Period&quot;) &lt;= 24 then Age.&quot;PT0H--PT24H&quot;\n        when AgeInWeeksAt(end of &quot;Measurement Period&quot;) &lt;= 2 then Age.&quot;PT24H--P2W&quot;\n        when AgeInWeeksAt(end of &quot;Measurement Period&quot;) &gt; 2 then Age.&quot;P2W--P9999Y&quot;\n        else null\n    end\n\n/*\n@stratifier: Infant disaggregations by age\n*/\ndefine &quot;Infant By Age Stratifier&quot;:\n    case \n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 1 then Age.&quot;P0Y--P1Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt;= 1 then Age.&quot;P1Y--P9999Y&quot;\n        else null\n    end\n\n/* \n@stratifier: Toddler By Age Stratifiers\n*/\ndefine &quot;Toddler By Age Stratifier&quot;:\n    case \n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 1 then Age.&quot;P0Y--P1Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 2 then Age.&quot;P1Y--P2Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt;= 2 then Age.&quot;P2Y--P9999Y&quot;\n        else null\n    end\n\n/* \n@stratifier: Child By Age Stratifiers\n*/\ndefine &quot;Child By Age Stratifier&quot;:\n    case \n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 1 then Age.&quot;P0Y--P1Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 3 then Age.&quot;P1Y--P3Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 6 then Age.&quot;P3Y--P6Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 13 then Age.&quot;P6Y--P13Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt;= 13 then Age.&quot;P13Y--P9999Y&quot;\n        else null\n    end\n\n/* \n@stratifier: Adolescent By Age Stratifiers\n*/\ndefine &quot;Adolescent By Age Stratifier&quot;:\n    case \n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 9 then Age.&quot;P0Y--P9Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt;= 14 then Age.&quot;P9Y--P15Y&quot;\n        when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt; 14 then Age.&quot;P15Y--P9999Y&quot;\n        else null\n    end\n\n/*\n@stratifier: Age Group Stratifier\n*/\ndefine &quot;By Age Group Stratifier&quot;:\n  case \n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 18 then Age.&quot;P0Y--P18Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 30 then Age.&quot;P18Y--P30Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 50 then Age.&quot;P30Y--P50Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &lt; 70 then Age.&quot;P50Y--P70Y&quot;\n    when AgeInYearsAt(end of &quot;Measurement Period&quot;) &gt;= 70 then Age.&quot;P70Y--P9999Y&quot;\n    else null\n  end\n\n/*\n@stratifier: By Administrative Gender of Patient Stratifier\n*/\ndefine &quot;By Administrative Gender Stratifier&quot;:\n    case \n        when Patient.gender = 'male' then &quot;Males&quot;\n        when Patient.gender = 'female' then &quot;Females&quot;\n        else &quot;Other&quot;\n    end\n\n/*\n@stratifier: By Geographic Region of Patient Stratifier\n*/\ndefine &quot;By Geographic Region Stratifier&quot;:\n    First(Patient.address A where A.use in { 'home' }).state\n\n/** \n * @dataElement Patient is deceased\n */\ndefine &quot;Patient Deceased During Measurement Period&quot;:\n  case \n    when Patient.deceased is FHIR.boolean then Patient.deceased as FHIR.boolean\n    when Patient.deceased is FHIR.dateTime then Patient.deceased as FHIR.dateTime before end of &quot;Measurement Period&quot;\n    else false\n  end\n\n/** \n * Patient was born during measurement period\n */\ndefine &quot;Patient Born During Measurement Period&quot;:\n    Patient.birthDate during &quot;Measurement Period&quot;\n\n/** \n * Patient is &lt; 12 months old at the end of the measurement period\n */\ndefine &quot;Patient Under 12 Months Old During Measurement Period&quot;:\n    Patient.birthDate less than 12 months before end of &quot;Measurement Period&quot;\n\n/** \n * Patient is &lt; 12 years old at the end of the measurement period\n */\ndefine &quot;Patient Under 2 Years Old During Measurement Period&quot;:\n    Patient.birthDate less than 2 years before end of &quot;Measurement Period&quot;\n\n/** \n * @define Doses which were administered during the measurement period\n */\ndefine &quot;Doses Administered to Patient During Measurement Period&quot;:\n  Elements.&quot;Doses Administered to Patient&quot;  I\n    where I.occurrence.toInterval() starts during &quot;Measurement Period&quot;\n\ndefine &quot;Adverse Events During Measurement Period&quot;:\n  [AdverseEvent] AE\n    where AE.date.toInterval() starts during &quot;Measurement Period&quot;\n/*\n  [Observation: WHOConcepts.&quot;Adverse Events&quot;] O\n    where O.effective.toInterval() during &quot;Measurement Period&quot;\n*/\n\ndefine &quot;Immunizations And Adverse Events During Measurement Period&quot;:\n  from\n    &quot;Doses Administered to Patient During Measurement Period&quot; I,\n    &quot;Adverse Events During Measurement Period&quot; O\n  where I.reaction.detail.references(O)\n  return { immunization: I, adverseEvent: O }\n\ndefine &quot;Pentavalent Doses Administered to Patient&quot;:\n  Elements.&quot;Doses Administered to Patient&quot; I \n    where I.vaccineCode in Concepts.&quot;Pentavalent vaccines&quot;\n\ndefine &quot;Pentavalent Doses Administered to Patient During Measurement Period&quot;:\n  &quot;Pentavalent Doses Administered to Patient&quot; I\n    where I.occurrence.toInterval() starts during &quot;Measurement Period&quot;\n\ndefine &quot;Measles and Rubella Doses Administered to Patient&quot;:\n  Elements.&quot;Doses Administered to Patient&quot; I \n    where I.vaccineCode in Concepts.&quot;Measles and rubella-containing vaccines&quot;\n\ndefine &quot;Measles and Rubella Doses Administered to Patient During Measurement Period&quot;:\n  &quot;Measles and Rubella Doses Administered to Patient&quot; I\n    where I.occurrence.toInterval() starts during &quot;Measurement Period&quot;\n\ndefine &quot;COVID-19 Doses Administered to Patient During Measurement Period&quot;:\n  &quot;Doses Administered to Patient During Measurement Period&quot; I \n    where I.vaccineCode in Concepts.&quot;COVID-19 vaccines&quot;\n\ndefine &quot;Adverse Events for Immunization&quot;:\n  [AdverseEvent] AE\n    where AE.actuality = 'actual'\n\n/** \n * @define Adverse events for immunizations which occurred during (or observed) during measurement period\n */\ndefine &quot;Immunizations with Adverse Events During Measurement Period&quot;:\n  &quot;Immunizations And Adverse Events During Measurement Period&quot; I\n    return I.immunization\n\n/** \n * @define Adverse events for immunizations which occurred during (or observed) during measurement period\n */\ndefine &quot;Adverse Event Reactions During Measurement Period&quot;:\n  &quot;Immunizations And Adverse Events During Measurement Period&quot; I\n    return I.adverseEvent\n\n/** \n * @function\n * @param immunization The immunization record for which the location should be retrieved\n * @return FHIR.address The location that the immunization event occurred\n */\ndefine function GetGeographicRegionForImmunization(immunization Immunization):\n  (\n    [Location] L\n        where immunization.location.references(L)\n  ).only().address.state\n\n/** \n * @function\n * @param immunization The immunization record for which the location should be retrieved\n * @return FHIR.name The name of the location that the immunization event occurred\n */\ndefine function GetLocationNameForImmunization(immunization Immunization):\n  (\n    [Location] L\n        where immunization.location.references(L)\n  ).only().name\n</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n        \n    </table>\n</div>\n</div>"
  },
  "extension" : [{
    "url" : "http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability",
    "valueCode" : "computable"
  }],
  "url" : "http://smart.who.int/immunizations-measles/Library/IMMZIndicatorElements",
  "version" : "1.0.0",
  "name" : "IMMZIndicatorElements",
  "title" : "IMMZIndicatorElements",
  "status" : "draft",
  "experimental" : true,
  "type" : {
    "coding" : [{
      "system" : "http://terminology.hl7.org/CodeSystem/library-type",
      "code" : "logic-library"
    }]
  },
  "date" : "2026-03-31T13:54:17+00:00",
  "publisher" : "WHO",
  "contact" : [{
    "name" : "WHO",
    "telecom" : [{
      "system" : "url",
      "value" : "http://who.int"
    }]
  }],
  "description" : "This library defines indicator-based elements and terminologies used throughout the Immunization CPG indicators",
  "relatedArtifact" : [{
    "type" : "depends-on",
    "display" : "Library WHOConcepts",
    "resource" : "http://smart.who.int/immunizations/Library/WHOConcepts"
  },
  {
    "type" : "depends-on",
    "display" : "Library WC",
    "resource" : "http://smart.who.int/immunizations/Library/WHOCommon"
  },
  {
    "type" : "depends-on",
    "display" : "Library Concepts",
    "resource" : "http://smart.who.int/immunizations/Library/IMMZConcepts"
  },
  {
    "type" : "depends-on",
    "display" : "Library Age",
    "resource" : "http://smart.who.int/immunizations/Library/IMMZAgeConcepts"
  },
  {
    "type" : "depends-on",
    "display" : "Library Common",
    "resource" : "http://smart.who.int/immunizations/Library/IMMZCommon"
  },
  {
    "type" : "depends-on",
    "display" : "Library Elements",
    "resource" : "http://smart.who.int/immunizations/Library/IMMZElements"
  },
  {
    "type" : "depends-on",
    "display" : "Code System Administrative Gender Codes",
    "resource" : "http://hl7.org/fhir/administrative-gender"
  }],
  "parameter" : [{
    "name" : "Measurement Period",
    "use" : "in",
    "min" : 0,
    "max" : "1",
    "type" : "Period"
  },
  {
    "name" : "Patient",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Patient"
  },
  {
    "name" : "Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "Newborn By Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "Infant By Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "Toddler By Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "Child By Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "Adolescent By Age Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "By Age Group Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "By Administrative Gender Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "Coding"
  },
  {
    "name" : "By Geographic Region Stratifier",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "string"
  },
  {
    "name" : "Patient Deceased During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "boolean"
  },
  {
    "name" : "Patient Born During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "boolean"
  },
  {
    "name" : "Patient Under 12 Months Old During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "boolean"
  },
  {
    "name" : "Patient Under 2 Years Old During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "1",
    "type" : "boolean"
  },
  {
    "name" : "Doses Administered to Patient During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Adverse Events During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "AdverseEvent"
  },
  {
    "name" : "Immunizations And Adverse Events During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Resource"
  },
  {
    "name" : "Pentavalent Doses Administered to Patient",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Pentavalent Doses Administered to Patient During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Measles and Rubella Doses Administered to Patient",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Measles and Rubella Doses Administered to Patient During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "COVID-19 Doses Administered to Patient During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Adverse Events for Immunization",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "AdverseEvent"
  },
  {
    "name" : "Immunizations with Adverse Events During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "Immunization"
  },
  {
    "name" : "Adverse Event Reactions During Measurement Period",
    "use" : "out",
    "min" : 0,
    "max" : "*",
    "type" : "AdverseEvent"
  }],
  "dataRequirement" : [{
    "type" : "AdverseEvent",
    "profile" : ["http://hl7.org/fhir/StructureDefinition/AdverseEvent"]
  },
  {
    "type" : "AdverseEvent",
    "profile" : ["http://hl7.org/fhir/StructureDefinition/AdverseEvent"]
  },
  {
    "type" : "Location",
    "profile" : ["http://hl7.org/fhir/StructureDefinition/Location"]
  },
  {
    "type" : "Location",
    "profile" : ["http://hl7.org/fhir/StructureDefinition/Location"]
  }],
  "content" : [{
    "contentType" : "text/cql",
    "data" : "LyoqCiAqIEltbXVuaXphdGlvbiBJbmRpY2F0b3IgRWxlbWVudHMgYnkgUGF0aWVudHMgYXMgQ29udGV4dAogKi8KCmxpYnJhcnkgSU1NWkluZGljYXRvckVsZW1lbnRzCgp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJwoKaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgV0hPQ29uY2VwdHMKaW5jbHVkZSBXSE9Db21tb24gY2FsbGVkIFdDCgppbmNsdWRlIElNTVpDb25jZXB0cyBjYWxsZWQgQ29uY2VwdHMKaW5jbHVkZSBJTU1aQWdlQ29uY2VwdHMgY2FsbGVkIEFnZQppbmNsdWRlIElNTVpDb21tb24gY2FsbGVkIENvbW1vbgppbmNsdWRlIElNTVpFbGVtZW50cyBjYWxsZWQgRWxlbWVudHMKCgoKY29kZXN5c3RlbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIjogJ2h0dHA6Ly9obDcub3JnL2ZoaXIvYWRtaW5pc3RyYXRpdmUtZ2VuZGVyJwpjb2RlICJNYWxlcyIgOiAnbWFsZScgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdNYWxlcycKY29kZSAiRmVtYWxlcyIgOiAnZmVtYWxlJyBmcm9tICJBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgQ29kZXMiIGRpc3BsYXkgJ0ZlbWFsZXMnCmNvZGUgIk90aGVyIiA6ICdvdGhlcicgZnJvbSAiQWRtaW5pc3RyYXRpdmUgR2VuZGVyIENvZGVzIiBkaXNwbGF5ICdPdGhlci9OQScKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlPiBkZWZhdWx0IEludGVydmFsW0AyMDI1LTAxLTAxLCBAMjAyNS0xMi0zMV0KCmNvbnRleHQgUGF0aWVudAoKLyoKQHN0cmF0aWZpZXI6IEFnZSBpbiBZZWFycwoqLwpkZWZpbmUgIkFnZSBTdHJhdGlmaWVyIjoKICBjYXNlCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMSB0aGVuIEFnZS4iUDBZLS1QMVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMiB0aGVuIEFnZS4iUDFZLS1QMlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMyB0aGVuIEFnZS4iUDJZLS1QM1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNCB0aGVuIEFnZS4iUDNZLS1QNFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNSB0aGVuIEFnZS4iUDRZLS1QNVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDVZLS1QNlkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNyB0aGVuIEFnZS4iUDZZLS1QN1kiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOCB0aGVuIEFnZS4iUDdZLS1QOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgOSB0aGVuIEFnZS4iUDhZLS1QOVkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMTAgdGhlbiBBZ2UuIlA5WS0tUDEwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMSB0aGVuIEFnZS4iUDEwWS0tUDExWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMiB0aGVuIEFnZS4iUDExWS0tUDEyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMyB0aGVuIEFnZS4iUDEyWS0tUDEzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNCB0aGVuIEFnZS4iUDEzWS0tUDE0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNSB0aGVuIEFnZS4iUDE0WS0tUDE1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNiB0aGVuIEFnZS4iUDE1WS0tUDE2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxNyB0aGVuIEFnZS4iUDE2WS0tUDE3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOCB0aGVuIEFnZS4iUDE3WS0tUDE4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxOSB0aGVuIEFnZS4iUDE4WS0tUDE5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMCB0aGVuIEFnZS4iUDE5WS0tUDIwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMSB0aGVuIEFnZS4iUDIwWS0tUDIxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMiB0aGVuIEFnZS4iUDIxWS0tUDIyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyMyB0aGVuIEFnZS4iUDIyWS0tUDIzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNCB0aGVuIEFnZS4iUDIzWS0tUDI0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNSB0aGVuIEFnZS4iUDI0WS0tUDI1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNiB0aGVuIEFnZS4iUDI1WS0tUDI2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyNyB0aGVuIEFnZS4iUDI2WS0tUDI3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOCB0aGVuIEFnZS4iUDI3WS0tUDI4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyOSB0aGVuIEFnZS4iUDI4WS0tUDI5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMCB0aGVuIEFnZS4iUDI5WS0tUDMwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMSB0aGVuIEFnZS4iUDMwWS0tUDMxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMiB0aGVuIEFnZS4iUDMxWS0tUDMyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzMyB0aGVuIEFnZS4iUDMyWS0tUDMzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNCB0aGVuIEFnZS4iUDMzWS0tUDM0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNSB0aGVuIEFnZS4iUDM0WS0tUDM1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNiB0aGVuIEFnZS4iUDM1WS0tUDM2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzNyB0aGVuIEFnZS4iUDM2WS0tUDM3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOCB0aGVuIEFnZS4iUDM3WS0tUDM4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzOSB0aGVuIEFnZS4iUDM4WS0tUDM5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MCB0aGVuIEFnZS4iUDM5WS0tUDQwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MSB0aGVuIEFnZS4iUDQwWS0tUDQxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MiB0aGVuIEFnZS4iUDQxWS0tUDQyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0MyB0aGVuIEFnZS4iUDQyWS0tUDQzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NCB0aGVuIEFnZS4iUDQzWS0tUDQ0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NSB0aGVuIEFnZS4iUDQ0WS0tUDQ1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NiB0aGVuIEFnZS4iUDQ1WS0tUDQ2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0NyB0aGVuIEFnZS4iUDQ2WS0tUDQ3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OCB0aGVuIEFnZS4iUDQ3WS0tUDQ4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA0OSB0aGVuIEFnZS4iUDQ4WS0tUDQ5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MCB0aGVuIEFnZS4iUDQ5WS0tUDUwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MSB0aGVuIEFnZS4iUDUwWS0tUDUxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MiB0aGVuIEFnZS4iUDUxWS0tUDUyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1MyB0aGVuIEFnZS4iUDUyWS0tUDUzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NCB0aGVuIEFnZS4iUDUzWS0tUDU0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NSB0aGVuIEFnZS4iUDU0WS0tUDU1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NiB0aGVuIEFnZS4iUDU1WS0tUDU2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1NyB0aGVuIEFnZS4iUDU2WS0tUDU3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OCB0aGVuIEFnZS4iUDU3WS0tUDU4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA1OSB0aGVuIEFnZS4iUDU4WS0tUDU5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MCB0aGVuIEFnZS4iUDU5WS0tUDYwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MSB0aGVuIEFnZS4iUDYwWS0tUDYxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MiB0aGVuIEFnZS4iUDYxWS0tUDYyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2MyB0aGVuIEFnZS4iUDYyWS0tUDYzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NCB0aGVuIEFnZS4iUDYzWS0tUDY0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NSB0aGVuIEFnZS4iUDY0WS0tUDY1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NiB0aGVuIEFnZS4iUDY1WS0tUDY2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2NyB0aGVuIEFnZS4iUDY2WS0tUDY3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OCB0aGVuIEFnZS4iUDY3WS0tUDY4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA2OSB0aGVuIEFnZS4iUDY4WS0tUDY5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MCB0aGVuIEFnZS4iUDY5WS0tUDcwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MSB0aGVuIEFnZS4iUDcwWS0tUDcxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MiB0aGVuIEFnZS4iUDcxWS0tUDcyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3MyB0aGVuIEFnZS4iUDcyWS0tUDczWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NCB0aGVuIEFnZS4iUDczWS0tUDc0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NSB0aGVuIEFnZS4iUDc0WS0tUDc1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NiB0aGVuIEFnZS4iUDc1WS0tUDc2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3NyB0aGVuIEFnZS4iUDc2WS0tUDc3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OCB0aGVuIEFnZS4iUDc3WS0tUDc4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA3OSB0aGVuIEFnZS4iUDc4WS0tUDc5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MCB0aGVuIEFnZS4iUDc5WS0tUDgwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MSB0aGVuIEFnZS4iUDgwWS0tUDgxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MiB0aGVuIEFnZS4iUDgxWS0tUDgyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4MyB0aGVuIEFnZS4iUDgyWS0tUDgzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NCB0aGVuIEFnZS4iUDgzWS0tUDg0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NSB0aGVuIEFnZS4iUDg0WS0tUDg1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NiB0aGVuIEFnZS4iUDg1WS0tUDg2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4NyB0aGVuIEFnZS4iUDg2WS0tUDg3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OCB0aGVuIEFnZS4iUDg3WS0tUDg4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA4OSB0aGVuIEFnZS4iUDg4WS0tUDg5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MCB0aGVuIEFnZS4iUDg5WS0tUDkwWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MSB0aGVuIEFnZS4iUDkwWS0tUDkxWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MiB0aGVuIEFnZS4iUDkxWS0tUDkyWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5MyB0aGVuIEFnZS4iUDkyWS0tUDkzWSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NCB0aGVuIEFnZS4iUDkzWS0tUDk0WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NSB0aGVuIEFnZS4iUDk0WS0tUDk1WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NiB0aGVuIEFnZS4iUDk1WS0tUDk2WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5NyB0aGVuIEFnZS4iUDk2WS0tUDk3WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OCB0aGVuIEFnZS4iUDk3WS0tUDk4WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5OSB0aGVuIEFnZS4iUDk4WS0tUDk5WSIKICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAxMDAgdGhlbiBBZ2UuIlA5OVktLVAxMDBZIgogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMDAgdGhlbiBBZ2UuIlAxMDBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qIApAc3RyYXRpZmllcjogSW5mYW50IGRpc2FnZ3JlZ2F0aW9ucyBieSBhZ2UKKi8KZGVmaW5lICJOZXdib3JuIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJbkhvdXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyNCB0aGVuIEFnZS4iUFQwSC0tUFQyNEgiCiAgICAgICAgd2hlbiBBZ2VJbldlZWtzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8PSAyIHRoZW4gQWdlLiJQVDI0SC0tUDJXIgogICAgICAgIHdoZW4gQWdlSW5XZWVrc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPiAyIHRoZW4gQWdlLiJQMlctLVA5OTk5WSIKICAgICAgICBlbHNlIG51bGwKICAgIGVuZAoKLyoKQHN0cmF0aWZpZXI6IEluZmFudCBkaXNhZ2dyZWdhdGlvbnMgYnkgYWdlCiovCmRlZmluZSAiSW5mYW50IEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPj0gMSB0aGVuIEFnZS4iUDFZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qIApAc3RyYXRpZmllcjogVG9kZGxlciBCeSBBZ2UgU3RyYXRpZmllcnMKKi8KZGVmaW5lICJUb2RkbGVyIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAyIHRoZW4gQWdlLiJQMVktLVAyWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDIgdGhlbiBBZ2UuIlAyWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IENoaWxkIEJ5IEFnZSBTdHJhdGlmaWVycwoqLwpkZWZpbmUgIkNoaWxkIEJ5IEFnZSBTdHJhdGlmaWVyIjoKICAgIGNhc2UgCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEgdGhlbiBBZ2UuIlAwWS0tUDFZIgogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCAzIHRoZW4gQWdlLiJQMVktLVAzWSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNiB0aGVuIEFnZS4iUDNZLS1QNlkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDEzIHRoZW4gQWdlLiJQNlktLVAxM1kiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+PSAxMyB0aGVuIEFnZS4iUDEzWS0tUDk5OTlZIgogICAgICAgIGVsc2UgbnVsbAogICAgZW5kCgovKiAKQHN0cmF0aWZpZXI6IEFkb2xlc2NlbnQgQnkgQWdlIFN0cmF0aWZpZXJzCiovCmRlZmluZSAiQWRvbGVzY2VudCBCeSBBZ2UgU3RyYXRpZmllciI6CiAgICBjYXNlIAogICAgICAgIHdoZW4gQWdlSW5ZZWFyc0F0KGVuZCBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIikgPCA5IHRoZW4gQWdlLiJQMFktLVA5WSIKICAgICAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDw9IDE0IHRoZW4gQWdlLiJQOVktLVAxNVkiCiAgICAgICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA+IDE0IHRoZW4gQWdlLiJQMTVZLS1QOTk5OVkiCiAgICAgICAgZWxzZSBudWxsCiAgICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBBZ2UgR3JvdXAgU3RyYXRpZmllcgoqLwpkZWZpbmUgIkJ5IEFnZSBHcm91cCBTdHJhdGlmaWVyIjoKICBjYXNlIAogICAgd2hlbiBBZ2VJblllYXJzQXQoZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiKSA8IDE4IHRoZW4gQWdlLiJQMFktLVAxOFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgMzAgdGhlbiBBZ2UuIlAxOFktLVAzMFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNTAgdGhlbiBBZ2UuIlAzMFktLVA1MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpIDwgNzAgdGhlbiBBZ2UuIlA1MFktLVA3MFkiCiAgICB3aGVuIEFnZUluWWVhcnNBdChlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIpID49IDcwIHRoZW4gQWdlLiJQNzBZLS1QOTk5OVkiCiAgICBlbHNlIG51bGwKICBlbmQKCi8qCkBzdHJhdGlmaWVyOiBCeSBBZG1pbmlzdHJhdGl2ZSBHZW5kZXIgb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgQWRtaW5pc3RyYXRpdmUgR2VuZGVyIFN0cmF0aWZpZXIiOgogICAgY2FzZSAKICAgICAgICB3aGVuIFBhdGllbnQuZ2VuZGVyID0gJ21hbGUnIHRoZW4gIk1hbGVzIgogICAgICAgIHdoZW4gUGF0aWVudC5nZW5kZXIgPSAnZmVtYWxlJyB0aGVuICJGZW1hbGVzIgogICAgICAgIGVsc2UgIk90aGVyIgogICAgZW5kCgovKgpAc3RyYXRpZmllcjogQnkgR2VvZ3JhcGhpYyBSZWdpb24gb2YgUGF0aWVudCBTdHJhdGlmaWVyCiovCmRlZmluZSAiQnkgR2VvZ3JhcGhpYyBSZWdpb24gU3RyYXRpZmllciI6CiAgICBGaXJzdChQYXRpZW50LmFkZHJlc3MgQSB3aGVyZSBBLnVzZSBpbiB7ICdob21lJyB9KS5zdGF0ZQoKLyoqIAogKiBAZGF0YUVsZW1lbnQgUGF0aWVudCBpcyBkZWNlYXNlZAogKi8KZGVmaW5lICJQYXRpZW50IERlY2Vhc2VkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGNhc2UgCiAgICB3aGVuIFBhdGllbnQuZGVjZWFzZWQgaXMgRkhJUi5ib29sZWFuIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmJvb2xlYW4KICAgIHdoZW4gUGF0aWVudC5kZWNlYXNlZCBpcyBGSElSLmRhdGVUaW1lIHRoZW4gUGF0aWVudC5kZWNlYXNlZCBhcyBGSElSLmRhdGVUaW1lIGJlZm9yZSBlbmQgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCIKICAgIGVsc2UgZmFsc2UKICBlbmQKCi8qKiAKICogUGF0aWVudCB3YXMgYm9ybiBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgQm9ybiBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAgIFBhdGllbnQuYmlydGhEYXRlIGR1cmluZyAiTWVhc3VyZW1lbnQgUGVyaW9kIgoKLyoqIAogKiBQYXRpZW50IGlzIDwgMTIgbW9udGhzIG9sZCBhdCB0aGUgZW5kIG9mIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiUGF0aWVudCBVbmRlciAxMiBNb250aHMgT2xkIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICAgUGF0aWVudC5iaXJ0aERhdGUgbGVzcyB0aGFuIDEyIG1vbnRocyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIFBhdGllbnQgaXMgPCAxMiB5ZWFycyBvbGQgYXQgdGhlIGVuZCBvZiB0aGUgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIlBhdGllbnQgVW5kZXIgMiBZZWFycyBPbGQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgICBQYXRpZW50LmJpcnRoRGF0ZSBsZXNzIHRoYW4gMiB5ZWFycyBiZWZvcmUgZW5kIG9mICJNZWFzdXJlbWVudCBQZXJpb2QiCgovKiogCiAqIEBkZWZpbmUgRG9zZXMgd2hpY2ggd2VyZSBhZG1pbmlzdGVyZWQgZHVyaW5nIHRoZSBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQgRHVyaW5nIE1lYXN1cmVtZW50IFBlcmlvZCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiAgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5kYXRlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCi8qCiAgW09ic2VydmF0aW9uOiBXSE9Db25jZXB0cy4iQWR2ZXJzZSBFdmVudHMiXSBPCiAgICB3aGVyZSBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCiovCgpkZWZpbmUgIkltbXVuaXphdGlvbnMgQW5kIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogIGZyb20KICAgICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJLAogICAgIkFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiIE8KICB3aGVyZSBJLnJlYWN0aW9uLmRldGFpbC5yZWZlcmVuY2VzKE8pCiAgcmV0dXJuIHsgaW1tdW5pemF0aW9uOiBJLCBhZHZlcnNlRXZlbnQ6IE8gfQoKZGVmaW5lICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCI6CiAgRWxlbWVudHMuIkRvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iUGVudGF2YWxlbnQgdmFjY2luZXMiCgpkZWZpbmUgIlBlbnRhdmFsZW50IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJQZW50YXZhbGVudCBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIk1lYXNsZXMgYW5kIFJ1YmVsbGEgRG9zZXMgQWRtaW5pc3RlcmVkIHRvIFBhdGllbnQiOgogIEVsZW1lbnRzLiJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSSAKICAgIHdoZXJlIEkudmFjY2luZUNvZGUgaW4gQ29uY2VwdHMuIk1lYXNsZXMgYW5kIHJ1YmVsbGEtY29udGFpbmluZyB2YWNjaW5lcyIKCmRlZmluZSAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIjoKICAiTWVhc2xlcyBhbmQgUnViZWxsYSBEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCIgSQogICAgd2hlcmUgSS5vY2N1cnJlbmNlLnRvSW50ZXJ2YWwoKSBzdGFydHMgZHVyaW5nICJNZWFzdXJlbWVudCBQZXJpb2QiCgpkZWZpbmUgIkNPVklELTE5IERvc2VzIEFkbWluaXN0ZXJlZCB0byBQYXRpZW50IER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJEb3NlcyBBZG1pbmlzdGVyZWQgdG8gUGF0aWVudCBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJIAogICAgd2hlcmUgSS52YWNjaW5lQ29kZSBpbiBDb25jZXB0cy4iQ09WSUQtMTkgdmFjY2luZXMiCgpkZWZpbmUgIkFkdmVyc2UgRXZlbnRzIGZvciBJbW11bml6YXRpb24iOgogIFtBZHZlcnNlRXZlbnRdIEFFCiAgICB3aGVyZSBBRS5hY3R1YWxpdHkgPSAnYWN0dWFsJwoKLyoqIAogKiBAZGVmaW5lIEFkdmVyc2UgZXZlbnRzIGZvciBpbW11bml6YXRpb25zIHdoaWNoIG9jY3VycmVkIGR1cmluZyAob3Igb2JzZXJ2ZWQpIGR1cmluZyBtZWFzdXJlbWVudCBwZXJpb2QKICovCmRlZmluZSAiSW1tdW5pemF0aW9ucyB3aXRoIEFkdmVyc2UgRXZlbnRzIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5pbW11bml6YXRpb24KCi8qKiAKICogQGRlZmluZSBBZHZlcnNlIGV2ZW50cyBmb3IgaW1tdW5pemF0aW9ucyB3aGljaCBvY2N1cnJlZCBkdXJpbmcgKG9yIG9ic2VydmVkKSBkdXJpbmcgbWVhc3VyZW1lbnQgcGVyaW9kCiAqLwpkZWZpbmUgIkFkdmVyc2UgRXZlbnQgUmVhY3Rpb25zIER1cmluZyBNZWFzdXJlbWVudCBQZXJpb2QiOgogICJJbW11bml6YXRpb25zIEFuZCBBZHZlcnNlIEV2ZW50cyBEdXJpbmcgTWVhc3VyZW1lbnQgUGVyaW9kIiBJCiAgICByZXR1cm4gSS5hZHZlcnNlRXZlbnQKCi8qKiAKICogQGZ1bmN0aW9uCiAqIEBwYXJhbSBpbW11bml6YXRpb24gVGhlIGltbXVuaXphdGlvbiByZWNvcmQgZm9yIHdoaWNoIHRoZSBsb2NhdGlvbiBzaG91bGQgYmUgcmV0cmlldmVkCiAqIEByZXR1cm4gRkhJUi5hZGRyZXNzIFRoZSBsb2NhdGlvbiB0aGF0IHRoZSBpbW11bml6YXRpb24gZXZlbnQgb2NjdXJyZWQKICovCmRlZmluZSBmdW5jdGlvbiBHZXRHZW9ncmFwaGljUmVnaW9uRm9ySW1tdW5pemF0aW9uKGltbXVuaXphdGlvbiBJbW11bml6YXRpb24pOgogICgKICAgIFtMb2NhdGlvbl0gTAogICAgICAgIHdoZXJlIGltbXVuaXphdGlvbi5sb2NhdGlvbi5yZWZlcmVuY2VzKEwpCiAgKS5vbmx5KCkuYWRkcmVzcy5zdGF0ZQoKLyoqIAogKiBAZnVuY3Rpb24KICogQHBhcmFtIGltbXVuaXphdGlvbiBUaGUgaW1tdW5pemF0aW9uIHJlY29yZCBmb3Igd2hpY2ggdGhlIGxvY2F0aW9uIHNob3VsZCBiZSByZXRyaWV2ZWQKICogQHJldHVybiBGSElSLm5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2F0aW9uIHRoYXQgdGhlIGltbXVuaXphdGlvbiBldmVudCBvY2N1cnJlZAogKi8KZGVmaW5lIGZ1bmN0aW9uIEdldExvY2F0aW9uTmFtZUZvckltbXVuaXphdGlvbihpbW11bml6YXRpb24gSW1tdW5pemF0aW9uKToKICAoCiAgICBbTG9jYXRpb25dIEwKICAgICAgICB3aGVyZSBpbW11bml6YXRpb24ubG9jYXRpb24ucmVmZXJlbmNlcyhMKQogICkub25seSgpLm5hbWUK"
  }]
}