@luftborn/custom-elements 1.1.44 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +2 -2
  2. package/assets/style.css +277 -277
  3. package/azure-pipeline.yml +54 -0
  4. package/demo/index.html +585 -585
  5. package/demo/index.js +6109 -0
  6. package/demo/index.min.js +6110 -0
  7. package/demo/index.min.js.map +1 -0
  8. package/demo/index.ts +11 -11
  9. package/demo/old/index.html +586 -586
  10. package/demo/old/index.js +10849 -10849
  11. package/demo/old/index.min.js +10850 -10850
  12. package/demo/old/index.ts +10 -10
  13. package/dist/custom-form.d.ts +20 -20
  14. package/dist/custom-form.js +147 -146
  15. package/dist/custom-form.js.map +1 -1
  16. package/dist/elements/Address/AddressElement.d.ts +28 -28
  17. package/dist/elements/Address/AddressElement.js +206 -206
  18. package/dist/elements/BankField/BankFieldElement.d.ts +22 -22
  19. package/dist/elements/BankField/BankFieldElement.js +127 -127
  20. package/dist/elements/CPRElement/CPRElement.d.ts +14 -14
  21. package/dist/elements/CPRElement/CPRElement.js +82 -82
  22. package/dist/elements/CVRElement/CVRElement.d.ts +14 -14
  23. package/dist/elements/CVRElement/CVRElement.js +82 -82
  24. package/dist/elements/CheckBoxElement/CheckBoxElement.d.ts +14 -14
  25. package/dist/elements/CheckBoxElement/CheckBoxElement.js +96 -96
  26. package/dist/elements/CheckBoxElement/CheckBoxElement.js.map +1 -1
  27. package/dist/elements/CustomRegularExpression/CustomRegularExpressionElement.d.ts +12 -12
  28. package/dist/elements/CustomRegularExpression/CustomRegularExpressionElement.js +82 -82
  29. package/dist/elements/DateField/DateFieldElement.d.ts +12 -12
  30. package/dist/elements/DateField/DateFieldElement.js +85 -85
  31. package/dist/elements/DropDownList/DropDownListElement.d.ts +14 -14
  32. package/dist/elements/DropDownList/DropDownListElement.js +93 -93
  33. package/dist/elements/DropDownList/DropDownListElement.js.map +1 -1
  34. package/dist/elements/Elements.d.ts +18 -18
  35. package/dist/elements/Elements.js +37 -37
  36. package/dist/elements/EmailField/EmailFieldElement.d.ts +13 -13
  37. package/dist/elements/EmailField/EmailFieldElement.js +83 -83
  38. package/dist/elements/FileField/FileFieldElement.d.ts +15 -12
  39. package/dist/elements/FileField/FileFieldElement.js +103 -83
  40. package/dist/elements/FileField/FileFieldElement.js.map +1 -1
  41. package/dist/elements/IdentificationElement/IdentificationElement.d.ts +18 -18
  42. package/dist/elements/IdentificationElement/IdentificationElement.js +94 -94
  43. package/dist/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.d.ts +16 -16
  44. package/dist/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.js +114 -108
  45. package/dist/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.js.map +1 -1
  46. package/dist/elements/NumericField/NumericFieldElement.d.ts +12 -12
  47. package/dist/elements/NumericField/NumericFieldElement.js +91 -91
  48. package/dist/elements/RadioButtonGroup/RadioButtonGroupElement.d.ts +14 -14
  49. package/dist/elements/RadioButtonGroup/RadioButtonGroupElement.js +99 -99
  50. package/dist/elements/RadioButtonGroup/RadioButtonGroupElement.js.map +1 -1
  51. package/dist/elements/TextAreaElement/TextAreaElement.d.ts +12 -12
  52. package/dist/elements/TextAreaElement/TextAreaElement.js +79 -79
  53. package/dist/elements/TextField/TextFieldElement.d.ts +12 -12
  54. package/dist/elements/TextField/TextFieldElement.js +79 -79
  55. package/dist/elements/TypeAhead/TypeAheadElement.d.ts +24 -24
  56. package/dist/elements/TypeAhead/TypeAheadElement.js +209 -209
  57. package/dist/framework/CustomEvents.d.ts +21 -21
  58. package/dist/framework/CustomEvents.js +47 -47
  59. package/dist/framework/CustomInputElement.d.ts +50 -50
  60. package/dist/framework/CustomInputElement.js +258 -257
  61. package/dist/framework/CustomInputElement.js.map +1 -1
  62. package/dist/framework/Language/Languages/Base/BaseDictionary.d.ts +4 -4
  63. package/dist/framework/Language/Languages/Base/BaseDictionary.js +20 -20
  64. package/dist/framework/Language/Languages/CzechDictionary.d.ts +4 -0
  65. package/dist/framework/Language/Languages/CzechDictionary.js +40 -0
  66. package/dist/framework/Language/Languages/CzechDictionary.js.map +1 -0
  67. package/dist/framework/Language/Languages/DanishDictionary.d.ts +4 -4
  68. package/dist/framework/Language/Languages/DanishDictionary.js +39 -39
  69. package/dist/framework/Language/Languages/DutchDictionary.d.ts +4 -0
  70. package/dist/framework/Language/Languages/DutchDictionary.js +40 -0
  71. package/dist/framework/Language/Languages/DutchDictionary.js.map +1 -0
  72. package/dist/framework/Language/Languages/EnglishDictionary.d.ts +4 -4
  73. package/dist/framework/Language/Languages/EnglishDictionary.js +39 -39
  74. package/dist/framework/Language/Languages/EstonianDictionary.d.ts +4 -0
  75. package/dist/framework/Language/Languages/EstonianDictionary.js +40 -0
  76. package/dist/framework/Language/Languages/EstonianDictionary.js.map +1 -0
  77. package/dist/framework/Language/Languages/FinnishDictionary.d.ts +4 -0
  78. package/dist/framework/Language/Languages/FinnishDictionary.js +40 -0
  79. package/dist/framework/Language/Languages/FinnishDictionary.js.map +1 -0
  80. package/dist/framework/Language/Languages/FrenchDictionary.d.ts +4 -0
  81. package/dist/framework/Language/Languages/FrenchDictionary.js +40 -0
  82. package/dist/framework/Language/Languages/FrenchDictionary.js.map +1 -0
  83. package/dist/framework/Language/Languages/GermanDictionary.d.ts +4 -0
  84. package/dist/framework/Language/Languages/GermanDictionary.js +40 -0
  85. package/dist/framework/Language/Languages/GermanDictionary.js.map +1 -0
  86. package/dist/framework/Language/Languages/GreekDictionary.d.ts +4 -0
  87. package/dist/framework/Language/Languages/GreekDictionary.js +40 -0
  88. package/dist/framework/Language/Languages/GreekDictionary.js.map +1 -0
  89. package/dist/framework/Language/Languages/HungarianDictionary.d.ts +4 -0
  90. package/dist/framework/Language/Languages/HungarianDictionary.js +40 -0
  91. package/dist/framework/Language/Languages/HungarianDictionary.js.map +1 -0
  92. package/dist/framework/Language/Languages/IcelandicDictionary.d.ts +4 -0
  93. package/dist/framework/Language/Languages/IcelandicDictionary.js +40 -0
  94. package/dist/framework/Language/Languages/IcelandicDictionary.js.map +1 -0
  95. package/dist/framework/Language/Languages/ItalianDictionary.d.ts +4 -0
  96. package/dist/framework/Language/Languages/ItalianDictionary.js +40 -0
  97. package/dist/framework/Language/Languages/ItalianDictionary.js.map +1 -0
  98. package/dist/framework/Language/Languages/LatvianDictionary.d.ts +4 -0
  99. package/dist/framework/Language/Languages/LatvianDictionary.js +40 -0
  100. package/dist/framework/Language/Languages/LatvianDictionary.js.map +1 -0
  101. package/dist/framework/Language/Languages/LituanianDictionary.d.ts +4 -0
  102. package/dist/framework/Language/Languages/LituanianDictionary.js +40 -0
  103. package/dist/framework/Language/Languages/LituanianDictionary.js.map +1 -0
  104. package/dist/framework/Language/Languages/NorwegianDictionary.d.ts +4 -0
  105. package/dist/framework/Language/Languages/NorwegianDictionary.js +40 -0
  106. package/dist/framework/Language/Languages/NorwegianDictionary.js.map +1 -0
  107. package/dist/framework/Language/Languages/PolishDictionary.d.ts +4 -0
  108. package/dist/framework/Language/Languages/PolishDictionary.js +40 -0
  109. package/dist/framework/Language/Languages/PolishDictionary.js.map +1 -0
  110. package/dist/framework/Language/Languages/PortugueseDictionary.d.ts +4 -0
  111. package/dist/framework/Language/Languages/PortugueseDictionary.js +40 -0
  112. package/dist/framework/Language/Languages/PortugueseDictionary.js.map +1 -0
  113. package/dist/framework/Language/Languages/SpanishDictionary.d.ts +4 -0
  114. package/dist/framework/Language/Languages/SpanishDictionary.js +40 -0
  115. package/dist/framework/Language/Languages/SpanishDictionary.js.map +1 -0
  116. package/dist/framework/Language/Languages/SwedishDictionary.d.ts +4 -0
  117. package/dist/framework/Language/Languages/SwedishDictionary.js +40 -0
  118. package/dist/framework/Language/Languages/SwedishDictionary.js.map +1 -0
  119. package/dist/framework/Language/Translator.d.ts +23 -6
  120. package/dist/framework/Language/Translator.js +115 -32
  121. package/dist/framework/Language/Translator.js.map +1 -1
  122. package/dist/framework/Models/OptionWithDescription.d.ts +6 -6
  123. package/dist/framework/Models/OptionWithDescription.js +9 -9
  124. package/dist/framework/Polyfills/getAttributeNamesPolyfill.d.ts +1 -1
  125. package/dist/framework/Polyfills/getAttributeNamesPolyfill.js +17 -17
  126. package/dist/framework/Translations/CaseConverter.d.ts +5 -5
  127. package/dist/framework/Translations/CaseConverter.js +50 -50
  128. package/dist/framework/Utilities/ArrayUtil.d.ts +6 -0
  129. package/dist/framework/Utilities/ArrayUtil.js +37 -0
  130. package/dist/framework/Utilities/ArrayUtil.js.map +1 -0
  131. package/dist/framework/Utilities/DomUtil.d.ts +21 -0
  132. package/dist/framework/Utilities/DomUtil.js +102 -0
  133. package/dist/framework/Utilities/DomUtil.js.map +1 -0
  134. package/dist/framework/Utilities/DomUtility.d.ts +3 -3
  135. package/dist/framework/Utilities/DomUtility.js +12 -12
  136. package/dist/framework/Utilities/MakeRequest.d.ts +8 -0
  137. package/dist/framework/Utilities/MakeRequest.js +49 -0
  138. package/dist/framework/Utilities/MakeRequest.js.map +1 -0
  139. package/dist/framework/Utilities/StringUtil.d.ts +4 -0
  140. package/dist/framework/Utilities/StringUtil.js +17 -0
  141. package/dist/framework/Utilities/StringUtil.js.map +1 -0
  142. package/dist/framework/Utilities/ViewportUtil.d.ts +8 -0
  143. package/dist/framework/Utilities/ViewportUtil.js +43 -0
  144. package/dist/framework/Utilities/ViewportUtil.js.map +1 -0
  145. package/dist/framework/Utilities/debouncer.d.ts +8 -8
  146. package/dist/framework/Utilities/debouncer.js +51 -51
  147. package/dist/framework/Validation/IValidator.interface.d.ts +3 -3
  148. package/dist/framework/Validation/IValidator.interface.js +2 -2
  149. package/dist/framework/Validation/Validators/BankAccount.d.ts +4 -4
  150. package/dist/framework/Validation/Validators/BankAccount.js +12 -12
  151. package/dist/framework/Validation/Validators/BankAccountRegistrationNumber.d.ts +4 -4
  152. package/dist/framework/Validation/Validators/BankAccountRegistrationNumber.js +12 -12
  153. package/dist/framework/Validation/Validators/BankIdNorway.d.ts +5 -5
  154. package/dist/framework/Validation/Validators/BankIdNorway.js +21 -21
  155. package/dist/framework/Validation/Validators/BankIdSweden.d.ts +5 -5
  156. package/dist/framework/Validation/Validators/BankIdSweden.js +21 -21
  157. package/dist/framework/Validation/Validators/CPR.d.ts +9 -9
  158. package/dist/framework/Validation/Validators/CPR.js +75 -75
  159. package/dist/framework/Validation/Validators/CVR.d.ts +5 -5
  160. package/dist/framework/Validation/Validators/CVR.js +30 -30
  161. package/dist/framework/custom-element.decorator.d.ts +9 -9
  162. package/dist/framework/custom-element.decorator.js +51 -51
  163. package/dist/index.d.ts +7 -7
  164. package/dist/index.js +14 -14
  165. package/node_modules/@webcomponents/webcomponentsjs/CHANGELOG.md +15 -0
  166. package/node_modules/@webcomponents/webcomponentsjs/README.md +13 -0
  167. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-ce.js +31 -31
  168. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-ce.js.map +1 -1
  169. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-pf_dom.js +15 -13
  170. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-pf_dom.js.map +1 -1
  171. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-pf_js.js.map +1 -1
  172. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +237 -223
  173. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +1 -1
  174. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce.js +188 -176
  175. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +1 -1
  176. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd.js +155 -144
  177. package/node_modules/@webcomponents/webcomponentsjs/bundles/webcomponents-sd.js.map +1 -1
  178. package/node_modules/@webcomponents/webcomponentsjs/package.json +31 -64
  179. package/node_modules/@webcomponents/webcomponentsjs/src/entrypoints/webcomponents-pf_dom-index.js +2 -0
  180. package/node_modules/@webcomponents/webcomponentsjs/src/platform/event-listener-options.js +122 -0
  181. package/node_modules/@webcomponents/webcomponentsjs/src/platform/toggle-attribute.js +39 -0
  182. package/node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.d.ts +1 -0
  183. package/node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js +239 -225
  184. package/node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js.map +1 -1
  185. package/node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js +35 -3
  186. package/package.json +38 -39
  187. package/src/custom-form.ts +140 -139
  188. package/src/elements/Address/AddressElement.ts +216 -216
  189. package/src/elements/BankField/BankFieldElement.ts +127 -127
  190. package/src/elements/CPRElement/CPRElement.ts +74 -74
  191. package/src/elements/CVRElement/CVRElement.ts +75 -75
  192. package/src/elements/CheckBoxElement/CheckBoxElement.ts +99 -99
  193. package/src/elements/CustomRegularExpression/CustomRegularExpressionElement.ts +75 -75
  194. package/src/elements/DateField/DateFieldElement.ts +78 -78
  195. package/src/elements/DropDownList/DropDownListElement.ts +100 -100
  196. package/src/elements/Elements.ts +37 -37
  197. package/src/elements/EmailField/EmailFieldElement.ts +78 -78
  198. package/src/elements/FileField/FileFieldElement.ts +96 -76
  199. package/src/elements/IdentificationElement/IdentificationElement.ts +104 -104
  200. package/src/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.ts +116 -111
  201. package/src/elements/NumericField/NumericFieldElement.ts +84 -84
  202. package/src/elements/RadioButtonGroup/RadioButtonGroupElement.ts +103 -103
  203. package/src/elements/TextAreaElement/TextAreaElement.ts +72 -72
  204. package/src/elements/TextField/TextFieldElement.ts +72 -72
  205. package/src/elements/TypeAhead/TypeAheadElement.ts +248 -248
  206. package/src/framework/CustomEvents.ts +47 -47
  207. package/src/framework/CustomInputElement.ts +277 -276
  208. package/src/framework/Language/Languages/Base/BaseDictionary.ts +15 -15
  209. package/src/framework/Language/Languages/CzechDictionary.ts +18 -0
  210. package/src/framework/Language/Languages/DanishDictionary.ts +17 -17
  211. package/src/framework/Language/Languages/DutchDictionary.ts +18 -0
  212. package/src/framework/Language/Languages/EnglishDictionary.ts +18 -18
  213. package/src/framework/Language/Languages/EstonianDictionary.ts +18 -0
  214. package/src/framework/Language/Languages/FinnishDictionary.ts +18 -0
  215. package/src/framework/Language/Languages/FrenchDictionary.ts +18 -0
  216. package/src/framework/Language/Languages/GermanDictionary.ts +18 -0
  217. package/src/framework/Language/Languages/GreekDictionary.ts +18 -0
  218. package/src/framework/Language/Languages/HungarianDictionary.ts +18 -0
  219. package/src/framework/Language/Languages/IcelandicDictionary.ts +18 -0
  220. package/src/framework/Language/Languages/ItalianDictionary.ts +18 -0
  221. package/src/framework/Language/Languages/LatvianDictionary.ts +18 -0
  222. package/src/framework/Language/Languages/LituanianDictionary.ts +18 -0
  223. package/src/framework/Language/Languages/NorwegianDictionary.ts +18 -0
  224. package/src/framework/Language/Languages/PolishDictionary.ts +18 -0
  225. package/src/framework/Language/Languages/PortugueseDictionary.ts +18 -0
  226. package/src/framework/Language/Languages/SpanishDictionary.ts +18 -0
  227. package/src/framework/Language/Languages/SwedishDictionary.ts +18 -0
  228. package/src/framework/Language/Translator.ts +110 -26
  229. package/src/framework/Models/OptionWithDescription.ts +8 -8
  230. package/src/framework/Polyfills/getAttributeNamesPolyfill.ts +13 -13
  231. package/src/framework/Translations/CaseConverter.ts +43 -43
  232. package/src/framework/Utilities/ArrayUtil.ts +31 -0
  233. package/src/framework/Utilities/DomUtil.ts +117 -0
  234. package/src/framework/Utilities/DomUtility.ts +6 -6
  235. package/src/framework/Utilities/MakeRequest.ts +47 -0
  236. package/src/framework/Utilities/StringUtil.ts +9 -0
  237. package/src/framework/Utilities/ViewportUtil.ts +46 -0
  238. package/src/framework/Utilities/debouncer.ts +66 -66
  239. package/src/framework/Validation/IValidator.interface.ts +3 -3
  240. package/src/framework/Validation/Validators/BankAccount.ts +7 -7
  241. package/src/framework/Validation/Validators/BankAccountRegistrationNumber.ts +8 -8
  242. package/src/framework/Validation/Validators/BankIdNorway.ts +21 -21
  243. package/src/framework/Validation/Validators/BankIdSweden.ts +21 -21
  244. package/src/framework/Validation/Validators/CPR.ts +82 -82
  245. package/src/framework/Validation/Validators/CVR.ts +27 -27
  246. package/src/framework/custom-element.decorator.ts +57 -57
  247. package/src/index.ts +12 -12
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["node_modules/browser-pack/_prelude.js","demo/index.ts","node_modules/@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js","node_modules/@webcomponents/webcomponentsjs/webcomponents-bundle.js","node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js","node_modules/intl-tel-input/build/js/intlTelInput.js","node_modules/intl-tel-input/index.js","node_modules/process/browser.js","node_modules/timers-browserify/main.js","src/custom-form.ts","src/elements/Address/AddressElement.ts","src/elements/BankField/BankFieldElement.ts","src/elements/CPRElement/CPRElement.ts","src/elements/CVRElement/CVRElement.ts","src/elements/CheckBoxElement/CheckBoxElement.ts","src/elements/CustomRegularExpression/CustomRegularExpressionElement.ts","src/elements/DateField/DateFieldElement.ts","src/elements/DropDownList/DropDownListElement.ts","src/elements/Elements.ts","src/elements/EmailField/EmailFieldElement.ts","src/elements/FileField/FileFieldElement.ts","src/elements/IdentificationElement/IdentificationElement.ts","src/elements/InternationaPhoneNumber/InternationaPhoneNumberElement.ts","src/elements/NumericField/NumericFieldElement.ts","src/elements/RadioButtonGroup/RadioButtonGroupElement.ts","src/elements/TextAreaElement/TextAreaElement.ts","src/elements/TextField/TextFieldElement.ts","src/elements/TypeAhead/TypeAheadElement.ts","src/framework/CustomEvents.ts","src/framework/CustomInputElement.ts","src/framework/Language/Languages/Base/BaseDictionary.ts","src/framework/Language/Languages/CzechDictionary.ts","src/framework/Language/Languages/DanishDictionary.ts","src/framework/Language/Languages/DutchDictionary.ts","src/framework/Language/Languages/EnglishDictionary.ts","src/framework/Language/Languages/EstonianDictionary.ts","src/framework/Language/Languages/FinnishDictionary.ts","src/framework/Language/Languages/FrenchDictionary.ts","src/framework/Language/Languages/GermanDictionary.ts","src/framework/Language/Languages/GreekDictionary.ts","src/framework/Language/Languages/HungarianDictionary.ts","src/framework/Language/Languages/IcelandicDictionary.ts","src/framework/Language/Languages/ItalianDictionary.ts","src/framework/Language/Languages/LatvianDictionary.ts","src/framework/Language/Languages/LituanianDictionary.ts","src/framework/Language/Languages/NorwegianDictionary.ts","src/framework/Language/Languages/PolishDictionary.ts","src/framework/Language/Languages/PortugueseDictionary.ts","src/framework/Language/Languages/SpanishDictionary.ts","src/framework/Language/Languages/SwedishDictionary.ts","src/framework/Language/Translator.ts","src/framework/Polyfills/getAttributeNamesPolyfill.ts","src/framework/Utilities/ArrayUtil.ts","src/framework/Utilities/DomUtil.ts","src/framework/Utilities/DomUtility.ts","src/framework/Utilities/MakeRequest.ts","src/framework/Utilities/StringUtil.ts","src/framework/Utilities/ViewportUtil.ts","src/framework/Utilities/debouncer.ts","src/framework/Validation/Validators/BankAccount.ts","src/framework/Validation/Validators/BankAccountRegistrationNumber.ts","src/framework/Validation/Validators/BankIdNorway.ts","src/framework/Validation/Validators/BankIdSweden.ts","src/framework/Validation/Validators/CPR.ts","src/framework/Validation/Validators/CVR.ts","src/framework/custom-element.decorator.ts","src/index.ts"],"names":[],"mappings":"AAAA;;;ACAA,wCAAsD;AAGtD,QAAQ,CAAC,kBAAkB,GAAG;IAC1B,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE;QACpC,IAAI,IAAI,GAAG,IAAI,kBAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,UAAA,OAAO;YACnB,OAAO,CAAC,IAAI,CAAC,UAAA,QAAQ,IAAM,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC;KACL;AACL,CAAC,CAAC;;;ACVF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClzCA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC1EA,0EAAyE;AACzE,6DAAwD;AACxD,iEAA4D;AAE5D;IAOC,oBAAoB,IAAqB;QAArB,SAAI,GAAJ,IAAI,CAAiB;QACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9B,CAAC;IAED,sBAAI,8BAAM;aAAV;YACC,OAAO,mBAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAC1H,CAAC;;;OAAA;IACD,sBAAI,oCAAY;aAAhB;YACC,IAAI,CAAC,aAAa;gBACjB,IAAI,CAAC,aAAa;oBAClB,mBAAS,CAAC,YAAY,CAAC,IAAI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","file":"index.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()","import { CustomForm, elements } from './../src/index';\n\n\ndocument.onreadystatechange = () => {\n if (document.readyState === 'complete') {\n let form = new CustomForm(document.forms[0]);\n form.onsubmit = promise => {\n promise.then(response => { });\n };\n }\n};\n","/**\n@license @nocompile\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n(function () {\n 'use strict';\n\n (function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.polyfillWrapFlushCallback)return;const a=HTMLElement;window.HTMLElement={HTMLElement:function HTMLElement(){return Reflect.construct(a,[],this.constructor)}}.HTMLElement,HTMLElement.prototype=a.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,a);})();\n\n}());\n","/**\n@license @nocompile\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n(function(){/*\n\n Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n This code may only be used under the BSD style license found at\n http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n Google as part of the polymer project is also subject to an additional IP\n rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n'use strict';var v;function ba(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var ca=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};\nfunction da(a){a=[\"object\"==typeof globalThis&&globalThis,a,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error(\"Cannot find global object\");}var ea=da(this);function fa(a,b){if(b)a:{var c=ea;a=a.split(\".\");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&ca(c,a,{configurable:!0,writable:!0,value:b})}}\nfa(\"Symbol\",function(a){function b(e){if(this instanceof b)throw new TypeError(\"Symbol is not a constructor\");return new c(\"jscomp_symbol_\"+(e||\"\")+\"_\"+d++,e)}function c(e,f){this.g=e;ca(this,\"description\",{configurable:!0,writable:!0,value:f})}if(a)return a;c.prototype.toString=function(){return this.g};var d=0;return b});\nfa(\"Symbol.iterator\",function(a){if(a)return a;a=Symbol(\"Symbol.iterator\");for(var b=\"Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".split(\" \"),c=0;c<b.length;c++){var d=ea[b[c]];\"function\"===typeof d&&\"function\"!=typeof d.prototype[a]&&ca(d.prototype,a,{configurable:!0,writable:!0,value:function(){return ja(ba(this))}})}return a});function ja(a){a={next:a};a[Symbol.iterator]=function(){return this};return a}\nfunction ka(a){var b=\"undefined\"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];return b?b.call(a):{next:ba(a)}}function w(a){if(!(a instanceof Array)){a=ka(a);for(var b,c=[];!(b=a.next()).done;)c.push(b.value);a=c}return a}var la;if(\"function\"==typeof Object.setPrototypeOf)la=Object.setPrototypeOf;else{var na;a:{var oa={a:!0},pa={};try{pa.__proto__=oa;na=pa.a;break a}catch(a){}na=!1}la=na?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+\" is not extensible\");return a}:null}\nvar qa=la;function ra(){this.u=!1;this.h=null;this.Oa=void 0;this.g=1;this.ea=0;this.i=null}function ua(a){if(a.u)throw new TypeError(\"Generator is already running\");a.u=!0}ra.prototype.O=function(a){this.Oa=a};function wa(a,b){a.i={ab:b,fb:!0};a.g=a.ea}ra.prototype.return=function(a){this.i={return:a};this.g=this.ea};function ya(a,b){a.g=3;return{value:b}}function za(a){this.g=new ra;this.h=a}\nfunction Aa(a,b){ua(a.g);var c=a.g.h;if(c)return Ba(a,\"return\"in c?c[\"return\"]:function(d){return{value:d,done:!0}},b,a.g.return);a.g.return(b);return Ca(a)}function Ba(a,b,c,d){try{var e=b.call(a.g.h,c);if(!(e instanceof Object))throw new TypeError(\"Iterator result \"+e+\" is not an object\");if(!e.done)return a.g.u=!1,e;var f=e.value}catch(g){return a.g.h=null,wa(a.g,g),Ca(a)}a.g.h=null;d.call(a.g,f);return Ca(a)}\nfunction Ca(a){for(;a.g.g;)try{var b=a.h(a.g);if(b)return a.g.u=!1,{value:b.value,done:!1}}catch(c){a.g.Oa=void 0,wa(a.g,c)}a.g.u=!1;if(a.g.i){b=a.g.i;a.g.i=null;if(b.fb)throw b.ab;return{value:b.return,done:!0}}return{value:void 0,done:!0}}\nfunction Da(a){this.next=function(b){ua(a.g);a.g.h?b=Ba(a,a.g.h.next,b,a.g.O):(a.g.O(b),b=Ca(a));return b};this.throw=function(b){ua(a.g);a.g.h?b=Ba(a,a.g.h[\"throw\"],b,a.g.O):(wa(a.g,b),b=Ca(a));return b};this.return=function(b){return Aa(a,b)};this[Symbol.iterator]=function(){return this}}function Ea(a,b){b=new Da(new za(b));qa&&a.prototype&&qa(b,a.prototype);return b}Array.from||(Array.from=function(a){return[].slice.call(a)});\nObject.assign||(Object.assign=function(a){for(var b=[].slice.call(arguments,1),c=0,d;c<b.length;c++)if(d=b[c])for(var e=a,f=Object.keys(d),g=0;g<f.length;g++){var h=f[g];e[h]=d[h]}return a});var Fa=setTimeout;function Ga(){}function Ha(a,b){return function(){a.apply(b,arguments)}}function A(a){if(!(this instanceof A))throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!==typeof a)throw new TypeError(\"not a function\");this.N=0;this.Ha=!1;this.I=void 0;this.ba=[];Ia(a,this)}\nfunction Ja(a,b){for(;3===a.N;)a=a.I;0===a.N?a.ba.push(b):(a.Ha=!0,Ka(function(){var c=1===a.N?b.hb:b.ib;if(null===c)(1===a.N?La:Ma)(b.promise,a.I);else{try{var d=c(a.I)}catch(e){Ma(b.promise,e);return}La(b.promise,d)}}))}\nfunction La(a,b){try{if(b===a)throw new TypeError(\"A promise cannot be resolved with itself.\");if(b&&(\"object\"===typeof b||\"function\"===typeof b)){var c=b.then;if(b instanceof A){a.N=3;a.I=b;Na(a);return}if(\"function\"===typeof c){Ia(Ha(c,b),a);return}}a.N=1;a.I=b;Na(a)}catch(d){Ma(a,d)}}function Ma(a,b){a.N=2;a.I=b;Na(a)}\nfunction Na(a){2===a.N&&0===a.ba.length&&Ka(function(){a.Ha||\"undefined\"!==typeof console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",a.I)});for(var b=0,c=a.ba.length;b<c;b++)Ja(a,a.ba[b]);a.ba=null}function Oa(a,b,c){this.hb=\"function\"===typeof a?a:null;this.ib=\"function\"===typeof b?b:null;this.promise=c}function Ia(a,b){var c=!1;try{a(function(d){c||(c=!0,La(b,d))},function(d){c||(c=!0,Ma(b,d))})}catch(d){c||(c=!0,Ma(b,d))}}\nA.prototype[\"catch\"]=function(a){return this.then(null,a)};A.prototype.then=function(a,b){var c=new this.constructor(Ga);Ja(this,new Oa(a,b,c));return c};A.prototype[\"finally\"]=function(a){var b=this.constructor;return this.then(function(c){return b.resolve(a()).then(function(){return c})},function(c){return b.resolve(a()).then(function(){return b.reject(c)})})};\nfunction Pa(a){return new A(function(b,c){function d(h,k){try{if(k&&(\"object\"===typeof k||\"function\"===typeof k)){var l=k.then;if(\"function\"===typeof l){l.call(k,function(m){d(h,m)},c);return}}e[h]=k;0===--f&&b(e)}catch(m){c(m)}}if(!a||\"undefined\"===typeof a.length)return c(new TypeError(\"Promise.all accepts an array\"));var e=Array.prototype.slice.call(a);if(0===e.length)return b([]);for(var f=e.length,g=0;g<e.length;g++)d(g,e[g])})}\nfunction Qa(a){return a&&\"object\"===typeof a&&a.constructor===A?a:new A(function(b){b(a)})}function Ra(a){return new A(function(b,c){c(a)})}function Sa(a){return new A(function(b,c){if(!a||\"undefined\"===typeof a.length)return c(new TypeError(\"Promise.race accepts an array\"));for(var d=0,e=a.length;d<e;d++)Qa(a[d]).then(b,c)})}var Ka=\"function\"===typeof setImmediate&&function(a){setImmediate(a)}||function(a){Fa(a,0)};/*\n\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nif(!window.Promise){window.Promise=A;A.prototype.then=A.prototype.then;A.all=Pa;A.race=Sa;A.resolve=Qa;A.reject=Ra;var Ta=document.createTextNode(\"\"),Ua=[];(new MutationObserver(function(){for(var a=Ua.length,b=0;b<a;b++)Ua[b]();Ua.splice(0,a)})).observe(Ta,{characterData:!0});Ka=function(a){Ua.push(a);Ta.textContent=0<Ta.textContent.length?\"\":\"a\"}};/*\n Copyright (C) 2015 by WebReflection\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n(function(a,b){if(!(b in a)){var c=typeof global===typeof c?window:global,d=0,e=String(Math.random()),f=\"__\\u0001symbol@@\"+e,g=a.getOwnPropertyNames,h=a.getOwnPropertyDescriptor,k=a.create,l=a.keys,m=a.freeze||a,q=a.defineProperty,H=a.defineProperties,C=h(a,\"getOwnPropertyNames\"),t=a.prototype,F=t.hasOwnProperty,E=t.propertyIsEnumerable,N=t.toString,y=function(I,u,G){F.call(I,f)||q(I,f,{enumerable:!1,configurable:!1,writable:!1,value:{}});I[f][\"@@\"+u]=G},X=function(I,u){var G=k(I);g(u).forEach(function(p){sa.call(u,\np)&&Va(G,p,u[p])});return G},x=function(){},ta=function(I){return I!=f&&!F.call(ha,I)},ia=function(I){return I!=f&&F.call(ha,I)},sa=function(I){var u=String(I);return ia(u)?F.call(this,u)&&!!this[f]&&this[f][\"@@\"+u]:E.call(this,I)},n=function(I){q(t,I,{enumerable:!1,configurable:!0,get:x,set:function(u){xa(this,I,{enumerable:!1,configurable:!0,writable:!0,value:u});y(this,I,!0)}});ha[I]=q(a(I),\"constructor\",kc);return m(ha[I])},J=function G(u){if(this instanceof G)throw new TypeError(\"Symbol is not a constructor\");\nreturn n(\"__\\u0001symbol:\".concat(u||\"\",e,++d))},ha=k(null),kc={value:J},ib=function(u){return ha[u]},Va=function(u,G,p){var r=String(G);if(ia(r)){G=xa;if(p.enumerable){var B=k(p);B.enumerable=!1}else B=p;G(u,r,B);y(u,r,!!p.enumerable)}else q(u,G,p);return u},jb=function(u){return g(u).filter(ia).map(ib)};C.value=Va;q(a,\"defineProperty\",C);C.value=jb;q(a,b,C);C.value=function(u){return g(u).filter(ta)};q(a,\"getOwnPropertyNames\",C);C.value=function(u,G){var p=jb(G);p.length?l(G).concat(p).forEach(function(r){sa.call(G,\nr)&&Va(u,r,G[r])}):H(u,G);return u};q(a,\"defineProperties\",C);C.value=sa;q(t,\"propertyIsEnumerable\",C);C.value=J;q(c,\"Symbol\",C);C.value=function(u){u=\"__\\u0001symbol:\".concat(\"__\\u0001symbol:\",u,e);return u in t?ha[u]:n(u)};q(J,\"for\",C);C.value=function(u){if(ta(u))throw new TypeError(u+\" is not a symbol\");if(F.call(ha,u)&&(u=u.slice(10),\"__\\u0001symbol:\"===u.slice(0,10)&&(u=u.slice(10),u!==e)))return u=u.slice(0,u.length-e.length),0<u.length?u:void 0};q(J,\"keyFor\",C);C.value=function(u,G){var p=\nh(u,G);p&&ia(G)&&(p.enumerable=sa.call(u,G));return p};q(a,\"getOwnPropertyDescriptor\",C);C.value=function(u,G){return 1===arguments.length||\"undefined\"===typeof G?k(u):X(u,G)};q(a,\"create\",C);C.value=function(){var u=N.call(this);return\"[object String]\"===u&&ia(this)?\"[object Symbol]\":u};q(t,\"toString\",C);try{if(!0===k(q({},\"__\\u0001symbol:\",{get:function(){return q(this,\"__\\u0001symbol:\",{value:!0})[\"__\\u0001symbol:\"]}}))[\"__\\u0001symbol:\"])var xa=q;else throw\"IE11\";}catch(u){xa=function(G,p,r){var B=\nh(t,p);delete t[p];q(G,p,r);q(t,p,B)}}}})(Object,\"getOwnPropertySymbols\");\n(function(a,b){var c=a.defineProperty,d=a.prototype,e=d.toString,f;\"iterator match replace search split hasInstance isConcatSpreadable unscopables species toPrimitive toStringTag\".split(\" \").forEach(function(g){g in b||(c(b,g,{value:b(g)}),\"toStringTag\"===g&&(f=a.getOwnPropertyDescriptor(d,\"toString\"),f.value=function(){var h=e.call(this),k=null==this?this:this[b.toStringTag];return null==k?h:\"[object \"+k+\"]\"},c(d,\"toString\",f)))})})(Object,Symbol);\n(function(a,b,c){function d(){return this}b[a]||(b[a]=function(){var e=0,f=this,g={next:function(){var h=f.length<=e;return h?{done:h}:{done:h,value:f[e++]}}};g[a]=d;return g});c[a]||(c[a]=function(){var e=String.fromCodePoint,f=this,g=0,h=f.length,k={next:function(){var l=h<=g,m=l?\"\":e(f.codePointAt(g));g+=m.length;return l?{done:l}:{done:l,value:m}}};k[a]=d;return k})})(Symbol.iterator,Array.prototype,String.prototype);/*\n\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nvar Wa=Object.prototype.toString;Object.prototype.toString=function(){return void 0===this?\"[object Undefined]\":null===this?\"[object Null]\":Wa.call(this)};Object.keys=function(a){return Object.getOwnPropertyNames(a).filter(function(b){return(b=Object.getOwnPropertyDescriptor(a,b))&&b.enumerable})};\nString.prototype[Symbol.iterator]&&String.prototype.codePointAt||(String.prototype[Symbol.iterator]=function Xa(){var b,c=this;return Ea(Xa,function(d){1==d.g&&(b=0);if(3!=d.g)return b<c.length?d=ya(d,c[b]):(d.g=0,d=void 0),d;b++;d.g=2})});Set.prototype[Symbol.iterator]||(Set.prototype[Symbol.iterator]=function Ya(){var b,c=this,d;return Ea(Ya,function(e){1==e.g&&(b=[],c.forEach(function(f){b.push(f)}),d=0);if(3!=e.g)return d<b.length?e=ya(e,b[d]):(e.g=0,e=void 0),e;d++;e.g=2})});\nMap.prototype[Symbol.iterator]||(Map.prototype[Symbol.iterator]=function Za(){var b,c=this,d;return Ea(Za,function(e){1==e.g&&(b=[],c.forEach(function(f,g){b.push([g,f])}),d=0);if(3!=e.g)return d<b.length?e=ya(e,b[d]):(e.g=0,e=void 0),e;d++;e.g=2})});/*\n\nCopyright (c) 2020 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nvar $a=document.createEvent(\"Event\");$a.initEvent(\"foo\",!0,!0);$a.preventDefault();if(!$a.defaultPrevented){var ab=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(ab.call(this),Object.defineProperty(this,\"defaultPrevented\",{get:function(){return!0},configurable:!0}))}}var bb=/Trident/.test(navigator.userAgent);\nif(!window.Event||bb&&\"function\"!==typeof window.Event){var cb=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent(\"Event\");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(cb){for(var db in cb)window.Event[db]=cb[db];window.Event.prototype=cb.prototype}}\nif(!window.CustomEvent||bb&&\"function\"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent(\"CustomEvent\");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;\nif(!window.MouseEvent||bb&&\"function\"!==typeof window.MouseEvent){var eb=window.MouseEvent;window.MouseEvent=function(a,b){b=b||{};var c=document.createEvent(\"MouseEvent\");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(eb)for(var fb in eb)window.MouseEvent[fb]=eb[fb];window.MouseEvent.prototype=eb.prototype};var gb,hb=function(){function a(){e++}var b=!1,c=!1,d={get capture(){return b=!0},get once(){return c=!0}},e=0,f=document.createElement(\"div\");f.addEventListener(\"click\",a,d);var g=b&&c;g&&(f.dispatchEvent(new Event(\"click\")),f.dispatchEvent(new Event(\"click\")),g=1==e);f.removeEventListener(\"click\",a,d);return g}(),kb=null!==(gb=window.EventTarget)&&void 0!==gb?gb:window.Node;\nif(!hb&&\"addEventListener\"in kb.prototype){var lb=function(a){if(!a||\"object\"!==typeof a&&\"function\"!==typeof a){var b=!!a;a=!1}else b=!!a.capture,a=!!a.once;return{capture:b,once:a}},mb=kb.prototype.addEventListener,nb=kb.prototype.removeEventListener,qb=new WeakMap,rb=new WeakMap,sb=function(a,b,c){var d=c?qb:rb;c=d.get(a);void 0===c&&d.set(a,c=new Map);a=c.get(b);void 0===a&&c.set(b,a=new WeakMap);return a};kb.prototype.addEventListener=function(a,b,c){var d=this;if(null!=b){c=lb(c);var e=c.capture;\nc=c.once;var f=sb(this,a,e);if(!f.has(b)){var g=c?function(h){f.delete(b);nb.call(d,a,g,e);if(\"function\"===typeof b)return b.call(d,h);if(\"function\"===typeof(null===b||void 0===b?void 0:b.handleEvent))return b.handleEvent(h)}:null;f.set(b,g);mb.call(this,a,null!==g&&void 0!==g?g:b,e)}}};kb.prototype.removeEventListener=function(a,b,c){if(null!=b){c=lb(c).capture;var d=sb(this,a,c),e=d.get(b);void 0!==e&&(d.delete(b),nb.call(this,a,null!==e&&void 0!==e?e:b,c))}}};Object.getOwnPropertyDescriptor(Node.prototype,\"baseURI\")||Object.defineProperty(Node.prototype,\"baseURI\",{get:function(){var a=(this.ownerDocument||this).querySelector(\"base[href]\");return a&&a.href||window.location.href},configurable:!0,enumerable:!0});/*\n\nCopyright (c) 2020 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at\nhttp://polymer.github.io/LICENSE.txt The complete set of authors may be found at\nhttp://polymer.github.io/AUTHORS.txt The complete set of contributors may be\nfound at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as\npart of the polymer project is also subject to an additional IP rights grant\nfound at http://polymer.github.io/PATENTS.txt\n*/\nvar tb,ub,vb=Element.prototype,wb=null!==(tb=Object.getOwnPropertyDescriptor(vb,\"attributes\"))&&void 0!==tb?tb:Object.getOwnPropertyDescriptor(Node.prototype,\"attributes\"),xb=null!==(ub=null===wb||void 0===wb?void 0:wb.get)&&void 0!==ub?ub:function(){return this.attributes},yb=Array.prototype.map;vb.hasOwnProperty(\"getAttributeNames\")||(vb.getAttributeNames=function(){return yb.call(xb.call(this),function(a){return a.name})});var zb,Ab=Element.prototype;Ab.hasOwnProperty(\"matches\")||(Ab.matches=null!==(zb=Ab.webkitMatchesSelector)&&void 0!==zb?zb:Ab.msMatchesSelector);var Bb=Node.prototype.appendChild;function Cb(a){a=a.prototype;a.hasOwnProperty(\"append\")||Object.defineProperty(a,\"append\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];c=ka(c);for(d=c.next();!d.done;d=c.next())d=d.value,Bb.call(this,\"string\"===typeof d?document.createTextNode(d):d)}})}Cb(Document);Cb(DocumentFragment);Cb(Element);var Db,Eb,Fb=Node.prototype.insertBefore,Gb=null!==(Eb=null===(Db=Object.getOwnPropertyDescriptor(Node.prototype,\"firstChild\"))||void 0===Db?void 0:Db.get)&&void 0!==Eb?Eb:function(){return this.firstChild};\nfunction Hb(a){a=a.prototype;a.hasOwnProperty(\"prepend\")||Object.defineProperty(a,\"prepend\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=Gb.call(this);c=ka(c);for(var e=c.next();!e.done;e=c.next())e=e.value,Fb.call(this,\"string\"===typeof e?document.createTextNode(e):e,d)}})}Hb(Document);Hb(DocumentFragment);Hb(Element);var Ib,Jb,Kb=Node.prototype.appendChild,Lb=Node.prototype.removeChild,Mb=null!==(Jb=null===(Ib=Object.getOwnPropertyDescriptor(Node.prototype,\"firstChild\"))||void 0===Ib?void 0:Ib.get)&&void 0!==Jb?Jb:function(){return this.firstChild};\nfunction Nb(a){a=a.prototype;a.hasOwnProperty(\"replaceChildren\")||Object.defineProperty(a,\"replaceChildren\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];for(;null!==(d=Mb.call(this));)Lb.call(this,d);c=ka(c);for(d=c.next();!d.done;d=c.next())d=d.value,Kb.call(this,\"string\"===typeof d?document.createTextNode(d):d)}})}Nb(Document);Nb(DocumentFragment);Nb(Element);var Ob,Pb,Qb,Rb,Sb=Node.prototype.insertBefore,Tb=null!==(Pb=null===(Ob=Object.getOwnPropertyDescriptor(Node.prototype,\"parentNode\"))||void 0===Ob?void 0:Ob.get)&&void 0!==Pb?Pb:function(){return this.parentNode},Ub=null!==(Rb=null===(Qb=Object.getOwnPropertyDescriptor(Node.prototype,\"nextSibling\"))||void 0===Qb?void 0:Qb.get)&&void 0!==Rb?Rb:function(){return this.nextSibling};\nfunction Vb(a){a=a.prototype;a.hasOwnProperty(\"after\")||Object.defineProperty(a,\"after\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=Tb.call(this);if(null!==d){var e=Ub.call(this);c=ka(c);for(var f=c.next();!f.done;f=c.next())f=f.value,Sb.call(d,\"string\"===typeof f?document.createTextNode(f):f,e)}}})}Vb(CharacterData);Vb(Element);var Wb,Xb,Yb=Node.prototype.insertBefore,Zb=null!==(Xb=null===(Wb=Object.getOwnPropertyDescriptor(Node.prototype,\"parentNode\"))||void 0===Wb?void 0:Wb.get)&&void 0!==Xb?Xb:function(){return this.parentNode};\nfunction $b(a){a=a.prototype;a.hasOwnProperty(\"before\")||Object.defineProperty(a,\"before\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=Zb.call(this);if(null!==d){c=ka(c);for(var e=c.next();!e.done;e=c.next())e=e.value,Yb.call(d,\"string\"===typeof e?document.createTextNode(e):e,this)}}})}$b(CharacterData);$b(Element);var ac,bc,cc=Node.prototype.removeChild,dc=null!==(bc=null===(ac=Object.getOwnPropertyDescriptor(Node.prototype,\"parentNode\"))||void 0===ac?void 0:ac.get)&&void 0!==bc?bc:function(){return this.parentNode};function ec(a){a=a.prototype;a.hasOwnProperty(\"remove\")||Object.defineProperty(a,\"remove\",{configurable:!0,enumerable:!0,writable:!0,value:function(){var b=dc.call(this);b&&cc.call(b,this)}})}ec(CharacterData);ec(Element);var fc,gc,hc=Node.prototype.insertBefore,ic=Node.prototype.removeChild,jc=null!==(gc=null===(fc=Object.getOwnPropertyDescriptor(Node.prototype,\"parentNode\"))||void 0===fc?void 0:fc.get)&&void 0!==gc?gc:function(){return this.parentNode};\nfunction lc(a){a=a.prototype;a.hasOwnProperty(\"replaceWith\")||Object.defineProperty(a,\"replaceWith\",{configurable:!0,enumerable:!0,writable:!0,value:function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=jc.call(this);if(null!==d){c=ka(c);for(var e=c.next();!e.done;e=c.next())e=e.value,hc.call(d,\"string\"===typeof e?document.createTextNode(e):e,this);ic.call(d,this)}}})}lc(CharacterData);lc(Element);var mc=window.Element.prototype,nc=window.HTMLElement.prototype,oc=window.SVGElement.prototype;!nc.hasOwnProperty(\"classList\")||mc.hasOwnProperty(\"classList\")||oc.hasOwnProperty(\"classList\")||Object.defineProperty(mc,\"classList\",Object.getOwnPropertyDescriptor(nc,\"classList\"));var pc=Element.prototype,qc=Element.prototype.hasAttribute,rc=Element.prototype.setAttribute,sc=Element.prototype.removeAttribute;pc.hasOwnProperty(\"toggleAttribute\")||(pc.toggleAttribute=function(a,b){if(void 0===b){if(qc.call(this,a))return sc.call(this,a),!1;rc.call(this,a,\"\");return!0}if(b)return qc.call(this,a)||rc.call(this,a,\"\"),!0;sc.call(this,a);return!1});/*\n\n Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n This code may only be used under the BSD style license found at\n http://polymer.github.io/LICENSE.txt The complete set of authors may be found\n at http://polymer.github.io/AUTHORS.txt The complete set of contributors may\n be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by\n Google as part of the polymer project is also subject to an additional IP\n rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nvar tc=document.createElement(\"style\");tc.textContent=\"body {transition: opacity ease-in 0.2s; } \\nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \\n\";var uc=document.querySelector(\"head\");uc.insertBefore(tc,uc.firstChild);var vc=window;vc.WebComponents=vc.WebComponents||{flags:{}};var wc=document.querySelector('script[src*=\"webcomponents-bundle\"]'),xc=/wc-(.+)/,yc={};if(!yc.noOpts){location.search.slice(1).split(\"&\").forEach(function(a){a=a.split(\"=\");var b;a[0]&&(b=a[0].match(xc))&&(yc[b[1]]=a[1]||!0)});if(wc)for(var zc=0,Ac=void 0;Ac=wc.attributes[zc];zc++)\"src\"!==Ac.name&&(yc[Ac.name]=Ac.value||!0);var Bc={};yc.log&&yc.log.split&&yc.log.split(\",\").forEach(function(a){Bc[a]=!0});yc.log=Bc}\nvc.WebComponents.flags=yc;var Cc=yc.shadydom;if(Cc){vc.ShadyDOM=vc.ShadyDOM||{};vc.ShadyDOM.force=Cc;var Dc=yc.noPatch;vc.ShadyDOM.noPatch=\"true\"===Dc?!0:Dc}var Ec=yc.register||yc.ce;Ec&&window.customElements&&(vc.customElements.forcePolyfill=Ec);/*\n\n Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n Code distributed by Google as part of the polymer project is also\n subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\n(function(){function a(){}function b(p,r){if(!p.childNodes.length)return[];switch(p.nodeType){case Node.DOCUMENT_NODE:return F.call(p,r);case Node.DOCUMENT_FRAGMENT_NODE:return E.call(p,r);default:return t.call(p,r)}}var c=\"undefined\"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function p(z,R){if(z instanceof DocumentFragment)for(var ob;ob=z.firstChild;)B.call(this,ob,R);else B.call(this,\nz,R);return z}e=!0;var r=Node.prototype.cloneNode;Node.prototype.cloneNode=function(z){z=r.call(this,z);this instanceof DocumentFragment&&(z.__proto__=DocumentFragment.prototype);return z};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},\nconfigurable:!0},nodeName:{get:function(){return\"#document-fragment\"},configurable:!0}});var B=Node.prototype.insertBefore;Node.prototype.insertBefore=p;var K=Node.prototype.appendChild;Node.prototype.appendChild=function(z){z instanceof DocumentFragment?p.call(this,z,null):K.call(this,z);return z};var aa=Node.prototype.removeChild,ma=Node.prototype.replaceChild;Node.prototype.replaceChild=function(z,R){z instanceof DocumentFragment?(p.call(this,z,R),aa.call(this,R)):ma.call(this,z,R);return R};Document.prototype.createDocumentFragment=\nfunction(){var z=this.createElement(\"df\");z.__proto__=DocumentFragment.prototype;return z};var va=Document.prototype.importNode;Document.prototype.importNode=function(z,R){R=va.call(this,z,R||!1);z instanceof DocumentFragment&&(R.__proto__=DocumentFragment.prototype);return R}}();var f=Node.prototype.cloneNode,g=Document.prototype.createElement,h=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,q=DOMParser.prototype.parseFromString,\nH=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,\"innerHTML\")||{get:function(){return this.innerHTML},set:function(p){this.innerHTML=p}},C=Object.getOwnPropertyDescriptor(window.Node.prototype,\"childNodes\")||{get:function(){return this.childNodes}},t=Element.prototype.querySelectorAll,F=Document.prototype.querySelectorAll,E=DocumentFragment.prototype.querySelectorAll,N=function(){if(!c){var p=document.createElement(\"template\"),r=document.createElement(\"template\");r.content.appendChild(document.createElement(\"div\"));\np.content.appendChild(r);p=p.cloneNode(!0);return 0===p.content.childNodes.length||0===p.content.firstChild.content.childNodes.length||d}}();if(c){var y=document.implementation.createHTMLDocument(\"template\"),X=!0,x=document.createElement(\"style\");x.textContent=\"template{display:none;}\";var ta=document.head;ta.insertBefore(x,ta.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var ia=!document.createElement(\"div\").hasOwnProperty(\"innerHTML\");a.Z=function(p){if(!p.content&&p.namespaceURI===\ndocument.documentElement.namespaceURI){p.content=y.createDocumentFragment();for(var r;r=p.firstChild;)l.call(p.content,r);if(ia)p.__proto__=a.prototype;else if(p.cloneNode=function(B){return a.va(this,B)},X)try{n(p),J(p)}catch(B){X=!1}a.bootstrap(p.content)}};var sa={option:[\"select\"],thead:[\"table\"],col:[\"colgroup\",\"table\"],tr:[\"tbody\",\"table\"],th:[\"tr\",\"tbody\",\"table\"],td:[\"tr\",\"tbody\",\"table\"]},n=function(p){Object.defineProperty(p,\"innerHTML\",{get:function(){return xa(this)},set:function(r){var B=\nsa[(/<([a-z][^/\\0>\\x20\\t\\r\\n\\f]+)/i.exec(r)||[\"\",\"\"])[1].toLowerCase()];if(B)for(var K=0;K<B.length;K++)r=\"<\"+B[K]+\">\"+r+\"</\"+B[K]+\">\";y.body.innerHTML=r;for(a.bootstrap(y);this.content.firstChild;)k.call(this.content,this.content.firstChild);r=y.body;if(B)for(K=0;K<B.length;K++)r=r.lastChild;for(;r.firstChild;)l.call(this.content,r.firstChild)},configurable:!0})},J=function(p){Object.defineProperty(p,\"outerHTML\",{get:function(){return\"<template>\"+this.innerHTML+\"</template>\"},set:function(r){if(this.parentNode){y.body.innerHTML=\nr;for(r=this.ownerDocument.createDocumentFragment();y.body.firstChild;)l.call(r,y.body.firstChild);m.call(this.parentNode,r,this)}else throw Error(\"Failed to set the 'outerHTML' property on 'Element': This element has no parent node.\");},configurable:!0})};n(a.prototype);J(a.prototype);a.bootstrap=function(p){p=b(p,\"template\");for(var r=0,B=p.length,K;r<B&&(K=p[r]);r++)a.Z(K)};document.addEventListener(\"DOMContentLoaded\",function(){a.bootstrap(document)});Document.prototype.createElement=function(){var p=\ng.apply(this,arguments);\"template\"===p.localName&&a.Z(p);return p};DOMParser.prototype.parseFromString=function(){var p=q.apply(this,arguments);a.bootstrap(p);return p};Object.defineProperty(HTMLElement.prototype,\"innerHTML\",{get:function(){return xa(this)},set:function(p){H.set.call(this,p);a.bootstrap(this)},configurable:!0,enumerable:!0});var ha=/[&\\u00A0\"]/g,kc=/[&\\u00A0<>]/g,ib=function(p){switch(p){case \"&\":return\"&amp;\";case \"<\":return\"&lt;\";case \">\":return\"&gt;\";case '\"':return\"&quot;\";case \"\\u00a0\":return\"&nbsp;\"}};\nx=function(p){for(var r={},B=0;B<p.length;B++)r[p[B]]=!0;return r};var Va=x(\"area base br col command embed hr img input keygen link meta param source track wbr\".split(\" \")),jb=x(\"style script xmp iframe noembed noframes plaintext noscript\".split(\" \")),xa=function(p,r){\"template\"===p.localName&&(p=p.content);for(var B=\"\",K=r?r(p):C.get.call(p),aa=0,ma=K.length,va;aa<ma&&(va=K[aa]);aa++){a:{var z=va;var R=p;var ob=r;switch(z.nodeType){case Node.ELEMENT_NODE:for(var Kc=z.localName,pb=\"<\"+Kc,Zh=z.attributes,\nHe=0;R=Zh[He];He++)pb+=\" \"+R.name+'=\"'+R.value.replace(ha,ib)+'\"';pb+=\">\";z=Va[Kc]?pb:pb+xa(z,ob)+\"</\"+Kc+\">\";break a;case Node.TEXT_NODE:z=z.data;z=R&&jb[R.localName]?z:z.replace(kc,ib);break a;case Node.COMMENT_NODE:z=\"\\x3c!--\"+z.data+\"--\\x3e\";break a;default:throw window.console.error(z),Error(\"not implemented\");}}B+=z}return B}}if(c||N){a.va=function(p,r){var B=f.call(p,!1);this.Z&&this.Z(B);r&&(l.call(B.content,f.call(p.content,!0)),I(B.content,p.content));return B};var I=function(p,r){if(r.querySelectorAll&&\n(r=b(r,\"template\"),0!==r.length)){p=b(p,\"template\");for(var B=0,K=p.length,aa,ma;B<K;B++)ma=r[B],aa=p[B],a&&a.Z&&a.Z(ma),m.call(aa.parentNode,u.call(ma,!0),aa)}},u=Node.prototype.cloneNode=function(p){if(!e&&d&&this instanceof DocumentFragment)if(p)var r=G.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else this.nodeType===Node.ELEMENT_NODE&&\"template\"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?r=a.va(this,p):r=f.call(this,\np);p&&I(r,this);return r},G=Document.prototype.importNode=function(p,r){r=r||!1;if(\"template\"===p.localName)return a.va(p,r);var B=h.call(this,p,r);if(r){I(B,p);p=b(B,'script:not([type]),script[type=\"application/javascript\"],script[type=\"text/javascript\"]');for(var K,aa=0;aa<p.length;aa++){K=p[aa];r=g.call(document,\"script\");r.textContent=K.textContent;for(var ma=K.attributes,va=0,z;va<ma.length;va++)z=ma[va],r.setAttribute(z.name,z.value);m.call(K.parentNode,r,K)}}return B}}c&&(window.HTMLTemplateElement=\na)})();/*\n\nCopyright (c) 2016 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nfunction Fc(){}Fc.prototype.toJSON=function(){return{}};function D(a){a.__shady||(a.__shady=new Fc);return a.__shady}function L(a){return a&&a.__shady};var M=window.ShadyDOM||{};M.cb=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var Gc=Object.getOwnPropertyDescriptor(Node.prototype,\"firstChild\");M.D=!!(Gc&&Gc.configurable&&Gc.get);M.Ba=M.force||!M.cb;M.J=M.noPatch||!1;M.ha=M.preferPerformance;M.Da=\"on-demand\"===M.J;var Hc;var Ic=M.querySelectorImplementation;Hc=-1<[\"native\",\"selectorEngine\"].indexOf(Ic)?Ic:void 0;M.wb=Hc;M.Ra=navigator.userAgent.match(\"Trident\");\nfunction Jc(){return Document.prototype.msElementsFromPoint?\"msElementsFromPoint\":\"elementsFromPoint\"}function Lc(a){return(a=L(a))&&void 0!==a.firstChild}function O(a){return a instanceof ShadowRoot}function Mc(a){return(a=(a=L(a))&&a.root)&&Nc(a)}var Oc=Element.prototype,Pc=Oc.matches||Oc.matchesSelector||Oc.mozMatchesSelector||Oc.msMatchesSelector||Oc.oMatchesSelector||Oc.webkitMatchesSelector,Qc=document.createTextNode(\"\"),Rc=0,Sc=[];\n(new MutationObserver(function(){for(;Sc.length;)try{Sc.shift()()}catch(a){throw Qc.textContent=Rc++,a;}})).observe(Qc,{characterData:!0});function Tc(a){Sc.push(a);Qc.textContent=Rc++}var Uc=document.contains?function(a,b){return a.__shady_native_contains(b)}:function(a,b){return a===b||a.documentElement&&a.documentElement.__shady_native_contains(b)};function Vc(a,b){for(;b;){if(b==a)return!0;b=b.__shady_parentNode}return!1}\nfunction Wc(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute(\"id\")||c.getAttribute(\"name\");d&&\"length\"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(e){return a[e]};a.namedItem=function(e){if(\"length\"!==e&&isNaN(e)&&a[e])return a[e];for(var f=ka(a),g=f.next();!g.done;g=f.next())if(g=g.value,(g.getAttribute(\"id\")||g.getAttribute(\"name\"))==e)return g;return null};return a}function Xc(a){var b=[];for(a=a.__shady_native_firstChild;a;a=a.__shady_native_nextSibling)b.push(a);return b}\nfunction Yc(a){var b=[];for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)b.push(a);return b}function Zc(a,b,c){c.configurable=!0;if(c.value)a[b]=c.value;else try{Object.defineProperty(a,b,c)}catch(d){}}function P(a,b,c,d){c=void 0===c?\"\":c;for(var e in b)d&&0<=d.indexOf(e)||Zc(a,c+e,b[e])}function $c(a,b){for(var c in b)c in a&&Zc(a,c,b[c])}function Q(a){var b={};Object.getOwnPropertyNames(a).forEach(function(c){b[c]=Object.getOwnPropertyDescriptor(a,c)});return b}\nfunction ad(a,b){for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length;d++)e=c[d],a[e]=b[e]}function bd(a){return a instanceof Node?a:document.createTextNode(\"\"+a)}function cd(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];if(1===b.length)return bd(b[0]);c=document.createDocumentFragment();b=ka(b);for(var d=b.next();!d.done;d=b.next())c.appendChild(bd(d.value));return c}\nfunction dd(a){var b;for(b=void 0===b?1:b;0<b;b--)a=a.reduce(function(c,d){Array.isArray(d)?c.push.apply(c,w(d)):c.push(d);return c},[]);return a}function ed(a){var b=[],c=new Set;a=ka(a);for(var d=a.next();!d.done;d=a.next())d=d.value,c.has(d)||(b.push(d),c.add(d));return b};var fd=[],gd;function hd(a){gd||(gd=!0,Tc(id));fd.push(a)}function id(){gd=!1;for(var a=!!fd.length;fd.length;)fd.shift()();return a}id.list=fd;function jd(){this.g=!1;this.addedNodes=[];this.removedNodes=[];this.qa=new Set}function kd(a){a.g||(a.g=!0,Tc(function(){a.flush()}))}jd.prototype.flush=function(){if(this.g){this.g=!1;var a=this.takeRecords();a.length&&this.qa.forEach(function(b){b(a)})}};jd.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};\nfunction ld(a,b){var c=D(a);c.ga||(c.ga=new jd);c.ga.qa.add(b);var d=c.ga;return{Va:b,X:d,Wa:a,takeRecords:function(){return d.takeRecords()}}}function md(a){var b=a&&a.X;b&&(b.qa.delete(a.Va),b.qa.size||(D(a.Wa).ga=null))}\nfunction nd(a,b){var c=b.getRootNode();return a.map(function(d){var e=c===d.target.getRootNode();if(e&&d.addedNodes){if(e=[].slice.call(d.addedNodes).filter(function(f){return c===f.getRootNode()}),e.length)return d=Object.create(d),Object.defineProperty(d,\"addedNodes\",{value:e,configurable:!0}),d}else if(e)return d}).filter(function(d){return d})};var od=/[&\\u00A0\"]/g,pd=/[&\\u00A0<>]/g;function qd(a){switch(a){case \"&\":return\"&amp;\";case \"<\":return\"&lt;\";case \">\":return\"&gt;\";case '\"':return\"&quot;\";case \"\\u00a0\":return\"&nbsp;\"}}function rd(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var sd=rd(\"area base br col command embed hr img input keygen link meta param source track wbr\".split(\" \")),td=rd(\"style script xmp iframe noembed noframes plaintext noscript\".split(\" \"));\nfunction ud(a,b){\"template\"===a.localName&&(a=a.content);for(var c=\"\",d=b?b(a):a.childNodes,e=0,f=d.length,g=void 0;e<f&&(g=d[e]);e++){a:{var h=g;var k=a,l=b;switch(h.nodeType){case Node.ELEMENT_NODE:k=h.localName;for(var m=\"<\"+k,q=h.attributes,H=0,C;C=q[H];H++)m+=\" \"+C.name+'=\"'+C.value.replace(od,qd)+'\"';m+=\">\";h=sd[k]?m:m+ud(h,l)+\"</\"+k+\">\";break a;case Node.TEXT_NODE:h=h.data;h=k&&td[k.localName]?h:h.replace(pd,qd);break a;case Node.COMMENT_NODE:h=\"\\x3c!--\"+h.data+\"--\\x3e\";break a;default:throw window.console.error(h),\nError(\"not implemented\");}}c+=h}return c};var vd=M.D,wd={querySelector:function(a){return this.__shady_native_querySelector(a)},querySelectorAll:function(a){return this.__shady_native_querySelectorAll(a)}},xd={};function yd(a){xd[a]=function(b){return b[\"__shady_native_\"+a]}}function zd(a,b){P(a,b,\"__shady_native_\");for(var c in b)yd(c)}function S(a,b){b=void 0===b?[]:b;for(var c=0;c<b.length;c++){var d=b[c],e=Object.getOwnPropertyDescriptor(a,d);e&&(Object.defineProperty(a,\"__shady_native_\"+d,e),e.value?wd[d]||(wd[d]=e.value):yd(d))}}\nvar Ad=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),Bd=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1),Cd=document.implementation.createHTMLDocument(\"inert\");function Dd(a){for(var b;b=a.__shady_native_firstChild;)a.__shady_native_removeChild(b)}var Ed=[\"firstElementChild\",\"lastElementChild\",\"children\",\"childElementCount\"],Fd=[\"querySelector\",\"querySelectorAll\",\"append\",\"prepend\",\"replaceChildren\"];\nfunction Gd(){var a=[\"dispatchEvent\",\"addEventListener\",\"removeEventListener\"];window.EventTarget?(S(window.EventTarget.prototype,a),void 0===window.__shady_native_addEventListener&&S(Window.prototype,a)):(S(Node.prototype,a),S(Window.prototype,a),S(XMLHttpRequest.prototype,a));vd?S(Node.prototype,\"parentNode firstChild lastChild previousSibling nextSibling childNodes parentElement textContent\".split(\" \")):zd(Node.prototype,{parentNode:{get:function(){Ad.currentNode=this;return Ad.parentNode()}},\nfirstChild:{get:function(){Ad.currentNode=this;return Ad.firstChild()}},lastChild:{get:function(){Ad.currentNode=this;return Ad.lastChild()}},previousSibling:{get:function(){Ad.currentNode=this;return Ad.previousSibling()}},nextSibling:{get:function(){Ad.currentNode=this;return Ad.nextSibling()}},childNodes:{get:function(){var b=[];Ad.currentNode=this;for(var c=Ad.firstChild();c;)b.push(c),c=Ad.nextSibling();return b}},parentElement:{get:function(){Bd.currentNode=this;return Bd.parentNode()}},textContent:{get:function(){switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:for(var b=\ndocument.createTreeWalker(this,NodeFilter.SHOW_TEXT,null,!1),c=\"\",d;d=b.nextNode();)c+=d.nodeValue;return c;default:return this.nodeValue}},set:function(b){if(\"undefined\"===typeof b||null===b)b=\"\";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:Dd(this);(0<b.length||this.nodeType===Node.ELEMENT_NODE)&&this.__shady_native_insertBefore(document.createTextNode(b),void 0);break;default:this.nodeValue=b}}}});S(Node.prototype,\"appendChild insertBefore removeChild replaceChild cloneNode contains\".split(\" \"));\nS(HTMLElement.prototype,[\"parentElement\",\"contains\"]);a={firstElementChild:{get:function(){Bd.currentNode=this;return Bd.firstChild()}},lastElementChild:{get:function(){Bd.currentNode=this;return Bd.lastChild()}},children:{get:function(){var b=[];Bd.currentNode=this;for(var c=Bd.firstChild();c;)b.push(c),c=Bd.nextSibling();return Wc(b)}},childElementCount:{get:function(){return this.children?this.children.length:0}}};vd?(S(Element.prototype,Ed),S(Element.prototype,[\"previousElementSibling\",\"nextElementSibling\",\n\"innerHTML\",\"className\"]),S(HTMLElement.prototype,[\"children\",\"innerHTML\",\"className\"])):(zd(Element.prototype,a),zd(Element.prototype,{previousElementSibling:{get:function(){Bd.currentNode=this;return Bd.previousSibling()}},nextElementSibling:{get:function(){Bd.currentNode=this;return Bd.nextSibling()}},innerHTML:{get:function(){return ud(this,Xc)},set:function(b){var c=\"template\"===this.localName?this.content:this;Dd(c);var d=this.localName||\"div\";d=this.namespaceURI&&this.namespaceURI!==Cd.namespaceURI?\nCd.createElementNS(this.namespaceURI,d):Cd.createElement(d);d.innerHTML=b;for(b=\"template\"===this.localName?d.content:d;d=b.__shady_native_firstChild;)c.__shady_native_insertBefore(d,void 0)}},className:{get:function(){return this.getAttribute(\"class\")||\"\"},set:function(b){this.setAttribute(\"class\",b)}}}));S(Element.prototype,\"setAttribute getAttribute hasAttribute removeAttribute toggleAttribute focus blur\".split(\" \"));S(Element.prototype,Fd);S(HTMLElement.prototype,[\"focus\",\"blur\"]);window.HTMLTemplateElement&&\nS(window.HTMLTemplateElement.prototype,[\"innerHTML\"]);vd?S(DocumentFragment.prototype,Ed):zd(DocumentFragment.prototype,a);S(DocumentFragment.prototype,Fd);vd?(S(Document.prototype,Ed),S(Document.prototype,[\"activeElement\"])):zd(Document.prototype,a);S(Document.prototype,[\"importNode\",\"getElementById\",\"elementFromPoint\",Jc()]);S(Document.prototype,Fd)};var Hd=Q({get childNodes(){return this.__shady_childNodes},get firstChild(){return this.__shady_firstChild},get lastChild(){return this.__shady_lastChild},get childElementCount(){return this.__shady_childElementCount},get children(){return this.__shady_children},get firstElementChild(){return this.__shady_firstElementChild},get lastElementChild(){return this.__shady_lastElementChild},get shadowRoot(){return this.__shady_shadowRoot}}),Id=Q({get textContent(){return this.__shady_textContent},set textContent(a){this.__shady_textContent=\na},get innerHTML(){return this.__shady_innerHTML},set innerHTML(a){this.__shady_innerHTML=a}}),Jd=Q({get parentElement(){return this.__shady_parentElement},get parentNode(){return this.__shady_parentNode},get nextSibling(){return this.__shady_nextSibling},get previousSibling(){return this.__shady_previousSibling},get nextElementSibling(){return this.__shady_nextElementSibling},get previousElementSibling(){return this.__shady_previousElementSibling},get className(){return this.__shady_className},set className(a){this.__shady_className=\na}});function Kd(a){for(var b in a){var c=a[b];c&&(c.enumerable=!1)}}Kd(Hd);Kd(Id);Kd(Jd);var Ld=M.D||!0===M.J,Md=Ld?function(){}:function(a){var b=D(a);b.Ta||(b.Ta=!0,$c(a,Jd))},Nd=Ld?function(){}:function(a){var b=D(a);b.Sa||(b.Sa=!0,$c(a,Hd),window.customElements&&window.customElements.polyfillWrapFlushCallback&&!M.J||$c(a,Id))};var Od=\"__eventWrappers\"+Date.now(),Pd=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,\"composed\");return a?function(b){return a.get.call(b)}:null}(),Qd=function(){function a(){}var b=!1,c={get capture(){b=!0;return!1}};window.addEventListener(\"test\",a,c);window.removeEventListener(\"test\",a,c);return b}();function Rd(a){if(null===a||\"object\"!==typeof a&&\"function\"!==typeof a){var b=!!a;var c=!1}else{b=!!a.capture;c=!!a.once;var d=a.U}return{Pa:d,capture:b,once:c,Na:Qd?a:b}}\nvar Sd={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,\ndrag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},Td={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};function Ud(a){return a instanceof Node?a.__shady_getRootNode():a}\nfunction Vd(a,b){var c=[],d=a;for(a=Ud(a);d;)c.push(d),d=d.__shady_assignedSlot?d.__shady_assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.__shady_parentNode;c[c.length-1]===document&&c.push(window);return c}function Wd(a){a.__composedPath||(a.__composedPath=Vd(a.target,!0));return a.__composedPath}function Xd(a,b){if(!O)return a;a=Vd(a,!0);for(var c=0,d,e=void 0,f,g=void 0;c<b.length;c++)if(d=b[c],f=Ud(d),f!==e&&(g=a.indexOf(f),e=f),!O(f)||-1<g)return d}\nvar Yd={get composed(){void 0===this.__composed&&(Pd?this.__composed=\"focusin\"===this.type||\"focusout\"===this.type||Pd(this):!1!==this.isTrusted&&(this.__composed=Sd[this.type]));return this.__composed||!1},composedPath:function(){this.__composedPath||(this.__composedPath=Vd(this.__target,this.composed));return this.__composedPath},get target(){return Xd(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.__relatedTarget)return null;this.__relatedTargetComposedPath||\n(this.__relatedTargetComposedPath=Vd(this.__relatedTarget,!0));return Xd(this.currentTarget||this.__previousCurrentTarget,this.__relatedTargetComposedPath)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.ua=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.ua=this.__immediatePropagationStopped=!0}},Zd=M.D&&Object.getOwnPropertyDescriptor(Event.prototype,\"eventPhase\");\nZd&&(Object.defineProperty(Yd,\"eventPhase\",{get:function(){return this.currentTarget===this.target?Event.AT_TARGET:this.__shady_native_eventPhase},enumerable:!0,configurable:!0}),Object.defineProperty(Yd,\"__shady_native_eventPhase\",Zd));function $d(a){function b(c,d){c=new a(c,d);c.__composed=d&&!!d.composed;return c}b.__proto__=a;b.prototype=a.prototype;return b}var ae={focus:!0,blur:!0};function be(a){return a.__target!==a.target||a.__relatedTarget!==a.relatedTarget}\nfunction ce(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!be(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.__immediatePropagationStopped);d++);}var de=(new Event(\"e\")).hasOwnProperty(\"currentTarget\");\nfunction ee(a){a=de?Object.create(a):a;var b=a.composedPath(),c=b.map(function(m){return Xd(m,b)}),d=a.bubbles,e=Object.getOwnPropertyDescriptor(a,\"currentTarget\");Object.defineProperty(a,\"currentTarget\",{configurable:!0,enumerable:!0,get:function(){return k}});var f=Event.CAPTURING_PHASE,g=Object.getOwnPropertyDescriptor(a,\"eventPhase\");Object.defineProperty(a,\"eventPhase\",{configurable:!0,enumerable:!0,get:function(){return f}});try{for(var h=b.length-1;0<=h;h--){var k=b[h];f=k===c[h]?Event.AT_TARGET:\nEvent.CAPTURING_PHASE;ce(a,k,\"capture\");if(a.ua)return}for(h=0;h<b.length;h++){k=b[h];var l=k===c[h];if(l||d)if(f=l?Event.AT_TARGET:Event.BUBBLING_PHASE,ce(a,k,\"bubble\"),a.ua)break}}finally{de||(e?Object.defineProperty(a,\"currentTarget\",e):delete a.currentTarget,g?Object.defineProperty(a,\"eventPhase\",g):delete a.eventPhase)}}function fe(a,b,c,d){for(var e=0;e<a.length;e++){var f=a[e],g=f.type,h=f.capture;if(b===f.node&&c===g&&d===h)return e}return-1}\nfunction ge(a){id();return!M.ha&&this instanceof Node&&!Uc(document,this)?(a.__target||he(a,this),ee(a)):this.__shady_native_dispatchEvent(a)}\nfunction ie(a,b,c){var d=this,e=Rd(c),f=e.capture,g=e.once,h=e.Pa;e=e.Na;if(b){var k=typeof b;if(\"function\"===k||\"object\"===k)if(\"object\"!==k||b.handleEvent&&\"function\"===typeof b.handleEvent){if(Td[a])return this.__shady_native_addEventListener(a,b,e);var l=h||this;if(h=b[Od]){if(-1<fe(h,l,a,f))return}else b[Od]=[];h=function(m){g&&d.__shady_removeEventListener(a,b,c);m.__target||he(m);if(l!==d){var q=Object.getOwnPropertyDescriptor(m,\"currentTarget\");Object.defineProperty(m,\"currentTarget\",{get:function(){return l},\nconfigurable:!0});var H=Object.getOwnPropertyDescriptor(m,\"eventPhase\");Object.defineProperty(m,\"eventPhase\",{configurable:!0,enumerable:!0,get:function(){return f?Event.CAPTURING_PHASE:Event.BUBBLING_PHASE}})}m.__previousCurrentTarget=m.currentTarget;if(!O(l)&&\"slot\"!==l.localName||-1!=m.composedPath().indexOf(l))if(m.composed||-1<m.composedPath().indexOf(l))if(be(m)&&m.target===m.relatedTarget)m.eventPhase===Event.BUBBLING_PHASE&&m.stopImmediatePropagation();else if(m.eventPhase===Event.CAPTURING_PHASE||\nm.bubbles||m.target===l||l instanceof Window){var C=\"function\"===k?b.call(l,m):b.handleEvent&&b.handleEvent(m);l!==d&&(q?(Object.defineProperty(m,\"currentTarget\",q),q=null):delete m.currentTarget,H?(Object.defineProperty(m,\"eventPhase\",H),H=null):delete m.eventPhase);return C}};b[Od].push({node:l,type:a,capture:f,ub:h});this.__handlers=this.__handlers||{};this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]};this.__handlers[a][f?\"capture\":\"bubble\"].push(h);ae[a]||this.__shady_native_addEventListener(a,\nh,e)}}}function je(a,b,c){if(b){var d=Rd(c);c=d.capture;var e=d.Pa;d=d.Na;if(Td[a])return this.__shady_native_removeEventListener(a,b,d);var f=e||this;e=void 0;var g=null;try{g=b[Od]}catch(h){}g&&(f=fe(g,f,a,c),-1<f&&(e=g.splice(f,1)[0].ub,g.length||(b[Od]=void 0)));this.__shady_native_removeEventListener(a,e||b,d);e&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][c?\"capture\":\"bubble\"],b=a.indexOf(e),-1<b&&a.splice(b,1))}}\nfunction ke(){for(var a in ae)window.__shady_native_addEventListener(a,function(b){b.__target||(he(b),ee(b))},!0)}var le=Q(Yd);function he(a,b){b=void 0===b?a.target:b;a.__target=b;a.__relatedTarget=a.relatedTarget;if(M.D){b=Object.getPrototypeOf(a);if(!b.hasOwnProperty(\"__shady_patchedProto\")){var c=Object.create(b);c.__shady_sourceProto=b;P(c,le);b.__shady_patchedProto=c}a.__proto__=b.__shady_patchedProto}else P(a,le)}var me=$d(Event),ne=$d(CustomEvent),oe=$d(MouseEvent);\nfunction pe(){if(!Pd&&Object.getOwnPropertyDescriptor(Event.prototype,\"isTrusted\")){var a=function(){var b=new MouseEvent(\"click\",{bubbles:!0,cancelable:!0,composed:!0});this.__shady_dispatchEvent(b)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}}\nvar qe=Object.getOwnPropertyNames(Element.prototype).filter(function(a){return\"on\"===a.substring(0,2)}),re=Object.getOwnPropertyNames(HTMLElement.prototype).filter(function(a){return\"on\"===a.substring(0,2)});function se(a){return{set:function(b){var c=D(this),d=a.substring(2);c.T||(c.T={});c.T[a]&&this.removeEventListener(d,c.T[a]);this.__shady_addEventListener(d,b);c.T[a]=b},get:function(){var b=L(this);return b&&b.T&&b.T[a]},configurable:!0}};function te(a,b){return{index:a,ia:[],pa:b}}\nfunction ue(a,b,c,d){var e=0,f=0,g=0,h=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(g=0;g<k;g++)if(a[g]!==c[g])break a;g=k}if(b==a.length&&d==c.length){h=a.length;for(var l=c.length,m=0;m<k-g&&ve(a[--h],c[--l]);)m++;h=m}e+=g;f+=g;b-=h;d-=h;if(0==b-e&&0==d-f)return[];if(e==b){for(b=te(e,0);f<d;)b.ia.push(c[f++]);return[b]}if(f==d)return[te(e,b-e)];k=e;g=f;d=d-g+1;h=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(h),b[l][0]=l;for(l=0;l<h;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<h;m++)if(a[k+m-1]===c[g+l-1])b[l][m]=\nb[l-1][m-1];else{var q=b[l-1][m]+1,H=b[l][m-1]+1;b[l][m]=q<H?q:H}k=b.length-1;g=b[0].length-1;d=b[k][g];for(a=[];0<k||0<g;)0==k?(a.push(2),g--):0==g?(a.push(3),k--):(h=b[k-1][g-1],l=b[k-1][g],m=b[k][g-1],q=l<m?l<h?l:h:m<h?m:h,q==h?(h==d?a.push(0):(a.push(1),d=h),k--,g--):q==l?(a.push(3),k--,d=l):(a.push(2),g--,d=m));a.reverse();b=void 0;k=[];for(g=0;g<a.length;g++)switch(a[g]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=te(e,0));b.pa++;e++;b.ia.push(c[f]);f++;break;case 2:b||(b=te(e,\n0));b.pa++;e++;break;case 3:b||(b=te(e,0)),b.ia.push(c[f]),f++}b&&k.push(b);return k}function ve(a,b){return a===b};var we=Q({dispatchEvent:ge,addEventListener:ie,removeEventListener:je});var xe=null;function ye(){xe||(xe=window.ShadyCSS&&window.ShadyCSS.ScopingShim);return xe||null}function ze(a,b,c){var d=ye();return d&&\"class\"===b?(d.setElementClass(a,c),!0):!1}function Ae(a,b){var c=ye();c&&c.unscopeNode(a,b)}function Be(a,b){var c=ye();if(!c)return!0;if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){c=!0;for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)c=c&&Be(a,b);return c}return a.nodeType!==Node.ELEMENT_NODE?!0:c.currentScopeForNode(a)===b}\nfunction Ce(a){if(a.nodeType!==Node.ELEMENT_NODE)return\"\";var b=ye();return b?b.currentScopeForNode(a):\"\"}function De(a,b){if(a)for(a.nodeType===Node.ELEMENT_NODE&&b(a),a=a.__shady_firstChild;a;a=a.__shady_nextSibling)a.nodeType===Node.ELEMENT_NODE&&De(a,b)};var Ee=window.document,Fe=M.ha,Ge=Object.getOwnPropertyDescriptor(Node.prototype,\"isConnected\"),Ie=Ge&&Ge.get;function Je(a){for(var b;b=a.__shady_firstChild;)a.__shady_removeChild(b)}function Ke(a){var b=L(a);if(b&&void 0!==b.ta)for(b=a.__shady_firstChild;b;b=b.__shady_nextSibling)Ke(b);if(a=L(a))a.ta=void 0}function Le(a){var b=a;if(a&&\"slot\"===a.localName){var c=L(a);(c=c&&c.aa)&&(b=c.length?c[0]:Le(a.__shady_nextSibling))}return b}\nfunction Me(a,b,c){if(a=(a=L(a))&&a.ga){if(b)if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE)for(var d=0,e=b.childNodes.length;d<e;d++)a.addedNodes.push(b.childNodes[d]);else a.addedNodes.push(b);c&&a.removedNodes.push(c);kd(a)}}\nvar Te=Q({get parentNode(){var a=L(this);a=a&&a.parentNode;return void 0!==a?a:this.__shady_native_parentNode},get firstChild(){var a=L(this);a=a&&a.firstChild;return void 0!==a?a:this.__shady_native_firstChild},get lastChild(){var a=L(this);a=a&&a.lastChild;return void 0!==a?a:this.__shady_native_lastChild},get nextSibling(){var a=L(this);a=a&&a.nextSibling;return void 0!==a?a:this.__shady_native_nextSibling},get previousSibling(){var a=L(this);a=a&&a.previousSibling;return void 0!==a?a:this.__shady_native_previousSibling},\nget childNodes(){if(Lc(this)){var a=L(this);if(!a.childNodes){a.childNodes=[];for(var b=this.__shady_firstChild;b;b=b.__shady_nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=this.__shady_native_childNodes;c.item=function(d){return c[d]};return c},get parentElement(){var a=L(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:this.__shady_native_parentElement},get isConnected(){if(Ie&&Ie.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;\nvar a=this.ownerDocument;if(null===a||Uc(a,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.__shady_parentNode||(O(a)?a.host:void 0);return!!(a&&a instanceof Document)},get textContent(){if(Lc(this)){for(var a=[],b=this.__shady_firstChild;b;b=b.__shady_nextSibling)b.nodeType!==Node.COMMENT_NODE&&a.push(b.__shady_textContent);return a.join(\"\")}return this.__shady_native_textContent},set textContent(a){if(\"undefined\"===typeof a||null===a)a=\"\";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Lc(this)&&\nM.D){var b=this.__shady_firstChild;(b!=this.__shady_lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Je(this);this.__shady_native_textContent=a}else Je(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.__shady_insertBefore(document.createTextNode(a));break;default:this.nodeValue=a}},insertBefore:function(a,b){if(this.ownerDocument!==Ee&&a.ownerDocument!==Ee)return this.__shady_native_insertBefore(a,b),a;if(a===this)throw Error(\"Failed to execute 'appendChild' on 'Node': The new child element contains the parent.\");\nif(b){var c=L(b);c=c&&c.parentNode;if(void 0!==c&&c!==this||void 0===c&&b.__shady_native_parentNode!==this)throw Error(\"Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.\");}if(b===a)return a;Me(this,a);var d=[],e=(c=Ne(this))?c.host.localName:Ce(this),f=a.__shady_parentNode;if(f){var g=Ce(a);var h=!!c||!Ne(a)||Fe&&void 0!==this.__noInsertionPoint;f.__shady_removeChild(a,h)}f=!0;var k=(!Fe||void 0===a.__noInsertionPoint&&void 0===\nthis.__noInsertionPoint)&&!Be(a,e),l=c&&!a.__noInsertionPoint&&(!Fe||a.nodeType===Node.DOCUMENT_FRAGMENT_NODE);if(l||k)k&&(g=g||Ce(a)),De(a,function(m){l&&\"slot\"===m.localName&&d.push(m);if(k){var q=g;ye()&&(q&&Ae(m,q),(q=ye())&&q.scopeNode(m,e))}});d.length&&(Oe(c),c.i.push.apply(c.i,w(d)),Pe(c));Lc(this)&&(Qe(a,this,b),h=L(this),h.root?(f=!1,Mc(this)&&Pe(h.root)):c&&\"slot\"===this.localName&&(f=!1,Pe(c)));f?(c=O(this)?this.host:this,b?(b=Le(b),c.__shady_native_insertBefore(a,b)):c.__shady_native_appendChild(a)):\na.ownerDocument!==this.ownerDocument&&this.ownerDocument.adoptNode(a);return a},appendChild:function(a){if(this!=a||!O(a))return this.__shady_insertBefore(a)},removeChild:function(a,b){b=void 0===b?!1:b;if(this.ownerDocument!==Ee)return this.__shady_native_removeChild(a);if(a.__shady_parentNode!==this)throw Error(\"The node to be removed is not a child of this node: \"+a);Me(this,null,a);var c=Ne(a),d=c&&Re(c,a),e=L(this);if(Lc(this)&&(Se(a,this),Mc(this))){Pe(e.root);var f=!0}if(ye()&&!b&&c&&a.nodeType!==\nNode.TEXT_NODE){var g=Ce(a);De(a,function(h){Ae(h,g)})}Ke(a);c&&((b=\"slot\"===this.localName)&&(f=!0),(d||b)&&Pe(c));f||(f=O(this)?this.host:this,(!e.root&&\"slot\"!==a.localName||f===a.__shady_native_parentNode)&&f.__shady_native_removeChild(a));return a},replaceChild:function(a,b){this.__shady_insertBefore(a,b);this.__shady_removeChild(b);return a},cloneNode:function(a){if(\"template\"==this.localName)return this.__shady_native_cloneNode(a);var b=this.__shady_native_cloneNode(!1);if(a&&b.nodeType!==\nNode.ATTRIBUTE_NODE){a=this.__shady_firstChild;for(var c;a;a=a.__shady_nextSibling)c=a.__shady_cloneNode(!0),b.__shady_appendChild(c)}return b},getRootNode:function(a){if(this&&this.nodeType){var b=D(this),c=b.ta;void 0===c&&(O(this)?(c=this,b.ta=c):(c=(c=this.__shady_parentNode)?c.__shady_getRootNode(a):this,document.documentElement.__shady_native_contains(this)&&(b.ta=c)));return c}},contains:function(a){return Vc(this,a)}});var Ve=Q({get assignedSlot(){var a=this.__shady_parentNode;(a=a&&a.__shady_shadowRoot)&&Ue(a);return(a=L(this))&&a.assignedSlot||null}});/*\n\n Copyright (c) 2022 The Polymer Project Authors\n SPDX-License-Identifier: BSD-3-Clause\n*/\nvar We=new Map;[[\"(\",{end:\")\",sa:!0}],[\"[\",{end:\"]\",sa:!0}],['\"',{end:'\"',sa:!1}],[\"'\",{end:\"'\",sa:!1}]].forEach(function(a){var b=ka(a);a=b.next().value;b=b.next().value;We.set(a,b)});function Xe(a,b,c,d){for(d=void 0===d?!0:d;b<a.length;b++)if(\"\\\\\"===a[b]&&b<a.length-1&&\"\\n\"!==a[b+1])b++;else{if(-1!==c.indexOf(a[b]))return b;if(d&&We.has(a[b])){var e=We.get(a[b]);b=Xe(a,b+1,[e.end],e.sa)}}return a.length}\nfunction Ye(a){function b(){if(0<d.length){for(;\" \"===d[d.length-1];)d.pop();c.push({La:d.filter(function(k,l){return 0===l%2}),Za:d.filter(function(k,l){return 1===l%2})});d.length=0}}for(var c=[],d=[],e=0;e<a.length;){var f=d[d.length-1],g=Xe(a,e,[\",\",\" \",\">\",\"+\",\"~\"]),h=g===e?a[e]:a.substring(e,g);if(\",\"===h)b();else if(-1===[void 0,\" \",\">\",\"+\",\"~\"].indexOf(f)||\" \"!==h)\" \"===f&&-1!==[\">\",\"+\",\"~\"].indexOf(h)?d[d.length-1]=h:d.push(h);e=g+(g===e?1:0)}b();return c};function Ze(a,b,c){var d=[];$e(a,b,c,d);return d}function $e(a,b,c,d){for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling){var e;if(e=a.nodeType===Node.ELEMENT_NODE){e=a;var f=b,g=c,h=d,k=f(e);k&&h.push(e);g&&g(k)?e=k:($e(e,f,g,h),e=void 0)}if(e)break}}\nvar af={get firstElementChild(){var a=L(this);if(a&&void 0!==a.firstChild){for(a=this.__shady_firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_nextSibling;return a}return this.__shady_native_firstElementChild},get lastElementChild(){var a=L(this);if(a&&void 0!==a.lastChild){for(a=this.__shady_lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_previousSibling;return a}return this.__shady_native_lastElementChild},get children(){return Lc(this)?Wc(Array.prototype.filter.call(Yc(this),\nfunction(a){return a.nodeType===Node.ELEMENT_NODE})):this.__shady_native_children},get childElementCount(){var a=this.__shady_children;return a?a.length:0}},bf=Q((af.append=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];this.__shady_insertBefore(cd.apply(null,w(b)),null)},af.prepend=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];this.__shady_insertBefore(cd.apply(null,w(b)),this.__shady_firstChild)},af.replaceChildren=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=\narguments[c];for(;null!==(c=this.__shady_firstChild);)this.__shady_removeChild(c);this.__shady_insertBefore(cd.apply(null,w(b)),null)},af));\nfunction cf(a,b){function c(e,f){return(e===a||-1===f.indexOf(\":scope\"))&&Pc.call(e,f)}var d=Ye(b);if(1>d.length)return[];for(b=dd(Ze(a,function(){return!0}).map(function(e){return dd(d.map(function(f){var g=f.La,h=g.length-1;return c(e,g[h])?{target:e,da:f,fa:e,index:h}:[]}))}));b.some(function(e){return 0<e.index});)b=dd(b.map(function(e){if(0>=e.index)return e;var f=e.target,g=e.fa,h=e.da;e=e.index-1;var k=h.Za[e],l=h.La[e];if(\" \"===k){k=[];for(g=g.__shady_parentElement;g;g=g.__shady_parentElement)c(g,\nl)&&k.push({target:f,da:h,fa:g,index:e});return k}if(\">\"===k)return g=g.__shady_parentElement,c(g,l)?{target:f,da:h,fa:g,index:e}:[];if(\"+\"===k)return(g=g.__shady_previousElementSibling)&&c(g,l)?{target:f,da:h,fa:g,index:e}:[];if(\"~\"===k){k=[];for(g=g.__shady_previousElementSibling;g;g=g.__shady_previousElementSibling)c(g,l)&&k.push({target:f,da:h,fa:g,index:e});return k}throw Error(\"Unrecognized combinator: '\"+k+\"'.\");}));return ed(b.map(function(e){return e.target}))}\nvar df=M.querySelectorImplementation,ef=Q({querySelector:function(a){if(\"native\"===df){var b=Array.prototype.slice.call((this instanceof ShadowRoot?this.host:this).__shady_native_querySelectorAll(a)),c=this.__shady_getRootNode();b=ka(b);for(var d=b.next();!d.done;d=b.next())if(d=d.value,d.__shady_getRootNode()==c)return d;return null}if(\"selectorEngine\"===df)return cf(this,a)[0]||null;if(void 0===df)return Ze(this,function(e){return Pc.call(e,a)},function(e){return!!e})[0]||null;throw Error(\"Unrecognized value of ShadyDOM.querySelectorImplementation: '\"+\n(df+\"'\"));},querySelectorAll:function(a,b){if(b||\"native\"===df){b=Array.prototype.slice.call((this instanceof ShadowRoot?this.host:this).__shady_native_querySelectorAll(a));var c=this.__shady_getRootNode();return Wc(b.filter(function(d){return d.__shady_getRootNode()==c}))}if(\"selectorEngine\"===df)return Wc(cf(this,a));if(void 0===df)return Wc(Ze(this,function(d){return Pc.call(d,a)}));throw Error(\"Unrecognized value of ShadyDOM.querySelectorImplementation: '\"+(df+\"'\"));}}),ff=M.ha&&!M.J?ad({},bf):\nbf;ad(bf,ef);var gf=Q({after:function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];c=this.__shady_parentNode;if(null!==c){var d=this.__shady_nextSibling;c.__shady_insertBefore(cd.apply(null,w(b)),d)}},before:function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];c=this.__shady_parentNode;null!==c&&c.__shady_insertBefore(cd.apply(null,w(b)),this)},remove:function(){var a=this.__shady_parentNode;null!==a&&a.__shady_removeChild(this)},replaceWith:function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=\narguments[c];c=this.__shady_parentNode;if(null!==c){var d=this.__shady_nextSibling;c.__shady_removeChild(this);c.__shady_insertBefore(cd.apply(null,w(b)),d)}}});var hf=window.document;function jf(a,b){if(\"slot\"===b)a=a.__shady_parentNode,Mc(a)&&Pe(L(a).root);else if(\"slot\"===a.localName&&\"name\"===b&&(b=Ne(a))){if(b.g){kf(b);var c=a.Ua,d=lf(a);if(d!==c){c=b.h[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.h[d]||(b.h[d]=[]);c.push(a);1<c.length&&(b.h[d]=mf(c))}}Pe(b)}}\nvar nf=Q({get previousElementSibling(){var a=L(this);if(a&&void 0!==a.previousSibling){for(a=this.__shady_previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_previousSibling;return a}return this.__shady_native_previousElementSibling},get nextElementSibling(){var a=L(this);if(a&&void 0!==a.nextSibling){for(a=this.__shady_nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.__shady_nextSibling;return a}return this.__shady_native_nextElementSibling},get slot(){return this.getAttribute(\"slot\")},\nset slot(a){this.__shady_setAttribute(\"slot\",a)},get className(){return this.getAttribute(\"class\")||\"\"},set className(a){this.__shady_setAttribute(\"class\",a)},setAttribute:function(a,b){this.ownerDocument!==hf?this.__shady_native_setAttribute(a,b):ze(this,a,b)||(this.__shady_native_setAttribute(a,b),jf(this,a))},removeAttribute:function(a){this.ownerDocument!==hf?this.__shady_native_removeAttribute(a):ze(this,a,\"\")?\"\"===this.getAttribute(a)&&this.__shady_native_removeAttribute(a):(this.__shady_native_removeAttribute(a),\njf(this,a))},toggleAttribute:function(a,b){if(this.ownerDocument!==hf)return this.__shady_native_toggleAttribute(a,b);if(!ze(this,a,\"\"))return b=this.__shady_native_toggleAttribute(a,b),jf(this,a),b;if(\"\"===this.getAttribute(a)&&!b)return this.__shady_native_toggleAttribute(a,b)}});M.ha||qe.forEach(function(a){nf[a]=se(a)});\nvar sf=Q({attachShadow:function(a){if(!this)throw Error(\"Must provide a host.\");if(!a)throw Error(\"Not enough arguments.\");if(a.shadyUpgradeFragment&&!M.Ra){var b=a.shadyUpgradeFragment;b.__proto__=ShadowRoot.prototype;of(b,this,a);pf(b,b);a=b.__noInsertionPoint?null:b.querySelectorAll(\"slot\");b.__noInsertionPoint=void 0;if(a&&a.length){var c=b;Oe(c);c.i.push.apply(c.i,w(a));Pe(b)}b.host.__shady_native_appendChild(b)}else b=new qf(rf,this,a);return this.__CE_shadowRoot=b},get shadowRoot(){var a=L(this);\nreturn a&&a.lb||null}});ad(nf,sf);var tf=document.implementation.createHTMLDocument(\"inert\"),uf=Q({get innerHTML(){return Lc(this)?ud(\"template\"===this.localName?this.content:this,Yc):this.__shady_native_innerHTML},set innerHTML(a){if(\"template\"===this.localName)this.__shady_native_innerHTML=a;else{Je(this);var b=this.localName||\"div\";b=this.namespaceURI&&this.namespaceURI!==tf.namespaceURI?tf.createElementNS(this.namespaceURI,b):tf.createElement(b);for(M.D?b.__shady_native_innerHTML=a:b.innerHTML=a;a=b.__shady_firstChild;)this.__shady_insertBefore(a)}}});var vf=Q({blur:function(){var a=L(this);(a=(a=a&&a.root)&&a.activeElement)?a.__shady_blur():this.__shady_native_blur()}});M.ha||re.forEach(function(a){vf[a]=se(a)});var wf=Q({assignedNodes:function(a){if(\"slot\"===this.localName){var b=this.__shady_getRootNode();b&&O(b)&&Ue(b);return(b=L(this))?(a&&a.flatten?b.aa:b.assignedNodes)||[]:[]}},addEventListener:function(a,b,c){if(\"slot\"!==this.localName||\"slotchange\"===a)ie.call(this,a,b,c);else{\"object\"!==typeof c&&(c={capture:!!c});var d=this.__shady_parentNode;if(!d)throw Error(\"ShadyDOM cannot attach event to slot unless it has a `parentNode`\");c.U=this;d.__shady_addEventListener(a,b,c)}},removeEventListener:function(a,\nb,c){if(\"slot\"!==this.localName||\"slotchange\"===a)je.call(this,a,b,c);else{\"object\"!==typeof c&&(c={capture:!!c});var d=this.__shady_parentNode;if(!d)throw Error(\"ShadyDOM cannot attach event to slot unless it has a `parentNode`\");c.U=this;d.__shady_removeEventListener(a,b,c)}}});var xf=Q({getElementById:function(a){return\"\"===a?null:Ze(this,function(b){return b.id==a},function(b){return!!b})[0]||null}});function yf(a,b){for(var c;b&&!a.has(c=b.__shady_getRootNode());)b=c.host;return b}function zf(a){var b=new Set;for(b.add(a);O(a)&&a.host;)a=a.host.__shady_getRootNode(),b.add(a);return b}\nvar Af=\"__shady_native_\"+Jc(),Bf=Q({get activeElement(){var a=M.D?document.__shady_native_activeElement:document.activeElement;if(!a||!a.nodeType)return null;var b=!!O(this);if(!(this===document||b&&this.host!==a&&this.host.__shady_native_contains(a)))return null;for(b=Ne(a);b&&b!==this;)a=b.host,b=Ne(a);return this===document?b?null:a:b===this?a:null},elementsFromPoint:function(a,b){a=document[Af](a,b);if(this===document&&M.useNativeDocumentEFP)return a;a=[].slice.call(a);b=zf(this);for(var c=new Set,\nd=0;d<a.length;d++)c.add(yf(b,a[d]));var e=[];c.forEach(function(f){return e.push(f)});return e},elementFromPoint:function(a,b){return this===document&&M.useNativeDocumentEFP?this.__shady_native_elementFromPoint(a,b):this.__shady_elementsFromPoint(a,b)[0]||null}});var Cf=window.document,Df=Q({importNode:function(a,b){if(a.ownerDocument!==Cf||\"template\"===a.localName)return this.__shady_native_importNode(a,b);var c=this.__shady_native_importNode(a,!1);if(b)for(a=a.__shady_firstChild;a;a=a.__shady_nextSibling)b=this.__shady_importNode(a,!0),c.__shady_appendChild(b);return c}});var Ef=Q({dispatchEvent:ge,addEventListener:ie.bind(window),removeEventListener:je.bind(window)});var Ff={};Object.getOwnPropertyDescriptor(HTMLElement.prototype,\"parentElement\")&&(Ff.parentElement=Te.parentElement);Object.getOwnPropertyDescriptor(HTMLElement.prototype,\"contains\")&&(Ff.contains=Te.contains);Object.getOwnPropertyDescriptor(HTMLElement.prototype,\"children\")&&(Ff.children=bf.children);Object.getOwnPropertyDescriptor(HTMLElement.prototype,\"innerHTML\")&&(Ff.innerHTML=uf.innerHTML);Object.getOwnPropertyDescriptor(HTMLElement.prototype,\"className\")&&(Ff.className=nf.className);\nvar Gf={EventTarget:[we],Node:[Te,window.EventTarget?null:we],Text:[Ve],Comment:[Ve],CDATASection:[Ve],ProcessingInstruction:[Ve],Element:[nf,bf,gf,Ve,!M.D||\"innerHTML\"in Element.prototype?uf:null,window.HTMLSlotElement?null:wf],HTMLElement:[vf,Ff],HTMLSlotElement:[wf],DocumentFragment:[ff,xf],Document:[Df,ff,xf,Bf],Window:[Ef],CharacterData:[gf],XMLHttpRequest:[window.EventTarget?null:we]},Hf=M.D?null:[\"innerHTML\",\"textContent\"];\nfunction If(a,b,c,d){b.forEach(function(e){return a&&e&&P(a,e,c,d)})}function Jf(a){var b=a?null:Hf,c;for(c in Gf)If(window[c]&&window[c].prototype,Gf[c],a,b)}[\"Text\",\"Comment\",\"CDATASection\",\"ProcessingInstruction\"].forEach(function(a){var b=window[a],c=Object.create(b.prototype);c.__shady_protoIsPatched=!0;If(c,Gf.EventTarget);If(c,Gf.Node);Gf[a]&&If(c,Gf[a]);b.prototype.__shady_patchedProto=c});\nfunction Kf(a){a.__shady_protoIsPatched=!0;If(a,Gf.EventTarget);If(a,Gf.Node);If(a,Gf.Element);If(a,Gf.HTMLElement);If(a,Gf.HTMLSlotElement);return a};var Lf=M.Da,Mf=M.D;function Nf(a,b){if(Lf&&!a.__shady_protoIsPatched&&!O(a)){var c=Object.getPrototypeOf(a),d=c.hasOwnProperty(\"__shady_patchedProto\")&&c.__shady_patchedProto;d||(d=Object.create(c),Kf(d),c.__shady_patchedProto=d);Object.setPrototypeOf(a,d)}Mf||(1===b?Md(a):2===b&&Nd(a))}\nfunction Of(a,b,c,d){Nf(a,1);d=d||null;var e=D(a),f=d?D(d):null;e.previousSibling=d?f.previousSibling:b.__shady_lastChild;if(f=L(e.previousSibling))f.nextSibling=a;if(f=L(e.nextSibling=d))f.previousSibling=a;e.parentNode=b;d?d===c.firstChild&&(c.firstChild=a):(c.lastChild=a,c.firstChild||(c.firstChild=a));c.childNodes=null}\nfunction Qe(a,b,c){Nf(b,2);var d=D(b);void 0!==d.firstChild&&(d.childNodes=null);if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE)for(a=a.__shady_native_firstChild;a;a=a.__shady_native_nextSibling)Of(a,b,d,c);else Of(a,b,d,c)}\nfunction Se(a,b){var c=D(a);b=D(b);a===b.firstChild&&(b.firstChild=c.nextSibling);a===b.lastChild&&(b.lastChild=c.previousSibling);a=c.previousSibling;var d=c.nextSibling;a&&(D(a).nextSibling=d);d&&(D(d).previousSibling=a);c.parentNode=c.previousSibling=c.nextSibling=void 0;void 0!==b.childNodes&&(b.childNodes=null)}\nfunction pf(a,b){var c=D(a);if(b||void 0===c.firstChild){c.childNodes=null;var d=c.firstChild=a.__shady_native_firstChild;c.lastChild=a.__shady_native_lastChild;Nf(a,2);c=d;for(d=void 0;c;c=c.__shady_native_nextSibling){var e=D(c);e.parentNode=b||a;e.nextSibling=c.__shady_native_nextSibling;e.previousSibling=d||null;d=c;Nf(c,1)}}};var Pf=Q({addEventListener:function(a,b,c){\"object\"!==typeof c&&(c={capture:!!c});c.U=c.U||this;this.host.__shady_addEventListener(a,b,c)},removeEventListener:function(a,b,c){\"object\"!==typeof c&&(c={capture:!!c});c.U=c.U||this;this.host.__shady_removeEventListener(a,b,c)}});function Qf(a,b){P(a,Pf,b);P(a,Bf,b);P(a,uf,b);P(a,bf,b);M.J&&!b?(P(a,Te,b),P(a,xf,b)):M.D||(P(a,Jd),P(a,Hd),P(a,Id))};var rf={},Rf=M.deferConnectionCallbacks&&\"loading\"===document.readyState,Sf;function Tf(a){var b=[];do b.unshift(a);while(a=a.__shady_parentNode);return b}function qf(a,b,c){if(a!==rf)throw new TypeError(\"Illegal constructor\");this.g=null;of(this,b,c)}\nfunction of(a,b,c){a.host=b;a.mode=c&&c.mode;pf(a.host);b=D(a.host);b.root=a;b.lb=\"closed\"!==a.mode?a:null;b=D(a);b.firstChild=b.lastChild=b.parentNode=b.nextSibling=b.previousSibling=null;if(M.preferPerformance)for(;b=a.host.__shady_native_firstChild;)a.host.__shady_native_removeChild(b);else Pe(a)}function Pe(a){a.Y||(a.Y=!0,hd(function(){return Ue(a)}))}\nfunction Ue(a){var b;if(b=a.Y){for(var c;a;)a:{a.Y&&(c=a),b=a;a=b.host.__shady_getRootNode();if(O(a)&&(b=L(b.host))&&0<b.ka)break a;a=void 0}b=c}(c=b)&&c._renderSelf()}\nqf.prototype._renderSelf=function(){var a=Rf;Rf=!0;this.Y=!1;if(this.g){kf(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=L(c),e=d.assignedNodes;d.assignedNodes=[];d.aa=[];if(d.Ja=e)for(d=0;d<e.length;d++){var f=L(e[d]);f.xa=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(b=this.host.__shady_firstChild;b;b=b.__shady_nextSibling)Uf(this,b);for(b=0;b<this.g.length;b++){c=this.g[b];e=L(c);if(!e.assignedNodes.length)for(d=c.__shady_firstChild;d;d=d.__shady_nextSibling)Uf(this,\nd,c);(d=(d=L(c.__shady_parentNode))&&d.root)&&(Nc(d)||d.Y)&&d._renderSelf();Vf(this,e.aa,e.assignedNodes);if(d=e.Ja){for(f=0;f<d.length;f++)L(d[f]).xa=null;e.Ja=null;d.length>e.assignedNodes.length&&(e.Aa=!0)}e.Aa&&(e.Aa=!1,Wf(this,c))}c=this.g;b=[];for(e=0;e<c.length;e++)d=c[e].__shady_parentNode,(f=L(d))&&f.root||!(0>b.indexOf(d))||b.push(d);for(c=0;c<b.length;c++){f=b[c];e=f===this?this.host:f;d=[];for(f=f.__shady_firstChild;f;f=f.__shady_nextSibling)if(\"slot\"==f.localName)for(var g=L(f).aa,h=\n0;h<g.length;h++)d.push(g[h]);else d.push(f);f=Xc(e);g=ue(d,d.length,f,f.length);for(var k=h=0,l=void 0;h<g.length&&(l=g[h]);h++){for(var m=0,q=void 0;m<l.ia.length&&(q=l.ia[m]);m++)q.__shady_native_parentNode===e&&e.__shady_native_removeChild(q),f.splice(l.index+k,1);k-=l.pa}k=0;for(l=void 0;k<g.length&&(l=g[k]);k++)for(h=f[l.index],m=l.index;m<l.index+l.pa;m++)q=d[m],e.__shady_native_insertBefore(q,h),f.splice(m,0,q)}}if(!M.preferPerformance&&!this.Ia)for(b=this.host.__shady_firstChild;b;b=b.__shady_nextSibling)c=\nL(b),b.__shady_native_parentNode!==this.host||\"slot\"!==b.localName&&c.assignedSlot||this.host.__shady_native_removeChild(b);this.Ia=!0;Rf=a;Sf&&Sf()};function Uf(a,b,c){var d=D(b),e=d.xa;d.xa=null;c||(c=(a=a.h[b.__shady_slot||\"__catchall\"])&&a[0]);c?(D(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(D(d.assignedSlot).Aa=!0)}\nfunction Vf(a,b,c){for(var d=0,e=void 0;d<c.length&&(e=c[d]);d++)if(\"slot\"==e.localName){var f=L(e).assignedNodes;f&&f.length&&Vf(a,b,f)}else b.push(c[d])}function Wf(a,b){b.__shady_native_dispatchEvent(new Event(\"slotchange\"));b=L(b);b.assignedSlot&&Wf(a,b.assignedSlot)}function Oe(a){a.i=a.i||[];a.g=a.g||[];a.h=a.h||{}}\nfunction kf(a){if(a.i&&a.i.length){for(var b=a.i,c,d=0;d<b.length;d++){var e=b[d];pf(e);var f=e.__shady_parentNode;pf(f);f=L(f);f.ka=(f.ka||0)+1;f=lf(e);a.h[f]?(c=c||{},c[f]=!0,a.h[f].push(e)):a.h[f]=[e];a.g.push(e)}if(c)for(var g in c)a.h[g]=mf(a.h[g]);a.i=[]}}function lf(a){var b=a.name||a.getAttribute(\"name\")||\"__catchall\";return a.Ua=b}\nfunction mf(a){return a.sort(function(b,c){b=Tf(b);for(var d=Tf(c),e=0;e<b.length;e++){c=b[e];var f=d[e];if(c!==f)return b=Yc(c.__shady_parentNode),b.indexOf(c)-b.indexOf(f)}})}\nfunction Re(a,b){if(a.g){kf(a);var c=a.h,d;for(d in c)for(var e=c[d],f=0;f<e.length;f++){var g=e[f];if(Vc(b,g)){e.splice(f,1);var h=a.g.indexOf(g);0<=h&&(a.g.splice(h,1),(h=L(g.__shady_parentNode))&&h.ka&&h.ka--);f--;g=L(g);if(h=g.aa)for(var k=0;k<h.length;k++){var l=h[k],m=l.__shady_native_parentNode;m&&m.__shady_native_removeChild(l)}g.aa=[];g.assignedNodes=[];h=!0}}return h}}function Nc(a){kf(a);return!(!a.g||!a.g.length)}\n(function(a){a.__proto__=DocumentFragment.prototype;Qf(a,\"__shady_\");Qf(a);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:\"#document-fragment\",configurable:!0},nodeValue:{value:null,configurable:!0}});[\"localName\",\"namespaceURI\",\"prefix\"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});[\"ownerDocument\",\"baseURI\",\"isConnected\"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},\nconfigurable:!0})})})(qf.prototype);\nif(window.customElements&&window.customElements.define&&M.Ba&&!M.preferPerformance){var Xf=new Map;Sf=function(){var a=[];Xf.forEach(function(d,e){a.push([e,d])});Xf.clear();for(var b=0;b<a.length;b++){var c=a[b][0];a[b][1]?c.__shadydom_connectedCallback():c.__shadydom_disconnectedCallback()}};Rf&&document.addEventListener(\"readystatechange\",function(){Rf=!1;Sf()},{once:!0});var Yf=function(a,b,c){var d=0,e=\"__isConnected\"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.__shadydom_connectedCallback=\nfunction(){Rf?Xf.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.__shadydom_disconnectedCallback=function(){Rf?this.isConnected||Xf.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},Zf=window.customElements.define,$f=function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;Zf.call(window.customElements,a,Yf(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d};window.customElements.define=\n$f;Object.defineProperty(window.CustomElementRegistry.prototype,\"define\",{value:$f,configurable:!0})}function Ne(a){a=a.__shady_getRootNode();if(O(a))return a};function ag(a){this.node=a}v=ag.prototype;v.addEventListener=function(a,b,c){return this.node.__shady_addEventListener(a,b,c)};v.removeEventListener=function(a,b,c){return this.node.__shady_removeEventListener(a,b,c)};v.appendChild=function(a){return this.node.__shady_appendChild(a)};v.insertBefore=function(a,b){return this.node.__shady_insertBefore(a,b)};v.removeChild=function(a){return this.node.__shady_removeChild(a)};v.replaceChild=function(a,b){return this.node.__shady_replaceChild(a,b)};\nv.cloneNode=function(a){return this.node.__shady_cloneNode(a)};v.getRootNode=function(a){return this.node.__shady_getRootNode(a)};v.contains=function(a){return this.node.__shady_contains(a)};v.dispatchEvent=function(a){return this.node.__shady_dispatchEvent(a)};v.setAttribute=function(a,b){this.node.__shady_setAttribute(a,b)};v.getAttribute=function(a){return this.node.__shady_native_getAttribute(a)};v.hasAttribute=function(a){return this.node.__shady_native_hasAttribute(a)};v.removeAttribute=function(a){this.node.__shady_removeAttribute(a)};\nv.toggleAttribute=function(a,b){return this.node.__shady_toggleAttribute(a,b)};v.attachShadow=function(a){return this.node.__shady_attachShadow(a)};v.focus=function(){this.node.__shady_native_focus()};v.blur=function(){this.node.__shady_blur()};v.importNode=function(a,b){if(this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_importNode(a,b)};v.getElementById=function(a){if(this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_getElementById(a)};\nv.elementsFromPoint=function(a,b){return this.node.__shady_elementsFromPoint(a,b)};v.elementFromPoint=function(a,b){return this.node.__shady_elementFromPoint(a,b)};v.querySelector=function(a){return this.node.__shady_querySelector(a)};v.querySelectorAll=function(a,b){return this.node.__shady_querySelectorAll(a,b)};v.assignedNodes=function(a){if(\"slot\"===this.node.localName)return this.node.__shady_assignedNodes(a)};\nv.append=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.node.__shady_append.apply(this.node,w(b))};v.prepend=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.node.__shady_prepend.apply(this.node,w(b))};v.after=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.node.__shady_after.apply(this.node,w(b))};\nv.before=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.node.__shady_before.apply(this.node,w(b))};v.remove=function(){return this.node.__shady_remove()};v.replaceWith=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.node.__shady_replaceWith.apply(this.node,w(b))};\nea.Object.defineProperties(ag.prototype,{activeElement:{configurable:!0,enumerable:!0,get:function(){if(O(this.node)||this.node.nodeType===Node.DOCUMENT_NODE)return this.node.__shady_activeElement}},_activeElement:{configurable:!0,enumerable:!0,get:function(){return this.activeElement}},host:{configurable:!0,enumerable:!0,get:function(){if(O(this.node))return this.node.host}},parentNode:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_parentNode}},firstChild:{configurable:!0,\nenumerable:!0,get:function(){return this.node.__shady_firstChild}},lastChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_lastChild}},nextSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_nextSibling}},previousSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_previousSibling}},childNodes:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_childNodes}},parentElement:{configurable:!0,enumerable:!0,\nget:function(){return this.node.__shady_parentElement}},firstElementChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_firstElementChild}},lastElementChild:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_lastElementChild}},nextElementSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_nextElementSibling}},previousElementSibling:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_previousElementSibling}},\nchildren:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_children}},childElementCount:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_childElementCount}},shadowRoot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_shadowRoot}},assignedSlot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_assignedSlot}},isConnected:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_isConnected}},innerHTML:{configurable:!0,\nenumerable:!0,get:function(){return this.node.__shady_innerHTML},set:function(a){this.node.__shady_innerHTML=a}},textContent:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_textContent},set:function(a){this.node.__shady_textContent=a}},slot:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_slot},set:function(a){this.node.__shady_slot=a}},className:{configurable:!0,enumerable:!0,get:function(){return this.node.__shady_className},set:function(a){this.node.__shady_className=\na}}});function bg(a){Object.defineProperty(ag.prototype,a,{get:function(){return this.node[\"__shady_\"+a]},set:function(b){this.node[\"__shady_\"+a]=b},configurable:!0})}qe.forEach(function(a){return bg(a)});re.forEach(function(a){return bg(a)});var cg=new WeakMap;function dg(a){if(O(a)||a instanceof ag)return a;var b=cg.get(a);b||(b=new ag(a),cg.set(a,b));return b};if(M.Ba){var eg=M.D?function(a){return a}:function(a){Nd(a);Md(a);return a},ShadyDOM={inUse:M.Ba,patch:eg,isShadyRoot:O,enqueue:hd,flush:id,flushInitial:function(a){!a.Ia&&a.Y&&Ue(a)},settings:M,filterMutations:nd,observeChildren:ld,unobserveChildren:md,deferConnectionCallbacks:M.deferConnectionCallbacks,preferPerformance:M.preferPerformance,handlesDynamicScoping:!0,wrap:M.J?dg:eg,wrapIfNeeded:!0===M.J?dg:function(a){return a},Wrapper:ag,composedPath:Wd,noPatch:M.J,patchOnDemand:M.Da,nativeMethods:wd,\nnativeTree:xd,patchElementProto:Kf,querySelectorImplementation:M.querySelectorImplementation};window.ShadyDOM=ShadyDOM;Gd();Jf(\"__shady_\");Object.defineProperty(document,\"_activeElement\",Bf.activeElement);P(Window.prototype,Ef,\"__shady_\");M.J?M.Da&&P(Element.prototype,sf):(Jf(),pe());ke();window.Event=me;window.CustomEvent=ne;window.MouseEvent=oe;window.ShadowRoot=qf};var fg=window.Document.prototype.createElement,gg=window.Document.prototype.createElementNS,hg=window.Document.prototype.importNode,ig=window.Document.prototype.prepend,jg=window.Document.prototype.append,kg=window.DocumentFragment.prototype.prepend,lg=window.DocumentFragment.prototype.append,mg=window.Node.prototype.cloneNode,ng=window.Node.prototype.appendChild,og=window.Node.prototype.insertBefore,pg=window.Node.prototype.removeChild,qg=window.Node.prototype.replaceChild,rg=Object.getOwnPropertyDescriptor(window.Node.prototype,\n\"textContent\"),sg=window.Element.prototype.attachShadow,tg=Object.getOwnPropertyDescriptor(window.Element.prototype,\"innerHTML\"),ug=window.Element.prototype.getAttribute,vg=window.Element.prototype.setAttribute,wg=window.Element.prototype.removeAttribute,xg=window.Element.prototype.toggleAttribute,yg=window.Element.prototype.getAttributeNS,zg=window.Element.prototype.setAttributeNS,Ag=window.Element.prototype.removeAttributeNS,Bg=window.Element.prototype.insertAdjacentElement,Cg=window.Element.prototype.insertAdjacentHTML,\nDg=window.Element.prototype.prepend,Eg=window.Element.prototype.append,Fg=window.Element.prototype.before,Gg=window.Element.prototype.after,Hg=window.Element.prototype.replaceWith,Ig=window.Element.prototype.remove,Jg=window.HTMLElement,Kg=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,\"innerHTML\"),Lg=window.HTMLElement.prototype.insertAdjacentElement,Mg=window.HTMLElement.prototype.insertAdjacentHTML;var Ng=new Set;\"annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph\".split(\" \").forEach(function(a){return Ng.add(a)});function Og(a){var b=Ng.has(a);a=/^[a-z][.0-9_a-z]*-[-.0-9_a-z]*$/.test(a);return!b&&a}var Pg=document.contains?document.contains.bind(document):document.documentElement.contains.bind(document.documentElement);\nfunction T(a){var b=a.isConnected;if(void 0!==b)return b;if(Pg(a))return!0;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}function Qg(a){var b=a.children;if(b)return Array.prototype.slice.call(b);b=[];for(a=a.firstChild;a;a=a.nextSibling)a.nodeType===Node.ELEMENT_NODE&&b.push(a);return b}\nfunction Rg(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}\nfunction Sg(a,b,c){for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if(\"link\"===f&&\"import\"===e.getAttribute(\"rel\")){d=e.import;void 0===c&&(c=new Set);if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)Sg(d,b,c);d=Rg(a,e);continue}else if(\"template\"===f){d=Rg(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)Sg(e,b,c)}d=d.firstChild?d.firstChild:Rg(a,d)}};function Tg(){var a=!(null===Ug||void 0===Ug||!Ug.noDocumentConstructionObserver),b=!(null===Ug||void 0===Ug||!Ug.shadyDomFastWalk);this.ca=[];this.g=[];this.W=!1;this.shadyDomFastWalk=b;this.sb=!a}function Vg(a,b,c,d){var e=window.ShadyDOM;if(a.shadyDomFastWalk&&e&&e.inUse){if(b.nodeType===Node.ELEMENT_NODE&&c(b),b.querySelectorAll)for(a=e.nativeMethods.querySelectorAll.call(b,\"*\"),b=0;b<a.length;b++)c(a[b])}else Sg(b,c,d)}function Wg(a,b){a.W=!0;a.ca.push(b)}\nfunction Xg(a,b){a.W=!0;a.g.push(b)}function Yg(a,b){a.W&&Vg(a,b,function(c){return Zg(a,c)})}function Zg(a,b){if(a.W&&!b.__CE_patched){b.__CE_patched=!0;for(var c=0;c<a.ca.length;c++)a.ca[c](b);for(c=0;c<a.g.length;c++)a.g[c](b)}}function $g(a,b){var c=[];Vg(a,b,function(e){return c.push(e)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):ah(a,d)}}\nfunction bh(a,b){var c=[];Vg(a,b,function(e){return c.push(e)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}\nfunction ch(a,b,c){c=void 0===c?{}:c;var d=c.tb,e=c.upgrade||function(g){return ah(a,g)},f=[];Vg(a,b,function(g){a.W&&Zg(a,g);if(\"link\"===g.localName&&\"import\"===g.getAttribute(\"rel\")){var h=g.import;h instanceof Node&&(h.__CE_isImportDocument=!0,h.__CE_registry=document.__CE_registry);h&&\"complete\"===h.readyState?h.__CE_documentLoadHandled=!0:g.addEventListener(\"load\",function(){var k=g.import;if(!k.__CE_documentLoadHandled){k.__CE_documentLoadHandled=!0;var l=new Set;d&&(d.forEach(function(m){return l.add(m)}),\nl.delete(k));ch(a,k,{tb:l,upgrade:e})}})}else f.push(g)},d);for(b=0;b<f.length;b++)e(f[b])}\nfunction ah(a,b){try{var c=b.ownerDocument,d=c.__CE_registry;var e=d&&(c.defaultView||c.__CE_isImportDocument)?dh(d,b.localName):void 0;if(e&&void 0===b.__CE_state){e.constructionStack.push(b);try{try{if(new e.constructorFunction!==b)throw Error(\"The custom element constructor did not produce the element being upgraded.\");}finally{e.constructionStack.pop()}}catch(k){throw b.__CE_state=2,k;}b.__CE_state=1;b.__CE_definition=e;if(e.attributeChangedCallback&&b.hasAttributes()){var f=e.observedAttributes;\nfor(e=0;e<f.length;e++){var g=f[e],h=b.getAttribute(g);null!==h&&a.attributeChangedCallback(b,g,null,h,null)}}T(b)&&a.connectedCallback(b)}}catch(k){eh(k)}}Tg.prototype.connectedCallback=function(a){var b=a.__CE_definition;if(b.connectedCallback)try{b.connectedCallback.call(a)}catch(c){eh(c)}};Tg.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;if(b.disconnectedCallback)try{b.disconnectedCallback.call(a)}catch(c){eh(c)}};\nTg.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;if(f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b))try{f.attributeChangedCallback.call(a,b,c,d,e)}catch(g){eh(g)}};\nfunction fh(a,b,c,d){var e=b.__CE_registry;if(e&&(null===d||\"http://www.w3.org/1999/xhtml\"===d)&&(e=dh(e,c)))try{var f=new e.constructorFunction;if(void 0===f.__CE_state||void 0===f.__CE_definition)throw Error(\"Failed to construct '\"+c+\"': The returned value was not constructed with the HTMLElement constructor.\");if(\"http://www.w3.org/1999/xhtml\"!==f.namespaceURI)throw Error(\"Failed to construct '\"+c+\"': The constructed element's namespace must be the HTML namespace.\");if(f.hasAttributes())throw Error(\"Failed to construct '\"+\nc+\"': The constructed element must not have any attributes.\");if(null!==f.firstChild)throw Error(\"Failed to construct '\"+c+\"': The constructed element must not have any children.\");if(null!==f.parentNode)throw Error(\"Failed to construct '\"+c+\"': The constructed element must not have a parent node.\");if(f.ownerDocument!==b)throw Error(\"Failed to construct '\"+c+\"': The constructed element's owner document is incorrect.\");if(f.localName!==c)throw Error(\"Failed to construct '\"+c+\"': The constructed element's local name is incorrect.\");\nreturn f}catch(g){return eh(g),b=null===d?fg.call(b,c):gg.call(b,d,c),Object.setPrototypeOf(b,HTMLUnknownElement.prototype),b.__CE_state=2,b.__CE_definition=void 0,Zg(a,b),b}b=null===d?fg.call(b,c):gg.call(b,d,c);Zg(a,b);return b}\nfunction eh(a){var b=\"\",c=\"\",d=0,e=0;a instanceof Error?(b=a.message,c=a.sourceURL||a.fileName||\"\",d=a.line||a.lineNumber||0,e=a.column||a.columnNumber||0):b=\"Uncaught \"+String(a);var f=void 0;void 0===ErrorEvent.prototype.initErrorEvent?f=new ErrorEvent(\"error\",{cancelable:!0,message:b,filename:c,lineno:d,colno:e,error:a}):(f=document.createEvent(\"ErrorEvent\"),f.initErrorEvent(\"error\",!1,!0,b,c,d),f.preventDefault=function(){Object.defineProperty(this,\"defaultPrevented\",{configurable:!0,get:function(){return!0}})});\nvoid 0===f.error&&Object.defineProperty(f,\"error\",{configurable:!0,enumerable:!0,get:function(){return a}});window.dispatchEvent(f);f.defaultPrevented||console.error(a)};function gh(){var a=this;this.I=void 0;this.Ka=new Promise(function(b){a.g=b})}gh.prototype.resolve=function(a){if(this.I)throw Error(\"Already resolved.\");this.I=a;this.g(a)};function hh(a){var b=document;this.X=void 0;this.S=a;this.g=b;ch(this.S,this.g);\"loading\"===this.g.readyState&&(this.X=new MutationObserver(this.h.bind(this)),this.X.observe(this.g,{childList:!0,subtree:!0}))}function ih(a){a.X&&a.X.disconnect()}hh.prototype.h=function(a){var b=this.g.readyState;\"interactive\"!==b&&\"complete\"!==b||ih(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)ch(this.S,c[d])};function U(a){this.ma=new Map;this.na=new Map;this.Fa=new Map;this.wa=!1;this.za=new Map;this.la=function(b){return b()};this.V=!1;this.oa=[];this.S=a;this.Ga=a.sb?new hh(a):void 0}v=U.prototype;v.jb=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError(\"Custom element constructor getters must be functions.\");jh(this,a);this.ma.set(a,b);this.oa.push(a);this.V||(this.V=!0,this.la(function(){return kh(c)}))};\nv.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError(\"Custom element constructors must be functions.\");jh(this,a);lh(this,a,b);this.oa.push(a);this.V||(this.V=!0,this.la(function(){return kh(c)}))};function jh(a,b){if(!Og(b))throw new SyntaxError(\"The element name '\"+b+\"' is not valid.\");if(dh(a,b))throw Error(\"A custom element with name '\"+(b+\"' has already been defined.\"));if(a.wa)throw Error(\"A custom element is already being defined.\");}\nfunction lh(a,b,c){a.wa=!0;var d;try{var e=c.prototype;if(!(e instanceof Object))throw new TypeError(\"The custom element constructor's prototype is not an object.\");var f=function(m){var q=e[m];if(void 0!==q&&!(q instanceof Function))throw Error(\"The '\"+m+\"' callback must be a function.\");return q};var g=f(\"connectedCallback\");var h=f(\"disconnectedCallback\");var k=f(\"adoptedCallback\");var l=(d=f(\"attributeChangedCallback\"))&&c.observedAttributes||[]}catch(m){throw m;}finally{a.wa=!1}c={localName:b,\nconstructorFunction:c,connectedCallback:g,disconnectedCallback:h,adoptedCallback:k,attributeChangedCallback:d,observedAttributes:l,constructionStack:[]};a.na.set(b,c);a.Fa.set(c.constructorFunction,c);return c}v.upgrade=function(a){ch(this.S,a)};\nfunction kh(a){if(!1!==a.V){a.V=!1;for(var b=[],c=a.oa,d=new Map,e=0;e<c.length;e++)d.set(c[e],[]);ch(a.S,document,{upgrade:function(k){if(void 0===k.__CE_state){var l=k.localName,m=d.get(l);m?m.push(k):a.na.has(l)&&b.push(k)}}});for(e=0;e<b.length;e++)ah(a.S,b[e]);for(e=0;e<c.length;e++){for(var f=c[e],g=d.get(f),h=0;h<g.length;h++)ah(a.S,g[h]);(f=a.za.get(f))&&f.resolve(void 0)}c.length=0}}v.get=function(a){if(a=dh(this,a))return a.constructorFunction};\nv.whenDefined=function(a){if(!Og(a))return Promise.reject(new SyntaxError(\"'\"+a+\"' is not a valid custom element name.\"));var b=this.za.get(a);if(b)return b.Ka;b=new gh;this.za.set(a,b);var c=this.na.has(a)||this.ma.has(a);a=-1===this.oa.indexOf(a);c&&a&&b.resolve(void 0);return b.Ka};v.polyfillWrapFlushCallback=function(a){this.Ga&&ih(this.Ga);var b=this.la;this.la=function(c){return a(function(){return b(c)})}};\nfunction dh(a,b){var c=a.na.get(b);if(c)return c;if(c=a.ma.get(b)){a.ma.delete(b);try{return lh(a,b,c())}catch(d){eh(d)}}}U.prototype.define=U.prototype.define;U.prototype.upgrade=U.prototype.upgrade;U.prototype.get=U.prototype.get;U.prototype.whenDefined=U.prototype.whenDefined;U.prototype.polyfillDefineLazy=U.prototype.jb;U.prototype.polyfillWrapFlushCallback=U.prototype.polyfillWrapFlushCallback;function mh(a,b,c){function d(e){return function(f){for(var g=[],h=0;h<arguments.length;++h)g[h]=arguments[h];h=[];for(var k=[],l=0;l<g.length;l++){var m=g[l];m instanceof Element&&T(m)&&k.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)h.push(m);else h.push(m)}e.apply(this,g);for(g=0;g<k.length;g++)bh(a,k[g]);if(T(this))for(g=0;g<h.length;g++)k=h[g],k instanceof Element&&$g(a,k)}}void 0!==c.prepend&&(b.prepend=d(c.prepend));void 0!==c.append&&(b.append=d(c.append))}\n;function nh(a){Document.prototype.createElement=function(b){return fh(a,this,b,null)};Document.prototype.importNode=function(b,c){b=hg.call(this,b,!!c);this.__CE_registry?ch(a,b):Yg(a,b);return b};Document.prototype.createElementNS=function(b,c){return fh(a,this,c,b)};mh(a,Document.prototype,{prepend:ig,append:jg})};function oh(a){function b(d){return function(e){for(var f=[],g=0;g<arguments.length;++g)f[g]=arguments[g];g=[];for(var h=[],k=0;k<f.length;k++){var l=f[k];l instanceof Element&&T(l)&&h.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)g.push(l);else g.push(l)}d.apply(this,f);for(f=0;f<h.length;f++)bh(a,h[f]);if(T(this))for(f=0;f<g.length;f++)h=g[f],h instanceof Element&&$g(a,h)}}var c=Element.prototype;void 0!==Fg&&(c.before=b(Fg));void 0!==Gg&&(c.after=b(Gg));void 0!==\nHg&&(c.replaceWith=function(d){for(var e=[],f=0;f<arguments.length;++f)e[f]=arguments[f];f=[];for(var g=[],h=0;h<e.length;h++){var k=e[h];k instanceof Element&&T(k)&&g.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)f.push(k);else f.push(k)}h=T(this);Hg.apply(this,e);for(e=0;e<g.length;e++)bh(a,g[e]);if(h)for(bh(a,this),e=0;e<f.length;e++)g=f[e],g instanceof Element&&$g(a,g)});void 0!==Ig&&(c.remove=function(){var d=T(this);Ig.call(this);d&&bh(a,this)})};function ph(a){function b(e,f){Object.defineProperty(e,\"innerHTML\",{enumerable:f.enumerable,configurable:!0,get:f.get,set:function(g){var h=this,k=void 0;T(this)&&(k=[],Vg(a,this,function(q){q!==h&&k.push(q)}));f.set.call(this,g);if(k)for(var l=0;l<k.length;l++){var m=k[l];1===m.__CE_state&&a.disconnectedCallback(m)}this.ownerDocument.__CE_registry?ch(a,this):Yg(a,this);return g}})}function c(e,f){e.insertAdjacentElement=function(g,h){var k=T(h);g=f.call(this,g,h);k&&bh(a,h);T(g)&&$g(a,h);return g}}\nfunction d(e,f){function g(h,k){for(var l=[];h!==k;h=h.nextSibling)l.push(h);for(k=0;k<l.length;k++)ch(a,l[k])}e.insertAdjacentHTML=function(h,k){h=h.toLowerCase();if(\"beforebegin\"===h){var l=this.previousSibling;f.call(this,h,k);g(l||this.parentNode.firstChild,this)}else if(\"afterbegin\"===h)l=this.firstChild,f.call(this,h,k),g(this.firstChild,l);else if(\"beforeend\"===h)l=this.lastChild,f.call(this,h,k),g(l||this.firstChild,null);else if(\"afterend\"===h)l=this.nextSibling,f.call(this,h,k),g(this.nextSibling,\nl);else throw new SyntaxError(\"The value provided (\"+String(h)+\") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.\");}}sg&&(Element.prototype.attachShadow=function(e){e=sg.call(this,e);if(a.W&&!e.__CE_patched){e.__CE_patched=!0;for(var f=0;f<a.ca.length;f++)a.ca[f](e)}return this.__CE_shadowRoot=e});tg&&tg.get?b(Element.prototype,tg):Kg&&Kg.get?b(HTMLElement.prototype,Kg):Xg(a,function(e){b(e,{enumerable:!0,configurable:!0,get:function(){return mg.call(this,!0).innerHTML},set:function(f){var g=\n\"template\"===this.localName,h=g?this.content:this,k=gg.call(document,this.namespaceURI,this.localName);for(k.innerHTML=f;0<h.childNodes.length;)pg.call(h,h.childNodes[0]);for(f=g?k.content:k;0<f.childNodes.length;)ng.call(h,f.childNodes[0])}})});Element.prototype.setAttribute=function(e,f){if(1!==this.__CE_state)return vg.call(this,e,f);var g=ug.call(this,e);vg.call(this,e,f);f=ug.call(this,e);a.attributeChangedCallback(this,e,g,f,null)};Element.prototype.setAttributeNS=function(e,f,g){if(1!==this.__CE_state)return zg.call(this,\ne,f,g);var h=yg.call(this,e,f);zg.call(this,e,f,g);g=yg.call(this,e,f);a.attributeChangedCallback(this,f,h,g,e)};Element.prototype.removeAttribute=function(e){if(1!==this.__CE_state)return wg.call(this,e);var f=ug.call(this,e);wg.call(this,e);null!==f&&a.attributeChangedCallback(this,e,f,null,null)};xg&&(Element.prototype.toggleAttribute=function(e,f){if(1!==this.__CE_state)return xg.call(this,e,f);var g=ug.call(this,e),h=null!==g;f=xg.call(this,e,f);h!==f&&a.attributeChangedCallback(this,e,g,f?\"\":\nnull,null);return f});Element.prototype.removeAttributeNS=function(e,f){if(1!==this.__CE_state)return Ag.call(this,e,f);var g=yg.call(this,e,f);Ag.call(this,e,f);var h=yg.call(this,e,f);g!==h&&a.attributeChangedCallback(this,f,g,h,e)};Lg?c(HTMLElement.prototype,Lg):Bg&&c(Element.prototype,Bg);Mg?d(HTMLElement.prototype,Mg):Cg&&d(Element.prototype,Cg);mh(a,Element.prototype,{prepend:Dg,append:Eg});oh(a)};var qh={};function rh(a){function b(){var c=this.constructor;var d=document.__CE_registry.Fa.get(c);if(!d)throw Error(\"Failed to construct a custom element: The constructor was not registered with `customElements`.\");var e=d.constructionStack;if(0===e.length)return e=fg.call(document,d.localName),Object.setPrototypeOf(e,c.prototype),e.__CE_state=1,e.__CE_definition=d,Zg(a,e),e;var f=e.length-1,g=e[f];if(g===qh)throw Error(\"Failed to construct '\"+d.localName+\"': This element was already constructed.\");e[f]=\nqh;Object.setPrototypeOf(g,c.prototype);Zg(a,g);return g}b.prototype=Jg.prototype;Object.defineProperty(HTMLElement.prototype,\"constructor\",{writable:!0,configurable:!0,enumerable:!1,value:b});window.HTMLElement=b};function sh(a){function b(c,d){Object.defineProperty(c,\"textContent\",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(e){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,e);else{var f=void 0;if(this.firstChild){var g=this.childNodes,h=g.length;if(0<h&&T(this)){f=Array(h);for(var k=0;k<h;k++)f[k]=g[k]}}d.set.call(this,e);if(f)for(e=0;e<f.length;e++)bh(a,f[e])}}})}Node.prototype.insertBefore=function(c,d){if(c instanceof DocumentFragment){var e=Qg(c);c=og.call(this,c,d);if(T(this))for(d=\n0;d<e.length;d++)$g(a,e[d]);return c}e=c instanceof Element&&T(c);d=og.call(this,c,d);e&&bh(a,c);T(this)&&$g(a,c);return d};Node.prototype.appendChild=function(c){if(c instanceof DocumentFragment){var d=Qg(c);c=ng.call(this,c);if(T(this))for(var e=0;e<d.length;e++)$g(a,d[e]);return c}d=c instanceof Element&&T(c);e=ng.call(this,c);d&&bh(a,c);T(this)&&$g(a,c);return e};Node.prototype.cloneNode=function(c){c=mg.call(this,!!c);this.ownerDocument.__CE_registry?ch(a,c):Yg(a,c);return c};Node.prototype.removeChild=\nfunction(c){var d=c instanceof Element&&T(c),e=pg.call(this,c);d&&bh(a,c);return e};Node.prototype.replaceChild=function(c,d){if(c instanceof DocumentFragment){var e=Qg(c);c=qg.call(this,c,d);if(T(this))for(bh(a,d),d=0;d<e.length;d++)$g(a,e[d]);return c}e=c instanceof Element&&T(c);var f=qg.call(this,c,d),g=T(this);g&&bh(a,d);e&&bh(a,c);g&&$g(a,c);return f};rg&&rg.get?b(Node.prototype,rg):Wg(a,function(c){b(c,{enumerable:!0,configurable:!0,get:function(){for(var d=[],e=this.firstChild;e;e=e.nextSibling)e.nodeType!==\nNode.COMMENT_NODE&&d.push(e.textContent);return d.join(\"\")},set:function(d){for(;this.firstChild;)pg.call(this,this.firstChild);null!=d&&\"\"!==d&&ng.call(this,document.createTextNode(d))}})})};var Ug=window.customElements;function th(){var a=new Tg;rh(a);nh(a);mh(a,DocumentFragment.prototype,{prepend:kg,append:lg});sh(a);ph(a);window.CustomElementRegistry=U;a=new U(a);document.__CE_registry=a;Object.defineProperty(window,\"customElements\",{configurable:!0,enumerable:!0,value:a})}Ug&&!Ug.forcePolyfill&&\"function\"==typeof Ug.define&&\"function\"==typeof Ug.get||th();window.__CE_installPolyfill=th;/*\n\nCopyright (c) 2017 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nfunction uh(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText=\"\";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=\"\"}\nfunction vh(a){var b=a=a.replace(wh,\"\").replace(xh,\"\"),c=new uh;c.start=0;c.end=b.length;for(var d=c,e=0,f=b.length;e<f;e++)if(\"{\"===b[e]){d.rules||(d.rules=[]);var g=d,h=g.rules[g.rules.length-1]||null;d=new uh;d.start=e+1;d.parent=g;d.previous=h;g.rules.push(d)}else\"}\"===b[e]&&(d.end=e+1,d=d.parent||c);return yh(c,a)}\nfunction yh(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=zh(c),c=c.replace(Ah,\" \"),c=c.substring(c.lastIndexOf(\";\")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf(\"@\"),a.atRule?0===c.indexOf(\"@media\")?a.type=Bh:c.match(Ch)&&(a.type=Dh,a.keyframesName=a.selector.split(Ah).pop()):a.type=0===c.indexOf(\"--\")?Eh:Fh);if(c=a.rules)for(var d=0,e=c.length,f=void 0;d<e&&(f=c[d]);d++)yh(f,\nb);return a}function zh(a){return a.replace(/\\\\([0-9a-f]{1,6})\\s/gi,function(b,c){b=c;for(c=6-b.length;c--;)b=\"0\"+b;return\"\\\\\"+b})}\nfunction Gh(a,b,c){c=void 0===c?\"\":c;var d=\"\";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf(\"--\"));if(f){f=0;for(var g=e.length,h=void 0;f<g&&(h=e[f]);f++)d=Gh(h,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(Hh,\"\").replace(Ih,\"\"),b=b.replace(Jh,\"\").replace(Kh,\"\")),(d=b.trim())&&(d=\" \"+d+\"\\n\")}d&&(a.selector&&(c+=a.selector+\" {\\n\"),c+=d,a.selector&&(c+=\"}\\n\\n\"));return c}\nvar Fh=1,Dh=7,Bh=4,Eh=1E3,wh=/\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,xh=/@import[^;]*;/gim,Hh=/(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\\n]|$)/gim,Ih=/(?:^[^;\\-\\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\\n]|$)?/gim,Jh=/@apply\\s*\\(?[^);]*\\)?\\s*(?:[;\\n]|$)?/gim,Kh=/[^;:]*?:[^;]*?var\\([^;]*\\)(?:[;\\n]|$)?/gim,Ch=/^@[^\\s]*keyframes/,Ah=/\\s+/g;var V=!(window.ShadyDOM&&window.ShadyDOM.inUse),Lh;function Mh(a){Lh=a&&a.shimcssproperties?!1:V||!(navigator.userAgent.match(/AppleWebKit\\/601|Edge\\/15/)||!window.CSS||!CSS.supports||!CSS.supports(\"box-shadow\",\"0 0 0 var(--foo)\"))}var Nh;window.ShadyCSS&&void 0!==window.ShadyCSS.cssBuild&&(Nh=window.ShadyCSS.cssBuild);var Oh=!(!window.ShadyCSS||!window.ShadyCSS.disableRuntime);\nwindow.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?Lh=window.ShadyCSS.nativeCss:window.ShadyCSS?(Mh(window.ShadyCSS),window.ShadyCSS=void 0):Mh(window.WebComponents&&window.WebComponents.flags);var W=Lh;var Ph=/(?:^|[;\\s{]\\s*)(--[\\w-]*?)\\s*:\\s*(?:((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};{])+)|\\{([^}]*)\\}(?:(?=[;\\s}])|$))/gi,Qh=/(?:^|\\W+)@apply\\s*\\(?([^);\\n]*)\\)?/gi,Rh=/(--[\\w-]+)\\s*([:,;)]|$)/gi,Sh=/(animation\\s*:)|(animation-name\\s*:)/,Th=/@media\\s(.*)/,Uh=/\\{[^}]*\\}/g;var Vh=new Set;function Wh(a,b){if(!a)return\"\";\"string\"===typeof a&&(a=vh(a));b&&Xh(a,b);return Gh(a,W)}function Yh(a){!a.__cssRules&&a.textContent&&(a.__cssRules=vh(a.textContent));return a.__cssRules||null}function $h(a){return!!a.parent&&a.parent.type===Dh}function Xh(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Bh){var g=a.selector.match(Th);g&&(window.matchMedia(g[1]).matches||(e=!0))}f===Fh?b(a):c&&f===Dh?c(a):f===Eh&&(e=!0);if((a=a.rules)&&!e)for(e=0,f=a.length,g=void 0;e<f&&(g=a[e]);e++)Xh(g,b,c,d)}}\nfunction ai(a,b,c,d){var e=document.createElement(\"style\");b&&e.setAttribute(\"scope\",b);e.textContent=a;bi(e,c,d);return e}var ci=null;function di(a){a=document.createComment(\" Shady DOM styles for \"+a+\" \");var b=document.head;b.insertBefore(a,(ci?ci.nextSibling:null)||b.firstChild);return ci=a}function bi(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);ci?a.compareDocumentPosition(ci)===Node.DOCUMENT_POSITION_PRECEDING&&(ci=a):ci=a}\nfunction ei(a,b){for(var c=0,d=a.length;b<d;b++)if(\"(\"===a[b])c++;else if(\")\"===a[b]&&0===--c)return b;return-1}function fi(a,b){var c=a.indexOf(\"var(\");if(-1===c)return b(a,\"\",\"\",\"\");var d=ei(a,c+3),e=a.substring(c+4,d);c=a.substring(0,c);a=fi(a.substring(d+1),b);d=e.indexOf(\",\");return-1===d?b(c,e.trim(),\"\",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}function gi(a,b){V?a.setAttribute(\"class\",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,\"class\",b)}\nvar hi=window.ShadyDOM&&window.ShadyDOM.wrap||function(a){return a};function ii(a){var b=a.localName,c=\"\";b?-1<b.indexOf(\"-\")||(c=b,b=a.getAttribute&&a.getAttribute(\"is\")||\"\"):(b=a.is,c=a.extends);return{is:b,ja:c}}function ji(a){for(var b=[],c=\"\",d=0;0<=d&&d<a.length;d++)if(\"(\"===a[d]){var e=ei(a,d);c+=a.slice(d,e+1);d=e}else\",\"===a[d]?(b.push(c),c=\"\"):c+=a[d];c&&b.push(c);return b}\nfunction ki(a){if(void 0!==Nh)return Nh;if(void 0===a.__cssBuild){var b=a.getAttribute(\"css-build\");if(b)a.__cssBuild=b;else{a:{b=\"template\"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(\":\"),\"css-build\"===b[0])){b=b[1];break a}b=\"\"}if(\"\"!==b){var c=\"template\"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.__cssBuild=b}}return a.__cssBuild||\"\"}\nfunction li(a){a=void 0===a?\"\":a;return\"\"!==a&&W?V?\"shadow\"===a:\"shady\"===a:!1};function mi(){}function ni(a,b){oi(pi,a,function(c){qi(c,b||\"\")})}function oi(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);var d;\"template\"===b.localName?d=(b.content||b._content||b).childNodes:d=b.children||b.childNodes;if(d)for(b=0;b<d.length;b++)oi(a,d[b],c)}\nfunction qi(a,b,c){if(b)if(a.classList)c?(a.classList.remove(\"style-scope\"),a.classList.remove(b)):(a.classList.add(\"style-scope\"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(\"class\");c?d&&(b=d.replace(\"style-scope\",\"\").replace(b,\"\"),gi(a,b)):gi(a,(d?d+\" \":\"\")+\"style-scope \"+b)}}function ri(a,b,c){oi(pi,a,function(d){qi(d,b,!0);qi(d,c)})}function si(a,b){oi(pi,a,function(c){qi(c,b||\"\",!0)})}\nfunction ti(a,b,c,d,e){var f=pi;e=void 0===e?\"\":e;\"\"===e&&(V||\"shady\"===(void 0===d?\"\":d)?e=Wh(b,c):(a=ii(a),e=ui(f,b,a.is,a.ja,c)+\"\\n\\n\"));return e.trim()}function ui(a,b,c,d,e){var f=vi(c,d);c=c?\".\"+c:\"\";return Wh(b,function(g){g.i||(g.selector=g.G=wi(a,g,a.h,c,f),g.i=!0);e&&e(g,c,f)})}function vi(a,b){return b?\"[is=\"+a+\"]\":a}\nfunction wi(a,b,c,d,e){var f=ji(b.selector);if(!$h(b)){b=0;for(var g=f.length,h=void 0;b<g&&(h=f[b]);b++)f[b]=c.call(a,h,d,e)}return f.filter(function(k){return!!k}).join(\",\")}function xi(a){return a.replace(yi,function(b,c,d){-1<d.indexOf(\"+\")?d=d.replace(/\\+/g,\"___\"):-1<d.indexOf(\"___\")&&(d=d.replace(/___/g,\"+\"));return\":\"+c+\"(\"+d+\")\"})}\nfunction zi(a){for(var b=[],c;c=a.match(Ai);){var d=c.index,e=ei(a,d);if(-1===e)throw Error(c.input+\" selector missing ')'\");c=a.slice(d,e+1);a=a.replace(c,\"\\ue000\");b.push(c)}return{Ea:a,matches:b}}function Bi(a,b){var c=a.split(\"\\ue000\");return b.reduce(function(d,e,f){return d+e+c[f+1]},c[0])}\nmi.prototype.h=function(a,b,c){var d=!1;a=a.trim();var e=yi.test(a);e&&(a=a.replace(yi,function(h,k,l){return\":\"+k+\"(\"+l.replace(/\\s/g,\"\")+\")\"}),a=xi(a));var f=Ai.test(a);if(f){var g=zi(a);a=g.Ea;g=g.matches}a=a.replace(Ci,\":host $1\");a=a.replace(Di,function(h,k,l){d||(h=Ei(l,k,b,c),d=d||h.stop,k=h.Ya,l=h.value);return k+l});f&&(a=Bi(a,g));e&&(a=xi(a));return a=a.replace(Fi,function(h,k,l,m){return'[dir=\"'+l+'\"] '+k+m+\", \"+k+'[dir=\"'+l+'\"]'+m})};\nfunction Ei(a,b,c,d){var e=a.indexOf(\"::slotted\");0<=a.indexOf(\":host\")?a=Gi(a,d):0!==e&&(a=c?Hi(a,c):a);c=!1;0<=e&&(b=\"\",c=!0);if(c){var f=!0;c&&(a=a.replace(Ii,function(g,h){return\" > \"+h}))}return{value:a,Ya:b,stop:f}}function Hi(a,b){a=a.split(/(\\[.+?\\])/);for(var c=[],d=0;d<a.length;d++)if(1===d%2)c.push(a[d]);else{var e=a[d];if(\"\"!==e||d!==a.length-1)e=e.split(\":\"),e[0]+=b,c.push(e.join(\":\"))}return c.join(\"\")}\nfunction Gi(a,b){var c=a.match(Ji);return(c=c&&c[2].trim()||\"\")?c[0].match(Ki)?a.replace(Ji,function(d,e,f){return b+f}):c.split(Ki)[0]===b?c:\"should_not_match\":a.replace(\":host\",b)}function Li(a){\":root\"===a.selector&&(a.selector=\"html\")}mi.prototype.i=function(a){return a.match(\":host\")?\"\":a.match(\"::slotted\")?this.h(a,\":not(.style-scope)\"):Hi(a.trim(),\":not(.style-scope)\")};ea.Object.defineProperties(mi.prototype,{g:{configurable:!0,enumerable:!0,get:function(){return\"style-scope\"}}});\nvar yi=/:(nth[-\\w]+)\\(([^)]+)\\)/,Di=/(^|[\\s>+~]+)((?:\\[.+?\\]|[^\\s>+~=[])+)/g,Ki=/[[.:#*]/,Ci=/^(::slotted)/,Ji=/(:host)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/,Ii=/(?:::slotted)(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))/,Fi=/(.*):dir\\((?:(ltr|rtl))\\)(.*)/,Ai=/:(?:matches|any|-(?:webkit|moz)-any)/,pi=new mi;function Mi(a,b,c,d,e){this.M=a||null;this.h=b||null;this.Ca=c||[];this.K=null;this.cssBuild=e||\"\";this.ja=d||\"\";this.g=this.L=this.R=null}function Ni(a){return a?a.__styleInfo:null}function Oi(a,b){return a.__styleInfo=b}Mi.prototype.i=function(){return this.M};Mi.prototype._getStyleRules=Mi.prototype.i;function Pi(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Qi=/:host\\s*>\\s*/,Ri=navigator.userAgent.match(\"Trident\");function Si(){}function Ti(a){var b={},c=[],d=0;Xh(a,function(f){Ui(f);f.index=d++;f=f.F.cssText;for(var g;g=Rh.exec(f);){var h=g[1];\":\"!==g[2]&&(b[h]=!0)}},function(f){c.push(f)});a.h=c;a=[];for(var e in b)a.push(e);return a}\nfunction Ui(a){if(!a.F){var b={},c={};Vi(a,c)&&(b.P=c,a.rules=null);b.cssText=a.parsedCssText.replace(Uh,\"\").replace(Ph,\"\");a.F=b}}function Vi(a,b){var c=a.F;if(c){if(c.P)return Object.assign(b,c.P),!0}else{c=a.parsedCssText;for(var d;a=Ph.exec(c);){d=(a[2]||a[3]).trim();if(\"inherit\"!==d||\"unset\"!==d)b[a[1].trim()]=d;d=!0}return d}}\nfunction Wi(a,b,c){b&&(b=0<=b.indexOf(\";\")?Xi(a,b,c):fi(b,function(d,e,f,g){if(!e)return d+g;(e=Wi(a,c[e],c))&&\"initial\"!==e?\"apply-shim-inherit\"===e&&(e=\"inherit\"):e=Wi(a,c[f]||f,c)||f;return d+(e||\"\")+g}));return b&&b.trim()||\"\"}\nfunction Xi(a,b,c){b=b.split(\";\");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){Qh.lastIndex=0;if(f=Qh.exec(e))e=Wi(a,c[f[1]],c);else if(f=e.indexOf(\":\"),-1!==f){var g=e.substring(f);g=g.trim();g=Wi(a,g,c)||g;e=e.substring(0,f)+g}b[d]=e&&e.lastIndexOf(\";\")===e.length-1?e.slice(0,-1):e||\"\"}return b.join(\";\")}\nfunction Yi(a,b){var c={},d=[];Xh(a,function(e){e.F||Ui(e);var f=e.G||e.parsedSelector;b&&e.F.P&&f&&Pi.call(b,f)&&(Vi(e,c),e=e.index,f=parseInt(e/32,10),d[f]=(d[f]||0)|1<<e%32)},null,!0);return{P:c,key:d}}\nfunction Zi(a,b,c,d){b.F||Ui(b);if(b.F.P){var e=ii(a);a=e.is;e=e.ja;e=a?vi(a,e):\"html\";var f=b.parsedSelector;var g=!!f.match(Qi)||\"html\"===e&&-1<f.indexOf(\"html\");var h=0===f.indexOf(\":host\")&&!g;\"shady\"===c&&(g=f===e+\" > *.\"+e||-1!==f.indexOf(\"html\"),h=!g&&0===f.indexOf(e));if(g||h)c=e,h&&(b.G||(b.G=wi(pi,b,pi.h,a?\".\"+a:\"\",e)),c=b.G||e),g&&\"html\"===e&&(c=b.G||b.O),d({Ea:c,gb:h,vb:g})}}\nfunction $i(a,b,c){var d={},e={};Xh(b,function(f){Zi(a,f,c,function(g){Pi.call(a._element||a,g.Ea)&&(g.gb?Vi(f,d):Vi(f,e))})},null,!0);return{mb:e,eb:d}}\nfunction aj(a,b,c,d){var e=ii(b),f=vi(e.is,e.ja),g=new RegExp(\"(?:^|[^.#[:])\"+(b.extends?\"\\\\\"+f.slice(0,-1)+\"\\\\]\":f)+\"($|[.:[\\\\s>+~])\"),h=Ni(b);e=h.M;h=h.cssBuild;var k=bj(e,d);return ti(b,e,function(l){var m=\"\";l.F||Ui(l);l.F.cssText&&(m=Xi(a,l.F.cssText,c));l.cssText=m;if(!V&&!$h(l)&&l.cssText){var q=m=l.cssText;null==l.Ma&&(l.Ma=Sh.test(m));if(l.Ma)if(null==l.ra){l.ra=[];for(var H in k)q=k[H],q=q(m),m!==q&&(m=q,l.ra.push(H))}else{for(H=0;H<l.ra.length;++H)q=k[l.ra[H]],m=q(m);q=m}l.cssText=q;l.G=\nl.G||l.selector;m=\".\"+d;H=ji(l.G);q=0;for(var C=H.length,t=void 0;q<C&&(t=H[q]);q++)H[q]=t.match(g)?t.replace(f,m):m+\" \"+t;l.selector=H.join(\",\")}},h)}function bj(a,b){a=a.h;var c={};if(!V&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,g=b;f.u=new RegExp(\"\\\\b\"+f.keyframesName+\"(?!\\\\B|-)\",\"g\");f.g=f.keyframesName+\"-\"+g;f.G=f.G||f.selector;f.selector=f.G.replace(f.keyframesName,f.g);c[e.keyframesName]=cj(e)}return c}function cj(a){return function(b){return b.replace(a.u,a.g)}}\nfunction dj(a,b){var c=ej,d=Yh(a);a.textContent=Wh(d,function(e){var f=e.cssText=e.parsedCssText;e.F&&e.F.cssText&&(f=f.replace(Hh,\"\").replace(Ih,\"\"),e.cssText=Xi(c,f,b))})}ea.Object.defineProperties(Si.prototype,{g:{configurable:!0,enumerable:!0,get:function(){return\"x-scope\"}}});var ej=new Si;var fj={},gj=window.customElements;if(gj&&!V&&!Oh){var hj=gj.define;gj.define=function(a,b,c){fj[a]||(fj[a]=di(a));hj.call(gj,a,b,c)}};function ij(){this.cache={}}ij.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({P:b,styleElement:c,L:d});100<e.length&&e.shift();this.cache[a]=e};function jj(){}var kj=new RegExp(pi.g+\"\\\\s*([^\\\\s]*)\");function lj(a){return(a=(a.classList&&a.classList.value?a.classList.value:a.getAttribute(\"class\")||\"\").match(kj))?a[1]:\"\"}function mj(a){var b=hi(a).getRootNode();return b===a||b===a.ownerDocument?\"\":(a=b.host)?ii(a).is:\"\"}\nfunction nj(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode(),g=lj(e);if(g&&f===e.ownerDocument&&(\"style\"!==e.localName&&\"template\"!==e.localName||\"\"===ki(e)))si(e,g);else if(f instanceof ShadowRoot)for(f=mj(e),f!==g&&ri(e,g,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,\":not(.\"+pi.g+\")\"),g=0;g<e.length;g++){f=e[g];\nvar h=mj(f);h&&qi(f,h)}}}}}\nif(!(V||window.ShadyDOM&&window.ShadyDOM.handlesDynamicScoping)){var oj=new MutationObserver(nj),pj=function(a){oj.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)pj(document);else{var qj=function(){pj(document.body)};window.HTMLImports?window.HTMLImports.whenReady(qj):requestAnimationFrame(function(){if(\"loading\"===document.readyState){var a=function(){qj();document.removeEventListener(\"readystatechange\",a)};document.addEventListener(\"readystatechange\",\na)}else qj()})}jj=function(){nj(oj.takeRecords())}};var rj={};var sj=Promise.resolve();function tj(a){if(a=rj[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function uj(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function vj(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a._validating||(a._validating=!0,sj.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a._validating=!1}))};var wj={},xj=new ij;function Y(){this.ea={};this.i=document.documentElement;var a=new uh;a.rules=[];this.u=Oi(this.i,new Mi(a));this.O=!1;this.g=this.h=null}v=Y.prototype;v.flush=function(){jj()};v.bb=function(a){return Yh(a)};v.qb=function(a){return Wh(a)};v.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};\nv.prepareTemplateStyles=function(a,b,c){if(!a._prepared&&!Oh){V||fj[b]||(fj[b]=di(b));a._prepared=!0;a.name=b;a.extends=c;rj[b]=a;var d=ki(a),e=li(d);c={is:b,extends:c};for(var f=[],g=a.content.querySelectorAll(\"style\"),h=0;h<g.length;h++){var k=g[h];if(k.hasAttribute(\"shady-unscoped\")){if(!V){var l=k.textContent;if(!Vh.has(l)){Vh.add(l);var m=document.createElement(\"style\");m.setAttribute(\"shady-unscoped\",\"\");m.textContent=l;document.head.appendChild(m)}k.parentNode.removeChild(k)}}else f.push(k.textContent),\nk.parentNode.removeChild(k)}f=f.join(\"\").trim()+(wj[b]||\"\");yj(this);if(!e){if(g=!d)g=Qh.test(f)||Ph.test(f),Qh.lastIndex=0,Ph.lastIndex=0;h=vh(f);g&&W&&this.h&&this.h.transformRules(h,b);a._styleAst=h}g=[];W||(g=Ti(a._styleAst));if(!g.length||W)h=V?a.content:null,b=fj[b]||null,d=ti(c,a._styleAst,null,d,e?f:\"\"),d=d.length?ai(d,c.is,h,b):null,a._style=d;a.g=g}};v.kb=function(a,b){wj[b]=a.join(\" \")};\nv.prepareTemplateDom=function(a,b){if(!Oh){var c=ki(a);V||\"shady\"===c||a._domPrepared||(a._domPrepared=!0,ni(a.content,b))}};function zj(a){var b=ii(a),c=b.is;b=b.ja;var d=fj[c]||null,e=rj[c];if(e){c=e._styleAst;var f=e.g;e=ki(e);b=new Mi(c,d,f,b,e);Oi(a,b);return b}}\nfunction Aj(a){!a.g&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.g=window.ShadyCSS.CustomStyleInterface,a.g.transformCallback=function(b){a.Qa(b)},a.g.validateCallback=function(){requestAnimationFrame(function(){(a.g.enqueued||a.O)&&a.flushCustomStyles()})})}function yj(a){if(!a.h&&window.ShadyCSS&&window.ShadyCSS.ApplyShim){a.h=window.ShadyCSS.ApplyShim;a.h.invalidCallback=tj;var b=!0}else b=!1;Aj(a);return b}\nv.flushCustomStyles=function(){if(!Oh){var a=yj(this);if(this.g){var b=this.g.processStyles();if((a||this.g.enqueued)&&!li(this.u.cssBuild)){if(W){if(!this.u.cssBuild)for(a=0;a<b.length;a++){var c=this.g.getStyleForCustomStyle(b[a]);if(c&&W&&this.h){var d=Yh(c);yj(this);this.h.transformRules(d);c.textContent=Wh(d)}}}else{Bj(this,b);Cj(this,this.i,this.u);for(a=0;a<b.length;a++)(c=this.g.getStyleForCustomStyle(b[a]))&&dj(c,this.u.R);this.O&&this.styleDocument()}this.g.enqueued=!1}}}};\nfunction Bj(a,b){b=b.map(function(c){return a.g.getStyleForCustomStyle(c)}).filter(function(c){return!!c});b.sort(function(c,d){c=d.compareDocumentPosition(c);return c&Node.DOCUMENT_POSITION_FOLLOWING?1:c&Node.DOCUMENT_POSITION_PRECEDING?-1:0});a.u.M.rules=b.map(function(c){return Yh(c)})}\nv.styleElement=function(a,b){if(Oh){if(b){Ni(a)||Oi(a,new Mi(null));var c=Ni(a);c.K=c.K||{};Object.assign(c.K,b);Dj(this,a,c)}}else if(c=Ni(a)||zj(a))if(a!==this.i&&(this.O=!0),b&&(c.K=c.K||{},Object.assign(c.K,b)),W)Dj(this,a,c);else if(this.flush(),Cj(this,a,c),c.Ca&&c.Ca.length){b=ii(a).is;var d;a:{if(d=xj.cache[b])for(var e=d.length-1;0<=e;e--){var f=d[e];b:{var g=c.Ca;for(var h=0;h<g.length;h++){var k=g[h];if(f.P[k]!==c.R[k]){g=!1;break b}}g=!0}if(g){d=f;break a}}d=void 0}g=d?d.styleElement:\nnull;e=c.L;(f=d&&d.L)||(f=this.ea[b]=(this.ea[b]||0)+1,f=b+\"-\"+f);c.L=f;f=c.L;h=ej;h=g?g.textContent||\"\":aj(h,a,c.R,f);k=Ni(a);var l=k.g;l&&!V&&l!==g&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));V?k.g?(k.g.textContent=h,g=k.g):h&&(g=ai(h,f,a.shadowRoot,k.h)):g?g.parentNode||(Ri&&-1<h.indexOf(\"@media\")&&(g.textContent=h),bi(g,null,k.h)):h&&(g=ai(h,f,null,k.h));g&&(g._useCount=g._useCount||0,k.g!=g&&g._useCount++,k.g=g);f=g;V||(g=c.L,k=h=a.getAttribute(\"class\")||\"\",e&&\n(k=h.replace(new RegExp(\"\\\\s*x-scope\\\\s*\"+e+\"\\\\s*\",\"g\"),\" \")),k+=(k?\" \":\"\")+\"x-scope \"+g,h!==k&&gi(a,k));d||xj.store(b,c.R,f,c.L)}};\nfunction Dj(a,b,c){var d=ii(b).is;if(c.K){var e=c.K,f;for(f in e)null===f?b.style.removeProperty(f):b.style.setProperty(f,e[f])}e=rj[d];if(!(!e&&b!==a.i||e&&\"\"!==ki(e))&&e&&e._style&&!uj(e)){if(uj(e)||e._applyShimValidatingVersion!==e._applyShimNextVersion)yj(a),a.h&&a.h.transformRules(e._styleAst,d),e._style.textContent=ti(b,c.M),vj(e);V&&(a=b.shadowRoot)&&(a=a.querySelector(\"style\"))&&(a.textContent=ti(b,c.M));c.M=e._styleAst}}\nfunction Ej(a,b){return(b=hi(b).getRootNode().host)?Ni(b)||zj(b)?b:Ej(a,b):a.i}function Cj(a,b,c){var d=Ej(a,b),e=Ni(d),f=e.R;d===a.i||f||(Cj(a,d,e),f=e.R);a=Object.create(f||null);d=$i(b,c.M,c.cssBuild);b=Yi(e.M,b).P;Object.assign(a,d.eb,b,d.mb);b=c.K;for(var g in b)if((e=b[g])||0===e)a[g]=e;g=ej;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Wi(g,a[d],a);c.R=a}v.styleDocument=function(a){this.styleSubtree(this.i,a)};\nv.styleSubtree=function(a,b){var c=hi(a),d=c.shadowRoot,e=a===this.i;(d||e)&&this.styleElement(a,b);if(a=e?c:d)for(a=Array.from(a.querySelectorAll(\"*\")).filter(function(f){return hi(f).shadowRoot}),b=0;b<a.length;b++)this.styleSubtree(a[b])};\nv.Qa=function(a){var b=this,c=ki(a);c!==this.u.cssBuild&&(this.u.cssBuild=c);if(!li(c)){var d=Yh(a);Xh(d,function(e){if(V)Li(e);else{var f=pi;e.selector=e.parsedSelector;Li(e);e.selector=e.G=wi(f,e,f.i,void 0,void 0)}W&&\"\"===c&&(yj(b),b.h&&b.h.transformRule(e))});W?a.textContent=Wh(d):this.u.M.rules.push(d)}};v.getComputedStyleValue=function(a,b){var c;W||(c=(Ni(a)||Ni(Ej(this,a))).R[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():\"\"};\nv.pb=function(a,b){var c=hi(a).getRootNode();b=b?(\"string\"===typeof b?b:String(b)).split(/\\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute(\"class\");if(d){d=d.split(/\\s/);for(var e=0;e<d.length;e++)if(d[e]===pi.g){c=d[e+1];break}}}c&&b.push(pi.g,c);W||(c=Ni(a))&&c.L&&b.push(ej.g,c.L);gi(a,b.join(\" \"))};v.Xa=function(a){return Ni(a)};v.ob=function(a,b){qi(a,b)};v.rb=function(a,b){qi(a,b,!0)};v.nb=function(a){return mj(a)};v.$a=function(a){return lj(a)};Y.prototype.flush=Y.prototype.flush;\nY.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.pb;Y.prototype._styleInfoForNode=Y.prototype.Xa;Y.prototype.transformCustomStyleForDocument=Y.prototype.Qa;Y.prototype.getStyleAst=Y.prototype.bb;Y.prototype.styleAstToString=Y.prototype.qb;\nY.prototype.flushCustomStyles=Y.prototype.flushCustomStyles;Y.prototype.scopeNode=Y.prototype.ob;Y.prototype.unscopeNode=Y.prototype.rb;Y.prototype.scopeForNode=Y.prototype.nb;Y.prototype.currentScopeForNode=Y.prototype.$a;Y.prototype.prepareAdoptedCssText=Y.prototype.kb;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return V}},nativeCss:{get:function(){return W}}});var Z=new Y,Fj,Gj;window.ShadyCSS&&(Fj=window.ShadyCSS.ApplyShim,Gj=window.ShadyCSS.CustomStyleInterface);\nwindow.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},\ngetComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:W,nativeShadow:V,cssBuild:Nh,disableRuntime:Oh};Fj&&(window.ShadyCSS.ApplyShim=Fj);Gj&&(window.ShadyCSS.CustomStyleInterface=Gj);(function(a){function b(t){\"\"==t&&(f.call(this),this.m=!0);return t.toLowerCase()}function c(t){var F=t.charCodeAt(0);return 32<F&&127>F&&-1==[34,35,60,62,63,96].indexOf(F)?t:encodeURIComponent(t)}function d(t){var F=t.charCodeAt(0);return 32<F&&127>F&&-1==[34,35,60,62,96].indexOf(F)?t:encodeURIComponent(t)}function e(t,F,E){function N(ha){sa.push(ha)}var y=F||\"scheme start\",X=0,x=\"\",ta=!1,ia=!1,sa=[];a:for(;(void 0!=t[X-1]||0==X)&&!this.m;){var n=t[X];switch(y){case \"scheme start\":if(n&&q.test(n))x+=\nn.toLowerCase(),y=\"scheme\";else if(F){N(\"Invalid scheme.\");break a}else{x=\"\";y=\"no scheme\";continue}break;case \"scheme\":if(n&&H.test(n))x+=n.toLowerCase();else if(\":\"==n){this.l=x;x=\"\";if(F)break a;void 0!==l[this.l]&&(this.H=!0);y=\"file\"==this.l?\"relative\":this.H&&E&&E.l==this.l?\"relative or authority\":this.H?\"authority first slash\":\"scheme data\"}else if(F){void 0!=n&&N(\"Code point not allowed in scheme: \"+n);break a}else{x=\"\";X=0;y=\"no scheme\";continue}break;case \"scheme data\":\"?\"==n?(this.A=\"?\",\ny=\"query\"):\"#\"==n?(this.C=\"#\",y=\"fragment\"):void 0!=n&&\"\\t\"!=n&&\"\\n\"!=n&&\"\\r\"!=n&&(this.ya+=c(n));break;case \"no scheme\":if(E&&void 0!==l[E.l]){y=\"relative\";continue}else N(\"Missing scheme.\"),f.call(this),this.m=!0;break;case \"relative or authority\":if(\"/\"==n&&\"/\"==t[X+1])y=\"authority ignore slashes\";else{N(\"Expected /, got: \"+n);y=\"relative\";continue}break;case \"relative\":this.H=!0;\"file\"!=this.l&&(this.l=E.l);if(void 0==n){this.o=E.o;this.v=E.v;this.s=E.s.slice();this.A=E.A;this.B=E.B;this.j=E.j;\nbreak a}else if(\"/\"==n||\"\\\\\"==n)\"\\\\\"==n&&N(\"\\\\ is an invalid code point.\"),y=\"relative slash\";else if(\"?\"==n)this.o=E.o,this.v=E.v,this.s=E.s.slice(),this.A=\"?\",this.B=E.B,this.j=E.j,y=\"query\";else if(\"#\"==n)this.o=E.o,this.v=E.v,this.s=E.s.slice(),this.A=E.A,this.C=\"#\",this.B=E.B,this.j=E.j,y=\"fragment\";else{y=t[X+1];var J=t[X+2];if(\"file\"!=this.l||!q.test(n)||\":\"!=y&&\"|\"!=y||void 0!=J&&\"/\"!=J&&\"\\\\\"!=J&&\"?\"!=J&&\"#\"!=J)this.o=E.o,this.v=E.v,this.B=E.B,this.j=E.j,this.s=E.s.slice(),this.s.pop();y=\n\"relative path\";continue}break;case \"relative slash\":if(\"/\"==n||\"\\\\\"==n)\"\\\\\"==n&&N(\"\\\\ is an invalid code point.\"),y=\"file\"==this.l?\"file host\":\"authority ignore slashes\";else{\"file\"!=this.l&&(this.o=E.o,this.v=E.v,this.B=E.B,this.j=E.j);y=\"relative path\";continue}break;case \"authority first slash\":if(\"/\"==n)y=\"authority second slash\";else{N(\"Expected '/', got: \"+n);y=\"authority ignore slashes\";continue}break;case \"authority second slash\":y=\"authority ignore slashes\";if(\"/\"!=n){N(\"Expected '/', got: \"+\nn);continue}break;case \"authority ignore slashes\":if(\"/\"!=n&&\"\\\\\"!=n){y=\"authority\";continue}else N(\"Expected authority, got: \"+n);break;case \"authority\":if(\"@\"==n){ta&&(N(\"@ already seen.\"),x+=\"%40\");ta=!0;for(n=0;n<x.length;n++)J=x[n],\"\\t\"==J||\"\\n\"==J||\"\\r\"==J?N(\"Invalid whitespace in authority.\"):\":\"==J&&null===this.j?this.j=\"\":(J=c(J),null!==this.j?this.j+=J:this.B+=J);x=\"\"}else if(void 0==n||\"/\"==n||\"\\\\\"==n||\"?\"==n||\"#\"==n){X-=x.length;x=\"\";y=\"host\";continue}else x+=n;break;case \"file host\":if(void 0==\nn||\"/\"==n||\"\\\\\"==n||\"?\"==n||\"#\"==n){2!=x.length||!q.test(x[0])||\":\"!=x[1]&&\"|\"!=x[1]?(0!=x.length&&(this.o=b.call(this,x),x=\"\"),y=\"relative path start\"):y=\"relative path\";continue}else\"\\t\"==n||\"\\n\"==n||\"\\r\"==n?N(\"Invalid whitespace in file host.\"):x+=n;break;case \"host\":case \"hostname\":if(\":\"!=n||ia)if(void 0==n||\"/\"==n||\"\\\\\"==n||\"?\"==n||\"#\"==n){this.o=b.call(this,x);x=\"\";y=\"relative path start\";if(F)break a;continue}else\"\\t\"!=n&&\"\\n\"!=n&&\"\\r\"!=n?(\"[\"==n?ia=!0:\"]\"==n&&(ia=!1),x+=n):N(\"Invalid code point in host/hostname: \"+\nn);else if(this.o=b.call(this,x),x=\"\",y=\"port\",\"hostname\"==F)break a;break;case \"port\":if(/[0-9]/.test(n))x+=n;else if(void 0==n||\"/\"==n||\"\\\\\"==n||\"?\"==n||\"#\"==n||F){\"\"!=x&&(x=parseInt(x,10),x!=l[this.l]&&(this.v=x+\"\"),x=\"\");if(F)break a;y=\"relative path start\";continue}else\"\\t\"==n||\"\\n\"==n||\"\\r\"==n?N(\"Invalid code point in port: \"+n):(f.call(this),this.m=!0);break;case \"relative path start\":\"\\\\\"==n&&N(\"'\\\\' not allowed in path.\");y=\"relative path\";if(\"/\"!=n&&\"\\\\\"!=n)continue;break;case \"relative path\":if(void 0!=\nn&&\"/\"!=n&&\"\\\\\"!=n&&(F||\"?\"!=n&&\"#\"!=n))\"\\t\"!=n&&\"\\n\"!=n&&\"\\r\"!=n&&(x+=c(n));else{\"\\\\\"==n&&N(\"\\\\ not allowed in relative path.\");if(J=m[x.toLowerCase()])x=J;\"..\"==x?(this.s.pop(),\"/\"!=n&&\"\\\\\"!=n&&this.s.push(\"\")):\".\"==x&&\"/\"!=n&&\"\\\\\"!=n?this.s.push(\"\"):\".\"!=x&&(\"file\"==this.l&&0==this.s.length&&2==x.length&&q.test(x[0])&&\"|\"==x[1]&&(x=x[0]+\":\"),this.s.push(x));x=\"\";\"?\"==n?(this.A=\"?\",y=\"query\"):\"#\"==n&&(this.C=\"#\",y=\"fragment\")}break;case \"query\":F||\"#\"!=n?void 0!=n&&\"\\t\"!=n&&\"\\n\"!=n&&\"\\r\"!=n&&(this.A+=\nd(n)):(this.C=\"#\",y=\"fragment\");break;case \"fragment\":void 0!=n&&\"\\t\"!=n&&\"\\n\"!=n&&\"\\r\"!=n&&(this.C+=n)}X++}}function f(){this.B=this.ya=this.l=\"\";this.j=null;this.v=this.o=\"\";this.s=[];this.C=this.A=\"\";this.H=this.m=!1}function g(t,F){void 0===F||F instanceof g||(F=new g(String(F)));this.g=t;f.call(this);e.call(this,this.g.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g,\"\"),null,F)}var h=!1;try{var k=new URL(\"b\",\"http://a\");k.pathname=\"c%20d\";h=\"http://a/c%20d\"===k.href}catch(t){}if(!h){var l=Object.create(null);\nl.ftp=21;l.file=0;l.gopher=70;l.http=80;l.https=443;l.ws=80;l.wss=443;var m=Object.create(null);m[\"%2e\"]=\".\";m[\".%2e\"]=\"..\";m[\"%2e.\"]=\"..\";m[\"%2e%2e\"]=\"..\";var q=/[a-zA-Z]/,H=/[a-zA-Z0-9+\\-.]/;g.prototype={toString:function(){return this.href},get href(){if(this.m)return this.g;var t=\"\";if(\"\"!=this.B||null!=this.j)t=this.B+(null!=this.j?\":\"+this.j:\"\")+\"@\";return this.protocol+(this.H?\"//\"+t+this.host:\"\")+this.pathname+this.A+this.C},set href(t){f.call(this);e.call(this,t)},get protocol(){return this.l+\n\":\"},set protocol(t){this.m||e.call(this,t+\":\",\"scheme start\")},get host(){return this.m?\"\":this.v?this.o+\":\"+this.v:this.o},set host(t){!this.m&&this.H&&e.call(this,t,\"host\")},get hostname(){return this.o},set hostname(t){!this.m&&this.H&&e.call(this,t,\"hostname\")},get port(){return this.v},set port(t){!this.m&&this.H&&e.call(this,t,\"port\")},get pathname(){return this.m?\"\":this.H?\"/\"+this.s.join(\"/\"):this.ya},set pathname(t){!this.m&&this.H&&(this.s=[],e.call(this,t,\"relative path start\"))},get search(){return this.m||\n!this.A||\"?\"==this.A?\"\":this.A},set search(t){!this.m&&this.H&&(this.A=\"?\",\"?\"==t[0]&&(t=t.slice(1)),e.call(this,t,\"query\"))},get hash(){return this.m||!this.C||\"#\"==this.C?\"\":this.C},set hash(t){this.m||(t?(this.C=\"#\",\"#\"==t[0]&&(t=t.slice(1)),e.call(this,t,\"fragment\")):this.C=\"\")},get origin(){var t;if(this.m||!this.l)return\"\";switch(this.l){case \"data\":case \"file\":case \"javascript\":case \"mailto\":return\"null\"}return(t=this.host)?this.l+\"://\"+t:\"\"}};var C=a.URL;C&&(g.createObjectURL=function(t){return C.createObjectURL.apply(C,\narguments)},g.revokeObjectURL=function(t){C.revokeObjectURL(t)});a.URL=g}})(window);/*\n\nCopyright (c) 2018 The Polymer Project Authors. All rights reserved.\nThis code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\nThe complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\nThe complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\nCode distributed by Google as part of the polymer project is also\nsubject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n*/\nvar Hj=window.customElements,Ij=!1,Jj=null;Hj.polyfillWrapFlushCallback&&Hj.polyfillWrapFlushCallback(function(a){Jj=a;Ij&&a()});function Kj(){window.HTMLTemplateElement.bootstrap&&window.HTMLTemplateElement.bootstrap(window.document);Jj&&Jj();Ij=!0;window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent(\"WebComponentsReady\",{bubbles:!0}))}\n\"complete\"!==document.readyState?(window.addEventListener(\"load\",Kj),window.addEventListener(\"DOMContentLoaded\",function(){window.removeEventListener(\"load\",Kj);Kj()})):Kj();}).call(this);\n\n//# sourceMappingURL=webcomponents-bundle.js.map\n","/**\n * @license\n * Copyright (c) 2018 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function () {\n 'use strict';\n\n /**\n * Basic flow of the loader process\n *\n * There are 4 flows the loader can take when booting up\n *\n * - Synchronous script, no polyfills needed\n * - wait for `DOMContentLoaded`\n * - fire WCR event, as there could not be any callbacks passed to `waitFor`\n *\n * - Synchronous script, polyfills needed\n * - document.write the polyfill bundle\n * - wait on the `load` event of the bundle to batch Custom Element upgrades\n * - wait for `DOMContentLoaded`\n * - run callbacks passed to `waitFor`\n * - fire WCR event\n *\n * - Asynchronous script, no polyfills needed\n * - wait for `DOMContentLoaded`\n * - run callbacks passed to `waitFor`\n * - fire WCR event\n *\n * - Asynchronous script, polyfills needed\n * - Append the polyfill bundle script\n * - wait for `load` event of the bundle\n * - batch Custom Element Upgrades\n * - run callbacks pass to `waitFor`\n * - fire WCR event\n */\n\n var polyfillsLoaded = false;\n var whenLoadedFns = [];\n var allowUpgrades = false;\n var flushFn;\n\n function fireEvent() {\n window.WebComponents.ready = true;\n document.dispatchEvent(\n new CustomEvent('WebComponentsReady', {bubbles: true})\n );\n }\n\n function batchCustomElements() {\n if (window.customElements && customElements.polyfillWrapFlushCallback) {\n customElements.polyfillWrapFlushCallback(function (flushCallback) {\n flushFn = flushCallback;\n if (allowUpgrades) {\n flushFn();\n }\n });\n }\n }\n\n function asyncReady() {\n batchCustomElements();\n ready();\n }\n\n function ready() {\n // bootstrap <template> elements before custom elements\n if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n HTMLTemplateElement.bootstrap(window.document);\n }\n polyfillsLoaded = true;\n runWhenLoadedFns().then(fireEvent);\n }\n\n function runWhenLoadedFns() {\n allowUpgrades = false;\n var fnsMap = whenLoadedFns.map(function (fn) {\n return fn instanceof Function ? fn() : fn;\n });\n whenLoadedFns = [];\n return Promise.all(fnsMap)\n .then(function () {\n allowUpgrades = true;\n flushFn && flushFn();\n })\n .catch(function (err) {\n console.error(err);\n });\n }\n\n window.WebComponents = window.WebComponents || {};\n window.WebComponents.ready = window.WebComponents.ready || false;\n window.WebComponents.waitFor =\n window.WebComponents.waitFor ||\n function (waitFn) {\n if (!waitFn) {\n return;\n }\n whenLoadedFns.push(waitFn);\n if (polyfillsLoaded) {\n runWhenLoadedFns();\n }\n };\n window.WebComponents._batchCustomElements = batchCustomElements;\n\n var name = 'webcomponents-loader.js';\n // Feature detect which polyfill needs to be imported.\n var polyfills = [];\n if (\n !(\n 'attachShadow' in Element.prototype && 'getRootNode' in Element.prototype\n ) ||\n (window.ShadyDOM && window.ShadyDOM.force)\n ) {\n polyfills.push('sd');\n }\n if (!window.customElements || window.customElements.forcePolyfill) {\n polyfills.push('ce');\n }\n\n var needsTemplate = (function () {\n // no real <template> because no `content` property (IE and older browsers)\n var t = document.createElement('template');\n if (!('content' in t)) {\n return true;\n }\n // broken doc fragment (older Edge)\n if (!(t.content.cloneNode() instanceof DocumentFragment)) {\n return true;\n }\n // broken <template> cloning (Edge up to at least version 17)\n var t2 = document.createElement('template');\n t2.content.appendChild(document.createElement('div'));\n t.content.appendChild(t2);\n var clone = t.cloneNode(true);\n return (\n clone.content.childNodes.length === 0 ||\n clone.content.firstChild.content.childNodes.length === 0\n );\n })();\n\n // NOTE: any browser that does not have template or ES6 features\n // must load the full suite of polyfills.\n if (\n !window.Promise ||\n !Array.from ||\n !window.URL ||\n !window.Symbol ||\n needsTemplate\n ) {\n polyfills = ['sd-ce-pf'];\n }\n\n if (polyfills.length) {\n // When the Trusted Types API is available, `policy` is a\n // `TrustedTypePolicy` with functions for creating trusted HTML, scripts,\n // and script URLs. This policy is used below to (a) approve the bundle URL\n // string created by the loader that is assigned to a `<script>`'s `src`\n // attribute, (b) approve a constant script string that is assigned to that\n // `<script>'s `onload` attribute, and (c) approve the string of HTML that\n // the loader reads from that `<script>`'s `outerHTML`.\n //\n // If the Trusted Types API is not available, the returned object exposes a\n // similar interface to a `TrustedTypePolicy`, but all of its functions are\n // the identity function.\n var policy = (function () {\n var identity = function (x) {\n return x;\n };\n var policyOptions = {\n createHTML: identity,\n createScript: identity,\n createScriptURL: identity,\n };\n var policy =\n window.trustedTypes &&\n window.trustedTypes.createPolicy('webcomponents-loader', policyOptions);\n return policy || policyOptions;\n })();\n\n var url;\n var polyfillFile = 'bundles/webcomponents-' + polyfills.join('-') + '.js';\n\n // Load it from the right place.\n if (window.WebComponents.root) {\n url = window.WebComponents.root + polyfillFile;\n if (\n window.trustedTypes &&\n window.trustedTypes.isScriptURL(window.WebComponents.root)\n ) {\n url = policy.createScriptURL(url);\n }\n } else {\n var script = document.querySelector('script[src*=\"' + name + '\"]');\n // Load it from the right place.\n url = policy.createScriptURL(script.src.replace(name, polyfillFile));\n }\n\n var newScript = document.createElement('script');\n newScript.src = url;\n // if readyState is 'loading', this script is synchronous\n if (document.readyState === 'loading') {\n // make sure custom elements are batched whenever parser gets to the injected script\n newScript.setAttribute(\n 'onload',\n policy.createScript('window.WebComponents._batchCustomElements()')\n );\n document.write(policy.createHTML(newScript.outerHTML));\n document.addEventListener('DOMContentLoaded', ready);\n } else {\n newScript.addEventListener('load', function () {\n asyncReady();\n });\n newScript.addEventListener('error', function () {\n throw new Error('Could not load polyfill bundle' + url);\n });\n document.head.appendChild(newScript);\n }\n } else {\n // if readyState is 'complete', script is loaded imperatively on a spec-compliant browser, so just fire WCR\n if (document.readyState === 'complete') {\n polyfillsLoaded = true;\n fireEvent();\n } else {\n // this script may come between DCL and load, so listen for both, and cancel load listener if DCL fires\n window.addEventListener('load', ready);\n window.addEventListener('DOMContentLoaded', function () {\n window.removeEventListener('load', ready);\n ready();\n });\n }\n }\n})();\n","/*\n * International Telephone Input v16.1.0\n * https://github.com/jackocnr/intl-tel-input.git\n * Licensed under the MIT license\n */\n\n// wrap in UMD\n(function(factory) {\n if (typeof module === \"object\" && module.exports) module.exports = factory(); else window.intlTelInput = factory();\n})(function(undefined) {\n \"use strict\";\n return function() {\n // Array of country objects for the flag dropdown.\n // Here is the criteria for the plugin to support a given country/territory\n // - It has an iso2 code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\n // - It has it's own country calling code (it is not a sub-region of another country): https://en.wikipedia.org/wiki/List_of_country_calling_codes\n // - It has a flag in the region-flags project: https://github.com/behdad/region-flags/tree/gh-pages/png\n // - It is supported by libphonenumber (it must be listed on this page): https://github.com/googlei18n/libphonenumber/blob/master/resources/ShortNumberMetadata.xml\n // Each country array has the following information:\n // [\n // Country name,\n // iso2 code,\n // International dial code,\n // Order (if >1 country with same dial code),\n // Area codes\n // ]\n var allCountries = [ [ \"Afghanistan (‫افغانستان‬‎)\", \"af\", \"93\" ], [ \"Albania (Shqipëri)\", \"al\", \"355\" ], [ \"Algeria (‫الجزائر‬‎)\", \"dz\", \"213\" ], [ \"American Samoa\", \"as\", \"1\", 5, [ \"684\" ] ], [ \"Andorra\", \"ad\", \"376\" ], [ \"Angola\", \"ao\", \"244\" ], [ \"Anguilla\", \"ai\", \"1\", 6, [ \"264\" ] ], [ \"Antigua and Barbuda\", \"ag\", \"1\", 7, [ \"268\" ] ], [ \"Argentina\", \"ar\", \"54\" ], [ \"Armenia (Հայաստան)\", \"am\", \"374\" ], [ \"Aruba\", \"aw\", \"297\" ], [ \"Australia\", \"au\", \"61\", 0 ], [ \"Austria (Österreich)\", \"at\", \"43\" ], [ \"Azerbaijan (Azərbaycan)\", \"az\", \"994\" ], [ \"Bahamas\", \"bs\", \"1\", 8, [ \"242\" ] ], [ \"Bahrain (‫البحرين‬‎)\", \"bh\", \"973\" ], [ \"Bangladesh (বাংলাদেশ)\", \"bd\", \"880\" ], [ \"Barbados\", \"bb\", \"1\", 9, [ \"246\" ] ], [ \"Belarus (Беларусь)\", \"by\", \"375\" ], [ \"Belgium (België)\", \"be\", \"32\" ], [ \"Belize\", \"bz\", \"501\" ], [ \"Benin (Bénin)\", \"bj\", \"229\" ], [ \"Bermuda\", \"bm\", \"1\", 10, [ \"441\" ] ], [ \"Bhutan (འབྲུག)\", \"bt\", \"975\" ], [ \"Bolivia\", \"bo\", \"591\" ], [ \"Bosnia and Herzegovina (Босна и Херцеговина)\", \"ba\", \"387\" ], [ \"Botswana\", \"bw\", \"267\" ], [ \"Brazil (Brasil)\", \"br\", \"55\" ], [ \"British Indian Ocean Territory\", \"io\", \"246\" ], [ \"British Virgin Islands\", \"vg\", \"1\", 11, [ \"284\" ] ], [ \"Brunei\", \"bn\", \"673\" ], [ \"Bulgaria (България)\", \"bg\", \"359\" ], [ \"Burkina Faso\", \"bf\", \"226\" ], [ \"Burundi (Uburundi)\", \"bi\", \"257\" ], [ \"Cambodia (កម្ពុជា)\", \"kh\", \"855\" ], [ \"Cameroon (Cameroun)\", \"cm\", \"237\" ], [ \"Canada\", \"ca\", \"1\", 1, [ \"204\", \"226\", \"236\", \"249\", \"250\", \"289\", \"306\", \"343\", \"365\", \"387\", \"403\", \"416\", \"418\", \"431\", \"437\", \"438\", \"450\", \"506\", \"514\", \"519\", \"548\", \"579\", \"581\", \"587\", \"604\", \"613\", \"639\", \"647\", \"672\", \"705\", \"709\", \"742\", \"778\", \"780\", \"782\", \"807\", \"819\", \"825\", \"867\", \"873\", \"902\", \"905\" ] ], [ \"Cape Verde (Kabu Verdi)\", \"cv\", \"238\" ], [ \"Caribbean Netherlands\", \"bq\", \"599\", 1, [ \"3\", \"4\", \"7\" ] ], [ \"Cayman Islands\", \"ky\", \"1\", 12, [ \"345\" ] ], [ \"Central African Republic (République centrafricaine)\", \"cf\", \"236\" ], [ \"Chad (Tchad)\", \"td\", \"235\" ], [ \"Chile\", \"cl\", \"56\" ], [ \"China (中国)\", \"cn\", \"86\" ], [ \"Christmas Island\", \"cx\", \"61\", 2 ], [ \"Cocos (Keeling) Islands\", \"cc\", \"61\", 1 ], [ \"Colombia\", \"co\", \"57\" ], [ \"Comoros (‫جزر القمر‬‎)\", \"km\", \"269\" ], [ \"Congo (DRC) (Jamhuri ya Kidemokrasia ya Kongo)\", \"cd\", \"243\" ], [ \"Congo (Republic) (Congo-Brazzaville)\", \"cg\", \"242\" ], [ \"Cook Islands\", \"ck\", \"682\" ], [ \"Costa Rica\", \"cr\", \"506\" ], [ \"Côte d’Ivoire\", \"ci\", \"225\" ], [ \"Croatia (Hrvatska)\", \"hr\", \"385\" ], [ \"Cuba\", \"cu\", \"53\" ], [ \"Curaçao\", \"cw\", \"599\", 0 ], [ \"Cyprus (Κύπρος)\", \"cy\", \"357\" ], [ \"Czech Republic (Česká republika)\", \"cz\", \"420\" ], [ \"Denmark (Danmark)\", \"dk\", \"45\" ], [ \"Djibouti\", \"dj\", \"253\" ], [ \"Dominica\", \"dm\", \"1\", 13, [ \"767\" ] ], [ \"Dominican Republic (República Dominicana)\", \"do\", \"1\", 2, [ \"809\", \"829\", \"849\" ] ], [ \"Ecuador\", \"ec\", \"593\" ], [ \"Egypt (‫مصر‬‎)\", \"eg\", \"20\" ], [ \"El Salvador\", \"sv\", \"503\" ], [ \"Equatorial Guinea (Guinea Ecuatorial)\", \"gq\", \"240\" ], [ \"Eritrea\", \"er\", \"291\" ], [ \"Estonia (Eesti)\", \"ee\", \"372\" ], [ \"Ethiopia\", \"et\", \"251\" ], [ \"Falkland Islands (Islas Malvinas)\", \"fk\", \"500\" ], [ \"Faroe Islands (Føroyar)\", \"fo\", \"298\" ], [ \"Fiji\", \"fj\", \"679\" ], [ \"Finland (Suomi)\", \"fi\", \"358\", 0 ], [ \"France\", \"fr\", \"33\" ], [ \"French Guiana (Guyane française)\", \"gf\", \"594\" ], [ \"French Polynesia (Polynésie française)\", \"pf\", \"689\" ], [ \"Gabon\", \"ga\", \"241\" ], [ \"Gambia\", \"gm\", \"220\" ], [ \"Georgia (საქართველო)\", \"ge\", \"995\" ], [ \"Germany (Deutschland)\", \"de\", \"49\" ], [ \"Ghana (Gaana)\", \"gh\", \"233\" ], [ \"Gibraltar\", \"gi\", \"350\" ], [ \"Greece (Ελλάδα)\", \"gr\", \"30\" ], [ \"Greenland (Kalaallit Nunaat)\", \"gl\", \"299\" ], [ \"Grenada\", \"gd\", \"1\", 14, [ \"473\" ] ], [ \"Guadeloupe\", \"gp\", \"590\", 0 ], [ \"Guam\", \"gu\", \"1\", 15, [ \"671\" ] ], [ \"Guatemala\", \"gt\", \"502\" ], [ \"Guernsey\", \"gg\", \"44\", 1, [ \"1481\", \"7781\", \"7839\", \"7911\" ] ], [ \"Guinea (Guinée)\", \"gn\", \"224\" ], [ \"Guinea-Bissau (Guiné Bissau)\", \"gw\", \"245\" ], [ \"Guyana\", \"gy\", \"592\" ], [ \"Haiti\", \"ht\", \"509\" ], [ \"Honduras\", \"hn\", \"504\" ], [ \"Hong Kong (香港)\", \"hk\", \"852\" ], [ \"Hungary (Magyarország)\", \"hu\", \"36\" ], [ \"Iceland (Ísland)\", \"is\", \"354\" ], [ \"India (भारत)\", \"in\", \"91\" ], [ \"Indonesia\", \"id\", \"62\" ], [ \"Iran (‫ایران‬‎)\", \"ir\", \"98\" ], [ \"Iraq (‫العراق‬‎)\", \"iq\", \"964\" ], [ \"Ireland\", \"ie\", \"353\" ], [ \"Isle of Man\", \"im\", \"44\", 2, [ \"1624\", \"74576\", \"7524\", \"7924\", \"7624\" ] ], [ \"Israel (‫ישראל‬‎)\", \"il\", \"972\" ], [ \"Italy (Italia)\", \"it\", \"39\", 0 ], [ \"Jamaica\", \"jm\", \"1\", 4, [ \"876\", \"658\" ] ], [ \"Japan (日本)\", \"jp\", \"81\" ], [ \"Jersey\", \"je\", \"44\", 3, [ \"1534\", \"7509\", \"7700\", \"7797\", \"7829\", \"7937\" ] ], [ \"Jordan (‫الأردن‬‎)\", \"jo\", \"962\" ], [ \"Kazakhstan (Казахстан)\", \"kz\", \"7\", 1, [ \"33\", \"7\" ] ], [ \"Kenya\", \"ke\", \"254\" ], [ \"Kiribati\", \"ki\", \"686\" ], [ \"Kosovo\", \"xk\", \"383\" ], [ \"Kuwait (‫الكويت‬‎)\", \"kw\", \"965\" ], [ \"Kyrgyzstan (Кыргызстан)\", \"kg\", \"996\" ], [ \"Laos (ລາວ)\", \"la\", \"856\" ], [ \"Latvia (Latvija)\", \"lv\", \"371\" ], [ \"Lebanon (‫لبنان‬‎)\", \"lb\", \"961\" ], [ \"Lesotho\", \"ls\", \"266\" ], [ \"Liberia\", \"lr\", \"231\" ], [ \"Libya (‫ليبيا‬‎)\", \"ly\", \"218\" ], [ \"Liechtenstein\", \"li\", \"423\" ], [ \"Lithuania (Lietuva)\", \"lt\", \"370\" ], [ \"Luxembourg\", \"lu\", \"352\" ], [ \"Macau (澳門)\", \"mo\", \"853\" ], [ \"Macedonia (FYROM) (Македонија)\", \"mk\", \"389\" ], [ \"Madagascar (Madagasikara)\", \"mg\", \"261\" ], [ \"Malawi\", \"mw\", \"265\" ], [ \"Malaysia\", \"my\", \"60\" ], [ \"Maldives\", \"mv\", \"960\" ], [ \"Mali\", \"ml\", \"223\" ], [ \"Malta\", \"mt\", \"356\" ], [ \"Marshall Islands\", \"mh\", \"692\" ], [ \"Martinique\", \"mq\", \"596\" ], [ \"Mauritania (‫موريتانيا‬‎)\", \"mr\", \"222\" ], [ \"Mauritius (Moris)\", \"mu\", \"230\" ], [ \"Mayotte\", \"yt\", \"262\", 1, [ \"269\", \"639\" ] ], [ \"Mexico (México)\", \"mx\", \"52\" ], [ \"Micronesia\", \"fm\", \"691\" ], [ \"Moldova (Republica Moldova)\", \"md\", \"373\" ], [ \"Monaco\", \"mc\", \"377\" ], [ \"Mongolia (Монгол)\", \"mn\", \"976\" ], [ \"Montenegro (Crna Gora)\", \"me\", \"382\" ], [ \"Montserrat\", \"ms\", \"1\", 16, [ \"664\" ] ], [ \"Morocco (‫المغرب‬‎)\", \"ma\", \"212\", 0 ], [ \"Mozambique (Moçambique)\", \"mz\", \"258\" ], [ \"Myanmar (Burma) (မြန်မာ)\", \"mm\", \"95\" ], [ \"Namibia (Namibië)\", \"na\", \"264\" ], [ \"Nauru\", \"nr\", \"674\" ], [ \"Nepal (नेपाल)\", \"np\", \"977\" ], [ \"Netherlands (Nederland)\", \"nl\", \"31\" ], [ \"New Caledonia (Nouvelle-Calédonie)\", \"nc\", \"687\" ], [ \"New Zealand\", \"nz\", \"64\" ], [ \"Nicaragua\", \"ni\", \"505\" ], [ \"Niger (Nijar)\", \"ne\", \"227\" ], [ \"Nigeria\", \"ng\", \"234\" ], [ \"Niue\", \"nu\", \"683\" ], [ \"Norfolk Island\", \"nf\", \"672\" ], [ \"North Korea (조선 민주주의 인민 공화국)\", \"kp\", \"850\" ], [ \"Northern Mariana Islands\", \"mp\", \"1\", 17, [ \"670\" ] ], [ \"Norway (Norge)\", \"no\", \"47\", 0 ], [ \"Oman (‫عُمان‬‎)\", \"om\", \"968\" ], [ \"Pakistan (‫پاکستان‬‎)\", \"pk\", \"92\" ], [ \"Palau\", \"pw\", \"680\" ], [ \"Palestine (‫فلسطين‬‎)\", \"ps\", \"970\" ], [ \"Panama (Panamá)\", \"pa\", \"507\" ], [ \"Papua New Guinea\", \"pg\", \"675\" ], [ \"Paraguay\", \"py\", \"595\" ], [ \"Peru (Perú)\", \"pe\", \"51\" ], [ \"Philippines\", \"ph\", \"63\" ], [ \"Poland (Polska)\", \"pl\", \"48\" ], [ \"Portugal\", \"pt\", \"351\" ], [ \"Puerto Rico\", \"pr\", \"1\", 3, [ \"787\", \"939\" ] ], [ \"Qatar (‫قطر‬‎)\", \"qa\", \"974\" ], [ \"Réunion (La Réunion)\", \"re\", \"262\", 0 ], [ \"Romania (România)\", \"ro\", \"40\" ], [ \"Russia (Россия)\", \"ru\", \"7\", 0 ], [ \"Rwanda\", \"rw\", \"250\" ], [ \"Saint Barthélemy\", \"bl\", \"590\", 1 ], [ \"Saint Helena\", \"sh\", \"290\" ], [ \"Saint Kitts and Nevis\", \"kn\", \"1\", 18, [ \"869\" ] ], [ \"Saint Lucia\", \"lc\", \"1\", 19, [ \"758\" ] ], [ \"Saint Martin (Saint-Martin (partie française))\", \"mf\", \"590\", 2 ], [ \"Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)\", \"pm\", \"508\" ], [ \"Saint Vincent and the Grenadines\", \"vc\", \"1\", 20, [ \"784\" ] ], [ \"Samoa\", \"ws\", \"685\" ], [ \"San Marino\", \"sm\", \"378\" ], [ \"São Tomé and Príncipe (São Tomé e Príncipe)\", \"st\", \"239\" ], [ \"Saudi Arabia (‫المملكة العربية السعودية‬‎)\", \"sa\", \"966\" ], [ \"Senegal (Sénégal)\", \"sn\", \"221\" ], [ \"Serbia (Србија)\", \"rs\", \"381\" ], [ \"Seychelles\", \"sc\", \"248\" ], [ \"Sierra Leone\", \"sl\", \"232\" ], [ \"Singapore\", \"sg\", \"65\" ], [ \"Sint Maarten\", \"sx\", \"1\", 21, [ \"721\" ] ], [ \"Slovakia (Slovensko)\", \"sk\", \"421\" ], [ \"Slovenia (Slovenija)\", \"si\", \"386\" ], [ \"Solomon Islands\", \"sb\", \"677\" ], [ \"Somalia (Soomaaliya)\", \"so\", \"252\" ], [ \"South Africa\", \"za\", \"27\" ], [ \"South Korea (대한민국)\", \"kr\", \"82\" ], [ \"South Sudan (‫جنوب السودان‬‎)\", \"ss\", \"211\" ], [ \"Spain (España)\", \"es\", \"34\" ], [ \"Sri Lanka (ශ්‍රී ලංකාව)\", \"lk\", \"94\" ], [ \"Sudan (‫السودان‬‎)\", \"sd\", \"249\" ], [ \"Suriname\", \"sr\", \"597\" ], [ \"Svalbard and Jan Mayen\", \"sj\", \"47\", 1, [ \"79\" ] ], [ \"Swaziland\", \"sz\", \"268\" ], [ \"Sweden (Sverige)\", \"se\", \"46\" ], [ \"Switzerland (Schweiz)\", \"ch\", \"41\" ], [ \"Syria (‫سوريا‬‎)\", \"sy\", \"963\" ], [ \"Taiwan (台灣)\", \"tw\", \"886\" ], [ \"Tajikistan\", \"tj\", \"992\" ], [ \"Tanzania\", \"tz\", \"255\" ], [ \"Thailand (ไทย)\", \"th\", \"66\" ], [ \"Timor-Leste\", \"tl\", \"670\" ], [ \"Togo\", \"tg\", \"228\" ], [ \"Tokelau\", \"tk\", \"690\" ], [ \"Tonga\", \"to\", \"676\" ], [ \"Trinidad and Tobago\", \"tt\", \"1\", 22, [ \"868\" ] ], [ \"Tunisia (‫تونس‬‎)\", \"tn\", \"216\" ], [ \"Turkey (Türkiye)\", \"tr\", \"90\" ], [ \"Turkmenistan\", \"tm\", \"993\" ], [ \"Turks and Caicos Islands\", \"tc\", \"1\", 23, [ \"649\" ] ], [ \"Tuvalu\", \"tv\", \"688\" ], [ \"U.S. Virgin Islands\", \"vi\", \"1\", 24, [ \"340\" ] ], [ \"Uganda\", \"ug\", \"256\" ], [ \"Ukraine (Україна)\", \"ua\", \"380\" ], [ \"United Arab Emirates (‫الإمارات العربية المتحدة‬‎)\", \"ae\", \"971\" ], [ \"United Kingdom\", \"gb\", \"44\", 0 ], [ \"United States\", \"us\", \"1\", 0 ], [ \"Uruguay\", \"uy\", \"598\" ], [ \"Uzbekistan (Oʻzbekiston)\", \"uz\", \"998\" ], [ \"Vanuatu\", \"vu\", \"678\" ], [ \"Vatican City (Città del Vaticano)\", \"va\", \"39\", 1, [ \"06698\" ] ], [ \"Venezuela\", \"ve\", \"58\" ], [ \"Vietnam (Việt Nam)\", \"vn\", \"84\" ], [ \"Wallis and Futuna (Wallis-et-Futuna)\", \"wf\", \"681\" ], [ \"Western Sahara (‫الصحراء الغربية‬‎)\", \"eh\", \"212\", 1, [ \"5288\", \"5289\" ] ], [ \"Yemen (‫اليمن‬‎)\", \"ye\", \"967\" ], [ \"Zambia\", \"zm\", \"260\" ], [ \"Zimbabwe\", \"zw\", \"263\" ], [ \"Åland Islands\", \"ax\", \"358\", 1, [ \"18\" ] ] ];\n // loop over all of the countries above, restructuring the data to be objects with named keys\n for (var i = 0; i < allCountries.length; i++) {\n var c = allCountries[i];\n allCountries[i] = {\n name: c[0],\n iso2: c[1],\n dialCode: c[2],\n priority: c[3] || 0,\n areaCodes: c[4] || null\n };\n }\n \"use strict\";\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n var intlTelInputGlobals = {\n getInstance: function getInstance(input) {\n var id = input.getAttribute(\"data-intl-tel-input-id\");\n return window.intlTelInputGlobals.instances[id];\n },\n instances: {}\n };\n if (typeof window === \"object\") window.intlTelInputGlobals = intlTelInputGlobals;\n // these vars persist through all instances of the plugin\n var id = 0;\n var defaults = {\n // whether or not to allow the dropdown\n allowDropdown: true,\n // if there is just a dial code in the input: remove it on blur\n autoHideDialCode: true,\n // add a placeholder in the input with an example number for the selected country\n autoPlaceholder: \"polite\",\n // modify the parentClass\n customContainer: \"\",\n // modify the auto placeholder\n customPlaceholder: null,\n // append menu to specified element\n dropdownContainer: null,\n // don't display these countries\n excludeCountries: [],\n // format the input value during initialisation and on setNumber\n formatOnDisplay: true,\n // geoIp lookup function\n geoIpLookup: null,\n // inject a hidden input with this name, and on submit, populate it with the result of getNumber\n hiddenInput: \"\",\n // initial country\n initialCountry: \"\",\n // localized country names e.g. { 'de': 'Deutschland' }\n localizedCountries: null,\n // don't insert international dial codes\n nationalMode: true,\n // display only these countries\n onlyCountries: [],\n // number type to use for placeholders\n placeholderNumberType: \"MOBILE\",\n // the countries at the top of the list. defaults to united states and united kingdom\n preferredCountries: [ \"us\", \"gb\" ],\n // display the country dial code next to the selected flag so it's not part of the typed number\n separateDialCode: false,\n // specify the path to the libphonenumber script to enable validation/formatting\n utilsScript: \"\"\n };\n // https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes#Non-geographic_area_codes\n var regionlessNanpNumbers = [ \"800\", \"822\", \"833\", \"844\", \"855\", \"866\", \"877\", \"880\", \"881\", \"882\", \"883\", \"884\", \"885\", \"886\", \"887\", \"888\", \"889\" ];\n if (typeof window === \"object\") {\n // keep track of if the window.load event has fired as impossible to check after the fact\n window.addEventListener(\"load\", function() {\n // UPDATE: use a public static field so we can fudge it in the tests\n window.intlTelInputGlobals.windowLoaded = true;\n });\n }\n // utility function to iterate over an object. can't use Object.entries or native forEach because\n // of IE11\n var forEachProp = function forEachProp(obj, callback) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n callback(keys[i], obj[keys[i]]);\n }\n };\n // run a method on each instance of the plugin\n var forEachInstance = function forEachInstance(method) {\n forEachProp(window.intlTelInputGlobals.instances, function(key) {\n window.intlTelInputGlobals.instances[key][method]();\n });\n };\n // this is our plugin class that we will create an instance of\n // eslint-disable-next-line no-unused-vars\n var Iti = /*#__PURE__*/\n function() {\n function Iti(input, options) {\n var _this = this;\n _classCallCheck(this, Iti);\n this.id = id++;\n this.telInput = input;\n this.activeItem = null;\n this.highlightedItem = null;\n // process specified options / defaults\n // alternative to Object.assign, which isn't supported by IE11\n var customOptions = options || {};\n this.options = {};\n forEachProp(defaults, function(key, value) {\n _this.options[key] = customOptions.hasOwnProperty(key) ? customOptions[key] : value;\n });\n this.hadInitialPlaceholder = Boolean(input.getAttribute(\"placeholder\"));\n }\n _createClass(Iti, [ {\n key: \"_init\",\n value: function _init() {\n var _this2 = this;\n // if in nationalMode, disable options relating to dial codes\n if (this.options.nationalMode) this.options.autoHideDialCode = false;\n // if separateDialCode then doesn't make sense to A) insert dial code into input\n // (autoHideDialCode), and B) display national numbers (because we're displaying the country\n // dial code next to them)\n if (this.options.separateDialCode) {\n this.options.autoHideDialCode = this.options.nationalMode = false;\n }\n // we cannot just test screen size as some smartphones/website meta tags will report desktop\n // resolutions\n // Note: for some reason jasmine breaks if you put this in the main Plugin function with the\n // rest of these declarations\n // Note: to target Android Mobiles (and not Tablets), we must find 'Android' and 'Mobile'\n this.isMobile = /Android.+Mobile|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n if (this.isMobile) {\n // trigger the mobile dropdown css\n document.body.classList.add(\"iti-mobile\");\n // on mobile, we want a full screen dropdown, so we must append it to the body\n if (!this.options.dropdownContainer) this.options.dropdownContainer = document.body;\n }\n // these promises get resolved when their individual requests complete\n // this way the dev can do something like iti.promise.then(...) to know when all requests are\n // complete\n if (typeof Promise !== \"undefined\") {\n var autoCountryPromise = new Promise(function(resolve, reject) {\n _this2.resolveAutoCountryPromise = resolve;\n _this2.rejectAutoCountryPromise = reject;\n });\n var utilsScriptPromise = new Promise(function(resolve, reject) {\n _this2.resolveUtilsScriptPromise = resolve;\n _this2.rejectUtilsScriptPromise = reject;\n });\n this.promise = Promise.all([ autoCountryPromise, utilsScriptPromise ]);\n } else {\n // prevent errors when Promise doesn't exist\n this.resolveAutoCountryPromise = this.rejectAutoCountryPromise = function() {};\n this.resolveUtilsScriptPromise = this.rejectUtilsScriptPromise = function() {};\n }\n // in various situations there could be no country selected initially, but we need to be able\n // to assume this variable exists\n this.selectedCountryData = {};\n // process all the data: onlyCountries, excludeCountries, preferredCountries etc\n this._processCountryData();\n // generate the markup\n this._generateMarkup();\n // set the initial state of the input value and the selected flag\n this._setInitialState();\n // start all of the event listeners: autoHideDialCode, input keydown, selectedFlag click\n this._initListeners();\n // utils script, and auto country\n this._initRequests();\n }\n }, {\n key: \"_processCountryData\",\n value: function _processCountryData() {\n // process onlyCountries or excludeCountries array if present\n this._processAllCountries();\n // process the countryCodes map\n this._processCountryCodes();\n // process the preferredCountries\n this._processPreferredCountries();\n // translate countries according to localizedCountries option\n if (this.options.localizedCountries) this._translateCountriesByLocale();\n // sort countries by name\n if (this.options.onlyCountries.length || this.options.localizedCountries) {\n this.countries.sort(this._countryNameSort);\n }\n }\n }, {\n key: \"_addCountryCode\",\n value: function _addCountryCode(iso2, dialCode, priority) {\n if (dialCode.length > this.dialCodeMaxLen) {\n this.dialCodeMaxLen = dialCode.length;\n }\n if (!this.countryCodes.hasOwnProperty(dialCode)) {\n this.countryCodes[dialCode] = [];\n }\n // bail if we already have this country for this dialCode\n for (var i = 0; i < this.countryCodes[dialCode].length; i++) {\n if (this.countryCodes[dialCode][i] === iso2) return;\n }\n // check for undefined as 0 is falsy\n var index = priority !== undefined ? priority : this.countryCodes[dialCode].length;\n this.countryCodes[dialCode][index] = iso2;\n }\n }, {\n key: \"_processAllCountries\",\n value: function _processAllCountries() {\n if (this.options.onlyCountries.length) {\n var lowerCaseOnlyCountries = this.options.onlyCountries.map(function(country) {\n return country.toLowerCase();\n });\n this.countries = allCountries.filter(function(country) {\n return lowerCaseOnlyCountries.indexOf(country.iso2) > -1;\n });\n } else if (this.options.excludeCountries.length) {\n var lowerCaseExcludeCountries = this.options.excludeCountries.map(function(country) {\n return country.toLowerCase();\n });\n this.countries = allCountries.filter(function(country) {\n return lowerCaseExcludeCountries.indexOf(country.iso2) === -1;\n });\n } else {\n this.countries = allCountries;\n }\n }\n }, {\n key: \"_translateCountriesByLocale\",\n value: function _translateCountriesByLocale() {\n for (var i = 0; i < this.countries.length; i++) {\n var iso = this.countries[i].iso2.toLowerCase();\n if (this.options.localizedCountries.hasOwnProperty(iso)) {\n this.countries[i].name = this.options.localizedCountries[iso];\n }\n }\n }\n }, {\n key: \"_countryNameSort\",\n value: function _countryNameSort(a, b) {\n return a.name.localeCompare(b.name);\n }\n }, {\n key: \"_processCountryCodes\",\n value: function _processCountryCodes() {\n this.dialCodeMaxLen = 0;\n this.countryCodes = {};\n // first: add dial codes\n for (var i = 0; i < this.countries.length; i++) {\n var c = this.countries[i];\n this._addCountryCode(c.iso2, c.dialCode, c.priority);\n }\n // next: add area codes\n // this is a second loop over countries, to make sure we have all of the \"root\" countries\n // already in the map, so that we can access them, as each time we add an area code substring\n // to the map, we also need to include the \"root\" country's code, as that also matches\n for (var _i = 0; _i < this.countries.length; _i++) {\n var _c = this.countries[_i];\n // area codes\n if (_c.areaCodes) {\n var rootCountryCode = this.countryCodes[_c.dialCode][0];\n // for each area code\n for (var j = 0; j < _c.areaCodes.length; j++) {\n var areaCode = _c.areaCodes[j];\n // for each digit in the area code to add all partial matches as well\n for (var k = 1; k < areaCode.length; k++) {\n var partialDialCode = _c.dialCode + areaCode.substr(0, k);\n // start with the root country, as that also matches this dial code\n this._addCountryCode(rootCountryCode, partialDialCode);\n this._addCountryCode(_c.iso2, partialDialCode);\n }\n // add the full area code\n this._addCountryCode(_c.iso2, _c.dialCode + areaCode);\n }\n }\n }\n }\n }, {\n key: \"_processPreferredCountries\",\n value: function _processPreferredCountries() {\n this.preferredCountries = [];\n for (var i = 0; i < this.options.preferredCountries.length; i++) {\n var countryCode = this.options.preferredCountries[i].toLowerCase();\n var countryData = this._getCountryData(countryCode, false, true);\n if (countryData) this.preferredCountries.push(countryData);\n }\n }\n }, {\n key: \"_createEl\",\n value: function _createEl(name, attrs, container) {\n var el = document.createElement(name);\n if (attrs) forEachProp(attrs, function(key, value) {\n return el.setAttribute(key, value);\n });\n if (container) container.appendChild(el);\n return el;\n }\n }, {\n key: \"_generateMarkup\",\n value: function _generateMarkup() {\n // if autocomplete does not exist on the element and its form, then\n // prevent autocomplete as there's no safe, cross-browser event we can react to, so it can\n // easily put the plugin in an inconsistent state e.g. the wrong flag selected for the\n // autocompleted number, which on submit could mean wrong number is saved (esp in nationalMode)\n if (!this.telInput.hasAttribute(\"autocomplete\") && !(this.telInput.form && this.telInput.form.hasAttribute(\"autocomplete\"))) {\n this.telInput.setAttribute(\"autocomplete\", \"off\");\n }\n // containers (mostly for positioning)\n var parentClass = \"iti\";\n if (this.options.allowDropdown) parentClass += \" iti--allow-dropdown\";\n if (this.options.separateDialCode) parentClass += \" iti--separate-dial-code\";\n if (this.options.customContainer) {\n parentClass += \" \";\n parentClass += this.options.customContainer;\n }\n var wrapper = this._createEl(\"div\", {\n \"class\": parentClass\n });\n this.telInput.parentNode.insertBefore(wrapper, this.telInput);\n this.flagsContainer = this._createEl(\"div\", {\n \"class\": \"iti__flag-container\"\n }, wrapper);\n wrapper.appendChild(this.telInput);\n // selected flag (displayed to left of input)\n this.selectedFlag = this._createEl(\"div\", {\n \"class\": \"iti__selected-flag\",\n role: \"combobox\",\n \"aria-owns\": \"country-listbox\",\n \"aria-expanded\": \"false\"\n }, this.flagsContainer);\n this.selectedFlagInner = this._createEl(\"div\", {\n \"class\": \"iti__flag\"\n }, this.selectedFlag);\n if (this.options.separateDialCode) {\n this.selectedDialCode = this._createEl(\"div\", {\n \"class\": \"iti__selected-dial-code\"\n }, this.selectedFlag);\n }\n if (this.options.allowDropdown) {\n // make element focusable and tab navigable\n this.selectedFlag.setAttribute(\"tabindex\", \"0\");\n this.dropdownArrow = this._createEl(\"div\", {\n \"class\": \"iti__arrow\"\n }, this.selectedFlag);\n // country dropdown: preferred countries, then divider, then all countries\n this.countryList = this._createEl(\"ul\", {\n \"class\": \"iti__country-list iti__hide\",\n id: \"country-listbox\",\n role: \"listbox\"\n });\n if (this.preferredCountries.length) {\n this._appendListItems(this.preferredCountries, \"iti__preferred\");\n this._createEl(\"li\", {\n \"class\": \"iti__divider\",\n role: \"separator\",\n \"aria-disabled\": \"true\"\n }, this.countryList);\n }\n this._appendListItems(this.countries, \"iti__standard\");\n // create dropdownContainer markup\n if (this.options.dropdownContainer) {\n this.dropdown = this._createEl(\"div\", {\n \"class\": \"iti iti--container\"\n });\n this.dropdown.appendChild(this.countryList);\n } else {\n this.flagsContainer.appendChild(this.countryList);\n }\n }\n if (this.options.hiddenInput) {\n var hiddenInputName = this.options.hiddenInput;\n var name = this.telInput.getAttribute(\"name\");\n if (name) {\n var i = name.lastIndexOf(\"[\");\n // if input name contains square brackets, then give the hidden input the same name,\n // replacing the contents of the last set of brackets with the given hiddenInput name\n if (i !== -1) hiddenInputName = \"\".concat(name.substr(0, i), \"[\").concat(hiddenInputName, \"]\");\n }\n this.hiddenInput = this._createEl(\"input\", {\n type: \"hidden\",\n name: hiddenInputName\n });\n wrapper.appendChild(this.hiddenInput);\n }\n }\n }, {\n key: \"_appendListItems\",\n value: function _appendListItems(countries, className) {\n // we create so many DOM elements, it is faster to build a temp string\n // and then add everything to the DOM in one go at the end\n var tmp = \"\";\n // for each country\n for (var i = 0; i < countries.length; i++) {\n var c = countries[i];\n // open the list item\n tmp += \"<li class='iti__country \".concat(className, \"' tabIndex='-1' id='iti-item-\").concat(c.iso2, \"' role='option' data-dial-code='\").concat(c.dialCode, \"' data-country-code='\").concat(c.iso2, \"'>\");\n // add the flag\n tmp += \"<div class='iti__flag-box'><div class='iti__flag iti__\".concat(c.iso2, \"'></div></div>\");\n // and the country name and dial code\n tmp += \"<span class='iti__country-name'>\".concat(c.name, \"</span>\");\n tmp += \"<span class='iti__dial-code'>+\".concat(c.dialCode, \"</span>\");\n // close the list item\n tmp += \"</li>\";\n }\n this.countryList.insertAdjacentHTML(\"beforeend\", tmp);\n }\n }, {\n key: \"_setInitialState\",\n value: function _setInitialState() {\n var val = this.telInput.value;\n var dialCode = this._getDialCode(val);\n var isRegionlessNanp = this._isRegionlessNanp(val);\n var _this$options = this.options, initialCountry = _this$options.initialCountry, nationalMode = _this$options.nationalMode, autoHideDialCode = _this$options.autoHideDialCode, separateDialCode = _this$options.separateDialCode;\n // if we already have a dial code, and it's not a regionlessNanp, we can go ahead and set the\n // flag, else fall back to the default country\n if (dialCode && !isRegionlessNanp) {\n this._updateFlagFromNumber(val);\n } else if (initialCountry !== \"auto\") {\n // see if we should select a flag\n if (initialCountry) {\n this._setFlag(initialCountry.toLowerCase());\n } else {\n if (dialCode && isRegionlessNanp) {\n // has intl dial code, is regionless nanp, and no initialCountry, so default to US\n this._setFlag(\"us\");\n } else {\n // no dial code and no initialCountry, so default to first in list\n this.defaultCountry = this.preferredCountries.length ? this.preferredCountries[0].iso2 : this.countries[0].iso2;\n if (!val) {\n this._setFlag(this.defaultCountry);\n }\n }\n }\n // if empty and no nationalMode and no autoHideDialCode then insert the default dial code\n if (!val && !nationalMode && !autoHideDialCode && !separateDialCode) {\n this.telInput.value = \"+\".concat(this.selectedCountryData.dialCode);\n }\n }\n // NOTE: if initialCountry is set to auto, that will be handled separately\n // format - note this wont be run after _updateDialCode as that's only called if no val\n if (val) this._updateValFromNumber(val);\n }\n }, {\n key: \"_initListeners\",\n value: function _initListeners() {\n this._initKeyListeners();\n if (this.options.autoHideDialCode) this._initBlurListeners();\n if (this.options.allowDropdown) this._initDropdownListeners();\n if (this.hiddenInput) this._initHiddenInputListener();\n }\n }, {\n key: \"_initHiddenInputListener\",\n value: function _initHiddenInputListener() {\n var _this3 = this;\n this._handleHiddenInputSubmit = function() {\n _this3.hiddenInput.value = _this3.getNumber();\n };\n if (this.telInput.form) this.telInput.form.addEventListener(\"submit\", this._handleHiddenInputSubmit);\n }\n }, {\n key: \"_getClosestLabel\",\n value: function _getClosestLabel() {\n var el = this.telInput;\n while (el && el.tagName !== \"LABEL\") {\n el = el.parentNode;\n }\n return el;\n }\n }, {\n key: \"_initDropdownListeners\",\n value: function _initDropdownListeners() {\n var _this4 = this;\n // hack for input nested inside label (which is valid markup): clicking the selected-flag to\n // open the dropdown would then automatically trigger a 2nd click on the input which would\n // close it again\n this._handleLabelClick = function(e) {\n // if the dropdown is closed, then focus the input, else ignore the click\n if (_this4.countryList.classList.contains(\"iti__hide\")) _this4.telInput.focus(); else e.preventDefault();\n };\n var label = this._getClosestLabel();\n if (label) label.addEventListener(\"click\", this._handleLabelClick);\n // toggle country dropdown on click\n this._handleClickSelectedFlag = function() {\n // only intercept this event if we're opening the dropdown\n // else let it bubble up to the top (\"click-off-to-close\" listener)\n // we cannot just stopPropagation as it may be needed to close another instance\n if (_this4.countryList.classList.contains(\"iti__hide\") && !_this4.telInput.disabled && !_this4.telInput.readOnly) {\n _this4._showDropdown();\n }\n };\n this.selectedFlag.addEventListener(\"click\", this._handleClickSelectedFlag);\n // open dropdown list if currently focused\n this._handleFlagsContainerKeydown = function(e) {\n var isDropdownHidden = _this4.countryList.classList.contains(\"iti__hide\");\n if (isDropdownHidden && [ \"ArrowUp\", \"Up\", \"ArrowDown\", \"Down\", \" \", \"Enter\" ].indexOf(e.key) !== -1) {\n // prevent form from being submitted if \"ENTER\" was pressed\n e.preventDefault();\n // prevent event from being handled again by document\n e.stopPropagation();\n _this4._showDropdown();\n }\n // allow navigation from dropdown to input on TAB\n if (e.key === \"Tab\") _this4._closeDropdown();\n };\n this.flagsContainer.addEventListener(\"keydown\", this._handleFlagsContainerKeydown);\n }\n }, {\n key: \"_initRequests\",\n value: function _initRequests() {\n var _this5 = this;\n // if the user has specified the path to the utils script, fetch it on window.load, else resolve\n if (this.options.utilsScript && !window.intlTelInputUtils) {\n // if the plugin is being initialised after the window.load event has already been fired\n if (window.intlTelInputGlobals.windowLoaded) {\n window.intlTelInputGlobals.loadUtils(this.options.utilsScript);\n } else {\n // wait until the load event so we don't block any other requests e.g. the flags image\n window.addEventListener(\"load\", function() {\n window.intlTelInputGlobals.loadUtils(_this5.options.utilsScript);\n });\n }\n } else this.resolveUtilsScriptPromise();\n if (this.options.initialCountry === \"auto\") this._loadAutoCountry(); else this.resolveAutoCountryPromise();\n }\n }, {\n key: \"_loadAutoCountry\",\n value: function _loadAutoCountry() {\n // 3 options:\n // 1) already loaded (we're done)\n // 2) not already started loading (start)\n // 3) already started loading (do nothing - just wait for loading callback to fire)\n if (window.intlTelInputGlobals.autoCountry) {\n this.handleAutoCountry();\n } else if (!window.intlTelInputGlobals.startedLoadingAutoCountry) {\n // don't do this twice!\n window.intlTelInputGlobals.startedLoadingAutoCountry = true;\n if (typeof this.options.geoIpLookup === \"function\") {\n this.options.geoIpLookup(function(countryCode) {\n window.intlTelInputGlobals.autoCountry = countryCode.toLowerCase();\n // tell all instances the auto country is ready\n // TODO: this should just be the current instances\n // UPDATE: use setTimeout in case their geoIpLookup function calls this callback straight\n // away (e.g. if they have already done the geo ip lookup somewhere else). Using\n // setTimeout means that the current thread of execution will finish before executing\n // this, which allows the plugin to finish initialising.\n setTimeout(function() {\n return forEachInstance(\"handleAutoCountry\");\n });\n }, function() {\n return forEachInstance(\"rejectAutoCountryPromise\");\n });\n }\n }\n }\n }, {\n key: \"_initKeyListeners\",\n value: function _initKeyListeners() {\n var _this6 = this;\n // update flag on keyup\n this._handleKeyupEvent = function() {\n if (_this6._updateFlagFromNumber(_this6.telInput.value)) {\n _this6._triggerCountryChange();\n }\n };\n this.telInput.addEventListener(\"keyup\", this._handleKeyupEvent);\n // update flag on cut/paste events (now supported in all major browsers)\n this._handleClipboardEvent = function() {\n // hack because \"paste\" event is fired before input is updated\n setTimeout(_this6._handleKeyupEvent);\n };\n this.telInput.addEventListener(\"cut\", this._handleClipboardEvent);\n this.telInput.addEventListener(\"paste\", this._handleClipboardEvent);\n }\n }, {\n key: \"_cap\",\n value: function _cap(number) {\n var max = this.telInput.getAttribute(\"maxlength\");\n return max && number.length > max ? number.substr(0, max) : number;\n }\n }, {\n key: \"_initBlurListeners\",\n value: function _initBlurListeners() {\n var _this7 = this;\n // on blur or form submit: if just a dial code then remove it\n this._handleSubmitOrBlurEvent = function() {\n _this7._removeEmptyDialCode();\n };\n if (this.telInput.form) this.telInput.form.addEventListener(\"submit\", this._handleSubmitOrBlurEvent);\n this.telInput.addEventListener(\"blur\", this._handleSubmitOrBlurEvent);\n }\n }, {\n key: \"_removeEmptyDialCode\",\n value: function _removeEmptyDialCode() {\n if (this.telInput.value.charAt(0) === \"+\") {\n var numeric = this._getNumeric(this.telInput.value);\n // if just a plus, or if just a dial code\n if (!numeric || this.selectedCountryData.dialCode === numeric) {\n this.telInput.value = \"\";\n }\n }\n }\n }, {\n key: \"_getNumeric\",\n value: function _getNumeric(s) {\n return s.replace(/\\D/g, \"\");\n }\n }, {\n key: \"_trigger\",\n value: function _trigger(name) {\n // have to use old school document.createEvent as IE11 doesn't support `new Event()` syntax\n var e = document.createEvent(\"Event\");\n e.initEvent(name, true, true);\n // can bubble, and is cancellable\n this.telInput.dispatchEvent(e);\n }\n }, {\n key: \"_showDropdown\",\n value: function _showDropdown() {\n this.countryList.classList.remove(\"iti__hide\");\n this.selectedFlag.setAttribute(\"aria-expanded\", \"true\");\n this._setDropdownPosition();\n // update highlighting and scroll to active list item\n if (this.activeItem) {\n this._highlightListItem(this.activeItem, false);\n this._scrollTo(this.activeItem, true);\n }\n // bind all the dropdown-related listeners: mouseover, click, click-off, keydown\n this._bindDropdownListeners();\n // update the arrow\n this.dropdownArrow.classList.add(\"iti__arrow--up\");\n this._trigger(\"open:countrydropdown\");\n }\n }, {\n key: \"_toggleClass\",\n value: function _toggleClass(el, className, shouldHaveClass) {\n if (shouldHaveClass && !el.classList.contains(className)) el.classList.add(className); else if (!shouldHaveClass && el.classList.contains(className)) el.classList.remove(className);\n }\n }, {\n key: \"_setDropdownPosition\",\n value: function _setDropdownPosition() {\n var _this8 = this;\n if (this.options.dropdownContainer) {\n this.options.dropdownContainer.appendChild(this.dropdown);\n }\n if (!this.isMobile) {\n var pos = this.telInput.getBoundingClientRect();\n // windowTop from https://stackoverflow.com/a/14384091/217866\n var windowTop = window.pageYOffset || document.documentElement.scrollTop;\n var inputTop = pos.top + windowTop;\n var dropdownHeight = this.countryList.offsetHeight;\n // dropdownFitsBelow = (dropdownBottom < windowBottom)\n var dropdownFitsBelow = inputTop + this.telInput.offsetHeight + dropdownHeight < windowTop + window.innerHeight;\n var dropdownFitsAbove = inputTop - dropdownHeight > windowTop;\n // by default, the dropdown will be below the input. If we want to position it above the\n // input, we add the dropup class.\n this._toggleClass(this.countryList, \"iti__country-list--dropup\", !dropdownFitsBelow && dropdownFitsAbove);\n // if dropdownContainer is enabled, calculate postion\n if (this.options.dropdownContainer) {\n // by default the dropdown will be directly over the input because it's not in the flow.\n // If we want to position it below, we need to add some extra top value.\n var extraTop = !dropdownFitsBelow && dropdownFitsAbove ? 0 : this.telInput.offsetHeight;\n // calculate placement\n this.dropdown.style.top = \"\".concat(inputTop + extraTop, \"px\");\n this.dropdown.style.left = \"\".concat(pos.left + document.body.scrollLeft, \"px\");\n // close menu on window scroll\n this._handleWindowScroll = function() {\n return _this8._closeDropdown();\n };\n window.addEventListener(\"scroll\", this._handleWindowScroll);\n }\n }\n }\n }, {\n key: \"_getClosestListItem\",\n value: function _getClosestListItem(target) {\n var el = target;\n while (el && el !== this.countryList && !el.classList.contains(\"iti__country\")) {\n el = el.parentNode;\n }\n // if we reached the countryList element, then return null\n return el === this.countryList ? null : el;\n }\n }, {\n key: \"_bindDropdownListeners\",\n value: function _bindDropdownListeners() {\n var _this9 = this;\n // when mouse over a list item, just highlight that one\n // we add the class \"highlight\", so if they hit \"enter\" we know which one to select\n this._handleMouseoverCountryList = function(e) {\n // handle event delegation, as we're listening for this event on the countryList\n var listItem = _this9._getClosestListItem(e.target);\n if (listItem) _this9._highlightListItem(listItem, false);\n };\n this.countryList.addEventListener(\"mouseover\", this._handleMouseoverCountryList);\n // listen for country selection\n this._handleClickCountryList = function(e) {\n var listItem = _this9._getClosestListItem(e.target);\n if (listItem) _this9._selectListItem(listItem);\n };\n this.countryList.addEventListener(\"click\", this._handleClickCountryList);\n // click off to close\n // (except when this initial opening click is bubbling up)\n // we cannot just stopPropagation as it may be needed to close another instance\n var isOpening = true;\n this._handleClickOffToClose = function() {\n if (!isOpening) _this9._closeDropdown();\n isOpening = false;\n };\n document.documentElement.addEventListener(\"click\", this._handleClickOffToClose);\n // listen for up/down scrolling, enter to select, or letters to jump to country name.\n // use keydown as keypress doesn't fire for non-char keys and we want to catch if they\n // just hit down and hold it to scroll down (no keyup event).\n // listen on the document because that's where key events are triggered if no input has focus\n var query = \"\";\n var queryTimer = null;\n this._handleKeydownOnDropdown = function(e) {\n // prevent down key from scrolling the whole page,\n // and enter key from submitting a form etc\n e.preventDefault();\n // up and down to navigate\n if (e.key === \"ArrowUp\" || e.key === \"Up\" || e.key === \"ArrowDown\" || e.key === \"Down\") _this9._handleUpDownKey(e.key); else if (e.key === \"Enter\") _this9._handleEnterKey(); else if (e.key === \"Escape\") _this9._closeDropdown(); else if (/^[a-zA-ZÀ-ÿа-яА-Я ]$/.test(e.key)) {\n // jump to countries that start with the query string\n if (queryTimer) clearTimeout(queryTimer);\n query += e.key.toLowerCase();\n _this9._searchForCountry(query);\n // if the timer hits 1 second, reset the query\n queryTimer = setTimeout(function() {\n query = \"\";\n }, 1e3);\n }\n };\n document.addEventListener(\"keydown\", this._handleKeydownOnDropdown);\n }\n }, {\n key: \"_handleUpDownKey\",\n value: function _handleUpDownKey(key) {\n var next = key === \"ArrowUp\" || key === \"Up\" ? this.highlightedItem.previousElementSibling : this.highlightedItem.nextElementSibling;\n if (next) {\n // skip the divider\n if (next.classList.contains(\"iti__divider\")) {\n next = key === \"ArrowUp\" || key === \"Up\" ? next.previousElementSibling : next.nextElementSibling;\n }\n this._highlightListItem(next, true);\n }\n }\n }, {\n key: \"_handleEnterKey\",\n value: function _handleEnterKey() {\n if (this.highlightedItem) this._selectListItem(this.highlightedItem);\n }\n }, {\n key: \"_searchForCountry\",\n value: function _searchForCountry(query) {\n for (var i = 0; i < this.countries.length; i++) {\n if (this._startsWith(this.countries[i].name, query)) {\n var listItem = this.countryList.querySelector(\"#iti-item-\".concat(this.countries[i].iso2));\n // update highlighting and scroll\n this._highlightListItem(listItem, false);\n this._scrollTo(listItem, true);\n break;\n }\n }\n }\n }, {\n key: \"_startsWith\",\n value: function _startsWith(a, b) {\n return a.substr(0, b.length).toLowerCase() === b;\n }\n }, {\n key: \"_updateValFromNumber\",\n value: function _updateValFromNumber(originalNumber) {\n var number = originalNumber;\n if (this.options.formatOnDisplay && window.intlTelInputUtils && this.selectedCountryData) {\n var useNational = !this.options.separateDialCode && (this.options.nationalMode || number.charAt(0) !== \"+\");\n var _intlTelInputUtils$nu = intlTelInputUtils.numberFormat, NATIONAL = _intlTelInputUtils$nu.NATIONAL, INTERNATIONAL = _intlTelInputUtils$nu.INTERNATIONAL;\n var format = useNational ? NATIONAL : INTERNATIONAL;\n number = intlTelInputUtils.formatNumber(number, this.selectedCountryData.iso2, format);\n }\n number = this._beforeSetNumber(number);\n this.telInput.value = number;\n }\n }, {\n key: \"_updateFlagFromNumber\",\n value: function _updateFlagFromNumber(originalNumber) {\n // if we're in nationalMode and we already have US/Canada selected, make sure the number starts\n // with a +1 so _getDialCode will be able to extract the area code\n // update: if we dont yet have selectedCountryData, but we're here (trying to update the flag\n // from the number), that means we're initialising the plugin with a number that already has a\n // dial code, so fine to ignore this bit\n var number = originalNumber;\n var selectedDialCode = this.selectedCountryData.dialCode;\n var isNanp = selectedDialCode === \"1\";\n if (number && this.options.nationalMode && isNanp && number.charAt(0) !== \"+\") {\n if (number.charAt(0) !== \"1\") number = \"1\".concat(number);\n number = \"+\".concat(number);\n }\n // update flag if user types area code for another country\n if (this.options.separateDialCode && selectedDialCode && number.charAt(0) !== \"+\") {\n number = \"+\".concat(selectedDialCode).concat(number);\n }\n // try and extract valid dial code from input\n var dialCode = this._getDialCode(number);\n var numeric = this._getNumeric(number);\n var countryCode = null;\n if (dialCode) {\n var countryCodes = this.countryCodes[this._getNumeric(dialCode)];\n // check if the right country is already selected. this should be false if the number is\n // longer than the matched dial code because in this case we need to make sure that if\n // there are multiple country matches, that the first one is selected (note: we could\n // just check that here, but it requires the same loop that we already have later)\n var alreadySelected = countryCodes.indexOf(this.selectedCountryData.iso2) !== -1 && numeric.length <= dialCode.length - 1;\n var isRegionlessNanpNumber = selectedDialCode === \"1\" && this._isRegionlessNanp(numeric);\n // only update the flag if:\n // A) NOT (we currently have a NANP flag selected, and the number is a regionlessNanp)\n // AND\n // B) the right country is not already selected\n if (!isRegionlessNanpNumber && !alreadySelected) {\n // if using onlyCountries option, countryCodes[0] may be empty, so we must find the first\n // non-empty index\n for (var j = 0; j < countryCodes.length; j++) {\n if (countryCodes[j]) {\n countryCode = countryCodes[j];\n break;\n }\n }\n }\n } else if (number.charAt(0) === \"+\" && numeric.length) {\n // invalid dial code, so empty\n // Note: use getNumeric here because the number has not been formatted yet, so could contain\n // bad chars\n countryCode = \"\";\n } else if (!number || number === \"+\") {\n // empty, or just a plus, so default\n countryCode = this.defaultCountry;\n }\n if (countryCode !== null) {\n return this._setFlag(countryCode);\n }\n return false;\n }\n }, {\n key: \"_isRegionlessNanp\",\n value: function _isRegionlessNanp(number) {\n var numeric = this._getNumeric(number);\n if (numeric.charAt(0) === \"1\") {\n var areaCode = numeric.substr(1, 3);\n return regionlessNanpNumbers.indexOf(areaCode) !== -1;\n }\n return false;\n }\n }, {\n key: \"_highlightListItem\",\n value: function _highlightListItem(listItem, shouldFocus) {\n var prevItem = this.highlightedItem;\n if (prevItem) prevItem.classList.remove(\"iti__highlight\");\n this.highlightedItem = listItem;\n this.highlightedItem.classList.add(\"iti__highlight\");\n if (shouldFocus) this.highlightedItem.focus();\n }\n }, {\n key: \"_getCountryData\",\n value: function _getCountryData(countryCode, ignoreOnlyCountriesOption, allowFail) {\n var countryList = ignoreOnlyCountriesOption ? allCountries : this.countries;\n for (var i = 0; i < countryList.length; i++) {\n if (countryList[i].iso2 === countryCode) {\n return countryList[i];\n }\n }\n if (allowFail) {\n return null;\n }\n throw new Error(\"No country data for '\".concat(countryCode, \"'\"));\n }\n }, {\n key: \"_setFlag\",\n value: function _setFlag(countryCode) {\n var prevCountry = this.selectedCountryData.iso2 ? this.selectedCountryData : {};\n // do this first as it will throw an error and stop if countryCode is invalid\n this.selectedCountryData = countryCode ? this._getCountryData(countryCode, false, false) : {};\n // update the defaultCountry - we only need the iso2 from now on, so just store that\n if (this.selectedCountryData.iso2) {\n this.defaultCountry = this.selectedCountryData.iso2;\n }\n this.selectedFlagInner.setAttribute(\"class\", \"iti__flag iti__\".concat(countryCode));\n // update the selected country's title attribute\n var title = countryCode ? \"\".concat(this.selectedCountryData.name, \": +\").concat(this.selectedCountryData.dialCode) : \"Unknown\";\n this.selectedFlag.setAttribute(\"title\", title);\n if (this.options.separateDialCode) {\n var dialCode = this.selectedCountryData.dialCode ? \"+\".concat(this.selectedCountryData.dialCode) : \"\";\n this.selectedDialCode.innerHTML = dialCode;\n // offsetWidth is zero if input is in a hidden container during initialisation\n var selectedFlagWidth = this.selectedFlag.offsetWidth || this._getHiddenSelectedFlagWidth();\n // add 6px of padding after the grey selected-dial-code box, as this is what we use in the css\n this.telInput.style.paddingLeft = \"\".concat(selectedFlagWidth + 6, \"px\");\n }\n // and the input's placeholder\n this._updatePlaceholder();\n // update the active list item\n if (this.options.allowDropdown) {\n var prevItem = this.activeItem;\n if (prevItem) {\n prevItem.classList.remove(\"iti__active\");\n prevItem.setAttribute(\"aria-selected\", \"false\");\n }\n if (countryCode) {\n var nextItem = this.countryList.querySelector(\"#iti-item-\".concat(countryCode));\n nextItem.setAttribute(\"aria-selected\", \"true\");\n nextItem.classList.add(\"iti__active\");\n this.activeItem = nextItem;\n this.selectedFlag.setAttribute(\"aria-activedescendant\", nextItem.getAttribute(\"id\"));\n }\n }\n // return if the flag has changed or not\n return prevCountry.iso2 !== countryCode;\n }\n }, {\n key: \"_getHiddenSelectedFlagWidth\",\n value: function _getHiddenSelectedFlagWidth() {\n // to get the right styling to apply, all we need is a shallow clone of the container,\n // and then to inject a deep clone of the selectedFlag element\n var containerClone = this.telInput.parentNode.cloneNode();\n containerClone.style.visibility = \"hidden\";\n document.body.appendChild(containerClone);\n var selectedFlagClone = this.selectedFlag.cloneNode(true);\n containerClone.appendChild(selectedFlagClone);\n var width = selectedFlagClone.offsetWidth;\n containerClone.parentNode.removeChild(containerClone);\n return width;\n }\n }, {\n key: \"_updatePlaceholder\",\n value: function _updatePlaceholder() {\n var shouldSetPlaceholder = this.options.autoPlaceholder === \"aggressive\" || !this.hadInitialPlaceholder && this.options.autoPlaceholder === \"polite\";\n if (window.intlTelInputUtils && shouldSetPlaceholder) {\n var numberType = intlTelInputUtils.numberType[this.options.placeholderNumberType];\n var placeholder = this.selectedCountryData.iso2 ? intlTelInputUtils.getExampleNumber(this.selectedCountryData.iso2, this.options.nationalMode, numberType) : \"\";\n placeholder = this._beforeSetNumber(placeholder);\n if (typeof this.options.customPlaceholder === \"function\") {\n placeholder = this.options.customPlaceholder(placeholder, this.selectedCountryData);\n }\n this.telInput.setAttribute(\"placeholder\", placeholder);\n }\n }\n }, {\n key: \"_selectListItem\",\n value: function _selectListItem(listItem) {\n // update selected flag and active list item\n var flagChanged = this._setFlag(listItem.getAttribute(\"data-country-code\"));\n this._closeDropdown();\n this._updateDialCode(listItem.getAttribute(\"data-dial-code\"), true);\n // focus the input\n this.telInput.focus();\n // put cursor at end - this fix is required for FF and IE11 (with nationalMode=false i.e. auto\n // inserting dial code), who try to put the cursor at the beginning the first time\n var len = this.telInput.value.length;\n this.telInput.setSelectionRange(len, len);\n if (flagChanged) {\n this._triggerCountryChange();\n }\n }\n }, {\n key: \"_closeDropdown\",\n value: function _closeDropdown() {\n this.countryList.classList.add(\"iti__hide\");\n this.selectedFlag.setAttribute(\"aria-expanded\", \"false\");\n // update the arrow\n this.dropdownArrow.classList.remove(\"iti__arrow--up\");\n // unbind key events\n document.removeEventListener(\"keydown\", this._handleKeydownOnDropdown);\n document.documentElement.removeEventListener(\"click\", this._handleClickOffToClose);\n this.countryList.removeEventListener(\"mouseover\", this._handleMouseoverCountryList);\n this.countryList.removeEventListener(\"click\", this._handleClickCountryList);\n // remove menu from container\n if (this.options.dropdownContainer) {\n if (!this.isMobile) window.removeEventListener(\"scroll\", this._handleWindowScroll);\n if (this.dropdown.parentNode) this.dropdown.parentNode.removeChild(this.dropdown);\n }\n this._trigger(\"close:countrydropdown\");\n }\n }, {\n key: \"_scrollTo\",\n value: function _scrollTo(element, middle) {\n var container = this.countryList;\n // windowTop from https://stackoverflow.com/a/14384091/217866\n var windowTop = window.pageYOffset || document.documentElement.scrollTop;\n var containerHeight = container.offsetHeight;\n var containerTop = container.getBoundingClientRect().top + windowTop;\n var containerBottom = containerTop + containerHeight;\n var elementHeight = element.offsetHeight;\n var elementTop = element.getBoundingClientRect().top + windowTop;\n var elementBottom = elementTop + elementHeight;\n var newScrollTop = elementTop - containerTop + container.scrollTop;\n var middleOffset = containerHeight / 2 - elementHeight / 2;\n if (elementTop < containerTop) {\n // scroll up\n if (middle) newScrollTop -= middleOffset;\n container.scrollTop = newScrollTop;\n } else if (elementBottom > containerBottom) {\n // scroll down\n if (middle) newScrollTop += middleOffset;\n var heightDifference = containerHeight - elementHeight;\n container.scrollTop = newScrollTop - heightDifference;\n }\n }\n }, {\n key: \"_updateDialCode\",\n value: function _updateDialCode(newDialCodeBare, hasSelectedListItem) {\n var inputVal = this.telInput.value;\n // save having to pass this every time\n var newDialCode = \"+\".concat(newDialCodeBare);\n var newNumber;\n if (inputVal.charAt(0) === \"+\") {\n // there's a plus so we're dealing with a replacement (doesn't matter if nationalMode or not)\n var prevDialCode = this._getDialCode(inputVal);\n if (prevDialCode) {\n // current number contains a valid dial code, so replace it\n newNumber = inputVal.replace(prevDialCode, newDialCode);\n } else {\n // current number contains an invalid dial code, so ditch it\n // (no way to determine where the invalid dial code ends and the rest of the number begins)\n newNumber = newDialCode;\n }\n } else if (this.options.nationalMode || this.options.separateDialCode) {\n // don't do anything\n return;\n } else {\n // nationalMode is disabled\n if (inputVal) {\n // there is an existing value with no dial code: prefix the new dial code\n newNumber = newDialCode + inputVal;\n } else if (hasSelectedListItem || !this.options.autoHideDialCode) {\n // no existing value and either they've just selected a list item, or autoHideDialCode is\n // disabled: insert new dial code\n newNumber = newDialCode;\n } else {\n return;\n }\n }\n this.telInput.value = newNumber;\n }\n }, {\n key: \"_getDialCode\",\n value: function _getDialCode(number) {\n var dialCode = \"\";\n // only interested in international numbers (starting with a plus)\n if (number.charAt(0) === \"+\") {\n var numericChars = \"\";\n // iterate over chars\n for (var i = 0; i < number.length; i++) {\n var c = number.charAt(i);\n // if char is number (https://stackoverflow.com/a/8935649/217866)\n if (!isNaN(parseInt(c, 10))) {\n numericChars += c;\n // if current numericChars make a valid dial code\n if (this.countryCodes[numericChars]) {\n // store the actual raw string (useful for matching later)\n dialCode = number.substr(0, i + 1);\n }\n if (numericChars.length === this.dialCodeMaxLen) {\n break;\n }\n }\n }\n }\n return dialCode;\n }\n }, {\n key: \"_getFullNumber\",\n value: function _getFullNumber() {\n var val = this.telInput.value.trim();\n var dialCode = this.selectedCountryData.dialCode;\n var prefix;\n var numericVal = this._getNumeric(val);\n if (this.options.separateDialCode && val.charAt(0) !== \"+\" && dialCode && numericVal) {\n // when using separateDialCode, it is visible so is effectively part of the typed number\n prefix = \"+\".concat(dialCode);\n } else {\n prefix = \"\";\n }\n return prefix + val;\n }\n }, {\n key: \"_beforeSetNumber\",\n value: function _beforeSetNumber(originalNumber) {\n var number = originalNumber;\n if (this.options.separateDialCode) {\n var dialCode = this._getDialCode(number);\n // if there is a valid dial code\n if (dialCode) {\n // in case _getDialCode returned an area code as well\n dialCode = \"+\".concat(this.selectedCountryData.dialCode);\n // a lot of numbers will have a space separating the dial code and the main number, and\n // some NANP numbers will have a hyphen e.g. +1 684-733-1234 - in both cases we want to get\n // rid of it\n // NOTE: don't just trim all non-numerics as may want to preserve an open parenthesis etc\n var start = number[dialCode.length] === \" \" || number[dialCode.length] === \"-\" ? dialCode.length + 1 : dialCode.length;\n number = number.substr(start);\n }\n }\n return this._cap(number);\n }\n }, {\n key: \"_triggerCountryChange\",\n value: function _triggerCountryChange() {\n this._trigger(\"countrychange\");\n }\n }, {\n key: \"handleAutoCountry\",\n value: function handleAutoCountry() {\n if (this.options.initialCountry === \"auto\") {\n // we must set this even if there is an initial val in the input: in case the initial val is\n // invalid and they delete it - they should see their auto country\n this.defaultCountry = window.intlTelInputGlobals.autoCountry;\n // if there's no initial value in the input, then update the flag\n if (!this.telInput.value) {\n this.setCountry(this.defaultCountry);\n }\n this.resolveAutoCountryPromise();\n }\n }\n }, {\n key: \"handleUtils\",\n value: function handleUtils() {\n // if the request was successful\n if (window.intlTelInputUtils) {\n // if there's an initial value in the input, then format it\n if (this.telInput.value) {\n this._updateValFromNumber(this.telInput.value);\n }\n this._updatePlaceholder();\n }\n this.resolveUtilsScriptPromise();\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n var form = this.telInput.form;\n if (this.options.allowDropdown) {\n // make sure the dropdown is closed (and unbind listeners)\n this._closeDropdown();\n this.selectedFlag.removeEventListener(\"click\", this._handleClickSelectedFlag);\n this.flagsContainer.removeEventListener(\"keydown\", this._handleFlagsContainerKeydown);\n // label click hack\n var label = this._getClosestLabel();\n if (label) label.removeEventListener(\"click\", this._handleLabelClick);\n }\n // unbind hiddenInput listeners\n if (this.hiddenInput && form) form.removeEventListener(\"submit\", this._handleHiddenInputSubmit);\n // unbind autoHideDialCode listeners\n if (this.options.autoHideDialCode) {\n if (form) form.removeEventListener(\"submit\", this._handleSubmitOrBlurEvent);\n this.telInput.removeEventListener(\"blur\", this._handleSubmitOrBlurEvent);\n }\n // unbind key events, and cut/paste events\n this.telInput.removeEventListener(\"keyup\", this._handleKeyupEvent);\n this.telInput.removeEventListener(\"cut\", this._handleClipboardEvent);\n this.telInput.removeEventListener(\"paste\", this._handleClipboardEvent);\n // remove attribute of id instance: data-intl-tel-input-id\n this.telInput.removeAttribute(\"data-intl-tel-input-id\");\n // remove markup (but leave the original input)\n var wrapper = this.telInput.parentNode;\n wrapper.parentNode.insertBefore(this.telInput, wrapper);\n wrapper.parentNode.removeChild(wrapper);\n delete window.intlTelInputGlobals.instances[this.id];\n }\n }, {\n key: \"getExtension\",\n value: function getExtension() {\n if (window.intlTelInputUtils) {\n return intlTelInputUtils.getExtension(this._getFullNumber(), this.selectedCountryData.iso2);\n }\n return \"\";\n }\n }, {\n key: \"getNumber\",\n value: function getNumber(format) {\n if (window.intlTelInputUtils) {\n var iso2 = this.selectedCountryData.iso2;\n return intlTelInputUtils.formatNumber(this._getFullNumber(), iso2, format);\n }\n return \"\";\n }\n }, {\n key: \"getNumberType\",\n value: function getNumberType() {\n if (window.intlTelInputUtils) {\n return intlTelInputUtils.getNumberType(this._getFullNumber(), this.selectedCountryData.iso2);\n }\n return -99;\n }\n }, {\n key: \"getSelectedCountryData\",\n value: function getSelectedCountryData() {\n return this.selectedCountryData;\n }\n }, {\n key: \"getValidationError\",\n value: function getValidationError() {\n if (window.intlTelInputUtils) {\n var iso2 = this.selectedCountryData.iso2;\n return intlTelInputUtils.getValidationError(this._getFullNumber(), iso2);\n }\n return -99;\n }\n }, {\n key: \"isValidNumber\",\n value: function isValidNumber() {\n var val = this._getFullNumber().trim();\n var countryCode = this.options.nationalMode ? this.selectedCountryData.iso2 : \"\";\n return window.intlTelInputUtils ? intlTelInputUtils.isValidNumber(val, countryCode) : null;\n }\n }, {\n key: \"setCountry\",\n value: function setCountry(originalCountryCode) {\n var countryCode = originalCountryCode.toLowerCase();\n // check if already selected\n if (!this.selectedFlagInner.classList.contains(\"iti__\".concat(countryCode))) {\n this._setFlag(countryCode);\n this._updateDialCode(this.selectedCountryData.dialCode, false);\n this._triggerCountryChange();\n }\n }\n }, {\n key: \"setNumber\",\n value: function setNumber(number) {\n // we must update the flag first, which updates this.selectedCountryData, which is used for\n // formatting the number before displaying it\n var flagChanged = this._updateFlagFromNumber(number);\n this._updateValFromNumber(number);\n if (flagChanged) {\n this._triggerCountryChange();\n }\n }\n }, {\n key: \"setPlaceholderNumberType\",\n value: function setPlaceholderNumberType(type) {\n this.options.placeholderNumberType = type;\n this._updatePlaceholder();\n }\n } ]);\n return Iti;\n }();\n /********************\n * STATIC METHODS\n ********************/\n // get the country data object\n intlTelInputGlobals.getCountryData = function() {\n return allCountries;\n };\n // inject a <script> element to load utils.js\n var injectScript = function injectScript(path, handleSuccess, handleFailure) {\n // inject a new script element into the page\n var script = document.createElement(\"script\");\n script.onload = function() {\n forEachInstance(\"handleUtils\");\n if (handleSuccess) handleSuccess();\n };\n script.onerror = function() {\n forEachInstance(\"rejectUtilsScriptPromise\");\n if (handleFailure) handleFailure();\n };\n script.className = \"iti-load-utils\";\n script.async = true;\n script.src = path;\n document.body.appendChild(script);\n };\n // load the utils script\n intlTelInputGlobals.loadUtils = function(path) {\n // 2 options:\n // 1) not already started loading (start)\n // 2) already started loading (do nothing - just wait for the onload callback to fire, which will\n // trigger handleUtils on all instances, invoking their resolveUtilsScriptPromise functions)\n if (!window.intlTelInputUtils && !window.intlTelInputGlobals.startedLoadingUtilsScript) {\n // only do this once\n window.intlTelInputGlobals.startedLoadingUtilsScript = true;\n // if we have promises, then return a promise\n if (typeof Promise !== \"undefined\") {\n return new Promise(function(resolve, reject) {\n return injectScript(path, resolve, reject);\n });\n }\n injectScript(path);\n }\n return null;\n };\n // default options\n intlTelInputGlobals.defaults = defaults;\n // version\n intlTelInputGlobals.version = \"16.1.0\";\n // convenience wrapper\n return function(input, options) {\n var iti = new Iti(input, options);\n iti._init();\n input.setAttribute(\"data-intl-tel-input-id\", iti.id);\n window.intlTelInputGlobals.instances[iti.id] = iti;\n return iti;\n };\n }();\n});","/**\n * Exposing intl-tel-input as a component\n */\nmodule.exports = require(\"./build/js/intlTelInput\");\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};","import { CustomInputElement } from './framework/CustomInputElement';\nimport { FileFieldElement } from './elements/FileField/FileFieldElement';\nimport ArrayUtil from './framework/Utilities/ArrayUtil';\nimport MakeRequest from './framework/Utilities/MakeRequest';\n\nexport class CustomForm {\n\taction: string;\n\tmethod: string;\n\t_nativeInputs: HTMLInputElement[];\n\n\tpublic onsubmit: ((this: CustomForm, promise: Promise<any>) => any) | null;\n\n\tconstructor(private form: HTMLFormElement) {\n\t\tthis.action = form.action || '';\n\t\tthis.method = form.method || 'get';\n\t\tthis.attachForm();\n\t\tthis.binGroupsToDependency();\n\t}\n\n\tget inputs(): CustomInputElement[] {\n\t\treturn ArrayUtil.FromNodeList(this.form.querySelectorAll('.group-container:not([hidden]) [custom-input]:not([hidden])'));\n\t}\n\tget nativeInputs(): HTMLInputElement[] {\n\t\tthis._nativeInputs =\n\t\t\tthis._nativeInputs ||\n\t\t\tArrayUtil.FromNodeList(this.form.querySelectorAll('input'));\n\t\treturn this._nativeInputs;\n\t}\n\n\tget hasFiles(): boolean {\n\t\treturn this.inputs.some(input => input instanceof FileFieldElement);\n\t}\n\n\tattachForm() {\n\t\tthis.form.onsubmit = event => {\n\t\t\tevent.preventDefault();\n\t\t\tlet valid = this.validate();\n\t\t\tif (valid) {\n\t\t\t\tif (this.onsubmit) {\n\t\t\t\t\tthis.onsubmit(this.submit());\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tvalidate(): boolean {\n\t\tthis.inputs.forEach(input => (<CustomInputElement>input).validate());\n\t\treturn this.inputs.every(input => (<CustomInputElement>input).valid);\n\t}\n\n\tsubmit(): Promise<any> {\n\t\tlet formData = {};\n\t\tconst headers: any = {};\n\t\tthis.inputs.map(i => (formData[i.name] = i.value));\n\t\tformData = this.extractData();\n\t\treturn new MakeRequest(this.action, this.method, headers).send(\n\t\t\tformData,\n\t\t);\n\t}\n\tprivate extractData(): FormData {\n\t\tconst formData: FormData = new FormData();\n\t\tfor (const input of this.inputs) {\n\t\t\tif (input instanceof FileFieldElement) {\n\t\t\t\tfor (let index = 0; index < input.value.length; index++) {\n\t\t\t\t\tconst file = input.value[index];\n\t\t\t\t\tformData.append(input.name, file, file.name);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tformData.append(`Values[${input.name}]`, input.value);\n\t\t\t}\n\t\t}\n\t\tfor (const input of this.nativeInputs) {\n\t\t\tif (input.name) {\n\t\t\t\tformData.append(input.name, input.value);\n\t\t\t}\n\t\t}\n\t\treturn formData;\n\t}\n\n\tprivate binGroupsToDependency() {\n\t\tlet groupContainers = this.form.querySelectorAll('div.group-container:not([data-depends-on=\"\"])',\n\t\t);\n\t\tgroupContainers.forEach((element: HTMLElement) => {\n\t\t\tlet dependentField = element.getAttribute('data-depends-on');\n\t\t\tlet dependentValue = element.getAttribute('data-dependent-value');\n\t\t\tlet customElement: CustomInputElement = document.forms[0].querySelector(`[name=\"${dependentField}\"]`) as CustomInputElement;\n\t\t\telement.setAttribute(\"hidden\", \"\");\n\t\t\tcustomElement.onChange.on(event => {\n\t\t\t\tif (event.value === dependentValue || event.value.indexOf(dependentValue) >= 0) {\n\t\t\t\t\tthis.showGroupAndItsDependencies(element);\n\t\t\t\t} else {\n\t\t\t\t\tthis.hideGroupAndItsDependencies(element);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate hideGroupAndItsDependencies(group: Element) {\n\t\tconst inputElementsInsideGroup = this.inputs.filter(input => this.isDescendant(group, input));\n\t\tgroup.setAttribute(\"hidden\", \"\");\n\t\tlet groupContainers = this.form.querySelectorAll('div.group-container:not([data-depends-on=\"\"])');\n\t\tgroupContainers.forEach(otherGroup => {\n\t\t\tif (otherGroup !== group) {\n\t\t\t\tlet groupDependsOnField = otherGroup.getAttribute('data-depends-on');\n\t\t\t\tinputElementsInsideGroup.forEach(input => {\n\t\t\t\t\tif (input.name === groupDependsOnField) {\n\t\t\t\t\t\tthis.hideGroupAndItsDependencies(otherGroup);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\tprivate showGroupAndItsDependencies(group: Element) {\n\t\tgroup.removeAttribute(\"hidden\");\n\t\tconst inputElementsInsideGroup = this.inputs.filter(input => this.isDescendant(group, input));\n\t\tlet groupContainers = this.form.querySelectorAll('div.group-container:not([data-depends-on=\"\"])');\n\t\tgroupContainers.forEach(otherGroup => {\n\t\t\tif (otherGroup !== group) {\n\t\t\t\tlet groupDependsOnField = otherGroup.getAttribute('data-depends-on');\n\t\t\t\tlet dependentValue = otherGroup.getAttribute('data-dependent-value');\n\t\t\t\tinputElementsInsideGroup.forEach(input => {\n\t\t\t\t\tif (input.name === groupDependsOnField && (input.value === dependentValue || input.value.indexOf(dependentValue) >= 0)) {\n\t\t\t\t\t\tthis.showGroupAndItsDependencies(otherGroup);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\tprivate isDescendant(parent: Element, child: Element) {\n\t\tvar node = child.parentNode;\n\t\twhile (node != null) {\n\t\t\tif (node === parent) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnode = node.parentElement;\n\t\t}\n\t\treturn false;\n\t}\n\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport Translator from '../../framework/Language/Translator';\nimport getAttributeNamesPolyfill from '../../framework/Polyfills/getAttributeNamesPolyfill';\nimport debouncer from \"../../framework/Utilities/debouncer\";\n\n@CustomElement({\n\tselector: 'address-element',\n\ttemplate: `\n\t\t\t<div class=\"address-wrapper\">\n\t\t\t\t<input class='address-part' id='address' type=\"text\" placeholder='Address'/>\n\t\t\t\t<input class='address-part' id='zip' type=\"text\" placeholder='Zip'/>\n\t\t\t\t<input class='address-part' id='city' type=\"text\" placeholder='City'/>\n\t\t\t\t<input class='address-part' id='country' type=\"text\" placeholder='Country'/>\n\t\t\t</div>`,\n\tstyle: `.address-wrapper{\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: nowrap;\n\t\t\t}\n\t\t\tinput.address-part{\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tborder: none;\n\t\t\t\tbackground-color: #f1f4ff;\n\t\t\t\tmargin: 2px;\n\t\t\t\tresize: none;\n\t\t\t\twidth:33% !important;\n\t\t\t}\n\t\t`,\n\ttemplatePath: './html.html',\n\tuseShadow: true,\n})\nexport class AddressElement extends CustomInputElement {\n\tprivate autoCompleteEnabled = false;\n\tprivate addressAutoComplete: google.maps.places.Autocomplete;\n\tprivate googlePlacesLibraryElement: HTMLScriptElement;\n\tprivate googlePlacesApiKey: string;\n\n\taddress: HTMLInputElement;\n\tcity: HTMLInputElement;\n\tcountry: HTMLInputElement;\n\tzip: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t\tgetAttributeNamesPolyfill();\n\t}\n\n\tget value(): string {\n\t\tlet address = this.address.value || '';\n\t\tlet city = this.city.value ? `,${this.city.value}` : '';\n\t\tlet zip = this.zip.value ? `,${this.zip.value}` : '';\n\t\tlet country = this.country.value ? `,${this.country.value}` : '';\n\t\treturn `${address}${city}${zip}${country}`;\n\t}\n\n\tset value(value: string) {\n\t\tconst values = value.split(',');\n\t\tthis.address.value = values[0];\n\t\tthis.city.value = values[1];\n\t\tthis.country.value = values[2];\n\t\tthis.zip.value = values[3];\n\t}\n\n\tget valid(): boolean {\n\t\treturn (\n\t\t\tthis.address.validity.valid &&\n\t\t\tthis.city.validity.valid &&\n\t\t\tthis.country.validity.valid &&\n\t\t\tthis.zip.validity.valid\n\t\t);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.initChildInputs();\n\t\tthis.getAttributeNames().forEach(attributeName => {\n\t\t\tlet attributeValue = this.getAttribute(attributeName);\n\t\t\tthis.attributeChanged(attributeName, null, attributeValue);\n\t\t});\n\t}\n\n\tinitChildInputs() {\n\t\tthis.address = super.getChildInput('#address');\n\t\tthis.city = super.getChildInput('#city');\n\t\tthis.country = super.getChildInput('#country');\n\t\tthis.zip = super.getChildInput('#zip');\n\t\tconst addressChaneDebounce = debouncer(this.change.bind(this), 400, false);\n\t\tthis.address.addEventListener('change', () => {\n\t\t\taddressChaneDebounce();\n\t\t});\n\t\tthis.city.addEventListener('change', this.change.bind(this));\n\t\tthis.country.addEventListener('change', this.change.bind(this));\n\t\tthis.zip.addEventListener('change', this.change.bind(this));\n\n\t\tif (this.required) {\n\t\t\tthis.address.setAttribute('required', '');\n\t\t\tthis.city.setAttribute('required', '');\n\t\t\tthis.country.setAttribute('required', '');\n\t\t\tthis.zip.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n\n\tchangeLanguage(language: string) {\n\t\tif (!this.address || !this.city || !this.country || !this.zip) {\n\t\t\treturn;\n\t\t}\n\t\tthis.address.placeholder = Translator.Translate('AddressElement.Address', language);\n\t\tthis.city.placeholder = Translator.Translate('AddressElement.City', language);\n\t\tthis.country.placeholder = Translator.Translate('AddressElement.Country', language);\n\t\tthis.zip.placeholder = Translator.Translate('AddressElement.Zip', language);\n\t}\n\n\tenableAutoComplete() {\n\t\tif (!this.googlePlacesApiKey || this.googlePlacesApiKey.trim() === '' || !this.autoCompleteEnabled) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.googlePlacesLibraryElement = document.querySelector<HTMLScriptElement>(`[src=\"https://maps.googleapis.com/maps/api/js?key=${this.googlePlacesApiKey}&libraries=places\"]`);\n\t\tif (this.googlePlacesLibraryElement) {\n\t\t\tthis.googlePlacesLibraryElementBindLoad();\n\t\t\treturn;\n\t\t}\n\t\tthis.googlePlacesLibraryElement = document.createElement('script');\n\t\tthis.googlePlacesLibraryElement.type = 'text/javascript';\n\t\tthis.googlePlacesLibraryElement.src = `https://maps.googleapis.com/maps/api/js?key=${this.googlePlacesApiKey}&libraries=places`;\n\t\twindow.document.head.appendChild(this.googlePlacesLibraryElement);\n\t\tthis.googlePlacesLibraryElementBindLoad();\n\t}\n\n\tprivate googlePlacesLibraryElementBindLoad() {\n\t\tthis.googlePlacesLibraryElement.addEventListener('load', () => {\n\t\t\tthis.bindAutoComplete();\n\t\t});\n\t}\n\n\tbindAutoComplete(): void {\n\t\tthis.addressAutoComplete = new google.maps.places.Autocomplete(this.address);\n\t\tthis.addressAutoComplete.addListener(\"place_changed\", this.onAddressChangedHandler.bind(this));\n\t}\n\n\tonAddressChangedHandler() {\n\t\tthis.city.value = '';\n\t\tthis.country.value = '';\n\t\tthis.zip.value = '';\n\n\t\tconst place = this.addressAutoComplete.getPlace();\n\t\tconsole.log(place);\n\t\tif (!place.address_components) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.address.value = place.name;\n\n\t\tconst cityComponents = place.address_components.filter(component => {\n\t\t\tconst citySynonyms = ['administrative_area_level_1', 'locality'];\n\t\t\tconst isCityComponent = citySynonyms.some(citySynonym => component.types.indexOf(citySynonym) != -1);\n\t\t\treturn isCityComponent;\n\t\t});\n\t\tif (cityComponents && cityComponents[0]) {\n\t\t\tthis.city.value = cityComponents[cityComponents.length - 1].long_name;\n\t\t}\n\n\t\tconst countryComponents = place.address_components.filter(component => component.types.indexOf('country') != -1);\n\t\tif (countryComponents && countryComponents[0]) {\n\t\t\tthis.country.value = countryComponents[countryComponents.length - 1].long_name;\n\t\t}\n\n\t\tconst zipComponents = place.address_components.filter(component => component.types.indexOf('postal_code') != -1);\n\t\tif (zipComponents && zipComponents[0]) {\n\t\t\tthis.zip.value = zipComponents[0].long_name;\n\t\t}\n\t\tthis.change(null);\n\t}\n\n\tstatic get observedAttributes() {\n\t\treturn ['language', 'google-places-key', 'enable-auto-complete'];\n\t}\n\tattributeChangedCallback(name: string, oldVal: string, newVal: string) {\n\t\tthis.attributeChanged(name, oldVal, newVal);\n\t}\n\tprivate attributeChanged(name: string, oldVal: string, newVal: string) {\n\t\tswitch (name) {\n\t\t\tcase 'language':\n\t\t\t\tthis.changeLanguage(newVal)\n\t\t\t\tbreak;\n\t\t\tcase 'google-places-key':\n\t\t\t\tthis.googlePlacesApiKey = newVal;\n\t\t\t\tthis.enableAutoComplete()\n\t\t\t\tbreak;\n\t\t\tcase 'enable-auto-complete':\n\t\t\t\tif (newVal && newVal != 'false') {\n\t\t\t\t\tthis.autoCompleteEnabled = true;\n\t\t\t\t\tthis.enableAutoComplete()\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport BankAccountValidator from '../../framework/Validation/Validators/BankAccount';\nimport BankAccountRegistrationNumberValidator from '../../framework/Validation/Validators/BankAccountRegistrationNumber';\nimport Translator from '../../framework/Language/Translator';\n\n@CustomElement({\n\tselector: 'bank-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='reg-number-field' placeholder='Bank Account Registration Number'/>\n\t\t\t\t<input type=\"text\" id='account-field' placeholder='Bank Account'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class BankFieldElement extends CustomInputElement {\n\taccount: HTMLInputElement;\n\tregNumber: HTMLInputElement;\n\tbankAccountValidator: BankAccountValidator = new BankAccountValidator();\n\tregNumberValidator: BankAccountRegistrationNumberValidator = new BankAccountRegistrationNumberValidator();\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\tlet account = this.account.value || '';\n\t\tlet regNumber = this.regNumber.value ? `,${this.regNumber.value}` : '';\n\t\treturn `${account}${regNumber}`;\n\t}\n\n\tset value(value: string) {\n\t\tconst values = value.split(',');\n\t\tthis.account.value = values[0];\n\t\tthis.regNumber.value = values[1];\n\t}\n\n\tget valid(): boolean {\n\t\treturn (\n\t\t\tthis.bankAccountValidator.isSatisfiedBy(\n\t\t\t\tthis.account.value,\n\t\t\t\t!this.required,\n\t\t\t) &&\n\t\t\tthis.regNumberValidator.isSatisfiedBy(\n\t\t\t\tthis.regNumber.value,\n\t\t\t\t!this.required,\n\t\t\t) &&\n\t\t\tthis.account.validity.valid &&\n\t\t\tthis.regNumber.validity.valid\n\t\t);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.initChildInputs();\n\t\tthis.getAttributeNames().forEach(attributeName => {\n\t\t\tlet attributeValue = this.getAttribute(attributeName);\n\t\t\tthis.attributeChanged(attributeName, null, attributeValue);\n\t\t});\n\t}\n\n\tchangeLanguage(language: string) {\n\t\tif (!this.account || !this.regNumber) {\n\t\t\treturn;\n\t\t}\n\t\tthis.account.placeholder = Translator.Translate('BankElement.Account', language);\n\t\tthis.regNumber.placeholder = Translator.Translate('BankElement.RegistrationNumber', language);\n\t}\n\n\tinitChildInputs() {\n\t\tthis.account = super.getChildInput('#account-field');\n\t\tthis.regNumber = super.getChildInput('#reg-number-field');\n\t\tthis.account.addEventListener('change', this.change.bind(this));\n\t\tthis.regNumber.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.account.setAttribute('required', '');\n\t\t\tthis.regNumber.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n\n\tstatic get observedAttributes() {\n\t\treturn ['language'];\n\t}\n\tattributeChangedCallback(name: string, oldVal: string, newVal: string) {\n\t\tthis.attributeChanged(name, oldVal, newVal);\n\t}\n\tprivate attributeChanged(name: string, oldVal: string, newVal: string) {\n\t\tswitch (name) {\n\t\t\tcase 'language':\n\t\t\t\tthis.changeLanguage(newVal)\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport CprValidator from '../../framework/Validation/Validators/CPR';\n\n@CustomElement({\n\tselector: 'cpr-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='cpr-field' placeholder='DDMMYY-SSSS'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class CPRElement extends CustomInputElement {\n\ttext: HTMLInputElement;\n\tvalidator: CprValidator = new CprValidator();\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.validator.isSatisfiedBy(this.value, !this.required);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#cpr-field');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport CprValidator from '../../framework/Validation/Validators/CPR';\nimport CvrValidator from '../../framework/Validation/Validators/CVR';\n\n@CustomElement({\n\tselector: 'cvr-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='cvr-field' placeholder='SSSSSSSS'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class CVRElement extends CustomInputElement {\n\ttext: HTMLInputElement;\n\tvalidator: CvrValidator = new CvrValidator();\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.validator.isSatisfiedBy(this.value, !this.required);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#cvr-field');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport { StringUtil } from '../../framework/Utilities/StringUtil';\n\n@CustomElement({\n\tselector: 'checkbox-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t</div>`,\n\tstyle: `\n\t\t\t:host{\n\t\t\t\twidth:100%;\n\t\t\t}\n\t\t\t.checkbox {\n\t\t\t\twidth: auto;\n\t\t\t\tmargin: auto 3px;\n\t\t\t\tcolor: rgba(72, 72, 72, 0.75);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t\tinput[type='checkbox']{\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\twidth: auto !important;\n\t\t\t\tborder: none;\n\t\t\t\tbackground-color: #f1f4ff;\n\t\t\t\tmargin: 2px;\n\t\t\t\tresize: none;\n\t\t\t}\n\t\t`,\n\tuseShadow: true,\n})\nexport class CheckBoxElement extends CustomInputElement {\n\tcheckbox: HTMLInputElement[];\n\tcheckboxTemplate = `\n\t<div class='checkbox'>\n\t\t<input type='checkbox' name='{0}' value=\"{1}\" id=\"{2}\"/>\n\t\t<label for=\"{2}\">{1}</label>\n\t</div>`;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string[] {\n\t\treturn this.checkbox.filter(c => c.checked).map(c => c.value);\n\t}\n\n\tset value(values: string[]) {\n\t\t// this.checkbox.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\tif (this.required) {\n\t\t\treturn this.value.length > 0;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.addCheckBoxes();\n\t\tthis.checkbox = super.getChildInputs(`[name='${this.name}']`);\n\t\tthis.checkbox.forEach(c =>\n\t\t\tc.addEventListener('change', this.change.bind(this)),\n\t\t);\n\t}\n\n\tprivate addCheckBoxes() {\n\t\tconst wrapper = super.getChildElement('.wrapper');\n\t\twrapper.innerHTML = \"\";\n\t\tthis.options.forEach((element, index) => {\n\t\t\twrapper.insertAdjacentHTML(\n\t\t\t\t'beforeend',\n\t\t\t\tStringUtil.StringFormat(\n\t\t\t\t\tthis.checkboxTemplate,\n\t\t\t\t\tthis.name,\n\t\t\t\t\telement,\n\t\t\t\t\t`${this.name}-${index}`,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'regex-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='regex-field'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class CustomRegularExpressionElement extends CustomInputElement {\n\ttext: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.text.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#regex-field');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t\tif (this.customValue) {\n\t\t\tthis.text.setAttribute('pattern', this.customValue);\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'date-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"date\" id='date-field'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class DateFieldElement extends CustomInputElement {\n\tdate: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn this.date.value;\n\t}\n\n\tset value(value: string) {\n\t\tthis.date.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.date.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.date = super.getChildInput('#date-field');\n\t\tthis.date.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.date.setAttribute('required', '');\n\t\t}\n\t\tif (this.max) {\n\t\t\tthis.date.setAttribute('max', this.max);\n\t\t}\n\t\tif (this.min) {\n\t\t\tthis.date.setAttribute('min', this.min);\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport { StringUtil } from '../../framework/Utilities/StringUtil';\n\n@CustomElement({\n\tselector: 'drop-down-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n <select id='select-list'>\n\t\t\t <option selected disabled>-</option>\n </select>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n justify-content: center;\n }\n .radio-button {\n width: auto;\n margin: auto 3px;\n display: flex;\n flex-grow: 0.1;\n justify-content: space-around;\n }\n select{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class DropDownListElement extends CustomInputElement {\n\tselect: HTMLInputElement;\n\toptionTemplate = `\n <option value='{0}'>\n {1}\n </option>`;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.select.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.select.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.select.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.select = super.getChildInput(`#select-list`);\n\t\tthis.addOptions();\n\t\tif (this.required) {\n\t\t\tthis.select.setAttribute('required', '');\n\t\t}\n\t\tif (this.multi) {\n\t\t\tthis.select.setAttribute('multiple', '');\n\t\t}\n\t\tthis.select.addEventListener('change', this.change.bind(this));\n\t}\n\n\tprivate addOptions() {\n\t\tthis.select.innerHTML = \"\";\n\t\tthis.options.forEach((element, index) => {\n\t\t\tthis.select.insertAdjacentHTML(\n\t\t\t\t'beforeend',\n\t\t\t\tStringUtil.StringFormat(this.optionTemplate, element, element),\n\t\t\t);\n\t\t});\n\t}\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import { AddressElement } from './Address/AddressElement';\nimport { TextFieldElement } from './TextField/TextFieldElement';\nimport { EmailFieldElement } from './EmailField/EmailFieldElement';\nimport { CheckBoxElement } from './CheckBoxElement/CheckBoxElement';\nimport { RadioButtonGroupElement } from './RadioButtonGroup/RadioButtonGroupElement';\nimport { TextAreaElement } from './TextAreaElement/TextAreaElement';\nimport { DropDownListElement } from './DropDownList/DropDownListElement';\nimport { FileFieldElement } from './FileField/FileFieldElement';\nimport { NumericFieldElement } from './NumericField/NumericFieldElement';\nimport { CustomRegularExpressionElement } from './CustomRegularExpression/CustomRegularExpressionElement';\nimport { DateFieldElement } from './DateField/DateFieldElement';\nimport { IntPhoneFieldElement } from './InternationaPhoneNumber/InternationaPhoneNumberElement';\nimport { CPRElement } from './CPRElement/CPRElement';\nimport { CVRElement } from './CVRElement/CVRElement';\nimport { IdentificationElement } from './IdentificationElement/IdentificationElement';\nimport { BankFieldElement } from './BankField/BankFieldElement';\nimport { TypeAheadElement } from './TypeAhead/TypeAheadElement';\n\nexport {\n\tAddressElement,\n\tTextFieldElement,\n\tEmailFieldElement,\n\tCheckBoxElement,\n\tRadioButtonGroupElement,\n\tTextAreaElement,\n\tDropDownListElement,\n\tFileFieldElement,\n\tNumericFieldElement,\n\tCustomRegularExpressionElement,\n\tDateFieldElement,\n\tIntPhoneFieldElement,\n\tCPRElement,\n\tCVRElement,\n\tIdentificationElement,\n\tBankFieldElement,\n\tTypeAheadElement\n};\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'email-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='email-field'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class EmailFieldElement extends CustomInputElement {\n\tmailRegex: RegExp = new RegExp(\n\t\t/^([a-zA-Z0-9ÆØÅæøå_.+-])+\\@(([a-zA-Z0-9ÆØÅæøå-])+\\.)+([a-zA-Z0-9ÆØÅæøå]{2,4})+$/,\n\t);\n\n\temail: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.email.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.email.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\tconst patternValid = !this.value || this.mailRegex.test(this.value);\n\t\treturn this.email.validity.valid && patternValid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.initChildInputs();\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.email = super.getChildInput('#email-field');\n\t\tthis.email.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.email.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport getAttributeNamesPolyfill from '../../framework/Polyfills/getAttributeNamesPolyfill';\n\n@CustomElement({\n\tselector: 'file-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"file\" id='file-field' accept=\"image/*,application/pdf\"/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class FileFieldElement extends CustomInputElement {\n\tfile: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t\tgetAttributeNamesPolyfill();\n\t}\n\n\tget value(): FileList {\n\t\treturn this.file.files;\n\t}\n\n\tset value(files: FileList) {\n\t\tthis.file.files = files;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.file.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.initChildInputs();\n\t\tsuper.connectedCallback();\n\t}\n\n\tcomponentDidMount() {\n\t\tthis.getAttributeNames().forEach(attributeName => {\n\t\t\tlet attributeValue = this.getAttribute(attributeName);\n\t\t\tthis.attributeChanged(attributeName, null, attributeValue);\n\t\t});\n\t}\n\n\tinitChildInputs() {\n\t\tthis.file = super.getChildInput('#file-field');\n\t\tthis.file.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.file.setAttribute('required', '');\n\t\t}\n\t\tif (this.multi) {\n\t\t\tthis.file.setAttribute('multiple', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n \n attributeChangedCallback(name: string, oldVal: string, newVal: string) {\n\t\tthis.attributeChanged(name, oldVal, newVal);\n\t}\n\tprivate attributeChanged(name: string, oldVal: string, newVal: string) {\n\t\tswitch (name) {\n\t\t\tcase 'accept':\n this.file.accept = newVal;\n break;\n\t\t}\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport CprValidator from '../../framework/Validation/Validators/CPR';\nimport IValidator from '../../framework/Validation/IValidator.interface';\nimport CvrValidator from '../../framework/Validation/Validators/CVR';\nimport BankIdSwedenValidator from '../../framework/Validation/Validators/BankIdSweden';\nimport BankIdNorwayValidator from '../../framework/Validation/Validators/BankIdNorway';\n\n@CustomElement({\n\tselector: 'id-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n <select id='id-type'>\n <option value='cvr'>Danish CVR</option>\n <option value='cpr'>Danish CPR</option>\n <option value='swe'>Sweden Bank Id</option>\n <option value='nor'>Norway Bank Id</option>\n </select>\n\t\t\t\t<input type=\"text\" id='id-field' placeholder=''/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input, select{\n box-sizing: border-box;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n input{\n width: 75% !important;\n }\n select{\n width: 25% !important;\n }\n `,\n\tuseShadow: true,\n})\nexport class IdentificationElement extends CustomInputElement {\n\ttypeSelector: HTMLInputElement;\n\ttext: HTMLInputElement;\n\n\ttype: string;\n\tvalidators: { [index: string]: IValidator } = {\n\t\tcpr: new CprValidator(),\n\t\tcvr: new CvrValidator(),\n\t\tswe: new BankIdSwedenValidator(),\n\t\tnor: new BankIdNorwayValidator(),\n\t};\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.validators[this.type].isSatisfiedBy(\n\t\t\tthis.value,\n\t\t\t!this.required,\n\t\t);\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#id-field');\n\t\tthis.typeSelector = super.getChildInput('#id-type');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tthis.typeSelector.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t\tthis.type = this.typeSelector.value;\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.type = this.typeSelector.value;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport * as intlTelInput from 'intl-tel-input';\nimport { Plugin } from 'intl-tel-input';\nimport MakeRequest from '../../framework/Utilities/MakeRequest';\n\n@CustomElement({\n\tselector: 'int-phone-element',\n\ttemplate: `\n <link rel=\"stylesheet\" type=\"text/css\" href=\"https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/16.0.0/css/intlTelInput.css\" >\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"tel\" id=\"phone-field\" />\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n .iti {\n width: 100% !important;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class IntPhoneFieldElement extends CustomInputElement {\n\tphone: HTMLInputElement;\n\tfullPhone: HTMLInputElement;\n\tintlTelInput: Plugin;\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn this.intlTelInput.getNumber();\n\t}\n\n\tset value(value: string) {\n\t\tthis.phone.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\tconst patternValid =\n\t\t\t!this.intlTelInput.getNumber() || this.intlTelInput.isValidNumber();\n\t\treturn patternValid && this.phone.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.setIntlTelInput();\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.phone.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.phone.setAttribute('required', '');\n\t\t}\n\t}\n\tsetIntlTelInput() {\n\t\tthis.phone = super.getChildInput('#phone-field');\n\t\tconst geoIpLookup = (success, failure) => {\n\t\t\treturn new MakeRequest(\n\t\t\t\t'https://ipinfo.io/json?token=8226138217a68a',\n\t\t\t\t'get',\n\t\t\t\t{ 'content-type': 'application/json' },\n\t\t\t)\n\t\t\t\t.send()\n\t\t\t\t.then((request: any) => {\n\t\t\t\t\tconst res = JSON.parse(request);\n\t\t\t\t\treturn success(res.country);\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\treturn success('DK');\n\t\t\t\t});\n\t\t};\n\t\tconst isIplookUpDisabled = this.getAttribute('data-disable-iplookup')?.toLowerCase() === \"true\";\n\t\tconst defaultCountry = isIplookUpDisabled ? 'dk' : 'auto';\n\t\tconst country = this.getAttribute('data-country')?.toLowerCase();\n\t\tthis.intlTelInput = intlTelInput(this.phone, {\n\t\t\tgeoIpLookup: isIplookUpDisabled ? null : geoIpLookup,\n\t\t\thiddenInput: 'fullphone',\n\t\t\tinitialCountry: country ?? defaultCountry,\n\t\t\tpreferredCountries: [\"dk\", \"se\", \"gb\"],\n\t\t\tnationalMode: true,\n\t\t\tutilsScript:\n\t\t\t\t'https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/15.0.1/js/utils.js',\n\t\t} as any);\n\t\tthis.intlTelInput.promise.then(e => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.fullPhone = super.getChildInput('[name=\"fullphone\"]');\n\t\t\t}, 1000);\n\t\t});\n\t}\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'numeric-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"number\" id='numeric-field'/>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n input{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class NumericFieldElement extends CustomInputElement {\n\tnumber: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): any {\n\t\tif (isNaN(this.number.valueAsNumber)) {\n\t\t\treturn '';\n\t\t}\n\t\treturn this.number.valueAsNumber;\n\t}\n\n\tset value(value: any) {\n\t\tthis.number.valueAsNumber = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.number.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.number = super.getChildInput('#numeric-field');\n\t\tthis.number.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.number.setAttribute('required', '');\n\t\t}\n\t\tif (this.max) {\n\t\t\tthis.number.setAttribute('max', this.max);\n\t\t}\n\t\tif (this.min) {\n\t\t\tthis.number.setAttribute('min', this.min);\n\t\t}\n\t\tif (this.step) {\n\t\t\tthis.number.setAttribute('step', this.step);\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport { StringUtil } from '../../framework/Utilities/StringUtil';\n\n@CustomElement({\n\tselector: 'radio-group-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t</div>`,\n\tstyle: `\n\t\t\t:host{\n\t\t\t\twidth:100%;\n\t\t\t}\n\t\t\t.radio-button {\n\t\t\t\twidth: auto;\n\t\t\t\tmargin: auto 3px;\n\t\t\t\tcolor: rgba(72, 72, 72, 0.75);\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t\tinput{\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\twidth: auto !important;\n\t\t\t\tborder: none;\n\t\t\t\tbackground-color: #f1f4ff;\n\t\t\t\tmargin: 2px;\n\t\t\t\tresize: none;\n\t\t\t}\n\t\t`,\n\tuseShadow: true,\n})\nexport class RadioButtonGroupElement extends CustomInputElement {\n\tradioButton: HTMLInputElement[];\n\tradioButtonTemplate = `\n\t<div class='radio-button'>\n\t\t<input type='radio' name='{0}' value=\"{1}\" id=\"{2}\" {3}/>\n\t\t<label for=\"{2}\">{1}</label>\n\t</div>`;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn this.radioButton.filter(c => c.checked).map(c => c.value)[0];\n\t}\n\n\tset value(value: string) {\n\t\tlet matchedRadio = this.radioButton.filter(c => c.value === value)[0];\n\t\tif (matchedRadio) {\n\t\t\tmatchedRadio.setAttribute('checked', '');\n\t\t}\n\t}\n\n\tget valid(): boolean {\n\t\tif (this.required) {\n\t\t\treturn this.radioButton.filter(c => c.checked).length > 0;\n\t\t} else {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.addRadioButtons();\n\t\tthis.radioButton = super.getChildInputs(`[name='${this.name}']`);\n\t\tthis.radioButton.forEach(radio =>\n\t\t\tradio.addEventListener('change', this.change.bind(this)),\n\t\t);\n\t}\n\n\tprivate addRadioButtons() {\n\t\tconst wrapper = super.getChildElement('.wrapper');\n\t\twrapper.innerHTML = \"\";\n\t\tthis.options.forEach((element, index) => {\n\t\t\twrapper.insertAdjacentHTML(\n\t\t\t\t'beforeend',\n\t\t\t\tStringUtil.StringFormat(\n\t\t\t\t\tthis.radioButtonTemplate,\n\t\t\t\t\tthis.name,\n\t\t\t\t\telement,\n\t\t\t\t\t`${this.name}-${index}`,\n\t\t\t\t\t`${this.required ? 'required' : ''}`,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t}\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'text-area-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<textarea rows=5 id='text-area-field'></textarea>\n\t\t\t</div>`,\n\tstyle: `\n :host{\n width:100%;\n }\n .wrapper{\n display:flex;\n }\n textarea{\n box-sizing: border-box;\n width: 100% !important;\n border: none;\n background-color: #f1f4ff;\n margin: 2px;\n resize: none;\n }\n `,\n\tuseShadow: true,\n})\nexport class TextAreaElement extends CustomInputElement {\n\ttext: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.text.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#text-area-field');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\n\n@CustomElement({\n\tselector: 'text-element',\n\ttemplate: `\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<input type=\"text\" id='text-field'/>\n\t\t\t</div>`,\n\tstyle: `\n\t:host{\n\t\t\twidth:100%;\n\t}\n\t.wrapper{\n\t\t\tdisplay:flex;\n\t}\n\tinput{\n\t\t\tbox-sizing: border-box;\n\t\t\twidth: 100% !important;\n\t\t\tborder: none;\n\t\t\tbackground-color: #f1f4ff;\n\t\t\tmargin: 2px;\n\t\t\tresize: none;\n\t}\n\t\t`,\n\tuseShadow: true,\n})\nexport class TextFieldElement extends CustomInputElement {\n\ttext: HTMLInputElement;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget value(): string {\n\t\treturn `${this.text.value}`;\n\t}\n\n\tset value(value: string) {\n\t\tthis.text.value = value;\n\t}\n\n\tget valid(): boolean {\n\t\treturn this.text.validity.valid;\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.text = super.getChildInput('#text-field');\n\t\tthis.text.addEventListener('change', this.change.bind(this));\n\t\tif (this.required) {\n\t\t\tthis.text.setAttribute('required', '');\n\t\t}\n\t}\n\n\t// events\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","import CustomElement from '../../framework/custom-element.decorator';\nimport { CustomInputElement } from '../../framework/CustomInputElement';\nimport { CustomElementEventArgs } from '../../framework/CustomEvents';\nimport OptionWithDescription from '../../framework/Models/OptionWithDescription';\nimport DomUtility from '../../framework/Utilities/DomUtility';\n\n@CustomElement({\n\tselector: 'type-ahead-element',\n\ttemplate: `\n\t\t<div class=\"wrapper\">\n\t\t\t<input type=\"text\" id=\"text-input\">\n\t\t\t<div id=\"description\"></div>\n\t\t</div>`,\n\tstyle: `\n\t\t:host {\n\t\t\twidth:100%;\n\t\t}\n\t\t.wrapper {\n\t\t\tposition: relative;\n\t\t\tdisplay:flex;\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t}\n\t\t#text-input {\n\t\t\tbox-sizing: border-box;\n\t\t\twidth: 100% !important;\n\t\t\tborder: none;\n\t\t\tbackground-color: #f1f4ff;\n\t\t\tmargin: 2px;\n\t\t\tresize: none;\n\t\t}\n\t\t.wrapper #description {\n\t\t\twidth: 100%;\n\t\t\tpadding: 0 2px;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\t\t.options-list {\n\t\t\tposition: absolute;\n\t\t\tborder: 1px solid #E8E8E8;\n\t\t\tborder-bottom: none;\n\t\t\tborder-top: none;\n\t\t\tz-index: 3;\n\t\t\ttop: 100%;\n\t\t\tleft: 0;\n\t\t\tright: 0;\n\t\t\tmax-height: 200px;\n\t\t\toverflow-y: auto;\n\t\t}\n\t\t.options-list-item {\n\t\t\tpadding: 10px;\n\t\t\tcursor: pointer;\n\t\t\tbackground-color: #FFFFFF;\n\t\t\tborder-bottom: 1px solid #E8E8E8;\n\t\t}\n\t\t.options-list-item:hover {\n\t\t\tbackground-color: #E8E8E8;\n\t\t}\n\t\t.options-list-item.active {\n\t\t\t/*when navigating through the items using the arrow keys:*/\n\t\t\tbackground-color: #003E64 !important;\n\t\t\tcolor: #FFFFFF;\n\t\t}\n\t\t.options-list-item-title {\n\t\t\tfont-size: 16px;\n\t\t}\n\t\t.options-list-item-description {\n\t\t\tfont-size: 10px;\n\t\t}\n\t`,\n\tuseShadow: true,\n})\nexport class TypeAheadElement extends CustomInputElement {\n\n\tprivate textInputElement: HTMLInputElement;\n\tprivate descriptionElement: HTMLElement;\n\tprivate componentWrapper: HTMLElement;\n\tprivate currentFoucsedIndex = -1;\n\n\tselectedOption: OptionWithDescription;\n\tsearchResultOptions: OptionWithDescription[] = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tprivate get searchHasResults(): boolean {\n\t\tconst autocompleteList = super.getChildElement('.options-list');\n\t\treturn autocompleteList && this.optionsWithDescriptions && this.optionsWithDescriptions.length > 0;\n\t}\n\n\tget value(): string {\n\t\tif (!this.selectedOption) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.selectedOption.value;\n\t}\n\n\tset value(value: string) {\n\t\tif (!this.optionsWithDescriptions || this.optionsWithDescriptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst option = this.optionsWithDescriptions.find(option => option.value === value);\n\t\tif (!option) {\n\t\t\tthis.descriptionElement.innerHTML = null;\n\t\t\treturn;\n\t\t}\n\t\tthis.selectedOption = option;\n\t\tthis.textInputElement.value = option.title;\n\t\tthis.descriptionElement.innerHTML = option.description;\n\t}\n\n\tget valid(): boolean {\n\t\tif (this.required) {\n\t\t\treturn !!this.selectedOption;\n\t\t}\n\t\treturn !!this.selectedOption || this.textInputElement.value === '';\n\t}\n\n\tconnectedCallback(): void {\n\t\tsuper.connectedCallback();\n\t}\n\n\tinitChildInputs() {\n\t\tthis.textInputElement = super.getChildInput('#text-input');\n\t\tthis.descriptionElement = super.getChildInput('#description');\n\t\tthis.componentWrapper = super.getChildElement('.wrapper');\n\t\tif (this.required) {\n\t\t\tthis.textInputElement.setAttribute('required', '');\n\t\t}\n\t\tthis.textInputElement.addEventListener('change', this.change.bind(this));\n\t\tthis.textInputElement.addEventListener('input', () => {\n\t\t\tthis.inputEventHandler();\n\t\t});\n\t\tthis.bindNavigation();\n\t}\n\n\tprivate inputEventHandler() {\n\t\tthis.selectedOption = null;\n\t\tthis.descriptionElement.innerHTML = null;\n\t\tthis.closeOptionsList();\n\t\tthis.searchResultOptions = [];\n\t\tconst searchValue = this.textInputElement.value;\n\t\tif (!searchValue || searchValue.trim() === '') {\n\t\t\treturn;\n\t\t}\n\t\tconst optionslist = document.createElement('div');\n\t\toptionslist.classList.add('options-list');\n\n\t\tif (!this.optionsWithDescriptions) {\n\t\t\treturn;\n\t\t}\n\t\tthis.optionsWithDescriptions.forEach((option: OptionWithDescription, index) => {\n\t\t\tvar regex = new RegExp(searchValue, 'gi');\n\t\t\tconst isMatchingTitle = regex.test(option.title);\n\t\t\tconst isMatchingValue = regex.test(option.value);\n\t\t\tconst isMatchingDescription = regex.test(option.description);\n\t\t\tif (!isMatchingTitle && !isMatchingValue && !isMatchingDescription) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.searchResultOptions.push(option);\n\t\t\tconst optionsListItem = document.createElement(\"div\");\n\t\t\toptionsListItem.classList.add('options-list-item');\n\t\t\toptionsListItem.dataset['value'] = option.value;\n\t\t\toptionslist.appendChild(optionsListItem);\n\t\t\tconst optionsListItemTitle = document.createElement(\"div\");\n\t\t\toptionsListItemTitle.classList.add('options-list-item-title');\n\t\t\toptionsListItemTitle.innerHTML = DomUtility.boldenText(option.title, searchValue);\n\t\t\toptionsListItem.appendChild(optionsListItemTitle);\n\t\t\tconst optionsListItemDescription = document.createElement(\"div\");\n\t\t\toptionsListItemDescription.classList.add('options-list-item-description');\n\t\t\toptionsListItemDescription.innerHTML = DomUtility.boldenText(option.description, searchValue);\n\t\t\toptionsListItem.appendChild(optionsListItemDescription);\n\t\t\toptionsListItem.addEventListener('click', () => {\n\t\t\t\tthis.optionSelectedHandler(option);\n\t\t\t});\n\t\t\tthis.componentWrapper.appendChild(optionslist);\n\t\t});\n\t}\n\n\tprivate closeOptionsList() {\n\t\tthis.currentFoucsedIndex = -1;\n\t\tconst optionsList = super.getChildElement('.options-list');\n\t\tif (!optionsList) {\n\t\t\treturn;\n\t\t}\n\t\toptionsList.remove();\n\t}\n\n\tprivate optionSelectedHandler(option: OptionWithDescription) {\n\t\tthis.value = option.value;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t\tthis.closeOptionsList();\n\t}\n\n\tprivate bindNavigation() {\n\t\tthis.textInputElement.addEventListener('keydown', (event) => {\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tthis.closeOptionsList();\n\t\t\t}\n\t\t\tif (event.key === 'ArrowDown') {\n\t\t\t\tif (!this.searchHasResults) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.currentFoucsedIndex = this.currentFoucsedIndex === this.searchResultOptions.length - 1 ? 0 : this.currentFoucsedIndex + 1;\n\t\t\t\tthis.highlightFocusedSearchResult();\n\t\t\t}\n\t\t\tif (event.key === 'ArrowUp') {\n\t\t\t\tif (!this.searchHasResults) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.currentFoucsedIndex = this.currentFoucsedIndex === 0 ? this.searchResultOptions.length - 1 : this.currentFoucsedIndex - 1;\n\t\t\t\tthis.highlightFocusedSearchResult();\n\t\t\t}\n\t\t\tif (event.key === 'Enter') {\n\t\t\t\tif (this.currentFoucsedIndex !== -1 && this.searchHasResults) {\n\t\t\t\t\tthis.optionSelectedHandler(this.searchResultOptions[this.currentFoucsedIndex]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thighlightFocusedSearchResult() {\n\t\tconst optionListItems = super.getChildElements('.options-list-item');\n\t\tif (!optionListItems) {\n\t\t\treturn;\n\t\t}\n\t\toptionListItems.forEach((listItem, index) => {\n\t\t\tlistItem.classList.remove('active');\n\t\t\tif (index === this.currentFoucsedIndex) {\n\t\t\t\tlistItem.classList.add('active');\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic change($event): void {\n\t\tthis.touched = true;\n\t\tthis.onChange.emit(new CustomElementEventArgs(this.value, 'change'));\n\t}\n\n\tpublic validate(): void {\n\t\tthis.valid;\n\t\tthis.onValidate.emit(\n\t\t\tnew CustomElementEventArgs(this.value, 'validate'),\n\t\t);\n\t}\n}\n","export interface Listener<T> {\n (event: T): any;\n}\n\nexport interface Disposable {\n dispose();\n}\n\nexport class CustomElementEventArgs {\n constructor(public value: any, public eventName: string) {}\n}\n/** passes through events as they happen. You will not get events from before you start listening */\nexport class CustomElementEvent<T> {\n private listeners: Listener<T>[] = [];\n private listenersOncer: Listener<T>[] = [];\n\n on = (listener: Listener<T>): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener),\n };\n };\n\n once = (listener: Listener<T>): void => {\n this.listenersOncer.push(listener);\n };\n\n off = (listener: Listener<T>) => {\n var callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n emit = (event: T) => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n if (this.listenersOncer.length > 0) {\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n }\n };\n\n pipe = (te: CustomElementEvent<T>): Disposable => {\n return this.on(e => te.emit(e));\n };\n}\n","import { CustomElementEvent, CustomElementEventArgs } from \"./CustomEvents\";\nimport OptionWithDescription from \"./Models/OptionWithDescription\";\nimport ArrayUtil from \"./Utilities/ArrayUtil\";\nimport DomUtil from \"./Utilities/DomUtil\";\n\nclass IDictionary<TValue> {\n\t[index: string]: TValue;\n}\nexport abstract class CustomInputElement extends HTMLElement {\n\tprivate dependentOnList = new IDictionary<boolean>();\n\tprivate visibilityState = true;\n\n\tprotected touched = false;\n\tprotected domUtil: DomUtil;\n\n\tprotected hasValueDependency: any;\n\tprotected noValueDependency: any;\n\tprotected dependencies: any[];\n\n\tpublic onChange = new CustomElementEvent<CustomElementEventArgs>();\n\tpublic onValidate = new CustomElementEvent<CustomElementEventArgs>();\n\tpublic onVisibilityChanged = new CustomElementEvent<CustomElementEventArgs>();\n\n\tpublic name: string;\n\tpublic options: any[];\n\tpublic optionsWithDescriptions: OptionWithDescription[];\n\tpublic required: boolean;\n\tpublic customValue: string;\n\tpublic allDependenciesMustBeMet: boolean = false;\n\tpublic multi: boolean = false;\n\tpublic max: any;\n\tpublic min: any;\n\tpublic step: any;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tabstract get value(): any;\n\tabstract set value(value);\n\tabstract get valid(): boolean;\n\n\tabstract initChildInputs(): void;\n\tabstract validate(): void;\n\tabstract change($event): void;\n\n\tcompareVlaues = [];\n\n\tisValueConditionMatched(val: any) {\n\t\tif (val && Array.isArray(val) && val.length) {\n\t\t\tlet result = false;\n\t\t\tval.forEach(element => {\n\t\t\t\tconst elementMatched = this.compareVlaues.findIndex(x => x == element) !== -1;\n\t\t\t\tif (elementMatched) {\n\t\t\t\t\tresult = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t\treturn this.compareVlaues.findIndex(x => x == val) !== -1;\n\t}\n\n\tconnectedCallback(): void {\n\t\tthis.init();\n\t\tthis.setAttributes();\n\t}\n\n\tinit(): void {\n\t\tthis.style.width = \"100%\";\n\t\tthis.domUtil = new DomUtil(this);\n\t\tthis.parseData();\n\t\tthis.initChildInputs();\n\t\tthis.bindEvents();\n\t\tthis.setAttributes();\n\n\t\twindow.addEventListener(\"load\", () => {\n\t\t\tthis.bindDependencies();\n\t\t});\n\t}\n\n\tprivate parseData(): void {\n\t\ttry {\n\t\t\tif (!(this.children[0] instanceof HTMLScriptElement)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet data = JSON.parse(this.children[0].innerHTML);\n\t\t\tthis.options = data.options;\n\t\t\tthis.optionsWithDescriptions = data.optionsWithDescriptions;\n\t\t\tthis.hasValueDependency = data.hasValueDependency;\n\t\t\tthis.noValueDependency = data.noValueDependency;\n\t\t\tthis.dependencies = data.dependencies;\n\t\t\tthis.required = data.required;\n\t\t\tthis.name = data.name;\n\t\t\tthis.allDependenciesMustBeMet = data.allDependenciesMustBeMet;\n\t\t\tthis.multi = data.multi;\n\t\t\tthis.max = data.max;\n\t\t\tthis.min = data.min;\n\t\t\tthis.step = data.step;\n\t\t\tthis.customValue = data.value;\n\t\t} catch (ex) {\n\t\t\tconsole.error(ex);\n\t\t}\n\t}\n\n\tprivate bindEvents(): void {\n\t\tthis.onValidate.on(e => {\n\t\t\tif (this.valid) {\n\t\t\t\tif (this.closest('.custom-validation-target')) {\n\t\t\t\t\tthis.closest('.custom-validation-target').classList.remove(\"invalid\");\n\t\t\t\t\tthis.closest('.custom-validation-target').classList.add(\"valid\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.closest('.custom-validation-target')) {\n\t\t\t\t\tthis.closest('.custom-validation-target').classList.add(\"invalid\");\n\t\t\t\t\tthis.closest('.custom-validation-target').classList.remove(\"valid\");\n\t\t\t\t}\n\t\t\t\tthis.domUtil.focus();\n\t\t\t}\n\t\t});\n\t\tthis.onChange.on(e => {\n\t\t\tif (this.touched) {\n\t\t\t\tthis.validate();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate setAttributes(): void {\n\t\tthis.setAttribute(\"custom-input\", \"\");\n\t\tthis.setAttribute(\"name\", this.name);\n\t}\n\n\tprivate bindDependencies(): void {\n\t\tif (this.hasValueDependency && this.hasValueDependency.items.length) {\n\t\t\tfor (const fieldName of this.hasValueDependency.items) {\n\t\t\t\tthis.bindDependency(fieldName, \"has\");\n\t\t\t}\n\t\t}\n\n\t\tif (this.noValueDependency && this.noValueDependency.items.length) {\n\t\t\tfor (const fieldName of this.noValueDependency.items) {\n\t\t\t\tthis.bindDependency(fieldName, \"no\");\n\t\t\t}\n\t\t}\n\n\t\tif (this.dependencies && this.dependencies.length) {\n\t\t\tfor (const index in this.dependencies) {\n\t\t\t\tif (this.dependencies.hasOwnProperty(index)) {\n\t\t\t\t\tconst dependency = this.dependencies[index];\n\t\t\t\t\tfor (const fieldName of dependency.items) {\n\t\t\t\t\t\tthis.bindDependency(\n\t\t\t\t\t\t\tfieldName,\n\t\t\t\t\t\t\t\"custom\",\n\t\t\t\t\t\t\tdependency.value,\n\t\t\t\t\t\t\tdependency.criteria,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate bindDependency(elementName: string, type: string, value?: string, criteria?: string,): void {\n\t\tlet element = document.querySelector(`[name=\"${elementName}\"]`) as CustomInputElement;\n\t\tif (element instanceof CustomInputElement) {\n\t\t\telement.compareVlaues.push(value);\n\t\t\tif (this.dependentOnList.hasOwnProperty(element.name)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet isVisibleByDefault = type === \"no\";\n\t\t\telement.RegisterDependentOn(this.name, isVisibleByDefault);\n\t\t\tthis.onChange.on(e => {\n\t\t\t\tlet IsConditionMatched = false;\n\t\t\t\tif (type === \"has\") {\n\t\t\t\t\tIsConditionMatched = !!e.value;\n\t\t\t\t}\n\t\t\t\tif (type === \"no\") {\n\t\t\t\t\tIsConditionMatched = !e.value;\n\t\t\t\t}\n\t\t\t\tif (type === \"custom\") {\n\t\t\t\t\tif (criteria === \"Exact\") {\n\t\t\t\t\t\tIsConditionMatched = element.isValueConditionMatched(e.value);\n\t\t\t\t\t} else if (criteria === \"LessThan\") {\n\t\t\t\t\t\tIsConditionMatched = e.value < value;\n\t\t\t\t\t} else if (criteria === \"MoreThan\") {\n\t\t\t\t\t\tIsConditionMatched = e.value > value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telement.DependentOnStateChanged(this.name, IsConditionMatched);\n\t\t\t});\n\t\t\tthis.onVisibilityChanged.on(e => {\n\t\t\t\tif (this.visibilityState) {\n\t\t\t\t\tthis.onChange.emit(\n\t\t\t\t\t\tnew CustomElementEventArgs(this.value, \"change\"),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\telement.DependentOnStateChanged(this.name, false);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate setVisibility() {\n\t\tif (this.allDependenciesMustBeMet) {\n\t\t\tthis.visibilityState = Object.values(this.dependentOnList).every(state => state);\n\t\t} else {\n\t\t\tthis.visibilityState = Object.values(this.dependentOnList).some(state => state);\n\t\t}\n\n\t\tif (this.visibilityState) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t\tthis.onVisibilityChanged.emit(new CustomElementEventArgs(this.value, \"VisibilityChanged\"));\n\t}\n\n\tprivate hide() {\n\t\tthis.setAttribute(\"hidden\", \"\");\n\t\tif (this.closest('.custom-validation-target')) {\n\t\t\tthis.closest('.custom-validation-target').setAttribute(\"hidden\", \"\");\n\t\t}\n\t}\n\n\tprivate show() {\n\t\tthis.removeAttribute(\"hidden\");\n\t\tif (this.closest('.custom-validation-target')) {\n\t\t\tthis.closest('.custom-validation-target').removeAttribute(\"hidden\");\n\t\t}\n\t}\n\n\tprotected getChildInput(selector: string): HTMLInputElement {\n\t\tlet element: any = this;\n\t\tif (this.shadowRoot) {\n\t\t\telement = this.shadowRoot;\n\t\t}\n\t\treturn element.querySelector(selector) as HTMLInputElement;\n\t}\n\n\tprotected getChildInputs(selector: string): HTMLInputElement[] {\n\t\tlet element: any = this;\n\t\tif (this.shadowRoot) {\n\t\t\telement = this.shadowRoot;\n\t\t}\n\t\treturn ArrayUtil.FromNodeList(\n\t\t\telement.querySelectorAll(selector),\n\t\t) as HTMLInputElement[];\n\t}\n\n\tprotected getChildElement(selector: string): HTMLElement {\n\t\tlet element: any = this;\n\t\tif (this.shadowRoot) {\n\t\t\telement = this.shadowRoot;\n\t\t}\n\t\treturn element.querySelector(selector) as HTMLElement;\n\t}\n\n\tprotected getChildElements(selector: string): HTMLElement[] {\n\t\tlet element: any = this;\n\t\tif (this.shadowRoot) {\n\t\t\telement = this.shadowRoot;\n\t\t}\n\t\treturn element.querySelectorAll(selector) as HTMLElement[];\n\t}\n\n\tpublic RegisterDependentOn(name: string, initialValue: boolean = false) {\n\t\tthis.dependentOnList[name] = initialValue;\n\t\tthis.setVisibility();\n\t}\n\n\tpublic DependentOnStateChanged(name: string, state: boolean) {\n\t\tif (this.dependentOnList.hasOwnProperty(name)) {\n\t\t\tthis.dependentOnList[name] = state;\n\t\t}\n\t\tthis.setVisibility();\n\t}\n}\n","export default abstract class BaseDictionary {\n\tabstract dictionary: any;\n\n\tget(key: string): string {\n\t\tconst keyParts = key.split('.');\n\t\tvar result: string | any = this.dictionary;\n\t\tkeyParts.forEach(keyPart => {\n\t\t\tresult = result[keyPart];\n\t\t\tif (!result) {\n\t\t\t\tresult = key;\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t}\n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class CzechDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adresa\",\n City: \"město\",\n Country: \"země\",\n Zip: \"poštovní směrovací číslo\"\n },\n BankElement: {\n Account: \"Účet\",\n RegistrationNumber: \"Registrační číslo\"\n }\n };\n\n}\n","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class DanishDictionary extends BaseDictionary {\n\n\tdictionary: any = {\n\t\tAddressElement: {\n\t\t\tAddress: \"adresse\",\n\t\t\tCity: \"by\",\n\t\t\tCountry: \"land\",\n\t\t\tZip: \"postnummer\"\n\t\t},\n\t\tBankElement: {\n\t\t\tAccount: \"Kontonummer\",\n\t\t\tRegistrationNumber: \"Registreringsnummer\"\n\t\t}\n\t};\n\n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class DutchDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adres\",\n City: \"stad\",\n Country: \"land\",\n Zip: \"postcode\"\n },\n BankElement: {\n Account: \"Bankrekening\",\n RegistrationNumber: \"Bankrekening Registratienummer\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class EnglishDictionary extends BaseDictionary {\n\n\tdictionary: any = {\n\t\tAddressElement: {\n\t\t\tAddress: \"address\",\n\t\t\tCity: \"city\",\n\t\t\tCountry: \"country\",\n\t\t\tZip: \"zip\"\n\t\t},\n\t\tBankElement: {\n\t\t\tAccount: \"Bank Account\",\n\t\t\tRegistrationNumber: \"Bank Account Registration Number\"\n\t\t}\n\t};\n\n}\n","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class EstonianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"aadress\",\n City: \"linn\",\n Country: \"riik\",\n Zip: \"postiindeks\"\n },\n BankElement: {\n Account: \"Pangakonto\",\n RegistrationNumber: \"Pangakonto registreerimisnumber\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class FinnishDictionary extends BaseDictionary {\n \n dictionary: any = {\n AddressElement: {\n Address: \"osoite\",\n City: \"kaupunki\",\n Country: \"maa\",\n Zip: \"postinumero\"\n },\n BankElement: {\n Account: \"Pankkitili\",\n RegistrationNumber: \"Pankkitilin rekisteröintinumero\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class FrenchDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adresse\",\n City: \"ville\",\n Country: \"pays\",\n Zip: \"code postal\"\n },\n BankElement: {\n Account: \"Compte bancaire\",\n RegistrationNumber: \"Numéro d'enregistrement du compte bancaire\"\n }\n };\n\n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class GermanDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"Adresse\",\n City: \"Stadt\",\n Country: \"Land\",\n Zip: \"Postleitzahl\"\n },\n BankElement: {\n Account: \"Bankkonto\",\n RegistrationNumber: \"Bankkontoregistrierungsnummer\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class GreekDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"διεύθυνση\",\n City: \"πόλη\",\n Country: \"χώρα\",\n Zip: \"ταχυδρομικός κώδικας\"\n },\n BankElement: {\n Account: \"Τραπεζικός λογαριασμός\",\n RegistrationNumber: \"Αριθμός εγγραφής τραπεζικού λογαριασμού\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class HungarianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"cím\",\n City: \"város\",\n Country: \"ország\",\n Zip: \"irányítószám\"\n },\n BankElement: {\n Account: \"Banki számla\",\n RegistrationNumber: \"Banki számla regisztrációs száma\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class IcelandicDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"heimilisfang\",\n City: \"borg\",\n Country: \"land\",\n Zip: \"póstnúmer\"\n },\n BankElement: {\n Account: \"Bankareikningur\",\n RegistrationNumber: \"Númer skráningar á bankareikningi\"\n }\n };\n\n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class ItalianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"indirizzo\",\n City: \"città\",\n Country: \"nazione\",\n Zip: \"codice postale\"\n },\n BankElement: {\n Account: \"conto bancario\",\n RegistrationNumber: \"Numero di registrazione del conto bancario\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class LatvianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adrese\",\n City: \"pilsēta\",\n Country: \"valsts\",\n Zip: \"pasta indekss\"\n },\n BankElement: {\n Account: \"Bankas konts\",\n RegistrationNumber: \"Bankas konta reģistrācijas numurs\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class LituanianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adresas\",\n City: \"miestas\",\n Country: \"šalis\",\n Zip: \"pašto kodas\"\n },\n BankElement: {\n Account: \"Banko sąskaita\",\n RegistrationNumber: \"Banko sąskaitos registracijos numeris\"\n }\n };\n\n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class NorwegianDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adresse\",\n City: \"by\",\n Country: \"land\",\n Zip: \"postnummer\"\n },\n BankElement: {\n Account: \"Bankkonto\",\n RegistrationNumber: \"Registreringsnummer for bankkonto\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class PolishDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adres\",\n City: \"miasto\",\n Country: \"kraj\",\n Zip: \"kod pocztowy\"\n },\n BankElement: {\n Account: \"Konto bankowe\",\n RegistrationNumber: \"Numer rejestracyjny konta bankowego\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class PortugueseDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"endereço\",\n City: \"cidade\",\n Country: \"país\",\n Zip: \"código postal\"\n },\n BankElement: {\n Account: \"Conta bancária\",\n RegistrationNumber: \"Número de registro da conta bancária\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class SpanishDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"dirección\",\n City: \"ciudad\",\n Country: \"país\",\n Zip: \"código postal\"\n },\n BankElement: {\n Account: \"Cuenta bancaria\",\n RegistrationNumber: \"Número de registro de cuenta bancaria\"\n }\n };\n \n}","import BaseDictionary from \"./Base/BaseDictionary\";\n\nexport default class SwedishDictionary extends BaseDictionary {\n\n dictionary: any = {\n AddressElement: {\n Address: \"adress\",\n City: \"stad\",\n Country: \"land\",\n Zip: \"postnummer\"\n },\n BankElement: {\n Account: \"Bankkonto\",\n RegistrationNumber: \"Bankkontoregistreringsnummer\"\n }\n };\n \n}","import DanishDictionary from \"./Languages/DanishDictionary\";\nimport EnglishDictionary from \"./Languages/EnglishDictionary\";\nimport CzechDictionary from \"./Languages/CzechDictionary\";\nimport GermanDictionary from \"./Languages/GermanDictionary\";\nimport GreekDictionary from \"./Languages/GreekDictionary\";\nimport SpanishDictionary from \"./Languages/SpanishDictionary\";\nimport EstonianDictionary from \"./Languages/EstonianDictionary\";\nimport FinnishDictionary from \"./Languages/FinnishDictionary\";\nimport FrenchDictionary from \"./Languages/FrenchDictionary\";\nimport HungarianDictionary from \"./Languages/HungarianDictionary\";\nimport IcelandicDictionary from \"./Languages/IcelandicDictionary\";\nimport ItalianDictionary from \"./Languages/ItalianDictionary\";\nimport LatvianDictionary from \"./Languages/LatvianDictionary\";\nimport LituanianDictionary from \"./Languages/LituanianDictionary\";\nimport DutchDictionary from \"./Languages/DutchDictionary\";\nimport NorwegianDictionary from \"./Languages/NorwegianDictionary\";\nimport PolishDictionary from \"./Languages/PolishDictionary\";\nimport PortugueseDictionary from \"./Languages/PortugueseDictionary\";\nimport SwedishDictionary from \"./Languages/SwedishDictionary\";\n\nexport default class Translator {\n\tprivate static langauges = [\n\t\t'en',\n\t\t'da',\n 'cs',\n 'de',\n 'el',\n 'es',\n 'et',\n 'fi',\n 'fr',\n 'hu',\n 'is',\n 'it',\n 'lt',\n 'lv',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'sv',\n\t];\n\n\tprivate static danishDictionary = new DanishDictionary();\n\tprivate static englishDictionary = new EnglishDictionary();\n private static czechDictionary = new CzechDictionary();\n private static germanDictionary = new GermanDictionary();\n private static greekDictionary = new GreekDictionary();\n private static spanishDictionary = new SpanishDictionary();\n private static estonianDictionary = new EstonianDictionary();\n private static finnishDictionary = new FinnishDictionary();\n private static frenchDictionary = new FrenchDictionary();\n private static hungarianDictionary = new HungarianDictionary();\n private static icelandicDictionary = new IcelandicDictionary();\n private static italianDictionary = new ItalianDictionary();\n private static latvianDictionary = new LatvianDictionary();\n private static lituanianDictionary = new LituanianDictionary();\n private static dutchDictionary = new DutchDictionary();\n private static norwegianDictionary = new NorwegianDictionary();\n private static polishDictionary = new PolishDictionary();\n private static portugueseDictionary = new PortugueseDictionary();\n private static swedishDictionary = new SwedishDictionary();\n\n\tstatic Translate(key: string, language = 'da'): string {\n\t\tlanguage = language.toLowerCase();\n\t\tconst isSupportedLanguage = Translator.langauges.indexOf(language) != -1;\n\t\tif (!isSupportedLanguage) {\n\t\t\tlanguage = 'da'\n\t\t}\n\t\tswitch (language) {\n\t\t\tcase 'da':\n\t\t\t\treturn this.danishDictionary.get(key);\n\t\t\tcase 'en':\n\t\t\t\treturn this.englishDictionary.get(key);\n case 'cs':\n return this.czechDictionary.get(key);\n case 'de':\n return this.germanDictionary.get(key);\n case 'el':\n return this.greekDictionary.get(key);\n case 'es':\n return this.spanishDictionary.get(key);\n case 'et':\n return this.estonianDictionary.get(key);\n case 'fi':\n return this.finnishDictionary.get(key);\n case 'fr':\n return this.frenchDictionary.get(key);\n case 'hu':\n return this.hungarianDictionary.get(key);\n case 'is':\n return this.icelandicDictionary.get(key);\n case 'it':\n return this.italianDictionary.get(key);\n case 'lt':\n return this.latvianDictionary.get(key);\n case 'lv':\n return this.lituanianDictionary.get(key);\n case 'nl':\n return this.dutchDictionary.get(key);\n case 'no':\n return this.norwegianDictionary.get(key);\n case 'pl':\n return this.polishDictionary.get(key);\n case 'pt':\n return this.portugueseDictionary.get(key);\n case 'sv':\n return this.swedishDictionary.get(key);\n\t\t}\n\t}\n}","export default function getAttributeNamesPolyfill() {\n\tif (Element.prototype.getAttributeNames == undefined) {\n\t\tElement.prototype.getAttributeNames = function () {\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar length = attributes.length;\n\t\t\tvar result = new Array(length);\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tresult[i] = attributes[i].name;\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t}\n};\n","export default class ArrayUtil {\n\tpublic static FromNodeList<T extends Node>(list: NodeListOf<T>): T[] {\n\t\treturn Array.prototype.concat.apply([], list as any);\n\t}\n\n\tprivate static addToCurrent<T>(chunks: T[][], item: T) {\n\t\tif (!chunks.length) {\n\t\t\tchunks[0] = [];\n\t\t}\n\t\tchunks[chunks.length - 1].push(item);\n\t}\n\n\tprivate static addToNew<T>(chunks: T[][], item: T) {\n\t\tchunks[chunks.length] = [];\n\t\tchunks[chunks.length - 1].push(item);\n\t}\n\n\tpublic static divideAccordingProperty<T>(array: T[], selector: (item: T) => any): T[][] {\n\t\tconst chunks = [];\n\t\tchunks[0] = [array[0]];\n\t\tarray.reduce((a, b) => {\n\t\t\tif (selector(a) === selector(b)) {\n\t\t\t\tthis.addToCurrent(chunks, b);\n\t\t\t} else {\n\t\t\t\tthis.addToNew(chunks, b);\n\t\t\t}\n\t\t\treturn b;\n\t\t});\n\t\treturn chunks;\n\t}\n}\n","import { ViewportUtil } from './ViewportUtil';\n\nexport default class DomUtil {\n private viewPortUtil: ViewportUtil;\n public element: Element;\n constructor(element: Element) {\n this.element = element;\n this.viewPortUtil = new ViewportUtil(this.element as HTMLElement);\n }\n\n public getDataAttr(attr: string, defaultvalue?: string): any {\n if (!this.element) {\n return null;\n }\n const value = this.element.getAttribute(`data-${attr}`);\n\n return value !== undefined ? value : defaultvalue;\n }\n\n public setDataAttr(attr: string, value: string): any {\n if (!this.element) {\n return null;\n }\n return this.element.setAttribute(`data-${attr}`, value);\n }\n\n public getAttr(attr: string, defaultvalue?: string): any {\n if (!this.element) {\n return null;\n }\n const value = this.element.getAttribute(attr);\n return value !== undefined ? value : defaultvalue;\n }\n\n public setAttr(attr: string, value: string): void {\n if (!this.element) {\n return null;\n }\n this.element.setAttribute(attr, value);\n }\n\n public removeAttr(attr: string): void {\n if (!this.element) {\n return null;\n }\n this.element.removeAttribute(attr);\n }\n\n public removeDataAttr(attr: string): void {\n if (!this.element) {\n return null;\n }\n this.element.removeAttribute(`data-${attr}`);\n }\n\n public hasAttr(attr: string): boolean {\n if (!this.element) {\n return null;\n }\n return this.element.hasAttribute(attr);\n }\n\n public shake(): void {\n this.appendClass('shake');\n setTimeout(() => {\n this.removeClass('shake');\n (this.element as HTMLInputElement).readOnly = false;\n }, 600);\n }\n\n public error(): void {\n this.appendClass('error');\n setTimeout(() => {\n this.removeClass('error');\n (this.element as HTMLInputElement).readOnly = false;\n }, 5000);\n }\n\n public focus(): void {\n if (!this.viewPortUtil.IsVisible()) {\n this.element.scrollIntoView();\n }\n }\n\n public removeClass(classname): void {\n this.element.classList.remove(classname);\n }\n\n public appendClass(classname): void {\n this.element.classList.add(classname);\n }\n\n public deleteElement(): void {\n if (!this.element) {\n return null;\n }\n this.element.remove();\n }\n\n public setChildElementByAttrName(name: string, value: string): void {\n const firstLetter = name.replace(/^\\w/, c => c.toUpperCase());\n const SubElement = this.element.querySelector(\n `[name=\"${firstLetter}\"]`,\n ) as HTMLInputElement;\n if (SubElement) {\n SubElement.value = value;\n }\n }\n\n public hasClass(className: string): boolean {\n return this.element.classList.contains(className);\n }\n\n public getStyle(ruleName: string) {\n return getComputedStyle(this.element)[ruleName];\n }\n}\n","export default class DomUtility {\n\n\t// https://stackoverflow.com/questions/1230445/javascript-regex-how-to-bold-specific-words-with-regex\n\tstatic boldenText(inputText: string, matchindTextToBolden: string) {\n\t\treturn inputText.replace(new RegExp('(^|)(' + matchindTextToBolden + ')(|$)', 'ig'), '$1<b>$2</b>$3');\n\t}\n}","export default class MakeRequest {\n method: string;\n url: string;\n headers: any;\n\n constructor(url: string, method: string = 'get', headers: any = {}) {\n this.method = method;\n this.url = url;\n this.headers = headers;\n }\n\n private setHeaders(httpRequest: XMLHttpRequest) {\n for (const header in this.headers) {\n httpRequest.setRequestHeader(header, this.headers[header]);\n }\n }\n\n send(data: any = null) {\n return new Promise((resolve, reject) => {\n const xmlHttpRequest = new XMLHttpRequest();\n xmlHttpRequest.open(this.method, this.url);\n this.setHeaders(xmlHttpRequest);\n xmlHttpRequest.onload = () => {\n if (\n xmlHttpRequest.status >= 200 &&\n xmlHttpRequest.status < 300\n ) {\n resolve(xmlHttpRequest.response);\n } else {\n reject({\n status: xmlHttpRequest.status,\n statusText: xmlHttpRequest.statusText,\n body: xmlHttpRequest.response,\n });\n }\n };\n xmlHttpRequest.onerror = () => {\n reject({\n status: xmlHttpRequest.status,\n statusText: xmlHttpRequest.statusText,\n body: xmlHttpRequest.response,\n });\n };\n xmlHttpRequest.send(data);\n });\n }\n}\n","export class StringUtil {\n\n constructor() {\n }\n\n public static StringFormat(str: string, ...args: string[]) {\n return str.replace(/{(\\d+)}/g, (match, index) => args[index] || '');\n }\n}","export class ViewportUtil {\n private element?: HTMLElement;\n constructor(element: HTMLElement = null) {\n this.element = element;\n }\n\n public IsVisible(): boolean {\n const bounds = this.element.getBoundingClientRect();\n return (\n ((bounds.top > 0 && bounds.top < innerHeight) ||\n (bounds.bottom > 0 && bounds.bottom < innerHeight)) &&\n ((bounds.left > 0 && bounds.left < innerWidth) ||\n (bounds.right > 0 && bounds.right < innerWidth))\n );\n }\n\n public IsPartiallyVisible() {\n const bounds = this.element.getBoundingClientRect();\n return (\n bounds.top >= 0 ||\n bounds.left >= 0 ||\n bounds.bottom <= innerHeight ||\n bounds.right <= innerWidth\n );\n }\n\n public IsOffsetVisible(offset: number = 300) {\n const bounds = this.element.getBoundingClientRect();\n // tslint:disable-next-line: max-line-length\n return (\n bounds.top + offset >= 0 ||\n bounds.left + offset >= 0 ||\n bounds.bottom - offset <= innerHeight ||\n bounds.right - offset <= innerWidth\n );\n }\n\n public WindowTop(offset: number = 0) {\n const YOffset =\n window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0;\n return offset <= YOffset;\n }\n}\n","type Procedure = (...args: any[]) => any;\n\ninterface Debounce {\n\t(...args: any[]): any;\n\tclear: () => void;\n\tflush: () => void;\n}\n\nconst debouncer = (func: Procedure, wait: number, immediate: boolean = false) => {\n\tlet timeout: number | null;\n\tlet args: any;\n\tlet context: any;\n\tlet result: any;\n\n\tconst later = () => {\n\t\ttimeout = null;\n\t\tif (!immediate) {\n\t\t\tresult = func.apply(context, args);\n\t\t\tcontext = args = null;\n\t\t}\n\t};\n\n\tconst debouncedFunc: Procedure = function (this: any) {\n\t\tcontext = this;\n\t\targs = arguments;\n\t\tconst callNow = immediate && !timeout;\n\n\t\tif (!timeout) {\n\t\t\ttimeout = window.setTimeout(later, wait);\n\t\t}\n\n\t\tif (callNow) {\n\t\t\tresult = func.apply(context, args);\n\t\t\tcontext = args = null;\n\t\t}\n\n\t\treturn result;\n\t};\n\n\tconst clear = () => {\n\t\tif (timeout) {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = null;\n\t\t}\n\t};\n\n\tconst flush = () => {\n\t\tif (timeout) {\n\t\t\tresult = func.apply(context, args);\n\t\t\tcontext = args = null;\n\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = null;\n\t\t}\n\t};\n\n\tconst debounced: Debounce = (() => {\n\t\tconst f: any = debouncedFunc;\n\t\tf.clear = clear;\n\t\tf.flush = flush;\n\t\treturn f;\n\t})();\n\n\treturn debounced;\n};\n\nexport default debouncer;","import IValidation from '../IValidator.interface';\n\nexport default class BankAccountValidator implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return true;\n }\n}\n","import IValidation from '../IValidator.interface';\n\nexport default class BankAccountRegistrationNumberValidator\n implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return true;\n }\n}\n","import IValidation from '../IValidator.interface';\n\nexport default class BankIdNorwayValidator implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return this.checkNoPersonnummer(input, allowEmpty);\n }\n\n private checkNoPersonnummer(\n input: string,\n allowEmpty: boolean = true,\n ): boolean {\n if (!input) {\n return allowEmpty;\n }\n const personnummer: string = input.replace(' ', '').replace('-', '');\n const regex: RegExp = new RegExp(\n /^(0[1-9]|1[0-9]|2[0-9]|3[0-1])(0[1-9]|1[0-2])(\\d{2})(\\d{5})$/,\n );\n return regex.test(personnummer);\n }\n}\n","import IValidation from '../IValidator.interface';\n\nexport default class BankIdSwedenValidator implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return this.checkSePersonnummer(input, allowEmpty);\n }\n\n private checkSePersonnummer(\n input: string,\n allowEmpty: boolean = true,\n ): boolean {\n if (!input) {\n return allowEmpty;\n }\n const personnummer: string = input.replace(' ', '').replace('-', '');\n const regex: RegExp = new RegExp(\n /^(19\\d{2}|20\\d{2})(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1])(\\d{4})$/,\n );\n return regex.test(personnummer);\n }\n}\n","import IValidation from '../IValidator.interface';\n\nexport default class CprValidator implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return this.checkCpr(input, allowEmpty);\n }\n private modulus11Multiply(value: number, index: number): number {\n const control: number[] = [4, 3, 2, 7, 6, 5, 4, 3, 2, 1];\n return control[index] * value;\n }\n\n private modulus11Exceptions(input: string): boolean {\n const exceptionDates: Date[] = [\n 1960,\n 1964,\n 1965,\n 1966,\n 1969,\n 1970,\n 1980,\n 1982,\n 1984,\n 1985,\n 1986,\n 1987,\n 1988,\n 1989,\n 1990,\n ].map(x => new Date(x, 0, 1)); // months are 0-indexed\n\n const cprDate: Date = this.getCprDate(input);\n\n return exceptionDates.some(x => x.getDate() === cprDate.getDate());\n }\n\n private checkCprDate(input: string): boolean {\n let year: number = +input.substr(4, 2) + 2000;\n year -= year > new Date().getFullYear() ? 100 : 0; // is 20xx or 19xx\n const month: number = +input.substr(2, 2) - 1;\n const day: number = +input.substr(0, 2);\n const date: Date = new Date(year, month, day);\n return (\n date.getFullYear() === year &&\n date.getMonth() === month &&\n date.getDate() === day\n );\n }\n\n private getCprDate(input: string): Date {\n let year: number = +input.substr(4, 2) + 2000;\n year -= year > new Date().getFullYear() ? 100 : 0; // is 20xx or 19xx\n const month: number = +input.substr(2, 2) - 1;\n const day: number = +input.substr(0, 2);\n return new Date(year, month, day);\n }\n\n private checkCpr(input: string, allowEmpty: boolean = true): boolean {\n if (!input) {\n return allowEmpty;\n }\n const cprnr: string = input.replace(' ', '').replace('-', '');\n if (!cprnr.match(/^\\d{10}$/)) {\n return false;\n }\n if (!this.checkCprDate(cprnr)) {\n return false;\n }\n if (this.modulus11Exceptions(cprnr)) {\n return true;\n }\n\n let output: number = 0;\n for (let i: number = 0; i < 10; i++) {\n output += this.modulus11Multiply(\n parseInt(cprnr.substr(i, 1), 10),\n i,\n );\n }\n\n return output % 11 === 0; // hvis output går op i 11, er det et gyldigt cpr.\n }\n}\n","import IValidation from '../IValidator.interface';\n\nexport default class CvrValidator implements IValidation {\n isSatisfiedBy(input: string, allowEmpty: boolean = true): boolean {\n return this.checkCvr(input, allowEmpty);\n }\n\n private checkCvr(input: string, allowEmpty: boolean = true): boolean {\n if (!allowEmpty && !input) return false;\n const cvrnr: string = input.replace(' ', '').replace('-', '');\n if (!cvrnr) {\n return allowEmpty;\n }\n if (!/^\\d{8}$/.test(cvrnr)) {\n return false;\n }\n\n // cvr numre kan åbenbart også modulus11 testes.\n let total: number = 0;\n\n [2, 7, 6, 5, 4, 3, 2, 1].forEach((elm, index) => {\n total += parseInt(cvrnr[index], 10) * elm;\n });\n\n return total % 11 === 0;\n }\n}\n","class elementConfig {\n\tselector: string;\n\ttemplate: string;\n\tstyle: string;\n\tuseShadow: boolean;\n\ttemplatePath?: string;\n}\n\nconst validateSelector = (selector: string) => {\n\tif (selector.indexOf('-') <= 0) {\n\t\tthrow new Error('You need at least 1 dash in the custom element name!');\n\t}\n};\n\nconst CustomElement = (config: elementConfig) => {\n\treturn (cls: any) => {\n\t\tvalidateSelector(config.selector);\n\t\tlet templateElement = document.createElement('template');\n\t\tif (!config.template) {\n\t\t\tthrow new Error('You need to pass a template for the element');\n\t\t}\n\t\ttemplateElement.innerHTML = `<style>${config.style}</style> ${\n\t\t\tconfig.template\n\t\t\t}`;\n\t\tlet connectedCallback = cls.prototype.connectedCallback || function () { };\n\t\tconst disconnectedCallback = cls.prototype.disconnectedCallback || function () { };\n\n\t\tcls.prototype.connectedCallback = function () {\n\t\t\tlet clone = document.importNode(templateElement.content, true);\n\t\t\tif (config.useShadow && !this.shadowRoot) {\n\t\t\t\tthis.attachShadow({ mode: 'open' }).appendChild(clone);\n\t\t\t} else {\n\t\t\t\tthis.appendChild(clone);\n\t\t\t}\n\t\t\tif (this.componentWillMount) {\n\t\t\t\tthis.componentWillMount();\n\t\t\t}\n\t\t\tconnectedCallback.call(this);\n\t\t\tif (this.componentDidMount) {\n\t\t\t\tthis.componentDidMount();\n\t\t\t}\n\t\t};\n\n\t\tcls.prototype.disconnectedCallback = function () {\n\t\t\tif (this.componentWillUnmount) {\n\t\t\t\tthis.componentWillUnmount();\n\t\t\t}\n\t\t\tdisconnectedCallback.call(this);\n\t\t\tif (this.componentDidUnmount) {\n\t\t\t\tthis.componentDidUnmount();\n\t\t\t}\n\t\t};\n\t\twindow.customElements.define(config.selector, cls);\n\t};\n};\n\nexport default CustomElement;\n","import '@webcomponents/webcomponentsjs/webcomponents-bundle';\nimport '@webcomponents/webcomponentsjs/custom-elements-es5-adapter.js';\nimport '@webcomponents/webcomponentsjs/webcomponents-loader.js';\n\n// form\nimport { CustomForm } from './custom-form';\nimport { CustomInputElement } from './framework/CustomInputElement';\n\n// elements\nimport * as elements from './elements/Elements';\n\nexport { CustomForm, elements, CustomInputElement };\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkZW1vL2luZGV4LnRzIiwibm9kZV9tb2R1bGVzL0B3ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9jdXN0b20tZWxlbWVudHMtZXM1LWFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvQHdlYmNvbXBvbmVudHMvd2ViY29tcG9uZW50c2pzL3dlYmNvbXBvbmVudHMtYnVuZGxlLmpzIiwibm9kZV9tb2R1bGVzL0B3ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy93ZWJjb21wb25lbnRzLWxvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXRlbC1pbnB1dC9idWlsZC9qcy9pbnRsVGVsSW5wdXQuanMiLCJub2RlX21vZHVsZXMvaW50bC10ZWwtaW5wdXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJzcmMvY3VzdG9tLWZvcm0udHMiLCJzcmMvZWxlbWVudHMvQWRkcmVzcy9BZGRyZXNzRWxlbWVudC50cyIsInNyYy9lbGVtZW50cy9CYW5rRmllbGQvQmFua0ZpZWxkRWxlbWVudC50cyIsInNyYy9lbGVtZW50cy9DUFJFbGVtZW50L0NQUkVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvQ1ZSRWxlbWVudC9DVlJFbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL0NoZWNrQm94RWxlbWVudC9DaGVja0JveEVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvQ3VzdG9tUmVndWxhckV4cHJlc3Npb24vQ3VzdG9tUmVndWxhckV4cHJlc3Npb25FbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL0RhdGVGaWVsZC9EYXRlRmllbGRFbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL0Ryb3BEb3duTGlzdC9Ecm9wRG93bkxpc3RFbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL0VsZW1lbnRzLnRzIiwic3JjL2VsZW1lbnRzL0VtYWlsRmllbGQvRW1haWxGaWVsZEVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvRmlsZUZpZWxkL0ZpbGVGaWVsZEVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvSWRlbnRpZmljYXRpb25FbGVtZW50L0lkZW50aWZpY2F0aW9uRWxlbWVudC50cyIsInNyYy9lbGVtZW50cy9JbnRlcm5hdGlvbmFQaG9uZU51bWJlci9JbnRlcm5hdGlvbmFQaG9uZU51bWJlckVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvTnVtZXJpY0ZpZWxkL051bWVyaWNGaWVsZEVsZW1lbnQudHMiLCJzcmMvZWxlbWVudHMvUmFkaW9CdXR0b25Hcm91cC9SYWRpb0J1dHRvbkdyb3VwRWxlbWVudC50cyIsInNyYy9lbGVtZW50cy9UZXh0QXJlYUVsZW1lbnQvVGV4dEFyZWFFbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL1RleHRGaWVsZC9UZXh0RmllbGRFbGVtZW50LnRzIiwic3JjL2VsZW1lbnRzL1R5cGVBaGVhZC9UeXBlQWhlYWRFbGVtZW50LnRzIiwic3JjL2ZyYW1ld29yay9DdXN0b21FdmVudHMudHMiLCJzcmMvZnJhbWV3b3JrL0N1c3RvbUlucHV0RWxlbWVudC50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL0Jhc2UvQmFzZURpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9DemVjaERpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9EYW5pc2hEaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvRHV0Y2hEaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvRW5nbGlzaERpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9Fc3RvbmlhbkRpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9GaW5uaXNoRGljdGlvbmFyeS50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL0ZyZW5jaERpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9HZXJtYW5EaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvR3JlZWtEaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvSHVuZ2FyaWFuRGljdGlvbmFyeS50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL0ljZWxhbmRpY0RpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9JdGFsaWFuRGljdGlvbmFyeS50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL0xhdHZpYW5EaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvTGl0dWFuaWFuRGljdGlvbmFyeS50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL05vcndlZ2lhbkRpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9Qb2xpc2hEaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9MYW5ndWFnZXMvUG9ydHVndWVzZURpY3Rpb25hcnkudHMiLCJzcmMvZnJhbWV3b3JrL0xhbmd1YWdlL0xhbmd1YWdlcy9TcGFuaXNoRGljdGlvbmFyeS50cyIsInNyYy9mcmFtZXdvcmsvTGFuZ3VhZ2UvTGFuZ3VhZ2VzL1N3ZWRpc2hEaWN0aW9uYXJ5LnRzIiwic3JjL2ZyYW1ld29yay9MYW5ndWFnZS9UcmFuc2xhdG9yLnRzIiwic3JjL2ZyYW1ld29yay9Qb2x5ZmlsbHMvZ2V0QXR0cmlidXRlTmFtZXNQb2x5ZmlsbC50cyIsInNyYy9mcmFtZXdvcmsvVXRpbGl0aWVzL0FycmF5VXRpbC50cyIsInNyYy9mcmFtZXdvcmsvVXRpbGl0aWVzL0RvbVV0aWwudHMiLCJzcmMvZnJhbWV3b3JrL1V0aWxpdGllcy9Eb21VdGlsaXR5LnRzIiwic3JjL2ZyYW1ld29yay9VdGlsaXRpZXMvTWFrZVJlcXVlc3QudHMiLCJzcmMvZnJhbWV3b3JrL1V0aWxpdGllcy9TdHJpbmdVdGlsLnRzIiwic3JjL2ZyYW1ld29yay9VdGlsaXRpZXMvVmlld3BvcnRVdGlsLnRzIiwic3JjL2ZyYW1ld29yay9VdGlsaXRpZXMvZGVib3VuY2VyLnRzIiwic3JjL2ZyYW1ld29yay9WYWxpZGF0aW9uL1ZhbGlkYXRvcnMvQmFua0FjY291bnQudHMiLCJzcmMvZnJhbWV3b3JrL1ZhbGlkYXRpb24vVmFsaWRhdG9ycy9CYW5rQWNjb3VudFJlZ2lzdHJhdGlvbk51bWJlci50cyIsInNyYy9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0JhbmtJZE5vcndheS50cyIsInNyYy9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0JhbmtJZFN3ZWRlbi50cyIsInNyYy9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0NQUi50cyIsInNyYy9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0NWUi50cyIsInNyYy9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yLnRzIiwic3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7QUNBQSx3Q0FBc0Q7QUFHdEQsUUFBUSxDQUFDLGtCQUFrQixHQUFHO0lBQzFCLElBQUksUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7UUFDcEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxrQkFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQUEsT0FBTztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQUEsUUFBUSxJQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztLQUNMO0FBQ0wsQ0FBQyxDQUFDOzs7QUNWRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNwQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7YUFDNUI7WUFDRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQzNCO1FBQ0YsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixrQkFBZSxhQUFhLENBQUM7Ozs7OztBQ3hEN0IsK0RBQTZEO0FBQzdELHlFQUF1RTtBQUN2RSxrRUFBZ0U7QUFFaEUsT0FBTztBQUNQLDZDQUEyQztBQU1sQywyRkFOQSx3QkFBVSxPQU1BO0FBTG5CLHFFQUFvRTtBQUtyQyxtR0FMdEIsdUNBQWtCLE9BS3NCO0FBSGpELFdBQVc7QUFDWCw4Q0FBZ0Q7QUFFM0IsNEJBQVEiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJpbXBvcnQgeyBDdXN0b21Gb3JtLCBlbGVtZW50cyB9IGZyb20gJy4vLi4vc3JjL2luZGV4JztcblxuXG5kb2N1bWVudC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgbGV0IGZvcm0gPSBuZXcgQ3VzdG9tRm9ybShkb2N1bWVudC5mb3Jtc1swXSk7XG4gICAgICAgIGZvcm0ub25zdWJtaXQgPSBwcm9taXNlID0+IHtcbiAgICAgICAgICAgIHByb21pc2UudGhlbihyZXNwb25zZSA9PiB7IH0pO1xuICAgICAgICB9O1xuICAgIH1cbn07XG4iLCIvKipcbkBsaWNlbnNlIEBub2NvbXBpbGVcbkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG4oZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIChmdW5jdGlvbigpe2lmKHZvaWQgMD09PXdpbmRvdy5SZWZsZWN0fHx2b2lkIDA9PT13aW5kb3cuY3VzdG9tRWxlbWVudHN8fHdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXJldHVybjtjb25zdCBhPUhUTUxFbGVtZW50O3dpbmRvdy5IVE1MRWxlbWVudD17SFRNTEVsZW1lbnQ6ZnVuY3Rpb24gSFRNTEVsZW1lbnQoKXtyZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3QoYSxbXSx0aGlzLmNvbnN0cnVjdG9yKX19LkhUTUxFbGVtZW50LEhUTUxFbGVtZW50LnByb3RvdHlwZT1hLnByb3RvdHlwZSxIVE1MRWxlbWVudC5wcm90b3R5cGUuY29uc3RydWN0b3I9SFRNTEVsZW1lbnQsT2JqZWN0LnNldFByb3RvdHlwZU9mKEhUTUxFbGVtZW50LGEpO30pKCk7XG5cbn0oKSk7XG4iLCIvKipcbkBsaWNlbnNlIEBub2NvbXBpbGVcbkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG5Db2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG4oZnVuY3Rpb24oKXsvKlxuXG4gQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXRcbiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZFxuIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXlcbiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5XG4gR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUFxuIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG4ndXNlIHN0cmljdCc7dmFyIHY7ZnVuY3Rpb24gYmEoYSl7dmFyIGI9MDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX19dmFyIGNhPVwiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoYT09QXJyYXkucHJvdG90eXBlfHxhPT1PYmplY3QucHJvdG90eXBlKXJldHVybiBhO2FbYl09Yy52YWx1ZTtyZXR1cm4gYX07XG5mdW5jdGlvbiBkYShhKXthPVtcIm9iamVjdFwiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyxhLFwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyxcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZixcIm9iamVjdFwiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWxdO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7KytiKXt2YXIgYz1hW2JdO2lmKGMmJmMuTWF0aD09TWF0aClyZXR1cm4gY310aHJvdyBFcnJvcihcIkNhbm5vdCBmaW5kIGdsb2JhbCBvYmplY3RcIik7fXZhciBlYT1kYSh0aGlzKTtmdW5jdGlvbiBmYShhLGIpe2lmKGIpYTp7dmFyIGM9ZWE7YT1hLnNwbGl0KFwiLlwiKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoLTE7ZCsrKXt2YXIgZT1hW2RdO2lmKCEoZSBpbiBjKSlicmVhayBhO2M9Y1tlXX1hPWFbYS5sZW5ndGgtMV07ZD1jW2FdO2I9YihkKTtiIT1kJiZudWxsIT1iJiZjYShjLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpifSl9fVxuZmEoXCJTeW1ib2xcIixmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKHRoaXMgaW5zdGFuY2VvZiBiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3JcIik7cmV0dXJuIG5ldyBjKFwianNjb21wX3N5bWJvbF9cIisoZXx8XCJcIikrXCJfXCIrZCsrLGUpfWZ1bmN0aW9uIGMoZSxmKXt0aGlzLmc9ZTtjYSh0aGlzLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ9KX1pZihhKXJldHVybiBhO2MucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ307dmFyIGQ9MDtyZXR1cm4gYn0pO1xuZmEoXCJTeW1ib2wuaXRlcmF0b3JcIixmdW5jdGlvbihhKXtpZihhKXJldHVybiBhO2E9U3ltYm9sKFwiU3ltYm9sLml0ZXJhdG9yXCIpO2Zvcih2YXIgYj1cIkFycmF5IEludDhBcnJheSBVaW50OEFycmF5IFVpbnQ4Q2xhbXBlZEFycmF5IEludDE2QXJyYXkgVWludDE2QXJyYXkgSW50MzJBcnJheSBVaW50MzJBcnJheSBGbG9hdDMyQXJyYXkgRmxvYXQ2NEFycmF5XCIuc3BsaXQoXCIgXCIpLGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9ZWFbYltjXV07XCJmdW5jdGlvblwiPT09dHlwZW9mIGQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGQucHJvdG90eXBlW2FdJiZjYShkLnByb3RvdHlwZSxhLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gamEoYmEodGhpcykpfX0pfXJldHVybiBhfSk7ZnVuY3Rpb24gamEoYSl7YT17bmV4dDphfTthW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307cmV0dXJuIGF9XG5mdW5jdGlvbiBrYShhKXt2YXIgYj1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJmFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6e25leHQ6YmEoYSl9fWZ1bmN0aW9uIHcoYSl7aWYoIShhIGluc3RhbmNlb2YgQXJyYXkpKXthPWthKGEpO2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO2E9Y31yZXR1cm4gYX12YXIgbGE7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKWxhPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBuYTthOnt2YXIgb2E9e2E6ITB9LHBhPXt9O3RyeXtwYS5fX3Byb3RvX189b2E7bmE9cGEuYTticmVhayBhfWNhdGNoKGEpe31uYT0hMX1sYT1uYT9mdW5jdGlvbihhLGIpe2EuX19wcm90b19fPWI7aWYoYS5fX3Byb3RvX18hPT1iKXRocm93IG5ldyBUeXBlRXJyb3IoYStcIiBpcyBub3QgZXh0ZW5zaWJsZVwiKTtyZXR1cm4gYX06bnVsbH1cbnZhciBxYT1sYTtmdW5jdGlvbiByYSgpe3RoaXMudT0hMTt0aGlzLmg9bnVsbDt0aGlzLk9hPXZvaWQgMDt0aGlzLmc9MTt0aGlzLmVhPTA7dGhpcy5pPW51bGx9ZnVuY3Rpb24gdWEoYSl7aWYoYS51KXRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO2EudT0hMH1yYS5wcm90b3R5cGUuTz1mdW5jdGlvbihhKXt0aGlzLk9hPWF9O2Z1bmN0aW9uIHdhKGEsYil7YS5pPXthYjpiLGZiOiEwfTthLmc9YS5lYX1yYS5wcm90b3R5cGUucmV0dXJuPWZ1bmN0aW9uKGEpe3RoaXMuaT17cmV0dXJuOmF9O3RoaXMuZz10aGlzLmVhfTtmdW5jdGlvbiB5YShhLGIpe2EuZz0zO3JldHVybnt2YWx1ZTpifX1mdW5jdGlvbiB6YShhKXt0aGlzLmc9bmV3IHJhO3RoaXMuaD1hfVxuZnVuY3Rpb24gQWEoYSxiKXt1YShhLmcpO3ZhciBjPWEuZy5oO2lmKGMpcmV0dXJuIEJhKGEsXCJyZXR1cm5cImluIGM/Y1tcInJldHVyblwiXTpmdW5jdGlvbihkKXtyZXR1cm57dmFsdWU6ZCxkb25lOiEwfX0sYixhLmcucmV0dXJuKTthLmcucmV0dXJuKGIpO3JldHVybiBDYShhKX1mdW5jdGlvbiBCYShhLGIsYyxkKXt0cnl7dmFyIGU9Yi5jYWxsKGEuZy5oLGMpO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkl0ZXJhdG9yIHJlc3VsdCBcIitlK1wiIGlzIG5vdCBhbiBvYmplY3RcIik7aWYoIWUuZG9uZSlyZXR1cm4gYS5nLnU9ITEsZTt2YXIgZj1lLnZhbHVlfWNhdGNoKGcpe3JldHVybiBhLmcuaD1udWxsLHdhKGEuZyxnKSxDYShhKX1hLmcuaD1udWxsO2QuY2FsbChhLmcsZik7cmV0dXJuIENhKGEpfVxuZnVuY3Rpb24gQ2EoYSl7Zm9yKDthLmcuZzspdHJ5e3ZhciBiPWEuaChhLmcpO2lmKGIpcmV0dXJuIGEuZy51PSExLHt2YWx1ZTpiLnZhbHVlLGRvbmU6ITF9fWNhdGNoKGMpe2EuZy5PYT12b2lkIDAsd2EoYS5nLGMpfWEuZy51PSExO2lmKGEuZy5pKXtiPWEuZy5pO2EuZy5pPW51bGw7aWYoYi5mYil0aHJvdyBiLmFiO3JldHVybnt2YWx1ZTpiLnJldHVybixkb25lOiEwfX1yZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fVxuZnVuY3Rpb24gRGEoYSl7dGhpcy5uZXh0PWZ1bmN0aW9uKGIpe3VhKGEuZyk7YS5nLmg/Yj1CYShhLGEuZy5oLm5leHQsYixhLmcuTyk6KGEuZy5PKGIpLGI9Q2EoYSkpO3JldHVybiBifTt0aGlzLnRocm93PWZ1bmN0aW9uKGIpe3VhKGEuZyk7YS5nLmg/Yj1CYShhLGEuZy5oW1widGhyb3dcIl0sYixhLmcuTyk6KHdhKGEuZyxiKSxiPUNhKGEpKTtyZXR1cm4gYn07dGhpcy5yZXR1cm49ZnVuY3Rpb24oYil7cmV0dXJuIEFhKGEsYil9O3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX1mdW5jdGlvbiBFYShhLGIpe2I9bmV3IERhKG5ldyB6YShiKSk7cWEmJmEucHJvdG90eXBlJiZxYShiLGEucHJvdG90eXBlKTtyZXR1cm4gYn1BcnJheS5mcm9tfHwoQXJyYXkuZnJvbT1mdW5jdGlvbihhKXtyZXR1cm5bXS5zbGljZS5jYWxsKGEpfSk7XG5PYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksYz0wLGQ7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdKWZvcih2YXIgZT1hLGY9T2JqZWN0LmtleXMoZCksZz0wO2c8Zi5sZW5ndGg7ZysrKXt2YXIgaD1mW2ddO2VbaF09ZFtoXX1yZXR1cm4gYX0pO3ZhciBGYT1zZXRUaW1lb3V0O2Z1bmN0aW9uIEdhKCl7fWZ1bmN0aW9uIEhhKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7YS5hcHBseShiLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEEoYSl7aWYoISh0aGlzIGluc3RhbmNlb2YgQSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ld1wiKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKFwibm90IGEgZnVuY3Rpb25cIik7dGhpcy5OPTA7dGhpcy5IYT0hMTt0aGlzLkk9dm9pZCAwO3RoaXMuYmE9W107SWEoYSx0aGlzKX1cbmZ1bmN0aW9uIEphKGEsYil7Zm9yKDszPT09YS5OOylhPWEuSTswPT09YS5OP2EuYmEucHVzaChiKTooYS5IYT0hMCxLYShmdW5jdGlvbigpe3ZhciBjPTE9PT1hLk4/Yi5oYjpiLmliO2lmKG51bGw9PT1jKSgxPT09YS5OP0xhOk1hKShiLnByb21pc2UsYS5JKTtlbHNle3RyeXt2YXIgZD1jKGEuSSl9Y2F0Y2goZSl7TWEoYi5wcm9taXNlLGUpO3JldHVybn1MYShiLnByb21pc2UsZCl9fSkpfVxuZnVuY3Rpb24gTGEoYSxiKXt0cnl7aWYoYj09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuXCIpO2lmKGImJihcIm9iamVjdFwiPT09dHlwZW9mIGJ8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKSl7dmFyIGM9Yi50aGVuO2lmKGIgaW5zdGFuY2VvZiBBKXthLk49MzthLkk9YjtOYShhKTtyZXR1cm59aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGMpe0lhKEhhKGMsYiksYSk7cmV0dXJufX1hLk49MTthLkk9YjtOYShhKX1jYXRjaChkKXtNYShhLGQpfX1mdW5jdGlvbiBNYShhLGIpe2EuTj0yO2EuST1iO05hKGEpfVxuZnVuY3Rpb24gTmEoYSl7Mj09PWEuTiYmMD09PWEuYmEubGVuZ3RoJiZLYShmdW5jdGlvbigpe2EuSGF8fFwidW5kZWZpbmVkXCIhPT10eXBlb2YgY29uc29sZSYmY29uc29sZSYmY29uc29sZS53YXJuKFwiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOlwiLGEuSSl9KTtmb3IodmFyIGI9MCxjPWEuYmEubGVuZ3RoO2I8YztiKyspSmEoYSxhLmJhW2JdKTthLmJhPW51bGx9ZnVuY3Rpb24gT2EoYSxiLGMpe3RoaXMuaGI9XCJmdW5jdGlvblwiPT09dHlwZW9mIGE/YTpudWxsO3RoaXMuaWI9XCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YjpudWxsO3RoaXMucHJvbWlzZT1jfWZ1bmN0aW9uIElhKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oZCl7Y3x8KGM9ITAsTGEoYixkKSl9LGZ1bmN0aW9uKGQpe2N8fChjPSEwLE1hKGIsZCkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAsTWEoYixkKSl9fVxuQS5wcm90b3R5cGVbXCJjYXRjaFwiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O0EucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihHYSk7SmEodGhpcyxuZXcgT2EoYSxiLGMpKTtyZXR1cm4gY307QS5wcm90b3R5cGVbXCJmaW5hbGx5XCJdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBjfSl9LGZ1bmN0aW9uKGMpe3JldHVybiBiLnJlc29sdmUoYSgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGIucmVqZWN0KGMpfSl9KX07XG5mdW5jdGlvbiBQYShhKXtyZXR1cm4gbmV3IEEoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGgsayl7dHJ5e2lmKGsmJihcIm9iamVjdFwiPT09dHlwZW9mIGt8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBrKSl7dmFyIGw9ay50aGVuO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBsKXtsLmNhbGwoayxmdW5jdGlvbihtKXtkKGgsbSl9LGMpO3JldHVybn19ZVtoXT1rOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYS5sZW5ndGgpcmV0dXJuIGMobmV3IFR5cGVFcnJvcihcIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXlcIikpO3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYihbXSk7Zm9yKHZhciBmPWUubGVuZ3RoLGc9MDtnPGUubGVuZ3RoO2crKylkKGcsZVtnXSl9KX1cbmZ1bmN0aW9uIFFhKGEpe3JldHVybiBhJiZcIm9iamVjdFwiPT09dHlwZW9mIGEmJmEuY29uc3RydWN0b3I9PT1BP2E6bmV3IEEoZnVuY3Rpb24oYil7YihhKX0pfWZ1bmN0aW9uIFJhKGEpe3JldHVybiBuZXcgQShmdW5jdGlvbihiLGMpe2MoYSl9KX1mdW5jdGlvbiBTYShhKXtyZXR1cm4gbmV3IEEoZnVuY3Rpb24oYixjKXtpZighYXx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhLmxlbmd0aClyZXR1cm4gYyhuZXcgVHlwZUVycm9yKFwiUHJvbWlzZS5yYWNlIGFjY2VwdHMgYW4gYXJyYXlcIikpO2Zvcih2YXIgZD0wLGU9YS5sZW5ndGg7ZDxlO2QrKylRYShhW2RdKS50aGVuKGIsYyl9KX12YXIgS2E9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldEltbWVkaWF0ZSYmZnVuY3Rpb24oYSl7c2V0SW1tZWRpYXRlKGEpfXx8ZnVuY3Rpb24oYSl7RmEoYSwwKX07LypcblxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdFxuaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXRcbmh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmVcbmZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzXG5wYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50XG5mb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG5pZighd2luZG93LlByb21pc2Upe3dpbmRvdy5Qcm9taXNlPUE7QS5wcm90b3R5cGUudGhlbj1BLnByb3RvdHlwZS50aGVuO0EuYWxsPVBhO0EucmFjZT1TYTtBLnJlc29sdmU9UWE7QS5yZWplY3Q9UmE7dmFyIFRhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpLFVhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcih2YXIgYT1VYS5sZW5ndGgsYj0wO2I8YTtiKyspVWFbYl0oKTtVYS5zcGxpY2UoMCxhKX0pKS5vYnNlcnZlKFRhLHtjaGFyYWN0ZXJEYXRhOiEwfSk7S2E9ZnVuY3Rpb24oYSl7VWEucHVzaChhKTtUYS50ZXh0Q29udGVudD0wPFRhLnRleHRDb250ZW50Lmxlbmd0aD9cIlwiOlwiYVwifX07LypcbiBDb3B5cmlnaHQgKEMpIDIwMTUgYnkgV2ViUmVmbGVjdGlvblxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG5cbiovXG4oZnVuY3Rpb24oYSxiKXtpZighKGIgaW4gYSkpe3ZhciBjPXR5cGVvZiBnbG9iYWw9PT10eXBlb2YgYz93aW5kb3c6Z2xvYmFsLGQ9MCxlPVN0cmluZyhNYXRoLnJhbmRvbSgpKSxmPVwiX19cXHUwMDAxc3ltYm9sQEBcIitlLGc9YS5nZXRPd25Qcm9wZXJ0eU5hbWVzLGg9YS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isaz1hLmNyZWF0ZSxsPWEua2V5cyxtPWEuZnJlZXplfHxhLHE9YS5kZWZpbmVQcm9wZXJ0eSxIPWEuZGVmaW5lUHJvcGVydGllcyxDPWgoYSxcImdldE93blByb3BlcnR5TmFtZXNcIiksdD1hLnByb3RvdHlwZSxGPXQuaGFzT3duUHJvcGVydHksRT10LnByb3BlcnR5SXNFbnVtZXJhYmxlLE49dC50b1N0cmluZyx5PWZ1bmN0aW9uKEksdSxHKXtGLmNhbGwoSSxmKXx8cShJLGYse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiExLHdyaXRhYmxlOiExLHZhbHVlOnt9fSk7SVtmXVtcIkBAXCIrdV09R30sWD1mdW5jdGlvbihJLHUpe3ZhciBHPWsoSSk7Zyh1KS5mb3JFYWNoKGZ1bmN0aW9uKHApe3NhLmNhbGwodSxcbnApJiZWYShHLHAsdVtwXSl9KTtyZXR1cm4gR30seD1mdW5jdGlvbigpe30sdGE9ZnVuY3Rpb24oSSl7cmV0dXJuIEkhPWYmJiFGLmNhbGwoaGEsSSl9LGlhPWZ1bmN0aW9uKEkpe3JldHVybiBJIT1mJiZGLmNhbGwoaGEsSSl9LHNhPWZ1bmN0aW9uKEkpe3ZhciB1PVN0cmluZyhJKTtyZXR1cm4gaWEodSk/Ri5jYWxsKHRoaXMsdSkmJiEhdGhpc1tmXSYmdGhpc1tmXVtcIkBAXCIrdV06RS5jYWxsKHRoaXMsSSl9LG49ZnVuY3Rpb24oSSl7cSh0LEkse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLGdldDp4LHNldDpmdW5jdGlvbih1KXt4YSh0aGlzLEkse2VudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnV9KTt5KHRoaXMsSSwhMCl9fSk7aGFbSV09cShhKEkpLFwiY29uc3RydWN0b3JcIixrYyk7cmV0dXJuIG0oaGFbSV0pfSxKPWZ1bmN0aW9uIEcodSl7aWYodGhpcyBpbnN0YW5jZW9mIEcpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvclwiKTtcbnJldHVybiBuKFwiX19cXHUwMDAxc3ltYm9sOlwiLmNvbmNhdCh1fHxcIlwiLGUsKytkKSl9LGhhPWsobnVsbCksa2M9e3ZhbHVlOkp9LGliPWZ1bmN0aW9uKHUpe3JldHVybiBoYVt1XX0sVmE9ZnVuY3Rpb24odSxHLHApe3ZhciByPVN0cmluZyhHKTtpZihpYShyKSl7Rz14YTtpZihwLmVudW1lcmFibGUpe3ZhciBCPWsocCk7Qi5lbnVtZXJhYmxlPSExfWVsc2UgQj1wO0codSxyLEIpO3kodSxyLCEhcC5lbnVtZXJhYmxlKX1lbHNlIHEodSxHLHApO3JldHVybiB1fSxqYj1mdW5jdGlvbih1KXtyZXR1cm4gZyh1KS5maWx0ZXIoaWEpLm1hcChpYil9O0MudmFsdWU9VmE7cShhLFwiZGVmaW5lUHJvcGVydHlcIixDKTtDLnZhbHVlPWpiO3EoYSxiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSl7cmV0dXJuIGcodSkuZmlsdGVyKHRhKX07cShhLFwiZ2V0T3duUHJvcGVydHlOYW1lc1wiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSxHKXt2YXIgcD1qYihHKTtwLmxlbmd0aD9sKEcpLmNvbmNhdChwKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3NhLmNhbGwoRyxcbnIpJiZWYSh1LHIsR1tyXSl9KTpIKHUsRyk7cmV0dXJuIHV9O3EoYSxcImRlZmluZVByb3BlcnRpZXNcIixDKTtDLnZhbHVlPXNhO3EodCxcInByb3BlcnR5SXNFbnVtZXJhYmxlXCIsQyk7Qy52YWx1ZT1KO3EoYyxcIlN5bWJvbFwiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSl7dT1cIl9fXFx1MDAwMXN5bWJvbDpcIi5jb25jYXQoXCJfX1xcdTAwMDFzeW1ib2w6XCIsdSxlKTtyZXR1cm4gdSBpbiB0P2hhW3VdOm4odSl9O3EoSixcImZvclwiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSl7aWYodGEodSkpdGhyb3cgbmV3IFR5cGVFcnJvcih1K1wiIGlzIG5vdCBhIHN5bWJvbFwiKTtpZihGLmNhbGwoaGEsdSkmJih1PXUuc2xpY2UoMTApLFwiX19cXHUwMDAxc3ltYm9sOlwiPT09dS5zbGljZSgwLDEwKSYmKHU9dS5zbGljZSgxMCksdSE9PWUpKSlyZXR1cm4gdT11LnNsaWNlKDAsdS5sZW5ndGgtZS5sZW5ndGgpLDA8dS5sZW5ndGg/dTp2b2lkIDB9O3EoSixcImtleUZvclwiLEMpO0MudmFsdWU9ZnVuY3Rpb24odSxHKXt2YXIgcD1cbmgodSxHKTtwJiZpYShHKSYmKHAuZW51bWVyYWJsZT1zYS5jYWxsKHUsRykpO3JldHVybiBwfTtxKGEsXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIixDKTtDLnZhbHVlPWZ1bmN0aW9uKHUsRyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RofHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIEc/ayh1KTpYKHUsRyl9O3EoYSxcImNyZWF0ZVwiLEMpO0MudmFsdWU9ZnVuY3Rpb24oKXt2YXIgdT1OLmNhbGwodGhpcyk7cmV0dXJuXCJbb2JqZWN0IFN0cmluZ11cIj09PXUmJmlhKHRoaXMpP1wiW29iamVjdCBTeW1ib2xdXCI6dX07cSh0LFwidG9TdHJpbmdcIixDKTt0cnl7aWYoITA9PT1rKHEoe30sXCJfX1xcdTAwMDFzeW1ib2w6XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBxKHRoaXMsXCJfX1xcdTAwMDFzeW1ib2w6XCIse3ZhbHVlOiEwfSlbXCJfX1xcdTAwMDFzeW1ib2w6XCJdfX0pKVtcIl9fXFx1MDAwMXN5bWJvbDpcIl0pdmFyIHhhPXE7ZWxzZSB0aHJvd1wiSUUxMVwiO31jYXRjaCh1KXt4YT1mdW5jdGlvbihHLHAscil7dmFyIEI9XG5oKHQscCk7ZGVsZXRlIHRbcF07cShHLHAscik7cSh0LHAsQil9fX19KShPYmplY3QsXCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcIik7XG4oZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmRlZmluZVByb3BlcnR5LGQ9YS5wcm90b3R5cGUsZT1kLnRvU3RyaW5nLGY7XCJpdGVyYXRvciBtYXRjaCByZXBsYWNlIHNlYXJjaCBzcGxpdCBoYXNJbnN0YW5jZSBpc0NvbmNhdFNwcmVhZGFibGUgdW5zY29wYWJsZXMgc3BlY2llcyB0b1ByaW1pdGl2ZSB0b1N0cmluZ1RhZ1wiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cgaW4gYnx8KGMoYixnLHt2YWx1ZTpiKGcpfSksXCJ0b1N0cmluZ1RhZ1wiPT09ZyYmKGY9YS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZCxcInRvU3RyaW5nXCIpLGYudmFsdWU9ZnVuY3Rpb24oKXt2YXIgaD1lLmNhbGwodGhpcyksaz1udWxsPT10aGlzP3RoaXM6dGhpc1tiLnRvU3RyaW5nVGFnXTtyZXR1cm4gbnVsbD09az9oOlwiW29iamVjdCBcIitrK1wiXVwifSxjKGQsXCJ0b1N0cmluZ1wiLGYpKSl9KX0pKE9iamVjdCxTeW1ib2wpO1xuKGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKCl7cmV0dXJuIHRoaXN9YlthXXx8KGJbYV09ZnVuY3Rpb24oKXt2YXIgZT0wLGY9dGhpcyxnPXtuZXh0OmZ1bmN0aW9uKCl7dmFyIGg9Zi5sZW5ndGg8PWU7cmV0dXJuIGg/e2RvbmU6aH06e2RvbmU6aCx2YWx1ZTpmW2UrK119fX07Z1thXT1kO3JldHVybiBnfSk7Y1thXXx8KGNbYV09ZnVuY3Rpb24oKXt2YXIgZT1TdHJpbmcuZnJvbUNvZGVQb2ludCxmPXRoaXMsZz0wLGg9Zi5sZW5ndGgsaz17bmV4dDpmdW5jdGlvbigpe3ZhciBsPWg8PWcsbT1sP1wiXCI6ZShmLmNvZGVQb2ludEF0KGcpKTtnKz1tLmxlbmd0aDtyZXR1cm4gbD97ZG9uZTpsfTp7ZG9uZTpsLHZhbHVlOm19fX07a1thXT1kO3JldHVybiBrfSl9KShTeW1ib2wuaXRlcmF0b3IsQXJyYXkucHJvdG90eXBlLFN0cmluZy5wcm90b3R5cGUpOy8qXG5cbkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXRcbmh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0XG5odHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlXG5mb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhc1xucGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudFxuZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xudmFyIFdhPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzP1wiW29iamVjdCBVbmRlZmluZWRdXCI6bnVsbD09PXRoaXM/XCJbb2JqZWN0IE51bGxdXCI6V2EuY2FsbCh0aGlzKX07T2JqZWN0LmtleXM9ZnVuY3Rpb24oYSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4oYj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsYikpJiZiLmVudW1lcmFibGV9KX07XG5TdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0mJlN0cmluZy5wcm90b3R5cGUuY29kZVBvaW50QXR8fChTdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24gWGEoKXt2YXIgYixjPXRoaXM7cmV0dXJuIEVhKFhhLGZ1bmN0aW9uKGQpezE9PWQuZyYmKGI9MCk7aWYoMyE9ZC5nKXJldHVybiBiPGMubGVuZ3RoP2Q9eWEoZCxjW2JdKTooZC5nPTAsZD12b2lkIDApLGQ7YisrO2QuZz0yfSl9KTtTZXQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl18fChTZXQucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24gWWEoKXt2YXIgYixjPXRoaXMsZDtyZXR1cm4gRWEoWWEsZnVuY3Rpb24oZSl7MT09ZS5nJiYoYj1bXSxjLmZvckVhY2goZnVuY3Rpb24oZil7Yi5wdXNoKGYpfSksZD0wKTtpZigzIT1lLmcpcmV0dXJuIGQ8Yi5sZW5ndGg/ZT15YShlLGJbZF0pOihlLmc9MCxlPXZvaWQgMCksZTtkKys7ZS5nPTJ9KX0pO1xuTWFwLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdfHwoTWFwLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uIFphKCl7dmFyIGIsYz10aGlzLGQ7cmV0dXJuIEVhKFphLGZ1bmN0aW9uKGUpezE9PWUuZyYmKGI9W10sYy5mb3JFYWNoKGZ1bmN0aW9uKGYsZyl7Yi5wdXNoKFtnLGZdKX0pLGQ9MCk7aWYoMyE9ZS5nKXJldHVybiBkPGIubGVuZ3RoP2U9eWEoZSxiW2RdKTooZS5nPTAsZT12b2lkIDApLGU7ZCsrO2UuZz0yfSl9KTsvKlxuXG5Db3B5cmlnaHQgKGMpIDIwMjAgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xudmFyICRhPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7JGEuaW5pdEV2ZW50KFwiZm9vXCIsITAsITApOyRhLnByZXZlbnREZWZhdWx0KCk7aWYoISRhLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBhYj1FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ7RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxhYmxlJiYoYWIuY2FsbCh0aGlzKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImRlZmF1bHRQcmV2ZW50ZWRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9LGNvbmZpZ3VyYWJsZTohMH0pKX19dmFyIGJiPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuaWYoIXdpbmRvdy5FdmVudHx8YmImJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiB3aW5kb3cuRXZlbnQpe3ZhciBjYj13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO2MuaW5pdEV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUpO3JldHVybiBjfTtpZihjYil7Zm9yKHZhciBkYiBpbiBjYil3aW5kb3cuRXZlbnRbZGJdPWNiW2RiXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWNiLnByb3RvdHlwZX19XG5pZighd2luZG93LkN1c3RvbUV2ZW50fHxiYiYmXCJmdW5jdGlvblwiIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7Yy5pbml0Q3VzdG9tRXZlbnQoYSwhIWIuYnViYmxlcywhIWIuY2FuY2VsYWJsZSxiLmRldGFpbCk7cmV0dXJuIGN9LHdpbmRvdy5DdXN0b21FdmVudC5wcm90b3R5cGU9d2luZG93LkV2ZW50LnByb3RvdHlwZTtcbmlmKCF3aW5kb3cuTW91c2VFdmVudHx8YmImJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7dmFyIGViPXdpbmRvdy5Nb3VzZUV2ZW50O3dpbmRvdy5Nb3VzZUV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudChcIk1vdXNlRXZlbnRcIik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoZWIpZm9yKHZhciBmYiBpbiBlYil3aW5kb3cuTW91c2VFdmVudFtmYl09ZWJbZmJdO3dpbmRvdy5Nb3VzZUV2ZW50LnByb3RvdHlwZT1lYi5wcm90b3R5cGV9O3ZhciBnYixoYj1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtlKyt9dmFyIGI9ITEsYz0hMSxkPXtnZXQgY2FwdHVyZSgpe3JldHVybiBiPSEwfSxnZXQgb25jZSgpe3JldHVybiBjPSEwfX0sZT0wLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGEsZCk7dmFyIGc9YiYmYztnJiYoZi5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImNsaWNrXCIpKSxmLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2xpY2tcIikpLGc9MT09ZSk7Zi5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIixhLGQpO3JldHVybiBnfSgpLGtiPW51bGwhPT0oZ2I9d2luZG93LkV2ZW50VGFyZ2V0KSYmdm9pZCAwIT09Z2I/Z2I6d2luZG93Lk5vZGU7XG5pZighaGImJlwiYWRkRXZlbnRMaXN0ZW5lclwiaW4ga2IucHJvdG90eXBlKXt2YXIgbGI9ZnVuY3Rpb24oYSl7aWYoIWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGEpe3ZhciBiPSEhYTthPSExfWVsc2UgYj0hIWEuY2FwdHVyZSxhPSEhYS5vbmNlO3JldHVybntjYXB0dXJlOmIsb25jZTphfX0sbWI9a2IucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsbmI9a2IucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIscWI9bmV3IFdlYWtNYXAscmI9bmV3IFdlYWtNYXAsc2I9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWM/cWI6cmI7Yz1kLmdldChhKTt2b2lkIDA9PT1jJiZkLnNldChhLGM9bmV3IE1hcCk7YT1jLmdldChiKTt2b2lkIDA9PT1hJiZjLnNldChiLGE9bmV3IFdlYWtNYXApO3JldHVybiBhfTtrYi5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcztpZihudWxsIT1iKXtjPWxiKGMpO3ZhciBlPWMuY2FwdHVyZTtcbmM9Yy5vbmNlO3ZhciBmPXNiKHRoaXMsYSxlKTtpZighZi5oYXMoYikpe3ZhciBnPWM/ZnVuY3Rpb24oaCl7Zi5kZWxldGUoYik7bmIuY2FsbChkLGEsZyxlKTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYi5jYWxsKGQsaCk7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mKG51bGw9PT1ifHx2b2lkIDA9PT1iP3ZvaWQgMDpiLmhhbmRsZUV2ZW50KSlyZXR1cm4gYi5oYW5kbGVFdmVudChoKX06bnVsbDtmLnNldChiLGcpO21iLmNhbGwodGhpcyxhLG51bGwhPT1nJiZ2b2lkIDAhPT1nP2c6YixlKX19fTtrYi5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7aWYobnVsbCE9Yil7Yz1sYihjKS5jYXB0dXJlO3ZhciBkPXNiKHRoaXMsYSxjKSxlPWQuZ2V0KGIpO3ZvaWQgMCE9PWUmJihkLmRlbGV0ZShiKSxuYi5jYWxsKHRoaXMsYSxudWxsIT09ZSYmdm9pZCAwIT09ZT9lOmIsYykpfX19O09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsXCJiYXNlVVJJXCIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoTm9kZS5wcm90b3R5cGUsXCJiYXNlVVJJXCIse2dldDpmdW5jdGlvbigpe3ZhciBhPSh0aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMpLnF1ZXJ5U2VsZWN0b3IoXCJiYXNlW2hyZWZdXCIpO3JldHVybiBhJiZhLmhyZWZ8fHdpbmRvdy5sb2NhdGlvbi5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pOy8qXG5cbkNvcHlyaWdodCAoYykgMjAyMCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5UaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXRcbmh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0XG5odHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlXG5mb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhc1xucGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudFxuZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xudmFyIHRiLHViLHZiPUVsZW1lbnQucHJvdG90eXBlLHdiPW51bGwhPT0odGI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YixcImF0dHJpYnV0ZXNcIikpJiZ2b2lkIDAhPT10Yj90YjpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwiYXR0cmlidXRlc1wiKSx4Yj1udWxsIT09KHViPW51bGw9PT13Ynx8dm9pZCAwPT09d2I/dm9pZCAwOndiLmdldCkmJnZvaWQgMCE9PXViP3ViOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc30seWI9QXJyYXkucHJvdG90eXBlLm1hcDt2Yi5oYXNPd25Qcm9wZXJ0eShcImdldEF0dHJpYnV0ZU5hbWVzXCIpfHwodmIuZ2V0QXR0cmlidXRlTmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4geWIuY2FsbCh4Yi5jYWxsKHRoaXMpLGZ1bmN0aW9uKGEpe3JldHVybiBhLm5hbWV9KX0pO3ZhciB6YixBYj1FbGVtZW50LnByb3RvdHlwZTtBYi5oYXNPd25Qcm9wZXJ0eShcIm1hdGNoZXNcIil8fChBYi5tYXRjaGVzPW51bGwhPT0oemI9QWIud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSYmdm9pZCAwIT09emI/emI6QWIubXNNYXRjaGVzU2VsZWN0b3IpO3ZhciBCYj1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZDtmdW5jdGlvbiBDYihhKXthPWEucHJvdG90eXBlO2EuaGFzT3duUHJvcGVydHkoXCJhcHBlbmRcIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiYXBwZW5kXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtjPWthKGMpO2ZvcihkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlkPWQudmFsdWUsQmIuY2FsbCh0aGlzLFwic3RyaW5nXCI9PT10eXBlb2YgZD9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkKTpkKX19KX1DYihEb2N1bWVudCk7Q2IoRG9jdW1lbnRGcmFnbWVudCk7Q2IoRWxlbWVudCk7dmFyIERiLEViLEZiPU5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZSxHYj1udWxsIT09KEViPW51bGw9PT0oRGI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSxcImZpcnN0Q2hpbGRcIikpfHx2b2lkIDA9PT1EYj92b2lkIDA6RGIuZ2V0KSYmdm9pZCAwIT09RWI/RWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maXJzdENoaWxkfTtcbmZ1bmN0aW9uIEhiKGEpe2E9YS5wcm90b3R5cGU7YS5oYXNPd25Qcm9wZXJ0eShcInByZXBlbmRcIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwicHJlcGVuZFwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihiKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkXT1hcmd1bWVudHNbZF07ZD1HYi5jYWxsKHRoaXMpO2M9a2EoYyk7Zm9yKHZhciBlPWMubmV4dCgpOyFlLmRvbmU7ZT1jLm5leHQoKSllPWUudmFsdWUsRmIuY2FsbCh0aGlzLFwic3RyaW5nXCI9PT10eXBlb2YgZT9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKTplLGQpfX0pfUhiKERvY3VtZW50KTtIYihEb2N1bWVudEZyYWdtZW50KTtIYihFbGVtZW50KTt2YXIgSWIsSmIsS2I9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsTGI9Tm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsTWI9bnVsbCE9PShKYj1udWxsPT09KEliPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsXCJmaXJzdENoaWxkXCIpKXx8dm9pZCAwPT09SWI/dm9pZCAwOkliLmdldCkmJnZvaWQgMCE9PUpiP0piOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlyc3RDaGlsZH07XG5mdW5jdGlvbiBOYihhKXthPWEucHJvdG90eXBlO2EuaGFzT3duUHJvcGVydHkoXCJyZXBsYWNlQ2hpbGRyZW5cIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwicmVwbGFjZUNoaWxkcmVuXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtmb3IoO251bGwhPT0oZD1NYi5jYWxsKHRoaXMpKTspTGIuY2FsbCh0aGlzLGQpO2M9a2EoYyk7Zm9yKGQ9Yy5uZXh0KCk7IWQuZG9uZTtkPWMubmV4dCgpKWQ9ZC52YWx1ZSxLYi5jYWxsKHRoaXMsXCJzdHJpbmdcIj09PXR5cGVvZiBkP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGQpOmQpfX0pfU5iKERvY3VtZW50KTtOYihEb2N1bWVudEZyYWdtZW50KTtOYihFbGVtZW50KTt2YXIgT2IsUGIsUWIsUmIsU2I9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLFRiPW51bGwhPT0oUGI9bnVsbD09PShPYj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwicGFyZW50Tm9kZVwiKSl8fHZvaWQgMD09PU9iP3ZvaWQgMDpPYi5nZXQpJiZ2b2lkIDAhPT1QYj9QYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9LFViPW51bGwhPT0oUmI9bnVsbD09PShRYj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwibmV4dFNpYmxpbmdcIikpfHx2b2lkIDA9PT1RYj92b2lkIDA6UWIuZ2V0KSYmdm9pZCAwIT09UmI/UmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uZXh0U2libGluZ307XG5mdW5jdGlvbiBWYihhKXthPWEucHJvdG90eXBlO2EuaGFzT3duUHJvcGVydHkoXCJhZnRlclwiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJhZnRlclwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihiKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkXT1hcmd1bWVudHNbZF07ZD1UYi5jYWxsKHRoaXMpO2lmKG51bGwhPT1kKXt2YXIgZT1VYi5jYWxsKHRoaXMpO2M9a2EoYyk7Zm9yKHZhciBmPWMubmV4dCgpOyFmLmRvbmU7Zj1jLm5leHQoKSlmPWYudmFsdWUsU2IuY2FsbChkLFwic3RyaW5nXCI9PT10eXBlb2YgZj9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmKTpmLGUpfX19KX1WYihDaGFyYWN0ZXJEYXRhKTtWYihFbGVtZW50KTt2YXIgV2IsWGIsWWI9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLFpiPW51bGwhPT0oWGI9bnVsbD09PShXYj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwicGFyZW50Tm9kZVwiKSl8fHZvaWQgMD09PVdiP3ZvaWQgMDpXYi5nZXQpJiZ2b2lkIDAhPT1YYj9YYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9O1xuZnVuY3Rpb24gJGIoYSl7YT1hLnByb3RvdHlwZTthLmhhc093blByb3BlcnR5KFwiYmVmb3JlXCIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcImJlZm9yZVwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbihiKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkXT1hcmd1bWVudHNbZF07ZD1aYi5jYWxsKHRoaXMpO2lmKG51bGwhPT1kKXtjPWthKGMpO2Zvcih2YXIgZT1jLm5leHQoKTshZS5kb25lO2U9Yy5uZXh0KCkpZT1lLnZhbHVlLFliLmNhbGwoZCxcInN0cmluZ1wiPT09dHlwZW9mIGU/ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSk6ZSx0aGlzKX19fSl9JGIoQ2hhcmFjdGVyRGF0YSk7JGIoRWxlbWVudCk7dmFyIGFjLGJjLGNjPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGRjPW51bGwhPT0oYmM9bnVsbD09PShhYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwicGFyZW50Tm9kZVwiKSl8fHZvaWQgMD09PWFjP3ZvaWQgMDphYy5nZXQpJiZ2b2lkIDAhPT1iYz9iYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9O2Z1bmN0aW9uIGVjKGEpe2E9YS5wcm90b3R5cGU7YS5oYXNPd25Qcm9wZXJ0eShcInJlbW92ZVwiKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJyZW1vdmVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYj1kYy5jYWxsKHRoaXMpO2ImJmNjLmNhbGwoYix0aGlzKX19KX1lYyhDaGFyYWN0ZXJEYXRhKTtlYyhFbGVtZW50KTt2YXIgZmMsZ2MsaGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLGljPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGpjPW51bGwhPT0oZ2M9bnVsbD09PShmYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwicGFyZW50Tm9kZVwiKSl8fHZvaWQgMD09PWZjP3ZvaWQgMDpmYy5nZXQpJiZ2b2lkIDAhPT1nYz9nYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9O1xuZnVuY3Rpb24gbGMoYSl7YT1hLnByb3RvdHlwZTthLmhhc093blByb3BlcnR5KFwicmVwbGFjZVdpdGhcIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwicmVwbGFjZVdpdGhcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZF09YXJndW1lbnRzW2RdO2Q9amMuY2FsbCh0aGlzKTtpZihudWxsIT09ZCl7Yz1rYShjKTtmb3IodmFyIGU9Yy5uZXh0KCk7IWUuZG9uZTtlPWMubmV4dCgpKWU9ZS52YWx1ZSxoYy5jYWxsKGQsXCJzdHJpbmdcIj09PXR5cGVvZiBlP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpOmUsdGhpcyk7aWMuY2FsbChkLHRoaXMpfX19KX1sYyhDaGFyYWN0ZXJEYXRhKTtsYyhFbGVtZW50KTt2YXIgbWM9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLG5jPXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsb2M9d2luZG93LlNWR0VsZW1lbnQucHJvdG90eXBlOyFuYy5oYXNPd25Qcm9wZXJ0eShcImNsYXNzTGlzdFwiKXx8bWMuaGFzT3duUHJvcGVydHkoXCJjbGFzc0xpc3RcIil8fG9jLmhhc093blByb3BlcnR5KFwiY2xhc3NMaXN0XCIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkobWMsXCJjbGFzc0xpc3RcIixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5jLFwiY2xhc3NMaXN0XCIpKTt2YXIgcGM9RWxlbWVudC5wcm90b3R5cGUscWM9RWxlbWVudC5wcm90b3R5cGUuaGFzQXR0cmlidXRlLHJjPUVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxzYz1FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU7cGMuaGFzT3duUHJvcGVydHkoXCJ0b2dnbGVBdHRyaWJ1dGVcIil8fChwYy50b2dnbGVBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1iKXtpZihxYy5jYWxsKHRoaXMsYSkpcmV0dXJuIHNjLmNhbGwodGhpcyxhKSwhMTtyYy5jYWxsKHRoaXMsYSxcIlwiKTtyZXR1cm4hMH1pZihiKXJldHVybiBxYy5jYWxsKHRoaXMsYSl8fHJjLmNhbGwodGhpcyxhLFwiXCIpLCEwO3NjLmNhbGwodGhpcyxhKTtyZXR1cm4hMX0pOy8qXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdFxuIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kXG4gYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heVxuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnlcbiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQXG4gcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbnZhciB0Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7dGMudGV4dENvbnRlbnQ9XCJib2R5IHt0cmFuc2l0aW9uOiBvcGFjaXR5IGVhc2UtaW4gMC4yczsgfSBcXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxcblwiO3ZhciB1Yz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiaGVhZFwiKTt1Yy5pbnNlcnRCZWZvcmUodGMsdWMuZmlyc3RDaGlsZCk7dmFyIHZjPXdpbmRvdzt2Yy5XZWJDb21wb25lbnRzPXZjLldlYkNvbXBvbmVudHN8fHtmbGFnczp7fX07dmFyIHdjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPVwid2ViY29tcG9uZW50cy1idW5kbGVcIl0nKSx4Yz0vd2MtKC4rKS8seWM9e307aWYoIXljLm5vT3B0cyl7bG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpLnNwbGl0KFwiJlwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdChcIj1cIik7dmFyIGI7YVswXSYmKGI9YVswXS5tYXRjaCh4YykpJiYoeWNbYlsxXV09YVsxXXx8ITApfSk7aWYod2MpZm9yKHZhciB6Yz0wLEFjPXZvaWQgMDtBYz13Yy5hdHRyaWJ1dGVzW3pjXTt6YysrKVwic3JjXCIhPT1BYy5uYW1lJiYoeWNbQWMubmFtZV09QWMudmFsdWV8fCEwKTt2YXIgQmM9e307eWMubG9nJiZ5Yy5sb2cuc3BsaXQmJnljLmxvZy5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbihhKXtCY1thXT0hMH0pO3ljLmxvZz1CY31cbnZjLldlYkNvbXBvbmVudHMuZmxhZ3M9eWM7dmFyIENjPXljLnNoYWR5ZG9tO2lmKENjKXt2Yy5TaGFkeURPTT12Yy5TaGFkeURPTXx8e307dmMuU2hhZHlET00uZm9yY2U9Q2M7dmFyIERjPXljLm5vUGF0Y2g7dmMuU2hhZHlET00ubm9QYXRjaD1cInRydWVcIj09PURjPyEwOkRjfXZhciBFYz15Yy5yZWdpc3Rlcnx8eWMuY2U7RWMmJndpbmRvdy5jdXN0b21FbGVtZW50cyYmKHZjLmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9RWMpOy8qXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiovXG4oZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fWZ1bmN0aW9uIGIocCxyKXtpZighcC5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5bXTtzd2l0Y2gocC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6cmV0dXJuIEYuY2FsbChwLHIpO2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOnJldHVybiBFLmNhbGwocCxyKTtkZWZhdWx0OnJldHVybiB0LmNhbGwocCxyKX19dmFyIGM9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50LGQ9IShkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuY2xvbmVOb2RlKClpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpLGU9ITE7L1RyaWRlbnQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmZ1bmN0aW9uKCl7ZnVuY3Rpb24gcCh6LFIpe2lmKHogaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcih2YXIgb2I7b2I9ei5maXJzdENoaWxkOylCLmNhbGwodGhpcyxvYixSKTtlbHNlIEIuY2FsbCh0aGlzLFxueixSKTtyZXR1cm4gen1lPSEwO3ZhciByPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oeil7ej1yLmNhbGwodGhpcyx6KTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKHouX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gen07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sXG5jb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5cIiNkb2N1bWVudC1mcmFnbWVudFwifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIEI9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1wO3ZhciBLPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKHope3ogaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3AuY2FsbCh0aGlzLHosbnVsbCk6Sy5jYWxsKHRoaXMseik7cmV0dXJuIHp9O3ZhciBhYT1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxtYT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ7Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKHosUil7eiBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/KHAuY2FsbCh0aGlzLHosUiksYWEuY2FsbCh0aGlzLFIpKTptYS5jYWxsKHRoaXMseixSKTtyZXR1cm4gUn07RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9XG5mdW5jdGlvbigpe3ZhciB6PXRoaXMuY3JlYXRlRWxlbWVudChcImRmXCIpO3ouX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO3JldHVybiB6fTt2YXIgdmE9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU7RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU9ZnVuY3Rpb24oeixSKXtSPXZhLmNhbGwodGhpcyx6LFJ8fCExKTt6IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKFIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gUn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZyxcbkg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24ocCl7dGhpcy5pbm5lckhUTUw9cH19LEM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsXCJjaGlsZE5vZGVzXCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc319LHQ9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxGPURvY3VtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLEU9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxOPWZ1bmN0aW9uKCl7aWYoIWMpe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG5wLmNvbnRlbnQuYXBwZW5kQ2hpbGQocik7cD1wLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1wLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1wLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgeT1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJ0ZW1wbGF0ZVwiKSxYPSEwLHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3gudGV4dENvbnRlbnQ9XCJ0ZW1wbGF0ZXtkaXNwbGF5Om5vbmU7fVwiO3ZhciB0YT1kb2N1bWVudC5oZWFkO3RhLmluc2VydEJlZm9yZSh4LHRhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIGlhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLmhhc093blByb3BlcnR5KFwiaW5uZXJIVE1MXCIpO2EuWj1mdW5jdGlvbihwKXtpZighcC5jb250ZW50JiZwLm5hbWVzcGFjZVVSST09PVxuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSl7cC5jb250ZW50PXkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Zvcih2YXIgcjtyPXAuZmlyc3RDaGlsZDspbC5jYWxsKHAuY29udGVudCxyKTtpZihpYSlwLl9fcHJvdG9fXz1hLnByb3RvdHlwZTtlbHNlIGlmKHAuY2xvbmVOb2RlPWZ1bmN0aW9uKEIpe3JldHVybiBhLnZhKHRoaXMsQil9LFgpdHJ5e24ocCksSihwKX1jYXRjaChCKXtYPSExfWEuYm9vdHN0cmFwKHAuY29udGVudCl9fTt2YXIgc2E9e29wdGlvbjpbXCJzZWxlY3RcIl0sdGhlYWQ6W1widGFibGVcIl0sY29sOltcImNvbGdyb3VwXCIsXCJ0YWJsZVwiXSx0cjpbXCJ0Ym9keVwiLFwidGFibGVcIl0sdGg6W1widHJcIixcInRib2R5XCIsXCJ0YWJsZVwiXSx0ZDpbXCJ0clwiLFwidGJvZHlcIixcInRhYmxlXCJdfSxuPWZ1bmN0aW9uKHApe09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLFwiaW5uZXJIVE1MXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB4YSh0aGlzKX0sc2V0OmZ1bmN0aW9uKHIpe3ZhciBCPVxuc2FbKC88KFthLXpdW14vXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kuZXhlYyhyKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCldO2lmKEIpZm9yKHZhciBLPTA7SzxCLmxlbmd0aDtLKyspcj1cIjxcIitCW0tdK1wiPlwiK3IrXCI8L1wiK0JbS10rXCI+XCI7eS5ib2R5LmlubmVySFRNTD1yO2ZvcihhLmJvb3RzdHJhcCh5KTt0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZDspay5jYWxsKHRoaXMuY29udGVudCx0aGlzLmNvbnRlbnQuZmlyc3RDaGlsZCk7cj15LmJvZHk7aWYoQilmb3IoSz0wO0s8Qi5sZW5ndGg7SysrKXI9ci5sYXN0Q2hpbGQ7Zm9yKDtyLmZpcnN0Q2hpbGQ7KWwuY2FsbCh0aGlzLmNvbnRlbnQsci5maXJzdENoaWxkKX0sY29uZmlndXJhYmxlOiEwfSl9LEo9ZnVuY3Rpb24ocCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHAsXCJvdXRlckhUTUxcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuXCI8dGVtcGxhdGU+XCIrdGhpcy5pbm5lckhUTUwrXCI8L3RlbXBsYXRlPlwifSxzZXQ6ZnVuY3Rpb24ocil7aWYodGhpcy5wYXJlbnROb2RlKXt5LmJvZHkuaW5uZXJIVE1MPVxucjtmb3Iocj10aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO3kuYm9keS5maXJzdENoaWxkOylsLmNhbGwocix5LmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxyLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoXCJGYWlsZWQgdG8gc2V0IHRoZSAnb3V0ZXJIVE1MJyBwcm9wZXJ0eSBvbiAnRWxlbWVudCc6IFRoaXMgZWxlbWVudCBoYXMgbm8gcGFyZW50IG5vZGUuXCIpO30sY29uZmlndXJhYmxlOiEwfSl9O24oYS5wcm90b3R5cGUpO0ooYS5wcm90b3R5cGUpO2EuYm9vdHN0cmFwPWZ1bmN0aW9uKHApe3A9YihwLFwidGVtcGxhdGVcIik7Zm9yKHZhciByPTAsQj1wLmxlbmd0aCxLO3I8QiYmKEs9cFtyXSk7cisrKWEuWihLKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixmdW5jdGlvbigpe2EuYm9vdHN0cmFwKGRvY3VtZW50KX0pO0RvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKCl7dmFyIHA9XG5nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtcInRlbXBsYXRlXCI9PT1wLmxvY2FsTmFtZSYmYS5aKHApO3JldHVybiBwfTtET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZz1mdW5jdGlvbigpe3ZhciBwPXEuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EuYm9vdHN0cmFwKHApO3JldHVybiBwfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIse2dldDpmdW5jdGlvbigpe3JldHVybiB4YSh0aGlzKX0sc2V0OmZ1bmN0aW9uKHApe0guc2V0LmNhbGwodGhpcyxwKTthLmJvb3RzdHJhcCh0aGlzKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTt2YXIgaGE9L1smXFx1MDBBMFwiXS9nLGtjPS9bJlxcdTAwQTA8Pl0vZyxpYj1mdW5jdGlvbihwKXtzd2l0Y2gocCl7Y2FzZSBcIiZcIjpyZXR1cm5cIiZhbXA7XCI7Y2FzZSBcIjxcIjpyZXR1cm5cIiZsdDtcIjtjYXNlIFwiPlwiOnJldHVyblwiJmd0O1wiO2Nhc2UgJ1wiJzpyZXR1cm5cIiZxdW90O1wiO2Nhc2UgXCJcXHUwMGEwXCI6cmV0dXJuXCImbmJzcDtcIn19O1xueD1mdW5jdGlvbihwKXtmb3IodmFyIHI9e30sQj0wO0I8cC5sZW5ndGg7QisrKXJbcFtCXV09ITA7cmV0dXJuIHJ9O3ZhciBWYT14KFwiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnJcIi5zcGxpdChcIiBcIikpLGpiPXgoXCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdFwiLnNwbGl0KFwiIFwiKSkseGE9ZnVuY3Rpb24ocCxyKXtcInRlbXBsYXRlXCI9PT1wLmxvY2FsTmFtZSYmKHA9cC5jb250ZW50KTtmb3IodmFyIEI9XCJcIixLPXI/cihwKTpDLmdldC5jYWxsKHApLGFhPTAsbWE9Sy5sZW5ndGgsdmE7YWE8bWEmJih2YT1LW2FhXSk7YWErKyl7YTp7dmFyIHo9dmE7dmFyIFI9cDt2YXIgb2I9cjtzd2l0Y2goei5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpmb3IodmFyIEtjPXoubG9jYWxOYW1lLHBiPVwiPFwiK0tjLFpoPXouYXR0cmlidXRlcyxcbkhlPTA7Uj1aaFtIZV07SGUrKylwYis9XCIgXCIrUi5uYW1lKyc9XCInK1IudmFsdWUucmVwbGFjZShoYSxpYikrJ1wiJztwYis9XCI+XCI7ej1WYVtLY10/cGI6cGIreGEoeixvYikrXCI8L1wiK0tjK1wiPlwiO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTp6PXouZGF0YTt6PVImJmpiW1IubG9jYWxOYW1lXT96OnoucmVwbGFjZShrYyxpYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOno9XCJcXHgzYyEtLVwiK3ouZGF0YStcIi0tXFx4M2VcIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoeiksRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7fX1CKz16fXJldHVybiBCfX1pZihjfHxOKXthLnZhPWZ1bmN0aW9uKHAscil7dmFyIEI9Zi5jYWxsKHAsITEpO3RoaXMuWiYmdGhpcy5aKEIpO3ImJihsLmNhbGwoQi5jb250ZW50LGYuY2FsbChwLmNvbnRlbnQsITApKSxJKEIuY29udGVudCxwLmNvbnRlbnQpKTtyZXR1cm4gQn07dmFyIEk9ZnVuY3Rpb24ocCxyKXtpZihyLnF1ZXJ5U2VsZWN0b3JBbGwmJlxuKHI9YihyLFwidGVtcGxhdGVcIiksMCE9PXIubGVuZ3RoKSl7cD1iKHAsXCJ0ZW1wbGF0ZVwiKTtmb3IodmFyIEI9MCxLPXAubGVuZ3RoLGFhLG1hO0I8SztCKyspbWE9cltCXSxhYT1wW0JdLGEmJmEuWiYmYS5aKG1hKSxtLmNhbGwoYWEucGFyZW50Tm9kZSx1LmNhbGwobWEsITApLGFhKX19LHU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKHApe2lmKCFlJiZkJiZ0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClpZihwKXZhciByPUcuY2FsbCh0aGlzLm93bmVyRG9jdW1lbnQsdGhpcywhMCk7ZWxzZSByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlbHNlIHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmXCJ0ZW1wbGF0ZVwiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP3I9YS52YSh0aGlzLHApOnI9Zi5jYWxsKHRoaXMsXG5wKTtwJiZJKHIsdGhpcyk7cmV0dXJuIHJ9LEc9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGU9ZnVuY3Rpb24ocCxyKXtyPXJ8fCExO2lmKFwidGVtcGxhdGVcIj09PXAubG9jYWxOYW1lKXJldHVybiBhLnZhKHAscik7dmFyIEI9aC5jYWxsKHRoaXMscCxyKTtpZihyKXtJKEIscCk7cD1iKEIsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIl0sc2NyaXB0W3R5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIl0nKTtmb3IodmFyIEssYWE9MDthYTxwLmxlbmd0aDthYSsrKXtLPXBbYWFdO3I9Zy5jYWxsKGRvY3VtZW50LFwic2NyaXB0XCIpO3IudGV4dENvbnRlbnQ9Sy50ZXh0Q29udGVudDtmb3IodmFyIG1hPUsuYXR0cmlidXRlcyx2YT0wLHo7dmE8bWEubGVuZ3RoO3ZhKyspej1tYVt2YV0sci5zZXRBdHRyaWJ1dGUoei5uYW1lLHoudmFsdWUpO20uY2FsbChLLnBhcmVudE5vZGUscixLKX19cmV0dXJuIEJ9fWMmJih3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudD1cbmEpfSkoKTsvKlxuXG5Db3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xuZnVuY3Rpb24gRmMoKXt9RmMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiBEKGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgRmMpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gTChhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgTT13aW5kb3cuU2hhZHlET018fHt9O00uY2I9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBHYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLFwiZmlyc3RDaGlsZFwiKTtNLkQ9ISEoR2MmJkdjLmNvbmZpZ3VyYWJsZSYmR2MuZ2V0KTtNLkJhPU0uZm9yY2V8fCFNLmNiO00uSj1NLm5vUGF0Y2h8fCExO00uaGE9TS5wcmVmZXJQZXJmb3JtYW5jZTtNLkRhPVwib24tZGVtYW5kXCI9PT1NLko7dmFyIEhjO3ZhciBJYz1NLnF1ZXJ5U2VsZWN0b3JJbXBsZW1lbnRhdGlvbjtIYz0tMTxbXCJuYXRpdmVcIixcInNlbGVjdG9yRW5naW5lXCJdLmluZGV4T2YoSWMpP0ljOnZvaWQgMDtNLndiPUhjO00uUmE9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChcIlRyaWRlbnRcIik7XG5mdW5jdGlvbiBKYygpe3JldHVybiBEb2N1bWVudC5wcm90b3R5cGUubXNFbGVtZW50c0Zyb21Qb2ludD9cIm1zRWxlbWVudHNGcm9tUG9pbnRcIjpcImVsZW1lbnRzRnJvbVBvaW50XCJ9ZnVuY3Rpb24gTGMoYSl7cmV0dXJuKGE9TChhKSkmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZH1mdW5jdGlvbiBPKGEpe3JldHVybiBhIGluc3RhbmNlb2YgU2hhZG93Um9vdH1mdW5jdGlvbiBNYyhhKXtyZXR1cm4oYT0oYT1MKGEpKSYmYS5yb290KSYmTmMoYSl9dmFyIE9jPUVsZW1lbnQucHJvdG90eXBlLFBjPU9jLm1hdGNoZXN8fE9jLm1hdGNoZXNTZWxlY3Rvcnx8T2MubW96TWF0Y2hlc1NlbGVjdG9yfHxPYy5tc01hdGNoZXNTZWxlY3Rvcnx8T2Mub01hdGNoZXNTZWxlY3Rvcnx8T2Mud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFFjPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpLFJjPTAsU2M9W107XG4obmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtmb3IoO1NjLmxlbmd0aDspdHJ5e1NjLnNoaWZ0KCkoKX1jYXRjaChhKXt0aHJvdyBRYy50ZXh0Q29udGVudD1SYysrLGE7fX0pKS5vYnNlcnZlKFFjLHtjaGFyYWN0ZXJEYXRhOiEwfSk7ZnVuY3Rpb24gVGMoYSl7U2MucHVzaChhKTtRYy50ZXh0Q29udGVudD1SYysrfXZhciBVYz1kb2N1bWVudC5jb250YWlucz9mdW5jdGlvbihhLGIpe3JldHVybiBhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGIpfTpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Ynx8YS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGIpfTtmdW5jdGlvbiBWYyhhLGIpe2Zvcig7Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9fc2hhZHlfcGFyZW50Tm9kZX1yZXR1cm4hMX1cbmZ1bmN0aW9uIFdjKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoXCJpZFwiKXx8Yy5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO2QmJlwibGVuZ3RoXCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGUpe3JldHVybiBhW2VdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihlKXtpZihcImxlbmd0aFwiIT09ZSYmaXNOYU4oZSkmJmFbZV0pcmV0dXJuIGFbZV07Zm9yKHZhciBmPWthKGEpLGc9Zi5uZXh0KCk7IWcuZG9uZTtnPWYubmV4dCgpKWlmKGc9Zy52YWx1ZSwoZy5nZXRBdHRyaWJ1dGUoXCJpZFwiKXx8Zy5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpKT09ZSlyZXR1cm4gZztyZXR1cm4gbnVsbH07cmV0dXJuIGF9ZnVuY3Rpb24gWGMoYSl7dmFyIGI9W107Zm9yKGE9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkO2E7YT1hLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nKWIucHVzaChhKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIFljKGEpe3ZhciBiPVtdO2ZvcihhPWEuX19zaGFkeV9maXJzdENoaWxkO2E7YT1hLl9fc2hhZHlfbmV4dFNpYmxpbmcpYi5wdXNoKGEpO3JldHVybiBifWZ1bmN0aW9uIFpjKGEsYixjKXtjLmNvbmZpZ3VyYWJsZT0hMDtpZihjLnZhbHVlKWFbYl09Yy52YWx1ZTtlbHNlIHRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLGMpfWNhdGNoKGQpe319ZnVuY3Rpb24gUChhLGIsYyxkKXtjPXZvaWQgMD09PWM/XCJcIjpjO2Zvcih2YXIgZSBpbiBiKWQmJjA8PWQuaW5kZXhPZihlKXx8WmMoYSxjK2UsYltlXSl9ZnVuY3Rpb24gJGMoYSxiKXtmb3IodmFyIGMgaW4gYiljIGluIGEmJlpjKGEsYyxiW2NdKX1mdW5jdGlvbiBRKGEpe3ZhciBiPXt9O09iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsYyl9KTtyZXR1cm4gYn1cbmZ1bmN0aW9uIGFkKGEsYil7Zm9yKHZhciBjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLGQ9MCxlO2Q8Yy5sZW5ndGg7ZCsrKWU9Y1tkXSxhW2VdPWJbZV19ZnVuY3Rpb24gYmQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBOb2RlP2E6ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIithKX1mdW5jdGlvbiBjZChhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjXT1hcmd1bWVudHNbY107aWYoMT09PWIubGVuZ3RoKXJldHVybiBiZChiWzBdKTtjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtiPWthKGIpO2Zvcih2YXIgZD1iLm5leHQoKTshZC5kb25lO2Q9Yi5uZXh0KCkpYy5hcHBlbmRDaGlsZChiZChkLnZhbHVlKSk7cmV0dXJuIGN9XG5mdW5jdGlvbiBkZChhKXt2YXIgYjtmb3IoYj12b2lkIDA9PT1iPzE6YjswPGI7Yi0tKWE9YS5yZWR1Y2UoZnVuY3Rpb24oYyxkKXtBcnJheS5pc0FycmF5KGQpP2MucHVzaC5hcHBseShjLHcoZCkpOmMucHVzaChkKTtyZXR1cm4gY30sW10pO3JldHVybiBhfWZ1bmN0aW9uIGVkKGEpe3ZhciBiPVtdLGM9bmV3IFNldDthPWthKGEpO2Zvcih2YXIgZD1hLm5leHQoKTshZC5kb25lO2Q9YS5uZXh0KCkpZD1kLnZhbHVlLGMuaGFzKGQpfHwoYi5wdXNoKGQpLGMuYWRkKGQpKTtyZXR1cm4gYn07dmFyIGZkPVtdLGdkO2Z1bmN0aW9uIGhkKGEpe2dkfHwoZ2Q9ITAsVGMoaWQpKTtmZC5wdXNoKGEpfWZ1bmN0aW9uIGlkKCl7Z2Q9ITE7Zm9yKHZhciBhPSEhZmQubGVuZ3RoO2ZkLmxlbmd0aDspZmQuc2hpZnQoKSgpO3JldHVybiBhfWlkLmxpc3Q9ZmQ7ZnVuY3Rpb24gamQoKXt0aGlzLmc9ITE7dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3RoaXMucWE9bmV3IFNldH1mdW5jdGlvbiBrZChhKXthLmd8fChhLmc9ITAsVGMoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9amQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5nKXt0aGlzLmc9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLnFhLmZvckVhY2goZnVuY3Rpb24oYil7YihhKX0pfX07amQucHJvdG90eXBlLnRha2VSZWNvcmRzPWZ1bmN0aW9uKCl7aWYodGhpcy5hZGRlZE5vZGVzLmxlbmd0aHx8dGhpcy5yZW1vdmVkTm9kZXMubGVuZ3RoKXt2YXIgYT1be2FkZGVkTm9kZXM6dGhpcy5hZGRlZE5vZGVzLHJlbW92ZWROb2Rlczp0aGlzLnJlbW92ZWROb2Rlc31dO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTtyZXR1cm4gYX1yZXR1cm5bXX07XG5mdW5jdGlvbiBsZChhLGIpe3ZhciBjPUQoYSk7Yy5nYXx8KGMuZ2E9bmV3IGpkKTtjLmdhLnFhLmFkZChiKTt2YXIgZD1jLmdhO3JldHVybntWYTpiLFg6ZCxXYTphLHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7cmV0dXJuIGQudGFrZVJlY29yZHMoKX19fWZ1bmN0aW9uIG1kKGEpe3ZhciBiPWEmJmEuWDtiJiYoYi5xYS5kZWxldGUoYS5WYSksYi5xYS5zaXplfHwoRChhLldhKS5nYT1udWxsKSl9XG5mdW5jdGlvbiBuZChhLGIpe3ZhciBjPWIuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oZCl7dmFyIGU9Yz09PWQudGFyZ2V0LmdldFJvb3ROb2RlKCk7aWYoZSYmZC5hZGRlZE5vZGVzKXtpZihlPVtdLnNsaWNlLmNhbGwoZC5hZGRlZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuIGM9PT1mLmdldFJvb3ROb2RlKCl9KSxlLmxlbmd0aClyZXR1cm4gZD1PYmplY3QuY3JlYXRlKGQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkLFwiYWRkZWROb2Rlc1wiLHt2YWx1ZTplLGNvbmZpZ3VyYWJsZTohMH0pLGR9ZWxzZSBpZihlKXJldHVybiBkfSkuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkfSl9O3ZhciBvZD0vWyZcXHUwMEEwXCJdL2cscGQ9L1smXFx1MDBBMDw+XS9nO2Z1bmN0aW9uIHFkKGEpe3N3aXRjaChhKXtjYXNlIFwiJlwiOnJldHVyblwiJmFtcDtcIjtjYXNlIFwiPFwiOnJldHVyblwiJmx0O1wiO2Nhc2UgXCI+XCI6cmV0dXJuXCImZ3Q7XCI7Y2FzZSAnXCInOnJldHVyblwiJnF1b3Q7XCI7Y2FzZSBcIlxcdTAwYTBcIjpyZXR1cm5cIiZuYnNwO1wifX1mdW5jdGlvbiByZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIHNkPXJkKFwiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnJcIi5zcGxpdChcIiBcIikpLHRkPXJkKFwic3R5bGUgc2NyaXB0IHhtcCBpZnJhbWUgbm9lbWJlZCBub2ZyYW1lcyBwbGFpbnRleHQgbm9zY3JpcHRcIi5zcGxpdChcIiBcIikpO1xuZnVuY3Rpb24gdWQoYSxiKXtcInRlbXBsYXRlXCI9PT1hLmxvY2FsTmFtZSYmKGE9YS5jb250ZW50KTtmb3IodmFyIGM9XCJcIixkPWI/YihhKTphLmNoaWxkTm9kZXMsZT0wLGY9ZC5sZW5ndGgsZz12b2lkIDA7ZTxmJiYoZz1kW2VdKTtlKyspe2E6e3ZhciBoPWc7dmFyIGs9YSxsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6az1oLmxvY2FsTmFtZTtmb3IodmFyIG09XCI8XCIrayxxPWguYXR0cmlidXRlcyxIPTAsQztDPXFbSF07SCsrKW0rPVwiIFwiK0MubmFtZSsnPVwiJytDLnZhbHVlLnJlcGxhY2Uob2QscWQpKydcIic7bSs9XCI+XCI7aD1zZFtrXT9tOm0rdWQoaCxsKStcIjwvXCIraytcIj5cIjticmVhayBhO2Nhc2UgTm9kZS5URVhUX05PREU6aD1oLmRhdGE7aD1rJiZ0ZFtrLmxvY2FsTmFtZV0/aDpoLnJlcGxhY2UocGQscWQpO2JyZWFrIGE7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpoPVwiXFx4M2MhLS1cIitoLmRhdGErXCItLVxceDNlXCI7YnJlYWsgYTtkZWZhdWx0OnRocm93IHdpbmRvdy5jb25zb2xlLmVycm9yKGgpLFxuRXJyb3IoXCJub3QgaW1wbGVtZW50ZWRcIik7fX1jKz1ofXJldHVybiBjfTt2YXIgdmQ9TS5ELHdkPXtxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3F1ZXJ5U2VsZWN0b3IoYSl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKX19LHhkPXt9O2Z1bmN0aW9uIHlkKGEpe3hkW2FdPWZ1bmN0aW9uKGIpe3JldHVybiBiW1wiX19zaGFkeV9uYXRpdmVfXCIrYV19fWZ1bmN0aW9uIHpkKGEsYil7UChhLGIsXCJfX3NoYWR5X25hdGl2ZV9cIik7Zm9yKHZhciBjIGluIGIpeWQoYyl9ZnVuY3Rpb24gUyhhLGIpe2I9dm9pZCAwPT09Yj9bXTpiO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGQpO2UmJihPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcIl9fc2hhZHlfbmF0aXZlX1wiK2QsZSksZS52YWx1ZT93ZFtkXXx8KHdkW2RdPWUudmFsdWUpOnlkKGQpKX19XG52YXIgQWQ9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEJkPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQsbnVsbCwhMSksQ2Q9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiaW5lcnRcIik7ZnVuY3Rpb24gRGQoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciBFZD1bXCJmaXJzdEVsZW1lbnRDaGlsZFwiLFwibGFzdEVsZW1lbnRDaGlsZFwiLFwiY2hpbGRyZW5cIixcImNoaWxkRWxlbWVudENvdW50XCJdLEZkPVtcInF1ZXJ5U2VsZWN0b3JcIixcInF1ZXJ5U2VsZWN0b3JBbGxcIixcImFwcGVuZFwiLFwicHJlcGVuZFwiLFwicmVwbGFjZUNoaWxkcmVuXCJdO1xuZnVuY3Rpb24gR2QoKXt2YXIgYT1bXCJkaXNwYXRjaEV2ZW50XCIsXCJhZGRFdmVudExpc3RlbmVyXCIsXCJyZW1vdmVFdmVudExpc3RlbmVyXCJdO3dpbmRvdy5FdmVudFRhcmdldD8oUyh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpLHZvaWQgMD09PXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyJiZTKFdpbmRvdy5wcm90b3R5cGUsYSkpOihTKE5vZGUucHJvdG90eXBlLGEpLFMoV2luZG93LnByb3RvdHlwZSxhKSxTKFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSxhKSk7dmQ/UyhOb2RlLnByb3RvdHlwZSxcInBhcmVudE5vZGUgZmlyc3RDaGlsZCBsYXN0Q2hpbGQgcHJldmlvdXNTaWJsaW5nIG5leHRTaWJsaW5nIGNoaWxkTm9kZXMgcGFyZW50RWxlbWVudCB0ZXh0Q29udGVudFwiLnNwbGl0KFwiIFwiKSk6emQoTm9kZS5wcm90b3R5cGUse3BhcmVudE5vZGU6e2dldDpmdW5jdGlvbigpe0FkLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEFkLnBhcmVudE5vZGUoKX19LFxuZmlyc3RDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7QWQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQWQuZmlyc3RDaGlsZCgpfX0sbGFzdENoaWxkOntnZXQ6ZnVuY3Rpb24oKXtBZC5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBBZC5sYXN0Q2hpbGQoKX19LHByZXZpb3VzU2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7QWQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQWQucHJldmlvdXNTaWJsaW5nKCl9fSxuZXh0U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7QWQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQWQubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBiPVtdO0FkLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUFkLmZpcnN0Q2hpbGQoKTtjOyliLnB1c2goYyksYz1BZC5uZXh0U2libGluZygpO3JldHVybiBifX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7QmQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQmQucGFyZW50Tm9kZSgpfX0sdGV4dENvbnRlbnQ6e2dldDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmZvcih2YXIgYj1cbmRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodGhpcyxOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPVwiXCIsZDtkPWIubmV4dE5vZGUoKTspYys9ZC5ub2RlVmFsdWU7cmV0dXJuIGM7ZGVmYXVsdDpyZXR1cm4gdGhpcy5ub2RlVmFsdWV9fSxzZXQ6ZnVuY3Rpb24oYil7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBifHxudWxsPT09YiliPVwiXCI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6RGQodGhpcyk7KDA8Yi5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGIpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1ifX19fSk7UyhOb2RlLnByb3RvdHlwZSxcImFwcGVuZENoaWxkIGluc2VydEJlZm9yZSByZW1vdmVDaGlsZCByZXBsYWNlQ2hpbGQgY2xvbmVOb2RlIGNvbnRhaW5zXCIuc3BsaXQoXCIgXCIpKTtcblMoSFRNTEVsZW1lbnQucHJvdG90eXBlLFtcInBhcmVudEVsZW1lbnRcIixcImNvbnRhaW5zXCJdKTthPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7QmQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQmQuZmlyc3RDaGlsZCgpfX0sbGFzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7QmQuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gQmQubGFzdENoaWxkKCl9fSxjaGlsZHJlbjp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGI9W107QmQuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9QmQuZmlyc3RDaGlsZCgpO2M7KWIucHVzaChjKSxjPUJkLm5leHRTaWJsaW5nKCk7cmV0dXJuIFdjKGIpfX0sY2hpbGRFbGVtZW50Q291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuP3RoaXMuY2hpbGRyZW4ubGVuZ3RoOjB9fX07dmQ/KFMoRWxlbWVudC5wcm90b3R5cGUsRWQpLFMoRWxlbWVudC5wcm90b3R5cGUsW1wicHJldmlvdXNFbGVtZW50U2libGluZ1wiLFwibmV4dEVsZW1lbnRTaWJsaW5nXCIsXG5cImlubmVySFRNTFwiLFwiY2xhc3NOYW1lXCJdKSxTKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbXCJjaGlsZHJlblwiLFwiaW5uZXJIVE1MXCIsXCJjbGFzc05hbWVcIl0pKTooemQoRWxlbWVudC5wcm90b3R5cGUsYSksemQoRWxlbWVudC5wcm90b3R5cGUse3ByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe0JkLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEJkLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtCZC5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBCZC5uZXh0U2libGluZygpfX0saW5uZXJIVE1MOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWQodGhpcyxYYyl9LHNldDpmdW5jdGlvbihiKXt2YXIgYz1cInRlbXBsYXRlXCI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcztEZChjKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8XCJkaXZcIjtkPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUNkLm5hbWVzcGFjZVVSST9cbkNkLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxkKTpDZC5jcmVhdGVFbGVtZW50KGQpO2QuaW5uZXJIVE1MPWI7Zm9yKGI9XCJ0ZW1wbGF0ZVwiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19LGNsYXNzTmFtZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCJ9LHNldDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsYil9fX0pKTtTKEVsZW1lbnQucHJvdG90eXBlLFwic2V0QXR0cmlidXRlIGdldEF0dHJpYnV0ZSBoYXNBdHRyaWJ1dGUgcmVtb3ZlQXR0cmlidXRlIHRvZ2dsZUF0dHJpYnV0ZSBmb2N1cyBibHVyXCIuc3BsaXQoXCIgXCIpKTtTKEVsZW1lbnQucHJvdG90eXBlLEZkKTtTKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbXCJmb2N1c1wiLFwiYmx1clwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJlxuUyh3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUsW1wiaW5uZXJIVE1MXCJdKTt2ZD9TKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLEVkKTp6ZChEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSxhKTtTKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLEZkKTt2ZD8oUyhEb2N1bWVudC5wcm90b3R5cGUsRWQpLFMoRG9jdW1lbnQucHJvdG90eXBlLFtcImFjdGl2ZUVsZW1lbnRcIl0pKTp6ZChEb2N1bWVudC5wcm90b3R5cGUsYSk7UyhEb2N1bWVudC5wcm90b3R5cGUsW1wiaW1wb3J0Tm9kZVwiLFwiZ2V0RWxlbWVudEJ5SWRcIixcImVsZW1lbnRGcm9tUG9pbnRcIixKYygpXSk7UyhEb2N1bWVudC5wcm90b3R5cGUsRmQpfTt2YXIgSGQ9USh7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGRFbGVtZW50Q291bnR9LGdldCBjaGlsZHJlbigpe3JldHVybiB0aGlzLl9fc2hhZHlfY2hpbGRyZW59LGdldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3JldHVybiB0aGlzLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9LGdldCBsYXN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0RWxlbWVudENoaWxkfSxnZXQgc2hhZG93Um9vdCgpe3JldHVybiB0aGlzLl9fc2hhZHlfc2hhZG93Um9vdH19KSxJZD1RKHtnZXQgdGV4dENvbnRlbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3RleHRDb250ZW50fSxzZXQgdGV4dENvbnRlbnQoYSl7dGhpcy5fX3NoYWR5X3RleHRDb250ZW50PVxuYX0sZ2V0IGlubmVySFRNTCgpe3JldHVybiB0aGlzLl9fc2hhZHlfaW5uZXJIVE1MfSxzZXQgaW5uZXJIVE1MKGEpe3RoaXMuX19zaGFkeV9pbm5lckhUTUw9YX19KSxKZD1RKHtnZXQgcGFyZW50RWxlbWVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfcGFyZW50RWxlbWVudH0sZ2V0IHBhcmVudE5vZGUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudE5vZGV9LGdldCBuZXh0U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZ30sZ2V0IG5leHRFbGVtZW50U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfbmV4dEVsZW1lbnRTaWJsaW5nfSxnZXQgcHJldmlvdXNFbGVtZW50U2libGluZygpe3JldHVybiB0aGlzLl9fc2hhZHlfcHJldmlvdXNFbGVtZW50U2libGluZ30sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLl9fc2hhZHlfY2xhc3NOYW1lfSxzZXQgY2xhc3NOYW1lKGEpe3RoaXMuX19zaGFkeV9jbGFzc05hbWU9XG5hfX0pO2Z1bmN0aW9uIEtkKGEpe2Zvcih2YXIgYiBpbiBhKXt2YXIgYz1hW2JdO2MmJihjLmVudW1lcmFibGU9ITEpfX1LZChIZCk7S2QoSWQpO0tkKEpkKTt2YXIgTGQ9TS5EfHwhMD09PU0uSixNZD1MZD9mdW5jdGlvbigpe306ZnVuY3Rpb24oYSl7dmFyIGI9RChhKTtiLlRhfHwoYi5UYT0hMCwkYyhhLEpkKSl9LE5kPUxkP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj1EKGEpO2IuU2F8fChiLlNhPSEwLCRjKGEsSGQpLHdpbmRvdy5jdXN0b21FbGVtZW50cyYmd2luZG93LmN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2smJiFNLkp8fCRjKGEsSWQpKX07dmFyIE9kPVwiX19ldmVudFdyYXBwZXJzXCIrRGF0ZS5ub3coKSxQZD1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLFwiY29tcG9zZWRcIik7cmV0dXJuIGE/ZnVuY3Rpb24oYil7cmV0dXJuIGEuZ2V0LmNhbGwoYil9Om51bGx9KCksUWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7fXZhciBiPSExLGM9e2dldCBjYXB0dXJlKCl7Yj0hMDtyZXR1cm4hMX19O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdFwiLGEsYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsYSxjKTtyZXR1cm4gYn0oKTtmdW5jdGlvbiBSZChhKXtpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSl7dmFyIGI9ISFhO3ZhciBjPSExfWVsc2V7Yj0hIWEuY2FwdHVyZTtjPSEhYS5vbmNlO3ZhciBkPWEuVX1yZXR1cm57UGE6ZCxjYXB0dXJlOmIsb25jZTpjLE5hOlFkP2E6Yn19XG52YXIgU2Q9e2JsdXI6ITAsZm9jdXM6ITAsZm9jdXNpbjohMCxmb2N1c291dDohMCxjbGljazohMCxkYmxjbGljazohMCxtb3VzZWRvd246ITAsbW91c2VlbnRlcjohMCxtb3VzZWxlYXZlOiEwLG1vdXNlbW92ZTohMCxtb3VzZW91dDohMCxtb3VzZW92ZXI6ITAsbW91c2V1cDohMCx3aGVlbDohMCxiZWZvcmVpbnB1dDohMCxpbnB1dDohMCxrZXlkb3duOiEwLGtleXVwOiEwLGNvbXBvc2l0aW9uc3RhcnQ6ITAsY29tcG9zaXRpb251cGRhdGU6ITAsY29tcG9zaXRpb25lbmQ6ITAsdG91Y2hzdGFydDohMCx0b3VjaGVuZDohMCx0b3VjaG1vdmU6ITAsdG91Y2hjYW5jZWw6ITAscG9pbnRlcm92ZXI6ITAscG9pbnRlcmVudGVyOiEwLHBvaW50ZXJkb3duOiEwLHBvaW50ZXJtb3ZlOiEwLHBvaW50ZXJ1cDohMCxwb2ludGVyY2FuY2VsOiEwLHBvaW50ZXJvdXQ6ITAscG9pbnRlcmxlYXZlOiEwLGdvdHBvaW50ZXJjYXB0dXJlOiEwLGxvc3Rwb2ludGVyY2FwdHVyZTohMCxkcmFnc3RhcnQ6ITAsXG5kcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LFRkPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07ZnVuY3Rpb24gVWQoYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBOb2RlP2EuX19zaGFkeV9nZXRSb290Tm9kZSgpOmF9XG5mdW5jdGlvbiBWZChhLGIpe3ZhciBjPVtdLGQ9YTtmb3IoYT1VZChhKTtkOyljLnB1c2goZCksZD1kLl9fc2hhZHlfYXNzaWduZWRTbG90P2QuX19zaGFkeV9hc3NpZ25lZFNsb3Q6ZC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmZC5ob3N0JiYoYnx8ZCE9PWEpP2QuaG9zdDpkLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIFdkKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPVZkKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9ZnVuY3Rpb24gWGQoYSxiKXtpZighTylyZXR1cm4gYTthPVZkKGEsITApO2Zvcih2YXIgYz0wLGQsZT12b2lkIDAsZixnPXZvaWQgMDtjPGIubGVuZ3RoO2MrKylpZihkPWJbY10sZj1VZChkKSxmIT09ZSYmKGc9YS5pbmRleE9mKGYpLGU9ZiksIU8oZil8fC0xPGcpcmV0dXJuIGR9XG52YXIgWWQ9e2dldCBjb21wb3NlZCgpe3ZvaWQgMD09PXRoaXMuX19jb21wb3NlZCYmKFBkP3RoaXMuX19jb21wb3NlZD1cImZvY3VzaW5cIj09PXRoaXMudHlwZXx8XCJmb2N1c291dFwiPT09dGhpcy50eXBlfHxQZCh0aGlzKTohMSE9PXRoaXMuaXNUcnVzdGVkJiYodGhpcy5fX2NvbXBvc2VkPVNkW3RoaXMudHlwZV0pKTtyZXR1cm4gdGhpcy5fX2NvbXBvc2VkfHwhMX0sY29tcG9zZWRQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fX2NvbXBvc2VkUGF0aHx8KHRoaXMuX19jb21wb3NlZFBhdGg9VmQodGhpcy5fX3RhcmdldCx0aGlzLmNvbXBvc2VkKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZFBhdGh9LGdldCB0YXJnZXQoKXtyZXR1cm4gWGQodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuY29tcG9zZWRQYXRoKCkpfSxnZXQgcmVsYXRlZFRhcmdldCgpe2lmKCF0aGlzLl9fcmVsYXRlZFRhcmdldClyZXR1cm4gbnVsbDt0aGlzLl9fcmVsYXRlZFRhcmdldENvbXBvc2VkUGF0aHx8XG4odGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9VmQodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gWGQodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMudWE9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe0V2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24uY2FsbCh0aGlzKTt0aGlzLnVhPXRoaXMuX19pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITB9fSxaZD1NLkQmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLFwiZXZlbnRQaGFzZVwiKTtcblpkJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KFlkLFwiZXZlbnRQaGFzZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50VGFyZ2V0PT09dGhpcy50YXJnZXQ/RXZlbnQuQVRfVEFSR0VUOnRoaXMuX19zaGFkeV9uYXRpdmVfZXZlbnRQaGFzZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoWWQsXCJfX3NoYWR5X25hdGl2ZV9ldmVudFBoYXNlXCIsWmQpKTtmdW5jdGlvbiAkZChhKXtmdW5jdGlvbiBiKGMsZCl7Yz1uZXcgYShjLGQpO2MuX19jb21wb3NlZD1kJiYhIWQuY29tcG9zZWQ7cmV0dXJuIGN9Yi5fX3Byb3RvX189YTtiLnByb3RvdHlwZT1hLnByb3RvdHlwZTtyZXR1cm4gYn12YXIgYWU9e2ZvY3VzOiEwLGJsdXI6ITB9O2Z1bmN0aW9uIGJlKGEpe3JldHVybiBhLl9fdGFyZ2V0IT09YS50YXJnZXR8fGEuX19yZWxhdGVkVGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0fVxuZnVuY3Rpb24gY2UoYSxiLGMpe2lmKGM9Yi5fX2hhbmRsZXJzJiZiLl9faGFuZGxlcnNbYS50eXBlXSYmYi5fX2hhbmRsZXJzW2EudHlwZV1bY10pZm9yKHZhciBkPTAsZTsoZT1jW2RdKSYmKCFiZShhKXx8YS50YXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXQpJiYoZS5jYWxsKGIsYSksIWEuX19pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQpO2QrKyk7fXZhciBkZT0obmV3IEV2ZW50KFwiZVwiKSkuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50VGFyZ2V0XCIpO1xuZnVuY3Rpb24gZWUoYSl7YT1kZT9PYmplY3QuY3JlYXRlKGEpOmE7dmFyIGI9YS5jb21wb3NlZFBhdGgoKSxjPWIubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBYZChtLGIpfSksZD1hLmJ1YmJsZXMsZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsXCJjdXJyZW50VGFyZ2V0XCIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiY3VycmVudFRhcmdldFwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ga319KTt2YXIgZj1FdmVudC5DQVBUVVJJTkdfUEhBU0UsZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsXCJldmVudFBoYXNlXCIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFwiZXZlbnRQaGFzZVwiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZn19KTt0cnl7Zm9yKHZhciBoPWIubGVuZ3RoLTE7MDw9aDtoLS0pe3ZhciBrPWJbaF07Zj1rPT09Y1toXT9FdmVudC5BVF9UQVJHRVQ6XG5FdmVudC5DQVBUVVJJTkdfUEhBU0U7Y2UoYSxrLFwiY2FwdHVyZVwiKTtpZihhLnVhKXJldHVybn1mb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtrPWJbaF07dmFyIGw9az09PWNbaF07aWYobHx8ZClpZihmPWw/RXZlbnQuQVRfVEFSR0VUOkV2ZW50LkJVQkJMSU5HX1BIQVNFLGNlKGEsayxcImJ1YmJsZVwiKSxhLnVhKWJyZWFrfX1maW5hbGx5e2RlfHwoZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcImN1cnJlbnRUYXJnZXRcIixlKTpkZWxldGUgYS5jdXJyZW50VGFyZ2V0LGc/T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJldmVudFBoYXNlXCIsZyk6ZGVsZXRlIGEuZXZlbnRQaGFzZSl9fWZ1bmN0aW9uIGZlKGEsYixjLGQpe2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZj1hW2VdLGc9Zi50eXBlLGg9Zi5jYXB0dXJlO2lmKGI9PT1mLm5vZGUmJmM9PT1nJiZkPT09aClyZXR1cm4gZX1yZXR1cm4tMX1cbmZ1bmN0aW9uIGdlKGEpe2lkKCk7cmV0dXJuIU0uaGEmJnRoaXMgaW5zdGFuY2VvZiBOb2RlJiYhVWMoZG9jdW1lbnQsdGhpcyk/KGEuX190YXJnZXR8fGhlKGEsdGhpcyksZWUoYSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX1cbmZ1bmN0aW9uIGllKGEsYixjKXt2YXIgZD10aGlzLGU9UmQoYyksZj1lLmNhcHR1cmUsZz1lLm9uY2UsaD1lLlBhO2U9ZS5OYTtpZihiKXt2YXIgaz10eXBlb2YgYjtpZihcImZ1bmN0aW9uXCI9PT1rfHxcIm9iamVjdFwiPT09aylpZihcIm9iamVjdFwiIT09a3x8Yi5oYW5kbGVFdmVudCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGIuaGFuZGxlRXZlbnQpe2lmKFRkW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxiLGUpO3ZhciBsPWh8fHRoaXM7aWYoaD1iW09kXSl7aWYoLTE8ZmUoaCxsLGEsZikpcmV0dXJufWVsc2UgYltPZF09W107aD1mdW5jdGlvbihtKXtnJiZkLl9fc2hhZHlfcmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGIsYyk7bS5fX3RhcmdldHx8aGUobSk7aWYobCE9PWQpe3ZhciBxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSxcImN1cnJlbnRUYXJnZXRcIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sXCJjdXJyZW50VGFyZ2V0XCIse2dldDpmdW5jdGlvbigpe3JldHVybiBsfSxcbmNvbmZpZ3VyYWJsZTohMH0pO3ZhciBIPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSxcImV2ZW50UGhhc2VcIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sXCJldmVudFBoYXNlXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmP0V2ZW50LkNBUFRVUklOR19QSEFTRTpFdmVudC5CVUJCTElOR19QSEFTRX19KX1tLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0PW0uY3VycmVudFRhcmdldDtpZighTyhsKSYmXCJzbG90XCIhPT1sLmxvY2FsTmFtZXx8LTEhPW0uY29tcG9zZWRQYXRoKCkuaW5kZXhPZihsKSlpZihtLmNvbXBvc2VkfHwtMTxtLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YobCkpaWYoYmUobSkmJm0udGFyZ2V0PT09bS5yZWxhdGVkVGFyZ2V0KW0uZXZlbnRQaGFzZT09PUV2ZW50LkJVQkJMSU5HX1BIQVNFJiZtLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO2Vsc2UgaWYobS5ldmVudFBoYXNlPT09RXZlbnQuQ0FQVFVSSU5HX1BIQVNFfHxcbm0uYnViYmxlc3x8bS50YXJnZXQ9PT1sfHxsIGluc3RhbmNlb2YgV2luZG93KXt2YXIgQz1cImZ1bmN0aW9uXCI9PT1rP2IuY2FsbChsLG0pOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQobSk7bCE9PWQmJihxPyhPYmplY3QuZGVmaW5lUHJvcGVydHkobSxcImN1cnJlbnRUYXJnZXRcIixxKSxxPW51bGwpOmRlbGV0ZSBtLmN1cnJlbnRUYXJnZXQsSD8oT2JqZWN0LmRlZmluZVByb3BlcnR5KG0sXCJldmVudFBoYXNlXCIsSCksSD1udWxsKTpkZWxldGUgbS5ldmVudFBoYXNlKTtyZXR1cm4gQ319O2JbT2RdLnB1c2goe25vZGU6bCx0eXBlOmEsY2FwdHVyZTpmLHViOmh9KTt0aGlzLl9faGFuZGxlcnM9dGhpcy5fX2hhbmRsZXJzfHx7fTt0aGlzLl9faGFuZGxlcnNbYV09dGhpcy5fX2hhbmRsZXJzW2FdfHx7Y2FwdHVyZTpbXSxidWJibGU6W119O3RoaXMuX19oYW5kbGVyc1thXVtmP1wiY2FwdHVyZVwiOlwiYnViYmxlXCJdLnB1c2goaCk7YWVbYV18fHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLFxuaCxlKX19fWZ1bmN0aW9uIGplKGEsYixjKXtpZihiKXt2YXIgZD1SZChjKTtjPWQuY2FwdHVyZTt2YXIgZT1kLlBhO2Q9ZC5OYTtpZihUZFthXSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixkKTt2YXIgZj1lfHx0aGlzO2U9dm9pZCAwO3ZhciBnPW51bGw7dHJ5e2c9YltPZF19Y2F0Y2goaCl7fWcmJihmPWZlKGcsZixhLGMpLC0xPGYmJihlPWcuc3BsaWNlKGYsMSlbMF0udWIsZy5sZW5ndGh8fChiW09kXT12b2lkIDApKSk7dGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVFdmVudExpc3RlbmVyKGEsZXx8YixkKTtlJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2M/XCJjYXB0dXJlXCI6XCJidWJibGVcIl0sYj1hLmluZGV4T2YoZSksLTE8YiYmYS5zcGxpY2UoYiwxKSl9fVxuZnVuY3Rpb24ga2UoKXtmb3IodmFyIGEgaW4gYWUpd2luZG93Ll9fc2hhZHlfbmF0aXZlX2FkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtiLl9fdGFyZ2V0fHwoaGUoYiksZWUoYikpfSwhMCl9dmFyIGxlPVEoWWQpO2Z1bmN0aW9uIGhlKGEsYil7Yj12b2lkIDA9PT1iP2EudGFyZ2V0OmI7YS5fX3RhcmdldD1iO2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZihNLkQpe2I9T2JqZWN0LmdldFByb3RvdHlwZU9mKGEpO2lmKCFiLmhhc093blByb3BlcnR5KFwiX19zaGFkeV9wYXRjaGVkUHJvdG9cIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7UChjLGxlKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIFAoYSxsZSl9dmFyIG1lPSRkKEV2ZW50KSxuZT0kZChDdXN0b21FdmVudCksb2U9JGQoTW91c2VFdmVudCk7XG5mdW5jdGlvbiBwZSgpe2lmKCFQZCYmT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFdmVudC5wcm90b3R5cGUsXCJpc1RydXN0ZWRcIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGI9bmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY29tcG9zZWQ6ITB9KTt0aGlzLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChiKX07RWxlbWVudC5wcm90b3R5cGUuY2xpY2s/RWxlbWVudC5wcm90b3R5cGUuY2xpY2s9YTpIVE1MRWxlbWVudC5wcm90b3R5cGUuY2xpY2smJihIVE1MRWxlbWVudC5wcm90b3R5cGUuY2xpY2s9YSl9fVxudmFyIHFlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEVsZW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuXCJvblwiPT09YS5zdWJzdHJpbmcoMCwyKX0pLHJlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEhUTUxFbGVtZW50LnByb3RvdHlwZSkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVyblwib25cIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBzZShhKXtyZXR1cm57c2V0OmZ1bmN0aW9uKGIpe3ZhciBjPUQodGhpcyksZD1hLnN1YnN0cmluZygyKTtjLlR8fChjLlQ9e30pO2MuVFthXSYmdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGQsYy5UW2FdKTt0aGlzLl9fc2hhZHlfYWRkRXZlbnRMaXN0ZW5lcihkLGIpO2MuVFthXT1ifSxnZXQ6ZnVuY3Rpb24oKXt2YXIgYj1MKHRoaXMpO3JldHVybiBiJiZiLlQmJmIuVFthXX0sY29uZmlndXJhYmxlOiEwfX07ZnVuY3Rpb24gdGUoYSxiKXtyZXR1cm57aW5kZXg6YSxpYTpbXSxwYTpifX1cbmZ1bmN0aW9uIHVlKGEsYixjLGQpe3ZhciBlPTAsZj0wLGc9MCxoPTAsaz1NYXRoLm1pbihiLWUsZC1mKTtpZigwPT1lJiYwPT1mKWE6e2ZvcihnPTA7ZzxrO2crKylpZihhW2ddIT09Y1tnXSlicmVhayBhO2c9a31pZihiPT1hLmxlbmd0aCYmZD09Yy5sZW5ndGgpe2g9YS5sZW5ndGg7Zm9yKHZhciBsPWMubGVuZ3RoLG09MDttPGstZyYmdmUoYVstLWhdLGNbLS1sXSk7KW0rKztoPW19ZSs9ZztmKz1nO2ItPWg7ZC09aDtpZigwPT1iLWUmJjA9PWQtZilyZXR1cm5bXTtpZihlPT1iKXtmb3IoYj10ZShlLDApO2Y8ZDspYi5pYS5wdXNoKGNbZisrXSk7cmV0dXJuW2JdfWlmKGY9PWQpcmV0dXJuW3RlKGUsYi1lKV07az1lO2c9ZjtkPWQtZysxO2g9Yi1rKzE7Yj1BcnJheShkKTtmb3IobD0wO2w8ZDtsKyspYltsXT1BcnJheShoKSxiW2xdWzBdPWw7Zm9yKGw9MDtsPGg7bCsrKWJbMF1bbF09bDtmb3IobD0xO2w8ZDtsKyspZm9yKG09MTttPGg7bSsrKWlmKGFbayttLTFdPT09Y1tnK2wtMV0pYltsXVttXT1cbmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEsSD1iW2xdW20tMV0rMTtiW2xdW21dPXE8SD9xOkh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPXRlKGUsMCkpO2IucGErKztlKys7Yi5pYS5wdXNoKGNbZl0pO2YrKzticmVhaztjYXNlIDI6Ynx8KGI9dGUoZSxcbjApKTtiLnBhKys7ZSsrO2JyZWFrO2Nhc2UgMzpifHwoYj10ZShlLDApKSxiLmlhLnB1c2goY1tmXSksZisrfWImJmsucHVzaChiKTtyZXR1cm4ga31mdW5jdGlvbiB2ZShhLGIpe3JldHVybiBhPT09Yn07dmFyIHdlPVEoe2Rpc3BhdGNoRXZlbnQ6Z2UsYWRkRXZlbnRMaXN0ZW5lcjppZSxyZW1vdmVFdmVudExpc3RlbmVyOmplfSk7dmFyIHhlPW51bGw7ZnVuY3Rpb24geWUoKXt4ZXx8KHhlPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4geGV8fG51bGx9ZnVuY3Rpb24gemUoYSxiLGMpe3ZhciBkPXllKCk7cmV0dXJuIGQmJlwiY2xhc3NcIj09PWI/KGQuc2V0RWxlbWVudENsYXNzKGEsYyksITApOiExfWZ1bmN0aW9uIEFlKGEsYil7dmFyIGM9eWUoKTtjJiZjLnVuc2NvcGVOb2RlKGEsYil9ZnVuY3Rpb24gQmUoYSxiKXt2YXIgYz15ZSgpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7Zm9yKGE9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YTthPWEuX19zaGFkeV9uZXh0U2libGluZyljPWMmJkJlKGEsYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifVxuZnVuY3Rpb24gQ2UoYSl7aWYoYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVyblwiXCI7dmFyIGI9eWUoKTtyZXR1cm4gYj9iLmN1cnJlbnRTY29wZUZvck5vZGUoYSk6XCJcIn1mdW5jdGlvbiBEZShhLGIpe2lmKGEpZm9yKGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKSxhPWEuX19zaGFkeV9maXJzdENoaWxkO2E7YT1hLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZEZShhLGIpfTt2YXIgRWU9d2luZG93LmRvY3VtZW50LEZlPU0uaGEsR2U9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSxcImlzQ29ubmVjdGVkXCIpLEllPUdlJiZHZS5nZXQ7ZnVuY3Rpb24gSmUoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBLZShhKXt2YXIgYj1MKGEpO2lmKGImJnZvaWQgMCE9PWIudGEpZm9yKGI9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YjtiPWIuX19zaGFkeV9uZXh0U2libGluZylLZShiKTtpZihhPUwoYSkpYS50YT12b2lkIDB9ZnVuY3Rpb24gTGUoYSl7dmFyIGI9YTtpZihhJiZcInNsb3RcIj09PWEubG9jYWxOYW1lKXt2YXIgYz1MKGEpOyhjPWMmJmMuYWEpJiYoYj1jLmxlbmd0aD9jWzBdOkxlKGEuX19zaGFkeV9uZXh0U2libGluZykpfXJldHVybiBifVxuZnVuY3Rpb24gTWUoYSxiLGMpe2lmKGE9KGE9TChhKSkmJmEuZ2Epe2lmKGIpaWYoYi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlmb3IodmFyIGQ9MCxlPWIuY2hpbGROb2Rlcy5sZW5ndGg7ZDxlO2QrKylhLmFkZGVkTm9kZXMucHVzaChiLmNoaWxkTm9kZXNbZF0pO2Vsc2UgYS5hZGRlZE5vZGVzLnB1c2goYik7YyYmYS5yZW1vdmVkTm9kZXMucHVzaChjKTtrZChhKX19XG52YXIgVGU9USh7Z2V0IHBhcmVudE5vZGUoKXt2YXIgYT1MKHRoaXMpO2E9YSYmYS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlfSxnZXQgZmlyc3RDaGlsZCgpe3ZhciBhPUwodGhpcyk7YT1hJiZhLmZpcnN0Q2hpbGQ7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGR9LGdldCBsYXN0Q2hpbGQoKXt2YXIgYT1MKHRoaXMpO2E9YSYmYS5sYXN0Q2hpbGQ7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX2xhc3RDaGlsZH0sZ2V0IG5leHRTaWJsaW5nKCl7dmFyIGE9TCh0aGlzKTthPWEmJmEubmV4dFNpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7dmFyIGE9TCh0aGlzKTthPWEmJmEucHJldmlvdXNTaWJsaW5nO3JldHVybiB2b2lkIDAhPT1hP2E6dGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c1NpYmxpbmd9LFxuZ2V0IGNoaWxkTm9kZXMoKXtpZihMYyh0aGlzKSl7dmFyIGE9TCh0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGQpe3JldHVybiBjW2RdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT1MKHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKEllJiZJZS5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTtcbnZhciBhPXRoaXMub3duZXJEb2N1bWVudDtpZihudWxsPT09YXx8VWMoYSx0aGlzKSlyZXR1cm4hMDtmb3IoYT10aGlzO2EmJiEoYSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLl9fc2hhZHlfcGFyZW50Tm9kZXx8KE8oYSk/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISEoYSYmYSBpbnN0YW5jZW9mIERvY3VtZW50KX0sZ2V0IHRleHRDb250ZW50KCl7aWYoTGModGhpcykpe2Zvcih2YXIgYT1bXSxiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYi5ub2RlVHlwZSE9PU5vZGUuQ09NTUVOVF9OT0RFJiZhLnB1c2goYi5fX3NoYWR5X3RleHRDb250ZW50KTtyZXR1cm4gYS5qb2luKFwiXCIpfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50fSxzZXQgdGV4dENvbnRlbnQoYSl7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhfHxudWxsPT09YSlhPVwiXCI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6aWYoIUxjKHRoaXMpJiZcbk0uRCl7dmFyIGI9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KGIhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGR8fGImJmIubm9kZVR5cGUhPU5vZGUuVEVYVF9OT0RFKSYmSmUodGhpcyk7dGhpcy5fX3NoYWR5X25hdGl2ZV90ZXh0Q29udGVudD1hfWVsc2UgSmUodGhpcyksKDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub2RlVmFsdWU9YX19LGluc2VydEJlZm9yZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PUVlJiZhLm93bmVyRG9jdW1lbnQhPT1FZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbnNlcnRCZWZvcmUoYSxiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKFwiRmFpbGVkIHRvIGV4ZWN1dGUgJ2FwcGVuZENoaWxkJyBvbiAnTm9kZSc6IFRoZSBuZXcgY2hpbGQgZWxlbWVudCBjb250YWlucyB0aGUgcGFyZW50LlwiKTtcbmlmKGIpe3ZhciBjPUwoYik7Yz1jJiZjLnBhcmVudE5vZGU7aWYodm9pZCAwIT09YyYmYyE9PXRoaXN8fHZvaWQgMD09PWMmJmIuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnaW5zZXJ0QmVmb3JlJyBvbiAnTm9kZSc6IFRoZSBub2RlIGJlZm9yZSB3aGljaCB0aGUgbmV3IG5vZGUgaXMgdG8gYmUgaW5zZXJ0ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLlwiKTt9aWYoYj09PWEpcmV0dXJuIGE7TWUodGhpcyxhKTt2YXIgZD1bXSxlPShjPU5lKHRoaXMpKT9jLmhvc3QubG9jYWxOYW1lOkNlKHRoaXMpLGY9YS5fX3NoYWR5X3BhcmVudE5vZGU7aWYoZil7dmFyIGc9Q2UoYSk7dmFyIGg9ISFjfHwhTmUoYSl8fEZlJiZ2b2lkIDAhPT10aGlzLl9fbm9JbnNlcnRpb25Qb2ludDtmLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYSxoKX1mPSEwO3ZhciBrPSghRmV8fHZvaWQgMD09PWEuX19ub0luc2VydGlvblBvaW50JiZ2b2lkIDA9PT1cbnRoaXMuX19ub0luc2VydGlvblBvaW50KSYmIUJlKGEsZSksbD1jJiYhYS5fX25vSW5zZXJ0aW9uUG9pbnQmJighRmV8fGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpO2lmKGx8fGspayYmKGc9Z3x8Q2UoYSkpLERlKGEsZnVuY3Rpb24obSl7bCYmXCJzbG90XCI9PT1tLmxvY2FsTmFtZSYmZC5wdXNoKG0pO2lmKGspe3ZhciBxPWc7eWUoKSYmKHEmJkFlKG0scSksKHE9eWUoKSkmJnEuc2NvcGVOb2RlKG0sZSkpfX0pO2QubGVuZ3RoJiYoT2UoYyksYy5pLnB1c2guYXBwbHkoYy5pLHcoZCkpLFBlKGMpKTtMYyh0aGlzKSYmKFFlKGEsdGhpcyxiKSxoPUwodGhpcyksaC5yb290PyhmPSExLE1jKHRoaXMpJiZQZShoLnJvb3QpKTpjJiZcInNsb3RcIj09PXRoaXMubG9jYWxOYW1lJiYoZj0hMSxQZShjKSkpO2Y/KGM9Tyh0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPUxlKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOlxuYS5vd25lckRvY3VtZW50IT09dGhpcy5vd25lckRvY3VtZW50JiZ0aGlzLm93bmVyRG9jdW1lbnQuYWRvcHROb2RlKGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtpZih0aGlzIT1hfHwhTyhhKSlyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1FZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoXCJUaGUgbm9kZSB0byBiZSByZW1vdmVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZTogXCIrYSk7TWUodGhpcyxudWxsLGEpO3ZhciBjPU5lKGEpLGQ9YyYmUmUoYyxhKSxlPUwodGhpcyk7aWYoTGModGhpcykmJihTZShhLHRoaXMpLE1jKHRoaXMpKSl7UGUoZS5yb290KTt2YXIgZj0hMH1pZih5ZSgpJiYhYiYmYyYmYS5ub2RlVHlwZSE9PVxuTm9kZS5URVhUX05PREUpe3ZhciBnPUNlKGEpO0RlKGEsZnVuY3Rpb24oaCl7QWUoaCxnKX0pfUtlKGEpO2MmJigoYj1cInNsb3RcIj09PXRoaXMubG9jYWxOYW1lKSYmKGY9ITApLChkfHxiKSYmUGUoYykpO2Z8fChmPU8odGhpcyk/dGhpcy5ob3N0OnRoaXMsKCFlLnJvb3QmJlwic2xvdFwiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTtyZXR1cm4gYX0scmVwbGFjZUNoaWxkOmZ1bmN0aW9uKGEsYil7dGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpO3RoaXMuX19zaGFkeV9yZW1vdmVDaGlsZChiKTtyZXR1cm4gYX0sY2xvbmVOb2RlOmZ1bmN0aW9uKGEpe2lmKFwidGVtcGxhdGVcIj09dGhpcy5sb2NhbE5hbWUpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKGEpO3ZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09XG5Ob2RlLkFUVFJJQlVURV9OT0RFKXthPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2Zvcih2YXIgYzthO2E9YS5fX3NoYWR5X25leHRTaWJsaW5nKWM9YS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGMpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj1EKHRoaXMpLGM9Yi50YTt2b2lkIDA9PT1jJiYoTyh0aGlzKT8oYz10aGlzLGIudGE9Yyk6KGM9KGM9dGhpcy5fX3NoYWR5X3BhcmVudE5vZGUpP2MuX19zaGFkeV9nZXRSb290Tm9kZShhKTp0aGlzLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5fX3NoYWR5X25hdGl2ZV9jb250YWlucyh0aGlzKSYmKGIudGE9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBWYyh0aGlzLGEpfX0pO3ZhciBWZT1RKHtnZXQgYXNzaWduZWRTbG90KCl7dmFyIGE9dGhpcy5fX3NoYWR5X3BhcmVudE5vZGU7KGE9YSYmYS5fX3NoYWR5X3NoYWRvd1Jvb3QpJiZVZShhKTtyZXR1cm4oYT1MKHRoaXMpKSYmYS5hc3NpZ25lZFNsb3R8fG51bGx9fSk7LypcblxuIENvcHlyaWdodCAoYykgMjAyMiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnNcbiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlXG4qL1xudmFyIFdlPW5ldyBNYXA7W1tcIihcIix7ZW5kOlwiKVwiLHNhOiEwfV0sW1wiW1wiLHtlbmQ6XCJdXCIsc2E6ITB9XSxbJ1wiJyx7ZW5kOidcIicsc2E6ITF9XSxbXCInXCIse2VuZDpcIidcIixzYTohMX1dXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWthKGEpO2E9Yi5uZXh0KCkudmFsdWU7Yj1iLm5leHQoKS52YWx1ZTtXZS5zZXQoYSxiKX0pO2Z1bmN0aW9uIFhlKGEsYixjLGQpe2ZvcihkPXZvaWQgMD09PWQ/ITA6ZDtiPGEubGVuZ3RoO2IrKylpZihcIlxcXFxcIj09PWFbYl0mJmI8YS5sZW5ndGgtMSYmXCJcXG5cIiE9PWFbYisxXSliKys7ZWxzZXtpZigtMSE9PWMuaW5kZXhPZihhW2JdKSlyZXR1cm4gYjtpZihkJiZXZS5oYXMoYVtiXSkpe3ZhciBlPVdlLmdldChhW2JdKTtiPVhlKGEsYisxLFtlLmVuZF0sZS5zYSl9fXJldHVybiBhLmxlbmd0aH1cbmZ1bmN0aW9uIFllKGEpe2Z1bmN0aW9uIGIoKXtpZigwPGQubGVuZ3RoKXtmb3IoO1wiIFwiPT09ZFtkLmxlbmd0aC0xXTspZC5wb3AoKTtjLnB1c2goe0xhOmQuZmlsdGVyKGZ1bmN0aW9uKGssbCl7cmV0dXJuIDA9PT1sJTJ9KSxaYTpkLmZpbHRlcihmdW5jdGlvbihrLGwpe3JldHVybiAxPT09bCUyfSl9KTtkLmxlbmd0aD0wfX1mb3IodmFyIGM9W10sZD1bXSxlPTA7ZTxhLmxlbmd0aDspe3ZhciBmPWRbZC5sZW5ndGgtMV0sZz1YZShhLGUsW1wiLFwiLFwiIFwiLFwiPlwiLFwiK1wiLFwiflwiXSksaD1nPT09ZT9hW2VdOmEuc3Vic3RyaW5nKGUsZyk7aWYoXCIsXCI9PT1oKWIoKTtlbHNlIGlmKC0xPT09W3ZvaWQgMCxcIiBcIixcIj5cIixcIitcIixcIn5cIl0uaW5kZXhPZihmKXx8XCIgXCIhPT1oKVwiIFwiPT09ZiYmLTEhPT1bXCI+XCIsXCIrXCIsXCJ+XCJdLmluZGV4T2YoaCk/ZFtkLmxlbmd0aC0xXT1oOmQucHVzaChoKTtlPWcrKGc9PT1lPzE6MCl9YigpO3JldHVybiBjfTtmdW5jdGlvbiBaZShhLGIsYyl7dmFyIGQ9W107JGUoYSxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gJGUoYSxiLGMsZCl7Zm9yKGE9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YTthPWEuX19zaGFkeV9uZXh0U2libGluZyl7dmFyIGU7aWYoZT1hLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2U9YTt2YXIgZj1iLGc9YyxoPWQsaz1mKGUpO2smJmgucHVzaChlKTtnJiZnKGspP2U9azooJGUoZSxmLGcsaCksZT12b2lkIDApfWlmKGUpYnJlYWt9fVxudmFyIGFmPXtnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT1MKHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZCl7Zm9yKGE9dGhpcy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXt2YXIgYT1MKHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEubGFzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfbGFzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfcHJldmlvdXNTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2xhc3RFbGVtZW50Q2hpbGR9LGdldCBjaGlsZHJlbigpe3JldHVybiBMYyh0aGlzKT9XYyhBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoWWModGhpcyksXG5mdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0sYmY9USgoYWYuYXBwZW5kPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPWFyZ3VtZW50c1tjXTt0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGNkLmFwcGx5KG51bGwsdyhiKSksbnVsbCl9LGFmLnByZXBlbmQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbY109YXJndW1lbnRzW2NdO3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoY2QuYXBwbHkobnVsbCx3KGIpKSx0aGlzLl9fc2hhZHlfZmlyc3RDaGlsZCl9LGFmLnJlcGxhY2VDaGlsZHJlbj1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjXT1cbmFyZ3VtZW50c1tjXTtmb3IoO251bGwhPT0oYz10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZCk7KXRoaXMuX19zaGFkeV9yZW1vdmVDaGlsZChjKTt0aGlzLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGNkLmFwcGx5KG51bGwsdyhiKSksbnVsbCl9LGFmKSk7XG5mdW5jdGlvbiBjZihhLGIpe2Z1bmN0aW9uIGMoZSxmKXtyZXR1cm4oZT09PWF8fC0xPT09Zi5pbmRleE9mKFwiOnNjb3BlXCIpKSYmUGMuY2FsbChlLGYpfXZhciBkPVllKGIpO2lmKDE+ZC5sZW5ndGgpcmV0dXJuW107Zm9yKGI9ZGQoWmUoYSxmdW5jdGlvbigpe3JldHVybiEwfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBkZChkLm1hcChmdW5jdGlvbihmKXt2YXIgZz1mLkxhLGg9Zy5sZW5ndGgtMTtyZXR1cm4gYyhlLGdbaF0pP3t0YXJnZXQ6ZSxkYTpmLGZhOmUsaW5kZXg6aH06W119KSl9KSk7Yi5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiAwPGUuaW5kZXh9KTspYj1kZChiLm1hcChmdW5jdGlvbihlKXtpZigwPj1lLmluZGV4KXJldHVybiBlO3ZhciBmPWUudGFyZ2V0LGc9ZS5mYSxoPWUuZGE7ZT1lLmluZGV4LTE7dmFyIGs9aC5aYVtlXSxsPWguTGFbZV07aWYoXCIgXCI9PT1rKXtrPVtdO2ZvcihnPWcuX19zaGFkeV9wYXJlbnRFbGVtZW50O2c7Zz1nLl9fc2hhZHlfcGFyZW50RWxlbWVudCljKGcsXG5sKSYmay5wdXNoKHt0YXJnZXQ6ZixkYTpoLGZhOmcsaW5kZXg6ZX0pO3JldHVybiBrfWlmKFwiPlwiPT09aylyZXR1cm4gZz1nLl9fc2hhZHlfcGFyZW50RWxlbWVudCxjKGcsbCk/e3RhcmdldDpmLGRhOmgsZmE6ZyxpbmRleDplfTpbXTtpZihcIitcIj09PWspcmV0dXJuKGc9Zy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmcpJiZjKGcsbCk/e3RhcmdldDpmLGRhOmgsZmE6ZyxpbmRleDplfTpbXTtpZihcIn5cIj09PWspe2s9W107Zm9yKGc9Zy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmc7ZztnPWcuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nKWMoZyxsKSYmay5wdXNoKHt0YXJnZXQ6ZixkYTpoLGZhOmcsaW5kZXg6ZX0pO3JldHVybiBrfXRocm93IEVycm9yKFwiVW5yZWNvZ25pemVkIGNvbWJpbmF0b3I6ICdcIitrK1wiJy5cIik7fSkpO3JldHVybiBlZChiLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXR9KSl9XG52YXIgZGY9TS5xdWVyeVNlbGVjdG9ySW1wbGVtZW50YXRpb24sZWY9USh7cXVlcnlTZWxlY3RvcjpmdW5jdGlvbihhKXtpZihcIm5hdGl2ZVwiPT09ZGYpe3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCh0aGlzIGluc3RhbmNlb2YgU2hhZG93Um9vdD90aGlzLmhvc3Q6dGhpcykuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSksYz10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiPWthKGIpO2Zvcih2YXIgZD1iLm5leHQoKTshZC5kb25lO2Q9Yi5uZXh0KCkpaWYoZD1kLnZhbHVlLGQuX19zaGFkeV9nZXRSb290Tm9kZSgpPT1jKXJldHVybiBkO3JldHVybiBudWxsfWlmKFwic2VsZWN0b3JFbmdpbmVcIj09PWRmKXJldHVybiBjZih0aGlzLGEpWzBdfHxudWxsO2lmKHZvaWQgMD09PWRmKXJldHVybiBaZSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBQYy5jYWxsKGUsYSl9LGZ1bmN0aW9uKGUpe3JldHVybiEhZX0pWzBdfHxudWxsO3Rocm93IEVycm9yKFwiVW5yZWNvZ25pemVkIHZhbHVlIG9mIFNoYWR5RE9NLnF1ZXJ5U2VsZWN0b3JJbXBsZW1lbnRhdGlvbjogJ1wiK1xuKGRmK1wiJ1wiKSk7fSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKGEsYil7aWYoYnx8XCJuYXRpdmVcIj09PWRmKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCh0aGlzIGluc3RhbmNlb2YgU2hhZG93Um9vdD90aGlzLmhvc3Q6dGhpcykuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIFdjKGIuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiBkLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pKX1pZihcInNlbGVjdG9yRW5naW5lXCI9PT1kZilyZXR1cm4gV2MoY2YodGhpcyxhKSk7aWYodm9pZCAwPT09ZGYpcmV0dXJuIFdjKFplKHRoaXMsZnVuY3Rpb24oZCl7cmV0dXJuIFBjLmNhbGwoZCxhKX0pKTt0aHJvdyBFcnJvcihcIlVucmVjb2duaXplZCB2YWx1ZSBvZiBTaGFkeURPTS5xdWVyeVNlbGVjdG9ySW1wbGVtZW50YXRpb246ICdcIisoZGYrXCInXCIpKTt9fSksZmY9TS5oYSYmIU0uSj9hZCh7fSxiZik6XG5iZjthZChiZixlZik7dmFyIGdmPVEoe2FmdGVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPWFyZ3VtZW50c1tjXTtjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlO2lmKG51bGwhPT1jKXt2YXIgZD10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7Yy5fX3NoYWR5X2luc2VydEJlZm9yZShjZC5hcHBseShudWxsLHcoYikpLGQpfX0sYmVmb3JlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPWFyZ3VtZW50c1tjXTtjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlO251bGwhPT1jJiZjLl9fc2hhZHlfaW5zZXJ0QmVmb3JlKGNkLmFwcGx5KG51bGwsdyhiKSksdGhpcyl9LHJlbW92ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlO251bGwhPT1hJiZhLl9fc2hhZHlfcmVtb3ZlQ2hpbGQodGhpcyl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPVxuYXJndW1lbnRzW2NdO2M9dGhpcy5fX3NoYWR5X3BhcmVudE5vZGU7aWYobnVsbCE9PWMpe3ZhciBkPXRoaXMuX19zaGFkeV9uZXh0U2libGluZztjLl9fc2hhZHlfcmVtb3ZlQ2hpbGQodGhpcyk7Yy5fX3NoYWR5X2luc2VydEJlZm9yZShjZC5hcHBseShudWxsLHcoYikpLGQpfX19KTt2YXIgaGY9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGpmKGEsYil7aWYoXCJzbG90XCI9PT1iKWE9YS5fX3NoYWR5X3BhcmVudE5vZGUsTWMoYSkmJlBlKEwoYSkucm9vdCk7ZWxzZSBpZihcInNsb3RcIj09PWEubG9jYWxOYW1lJiZcIm5hbWVcIj09PWImJihiPU5lKGEpKSl7aWYoYi5nKXtrZihiKTt2YXIgYz1hLlVhLGQ9bGYoYSk7aWYoZCE9PWMpe2M9Yi5oW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5oW2RdfHwoYi5oW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuaFtkXT1tZihjKSl9fVBlKGIpfX1cbnZhciBuZj1RKHtnZXQgcHJldmlvdXNFbGVtZW50U2libGluZygpe3ZhciBhPUwodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5wcmV2aW91c1NpYmxpbmcpe2ZvcihhPXRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcHJldmlvdXNFbGVtZW50U2libGluZ30sZ2V0IG5leHRFbGVtZW50U2libGluZygpe3ZhciBhPUwodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5uZXh0U2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X25leHRTaWJsaW5nO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLl9fc2hhZHlfbmV4dFNpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dEVsZW1lbnRTaWJsaW5nfSxnZXQgc2xvdCgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcInNsb3RcIil9LFxuc2V0IHNsb3QoYSl7dGhpcy5fX3NoYWR5X3NldEF0dHJpYnV0ZShcInNsb3RcIixhKX0sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwifSxzZXQgY2xhc3NOYW1lKGEpe3RoaXMuX19zaGFkeV9zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLGEpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxiKXt0aGlzLm93bmVyRG9jdW1lbnQhPT1oZj90aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpOnplKHRoaXMsYSxiKXx8KHRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYiksamYodGhpcyxhKSl9LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXt0aGlzLm93bmVyRG9jdW1lbnQhPT1oZj90aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUF0dHJpYnV0ZShhKTp6ZSh0aGlzLGEsXCJcIik/XCJcIj09PXRoaXMuZ2V0QXR0cmlidXRlKGEpJiZ0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUF0dHJpYnV0ZShhKToodGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVBdHRyaWJ1dGUoYSksXG5qZih0aGlzLGEpKX0sdG9nZ2xlQXR0cmlidXRlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09aGYpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdG9nZ2xlQXR0cmlidXRlKGEsYik7aWYoIXplKHRoaXMsYSxcIlwiKSlyZXR1cm4gYj10aGlzLl9fc2hhZHlfbmF0aXZlX3RvZ2dsZUF0dHJpYnV0ZShhLGIpLGpmKHRoaXMsYSksYjtpZihcIlwiPT09dGhpcy5nZXRBdHRyaWJ1dGUoYSkmJiFiKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3RvZ2dsZUF0dHJpYnV0ZShhLGIpfX0pO00uaGF8fHFlLmZvckVhY2goZnVuY3Rpb24oYSl7bmZbYV09c2UoYSl9KTtcbnZhciBzZj1RKHthdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoXCJNdXN0IHByb3ZpZGUgYSBob3N0LlwiKTtpZighYSl0aHJvdyBFcnJvcihcIk5vdCBlbm91Z2ggYXJndW1lbnRzLlwiKTtpZihhLnNoYWR5VXBncmFkZUZyYWdtZW50JiYhTS5SYSl7dmFyIGI9YS5zaGFkeVVwZ3JhZGVGcmFnbWVudDtiLl9fcHJvdG9fXz1TaGFkb3dSb290LnByb3RvdHlwZTtvZihiLHRoaXMsYSk7cGYoYixiKTthPWIuX19ub0luc2VydGlvblBvaW50P251bGw6Yi5xdWVyeVNlbGVjdG9yQWxsKFwic2xvdFwiKTtiLl9fbm9JbnNlcnRpb25Qb2ludD12b2lkIDA7aWYoYSYmYS5sZW5ndGgpe3ZhciBjPWI7T2UoYyk7Yy5pLnB1c2guYXBwbHkoYy5pLHcoYSkpO1BlKGIpfWIuaG9zdC5fX3NoYWR5X25hdGl2ZV9hcHBlbmRDaGlsZChiKX1lbHNlIGI9bmV3IHFmKHJmLHRoaXMsYSk7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWJ9LGdldCBzaGFkb3dSb290KCl7dmFyIGE9TCh0aGlzKTtcbnJldHVybiBhJiZhLmxifHxudWxsfX0pO2FkKG5mLHNmKTt2YXIgdGY9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiaW5lcnRcIiksdWY9USh7Z2V0IGlubmVySFRNTCgpe3JldHVybiBMYyh0aGlzKT91ZChcInRlbXBsYXRlXCI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxZYyk6dGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUx9LHNldCBpbm5lckhUTUwoYSl7aWYoXCJ0ZW1wbGF0ZVwiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle0plKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHxcImRpdlwiO2I9dGhpcy5uYW1lc3BhY2VVUkkmJnRoaXMubmFtZXNwYWNlVVJJIT09dGYubmFtZXNwYWNlVVJJP3RmLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxiKTp0Zi5jcmVhdGVFbGVtZW50KGIpO2ZvcihNLkQ/Yi5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTpiLmlubmVySFRNTD1hO2E9Yi5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KXRoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSl9fX0pO3ZhciB2Zj1RKHtibHVyOmZ1bmN0aW9uKCl7dmFyIGE9TCh0aGlzKTsoYT0oYT1hJiZhLnJvb3QpJiZhLmFjdGl2ZUVsZW1lbnQpP2EuX19zaGFkeV9ibHVyKCk6dGhpcy5fX3NoYWR5X25hdGl2ZV9ibHVyKCl9fSk7TS5oYXx8cmUuZm9yRWFjaChmdW5jdGlvbihhKXt2ZlthXT1zZShhKX0pO3ZhciB3Zj1RKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKFwic2xvdFwiPT09dGhpcy5sb2NhbE5hbWUpe3ZhciBiPXRoaXMuX19zaGFkeV9nZXRSb290Tm9kZSgpO2ImJk8oYikmJlVlKGIpO3JldHVybihiPUwodGhpcykpPyhhJiZhLmZsYXR0ZW4/Yi5hYTpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe2lmKFwic2xvdFwiIT09dGhpcy5sb2NhbE5hbWV8fFwic2xvdGNoYW5nZVwiPT09YSlpZS5jYWxsKHRoaXMsYSxiLGMpO2Vsc2V7XCJvYmplY3RcIiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTt2YXIgZD10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTtpZighZCl0aHJvdyBFcnJvcihcIlNoYWR5RE9NIGNhbm5vdCBhdHRhY2ggZXZlbnQgdG8gc2xvdCB1bmxlc3MgaXQgaGFzIGEgYHBhcmVudE5vZGVgXCIpO2MuVT10aGlzO2QuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGEsYixjKX19LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxcbmIsYyl7aWYoXCJzbG90XCIhPT10aGlzLmxvY2FsTmFtZXx8XCJzbG90Y2hhbmdlXCI9PT1hKWplLmNhbGwodGhpcyxhLGIsYyk7ZWxzZXtcIm9iamVjdFwiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO3ZhciBkPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlO2lmKCFkKXRocm93IEVycm9yKFwiU2hhZHlET00gY2Fubm90IGF0dGFjaCBldmVudCB0byBzbG90IHVubGVzcyBpdCBoYXMgYSBgcGFyZW50Tm9kZWBcIik7Yy5VPXRoaXM7ZC5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpfX19KTt2YXIgeGY9USh7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuXCJcIj09PWE/bnVsbDpaZSh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBiLmlkPT1hfSxmdW5jdGlvbihiKXtyZXR1cm4hIWJ9KVswXXx8bnVsbH19KTtmdW5jdGlvbiB5ZihhLGIpe2Zvcih2YXIgYztiJiYhYS5oYXMoYz1iLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSk7KWI9Yy5ob3N0O3JldHVybiBifWZ1bmN0aW9uIHpmKGEpe3ZhciBiPW5ldyBTZXQ7Zm9yKGIuYWRkKGEpO08oYSkmJmEuaG9zdDspYT1hLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpLGIuYWRkKGEpO3JldHVybiBifVxudmFyIEFmPVwiX19zaGFkeV9uYXRpdmVfXCIrSmMoKSxCZj1RKHtnZXQgYWN0aXZlRWxlbWVudCgpe3ZhciBhPU0uRD9kb2N1bWVudC5fX3NoYWR5X25hdGl2ZV9hY3RpdmVFbGVtZW50OmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIWF8fCFhLm5vZGVUeXBlKXJldHVybiBudWxsO3ZhciBiPSEhTyh0aGlzKTtpZighKHRoaXM9PT1kb2N1bWVudHx8YiYmdGhpcy5ob3N0IT09YSYmdGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKGEpKSlyZXR1cm4gbnVsbDtmb3IoYj1OZShhKTtiJiZiIT09dGhpczspYT1iLmhvc3QsYj1OZShhKTtyZXR1cm4gdGhpcz09PWRvY3VtZW50P2I/bnVsbDphOmI9PT10aGlzP2E6bnVsbH0sZWxlbWVudHNGcm9tUG9pbnQ6ZnVuY3Rpb24oYSxiKXthPWRvY3VtZW50W0FmXShhLGIpO2lmKHRoaXM9PT1kb2N1bWVudCYmTS51c2VOYXRpdmVEb2N1bWVudEVGUClyZXR1cm4gYTthPVtdLnNsaWNlLmNhbGwoYSk7Yj16Zih0aGlzKTtmb3IodmFyIGM9bmV3IFNldCxcbmQ9MDtkPGEubGVuZ3RoO2QrKyljLmFkZCh5ZihiLGFbZF0pKTt2YXIgZT1bXTtjLmZvckVhY2goZnVuY3Rpb24oZil7cmV0dXJuIGUucHVzaChmKX0pO3JldHVybiBlfSxlbGVtZW50RnJvbVBvaW50OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1kb2N1bWVudCYmTS51c2VOYXRpdmVEb2N1bWVudEVGUD90aGlzLl9fc2hhZHlfbmF0aXZlX2VsZW1lbnRGcm9tUG9pbnQoYSxiKTp0aGlzLl9fc2hhZHlfZWxlbWVudHNGcm9tUG9pbnQoYSxiKVswXXx8bnVsbH19KTt2YXIgQ2Y9d2luZG93LmRvY3VtZW50LERmPVEoe2ltcG9ydE5vZGU6ZnVuY3Rpb24oYSxiKXtpZihhLm93bmVyRG9jdW1lbnQhPT1DZnx8XCJ0ZW1wbGF0ZVwiPT09YS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfaW1wb3J0Tm9kZShhLGIpO3ZhciBjPXRoaXMuX19zaGFkeV9uYXRpdmVfaW1wb3J0Tm9kZShhLCExKTtpZihiKWZvcihhPWEuX19zaGFkeV9maXJzdENoaWxkO2E7YT1hLl9fc2hhZHlfbmV4dFNpYmxpbmcpYj10aGlzLl9fc2hhZHlfaW1wb3J0Tm9kZShhLCEwKSxjLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYik7cmV0dXJuIGN9fSk7dmFyIEVmPVEoe2Rpc3BhdGNoRXZlbnQ6Z2UsYWRkRXZlbnRMaXN0ZW5lcjppZS5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpqZS5iaW5kKHdpbmRvdyl9KTt2YXIgRmY9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsXCJwYXJlbnRFbGVtZW50XCIpJiYoRmYucGFyZW50RWxlbWVudD1UZS5wYXJlbnRFbGVtZW50KTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSxcImNvbnRhaW5zXCIpJiYoRmYuY29udGFpbnM9VGUuY29udGFpbnMpO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiY2hpbGRyZW5cIikmJihGZi5jaGlsZHJlbj1iZi5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsXCJpbm5lckhUTUxcIikmJihGZi5pbm5lckhUTUw9dWYuaW5uZXJIVE1MKTtPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxFbGVtZW50LnByb3RvdHlwZSxcImNsYXNzTmFtZVwiKSYmKEZmLmNsYXNzTmFtZT1uZi5jbGFzc05hbWUpO1xudmFyIEdmPXtFdmVudFRhcmdldDpbd2VdLE5vZGU6W1RlLHdpbmRvdy5FdmVudFRhcmdldD9udWxsOndlXSxUZXh0OltWZV0sQ29tbWVudDpbVmVdLENEQVRBU2VjdGlvbjpbVmVdLFByb2Nlc3NpbmdJbnN0cnVjdGlvbjpbVmVdLEVsZW1lbnQ6W25mLGJmLGdmLFZlLCFNLkR8fFwiaW5uZXJIVE1MXCJpbiBFbGVtZW50LnByb3RvdHlwZT91ZjpudWxsLHdpbmRvdy5IVE1MU2xvdEVsZW1lbnQ/bnVsbDp3Zl0sSFRNTEVsZW1lbnQ6W3ZmLEZmXSxIVE1MU2xvdEVsZW1lbnQ6W3dmXSxEb2N1bWVudEZyYWdtZW50OltmZix4Zl0sRG9jdW1lbnQ6W0RmLGZmLHhmLEJmXSxXaW5kb3c6W0VmXSxDaGFyYWN0ZXJEYXRhOltnZl0sWE1MSHR0cFJlcXVlc3Q6W3dpbmRvdy5FdmVudFRhcmdldD9udWxsOndlXX0sSGY9TS5EP251bGw6W1wiaW5uZXJIVE1MXCIsXCJ0ZXh0Q29udGVudFwiXTtcbmZ1bmN0aW9uIElmKGEsYixjLGQpe2IuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gYSYmZSYmUChhLGUsYyxkKX0pfWZ1bmN0aW9uIEpmKGEpe3ZhciBiPWE/bnVsbDpIZixjO2ZvcihjIGluIEdmKUlmKHdpbmRvd1tjXSYmd2luZG93W2NdLnByb3RvdHlwZSxHZltjXSxhLGIpfVtcIlRleHRcIixcIkNvbW1lbnRcIixcIkNEQVRBU2VjdGlvblwiLFwiUHJvY2Vzc2luZ0luc3RydWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9d2luZG93W2FdLGM9T2JqZWN0LmNyZWF0ZShiLnByb3RvdHlwZSk7Yy5fX3NoYWR5X3Byb3RvSXNQYXRjaGVkPSEwO0lmKGMsR2YuRXZlbnRUYXJnZXQpO0lmKGMsR2YuTm9kZSk7R2ZbYV0mJklmKGMsR2ZbYV0pO2IucHJvdG90eXBlLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9KTtcbmZ1bmN0aW9uIEtmKGEpe2EuX19zaGFkeV9wcm90b0lzUGF0Y2hlZD0hMDtJZihhLEdmLkV2ZW50VGFyZ2V0KTtJZihhLEdmLk5vZGUpO0lmKGEsR2YuRWxlbWVudCk7SWYoYSxHZi5IVE1MRWxlbWVudCk7SWYoYSxHZi5IVE1MU2xvdEVsZW1lbnQpO3JldHVybiBhfTt2YXIgTGY9TS5EYSxNZj1NLkQ7ZnVuY3Rpb24gTmYoYSxiKXtpZihMZiYmIWEuX19zaGFkeV9wcm90b0lzUGF0Y2hlZCYmIU8oYSkpe3ZhciBjPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKSxkPWMuaGFzT3duUHJvcGVydHkoXCJfX3NoYWR5X3BhdGNoZWRQcm90b1wiKSYmYy5fX3NoYWR5X3BhdGNoZWRQcm90bztkfHwoZD1PYmplY3QuY3JlYXRlKGMpLEtmKGQpLGMuX19zaGFkeV9wYXRjaGVkUHJvdG89ZCk7T2JqZWN0LnNldFByb3RvdHlwZU9mKGEsZCl9TWZ8fCgxPT09Yj9NZChhKToyPT09YiYmTmQoYSkpfVxuZnVuY3Rpb24gT2YoYSxiLGMsZCl7TmYoYSwxKTtkPWR8fG51bGw7dmFyIGU9RChhKSxmPWQ/RChkKTpudWxsO2UucHJldmlvdXNTaWJsaW5nPWQ/Zi5wcmV2aW91c1NpYmxpbmc6Yi5fX3NoYWR5X2xhc3RDaGlsZDtpZihmPUwoZS5wcmV2aW91c1NpYmxpbmcpKWYubmV4dFNpYmxpbmc9YTtpZihmPUwoZS5uZXh0U2libGluZz1kKSlmLnByZXZpb3VzU2libGluZz1hO2UucGFyZW50Tm9kZT1iO2Q/ZD09PWMuZmlyc3RDaGlsZCYmKGMuZmlyc3RDaGlsZD1hKTooYy5sYXN0Q2hpbGQ9YSxjLmZpcnN0Q2hpbGR8fChjLmZpcnN0Q2hpbGQ9YSkpO2MuY2hpbGROb2Rlcz1udWxsfVxuZnVuY3Rpb24gUWUoYSxiLGMpe05mKGIsMik7dmFyIGQ9RChiKTt2b2lkIDAhPT1kLmZpcnN0Q2hpbGQmJihkLmNoaWxkTm9kZXM9bnVsbCk7aWYoYS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlmb3IoYT1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7YTthPWEuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpT2YoYSxiLGQsYyk7ZWxzZSBPZihhLGIsZCxjKX1cbmZ1bmN0aW9uIFNlKGEsYil7dmFyIGM9RChhKTtiPUQoYik7YT09PWIuZmlyc3RDaGlsZCYmKGIuZmlyc3RDaGlsZD1jLm5leHRTaWJsaW5nKTthPT09Yi5sYXN0Q2hpbGQmJihiLmxhc3RDaGlsZD1jLnByZXZpb3VzU2libGluZyk7YT1jLnByZXZpb3VzU2libGluZzt2YXIgZD1jLm5leHRTaWJsaW5nO2EmJihEKGEpLm5leHRTaWJsaW5nPWQpO2QmJihEKGQpLnByZXZpb3VzU2libGluZz1hKTtjLnBhcmVudE5vZGU9Yy5wcmV2aW91c1NpYmxpbmc9Yy5uZXh0U2libGluZz12b2lkIDA7dm9pZCAwIT09Yi5jaGlsZE5vZGVzJiYoYi5jaGlsZE5vZGVzPW51bGwpfVxuZnVuY3Rpb24gcGYoYSxiKXt2YXIgYz1EKGEpO2lmKGJ8fHZvaWQgMD09PWMuZmlyc3RDaGlsZCl7Yy5jaGlsZE5vZGVzPW51bGw7dmFyIGQ9Yy5maXJzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDtjLmxhc3RDaGlsZD1hLl9fc2hhZHlfbmF0aXZlX2xhc3RDaGlsZDtOZihhLDIpO2M9ZDtmb3IoZD12b2lkIDA7YztjPWMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBlPUQoYyk7ZS5wYXJlbnROb2RlPWJ8fGE7ZS5uZXh0U2libGluZz1jLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nO2UucHJldmlvdXNTaWJsaW5nPWR8fG51bGw7ZD1jO05mKGMsMSl9fX07dmFyIFBmPVEoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpe1wib2JqZWN0XCIhPT10eXBlb2YgYyYmKGM9e2NhcHR1cmU6ISFjfSk7Yy5VPWMuVXx8dGhpczt0aGlzLmhvc3QuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGEsYixjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIsYyl7XCJvYmplY3RcIiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLlU9Yy5VfHx0aGlzO3RoaXMuaG9zdC5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpfX0pO2Z1bmN0aW9uIFFmKGEsYil7UChhLFBmLGIpO1AoYSxCZixiKTtQKGEsdWYsYik7UChhLGJmLGIpO00uSiYmIWI/KFAoYSxUZSxiKSxQKGEseGYsYikpOk0uRHx8KFAoYSxKZCksUChhLEhkKSxQKGEsSWQpKX07dmFyIHJmPXt9LFJmPU0uZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzJiZcImxvYWRpbmdcIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsU2Y7ZnVuY3Rpb24gVGYoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifWZ1bmN0aW9uIHFmKGEsYixjKXtpZihhIT09cmYpdGhyb3cgbmV3IFR5cGVFcnJvcihcIklsbGVnYWwgY29uc3RydWN0b3JcIik7dGhpcy5nPW51bGw7b2YodGhpcyxiLGMpfVxuZnVuY3Rpb24gb2YoYSxiLGMpe2EuaG9zdD1iO2EubW9kZT1jJiZjLm1vZGU7cGYoYS5ob3N0KTtiPUQoYS5ob3N0KTtiLnJvb3Q9YTtiLmxiPVwiY2xvc2VkXCIhPT1hLm1vZGU/YTpudWxsO2I9RChhKTtiLmZpcnN0Q2hpbGQ9Yi5sYXN0Q2hpbGQ9Yi5wYXJlbnROb2RlPWIubmV4dFNpYmxpbmc9Yi5wcmV2aW91c1NpYmxpbmc9bnVsbDtpZihNLnByZWZlclBlcmZvcm1hbmNlKWZvcig7Yj1hLmhvc3QuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZDspYS5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpO2Vsc2UgUGUoYSl9ZnVuY3Rpb24gUGUoYSl7YS5ZfHwoYS5ZPSEwLGhkKGZ1bmN0aW9uKCl7cmV0dXJuIFVlKGEpfSkpfVxuZnVuY3Rpb24gVWUoYSl7dmFyIGI7aWYoYj1hLlkpe2Zvcih2YXIgYzthOylhOnthLlkmJihjPWEpLGI9YTthPWIuaG9zdC5fX3NoYWR5X2dldFJvb3ROb2RlKCk7aWYoTyhhKSYmKGI9TChiLmhvc3QpKSYmMDxiLmthKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9XG5xZi5wcm90b3R5cGUuX3JlbmRlclNlbGY9ZnVuY3Rpb24oKXt2YXIgYT1SZjtSZj0hMDt0aGlzLlk9ITE7aWYodGhpcy5nKXtrZih0aGlzKTtmb3IodmFyIGI9MCxjO2I8dGhpcy5nLmxlbmd0aDtiKyspe2M9dGhpcy5nW2JdO3ZhciBkPUwoYyksZT1kLmFzc2lnbmVkTm9kZXM7ZC5hc3NpZ25lZE5vZGVzPVtdO2QuYWE9W107aWYoZC5KYT1lKWZvcihkPTA7ZDxlLmxlbmd0aDtkKyspe3ZhciBmPUwoZVtkXSk7Zi54YT1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVVmKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuZy5sZW5ndGg7YisrKXtjPXRoaXMuZ1tiXTtlPUwoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylVZih0aGlzLFxuZCxjKTsoZD0oZD1MKGMuX19zaGFkeV9wYXJlbnROb2RlKSkmJmQucm9vdCkmJihOYyhkKXx8ZC5ZKSYmZC5fcmVuZGVyU2VsZigpO1ZmKHRoaXMsZS5hYSxlLmFzc2lnbmVkTm9kZXMpO2lmKGQ9ZS5KYSl7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKylMKGRbZl0pLnhhPW51bGw7ZS5KYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLkFhPSEwKX1lLkFhJiYoZS5BYT0hMSxXZih0aGlzLGMpKX1jPXRoaXMuZztiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj1MKGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zm9yKGY9Zi5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZjtmPWYuX19zaGFkeV9uZXh0U2libGluZylpZihcInNsb3RcIj09Zi5sb2NhbE5hbWUpZm9yKHZhciBnPUwoZikuYWEsaD1cbjA7aDxnLmxlbmd0aDtoKyspZC5wdXNoKGdbaF0pO2Vsc2UgZC5wdXNoKGYpO2Y9WGMoZSk7Zz11ZShkLGQubGVuZ3RoLGYsZi5sZW5ndGgpO2Zvcih2YXIgaz1oPTAsbD12b2lkIDA7aDxnLmxlbmd0aCYmKGw9Z1toXSk7aCsrKXtmb3IodmFyIG09MCxxPXZvaWQgMDttPGwuaWEubGVuZ3RoJiYocT1sLmlhW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5wYX1rPTA7Zm9yKGw9dm9pZCAwO2s8Zy5sZW5ndGgmJihsPWdba10pO2srKylmb3IoaD1mW2wuaW5kZXhdLG09bC5pbmRleDttPGwuaW5kZXgrbC5wYTttKyspcT1kW21dLGUuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKHEsaCksZi5zcGxpY2UobSwwLHEpfX1pZighTS5wcmVmZXJQZXJmb3JtYW5jZSYmIXRoaXMuSWEpZm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKWM9XG5MKGIpLGIuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZSE9PXRoaXMuaG9zdHx8XCJzbG90XCIhPT1iLmxvY2FsTmFtZSYmYy5hc3NpZ25lZFNsb3R8fHRoaXMuaG9zdC5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChiKTt0aGlzLklhPSEwO1JmPWE7U2YmJlNmKCl9O2Z1bmN0aW9uIFVmKGEsYixjKXt2YXIgZD1EKGIpLGU9ZC54YTtkLnhhPW51bGw7Y3x8KGM9KGE9YS5oW2IuX19zaGFkeV9zbG90fHxcIl9fY2F0Y2hhbGxcIl0pJiZhWzBdKTtjPyhEKGMpLmFzc2lnbmVkTm9kZXMucHVzaChiKSxkLmFzc2lnbmVkU2xvdD1jKTpkLmFzc2lnbmVkU2xvdD12b2lkIDA7ZSE9PWQuYXNzaWduZWRTbG90JiZkLmFzc2lnbmVkU2xvdCYmKEQoZC5hc3NpZ25lZFNsb3QpLkFhPSEwKX1cbmZ1bmN0aW9uIFZmKGEsYixjKXtmb3IodmFyIGQ9MCxlPXZvaWQgMDtkPGMubGVuZ3RoJiYoZT1jW2RdKTtkKyspaWYoXCJzbG90XCI9PWUubG9jYWxOYW1lKXt2YXIgZj1MKGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJlZmKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBXZihhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJzbG90Y2hhbmdlXCIpKTtiPUwoYik7Yi5hc3NpZ25lZFNsb3QmJldmKGEsYi5hc3NpZ25lZFNsb3QpfWZ1bmN0aW9uIE9lKGEpe2EuaT1hLml8fFtdO2EuZz1hLmd8fFtdO2EuaD1hLmh8fHt9fVxuZnVuY3Rpb24ga2YoYSl7aWYoYS5pJiZhLmkubGVuZ3RoKXtmb3IodmFyIGI9YS5pLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO3BmKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO3BmKGYpO2Y9TChmKTtmLmthPShmLmthfHwwKSsxO2Y9bGYoZSk7YS5oW2ZdPyhjPWN8fHt9LGNbZl09ITAsYS5oW2ZdLnB1c2goZSkpOmEuaFtmXT1bZV07YS5nLnB1c2goZSl9aWYoYylmb3IodmFyIGcgaW4gYylhLmhbZ109bWYoYS5oW2ddKTthLmk9W119fWZ1bmN0aW9uIGxmKGEpe3ZhciBiPWEubmFtZXx8YS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpfHxcIl9fY2F0Y2hhbGxcIjtyZXR1cm4gYS5VYT1ifVxuZnVuY3Rpb24gbWYoYSl7cmV0dXJuIGEuc29ydChmdW5jdGlvbihiLGMpe2I9VGYoYik7Zm9yKHZhciBkPVRmKGMpLGU9MDtlPGIubGVuZ3RoO2UrKyl7Yz1iW2VdO3ZhciBmPWRbZV07aWYoYyE9PWYpcmV0dXJuIGI9WWMoYy5fX3NoYWR5X3BhcmVudE5vZGUpLGIuaW5kZXhPZihjKS1iLmluZGV4T2YoZil9fSl9XG5mdW5jdGlvbiBSZShhLGIpe2lmKGEuZyl7a2YoYSk7dmFyIGM9YS5oLGQ7Zm9yKGQgaW4gYylmb3IodmFyIGU9Y1tkXSxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07aWYoVmMoYixnKSl7ZS5zcGxpY2UoZiwxKTt2YXIgaD1hLmcuaW5kZXhPZihnKTswPD1oJiYoYS5nLnNwbGljZShoLDEpLChoPUwoZy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmaC5rYSYmaC5rYS0tKTtmLS07Zz1MKGcpO2lmKGg9Zy5hYSlmb3IodmFyIGs9MDtrPGgubGVuZ3RoO2srKyl7dmFyIGw9aFtrXSxtPWwuX19zaGFkeV9uYXRpdmVfcGFyZW50Tm9kZTttJiZtLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGwpfWcuYWE9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBOYyhhKXtrZihhKTtyZXR1cm4hKCFhLmd8fCFhLmcubGVuZ3RoKX1cbihmdW5jdGlvbihhKXthLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZTtRZihhLFwiX19zaGFkeV9cIik7UWYoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZTpcIiNkb2N1bWVudC1mcmFnbWVudFwiLGNvbmZpZ3VyYWJsZTohMH0sbm9kZVZhbHVlOnt2YWx1ZTpudWxsLGNvbmZpZ3VyYWJsZTohMH19KTtbXCJsb2NhbE5hbWVcIixcIm5hbWVzcGFjZVVSSVwiLFwicHJlZml4XCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7dmFsdWU6dm9pZCAwLGNvbmZpZ3VyYWJsZTohMH0pfSk7W1wib3duZXJEb2N1bWVudFwiLFwiYmFzZVVSSVwiLFwiaXNDb25uZWN0ZWRcIl0uZm9yRWFjaChmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ob3N0W2JdfSxcbmNvbmZpZ3VyYWJsZTohMH0pfSl9KShxZi5wcm90b3R5cGUpO1xuaWYod2luZG93LmN1c3RvbUVsZW1lbnRzJiZ3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lJiZNLkJhJiYhTS5wcmVmZXJQZXJmb3JtYW5jZSl7dmFyIFhmPW5ldyBNYXA7U2Y9ZnVuY3Rpb24oKXt2YXIgYT1bXTtYZi5mb3JFYWNoKGZ1bmN0aW9uKGQsZSl7YS5wdXNoKFtlLGRdKX0pO1hmLmNsZWFyKCk7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl1bMF07YVtiXVsxXT9jLl9fc2hhZHlkb21fY29ubmVjdGVkQ2FsbGJhY2soKTpjLl9fc2hhZHlkb21fZGlzY29ubmVjdGVkQ2FsbGJhY2soKX19O1JmJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLGZ1bmN0aW9uKCl7UmY9ITE7U2YoKX0se29uY2U6ITB9KTt2YXIgWWY9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPTAsZT1cIl9faXNDb25uZWN0ZWRcIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS5fX3NoYWR5ZG9tX2Nvbm5lY3RlZENhbGxiYWNrPVxuZnVuY3Rpb24oKXtSZj9YZi5zZXQodGhpcywhMCk6dGhpc1tlXXx8KHRoaXNbZV09ITAsYiYmYi5jYWxsKHRoaXMpKX0sYS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9YS5wcm90b3R5cGUuX19zaGFkeWRvbV9kaXNjb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbigpe1JmP3RoaXMuaXNDb25uZWN0ZWR8fFhmLnNldCh0aGlzLCExKTp0aGlzW2VdJiYodGhpc1tlXT0hMSxjJiZjLmNhbGwodGhpcykpfTtyZXR1cm4gYX0sWmY9d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSwkZj1mdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7WmYuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxZZihiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH07d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZT1cbiRmO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5LnByb3RvdHlwZSxcImRlZmluZVwiLHt2YWx1ZTokZixjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBOZShhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKE8oYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGFnKGEpe3RoaXMubm9kZT1hfXY9YWcucHJvdG90eXBlO3YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTt2LnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07di5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O3YuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTt2LnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07di5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9O1xudi5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Nsb25lTm9kZShhKX07di5nZXRSb290Tm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSl9O3YuY29udGFpbnM9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NvbnRhaW5zKGEpfTt2LmRpc3BhdGNoRXZlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O3Yuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGEsYil7dGhpcy5ub2RlLl9fc2hhZHlfc2V0QXR0cmlidXRlKGEsYil9O3YuZ2V0QXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfZ2V0QXR0cmlidXRlKGEpfTt2Lmhhc0F0dHJpYnV0ZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2hhc0F0dHJpYnV0ZShhKX07di5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7dGhpcy5ub2RlLl9fc2hhZHlfcmVtb3ZlQXR0cmlidXRlKGEpfTtcbnYudG9nZ2xlQXR0cmlidXRlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3RvZ2dsZUF0dHJpYnV0ZShhLGIpfTt2LmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTt2LmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O3YuYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07di5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O3YuZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07XG52LmVsZW1lbnRzRnJvbVBvaW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2VsZW1lbnRzRnJvbVBvaW50KGEsYil9O3YuZWxlbWVudEZyb21Qb2ludD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9lbGVtZW50RnJvbVBvaW50KGEsYil9O3YucXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcXVlcnlTZWxlY3RvcihhKX07di5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07di5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKFwic2xvdFwiPT09dGhpcy5ub2RlLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXNzaWduZWROb2RlcyhhKX07XG52LmFwcGVuZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjXT1hcmd1bWVudHNbY107cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FwcGVuZC5hcHBseSh0aGlzLm5vZGUsdyhiKSl9O3YucHJlcGVuZD1mdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpYltjXT1hcmd1bWVudHNbY107cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3ByZXBlbmQuYXBwbHkodGhpcy5ub2RlLHcoYikpfTt2LmFmdGVyPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPWFyZ3VtZW50c1tjXTtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYWZ0ZXIuYXBwbHkodGhpcy5ub2RlLHcoYikpfTtcbnYuYmVmb3JlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7Yzxhcmd1bWVudHMubGVuZ3RoOysrYyliW2NdPWFyZ3VtZW50c1tjXTtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYmVmb3JlLmFwcGx5KHRoaXMubm9kZSx3KGIpKX07di5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVtb3ZlKCl9O3YucmVwbGFjZVdpdGg9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWJbY109YXJndW1lbnRzW2NdO3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZXBsYWNlV2l0aC5hcHBseSh0aGlzLm5vZGUsdyhiKSl9O1xuZWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYWcucHJvdG90eXBlLHthY3RpdmVFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZihPKHRoaXMubm9kZSl8fHRoaXMubm9kZS5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfTk9ERSlyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYWN0aXZlRWxlbWVudH19LF9hY3RpdmVFbGVtZW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmVFbGVtZW50fX0saG9zdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoTyh0aGlzLm5vZGUpKXJldHVybiB0aGlzLm5vZGUuaG9zdH19LHBhcmVudE5vZGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wYXJlbnROb2RlfX0sZmlyc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLFxuZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLFxuZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3BhcmVudEVsZW1lbnR9fSxmaXJzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2ZpcnN0RWxlbWVudENoaWxkfX0sbGFzdEVsZW1lbnRDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9fSxuZXh0RWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uZXh0RWxlbWVudFNpYmxpbmd9fSxwcmV2aW91c0VsZW1lbnRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcHJldmlvdXNFbGVtZW50U2libGluZ319LFxuY2hpbGRyZW46e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9jaGlsZHJlbn19LGNoaWxkRWxlbWVudENvdW50Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRFbGVtZW50Q291bnR9fSxzaGFkb3dSb290Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2hhZG93Um9vdH19LGFzc2lnbmVkU2xvdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkU2xvdH19LGlzQ29ubmVjdGVkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfaXNDb25uZWN0ZWR9fSxpbm5lckhUTUw6e2NvbmZpZ3VyYWJsZTohMCxcbmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19LGNsYXNzTmFtZTp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NsYXNzTmFtZX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2NsYXNzTmFtZT1cbmF9fX0pO2Z1bmN0aW9uIGJnKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZy5wcm90b3R5cGUsYSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZVtcIl9fc2hhZHlfXCIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbXCJfX3NoYWR5X1wiK2FdPWJ9LGNvbmZpZ3VyYWJsZTohMH0pfXFlLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGJnKGEpfSk7cmUuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYmcoYSl9KTt2YXIgY2c9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZGcoYSl7aWYoTyhhKXx8YSBpbnN0YW5jZW9mIGFnKXJldHVybiBhO3ZhciBiPWNnLmdldChhKTtifHwoYj1uZXcgYWcoYSksY2cuc2V0KGEsYikpO3JldHVybiBifTtpZihNLkJhKXt2YXIgZWc9TS5EP2Z1bmN0aW9uKGEpe3JldHVybiBhfTpmdW5jdGlvbihhKXtOZChhKTtNZChhKTtyZXR1cm4gYX0sU2hhZHlET009e2luVXNlOk0uQmEscGF0Y2g6ZWcsaXNTaGFkeVJvb3Q6TyxlbnF1ZXVlOmhkLGZsdXNoOmlkLGZsdXNoSW5pdGlhbDpmdW5jdGlvbihhKXshYS5JYSYmYS5ZJiZVZShhKX0sc2V0dGluZ3M6TSxmaWx0ZXJNdXRhdGlvbnM6bmQsb2JzZXJ2ZUNoaWxkcmVuOmxkLHVub2JzZXJ2ZUNoaWxkcmVuOm1kLGRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrczpNLmRlZmVyQ29ubmVjdGlvbkNhbGxiYWNrcyxwcmVmZXJQZXJmb3JtYW5jZTpNLnByZWZlclBlcmZvcm1hbmNlLGhhbmRsZXNEeW5hbWljU2NvcGluZzohMCx3cmFwOk0uSj9kZzplZyx3cmFwSWZOZWVkZWQ6ITA9PT1NLko/ZGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LFdyYXBwZXI6YWcsY29tcG9zZWRQYXRoOldkLG5vUGF0Y2g6TS5KLHBhdGNoT25EZW1hbmQ6TS5EYSxuYXRpdmVNZXRob2RzOndkLFxubmF0aXZlVHJlZTp4ZCxwYXRjaEVsZW1lbnRQcm90bzpLZixxdWVyeVNlbGVjdG9ySW1wbGVtZW50YXRpb246TS5xdWVyeVNlbGVjdG9ySW1wbGVtZW50YXRpb259O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTtHZCgpO0pmKFwiX19zaGFkeV9cIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LFwiX2FjdGl2ZUVsZW1lbnRcIixCZi5hY3RpdmVFbGVtZW50KTtQKFdpbmRvdy5wcm90b3R5cGUsRWYsXCJfX3NoYWR5X1wiKTtNLko/TS5EYSYmUChFbGVtZW50LnByb3RvdHlwZSxzZik6KEpmKCkscGUoKSk7a2UoKTt3aW5kb3cuRXZlbnQ9bWU7d2luZG93LkN1c3RvbUV2ZW50PW5lO3dpbmRvdy5Nb3VzZUV2ZW50PW9lO3dpbmRvdy5TaGFkb3dSb290PXFmfTt2YXIgZmc9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50LGdnPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudE5TLGhnPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxpZz13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLnByZXBlbmQsamc9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5hcHBlbmQsa2c9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnByZXBlbmQsbGc9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLmFwcGVuZCxtZz13aW5kb3cuTm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLG5nPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxvZz13aW5kb3cuTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLHBnPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxxZz13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLHJnPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93Lk5vZGUucHJvdG90eXBlLFxuXCJ0ZXh0Q29udGVudFwiKSxzZz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93LHRnPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIpLHVnPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsdmc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSx3Zz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLHhnPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS50b2dnbGVBdHRyaWJ1dGUseWc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TLHpnPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUyxBZz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlTlMsQmc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxDZz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MLFxuRGc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnByZXBlbmQsRWc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxGZz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLEdnPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixIZz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsSWc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxKZz13aW5kb3cuSFRNTEVsZW1lbnQsS2c9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIpLExnPXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50LE1nPXdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRIVE1MO3ZhciBOZz1uZXcgU2V0O1wiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaFwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBOZy5hZGQoYSl9KTtmdW5jdGlvbiBPZyhhKXt2YXIgYj1OZy5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotWy0uMC05X2Etel0qJC8udGVzdChhKTtyZXR1cm4hYiYmYX12YXIgUGc9ZG9jdW1lbnQuY29udGFpbnM/ZG9jdW1lbnQuY29udGFpbnMuYmluZChkb2N1bWVudCk6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zLmJpbmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbmZ1bmN0aW9uIFQoYSl7dmFyIGI9YS5pc0Nvbm5lY3RlZDtpZih2b2lkIDAhPT1iKXJldHVybiBiO2lmKFBnKGEpKXJldHVybiEwO2Zvcig7YSYmIShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLnBhcmVudE5vZGV8fCh3aW5kb3cuU2hhZG93Um9vdCYmYSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISghYXx8IShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KSl9ZnVuY3Rpb24gUWcoYSl7dmFyIGI9YS5jaGlsZHJlbjtpZihiKXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiKTtiPVtdO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJmIucHVzaChhKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIFJnKGEsYil7Zm9yKDtiJiZiIT09YSYmIWIubmV4dFNpYmxpbmc7KWI9Yi5wYXJlbnROb2RlO3JldHVybiBiJiZiIT09YT9iLm5leHRTaWJsaW5nOm51bGx9XG5mdW5jdGlvbiBTZyhhLGIsYyl7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKFwibGlua1wiPT09ZiYmXCJpbXBvcnRcIj09PWUuZ2V0QXR0cmlidXRlKFwicmVsXCIpKXtkPWUuaW1wb3J0O3ZvaWQgMD09PWMmJihjPW5ldyBTZXQpO2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKVNnKGQsYixjKTtkPVJnKGEsZSk7Y29udGludWV9ZWxzZSBpZihcInRlbXBsYXRlXCI9PT1mKXtkPVJnKGEsZSk7Y29udGludWV9aWYoZT1lLl9fQ0Vfc2hhZG93Um9vdClmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpU2coZSxiLGMpfWQ9ZC5maXJzdENoaWxkP2QuZmlyc3RDaGlsZDpSZyhhLGQpfX07ZnVuY3Rpb24gVGcoKXt2YXIgYT0hKG51bGw9PT1VZ3x8dm9pZCAwPT09VWd8fCFVZy5ub0RvY3VtZW50Q29uc3RydWN0aW9uT2JzZXJ2ZXIpLGI9IShudWxsPT09VWd8fHZvaWQgMD09PVVnfHwhVWcuc2hhZHlEb21GYXN0V2Fsayk7dGhpcy5jYT1bXTt0aGlzLmc9W107dGhpcy5XPSExO3RoaXMuc2hhZHlEb21GYXN0V2Fsaz1iO3RoaXMuc2I9IWF9ZnVuY3Rpb24gVmcoYSxiLGMsZCl7dmFyIGU9d2luZG93LlNoYWR5RE9NO2lmKGEuc2hhZHlEb21GYXN0V2FsayYmZSYmZS5pblVzZSl7aWYoYi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpLGIucXVlcnlTZWxlY3RvckFsbClmb3IoYT1lLm5hdGl2ZU1ldGhvZHMucXVlcnlTZWxlY3RvckFsbC5jYWxsKGIsXCIqXCIpLGI9MDtiPGEubGVuZ3RoO2IrKyljKGFbYl0pfWVsc2UgU2coYixjLGQpfWZ1bmN0aW9uIFdnKGEsYil7YS5XPSEwO2EuY2EucHVzaChiKX1cbmZ1bmN0aW9uIFhnKGEsYil7YS5XPSEwO2EuZy5wdXNoKGIpfWZ1bmN0aW9uIFlnKGEsYil7YS5XJiZWZyhhLGIsZnVuY3Rpb24oYyl7cmV0dXJuIFpnKGEsYyl9KX1mdW5jdGlvbiBaZyhhLGIpe2lmKGEuVyYmIWIuX19DRV9wYXRjaGVkKXtiLl9fQ0VfcGF0Y2hlZD0hMDtmb3IodmFyIGM9MDtjPGEuY2EubGVuZ3RoO2MrKylhLmNhW2NdKGIpO2ZvcihjPTA7YzxhLmcubGVuZ3RoO2MrKylhLmdbY10oYil9fWZ1bmN0aW9uICRnKGEsYil7dmFyIGM9W107VmcoYSxiLGZ1bmN0aW9uKGUpe3JldHVybiBjLnB1c2goZSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGU/YS5jb25uZWN0ZWRDYWxsYmFjayhkKTphaChhLGQpfX1cbmZ1bmN0aW9uIGJoKGEsYil7dmFyIGM9W107VmcoYSxiLGZ1bmN0aW9uKGUpe3JldHVybiBjLnB1c2goZSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGUmJmEuZGlzY29ubmVjdGVkQ2FsbGJhY2soZCl9fVxuZnVuY3Rpb24gY2goYSxiLGMpe2M9dm9pZCAwPT09Yz97fTpjO3ZhciBkPWMudGIsZT1jLnVwZ3JhZGV8fGZ1bmN0aW9uKGcpe3JldHVybiBhaChhLGcpfSxmPVtdO1ZnKGEsYixmdW5jdGlvbihnKXthLlcmJlpnKGEsZyk7aWYoXCJsaW5rXCI9PT1nLmxvY2FsTmFtZSYmXCJpbXBvcnRcIj09PWcuZ2V0QXR0cmlidXRlKFwicmVsXCIpKXt2YXIgaD1nLmltcG9ydDtoIGluc3RhbmNlb2YgTm9kZSYmKGguX19DRV9pc0ltcG9ydERvY3VtZW50PSEwLGguX19DRV9yZWdpc3RyeT1kb2N1bWVudC5fX0NFX3JlZ2lzdHJ5KTtoJiZcImNvbXBsZXRlXCI9PT1oLnJlYWR5U3RhdGU/aC5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQ9ITA6Zy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLGZ1bmN0aW9uKCl7dmFyIGs9Zy5pbXBvcnQ7aWYoIWsuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkKXtrLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZD0hMDt2YXIgbD1uZXcgU2V0O2QmJihkLmZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIGwuYWRkKG0pfSksXG5sLmRlbGV0ZShrKSk7Y2goYSxrLHt0YjpsLHVwZ3JhZGU6ZX0pfX0pfWVsc2UgZi5wdXNoKGcpfSxkKTtmb3IoYj0wO2I8Zi5sZW5ndGg7YisrKWUoZltiXSl9XG5mdW5jdGlvbiBhaChhLGIpe3RyeXt2YXIgYz1iLm93bmVyRG9jdW1lbnQsZD1jLl9fQ0VfcmVnaXN0cnk7dmFyIGU9ZCYmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50KT9kaChkLGIubG9jYWxOYW1lKTp2b2lkIDA7aWYoZSYmdm9pZCAwPT09Yi5fX0NFX3N0YXRlKXtlLmNvbnN0cnVjdGlvblN0YWNrLnB1c2goYik7dHJ5e3RyeXtpZihuZXcgZS5jb25zdHJ1Y3RvckZ1bmN0aW9uIT09Yil0aHJvdyBFcnJvcihcIlRoZSBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvciBkaWQgbm90IHByb2R1Y2UgdGhlIGVsZW1lbnQgYmVpbmcgdXBncmFkZWQuXCIpO31maW5hbGx5e2UuY29uc3RydWN0aW9uU3RhY2sucG9wKCl9fWNhdGNoKGspe3Rocm93IGIuX19DRV9zdGF0ZT0yLGs7fWIuX19DRV9zdGF0ZT0xO2IuX19DRV9kZWZpbml0aW9uPWU7aWYoZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJmIuaGFzQXR0cmlidXRlcygpKXt2YXIgZj1lLm9ic2VydmVkQXR0cmlidXRlcztcbmZvcihlPTA7ZTxmLmxlbmd0aDtlKyspe3ZhciBnPWZbZV0saD1iLmdldEF0dHJpYnV0ZShnKTtudWxsIT09aCYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixnLG51bGwsaCxudWxsKX19VChiKSYmYS5jb25uZWN0ZWRDYWxsYmFjayhiKX19Y2F0Y2goayl7ZWgoayl9fVRnLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtpZihiLmNvbm5lY3RlZENhbGxiYWNrKXRyeXtiLmNvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9Y2F0Y2goYyl7ZWgoYyl9fTtUZy5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9YS5fX0NFX2RlZmluaXRpb247aWYoYi5kaXNjb25uZWN0ZWRDYWxsYmFjayl0cnl7Yi5kaXNjb25uZWN0ZWRDYWxsYmFjay5jYWxsKGEpfWNhdGNoKGMpe2VoKGMpfX07XG5UZy5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5fX0NFX2RlZmluaXRpb247aWYoZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJi0xPGYub2JzZXJ2ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYikpdHJ5e2YuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrLmNhbGwoYSxiLGMsZCxlKX1jYXRjaChnKXtlaChnKX19O1xuZnVuY3Rpb24gZmgoYSxiLGMsZCl7dmFyIGU9Yi5fX0NFX3JlZ2lzdHJ5O2lmKGUmJihudWxsPT09ZHx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1kKSYmKGU9ZGgoZSxjKSkpdHJ5e3ZhciBmPW5ldyBlLmNvbnN0cnVjdG9yRnVuY3Rpb247aWYodm9pZCAwPT09Zi5fX0NFX3N0YXRlfHx2b2lkIDA9PT1mLl9fQ0VfZGVmaW5pdGlvbil0aHJvdyBFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1wiK2MrXCInOiBUaGUgcmV0dXJuZWQgdmFsdWUgd2FzIG5vdCBjb25zdHJ1Y3RlZCB3aXRoIHRoZSBIVE1MRWxlbWVudCBjb25zdHJ1Y3Rvci5cIik7aWYoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIhPT1mLm5hbWVzcGFjZVVSSSl0aHJvdyBFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1wiK2MrXCInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCdzIG5hbWVzcGFjZSBtdXN0IGJlIHRoZSBIVE1MIG5hbWVzcGFjZS5cIik7aWYoZi5oYXNBdHRyaWJ1dGVzKCkpdGhyb3cgRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdcIitcbmMrXCInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCBtdXN0IG5vdCBoYXZlIGFueSBhdHRyaWJ1dGVzLlwiKTtpZihudWxsIT09Zi5maXJzdENoaWxkKXRocm93IEVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnXCIrYytcIic6IFRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50IG11c3Qgbm90IGhhdmUgYW55IGNoaWxkcmVuLlwiKTtpZihudWxsIT09Zi5wYXJlbnROb2RlKXRocm93IEVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnXCIrYytcIic6IFRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50IG11c3Qgbm90IGhhdmUgYSBwYXJlbnQgbm9kZS5cIik7aWYoZi5vd25lckRvY3VtZW50IT09Yil0aHJvdyBFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1wiK2MrXCInOiBUaGUgY29uc3RydWN0ZWQgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGlzIGluY29ycmVjdC5cIik7aWYoZi5sb2NhbE5hbWUhPT1jKXRocm93IEVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCAnXCIrYytcIic6IFRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50J3MgbG9jYWwgbmFtZSBpcyBpbmNvcnJlY3QuXCIpO1xucmV0dXJuIGZ9Y2F0Y2goZyl7cmV0dXJuIGVoKGcpLGI9bnVsbD09PWQ/ZmcuY2FsbChiLGMpOmdnLmNhbGwoYixkLGMpLE9iamVjdC5zZXRQcm90b3R5cGVPZihiLEhUTUxVbmtub3duRWxlbWVudC5wcm90b3R5cGUpLGIuX19DRV9zdGF0ZT0yLGIuX19DRV9kZWZpbml0aW9uPXZvaWQgMCxaZyhhLGIpLGJ9Yj1udWxsPT09ZD9mZy5jYWxsKGIsYyk6Z2cuY2FsbChiLGQsYyk7WmcoYSxiKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIGVoKGEpe3ZhciBiPVwiXCIsYz1cIlwiLGQ9MCxlPTA7YSBpbnN0YW5jZW9mIEVycm9yPyhiPWEubWVzc2FnZSxjPWEuc291cmNlVVJMfHxhLmZpbGVOYW1lfHxcIlwiLGQ9YS5saW5lfHxhLmxpbmVOdW1iZXJ8fDAsZT1hLmNvbHVtbnx8YS5jb2x1bW5OdW1iZXJ8fDApOmI9XCJVbmNhdWdodCBcIitTdHJpbmcoYSk7dmFyIGY9dm9pZCAwO3ZvaWQgMD09PUVycm9yRXZlbnQucHJvdG90eXBlLmluaXRFcnJvckV2ZW50P2Y9bmV3IEVycm9yRXZlbnQoXCJlcnJvclwiLHtjYW5jZWxhYmxlOiEwLG1lc3NhZ2U6YixmaWxlbmFtZTpjLGxpbmVubzpkLGNvbG5vOmUsZXJyb3I6YX0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXJyb3JFdmVudFwiKSxmLmluaXRFcnJvckV2ZW50KFwiZXJyb3JcIiwhMSwhMCxiLGMsZCksZi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVmYXVsdFByZXZlbnRlZFwiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KTtcbnZvaWQgMD09PWYuZXJyb3ImJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLFwiZXJyb3JcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9fSk7d2luZG93LmRpc3BhdGNoRXZlbnQoZik7Zi5kZWZhdWx0UHJldmVudGVkfHxjb25zb2xlLmVycm9yKGEpfTtmdW5jdGlvbiBnaCgpe3ZhciBhPXRoaXM7dGhpcy5JPXZvaWQgMDt0aGlzLkthPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe2EuZz1ifSl9Z2gucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oYSl7aWYodGhpcy5JKXRocm93IEVycm9yKFwiQWxyZWFkeSByZXNvbHZlZC5cIik7dGhpcy5JPWE7dGhpcy5nKGEpfTtmdW5jdGlvbiBoaChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLlg9dm9pZCAwO3RoaXMuUz1hO3RoaXMuZz1iO2NoKHRoaXMuUyx0aGlzLmcpO1wibG9hZGluZ1wiPT09dGhpcy5nLnJlYWR5U3RhdGUmJih0aGlzLlg9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5oLmJpbmQodGhpcykpLHRoaXMuWC5vYnNlcnZlKHRoaXMuZyx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gaWgoYSl7YS5YJiZhLlguZGlzY29ubmVjdCgpfWhoLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZy5yZWFkeVN0YXRlO1wiaW50ZXJhY3RpdmVcIiE9PWImJlwiY29tcGxldGVcIiE9PWJ8fGloKHRoaXMpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKHZhciBjPWFbYl0uYWRkZWROb2RlcyxkPTA7ZDxjLmxlbmd0aDtkKyspY2godGhpcy5TLGNbZF0pfTtmdW5jdGlvbiBVKGEpe3RoaXMubWE9bmV3IE1hcDt0aGlzLm5hPW5ldyBNYXA7dGhpcy5GYT1uZXcgTWFwO3RoaXMud2E9ITE7dGhpcy56YT1uZXcgTWFwO3RoaXMubGE9ZnVuY3Rpb24oYil7cmV0dXJuIGIoKX07dGhpcy5WPSExO3RoaXMub2E9W107dGhpcy5TPWE7dGhpcy5HYT1hLnNiP25ldyBoaChhKTp2b2lkIDB9dj1VLnByb3RvdHlwZTt2LmpiPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztpZighKGIgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGdldHRlcnMgbXVzdCBiZSBmdW5jdGlvbnMuXCIpO2poKHRoaXMsYSk7dGhpcy5tYS5zZXQoYSxiKTt0aGlzLm9hLnB1c2goYSk7dGhpcy5WfHwodGhpcy5WPSEwLHRoaXMubGEoZnVuY3Rpb24oKXtyZXR1cm4ga2goYyl9KSl9O1xudi5kZWZpbmU9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO2lmKCEoYiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLlwiKTtqaCh0aGlzLGEpO2xoKHRoaXMsYSxiKTt0aGlzLm9hLnB1c2goYSk7dGhpcy5WfHwodGhpcy5WPSEwLHRoaXMubGEoZnVuY3Rpb24oKXtyZXR1cm4ga2goYyl9KSl9O2Z1bmN0aW9uIGpoKGEsYil7aWYoIU9nKGIpKXRocm93IG5ldyBTeW50YXhFcnJvcihcIlRoZSBlbGVtZW50IG5hbWUgJ1wiK2IrXCInIGlzIG5vdCB2YWxpZC5cIik7aWYoZGgoYSxiKSl0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgd2l0aCBuYW1lICdcIisoYitcIicgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLlwiKSk7aWYoYS53YSl0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBkZWZpbmVkLlwiKTt9XG5mdW5jdGlvbiBsaChhLGIsYyl7YS53YT0hMDt2YXIgZDt0cnl7dmFyIGU9Yy5wcm90b3R5cGU7aWYoIShlIGluc3RhbmNlb2YgT2JqZWN0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuXCIpO3ZhciBmPWZ1bmN0aW9uKG0pe3ZhciBxPWVbbV07aWYodm9pZCAwIT09cSYmIShxIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKFwiVGhlICdcIittK1wiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO3JldHVybiBxfTt2YXIgZz1mKFwiY29ubmVjdGVkQ2FsbGJhY2tcIik7dmFyIGg9ZihcImRpc2Nvbm5lY3RlZENhbGxiYWNrXCIpO3ZhciBrPWYoXCJhZG9wdGVkQ2FsbGJhY2tcIik7dmFyIGw9KGQ9ZihcImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja1wiKSkmJmMub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXt0aHJvdyBtO31maW5hbGx5e2Eud2E9ITF9Yz17bG9jYWxOYW1lOmIsXG5jb25zdHJ1Y3RvckZ1bmN0aW9uOmMsY29ubmVjdGVkQ2FsbGJhY2s6ZyxkaXNjb25uZWN0ZWRDYWxsYmFjazpoLGFkb3B0ZWRDYWxsYmFjazprLGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjazpkLG9ic2VydmVkQXR0cmlidXRlczpsLGNvbnN0cnVjdGlvblN0YWNrOltdfTthLm5hLnNldChiLGMpO2EuRmEuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKTtyZXR1cm4gY312LnVwZ3JhZGU9ZnVuY3Rpb24oYSl7Y2godGhpcy5TLGEpfTtcbmZ1bmN0aW9uIGtoKGEpe2lmKCExIT09YS5WKXthLlY9ITE7Zm9yKHZhciBiPVtdLGM9YS5vYSxkPW5ldyBNYXAsZT0wO2U8Yy5sZW5ndGg7ZSsrKWQuc2V0KGNbZV0sW10pO2NoKGEuUyxkb2N1bWVudCx7dXBncmFkZTpmdW5jdGlvbihrKXtpZih2b2lkIDA9PT1rLl9fQ0Vfc3RhdGUpe3ZhciBsPWsubG9jYWxOYW1lLG09ZC5nZXQobCk7bT9tLnB1c2goayk6YS5uYS5oYXMobCkmJmIucHVzaChrKX19fSk7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylhaChhLlMsYltlXSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKyl7Zm9yKHZhciBmPWNbZV0sZz1kLmdldChmKSxoPTA7aDxnLmxlbmd0aDtoKyspYWgoYS5TLGdbaF0pOyhmPWEuemEuZ2V0KGYpKSYmZi5yZXNvbHZlKHZvaWQgMCl9Yy5sZW5ndGg9MH19di5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT1kaCh0aGlzLGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259O1xudi53aGVuRGVmaW5lZD1mdW5jdGlvbihhKXtpZighT2coYSkpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTeW50YXhFcnJvcihcIidcIithK1wiJyBpcyBub3QgYSB2YWxpZCBjdXN0b20gZWxlbWVudCBuYW1lLlwiKSk7dmFyIGI9dGhpcy56YS5nZXQoYSk7aWYoYilyZXR1cm4gYi5LYTtiPW5ldyBnaDt0aGlzLnphLnNldChhLGIpO3ZhciBjPXRoaXMubmEuaGFzKGEpfHx0aGlzLm1hLmhhcyhhKTthPS0xPT09dGhpcy5vYS5pbmRleE9mKGEpO2MmJmEmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLkthfTt2LnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dGhpcy5HYSYmaWgodGhpcy5HYSk7dmFyIGI9dGhpcy5sYTt0aGlzLmxhPWZ1bmN0aW9uKGMpe3JldHVybiBhKGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyl9KX19O1xuZnVuY3Rpb24gZGgoYSxiKXt2YXIgYz1hLm5hLmdldChiKTtpZihjKXJldHVybiBjO2lmKGM9YS5tYS5nZXQoYikpe2EubWEuZGVsZXRlKGIpO3RyeXtyZXR1cm4gbGgoYSxiLGMoKSl9Y2F0Y2goZCl7ZWgoZCl9fX1VLnByb3RvdHlwZS5kZWZpbmU9VS5wcm90b3R5cGUuZGVmaW5lO1UucHJvdG90eXBlLnVwZ3JhZGU9VS5wcm90b3R5cGUudXBncmFkZTtVLnByb3RvdHlwZS5nZXQ9VS5wcm90b3R5cGUuZ2V0O1UucHJvdG90eXBlLndoZW5EZWZpbmVkPVUucHJvdG90eXBlLndoZW5EZWZpbmVkO1UucHJvdG90eXBlLnBvbHlmaWxsRGVmaW5lTGF6eT1VLnByb3RvdHlwZS5qYjtVLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPVUucHJvdG90eXBlLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2s7ZnVuY3Rpb24gbWgoYSxiLGMpe2Z1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKGYpe2Zvcih2YXIgZz1bXSxoPTA7aDxhcmd1bWVudHMubGVuZ3RoOysraClnW2hdPWFyZ3VtZW50c1toXTtoPVtdO2Zvcih2YXIgaz1bXSxsPTA7bDxnLmxlbmd0aDtsKyspe3ZhciBtPWdbbF07bSBpbnN0YW5jZW9mIEVsZW1lbnQmJlQobSkmJmsucHVzaChtKTtpZihtIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IobT1tLmZpcnN0Q2hpbGQ7bTttPW0ubmV4dFNpYmxpbmcpaC5wdXNoKG0pO2Vsc2UgaC5wdXNoKG0pfWUuYXBwbHkodGhpcyxnKTtmb3IoZz0wO2c8ay5sZW5ndGg7ZysrKWJoKGEsa1tnXSk7aWYoVCh0aGlzKSlmb3IoZz0wO2c8aC5sZW5ndGg7ZysrKWs9aFtnXSxrIGluc3RhbmNlb2YgRWxlbWVudCYmJGcoYSxrKX19dm9pZCAwIT09Yy5wcmVwZW5kJiYoYi5wcmVwZW5kPWQoYy5wcmVwZW5kKSk7dm9pZCAwIT09Yy5hcHBlbmQmJihiLmFwcGVuZD1kKGMuYXBwZW5kKSl9XG47ZnVuY3Rpb24gbmgoYSl7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYil7cmV0dXJuIGZoKGEsdGhpcyxiLG51bGwpfTtEb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihiLGMpe2I9aGcuY2FsbCh0aGlzLGIsISFjKTt0aGlzLl9fQ0VfcmVnaXN0cnk/Y2goYSxiKTpZZyhhLGIpO3JldHVybiBifTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudE5TPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGZoKGEsdGhpcyxjLGIpfTttaChhLERvY3VtZW50LnByb3RvdHlwZSx7cHJlcGVuZDppZyxhcHBlbmQ6amd9KX07ZnVuY3Rpb24gb2goYSl7ZnVuY3Rpb24gYihkKXtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBmPVtdLGc9MDtnPGFyZ3VtZW50cy5sZW5ndGg7KytnKWZbZ109YXJndW1lbnRzW2ddO2c9W107Zm9yKHZhciBoPVtdLGs9MDtrPGYubGVuZ3RoO2srKyl7dmFyIGw9ZltrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmVChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylnLnB1c2gobCk7ZWxzZSBnLnB1c2gobCl9ZC5hcHBseSh0aGlzLGYpO2ZvcihmPTA7ZjxoLmxlbmd0aDtmKyspYmgoYSxoW2ZdKTtpZihUKHRoaXMpKWZvcihmPTA7ZjxnLmxlbmd0aDtmKyspaD1nW2ZdLGggaW5zdGFuY2VvZiBFbGVtZW50JiYkZyhhLGgpfX12YXIgYz1FbGVtZW50LnByb3RvdHlwZTt2b2lkIDAhPT1GZyYmKGMuYmVmb3JlPWIoRmcpKTt2b2lkIDAhPT1HZyYmKGMuYWZ0ZXI9YihHZykpO3ZvaWQgMCE9PVxuSGcmJihjLnJlcGxhY2VXaXRoPWZ1bmN0aW9uKGQpe2Zvcih2YXIgZT1bXSxmPTA7Zjxhcmd1bWVudHMubGVuZ3RoOysrZillW2ZdPWFyZ3VtZW50c1tmXTtmPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxlLmxlbmd0aDtoKyspe3ZhciBrPWVbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJlQoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZi5wdXNoKGspO2Vsc2UgZi5wdXNoKGspfWg9VCh0aGlzKTtIZy5hcHBseSh0aGlzLGUpO2ZvcihlPTA7ZTxnLmxlbmd0aDtlKyspYmgoYSxnW2VdKTtpZihoKWZvcihiaChhLHRoaXMpLGU9MDtlPGYubGVuZ3RoO2UrKylnPWZbZV0sZyBpbnN0YW5jZW9mIEVsZW1lbnQmJiRnKGEsZyl9KTt2b2lkIDAhPT1JZyYmKGMucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIGQ9VCh0aGlzKTtJZy5jYWxsKHRoaXMpO2QmJmJoKGEsdGhpcyl9KX07ZnVuY3Rpb24gcGgoYSl7ZnVuY3Rpb24gYihlLGYpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiaW5uZXJIVE1MXCIse2VudW1lcmFibGU6Zi5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6Zi5nZXQsc2V0OmZ1bmN0aW9uKGcpe3ZhciBoPXRoaXMsaz12b2lkIDA7VCh0aGlzKSYmKGs9W10sVmcoYSx0aGlzLGZ1bmN0aW9uKHEpe3EhPT1oJiZrLnB1c2gocSl9KSk7Zi5zZXQuY2FsbCh0aGlzLGcpO2lmKGspZm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspe3ZhciBtPWtbbF07MT09PW0uX19DRV9zdGF0ZSYmYS5kaXNjb25uZWN0ZWRDYWxsYmFjayhtKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9yZWdpc3RyeT9jaChhLHRoaXMpOllnKGEsdGhpcyk7cmV0dXJuIGd9fSl9ZnVuY3Rpb24gYyhlLGYpe2UuaW5zZXJ0QWRqYWNlbnRFbGVtZW50PWZ1bmN0aW9uKGcsaCl7dmFyIGs9VChoKTtnPWYuY2FsbCh0aGlzLGcsaCk7ayYmYmgoYSxoKTtUKGcpJiYkZyhhLGgpO3JldHVybiBnfX1cbmZ1bmN0aW9uIGQoZSxmKXtmdW5jdGlvbiBnKGgsayl7Zm9yKHZhciBsPVtdO2ghPT1rO2g9aC5uZXh0U2libGluZylsLnB1c2goaCk7Zm9yKGs9MDtrPGwubGVuZ3RoO2srKyljaChhLGxba10pfWUuaW5zZXJ0QWRqYWNlbnRIVE1MPWZ1bmN0aW9uKGgsayl7aD1oLnRvTG93ZXJDYXNlKCk7aWYoXCJiZWZvcmViZWdpblwiPT09aCl7dmFyIGw9dGhpcy5wcmV2aW91c1NpYmxpbmc7Zi5jYWxsKHRoaXMsaCxrKTtnKGx8fHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLHRoaXMpfWVsc2UgaWYoXCJhZnRlcmJlZ2luXCI9PT1oKWw9dGhpcy5maXJzdENoaWxkLGYuY2FsbCh0aGlzLGgsayksZyh0aGlzLmZpcnN0Q2hpbGQsbCk7ZWxzZSBpZihcImJlZm9yZWVuZFwiPT09aClsPXRoaXMubGFzdENoaWxkLGYuY2FsbCh0aGlzLGgsayksZyhsfHx0aGlzLmZpcnN0Q2hpbGQsbnVsbCk7ZWxzZSBpZihcImFmdGVyZW5kXCI9PT1oKWw9dGhpcy5uZXh0U2libGluZyxmLmNhbGwodGhpcyxoLGspLGcodGhpcy5uZXh0U2libGluZyxcbmwpO2Vsc2UgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiVGhlIHZhbHVlIHByb3ZpZGVkIChcIitTdHJpbmcoaCkrXCIpIGlzIG5vdCBvbmUgb2YgJ2JlZm9yZWJlZ2luJywgJ2FmdGVyYmVnaW4nLCAnYmVmb3JlZW5kJywgb3IgJ2FmdGVyZW5kJy5cIik7fX1zZyYmKEVsZW1lbnQucHJvdG90eXBlLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihlKXtlPXNnLmNhbGwodGhpcyxlKTtpZihhLlcmJiFlLl9fQ0VfcGF0Y2hlZCl7ZS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBmPTA7ZjxhLmNhLmxlbmd0aDtmKyspYS5jYVtmXShlKX1yZXR1cm4gdGhpcy5fX0NFX3NoYWRvd1Jvb3Q9ZX0pO3RnJiZ0Zy5nZXQ/YihFbGVtZW50LnByb3RvdHlwZSx0Zyk6S2cmJktnLmdldD9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSxLZyk6WGcoYSxmdW5jdGlvbihlKXtiKGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBtZy5jYWxsKHRoaXMsITApLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGYpe3ZhciBnPVxuXCJ0ZW1wbGF0ZVwiPT09dGhpcy5sb2NhbE5hbWUsaD1nP3RoaXMuY29udGVudDp0aGlzLGs9Z2cuY2FsbChkb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSSSx0aGlzLmxvY2FsTmFtZSk7Zm9yKGsuaW5uZXJIVE1MPWY7MDxoLmNoaWxkTm9kZXMubGVuZ3RoOylwZy5jYWxsKGgsaC5jaGlsZE5vZGVzWzBdKTtmb3IoZj1nP2suY29udGVudDprOzA8Zi5jaGlsZE5vZGVzLmxlbmd0aDspbmcuY2FsbChoLGYuY2hpbGROb2Rlc1swXSl9fSl9KTtFbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oZSxmKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiB2Zy5jYWxsKHRoaXMsZSxmKTt2YXIgZz11Zy5jYWxsKHRoaXMsZSk7dmcuY2FsbCh0aGlzLGUsZik7Zj11Zy5jYWxsKHRoaXMsZSk7YS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxlLGcsZixudWxsKX07RWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24oZSxmLGcpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIHpnLmNhbGwodGhpcyxcbmUsZixnKTt2YXIgaD15Zy5jYWxsKHRoaXMsZSxmKTt6Zy5jYWxsKHRoaXMsZSxmLGcpO2c9eWcuY2FsbCh0aGlzLGUsZik7YS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxmLGgsZyxlKX07RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKGUpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIHdnLmNhbGwodGhpcyxlKTt2YXIgZj11Zy5jYWxsKHRoaXMsZSk7d2cuY2FsbCh0aGlzLGUpO251bGwhPT1mJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGUsZixudWxsLG51bGwpfTt4ZyYmKEVsZW1lbnQucHJvdG90eXBlLnRvZ2dsZUF0dHJpYnV0ZT1mdW5jdGlvbihlLGYpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIHhnLmNhbGwodGhpcyxlLGYpO3ZhciBnPXVnLmNhbGwodGhpcyxlKSxoPW51bGwhPT1nO2Y9eGcuY2FsbCh0aGlzLGUsZik7aCE9PWYmJmEuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsZSxnLGY/XCJcIjpcbm51bGwsbnVsbCk7cmV0dXJuIGZ9KTtFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUz1mdW5jdGlvbihlLGYpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIEFnLmNhbGwodGhpcyxlLGYpO3ZhciBnPXlnLmNhbGwodGhpcyxlLGYpO0FnLmNhbGwodGhpcyxlLGYpO3ZhciBoPXlnLmNhbGwodGhpcyxlLGYpO2chPT1oJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGYsZyxoLGUpfTtMZz9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxMZyk6QmcmJmMoRWxlbWVudC5wcm90b3R5cGUsQmcpO01nP2QoSFRNTEVsZW1lbnQucHJvdG90eXBlLE1nKTpDZyYmZChFbGVtZW50LnByb3RvdHlwZSxDZyk7bWgoYSxFbGVtZW50LnByb3RvdHlwZSx7cHJlcGVuZDpEZyxhcHBlbmQ6RWd9KTtvaChhKX07dmFyIHFoPXt9O2Z1bmN0aW9uIHJoKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYz10aGlzLmNvbnN0cnVjdG9yO3ZhciBkPWRvY3VtZW50Ll9fQ0VfcmVnaXN0cnkuRmEuZ2V0KGMpO2lmKCFkKXRocm93IEVycm9yKFwiRmFpbGVkIHRvIGNvbnN0cnVjdCBhIGN1c3RvbSBlbGVtZW50OiBUaGUgY29uc3RydWN0b3Igd2FzIG5vdCByZWdpc3RlcmVkIHdpdGggYGN1c3RvbUVsZW1lbnRzYC5cIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9ZmcuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYy5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsWmcoYSxlKSxlO3ZhciBmPWUubGVuZ3RoLTEsZz1lW2ZdO2lmKGc9PT1xaCl0aHJvdyBFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1wiK2QubG9jYWxOYW1lK1wiJzogVGhpcyBlbGVtZW50IHdhcyBhbHJlYWR5IGNvbnN0cnVjdGVkLlwiKTtlW2ZdPVxucWg7T2JqZWN0LnNldFByb3RvdHlwZU9mKGcsYy5wcm90b3R5cGUpO1pnKGEsZyk7cmV0dXJuIGd9Yi5wcm90b3R5cGU9SmcucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MRWxlbWVudC5wcm90b3R5cGUsXCJjb25zdHJ1Y3RvclwiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7d2luZG93LkhUTUxFbGVtZW50PWJ9O2Z1bmN0aW9uIHNoKGEpe2Z1bmN0aW9uIGIoYyxkKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxcInRleHRDb250ZW50XCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGUpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsZSk7ZWxzZXt2YXIgZj12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZz10aGlzLmNoaWxkTm9kZXMsaD1nLmxlbmd0aDtpZigwPGgmJlQodGhpcykpe2Y9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKylmW2tdPWdba119fWQuc2V0LmNhbGwodGhpcyxlKTtpZihmKWZvcihlPTA7ZTxmLmxlbmd0aDtlKyspYmgoYSxmW2VdKX19fSl9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGMsZCl7aWYoYyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBlPVFnKGMpO2M9b2cuY2FsbCh0aGlzLGMsZCk7aWYoVCh0aGlzKSlmb3IoZD1cbjA7ZDxlLmxlbmd0aDtkKyspJGcoYSxlW2RdKTtyZXR1cm4gY31lPWMgaW5zdGFuY2VvZiBFbGVtZW50JiZUKGMpO2Q9b2cuY2FsbCh0aGlzLGMsZCk7ZSYmYmgoYSxjKTtUKHRoaXMpJiYkZyhhLGMpO3JldHVybiBkfTtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihjKXtpZihjIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGQ9UWcoYyk7Yz1uZy5jYWxsKHRoaXMsYyk7aWYoVCh0aGlzKSlmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKykkZyhhLGRbZV0pO3JldHVybiBjfWQ9YyBpbnN0YW5jZW9mIEVsZW1lbnQmJlQoYyk7ZT1uZy5jYWxsKHRoaXMsYyk7ZCYmYmgoYSxjKTtUKHRoaXMpJiYkZyhhLGMpO3JldHVybiBlfTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYyl7Yz1tZy5jYWxsKHRoaXMsISFjKTt0aGlzLm93bmVyRG9jdW1lbnQuX19DRV9yZWdpc3RyeT9jaChhLGMpOllnKGEsYyk7cmV0dXJuIGN9O05vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkPVxuZnVuY3Rpb24oYyl7dmFyIGQ9YyBpbnN0YW5jZW9mIEVsZW1lbnQmJlQoYyksZT1wZy5jYWxsKHRoaXMsYyk7ZCYmYmgoYSxjKTtyZXR1cm4gZX07Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkPWZ1bmN0aW9uKGMsZCl7aWYoYyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBlPVFnKGMpO2M9cWcuY2FsbCh0aGlzLGMsZCk7aWYoVCh0aGlzKSlmb3IoYmgoYSxkKSxkPTA7ZDxlLmxlbmd0aDtkKyspJGcoYSxlW2RdKTtyZXR1cm4gY31lPWMgaW5zdGFuY2VvZiBFbGVtZW50JiZUKGMpO3ZhciBmPXFnLmNhbGwodGhpcyxjLGQpLGc9VCh0aGlzKTtnJiZiaChhLGQpO2UmJmJoKGEsYyk7ZyYmJGcoYSxjKTtyZXR1cm4gZn07cmcmJnJnLmdldD9iKE5vZGUucHJvdG90eXBlLHJnKTpXZyhhLGZ1bmN0aW9uKGMpe2IoYyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBkPVtdLGU9dGhpcy5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWUubm9kZVR5cGUhPT1cbk5vZGUuQ09NTUVOVF9OT0RFJiZkLnB1c2goZS50ZXh0Q29udGVudCk7cmV0dXJuIGQuam9pbihcIlwiKX0sc2V0OmZ1bmN0aW9uKGQpe2Zvcig7dGhpcy5maXJzdENoaWxkOylwZy5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTtudWxsIT1kJiZcIlwiIT09ZCYmbmcuY2FsbCh0aGlzLGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGQpKX19KX0pfTt2YXIgVWc9d2luZG93LmN1c3RvbUVsZW1lbnRzO2Z1bmN0aW9uIHRoKCl7dmFyIGE9bmV3IFRnO3JoKGEpO25oKGEpO21oKGEsRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUse3ByZXBlbmQ6a2csYXBwZW5kOmxnfSk7c2goYSk7cGgoYSk7d2luZG93LkN1c3RvbUVsZW1lbnRSZWdpc3RyeT1VO2E9bmV3IFUoYSk7ZG9jdW1lbnQuX19DRV9yZWdpc3RyeT1hO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csXCJjdXN0b21FbGVtZW50c1wiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTphfSl9VWcmJiFVZy5mb3JjZVBvbHlmaWxsJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBVZy5kZWZpbmUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFVnLmdldHx8dGgoKTt3aW5kb3cuX19DRV9pbnN0YWxsUG9seWZpbGw9dGg7LypcblxuQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG5UaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG5zdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbmZ1bmN0aW9uIHVoKCl7dGhpcy5lbmQ9dGhpcy5zdGFydD0wO3RoaXMucnVsZXM9dGhpcy5wYXJlbnQ9dGhpcy5wcmV2aW91cz1udWxsO3RoaXMuY3NzVGV4dD10aGlzLnBhcnNlZENzc1RleHQ9XCJcIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPVwiXCJ9XG5mdW5jdGlvbiB2aChhKXt2YXIgYj1hPWEucmVwbGFjZSh3aCxcIlwiKS5yZXBsYWNlKHhoLFwiXCIpLGM9bmV3IHVoO2Muc3RhcnQ9MDtjLmVuZD1iLmxlbmd0aDtmb3IodmFyIGQ9YyxlPTAsZj1iLmxlbmd0aDtlPGY7ZSsrKWlmKFwie1wiPT09YltlXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBnPWQsaD1nLnJ1bGVzW2cucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHVoO2Quc3RhcnQ9ZSsxO2QucGFyZW50PWc7ZC5wcmV2aW91cz1oO2cucnVsZXMucHVzaChkKX1lbHNlXCJ9XCI9PT1iW2VdJiYoZC5lbmQ9ZSsxLGQ9ZC5wYXJlbnR8fGMpO3JldHVybiB5aChjLGEpfVxuZnVuY3Rpb24geWgoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPXpoKGMpLGM9Yy5yZXBsYWNlKEFoLFwiIFwiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoXCI7XCIpKzEpLGM9YS5wYXJzZWRTZWxlY3Rvcj1hLnNlbGVjdG9yPWMudHJpbSgpLGEuYXRSdWxlPTA9PT1jLmluZGV4T2YoXCJAXCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoXCJAbWVkaWFcIik/YS50eXBlPUJoOmMubWF0Y2goQ2gpJiYoYS50eXBlPURoLGEua2V5ZnJhbWVzTmFtZT1hLnNlbGVjdG9yLnNwbGl0KEFoKS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoXCItLVwiKT9FaDpGaCk7aWYoYz1hLnJ1bGVzKWZvcih2YXIgZD0wLGU9Yy5sZW5ndGgsZj12b2lkIDA7ZDxlJiYoZj1jW2RdKTtkKyspeWgoZixcbmIpO3JldHVybiBhfWZ1bmN0aW9uIHpoKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcXFwoWzAtOWEtZl17MSw2fSlcXHMvZ2ksZnVuY3Rpb24oYixjKXtiPWM7Zm9yKGM9Ni1iLmxlbmd0aDtjLS07KWI9XCIwXCIrYjtyZXR1cm5cIlxcXFxcIitifSl9XG5mdW5jdGlvbiBHaChhLGIsYyl7Yz12b2lkIDA9PT1jP1wiXCI6Yzt2YXIgZD1cIlwiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGU9YS5ydWxlcyxmO2lmKGY9ZSlmPWVbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoXCItLVwiKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUdoKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEhoLFwiXCIpLnJlcGxhY2UoSWgsXCJcIiksYj1iLnJlcGxhY2UoSmgsXCJcIikucmVwbGFjZShLaCxcIlwiKSksKGQ9Yi50cmltKCkpJiYoZD1cIiAgXCIrZCtcIlxcblwiKX1kJiYoYS5zZWxlY3RvciYmKGMrPWEuc2VsZWN0b3IrXCIge1xcblwiKSxjKz1kLGEuc2VsZWN0b3ImJihjKz1cIn1cXG5cXG5cIikpO3JldHVybiBjfVxudmFyIEZoPTEsRGg9NyxCaD00LEVoPTFFMyx3aD0vXFwvXFwqW14qXSpcXCorKFteLypdW14qXSpcXCorKSpcXC8vZ2ltLHhoPS9AaW1wb3J0W147XSo7L2dpbSxIaD0vKD86XlteO1xcLVxcc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XFxuXXwkKS9naW0sSWg9Lyg/Ol5bXjtcXC1cXHN9XSspPy0tW147e31dKj86W157fTtdKj97W159XSo/fSg/Ols7XFxuXXwkKT8vZ2ltLEpoPS9AYXBwbHlcXHMqXFwoP1teKTtdKlxcKT9cXHMqKD86WztcXG5dfCQpPy9naW0sS2g9L1teOzpdKj86W147XSo/dmFyXFwoW147XSpcXCkoPzpbO1xcbl18JCk/L2dpbSxDaD0vXkBbXlxcc10qa2V5ZnJhbWVzLyxBaD0vXFxzKy9nO3ZhciBWPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLExoO2Z1bmN0aW9uIE1oKGEpe0xoPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6Vnx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFxcLzYwMXxFZGdlXFwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoXCJib3gtc2hhZG93XCIsXCIwIDAgMCB2YXIoLS1mb28pXCIpKX12YXIgTmg7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihOaD13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBPaD0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpO1xud2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP0xoPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhNaCh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOk1oKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIFc9TGg7dmFyIFBoPS8oPzpefFs7XFxze11cXHMqKSgtLVtcXHctXSo/KVxccyo6XFxzKig/OigoPzonKD86XFxcXCd8LikqPyd8XCIoPzpcXFxcXCJ8LikqP1wifFxcKFteKV0qP1xcKXxbXn07e10pKyl8XFx7KFtefV0qKVxcfSg/Oig/PVs7XFxzfV0pfCQpKS9naSxRaD0vKD86XnxcXFcrKUBhcHBseVxccypcXCg/KFteKTtcXG5dKilcXCk/L2dpLFJoPS8oLS1bXFx3LV0rKVxccyooWzosOyldfCQpL2dpLFNoPS8oYW5pbWF0aW9uXFxzKjopfChhbmltYXRpb24tbmFtZVxccyo6KS8sVGg9L0BtZWRpYVxccyguKikvLFVoPS9cXHtbXn1dKlxcfS9nO3ZhciBWaD1uZXcgU2V0O2Z1bmN0aW9uIFdoKGEsYil7aWYoIWEpcmV0dXJuXCJcIjtcInN0cmluZ1wiPT09dHlwZW9mIGEmJihhPXZoKGEpKTtiJiZYaChhLGIpO3JldHVybiBHaChhLFcpfWZ1bmN0aW9uIFloKGEpeyFhLl9fY3NzUnVsZXMmJmEudGV4dENvbnRlbnQmJihhLl9fY3NzUnVsZXM9dmgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gJGgoYSl7cmV0dXJuISFhLnBhcmVudCYmYS5wYXJlbnQudHlwZT09PURofWZ1bmN0aW9uIFhoKGEsYixjLGQpe2lmKGEpe3ZhciBlPSExLGY9YS50eXBlO2lmKGQmJmY9PT1CaCl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChUaCk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChlPSEwKSl9Zj09PUZoP2IoYSk6YyYmZj09PURoP2MoYSk6Zj09PUVoJiYoZT0hMCk7aWYoKGE9YS5ydWxlcykmJiFlKWZvcihlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKylYaChnLGIsYyxkKX19XG5mdW5jdGlvbiBhaShhLGIsYyxkKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7YiYmZS5zZXRBdHRyaWJ1dGUoXCJzY29wZVwiLGIpO2UudGV4dENvbnRlbnQ9YTtiaShlLGMsZCk7cmV0dXJuIGV9dmFyIGNpPW51bGw7ZnVuY3Rpb24gZGkoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KFwiIFNoYWR5IERPTSBzdHlsZXMgZm9yIFwiK2ErXCIgXCIpO3ZhciBiPWRvY3VtZW50LmhlYWQ7Yi5pbnNlcnRCZWZvcmUoYSwoY2k/Y2kubmV4dFNpYmxpbmc6bnVsbCl8fGIuZmlyc3RDaGlsZCk7cmV0dXJuIGNpPWF9ZnVuY3Rpb24gYmkoYSxiLGMpe2I9Ynx8ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLGMmJmMubmV4dFNpYmxpbmd8fGIuZmlyc3RDaGlsZCk7Y2k/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjaSk9PT1Ob2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyYmKGNpPWEpOmNpPWF9XG5mdW5jdGlvbiBlaShhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YjxkO2IrKylpZihcIihcIj09PWFbYl0pYysrO2Vsc2UgaWYoXCIpXCI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIGZpKGEsYil7dmFyIGM9YS5pbmRleE9mKFwidmFyKFwiKTtpZigtMT09PWMpcmV0dXJuIGIoYSxcIlwiLFwiXCIsXCJcIik7dmFyIGQ9ZWkoYSxjKzMpLGU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPWZpKGEuc3Vic3RyaW5nKGQrMSksYik7ZD1lLmluZGV4T2YoXCIsXCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksXCJcIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gZ2koYSxiKXtWP2Euc2V0QXR0cmlidXRlKFwiY2xhc3NcIixiKTp3aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5zZXRBdHRyaWJ1dGUuY2FsbChhLFwiY2xhc3NcIixiKX1cbnZhciBoaT13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS53cmFwfHxmdW5jdGlvbihhKXtyZXR1cm4gYX07ZnVuY3Rpb24gaWkoYSl7dmFyIGI9YS5sb2NhbE5hbWUsYz1cIlwiO2I/LTE8Yi5pbmRleE9mKFwiLVwiKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZShcImlzXCIpfHxcIlwiKTooYj1hLmlzLGM9YS5leHRlbmRzKTtyZXR1cm57aXM6YixqYTpjfX1mdW5jdGlvbiBqaShhKXtmb3IodmFyIGI9W10sYz1cIlwiLGQ9MDswPD1kJiZkPGEubGVuZ3RoO2QrKylpZihcIihcIj09PWFbZF0pe3ZhciBlPWVpKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2VcIixcIj09PWFbZF0/KGIucHVzaChjKSxjPVwiXCIpOmMrPWFbZF07YyYmYi5wdXNoKGMpO3JldHVybiBifVxuZnVuY3Rpb24ga2koYSl7aWYodm9pZCAwIT09TmgpcmV0dXJuIE5oO2lmKHZvaWQgMD09PWEuX19jc3NCdWlsZCl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoXCJjc3MtYnVpbGRcIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9XCJ0ZW1wbGF0ZVwiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdChcIjpcIiksXCJjc3MtYnVpbGRcIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPVwiXCJ9aWYoXCJcIiE9PWIpe3ZhciBjPVwidGVtcGxhdGVcIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fFwiXCJ9XG5mdW5jdGlvbiBsaShhKXthPXZvaWQgMD09PWE/XCJcIjphO3JldHVyblwiXCIhPT1hJiZXP1Y/XCJzaGFkb3dcIj09PWE6XCJzaGFkeVwiPT09YTohMX07ZnVuY3Rpb24gbWkoKXt9ZnVuY3Rpb24gbmkoYSxiKXtvaShwaSxhLGZ1bmN0aW9uKGMpe3FpKGMsYnx8XCJcIil9KX1mdW5jdGlvbiBvaShhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkO1widGVtcGxhdGVcIj09PWIubG9jYWxOYW1lP2Q9KGIuY29udGVudHx8Yi5fY29udGVudHx8YikuY2hpbGROb2RlczpkPWIuY2hpbGRyZW58fGIuY2hpbGROb2RlcztpZihkKWZvcihiPTA7YjxkLmxlbmd0aDtiKyspb2koYSxkW2JdLGMpfVxuZnVuY3Rpb24gcWkoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKFwic3R5bGUtc2NvcGVcIiksYS5jbGFzc0xpc3QucmVtb3ZlKGIpKTooYS5jbGFzc0xpc3QuYWRkKFwic3R5bGUtc2NvcGVcIiksYS5jbGFzc0xpc3QuYWRkKGIpKTtlbHNlIGlmKGEuZ2V0QXR0cmlidXRlKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO2M/ZCYmKGI9ZC5yZXBsYWNlKFwic3R5bGUtc2NvcGVcIixcIlwiKS5yZXBsYWNlKGIsXCJcIiksZ2koYSxiKSk6Z2koYSwoZD9kK1wiIFwiOlwiXCIpK1wic3R5bGUtc2NvcGUgXCIrYil9fWZ1bmN0aW9uIHJpKGEsYixjKXtvaShwaSxhLGZ1bmN0aW9uKGQpe3FpKGQsYiwhMCk7cWkoZCxjKX0pfWZ1bmN0aW9uIHNpKGEsYil7b2kocGksYSxmdW5jdGlvbihjKXtxaShjLGJ8fFwiXCIsITApfSl9XG5mdW5jdGlvbiB0aShhLGIsYyxkLGUpe3ZhciBmPXBpO2U9dm9pZCAwPT09ZT9cIlwiOmU7XCJcIj09PWUmJihWfHxcInNoYWR5XCI9PT0odm9pZCAwPT09ZD9cIlwiOmQpP2U9V2goYixjKTooYT1paShhKSxlPXVpKGYsYixhLmlzLGEuamEsYykrXCJcXG5cXG5cIikpO3JldHVybiBlLnRyaW0oKX1mdW5jdGlvbiB1aShhLGIsYyxkLGUpe3ZhciBmPXZpKGMsZCk7Yz1jP1wiLlwiK2M6XCJcIjtyZXR1cm4gV2goYixmdW5jdGlvbihnKXtnLml8fChnLnNlbGVjdG9yPWcuRz13aShhLGcsYS5oLGMsZiksZy5pPSEwKTtlJiZlKGcsYyxmKX0pfWZ1bmN0aW9uIHZpKGEsYil7cmV0dXJuIGI/XCJbaXM9XCIrYStcIl1cIjphfVxuZnVuY3Rpb24gd2koYSxiLGMsZCxlKXt2YXIgZj1qaShiLnNlbGVjdG9yKTtpZighJGgoYikpe2I9MDtmb3IodmFyIGc9Zi5sZW5ndGgsaD12b2lkIDA7YjxnJiYoaD1mW2JdKTtiKyspZltiXT1jLmNhbGwoYSxoLGQsZSl9cmV0dXJuIGYuZmlsdGVyKGZ1bmN0aW9uKGspe3JldHVybiEha30pLmpvaW4oXCIsXCIpfWZ1bmN0aW9uIHhpKGEpe3JldHVybiBhLnJlcGxhY2UoeWksZnVuY3Rpb24oYixjLGQpey0xPGQuaW5kZXhPZihcIitcIik/ZD1kLnJlcGxhY2UoL1xcKy9nLFwiX19fXCIpOi0xPGQuaW5kZXhPZihcIl9fX1wiKSYmKGQ9ZC5yZXBsYWNlKC9fX18vZyxcIitcIikpO3JldHVyblwiOlwiK2MrXCIoXCIrZCtcIilcIn0pfVxuZnVuY3Rpb24gemkoYSl7Zm9yKHZhciBiPVtdLGM7Yz1hLm1hdGNoKEFpKTspe3ZhciBkPWMuaW5kZXgsZT1laShhLGQpO2lmKC0xPT09ZSl0aHJvdyBFcnJvcihjLmlucHV0K1wiIHNlbGVjdG9yIG1pc3NpbmcgJyknXCIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYyxcIlxcdWUwMDBcIik7Yi5wdXNoKGMpfXJldHVybntFYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gQmkoYSxiKXt2YXIgYz1hLnNwbGl0KFwiXFx1ZTAwMFwiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oZCxlLGYpe3JldHVybiBkK2UrY1tmKzFdfSxjWzBdKX1cbm1pLnByb3RvdHlwZS5oPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0hMTthPWEudHJpbSgpO3ZhciBlPXlpLnRlc3QoYSk7ZSYmKGE9YS5yZXBsYWNlKHlpLGZ1bmN0aW9uKGgsayxsKXtyZXR1cm5cIjpcIitrK1wiKFwiK2wucmVwbGFjZSgvXFxzL2csXCJcIikrXCIpXCJ9KSxhPXhpKGEpKTt2YXIgZj1BaS50ZXN0KGEpO2lmKGYpe3ZhciBnPXppKGEpO2E9Zy5FYTtnPWcubWF0Y2hlc31hPWEucmVwbGFjZShDaSxcIjpob3N0ICQxXCIpO2E9YS5yZXBsYWNlKERpLGZ1bmN0aW9uKGgsayxsKXtkfHwoaD1FaShsLGssYixjKSxkPWR8fGguc3RvcCxrPWguWWEsbD1oLnZhbHVlKTtyZXR1cm4gaytsfSk7ZiYmKGE9QmkoYSxnKSk7ZSYmKGE9eGkoYSkpO3JldHVybiBhPWEucmVwbGFjZShGaSxmdW5jdGlvbihoLGssbCxtKXtyZXR1cm4nW2Rpcj1cIicrbCsnXCJdICcrayttK1wiLCBcIitrKydbZGlyPVwiJytsKydcIl0nK219KX07XG5mdW5jdGlvbiBFaShhLGIsYyxkKXt2YXIgZT1hLmluZGV4T2YoXCI6OnNsb3R0ZWRcIik7MDw9YS5pbmRleE9mKFwiOmhvc3RcIik/YT1HaShhLGQpOjAhPT1lJiYoYT1jP0hpKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj1cIlwiLGM9ITApO2lmKGMpe3ZhciBmPSEwO2MmJihhPWEucmVwbGFjZShJaSxmdW5jdGlvbihnLGgpe3JldHVyblwiID4gXCIraH0pKX1yZXR1cm57dmFsdWU6YSxZYTpiLHN0b3A6Zn19ZnVuY3Rpb24gSGkoYSxiKXthPWEuc3BsaXQoLyhcXFsuKz9cXF0pLyk7Zm9yKHZhciBjPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKylpZigxPT09ZCUyKWMucHVzaChhW2RdKTtlbHNle3ZhciBlPWFbZF07aWYoXCJcIiE9PWV8fGQhPT1hLmxlbmd0aC0xKWU9ZS5zcGxpdChcIjpcIiksZVswXSs9YixjLnB1c2goZS5qb2luKFwiOlwiKSl9cmV0dXJuIGMuam9pbihcIlwiKX1cbmZ1bmN0aW9uIEdpKGEsYil7dmFyIGM9YS5tYXRjaChKaSk7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fFwiXCIpP2NbMF0ubWF0Y2goS2kpP2EucmVwbGFjZShKaSxmdW5jdGlvbihkLGUsZil7cmV0dXJuIGIrZn0pOmMuc3BsaXQoS2kpWzBdPT09Yj9jOlwic2hvdWxkX25vdF9tYXRjaFwiOmEucmVwbGFjZShcIjpob3N0XCIsYil9ZnVuY3Rpb24gTGkoYSl7XCI6cm9vdFwiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9XCJodG1sXCIpfW1pLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKFwiOmhvc3RcIik/XCJcIjphLm1hdGNoKFwiOjpzbG90dGVkXCIpP3RoaXMuaChhLFwiOm5vdCguc3R5bGUtc2NvcGUpXCIpOkhpKGEudHJpbSgpLFwiOm5vdCguc3R5bGUtc2NvcGUpXCIpfTtlYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhtaS5wcm90b3R5cGUse2c6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVyblwic3R5bGUtc2NvcGVcIn19fSk7XG52YXIgeWk9LzoobnRoWy1cXHddKylcXCgoW14pXSspXFwpLyxEaT0vKF58W1xccz4rfl0rKSgoPzpcXFsuKz9cXF18W15cXHM+K349W10pKykvZyxLaT0vW1suOiMqXS8sQ2k9L14oOjpzbG90dGVkKS8sSmk9Lyg6aG9zdCkoPzpcXCgoKD86XFwoW14pKF0qXFwpfFteKShdKikrPylcXCkpLyxJaT0vKD86OjpzbG90dGVkKSg/OlxcKCgoPzpcXChbXikoXSpcXCl8W14pKF0qKSs/KVxcKSkvLEZpPS8oLiopOmRpclxcKCg/OihsdHJ8cnRsKSlcXCkoLiopLyxBaT0vOig/Om1hdGNoZXN8YW55fC0oPzp3ZWJraXR8bW96KS1hbnkpLyxwaT1uZXcgbWk7ZnVuY3Rpb24gTWkoYSxiLGMsZCxlKXt0aGlzLk09YXx8bnVsbDt0aGlzLmg9Ynx8bnVsbDt0aGlzLkNhPWN8fFtdO3RoaXMuSz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8XCJcIjt0aGlzLmphPWR8fFwiXCI7dGhpcy5nPXRoaXMuTD10aGlzLlI9bnVsbH1mdW5jdGlvbiBOaShhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gT2koYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifU1pLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTX07TWkucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPU1pLnByb3RvdHlwZS5pO2Z1bmN0aW9uIFBpKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgUWk9Lzpob3N0XFxzKj5cXHMqLyxSaT1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFwiVHJpZGVudFwiKTtmdW5jdGlvbiBTaSgpe31mdW5jdGlvbiBUaShhKXt2YXIgYj17fSxjPVtdLGQ9MDtYaChhLGZ1bmN0aW9uKGYpe1VpKGYpO2YuaW5kZXg9ZCsrO2Y9Zi5GLmNzc1RleHQ7Zm9yKHZhciBnO2c9UmguZXhlYyhmKTspe3ZhciBoPWdbMV07XCI6XCIhPT1nWzJdJiYoYltoXT0hMCl9fSxmdW5jdGlvbihmKXtjLnB1c2goZil9KTthLmg9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIFVpKGEpe2lmKCFhLkYpe3ZhciBiPXt9LGM9e307VmkoYSxjKSYmKGIuUD1jLGEucnVsZXM9bnVsbCk7Yi5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dC5yZXBsYWNlKFVoLFwiXCIpLnJlcGxhY2UoUGgsXCJcIik7YS5GPWJ9fWZ1bmN0aW9uIFZpKGEsYil7dmFyIGM9YS5GO2lmKGMpe2lmKGMuUClyZXR1cm4gT2JqZWN0LmFzc2lnbihiLGMuUCksITB9ZWxzZXtjPWEucGFyc2VkQ3NzVGV4dDtmb3IodmFyIGQ7YT1QaC5leGVjKGMpOyl7ZD0oYVsyXXx8YVszXSkudHJpbSgpO2lmKFwiaW5oZXJpdFwiIT09ZHx8XCJ1bnNldFwiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fVxuZnVuY3Rpb24gV2koYSxiLGMpe2ImJihiPTA8PWIuaW5kZXhPZihcIjtcIik/WGkoYSxiLGMpOmZpKGIsZnVuY3Rpb24oZCxlLGYsZyl7aWYoIWUpcmV0dXJuIGQrZzsoZT1XaShhLGNbZV0sYykpJiZcImluaXRpYWxcIiE9PWU/XCJhcHBseS1zaGltLWluaGVyaXRcIj09PWUmJihlPVwiaW5oZXJpdFwiKTplPVdpKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gZCsoZXx8XCJcIikrZ30pKTtyZXR1cm4gYiYmYi50cmltKCl8fFwiXCJ9XG5mdW5jdGlvbiBYaShhLGIsYyl7Yj1iLnNwbGl0KFwiO1wiKTtmb3IodmFyIGQ9MCxlLGY7ZDxiLmxlbmd0aDtkKyspaWYoZT1iW2RdKXtRaC5sYXN0SW5kZXg9MDtpZihmPVFoLmV4ZWMoZSkpZT1XaShhLGNbZlsxXV0sYyk7ZWxzZSBpZihmPWUuaW5kZXhPZihcIjpcIiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9V2koYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZihcIjtcIik9PT1lLmxlbmd0aC0xP2Uuc2xpY2UoMCwtMSk6ZXx8XCJcIn1yZXR1cm4gYi5qb2luKFwiO1wiKX1cbmZ1bmN0aW9uIFlpKGEsYil7dmFyIGM9e30sZD1bXTtYaChhLGZ1bmN0aW9uKGUpe2UuRnx8VWkoZSk7dmFyIGY9ZS5HfHxlLnBhcnNlZFNlbGVjdG9yO2ImJmUuRi5QJiZmJiZQaS5jYWxsKGIsZikmJihWaShlLGMpLGU9ZS5pbmRleCxmPXBhcnNlSW50KGUvMzIsMTApLGRbZl09KGRbZl18fDApfDE8PGUlMzIpfSxudWxsLCEwKTtyZXR1cm57UDpjLGtleTpkfX1cbmZ1bmN0aW9uIFppKGEsYixjLGQpe2IuRnx8VWkoYik7aWYoYi5GLlApe3ZhciBlPWlpKGEpO2E9ZS5pcztlPWUuamE7ZT1hP3ZpKGEsZSk6XCJodG1sXCI7dmFyIGY9Yi5wYXJzZWRTZWxlY3Rvcjt2YXIgZz0hIWYubWF0Y2goUWkpfHxcImh0bWxcIj09PWUmJi0xPGYuaW5kZXhPZihcImh0bWxcIik7dmFyIGg9MD09PWYuaW5kZXhPZihcIjpob3N0XCIpJiYhZztcInNoYWR5XCI9PT1jJiYoZz1mPT09ZStcIiA+ICouXCIrZXx8LTEhPT1mLmluZGV4T2YoXCJodG1sXCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLkd8fChiLkc9d2kocGksYixwaS5oLGE/XCIuXCIrYTpcIlwiLGUpKSxjPWIuR3x8ZSksZyYmXCJodG1sXCI9PT1lJiYoYz1iLkd8fGIuTyksZCh7RWE6YyxnYjpoLHZiOmd9KX19XG5mdW5jdGlvbiAkaShhLGIsYyl7dmFyIGQ9e30sZT17fTtYaChiLGZ1bmN0aW9uKGYpe1ppKGEsZixjLGZ1bmN0aW9uKGcpe1BpLmNhbGwoYS5fZWxlbWVudHx8YSxnLkVhKSYmKGcuZ2I/VmkoZixkKTpWaShmLGUpKX0pfSxudWxsLCEwKTtyZXR1cm57bWI6ZSxlYjpkfX1cbmZ1bmN0aW9uIGFqKGEsYixjLGQpe3ZhciBlPWlpKGIpLGY9dmkoZS5pcyxlLmphKSxnPW5ldyBSZWdFeHAoXCIoPzpefFteLiNbOl0pXCIrKGIuZXh0ZW5kcz9cIlxcXFxcIitmLnNsaWNlKDAsLTEpK1wiXFxcXF1cIjpmKStcIigkfFsuOltcXFxccz4rfl0pXCIpLGg9TmkoYik7ZT1oLk07aD1oLmNzc0J1aWxkO3ZhciBrPWJqKGUsZCk7cmV0dXJuIHRpKGIsZSxmdW5jdGlvbihsKXt2YXIgbT1cIlwiO2wuRnx8VWkobCk7bC5GLmNzc1RleHQmJihtPVhpKGEsbC5GLmNzc1RleHQsYykpO2wuY3NzVGV4dD1tO2lmKCFWJiYhJGgobCkmJmwuY3NzVGV4dCl7dmFyIHE9bT1sLmNzc1RleHQ7bnVsbD09bC5NYSYmKGwuTWE9U2gudGVzdChtKSk7aWYobC5NYSlpZihudWxsPT1sLnJhKXtsLnJhPVtdO2Zvcih2YXIgSCBpbiBrKXE9a1tIXSxxPXEobSksbSE9PXEmJihtPXEsbC5yYS5wdXNoKEgpKX1lbHNle2ZvcihIPTA7SDxsLnJhLmxlbmd0aDsrK0gpcT1rW2wucmFbSF1dLG09cShtKTtxPW19bC5jc3NUZXh0PXE7bC5HPVxubC5HfHxsLnNlbGVjdG9yO209XCIuXCIrZDtIPWppKGwuRyk7cT0wO2Zvcih2YXIgQz1ILmxlbmd0aCx0PXZvaWQgMDtxPEMmJih0PUhbcV0pO3ErKylIW3FdPXQubWF0Y2goZyk/dC5yZXBsYWNlKGYsbSk6bStcIiBcIit0O2wuc2VsZWN0b3I9SC5qb2luKFwiLFwiKX19LGgpfWZ1bmN0aW9uIGJqKGEsYil7YT1hLmg7dmFyIGM9e307aWYoIVYmJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YudT1uZXcgUmVnRXhwKFwiXFxcXGJcIitmLmtleWZyYW1lc05hbWUrXCIoPyFcXFxcQnwtKVwiLFwiZ1wiKTtmLmc9Zi5rZXlmcmFtZXNOYW1lK1wiLVwiK2c7Zi5HPWYuR3x8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuRy5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmcpO2NbZS5rZXlmcmFtZXNOYW1lXT1jaihlKX1yZXR1cm4gY31mdW5jdGlvbiBjaihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLnUsYS5nKX19XG5mdW5jdGlvbiBkaihhLGIpe3ZhciBjPWVqLGQ9WWgoYSk7YS50ZXh0Q29udGVudD1XaChkLGZ1bmN0aW9uKGUpe3ZhciBmPWUuY3NzVGV4dD1lLnBhcnNlZENzc1RleHQ7ZS5GJiZlLkYuY3NzVGV4dCYmKGY9Zi5yZXBsYWNlKEhoLFwiXCIpLnJlcGxhY2UoSWgsXCJcIiksZS5jc3NUZXh0PVhpKGMsZixiKSl9KX1lYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhTaS5wcm90b3R5cGUse2c6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVyblwieC1zY29wZVwifX19KTt2YXIgZWo9bmV3IFNpO3ZhciBmaj17fSxnaj13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoZ2omJiFWJiYhT2gpe3ZhciBoaj1nai5kZWZpbmU7Z2ouZGVmaW5lPWZ1bmN0aW9uKGEsYixjKXtmalthXXx8KGZqW2FdPWRpKGEpKTtoai5jYWxsKGdqLGEsYixjKX19O2Z1bmN0aW9uIGlqKCl7dGhpcy5jYWNoZT17fX1pai5wcm90b3R5cGUuc3RvcmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5jYWNoZVthXXx8W107ZS5wdXNoKHtQOmIsc3R5bGVFbGVtZW50OmMsTDpkfSk7MTAwPGUubGVuZ3RoJiZlLnNoaWZ0KCk7dGhpcy5jYWNoZVthXT1lfTtmdW5jdGlvbiBqaigpe312YXIga2o9bmV3IFJlZ0V4cChwaS5nK1wiXFxcXHMqKFteXFxcXHNdKilcIik7ZnVuY3Rpb24gbGooYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKS5tYXRjaChraikpP2FbMV06XCJcIn1mdW5jdGlvbiBtaihhKXt2YXIgYj1oaShhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD9cIlwiOihhPWIuaG9zdCk/aWkoYSkuaXM6XCJcIn1cbmZ1bmN0aW9uIG5qKGEpe2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1hW2JdO2lmKGMudGFyZ2V0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZjLnRhcmdldCE9PWRvY3VtZW50LmhlYWQpZm9yKHZhciBkPTA7ZDxjLmFkZGVkTm9kZXMubGVuZ3RoO2QrKyl7dmFyIGU9Yy5hZGRlZE5vZGVzW2RdO2lmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGY9ZS5nZXRSb290Tm9kZSgpLGc9bGooZSk7aWYoZyYmZj09PWUub3duZXJEb2N1bWVudCYmKFwic3R5bGVcIiE9PWUubG9jYWxOYW1lJiZcInRlbXBsYXRlXCIhPT1lLmxvY2FsTmFtZXx8XCJcIj09PWtpKGUpKSlzaShlLGcpO2Vsc2UgaWYoZiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpZm9yKGY9bWooZSksZiE9PWcmJnJpKGUsZyxmKSxlPXdpbmRvdy5TaGFkeURPTS5uYXRpdmVNZXRob2RzLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlLFwiOm5vdCguXCIrcGkuZytcIilcIiksZz0wO2c8ZS5sZW5ndGg7ZysrKXtmPWVbZ107XG52YXIgaD1taihmKTtoJiZxaShmLGgpfX19fX1cbmlmKCEoVnx8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIG9qPW5ldyBNdXRhdGlvbk9ic2VydmVyKG5qKSxwaj1mdW5jdGlvbihhKXtvai5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXBqKGRvY3VtZW50KTtlbHNle3ZhciBxaj1mdW5jdGlvbigpe3BqKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeShxaik6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoXCJsb2FkaW5nXCI9PT1kb2N1bWVudC5yZWFkeVN0YXRlKXt2YXIgYT1mdW5jdGlvbigpe3FqKCk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIixhKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInJlYWR5c3RhdGVjaGFuZ2VcIixcbmEpfWVsc2UgcWooKX0pfWpqPWZ1bmN0aW9uKCl7bmoob2oudGFrZVJlY29yZHMoKSl9fTt2YXIgcmo9e307dmFyIHNqPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHRqKGEpe2lmKGE9cmpbYV0pYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249YS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb258fDAsYS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb258fDAsYS5fYXBwbHlTaGltTmV4dFZlcnNpb249KGEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufHwwKSsxfWZ1bmN0aW9uIHVqKGEpe3JldHVybiBhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj09PWEuX2FwcGx5U2hpbU5leHRWZXJzaW9ufWZ1bmN0aW9uIHZqKGEpe2EuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmd8fChhLl92YWxpZGF0aW5nPSEwLHNqLnRoZW4oZnVuY3Rpb24oKXthLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLl92YWxpZGF0aW5nPSExfSkpfTt2YXIgd2o9e30seGo9bmV3IGlqO2Z1bmN0aW9uIFkoKXt0aGlzLmVhPXt9O3RoaXMuaT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dmFyIGE9bmV3IHVoO2EucnVsZXM9W107dGhpcy51PU9pKHRoaXMuaSxuZXcgTWkoYSkpO3RoaXMuTz0hMTt0aGlzLmc9dGhpcy5oPW51bGx9dj1ZLnByb3RvdHlwZTt2LmZsdXNoPWZ1bmN0aW9uKCl7amooKX07di5iYj1mdW5jdGlvbihhKXtyZXR1cm4gWWgoYSl9O3YucWI9ZnVuY3Rpb24oYSl7cmV0dXJuIFdoKGEpfTt2LnByZXBhcmVUZW1wbGF0ZT1mdW5jdGlvbihhLGIsYyl7dGhpcy5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKTt0aGlzLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhhLGIsYyl9O1xudi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIU9oKXtWfHxmaltiXXx8KGZqW2JdPWRpKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9YztyaltiXT1hO3ZhciBkPWtpKGEpLGU9bGkoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVcIiksaD0wO2g8Zy5sZW5ndGg7aCsrKXt2YXIgaz1nW2hdO2lmKGsuaGFzQXR0cmlidXRlKFwic2hhZHktdW5zY29wZWRcIikpe2lmKCFWKXt2YXIgbD1rLnRleHRDb250ZW50O2lmKCFWaC5oYXMobCkpe1ZoLmFkZChsKTt2YXIgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7bS5zZXRBdHRyaWJ1dGUoXCJzaGFkeS11bnNjb3BlZFwiLFwiXCIpO20udGV4dENvbnRlbnQ9bDtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG0pfWsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksXG5rLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoayl9Zj1mLmpvaW4oXCJcIikudHJpbSgpKyh3altiXXx8XCJcIik7eWoodGhpcyk7aWYoIWUpe2lmKGc9IWQpZz1RaC50ZXN0KGYpfHxQaC50ZXN0KGYpLFFoLmxhc3RJbmRleD0wLFBoLmxhc3RJbmRleD0wO2g9dmgoZik7ZyYmVyYmdGhpcy5oJiZ0aGlzLmgudHJhbnNmb3JtUnVsZXMoaCxiKTthLl9zdHlsZUFzdD1ofWc9W107V3x8KGc9VGkoYS5fc3R5bGVBc3QpKTtpZighZy5sZW5ndGh8fFcpaD1WP2EuY29udGVudDpudWxsLGI9ZmpbYl18fG51bGwsZD10aShjLGEuX3N0eWxlQXN0LG51bGwsZCxlP2Y6XCJcIiksZD1kLmxlbmd0aD9haShkLGMuaXMsaCxiKTpudWxsLGEuX3N0eWxlPWQ7YS5nPWd9fTt2LmtiPWZ1bmN0aW9uKGEsYil7d2pbYl09YS5qb2luKFwiIFwiKX07XG52LnByZXBhcmVUZW1wbGF0ZURvbT1mdW5jdGlvbihhLGIpe2lmKCFPaCl7dmFyIGM9a2koYSk7Vnx8XCJzaGFkeVwiPT09Y3x8YS5fZG9tUHJlcGFyZWR8fChhLl9kb21QcmVwYXJlZD0hMCxuaShhLmNvbnRlbnQsYikpfX07ZnVuY3Rpb24gemooYSl7dmFyIGI9aWkoYSksYz1iLmlzO2I9Yi5qYTt2YXIgZD1maltjXXx8bnVsbCxlPXJqW2NdO2lmKGUpe2M9ZS5fc3R5bGVBc3Q7dmFyIGY9ZS5nO2U9a2koZSk7Yj1uZXcgTWkoYyxkLGYsYixlKTtPaShhLGIpO3JldHVybiBifX1cbmZ1bmN0aW9uIEFqKGEpeyFhLmcmJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5nPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmcudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5RYShiKX0sYS5nLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5nLmVucXVldWVkfHxhLk8pJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfWZ1bmN0aW9uIHlqKGEpe2lmKCFhLmgmJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSl7YS5oPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW07YS5oLmludmFsaWRDYWxsYmFjaz10ajt2YXIgYj0hMH1lbHNlIGI9ITE7QWooYSk7cmV0dXJuIGJ9XG52LmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7aWYoIU9oKXt2YXIgYT15aih0aGlzKTtpZih0aGlzLmcpe3ZhciBiPXRoaXMuZy5wcm9jZXNzU3R5bGVzKCk7aWYoKGF8fHRoaXMuZy5lbnF1ZXVlZCkmJiFsaSh0aGlzLnUuY3NzQnVpbGQpKXtpZihXKXtpZighdGhpcy51LmNzc0J1aWxkKWZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPXRoaXMuZy5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGJbYV0pO2lmKGMmJlcmJnRoaXMuaCl7dmFyIGQ9WWgoYyk7eWoodGhpcyk7dGhpcy5oLnRyYW5zZm9ybVJ1bGVzKGQpO2MudGV4dENvbnRlbnQ9V2goZCl9fX1lbHNle0JqKHRoaXMsYik7Q2oodGhpcyx0aGlzLmksdGhpcy51KTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKShjPXRoaXMuZy5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGJbYV0pKSYmZGooYyx0aGlzLnUuUik7dGhpcy5PJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmcuZW5xdWV1ZWQ9ITF9fX19O1xuZnVuY3Rpb24gQmooYSxiKXtiPWIubWFwKGZ1bmN0aW9uKGMpe3JldHVybiBhLmcuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShjKX0pLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hIWN9KTtiLnNvcnQoZnVuY3Rpb24oYyxkKXtjPWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYyk7cmV0dXJuIGMmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkc/MTpjJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HPy0xOjB9KTthLnUuTS5ydWxlcz1iLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gWWgoYyl9KX1cbnYuc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoT2gpe2lmKGIpe05pKGEpfHxPaShhLG5ldyBNaShudWxsKSk7dmFyIGM9TmkoYSk7Yy5LPWMuS3x8e307T2JqZWN0LmFzc2lnbihjLkssYik7RGoodGhpcyxhLGMpfX1lbHNlIGlmKGM9TmkoYSl8fHpqKGEpKWlmKGEhPT10aGlzLmkmJih0aGlzLk89ITApLGImJihjLks9Yy5LfHx7fSxPYmplY3QuYXNzaWduKGMuSyxiKSksVylEaih0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksQ2oodGhpcyxhLGMpLGMuQ2EmJmMuQ2EubGVuZ3RoKXtiPWlpKGEpLmlzO3ZhciBkO2E6e2lmKGQ9eGouY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5DYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLlBba10hPT1jLlJba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50OlxubnVsbDtlPWMuTDsoZj1kJiZkLkwpfHwoZj10aGlzLmVhW2JdPSh0aGlzLmVhW2JdfHwwKSsxLGY9YitcIi1cIitmKTtjLkw9ZjtmPWMuTDtoPWVqO2g9Zz9nLnRleHRDb250ZW50fHxcIlwiOmFqKGgsYSxjLlIsZik7az1OaShhKTt2YXIgbD1rLmc7bCYmIVYmJmwhPT1nJiYobC5fdXNlQ291bnQtLSwwPj1sLl91c2VDb3VudCYmbC5wYXJlbnROb2RlJiZsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCkpO1Y/ay5nPyhrLmcudGV4dENvbnRlbnQ9aCxnPWsuZyk6aCYmKGc9YWkoaCxmLGEuc2hhZG93Um9vdCxrLmgpKTpnP2cucGFyZW50Tm9kZXx8KFJpJiYtMTxoLmluZGV4T2YoXCJAbWVkaWFcIikmJihnLnRleHRDb250ZW50PWgpLGJpKGcsbnVsbCxrLmgpKTpoJiYoZz1haShoLGYsbnVsbCxrLmgpKTtnJiYoZy5fdXNlQ291bnQ9Zy5fdXNlQ291bnR8fDAsay5nIT1nJiZnLl91c2VDb3VudCsrLGsuZz1nKTtmPWc7Vnx8KGc9Yy5MLGs9aD1hLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiLGUmJlxuKGs9aC5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccyp4LXNjb3BlXFxcXHMqXCIrZStcIlxcXFxzKlwiLFwiZ1wiKSxcIiBcIikpLGsrPShrP1wiIFwiOlwiXCIpK1wieC1zY29wZSBcIitnLGghPT1rJiZnaShhLGspKTtkfHx4ai5zdG9yZShiLGMuUixmLGMuTCl9fTtcbmZ1bmN0aW9uIERqKGEsYixjKXt2YXIgZD1paShiKS5pcztpZihjLkspe3ZhciBlPWMuSyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT1yaltkXTtpZighKCFlJiZiIT09YS5pfHxlJiZcIlwiIT09a2koZSkpJiZlJiZlLl9zdHlsZSYmIXVqKGUpKXtpZih1aihlKXx8ZS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1lLl9hcHBseVNoaW1OZXh0VmVyc2lvbil5aihhKSxhLmgmJmEuaC50cmFuc2Zvcm1SdWxlcyhlLl9zdHlsZUFzdCxkKSxlLl9zdHlsZS50ZXh0Q29udGVudD10aShiLGMuTSksdmooZSk7ViYmKGE9Yi5zaGFkb3dSb290KSYmKGE9YS5xdWVyeVNlbGVjdG9yKFwic3R5bGVcIikpJiYoYS50ZXh0Q29udGVudD10aShiLGMuTSkpO2MuTT1lLl9zdHlsZUFzdH19XG5mdW5jdGlvbiBFaihhLGIpe3JldHVybihiPWhpKGIpLmdldFJvb3ROb2RlKCkuaG9zdCk/TmkoYil8fHpqKGIpP2I6RWooYSxiKTphLml9ZnVuY3Rpb24gQ2ooYSxiLGMpe3ZhciBkPUVqKGEsYiksZT1OaShkKSxmPWUuUjtkPT09YS5pfHxmfHwoQ2ooYSxkLGUpLGY9ZS5SKTthPU9iamVjdC5jcmVhdGUoZnx8bnVsbCk7ZD0kaShiLGMuTSxjLmNzc0J1aWxkKTtiPVlpKGUuTSxiKS5QO09iamVjdC5hc3NpZ24oYSxkLmViLGIsZC5tYik7Yj1jLks7Zm9yKHZhciBnIGluIGIpaWYoKGU9YltnXSl8fDA9PT1lKWFbZ109ZTtnPWVqO2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSk7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylkPWJbZV0sYVtkXT1XaShnLGFbZF0sYSk7Yy5SPWF9di5zdHlsZURvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuc3R5bGVTdWJ0cmVlKHRoaXMuaSxhKX07XG52LnN0eWxlU3VidHJlZT1mdW5jdGlvbihhLGIpe3ZhciBjPWhpKGEpLGQ9Yy5zaGFkb3dSb290LGU9YT09PXRoaXMuaTsoZHx8ZSkmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1lP2M6ZClmb3IoYT1BcnJheS5mcm9tKGEucXVlcnlTZWxlY3RvckFsbChcIipcIikpLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gaGkoZikuc2hhZG93Um9vdH0pLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKX07XG52LlFhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1raShhKTtjIT09dGhpcy51LmNzc0J1aWxkJiYodGhpcy51LmNzc0J1aWxkPWMpO2lmKCFsaShjKSl7dmFyIGQ9WWgoYSk7WGgoZCxmdW5jdGlvbihlKXtpZihWKUxpKGUpO2Vsc2V7dmFyIGY9cGk7ZS5zZWxlY3Rvcj1lLnBhcnNlZFNlbGVjdG9yO0xpKGUpO2Uuc2VsZWN0b3I9ZS5HPXdpKGYsZSxmLmksdm9pZCAwLHZvaWQgMCl9VyYmXCJcIj09PWMmJih5aihiKSxiLmgmJmIuaC50cmFuc2Zvcm1SdWxlKGUpKX0pO1c/YS50ZXh0Q29udGVudD1XaChkKTp0aGlzLnUuTS5ydWxlcy5wdXNoKGQpfX07di5nZXRDb21wdXRlZFN0eWxlVmFsdWU9ZnVuY3Rpb24oYSxiKXt2YXIgYztXfHwoYz0oTmkoYSl8fE5pKEVqKHRoaXMsYSkpKS5SW2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKTpcIlwifTtcbnYucGI9ZnVuY3Rpb24oYSxiKXt2YXIgYz1oaShhKS5nZXRSb290Tm9kZSgpO2I9Yj8oXCJzdHJpbmdcIj09PXR5cGVvZiBiP2I6U3RyaW5nKGIpKS5zcGxpdCgvXFxzLyk6W107Yz1jLmhvc3QmJmMuaG9zdC5sb2NhbE5hbWU7aWYoIWMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIik7aWYoZCl7ZD1kLnNwbGl0KC9cXHMvKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKylpZihkW2VdPT09cGkuZyl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2gocGkuZyxjKTtXfHwoYz1OaShhKSkmJmMuTCYmYi5wdXNoKGVqLmcsYy5MKTtnaShhLGIuam9pbihcIiBcIikpfTt2LlhhPWZ1bmN0aW9uKGEpe3JldHVybiBOaShhKX07di5vYj1mdW5jdGlvbihhLGIpe3FpKGEsYil9O3YucmI9ZnVuY3Rpb24oYSxiKXtxaShhLGIsITApfTt2Lm5iPWZ1bmN0aW9uKGEpe3JldHVybiBtaihhKX07di4kYT1mdW5jdGlvbihhKXtyZXR1cm4gbGooYSl9O1kucHJvdG90eXBlLmZsdXNoPVkucHJvdG90eXBlLmZsdXNoO1xuWS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPVkucHJvdG90eXBlLnByZXBhcmVUZW1wbGF0ZTtZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLnBiO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLlhhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUuUWE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuYmI7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5xYjtcblkucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPVkucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzO1kucHJvdG90eXBlLnNjb3BlTm9kZT1ZLnByb3RvdHlwZS5vYjtZLnByb3RvdHlwZS51bnNjb3BlTm9kZT1ZLnByb3RvdHlwZS5yYjtZLnByb3RvdHlwZS5zY29wZUZvck5vZGU9WS5wcm90b3R5cGUubmI7WS5wcm90b3R5cGUuY3VycmVudFNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS4kYTtZLnByb3RvdHlwZS5wcmVwYXJlQWRvcHRlZENzc1RleHQ9WS5wcm90b3R5cGUua2I7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWS5wcm90b3R5cGUse25hdGl2ZVNoYWRvdzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFZ9fSxuYXRpdmVDc3M6e2dldDpmdW5jdGlvbigpe3JldHVybiBXfX19KTt2YXIgWj1uZXcgWSxGaixHajt3aW5kb3cuU2hhZHlDU1MmJihGaj13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltLEdqPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSk7XG53aW5kb3cuU2hhZHlDU1M9e1Njb3BpbmdTaGltOloscHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oYSxiKXtaLnByZXBhcmVUZW1wbGF0ZURvbShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhhLGIsYyl9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1ouc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRG9jdW1lbnQoYSl9LGZsdXNoQ3VzdG9tU3R5bGVzOmZ1bmN0aW9uKCl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpfSxcbmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6VyxuYXRpdmVTaGFkb3c6Vixjc3NCdWlsZDpOaCxkaXNhYmxlUnVudGltZTpPaH07RmomJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUZqKTtHaiYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1Haik7KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIodCl7XCJcIj09dCYmKGYuY2FsbCh0aGlzKSx0aGlzLm09ITApO3JldHVybiB0LnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gYyh0KXt2YXIgRj10LmNoYXJDb2RlQXQoMCk7cmV0dXJuIDMyPEYmJjEyNz5GJiYtMT09WzM0LDM1LDYwLDYyLDYzLDk2XS5pbmRleE9mKEYpP3Q6ZW5jb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIGQodCl7dmFyIEY9dC5jaGFyQ29kZUF0KDApO3JldHVybiAzMjxGJiYxMjc+RiYmLTE9PVszNCwzNSw2MCw2Miw5Nl0uaW5kZXhPZihGKT90OmVuY29kZVVSSUNvbXBvbmVudCh0KX1mdW5jdGlvbiBlKHQsRixFKXtmdW5jdGlvbiBOKGhhKXtzYS5wdXNoKGhhKX12YXIgeT1GfHxcInNjaGVtZSBzdGFydFwiLFg9MCx4PVwiXCIsdGE9ITEsaWE9ITEsc2E9W107YTpmb3IoOyh2b2lkIDAhPXRbWC0xXXx8MD09WCkmJiF0aGlzLm07KXt2YXIgbj10W1hdO3N3aXRjaCh5KXtjYXNlIFwic2NoZW1lIHN0YXJ0XCI6aWYobiYmcS50ZXN0KG4pKXgrPVxubi50b0xvd2VyQ2FzZSgpLHk9XCJzY2hlbWVcIjtlbHNlIGlmKEYpe04oXCJJbnZhbGlkIHNjaGVtZS5cIik7YnJlYWsgYX1lbHNle3g9XCJcIjt5PVwibm8gc2NoZW1lXCI7Y29udGludWV9YnJlYWs7Y2FzZSBcInNjaGVtZVwiOmlmKG4mJkgudGVzdChuKSl4Kz1uLnRvTG93ZXJDYXNlKCk7ZWxzZSBpZihcIjpcIj09bil7dGhpcy5sPXg7eD1cIlwiO2lmKEYpYnJlYWsgYTt2b2lkIDAhPT1sW3RoaXMubF0mJih0aGlzLkg9ITApO3k9XCJmaWxlXCI9PXRoaXMubD9cInJlbGF0aXZlXCI6dGhpcy5IJiZFJiZFLmw9PXRoaXMubD9cInJlbGF0aXZlIG9yIGF1dGhvcml0eVwiOnRoaXMuSD9cImF1dGhvcml0eSBmaXJzdCBzbGFzaFwiOlwic2NoZW1lIGRhdGFcIn1lbHNlIGlmKEYpe3ZvaWQgMCE9biYmTihcIkNvZGUgcG9pbnQgbm90IGFsbG93ZWQgaW4gc2NoZW1lOiBcIituKTticmVhayBhfWVsc2V7eD1cIlwiO1g9MDt5PVwibm8gc2NoZW1lXCI7Y29udGludWV9YnJlYWs7Y2FzZSBcInNjaGVtZSBkYXRhXCI6XCI/XCI9PW4/KHRoaXMuQT1cIj9cIixcbnk9XCJxdWVyeVwiKTpcIiNcIj09bj8odGhpcy5DPVwiI1wiLHk9XCJmcmFnbWVudFwiKTp2b2lkIDAhPW4mJlwiXFx0XCIhPW4mJlwiXFxuXCIhPW4mJlwiXFxyXCIhPW4mJih0aGlzLnlhKz1jKG4pKTticmVhaztjYXNlIFwibm8gc2NoZW1lXCI6aWYoRSYmdm9pZCAwIT09bFtFLmxdKXt5PVwicmVsYXRpdmVcIjtjb250aW51ZX1lbHNlIE4oXCJNaXNzaW5nIHNjaGVtZS5cIiksZi5jYWxsKHRoaXMpLHRoaXMubT0hMDticmVhaztjYXNlIFwicmVsYXRpdmUgb3IgYXV0aG9yaXR5XCI6aWYoXCIvXCI9PW4mJlwiL1wiPT10W1grMV0peT1cImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2Vsc2V7TihcIkV4cGVjdGVkIC8sIGdvdDogXCIrbik7eT1cInJlbGF0aXZlXCI7Y29udGludWV9YnJlYWs7Y2FzZSBcInJlbGF0aXZlXCI6dGhpcy5IPSEwO1wiZmlsZVwiIT10aGlzLmwmJih0aGlzLmw9RS5sKTtpZih2b2lkIDA9PW4pe3RoaXMubz1FLm87dGhpcy52PUUudjt0aGlzLnM9RS5zLnNsaWNlKCk7dGhpcy5BPUUuQTt0aGlzLkI9RS5CO3RoaXMuaj1FLmo7XG5icmVhayBhfWVsc2UgaWYoXCIvXCI9PW58fFwiXFxcXFwiPT1uKVwiXFxcXFwiPT1uJiZOKFwiXFxcXCBpcyBhbiBpbnZhbGlkIGNvZGUgcG9pbnQuXCIpLHk9XCJyZWxhdGl2ZSBzbGFzaFwiO2Vsc2UgaWYoXCI/XCI9PW4pdGhpcy5vPUUubyx0aGlzLnY9RS52LHRoaXMucz1FLnMuc2xpY2UoKSx0aGlzLkE9XCI/XCIsdGhpcy5CPUUuQix0aGlzLmo9RS5qLHk9XCJxdWVyeVwiO2Vsc2UgaWYoXCIjXCI9PW4pdGhpcy5vPUUubyx0aGlzLnY9RS52LHRoaXMucz1FLnMuc2xpY2UoKSx0aGlzLkE9RS5BLHRoaXMuQz1cIiNcIix0aGlzLkI9RS5CLHRoaXMuaj1FLmoseT1cImZyYWdtZW50XCI7ZWxzZXt5PXRbWCsxXTt2YXIgSj10W1grMl07aWYoXCJmaWxlXCIhPXRoaXMubHx8IXEudGVzdChuKXx8XCI6XCIhPXkmJlwifFwiIT15fHx2b2lkIDAhPUomJlwiL1wiIT1KJiZcIlxcXFxcIiE9SiYmXCI/XCIhPUomJlwiI1wiIT1KKXRoaXMubz1FLm8sdGhpcy52PUUudix0aGlzLkI9RS5CLHRoaXMuaj1FLmosdGhpcy5zPUUucy5zbGljZSgpLHRoaXMucy5wb3AoKTt5PVxuXCJyZWxhdGl2ZSBwYXRoXCI7Y29udGludWV9YnJlYWs7Y2FzZSBcInJlbGF0aXZlIHNsYXNoXCI6aWYoXCIvXCI9PW58fFwiXFxcXFwiPT1uKVwiXFxcXFwiPT1uJiZOKFwiXFxcXCBpcyBhbiBpbnZhbGlkIGNvZGUgcG9pbnQuXCIpLHk9XCJmaWxlXCI9PXRoaXMubD9cImZpbGUgaG9zdFwiOlwiYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI7ZWxzZXtcImZpbGVcIiE9dGhpcy5sJiYodGhpcy5vPUUubyx0aGlzLnY9RS52LHRoaXMuQj1FLkIsdGhpcy5qPUUuaik7eT1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX1icmVhaztjYXNlIFwiYXV0aG9yaXR5IGZpcnN0IHNsYXNoXCI6aWYoXCIvXCI9PW4peT1cImF1dGhvcml0eSBzZWNvbmQgc2xhc2hcIjtlbHNle04oXCJFeHBlY3RlZCAnLycsIGdvdDogXCIrbik7eT1cImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2NvbnRpbnVlfWJyZWFrO2Nhc2UgXCJhdXRob3JpdHkgc2Vjb25kIHNsYXNoXCI6eT1cImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2lmKFwiL1wiIT1uKXtOKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiK1xubik7Y29udGludWV9YnJlYWs7Y2FzZSBcImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiOmlmKFwiL1wiIT1uJiZcIlxcXFxcIiE9bil7eT1cImF1dGhvcml0eVwiO2NvbnRpbnVlfWVsc2UgTihcIkV4cGVjdGVkIGF1dGhvcml0eSwgZ290OiBcIituKTticmVhaztjYXNlIFwiYXV0aG9yaXR5XCI6aWYoXCJAXCI9PW4pe3RhJiYoTihcIkAgYWxyZWFkeSBzZWVuLlwiKSx4Kz1cIiU0MFwiKTt0YT0hMDtmb3Iobj0wO248eC5sZW5ndGg7bisrKUo9eFtuXSxcIlxcdFwiPT1KfHxcIlxcblwiPT1KfHxcIlxcclwiPT1KP04oXCJJbnZhbGlkIHdoaXRlc3BhY2UgaW4gYXV0aG9yaXR5LlwiKTpcIjpcIj09SiYmbnVsbD09PXRoaXMuaj90aGlzLmo9XCJcIjooSj1jKEopLG51bGwhPT10aGlzLmo/dGhpcy5qKz1KOnRoaXMuQis9Sik7eD1cIlwifWVsc2UgaWYodm9pZCAwPT1ufHxcIi9cIj09bnx8XCJcXFxcXCI9PW58fFwiP1wiPT1ufHxcIiNcIj09bil7WC09eC5sZW5ndGg7eD1cIlwiO3k9XCJob3N0XCI7Y29udGludWV9ZWxzZSB4Kz1uO2JyZWFrO2Nhc2UgXCJmaWxlIGhvc3RcIjppZih2b2lkIDA9PVxubnx8XCIvXCI9PW58fFwiXFxcXFwiPT1ufHxcIj9cIj09bnx8XCIjXCI9PW4pezIhPXgubGVuZ3RofHwhcS50ZXN0KHhbMF0pfHxcIjpcIiE9eFsxXSYmXCJ8XCIhPXhbMV0/KDAhPXgubGVuZ3RoJiYodGhpcy5vPWIuY2FsbCh0aGlzLHgpLHg9XCJcIikseT1cInJlbGF0aXZlIHBhdGggc3RhcnRcIik6eT1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX1lbHNlXCJcXHRcIj09bnx8XCJcXG5cIj09bnx8XCJcXHJcIj09bj9OKFwiSW52YWxpZCB3aGl0ZXNwYWNlIGluIGZpbGUgaG9zdC5cIik6eCs9bjticmVhaztjYXNlIFwiaG9zdFwiOmNhc2UgXCJob3N0bmFtZVwiOmlmKFwiOlwiIT1ufHxpYSlpZih2b2lkIDA9PW58fFwiL1wiPT1ufHxcIlxcXFxcIj09bnx8XCI/XCI9PW58fFwiI1wiPT1uKXt0aGlzLm89Yi5jYWxsKHRoaXMseCk7eD1cIlwiO3k9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI7aWYoRilicmVhayBhO2NvbnRpbnVlfWVsc2VcIlxcdFwiIT1uJiZcIlxcblwiIT1uJiZcIlxcclwiIT1uPyhcIltcIj09bj9pYT0hMDpcIl1cIj09biYmKGlhPSExKSx4Kz1uKTpOKFwiSW52YWxpZCBjb2RlIHBvaW50IGluIGhvc3QvaG9zdG5hbWU6IFwiK1xubik7ZWxzZSBpZih0aGlzLm89Yi5jYWxsKHRoaXMseCkseD1cIlwiLHk9XCJwb3J0XCIsXCJob3N0bmFtZVwiPT1GKWJyZWFrIGE7YnJlYWs7Y2FzZSBcInBvcnRcIjppZigvWzAtOV0vLnRlc3QobikpeCs9bjtlbHNlIGlmKHZvaWQgMD09bnx8XCIvXCI9PW58fFwiXFxcXFwiPT1ufHxcIj9cIj09bnx8XCIjXCI9PW58fEYpe1wiXCIhPXgmJih4PXBhcnNlSW50KHgsMTApLHghPWxbdGhpcy5sXSYmKHRoaXMudj14K1wiXCIpLHg9XCJcIik7aWYoRilicmVhayBhO3k9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI7Y29udGludWV9ZWxzZVwiXFx0XCI9PW58fFwiXFxuXCI9PW58fFwiXFxyXCI9PW4/TihcIkludmFsaWQgY29kZSBwb2ludCBpbiBwb3J0OiBcIituKTooZi5jYWxsKHRoaXMpLHRoaXMubT0hMCk7YnJlYWs7Y2FzZSBcInJlbGF0aXZlIHBhdGggc3RhcnRcIjpcIlxcXFxcIj09biYmTihcIidcXFxcJyBub3QgYWxsb3dlZCBpbiBwYXRoLlwiKTt5PVwicmVsYXRpdmUgcGF0aFwiO2lmKFwiL1wiIT1uJiZcIlxcXFxcIiE9biljb250aW51ZTticmVhaztjYXNlIFwicmVsYXRpdmUgcGF0aFwiOmlmKHZvaWQgMCE9XG5uJiZcIi9cIiE9biYmXCJcXFxcXCIhPW4mJihGfHxcIj9cIiE9biYmXCIjXCIhPW4pKVwiXFx0XCIhPW4mJlwiXFxuXCIhPW4mJlwiXFxyXCIhPW4mJih4Kz1jKG4pKTtlbHNle1wiXFxcXFwiPT1uJiZOKFwiXFxcXCBub3QgYWxsb3dlZCBpbiByZWxhdGl2ZSBwYXRoLlwiKTtpZihKPW1beC50b0xvd2VyQ2FzZSgpXSl4PUo7XCIuLlwiPT14Pyh0aGlzLnMucG9wKCksXCIvXCIhPW4mJlwiXFxcXFwiIT1uJiZ0aGlzLnMucHVzaChcIlwiKSk6XCIuXCI9PXgmJlwiL1wiIT1uJiZcIlxcXFxcIiE9bj90aGlzLnMucHVzaChcIlwiKTpcIi5cIiE9eCYmKFwiZmlsZVwiPT10aGlzLmwmJjA9PXRoaXMucy5sZW5ndGgmJjI9PXgubGVuZ3RoJiZxLnRlc3QoeFswXSkmJlwifFwiPT14WzFdJiYoeD14WzBdK1wiOlwiKSx0aGlzLnMucHVzaCh4KSk7eD1cIlwiO1wiP1wiPT1uPyh0aGlzLkE9XCI/XCIseT1cInF1ZXJ5XCIpOlwiI1wiPT1uJiYodGhpcy5DPVwiI1wiLHk9XCJmcmFnbWVudFwiKX1icmVhaztjYXNlIFwicXVlcnlcIjpGfHxcIiNcIiE9bj92b2lkIDAhPW4mJlwiXFx0XCIhPW4mJlwiXFxuXCIhPW4mJlwiXFxyXCIhPW4mJih0aGlzLkErPVxuZChuKSk6KHRoaXMuQz1cIiNcIix5PVwiZnJhZ21lbnRcIik7YnJlYWs7Y2FzZSBcImZyYWdtZW50XCI6dm9pZCAwIT1uJiZcIlxcdFwiIT1uJiZcIlxcblwiIT1uJiZcIlxcclwiIT1uJiYodGhpcy5DKz1uKX1YKyt9fWZ1bmN0aW9uIGYoKXt0aGlzLkI9dGhpcy55YT10aGlzLmw9XCJcIjt0aGlzLmo9bnVsbDt0aGlzLnY9dGhpcy5vPVwiXCI7dGhpcy5zPVtdO3RoaXMuQz10aGlzLkE9XCJcIjt0aGlzLkg9dGhpcy5tPSExfWZ1bmN0aW9uIGcodCxGKXt2b2lkIDA9PT1GfHxGIGluc3RhbmNlb2YgZ3x8KEY9bmV3IGcoU3RyaW5nKEYpKSk7dGhpcy5nPXQ7Zi5jYWxsKHRoaXMpO2UuY2FsbCh0aGlzLHRoaXMuZy5yZXBsYWNlKC9eWyBcXHRcXHJcXG5cXGZdK3xbIFxcdFxcclxcblxcZl0rJC9nLFwiXCIpLG51bGwsRil9dmFyIGg9ITE7dHJ5e3ZhciBrPW5ldyBVUkwoXCJiXCIsXCJodHRwOi8vYVwiKTtrLnBhdGhuYW1lPVwiYyUyMGRcIjtoPVwiaHR0cDovL2EvYyUyMGRcIj09PWsuaHJlZn1jYXRjaCh0KXt9aWYoIWgpe3ZhciBsPU9iamVjdC5jcmVhdGUobnVsbCk7XG5sLmZ0cD0yMTtsLmZpbGU9MDtsLmdvcGhlcj03MDtsLmh0dHA9ODA7bC5odHRwcz00NDM7bC53cz04MDtsLndzcz00NDM7dmFyIG09T2JqZWN0LmNyZWF0ZShudWxsKTttW1wiJTJlXCJdPVwiLlwiO21bXCIuJTJlXCJdPVwiLi5cIjttW1wiJTJlLlwiXT1cIi4uXCI7bVtcIiUyZSUyZVwiXT1cIi4uXCI7dmFyIHE9L1thLXpBLVpdLyxIPS9bYS16QS1aMC05K1xcLS5dLztnLnByb3RvdHlwZT17dG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmfSxnZXQgaHJlZigpe2lmKHRoaXMubSlyZXR1cm4gdGhpcy5nO3ZhciB0PVwiXCI7aWYoXCJcIiE9dGhpcy5CfHxudWxsIT10aGlzLmopdD10aGlzLkIrKG51bGwhPXRoaXMuaj9cIjpcIit0aGlzLmo6XCJcIikrXCJAXCI7cmV0dXJuIHRoaXMucHJvdG9jb2wrKHRoaXMuSD9cIi8vXCIrdCt0aGlzLmhvc3Q6XCJcIikrdGhpcy5wYXRobmFtZSt0aGlzLkErdGhpcy5DfSxzZXQgaHJlZih0KXtmLmNhbGwodGhpcyk7ZS5jYWxsKHRoaXMsdCl9LGdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzLmwrXG5cIjpcIn0sc2V0IHByb3RvY29sKHQpe3RoaXMubXx8ZS5jYWxsKHRoaXMsdCtcIjpcIixcInNjaGVtZSBzdGFydFwiKX0sZ2V0IGhvc3QoKXtyZXR1cm4gdGhpcy5tP1wiXCI6dGhpcy52P3RoaXMubytcIjpcIit0aGlzLnY6dGhpcy5vfSxzZXQgaG9zdCh0KXshdGhpcy5tJiZ0aGlzLkgmJmUuY2FsbCh0aGlzLHQsXCJob3N0XCIpfSxnZXQgaG9zdG5hbWUoKXtyZXR1cm4gdGhpcy5vfSxzZXQgaG9zdG5hbWUodCl7IXRoaXMubSYmdGhpcy5IJiZlLmNhbGwodGhpcyx0LFwiaG9zdG5hbWVcIil9LGdldCBwb3J0KCl7cmV0dXJuIHRoaXMudn0sc2V0IHBvcnQodCl7IXRoaXMubSYmdGhpcy5IJiZlLmNhbGwodGhpcyx0LFwicG9ydFwiKX0sZ2V0IHBhdGhuYW1lKCl7cmV0dXJuIHRoaXMubT9cIlwiOnRoaXMuSD9cIi9cIit0aGlzLnMuam9pbihcIi9cIik6dGhpcy55YX0sc2V0IHBhdGhuYW1lKHQpeyF0aGlzLm0mJnRoaXMuSCYmKHRoaXMucz1bXSxlLmNhbGwodGhpcyx0LFwicmVsYXRpdmUgcGF0aCBzdGFydFwiKSl9LGdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy5tfHxcbiF0aGlzLkF8fFwiP1wiPT10aGlzLkE/XCJcIjp0aGlzLkF9LHNldCBzZWFyY2godCl7IXRoaXMubSYmdGhpcy5IJiYodGhpcy5BPVwiP1wiLFwiP1wiPT10WzBdJiYodD10LnNsaWNlKDEpKSxlLmNhbGwodGhpcyx0LFwicXVlcnlcIikpfSxnZXQgaGFzaCgpe3JldHVybiB0aGlzLm18fCF0aGlzLkN8fFwiI1wiPT10aGlzLkM/XCJcIjp0aGlzLkN9LHNldCBoYXNoKHQpe3RoaXMubXx8KHQ/KHRoaXMuQz1cIiNcIixcIiNcIj09dFswXSYmKHQ9dC5zbGljZSgxKSksZS5jYWxsKHRoaXMsdCxcImZyYWdtZW50XCIpKTp0aGlzLkM9XCJcIil9LGdldCBvcmlnaW4oKXt2YXIgdDtpZih0aGlzLm18fCF0aGlzLmwpcmV0dXJuXCJcIjtzd2l0Y2godGhpcy5sKXtjYXNlIFwiZGF0YVwiOmNhc2UgXCJmaWxlXCI6Y2FzZSBcImphdmFzY3JpcHRcIjpjYXNlIFwibWFpbHRvXCI6cmV0dXJuXCJudWxsXCJ9cmV0dXJuKHQ9dGhpcy5ob3N0KT90aGlzLmwrXCI6Ly9cIit0OlwiXCJ9fTt2YXIgQz1hLlVSTDtDJiYoZy5jcmVhdGVPYmplY3RVUkw9ZnVuY3Rpb24odCl7cmV0dXJuIEMuY3JlYXRlT2JqZWN0VVJMLmFwcGx5KEMsXG5hcmd1bWVudHMpfSxnLnJldm9rZU9iamVjdFVSTD1mdW5jdGlvbih0KXtDLnJldm9rZU9iamVjdFVSTCh0KX0pO2EuVVJMPWd9fSkod2luZG93KTsvKlxuXG5Db3B5cmlnaHQgKGMpIDIwMTggVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcblRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4qL1xudmFyIEhqPXdpbmRvdy5jdXN0b21FbGVtZW50cyxJaj0hMSxKaj1udWxsO0hqLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2smJkhqLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7Smo9YTtJaiYmYSgpfSk7ZnVuY3Rpb24gS2ooKXt3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudC5ib290c3RyYXAmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LmJvb3RzdHJhcCh3aW5kb3cuZG9jdW1lbnQpO0pqJiZKaigpO0lqPSEwO3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiV2ViQ29tcG9uZW50c1JlYWR5XCIse2J1YmJsZXM6ITB9KSl9XG5cImNvbXBsZXRlXCIhPT1kb2N1bWVudC5yZWFkeVN0YXRlPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixLaiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImxvYWRcIixLaik7S2ooKX0pKTpLaigpO30pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYmNvbXBvbmVudHMtYnVuZGxlLmpzLm1hcFxuIiwiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHRcbiAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvXG4gKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuICovXG5cbihmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogQmFzaWMgZmxvdyBvZiB0aGUgbG9hZGVyIHByb2Nlc3NcbiAgICpcbiAgICogVGhlcmUgYXJlIDQgZmxvd3MgdGhlIGxvYWRlciBjYW4gdGFrZSB3aGVuIGJvb3RpbmcgdXBcbiAgICpcbiAgICogLSBTeW5jaHJvbm91cyBzY3JpcHQsIG5vIHBvbHlmaWxscyBuZWVkZWRcbiAgICogICAtIHdhaXQgZm9yIGBET01Db250ZW50TG9hZGVkYFxuICAgKiAgIC0gZmlyZSBXQ1IgZXZlbnQsIGFzIHRoZXJlIGNvdWxkIG5vdCBiZSBhbnkgY2FsbGJhY2tzIHBhc3NlZCB0byBgd2FpdEZvcmBcbiAgICpcbiAgICogLSBTeW5jaHJvbm91cyBzY3JpcHQsIHBvbHlmaWxscyBuZWVkZWRcbiAgICogICAtIGRvY3VtZW50LndyaXRlIHRoZSBwb2x5ZmlsbCBidW5kbGVcbiAgICogICAtIHdhaXQgb24gdGhlIGBsb2FkYCBldmVudCBvZiB0aGUgYnVuZGxlIHRvIGJhdGNoIEN1c3RvbSBFbGVtZW50IHVwZ3JhZGVzXG4gICAqICAgLSB3YWl0IGZvciBgRE9NQ29udGVudExvYWRlZGBcbiAgICogICAtIHJ1biBjYWxsYmFja3MgcGFzc2VkIHRvIGB3YWl0Rm9yYFxuICAgKiAgIC0gZmlyZSBXQ1IgZXZlbnRcbiAgICpcbiAgICogLSBBc3luY2hyb25vdXMgc2NyaXB0LCBubyBwb2x5ZmlsbHMgbmVlZGVkXG4gICAqICAgLSB3YWl0IGZvciBgRE9NQ29udGVudExvYWRlZGBcbiAgICogICAtIHJ1biBjYWxsYmFja3MgcGFzc2VkIHRvIGB3YWl0Rm9yYFxuICAgKiAgIC0gZmlyZSBXQ1IgZXZlbnRcbiAgICpcbiAgICogLSBBc3luY2hyb25vdXMgc2NyaXB0LCBwb2x5ZmlsbHMgbmVlZGVkXG4gICAqICAgLSBBcHBlbmQgdGhlIHBvbHlmaWxsIGJ1bmRsZSBzY3JpcHRcbiAgICogICAtIHdhaXQgZm9yIGBsb2FkYCBldmVudCBvZiB0aGUgYnVuZGxlXG4gICAqICAgLSBiYXRjaCBDdXN0b20gRWxlbWVudCBVcGdyYWRlc1xuICAgKiAgIC0gcnVuIGNhbGxiYWNrcyBwYXNzIHRvIGB3YWl0Rm9yYFxuICAgKiAgIC0gZmlyZSBXQ1IgZXZlbnRcbiAgICovXG5cbiAgdmFyIHBvbHlmaWxsc0xvYWRlZCA9IGZhbHNlO1xuICB2YXIgd2hlbkxvYWRlZEZucyA9IFtdO1xuICB2YXIgYWxsb3dVcGdyYWRlcyA9IGZhbHNlO1xuICB2YXIgZmx1c2hGbjtcblxuICBmdW5jdGlvbiBmaXJlRXZlbnQoKSB7XG4gICAgd2luZG93LldlYkNvbXBvbmVudHMucmVhZHkgPSB0cnVlO1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHtidWJibGVzOiB0cnVlfSlcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gYmF0Y2hDdXN0b21FbGVtZW50cygpIHtcbiAgICBpZiAod2luZG93LmN1c3RvbUVsZW1lbnRzICYmIGN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2spIHtcbiAgICAgIGN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24gKGZsdXNoQ2FsbGJhY2spIHtcbiAgICAgICAgZmx1c2hGbiA9IGZsdXNoQ2FsbGJhY2s7XG4gICAgICAgIGlmIChhbGxvd1VwZ3JhZGVzKSB7XG4gICAgICAgICAgZmx1c2hGbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhc3luY1JlYWR5KCkge1xuICAgIGJhdGNoQ3VzdG9tRWxlbWVudHMoKTtcbiAgICByZWFkeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZHkoKSB7XG4gICAgLy8gYm9vdHN0cmFwIDx0ZW1wbGF0ZT4gZWxlbWVudHMgYmVmb3JlIGN1c3RvbSBlbGVtZW50c1xuICAgIGlmICh3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCAmJiBIVE1MVGVtcGxhdGVFbGVtZW50LmJvb3RzdHJhcCkge1xuICAgICAgSFRNTFRlbXBsYXRlRWxlbWVudC5ib290c3RyYXAod2luZG93LmRvY3VtZW50KTtcbiAgICB9XG4gICAgcG9seWZpbGxzTG9hZGVkID0gdHJ1ZTtcbiAgICBydW5XaGVuTG9hZGVkRm5zKCkudGhlbihmaXJlRXZlbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gcnVuV2hlbkxvYWRlZEZucygpIHtcbiAgICBhbGxvd1VwZ3JhZGVzID0gZmFsc2U7XG4gICAgdmFyIGZuc01hcCA9IHdoZW5Mb2FkZWRGbnMubWFwKGZ1bmN0aW9uIChmbikge1xuICAgICAgcmV0dXJuIGZuIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBmbigpIDogZm47XG4gICAgfSk7XG4gICAgd2hlbkxvYWRlZEZucyA9IFtdO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmbnNNYXApXG4gICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFsbG93VXBncmFkZXMgPSB0cnVlO1xuICAgICAgICBmbHVzaEZuICYmIGZsdXNoRm4oKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9KTtcbiAgfVxuXG4gIHdpbmRvdy5XZWJDb21wb25lbnRzID0gd2luZG93LldlYkNvbXBvbmVudHMgfHwge307XG4gIHdpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5ID0gd2luZG93LldlYkNvbXBvbmVudHMucmVhZHkgfHwgZmFsc2U7XG4gIHdpbmRvdy5XZWJDb21wb25lbnRzLndhaXRGb3IgPVxuICAgIHdpbmRvdy5XZWJDb21wb25lbnRzLndhaXRGb3IgfHxcbiAgICBmdW5jdGlvbiAod2FpdEZuKSB7XG4gICAgICBpZiAoIXdhaXRGbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB3aGVuTG9hZGVkRm5zLnB1c2god2FpdEZuKTtcbiAgICAgIGlmIChwb2x5ZmlsbHNMb2FkZWQpIHtcbiAgICAgICAgcnVuV2hlbkxvYWRlZEZucygpO1xuICAgICAgfVxuICAgIH07XG4gIHdpbmRvdy5XZWJDb21wb25lbnRzLl9iYXRjaEN1c3RvbUVsZW1lbnRzID0gYmF0Y2hDdXN0b21FbGVtZW50cztcblxuICB2YXIgbmFtZSA9ICd3ZWJjb21wb25lbnRzLWxvYWRlci5qcyc7XG4gIC8vIEZlYXR1cmUgZGV0ZWN0IHdoaWNoIHBvbHlmaWxsIG5lZWRzIHRvIGJlIGltcG9ydGVkLlxuICB2YXIgcG9seWZpbGxzID0gW107XG4gIGlmIChcbiAgICAhKFxuICAgICAgJ2F0dGFjaFNoYWRvdycgaW4gRWxlbWVudC5wcm90b3R5cGUgJiYgJ2dldFJvb3ROb2RlJyBpbiBFbGVtZW50LnByb3RvdHlwZVxuICAgICkgfHxcbiAgICAod2luZG93LlNoYWR5RE9NICYmIHdpbmRvdy5TaGFkeURPTS5mb3JjZSlcbiAgKSB7XG4gICAgcG9seWZpbGxzLnB1c2goJ3NkJyk7XG4gIH1cbiAgaWYgKCF3aW5kb3cuY3VzdG9tRWxlbWVudHMgfHwgd2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGwpIHtcbiAgICBwb2x5ZmlsbHMucHVzaCgnY2UnKTtcbiAgfVxuXG4gIHZhciBuZWVkc1RlbXBsYXRlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBubyByZWFsIDx0ZW1wbGF0ZT4gYmVjYXVzZSBubyBgY29udGVudGAgcHJvcGVydHkgKElFIGFuZCBvbGRlciBicm93c2VycylcbiAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgaWYgKCEoJ2NvbnRlbnQnIGluIHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gYnJva2VuIGRvYyBmcmFnbWVudCAob2xkZXIgRWRnZSlcbiAgICBpZiAoISh0LmNvbnRlbnQuY2xvbmVOb2RlKCkgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGJyb2tlbiA8dGVtcGxhdGU+IGNsb25pbmcgKEVkZ2UgdXAgdG8gYXQgbGVhc3QgdmVyc2lvbiAxNylcbiAgICB2YXIgdDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgIHQyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpO1xuICAgIHQuY29udGVudC5hcHBlbmRDaGlsZCh0Mik7XG4gICAgdmFyIGNsb25lID0gdC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGNsb25lLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNsb25lLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwXG4gICAgKTtcbiAgfSkoKTtcblxuICAvLyBOT1RFOiBhbnkgYnJvd3NlciB0aGF0IGRvZXMgbm90IGhhdmUgdGVtcGxhdGUgb3IgRVM2IGZlYXR1cmVzXG4gIC8vIG11c3QgbG9hZCB0aGUgZnVsbCBzdWl0ZSBvZiBwb2x5ZmlsbHMuXG4gIGlmIChcbiAgICAhd2luZG93LlByb21pc2UgfHxcbiAgICAhQXJyYXkuZnJvbSB8fFxuICAgICF3aW5kb3cuVVJMIHx8XG4gICAgIXdpbmRvdy5TeW1ib2wgfHxcbiAgICBuZWVkc1RlbXBsYXRlXG4gICkge1xuICAgIHBvbHlmaWxscyA9IFsnc2QtY2UtcGYnXTtcbiAgfVxuXG4gIGlmIChwb2x5ZmlsbHMubGVuZ3RoKSB7XG4gICAgLy8gV2hlbiB0aGUgVHJ1c3RlZCBUeXBlcyBBUEkgaXMgYXZhaWxhYmxlLCBgcG9saWN5YCBpcyBhXG4gICAgLy8gYFRydXN0ZWRUeXBlUG9saWN5YCB3aXRoIGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgdHJ1c3RlZCBIVE1MLCBzY3JpcHRzLFxuICAgIC8vIGFuZCBzY3JpcHQgVVJMcy4gVGhpcyBwb2xpY3kgaXMgdXNlZCBiZWxvdyB0byAoYSkgYXBwcm92ZSB0aGUgYnVuZGxlIFVSTFxuICAgIC8vIHN0cmluZyBjcmVhdGVkIGJ5IHRoZSBsb2FkZXIgdGhhdCBpcyBhc3NpZ25lZCB0byBhIGA8c2NyaXB0PmAncyBgc3JjYFxuICAgIC8vIGF0dHJpYnV0ZSwgKGIpIGFwcHJvdmUgYSBjb25zdGFudCBzY3JpcHQgc3RyaW5nIHRoYXQgaXMgYXNzaWduZWQgdG8gdGhhdFxuICAgIC8vIGA8c2NyaXB0PidzIGBvbmxvYWRgIGF0dHJpYnV0ZSwgYW5kIChjKSBhcHByb3ZlIHRoZSBzdHJpbmcgb2YgSFRNTCB0aGF0XG4gICAgLy8gdGhlIGxvYWRlciByZWFkcyBmcm9tIHRoYXQgYDxzY3JpcHQ+YCdzIGBvdXRlckhUTUxgLlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIFRydXN0ZWQgVHlwZXMgQVBJIGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXR1cm5lZCBvYmplY3QgZXhwb3NlcyBhXG4gICAgLy8gc2ltaWxhciBpbnRlcmZhY2UgdG8gYSBgVHJ1c3RlZFR5cGVQb2xpY3lgLCBidXQgYWxsIG9mIGl0cyBmdW5jdGlvbnMgYXJlXG4gICAgLy8gdGhlIGlkZW50aXR5IGZ1bmN0aW9uLlxuICAgIHZhciBwb2xpY3kgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9O1xuICAgICAgdmFyIHBvbGljeU9wdGlvbnMgPSB7XG4gICAgICAgIGNyZWF0ZUhUTUw6IGlkZW50aXR5LFxuICAgICAgICBjcmVhdGVTY3JpcHQ6IGlkZW50aXR5LFxuICAgICAgICBjcmVhdGVTY3JpcHRVUkw6IGlkZW50aXR5LFxuICAgICAgfTtcbiAgICAgIHZhciBwb2xpY3kgPVxuICAgICAgICB3aW5kb3cudHJ1c3RlZFR5cGVzICYmXG4gICAgICAgIHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCd3ZWJjb21wb25lbnRzLWxvYWRlcicsIHBvbGljeU9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHBvbGljeSB8fCBwb2xpY3lPcHRpb25zO1xuICAgIH0pKCk7XG5cbiAgICB2YXIgdXJsO1xuICAgIHZhciBwb2x5ZmlsbEZpbGUgPSAnYnVuZGxlcy93ZWJjb21wb25lbnRzLScgKyBwb2x5ZmlsbHMuam9pbignLScpICsgJy5qcyc7XG5cbiAgICAvLyBMb2FkIGl0IGZyb20gdGhlIHJpZ2h0IHBsYWNlLlxuICAgIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cy5yb290KSB7XG4gICAgICB1cmwgPSB3aW5kb3cuV2ViQ29tcG9uZW50cy5yb290ICsgcG9seWZpbGxGaWxlO1xuICAgICAgaWYgKFxuICAgICAgICB3aW5kb3cudHJ1c3RlZFR5cGVzICYmXG4gICAgICAgIHdpbmRvdy50cnVzdGVkVHlwZXMuaXNTY3JpcHRVUkwod2luZG93LldlYkNvbXBvbmVudHMucm9vdClcbiAgICAgICkge1xuICAgICAgICB1cmwgPSBwb2xpY3kuY3JlYXRlU2NyaXB0VVJMKHVybCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj1cIicgKyBuYW1lICsgJ1wiXScpO1xuICAgICAgLy8gTG9hZCBpdCBmcm9tIHRoZSByaWdodCBwbGFjZS5cbiAgICAgIHVybCA9IHBvbGljeS5jcmVhdGVTY3JpcHRVUkwoc2NyaXB0LnNyYy5yZXBsYWNlKG5hbWUsIHBvbHlmaWxsRmlsZSkpO1xuICAgIH1cblxuICAgIHZhciBuZXdTY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBuZXdTY3JpcHQuc3JjID0gdXJsO1xuICAgIC8vIGlmIHJlYWR5U3RhdGUgaXMgJ2xvYWRpbmcnLCB0aGlzIHNjcmlwdCBpcyBzeW5jaHJvbm91c1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBjdXN0b20gZWxlbWVudHMgYXJlIGJhdGNoZWQgd2hlbmV2ZXIgcGFyc2VyIGdldHMgdG8gdGhlIGluamVjdGVkIHNjcmlwdFxuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShcbiAgICAgICAgJ29ubG9hZCcsXG4gICAgICAgIHBvbGljeS5jcmVhdGVTY3JpcHQoJ3dpbmRvdy5XZWJDb21wb25lbnRzLl9iYXRjaEN1c3RvbUVsZW1lbnRzKCknKVxuICAgICAgKTtcbiAgICAgIGRvY3VtZW50LndyaXRlKHBvbGljeS5jcmVhdGVIVE1MKG5ld1NjcmlwdC5vdXRlckhUTUwpKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCByZWFkeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1NjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBhc3luY1JlYWR5KCk7XG4gICAgICB9KTtcbiAgICAgIG5ld1NjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBwb2x5ZmlsbCBidW5kbGUnICsgdXJsKTtcbiAgICAgIH0pO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChuZXdTY3JpcHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBpZiByZWFkeVN0YXRlIGlzICdjb21wbGV0ZScsIHNjcmlwdCBpcyBsb2FkZWQgaW1wZXJhdGl2ZWx5IG9uIGEgc3BlYy1jb21wbGlhbnQgYnJvd3Nlciwgc28ganVzdCBmaXJlIFdDUlxuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBwb2x5ZmlsbHNMb2FkZWQgPSB0cnVlO1xuICAgICAgZmlyZUV2ZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMgc2NyaXB0IG1heSBjb21lIGJldHdlZW4gRENMIGFuZCBsb2FkLCBzbyBsaXN0ZW4gZm9yIGJvdGgsIGFuZCBjYW5jZWwgbG9hZCBsaXN0ZW5lciBpZiBEQ0wgZmlyZXNcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcmVhZHkpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgcmVhZHkpO1xuICAgICAgICByZWFkeSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59KSgpO1xuIiwiLypcbiAqIEludGVybmF0aW9uYWwgVGVsZXBob25lIElucHV0IHYxNi4xLjBcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYWNrb2Nuci9pbnRsLXRlbC1pbnB1dC5naXRcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG5cbi8vIHdyYXAgaW4gVU1EXG4oZnVuY3Rpb24oZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsgZWxzZSB3aW5kb3cuaW50bFRlbElucHV0ID0gZmFjdG9yeSgpO1xufSkoZnVuY3Rpb24odW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBBcnJheSBvZiBjb3VudHJ5IG9iamVjdHMgZm9yIHRoZSBmbGFnIGRyb3Bkb3duLlxuICAgICAgICAvLyBIZXJlIGlzIHRoZSBjcml0ZXJpYSBmb3IgdGhlIHBsdWdpbiB0byBzdXBwb3J0IGEgZ2l2ZW4gY291bnRyeS90ZXJyaXRvcnlcbiAgICAgICAgLy8gLSBJdCBoYXMgYW4gaXNvMiBjb2RlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fMzE2Ni0xX2FscGhhLTJcbiAgICAgICAgLy8gLSBJdCBoYXMgaXQncyBvd24gY291bnRyeSBjYWxsaW5nIGNvZGUgKGl0IGlzIG5vdCBhIHN1Yi1yZWdpb24gb2YgYW5vdGhlciBjb3VudHJ5KTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJ5X2NhbGxpbmdfY29kZXNcbiAgICAgICAgLy8gLSBJdCBoYXMgYSBmbGFnIGluIHRoZSByZWdpb24tZmxhZ3MgcHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL2JlaGRhZC9yZWdpb24tZmxhZ3MvdHJlZS9naC1wYWdlcy9wbmdcbiAgICAgICAgLy8gLSBJdCBpcyBzdXBwb3J0ZWQgYnkgbGlicGhvbmVudW1iZXIgKGl0IG11c3QgYmUgbGlzdGVkIG9uIHRoaXMgcGFnZSk6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGVpMThuL2xpYnBob25lbnVtYmVyL2Jsb2IvbWFzdGVyL3Jlc291cmNlcy9TaG9ydE51bWJlck1ldGFkYXRhLnhtbFxuICAgICAgICAvLyBFYWNoIGNvdW50cnkgYXJyYXkgaGFzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246XG4gICAgICAgIC8vIFtcbiAgICAgICAgLy8gICAgQ291bnRyeSBuYW1lLFxuICAgICAgICAvLyAgICBpc28yIGNvZGUsXG4gICAgICAgIC8vICAgIEludGVybmF0aW9uYWwgZGlhbCBjb2RlLFxuICAgICAgICAvLyAgICBPcmRlciAoaWYgPjEgY291bnRyeSB3aXRoIHNhbWUgZGlhbCBjb2RlKSxcbiAgICAgICAgLy8gICAgQXJlYSBjb2Rlc1xuICAgICAgICAvLyBdXG4gICAgICAgIHZhciBhbGxDb3VudHJpZXMgPSBbIFsgXCJBZmdoYW5pc3RhbiAo4oCr2KfZgdi62KfZhtiz2KrYp9mG4oCs4oCOKVwiLCBcImFmXCIsIFwiOTNcIiBdLCBbIFwiQWxiYW5pYSAoU2hxaXDDq3JpKVwiLCBcImFsXCIsIFwiMzU1XCIgXSwgWyBcIkFsZ2VyaWEgKOKAq9in2YTYrNiy2KfYptix4oCs4oCOKVwiLCBcImR6XCIsIFwiMjEzXCIgXSwgWyBcIkFtZXJpY2FuIFNhbW9hXCIsIFwiYXNcIiwgXCIxXCIsIDUsIFsgXCI2ODRcIiBdIF0sIFsgXCJBbmRvcnJhXCIsIFwiYWRcIiwgXCIzNzZcIiBdLCBbIFwiQW5nb2xhXCIsIFwiYW9cIiwgXCIyNDRcIiBdLCBbIFwiQW5ndWlsbGFcIiwgXCJhaVwiLCBcIjFcIiwgNiwgWyBcIjI2NFwiIF0gXSwgWyBcIkFudGlndWEgYW5kIEJhcmJ1ZGFcIiwgXCJhZ1wiLCBcIjFcIiwgNywgWyBcIjI2OFwiIF0gXSwgWyBcIkFyZ2VudGluYVwiLCBcImFyXCIsIFwiNTRcIiBdLCBbIFwiQXJtZW5pYSAo1YDVodW11aHVvdW/1aHVtilcIiwgXCJhbVwiLCBcIjM3NFwiIF0sIFsgXCJBcnViYVwiLCBcImF3XCIsIFwiMjk3XCIgXSwgWyBcIkF1c3RyYWxpYVwiLCBcImF1XCIsIFwiNjFcIiwgMCBdLCBbIFwiQXVzdHJpYSAow5ZzdGVycmVpY2gpXCIsIFwiYXRcIiwgXCI0M1wiIF0sIFsgXCJBemVyYmFpamFuIChBesmZcmJheWNhbilcIiwgXCJhelwiLCBcIjk5NFwiIF0sIFsgXCJCYWhhbWFzXCIsIFwiYnNcIiwgXCIxXCIsIDgsIFsgXCIyNDJcIiBdIF0sIFsgXCJCYWhyYWluICjigKvYp9mE2KjYrdix2YrZhuKArOKAjilcIiwgXCJiaFwiLCBcIjk3M1wiIF0sIFsgXCJCYW5nbGFkZXNoICjgpqzgpr7gpoLgprLgpr7gpqbgp4fgprYpXCIsIFwiYmRcIiwgXCI4ODBcIiBdLCBbIFwiQmFyYmFkb3NcIiwgXCJiYlwiLCBcIjFcIiwgOSwgWyBcIjI0NlwiIF0gXSwgWyBcIkJlbGFydXMgKNCR0LXQu9Cw0YDRg9GB0YwpXCIsIFwiYnlcIiwgXCIzNzVcIiBdLCBbIFwiQmVsZ2l1bSAoQmVsZ2nDqylcIiwgXCJiZVwiLCBcIjMyXCIgXSwgWyBcIkJlbGl6ZVwiLCBcImJ6XCIsIFwiNTAxXCIgXSwgWyBcIkJlbmluIChCw6luaW4pXCIsIFwiYmpcIiwgXCIyMjlcIiBdLCBbIFwiQmVybXVkYVwiLCBcImJtXCIsIFwiMVwiLCAxMCwgWyBcIjQ0MVwiIF0gXSwgWyBcIkJodXRhbiAo4L2g4L2W4L6y4L204L2CKVwiLCBcImJ0XCIsIFwiOTc1XCIgXSwgWyBcIkJvbGl2aWFcIiwgXCJib1wiLCBcIjU5MVwiIF0sIFsgXCJCb3NuaWEgYW5kIEhlcnplZ292aW5hICjQkdC+0YHQvdCwINC4INCl0LXRgNGG0LXQs9C+0LLQuNC90LApXCIsIFwiYmFcIiwgXCIzODdcIiBdLCBbIFwiQm90c3dhbmFcIiwgXCJid1wiLCBcIjI2N1wiIF0sIFsgXCJCcmF6aWwgKEJyYXNpbClcIiwgXCJiclwiLCBcIjU1XCIgXSwgWyBcIkJyaXRpc2ggSW5kaWFuIE9jZWFuIFRlcnJpdG9yeVwiLCBcImlvXCIsIFwiMjQ2XCIgXSwgWyBcIkJyaXRpc2ggVmlyZ2luIElzbGFuZHNcIiwgXCJ2Z1wiLCBcIjFcIiwgMTEsIFsgXCIyODRcIiBdIF0sIFsgXCJCcnVuZWlcIiwgXCJiblwiLCBcIjY3M1wiIF0sIFsgXCJCdWxnYXJpYSAo0JHRitC70LPQsNGA0LjRjylcIiwgXCJiZ1wiLCBcIjM1OVwiIF0sIFsgXCJCdXJraW5hIEZhc29cIiwgXCJiZlwiLCBcIjIyNlwiIF0sIFsgXCJCdXJ1bmRpIChVYnVydW5kaSlcIiwgXCJiaVwiLCBcIjI1N1wiIF0sIFsgXCJDYW1ib2RpYSAo4Z6A4Z6Y4Z+S4Z6W4Z674Z6H4Z62KVwiLCBcImtoXCIsIFwiODU1XCIgXSwgWyBcIkNhbWVyb29uIChDYW1lcm91bilcIiwgXCJjbVwiLCBcIjIzN1wiIF0sIFsgXCJDYW5hZGFcIiwgXCJjYVwiLCBcIjFcIiwgMSwgWyBcIjIwNFwiLCBcIjIyNlwiLCBcIjIzNlwiLCBcIjI0OVwiLCBcIjI1MFwiLCBcIjI4OVwiLCBcIjMwNlwiLCBcIjM0M1wiLCBcIjM2NVwiLCBcIjM4N1wiLCBcIjQwM1wiLCBcIjQxNlwiLCBcIjQxOFwiLCBcIjQzMVwiLCBcIjQzN1wiLCBcIjQzOFwiLCBcIjQ1MFwiLCBcIjUwNlwiLCBcIjUxNFwiLCBcIjUxOVwiLCBcIjU0OFwiLCBcIjU3OVwiLCBcIjU4MVwiLCBcIjU4N1wiLCBcIjYwNFwiLCBcIjYxM1wiLCBcIjYzOVwiLCBcIjY0N1wiLCBcIjY3MlwiLCBcIjcwNVwiLCBcIjcwOVwiLCBcIjc0MlwiLCBcIjc3OFwiLCBcIjc4MFwiLCBcIjc4MlwiLCBcIjgwN1wiLCBcIjgxOVwiLCBcIjgyNVwiLCBcIjg2N1wiLCBcIjg3M1wiLCBcIjkwMlwiLCBcIjkwNVwiIF0gXSwgWyBcIkNhcGUgVmVyZGUgKEthYnUgVmVyZGkpXCIsIFwiY3ZcIiwgXCIyMzhcIiBdLCBbIFwiQ2FyaWJiZWFuIE5ldGhlcmxhbmRzXCIsIFwiYnFcIiwgXCI1OTlcIiwgMSwgWyBcIjNcIiwgXCI0XCIsIFwiN1wiIF0gXSwgWyBcIkNheW1hbiBJc2xhbmRzXCIsIFwia3lcIiwgXCIxXCIsIDEyLCBbIFwiMzQ1XCIgXSBdLCBbIFwiQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljIChSw6lwdWJsaXF1ZSBjZW50cmFmcmljYWluZSlcIiwgXCJjZlwiLCBcIjIzNlwiIF0sIFsgXCJDaGFkIChUY2hhZClcIiwgXCJ0ZFwiLCBcIjIzNVwiIF0sIFsgXCJDaGlsZVwiLCBcImNsXCIsIFwiNTZcIiBdLCBbIFwiQ2hpbmEgKOS4reWbvSlcIiwgXCJjblwiLCBcIjg2XCIgXSwgWyBcIkNocmlzdG1hcyBJc2xhbmRcIiwgXCJjeFwiLCBcIjYxXCIsIDIgXSwgWyBcIkNvY29zIChLZWVsaW5nKSBJc2xhbmRzXCIsIFwiY2NcIiwgXCI2MVwiLCAxIF0sIFsgXCJDb2xvbWJpYVwiLCBcImNvXCIsIFwiNTdcIiBdLCBbIFwiQ29tb3JvcyAo4oCr2KzYstixINin2YTZgtmF2LHigKzigI4pXCIsIFwia21cIiwgXCIyNjlcIiBdLCBbIFwiQ29uZ28gKERSQykgKEphbWh1cmkgeWEgS2lkZW1va3Jhc2lhIHlhIEtvbmdvKVwiLCBcImNkXCIsIFwiMjQzXCIgXSwgWyBcIkNvbmdvIChSZXB1YmxpYykgKENvbmdvLUJyYXp6YXZpbGxlKVwiLCBcImNnXCIsIFwiMjQyXCIgXSwgWyBcIkNvb2sgSXNsYW5kc1wiLCBcImNrXCIsIFwiNjgyXCIgXSwgWyBcIkNvc3RhIFJpY2FcIiwgXCJjclwiLCBcIjUwNlwiIF0sIFsgXCJDw7R0ZSBk4oCZSXZvaXJlXCIsIFwiY2lcIiwgXCIyMjVcIiBdLCBbIFwiQ3JvYXRpYSAoSHJ2YXRza2EpXCIsIFwiaHJcIiwgXCIzODVcIiBdLCBbIFwiQ3ViYVwiLCBcImN1XCIsIFwiNTNcIiBdLCBbIFwiQ3VyYcOnYW9cIiwgXCJjd1wiLCBcIjU5OVwiLCAwIF0sIFsgXCJDeXBydXMgKM6az43PgM+Bzr/PgilcIiwgXCJjeVwiLCBcIjM1N1wiIF0sIFsgXCJDemVjaCBSZXB1YmxpYyAoxIxlc2vDoSByZXB1Ymxpa2EpXCIsIFwiY3pcIiwgXCI0MjBcIiBdLCBbIFwiRGVubWFyayAoRGFubWFyaylcIiwgXCJka1wiLCBcIjQ1XCIgXSwgWyBcIkRqaWJvdXRpXCIsIFwiZGpcIiwgXCIyNTNcIiBdLCBbIFwiRG9taW5pY2FcIiwgXCJkbVwiLCBcIjFcIiwgMTMsIFsgXCI3NjdcIiBdIF0sIFsgXCJEb21pbmljYW4gUmVwdWJsaWMgKFJlcMO6YmxpY2EgRG9taW5pY2FuYSlcIiwgXCJkb1wiLCBcIjFcIiwgMiwgWyBcIjgwOVwiLCBcIjgyOVwiLCBcIjg0OVwiIF0gXSwgWyBcIkVjdWFkb3JcIiwgXCJlY1wiLCBcIjU5M1wiIF0sIFsgXCJFZ3lwdCAo4oCr2YXYtdix4oCs4oCOKVwiLCBcImVnXCIsIFwiMjBcIiBdLCBbIFwiRWwgU2FsdmFkb3JcIiwgXCJzdlwiLCBcIjUwM1wiIF0sIFsgXCJFcXVhdG9yaWFsIEd1aW5lYSAoR3VpbmVhIEVjdWF0b3JpYWwpXCIsIFwiZ3FcIiwgXCIyNDBcIiBdLCBbIFwiRXJpdHJlYVwiLCBcImVyXCIsIFwiMjkxXCIgXSwgWyBcIkVzdG9uaWEgKEVlc3RpKVwiLCBcImVlXCIsIFwiMzcyXCIgXSwgWyBcIkV0aGlvcGlhXCIsIFwiZXRcIiwgXCIyNTFcIiBdLCBbIFwiRmFsa2xhbmQgSXNsYW5kcyAoSXNsYXMgTWFsdmluYXMpXCIsIFwiZmtcIiwgXCI1MDBcIiBdLCBbIFwiRmFyb2UgSXNsYW5kcyAoRsO4cm95YXIpXCIsIFwiZm9cIiwgXCIyOThcIiBdLCBbIFwiRmlqaVwiLCBcImZqXCIsIFwiNjc5XCIgXSwgWyBcIkZpbmxhbmQgKFN1b21pKVwiLCBcImZpXCIsIFwiMzU4XCIsIDAgXSwgWyBcIkZyYW5jZVwiLCBcImZyXCIsIFwiMzNcIiBdLCBbIFwiRnJlbmNoIEd1aWFuYSAoR3V5YW5lIGZyYW7Dp2Fpc2UpXCIsIFwiZ2ZcIiwgXCI1OTRcIiBdLCBbIFwiRnJlbmNoIFBvbHluZXNpYSAoUG9seW7DqXNpZSBmcmFuw6dhaXNlKVwiLCBcInBmXCIsIFwiNjg5XCIgXSwgWyBcIkdhYm9uXCIsIFwiZ2FcIiwgXCIyNDFcIiBdLCBbIFwiR2FtYmlhXCIsIFwiZ21cIiwgXCIyMjBcIiBdLCBbIFwiR2VvcmdpYSAo4YOh4YOQ4YOl4YOQ4YOg4YOX4YOV4YOU4YOa4YOdKVwiLCBcImdlXCIsIFwiOTk1XCIgXSwgWyBcIkdlcm1hbnkgKERldXRzY2hsYW5kKVwiLCBcImRlXCIsIFwiNDlcIiBdLCBbIFwiR2hhbmEgKEdhYW5hKVwiLCBcImdoXCIsIFwiMjMzXCIgXSwgWyBcIkdpYnJhbHRhclwiLCBcImdpXCIsIFwiMzUwXCIgXSwgWyBcIkdyZWVjZSAozpXOu867zqzOtM6xKVwiLCBcImdyXCIsIFwiMzBcIiBdLCBbIFwiR3JlZW5sYW5kIChLYWxhYWxsaXQgTnVuYWF0KVwiLCBcImdsXCIsIFwiMjk5XCIgXSwgWyBcIkdyZW5hZGFcIiwgXCJnZFwiLCBcIjFcIiwgMTQsIFsgXCI0NzNcIiBdIF0sIFsgXCJHdWFkZWxvdXBlXCIsIFwiZ3BcIiwgXCI1OTBcIiwgMCBdLCBbIFwiR3VhbVwiLCBcImd1XCIsIFwiMVwiLCAxNSwgWyBcIjY3MVwiIF0gXSwgWyBcIkd1YXRlbWFsYVwiLCBcImd0XCIsIFwiNTAyXCIgXSwgWyBcIkd1ZXJuc2V5XCIsIFwiZ2dcIiwgXCI0NFwiLCAxLCBbIFwiMTQ4MVwiLCBcIjc3ODFcIiwgXCI3ODM5XCIsIFwiNzkxMVwiIF0gXSwgWyBcIkd1aW5lYSAoR3VpbsOpZSlcIiwgXCJnblwiLCBcIjIyNFwiIF0sIFsgXCJHdWluZWEtQmlzc2F1IChHdWluw6kgQmlzc2F1KVwiLCBcImd3XCIsIFwiMjQ1XCIgXSwgWyBcIkd1eWFuYVwiLCBcImd5XCIsIFwiNTkyXCIgXSwgWyBcIkhhaXRpXCIsIFwiaHRcIiwgXCI1MDlcIiBdLCBbIFwiSG9uZHVyYXNcIiwgXCJoblwiLCBcIjUwNFwiIF0sIFsgXCJIb25nIEtvbmcgKOmmmea4rylcIiwgXCJoa1wiLCBcIjg1MlwiIF0sIFsgXCJIdW5nYXJ5IChNYWd5YXJvcnN6w6FnKVwiLCBcImh1XCIsIFwiMzZcIiBdLCBbIFwiSWNlbGFuZCAow41zbGFuZClcIiwgXCJpc1wiLCBcIjM1NFwiIF0sIFsgXCJJbmRpYSAo4KSt4KS+4KSw4KSkKVwiLCBcImluXCIsIFwiOTFcIiBdLCBbIFwiSW5kb25lc2lhXCIsIFwiaWRcIiwgXCI2MlwiIF0sIFsgXCJJcmFuICjigKvYp9uM2LHYp9mG4oCs4oCOKVwiLCBcImlyXCIsIFwiOThcIiBdLCBbIFwiSXJhcSAo4oCr2KfZhNi52LHYp9mC4oCs4oCOKVwiLCBcImlxXCIsIFwiOTY0XCIgXSwgWyBcIklyZWxhbmRcIiwgXCJpZVwiLCBcIjM1M1wiIF0sIFsgXCJJc2xlIG9mIE1hblwiLCBcImltXCIsIFwiNDRcIiwgMiwgWyBcIjE2MjRcIiwgXCI3NDU3NlwiLCBcIjc1MjRcIiwgXCI3OTI0XCIsIFwiNzYyNFwiIF0gXSwgWyBcIklzcmFlbCAo4oCr15nXqdeo15DXnOKArOKAjilcIiwgXCJpbFwiLCBcIjk3MlwiIF0sIFsgXCJJdGFseSAoSXRhbGlhKVwiLCBcIml0XCIsIFwiMzlcIiwgMCBdLCBbIFwiSmFtYWljYVwiLCBcImptXCIsIFwiMVwiLCA0LCBbIFwiODc2XCIsIFwiNjU4XCIgXSBdLCBbIFwiSmFwYW4gKOaXpeacrClcIiwgXCJqcFwiLCBcIjgxXCIgXSwgWyBcIkplcnNleVwiLCBcImplXCIsIFwiNDRcIiwgMywgWyBcIjE1MzRcIiwgXCI3NTA5XCIsIFwiNzcwMFwiLCBcIjc3OTdcIiwgXCI3ODI5XCIsIFwiNzkzN1wiIF0gXSwgWyBcIkpvcmRhbiAo4oCr2KfZhNij2LHYr9mG4oCs4oCOKVwiLCBcImpvXCIsIFwiOTYyXCIgXSwgWyBcIkthemFraHN0YW4gKNCa0LDQt9Cw0YXRgdGC0LDQvSlcIiwgXCJrelwiLCBcIjdcIiwgMSwgWyBcIjMzXCIsIFwiN1wiIF0gXSwgWyBcIktlbnlhXCIsIFwia2VcIiwgXCIyNTRcIiBdLCBbIFwiS2lyaWJhdGlcIiwgXCJraVwiLCBcIjY4NlwiIF0sIFsgXCJLb3Nvdm9cIiwgXCJ4a1wiLCBcIjM4M1wiIF0sIFsgXCJLdXdhaXQgKOKAq9in2YTZg9mI2YrYquKArOKAjilcIiwgXCJrd1wiLCBcIjk2NVwiIF0sIFsgXCJLeXJneXpzdGFuICjQmtGL0YDQs9GL0LfRgdGC0LDQvSlcIiwgXCJrZ1wiLCBcIjk5NlwiIF0sIFsgXCJMYW9zICjguqXgurLguqcpXCIsIFwibGFcIiwgXCI4NTZcIiBdLCBbIFwiTGF0dmlhIChMYXR2aWphKVwiLCBcImx2XCIsIFwiMzcxXCIgXSwgWyBcIkxlYmFub24gKOKAq9mE2KjZhtin2YbigKzigI4pXCIsIFwibGJcIiwgXCI5NjFcIiBdLCBbIFwiTGVzb3Rob1wiLCBcImxzXCIsIFwiMjY2XCIgXSwgWyBcIkxpYmVyaWFcIiwgXCJsclwiLCBcIjIzMVwiIF0sIFsgXCJMaWJ5YSAo4oCr2YTZitio2YrYp+KArOKAjilcIiwgXCJseVwiLCBcIjIxOFwiIF0sIFsgXCJMaWVjaHRlbnN0ZWluXCIsIFwibGlcIiwgXCI0MjNcIiBdLCBbIFwiTGl0aHVhbmlhIChMaWV0dXZhKVwiLCBcImx0XCIsIFwiMzcwXCIgXSwgWyBcIkx1eGVtYm91cmdcIiwgXCJsdVwiLCBcIjM1MlwiIF0sIFsgXCJNYWNhdSAo5r6z6ZaAKVwiLCBcIm1vXCIsIFwiODUzXCIgXSwgWyBcIk1hY2Vkb25pYSAoRllST00pICjQnNCw0LrQtdC00L7QvdC40ZjQsClcIiwgXCJta1wiLCBcIjM4OVwiIF0sIFsgXCJNYWRhZ2FzY2FyIChNYWRhZ2FzaWthcmEpXCIsIFwibWdcIiwgXCIyNjFcIiBdLCBbIFwiTWFsYXdpXCIsIFwibXdcIiwgXCIyNjVcIiBdLCBbIFwiTWFsYXlzaWFcIiwgXCJteVwiLCBcIjYwXCIgXSwgWyBcIk1hbGRpdmVzXCIsIFwibXZcIiwgXCI5NjBcIiBdLCBbIFwiTWFsaVwiLCBcIm1sXCIsIFwiMjIzXCIgXSwgWyBcIk1hbHRhXCIsIFwibXRcIiwgXCIzNTZcIiBdLCBbIFwiTWFyc2hhbGwgSXNsYW5kc1wiLCBcIm1oXCIsIFwiNjkyXCIgXSwgWyBcIk1hcnRpbmlxdWVcIiwgXCJtcVwiLCBcIjU5NlwiIF0sIFsgXCJNYXVyaXRhbmlhICjigKvZhdmI2LHZitiq2KfZhtmK2KfigKzigI4pXCIsIFwibXJcIiwgXCIyMjJcIiBdLCBbIFwiTWF1cml0aXVzIChNb3JpcylcIiwgXCJtdVwiLCBcIjIzMFwiIF0sIFsgXCJNYXlvdHRlXCIsIFwieXRcIiwgXCIyNjJcIiwgMSwgWyBcIjI2OVwiLCBcIjYzOVwiIF0gXSwgWyBcIk1leGljbyAoTcOpeGljbylcIiwgXCJteFwiLCBcIjUyXCIgXSwgWyBcIk1pY3JvbmVzaWFcIiwgXCJmbVwiLCBcIjY5MVwiIF0sIFsgXCJNb2xkb3ZhIChSZXB1YmxpY2EgTW9sZG92YSlcIiwgXCJtZFwiLCBcIjM3M1wiIF0sIFsgXCJNb25hY29cIiwgXCJtY1wiLCBcIjM3N1wiIF0sIFsgXCJNb25nb2xpYSAo0JzQvtC90LPQvtC7KVwiLCBcIm1uXCIsIFwiOTc2XCIgXSwgWyBcIk1vbnRlbmVncm8gKENybmEgR29yYSlcIiwgXCJtZVwiLCBcIjM4MlwiIF0sIFsgXCJNb250c2VycmF0XCIsIFwibXNcIiwgXCIxXCIsIDE2LCBbIFwiNjY0XCIgXSBdLCBbIFwiTW9yb2NjbyAo4oCr2KfZhNmF2LrYsdio4oCs4oCOKVwiLCBcIm1hXCIsIFwiMjEyXCIsIDAgXSwgWyBcIk1vemFtYmlxdWUgKE1vw6dhbWJpcXVlKVwiLCBcIm16XCIsIFwiMjU4XCIgXSwgWyBcIk15YW5tYXIgKEJ1cm1hKSAo4YCZ4YC84YCU4YC64YCZ4YCsKVwiLCBcIm1tXCIsIFwiOTVcIiBdLCBbIFwiTmFtaWJpYSAoTmFtaWJpw6spXCIsIFwibmFcIiwgXCIyNjRcIiBdLCBbIFwiTmF1cnVcIiwgXCJuclwiLCBcIjY3NFwiIF0sIFsgXCJOZXBhbCAo4KSo4KWH4KSq4KS+4KSyKVwiLCBcIm5wXCIsIFwiOTc3XCIgXSwgWyBcIk5ldGhlcmxhbmRzIChOZWRlcmxhbmQpXCIsIFwibmxcIiwgXCIzMVwiIF0sIFsgXCJOZXcgQ2FsZWRvbmlhIChOb3V2ZWxsZS1DYWzDqWRvbmllKVwiLCBcIm5jXCIsIFwiNjg3XCIgXSwgWyBcIk5ldyBaZWFsYW5kXCIsIFwibnpcIiwgXCI2NFwiIF0sIFsgXCJOaWNhcmFndWFcIiwgXCJuaVwiLCBcIjUwNVwiIF0sIFsgXCJOaWdlciAoTmlqYXIpXCIsIFwibmVcIiwgXCIyMjdcIiBdLCBbIFwiTmlnZXJpYVwiLCBcIm5nXCIsIFwiMjM0XCIgXSwgWyBcIk5pdWVcIiwgXCJudVwiLCBcIjY4M1wiIF0sIFsgXCJOb3Jmb2xrIElzbGFuZFwiLCBcIm5mXCIsIFwiNjcyXCIgXSwgWyBcIk5vcnRoIEtvcmVhICjsobDshKAg66+87KO87KO87J2YIOyduOuvvCDqs7XtmZTqta0pXCIsIFwia3BcIiwgXCI4NTBcIiBdLCBbIFwiTm9ydGhlcm4gTWFyaWFuYSBJc2xhbmRzXCIsIFwibXBcIiwgXCIxXCIsIDE3LCBbIFwiNjcwXCIgXSBdLCBbIFwiTm9yd2F5IChOb3JnZSlcIiwgXCJub1wiLCBcIjQ3XCIsIDAgXSwgWyBcIk9tYW4gKOKAq9i52Y/Zhdin2YbigKzigI4pXCIsIFwib21cIiwgXCI5NjhcIiBdLCBbIFwiUGFraXN0YW4gKOKAq9m+2Kfaqdiz2KrYp9mG4oCs4oCOKVwiLCBcInBrXCIsIFwiOTJcIiBdLCBbIFwiUGFsYXVcIiwgXCJwd1wiLCBcIjY4MFwiIF0sIFsgXCJQYWxlc3RpbmUgKOKAq9mB2YTYs9i32YrZhuKArOKAjilcIiwgXCJwc1wiLCBcIjk3MFwiIF0sIFsgXCJQYW5hbWEgKFBhbmFtw6EpXCIsIFwicGFcIiwgXCI1MDdcIiBdLCBbIFwiUGFwdWEgTmV3IEd1aW5lYVwiLCBcInBnXCIsIFwiNjc1XCIgXSwgWyBcIlBhcmFndWF5XCIsIFwicHlcIiwgXCI1OTVcIiBdLCBbIFwiUGVydSAoUGVyw7opXCIsIFwicGVcIiwgXCI1MVwiIF0sIFsgXCJQaGlsaXBwaW5lc1wiLCBcInBoXCIsIFwiNjNcIiBdLCBbIFwiUG9sYW5kIChQb2xza2EpXCIsIFwicGxcIiwgXCI0OFwiIF0sIFsgXCJQb3J0dWdhbFwiLCBcInB0XCIsIFwiMzUxXCIgXSwgWyBcIlB1ZXJ0byBSaWNvXCIsIFwicHJcIiwgXCIxXCIsIDMsIFsgXCI3ODdcIiwgXCI5MzlcIiBdIF0sIFsgXCJRYXRhciAo4oCr2YLYt9ix4oCs4oCOKVwiLCBcInFhXCIsIFwiOTc0XCIgXSwgWyBcIlLDqXVuaW9uIChMYSBSw6l1bmlvbilcIiwgXCJyZVwiLCBcIjI2MlwiLCAwIF0sIFsgXCJSb21hbmlhIChSb23Dom5pYSlcIiwgXCJyb1wiLCBcIjQwXCIgXSwgWyBcIlJ1c3NpYSAo0KDQvtGB0YHQuNGPKVwiLCBcInJ1XCIsIFwiN1wiLCAwIF0sIFsgXCJSd2FuZGFcIiwgXCJyd1wiLCBcIjI1MFwiIF0sIFsgXCJTYWludCBCYXJ0aMOpbGVteVwiLCBcImJsXCIsIFwiNTkwXCIsIDEgXSwgWyBcIlNhaW50IEhlbGVuYVwiLCBcInNoXCIsIFwiMjkwXCIgXSwgWyBcIlNhaW50IEtpdHRzIGFuZCBOZXZpc1wiLCBcImtuXCIsIFwiMVwiLCAxOCwgWyBcIjg2OVwiIF0gXSwgWyBcIlNhaW50IEx1Y2lhXCIsIFwibGNcIiwgXCIxXCIsIDE5LCBbIFwiNzU4XCIgXSBdLCBbIFwiU2FpbnQgTWFydGluIChTYWludC1NYXJ0aW4gKHBhcnRpZSBmcmFuw6dhaXNlKSlcIiwgXCJtZlwiLCBcIjU5MFwiLCAyIF0sIFsgXCJTYWludCBQaWVycmUgYW5kIE1pcXVlbG9uIChTYWludC1QaWVycmUtZXQtTWlxdWVsb24pXCIsIFwicG1cIiwgXCI1MDhcIiBdLCBbIFwiU2FpbnQgVmluY2VudCBhbmQgdGhlIEdyZW5hZGluZXNcIiwgXCJ2Y1wiLCBcIjFcIiwgMjAsIFsgXCI3ODRcIiBdIF0sIFsgXCJTYW1vYVwiLCBcIndzXCIsIFwiNjg1XCIgXSwgWyBcIlNhbiBNYXJpbm9cIiwgXCJzbVwiLCBcIjM3OFwiIF0sIFsgXCJTw6NvIFRvbcOpIGFuZCBQcsOtbmNpcGUgKFPDo28gVG9tw6kgZSBQcsOtbmNpcGUpXCIsIFwic3RcIiwgXCIyMzlcIiBdLCBbIFwiU2F1ZGkgQXJhYmlhICjigKvYp9mE2YXZhdmE2YPYqSDYp9mE2LnYsdio2YrYqSDYp9mE2LPYudmI2K/Zitip4oCs4oCOKVwiLCBcInNhXCIsIFwiOTY2XCIgXSwgWyBcIlNlbmVnYWwgKFPDqW7DqWdhbClcIiwgXCJzblwiLCBcIjIyMVwiIF0sIFsgXCJTZXJiaWEgKNCh0YDQsdC40ZjQsClcIiwgXCJyc1wiLCBcIjM4MVwiIF0sIFsgXCJTZXljaGVsbGVzXCIsIFwic2NcIiwgXCIyNDhcIiBdLCBbIFwiU2llcnJhIExlb25lXCIsIFwic2xcIiwgXCIyMzJcIiBdLCBbIFwiU2luZ2Fwb3JlXCIsIFwic2dcIiwgXCI2NVwiIF0sIFsgXCJTaW50IE1hYXJ0ZW5cIiwgXCJzeFwiLCBcIjFcIiwgMjEsIFsgXCI3MjFcIiBdIF0sIFsgXCJTbG92YWtpYSAoU2xvdmVuc2tvKVwiLCBcInNrXCIsIFwiNDIxXCIgXSwgWyBcIlNsb3ZlbmlhIChTbG92ZW5pamEpXCIsIFwic2lcIiwgXCIzODZcIiBdLCBbIFwiU29sb21vbiBJc2xhbmRzXCIsIFwic2JcIiwgXCI2NzdcIiBdLCBbIFwiU29tYWxpYSAoU29vbWFhbGl5YSlcIiwgXCJzb1wiLCBcIjI1MlwiIF0sIFsgXCJTb3V0aCBBZnJpY2FcIiwgXCJ6YVwiLCBcIjI3XCIgXSwgWyBcIlNvdXRoIEtvcmVhICjrjIDtlZzrr7zqta0pXCIsIFwia3JcIiwgXCI4MlwiIF0sIFsgXCJTb3V0aCBTdWRhbiAo4oCr2KzZhtmI2Kgg2KfZhNiz2YjYr9in2YbigKzigI4pXCIsIFwic3NcIiwgXCIyMTFcIiBdLCBbIFwiU3BhaW4gKEVzcGHDsWEpXCIsIFwiZXNcIiwgXCIzNFwiIF0sIFsgXCJTcmkgTGFua2EgKOC3geC3iuKAjeC2u+C3kyDgtr3gtoLgtprgt4/gt4ApXCIsIFwibGtcIiwgXCI5NFwiIF0sIFsgXCJTdWRhbiAo4oCr2KfZhNiz2YjYr9in2YbigKzigI4pXCIsIFwic2RcIiwgXCIyNDlcIiBdLCBbIFwiU3VyaW5hbWVcIiwgXCJzclwiLCBcIjU5N1wiIF0sIFsgXCJTdmFsYmFyZCBhbmQgSmFuIE1heWVuXCIsIFwic2pcIiwgXCI0N1wiLCAxLCBbIFwiNzlcIiBdIF0sIFsgXCJTd2F6aWxhbmRcIiwgXCJzelwiLCBcIjI2OFwiIF0sIFsgXCJTd2VkZW4gKFN2ZXJpZ2UpXCIsIFwic2VcIiwgXCI0NlwiIF0sIFsgXCJTd2l0emVybGFuZCAoU2Nod2VpeilcIiwgXCJjaFwiLCBcIjQxXCIgXSwgWyBcIlN5cmlhICjigKvYs9mI2LHZitin4oCs4oCOKVwiLCBcInN5XCIsIFwiOTYzXCIgXSwgWyBcIlRhaXdhbiAo5Y+w54GjKVwiLCBcInR3XCIsIFwiODg2XCIgXSwgWyBcIlRhamlraXN0YW5cIiwgXCJ0alwiLCBcIjk5MlwiIF0sIFsgXCJUYW56YW5pYVwiLCBcInR6XCIsIFwiMjU1XCIgXSwgWyBcIlRoYWlsYW5kICjguYTguJfguKIpXCIsIFwidGhcIiwgXCI2NlwiIF0sIFsgXCJUaW1vci1MZXN0ZVwiLCBcInRsXCIsIFwiNjcwXCIgXSwgWyBcIlRvZ29cIiwgXCJ0Z1wiLCBcIjIyOFwiIF0sIFsgXCJUb2tlbGF1XCIsIFwidGtcIiwgXCI2OTBcIiBdLCBbIFwiVG9uZ2FcIiwgXCJ0b1wiLCBcIjY3NlwiIF0sIFsgXCJUcmluaWRhZCBhbmQgVG9iYWdvXCIsIFwidHRcIiwgXCIxXCIsIDIyLCBbIFwiODY4XCIgXSBdLCBbIFwiVHVuaXNpYSAo4oCr2KrZiNmG2LPigKzigI4pXCIsIFwidG5cIiwgXCIyMTZcIiBdLCBbIFwiVHVya2V5IChUw7xya2l5ZSlcIiwgXCJ0clwiLCBcIjkwXCIgXSwgWyBcIlR1cmttZW5pc3RhblwiLCBcInRtXCIsIFwiOTkzXCIgXSwgWyBcIlR1cmtzIGFuZCBDYWljb3MgSXNsYW5kc1wiLCBcInRjXCIsIFwiMVwiLCAyMywgWyBcIjY0OVwiIF0gXSwgWyBcIlR1dmFsdVwiLCBcInR2XCIsIFwiNjg4XCIgXSwgWyBcIlUuUy4gVmlyZ2luIElzbGFuZHNcIiwgXCJ2aVwiLCBcIjFcIiwgMjQsIFsgXCIzNDBcIiBdIF0sIFsgXCJVZ2FuZGFcIiwgXCJ1Z1wiLCBcIjI1NlwiIF0sIFsgXCJVa3JhaW5lICjQo9C60YDQsNGX0L3QsClcIiwgXCJ1YVwiLCBcIjM4MFwiIF0sIFsgXCJVbml0ZWQgQXJhYiBFbWlyYXRlcyAo4oCr2KfZhNil2YXYp9ix2KfYqiDYp9mE2LnYsdio2YrYqSDYp9mE2YXYqtit2K/YqeKArOKAjilcIiwgXCJhZVwiLCBcIjk3MVwiIF0sIFsgXCJVbml0ZWQgS2luZ2RvbVwiLCBcImdiXCIsIFwiNDRcIiwgMCBdLCBbIFwiVW5pdGVkIFN0YXRlc1wiLCBcInVzXCIsIFwiMVwiLCAwIF0sIFsgXCJVcnVndWF5XCIsIFwidXlcIiwgXCI1OThcIiBdLCBbIFwiVXpiZWtpc3RhbiAoT8q7emJla2lzdG9uKVwiLCBcInV6XCIsIFwiOTk4XCIgXSwgWyBcIlZhbnVhdHVcIiwgXCJ2dVwiLCBcIjY3OFwiIF0sIFsgXCJWYXRpY2FuIENpdHkgKENpdHTDoCBkZWwgVmF0aWNhbm8pXCIsIFwidmFcIiwgXCIzOVwiLCAxLCBbIFwiMDY2OThcIiBdIF0sIFsgXCJWZW5lenVlbGFcIiwgXCJ2ZVwiLCBcIjU4XCIgXSwgWyBcIlZpZXRuYW0gKFZp4buHdCBOYW0pXCIsIFwidm5cIiwgXCI4NFwiIF0sIFsgXCJXYWxsaXMgYW5kIEZ1dHVuYSAoV2FsbGlzLWV0LUZ1dHVuYSlcIiwgXCJ3ZlwiLCBcIjY4MVwiIF0sIFsgXCJXZXN0ZXJuIFNhaGFyYSAo4oCr2KfZhNi12K3Ysdin2KEg2KfZhNi62LHYqNmK2KnigKzigI4pXCIsIFwiZWhcIiwgXCIyMTJcIiwgMSwgWyBcIjUyODhcIiwgXCI1Mjg5XCIgXSBdLCBbIFwiWWVtZW4gKOKAq9in2YTZitmF2YbigKzigI4pXCIsIFwieWVcIiwgXCI5NjdcIiBdLCBbIFwiWmFtYmlhXCIsIFwiem1cIiwgXCIyNjBcIiBdLCBbIFwiWmltYmFid2VcIiwgXCJ6d1wiLCBcIjI2M1wiIF0sIFsgXCLDhWxhbmQgSXNsYW5kc1wiLCBcImF4XCIsIFwiMzU4XCIsIDEsIFsgXCIxOFwiIF0gXSBdO1xuICAgICAgICAvLyBsb29wIG92ZXIgYWxsIG9mIHRoZSBjb3VudHJpZXMgYWJvdmUsIHJlc3RydWN0dXJpbmcgdGhlIGRhdGEgdG8gYmUgb2JqZWN0cyB3aXRoIG5hbWVkIGtleXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxDb3VudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gYWxsQ291bnRyaWVzW2ldO1xuICAgICAgICAgICAgYWxsQ291bnRyaWVzW2ldID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGNbMF0sXG4gICAgICAgICAgICAgICAgaXNvMjogY1sxXSxcbiAgICAgICAgICAgICAgICBkaWFsQ29kZTogY1syXSxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogY1szXSB8fCAwLFxuICAgICAgICAgICAgICAgIGFyZWFDb2RlczogY1s0XSB8fCBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICAgICAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICAgICAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW50bFRlbElucHV0R2xvYmFscyA9IHtcbiAgICAgICAgICAgIGdldEluc3RhbmNlOiBmdW5jdGlvbiBnZXRJbnN0YW5jZShpbnB1dCkge1xuICAgICAgICAgICAgICAgIHZhciBpZCA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtaW50bC10ZWwtaW5wdXQtaWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLmluc3RhbmNlc1tpZF07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5zdGFuY2VzOiB7fVxuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgd2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMgPSBpbnRsVGVsSW5wdXRHbG9iYWxzO1xuICAgICAgICAvLyB0aGVzZSB2YXJzIHBlcnNpc3QgdGhyb3VnaCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICAgICAgdmFyIGlkID0gMDtcbiAgICAgICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgLy8gd2hldGhlciBvciBub3QgdG8gYWxsb3cgdGhlIGRyb3Bkb3duXG4gICAgICAgICAgICBhbGxvd0Ryb3Bkb3duOiB0cnVlLFxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMganVzdCBhIGRpYWwgY29kZSBpbiB0aGUgaW5wdXQ6IHJlbW92ZSBpdCBvbiBibHVyXG4gICAgICAgICAgICBhdXRvSGlkZURpYWxDb2RlOiB0cnVlLFxuICAgICAgICAgICAgLy8gYWRkIGEgcGxhY2Vob2xkZXIgaW4gdGhlIGlucHV0IHdpdGggYW4gZXhhbXBsZSBudW1iZXIgZm9yIHRoZSBzZWxlY3RlZCBjb3VudHJ5XG4gICAgICAgICAgICBhdXRvUGxhY2Vob2xkZXI6IFwicG9saXRlXCIsXG4gICAgICAgICAgICAvLyBtb2RpZnkgdGhlIHBhcmVudENsYXNzXG4gICAgICAgICAgICBjdXN0b21Db250YWluZXI6IFwiXCIsXG4gICAgICAgICAgICAvLyBtb2RpZnkgdGhlIGF1dG8gcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGN1c3RvbVBsYWNlaG9sZGVyOiBudWxsLFxuICAgICAgICAgICAgLy8gYXBwZW5kIG1lbnUgdG8gc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgLy8gZG9uJ3QgZGlzcGxheSB0aGVzZSBjb3VudHJpZXNcbiAgICAgICAgICAgIGV4Y2x1ZGVDb3VudHJpZXM6IFtdLFxuICAgICAgICAgICAgLy8gZm9ybWF0IHRoZSBpbnB1dCB2YWx1ZSBkdXJpbmcgaW5pdGlhbGlzYXRpb24gYW5kIG9uIHNldE51bWJlclxuICAgICAgICAgICAgZm9ybWF0T25EaXNwbGF5OiB0cnVlLFxuICAgICAgICAgICAgLy8gZ2VvSXAgbG9va3VwIGZ1bmN0aW9uXG4gICAgICAgICAgICBnZW9JcExvb2t1cDogbnVsbCxcbiAgICAgICAgICAgIC8vIGluamVjdCBhIGhpZGRlbiBpbnB1dCB3aXRoIHRoaXMgbmFtZSwgYW5kIG9uIHN1Ym1pdCwgcG9wdWxhdGUgaXQgd2l0aCB0aGUgcmVzdWx0IG9mIGdldE51bWJlclxuICAgICAgICAgICAgaGlkZGVuSW5wdXQ6IFwiXCIsXG4gICAgICAgICAgICAvLyBpbml0aWFsIGNvdW50cnlcbiAgICAgICAgICAgIGluaXRpYWxDb3VudHJ5OiBcIlwiLFxuICAgICAgICAgICAgLy8gbG9jYWxpemVkIGNvdW50cnkgbmFtZXMgZS5nLiB7ICdkZSc6ICdEZXV0c2NobGFuZCcgfVxuICAgICAgICAgICAgbG9jYWxpemVkQ291bnRyaWVzOiBudWxsLFxuICAgICAgICAgICAgLy8gZG9uJ3QgaW5zZXJ0IGludGVybmF0aW9uYWwgZGlhbCBjb2Rlc1xuICAgICAgICAgICAgbmF0aW9uYWxNb2RlOiB0cnVlLFxuICAgICAgICAgICAgLy8gZGlzcGxheSBvbmx5IHRoZXNlIGNvdW50cmllc1xuICAgICAgICAgICAgb25seUNvdW50cmllczogW10sXG4gICAgICAgICAgICAvLyBudW1iZXIgdHlwZSB0byB1c2UgZm9yIHBsYWNlaG9sZGVyc1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJOdW1iZXJUeXBlOiBcIk1PQklMRVwiLFxuICAgICAgICAgICAgLy8gdGhlIGNvdW50cmllcyBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0LiBkZWZhdWx0cyB0byB1bml0ZWQgc3RhdGVzIGFuZCB1bml0ZWQga2luZ2RvbVxuICAgICAgICAgICAgcHJlZmVycmVkQ291bnRyaWVzOiBbIFwidXNcIiwgXCJnYlwiIF0sXG4gICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBjb3VudHJ5IGRpYWwgY29kZSBuZXh0IHRvIHRoZSBzZWxlY3RlZCBmbGFnIHNvIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHR5cGVkIG51bWJlclxuICAgICAgICAgICAgc2VwYXJhdGVEaWFsQ29kZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBsaWJwaG9uZW51bWJlciBzY3JpcHQgdG8gZW5hYmxlIHZhbGlkYXRpb24vZm9ybWF0dGluZ1xuICAgICAgICAgICAgdXRpbHNTY3JpcHQ6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9Ob3J0aF9BbWVyaWNhbl9OdW1iZXJpbmdfUGxhbl9hcmVhX2NvZGVzI05vbi1nZW9ncmFwaGljX2FyZWFfY29kZXNcbiAgICAgICAgdmFyIHJlZ2lvbmxlc3NOYW5wTnVtYmVycyA9IFsgXCI4MDBcIiwgXCI4MjJcIiwgXCI4MzNcIiwgXCI4NDRcIiwgXCI4NTVcIiwgXCI4NjZcIiwgXCI4NzdcIiwgXCI4ODBcIiwgXCI4ODFcIiwgXCI4ODJcIiwgXCI4ODNcIiwgXCI4ODRcIiwgXCI4ODVcIiwgXCI4ODZcIiwgXCI4ODdcIiwgXCI4ODhcIiwgXCI4ODlcIiBdO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayBvZiBpZiB0aGUgd2luZG93LmxvYWQgZXZlbnQgaGFzIGZpcmVkIGFzIGltcG9zc2libGUgdG8gY2hlY2sgYWZ0ZXIgdGhlIGZhY3RcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyBVUERBVEU6IHVzZSBhIHB1YmxpYyBzdGF0aWMgZmllbGQgc28gd2UgY2FuIGZ1ZGdlIGl0IGluIHRoZSB0ZXN0c1xuICAgICAgICAgICAgICAgIHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLndpbmRvd0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBhbiBvYmplY3QuIGNhbid0IHVzZSBPYmplY3QuZW50cmllcyBvciBuYXRpdmUgZm9yRWFjaCBiZWNhdXNlXG4gICAgICAgIC8vIG9mIElFMTFcbiAgICAgICAgdmFyIGZvckVhY2hQcm9wID0gZnVuY3Rpb24gZm9yRWFjaFByb3Aob2JqLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soa2V5c1tpXSwgb2JqW2tleXNbaV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gcnVuIGEgbWV0aG9kIG9uIGVhY2ggaW5zdGFuY2Ugb2YgdGhlIHBsdWdpblxuICAgICAgICB2YXIgZm9yRWFjaEluc3RhbmNlID0gZnVuY3Rpb24gZm9yRWFjaEluc3RhbmNlKG1ldGhvZCkge1xuICAgICAgICAgICAgZm9yRWFjaFByb3Aod2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMuaW5zdGFuY2VzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuaW50bFRlbElucHV0R2xvYmFscy5pbnN0YW5jZXNba2V5XVttZXRob2RdKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gdGhpcyBpcyBvdXIgcGx1Z2luIGNsYXNzIHRoYXQgd2Ugd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgIHZhciBJdGkgPSAvKiNfX1BVUkVfXyovXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gSXRpKGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSXRpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gaWQrKztcbiAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0ID0gaW5wdXQ7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbSA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBzcGVjaWZpZWQgb3B0aW9ucyAvIGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdG8gT2JqZWN0LmFzc2lnbiwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkIGJ5IElFMTFcbiAgICAgICAgICAgICAgICB2YXIgY3VzdG9tT3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgICAgICAgICAgICAgZm9yRWFjaFByb3AoZGVmYXVsdHMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMub3B0aW9uc1trZXldID0gY3VzdG9tT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpID8gY3VzdG9tT3B0aW9uc1trZXldIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYWRJbml0aWFsUGxhY2Vob2xkZXIgPSBCb29sZWFuKGlucHV0LmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9jcmVhdGVDbGFzcyhJdGksIFsge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGluIG5hdGlvbmFsTW9kZSwgZGlzYWJsZSBvcHRpb25zIHJlbGF0aW5nIHRvIGRpYWwgY29kZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYXRpb25hbE1vZGUpIHRoaXMub3B0aW9ucy5hdXRvSGlkZURpYWxDb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHNlcGFyYXRlRGlhbENvZGUgdGhlbiBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gQSkgaW5zZXJ0IGRpYWwgY29kZSBpbnRvIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIC8vIChhdXRvSGlkZURpYWxDb2RlKSwgYW5kIEIpIGRpc3BsYXkgbmF0aW9uYWwgbnVtYmVycyAoYmVjYXVzZSB3ZSdyZSBkaXNwbGF5aW5nIHRoZSBjb3VudHJ5XG4gICAgICAgICAgICAgICAgICAgIC8vIGRpYWwgY29kZSBuZXh0IHRvIHRoZW0pXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VwYXJhdGVEaWFsQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmF1dG9IaWRlRGlhbENvZGUgPSB0aGlzLm9wdGlvbnMubmF0aW9uYWxNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGp1c3QgdGVzdCBzY3JlZW4gc2l6ZSBhcyBzb21lIHNtYXJ0cGhvbmVzL3dlYnNpdGUgbWV0YSB0YWdzIHdpbGwgcmVwb3J0IGRlc2t0b3BcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogZm9yIHNvbWUgcmVhc29uIGphc21pbmUgYnJlYWtzIGlmIHlvdSBwdXQgdGhpcyBpbiB0aGUgbWFpbiBQbHVnaW4gZnVuY3Rpb24gd2l0aCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdCBvZiB0aGVzZSBkZWNsYXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdG8gdGFyZ2V0IEFuZHJvaWQgTW9iaWxlcyAoYW5kIG5vdCBUYWJsZXRzKSwgd2UgbXVzdCBmaW5kICdBbmRyb2lkJyBhbmQgJ01vYmlsZSdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IC9BbmRyb2lkLitNb2JpbGV8d2ViT1N8aVBob25lfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIG1vYmlsZSBkcm9wZG93biBjc3NcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcIml0aS1tb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBtb2JpbGUsIHdlIHdhbnQgYSBmdWxsIHNjcmVlbiBkcm9wZG93biwgc28gd2UgbXVzdCBhcHBlbmQgaXQgdG8gdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmRyb3Bkb3duQ29udGFpbmVyKSB0aGlzLm9wdGlvbnMuZHJvcGRvd25Db250YWluZXIgPSBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHByb21pc2VzIGdldCByZXNvbHZlZCB3aGVuIHRoZWlyIGluZGl2aWR1YWwgcmVxdWVzdHMgY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3YXkgdGhlIGRldiBjYW4gZG8gc29tZXRoaW5nIGxpa2UgaXRpLnByb21pc2UudGhlbiguLi4pIHRvIGtub3cgd2hlbiBhbGwgcmVxdWVzdHMgYXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1dG9Db3VudHJ5UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMi5yZXNvbHZlQXV0b0NvdW50cnlQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczIucmVqZWN0QXV0b0NvdW50cnlQcm9taXNlID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXRpbHNTY3JpcHRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMyLnJlc29sdmVVdGlsc1NjcmlwdFByb21pc2UgPSByZXNvbHZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMi5yZWplY3RVdGlsc1NjcmlwdFByb21pc2UgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZSA9IFByb21pc2UuYWxsKFsgYXV0b0NvdW50cnlQcm9taXNlLCB1dGlsc1NjcmlwdFByb21pc2UgXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGVycm9ycyB3aGVuIFByb21pc2UgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlQXV0b0NvdW50cnlQcm9taXNlID0gdGhpcy5yZWplY3RBdXRvQ291bnRyeVByb21pc2UgPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlVXRpbHNTY3JpcHRQcm9taXNlID0gdGhpcy5yZWplY3RVdGlsc1NjcmlwdFByb21pc2UgPSBmdW5jdGlvbigpIHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGluIHZhcmlvdXMgc2l0dWF0aW9ucyB0aGVyZSBjb3VsZCBiZSBubyBjb3VudHJ5IHNlbGVjdGVkIGluaXRpYWxseSwgYnV0IHdlIG5lZWQgdG8gYmUgYWJsZVxuICAgICAgICAgICAgICAgICAgICAvLyB0byBhc3N1bWUgdGhpcyB2YXJpYWJsZSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhID0ge307XG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgYWxsIHRoZSBkYXRhOiBvbmx5Q291bnRyaWVzLCBleGNsdWRlQ291bnRyaWVzLCBwcmVmZXJyZWRDb3VudHJpZXMgZXRjXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NDb3VudHJ5RGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgbWFya3VwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2dlbmVyYXRlTWFya3VwKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgaW5wdXQgdmFsdWUgYW5kIHRoZSBzZWxlY3RlZCBmbGFnXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldEluaXRpYWxTdGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBhbGwgb2YgdGhlIGV2ZW50IGxpc3RlbmVyczogYXV0b0hpZGVEaWFsQ29kZSwgaW5wdXQga2V5ZG93biwgc2VsZWN0ZWRGbGFnIGNsaWNrXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXRpbHMgc2NyaXB0LCBhbmQgYXV0byBjb3VudHJ5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRSZXF1ZXN0cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3Byb2Nlc3NDb3VudHJ5RGF0YVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0NvdW50cnlEYXRhKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIG9ubHlDb3VudHJpZXMgb3IgZXhjbHVkZUNvdW50cmllcyBhcnJheSBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NBbGxDb3VudHJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgY291bnRyeUNvZGVzIG1hcFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzQ291bnRyeUNvZGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHByZWZlcnJlZENvdW50cmllc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzUHJlZmVycmVkQ291bnRyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zbGF0ZSBjb3VudHJpZXMgYWNjb3JkaW5nIHRvIGxvY2FsaXplZENvdW50cmllcyBvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhbGl6ZWRDb3VudHJpZXMpIHRoaXMuX3RyYW5zbGF0ZUNvdW50cmllc0J5TG9jYWxlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNvcnQgY291bnRyaWVzIGJ5IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbmx5Q291bnRyaWVzLmxlbmd0aCB8fCB0aGlzLm9wdGlvbnMubG9jYWxpemVkQ291bnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cmllcy5zb3J0KHRoaXMuX2NvdW50cnlOYW1lU29ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9hZGRDb3VudHJ5Q29kZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfYWRkQ291bnRyeUNvZGUoaXNvMiwgZGlhbENvZGUsIHByaW9yaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaWFsQ29kZS5sZW5ndGggPiB0aGlzLmRpYWxDb2RlTWF4TGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxDb2RlTWF4TGVuID0gZGlhbENvZGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb3VudHJ5Q29kZXMuaGFzT3duUHJvcGVydHkoZGlhbENvZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlDb2Rlc1tkaWFsQ29kZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBiYWlsIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGNvdW50cnkgZm9yIHRoaXMgZGlhbENvZGVcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvdW50cnlDb2Rlc1tkaWFsQ29kZV0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvdW50cnlDb2Rlc1tkaWFsQ29kZV1baV0gPT09IGlzbzIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgdW5kZWZpbmVkIGFzIDAgaXMgZmFsc3lcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gcHJpb3JpdHkgIT09IHVuZGVmaW5lZCA/IHByaW9yaXR5IDogdGhpcy5jb3VudHJ5Q29kZXNbZGlhbENvZGVdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5Q29kZXNbZGlhbENvZGVdW2luZGV4XSA9IGlzbzI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfcHJvY2Vzc0FsbENvdW50cmllc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0FsbENvdW50cmllcygpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbmx5Q291bnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvd2VyQ2FzZU9ubHlDb3VudHJpZXMgPSB0aGlzLm9wdGlvbnMub25seUNvdW50cmllcy5tYXAoZnVuY3Rpb24oY291bnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJ5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRyaWVzID0gYWxsQ291bnRyaWVzLmZpbHRlcihmdW5jdGlvbihjb3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZU9ubHlDb3VudHJpZXMuaW5kZXhPZihjb3VudHJ5LmlzbzIpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZXhjbHVkZUNvdW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb3dlckNhc2VFeGNsdWRlQ291bnRyaWVzID0gdGhpcy5vcHRpb25zLmV4Y2x1ZGVDb3VudHJpZXMubWFwKGZ1bmN0aW9uKGNvdW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cmllcyA9IGFsbENvdW50cmllcy5maWx0ZXIoZnVuY3Rpb24oY291bnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb3dlckNhc2VFeGNsdWRlQ291bnRyaWVzLmluZGV4T2YoY291bnRyeS5pc28yKSA9PT0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRyaWVzID0gYWxsQ291bnRyaWVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfdHJhbnNsYXRlQ291bnRyaWVzQnlMb2NhbGVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3RyYW5zbGF0ZUNvdW50cmllc0J5TG9jYWxlKCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY291bnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNvID0gdGhpcy5jb3VudHJpZXNbaV0uaXNvMi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5sb2NhbGl6ZWRDb3VudHJpZXMuaGFzT3duUHJvcGVydHkoaXNvKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRyaWVzW2ldLm5hbWUgPSB0aGlzLm9wdGlvbnMubG9jYWxpemVkQ291bnRyaWVzW2lzb107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9jb3VudHJ5TmFtZVNvcnRcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2NvdW50cnlOYW1lU29ydChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3Byb2Nlc3NDb3VudHJ5Q29kZXNcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NDb3VudHJ5Q29kZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbENvZGVNYXhMZW4gPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlDb2RlcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdDogYWRkIGRpYWwgY29kZXNcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvdW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmNvdW50cmllc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZENvdW50cnlDb2RlKGMuaXNvMiwgYy5kaWFsQ29kZSwgYy5wcmlvcml0eSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbmV4dDogYWRkIGFyZWEgY29kZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNlY29uZCBsb29wIG92ZXIgY291bnRyaWVzLCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhbGwgb2YgdGhlIFwicm9vdFwiIGNvdW50cmllc1xuICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIHRoZSBtYXAsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGVtLCBhcyBlYWNoIHRpbWUgd2UgYWRkIGFuIGFyZWEgY29kZSBzdWJzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIG1hcCwgd2UgYWxzbyBuZWVkIHRvIGluY2x1ZGUgdGhlIFwicm9vdFwiIGNvdW50cnkncyBjb2RlLCBhcyB0aGF0IGFsc28gbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgdGhpcy5jb3VudHJpZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2MgPSB0aGlzLmNvdW50cmllc1tfaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmVhIGNvZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2MuYXJlYUNvZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvb3RDb3VudHJ5Q29kZSA9IHRoaXMuY291bnRyeUNvZGVzW19jLmRpYWxDb2RlXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBhcmVhIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IF9jLmFyZWFDb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJlYUNvZGUgPSBfYy5hcmVhQ29kZXNbal07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIGRpZ2l0IGluIHRoZSBhcmVhIGNvZGUgdG8gYWRkIGFsbCBwYXJ0aWFsIG1hdGNoZXMgYXMgd2VsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMTsgayA8IGFyZWFDb2RlLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGlhbERpYWxDb2RlID0gX2MuZGlhbENvZGUgKyBhcmVhQ29kZS5zdWJzdHIoMCwgayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCB3aXRoIHRoZSByb290IGNvdW50cnksIGFzIHRoYXQgYWxzbyBtYXRjaGVzIHRoaXMgZGlhbCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb3VudHJ5Q29kZShyb290Q291bnRyeUNvZGUsIHBhcnRpYWxEaWFsQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRDb3VudHJ5Q29kZShfYy5pc28yLCBwYXJ0aWFsRGlhbENvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZnVsbCBhcmVhIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkQ291bnRyeUNvZGUoX2MuaXNvMiwgX2MuZGlhbENvZGUgKyBhcmVhQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfcHJvY2Vzc1ByZWZlcnJlZENvdW50cmllc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc1ByZWZlcnJlZENvdW50cmllcygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmZXJyZWRDb3VudHJpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMucHJlZmVycmVkQ291bnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNvZGUgPSB0aGlzLm9wdGlvbnMucHJlZmVycmVkQ291bnRyaWVzW2ldLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeURhdGEgPSB0aGlzLl9nZXRDb3VudHJ5RGF0YShjb3VudHJ5Q29kZSwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlEYXRhKSB0aGlzLnByZWZlcnJlZENvdW50cmllcy5wdXNoKGNvdW50cnlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2NyZWF0ZUVsXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9jcmVhdGVFbChuYW1lLCBhdHRycywgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRycykgZm9yRWFjaFByb3AoYXR0cnMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyKSBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfZ2VuZXJhdGVNYXJrdXBcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2dlbmVyYXRlTWFya3VwKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhdXRvY29tcGxldGUgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGVsZW1lbnQgYW5kIGl0cyBmb3JtLCB0aGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgYXV0b2NvbXBsZXRlIGFzIHRoZXJlJ3Mgbm8gc2FmZSwgY3Jvc3MtYnJvd3NlciBldmVudCB3ZSBjYW4gcmVhY3QgdG8sIHNvIGl0IGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBlYXNpbHkgcHV0IHRoZSBwbHVnaW4gaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGUuZy4gdGhlIHdyb25nIGZsYWcgc2VsZWN0ZWQgZm9yIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvY29tcGxldGVkIG51bWJlciwgd2hpY2ggb24gc3VibWl0IGNvdWxkIG1lYW4gd3JvbmcgbnVtYmVyIGlzIHNhdmVkIChlc3AgaW4gbmF0aW9uYWxNb2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGVsSW5wdXQuaGFzQXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpICYmICEodGhpcy50ZWxJbnB1dC5mb3JtICYmIHRoaXMudGVsSW5wdXQuZm9ybS5oYXNBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0LnNldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiLCBcIm9mZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluZXJzIChtb3N0bHkgZm9yIHBvc2l0aW9uaW5nKVxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50Q2xhc3MgPSBcIml0aVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93RHJvcGRvd24pIHBhcmVudENsYXNzICs9IFwiIGl0aS0tYWxsb3ctZHJvcGRvd25cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXBhcmF0ZURpYWxDb2RlKSBwYXJlbnRDbGFzcyArPSBcIiBpdGktLXNlcGFyYXRlLWRpYWwtY29kZVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmN1c3RvbUNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xhc3MgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDbGFzcyArPSB0aGlzLm9wdGlvbnMuY3VzdG9tQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciB3cmFwcGVyID0gdGhpcy5fY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiOiBwYXJlbnRDbGFzc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh3cmFwcGVyLCB0aGlzLnRlbElucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGFnc0NvbnRhaW5lciA9IHRoaXMuX2NyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJpdGlfX2ZsYWctY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgfSwgd3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy50ZWxJbnB1dCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIGZsYWcgKGRpc3BsYXllZCB0byBsZWZ0IG9mIGlucHV0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxhZyA9IHRoaXMuX2NyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJpdGlfX3NlbGVjdGVkLWZsYWdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vd25zXCI6IFwiY291bnRyeS1saXN0Ym94XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtZXhwYW5kZWRcIjogXCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZmxhZ3NDb250YWluZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxhZ0lubmVyID0gdGhpcy5fY3JlYXRlRWwoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcIml0aV9fZmxhZ1wiXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VsZWN0ZWRGbGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXBhcmF0ZURpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGlhbENvZGUgPSB0aGlzLl9jcmVhdGVFbChcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcIml0aV9fc2VsZWN0ZWQtZGlhbC1jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VsZWN0ZWRGbGFnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFsbG93RHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgZWxlbWVudCBmb2N1c2FibGUgYW5kIHRhYiBuYXZpZ2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbGFnLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25BcnJvdyA9IHRoaXMuX2NyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwiaXRpX19hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNlbGVjdGVkRmxhZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudHJ5IGRyb3Bkb3duOiBwcmVmZXJyZWQgY291bnRyaWVzLCB0aGVuIGRpdmlkZXIsIHRoZW4gYWxsIGNvdW50cmllc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5TGlzdCA9IHRoaXMuX2NyZWF0ZUVsKFwidWxcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2xhc3NcIjogXCJpdGlfX2NvdW50cnktbGlzdCBpdGlfX2hpZGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCJjb3VudHJ5LWxpc3Rib3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiBcImxpc3Rib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVmZXJyZWRDb3VudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kTGlzdEl0ZW1zKHRoaXMucHJlZmVycmVkQ291bnRyaWVzLCBcIml0aV9fcHJlZmVycmVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUVsKFwibGlcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzXCI6IFwiaXRpX19kaXZpZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6IFwic2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1kaXNhYmxlZFwiOiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuY291bnRyeUxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kTGlzdEl0ZW1zKHRoaXMuY291bnRyaWVzLCBcIml0aV9fc3RhbmRhcmRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZHJvcGRvd25Db250YWluZXIgbWFya3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRyb3Bkb3duQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93biA9IHRoaXMuX2NyZWF0ZUVsKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiOiBcIml0aSBpdGktLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hcHBlbmRDaGlsZCh0aGlzLmNvdW50cnlMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbGFnc0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvdW50cnlMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGlkZGVuSW5wdXROYW1lID0gdGhpcy5vcHRpb25zLmhpZGRlbklucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnRlbElucHV0LmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmFtZS5sYXN0SW5kZXhPZihcIltcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaW5wdXQgbmFtZSBjb250YWlucyBzcXVhcmUgYnJhY2tldHMsIHRoZW4gZ2l2ZSB0aGUgaGlkZGVuIGlucHV0IHRoZSBzYW1lIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgbGFzdCBzZXQgb2YgYnJhY2tldHMgd2l0aCB0aGUgZ2l2ZW4gaGlkZGVuSW5wdXQgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSAtMSkgaGlkZGVuSW5wdXROYW1lID0gXCJcIi5jb25jYXQobmFtZS5zdWJzdHIoMCwgaSksIFwiW1wiKS5jb25jYXQoaGlkZGVuSW5wdXROYW1lLCBcIl1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbklucHV0ID0gdGhpcy5fY3JlYXRlRWwoXCJpbnB1dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJoaWRkZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBoaWRkZW5JbnB1dE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmhpZGRlbklucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2FwcGVuZExpc3RJdGVtc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfYXBwZW5kTGlzdEl0ZW1zKGNvdW50cmllcywgY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBzbyBtYW55IERPTSBlbGVtZW50cywgaXQgaXMgZmFzdGVyIHRvIGJ1aWxkIGEgdGVtcCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gYWRkIGV2ZXJ5dGhpbmcgdG8gdGhlIERPTSBpbiBvbmUgZ28gYXQgdGhlIGVuZFxuICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggY291bnRyeVxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjb3VudHJpZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIHRoZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBcIjxsaSBjbGFzcz0naXRpX19jb3VudHJ5IFwiLmNvbmNhdChjbGFzc05hbWUsIFwiJyB0YWJJbmRleD0nLTEnIGlkPSdpdGktaXRlbS1cIikuY29uY2F0KGMuaXNvMiwgXCInIHJvbGU9J29wdGlvbicgZGF0YS1kaWFsLWNvZGU9J1wiKS5jb25jYXQoYy5kaWFsQ29kZSwgXCInIGRhdGEtY291bnRyeS1jb2RlPSdcIikuY29uY2F0KGMuaXNvMiwgXCInPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IFwiPGRpdiBjbGFzcz0naXRpX19mbGFnLWJveCc+PGRpdiBjbGFzcz0naXRpX19mbGFnIGl0aV9fXCIuY29uY2F0KGMuaXNvMiwgXCInPjwvZGl2PjwvZGl2PlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgY291bnRyeSBuYW1lIGFuZCBkaWFsIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBcIjxzcGFuIGNsYXNzPSdpdGlfX2NvdW50cnktbmFtZSc+XCIuY29uY2F0KGMubmFtZSwgXCI8L3NwYW4+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG1wICs9IFwiPHNwYW4gY2xhc3M9J2l0aV9fZGlhbC1jb2RlJz4rXCIuY29uY2F0KGMuZGlhbENvZGUsIFwiPC9zcGFuPlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcCArPSBcIjwvbGk+XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5TGlzdC5pbnNlcnRBZGphY2VudEhUTUwoXCJiZWZvcmVlbmRcIiwgdG1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9zZXRJbml0aWFsU3RhdGVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NldEluaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudGVsSW5wdXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFsQ29kZSA9IHRoaXMuX2dldERpYWxDb2RlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc1JlZ2lvbmxlc3NOYW5wID0gdGhpcy5faXNSZWdpb25sZXNzTmFucCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgaW5pdGlhbENvdW50cnkgPSBfdGhpcyRvcHRpb25zLmluaXRpYWxDb3VudHJ5LCBuYXRpb25hbE1vZGUgPSBfdGhpcyRvcHRpb25zLm5hdGlvbmFsTW9kZSwgYXV0b0hpZGVEaWFsQ29kZSA9IF90aGlzJG9wdGlvbnMuYXV0b0hpZGVEaWFsQ29kZSwgc2VwYXJhdGVEaWFsQ29kZSA9IF90aGlzJG9wdGlvbnMuc2VwYXJhdGVEaWFsQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgZGlhbCBjb2RlLCBhbmQgaXQncyBub3QgYSByZWdpb25sZXNzTmFucCwgd2UgY2FuIGdvIGFoZWFkIGFuZCBzZXQgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZsYWcsIGVsc2UgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGNvdW50cnlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxDb2RlICYmICFpc1JlZ2lvbmxlc3NOYW5wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVGbGFnRnJvbU51bWJlcih2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxDb3VudHJ5ICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHdlIHNob3VsZCBzZWxlY3QgYSBmbGFnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbENvdW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRGbGFnKGluaXRpYWxDb3VudHJ5LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbENvZGUgJiYgaXNSZWdpb25sZXNzTmFucCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXMgaW50bCBkaWFsIGNvZGUsIGlzIHJlZ2lvbmxlc3MgbmFucCwgYW5kIG5vIGluaXRpYWxDb3VudHJ5LCBzbyBkZWZhdWx0IHRvIFVTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldEZsYWcoXCJ1c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBkaWFsIGNvZGUgYW5kIG5vIGluaXRpYWxDb3VudHJ5LCBzbyBkZWZhdWx0IHRvIGZpcnN0IGluIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q291bnRyeSA9IHRoaXMucHJlZmVycmVkQ291bnRyaWVzLmxlbmd0aCA/IHRoaXMucHJlZmVycmVkQ291bnRyaWVzWzBdLmlzbzIgOiB0aGlzLmNvdW50cmllc1swXS5pc28yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0RmxhZyh0aGlzLmRlZmF1bHRDb3VudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVtcHR5IGFuZCBubyBuYXRpb25hbE1vZGUgYW5kIG5vIGF1dG9IaWRlRGlhbENvZGUgdGhlbiBpbnNlcnQgdGhlIGRlZmF1bHQgZGlhbCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCAmJiAhbmF0aW9uYWxNb2RlICYmICFhdXRvSGlkZURpYWxDb2RlICYmICFzZXBhcmF0ZURpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC52YWx1ZSA9IFwiK1wiLmNvbmNhdCh0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuZGlhbENvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IGlmIGluaXRpYWxDb3VudHJ5IGlzIHNldCB0byBhdXRvLCB0aGF0IHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCAtIG5vdGUgdGhpcyB3b250IGJlIHJ1biBhZnRlciBfdXBkYXRlRGlhbENvZGUgYXMgdGhhdCdzIG9ubHkgY2FsbGVkIGlmIG5vIHZhbFxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsKSB0aGlzLl91cGRhdGVWYWxGcm9tTnVtYmVyKHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdExpc3RlbmVyc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdExpc3RlbmVycygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5pdEtleUxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmF1dG9IaWRlRGlhbENvZGUpIHRoaXMuX2luaXRCbHVyTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEcm9wZG93bikgdGhpcy5faW5pdERyb3Bkb3duTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZGRlbklucHV0KSB0aGlzLl9pbml0SGlkZGVuSW5wdXRMaXN0ZW5lcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2luaXRIaWRkZW5JbnB1dExpc3RlbmVyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0SGlkZGVuSW5wdXRMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUhpZGRlbklucHV0U3VibWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpczMuaGlkZGVuSW5wdXQudmFsdWUgPSBfdGhpczMuZ2V0TnVtYmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlbElucHV0LmZvcm0pIHRoaXMudGVsSW5wdXQuZm9ybS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuX2hhbmRsZUhpZGRlbklucHV0U3VibWl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9nZXRDbG9zZXN0TGFiZWxcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2dldENsb3Nlc3RMYWJlbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsID0gdGhpcy50ZWxJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT09IFwiTEFCRUxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9pbml0RHJvcGRvd25MaXN0ZW5lcnNcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2luaXREcm9wZG93bkxpc3RlbmVycygpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhY2sgZm9yIGlucHV0IG5lc3RlZCBpbnNpZGUgbGFiZWwgKHdoaWNoIGlzIHZhbGlkIG1hcmt1cCk6IGNsaWNraW5nIHRoZSBzZWxlY3RlZC1mbGFnIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gdGhlIGRyb3Bkb3duIHdvdWxkIHRoZW4gYXV0b21hdGljYWxseSB0cmlnZ2VyIGEgMm5kIGNsaWNrIG9uIHRoZSBpbnB1dCB3aGljaCB3b3VsZFxuICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBpdCBhZ2FpblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVMYWJlbENsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRyb3Bkb3duIGlzIGNsb3NlZCwgdGhlbiBmb2N1cyB0aGUgaW5wdXQsIGVsc2UgaWdub3JlIHRoZSBjbGlja1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzNC5jb3VudHJ5TGlzdC5jbGFzc0xpc3QuY29udGFpbnMoXCJpdGlfX2hpZGVcIikpIF90aGlzNC50ZWxJbnB1dC5mb2N1cygpOyBlbHNlIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5fZ2V0Q2xvc2VzdExhYmVsKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbCkgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUxhYmVsQ2xpY2spO1xuICAgICAgICAgICAgICAgICAgICAvLyB0b2dnbGUgY291bnRyeSBkcm9wZG93biBvbiBjbGlja1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDbGlja1NlbGVjdGVkRmxhZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBpbnRlcmNlcHQgdGhpcyBldmVudCBpZiB3ZSdyZSBvcGVuaW5nIHRoZSBkcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBsZXQgaXQgYnViYmxlIHVwIHRvIHRoZSB0b3AgKFwiY2xpY2stb2ZmLXRvLWNsb3NlXCIgbGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QganVzdCBzdG9wUHJvcGFnYXRpb24gYXMgaXQgbWF5IGJlIG5lZWRlZCB0byBjbG9zZSBhbm90aGVyIGluc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXM0LmNvdW50cnlMaXN0LmNsYXNzTGlzdC5jb250YWlucyhcIml0aV9faGlkZVwiKSAmJiAhX3RoaXM0LnRlbElucHV0LmRpc2FibGVkICYmICFfdGhpczQudGVsSW5wdXQucmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczQuX3Nob3dEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxhZy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQ2xpY2tTZWxlY3RlZEZsYWcpO1xuICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGRyb3Bkb3duIGxpc3QgaWYgY3VycmVudGx5IGZvY3VzZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRmxhZ3NDb250YWluZXJLZXlkb3duID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzRHJvcGRvd25IaWRkZW4gPSBfdGhpczQuY291bnRyeUxpc3QuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaXRpX19oaWRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRHJvcGRvd25IaWRkZW4gJiYgWyBcIkFycm93VXBcIiwgXCJVcFwiLCBcIkFycm93RG93blwiLCBcIkRvd25cIiwgXCIgXCIsIFwiRW50ZXJcIiBdLmluZGV4T2YoZS5rZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZm9ybSBmcm9tIGJlaW5nIHN1Ym1pdHRlZCBpZiBcIkVOVEVSXCIgd2FzIHByZXNzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBldmVudCBmcm9tIGJlaW5nIGhhbmRsZWQgYWdhaW4gYnkgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNC5fc2hvd0Ryb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBuYXZpZ2F0aW9uIGZyb20gZHJvcGRvd24gdG8gaW5wdXQgb24gVEFCXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiVGFiXCIpIF90aGlzNC5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZsYWdzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuX2hhbmRsZUZsYWdzQ29udGFpbmVyS2V5ZG93bik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdFJlcXVlc3RzXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0UmVxdWVzdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgc3BlY2lmaWVkIHRoZSBwYXRoIHRvIHRoZSB1dGlscyBzY3JpcHQsIGZldGNoIGl0IG9uIHdpbmRvdy5sb2FkLCBlbHNlIHJlc29sdmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51dGlsc1NjcmlwdCAmJiAhd2luZG93LmludGxUZWxJbnB1dFV0aWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGx1Z2luIGlzIGJlaW5nIGluaXRpYWxpc2VkIGFmdGVyIHRoZSB3aW5kb3cubG9hZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMud2luZG93TG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMubG9hZFV0aWxzKHRoaXMub3B0aW9ucy51dGlsc1NjcmlwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGxvYWQgZXZlbnQgc28gd2UgZG9uJ3QgYmxvY2sgYW55IG90aGVyIHJlcXVlc3RzIGUuZy4gdGhlIGZsYWdzIGltYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW50bFRlbElucHV0R2xvYmFscy5sb2FkVXRpbHMoX3RoaXM1Lm9wdGlvbnMudXRpbHNTY3JpcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5yZXNvbHZlVXRpbHNTY3JpcHRQcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5pdGlhbENvdW50cnkgPT09IFwiYXV0b1wiKSB0aGlzLl9sb2FkQXV0b0NvdW50cnkoKTsgZWxzZSB0aGlzLnJlc29sdmVBdXRvQ291bnRyeVByb21pc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9sb2FkQXV0b0NvdW50cnlcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2xvYWRBdXRvQ291bnRyeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gMyBvcHRpb25zOlxuICAgICAgICAgICAgICAgICAgICAvLyAxKSBhbHJlYWR5IGxvYWRlZCAod2UncmUgZG9uZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gMikgbm90IGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIChzdGFydClcbiAgICAgICAgICAgICAgICAgICAgLy8gMykgYWxyZWFkeSBzdGFydGVkIGxvYWRpbmcgKGRvIG5vdGhpbmcgLSBqdXN0IHdhaXQgZm9yIGxvYWRpbmcgY2FsbGJhY2sgdG8gZmlyZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLmF1dG9Db3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUF1dG9Db3VudHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLnN0YXJ0ZWRMb2FkaW5nQXV0b0NvdW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGRvIHRoaXMgdHdpY2UhXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaW50bFRlbElucHV0R2xvYmFscy5zdGFydGVkTG9hZGluZ0F1dG9Db3VudHJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmdlb0lwTG9va3VwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ2VvSXBMb29rdXAoZnVuY3Rpb24oY291bnRyeUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMuYXV0b0NvdW50cnkgPSBjb3VudHJ5Q29kZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZWxsIGFsbCBpbnN0YW5jZXMgdGhlIGF1dG8gY291bnRyeSBpcyByZWFkeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBqdXN0IGJlIHRoZSBjdXJyZW50IGluc3RhbmNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVUERBVEU6IHVzZSBzZXRUaW1lb3V0IGluIGNhc2UgdGhlaXIgZ2VvSXBMb29rdXAgZnVuY3Rpb24gY2FsbHMgdGhpcyBjYWxsYmFjayBzdHJhaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhd2F5IChlLmcuIGlmIHRoZXkgaGF2ZSBhbHJlYWR5IGRvbmUgdGhlIGdlbyBpcCBsb29rdXAgc29tZXdoZXJlIGVsc2UpLiBVc2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0IG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIG9mIGV4ZWN1dGlvbiB3aWxsIGZpbmlzaCBiZWZvcmUgZXhlY3V0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMsIHdoaWNoIGFsbG93cyB0aGUgcGx1Z2luIHRvIGZpbmlzaCBpbml0aWFsaXNpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yRWFjaEluc3RhbmNlKFwiaGFuZGxlQXV0b0NvdW50cnlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yRWFjaEluc3RhbmNlKFwicmVqZWN0QXV0b0NvdW50cnlQcm9taXNlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaW5pdEtleUxpc3RlbmVyc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdEtleUxpc3RlbmVycygpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzNiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBmbGFnIG9uIGtleXVwXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUtleXVwRXZlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpczYuX3VwZGF0ZUZsYWdGcm9tTnVtYmVyKF90aGlzNi50ZWxJbnB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpczYuX3RyaWdnZXJDb3VudHJ5Q2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMuX2hhbmRsZUtleXVwRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZmxhZyBvbiBjdXQvcGFzdGUgZXZlbnRzIChub3cgc3VwcG9ydGVkIGluIGFsbCBtYWpvciBicm93c2VycylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2xpcGJvYXJkRXZlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhY2sgYmVjYXVzZSBcInBhc3RlXCIgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGlucHV0IGlzIHVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoX3RoaXM2Ll9oYW5kbGVLZXl1cEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuX2hhbmRsZUNsaXBib2FyZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5hZGRFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy5faGFuZGxlQ2xpcGJvYXJkRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2NhcFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FwKG51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWF4ID0gdGhpcy50ZWxJbnB1dC5nZXRBdHRyaWJ1dGUoXCJtYXhsZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXggJiYgbnVtYmVyLmxlbmd0aCA+IG1heCA/IG51bWJlci5zdWJzdHIoMCwgbWF4KSA6IG51bWJlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9pbml0Qmx1ckxpc3RlbmVyc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5pdEJsdXJMaXN0ZW5lcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiBibHVyIG9yIGZvcm0gc3VibWl0OiBpZiBqdXN0IGEgZGlhbCBjb2RlIHRoZW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVN1Ym1pdE9yQmx1ckV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpczcuX3JlbW92ZUVtcHR5RGlhbENvZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVsSW5wdXQuZm9ybSkgdGhpcy50ZWxJbnB1dC5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgdGhpcy5faGFuZGxlU3VibWl0T3JCbHVyRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIHRoaXMuX2hhbmRsZVN1Ym1pdE9yQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9yZW1vdmVFbXB0eURpYWxDb2RlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZW1vdmVFbXB0eURpYWxDb2RlKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZWxJbnB1dC52YWx1ZS5jaGFyQXQoMCkgPT09IFwiK1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtZXJpYyA9IHRoaXMuX2dldE51bWVyaWModGhpcy50ZWxJbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBqdXN0IGEgcGx1cywgb3IgaWYganVzdCBhIGRpYWwgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFudW1lcmljIHx8IHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5kaWFsQ29kZSA9PT0gbnVtZXJpYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfZ2V0TnVtZXJpY1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0TnVtZXJpYyhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1xcRC9nLCBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl90cmlnZ2VyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF90cmlnZ2VyKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byB1c2Ugb2xkIHNjaG9vbCBkb2N1bWVudC5jcmVhdGVFdmVudCBhcyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBgbmV3IEV2ZW50KClgIHN5bnRheFxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGUuaW5pdEV2ZW50KG5hbWUsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjYW4gYnViYmxlLCBhbmQgaXMgY2FuY2VsbGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5kaXNwYXRjaEV2ZW50KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3Nob3dEcm9wZG93blwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2hvd0Ryb3Bkb3duKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlMaXN0LmNsYXNzTGlzdC5yZW1vdmUoXCJpdGlfX2hpZGVcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbGFnLnNldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXREcm9wZG93blBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBoaWdobGlnaHRpbmcgYW5kIHNjcm9sbCB0byBhY3RpdmUgbGlzdCBpdGVtXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpZ2hsaWdodExpc3RJdGVtKHRoaXMuYWN0aXZlSXRlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG8odGhpcy5hY3RpdmVJdGVtLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBiaW5kIGFsbCB0aGUgZHJvcGRvd24tcmVsYXRlZCBsaXN0ZW5lcnM6IG1vdXNlb3ZlciwgY2xpY2ssIGNsaWNrLW9mZiwga2V5ZG93blxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kRHJvcGRvd25MaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBhcnJvd1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duQXJyb3cuY2xhc3NMaXN0LmFkZChcIml0aV9fYXJyb3ctLXVwXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKFwib3Blbjpjb3VudHJ5ZHJvcGRvd25cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfdG9nZ2xlQ2xhc3NcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3RvZ2dsZUNsYXNzKGVsLCBjbGFzc05hbWUsIHNob3VsZEhhdmVDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSGF2ZUNsYXNzICYmICFlbC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkgZWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpOyBlbHNlIGlmICghc2hvdWxkSGF2ZUNsYXNzICYmIGVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfc2V0RHJvcGRvd25Qb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfc2V0RHJvcGRvd25Qb3NpdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJvcGRvd25Db250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kcm9wZG93bkNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRyb3Bkb3duKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLnRlbElucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93VG9wIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0Mzg0MDkxLzIxNzg2NlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbmRvd1RvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0VG9wID0gcG9zLnRvcCArIHdpbmRvd1RvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkcm9wZG93bkhlaWdodCA9IHRoaXMuY291bnRyeUxpc3Qub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcGRvd25GaXRzQmVsb3cgPSAoZHJvcGRvd25Cb3R0b20gPCB3aW5kb3dCb3R0b20pXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd25GaXRzQmVsb3cgPSBpbnB1dFRvcCArIHRoaXMudGVsSW5wdXQub2Zmc2V0SGVpZ2h0ICsgZHJvcGRvd25IZWlnaHQgPCB3aW5kb3dUb3AgKyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd25GaXRzQWJvdmUgPSBpbnB1dFRvcCAtIGRyb3Bkb3duSGVpZ2h0ID4gd2luZG93VG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCwgdGhlIGRyb3Bkb3duIHdpbGwgYmUgYmVsb3cgdGhlIGlucHV0LiBJZiB3ZSB3YW50IHRvIHBvc2l0aW9uIGl0IGFib3ZlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQsIHdlIGFkZCB0aGUgZHJvcHVwIGNsYXNzLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3ModGhpcy5jb3VudHJ5TGlzdCwgXCJpdGlfX2NvdW50cnktbGlzdC0tZHJvcHVwXCIsICFkcm9wZG93bkZpdHNCZWxvdyAmJiBkcm9wZG93bkZpdHNBYm92ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkcm9wZG93bkNvbnRhaW5lciBpcyBlbmFibGVkLCBjYWxjdWxhdGUgcG9zdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kcm9wZG93bkNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQgdGhlIGRyb3Bkb3duIHdpbGwgYmUgZGlyZWN0bHkgb3ZlciB0aGUgaW5wdXQgYmVjYXVzZSBpdCdzIG5vdCBpbiB0aGUgZmxvdy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB3YW50IHRvIHBvc2l0aW9uIGl0IGJlbG93LCB3ZSBuZWVkIHRvIGFkZCBzb21lIGV4dHJhIHRvcCB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0cmFUb3AgPSAhZHJvcGRvd25GaXRzQmVsb3cgJiYgZHJvcGRvd25GaXRzQWJvdmUgPyAwIDogdGhpcy50ZWxJbnB1dC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHBsYWNlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uc3R5bGUudG9wID0gXCJcIi5jb25jYXQoaW5wdXRUb3AgKyBleHRyYVRvcCwgXCJweFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQgPSBcIlwiLmNvbmNhdChwb3MubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCwgXCJweFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBtZW51IG9uIHdpbmRvdyBzY3JvbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVXaW5kb3dTY3JvbGwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzOC5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdGhpcy5faGFuZGxlV2luZG93U2Nyb2xsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2dldENsb3Nlc3RMaXN0SXRlbVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0Q2xvc2VzdExpc3RJdGVtKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gdGhpcy5jb3VudHJ5TGlzdCAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwiaXRpX19jb3VudHJ5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhY2hlZCB0aGUgY291bnRyeUxpc3QgZWxlbWVudCwgdGhlbiByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwgPT09IHRoaXMuY291bnRyeUxpc3QgPyBudWxsIDogZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfYmluZERyb3Bkb3duTGlzdGVuZXJzXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9iaW5kRHJvcGRvd25MaXN0ZW5lcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIG1vdXNlIG92ZXIgYSBsaXN0IGl0ZW0sIGp1c3QgaGlnaGxpZ2h0IHRoYXQgb25lXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFkZCB0aGUgY2xhc3MgXCJoaWdobGlnaHRcIiwgc28gaWYgdGhleSBoaXQgXCJlbnRlclwiIHdlIGtub3cgd2hpY2ggb25lIHRvIHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVNb3VzZW92ZXJDb3VudHJ5TGlzdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBldmVudCBkZWxlZ2F0aW9uLCBhcyB3ZSdyZSBsaXN0ZW5pbmcgZm9yIHRoaXMgZXZlbnQgb24gdGhlIGNvdW50cnlMaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdEl0ZW0gPSBfdGhpczkuX2dldENsb3Nlc3RMaXN0SXRlbShlLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdEl0ZW0pIF90aGlzOS5faGlnaGxpZ2h0TGlzdEl0ZW0obGlzdEl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5TGlzdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIHRoaXMuX2hhbmRsZU1vdXNlb3ZlckNvdW50cnlMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBjb3VudHJ5IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDbGlja0NvdW50cnlMaXN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtID0gX3RoaXM5Ll9nZXRDbG9zZXN0TGlzdEl0ZW0oZS50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtKSBfdGhpczkuX3NlbGVjdExpc3RJdGVtKGxpc3RJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudHJ5TGlzdC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQ2xpY2tDb3VudHJ5TGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsaWNrIG9mZiB0byBjbG9zZVxuICAgICAgICAgICAgICAgICAgICAvLyAoZXhjZXB0IHdoZW4gdGhpcyBpbml0aWFsIG9wZW5pbmcgY2xpY2sgaXMgYnViYmxpbmcgdXApXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBqdXN0IHN0b3BQcm9wYWdhdGlvbiBhcyBpdCBtYXkgYmUgbmVlZGVkIHRvIGNsb3NlIGFub3RoZXIgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlzT3BlbmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUNsaWNrT2ZmVG9DbG9zZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc09wZW5pbmcpIF90aGlzOS5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNPcGVuaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlQ2xpY2tPZmZUb0Nsb3NlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciB1cC9kb3duIHNjcm9sbGluZywgZW50ZXIgdG8gc2VsZWN0LCBvciBsZXR0ZXJzIHRvIGp1bXAgdG8gY291bnRyeSBuYW1lLlxuICAgICAgICAgICAgICAgICAgICAvLyB1c2Uga2V5ZG93biBhcyBrZXlwcmVzcyBkb2Vzbid0IGZpcmUgZm9yIG5vbi1jaGFyIGtleXMgYW5kIHdlIHdhbnQgdG8gY2F0Y2ggaWYgdGhleVxuICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGhpdCBkb3duIGFuZCBob2xkIGl0IHRvIHNjcm9sbCBkb3duIChubyBrZXl1cCBldmVudCkuXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBvbiB0aGUgZG9jdW1lbnQgYmVjYXVzZSB0aGF0J3Mgd2hlcmUga2V5IGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGlmIG5vIGlucHV0IGhhcyBmb2N1c1xuICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnkgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlUaW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUtleWRvd25PbkRyb3Bkb3duID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBkb3duIGtleSBmcm9tIHNjcm9sbGluZyB0aGUgd2hvbGUgcGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBlbnRlciBrZXkgZnJvbSBzdWJtaXR0aW5nIGEgZm9ybSBldGNcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwIGFuZCBkb3duIHRvIG5hdmlnYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiIHx8IGUua2V5ID09PSBcIlVwXCIgfHwgZS5rZXkgPT09IFwiQXJyb3dEb3duXCIgfHwgZS5rZXkgPT09IFwiRG93blwiKSBfdGhpczkuX2hhbmRsZVVwRG93bktleShlLmtleSk7IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIF90aGlzOS5faGFuZGxlRW50ZXJLZXkoKTsgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIF90aGlzOS5fY2xvc2VEcm9wZG93bigpOyBlbHNlIGlmICgvXlthLXpBLVrDgC3Dv9CwLdGP0JAt0K8gXSQvLnRlc3QoZS5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVtcCB0byBjb3VudHJpZXMgdGhhdCBzdGFydCB3aXRoIHRoZSBxdWVyeSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlUaW1lcikgY2xlYXJUaW1lb3V0KHF1ZXJ5VGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ICs9IGUua2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXM5Ll9zZWFyY2hGb3JDb3VudHJ5KHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGltZXIgaGl0cyAxIHNlY29uZCwgcmVzZXQgdGhlIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxZTMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLl9oYW5kbGVLZXlkb3duT25Ecm9wZG93bik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaGFuZGxlVXBEb3duS2V5XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9oYW5kbGVVcERvd25LZXkoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0ga2V5ID09PSBcIkFycm93VXBcIiB8fCBrZXkgPT09IFwiVXBcIiA/IHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgOiB0aGlzLmhpZ2hsaWdodGVkSXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHRoZSBkaXZpZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5jbGFzc0xpc3QuY29udGFpbnMoXCJpdGlfX2RpdmlkZXJcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0ga2V5ID09PSBcIkFycm93VXBcIiB8fCBrZXkgPT09IFwiVXBcIiA/IG5leHQucHJldmlvdXNFbGVtZW50U2libGluZyA6IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlnaGxpZ2h0TGlzdEl0ZW0obmV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9oYW5kbGVFbnRlcktleVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlRW50ZXJLZXkoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVkSXRlbSkgdGhpcy5fc2VsZWN0TGlzdEl0ZW0odGhpcy5oaWdobGlnaHRlZEl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3NlYXJjaEZvckNvdW50cnlcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NlYXJjaEZvckNvdW50cnkocXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvdW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0c1dpdGgodGhpcy5jb3VudHJpZXNbaV0ubmFtZSwgcXVlcnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RJdGVtID0gdGhpcy5jb3VudHJ5TGlzdC5xdWVyeVNlbGVjdG9yKFwiI2l0aS1pdGVtLVwiLmNvbmNhdCh0aGlzLmNvdW50cmllc1tpXS5pc28yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGhpZ2hsaWdodGluZyBhbmQgc2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlnaGxpZ2h0TGlzdEl0ZW0obGlzdEl0ZW0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUbyhsaXN0SXRlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9zdGFydHNXaXRoXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zdGFydHNXaXRoKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuc3Vic3RyKDAsIGIubGVuZ3RoKS50b0xvd2VyQ2FzZSgpID09PSBiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3VwZGF0ZVZhbEZyb21OdW1iZXJcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVZhbEZyb21OdW1iZXIob3JpZ2luYWxOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlciA9IG9yaWdpbmFsTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdE9uRGlzcGxheSAmJiB3aW5kb3cuaW50bFRlbElucHV0VXRpbHMgJiYgdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXNlTmF0aW9uYWwgPSAhdGhpcy5vcHRpb25zLnNlcGFyYXRlRGlhbENvZGUgJiYgKHRoaXMub3B0aW9ucy5uYXRpb25hbE1vZGUgfHwgbnVtYmVyLmNoYXJBdCgwKSAhPT0gXCIrXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9pbnRsVGVsSW5wdXRVdGlscyRudSA9IGludGxUZWxJbnB1dFV0aWxzLm51bWJlckZvcm1hdCwgTkFUSU9OQUwgPSBfaW50bFRlbElucHV0VXRpbHMkbnUuTkFUSU9OQUwsIElOVEVSTkFUSU9OQUwgPSBfaW50bFRlbElucHV0VXRpbHMkbnUuSU5URVJOQVRJT05BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXQgPSB1c2VOYXRpb25hbCA/IE5BVElPTkFMIDogSU5URVJOQVRJT05BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IGludGxUZWxJbnB1dFV0aWxzLmZvcm1hdE51bWJlcihudW1iZXIsIHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yLCBmb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG51bWJlciA9IHRoaXMuX2JlZm9yZVNldE51bWJlcihudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0LnZhbHVlID0gbnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX3VwZGF0ZUZsYWdGcm9tTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVGbGFnRnJvbU51bWJlcihvcmlnaW5hbE51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBpbiBuYXRpb25hbE1vZGUgYW5kIHdlIGFscmVhZHkgaGF2ZSBVUy9DYW5hZGEgc2VsZWN0ZWQsIG1ha2Ugc3VyZSB0aGUgbnVtYmVyIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgKzEgc28gX2dldERpYWxDb2RlIHdpbGwgYmUgYWJsZSB0byBleHRyYWN0IHRoZSBhcmVhIGNvZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlOiBpZiB3ZSBkb250IHlldCBoYXZlIHNlbGVjdGVkQ291bnRyeURhdGEsIGJ1dCB3ZSdyZSBoZXJlICh0cnlpbmcgdG8gdXBkYXRlIHRoZSBmbGFnXG4gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIG51bWJlciksIHRoYXQgbWVhbnMgd2UncmUgaW5pdGlhbGlzaW5nIHRoZSBwbHVnaW4gd2l0aCBhIG51bWJlciB0aGF0IGFscmVhZHkgaGFzIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gZGlhbCBjb2RlLCBzbyBmaW5lIHRvIGlnbm9yZSB0aGlzIGJpdFxuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtYmVyID0gb3JpZ2luYWxOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZERpYWxDb2RlID0gdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmRpYWxDb2RlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNOYW5wID0gc2VsZWN0ZWREaWFsQ29kZSA9PT0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIgJiYgdGhpcy5vcHRpb25zLm5hdGlvbmFsTW9kZSAmJiBpc05hbnAgJiYgbnVtYmVyLmNoYXJBdCgwKSAhPT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1iZXIuY2hhckF0KDApICE9PSBcIjFcIikgbnVtYmVyID0gXCIxXCIuY29uY2F0KG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBcIitcIi5jb25jYXQobnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZmxhZyBpZiB1c2VyIHR5cGVzIGFyZWEgY29kZSBmb3IgYW5vdGhlciBjb3VudHJ5XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VwYXJhdGVEaWFsQ29kZSAmJiBzZWxlY3RlZERpYWxDb2RlICYmIG51bWJlci5jaGFyQXQoMCkgIT09IFwiK1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgPSBcIitcIi5jb25jYXQoc2VsZWN0ZWREaWFsQ29kZSkuY29uY2F0KG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGFuZCBleHRyYWN0IHZhbGlkIGRpYWwgY29kZSBmcm9tIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFsQ29kZSA9IHRoaXMuX2dldERpYWxDb2RlKG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIHZhciBudW1lcmljID0gdGhpcy5fZ2V0TnVtZXJpYyhudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNvZGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHJ5Q29kZXMgPSB0aGlzLmNvdW50cnlDb2Rlc1t0aGlzLl9nZXROdW1lcmljKGRpYWxDb2RlKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcmlnaHQgY291bnRyeSBpcyBhbHJlYWR5IHNlbGVjdGVkLiB0aGlzIHNob3VsZCBiZSBmYWxzZSBpZiB0aGUgbnVtYmVyIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb25nZXIgdGhhbiB0aGUgbWF0Y2hlZCBkaWFsIGNvZGUgYmVjYXVzZSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIGNvdW50cnkgbWF0Y2hlcywgdGhhdCB0aGUgZmlyc3Qgb25lIGlzIHNlbGVjdGVkIChub3RlOiB3ZSBjb3VsZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBjaGVjayB0aGF0IGhlcmUsIGJ1dCBpdCByZXF1aXJlcyB0aGUgc2FtZSBsb29wIHRoYXQgd2UgYWxyZWFkeSBoYXZlIGxhdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFscmVhZHlTZWxlY3RlZCA9IGNvdW50cnlDb2Rlcy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yKSAhPT0gLTEgJiYgbnVtZXJpYy5sZW5ndGggPD0gZGlhbENvZGUubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1JlZ2lvbmxlc3NOYW5wTnVtYmVyID0gc2VsZWN0ZWREaWFsQ29kZSA9PT0gXCIxXCIgJiYgdGhpcy5faXNSZWdpb25sZXNzTmFucChudW1lcmljKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIHRoZSBmbGFnIGlmOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSkgTk9UICh3ZSBjdXJyZW50bHkgaGF2ZSBhIE5BTlAgZmxhZyBzZWxlY3RlZCwgYW5kIHRoZSBudW1iZXIgaXMgYSByZWdpb25sZXNzTmFucClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQikgdGhlIHJpZ2h0IGNvdW50cnkgaXMgbm90IGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNSZWdpb25sZXNzTmFucE51bWJlciAmJiAhYWxyZWFkeVNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgb25seUNvdW50cmllcyBvcHRpb24sIGNvdW50cnlDb2Rlc1swXSBtYXkgYmUgZW1wdHksIHNvIHdlIG11c3QgZmluZCB0aGUgZmlyc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tZW1wdHkgaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNvdW50cnlDb2Rlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRyeUNvZGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZSA9IGNvdW50cnlDb2Rlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bWJlci5jaGFyQXQoMCkgPT09IFwiK1wiICYmIG51bWVyaWMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGRpYWwgY29kZSwgc28gZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVzZSBnZXROdW1lcmljIGhlcmUgYmVjYXVzZSB0aGUgbnVtYmVyIGhhcyBub3QgYmVlbiBmb3JtYXR0ZWQgeWV0LCBzbyBjb3VsZCBjb250YWluXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWQgY2hhcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbnVtYmVyIHx8IG51bWJlciA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5LCBvciBqdXN0IGEgcGx1cywgc28gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGUgPSB0aGlzLmRlZmF1bHRDb3VudHJ5O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldEZsYWcoY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9pc1JlZ2lvbmxlc3NOYW5wXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1JlZ2lvbmxlc3NOYW5wKG51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtZXJpYyA9IHRoaXMuX2dldE51bWVyaWMobnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWVyaWMuY2hhckF0KDApID09PSBcIjFcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZWFDb2RlID0gbnVtZXJpYy5zdWJzdHIoMSwgMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVnaW9ubGVzc05hbnBOdW1iZXJzLmluZGV4T2YoYXJlYUNvZGUpICE9PSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfaGlnaGxpZ2h0TGlzdEl0ZW1cIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2hpZ2hsaWdodExpc3RJdGVtKGxpc3RJdGVtLCBzaG91bGRGb2N1cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJldkl0ZW0gPSB0aGlzLmhpZ2hsaWdodGVkSXRlbTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtKSBwcmV2SXRlbS5jbGFzc0xpc3QucmVtb3ZlKFwiaXRpX19oaWdobGlnaHRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtID0gbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtLmNsYXNzTGlzdC5hZGQoXCJpdGlfX2hpZ2hsaWdodFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZEZvY3VzKSB0aGlzLmhpZ2hsaWdodGVkSXRlbS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2dldENvdW50cnlEYXRhXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRDb3VudHJ5RGF0YShjb3VudHJ5Q29kZSwgaWdub3JlT25seUNvdW50cmllc09wdGlvbiwgYWxsb3dGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHJ5TGlzdCA9IGlnbm9yZU9ubHlDb3VudHJpZXNPcHRpb24gPyBhbGxDb3VudHJpZXMgOiB0aGlzLmNvdW50cmllcztcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudHJ5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlMaXN0W2ldLmlzbzIgPT09IGNvdW50cnlDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cnlMaXN0W2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd0ZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvdW50cnkgZGF0YSBmb3IgJ1wiLmNvbmNhdChjb3VudHJ5Q29kZSwgXCInXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9zZXRGbGFnXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRGbGFnKGNvdW50cnlDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcmV2Q291bnRyeSA9IHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yID8gdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhIDoge307XG4gICAgICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgZmlyc3QgYXMgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciBhbmQgc3RvcCBpZiBjb3VudHJ5Q29kZSBpcyBpbnZhbGlkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YSA9IGNvdW50cnlDb2RlID8gdGhpcy5fZ2V0Q291bnRyeURhdGEoY291bnRyeUNvZGUsIGZhbHNlLCBmYWxzZSkgOiB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWZhdWx0Q291bnRyeSAtIHdlIG9ubHkgbmVlZCB0aGUgaXNvMiBmcm9tIG5vdyBvbiwgc28ganVzdCBzdG9yZSB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuaXNvMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q291bnRyeSA9IHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbGFnSW5uZXIuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgXCJpdGlfX2ZsYWcgaXRpX19cIi5jb25jYXQoY291bnRyeUNvZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBzZWxlY3RlZCBjb3VudHJ5J3MgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IGNvdW50cnlDb2RlID8gXCJcIi5jb25jYXQodGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLm5hbWUsIFwiOiArXCIpLmNvbmNhdCh0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuZGlhbENvZGUpIDogXCJVbmtub3duXCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbGFnLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIHRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXBhcmF0ZURpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlhbENvZGUgPSB0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuZGlhbENvZGUgPyBcIitcIi5jb25jYXQodGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmRpYWxDb2RlKSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGlhbENvZGUuaW5uZXJIVE1MID0gZGlhbENvZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXRXaWR0aCBpcyB6ZXJvIGlmIGlucHV0IGlzIGluIGEgaGlkZGVuIGNvbnRhaW5lciBkdXJpbmcgaW5pdGlhbGlzYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEZsYWdXaWR0aCA9IHRoaXMuc2VsZWN0ZWRGbGFnLm9mZnNldFdpZHRoIHx8IHRoaXMuX2dldEhpZGRlblNlbGVjdGVkRmxhZ1dpZHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgNnB4IG9mIHBhZGRpbmcgYWZ0ZXIgdGhlIGdyZXkgc2VsZWN0ZWQtZGlhbC1jb2RlIGJveCwgYXMgdGhpcyBpcyB3aGF0IHdlIHVzZSBpbiB0aGUgY3NzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0LnN0eWxlLnBhZGRpbmdMZWZ0ID0gXCJcIi5jb25jYXQoc2VsZWN0ZWRGbGFnV2lkdGggKyA2LCBcInB4XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW5wdXQncyBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFjdGl2ZSBsaXN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldkl0ZW0gPSB0aGlzLmFjdGl2ZUl0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SXRlbS5jbGFzc0xpc3QucmVtb3ZlKFwiaXRpX19hY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkl0ZW0uc2V0QXR0cmlidXRlKFwiYXJpYS1zZWxlY3RlZFwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50cnlDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRJdGVtID0gdGhpcy5jb3VudHJ5TGlzdC5xdWVyeVNlbGVjdG9yKFwiI2l0aS1pdGVtLVwiLmNvbmNhdChjb3VudHJ5Q29kZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtLnNldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIiwgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtLmNsYXNzTGlzdC5hZGQoXCJpdGlfX2FjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUl0ZW0gPSBuZXh0SXRlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxhZy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgbmV4dEl0ZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBpZiB0aGUgZmxhZyBoYXMgY2hhbmdlZCBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZDb3VudHJ5LmlzbzIgIT09IGNvdW50cnlDb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2dldEhpZGRlblNlbGVjdGVkRmxhZ1dpZHRoXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRIaWRkZW5TZWxlY3RlZEZsYWdXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSByaWdodCBzdHlsaW5nIHRvIGFwcGx5LCBhbGwgd2UgbmVlZCBpcyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhlIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZW4gdG8gaW5qZWN0IGEgZGVlcCBjbG9uZSBvZiB0aGUgc2VsZWN0ZWRGbGFnIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckNsb25lID0gdGhpcy50ZWxJbnB1dC5wYXJlbnROb2RlLmNsb25lTm9kZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDbG9uZS5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXJDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEZsYWdDbG9uZSA9IHRoaXMuc2VsZWN0ZWRGbGFnLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQ2xvbmUuYXBwZW5kQ2hpbGQoc2VsZWN0ZWRGbGFnQ2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBzZWxlY3RlZEZsYWdDbG9uZS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQ2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXJDbG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl91cGRhdGVQbGFjZWhvbGRlclwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlUGxhY2Vob2xkZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzaG91bGRTZXRQbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5hdXRvUGxhY2Vob2xkZXIgPT09IFwiYWdncmVzc2l2ZVwiIHx8ICF0aGlzLmhhZEluaXRpYWxQbGFjZWhvbGRlciAmJiB0aGlzLm9wdGlvbnMuYXV0b1BsYWNlaG9sZGVyID09PSBcInBvbGl0ZVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dFV0aWxzICYmIHNob3VsZFNldFBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtYmVyVHlwZSA9IGludGxUZWxJbnB1dFV0aWxzLm51bWJlclR5cGVbdGhpcy5vcHRpb25zLnBsYWNlaG9sZGVyTnVtYmVyVHlwZV07XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxhY2Vob2xkZXIgPSB0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuaXNvMiA/IGludGxUZWxJbnB1dFV0aWxzLmdldEV4YW1wbGVOdW1iZXIodGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmlzbzIsIHRoaXMub3B0aW9ucy5uYXRpb25hbE1vZGUsIG51bWJlclR5cGUpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5fYmVmb3JlU2V0TnVtYmVyKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmN1c3RvbVBsYWNlaG9sZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMub3B0aW9ucy5jdXN0b21QbGFjZWhvbGRlcihwbGFjZWhvbGRlciwgdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQuc2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiwgcGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfc2VsZWN0TGlzdEl0ZW1cIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3NlbGVjdExpc3RJdGVtKGxpc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZWxlY3RlZCBmbGFnIGFuZCBhY3RpdmUgbGlzdCBpdGVtXG4gICAgICAgICAgICAgICAgICAgIHZhciBmbGFnQ2hhbmdlZCA9IHRoaXMuX3NldEZsYWcobGlzdEl0ZW0uZ2V0QXR0cmlidXRlKFwiZGF0YS1jb3VudHJ5LWNvZGVcIikpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpYWxDb2RlKGxpc3RJdGVtLmdldEF0dHJpYnV0ZShcImRhdGEtZGlhbC1jb2RlXCIpLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9jdXMgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHV0IGN1cnNvciBhdCBlbmQgLSB0aGlzIGZpeCBpcyByZXF1aXJlZCBmb3IgRkYgYW5kIElFMTEgKHdpdGggbmF0aW9uYWxNb2RlPWZhbHNlIGkuZS4gYXV0b1xuICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnRpbmcgZGlhbCBjb2RlKSwgd2hvIHRyeSB0byBwdXQgdGhlIGN1cnNvciBhdCB0aGUgYmVnaW5uaW5nIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSB0aGlzLnRlbElucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShsZW4sIGxlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFnQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckNvdW50cnlDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2Nsb3NlRHJvcGRvd25cIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2Nsb3NlRHJvcGRvd24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRyeUxpc3QuY2xhc3NMaXN0LmFkZChcIml0aV9faGlkZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZsYWcuc2V0QXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiLCBcImZhbHNlXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGFycm93XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25BcnJvdy5jbGFzc0xpc3QucmVtb3ZlKFwiaXRpX19hcnJvdy0tdXBcIik7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuYmluZCBrZXkgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuX2hhbmRsZUtleWRvd25PbkRyb3Bkb3duKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9oYW5kbGVDbGlja09mZlRvQ2xvc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlMaXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgdGhpcy5faGFuZGxlTW91c2VvdmVyQ291bnRyeUxpc3QpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50cnlMaXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLl9oYW5kbGVDbGlja0NvdW50cnlMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG1lbnUgZnJvbSBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kcm9wZG93bkNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTW9iaWxlKSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLl9oYW5kbGVXaW5kb3dTY3JvbGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24ucGFyZW50Tm9kZSkgdGhpcy5kcm9wZG93bi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJjbG9zZTpjb3VudHJ5ZHJvcGRvd25cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfc2Nyb2xsVG9cIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbFRvKGVsZW1lbnQsIG1pZGRsZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb3VudHJ5TGlzdDtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93VG9wIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0Mzg0MDkxLzIxNzg2NlxuICAgICAgICAgICAgICAgICAgICB2YXIgd2luZG93VG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyVG9wID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvd1RvcDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lckJvdHRvbSA9IGNvbnRhaW5lclRvcCArIGNvbnRhaW5lckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRUb3AgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvd1RvcDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRCb3R0b20gPSBlbGVtZW50VG9wICsgZWxlbWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1Njcm9sbFRvcCA9IGVsZW1lbnRUb3AgLSBjb250YWluZXJUb3AgKyBjb250YWluZXIuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWlkZGxlT2Zmc2V0ID0gY29udGFpbmVySGVpZ2h0IC8gMiAtIGVsZW1lbnRIZWlnaHQgLyAyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvcCA8IGNvbnRhaW5lclRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIHVwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlkZGxlKSBuZXdTY3JvbGxUb3AgLT0gbWlkZGxlT2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IG5ld1Njcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Qm90dG9tID4gY29udGFpbmVyQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzY3JvbGwgZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pZGRsZSkgbmV3U2Nyb2xsVG9wICs9IG1pZGRsZU9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHREaWZmZXJlbmNlID0gY29udGFpbmVySGVpZ2h0IC0gZWxlbWVudEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBuZXdTY3JvbGxUb3AgLSBoZWlnaHREaWZmZXJlbmNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfdXBkYXRlRGlhbENvZGVcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZURpYWxDb2RlKG5ld0RpYWxDb2RlQmFyZSwgaGFzU2VsZWN0ZWRMaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXRWYWwgPSB0aGlzLnRlbElucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGhhdmluZyB0byBwYXNzIHRoaXMgZXZlcnkgdGltZVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3RGlhbENvZGUgPSBcIitcIi5jb25jYXQobmV3RGlhbENvZGVCYXJlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld051bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VmFsLmNoYXJBdCgwKSA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBwbHVzIHNvIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIHJlcGxhY2VtZW50IChkb2Vzbid0IG1hdHRlciBpZiBuYXRpb25hbE1vZGUgb3Igbm90KVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZEaWFsQ29kZSA9IHRoaXMuX2dldERpYWxDb2RlKGlucHV0VmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2RGlhbENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG51bWJlciBjb250YWlucyBhIHZhbGlkIGRpYWwgY29kZSwgc28gcmVwbGFjZSBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlciA9IGlucHV0VmFsLnJlcGxhY2UocHJldkRpYWxDb2RlLCBuZXdEaWFsQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbnVtYmVyIGNvbnRhaW5zIGFuIGludmFsaWQgZGlhbCBjb2RlLCBzbyBkaXRjaCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChubyB3YXkgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBpbnZhbGlkIGRpYWwgY29kZSBlbmRzIGFuZCB0aGUgcmVzdCBvZiB0aGUgbnVtYmVyIGJlZ2lucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOdW1iZXIgPSBuZXdEaWFsQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMubmF0aW9uYWxNb2RlIHx8IHRoaXMub3B0aW9ucy5zZXBhcmF0ZURpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmF0aW9uYWxNb2RlIGlzIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbiBleGlzdGluZyB2YWx1ZSB3aXRoIG5vIGRpYWwgY29kZTogcHJlZml4IHRoZSBuZXcgZGlhbCBjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TnVtYmVyID0gbmV3RGlhbENvZGUgKyBpbnB1dFZhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzU2VsZWN0ZWRMaXN0SXRlbSB8fCAhdGhpcy5vcHRpb25zLmF1dG9IaWRlRGlhbENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBleGlzdGluZyB2YWx1ZSBhbmQgZWl0aGVyIHRoZXkndmUganVzdCBzZWxlY3RlZCBhIGxpc3QgaXRlbSwgb3IgYXV0b0hpZGVEaWFsQ29kZSBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkOiBpbnNlcnQgbmV3IGRpYWwgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld051bWJlciA9IG5ld0RpYWxDb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC52YWx1ZSA9IG5ld051bWJlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl9nZXREaWFsQ29kZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0RGlhbENvZGUobnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkaWFsQ29kZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBpbnRlcm5hdGlvbmFsIG51bWJlcnMgKHN0YXJ0aW5nIHdpdGggYSBwbHVzKVxuICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyLmNoYXJBdCgwKSA9PT0gXCIrXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1lcmljQ2hhcnMgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGNoYXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbnVtYmVyLmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjaGFyIGlzIG51bWJlciAoaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzg5MzU2NDkvMjE3ODY2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4ocGFyc2VJbnQoYywgMTApKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljQ2hhcnMgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3VycmVudCBudW1lcmljQ2hhcnMgbWFrZSBhIHZhbGlkIGRpYWwgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb3VudHJ5Q29kZXNbbnVtZXJpY0NoYXJzXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGFjdHVhbCByYXcgc3RyaW5nICh1c2VmdWwgZm9yIG1hdGNoaW5nIGxhdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbENvZGUgPSBudW1iZXIuc3Vic3RyKDAsIGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtZXJpY0NoYXJzLmxlbmd0aCA9PT0gdGhpcy5kaWFsQ29kZU1heExlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpYWxDb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiX2dldEZ1bGxOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEZ1bGxOdW1iZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnRlbElucHV0LnZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRpYWxDb2RlID0gdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmRpYWxDb2RlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtZXJpY1ZhbCA9IHRoaXMuX2dldE51bWVyaWModmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXBhcmF0ZURpYWxDb2RlICYmIHZhbC5jaGFyQXQoMCkgIT09IFwiK1wiICYmIGRpYWxDb2RlICYmIG51bWVyaWNWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgc2VwYXJhdGVEaWFsQ29kZSwgaXQgaXMgdmlzaWJsZSBzbyBpcyBlZmZlY3RpdmVseSBwYXJ0IG9mIHRoZSB0eXBlZCBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiK1wiLmNvbmNhdChkaWFsQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJfYmVmb3JlU2V0TnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9iZWZvcmVTZXROdW1iZXIob3JpZ2luYWxOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG51bWJlciA9IG9yaWdpbmFsTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlcGFyYXRlRGlhbENvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWFsQ29kZSA9IHRoaXMuX2dldERpYWxDb2RlKG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIHZhbGlkIGRpYWwgY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBfZ2V0RGlhbENvZGUgcmV0dXJuZWQgYW4gYXJlYSBjb2RlIGFzIHdlbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsQ29kZSA9IFwiK1wiLmNvbmNhdCh0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuZGlhbENvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbG90IG9mIG51bWJlcnMgd2lsbCBoYXZlIGEgc3BhY2Ugc2VwYXJhdGluZyB0aGUgZGlhbCBjb2RlIGFuZCB0aGUgbWFpbiBudW1iZXIsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgTkFOUCBudW1iZXJzIHdpbGwgaGF2ZSBhIGh5cGhlbiBlLmcuICsxIDY4NC03MzMtMTIzNCAtIGluIGJvdGggY2FzZXMgd2Ugd2FudCB0byBnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWQgb2YgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBkb24ndCBqdXN0IHRyaW0gYWxsIG5vbi1udW1lcmljcyBhcyBtYXkgd2FudCB0byBwcmVzZXJ2ZSBhbiBvcGVuIHBhcmVudGhlc2lzIGV0Y1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IG51bWJlcltkaWFsQ29kZS5sZW5ndGhdID09PSBcIiBcIiB8fCBudW1iZXJbZGlhbENvZGUubGVuZ3RoXSA9PT0gXCItXCIgPyBkaWFsQ29kZS5sZW5ndGggKyAxIDogZGlhbENvZGUubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciA9IG51bWJlci5zdWJzdHIoc3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYXAobnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcIl90cmlnZ2VyQ291bnRyeUNoYW5nZVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfdHJpZ2dlckNvdW50cnlDaGFuZ2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJjb3VudHJ5Y2hhbmdlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiaGFuZGxlQXV0b0NvdW50cnlcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlQXV0b0NvdW50cnkoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW5pdGlhbENvdW50cnkgPT09IFwiYXV0b1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IHNldCB0aGlzIGV2ZW4gaWYgdGhlcmUgaXMgYW4gaW5pdGlhbCB2YWwgaW4gdGhlIGlucHV0OiBpbiBjYXNlIHRoZSBpbml0aWFsIHZhbCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW52YWxpZCBhbmQgdGhleSBkZWxldGUgaXQgLSB0aGV5IHNob3VsZCBzZWUgdGhlaXIgYXV0byBjb3VudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRDb3VudHJ5ID0gd2luZG93LmludGxUZWxJbnB1dEdsb2JhbHMuYXV0b0NvdW50cnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIG5vIGluaXRpYWwgdmFsdWUgaW4gdGhlIGlucHV0LCB0aGVuIHVwZGF0ZSB0aGUgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRlbElucHV0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDb3VudHJ5KHRoaXMuZGVmYXVsdENvdW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlQXV0b0NvdW50cnlQcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImhhbmRsZVV0aWxzXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVV0aWxzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bFxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dFV0aWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGFuIGluaXRpYWwgdmFsdWUgaW4gdGhlIGlucHV0LCB0aGVuIGZvcm1hdCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGVsSW5wdXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVWYWxGcm9tTnVtYmVyKHRoaXMudGVsSW5wdXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGxhY2Vob2xkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVVdGlsc1NjcmlwdFByb21pc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImRlc3Ryb3lcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm0gPSB0aGlzLnRlbElucHV0LmZvcm07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxsb3dEcm9wZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkcm9wZG93biBpcyBjbG9zZWQgKGFuZCB1bmJpbmQgbGlzdGVuZXJzKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZsYWcucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuX2hhbmRsZUNsaWNrU2VsZWN0ZWRGbGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxhZ3NDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5faGFuZGxlRmxhZ3NDb250YWluZXJLZXlkb3duKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhYmVsIGNsaWNrIGhhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IHRoaXMuX2dldENsb3Nlc3RMYWJlbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsKSBsYWJlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5faGFuZGxlTGFiZWxDbGljayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gdW5iaW5kIGhpZGRlbklucHV0IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRkZW5JbnB1dCAmJiBmb3JtKSBmb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzdWJtaXRcIiwgdGhpcy5faGFuZGxlSGlkZGVuSW5wdXRTdWJtaXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyB1bmJpbmQgYXV0b0hpZGVEaWFsQ29kZSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvSGlkZURpYWxDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkgZm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuX2hhbmRsZVN1Ym1pdE9yQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgdGhpcy5faGFuZGxlU3VibWl0T3JCbHVyRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHVuYmluZCBrZXkgZXZlbnRzLCBhbmQgY3V0L3Bhc3RlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbElucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLl9oYW5kbGVLZXl1cEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY3V0XCIsIHRoaXMuX2hhbmRsZUNsaXBib2FyZEV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZWxJbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKFwicGFzdGVcIiwgdGhpcy5faGFuZGxlQ2xpcGJvYXJkRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXR0cmlidXRlIG9mIGlkIGluc3RhbmNlOiBkYXRhLWludGwtdGVsLWlucHV0LWlkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVsSW5wdXQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbnRsLXRlbC1pbnB1dC1pZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG1hcmt1cCAoYnV0IGxlYXZlIHRoZSBvcmlnaW5hbCBpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSB0aGlzLnRlbElucHV0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy50ZWxJbnB1dCwgd3JhcHBlcik7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh3cmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLmluc3RhbmNlc1t0aGlzLmlkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAga2V5OiBcImdldEV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRFeHRlbnNpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0VXRpbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRsVGVsSW5wdXRVdGlscy5nZXRFeHRlbnNpb24odGhpcy5fZ2V0RnVsbE51bWJlcigpLCB0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEuaXNvMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJnZXROdW1iZXJcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TnVtYmVyKGZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dFV0aWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNvMiA9IHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGxUZWxJbnB1dFV0aWxzLmZvcm1hdE51bWJlcih0aGlzLl9nZXRGdWxsTnVtYmVyKCksIGlzbzIsIGZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJnZXROdW1iZXJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldE51bWJlclR5cGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaW50bFRlbElucHV0VXRpbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnRsVGVsSW5wdXRVdGlscy5nZXROdW1iZXJUeXBlKHRoaXMuX2dldEZ1bGxOdW1iZXIoKSwgdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmlzbzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtOTk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJnZXRTZWxlY3RlZENvdW50cnlEYXRhXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlbGVjdGVkQ291bnRyeURhdGEoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkQ291bnRyeURhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJnZXRWYWxpZGF0aW9uRXJyb3JcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbkVycm9yKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmludGxUZWxJbnB1dFV0aWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNvMiA9IHRoaXMuc2VsZWN0ZWRDb3VudHJ5RGF0YS5pc28yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGxUZWxJbnB1dFV0aWxzLmdldFZhbGlkYXRpb25FcnJvcih0aGlzLl9nZXRGdWxsTnVtYmVyKCksIGlzbzIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtOTk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJpc1ZhbGlkTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmFsaWROdW1iZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLl9nZXRGdWxsTnVtYmVyKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNvZGUgPSB0aGlzLm9wdGlvbnMubmF0aW9uYWxNb2RlID8gdGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmlzbzIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmludGxUZWxJbnB1dFV0aWxzID8gaW50bFRlbElucHV0VXRpbHMuaXNWYWxpZE51bWJlcih2YWwsIGNvdW50cnlDb2RlKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJzZXRDb3VudHJ5XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvdW50cnkob3JpZ2luYWxDb3VudHJ5Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNvZGUgPSBvcmlnaW5hbENvdW50cnlDb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFscmVhZHkgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmxhZ0lubmVyLmNsYXNzTGlzdC5jb250YWlucyhcIml0aV9fXCIuY29uY2F0KGNvdW50cnlDb2RlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldEZsYWcoY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRGlhbENvZGUodGhpcy5zZWxlY3RlZENvdW50cnlEYXRhLmRpYWxDb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ291bnRyeUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIGtleTogXCJzZXROdW1iZXJcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TnVtYmVyKG51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IHVwZGF0ZSB0aGUgZmxhZyBmaXJzdCwgd2hpY2ggdXBkYXRlcyB0aGlzLnNlbGVjdGVkQ291bnRyeURhdGEsIHdoaWNoIGlzIHVzZWQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdHRpbmcgdGhlIG51bWJlciBiZWZvcmUgZGlzcGxheWluZyBpdFxuICAgICAgICAgICAgICAgICAgICB2YXIgZmxhZ0NoYW5nZWQgPSB0aGlzLl91cGRhdGVGbGFnRnJvbU51bWJlcihudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVWYWxGcm9tTnVtYmVyKG51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmbGFnQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckNvdW50cnlDaGFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwic2V0UGxhY2Vob2xkZXJOdW1iZXJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyTnVtYmVyVHlwZSh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlck51bWJlclR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gXSk7XG4gICAgICAgICAgICByZXR1cm4gSXRpO1xuICAgICAgICB9KCk7XG4gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKlxuICogIFNUQVRJQyBNRVRIT0RTXG4gKioqKioqKioqKioqKioqKioqKiovXG4gICAgICAgIC8vIGdldCB0aGUgY291bnRyeSBkYXRhIG9iamVjdFxuICAgICAgICBpbnRsVGVsSW5wdXRHbG9iYWxzLmdldENvdW50cnlEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsQ291bnRyaWVzO1xuICAgICAgICB9O1xuICAgICAgICAvLyBpbmplY3QgYSA8c2NyaXB0PiBlbGVtZW50IHRvIGxvYWQgdXRpbHMuanNcbiAgICAgICAgdmFyIGluamVjdFNjcmlwdCA9IGZ1bmN0aW9uIGluamVjdFNjcmlwdChwYXRoLCBoYW5kbGVTdWNjZXNzLCBoYW5kbGVGYWlsdXJlKSB7XG4gICAgICAgICAgICAvLyBpbmplY3QgYSBuZXcgc2NyaXB0IGVsZW1lbnQgaW50byB0aGUgcGFnZVxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZm9yRWFjaEluc3RhbmNlKFwiaGFuZGxlVXRpbHNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZVN1Y2Nlc3MpIGhhbmRsZVN1Y2Nlc3MoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGZvckVhY2hJbnN0YW5jZShcInJlamVjdFV0aWxzU2NyaXB0UHJvbWlzZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlRmFpbHVyZSkgaGFuZGxlRmFpbHVyZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNjcmlwdC5jbGFzc05hbWUgPSBcIml0aS1sb2FkLXV0aWxzXCI7XG4gICAgICAgICAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHBhdGg7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGxvYWQgdGhlIHV0aWxzIHNjcmlwdFxuICAgICAgICBpbnRsVGVsSW5wdXRHbG9iYWxzLmxvYWRVdGlscyA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgICAgICAgICAgIC8vIDIgb3B0aW9uczpcbiAgICAgICAgICAgIC8vIDEpIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgbG9hZGluZyAoc3RhcnQpXG4gICAgICAgICAgICAvLyAyKSBhbHJlYWR5IHN0YXJ0ZWQgbG9hZGluZyAoZG8gbm90aGluZyAtIGp1c3Qgd2FpdCBmb3IgdGhlIG9ubG9hZCBjYWxsYmFjayB0byBmaXJlLCB3aGljaCB3aWxsXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGhhbmRsZVV0aWxzIG9uIGFsbCBpbnN0YW5jZXMsIGludm9raW5nIHRoZWlyIHJlc29sdmVVdGlsc1NjcmlwdFByb21pc2UgZnVuY3Rpb25zKVxuICAgICAgICAgICAgaWYgKCF3aW5kb3cuaW50bFRlbElucHV0VXRpbHMgJiYgIXdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLnN0YXJ0ZWRMb2FkaW5nVXRpbHNTY3JpcHQpIHtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGRvIHRoaXMgb25jZVxuICAgICAgICAgICAgICAgIHdpbmRvdy5pbnRsVGVsSW5wdXRHbG9iYWxzLnN0YXJ0ZWRMb2FkaW5nVXRpbHNTY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgcHJvbWlzZXMsIHRoZW4gcmV0dXJuIGEgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5qZWN0U2NyaXB0KHBhdGgsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmplY3RTY3JpcHQocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVmYXVsdCBvcHRpb25zXG4gICAgICAgIGludGxUZWxJbnB1dEdsb2JhbHMuZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICAgICAgLy8gdmVyc2lvblxuICAgICAgICBpbnRsVGVsSW5wdXRHbG9iYWxzLnZlcnNpb24gPSBcIjE2LjEuMFwiO1xuICAgICAgICAvLyBjb252ZW5pZW5jZSB3cmFwcGVyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCwgb3B0aW9ucykge1xuICAgICAgICAgICAgdmFyIGl0aSA9IG5ldyBJdGkoaW5wdXQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgaXRpLl9pbml0KCk7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWludGwtdGVsLWlucHV0LWlkXCIsIGl0aS5pZCk7XG4gICAgICAgICAgICB3aW5kb3cuaW50bFRlbElucHV0R2xvYmFscy5pbnN0YW5jZXNbaXRpLmlkXSA9IGl0aTtcbiAgICAgICAgICAgIHJldHVybiBpdGk7XG4gICAgICAgIH07XG4gICAgfSgpO1xufSk7IiwiLyoqXG4gKiBFeHBvc2luZyBpbnRsLXRlbC1pbnB1dCBhcyBhIGNvbXBvbmVudFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuL2J1aWxkL2pzL2ludGxUZWxJbnB1dFwiKTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCJ2YXIgbmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzL2Jyb3dzZXIuanMnKS5uZXh0VGljaztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpbW1lZGlhdGVJZHMgPSB7fTtcbnZhciBuZXh0SW1tZWRpYXRlSWQgPSAwO1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkgeyB0aW1lb3V0LmNsb3NlKCk7IH07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gVGhhdCdzIG5vdCBob3cgbm9kZS5qcyBpbXBsZW1lbnRzIGl0IGJ1dCB0aGUgZXhwb3NlZCBhcGkgaXMgdGhlIHNhbWUuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHNldEltbWVkaWF0ZSA6IGZ1bmN0aW9uKGZuKSB7XG4gIHZhciBpZCA9IG5leHRJbW1lZGlhdGVJZCsrO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZmFsc2UgOiBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgaW1tZWRpYXRlSWRzW2lkXSA9IHRydWU7XG5cbiAgbmV4dFRpY2soZnVuY3Rpb24gb25OZXh0VGljaygpIHtcbiAgICBpZiAoaW1tZWRpYXRlSWRzW2lkXSkge1xuICAgICAgLy8gZm4uY2FsbCgpIGlzIGZhc3RlciBzbyB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiB1c2UtY2FzZVxuICAgICAgLy8gQHNlZSBodHRwOi8vanNwZXJmLmNvbS9jYWxsLWFwcGx5LXNlZ3VcbiAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4uY2FsbChudWxsKTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXZlbnQgaWRzIGZyb20gbGVha2luZ1xuICAgICAgZXhwb3J0cy5jbGVhckltbWVkaWF0ZShpZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWQ7XG59O1xuXG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gdHlwZW9mIGNsZWFySW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBjbGVhckltbWVkaWF0ZSA6IGZ1bmN0aW9uKGlkKSB7XG4gIGRlbGV0ZSBpbW1lZGlhdGVJZHNbaWRdO1xufTsiLCJpbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgRmlsZUZpZWxkRWxlbWVudCB9IGZyb20gJy4vZWxlbWVudHMvRmlsZUZpZWxkL0ZpbGVGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IEFycmF5VXRpbCBmcm9tICcuL2ZyYW1ld29yay9VdGlsaXRpZXMvQXJyYXlVdGlsJztcbmltcG9ydCBNYWtlUmVxdWVzdCBmcm9tICcuL2ZyYW1ld29yay9VdGlsaXRpZXMvTWFrZVJlcXVlc3QnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tRm9ybSB7XG5cdGFjdGlvbjogc3RyaW5nO1xuXHRtZXRob2Q6IHN0cmluZztcblx0X25hdGl2ZUlucHV0czogSFRNTElucHV0RWxlbWVudFtdO1xuXG5cdHB1YmxpYyBvbnN1Ym1pdDogKCh0aGlzOiBDdXN0b21Gb3JtLCBwcm9taXNlOiBQcm9taXNlPGFueT4pID0+IGFueSkgfCBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybTogSFRNTEZvcm1FbGVtZW50KSB7XG5cdFx0dGhpcy5hY3Rpb24gPSBmb3JtLmFjdGlvbiB8fCAnJztcblx0XHR0aGlzLm1ldGhvZCA9IGZvcm0ubWV0aG9kIHx8ICdnZXQnO1xuXHRcdHRoaXMuYXR0YWNoRm9ybSgpO1xuXHRcdHRoaXMuYmluR3JvdXBzVG9EZXBlbmRlbmN5KCk7XG5cdH1cblxuXHRnZXQgaW5wdXRzKCk6IEN1c3RvbUlucHV0RWxlbWVudFtdIHtcblx0XHRyZXR1cm4gQXJyYXlVdGlsLkZyb21Ob2RlTGlzdCh0aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnLmdyb3VwLWNvbnRhaW5lcjpub3QoW2hpZGRlbl0pIFtjdXN0b20taW5wdXRdOm5vdChbaGlkZGVuXSknKSk7XG5cdH1cblx0Z2V0IG5hdGl2ZUlucHV0cygpOiBIVE1MSW5wdXRFbGVtZW50W10ge1xuXHRcdHRoaXMuX25hdGl2ZUlucHV0cyA9XG5cdFx0XHR0aGlzLl9uYXRpdmVJbnB1dHMgfHxcblx0XHRcdEFycmF5VXRpbC5Gcm9tTm9kZUxpc3QodGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0JykpO1xuXHRcdHJldHVybiB0aGlzLl9uYXRpdmVJbnB1dHM7XG5cdH1cblxuXHRnZXQgaGFzRmlsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuaW5wdXRzLnNvbWUoaW5wdXQgPT4gaW5wdXQgaW5zdGFuY2VvZiBGaWxlRmllbGRFbGVtZW50KTtcblx0fVxuXG5cdGF0dGFjaEZvcm0oKSB7XG5cdFx0dGhpcy5mb3JtLm9uc3VibWl0ID0gZXZlbnQgPT4ge1xuXHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGxldCB2YWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcblx0XHRcdGlmICh2YWxpZCkge1xuXHRcdFx0XHRpZiAodGhpcy5vbnN1Ym1pdCkge1xuXHRcdFx0XHRcdHRoaXMub25zdWJtaXQodGhpcy5zdWJtaXQoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0dmFsaWRhdGUoKTogYm9vbGVhbiB7XG5cdFx0dGhpcy5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiAoPEN1c3RvbUlucHV0RWxlbWVudD5pbnB1dCkudmFsaWRhdGUoKSk7XG5cdFx0cmV0dXJuIHRoaXMuaW5wdXRzLmV2ZXJ5KGlucHV0ID0+ICg8Q3VzdG9tSW5wdXRFbGVtZW50PmlucHV0KS52YWxpZCk7XG5cdH1cblxuXHRzdWJtaXQoKTogUHJvbWlzZTxhbnk+IHtcblx0XHRsZXQgZm9ybURhdGEgPSB7fTtcblx0XHRjb25zdCBoZWFkZXJzOiBhbnkgPSB7fTtcblx0XHR0aGlzLmlucHV0cy5tYXAoaSA9PiAoZm9ybURhdGFbaS5uYW1lXSA9IGkudmFsdWUpKTtcblx0XHRmb3JtRGF0YSA9IHRoaXMuZXh0cmFjdERhdGEoKTtcblx0XHRyZXR1cm4gbmV3IE1ha2VSZXF1ZXN0KHRoaXMuYWN0aW9uLCB0aGlzLm1ldGhvZCwgaGVhZGVycykuc2VuZChcblx0XHRcdGZvcm1EYXRhLFxuXHRcdCk7XG5cdH1cblx0cHJpdmF0ZSBleHRyYWN0RGF0YSgpOiBGb3JtRGF0YSB7XG5cdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cdFx0Zm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cykge1xuXHRcdFx0aWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUZpZWxkRWxlbWVudCkge1xuXHRcdFx0XHRmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgaW5wdXQudmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmlsZSA9IGlucHV0LnZhbHVlW2luZGV4XTtcblx0XHRcdFx0XHRmb3JtRGF0YS5hcHBlbmQoaW5wdXQubmFtZSwgZmlsZSwgZmlsZS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9ybURhdGEuYXBwZW5kKGBWYWx1ZXNbJHtpbnB1dC5uYW1lfV1gLCBpbnB1dC52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgaW5wdXQgb2YgdGhpcy5uYXRpdmVJbnB1dHMpIHtcblx0XHRcdGlmIChpbnB1dC5uYW1lKSB7XG5cdFx0XHRcdGZvcm1EYXRhLmFwcGVuZChpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmb3JtRGF0YTtcblx0fVxuXG5cdHByaXZhdGUgYmluR3JvdXBzVG9EZXBlbmRlbmN5KCkge1xuXHRcdGxldCBncm91cENvbnRhaW5lcnMgPSB0aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnZGl2Lmdyb3VwLWNvbnRhaW5lcjpub3QoW2RhdGEtZGVwZW5kcy1vbj1cIlwiXSknLFxuXHRcdCk7XG5cdFx0Z3JvdXBDb250YWluZXJzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG5cdFx0XHRsZXQgZGVwZW5kZW50RmllbGQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZXBlbmRzLW9uJyk7XG5cdFx0XHRsZXQgZGVwZW5kZW50VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1kZXBlbmRlbnQtdmFsdWUnKTtcblx0XHRcdGxldCBjdXN0b21FbGVtZW50OiBDdXN0b21JbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5mb3Jtc1swXS5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cIiR7ZGVwZW5kZW50RmllbGR9XCJdYCkgYXMgQ3VzdG9tSW5wdXRFbGVtZW50O1xuXHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJcIik7XG5cdFx0XHRjdXN0b21FbGVtZW50Lm9uQ2hhbmdlLm9uKGV2ZW50ID0+IHtcblx0XHRcdFx0aWYgKGV2ZW50LnZhbHVlID09PSBkZXBlbmRlbnRWYWx1ZSB8fCBldmVudC52YWx1ZS5pbmRleE9mKGRlcGVuZGVudFZhbHVlKSA+PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5zaG93R3JvdXBBbmRJdHNEZXBlbmRlbmNpZXMoZWxlbWVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5oaWRlR3JvdXBBbmRJdHNEZXBlbmRlbmNpZXMoZWxlbWVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBoaWRlR3JvdXBBbmRJdHNEZXBlbmRlbmNpZXMoZ3JvdXA6IEVsZW1lbnQpIHtcblx0XHRjb25zdCBpbnB1dEVsZW1lbnRzSW5zaWRlR3JvdXAgPSB0aGlzLmlucHV0cy5maWx0ZXIoaW5wdXQgPT4gdGhpcy5pc0Rlc2NlbmRhbnQoZ3JvdXAsIGlucHV0KSk7XG5cdFx0Z3JvdXAuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwiXCIpO1xuXHRcdGxldCBncm91cENvbnRhaW5lcnMgPSB0aGlzLmZvcm0ucXVlcnlTZWxlY3RvckFsbCgnZGl2Lmdyb3VwLWNvbnRhaW5lcjpub3QoW2RhdGEtZGVwZW5kcy1vbj1cIlwiXSknKTtcblx0XHRncm91cENvbnRhaW5lcnMuZm9yRWFjaChvdGhlckdyb3VwID0+IHtcblx0XHRcdGlmIChvdGhlckdyb3VwICE9PSBncm91cCkge1xuXHRcdFx0XHRsZXQgZ3JvdXBEZXBlbmRzT25GaWVsZCA9IG90aGVyR3JvdXAuZ2V0QXR0cmlidXRlKCdkYXRhLWRlcGVuZHMtb24nKTtcblx0XHRcdFx0aW5wdXRFbGVtZW50c0luc2lkZUdyb3VwLmZvckVhY2goaW5wdXQgPT4ge1xuXHRcdFx0XHRcdGlmIChpbnB1dC5uYW1lID09PSBncm91cERlcGVuZHNPbkZpZWxkKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmhpZGVHcm91cEFuZEl0c0RlcGVuZGVuY2llcyhvdGhlckdyb3VwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdHByaXZhdGUgc2hvd0dyb3VwQW5kSXRzRGVwZW5kZW5jaWVzKGdyb3VwOiBFbGVtZW50KSB7XG5cdFx0Z3JvdXAucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuXHRcdGNvbnN0IGlucHV0RWxlbWVudHNJbnNpZGVHcm91cCA9IHRoaXMuaW5wdXRzLmZpbHRlcihpbnB1dCA9PiB0aGlzLmlzRGVzY2VuZGFudChncm91cCwgaW5wdXQpKTtcblx0XHRsZXQgZ3JvdXBDb250YWluZXJzID0gdGhpcy5mb3JtLnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5ncm91cC1jb250YWluZXI6bm90KFtkYXRhLWRlcGVuZHMtb249XCJcIl0pJyk7XG5cdFx0Z3JvdXBDb250YWluZXJzLmZvckVhY2gob3RoZXJHcm91cCA9PiB7XG5cdFx0XHRpZiAob3RoZXJHcm91cCAhPT0gZ3JvdXApIHtcblx0XHRcdFx0bGV0IGdyb3VwRGVwZW5kc09uRmllbGQgPSBvdGhlckdyb3VwLmdldEF0dHJpYnV0ZSgnZGF0YS1kZXBlbmRzLW9uJyk7XG5cdFx0XHRcdGxldCBkZXBlbmRlbnRWYWx1ZSA9IG90aGVyR3JvdXAuZ2V0QXR0cmlidXRlKCdkYXRhLWRlcGVuZGVudC12YWx1ZScpO1xuXHRcdFx0XHRpbnB1dEVsZW1lbnRzSW5zaWRlR3JvdXAuZm9yRWFjaChpbnB1dCA9PiB7XG5cdFx0XHRcdFx0aWYgKGlucHV0Lm5hbWUgPT09IGdyb3VwRGVwZW5kc09uRmllbGQgJiYgKGlucHV0LnZhbHVlID09PSBkZXBlbmRlbnRWYWx1ZSB8fCBpbnB1dC52YWx1ZS5pbmRleE9mKGRlcGVuZGVudFZhbHVlKSA+PSAwKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5zaG93R3JvdXBBbmRJdHNEZXBlbmRlbmNpZXMob3RoZXJHcm91cCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHRwcml2YXRlIGlzRGVzY2VuZGFudChwYXJlbnQ6IEVsZW1lbnQsIGNoaWxkOiBFbGVtZW50KSB7XG5cdFx0dmFyIG5vZGUgPSBjaGlsZC5wYXJlbnROb2RlO1xuXHRcdHdoaWxlIChub2RlICE9IG51bGwpIHtcblx0XHRcdGlmIChub2RlID09PSBwYXJlbnQpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRub2RlID0gbm9kZS5wYXJlbnRFbGVtZW50O1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCBUcmFuc2xhdG9yIGZyb20gJy4uLy4uL2ZyYW1ld29yay9MYW5ndWFnZS9UcmFuc2xhdG9yJztcbmltcG9ydCBnZXRBdHRyaWJ1dGVOYW1lc1BvbHlmaWxsIGZyb20gJy4uLy4uL2ZyYW1ld29yay9Qb2x5ZmlsbHMvZ2V0QXR0cmlidXRlTmFtZXNQb2x5ZmlsbCc7XG5pbXBvcnQgZGVib3VuY2VyIGZyb20gXCIuLi8uLi9mcmFtZXdvcmsvVXRpbGl0aWVzL2RlYm91bmNlclwiO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAnYWRkcmVzcy1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJhZGRyZXNzLXdyYXBwZXJcIj5cblx0XHRcdFx0PGlucHV0IGNsYXNzPSdhZGRyZXNzLXBhcnQnIGlkPSdhZGRyZXNzJyB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPSdBZGRyZXNzJy8+XG5cdFx0XHRcdDxpbnB1dCBjbGFzcz0nYWRkcmVzcy1wYXJ0JyBpZD0nemlwJyB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPSdaaXAnLz5cblx0XHRcdFx0PGlucHV0IGNsYXNzPSdhZGRyZXNzLXBhcnQnIGlkPSdjaXR5JyB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPSdDaXR5Jy8+XG5cdFx0XHRcdDxpbnB1dCBjbGFzcz0nYWRkcmVzcy1wYXJ0JyBpZD0nY291bnRyeScgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj0nQ291bnRyeScvPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGAuYWRkcmVzcy13cmFwcGVye1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRmbGV4LXdyYXA6IG5vd3JhcDtcblx0XHRcdH1cblx0XHRcdGlucHV0LmFkZHJlc3MtcGFydHtcblx0XHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdFx0Ym9yZGVyOiBub25lO1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNGZmO1xuXHRcdFx0XHRtYXJnaW46IDJweDtcblx0XHRcdFx0cmVzaXplOiBub25lO1xuXHRcdFx0XHR3aWR0aDozMyUgIWltcG9ydGFudDtcblx0XHRcdH1cblx0XHRgLFxuXHR0ZW1wbGF0ZVBhdGg6ICcuL2h0bWwuaHRtbCcsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQWRkcmVzc0VsZW1lbnQgZXh0ZW5kcyBDdXN0b21JbnB1dEVsZW1lbnQge1xuXHRwcml2YXRlIGF1dG9Db21wbGV0ZUVuYWJsZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBhZGRyZXNzQXV0b0NvbXBsZXRlOiBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlO1xuXHRwcml2YXRlIGdvb2dsZVBsYWNlc0xpYnJhcnlFbGVtZW50OiBIVE1MU2NyaXB0RWxlbWVudDtcblx0cHJpdmF0ZSBnb29nbGVQbGFjZXNBcGlLZXk6IHN0cmluZztcblxuXHRhZGRyZXNzOiBIVE1MSW5wdXRFbGVtZW50O1xuXHRjaXR5OiBIVE1MSW5wdXRFbGVtZW50O1xuXHRjb3VudHJ5OiBIVE1MSW5wdXRFbGVtZW50O1xuXHR6aXA6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0XHRnZXRBdHRyaWJ1dGVOYW1lc1BvbHlmaWxsKCk7XG5cdH1cblxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHtcblx0XHRsZXQgYWRkcmVzcyA9IHRoaXMuYWRkcmVzcy52YWx1ZSB8fCAnJztcblx0XHRsZXQgY2l0eSA9IHRoaXMuY2l0eS52YWx1ZSA/IGAsJHt0aGlzLmNpdHkudmFsdWV9YCA6ICcnO1xuXHRcdGxldCB6aXAgPSB0aGlzLnppcC52YWx1ZSA/IGAsJHt0aGlzLnppcC52YWx1ZX1gIDogJyc7XG5cdFx0bGV0IGNvdW50cnkgPSB0aGlzLmNvdW50cnkudmFsdWUgPyBgLCR7dGhpcy5jb3VudHJ5LnZhbHVlfWAgOiAnJztcblx0XHRyZXR1cm4gYCR7YWRkcmVzc30ke2NpdHl9JHt6aXB9JHtjb3VudHJ5fWA7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcsJyk7XG5cdFx0dGhpcy5hZGRyZXNzLnZhbHVlID0gdmFsdWVzWzBdO1xuXHRcdHRoaXMuY2l0eS52YWx1ZSA9IHZhbHVlc1sxXTtcblx0XHR0aGlzLmNvdW50cnkudmFsdWUgPSB2YWx1ZXNbMl07XG5cdFx0dGhpcy56aXAudmFsdWUgPSB2YWx1ZXNbM107XG5cdH1cblxuXHRnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuYWRkcmVzcy52YWxpZGl0eS52YWxpZCAmJlxuXHRcdFx0dGhpcy5jaXR5LnZhbGlkaXR5LnZhbGlkICYmXG5cdFx0XHR0aGlzLmNvdW50cnkudmFsaWRpdHkudmFsaWQgJiZcblx0XHRcdHRoaXMuemlwLnZhbGlkaXR5LnZhbGlkXG5cdFx0KTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdH1cblxuXHRjb21wb25lbnREaWRNb3VudCgpIHtcblx0XHR0aGlzLmluaXRDaGlsZElucHV0cygpO1xuXHRcdHRoaXMuZ2V0QXR0cmlidXRlTmFtZXMoKS5mb3JFYWNoKGF0dHJpYnV0ZU5hbWUgPT4ge1xuXHRcdFx0bGV0IGF0dHJpYnV0ZVZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cdFx0XHR0aGlzLmF0dHJpYnV0ZUNoYW5nZWQoYXR0cmlidXRlTmFtZSwgbnVsbCwgYXR0cmlidXRlVmFsdWUpO1xuXHRcdH0pO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMuYWRkcmVzcyA9IHN1cGVyLmdldENoaWxkSW5wdXQoJyNhZGRyZXNzJyk7XG5cdFx0dGhpcy5jaXR5ID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI2NpdHknKTtcblx0XHR0aGlzLmNvdW50cnkgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjY291bnRyeScpO1xuXHRcdHRoaXMuemlwID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI3ppcCcpO1xuXHRcdGNvbnN0IGFkZHJlc3NDaGFuZURlYm91bmNlID0gZGVib3VuY2VyKHRoaXMuY2hhbmdlLmJpbmQodGhpcyksIDQwMCwgZmFsc2UpO1xuXHRcdHRoaXMuYWRkcmVzcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG5cdFx0XHRhZGRyZXNzQ2hhbmVEZWJvdW5jZSgpO1xuXHRcdH0pO1xuXHRcdHRoaXMuY2l0eS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmNoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmNvdW50cnkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy56aXAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0dGhpcy5hZGRyZXNzLnNldEF0dHJpYnV0ZSgncmVxdWlyZWQnLCAnJyk7XG5cdFx0XHR0aGlzLmNpdHkuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHRcdHRoaXMuY291bnRyeS5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkJywgJycpO1xuXHRcdFx0dGhpcy56aXAuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdH1cblxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG5cblx0Y2hhbmdlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xuXHRcdGlmICghdGhpcy5hZGRyZXNzIHx8ICF0aGlzLmNpdHkgfHwgIXRoaXMuY291bnRyeSB8fCAhdGhpcy56aXApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5hZGRyZXNzLnBsYWNlaG9sZGVyID0gVHJhbnNsYXRvci5UcmFuc2xhdGUoJ0FkZHJlc3NFbGVtZW50LkFkZHJlc3MnLCBsYW5ndWFnZSk7XG5cdFx0dGhpcy5jaXR5LnBsYWNlaG9sZGVyID0gVHJhbnNsYXRvci5UcmFuc2xhdGUoJ0FkZHJlc3NFbGVtZW50LkNpdHknLCBsYW5ndWFnZSk7XG5cdFx0dGhpcy5jb3VudHJ5LnBsYWNlaG9sZGVyID0gVHJhbnNsYXRvci5UcmFuc2xhdGUoJ0FkZHJlc3NFbGVtZW50LkNvdW50cnknLCBsYW5ndWFnZSk7XG5cdFx0dGhpcy56aXAucGxhY2Vob2xkZXIgPSBUcmFuc2xhdG9yLlRyYW5zbGF0ZSgnQWRkcmVzc0VsZW1lbnQuWmlwJywgbGFuZ3VhZ2UpO1xuXHR9XG5cblx0ZW5hYmxlQXV0b0NvbXBsZXRlKCkge1xuXHRcdGlmICghdGhpcy5nb29nbGVQbGFjZXNBcGlLZXkgfHwgdGhpcy5nb29nbGVQbGFjZXNBcGlLZXkudHJpbSgpID09PSAnJyB8fCAhdGhpcy5hdXRvQ29tcGxldGVFbmFibGVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMuZ29vZ2xlUGxhY2VzTGlicmFyeUVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxTY3JpcHRFbGVtZW50PihgW3NyYz1cImh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9JHt0aGlzLmdvb2dsZVBsYWNlc0FwaUtleX0mbGlicmFyaWVzPXBsYWNlc1wiXWApO1xuXHRcdGlmICh0aGlzLmdvb2dsZVBsYWNlc0xpYnJhcnlFbGVtZW50KSB7XG5cdFx0XHR0aGlzLmdvb2dsZVBsYWNlc0xpYnJhcnlFbGVtZW50QmluZExvYWQoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5nb29nbGVQbGFjZXNMaWJyYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuXHRcdHRoaXMuZ29vZ2xlUGxhY2VzTGlicmFyeUVsZW1lbnQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuXHRcdHRoaXMuZ29vZ2xlUGxhY2VzTGlicmFyeUVsZW1lbnQuc3JjID0gYGh0dHBzOi8vbWFwcy5nb29nbGVhcGlzLmNvbS9tYXBzL2FwaS9qcz9rZXk9JHt0aGlzLmdvb2dsZVBsYWNlc0FwaUtleX0mbGlicmFyaWVzPXBsYWNlc2A7XG5cdFx0d2luZG93LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5nb29nbGVQbGFjZXNMaWJyYXJ5RWxlbWVudCk7XG5cdFx0dGhpcy5nb29nbGVQbGFjZXNMaWJyYXJ5RWxlbWVudEJpbmRMb2FkKCk7XG5cdH1cblxuXHRwcml2YXRlIGdvb2dsZVBsYWNlc0xpYnJhcnlFbGVtZW50QmluZExvYWQoKSB7XG5cdFx0dGhpcy5nb29nbGVQbGFjZXNMaWJyYXJ5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuXHRcdFx0dGhpcy5iaW5kQXV0b0NvbXBsZXRlKCk7XG5cdFx0fSk7XG5cdH1cblxuXHRiaW5kQXV0b0NvbXBsZXRlKCk6IHZvaWQge1xuXHRcdHRoaXMuYWRkcmVzc0F1dG9Db21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKHRoaXMuYWRkcmVzcyk7XG5cdFx0dGhpcy5hZGRyZXNzQXV0b0NvbXBsZXRlLmFkZExpc3RlbmVyKFwicGxhY2VfY2hhbmdlZFwiLCB0aGlzLm9uQWRkcmVzc0NoYW5nZWRIYW5kbGVyLmJpbmQodGhpcykpO1xuXHR9XG5cblx0b25BZGRyZXNzQ2hhbmdlZEhhbmRsZXIoKSB7XG5cdFx0dGhpcy5jaXR5LnZhbHVlID0gJyc7XG5cdFx0dGhpcy5jb3VudHJ5LnZhbHVlID0gJyc7XG5cdFx0dGhpcy56aXAudmFsdWUgPSAnJztcblxuXHRcdGNvbnN0IHBsYWNlID0gdGhpcy5hZGRyZXNzQXV0b0NvbXBsZXRlLmdldFBsYWNlKCk7XG5cdFx0Y29uc29sZS5sb2cocGxhY2UpO1xuXHRcdGlmICghcGxhY2UuYWRkcmVzc19jb21wb25lbnRzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdFxuXHRcdHRoaXMuYWRkcmVzcy52YWx1ZSA9IHBsYWNlLm5hbWU7XG5cblx0XHRjb25zdCBjaXR5Q29tcG9uZW50cyA9IHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5maWx0ZXIoY29tcG9uZW50ID0+IHtcblx0XHRcdGNvbnN0IGNpdHlTeW5vbnltcyA9IFsnYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJywgJ2xvY2FsaXR5J107XG5cdFx0XHRjb25zdCBpc0NpdHlDb21wb25lbnQgPSBjaXR5U3lub255bXMuc29tZShjaXR5U3lub255bSA9PiBjb21wb25lbnQudHlwZXMuaW5kZXhPZihjaXR5U3lub255bSkgIT0gLTEpO1xuXHRcdFx0cmV0dXJuIGlzQ2l0eUNvbXBvbmVudDtcblx0XHR9KTtcblx0XHRpZiAoY2l0eUNvbXBvbmVudHMgJiYgY2l0eUNvbXBvbmVudHNbMF0pIHtcblx0XHRcdHRoaXMuY2l0eS52YWx1ZSA9IGNpdHlDb21wb25lbnRzW2NpdHlDb21wb25lbnRzLmxlbmd0aCAtIDFdLmxvbmdfbmFtZTtcblx0XHR9XG5cblx0XHRjb25zdCBjb3VudHJ5Q29tcG9uZW50cyA9IHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC50eXBlcy5pbmRleE9mKCdjb3VudHJ5JykgIT0gLTEpO1xuXHRcdGlmIChjb3VudHJ5Q29tcG9uZW50cyAmJiBjb3VudHJ5Q29tcG9uZW50c1swXSkge1xuXHRcdFx0dGhpcy5jb3VudHJ5LnZhbHVlID0gY291bnRyeUNvbXBvbmVudHNbY291bnRyeUNvbXBvbmVudHMubGVuZ3RoIC0gMV0ubG9uZ19uYW1lO1xuXHRcdH1cblxuXHRcdGNvbnN0IHppcENvbXBvbmVudHMgPSBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSAhPSAtMSk7XG5cdFx0aWYgKHppcENvbXBvbmVudHMgJiYgemlwQ29tcG9uZW50c1swXSkge1xuXHRcdFx0dGhpcy56aXAudmFsdWUgPSB6aXBDb21wb25lbnRzWzBdLmxvbmdfbmFtZTtcblx0XHR9XG5cdFx0dGhpcy5jaGFuZ2UobnVsbCk7XG5cdH1cblxuXHRzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcblx0XHRyZXR1cm4gWydsYW5ndWFnZScsICdnb29nbGUtcGxhY2VzLWtleScsICdlbmFibGUtYXV0by1jb21wbGV0ZSddO1xuXHR9XG5cdGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lOiBzdHJpbmcsIG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZykge1xuXHRcdHRoaXMuYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGRWYWwsIG5ld1ZhbCk7XG5cdH1cblx0cHJpdmF0ZSBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKSB7XG5cdFx0c3dpdGNoIChuYW1lKSB7XG5cdFx0XHRjYXNlICdsYW5ndWFnZSc6XG5cdFx0XHRcdHRoaXMuY2hhbmdlTGFuZ3VhZ2UobmV3VmFsKVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2dvb2dsZS1wbGFjZXMta2V5Jzpcblx0XHRcdFx0dGhpcy5nb29nbGVQbGFjZXNBcGlLZXkgPSBuZXdWYWw7XG5cdFx0XHRcdHRoaXMuZW5hYmxlQXV0b0NvbXBsZXRlKClcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdlbmFibGUtYXV0by1jb21wbGV0ZSc6XG5cdFx0XHRcdGlmIChuZXdWYWwgJiYgbmV3VmFsICE9ICdmYWxzZScpIHtcblx0XHRcdFx0XHR0aGlzLmF1dG9Db21wbGV0ZUVuYWJsZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuZW5hYmxlQXV0b0NvbXBsZXRlKClcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCBCYW5rQWNjb3VudFZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0JhbmtBY2NvdW50JztcbmltcG9ydCBCYW5rQWNjb3VudFJlZ2lzdHJhdGlvbk51bWJlclZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0JhbmtBY2NvdW50UmVnaXN0cmF0aW9uTnVtYmVyJztcbmltcG9ydCBUcmFuc2xhdG9yIGZyb20gJy4uLy4uL2ZyYW1ld29yay9MYW5ndWFnZS9UcmFuc2xhdG9yJztcblxuQEN1c3RvbUVsZW1lbnQoe1xuXHRzZWxlY3RvcjogJ2JhbmstZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD0ncmVnLW51bWJlci1maWVsZCcgcGxhY2Vob2xkZXI9J0JhbmsgQWNjb3VudCBSZWdpc3RyYXRpb24gTnVtYmVyJy8+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPSdhY2NvdW50LWZpZWxkJyBwbGFjZWhvbGRlcj0nQmFuayBBY2NvdW50Jy8+XG5cdFx0XHQ8L2Rpdj5gLFxuXHRzdHlsZTogYFxuICAgIDpob3N0e1xuICAgICAgICAgICAgd2lkdGg6MTAwJTtcbiAgICB9XG4gICAgLndyYXBwZXJ7XG4gICAgICAgICAgICBkaXNwbGF5OmZsZXg7XG4gICAgfVxuICAgIGlucHV0e1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNGZmO1xuICAgICAgICAgICAgbWFyZ2luOiAycHg7XG4gICAgICAgICAgICByZXNpemU6IG5vbmU7XG4gICAgfVxuICAgICAgICAgICBgLFxuXHR1c2VTaGFkb3c6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEJhbmtGaWVsZEVsZW1lbnQgZXh0ZW5kcyBDdXN0b21JbnB1dEVsZW1lbnQge1xuXHRhY2NvdW50OiBIVE1MSW5wdXRFbGVtZW50O1xuXHRyZWdOdW1iZXI6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdGJhbmtBY2NvdW50VmFsaWRhdG9yOiBCYW5rQWNjb3VudFZhbGlkYXRvciA9IG5ldyBCYW5rQWNjb3VudFZhbGlkYXRvcigpO1xuXHRyZWdOdW1iZXJWYWxpZGF0b3I6IEJhbmtBY2NvdW50UmVnaXN0cmF0aW9uTnVtYmVyVmFsaWRhdG9yID0gbmV3IEJhbmtBY2NvdW50UmVnaXN0cmF0aW9uTnVtYmVyVmFsaWRhdG9yKCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuXHRcdGxldCBhY2NvdW50ID0gdGhpcy5hY2NvdW50LnZhbHVlIHx8ICcnO1xuXHRcdGxldCByZWdOdW1iZXIgPSB0aGlzLnJlZ051bWJlci52YWx1ZSA/IGAsJHt0aGlzLnJlZ051bWJlci52YWx1ZX1gIDogJyc7XG5cdFx0cmV0dXJuIGAke2FjY291bnR9JHtyZWdOdW1iZXJ9YDtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gdmFsdWUuc3BsaXQoJywnKTtcblx0XHR0aGlzLmFjY291bnQudmFsdWUgPSB2YWx1ZXNbMF07XG5cdFx0dGhpcy5yZWdOdW1iZXIudmFsdWUgPSB2YWx1ZXNbMV07XG5cdH1cblxuXHRnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuYmFua0FjY291bnRWYWxpZGF0b3IuaXNTYXRpc2ZpZWRCeShcblx0XHRcdFx0dGhpcy5hY2NvdW50LnZhbHVlLFxuXHRcdFx0XHQhdGhpcy5yZXF1aXJlZCxcblx0XHRcdCkgJiZcblx0XHRcdHRoaXMucmVnTnVtYmVyVmFsaWRhdG9yLmlzU2F0aXNmaWVkQnkoXG5cdFx0XHRcdHRoaXMucmVnTnVtYmVyLnZhbHVlLFxuXHRcdFx0XHQhdGhpcy5yZXF1aXJlZCxcblx0XHRcdCkgJiZcblx0XHRcdHRoaXMuYWNjb3VudC52YWxpZGl0eS52YWxpZCAmJlxuXHRcdFx0dGhpcy5yZWdOdW1iZXIudmFsaWRpdHkudmFsaWRcblx0XHQpO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGNvbXBvbmVudERpZE1vdW50KCkge1xuXHRcdHRoaXMuaW5pdENoaWxkSW5wdXRzKCk7XG5cdFx0dGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpLmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG5cdFx0XHRsZXQgYXR0cmlidXRlVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdHRoaXMuYXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lLCBudWxsLCBhdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRjaGFuZ2VMYW5ndWFnZShsYW5ndWFnZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF0aGlzLmFjY291bnQgfHwgIXRoaXMucmVnTnVtYmVyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuYWNjb3VudC5wbGFjZWhvbGRlciA9IFRyYW5zbGF0b3IuVHJhbnNsYXRlKCdCYW5rRWxlbWVudC5BY2NvdW50JywgbGFuZ3VhZ2UpO1xuXHRcdHRoaXMucmVnTnVtYmVyLnBsYWNlaG9sZGVyID0gVHJhbnNsYXRvci5UcmFuc2xhdGUoJ0JhbmtFbGVtZW50LlJlZ2lzdHJhdGlvbk51bWJlcicsIGxhbmd1YWdlKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLmFjY291bnQgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjYWNjb3VudC1maWVsZCcpO1xuXHRcdHRoaXMucmVnTnVtYmVyID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI3JlZy1udW1iZXItZmllbGQnKTtcblx0XHR0aGlzLmFjY291bnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5yZWdOdW1iZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMuYWNjb3VudC5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkJywgJycpO1xuXHRcdFx0dGhpcy5yZWdOdW1iZXIuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdH1cblxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG5cblx0c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG5cdFx0cmV0dXJuIFsnbGFuZ3VhZ2UnXTtcblx0fVxuXHRhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZTogc3RyaW5nLCBvbGRWYWw6IHN0cmluZywgbmV3VmFsOiBzdHJpbmcpIHtcblx0XHR0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkVmFsLCBuZXdWYWwpO1xuXHR9XG5cdHByaXZhdGUgYXR0cmlidXRlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZykge1xuXHRcdHN3aXRjaCAobmFtZSkge1xuXHRcdFx0Y2FzZSAnbGFuZ3VhZ2UnOlxuXHRcdFx0XHR0aGlzLmNoYW5nZUxhbmd1YWdlKG5ld1ZhbClcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuaW1wb3J0IENwclZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0NQUic7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdjcHItZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD0nY3ByLWZpZWxkJyBwbGFjZWhvbGRlcj0nRERNTVlZLVNTU1MnLz5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ1BSRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdHRleHQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdHZhbGlkYXRvcjogQ3ByVmFsaWRhdG9yID0gbmV3IENwclZhbGlkYXRvcigpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYCR7dGhpcy50ZXh0LnZhbHVlfWA7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMudGV4dC52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZhbGlkYXRvci5pc1NhdGlzZmllZEJ5KHRoaXMudmFsdWUsICF0aGlzLnJlcXVpcmVkKTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdH1cblxuXHRpbml0Q2hpbGRJbnB1dHMoKSB7XG5cdFx0dGhpcy50ZXh0ID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI2Nwci1maWVsZCcpO1xuXHRcdHRoaXMudGV4dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmNoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0dGhpcy50ZXh0LnNldEF0dHJpYnV0ZSgncmVxdWlyZWQnLCAnJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCBDcHJWYWxpZGF0b3IgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL1ZhbGlkYXRpb24vVmFsaWRhdG9ycy9DUFInO1xuaW1wb3J0IEN2clZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0NWUic7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdjdnItZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD0nY3ZyLWZpZWxkJyBwbGFjZWhvbGRlcj0nU1NTU1NTU1MnLz5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ1ZSRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdHRleHQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdHZhbGlkYXRvcjogQ3ZyVmFsaWRhdG9yID0gbmV3IEN2clZhbGlkYXRvcigpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gYCR7dGhpcy50ZXh0LnZhbHVlfWA7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMudGV4dC52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnZhbGlkYXRvci5pc1NhdGlzZmllZEJ5KHRoaXMudmFsdWUsICF0aGlzLnJlcXVpcmVkKTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdH1cblxuXHRpbml0Q2hpbGRJbnB1dHMoKSB7XG5cdFx0dGhpcy50ZXh0ID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI2N2ci1maWVsZCcpO1xuXHRcdHRoaXMudGV4dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmNoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0dGhpcy50ZXh0LnNldEF0dHJpYnV0ZSgncmVxdWlyZWQnLCAnJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCB7IFN0cmluZ1V0aWwgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVXRpbGl0aWVzL1N0cmluZ1V0aWwnO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAnY2hlY2tib3gtZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcblx0XHRcdDpob3N0e1xuXHRcdFx0XHR3aWR0aDoxMDAlO1xuXHRcdFx0fVxuXHRcdFx0LmNoZWNrYm94IHtcblx0XHRcdFx0d2lkdGg6IGF1dG87XG5cdFx0XHRcdG1hcmdpbjogYXV0byAzcHg7XG5cdFx0XHRcdGNvbG9yOiByZ2JhKDcyLCA3MiwgNzIsIDAuNzUpO1xuXHRcdFx0XHRmb250LXNpemU6IDEzcHg7XG5cdFx0XHR9XG5cdFx0XHRpbnB1dFt0eXBlPSdjaGVja2JveCdde1xuXHRcdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0XHR3aWR0aDogYXV0byAhaW1wb3J0YW50O1xuXHRcdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG5cdFx0XHRcdG1hcmdpbjogMnB4O1xuXHRcdFx0XHRyZXNpemU6IG5vbmU7XG5cdFx0XHR9XG5cdFx0YCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDaGVja0JveEVsZW1lbnQgZXh0ZW5kcyBDdXN0b21JbnB1dEVsZW1lbnQge1xuXHRjaGVja2JveDogSFRNTElucHV0RWxlbWVudFtdO1xuXHRjaGVja2JveFRlbXBsYXRlID0gYFxuXHQ8ZGl2IGNsYXNzPSdjaGVja2JveCc+XG5cdFx0PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd7MH0nIHZhbHVlPVwiezF9XCIgaWQ9XCJ7Mn1cIi8+XG5cdFx0PGxhYmVsIGZvcj1cInsyfVwiPnsxfTwvbGFiZWw+XG5cdDwvZGl2PmA7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hlY2tib3guZmlsdGVyKGMgPT4gYy5jaGVja2VkKS5tYXAoYyA9PiBjLnZhbHVlKTtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZXM6IHN0cmluZ1tdKSB7XG5cdFx0Ly8gdGhpcy5jaGVja2JveC52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZS5sZW5ndGggPiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMuYWRkQ2hlY2tCb3hlcygpO1xuXHRcdHRoaXMuY2hlY2tib3ggPSBzdXBlci5nZXRDaGlsZElucHV0cyhgW25hbWU9JyR7dGhpcy5uYW1lfSddYCk7XG5cdFx0dGhpcy5jaGVja2JveC5mb3JFYWNoKGMgPT5cblx0XHRcdGMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkQ2hlY2tCb3hlcygpIHtcblx0XHRjb25zdCB3cmFwcGVyID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KCcud3JhcHBlcicpO1xuXHRcdHdyYXBwZXIuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR0aGlzLm9wdGlvbnMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcblx0XHRcdHdyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuXHRcdFx0XHQnYmVmb3JlZW5kJyxcblx0XHRcdFx0U3RyaW5nVXRpbC5TdHJpbmdGb3JtYXQoXG5cdFx0XHRcdFx0dGhpcy5jaGVja2JveFRlbXBsYXRlLFxuXHRcdFx0XHRcdHRoaXMubmFtZSxcblx0XHRcdFx0XHRlbGVtZW50LFxuXHRcdFx0XHRcdGAke3RoaXMubmFtZX0tJHtpbmRleH1gLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9KTtcblx0fVxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAncmVnZXgtZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD0ncmVnZXgtZmllbGQnLz5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVndWxhckV4cHJlc3Npb25FbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0dGV4dDogSFRNTElucHV0RWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGAke3RoaXMudGV4dC52YWx1ZX1gO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnRleHQudmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnZhbGlkaXR5LnZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLnRleHQgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjcmVnZXgtZmllbGQnKTtcblx0XHR0aGlzLnRleHQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMudGV4dC5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkJywgJycpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5jdXN0b21WYWx1ZSkge1xuXHRcdFx0dGhpcy50ZXh0LnNldEF0dHJpYnV0ZSgncGF0dGVybicsIHRoaXMuY3VzdG9tVmFsdWUpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGV2ZW50c1xuXHRwdWJsaWMgY2hhbmdlKCRldmVudCk6IHZvaWQge1xuXHRcdHRoaXMudG91Y2hlZCA9IHRydWU7XG5cdFx0dGhpcy5vbkNoYW5nZS5lbWl0KG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICdjaGFuZ2UnKSk7XG5cdH1cblxuXHRwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy52YWxpZDtcblx0XHR0aGlzLm9uVmFsaWRhdGUuZW1pdChcblx0XHRcdG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICd2YWxpZGF0ZScpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCBDdXN0b21FbGVtZW50IGZyb20gJy4uLy4uL2ZyYW1ld29yay9jdXN0b20tZWxlbWVudC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUlucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50RXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUV2ZW50cyc7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdkYXRlLWVsZW1lbnQnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdFx0PGlucHV0IHR5cGU9XCJkYXRlXCIgaWQ9J2RhdGUtZmllbGQnLz5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZUZpZWxkRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdGRhdGU6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmRhdGUudmFsdWU7XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMuZGF0ZS52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmRhdGUudmFsaWRpdHkudmFsaWQ7XG5cdH1cblxuXHRjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMuZGF0ZSA9IHN1cGVyLmdldENoaWxkSW5wdXQoJyNkYXRlLWZpZWxkJyk7XG5cdFx0dGhpcy5kYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR0aGlzLmRhdGUuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMubWF4KSB7XG5cdFx0XHR0aGlzLmRhdGUuc2V0QXR0cmlidXRlKCdtYXgnLCB0aGlzLm1heCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm1pbikge1xuXHRcdFx0dGhpcy5kYXRlLnNldEF0dHJpYnV0ZSgnbWluJywgdGhpcy5taW4pO1xuXHRcdH1cblx0fVxuXG5cdC8vIGV2ZW50c1xuXHRwdWJsaWMgY2hhbmdlKCRldmVudCk6IHZvaWQge1xuXHRcdHRoaXMudG91Y2hlZCA9IHRydWU7XG5cdFx0dGhpcy5vbkNoYW5nZS5lbWl0KG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICdjaGFuZ2UnKSk7XG5cdH1cblxuXHRwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy52YWxpZDtcblx0XHR0aGlzLm9uVmFsaWRhdGUuZW1pdChcblx0XHRcdG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICd2YWxpZGF0ZScpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCBDdXN0b21FbGVtZW50IGZyb20gJy4uLy4uL2ZyYW1ld29yay9jdXN0b20tZWxlbWVudC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUlucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50RXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUV2ZW50cyc7XG5pbXBvcnQgeyBTdHJpbmdVdGlsIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL1V0aWxpdGllcy9TdHJpbmdVdGlsJztcblxuQEN1c3RvbUVsZW1lbnQoe1xuXHRzZWxlY3RvcjogJ2Ryb3AtZG93bi1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICA8c2VsZWN0IGlkPSdzZWxlY3QtbGlzdCc+XG5cdFx0XHQgICA8b3B0aW9uIHNlbGVjdGVkIGRpc2FibGVkPi08L29wdGlvbj5cbiAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcbiAgICAgICAgICAgIDpob3N0e1xuICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAud3JhcHBlcntcbiAgICAgICAgICAgICAgICBkaXNwbGF5OmZsZXg7XG4gICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAucmFkaW8tYnV0dG9uIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG8gM3B4O1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgICAgICAgZmxleC1ncm93OiAwLjE7XG4gICAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxlY3R7XG4gICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNGZmO1xuICAgICAgICAgICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgYCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wRG93bkxpc3RFbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0c2VsZWN0OiBIVE1MSW5wdXRFbGVtZW50O1xuXHRvcHRpb25UZW1wbGF0ZSA9IGBcbiAgICA8b3B0aW9uIHZhbHVlPSd7MH0nPlxuICAgICAgIHsxfVxuICAgIDwvb3B0aW9uPmA7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBgJHt0aGlzLnNlbGVjdC52YWx1ZX1gO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnNlbGVjdC52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnNlbGVjdC52YWxpZGl0eS52YWxpZDtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdH1cblxuXHRpbml0Q2hpbGRJbnB1dHMoKSB7XG5cdFx0dGhpcy5zZWxlY3QgPSBzdXBlci5nZXRDaGlsZElucHV0KGAjc2VsZWN0LWxpc3RgKTtcblx0XHR0aGlzLmFkZE9wdGlvbnMoKTtcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0dGhpcy5zZWxlY3Quc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMubXVsdGkpIHtcblx0XHRcdHRoaXMuc2VsZWN0LnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnJyk7XG5cdFx0fVxuXHRcdHRoaXMuc2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRPcHRpb25zKCkge1xuXHRcdHRoaXMuc2VsZWN0LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0dGhpcy5vcHRpb25zLmZvckVhY2goKGVsZW1lbnQsIGluZGV4KSA9PiB7XG5cdFx0XHR0aGlzLnNlbGVjdC5pbnNlcnRBZGphY2VudEhUTUwoXG5cdFx0XHRcdCdiZWZvcmVlbmQnLFxuXHRcdFx0XHRTdHJpbmdVdGlsLlN0cmluZ0Zvcm1hdCh0aGlzLm9wdGlvblRlbXBsYXRlLCBlbGVtZW50LCBlbGVtZW50KSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQWRkcmVzc0VsZW1lbnQgfSBmcm9tICcuL0FkZHJlc3MvQWRkcmVzc0VsZW1lbnQnO1xuaW1wb3J0IHsgVGV4dEZpZWxkRWxlbWVudCB9IGZyb20gJy4vVGV4dEZpZWxkL1RleHRGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgRW1haWxGaWVsZEVsZW1lbnQgfSBmcm9tICcuL0VtYWlsRmllbGQvRW1haWxGaWVsZEVsZW1lbnQnO1xuaW1wb3J0IHsgQ2hlY2tCb3hFbGVtZW50IH0gZnJvbSAnLi9DaGVja0JveEVsZW1lbnQvQ2hlY2tCb3hFbGVtZW50JztcbmltcG9ydCB7IFJhZGlvQnV0dG9uR3JvdXBFbGVtZW50IH0gZnJvbSAnLi9SYWRpb0J1dHRvbkdyb3VwL1JhZGlvQnV0dG9uR3JvdXBFbGVtZW50JztcbmltcG9ydCB7IFRleHRBcmVhRWxlbWVudCB9IGZyb20gJy4vVGV4dEFyZWFFbGVtZW50L1RleHRBcmVhRWxlbWVudCc7XG5pbXBvcnQgeyBEcm9wRG93bkxpc3RFbGVtZW50IH0gZnJvbSAnLi9Ecm9wRG93bkxpc3QvRHJvcERvd25MaXN0RWxlbWVudCc7XG5pbXBvcnQgeyBGaWxlRmllbGRFbGVtZW50IH0gZnJvbSAnLi9GaWxlRmllbGQvRmlsZUZpZWxkRWxlbWVudCc7XG5pbXBvcnQgeyBOdW1lcmljRmllbGRFbGVtZW50IH0gZnJvbSAnLi9OdW1lcmljRmllbGQvTnVtZXJpY0ZpZWxkRWxlbWVudCc7XG5pbXBvcnQgeyBDdXN0b21SZWd1bGFyRXhwcmVzc2lvbkVsZW1lbnQgfSBmcm9tICcuL0N1c3RvbVJlZ3VsYXJFeHByZXNzaW9uL0N1c3RvbVJlZ3VsYXJFeHByZXNzaW9uRWxlbWVudCc7XG5pbXBvcnQgeyBEYXRlRmllbGRFbGVtZW50IH0gZnJvbSAnLi9EYXRlRmllbGQvRGF0ZUZpZWxkRWxlbWVudCc7XG5pbXBvcnQgeyBJbnRQaG9uZUZpZWxkRWxlbWVudCB9IGZyb20gJy4vSW50ZXJuYXRpb25hUGhvbmVOdW1iZXIvSW50ZXJuYXRpb25hUGhvbmVOdW1iZXJFbGVtZW50JztcbmltcG9ydCB7IENQUkVsZW1lbnQgfSBmcm9tICcuL0NQUkVsZW1lbnQvQ1BSRWxlbWVudCc7XG5pbXBvcnQgeyBDVlJFbGVtZW50IH0gZnJvbSAnLi9DVlJFbGVtZW50L0NWUkVsZW1lbnQnO1xuaW1wb3J0IHsgSWRlbnRpZmljYXRpb25FbGVtZW50IH0gZnJvbSAnLi9JZGVudGlmaWNhdGlvbkVsZW1lbnQvSWRlbnRpZmljYXRpb25FbGVtZW50JztcbmltcG9ydCB7IEJhbmtGaWVsZEVsZW1lbnQgfSBmcm9tICcuL0JhbmtGaWVsZC9CYW5rRmllbGRFbGVtZW50JztcbmltcG9ydCB7IFR5cGVBaGVhZEVsZW1lbnQgfSBmcm9tICcuL1R5cGVBaGVhZC9UeXBlQWhlYWRFbGVtZW50JztcblxuZXhwb3J0IHtcblx0QWRkcmVzc0VsZW1lbnQsXG5cdFRleHRGaWVsZEVsZW1lbnQsXG5cdEVtYWlsRmllbGRFbGVtZW50LFxuXHRDaGVja0JveEVsZW1lbnQsXG5cdFJhZGlvQnV0dG9uR3JvdXBFbGVtZW50LFxuXHRUZXh0QXJlYUVsZW1lbnQsXG5cdERyb3BEb3duTGlzdEVsZW1lbnQsXG5cdEZpbGVGaWVsZEVsZW1lbnQsXG5cdE51bWVyaWNGaWVsZEVsZW1lbnQsXG5cdEN1c3RvbVJlZ3VsYXJFeHByZXNzaW9uRWxlbWVudCxcblx0RGF0ZUZpZWxkRWxlbWVudCxcblx0SW50UGhvbmVGaWVsZEVsZW1lbnQsXG5cdENQUkVsZW1lbnQsXG5cdENWUkVsZW1lbnQsXG5cdElkZW50aWZpY2F0aW9uRWxlbWVudCxcblx0QmFua0ZpZWxkRWxlbWVudCxcblx0VHlwZUFoZWFkRWxlbWVudFxufTtcbiIsImltcG9ydCBDdXN0b21FbGVtZW50IGZyb20gJy4uLy4uL2ZyYW1ld29yay9jdXN0b20tZWxlbWVudC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUlucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50RXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUV2ZW50cyc7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdlbWFpbC1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPSdlbWFpbC1maWVsZCcvPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcbiAgICA6aG9zdHtcbiAgICAgICAgICAgIHdpZHRoOjEwMCU7XG4gICAgfVxuICAgIC53cmFwcGVye1xuICAgICAgICAgICAgZGlzcGxheTpmbGV4O1xuICAgIH1cbiAgICBpbnB1dHtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjRmZjtcbiAgICAgICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAgICAgcmVzaXplOiBub25lO1xuICAgIH1cbiAgICAgICAgICAgYCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBFbWFpbEZpZWxkRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdG1haWxSZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cChcblx0XHQvXihbYS16QS1aMC05w4bDmMOFw6bDuMOlXy4rLV0pK1xcQCgoW2EtekEtWjAtOcOGw5jDhcOmw7jDpS1dKStcXC4pKyhbYS16QS1aMC05w4bDmMOFw6bDuMOlXXsyLDR9KSskLyxcblx0KTtcblxuXHRlbWFpbDogSFRNTElucHV0RWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGAke3RoaXMuZW1haWwudmFsdWV9YDtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5lbWFpbC52YWx1ZSA9IHZhbHVlO1xuXHR9XG5cblx0Z2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhdHRlcm5WYWxpZCA9ICF0aGlzLnZhbHVlIHx8IHRoaXMubWFpbFJlZ2V4LnRlc3QodGhpcy52YWx1ZSk7XG5cdFx0cmV0dXJuIHRoaXMuZW1haWwudmFsaWRpdHkudmFsaWQgJiYgcGF0dGVyblZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0dGhpcy5pbml0Q2hpbGRJbnB1dHMoKTtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMuZW1haWwgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjZW1haWwtZmllbGQnKTtcblx0XHR0aGlzLmVtYWlsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR0aGlzLmVtYWlsLnNldEF0dHJpYnV0ZSgncmVxdWlyZWQnLCAnJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCBnZXRBdHRyaWJ1dGVOYW1lc1BvbHlmaWxsIGZyb20gJy4uLy4uL2ZyYW1ld29yay9Qb2x5ZmlsbHMvZ2V0QXR0cmlidXRlTmFtZXNQb2x5ZmlsbCc7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdmaWxlLWVsZW1lbnQnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdFx0PGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9J2ZpbGUtZmllbGQnIGFjY2VwdD1cImltYWdlLyosYXBwbGljYXRpb24vcGRmXCIvPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcbiAgICA6aG9zdHtcbiAgICAgICAgICAgIHdpZHRoOjEwMCU7XG4gICAgfVxuICAgIC53cmFwcGVye1xuICAgICAgICAgICAgZGlzcGxheTpmbGV4O1xuICAgIH1cbiAgICBpbnB1dHtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjRmZjtcbiAgICAgICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAgICAgcmVzaXplOiBub25lO1xuICAgIH1cbiAgICAgICAgICAgYCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlRmllbGRFbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0ZmlsZTogSFRNTElucHV0RWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHRcdGdldEF0dHJpYnV0ZU5hbWVzUG9seWZpbGwoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBGaWxlTGlzdCB7XG5cdFx0cmV0dXJuIHRoaXMuZmlsZS5maWxlcztcblx0fVxuXG5cdHNldCB2YWx1ZShmaWxlczogRmlsZUxpc3QpIHtcblx0XHR0aGlzLmZpbGUuZmlsZXMgPSBmaWxlcztcblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5maWxlLnZhbGlkaXR5LnZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0dGhpcy5pbml0Q2hpbGRJbnB1dHMoKTtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0Y29tcG9uZW50RGlkTW91bnQoKSB7XG5cdFx0dGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpLmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG5cdFx0XHRsZXQgYXR0cmlidXRlVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblx0XHRcdHRoaXMuYXR0cmlidXRlQ2hhbmdlZChhdHRyaWJ1dGVOYW1lLCBudWxsLCBhdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRpbml0Q2hpbGRJbnB1dHMoKSB7XG5cdFx0dGhpcy5maWxlID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI2ZpbGUtZmllbGQnKTtcblx0XHR0aGlzLmZpbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMuZmlsZS5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkJywgJycpO1xuXHRcdH1cblx0XHRpZiAodGhpcy5tdWx0aSkge1xuXHRcdFx0dGhpcy5maWxlLnNldEF0dHJpYnV0ZSgnbXVsdGlwbGUnLCAnJyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxuICAgIFxuICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lOiBzdHJpbmcsIG9sZFZhbDogc3RyaW5nLCBuZXdWYWw6IHN0cmluZykge1xuXHRcdHRoaXMuYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGRWYWwsIG5ld1ZhbCk7XG5cdH1cblx0cHJpdmF0ZSBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsOiBzdHJpbmcsIG5ld1ZhbDogc3RyaW5nKSB7XG5cdFx0c3dpdGNoIChuYW1lKSB7XG5cdFx0XHRjYXNlICdhY2NlcHQnOlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZS5hY2NlcHQgPSBuZXdWYWw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuaW1wb3J0IENwclZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0NQUic7XG5pbXBvcnQgSVZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9JVmFsaWRhdG9yLmludGVyZmFjZSc7XG5pbXBvcnQgQ3ZyVmFsaWRhdG9yIGZyb20gJy4uLy4uL2ZyYW1ld29yay9WYWxpZGF0aW9uL1ZhbGlkYXRvcnMvQ1ZSJztcbmltcG9ydCBCYW5rSWRTd2VkZW5WYWxpZGF0b3IgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL1ZhbGlkYXRpb24vVmFsaWRhdG9ycy9CYW5rSWRTd2VkZW4nO1xuaW1wb3J0IEJhbmtJZE5vcndheVZhbGlkYXRvciBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVmFsaWRhdGlvbi9WYWxpZGF0b3JzL0JhbmtJZE5vcndheSc7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICdpZC1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0naWQtdHlwZSc+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9J2N2cic+RGFuaXNoIENWUjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSdjcHInPkRhbmlzaCBDUFI8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0nc3dlJz5Td2VkZW4gQmFuayBJZDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSdub3InPk5vcndheSBCYW5rIElkPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPSdpZC1maWVsZCcgcGxhY2Vob2xkZXI9JycvPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcbiAgICA6aG9zdHtcbiAgICAgICAgICAgIHdpZHRoOjEwMCU7XG4gICAgfVxuICAgIC53cmFwcGVye1xuICAgICAgICAgICAgZGlzcGxheTpmbGV4O1xuICAgIH1cbiAgICBpbnB1dCwgc2VsZWN0e1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICB3aWR0aDogNzUlICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIHNlbGVjdHtcbiAgICAgICAgICAgIHdpZHRoOiAyNSUgIWltcG9ydGFudDtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgSWRlbnRpZmljYXRpb25FbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0dHlwZVNlbGVjdG9yOiBIVE1MSW5wdXRFbGVtZW50O1xuXHR0ZXh0OiBIVE1MSW5wdXRFbGVtZW50O1xuXG5cdHR5cGU6IHN0cmluZztcblx0dmFsaWRhdG9yczogeyBbaW5kZXg6IHN0cmluZ106IElWYWxpZGF0b3IgfSA9IHtcblx0XHRjcHI6IG5ldyBDcHJWYWxpZGF0b3IoKSxcblx0XHRjdnI6IG5ldyBDdnJWYWxpZGF0b3IoKSxcblx0XHRzd2U6IG5ldyBCYW5rSWRTd2VkZW5WYWxpZGF0b3IoKSxcblx0XHRub3I6IG5ldyBCYW5rSWROb3J3YXlWYWxpZGF0b3IoKSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGAke3RoaXMudGV4dC52YWx1ZX1gO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnRleHQudmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YWxpZGF0b3JzW3RoaXMudHlwZV0uaXNTYXRpc2ZpZWRCeShcblx0XHRcdHRoaXMudmFsdWUsXG5cdFx0XHQhdGhpcy5yZXF1aXJlZCxcblx0XHQpO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLnRleHQgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjaWQtZmllbGQnKTtcblx0XHR0aGlzLnR5cGVTZWxlY3RvciA9IHN1cGVyLmdldENoaWxkSW5wdXQoJyNpZC10eXBlJyk7XG5cdFx0dGhpcy50ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMudHlwZVNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR0aGlzLnRleHQuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdFx0dGhpcy50eXBlID0gdGhpcy50eXBlU2VsZWN0b3IudmFsdWU7XG5cdH1cblxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMudHlwZSA9IHRoaXMudHlwZVNlbGVjdG9yLnZhbHVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuaW1wb3J0ICogYXMgaW50bFRlbElucHV0IGZyb20gJ2ludGwtdGVsLWlucHV0JztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ2ludGwtdGVsLWlucHV0JztcbmltcG9ydCBNYWtlUmVxdWVzdCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVXRpbGl0aWVzL01ha2VSZXF1ZXN0JztcblxuQEN1c3RvbUVsZW1lbnQoe1xuXHRzZWxlY3RvcjogJ2ludC1waG9uZS1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIiBocmVmPVwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvaW50bC10ZWwtaW5wdXQvMTYuMC4wL2Nzcy9pbnRsVGVsSW5wdXQuY3NzXCIgPlxuXHRcdFx0PGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cblx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZWxcIiBpZD1cInBob25lLWZpZWxkXCIgIC8+XG5cdFx0XHQ8L2Rpdj5gLFxuXHRzdHlsZTogYFxuICAgIDpob3N0e1xuICAgICAgICAgICAgd2lkdGg6MTAwJTtcbiAgICB9XG4gICAgLndyYXBwZXJ7XG4gICAgICAgICAgICBkaXNwbGF5OmZsZXg7XG4gICAgfVxuICAgIC5pdGkge1xuICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBpbnB1dHtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjRmZjtcbiAgICAgICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAgICAgcmVzaXplOiBub25lO1xuICAgIH1cbiAgICAgICAgICAgYCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBJbnRQaG9uZUZpZWxkRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdHBob25lOiBIVE1MSW5wdXRFbGVtZW50O1xuXHRmdWxsUGhvbmU6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdGludGxUZWxJbnB1dDogUGx1Z2luO1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuaW50bFRlbElucHV0LmdldE51bWJlcigpO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnBob25lLnZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGF0dGVyblZhbGlkID1cblx0XHRcdCF0aGlzLmludGxUZWxJbnB1dC5nZXROdW1iZXIoKSB8fCB0aGlzLmludGxUZWxJbnB1dC5pc1ZhbGlkTnVtYmVyKCk7XG5cdFx0cmV0dXJuIHBhdHRlcm5WYWxpZCAmJiB0aGlzLnBob25lLnZhbGlkaXR5LnZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0dGhpcy5zZXRJbnRsVGVsSW5wdXQoKTtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMucGhvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMucGhvbmUuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdH1cblx0c2V0SW50bFRlbElucHV0KCkge1xuXHRcdHRoaXMucGhvbmUgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjcGhvbmUtZmllbGQnKTtcblx0XHRjb25zdCBnZW9JcExvb2t1cCA9IChzdWNjZXNzLCBmYWlsdXJlKSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IE1ha2VSZXF1ZXN0KFxuXHRcdFx0XHQnaHR0cHM6Ly9pcGluZm8uaW8vanNvbj90b2tlbj04MjI2MTM4MjE3YTY4YScsXG5cdFx0XHRcdCdnZXQnLFxuXHRcdFx0XHR7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcblx0XHRcdClcblx0XHRcdFx0LnNlbmQoKVxuXHRcdFx0XHQudGhlbigocmVxdWVzdDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzID0gSlNPTi5wYXJzZShyZXF1ZXN0KTtcblx0XHRcdFx0XHRyZXR1cm4gc3VjY2VzcyhyZXMuY291bnRyeSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChlcnIgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBzdWNjZXNzKCdESycpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXHRcdGNvbnN0IGlzSXBsb29rVXBEaXNhYmxlZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGUtaXBsb29rdXAnKT8udG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG5cdFx0Y29uc3QgZGVmYXVsdENvdW50cnkgPSBpc0lwbG9va1VwRGlzYWJsZWQgPyAnZGsnIDogJ2F1dG8nO1xuXHRcdGNvbnN0IGNvdW50cnkgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1jb3VudHJ5Jyk/LnRvTG93ZXJDYXNlKCk7XG5cdFx0dGhpcy5pbnRsVGVsSW5wdXQgPSBpbnRsVGVsSW5wdXQodGhpcy5waG9uZSwge1xuXHRcdFx0Z2VvSXBMb29rdXA6IGlzSXBsb29rVXBEaXNhYmxlZCA/IG51bGwgOiBnZW9JcExvb2t1cCxcblx0XHRcdGhpZGRlbklucHV0OiAnZnVsbHBob25lJyxcblx0XHRcdGluaXRpYWxDb3VudHJ5OiBjb3VudHJ5ID8/IGRlZmF1bHRDb3VudHJ5LFxuXHRcdFx0cHJlZmVycmVkQ291bnRyaWVzOiBbXCJka1wiLCBcInNlXCIsIFwiZ2JcIl0sXG5cdFx0XHRuYXRpb25hbE1vZGU6IHRydWUsXG5cdFx0XHR1dGlsc1NjcmlwdDpcblx0XHRcdFx0J2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2ludGwtdGVsLWlucHV0LzE1LjAuMS9qcy91dGlscy5qcycsXG5cdFx0fSBhcyBhbnkpO1xuXHRcdHRoaXMuaW50bFRlbElucHV0LnByb21pc2UudGhlbihlID0+IHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmZ1bGxQaG9uZSA9IHN1cGVyLmdldENoaWxkSW5wdXQoJ1tuYW1lPVwiZnVsbHBob25lXCJdJyk7XG5cdFx0XHR9LCAxMDAwKTtcblx0XHR9KTtcblx0fVxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAnbnVtZXJpYy1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9J251bWVyaWMtZmllbGQnLz5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgaW5wdXR7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTnVtZXJpY0ZpZWxkRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdG51bWJlcjogSFRNTElucHV0RWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IGFueSB7XG5cdFx0aWYgKGlzTmFOKHRoaXMubnVtYmVyLnZhbHVlQXNOdW1iZXIpKSB7XG5cdFx0XHRyZXR1cm4gJyc7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm51bWJlci52YWx1ZUFzTnVtYmVyO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm51bWJlci52YWx1ZUFzTnVtYmVyID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubnVtYmVyLnZhbGlkaXR5LnZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLm51bWJlciA9IHN1cGVyLmdldENoaWxkSW5wdXQoJyNudW1lcmljLWZpZWxkJyk7XG5cdFx0dGhpcy5udW1iZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMubnVtYmVyLnNldEF0dHJpYnV0ZSgncmVxdWlyZWQnLCAnJyk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm1heCkge1xuXHRcdFx0dGhpcy5udW1iZXIuc2V0QXR0cmlidXRlKCdtYXgnLCB0aGlzLm1heCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLm1pbikge1xuXHRcdFx0dGhpcy5udW1iZXIuc2V0QXR0cmlidXRlKCdtaW4nLCB0aGlzLm1pbik7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnN0ZXApIHtcblx0XHRcdHRoaXMubnVtYmVyLnNldEF0dHJpYnV0ZSgnc3RlcCcsIHRoaXMuc3RlcCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcbmltcG9ydCB7IFN0cmluZ1V0aWwgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvVXRpbGl0aWVzL1N0cmluZ1V0aWwnO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAncmFkaW8tZ3JvdXAtZWxlbWVudCcsXG5cdHRlbXBsYXRlOiBgXG5cdFx0XHQ8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuXHRcdFx0PC9kaXY+YCxcblx0c3R5bGU6IGBcblx0XHRcdDpob3N0e1xuXHRcdFx0XHR3aWR0aDoxMDAlO1xuXHRcdFx0fVxuXHRcdFx0LnJhZGlvLWJ1dHRvbiB7XG5cdFx0XHRcdHdpZHRoOiBhdXRvO1xuXHRcdFx0XHRtYXJnaW46IGF1dG8gM3B4O1xuXHRcdFx0XHRjb2xvcjogcmdiYSg3MiwgNzIsIDcyLCAwLjc1KTtcblx0XHRcdFx0Zm9udC1zaXplOiAxM3B4O1xuXHRcdFx0fVxuXHRcdFx0aW5wdXR7XG5cdFx0XHRcdGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cdFx0XHRcdHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7XG5cdFx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2YxZjRmZjtcblx0XHRcdFx0bWFyZ2luOiAycHg7XG5cdFx0XHRcdHJlc2l6ZTogbm9uZTtcblx0XHRcdH1cblx0XHRgLFxuXHR1c2VTaGFkb3c6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlvQnV0dG9uR3JvdXBFbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0cmFkaW9CdXR0b246IEhUTUxJbnB1dEVsZW1lbnRbXTtcblx0cmFkaW9CdXR0b25UZW1wbGF0ZSA9IGBcblx0PGRpdiBjbGFzcz0ncmFkaW8tYnV0dG9uJz5cblx0XHQ8aW5wdXQgdHlwZT0ncmFkaW8nIG5hbWU9J3swfScgdmFsdWU9XCJ7MX1cIiBpZD1cInsyfVwiIHszfS8+XG5cdFx0PGxhYmVsIGZvcj1cInsyfVwiPnsxfTwvbGFiZWw+XG5cdDwvZGl2PmA7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnJhZGlvQnV0dG9uLmZpbHRlcihjID0+IGMuY2hlY2tlZCkubWFwKGMgPT4gYy52YWx1ZSlbMF07XG5cdH1cblxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuXHRcdGxldCBtYXRjaGVkUmFkaW8gPSB0aGlzLnJhZGlvQnV0dG9uLmZpbHRlcihjID0+IGMudmFsdWUgPT09IHZhbHVlKVswXTtcblx0XHRpZiAobWF0Y2hlZFJhZGlvKSB7XG5cdFx0XHRtYXRjaGVkUmFkaW8uc2V0QXR0cmlidXRlKCdjaGVja2VkJywgJycpO1xuXHRcdH1cblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmFkaW9CdXR0b24uZmlsdGVyKGMgPT4gYy5jaGVja2VkKS5sZW5ndGggPiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcblx0XHRzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXHR9XG5cblx0aW5pdENoaWxkSW5wdXRzKCkge1xuXHRcdHRoaXMuYWRkUmFkaW9CdXR0b25zKCk7XG5cdFx0dGhpcy5yYWRpb0J1dHRvbiA9IHN1cGVyLmdldENoaWxkSW5wdXRzKGBbbmFtZT0nJHt0aGlzLm5hbWV9J11gKTtcblx0XHR0aGlzLnJhZGlvQnV0dG9uLmZvckVhY2gocmFkaW8gPT5cblx0XHRcdHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZFJhZGlvQnV0dG9ucygpIHtcblx0XHRjb25zdCB3cmFwcGVyID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KCcud3JhcHBlcicpO1xuXHRcdHdyYXBwZXIuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR0aGlzLm9wdGlvbnMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcblx0XHRcdHdyYXBwZXIuaW5zZXJ0QWRqYWNlbnRIVE1MKFxuXHRcdFx0XHQnYmVmb3JlZW5kJyxcblx0XHRcdFx0U3RyaW5nVXRpbC5TdHJpbmdGb3JtYXQoXG5cdFx0XHRcdFx0dGhpcy5yYWRpb0J1dHRvblRlbXBsYXRlLFxuXHRcdFx0XHRcdHRoaXMubmFtZSxcblx0XHRcdFx0XHRlbGVtZW50LFxuXHRcdFx0XHRcdGAke3RoaXMubmFtZX0tJHtpbmRleH1gLFxuXHRcdFx0XHRcdGAke3RoaXMucmVxdWlyZWQgPyAncmVxdWlyZWQnIDogJyd9YCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXZlbnRzXG5cdHB1YmxpYyBjaGFuZ2UoJGV2ZW50KTogdm9pZCB7XG5cdFx0dGhpcy50b3VjaGVkID0gdHJ1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0fVxuXG5cdHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcblx0XHR0aGlzLnZhbGlkO1xuXHRcdHRoaXMub25WYWxpZGF0ZS5lbWl0KFxuXHRcdFx0bmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ3ZhbGlkYXRlJyksXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IEN1c3RvbUVsZW1lbnQgZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2N1c3RvbS1lbGVtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tSW5wdXRFbGVtZW50JztcbmltcG9ydCB7IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3MgfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsvQ3VzdG9tRXZlbnRzJztcblxuQEN1c3RvbUVsZW1lbnQoe1xuXHRzZWxlY3RvcjogJ3RleHQtYXJlYS1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDx0ZXh0YXJlYSByb3dzPTUgaWQ9J3RleHQtYXJlYS1maWVsZCc+PC90ZXh0YXJlYT5cblx0XHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG4gICAgOmhvc3R7XG4gICAgICAgICAgICB3aWR0aDoxMDAlO1xuICAgIH1cbiAgICAud3JhcHBlcntcbiAgICAgICAgICAgIGRpc3BsYXk6ZmxleDtcbiAgICB9XG4gICAgdGV4dGFyZWF7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcbiAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG4gICAgICAgICAgICBtYXJnaW46IDJweDtcbiAgICAgICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICB9XG4gICAgICAgICAgIGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dEFyZWFFbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblx0dGV4dDogSFRNTElucHV0RWxlbWVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGAke3RoaXMudGV4dC52YWx1ZX1gO1xuXHR9XG5cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnRleHQudmFsdWUgPSB2YWx1ZTtcblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy50ZXh0LnZhbGlkaXR5LnZhbGlkO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLnRleHQgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjdGV4dC1hcmVhLWZpZWxkJyk7XG5cdFx0dGhpcy50ZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR0aGlzLnRleHQuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdH1cblxuXHQvLyBldmVudHNcblx0cHVibGljIGNoYW5nZSgkZXZlbnQpOiB2b2lkIHtcblx0XHR0aGlzLnRvdWNoZWQgPSB0cnVlO1xuXHRcdHRoaXMub25DaGFuZ2UuZW1pdChuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAnY2hhbmdlJykpO1xuXHR9XG5cblx0cHVibGljIHZhbGlkYXRlKCk6IHZvaWQge1xuXHRcdHRoaXMudmFsaWQ7XG5cdFx0dGhpcy5vblZhbGlkYXRlLmVtaXQoXG5cdFx0XHRuZXcgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyh0aGlzLnZhbHVlLCAndmFsaWRhdGUnKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgQ3VzdG9tRWxlbWVudCBmcm9tICcuLi8uLi9mcmFtZXdvcmsvY3VzdG9tLWVsZW1lbnQuZGVjb3JhdG9yJztcbmltcG9ydCB7IEN1c3RvbUlucHV0RWxlbWVudCB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50QXJncyB9IGZyb20gJy4uLy4uL2ZyYW1ld29yay9DdXN0b21FdmVudHMnO1xuXG5AQ3VzdG9tRWxlbWVudCh7XG5cdHNlbGVjdG9yOiAndGV4dC1lbGVtZW50Jyxcblx0dGVtcGxhdGU6IGBcblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPSd0ZXh0LWZpZWxkJy8+XG5cdFx0XHQ8L2Rpdj5gLFxuXHRzdHlsZTogYFxuXHQ6aG9zdHtcblx0XHRcdHdpZHRoOjEwMCU7XG5cdH1cblx0LndyYXBwZXJ7XG5cdFx0XHRkaXNwbGF5OmZsZXg7XG5cdH1cblx0aW5wdXR7XG5cdFx0XHRib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHRcdFx0d2lkdGg6IDEwMCUgIWltcG9ydGFudDtcblx0XHRcdGJvcmRlcjogbm9uZTtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmMWY0ZmY7XG5cdFx0XHRtYXJnaW46IDJweDtcblx0XHRcdHJlc2l6ZTogbm9uZTtcblx0fVxuXHRcdGAsXG5cdHVzZVNoYWRvdzogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkRWxlbWVudCBleHRlbmRzIEN1c3RvbUlucHV0RWxlbWVudCB7XG5cdHRleHQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBgJHt0aGlzLnRleHQudmFsdWV9YDtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy50ZXh0LnZhbHVlID0gdmFsdWU7XG5cdH1cblxuXHRnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGV4dC52YWxpZGl0eS52YWxpZDtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cdH1cblxuXHRpbml0Q2hpbGRJbnB1dHMoKSB7XG5cdFx0dGhpcy50ZXh0ID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI3RleHQtZmllbGQnKTtcblx0XHR0aGlzLnRleHQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0aWYgKHRoaXMucmVxdWlyZWQpIHtcblx0XHRcdHRoaXMudGV4dC5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkJywgJycpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGV2ZW50c1xuXHRwdWJsaWMgY2hhbmdlKCRldmVudCk6IHZvaWQge1xuXHRcdHRoaXMudG91Y2hlZCA9IHRydWU7XG5cdFx0dGhpcy5vbkNoYW5nZS5lbWl0KG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICdjaGFuZ2UnKSk7XG5cdH1cblxuXHRwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy52YWxpZDtcblx0XHR0aGlzLm9uVmFsaWRhdGUuZW1pdChcblx0XHRcdG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICd2YWxpZGF0ZScpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCBDdXN0b21FbGVtZW50IGZyb20gJy4uLy4uL2ZyYW1ld29yay9jdXN0b20tZWxlbWVudC5kZWNvcmF0b3InO1xuaW1wb3J0IHsgQ3VzdG9tSW5wdXRFbGVtZW50IH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUlucHV0RWxlbWVudCc7XG5pbXBvcnQgeyBDdXN0b21FbGVtZW50RXZlbnRBcmdzIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL0N1c3RvbUV2ZW50cyc7XG5pbXBvcnQgT3B0aW9uV2l0aERlc2NyaXB0aW9uIGZyb20gJy4uLy4uL2ZyYW1ld29yay9Nb2RlbHMvT3B0aW9uV2l0aERlc2NyaXB0aW9uJztcbmltcG9ydCBEb21VdGlsaXR5IGZyb20gJy4uLy4uL2ZyYW1ld29yay9VdGlsaXRpZXMvRG9tVXRpbGl0eSc7XG5cbkBDdXN0b21FbGVtZW50KHtcblx0c2VsZWN0b3I6ICd0eXBlLWFoZWFkLWVsZW1lbnQnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRleHQtaW5wdXRcIj5cblx0XHRcdDxkaXYgaWQ9XCJkZXNjcmlwdGlvblwiPjwvZGl2PlxuXHRcdDwvZGl2PmAsXG5cdHN0eWxlOiBgXG5cdFx0Omhvc3Qge1xuXHRcdFx0d2lkdGg6MTAwJTtcblx0XHR9XG5cdFx0LndyYXBwZXIge1xuXHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0ZGlzcGxheTpmbGV4O1xuXHRcdFx0ZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHR9XG5cdFx0I3RleHQtaW5wdXQge1xuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XG5cdFx0XHRib3JkZXI6IG5vbmU7XG5cdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNGZmO1xuXHRcdFx0bWFyZ2luOiAycHg7XG5cdFx0XHRyZXNpemU6IG5vbmU7XG5cdFx0fVxuXHRcdC53cmFwcGVyICNkZXNjcmlwdGlvbiB7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdHBhZGRpbmc6IDAgMnB4O1xuXHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHR9XG5cdFx0Lm9wdGlvbnMtbGlzdCB7XG5cdFx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjRThFOEU4O1xuXHRcdFx0Ym9yZGVyLWJvdHRvbTogbm9uZTtcblx0XHRcdGJvcmRlci10b3A6IG5vbmU7XG5cdFx0XHR6LWluZGV4OiAzO1xuXHRcdFx0dG9wOiAxMDAlO1xuXHRcdFx0bGVmdDogMDtcblx0XHRcdHJpZ2h0OiAwO1xuXHRcdFx0bWF4LWhlaWdodDogMjAwcHg7XG5cdFx0XHRvdmVyZmxvdy15OiBhdXRvO1xuXHRcdH1cblx0XHQub3B0aW9ucy1saXN0LWl0ZW0ge1xuXHRcdFx0cGFkZGluZzogMTBweDtcblx0XHRcdGN1cnNvcjogcG9pbnRlcjtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7XG5cdFx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U4RThFODtcblx0XHR9XG5cdFx0Lm9wdGlvbnMtbGlzdC1pdGVtOmhvdmVyIHtcblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNFOEU4RTg7XG5cdFx0fVxuXHRcdC5vcHRpb25zLWxpc3QtaXRlbS5hY3RpdmUge1xuXHRcdFx0Lyp3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgaXRlbXMgdXNpbmcgdGhlIGFycm93IGtleXM6Ki9cblx0XHRcdGJhY2tncm91bmQtY29sb3I6ICMwMDNFNjQgIWltcG9ydGFudDtcblx0XHRcdGNvbG9yOiAjRkZGRkZGO1xuXHRcdH1cblx0XHQub3B0aW9ucy1saXN0LWl0ZW0tdGl0bGUge1xuXHRcdFx0Zm9udC1zaXplOiAxNnB4O1xuXHRcdH1cblx0XHQub3B0aW9ucy1saXN0LWl0ZW0tZGVzY3JpcHRpb24ge1xuXHRcdFx0Zm9udC1zaXplOiAxMHB4O1xuXHRcdH1cblx0YCxcblx0dXNlU2hhZG93OiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUeXBlQWhlYWRFbGVtZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXRFbGVtZW50IHtcblxuXHRwcml2YXRlIHRleHRJbnB1dEVsZW1lbnQ6IEhUTUxJbnB1dEVsZW1lbnQ7XG5cdHByaXZhdGUgZGVzY3JpcHRpb25FbGVtZW50OiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBjb21wb25lbnRXcmFwcGVyOiBIVE1MRWxlbWVudDtcblx0cHJpdmF0ZSBjdXJyZW50Rm91Y3NlZEluZGV4ID0gLTE7XG5cblx0c2VsZWN0ZWRPcHRpb246IE9wdGlvbldpdGhEZXNjcmlwdGlvbjtcblx0c2VhcmNoUmVzdWx0T3B0aW9uczogT3B0aW9uV2l0aERlc2NyaXB0aW9uW10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXQgc2VhcmNoSGFzUmVzdWx0cygpOiBib29sZWFuIHtcblx0XHRjb25zdCBhdXRvY29tcGxldGVMaXN0ID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KCcub3B0aW9ucy1saXN0Jyk7XG5cdFx0cmV0dXJuIGF1dG9jb21wbGV0ZUxpc3QgJiYgdGhpcy5vcHRpb25zV2l0aERlc2NyaXB0aW9ucyAmJiB0aGlzLm9wdGlvbnNXaXRoRGVzY3JpcHRpb25zLmxlbmd0aCA+IDA7XG5cdH1cblxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHtcblx0XHRpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb24pIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbi52YWx1ZTtcblx0fVxuXG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0aWYgKCF0aGlzLm9wdGlvbnNXaXRoRGVzY3JpcHRpb25zIHx8IHRoaXMub3B0aW9uc1dpdGhEZXNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9uc1dpdGhEZXNjcmlwdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZSk7XG5cdFx0aWYgKCFvcHRpb24pIHtcblx0XHRcdHRoaXMuZGVzY3JpcHRpb25FbGVtZW50LmlubmVySFRNTCA9IG51bGw7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBvcHRpb247XG5cdFx0dGhpcy50ZXh0SW5wdXRFbGVtZW50LnZhbHVlID0gb3B0aW9uLnRpdGxlO1xuXHRcdHRoaXMuZGVzY3JpcHRpb25FbGVtZW50LmlubmVySFRNTCA9IG9wdGlvbi5kZXNjcmlwdGlvbjtcblx0fVxuXG5cdGdldCB2YWxpZCgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xuXHRcdFx0cmV0dXJuICEhdGhpcy5zZWxlY3RlZE9wdGlvbjtcblx0XHR9XG5cdFx0cmV0dXJuICEhdGhpcy5zZWxlY3RlZE9wdGlvbiB8fCB0aGlzLnRleHRJbnB1dEVsZW1lbnQudmFsdWUgPT09ICcnO1xuXHR9XG5cblx0Y29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG5cdFx0c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblx0fVxuXG5cdGluaXRDaGlsZElucHV0cygpIHtcblx0XHR0aGlzLnRleHRJbnB1dEVsZW1lbnQgPSBzdXBlci5nZXRDaGlsZElucHV0KCcjdGV4dC1pbnB1dCcpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb25FbGVtZW50ID0gc3VwZXIuZ2V0Q2hpbGRJbnB1dCgnI2Rlc2NyaXB0aW9uJyk7XG5cdFx0dGhpcy5jb21wb25lbnRXcmFwcGVyID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KCcud3JhcHBlcicpO1xuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XG5cdFx0XHR0aGlzLnRleHRJbnB1dEVsZW1lbnQuc2V0QXR0cmlidXRlKCdyZXF1aXJlZCcsICcnKTtcblx0XHR9XG5cdFx0dGhpcy50ZXh0SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMudGV4dElucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcblx0XHRcdHRoaXMuaW5wdXRFdmVudEhhbmRsZXIoKTtcblx0XHR9KTtcblx0XHR0aGlzLmJpbmROYXZpZ2F0aW9uKCk7XG5cdH1cblxuXHRwcml2YXRlIGlucHV0RXZlbnRIYW5kbGVyKCkge1xuXHRcdHRoaXMuc2VsZWN0ZWRPcHRpb24gPSBudWxsO1xuXHRcdHRoaXMuZGVzY3JpcHRpb25FbGVtZW50LmlubmVySFRNTCA9IG51bGw7XG5cdFx0dGhpcy5jbG9zZU9wdGlvbnNMaXN0KCk7XG5cdFx0dGhpcy5zZWFyY2hSZXN1bHRPcHRpb25zID0gW107XG5cdFx0Y29uc3Qgc2VhcmNoVmFsdWUgPSB0aGlzLnRleHRJbnB1dEVsZW1lbnQudmFsdWU7XG5cdFx0aWYgKCFzZWFyY2hWYWx1ZSB8fCBzZWFyY2hWYWx1ZS50cmltKCkgPT09ICcnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG9wdGlvbnNsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0b3B0aW9uc2xpc3QuY2xhc3NMaXN0LmFkZCgnb3B0aW9ucy1saXN0Jyk7XG5cblx0XHRpZiAoIXRoaXMub3B0aW9uc1dpdGhEZXNjcmlwdGlvbnMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5vcHRpb25zV2l0aERlc2NyaXB0aW9ucy5mb3JFYWNoKChvcHRpb246IE9wdGlvbldpdGhEZXNjcmlwdGlvbiwgaW5kZXgpID0+IHtcblx0XHRcdHZhciByZWdleCA9IG5ldyBSZWdFeHAoc2VhcmNoVmFsdWUsICdnaScpO1xuXHRcdFx0Y29uc3QgaXNNYXRjaGluZ1RpdGxlID0gcmVnZXgudGVzdChvcHRpb24udGl0bGUpO1xuXHRcdFx0Y29uc3QgaXNNYXRjaGluZ1ZhbHVlID0gcmVnZXgudGVzdChvcHRpb24udmFsdWUpO1xuXHRcdFx0Y29uc3QgaXNNYXRjaGluZ0Rlc2NyaXB0aW9uID0gcmVnZXgudGVzdChvcHRpb24uZGVzY3JpcHRpb24pO1xuXHRcdFx0aWYgKCFpc01hdGNoaW5nVGl0bGUgJiYgIWlzTWF0Y2hpbmdWYWx1ZSAmJiAhaXNNYXRjaGluZ0Rlc2NyaXB0aW9uKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2VhcmNoUmVzdWx0T3B0aW9ucy5wdXNoKG9wdGlvbik7XG5cdFx0XHRjb25zdCBvcHRpb25zTGlzdEl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0b3B0aW9uc0xpc3RJdGVtLmNsYXNzTGlzdC5hZGQoJ29wdGlvbnMtbGlzdC1pdGVtJyk7XG5cdFx0XHRvcHRpb25zTGlzdEl0ZW0uZGF0YXNldFsndmFsdWUnXSA9IG9wdGlvbi52YWx1ZTtcblx0XHRcdG9wdGlvbnNsaXN0LmFwcGVuZENoaWxkKG9wdGlvbnNMaXN0SXRlbSk7XG5cdFx0XHRjb25zdCBvcHRpb25zTGlzdEl0ZW1UaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRvcHRpb25zTGlzdEl0ZW1UaXRsZS5jbGFzc0xpc3QuYWRkKCdvcHRpb25zLWxpc3QtaXRlbS10aXRsZScpO1xuXHRcdFx0b3B0aW9uc0xpc3RJdGVtVGl0bGUuaW5uZXJIVE1MID0gRG9tVXRpbGl0eS5ib2xkZW5UZXh0KG9wdGlvbi50aXRsZSwgc2VhcmNoVmFsdWUpO1xuXHRcdFx0b3B0aW9uc0xpc3RJdGVtLmFwcGVuZENoaWxkKG9wdGlvbnNMaXN0SXRlbVRpdGxlKTtcblx0XHRcdGNvbnN0IG9wdGlvbnNMaXN0SXRlbURlc2NyaXB0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdG9wdGlvbnNMaXN0SXRlbURlc2NyaXB0aW9uLmNsYXNzTGlzdC5hZGQoJ29wdGlvbnMtbGlzdC1pdGVtLWRlc2NyaXB0aW9uJyk7XG5cdFx0XHRvcHRpb25zTGlzdEl0ZW1EZXNjcmlwdGlvbi5pbm5lckhUTUwgPSBEb21VdGlsaXR5LmJvbGRlblRleHQob3B0aW9uLmRlc2NyaXB0aW9uLCBzZWFyY2hWYWx1ZSk7XG5cdFx0XHRvcHRpb25zTGlzdEl0ZW0uYXBwZW5kQ2hpbGQob3B0aW9uc0xpc3RJdGVtRGVzY3JpcHRpb24pO1xuXHRcdFx0b3B0aW9uc0xpc3RJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9wdGlvblNlbGVjdGVkSGFuZGxlcihvcHRpb24pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmNvbXBvbmVudFdyYXBwZXIuYXBwZW5kQ2hpbGQob3B0aW9uc2xpc3QpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjbG9zZU9wdGlvbnNMaXN0KCkge1xuXHRcdHRoaXMuY3VycmVudEZvdWNzZWRJbmRleCA9IC0xO1xuXHRcdGNvbnN0IG9wdGlvbnNMaXN0ID0gc3VwZXIuZ2V0Q2hpbGRFbGVtZW50KCcub3B0aW9ucy1saXN0Jyk7XG5cdFx0aWYgKCFvcHRpb25zTGlzdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRvcHRpb25zTGlzdC5yZW1vdmUoKTtcblx0fVxuXG5cdHByaXZhdGUgb3B0aW9uU2VsZWN0ZWRIYW5kbGVyKG9wdGlvbjogT3B0aW9uV2l0aERlc2NyaXB0aW9uKSB7XG5cdFx0dGhpcy52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcblx0XHR0aGlzLm9uQ2hhbmdlLmVtaXQobmV3IEN1c3RvbUVsZW1lbnRFdmVudEFyZ3ModGhpcy52YWx1ZSwgJ2NoYW5nZScpKTtcblx0XHR0aGlzLmNsb3NlT3B0aW9uc0xpc3QoKTtcblx0fVxuXG5cdHByaXZhdGUgYmluZE5hdmlnYXRpb24oKSB7XG5cdFx0dGhpcy50ZXh0SW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcblx0XHRcdGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG5cdFx0XHRcdHRoaXMuY2xvc2VPcHRpb25zTGlzdCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIHtcblx0XHRcdFx0aWYgKCF0aGlzLnNlYXJjaEhhc1Jlc3VsdHMpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5jdXJyZW50Rm91Y3NlZEluZGV4ID0gdGhpcy5jdXJyZW50Rm91Y3NlZEluZGV4ID09PSB0aGlzLnNlYXJjaFJlc3VsdE9wdGlvbnMubGVuZ3RoIC0gMSA/IDAgOiB0aGlzLmN1cnJlbnRGb3Vjc2VkSW5kZXggKyAxO1xuXHRcdFx0XHR0aGlzLmhpZ2hsaWdodEZvY3VzZWRTZWFyY2hSZXN1bHQoKTtcblx0XHRcdH1cblx0XHRcdGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuXHRcdFx0XHRpZiAoIXRoaXMuc2VhcmNoSGFzUmVzdWx0cykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmN1cnJlbnRGb3Vjc2VkSW5kZXggPSB0aGlzLmN1cnJlbnRGb3Vjc2VkSW5kZXggPT09IDAgPyB0aGlzLnNlYXJjaFJlc3VsdE9wdGlvbnMubGVuZ3RoIC0gMSA6IHRoaXMuY3VycmVudEZvdWNzZWRJbmRleCAtIDE7XG5cdFx0XHRcdHRoaXMuaGlnaGxpZ2h0Rm9jdXNlZFNlYXJjaFJlc3VsdCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuXHRcdFx0XHRpZiAodGhpcy5jdXJyZW50Rm91Y3NlZEluZGV4ICE9PSAtMSAmJiB0aGlzLnNlYXJjaEhhc1Jlc3VsdHMpIHtcblx0XHRcdFx0XHR0aGlzLm9wdGlvblNlbGVjdGVkSGFuZGxlcih0aGlzLnNlYXJjaFJlc3VsdE9wdGlvbnNbdGhpcy5jdXJyZW50Rm91Y3NlZEluZGV4XSk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRoaWdobGlnaHRGb2N1c2VkU2VhcmNoUmVzdWx0KCkge1xuXHRcdGNvbnN0IG9wdGlvbkxpc3RJdGVtcyA9IHN1cGVyLmdldENoaWxkRWxlbWVudHMoJy5vcHRpb25zLWxpc3QtaXRlbScpO1xuXHRcdGlmICghb3B0aW9uTGlzdEl0ZW1zKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdG9wdGlvbkxpc3RJdGVtcy5mb3JFYWNoKChsaXN0SXRlbSwgaW5kZXgpID0+IHtcblx0XHRcdGxpc3RJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuXHRcdFx0aWYgKGluZGV4ID09PSB0aGlzLmN1cnJlbnRGb3Vjc2VkSW5kZXgpIHtcblx0XHRcdFx0bGlzdEl0ZW0uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgY2hhbmdlKCRldmVudCk6IHZvaWQge1xuXHRcdHRoaXMudG91Y2hlZCA9IHRydWU7XG5cdFx0dGhpcy5vbkNoYW5nZS5lbWl0KG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICdjaGFuZ2UnKSk7XG5cdH1cblxuXHRwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy52YWxpZDtcblx0XHR0aGlzLm9uVmFsaWRhdGUuZW1pdChcblx0XHRcdG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsICd2YWxpZGF0ZScpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXI8VD4ge1xuICAgIChldmVudDogVCk6IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXNwb3NhYmxlIHtcbiAgICBkaXNwb3NlKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21FbGVtZW50RXZlbnRBcmdzIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IGFueSwgcHVibGljIGV2ZW50TmFtZTogc3RyaW5nKSB7fVxufVxuLyoqIHBhc3NlcyB0aHJvdWdoIGV2ZW50cyBhcyB0aGV5IGhhcHBlbi4gWW91IHdpbGwgbm90IGdldCBldmVudHMgZnJvbSBiZWZvcmUgeW91IHN0YXJ0IGxpc3RlbmluZyAqL1xuZXhwb3J0IGNsYXNzIEN1c3RvbUVsZW1lbnRFdmVudDxUPiB7XG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnM6IExpc3RlbmVyPFQ+W10gPSBbXTtcbiAgICBwcml2YXRlIGxpc3RlbmVyc09uY2VyOiBMaXN0ZW5lcjxUPltdID0gW107XG5cbiAgICBvbiA9IChsaXN0ZW5lcjogTGlzdGVuZXI8VD4pOiBEaXNwb3NhYmxlID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB0aGlzLm9mZihsaXN0ZW5lciksXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIG9uY2UgPSAobGlzdGVuZXI6IExpc3RlbmVyPFQ+KTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzT25jZXIucHVzaChsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIG9mZiA9IChsaXN0ZW5lcjogTGlzdGVuZXI8VD4pID0+IHtcbiAgICAgICAgdmFyIGNhbGxiYWNrSW5kZXggPSB0aGlzLmxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrSW5kZXggPiAtMSkgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGNhbGxiYWNrSW5kZXgsIDEpO1xuICAgIH07XG5cbiAgICBlbWl0ID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8qKiBVcGRhdGUgYW55IGdlbmVyYWwgbGlzdGVuZXJzICovXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIoZXZlbnQpKTtcblxuICAgICAgICAvKiogQ2xlYXIgdGhlIGBvbmNlYCBxdWV1ZSAqL1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNPbmNlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc09uY2VyLmZvckVhY2gobGlzdGVuZXIgPT4gbGlzdGVuZXIoZXZlbnQpKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzT25jZXIgPSBbXTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwaXBlID0gKHRlOiBDdXN0b21FbGVtZW50RXZlbnQ8VD4pOiBEaXNwb3NhYmxlID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub24oZSA9PiB0ZS5lbWl0KGUpKTtcbiAgICB9O1xufVxuIiwiaW1wb3J0IHsgQ3VzdG9tRWxlbWVudEV2ZW50LCBDdXN0b21FbGVtZW50RXZlbnRBcmdzIH0gZnJvbSBcIi4vQ3VzdG9tRXZlbnRzXCI7XG5pbXBvcnQgT3B0aW9uV2l0aERlc2NyaXB0aW9uIGZyb20gXCIuL01vZGVscy9PcHRpb25XaXRoRGVzY3JpcHRpb25cIjtcbmltcG9ydCBBcnJheVV0aWwgZnJvbSBcIi4vVXRpbGl0aWVzL0FycmF5VXRpbFwiO1xuaW1wb3J0IERvbVV0aWwgZnJvbSBcIi4vVXRpbGl0aWVzL0RvbVV0aWxcIjtcblxuY2xhc3MgSURpY3Rpb25hcnk8VFZhbHVlPiB7XG5cdFtpbmRleDogc3RyaW5nXTogVFZhbHVlO1xufVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEN1c3RvbUlucHV0RWxlbWVudCBleHRlbmRzIEhUTUxFbGVtZW50IHtcblx0cHJpdmF0ZSBkZXBlbmRlbnRPbkxpc3QgPSBuZXcgSURpY3Rpb25hcnk8Ym9vbGVhbj4oKTtcblx0cHJpdmF0ZSB2aXNpYmlsaXR5U3RhdGUgPSB0cnVlO1xuXG5cdHByb3RlY3RlZCB0b3VjaGVkID0gZmFsc2U7XG5cdHByb3RlY3RlZCBkb21VdGlsOiBEb21VdGlsO1xuXG5cdHByb3RlY3RlZCBoYXNWYWx1ZURlcGVuZGVuY3k6IGFueTtcblx0cHJvdGVjdGVkIG5vVmFsdWVEZXBlbmRlbmN5OiBhbnk7XG5cdHByb3RlY3RlZCBkZXBlbmRlbmNpZXM6IGFueVtdO1xuXG5cdHB1YmxpYyBvbkNoYW5nZSA9IG5ldyBDdXN0b21FbGVtZW50RXZlbnQ8Q3VzdG9tRWxlbWVudEV2ZW50QXJncz4oKTtcblx0cHVibGljIG9uVmFsaWRhdGUgPSBuZXcgQ3VzdG9tRWxlbWVudEV2ZW50PEN1c3RvbUVsZW1lbnRFdmVudEFyZ3M+KCk7XG5cdHB1YmxpYyBvblZpc2liaWxpdHlDaGFuZ2VkID0gbmV3IEN1c3RvbUVsZW1lbnRFdmVudDxDdXN0b21FbGVtZW50RXZlbnRBcmdzPigpO1xuXG5cdHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cdHB1YmxpYyBvcHRpb25zOiBhbnlbXTtcblx0cHVibGljIG9wdGlvbnNXaXRoRGVzY3JpcHRpb25zOiBPcHRpb25XaXRoRGVzY3JpcHRpb25bXTtcblx0cHVibGljIHJlcXVpcmVkOiBib29sZWFuO1xuXHRwdWJsaWMgY3VzdG9tVmFsdWU6IHN0cmluZztcblx0cHVibGljIGFsbERlcGVuZGVuY2llc011c3RCZU1ldDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgbXVsdGk6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIG1heDogYW55O1xuXHRwdWJsaWMgbWluOiBhbnk7XG5cdHB1YmxpYyBzdGVwOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdGFic3RyYWN0IGdldCB2YWx1ZSgpOiBhbnk7XG5cdGFic3RyYWN0IHNldCB2YWx1ZSh2YWx1ZSk7XG5cdGFic3RyYWN0IGdldCB2YWxpZCgpOiBib29sZWFuO1xuXG5cdGFic3RyYWN0IGluaXRDaGlsZElucHV0cygpOiB2b2lkO1xuXHRhYnN0cmFjdCB2YWxpZGF0ZSgpOiB2b2lkO1xuXHRhYnN0cmFjdCBjaGFuZ2UoJGV2ZW50KTogdm9pZDtcblxuXHRjb21wYXJlVmxhdWVzID0gW107XG5cblx0aXNWYWx1ZUNvbmRpdGlvbk1hdGNoZWQodmFsOiBhbnkpIHtcblx0XHRpZiAodmFsICYmIEFycmF5LmlzQXJyYXkodmFsKSAmJiB2YWwubGVuZ3RoKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cdFx0XHR2YWwuZm9yRWFjaChlbGVtZW50ID0+IHtcblx0XHRcdFx0Y29uc3QgZWxlbWVudE1hdGNoZWQgPSB0aGlzLmNvbXBhcmVWbGF1ZXMuZmluZEluZGV4KHggPT4geCA9PSBlbGVtZW50KSAhPT0gLTE7XG5cdFx0XHRcdGlmIChlbGVtZW50TWF0Y2hlZCkge1xuXHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNvbXBhcmVWbGF1ZXMuZmluZEluZGV4KHggPT4geCA9PSB2YWwpICE9PSAtMTtcblx0fVxuXG5cdGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuXHRcdHRoaXMuaW5pdCgpO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlcygpO1xuXHR9XG5cblx0aW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG5cdFx0dGhpcy5kb21VdGlsID0gbmV3IERvbVV0aWwodGhpcyk7XG5cdFx0dGhpcy5wYXJzZURhdGEoKTtcblx0XHR0aGlzLmluaXRDaGlsZElucHV0cygpO1xuXHRcdHRoaXMuYmluZEV2ZW50cygpO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlcygpO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcblx0XHRcdHRoaXMuYmluZERlcGVuZGVuY2llcygpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZURhdGEoKTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghKHRoaXMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBIVE1MU2NyaXB0RWxlbWVudCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGRhdGEgPSBKU09OLnBhcnNlKHRoaXMuY2hpbGRyZW5bMF0uaW5uZXJIVE1MKTtcblx0XHRcdHRoaXMub3B0aW9ucyA9IGRhdGEub3B0aW9ucztcblx0XHRcdHRoaXMub3B0aW9uc1dpdGhEZXNjcmlwdGlvbnMgPSBkYXRhLm9wdGlvbnNXaXRoRGVzY3JpcHRpb25zO1xuXHRcdFx0dGhpcy5oYXNWYWx1ZURlcGVuZGVuY3kgPSBkYXRhLmhhc1ZhbHVlRGVwZW5kZW5jeTtcblx0XHRcdHRoaXMubm9WYWx1ZURlcGVuZGVuY3kgPSBkYXRhLm5vVmFsdWVEZXBlbmRlbmN5O1xuXHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMgPSBkYXRhLmRlcGVuZGVuY2llcztcblx0XHRcdHRoaXMucmVxdWlyZWQgPSBkYXRhLnJlcXVpcmVkO1xuXHRcdFx0dGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuXHRcdFx0dGhpcy5hbGxEZXBlbmRlbmNpZXNNdXN0QmVNZXQgPSBkYXRhLmFsbERlcGVuZGVuY2llc011c3RCZU1ldDtcblx0XHRcdHRoaXMubXVsdGkgPSBkYXRhLm11bHRpO1xuXHRcdFx0dGhpcy5tYXggPSBkYXRhLm1heDtcblx0XHRcdHRoaXMubWluID0gZGF0YS5taW47XG5cdFx0XHR0aGlzLnN0ZXAgPSBkYXRhLnN0ZXA7XG5cdFx0XHR0aGlzLmN1c3RvbVZhbHVlID0gZGF0YS52YWx1ZTtcblx0XHR9IGNhdGNoIChleCkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihleCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuXHRcdHRoaXMub25WYWxpZGF0ZS5vbihlID0+IHtcblx0XHRcdGlmICh0aGlzLnZhbGlkKSB7XG5cdFx0XHRcdGlmICh0aGlzLmNsb3Nlc3QoJy5jdXN0b20tdmFsaWRhdGlvbi10YXJnZXQnKSkge1xuXHRcdFx0XHRcdHRoaXMuY2xvc2VzdCgnLmN1c3RvbS12YWxpZGF0aW9uLXRhcmdldCcpLmNsYXNzTGlzdC5yZW1vdmUoXCJpbnZhbGlkXCIpO1xuXHRcdFx0XHRcdHRoaXMuY2xvc2VzdCgnLmN1c3RvbS12YWxpZGF0aW9uLXRhcmdldCcpLmNsYXNzTGlzdC5hZGQoXCJ2YWxpZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKHRoaXMuY2xvc2VzdCgnLmN1c3RvbS12YWxpZGF0aW9uLXRhcmdldCcpKSB7XG5cdFx0XHRcdFx0dGhpcy5jbG9zZXN0KCcuY3VzdG9tLXZhbGlkYXRpb24tdGFyZ2V0JykuY2xhc3NMaXN0LmFkZChcImludmFsaWRcIik7XG5cdFx0XHRcdFx0dGhpcy5jbG9zZXN0KCcuY3VzdG9tLXZhbGlkYXRpb24tdGFyZ2V0JykuY2xhc3NMaXN0LnJlbW92ZShcInZhbGlkXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZG9tVXRpbC5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHRoaXMub25DaGFuZ2Uub24oZSA9PiB7XG5cdFx0XHRpZiAodGhpcy50b3VjaGVkKSB7XG5cdFx0XHRcdHRoaXMudmFsaWRhdGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0QXR0cmlidXRlcygpOiB2b2lkIHtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShcImN1c3RvbS1pbnB1dFwiLCBcIlwiKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZShcIm5hbWVcIiwgdGhpcy5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYmluZERlcGVuZGVuY2llcygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5oYXNWYWx1ZURlcGVuZGVuY3kgJiYgdGhpcy5oYXNWYWx1ZURlcGVuZGVuY3kuaXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiB0aGlzLmhhc1ZhbHVlRGVwZW5kZW5jeS5pdGVtcykge1xuXHRcdFx0XHR0aGlzLmJpbmREZXBlbmRlbmN5KGZpZWxkTmFtZSwgXCJoYXNcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubm9WYWx1ZURlcGVuZGVuY3kgJiYgdGhpcy5ub1ZhbHVlRGVwZW5kZW5jeS5pdGVtcy5sZW5ndGgpIHtcblx0XHRcdGZvciAoY29uc3QgZmllbGROYW1lIG9mIHRoaXMubm9WYWx1ZURlcGVuZGVuY3kuaXRlbXMpIHtcblx0XHRcdFx0dGhpcy5iaW5kRGVwZW5kZW5jeShmaWVsZE5hbWUsIFwibm9cIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZGVwZW5kZW5jaWVzICYmIHRoaXMuZGVwZW5kZW5jaWVzLmxlbmd0aCkge1xuXHRcdFx0Zm9yIChjb25zdCBpbmRleCBpbiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRpZiAodGhpcy5kZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkoaW5kZXgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVwZW5kZW5jeSA9IHRoaXMuZGVwZW5kZW5jaWVzW2luZGV4XTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBkZXBlbmRlbmN5Lml0ZW1zKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmJpbmREZXBlbmRlbmN5KFxuXHRcdFx0XHRcdFx0XHRmaWVsZE5hbWUsXG5cdFx0XHRcdFx0XHRcdFwiY3VzdG9tXCIsXG5cdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kudmFsdWUsXG5cdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kuY3JpdGVyaWEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZERlcGVuZGVuY3koZWxlbWVudE5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZywgY3JpdGVyaWE/OiBzdHJpbmcsKTogdm9pZCB7XG5cdFx0bGV0IGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbbmFtZT1cIiR7ZWxlbWVudE5hbWV9XCJdYCkgYXMgQ3VzdG9tSW5wdXRFbGVtZW50O1xuXHRcdGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tSW5wdXRFbGVtZW50KSB7XG5cdFx0XHRlbGVtZW50LmNvbXBhcmVWbGF1ZXMucHVzaCh2YWx1ZSk7XG5cdFx0XHRpZiAodGhpcy5kZXBlbmRlbnRPbkxpc3QuaGFzT3duUHJvcGVydHkoZWxlbWVudC5uYW1lKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRsZXQgaXNWaXNpYmxlQnlEZWZhdWx0ID0gdHlwZSA9PT0gXCJub1wiO1xuXHRcdFx0ZWxlbWVudC5SZWdpc3RlckRlcGVuZGVudE9uKHRoaXMubmFtZSwgaXNWaXNpYmxlQnlEZWZhdWx0KTtcblx0XHRcdHRoaXMub25DaGFuZ2Uub24oZSA9PiB7XG5cdFx0XHRcdGxldCBJc0NvbmRpdGlvbk1hdGNoZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHR5cGUgPT09IFwiaGFzXCIpIHtcblx0XHRcdFx0XHRJc0NvbmRpdGlvbk1hdGNoZWQgPSAhIWUudmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGUgPT09IFwibm9cIikge1xuXHRcdFx0XHRcdElzQ29uZGl0aW9uTWF0Y2hlZCA9ICFlLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlID09PSBcImN1c3RvbVwiKSB7XG5cdFx0XHRcdFx0aWYgKGNyaXRlcmlhID09PSBcIkV4YWN0XCIpIHtcblx0XHRcdFx0XHRcdElzQ29uZGl0aW9uTWF0Y2hlZCA9IGVsZW1lbnQuaXNWYWx1ZUNvbmRpdGlvbk1hdGNoZWQoZS52YWx1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjcml0ZXJpYSA9PT0gXCJMZXNzVGhhblwiKSB7XG5cdFx0XHRcdFx0XHRJc0NvbmRpdGlvbk1hdGNoZWQgPSBlLnZhbHVlIDwgdmFsdWU7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChjcml0ZXJpYSA9PT0gXCJNb3JlVGhhblwiKSB7XG5cdFx0XHRcdFx0XHRJc0NvbmRpdGlvbk1hdGNoZWQgPSBlLnZhbHVlID4gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsZW1lbnQuRGVwZW5kZW50T25TdGF0ZUNoYW5nZWQodGhpcy5uYW1lLCBJc0NvbmRpdGlvbk1hdGNoZWQpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZWQub24oZSA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLnZpc2liaWxpdHlTdGF0ZSkge1xuXHRcdFx0XHRcdHRoaXMub25DaGFuZ2UuZW1pdChcblx0XHRcdFx0XHRcdG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsIFwiY2hhbmdlXCIpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbWVudC5EZXBlbmRlbnRPblN0YXRlQ2hhbmdlZCh0aGlzLm5hbWUsIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzZXRWaXNpYmlsaXR5KCkge1xuXHRcdGlmICh0aGlzLmFsbERlcGVuZGVuY2llc011c3RCZU1ldCkge1xuXHRcdFx0dGhpcy52aXNpYmlsaXR5U3RhdGUgPSBPYmplY3QudmFsdWVzKHRoaXMuZGVwZW5kZW50T25MaXN0KS5ldmVyeShzdGF0ZSA9PiBzdGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudmlzaWJpbGl0eVN0YXRlID0gT2JqZWN0LnZhbHVlcyh0aGlzLmRlcGVuZGVudE9uTGlzdCkuc29tZShzdGF0ZSA9PiBzdGF0ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudmlzaWJpbGl0eVN0YXRlKSB7XG5cdFx0XHR0aGlzLnNob3coKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5oaWRlKCk7XG5cdFx0fVxuXHRcdHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlZC5lbWl0KG5ldyBDdXN0b21FbGVtZW50RXZlbnRBcmdzKHRoaXMudmFsdWUsIFwiVmlzaWJpbGl0eUNoYW5nZWRcIikpO1xuXHR9XG5cblx0cHJpdmF0ZSBoaWRlKCkge1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwiXCIpO1xuXHRcdGlmICh0aGlzLmNsb3Nlc3QoJy5jdXN0b20tdmFsaWRhdGlvbi10YXJnZXQnKSkge1xuXHRcdFx0dGhpcy5jbG9zZXN0KCcuY3VzdG9tLXZhbGlkYXRpb24tdGFyZ2V0Jykuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwiXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc2hvdygpIHtcblx0XHR0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcblx0XHRpZiAodGhpcy5jbG9zZXN0KCcuY3VzdG9tLXZhbGlkYXRpb24tdGFyZ2V0JykpIHtcblx0XHRcdHRoaXMuY2xvc2VzdCgnLmN1c3RvbS12YWxpZGF0aW9uLXRhcmdldCcpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Q2hpbGRJbnB1dChzZWxlY3Rvcjogc3RyaW5nKTogSFRNTElucHV0RWxlbWVudCB7XG5cdFx0bGV0IGVsZW1lbnQ6IGFueSA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2hhZG93Um9vdCkge1xuXHRcdFx0ZWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTElucHV0RWxlbWVudDtcblx0fVxuXG5cdHByb3RlY3RlZCBnZXRDaGlsZElucHV0cyhzZWxlY3Rvcjogc3RyaW5nKTogSFRNTElucHV0RWxlbWVudFtdIHtcblx0XHRsZXQgZWxlbWVudDogYW55ID0gdGhpcztcblx0XHRpZiAodGhpcy5zaGFkb3dSb290KSB7XG5cdFx0XHRlbGVtZW50ID0gdGhpcy5zaGFkb3dSb290O1xuXHRcdH1cblx0XHRyZXR1cm4gQXJyYXlVdGlsLkZyb21Ob2RlTGlzdChcblx0XHRcdGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciksXG5cdFx0KSBhcyBIVE1MSW5wdXRFbGVtZW50W107XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Q2hpbGRFbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG5cdFx0bGV0IGVsZW1lbnQ6IGFueSA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2hhZG93Um9vdCkge1xuXHRcdFx0ZWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQ7XG5cdH1cblxuXHRwcm90ZWN0ZWQgZ2V0Q2hpbGRFbGVtZW50cyhzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnRbXSB7XG5cdFx0bGV0IGVsZW1lbnQ6IGFueSA9IHRoaXM7XG5cdFx0aWYgKHRoaXMuc2hhZG93Um9vdCkge1xuXHRcdFx0ZWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdDtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnRbXTtcblx0fVxuXG5cdHB1YmxpYyBSZWdpc3RlckRlcGVuZGVudE9uKG5hbWU6IHN0cmluZywgaW5pdGlhbFZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcblx0XHR0aGlzLmRlcGVuZGVudE9uTGlzdFtuYW1lXSA9IGluaXRpYWxWYWx1ZTtcblx0XHR0aGlzLnNldFZpc2liaWxpdHkoKTtcblx0fVxuXG5cdHB1YmxpYyBEZXBlbmRlbnRPblN0YXRlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIHN0YXRlOiBib29sZWFuKSB7XG5cdFx0aWYgKHRoaXMuZGVwZW5kZW50T25MaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XG5cdFx0XHR0aGlzLmRlcGVuZGVudE9uTGlzdFtuYW1lXSA9IHN0YXRlO1xuXHRcdH1cblx0XHR0aGlzLnNldFZpc2liaWxpdHkoKTtcblx0fVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQmFzZURpY3Rpb25hcnkge1xuXHRhYnN0cmFjdCBkaWN0aW9uYXJ5OiBhbnk7XG5cblx0Z2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCBrZXlQYXJ0cyA9IGtleS5zcGxpdCgnLicpO1xuXHRcdHZhciByZXN1bHQ6IHN0cmluZyB8IGFueSA9IHRoaXMuZGljdGlvbmFyeTtcblx0XHRrZXlQYXJ0cy5mb3JFYWNoKGtleVBhcnQgPT4ge1xuXHRcdFx0cmVzdWx0ID0gcmVzdWx0W2tleVBhcnRdO1xuXHRcdFx0aWYgKCFyZXN1bHQpIHtcblx0XHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN6ZWNoRGljdGlvbmFyeSBleHRlbmRzIEJhc2VEaWN0aW9uYXJ5IHtcblxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwiYWRyZXNhXCIsXG4gICAgICAgICAgICBDaXR5OiBcIm3Em3N0b1wiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJ6ZW3Em1wiLFxuICAgICAgICAgICAgWmlwOiBcInBvxaF0b3Zuw60gc23Em3JvdmFjw60gxI3DrXNsb1wiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIsOaxI1ldFwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIlJlZ2lzdHJhxI1uw60gxI3DrXNsb1wiXG4gICAgICAgIH1cbiAgICB9O1xuXG59XG4iLCJpbXBvcnQgQmFzZURpY3Rpb25hcnkgZnJvbSBcIi4vQmFzZS9CYXNlRGljdGlvbmFyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYW5pc2hEaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuXG5cdGRpY3Rpb25hcnk6IGFueSA9IHtcblx0XHRBZGRyZXNzRWxlbWVudDoge1xuXHRcdFx0QWRkcmVzczogXCJhZHJlc3NlXCIsXG5cdFx0XHRDaXR5OiBcImJ5XCIsXG5cdFx0XHRDb3VudHJ5OiBcImxhbmRcIixcblx0XHRcdFppcDogXCJwb3N0bnVtbWVyXCJcblx0XHR9LFxuXHRcdEJhbmtFbGVtZW50OiB7XG5cdFx0XHRBY2NvdW50OiBcIktvbnRvbnVtbWVyXCIsXG5cdFx0XHRSZWdpc3RyYXRpb25OdW1iZXI6IFwiUmVnaXN0cmVyaW5nc251bW1lclwiXG5cdFx0fVxuXHR9O1xuXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHV0Y2hEaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuXG4gICAgZGljdGlvbmFyeTogYW55ID0ge1xuICAgICAgICBBZGRyZXNzRWxlbWVudDoge1xuICAgICAgICAgICAgQWRkcmVzczogXCJhZHJlc1wiLFxuICAgICAgICAgICAgQ2l0eTogXCJzdGFkXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcImxhbmRcIixcbiAgICAgICAgICAgIFppcDogXCJwb3N0Y29kZVwiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIkJhbmtyZWtlbmluZ1wiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIkJhbmtyZWtlbmluZyBSZWdpc3RyYXRpZW51bW1lclwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuZ2xpc2hEaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuXG5cdGRpY3Rpb25hcnk6IGFueSA9IHtcblx0XHRBZGRyZXNzRWxlbWVudDoge1xuXHRcdFx0QWRkcmVzczogXCJhZGRyZXNzXCIsXG5cdFx0XHRDaXR5OiBcImNpdHlcIixcblx0XHRcdENvdW50cnk6IFwiY291bnRyeVwiLFxuXHRcdFx0WmlwOiBcInppcFwiXG5cdFx0fSxcblx0XHRCYW5rRWxlbWVudDoge1xuXHRcdFx0QWNjb3VudDogXCJCYW5rIEFjY291bnRcIixcblx0XHRcdFJlZ2lzdHJhdGlvbk51bWJlcjogXCJCYW5rIEFjY291bnQgUmVnaXN0cmF0aW9uIE51bWJlclwiXG5cdFx0fVxuXHR9O1xuXG59XG4iLCJpbXBvcnQgQmFzZURpY3Rpb25hcnkgZnJvbSBcIi4vQmFzZS9CYXNlRGljdGlvbmFyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFc3RvbmlhbkRpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImFhZHJlc3NcIixcbiAgICAgICAgICAgIENpdHk6IFwibGlublwiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJyaWlrXCIsXG4gICAgICAgICAgICBaaXA6IFwicG9zdGlpbmRla3NcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJQYW5nYWtvbnRvXCIsXG4gICAgICAgICAgICBSZWdpc3RyYXRpb25OdW1iZXI6IFwiUGFuZ2Frb250byByZWdpc3RyZWVyaW1pc251bWJlclwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbm5pc2hEaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuICAgIFxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwib3NvaXRlXCIsXG4gICAgICAgICAgICBDaXR5OiBcImthdXB1bmtpXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcIm1hYVwiLFxuICAgICAgICAgICAgWmlwOiBcInBvc3RpbnVtZXJvXCJcbiAgICAgICAgfSxcbiAgICAgICAgQmFua0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFjY291bnQ6IFwiUGFua2tpdGlsaVwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIlBhbmtraXRpbGluIHJla2lzdGVyw7ZpbnRpbnVtZXJvXCJcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRnJlbmNoRGljdGlvbmFyeSBleHRlbmRzIEJhc2VEaWN0aW9uYXJ5IHtcblxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwiYWRyZXNzZVwiLFxuICAgICAgICAgICAgQ2l0eTogXCJ2aWxsZVwiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJwYXlzXCIsXG4gICAgICAgICAgICBaaXA6IFwiY29kZSBwb3N0YWxcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJDb21wdGUgYmFuY2FpcmVcIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJOdW3DqXJvIGQnZW5yZWdpc3RyZW1lbnQgZHUgY29tcHRlIGJhbmNhaXJlXCJcbiAgICAgICAgfVxuICAgIH07XG5cbn0iLCJpbXBvcnQgQmFzZURpY3Rpb25hcnkgZnJvbSBcIi4vQmFzZS9CYXNlRGljdGlvbmFyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHZXJtYW5EaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuXG4gICAgZGljdGlvbmFyeTogYW55ID0ge1xuICAgICAgICBBZGRyZXNzRWxlbWVudDoge1xuICAgICAgICAgICAgQWRkcmVzczogXCJBZHJlc3NlXCIsXG4gICAgICAgICAgICBDaXR5OiBcIlN0YWR0XCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcIkxhbmRcIixcbiAgICAgICAgICAgIFppcDogXCJQb3N0bGVpdHphaGxcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJCYW5ra29udG9cIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJCYW5ra29udG9yZWdpc3RyaWVydW5nc251bW1lclwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyZWVrRGljdGlvbmFyeSBleHRlbmRzIEJhc2VEaWN0aW9uYXJ5IHtcblxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwizrTOuc61z43OuM+Fzr3Pg863XCIsXG4gICAgICAgICAgICBDaXR5OiBcIs+Az4zOu863XCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcIs+Hz47Pgc6xXCIsXG4gICAgICAgICAgICBaaXA6IFwiz4TOsc+Hz4XOtM+Bzr/OvM65zrrPjM+CIM66z47OtM65zrrOsc+CXCJcbiAgICAgICAgfSxcbiAgICAgICAgQmFua0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFjY291bnQ6IFwizqTPgc6xz4DOtc62zrnOus+Mz4IgzrvOv86zzrHPgc65zrHPg868z4zPglwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIs6Rz4HOuc64zrzPjM+CIM61zrPOs8+BzrHPhs6uz4Igz4TPgc6xz4DOtc62zrnOus6/z40gzrvOv86zzrHPgc65zrHPg868zr/PjVwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh1bmdhcmlhbkRpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImPDrW1cIixcbiAgICAgICAgICAgIENpdHk6IFwidsOhcm9zXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcIm9yc3rDoWdcIixcbiAgICAgICAgICAgIFppcDogXCJpcsOhbnnDrXTDs3N6w6FtXCJcbiAgICAgICAgfSxcbiAgICAgICAgQmFua0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFjY291bnQ6IFwiQmFua2kgc3rDoW1sYVwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIkJhbmtpIHN6w6FtbGEgcmVnaXN6dHLDoWNpw7NzIHN6w6FtYVwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljZWxhbmRpY0RpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImhlaW1pbGlzZmFuZ1wiLFxuICAgICAgICAgICAgQ2l0eTogXCJib3JnXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcImxhbmRcIixcbiAgICAgICAgICAgIFppcDogXCJww7NzdG7Dum1lclwiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIkJhbmthcmVpa25pbmd1clwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIk7Dum1lciBza3LDoW5pbmdhciDDoSBiYW5rYXJlaWtuaW5naVwiXG4gICAgICAgIH1cbiAgICB9O1xuXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSXRhbGlhbkRpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImluZGlyaXp6b1wiLFxuICAgICAgICAgICAgQ2l0eTogXCJjaXR0w6BcIixcbiAgICAgICAgICAgIENvdW50cnk6IFwibmF6aW9uZVwiLFxuICAgICAgICAgICAgWmlwOiBcImNvZGljZSBwb3N0YWxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgQmFua0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFjY291bnQ6IFwiY29udG8gYmFuY2FyaW9cIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJOdW1lcm8gZGkgcmVnaXN0cmF6aW9uZSBkZWwgY29udG8gYmFuY2FyaW9cIlxuICAgICAgICB9XG4gICAgfTtcbiAgICBcbn0iLCJpbXBvcnQgQmFzZURpY3Rpb25hcnkgZnJvbSBcIi4vQmFzZS9CYXNlRGljdGlvbmFyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXR2aWFuRGljdGlvbmFyeSBleHRlbmRzIEJhc2VEaWN0aW9uYXJ5IHtcblxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwiYWRyZXNlXCIsXG4gICAgICAgICAgICBDaXR5OiBcInBpbHPEk3RhXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcInZhbHN0c1wiLFxuICAgICAgICAgICAgWmlwOiBcInBhc3RhIGluZGVrc3NcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJCYW5rYXMga29udHNcIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJCYW5rYXMga29udGEgcmXEo2lzdHLEgWNpamFzIG51bXVyc1wiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpdHVhbmlhbkRpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImFkcmVzYXNcIixcbiAgICAgICAgICAgIENpdHk6IFwibWllc3Rhc1wiLFxuICAgICAgICAgICAgQ291bnRyeTogXCLFoWFsaXNcIixcbiAgICAgICAgICAgIFppcDogXCJwYcWhdG8ga29kYXNcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJCYW5rbyBzxIVza2FpdGFcIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJCYW5rbyBzxIVza2FpdG9zIHJlZ2lzdHJhY2lqb3MgbnVtZXJpc1wiXG4gICAgICAgIH1cbiAgICB9O1xuXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTm9yd2VnaWFuRGljdGlvbmFyeSBleHRlbmRzIEJhc2VEaWN0aW9uYXJ5IHtcblxuICAgIGRpY3Rpb25hcnk6IGFueSA9IHtcbiAgICAgICAgQWRkcmVzc0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFkZHJlc3M6IFwiYWRyZXNzZVwiLFxuICAgICAgICAgICAgQ2l0eTogXCJieVwiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJsYW5kXCIsXG4gICAgICAgICAgICBaaXA6IFwicG9zdG51bW1lclwiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIkJhbmtrb250b1wiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIlJlZ2lzdHJlcmluZ3NudW1tZXIgZm9yIGJhbmtrb250b1wiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvbGlzaERpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImFkcmVzXCIsXG4gICAgICAgICAgICBDaXR5OiBcIm1pYXN0b1wiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJrcmFqXCIsXG4gICAgICAgICAgICBaaXA6IFwia29kIHBvY3p0b3d5XCJcbiAgICAgICAgfSxcbiAgICAgICAgQmFua0VsZW1lbnQ6IHtcbiAgICAgICAgICAgIEFjY291bnQ6IFwiS29udG8gYmFua293ZVwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIk51bWVyIHJlamVzdHJhY3lqbnkga29udGEgYmFua293ZWdvXCJcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9ydHVndWVzZURpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImVuZGVyZcOnb1wiLFxuICAgICAgICAgICAgQ2l0eTogXCJjaWRhZGVcIixcbiAgICAgICAgICAgIENvdW50cnk6IFwicGHDrXNcIixcbiAgICAgICAgICAgIFppcDogXCJjw7NkaWdvIHBvc3RhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIkNvbnRhIGJhbmPDoXJpYVwiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIk7Dum1lcm8gZGUgcmVnaXN0cm8gZGEgY29udGEgYmFuY8OhcmlhXCJcbiAgICAgICAgfVxuICAgIH07XG4gICAgXG59IiwiaW1wb3J0IEJhc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0Jhc2UvQmFzZURpY3Rpb25hcnlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BhbmlzaERpY3Rpb25hcnkgZXh0ZW5kcyBCYXNlRGljdGlvbmFyeSB7XG5cbiAgICBkaWN0aW9uYXJ5OiBhbnkgPSB7XG4gICAgICAgIEFkZHJlc3NFbGVtZW50OiB7XG4gICAgICAgICAgICBBZGRyZXNzOiBcImRpcmVjY2nDs25cIixcbiAgICAgICAgICAgIENpdHk6IFwiY2l1ZGFkXCIsXG4gICAgICAgICAgICBDb3VudHJ5OiBcInBhw61zXCIsXG4gICAgICAgICAgICBaaXA6IFwiY8OzZGlnbyBwb3N0YWxcIlxuICAgICAgICB9LFxuICAgICAgICBCYW5rRWxlbWVudDoge1xuICAgICAgICAgICAgQWNjb3VudDogXCJDdWVudGEgYmFuY2FyaWFcIixcbiAgICAgICAgICAgIFJlZ2lzdHJhdGlvbk51bWJlcjogXCJOw7ptZXJvIGRlIHJlZ2lzdHJvIGRlIGN1ZW50YSBiYW5jYXJpYVwiXG4gICAgICAgIH1cbiAgICB9O1xuICAgIFxufSIsImltcG9ydCBCYXNlRGljdGlvbmFyeSBmcm9tIFwiLi9CYXNlL0Jhc2VEaWN0aW9uYXJ5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3ZWRpc2hEaWN0aW9uYXJ5IGV4dGVuZHMgQmFzZURpY3Rpb25hcnkge1xuXG4gICAgZGljdGlvbmFyeTogYW55ID0ge1xuICAgICAgICBBZGRyZXNzRWxlbWVudDoge1xuICAgICAgICAgICAgQWRkcmVzczogXCJhZHJlc3NcIixcbiAgICAgICAgICAgIENpdHk6IFwic3RhZFwiLFxuICAgICAgICAgICAgQ291bnRyeTogXCJsYW5kXCIsXG4gICAgICAgICAgICBaaXA6IFwicG9zdG51bW1lclwiXG4gICAgICAgIH0sXG4gICAgICAgIEJhbmtFbGVtZW50OiB7XG4gICAgICAgICAgICBBY2NvdW50OiBcIkJhbmtrb250b1wiLFxuICAgICAgICAgICAgUmVnaXN0cmF0aW9uTnVtYmVyOiBcIkJhbmtrb250b3JlZ2lzdHJlcmluZ3NudW1tZXJcIlxuICAgICAgICB9XG4gICAgfTtcbiAgICBcbn0iLCJpbXBvcnQgRGFuaXNoRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvRGFuaXNoRGljdGlvbmFyeVwiO1xuaW1wb3J0IEVuZ2xpc2hEaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9FbmdsaXNoRGljdGlvbmFyeVwiO1xuaW1wb3J0IEN6ZWNoRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvQ3plY2hEaWN0aW9uYXJ5XCI7XG5pbXBvcnQgR2VybWFuRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvR2VybWFuRGljdGlvbmFyeVwiO1xuaW1wb3J0IEdyZWVrRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvR3JlZWtEaWN0aW9uYXJ5XCI7XG5pbXBvcnQgU3BhbmlzaERpY3Rpb25hcnkgZnJvbSBcIi4vTGFuZ3VhZ2VzL1NwYW5pc2hEaWN0aW9uYXJ5XCI7XG5pbXBvcnQgRXN0b25pYW5EaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9Fc3RvbmlhbkRpY3Rpb25hcnlcIjtcbmltcG9ydCBGaW5uaXNoRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvRmlubmlzaERpY3Rpb25hcnlcIjtcbmltcG9ydCBGcmVuY2hEaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9GcmVuY2hEaWN0aW9uYXJ5XCI7XG5pbXBvcnQgSHVuZ2FyaWFuRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvSHVuZ2FyaWFuRGljdGlvbmFyeVwiO1xuaW1wb3J0IEljZWxhbmRpY0RpY3Rpb25hcnkgZnJvbSBcIi4vTGFuZ3VhZ2VzL0ljZWxhbmRpY0RpY3Rpb25hcnlcIjtcbmltcG9ydCBJdGFsaWFuRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvSXRhbGlhbkRpY3Rpb25hcnlcIjtcbmltcG9ydCBMYXR2aWFuRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvTGF0dmlhbkRpY3Rpb25hcnlcIjtcbmltcG9ydCBMaXR1YW5pYW5EaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9MaXR1YW5pYW5EaWN0aW9uYXJ5XCI7XG5pbXBvcnQgRHV0Y2hEaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9EdXRjaERpY3Rpb25hcnlcIjtcbmltcG9ydCBOb3J3ZWdpYW5EaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9Ob3J3ZWdpYW5EaWN0aW9uYXJ5XCI7XG5pbXBvcnQgUG9saXNoRGljdGlvbmFyeSBmcm9tIFwiLi9MYW5ndWFnZXMvUG9saXNoRGljdGlvbmFyeVwiO1xuaW1wb3J0IFBvcnR1Z3Vlc2VEaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9Qb3J0dWd1ZXNlRGljdGlvbmFyeVwiO1xuaW1wb3J0IFN3ZWRpc2hEaWN0aW9uYXJ5IGZyb20gXCIuL0xhbmd1YWdlcy9Td2VkaXNoRGljdGlvbmFyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFuc2xhdG9yIHtcblx0cHJpdmF0ZSBzdGF0aWMgbGFuZ2F1Z2VzID0gW1xuXHRcdCdlbicsXG5cdFx0J2RhJyxcbiAgICAgICAgJ2NzJyxcbiAgICAgICAgJ2RlJyxcbiAgICAgICAgJ2VsJyxcbiAgICAgICAgJ2VzJyxcbiAgICAgICAgJ2V0JyxcbiAgICAgICAgJ2ZpJyxcbiAgICAgICAgJ2ZyJyxcbiAgICAgICAgJ2h1JyxcbiAgICAgICAgJ2lzJyxcbiAgICAgICAgJ2l0JyxcbiAgICAgICAgJ2x0JyxcbiAgICAgICAgJ2x2JyxcbiAgICAgICAgJ25sJyxcbiAgICAgICAgJ25vJyxcbiAgICAgICAgJ3BsJyxcbiAgICAgICAgJ3B0JyxcbiAgICAgICAgJ3N2Jyxcblx0XTtcblxuXHRwcml2YXRlIHN0YXRpYyBkYW5pc2hEaWN0aW9uYXJ5ID0gbmV3IERhbmlzaERpY3Rpb25hcnkoKTtcblx0cHJpdmF0ZSBzdGF0aWMgZW5nbGlzaERpY3Rpb25hcnkgPSBuZXcgRW5nbGlzaERpY3Rpb25hcnkoKTtcbiAgICBwcml2YXRlIHN0YXRpYyBjemVjaERpY3Rpb25hcnkgPSBuZXcgQ3plY2hEaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2VybWFuRGljdGlvbmFyeSA9IG5ldyBHZXJtYW5EaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ3JlZWtEaWN0aW9uYXJ5ID0gbmV3IEdyZWVrRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIHNwYW5pc2hEaWN0aW9uYXJ5ID0gbmV3IFNwYW5pc2hEaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZXN0b25pYW5EaWN0aW9uYXJ5ID0gbmV3IEVzdG9uaWFuRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIGZpbm5pc2hEaWN0aW9uYXJ5ID0gbmV3IEZpbm5pc2hEaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZnJlbmNoRGljdGlvbmFyeSA9IG5ldyBGcmVuY2hEaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaHVuZ2FyaWFuRGljdGlvbmFyeSA9IG5ldyBIdW5nYXJpYW5EaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaWNlbGFuZGljRGljdGlvbmFyeSA9IG5ldyBJY2VsYW5kaWNEaWN0aW9uYXJ5KCk7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaXRhbGlhbkRpY3Rpb25hcnkgPSBuZXcgSXRhbGlhbkRpY3Rpb25hcnkoKTtcbiAgICBwcml2YXRlIHN0YXRpYyBsYXR2aWFuRGljdGlvbmFyeSA9IG5ldyBMYXR2aWFuRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIGxpdHVhbmlhbkRpY3Rpb25hcnkgPSBuZXcgTGl0dWFuaWFuRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIGR1dGNoRGljdGlvbmFyeSA9IG5ldyBEdXRjaERpY3Rpb25hcnkoKTtcbiAgICBwcml2YXRlIHN0YXRpYyBub3J3ZWdpYW5EaWN0aW9uYXJ5ID0gbmV3IE5vcndlZ2lhbkRpY3Rpb25hcnkoKTtcbiAgICBwcml2YXRlIHN0YXRpYyBwb2xpc2hEaWN0aW9uYXJ5ID0gbmV3IFBvbGlzaERpY3Rpb25hcnkoKTtcbiAgICBwcml2YXRlIHN0YXRpYyBwb3J0dWd1ZXNlRGljdGlvbmFyeSA9IG5ldyBQb3J0dWd1ZXNlRGljdGlvbmFyeSgpO1xuICAgIHByaXZhdGUgc3RhdGljIHN3ZWRpc2hEaWN0aW9uYXJ5ID0gbmV3IFN3ZWRpc2hEaWN0aW9uYXJ5KCk7XG5cblx0c3RhdGljIFRyYW5zbGF0ZShrZXk6IHN0cmluZywgbGFuZ3VhZ2UgPSAnZGEnKTogc3RyaW5nIHtcblx0XHRsYW5ndWFnZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29uc3QgaXNTdXBwb3J0ZWRMYW5ndWFnZSA9IFRyYW5zbGF0b3IubGFuZ2F1Z2VzLmluZGV4T2YobGFuZ3VhZ2UpICE9IC0xO1xuXHRcdGlmICghaXNTdXBwb3J0ZWRMYW5ndWFnZSkge1xuXHRcdFx0bGFuZ3VhZ2UgPSAnZGEnXG5cdFx0fVxuXHRcdHN3aXRjaCAobGFuZ3VhZ2UpIHtcblx0XHRcdGNhc2UgJ2RhJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZGFuaXNoRGljdGlvbmFyeS5nZXQoa2V5KTtcblx0XHRcdGNhc2UgJ2VuJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZW5nbGlzaERpY3Rpb25hcnkuZ2V0KGtleSk7XG4gICAgICAgICAgICBjYXNlICdjcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3plY2hEaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAnZGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdlcm1hbkRpY3Rpb25hcnkuZ2V0KGtleSk7XG4gICAgICAgICAgICBjYXNlICdlbCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JlZWtEaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNwYW5pc2hEaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAnZXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVzdG9uaWFuRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ2ZpJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5uaXNoRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ2ZyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mcmVuY2hEaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAnaHUnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh1bmdhcmlhbkRpY3Rpb25hcnkuZ2V0KGtleSk7XG4gICAgICAgICAgICBjYXNlICdpcyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWNlbGFuZGljRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ2l0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pdGFsaWFuRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ2x0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYXR2aWFuRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ2x2JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXR1YW5pYW5EaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAnbmwnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmR1dGNoRGljdGlvbmFyeS5nZXQoa2V5KTtcbiAgICAgICAgICAgIGNhc2UgJ25vJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3J3ZWdpYW5EaWN0aW9uYXJ5LmdldChrZXkpO1xuICAgICAgICAgICAgY2FzZSAncGwnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvbGlzaERpY3Rpb25hcnkuZ2V0KGtleSk7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9ydHVndWVzZURpY3Rpb25hcnkuZ2V0KGtleSk7XG4gICAgICAgICAgICBjYXNlICdzdic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3dlZGlzaERpY3Rpb25hcnkuZ2V0KGtleSk7XG5cdFx0fVxuXHR9XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QXR0cmlidXRlTmFtZXNQb2x5ZmlsbCgpIHtcblx0aWYgKEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5hbWVzID09IHVuZGVmaW5lZCkge1xuXHRcdEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5hbWVzID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cdFx0XHR2YXIgbGVuZ3RoID0gYXR0cmlidXRlcy5sZW5ndGg7XG5cdFx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IGF0dHJpYnV0ZXNbaV0ubmFtZTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fVxufTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycmF5VXRpbCB7XG5cdHB1YmxpYyBzdGF0aWMgRnJvbU5vZGVMaXN0PFQgZXh0ZW5kcyBOb2RlPihsaXN0OiBOb2RlTGlzdE9mPFQ+KTogVFtdIHtcblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgbGlzdCBhcyBhbnkpO1xuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgYWRkVG9DdXJyZW50PFQ+KGNodW5rczogVFtdW10sIGl0ZW06IFQpIHtcblx0XHRpZiAoIWNodW5rcy5sZW5ndGgpIHtcblx0XHRcdGNodW5rc1swXSA9IFtdO1xuXHRcdH1cblx0XHRjaHVua3NbY2h1bmtzLmxlbmd0aCAtIDFdLnB1c2goaXRlbSk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBhZGRUb05ldzxUPihjaHVua3M6IFRbXVtdLCBpdGVtOiBUKSB7XG5cdFx0Y2h1bmtzW2NodW5rcy5sZW5ndGhdID0gW107XG5cdFx0Y2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXS5wdXNoKGl0ZW0pO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBkaXZpZGVBY2NvcmRpbmdQcm9wZXJ0eTxUPihhcnJheTogVFtdLCBzZWxlY3RvcjogKGl0ZW06IFQpID0+IGFueSk6IFRbXVtdIHtcblx0XHRjb25zdCBjaHVua3MgPSBbXTtcblx0XHRjaHVua3NbMF0gPSBbYXJyYXlbMF1dO1xuXHRcdGFycmF5LnJlZHVjZSgoYSwgYikgPT4ge1xuXHRcdFx0aWYgKHNlbGVjdG9yKGEpID09PSBzZWxlY3RvcihiKSkge1xuXHRcdFx0XHR0aGlzLmFkZFRvQ3VycmVudChjaHVua3MsIGIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5hZGRUb05ldyhjaHVua3MsIGIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGI7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGNodW5rcztcblx0fVxufVxuIiwiaW1wb3J0IHsgVmlld3BvcnRVdGlsIH0gZnJvbSAnLi9WaWV3cG9ydFV0aWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb21VdGlsIHtcbiAgICBwcml2YXRlIHZpZXdQb3J0VXRpbDogVmlld3BvcnRVdGlsO1xuICAgIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50O1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy52aWV3UG9ydFV0aWwgPSBuZXcgVmlld3BvcnRVdGlsKHRoaXMuZWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGFBdHRyKGF0dHI6IHN0cmluZywgZGVmYXVsdHZhbHVlPzogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS0ke2F0dHJ9YCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGRlZmF1bHR2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGF0YUF0dHIoYXR0cjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLSR7YXR0cn1gLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEF0dHIoYXR0cjogc3RyaW5nLCBkZWZhdWx0dmFsdWU/OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHIpO1xuICAgICAgICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZGVmYXVsdHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBdHRyKGF0dHI6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZUF0dHIoYXR0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVEYXRhQXR0cihhdHRyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtJHthdHRyfWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNBdHRyKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuXG4gICAgcHVibGljIHNoYWtlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGVuZENsYXNzKCdzaGFrZScpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3NoYWtlJyk7XG4gICAgICAgICAgICAodGhpcy5lbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnJlYWRPbmx5ID0gZmFsc2U7XG4gICAgICAgIH0sIDYwMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGVuZENsYXNzKCdlcnJvcicpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ2Vycm9yJyk7XG4gICAgICAgICAgICAodGhpcy5lbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnJlYWRPbmx5ID0gZmFsc2U7XG4gICAgICAgIH0sIDUwMDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdQb3J0VXRpbC5Jc1Zpc2libGUoKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlQ2xhc3MoY2xhc3NuYW1lKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFwcGVuZENsYXNzKGNsYXNzbmFtZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc25hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDaGlsZEVsZW1lbnRCeUF0dHJOYW1lKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaXJzdExldHRlciA9IG5hbWUucmVwbGFjZSgvXlxcdy8sIGMgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgY29uc3QgU3ViRWxlbWVudCA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYFtuYW1lPVwiJHtmaXJzdExldHRlcn1cIl1gLFxuICAgICAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGlmIChTdWJFbGVtZW50KSB7XG4gICAgICAgICAgICBTdWJFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3R5bGUocnVsZU5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnQpW3J1bGVOYW1lXTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBEb21VdGlsaXR5IHtcblxuXHQvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjMwNDQ1L2phdmFzY3JpcHQtcmVnZXgtaG93LXRvLWJvbGQtc3BlY2lmaWMtd29yZHMtd2l0aC1yZWdleFxuXHRzdGF0aWMgYm9sZGVuVGV4dChpbnB1dFRleHQ6IHN0cmluZywgbWF0Y2hpbmRUZXh0VG9Cb2xkZW46IHN0cmluZykge1xuXHRcdHJldHVybiBpbnB1dFRleHQucmVwbGFjZShuZXcgUmVnRXhwKCcoXnwpKCcgKyBtYXRjaGluZFRleHRUb0JvbGRlbiArICcpKHwkKScsICdpZycpLCAnJDE8Yj4kMjwvYj4kMycpO1xuXHR9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFrZVJlcXVlc3Qge1xuICAgIG1ldGhvZDogc3RyaW5nO1xuICAgIHVybDogc3RyaW5nO1xuICAgIGhlYWRlcnM6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyA9ICdnZXQnLCBoZWFkZXJzOiBhbnkgPSB7fSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRIZWFkZXJzKGh0dHBSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiB0aGlzLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGh0dHBSZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCB0aGlzLmhlYWRlcnNbaGVhZGVyXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZW5kKGRhdGE6IGFueSA9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHhtbEh0dHBSZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICB4bWxIdHRwUmVxdWVzdC5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCk7XG4gICAgICAgICAgICB0aGlzLnNldEhlYWRlcnMoeG1sSHR0cFJlcXVlc3QpO1xuICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3Quc3RhdHVzID49IDIwMCAmJlxuICAgICAgICAgICAgICAgICAgICB4bWxIdHRwUmVxdWVzdC5zdGF0dXMgPCAzMDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh4bWxIdHRwUmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogeG1sSHR0cFJlcXVlc3Quc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogeG1sSHR0cFJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHhtbEh0dHBSZXF1ZXN0LnJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHhtbEh0dHBSZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogeG1sSHR0cFJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogeG1sSHR0cFJlcXVlc3QucmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgeG1sSHR0cFJlcXVlc3Quc2VuZChkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFN0cmluZ1V0aWwge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBTdHJpbmdGb3JtYXQoc3RyOiBzdHJpbmcsIC4uLmFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgveyhcXGQrKX0vZywgKG1hdGNoLCBpbmRleCkgPT4gYXJnc1tpbmRleF0gfHwgJycpO1xuICAgIH1cbn0iLCJleHBvcnQgY2xhc3MgVmlld3BvcnRVdGlsIHtcbiAgICBwcml2YXRlIGVsZW1lbnQ/OiBIVE1MRWxlbWVudDtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgSXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoKGJvdW5kcy50b3AgPiAwICYmIGJvdW5kcy50b3AgPCBpbm5lckhlaWdodCkgfHxcbiAgICAgICAgICAgICAgICAoYm91bmRzLmJvdHRvbSA+IDAgJiYgYm91bmRzLmJvdHRvbSA8IGlubmVySGVpZ2h0KSkgJiZcbiAgICAgICAgICAgICgoYm91bmRzLmxlZnQgPiAwICYmIGJvdW5kcy5sZWZ0IDwgaW5uZXJXaWR0aCkgfHxcbiAgICAgICAgICAgICAgICAoYm91bmRzLnJpZ2h0ID4gMCAmJiBib3VuZHMucmlnaHQgPCBpbm5lcldpZHRoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgSXNQYXJ0aWFsbHlWaXNpYmxlKCkge1xuICAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBib3VuZHMudG9wID49IDAgfHxcbiAgICAgICAgICAgIGJvdW5kcy5sZWZ0ID49IDAgfHxcbiAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gPD0gaW5uZXJIZWlnaHQgfHxcbiAgICAgICAgICAgIGJvdW5kcy5yaWdodCA8PSBpbm5lcldpZHRoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIElzT2Zmc2V0VmlzaWJsZShvZmZzZXQ6IG51bWJlciA9IDMwMCkge1xuICAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBib3VuZHMudG9wICsgb2Zmc2V0ID49IDAgfHxcbiAgICAgICAgICAgIGJvdW5kcy5sZWZ0ICsgb2Zmc2V0ID49IDAgfHxcbiAgICAgICAgICAgIGJvdW5kcy5ib3R0b20gLSBvZmZzZXQgPD0gaW5uZXJIZWlnaHQgfHxcbiAgICAgICAgICAgIGJvdW5kcy5yaWdodCAtIG9mZnNldCA8PSBpbm5lcldpZHRoXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIFdpbmRvd1RvcChvZmZzZXQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgY29uc3QgWU9mZnNldCA9XG4gICAgICAgICAgICB3aW5kb3cucGFnZVlPZmZzZXQgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8XG4gICAgICAgICAgICAwO1xuICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IFlPZmZzZXQ7XG4gICAgfVxufVxuIiwidHlwZSBQcm9jZWR1cmUgPSAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuaW50ZXJmYWNlIERlYm91bmNlIHtcblx0KC4uLmFyZ3M6IGFueVtdKTogYW55O1xuXHRjbGVhcjogKCkgPT4gdm9pZDtcblx0Zmx1c2g6ICgpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGRlYm91bmNlciA9IChmdW5jOiBQcm9jZWR1cmUsIHdhaXQ6IG51bWJlciwgaW1tZWRpYXRlOiBib29sZWFuID0gZmFsc2UpID0+IHtcblx0bGV0IHRpbWVvdXQ6IG51bWJlciB8IG51bGw7XG5cdGxldCBhcmdzOiBhbnk7XG5cdGxldCBjb250ZXh0OiBhbnk7XG5cdGxldCByZXN1bHQ6IGFueTtcblxuXHRjb25zdCBsYXRlciA9ICgpID0+IHtcblx0XHR0aW1lb3V0ID0gbnVsbDtcblx0XHRpZiAoIWltbWVkaWF0ZSkge1xuXHRcdFx0cmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHRcdGNvbnRleHQgPSBhcmdzID0gbnVsbDtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZGVib3VuY2VkRnVuYzogUHJvY2VkdXJlID0gZnVuY3Rpb24gKHRoaXM6IGFueSkge1xuXHRcdGNvbnRleHQgPSB0aGlzO1xuXHRcdGFyZ3MgPSBhcmd1bWVudHM7XG5cdFx0Y29uc3QgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcblxuXHRcdGlmICghdGltZW91dCkge1xuXHRcdFx0dGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0XHR9XG5cblx0XHRpZiAoY2FsbE5vdykge1xuXHRcdFx0cmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcblx0XHRcdGNvbnRleHQgPSBhcmdzID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdGNvbnN0IGNsZWFyID0gKCkgPT4ge1xuXHRcdGlmICh0aW1lb3V0KSB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG5cdFx0XHR0aW1lb3V0ID0gbnVsbDtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZmx1c2ggPSAoKSA9PiB7XG5cdFx0aWYgKHRpbWVvdXQpIHtcblx0XHRcdHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG5cdFx0XHRjb250ZXh0ID0gYXJncyA9IG51bGw7XG5cblx0XHRcdGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0XHRcdHRpbWVvdXQgPSBudWxsO1xuXHRcdH1cblx0fTtcblxuXHRjb25zdCBkZWJvdW5jZWQ6IERlYm91bmNlID0gKCgpID0+IHtcblx0XHRjb25zdCBmOiBhbnkgPSBkZWJvdW5jZWRGdW5jO1xuXHRcdGYuY2xlYXIgPSBjbGVhcjtcblx0XHRmLmZsdXNoID0gZmx1c2g7XG5cdFx0cmV0dXJuIGY7XG5cdH0pKCk7XG5cblx0cmV0dXJuIGRlYm91bmNlZDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlYm91bmNlcjsiLCJpbXBvcnQgSVZhbGlkYXRpb24gZnJvbSAnLi4vSVZhbGlkYXRvci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW5rQWNjb3VudFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uIHtcbiAgICBpc1NhdGlzZmllZEJ5KGlucHV0OiBzdHJpbmcsIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiIsImltcG9ydCBJVmFsaWRhdGlvbiBmcm9tICcuLi9JVmFsaWRhdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbmtBY2NvdW50UmVnaXN0cmF0aW9uTnVtYmVyVmFsaWRhdG9yXG4gICAgaW1wbGVtZW50cyBJVmFsaWRhdGlvbiB7XG4gICAgaXNTYXRpc2ZpZWRCeShpbnB1dDogc3RyaW5nLCBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgSVZhbGlkYXRpb24gZnJvbSAnLi4vSVZhbGlkYXRvci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYW5rSWROb3J3YXlWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdGlvbiB7XG4gICAgaXNTYXRpc2ZpZWRCeShpbnB1dDogc3RyaW5nLCBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja05vUGVyc29ubnVtbWVyKGlucHV0LCBhbGxvd0VtcHR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrTm9QZXJzb25udW1tZXIoXG4gICAgICAgIGlucHV0OiBzdHJpbmcsXG4gICAgICAgIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsb3dFbXB0eTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwZXJzb25udW1tZXI6IHN0cmluZyA9IGlucHV0LnJlcGxhY2UoJyAnLCAnJykucmVwbGFjZSgnLScsICcnKTtcbiAgICAgICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAvXigwWzEtOV18MVswLTldfDJbMC05XXwzWzAtMV0pKDBbMS05XXwxWzAtMl0pKFxcZHsyfSkoXFxkezV9KSQvLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChwZXJzb25udW1tZXIpO1xuICAgIH1cbn1cbiIsImltcG9ydCBJVmFsaWRhdGlvbiBmcm9tICcuLi9JVmFsaWRhdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbmtJZFN3ZWRlblZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uIHtcbiAgICBpc1NhdGlzZmllZEJ5KGlucHV0OiBzdHJpbmcsIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrU2VQZXJzb25udW1tZXIoaW5wdXQsIGFsbG93RW1wdHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tTZVBlcnNvbm51bW1lcihcbiAgICAgICAgaW5wdXQ6IHN0cmluZyxcbiAgICAgICAgYWxsb3dFbXB0eTogYm9vbGVhbiA9IHRydWUsXG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxvd0VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBlcnNvbm51bW1lcjogc3RyaW5nID0gaW5wdXQucmVwbGFjZSgnICcsICcnKS5yZXBsYWNlKCctJywgJycpO1xuICAgICAgICBjb25zdCByZWdleDogUmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgIC9eKDE5XFxkezJ9fDIwXFxkezJ9KSgwWzEtOV18MVswLTJdKSgwWzEtOV18MVswLTldfDJbMC05XXwzWzAtMV0pKFxcZHs0fSkkLyxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QocGVyc29ubnVtbWVyKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgSVZhbGlkYXRpb24gZnJvbSAnLi4vSVZhbGlkYXRvci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcHJWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdGlvbiB7XG4gICAgaXNTYXRpc2ZpZWRCeShpbnB1dDogc3RyaW5nLCBhbGxvd0VtcHR5OiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGVja0NwcihpbnB1dCwgYWxsb3dFbXB0eSk7XG4gICAgfVxuICAgIHByaXZhdGUgbW9kdWx1czExTXVsdGlwbHkodmFsdWU6IG51bWJlciwgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2w6IG51bWJlcltdID0gWzQsIDMsIDIsIDcsIDYsIDUsIDQsIDMsIDIsIDFdO1xuICAgICAgICByZXR1cm4gY29udHJvbFtpbmRleF0gKiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vZHVsdXMxMUV4Y2VwdGlvbnMoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBleGNlcHRpb25EYXRlczogRGF0ZVtdID0gW1xuICAgICAgICAgICAgMTk2MCxcbiAgICAgICAgICAgIDE5NjQsXG4gICAgICAgICAgICAxOTY1LFxuICAgICAgICAgICAgMTk2NixcbiAgICAgICAgICAgIDE5NjksXG4gICAgICAgICAgICAxOTcwLFxuICAgICAgICAgICAgMTk4MCxcbiAgICAgICAgICAgIDE5ODIsXG4gICAgICAgICAgICAxOTg0LFxuICAgICAgICAgICAgMTk4NSxcbiAgICAgICAgICAgIDE5ODYsXG4gICAgICAgICAgICAxOTg3LFxuICAgICAgICAgICAgMTk4OCxcbiAgICAgICAgICAgIDE5ODksXG4gICAgICAgICAgICAxOTkwLFxuICAgICAgICBdLm1hcCh4ID0+IG5ldyBEYXRlKHgsIDAsIDEpKTsgLy8gbW9udGhzIGFyZSAwLWluZGV4ZWRcblxuICAgICAgICBjb25zdCBjcHJEYXRlOiBEYXRlID0gdGhpcy5nZXRDcHJEYXRlKGlucHV0KTtcblxuICAgICAgICByZXR1cm4gZXhjZXB0aW9uRGF0ZXMuc29tZSh4ID0+IHguZ2V0RGF0ZSgpID09PSBjcHJEYXRlLmdldERhdGUoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0NwckRhdGUoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgeWVhcjogbnVtYmVyID0gK2lucHV0LnN1YnN0cig0LCAyKSArIDIwMDA7XG4gICAgICAgIHllYXIgLT0geWVhciA+IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSA/IDEwMCA6IDA7IC8vIGlzIDIweHggb3IgMTl4eFxuICAgICAgICBjb25zdCBtb250aDogbnVtYmVyID0gK2lucHV0LnN1YnN0cigyLCAyKSAtIDE7XG4gICAgICAgIGNvbnN0IGRheTogbnVtYmVyID0gK2lucHV0LnN1YnN0cigwLCAyKTtcbiAgICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgICBkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoICYmXG4gICAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gZGF5XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDcHJEYXRlKGlucHV0OiBzdHJpbmcpOiBEYXRlIHtcbiAgICAgICAgbGV0IHllYXI6IG51bWJlciA9ICtpbnB1dC5zdWJzdHIoNCwgMikgKyAyMDAwO1xuICAgICAgICB5ZWFyIC09IHllYXIgPiBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgPyAxMDAgOiAwOyAvLyBpcyAyMHh4IG9yIDE5eHhcbiAgICAgICAgY29uc3QgbW9udGg6IG51bWJlciA9ICtpbnB1dC5zdWJzdHIoMiwgMikgLSAxO1xuICAgICAgICBjb25zdCBkYXk6IG51bWJlciA9ICtpbnB1dC5zdWJzdHIoMCwgMik7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrQ3ByKGlucHV0OiBzdHJpbmcsIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxvd0VtcHR5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNwcm5yOiBzdHJpbmcgPSBpbnB1dC5yZXBsYWNlKCcgJywgJycpLnJlcGxhY2UoJy0nLCAnJyk7XG4gICAgICAgIGlmICghY3BybnIubWF0Y2goL15cXGR7MTB9JC8pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrQ3ByRGF0ZShjcHJucikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2R1bHVzMTFFeGNlcHRpb25zKGNwcm5yKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3V0cHV0OiBudW1iZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICAgICAgb3V0cHV0ICs9IHRoaXMubW9kdWx1czExTXVsdGlwbHkoXG4gICAgICAgICAgICAgICAgcGFyc2VJbnQoY3BybnIuc3Vic3RyKGksIDEpLCAxMCksXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0ICUgMTEgPT09IDA7IC8vIGh2aXMgb3V0cHV0IGfDpXIgb3AgaSAxMSwgZXIgZGV0IGV0IGd5bGRpZ3QgY3ByLlxuICAgIH1cbn1cbiIsImltcG9ydCBJVmFsaWRhdGlvbiBmcm9tICcuLi9JVmFsaWRhdG9yLmludGVyZmFjZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEN2clZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0aW9uIHtcbiAgICBpc1NhdGlzZmllZEJ5KGlucHV0OiBzdHJpbmcsIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQ3ZyKGlucHV0LCBhbGxvd0VtcHR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrQ3ZyKGlucHV0OiBzdHJpbmcsIGFsbG93RW1wdHk6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghYWxsb3dFbXB0eSAmJiAhaW5wdXQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgY3ZybnI6IHN0cmluZyA9IGlucHV0LnJlcGxhY2UoJyAnLCAnJykucmVwbGFjZSgnLScsICcnKTtcbiAgICAgICAgaWYgKCFjdnJucikge1xuICAgICAgICAgICAgcmV0dXJuIGFsbG93RW1wdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEvXlxcZHs4fSQvLnRlc3QoY3ZybnIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjdnIgbnVtcmUga2FuIMOlYmVuYmFydCBvZ3PDpSBtb2R1bHVzMTEgdGVzdGVzLlxuICAgICAgICBsZXQgdG90YWw6IG51bWJlciA9IDA7XG5cbiAgICAgICAgWzIsIDcsIDYsIDUsIDQsIDMsIDIsIDFdLmZvckVhY2goKGVsbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRvdGFsICs9IHBhcnNlSW50KGN2cm5yW2luZGV4XSwgMTApICogZWxtO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdG90YWwgJSAxMSA9PT0gMDtcbiAgICB9XG59XG4iLCJjbGFzcyBlbGVtZW50Q29uZmlnIHtcblx0c2VsZWN0b3I6IHN0cmluZztcblx0dGVtcGxhdGU6IHN0cmluZztcblx0c3R5bGU6IHN0cmluZztcblx0dXNlU2hhZG93OiBib29sZWFuO1xuXHR0ZW1wbGF0ZVBhdGg/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHZhbGlkYXRlU2VsZWN0b3IgPSAoc2VsZWN0b3I6IHN0cmluZykgPT4ge1xuXHRpZiAoc2VsZWN0b3IuaW5kZXhPZignLScpIDw9IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIGF0IGxlYXN0IDEgZGFzaCBpbiB0aGUgY3VzdG9tIGVsZW1lbnQgbmFtZSEnKTtcblx0fVxufTtcblxuY29uc3QgQ3VzdG9tRWxlbWVudCA9IChjb25maWc6IGVsZW1lbnRDb25maWcpID0+IHtcblx0cmV0dXJuIChjbHM6IGFueSkgPT4ge1xuXHRcdHZhbGlkYXRlU2VsZWN0b3IoY29uZmlnLnNlbGVjdG9yKTtcblx0XHRsZXQgdGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcblx0XHRpZiAoIWNvbmZpZy50ZW1wbGF0ZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwYXNzIGEgdGVtcGxhdGUgZm9yIHRoZSBlbGVtZW50Jyk7XG5cdFx0fVxuXHRcdHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBgPHN0eWxlPiR7Y29uZmlnLnN0eWxlfTwvc3R5bGU+ICR7XG5cdFx0XHRjb25maWcudGVtcGxhdGVcblx0XHRcdH1gO1xuXHRcdGxldCBjb25uZWN0ZWRDYWxsYmFjayA9IGNscy5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2sgfHwgZnVuY3Rpb24gKCkgeyB9O1xuXHRcdGNvbnN0IGRpc2Nvbm5lY3RlZENhbGxiYWNrID0gY2xzLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjayB8fCBmdW5jdGlvbiAoKSB7IH07XG5cblx0XHRjbHMucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0bGV0IGNsb25lID0gZG9jdW1lbnQuaW1wb3J0Tm9kZSh0ZW1wbGF0ZUVsZW1lbnQuY29udGVudCwgdHJ1ZSk7XG5cdFx0XHRpZiAoY29uZmlnLnVzZVNoYWRvdyAmJiAhdGhpcy5zaGFkb3dSb290KSB7XG5cdFx0XHRcdHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pLmFwcGVuZENoaWxkKGNsb25lKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHRoaXMuY29tcG9uZW50V2lsbE1vdW50KSB7XG5cdFx0XHRcdHRoaXMuY29tcG9uZW50V2lsbE1vdW50KCk7XG5cdFx0XHR9XG5cdFx0XHRjb25uZWN0ZWRDYWxsYmFjay5jYWxsKHRoaXMpO1xuXHRcdFx0aWYgKHRoaXMuY29tcG9uZW50RGlkTW91bnQpIHtcblx0XHRcdFx0dGhpcy5jb21wb25lbnREaWRNb3VudCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjbHMucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHRoaXMuY29tcG9uZW50V2lsbFVubW91bnQpIHtcblx0XHRcdFx0dGhpcy5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fVxuXHRcdFx0ZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcblx0XHRcdGlmICh0aGlzLmNvbXBvbmVudERpZFVubW91bnQpIHtcblx0XHRcdFx0dGhpcy5jb21wb25lbnREaWRVbm1vdW50KCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbmZpZy5zZWxlY3RvciwgY2xzKTtcblx0fTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEN1c3RvbUVsZW1lbnQ7XG4iLCJpbXBvcnQgJ0B3ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy93ZWJjb21wb25lbnRzLWJ1bmRsZSc7XG5pbXBvcnQgJ0B3ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9jdXN0b20tZWxlbWVudHMtZXM1LWFkYXB0ZXIuanMnO1xuaW1wb3J0ICdAd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanMvd2ViY29tcG9uZW50cy1sb2FkZXIuanMnO1xuXG4vLyBmb3JtXG5pbXBvcnQgeyBDdXN0b21Gb3JtIH0gZnJvbSAnLi9jdXN0b20tZm9ybSc7XG5pbXBvcnQgeyBDdXN0b21JbnB1dEVsZW1lbnQgfSBmcm9tICcuL2ZyYW1ld29yay9DdXN0b21JbnB1dEVsZW1lbnQnO1xuXG4vLyBlbGVtZW50c1xuaW1wb3J0ICogYXMgZWxlbWVudHMgZnJvbSAnLi9lbGVtZW50cy9FbGVtZW50cyc7XG5cbmV4cG9ydCB7IEN1c3RvbUZvcm0sIGVsZW1lbnRzLCBDdXN0b21JbnB1dEVsZW1lbnQgfTtcbiJdfQ=="}