rubyfox-server 2.16.3.1 → 2.17.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubyfox/server/data/config/admin/admintool.xml +0 -0
  3. data/lib/rubyfox/server/data/config/admin/descriptors/config_room.txt +0 -0
  4. data/lib/rubyfox/server/data/config/admin/descriptors/config_server.txt +0 -0
  5. data/lib/rubyfox/server/data/config/admin/descriptors/config_zone.txt +0 -0
  6. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_game.txt +0 -0
  7. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_mmo.txt +0 -0
  8. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_room.txt +0 -0
  9. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_user.txt +0 -0
  10. data/lib/rubyfox/server/data/config/admin/descriptors/runtime_zone.txt +0 -0
  11. data/lib/rubyfox/server/data/config/admin/gmc/gmc.py +0 -0
  12. data/lib/rubyfox/server/data/config/admin/icons/Analytics.png +0 -0
  13. data/lib/rubyfox/server/data/config/admin/icons/Analytics.svg +0 -0
  14. data/lib/rubyfox/server/data/config/admin/icons/BanManager.png +0 -0
  15. data/lib/rubyfox/server/data/config/admin/icons/BanManager.svg +0 -0
  16. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.png +0 -0
  17. data/lib/rubyfox/server/data/config/admin/icons/BlueBoxMonitor.svg +0 -0
  18. data/lib/rubyfox/server/data/config/admin/icons/Console.png +0 -0
  19. data/lib/rubyfox/server/data/config/admin/icons/Console.svg +0 -0
  20. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.png +0 -0
  21. data/lib/rubyfox/server/data/config/admin/icons/Dashboard.svg +0 -0
  22. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.png +0 -0
  23. data/lib/rubyfox/server/data/config/admin/icons/ExtensionManager.svg +0 -0
  24. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.png +0 -0
  25. data/lib/rubyfox/server/data/config/admin/icons/LicenseManager.svg +0 -0
  26. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.png +0 -0
  27. data/lib/rubyfox/server/data/config/admin/icons/LogViewer.svg +0 -0
  28. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.png +0 -0
  29. data/lib/rubyfox/server/data/config/admin/icons/ServerConfigurator.svg +0 -0
  30. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.png +0 -0
  31. data/lib/rubyfox/server/data/config/admin/icons/ServletManager.svg +0 -0
  32. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.png +0 -0
  33. data/lib/rubyfox/server/data/config/admin/icons/ZoneConfigurator.svg +0 -0
  34. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.png +0 -0
  35. data/lib/rubyfox/server/data/config/admin/icons/ZoneMonitor.svg +0 -0
  36. data/lib/rubyfox/server/data/config/logParser.properties +17 -28
  37. data/lib/rubyfox/server/data/lib/BlueBox.war +0 -0
  38. data/lib/rubyfox/server/data/lib/apache-tomcat/NOTICE +1 -1
  39. data/lib/rubyfox/server/data/lib/apache-tomcat/README.md +3 -1
  40. data/lib/rubyfox/server/data/lib/apache-tomcat/RELEASE-NOTES +2 -2
  41. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/bootstrap.jar +0 -0
  42. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.bat +2 -0
  43. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/catalina.sh +2 -0
  44. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon-native.tar.gz +0 -0
  45. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/commons-daemon.jar +0 -0
  46. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-juli.jar +0 -0
  47. data/lib/rubyfox/server/data/lib/apache-tomcat/bin/tomcat-native.tar.gz +0 -0
  48. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.policy +6 -2
  49. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/catalina.properties +1 -0
  50. data/lib/rubyfox/server/data/lib/apache-tomcat/conf/keystore.jks +0 -0
  51. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/annotations-api.jar +0 -0
  52. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ant.jar +0 -0
  53. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ha.jar +0 -0
  54. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-ssi.jar +0 -0
  55. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-storeconfig.jar +0 -0
  56. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina-tribes.jar +0 -0
  57. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/catalina.jar +0 -0
  58. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.20.jar +0 -0
  59. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/el-api.jar +0 -0
  60. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper-el.jar +0 -0
  61. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jasper.jar +0 -0
  62. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jaspic-api.jar +0 -0
  63. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/jsp-api.jar +0 -0
  64. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/servlet-api.jar +0 -0
  65. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-api.jar +0 -0
  66. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-coyote.jar +0 -0
  67. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-dbcp.jar +0 -0
  68. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-cs.jar +0 -0
  69. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-de.jar +0 -0
  70. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-es.jar +0 -0
  71. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-fr.jar +0 -0
  72. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ja.jar +0 -0
  73. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ko.jar +0 -0
  74. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-pt-BR.jar +0 -0
  75. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-ru.jar +0 -0
  76. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-i18n-zh-CN.jar +0 -0
  77. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jdbc.jar +0 -0
  78. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-jni.jar +0 -0
  79. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util-scan.jar +0 -0
  80. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-util.jar +0 -0
  81. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/tomcat-websocket.jar +0 -0
  82. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/websocket-api.jar +0 -0
  83. data/lib/rubyfox/server/data/lib/commons-compress-1.19.jar +0 -0
  84. data/lib/rubyfox/server/data/lib/sfs2x.jar +0 -0
  85. data/lib/rubyfox/server/data/sfs2x-service +294 -159
  86. data/lib/rubyfox/server/data/sfs2x.sh +1 -1
  87. data/lib/rubyfox/server/data/www/BlueBox.war +0 -0
  88. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/_changes-to-default-themes_.txt +0 -0
  89. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/bootstrap.min.css +0 -0
  90. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/custom-bootstrap.min.css +0 -0
  91. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/css/all.min.css +0 -0
  92. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.eot +0 -0
  93. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.svg +0 -0
  94. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  95. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff +0 -0
  96. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  97. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.eot +0 -0
  98. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.svg +0 -0
  99. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  100. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff +0 -0
  101. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  102. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.eot +0 -0
  103. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.svg +0 -0
  104. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  105. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff +0 -0
  106. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  107. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/fonts.css +0 -0
  108. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/jquery.scrolling-tabs.min.css +0 -0
  109. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/kendo.custom-bootstrap-v4.css +0 -0
  110. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/reset.css +0 -0
  111. data/lib/rubyfox/server/data/www/ROOT/admin/assets/css/style.css +0 -0
  112. data/lib/rubyfox/server/data/www/ROOT/admin/assets/data/countries.geo.json +0 -0
  113. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.otf +0 -0
  114. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.ttf +0 -0
  115. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff +0 -0
  116. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/FreeMono.woff2 +0 -0
  117. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.ttf +0 -0
  118. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff +0 -0
  119. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300.woff2 +0 -0
  120. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.ttf +0 -0
  121. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff +0 -0
  122. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-300italic.woff2 +0 -0
  123. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.ttf +0 -0
  124. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff +0 -0
  125. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600.woff2 +0 -0
  126. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.ttf +0 -0
  127. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff +0 -0
  128. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-600italic.woff2 +0 -0
  129. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.ttf +0 -0
  130. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff +0 -0
  131. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700.woff2 +0 -0
  132. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.ttf +0 -0
  133. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff +0 -0
  134. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-700italic.woff2 +0 -0
  135. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.ttf +0 -0
  136. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff +0 -0
  137. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800.woff2 +0 -0
  138. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.ttf +0 -0
  139. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff +0 -0
  140. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-800italic.woff2 +0 -0
  141. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.ttf +0 -0
  142. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff +0 -0
  143. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-italic.woff2 +0 -0
  144. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.ttf +0 -0
  145. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff +0 -0
  146. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/open-sans-v15-cyrillic_greek_cyrillic-ext_vietnamese_latin_latin-ext_greek-ext-regular.woff2 +0 -0
  147. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.ttf +0 -0
  148. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff +0 -0
  149. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-300.woff2 +0 -0
  150. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.ttf +0 -0
  151. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff +0 -0
  152. data/lib/rubyfox/server/data/www/ROOT/admin/assets/fonts/roboto-condensed-v16-latin-700.woff2 +0 -0
  153. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/compare.png +0 -0
  154. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsChart.png +0 -0
  155. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsCompare.png +0 -0
  156. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsFilter.png +0 -0
  157. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsMap.png +0 -0
  158. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/demographicsTable.png +0 -0
  159. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyChart.png +0 -0
  160. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyCompare.png +0 -0
  161. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyFilter.png +0 -0
  162. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/analytics-adv/technologyTable.png +0 -0
  163. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/apple-touch-icon-180x180.png +0 -0
  164. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-16x16.png +0 -0
  165. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-32x32.png +0 -0
  166. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/favicon-64x64.png +0 -0
  167. data/lib/rubyfox/server/data/www/ROOT/admin/assets/images/logo.png +0 -0
  168. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/application.bundle.js +4 -3
  169. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-0.bundle.js +0 -0
  170. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-1.bundle.js +96 -4
  171. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-10.bundle.js +0 -0
  172. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-11.bundle.js +0 -0
  173. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12.bundle.js +0 -0
  174. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-12~module-13~module-9.bundle.js +15 -2
  175. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-13.bundle.js +0 -0
  176. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-3.bundle.js +0 -0
  177. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-4.bundle.js +0 -0
  178. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-5.bundle.js +0 -0
  179. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-6.bundle.js +0 -0
  180. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-7.bundle.js +0 -0
  181. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-8.bundle.js +0 -0
  182. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/module-9.bundle.js +0 -0
  183. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0.bundle.js +0 -0
  184. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-0~module-1~module-13~module-4~module-5~module-7~module-8.bundle.js +0 -0
  185. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-1.bundle.js +983 -0
  186. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/core/modules/vendors~module-9.bundle.js +0 -0
  187. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/bootstrap.min.js +0 -0
  188. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery-3.3.1.min.js +0 -0
  189. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/jquery.scrolling-tabs.min.js +0 -0
  190. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/js.cookie.min.js +0 -0
  191. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/kendo.all.min.js +0 -0
  192. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/popper.min.js +0 -0
  193. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/sfs2x-api-1.7.15.js +0 -0
  194. data/lib/rubyfox/server/data/www/ROOT/admin/assets/js/libs/versions-readme.txt +0 -0
  195. data/lib/rubyfox/server/data/www/ROOT/admin/index.html +0 -0
  196. data/lib/rubyfox/server/data/www/ROOT/admin/manifest.json +0 -0
  197. data/lib/rubyfox/server/data/www/ROOT/admin/modules/analytics.html +0 -0
  198. data/lib/rubyfox/server/data/www/ROOT/admin/modules/ban-manager.html +6 -0
  199. data/lib/rubyfox/server/data/www/ROOT/admin/modules/blue-box-monitor.html +0 -0
  200. data/lib/rubyfox/server/data/www/ROOT/admin/modules/console.html +0 -0
  201. data/lib/rubyfox/server/data/www/ROOT/admin/modules/dashboard.html +0 -0
  202. data/lib/rubyfox/server/data/www/ROOT/admin/modules/extension-manager.html +0 -0
  203. data/lib/rubyfox/server/data/www/ROOT/admin/modules/license-manager.html +0 -0
  204. data/lib/rubyfox/server/data/www/ROOT/admin/modules/log-viewer.html +0 -0
  205. data/lib/rubyfox/server/data/www/ROOT/admin/modules/server-configurator.html +0 -0
  206. data/lib/rubyfox/server/data/www/ROOT/admin/modules/servlet-manager.html +0 -0
  207. data/lib/rubyfox/server/data/www/ROOT/admin/modules/template.html +0 -0
  208. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-configurator.html +0 -0
  209. data/lib/rubyfox/server/data/www/ROOT/admin/modules/zone-monitor.html +0 -0
  210. data/lib/rubyfox/server/version.rb +1 -1
  211. metadata +7 -6
  212. data/lib/rubyfox/server/data/lib/apache-tomcat/lib/ecj-4.17.jar +0 -0
@@ -360,6 +360,9 @@ __webpack_require__.r(__webpack_exports__);
360
360
  /* harmony import */ var _data_banned_user__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/banned-user */ "./src/data/banned-user.js");
361
361
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! moment */ "./node_modules/moment/moment.js");
362
362
  /* harmony import */ var moment__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(moment__WEBPACK_IMPORTED_MODULE_2__);
363
+ /* harmony import */ var clipboard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clipboard */ "./node_modules/clipboard/dist/clipboard.js");
364
+ /* harmony import */ var clipboard__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(clipboard__WEBPACK_IMPORTED_MODULE_3__);
365
+
363
366
 
364
367
 
365
368
 
@@ -419,6 +422,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
419
422
  sortable: true,
420
423
  //resizable: true,
421
424
  selectable: 'multiple',
425
+ allowCopy: true,
422
426
  columns:
423
427
  [
424
428
  {
@@ -430,11 +434,15 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
430
434
  field: 'banDate',
431
435
  width: 120,
432
436
  title: 'Date',
437
+ format: '{0:dd/MM/yyyy HH:mm}',
438
+ type: 'dateTime'
433
439
  },
434
440
  {
435
441
  field: 'expirationDate',
436
442
  width: 120,
437
443
  title: 'Expiration',
444
+ format: '{0:dd/MM/yyyy HH:mm}',
445
+ type: 'dateTime'
438
446
  },
439
447
  {
440
448
  field: 'reason',
@@ -460,6 +468,7 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
460
468
  sortable: true,
461
469
  //resizable: true,
462
470
  selectable: 'multiple',
471
+ allowCopy: true,
463
472
  columns:
464
473
  [
465
474
  {
@@ -471,11 +480,15 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
471
480
  field: 'banDate',
472
481
  width: 120,
473
482
  title: 'Date',
483
+ format: '{0:dd/MM/yyyy HH:mm}',
484
+ type: 'dateTime'
474
485
  },
475
486
  {
476
487
  field: 'expirationDate',
477
488
  width: 120,
478
489
  title: 'Expiration',
490
+ format: '{0:dd/MM/yyyy HH:mm}',
491
+ type: 'dateTime'
479
492
  },
480
493
  {
481
494
  field: 'reason',
@@ -495,6 +508,49 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
495
508
  dataSource: []
496
509
  }).data('kendoGrid');
497
510
 
511
+ // Initialize context menus
512
+ $("#bnm-namesGridContextMenu").kendoContextMenu({
513
+ target: '#bnm-namesGrid',
514
+ filter: 'td',
515
+ select: function (e) {
516
+ var cell = e.target;
517
+ var row = $(cell).parent()[0];
518
+ var grid = $('#bnm-namesGrid').data('kendoGrid');
519
+ var itemId = e.item.id;
520
+
521
+ var cellText = cell.innerText;
522
+
523
+ if (itemId === 'bnm-namesGridCopyText') {
524
+ new clipboard__WEBPACK_IMPORTED_MODULE_3___default.a('#bnm-namesGridCopyText', {
525
+ text: function (trigger) {
526
+ return cellText;
527
+ }
528
+ });
529
+ };
530
+ }
531
+ });
532
+
533
+ $("#bnm-ipGridContextMenu").kendoContextMenu({
534
+ target: '#bnm-ipGrid',
535
+ filter: 'td',
536
+ select: function (e) {
537
+ var cell = e.target;
538
+ var row = $(cell).parent()[0];
539
+ var grid = $('#bnm-ipGrid').data('kendoGrid');
540
+ var itemId = e.item.id;
541
+
542
+ var cellText = cell.innerText;
543
+
544
+ if (itemId === 'bnm-ipGridCopyText') {
545
+ new clipboard__WEBPACK_IMPORTED_MODULE_3___default.a('#bnm-ipGridCopyText', {
546
+ text: function (trigger) {
547
+ return cellText;
548
+ }
549
+ });
550
+ };
551
+ }
552
+ });
553
+
498
554
  // Initialize refresh and remove buttons
499
555
  $('#bnm-refreshNamesBt').on('click', $.proxy(this._onRefreshNamesClick, this));
500
556
  $('#bnm-removeNameBt').on('click', $.proxy(this._onRemoveNamesClick, this));
@@ -623,7 +679,25 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
623
679
  let currSort = this._namesGrid.dataSource.sort();
624
680
 
625
681
  let ds = new kendo.data.DataSource({
626
- sort: currSort,
682
+ schema: {
683
+ model: {
684
+ fields: {
685
+ expirationDate: {
686
+ type: 'dateTime',
687
+ parse: function (e) {
688
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
689
+ }
690
+ },
691
+ banDate: {
692
+ type: 'dateTime',
693
+ parse: function (e) {
694
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
695
+ }
696
+ }
697
+ }
698
+ }
699
+ },
700
+ sort: currSort, // FIXME Expected sorting doesn't seem to be applied
627
701
  data: this._generateBannedEntries(data.getSFSArray('uNames'))
628
702
  });
629
703
 
@@ -635,11 +709,29 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
635
709
  }
636
710
  else if (command == this.RESP_IPADDRESSES)
637
711
  {
638
- // Substitute grid's data source, retaining current sorting
712
+ // Substitute grid's data source, retaining current sorting (FIX)
639
713
  let currSort = this._ipGrid.dataSource.sort();
640
714
 
641
715
  let ds = new kendo.data.DataSource({
642
- sort: currSort,
716
+ schema: {
717
+ model: {
718
+ fields: {
719
+ expirationDate: {
720
+ type: 'dateTime',
721
+ parse: function (e) {
722
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
723
+ }
724
+ },
725
+ banDate: {
726
+ type: 'dateTime',
727
+ parse: function (e) {
728
+ return moment__WEBPACK_IMPORTED_MODULE_2__(e, 'DD/MM/YYYY HH:mm').toDate();
729
+ }
730
+ }
731
+ }
732
+ }
733
+ },
734
+ sort: currSort, // FIXME Expected sorting doesn't seem to be applied
643
735
  data: this._generateBannedEntries(data.getSFSArray('IPs'))
644
736
  });
645
737
 
@@ -926,4 +1018,4 @@ class BanManager extends _base_module__WEBPACK_IMPORTED_MODULE_0__["BaseModule"]
926
1018
  /***/ })
927
1019
 
928
1020
  }]);
929
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdyZWFzb24nLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0XHRcdFx0XHR0aXRsZTogJ1JlYXNvbicsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYWRtaW5OYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdCYW5uZWQgQnknLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJ05vIGJhbm5lZCBJUCBhZGRyZXNzZXMuJ1xuXHRcdFx0fSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbklwR3JpZFNlbGVjdGlvbkNoYW5nZSwgdGhpcyksXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgYmFubmVkIHVzZXJuYW1lcyBncmlkXG5cdFx0dGhpcy5fbmFtZXNHcmlkID0gJCgnI2JubS1uYW1lc0dyaWQnKS5rZW5kb0dyaWQoe1xuXHRcdFx0c2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuXHRcdFx0Ly9yZXNpemFibGU6IHRydWUsXG5cdFx0XHRzZWxlY3RhYmxlOiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgY29sdW1uczpcbiAgICAgICAgICAgIFtcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICduYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdVc2VybmFtZScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdyZWFzb24nLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDI1MCxcblx0XHRcdFx0XHR0aXRsZTogJ1JlYXNvbicsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYWRtaW5OYW1lJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdCYW5uZWQgQnknLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XSxcblx0XHRcdG5vUmVjb3Jkczoge1xuXHRcdFx0XHR0ZW1wbGF0ZTogJ05vIGJhbm5lZCB1c2VybmFtZXMuJ1xuXHRcdFx0fSxcblx0XHRcdGNoYW5nZTogJC5wcm94eSh0aGlzLl9vbk5hbWVzR3JpZFNlbGVjdGlvbkNoYW5nZSwgdGhpcyksXG5cdFx0XHRkYXRhU291cmNlOiBbXVxuICAgICAgICB9KS5kYXRhKCdrZW5kb0dyaWQnKTtcblxuXHRcdC8vIEluaXRpYWxpemUgcmVmcmVzaCBhbmQgcmVtb3ZlIGJ1dHRvbnNcblx0XHQkKCcjYm5tLXJlZnJlc2hOYW1lc0J0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlZnJlc2hOYW1lc0NsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxOYW1lc0NsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZWZyZXNoSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVJcENsaWNrLCB0aGlzKSk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxJcEJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZUFsbElwQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIENvbmZpZ3VyZSBiYW4gcGFuZWxcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykubW9kYWwoe1xuXHRcdFx0YmFja2Ryb3A6ICdzdGF0aWMnLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0c2hvdzogZmFsc2UsXG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgZm9yIGJhbiBwYW5lbCBoaWRlXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAkLnByb3h5KHRoaXMuX29uQmFuTW9kYWxIaWRkZW4sIHRoaXMpKTtcblxuXHRcdC8vIEluaXRpYWxpemUga2VuZG8gdmFsaWRhdGlvbiBvbiBmb2xkZXIgbmFtZSBmb3JtXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yID0gJCgnI2JubS1iYW5Gb3JtJykua2VuZG9WYWxpZGF0b3Ioe30pLmRhdGEoJ2tlbmRvVmFsaWRhdG9yJyk7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXIgdG8gQmFuIGJ1dHRvbiBjbGlja1xuXHRcdCQoJyNibm0tYmFuQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uQmFuQ2xpY2ssIHRoaXMpKTtcblxuXHRcdC8vIEluaXQgYmFuIGRlbGF5IG51bWVyaWMgc3RlcHBlclxuXHRcdHRoaXMuX2JhbkRlbGF5SW4gPSAkKCcjYm5tLW1vZGFsRGVsYXlOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0ICAgIHN0ZXA6IDEsXG5cdFx0ICAgIGZvcm1hdDogJyMnXG5cdFx0fSkuZGF0YSgna2VuZG9OdW1lcmljVGV4dEJveCcpO1xuXG5cdFx0Ly8gSW5pdCBiYW4gZXhwaXJhdGlvbiBkYXRlIHBpY2tlclxuXHRcdHRoaXMuX2JhbkV4cERhdGVJbiA9ICQoJyNibm0tZXhwaXJhdGlvbkRQJykua2VuZG9EYXRlUGlja2VyKHtcblx0XHRcdHZhbHVlOiB0aGlzLl90b21vcnJvdyxcblx0XHRcdG1pbjogdGhpcy5fdG9tb3Jyb3csXG5cdFx0XHRmb290ZXI6IGZhbHNlLFxuXHRcdFx0Zm9ybWF0OiAnZGQvTU0veXl5eSdcblx0XHR9KS5kYXRhKCdrZW5kb0RhdGVQaWNrZXInKTtcblxuXHRcdC8vIERpc2FibGUgbWFudWFsIGRhdGUgaW5wdXRcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25EUCcpLmF0dHIoJ3JlYWRvbmx5JywncmVhZG9ubHknKTtcblxuXHRcdC8vIEluaXQgYmFuIGV4cGlyYXRpb24gaG91cnMvbWludXRlcyBpbnB1dHNcblx0XHR0aGlzLl9iYW5FeHBIb3VySW4gPSAkKCcjYm5tLW1vZGFsRXhwSG91cnNOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDk5LFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdHRoaXMuX2JhbkV4cE1pbkluID0gJCgnI2JubS1tb2RhbEV4cE1pbnNOUycpLmtlbmRvTnVtZXJpY1RleHRCb3goe1xuXHRcdCAgICBtaW46IDAsXG5cdFx0XHRtYXg6IDU5LFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0Ly8gTG9hZCB6b25lcyBsaXN0XG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfWk9ORVMpO1xuXG5cdFx0Ly8gTG9hZCBiYW5uZWQgSVAgYWRkcmVzc2VzXG5cdFx0Ly8gTm90ZTogd2UgZG9uJ3QgbG9hZCB0aGUgYmFubmVkIHVzZXJuYW1lcyBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgYSB6b25lIG11c3QgYmUgc2VsZWN0ZWRcblx0XHR0aGlzLl9nZXRCYW5uZWRJUHMoKTtcblx0fVxuXG5cdGRlc3Ryb3koKVxuXHR7XG5cdFx0Ly8gQ2FsbCBzdXBlciBtZXRob2Rcblx0XHRzdXBlci5kZXN0cm95KCk7XG5cblx0XHQvLyBEZXN0cm95IHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgI3RhYnMnKS5zY3JvbGxpbmdUYWJzKCdkZXN0cm95Jyk7XG5cblx0XHQvLyBSZW1vdmUgY2xpY2sgbGlzdGVuZXJzXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlZnJlc2hOYW1lc0J0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlZnJlc2hJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1iYW5CdCcpLm9mZignY2xpY2snKTtcblxuXHRcdC8vIEhpZGUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdoaWRlJyk7XG5cblx0XHQvLyBSZW1vdmUgcm9vbSBjcmVhdGlvbiBwYW5lbCBsaXN0ZW5lclxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vZmYoJ2hpZGRlbi5icy5tb2RhbCcpO1xuXHR9XG5cblx0b25FeHRlbnNpb25Db21tYW5kKGNvbW1hbmQsIGRhdGEpXG5cdHtcblx0XHQvLyBEYXRhIHJlY2VpdmVkXG5cdFx0aWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1pPTkVTKVxuXHRcdHtcblx0XHRcdGxldCB6b25lcyA9IGRhdGEuZ2V0VXRmU3RyaW5nQXJyYXkoJ3pvbmVzJyk7XG5cblx0XHRcdC8vIElmIHdlIGhhdmUgMSB6b25lIG9ubHksIHdlIHdpbGwgc2VsZWN0IGl0IGltbWVkaWF0ZWx5XG5cdFx0XHRjb25zdCBzZWxlY3RGaXJzdFpvbmUgPSB6b25lcy5sZW5ndGggPT0gMTtcblxuXHRcdFx0Ly8gU29ydCB6b25lcyBsaXN0XG5cdFx0XHR6b25lcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRcdHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQWRkIFwibm9uZVwiIHpvbmVcblx0XHRcdHpvbmVzLnVuc2hpZnQoJ1tub25lXScpO1xuXG5cdFx0XHQvLyBTZXQgem9uZSBkcm9wZG93biBkYXRhc291cmNlXG5cdFx0XHR0aGlzLl96b25lc0RELnNldERhdGFTb3VyY2Uoem9uZXMpO1xuXG5cdFx0XHRpZiAoc2VsZWN0Rmlyc3Rab25lKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgxKTtcblx0XHRcdFx0dGhpcy5fZ2V0QmFubmVkVXNlcm5hbWVzKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuX3pvbmVzREQuc2VsZWN0KDApO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKGNvbW1hbmQgPT0gdGhpcy5SRVNQX1VTRVJOQU1FUylcblx0XHR7XG5cdFx0XHQvLyBTdWJzdGl0dXRlIGdyaWQncyBkYXRhIHNvdXJjZSwgcmV0YWluaW5nIGN1cnJlbnQgc29ydGluZ1xuXHRcdFx0bGV0IGN1cnJTb3J0ID0gdGhpcy5fbmFtZXNHcmlkLmRhdGFTb3VyY2Uuc29ydCgpO1xuXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0c29ydDogY3VyclNvcnQsXG5cdFx0XHRcdGRhdGE6IHRoaXMuX2dlbmVyYXRlQmFubmVkRW50cmllcyhkYXRhLmdldFNGU0FycmF5KCd1TmFtZXMnKSlcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdFx0dGhpcy5fbmFtZXNHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBFbmFibGUgcmVtb3ZlIGFsbCBidXR0b25cblx0XHRcdCQoJyNibm0tcmVtb3ZlQWxsTmFtZXNCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZHMudG90YWwoKSA9PSAwKVxuXHRcdH1cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9JUEFERFJFU1NFUylcblx0XHR7XG5cdFx0XHQvLyBTdWJzdGl0dXRlIGdyaWQncyBkYXRhIHNvdXJjZSwgcmV0YWluaW5nIGN1cnJlbnQgc29ydGluZ1xuXHRcdFx0bGV0IGN1cnJTb3J0ID0gdGhpcy5faXBHcmlkLmRhdGFTb3VyY2Uuc29ydCgpO1xuXG5cdFx0XHRsZXQgZHMgPSBuZXcga2VuZG8uZGF0YS5EYXRhU291cmNlKHtcblx0XHRcdFx0c29ydDogY3VyclNvcnQsXG5cdFx0XHRcdGRhdGE6IHRoaXMuX2dlbmVyYXRlQmFubmVkRW50cmllcyhkYXRhLmdldFNGU0FycmF5KCdJUHMnKSlcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBc3NpZ24gZGF0YSBzb3VyY2UgdG8gZ3JpZFxuXHRcdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoZHMpO1xuXG5cdFx0XHQvLyBFbmFibGUgcmVtb3ZlIGFsbCBidXR0b25cblx0XHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgZHMudG90YWwoKSA9PSAwKVxuXHRcdH1cblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIEVWRU5UIExJU1RFTkVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdF9vblNob3dCYW5Nb2RhbENsaWNrKClcblx0e1xuXHRcdC8vIERpc3BsYXkgem9uZSBuYW1lXG5cdFx0JCgnI2JubS1tb2RhbFpvbmVMYicpLnRleHQodGhpcy5fem9uZXNERC52YWx1ZSgpKVxuXG5cdFx0Ly8gRGlzcGxheSBiYW4gcGFuZWxcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykubW9kYWwoJ3Nob3cnKTtcblxuXHRcdC8vIEZvY3VzIG5hbWUgZmllbGRcblx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykuZm9jdXMoKTtcblx0fVxuXG5cdF9vbkJhbk1vZGFsSGlkZGVuKGUpXG5cdHtcblx0XHQvLyBSZXNldCB2YWxpZGF0b3Jcblx0XHR0aGlzLl9iYW5WYWxpZGF0b3IuaGlkZU1lc3NhZ2VzKCk7XG5cblx0XHQvLyBUaGUgbWV0aG9kIGFib3ZlIGRvZXNuJ3QgcmVtb3ZlIHRoZSBrLWludmFsaWQgY2xhc3NlcyBhbmQgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiIGF0dHJpYnV0ZXMgZnJvbSBpbnB1dHNcblx0XHQvLyBMZXQncyBkbyBpdCBtYW51YWxseVxuXHRcdCQoJyNibm0tYmFuRm9ybSAuay1pbnZhbGlkJykucmVtb3ZlQ2xhc3MoJ2staW52YWxpZCcpO1xuXHRcdCQoJyNibm0tYmFuRm9ybSBbYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXScpLnJlbW92ZUF0dHIoJ2FyaWEtaW52YWxpZCcpO1xuXG5cdFx0Ly8gUmVzZXQgYmFuIGZvcm1cblx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsUmVhc29uSW4nKS52YWwoJycpO1xuXHRcdCQoJyNibm0tbW9kYWxNZXNzYWdlSW4nKS52YWwoJycpO1xuXG5cdFx0dGhpcy5fYmFuRGVsYXlJbi52YWx1ZSg1KTtcblxuXHRcdCQoJ2lucHV0W25hbWU9XCJleHBpcmF0aW9uXCJdJykucmVtb3ZlQXR0cignY2hlY2tlZCcpO1xuXHRcdCQoJyNibm0tZXhwaXJhdGlvblJCMCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcblxuXHRcdHRoaXMuX2JhbkV4cEhvdXJJbi52YWx1ZSgxKTtcblx0XHR0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgwKTtcblxuXHRcdHRoaXMuX2JhbkV4cERhdGVJbi5taW4odGhpcy5fdG9tb3Jyb3cpO1xuXHRcdHRoaXMuX2JhbkV4cERhdGVJbi52YWx1ZSh0aGlzLl90b21vcnJvdyk7XG5cdH1cblxuXHRfb25CYW5DbGljaygpXG5cdHtcblx0XHRpZiAodGhpcy5fYmFuVmFsaWRhdG9yLnZhbGlkYXRlKCkpXG5cdFx0e1xuXHRcdFx0Ly8gUmV0cmlldmUgYmFuIGRldGFpbHNcblx0XHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbmFtZScsICQoJyNibm0tbW9kYWxOYW1lSW4nKS52YWwoKSk7XG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCdtc2cnLCAkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dEludCgnZGVsYXknLCB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgIT0gbnVsbCA/IHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoKSA6IDApO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygncmVhc29uJywgJCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCkpO1xuXG5cdFx0XHRjb25zdCBleHAgPSAkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXTpjaGVja2VkJykudmFsKCk7XG5cdFx0XHRsZXQgZHVyYXRpb24gPSAtMTtcblxuXHRcdFx0aWYgKGV4cCA9PSAnYWZ0ZXInKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBob3VycyA9IHRoaXMuX2JhbkV4cEhvdXJJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSA6IDA7XG5cdFx0XHRcdGNvbnN0IG1pbnV0ZXMgPSB0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5FeHBNaW5Jbi52YWx1ZSgpIDogMDtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IChob3VycyAqIDYwKSArIG1pbnV0ZXM7XG5cblx0XHRcdFx0aWYgKGR1cmF0aW9uIDw9IDApXG5cdFx0XHRcdFx0ZHVyYXRpb24gPSAxO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZXhwID09ICdvbicpXG5cdFx0XHR7XG5cdFx0XHRcdGNvbnN0IG9uRGF0ZSA9IG1vbWVudCh0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUoKSk7XG5cdFx0XHRcdGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuXG5cdFx0XHRcdGR1cmF0aW9uID0gb25EYXRlLnN0YXJ0T2YoJ2RheScpLmRpZmYobm93LnN0YXJ0T2YoJ21pbnV0ZScpLCAnbWludXRlcycpO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblxuXHRcdFx0cGFyYW1zLnB1dEludCgnZHVyTWlucycsIGR1cmF0aW9uKTtcblxuXHRcdFx0Ly8gU2VuZCBiYW4gcmVxdWVzdCB0byBzZXJ2ZXJcblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfQkFOLCBwYXJhbXMpO1xuXG5cdFx0XHQvLyBSZWZyZXNoIGxpc3Rcblx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXG5cdFx0XHQvLyBGb2N1cyB1c2VybmFtZSBmaWVsZFxuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdFx0XHQkKCcjYm5tLW1vZGFsTmFtZUluJykuc2VsZWN0KCk7XG5cdFx0fVxuXHR9XG5cblx0X29uWm9uZUNoYW5nZSgpXG5cdHtcblx0XHQkKCcjYm5tLW5hbWVzQnV0dG9ucycpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblx0XHQkKCcjYm5tLXNob3dCYW5Nb2RhbEJ0JykuYXR0cignZGlzYWJsZWQnLCB0aGlzLl96b25lc0RELnNlbGVjdCgpID09IDApO1xuXG5cdFx0dGhpcy5fZ2V0QmFubmVkVXNlcm5hbWVzKCk7XG5cdH1cblxuXHRfb25OYW1lc0dyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX25hbWVzR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZU5hbWVCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0fVxuXG5cdF9vbklwR3JpZFNlbGVjdGlvbkNoYW5nZSgpXG5cdHtcblx0XHQvLyBFbmFibGUvZGlzYWJsZSByZW1vdmUgYnV0dG9uXG5cdFx0Y29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5faXBHcmlkLnNlbGVjdCgpO1xuXHRcdCQoJyNibm0tcmVtb3ZlSXBCdCcpLmF0dHIoJ2Rpc2FibGVkJywgc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PSAwKTtcblx0fVxuXG5cdF9vblJlZnJlc2hOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCB1c2VybmFtZSR7dGhpcy5faXBHcmlkLnNlbGVjdCgpLmxlbmd0aCA+IDEgPyAncycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlTmFtZXNDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IHVzZXJuYW1lcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZFJvd3MubGVuZ3RoOyBpKyspXG5cdFx0e1xuXHRcdFx0bGV0IGRhdGFJdGVtID0gdGhpcy5fbmFtZXNHcmlkLmRhdGFJdGVtKHNlbGVjdGVkUm93c1tpXSk7XG5cdFx0XHR1c2VybmFtZXMucHVzaChkYXRhSXRlbS5uYW1lKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlbW92ZUFsbE5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzP2AsICQucHJveHkodGhpcy5fb25SZW1vdkFsbE5hbWVzQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0oKVxuXHR7XG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbChudWxsLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXHR9XG5cblx0X29uUmVmcmVzaElwQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5fZ2V0QmFubmVkSVBzKCk7XG5cdH1cblxuXHRfb25SZW1vdmVJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmFubmluZyBmb3IgdGhlIHNlbGVjdGVkIElQIGFkZHJlc3Mke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ2VzJyA6ICcnfT9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDb25maXJtLCB0aGlzKSk7XG5cdH1cblxuXHRfb25SZW1vdmVJcENvbmZpcm0oKVxuXHR7XG5cdFx0bGV0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHRsZXQgaXBBZGRyZXNzZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX2lwR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0aXBBZGRyZXNzZXMucHVzaChkYXRhSXRlbS5pcEFkZHJlc3MpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKTtcblx0fVxuXG5cdF9vblJlbW92ZUFsbElwQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBiYW5uZWQgSVAgYWRkcmVzc2VzP2AsICQucHJveHkodGhpcy5fb25SZW1vdkFsbElwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZBbGxJcENvbmZpcm0oKVxuXHR7XG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZElQc1JlbW92YWwobnVsbCk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQUklWQVRFIE1FVEhPRFNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfZ2V0QmFubmVkSVBzKClcblx0e1xuXHRcdC8vIFJlbW92ZSBzZWxlY3Rpb25cblx0XHR0aGlzLl9pcEdyaWQuY2xlYXJTZWxlY3Rpb24oKTtcblxuXHRcdC8vIENsZWFyIGJhbm5lZCBJUHMgdGFibGVcblx0XHR0aGlzLl9pcEdyaWQuc2V0RGF0YVNvdXJjZShbXSk7XG5cblx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9HRVRfSVBBRERSRVNTRVMpO1xuXHR9XG5cblx0X2dldEJhbm5lZFVzZXJuYW1lcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5fbmFtZXNHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5fbmFtZXNHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0aWYgKHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPiAwKVxuXHRcdHtcblx0XHRcdC8vIEdldCB6b25lIElEXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnem9uZScsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cblx0XHRcdC8vIFNlbmQgcmVxdWVzdCB0byBleHRlbnNpb25cblx0XHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1VTRVJOQU1FUywgcGFyYW1zKTtcblx0XHR9XG5cdH1cblxuXHRfZ2VuZXJhdGVCYW5uZWRFbnRyaWVzKGJhbkRhdGEpXG5cdHtcblx0XHRsZXQgYmFubmVkRW50cmllcyA9IFtdO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBiYW5EYXRhLnNpemUoKTsgaSsrKVxuXHRcdHtcblx0XHRcdGNvbnN0IGJ1ID0gQmFubmVkVXNlci5mcm9tU0ZTQXJyYXkoYmFuRGF0YS5nZXRTRlNBcnJheShpKSk7XG5cdFx0XHRiYW5uZWRFbnRyaWVzLnB1c2goYnUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBiYW5uZWRFbnRyaWVzO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwodXNlcm5hbWVzLCB6b25lKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB6b25lKTtcblxuXHRcdGlmICh1c2VybmFtZXMgPT0gbnVsbClcblx0XHRcdHBhcmFtcy5wdXROdWxsKCd1TmFtZXMnKTtcblx0XHRlbHNlXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nQXJyYXkoJ3VOYW1lcycsIHVzZXJuYW1lcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdH1cblxuXHRfcmVxdWVzdEJhbm5lZElQc1JlbW92YWwoaXBBZGRyZXNzZXMpXG5cdHtcblx0XHQvLyBJZiB0aGUgdXNlcm5hbWVzIGFycmF5IGlzIG51bGwsIHNlcnZlciB3aWxsIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lc1xuXHRcdGxldCBwYXJhbXMgPSBuZXcgU0ZTMlguU0ZTT2JqZWN0KCk7XG5cblx0XHRpZiAoaXBBZGRyZXNzZXMgPT0gbnVsbClcblx0XHRcdHBhcmFtcy5wdXROdWxsKCdJUHMnKTtcblx0XHRlbHNlXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nQXJyYXkoJ0lQcycsIGlwQWRkcmVzc2VzKTtcblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfUkVNT1ZFX0lQQUREUkVTU0VTLCBwYXJhbXMpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBHRVRURVJTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0Z2V0IF90b21vcnJvdygpXG5cdHtcblx0XHRsZXQgdG9tb3Jyb3cgPSBtb21lbnQoKS5hZGQoMSwgJ2QnKTtcblx0XHRyZXR1cm4gdG9tb3Jyb3cudG9EYXRlKCk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQzFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QSIsInNvdXJjZVJvb3QiOiIifQ==
1021
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzL2pzL2NvcmUvbW9kdWxlcy9tb2R1bGUtMS5idW5kbGUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9hcHBsaWNhdGlvbi8uL3NyYy9kYXRhL2Jhbm5lZC11c2VyLmpzIiwid2VicGFjazovL2FwcGxpY2F0aW9uLy4vc3JjL21vZHVsZXMvYmFuLW1hbmFnZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmV4cG9ydCBjbGFzcyBCYW5uZWRVc2VyXG57XG5cdGNvbnN0cnVjdG9yKG5hbWUsIHpvbmUpXG5cdHtcblx0XHR0aGlzLkRBVEVfRk9STUFUID0gJ0REL01NL1lZWVkgSEg6bW0nO1xuXG5cdCAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuem9uZSA9IHpvbmU7XG5cdH1cblxuXHRzdGF0aWMgZnJvbVNGU0FycmF5KHNmc2EpXG5cdHtcblx0XHRsZXQgYnUgPSBuZXcgQmFubmVkVXNlcihzZnNhLmdldFV0ZlN0cmluZygwKSwgc2ZzYS5nZXRVdGZTdHJpbmcoMSkpO1xuXG5cdFx0YnUubW9kZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDIpO1xuXHRcdGJ1LnJlYXNvbiA9IHNmc2EuZ2V0VXRmU3RyaW5nKDMpO1xuXHRcdGJ1LmFkbWluTmFtZSA9IHNmc2EuZ2V0VXRmU3RyaW5nKDQpO1xuXHRcdGJ1LmlwQWRkcmVzcyA9IHNmc2EuZ2V0VXRmU3RyaW5nKDUpO1xuXHRcdGJ1LmJhblRpbWVNaWxsaXMgPSBzZnNhLmdldExvbmcoNik7XG5cdFx0YnUuYmFuRHVyYXRpb25NaWxsaXMgPSBzZnNhLmdldExvbmcoNyk7XG5cdFx0YnUuZXhwaXJhdGlvbkRhdGUgPSBidS5fZ2V0RXhwaXJhdGlvbkRhdGUoKTtcblx0XHRidS5iYW5EYXRlID0gYnUuX2dldEJhbkRhdGUoKTtcblxuXHRcdHJldHVybiBidTtcblx0fVxuXG5cdF9nZXRFeHBpcmF0aW9uRGF0ZSgpXG5cdHtcblx0XHRjb25zdCBleHBpcmVPbiA9IG1vbWVudCh0aGlzLmJhblRpbWVNaWxsaXMgKyB0aGlzLmJhbkR1cmF0aW9uTWlsbGlzKTtcblxuXHRcdGlmIChleHBpcmVPbi55ZWFyKCkgPj0gbW9tZW50KCkueWVhcigpICsgMTAwKVxuXHRcdFx0cmV0dXJuICdOZXZlcic7XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGV4cGlyZU9uLmZvcm1hdCh0aGlzLkRBVEVfRk9STUFUKTtcblx0fVxuXG5cdF9nZXRCYW5EYXRlKClcblx0e1xuXHRcdHJldHVybiBtb21lbnQodGhpcy5iYW5UaW1lTWlsbGlzKS5mb3JtYXQodGhpcy5EQVRFX0ZPUk1BVCk7XG5cdH1cbn1cbiIsImltcG9ydCB7QmFzZU1vZHVsZX0gZnJvbSAnLi9iYXNlLW1vZHVsZSc7XG5pbXBvcnQge0Jhbm5lZFVzZXJ9IGZyb20gJy4uL2RhdGEvYmFubmVkLXVzZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJ2NsaXBib2FyZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhbk1hbmFnZXIgZXh0ZW5kcyBCYXNlTW9kdWxlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHQgICAgc3VwZXIoJ2Jhbk1hbmFnZXInKTtcblxuXHRcdC8vIE91dGdvaW5nIHJlcXVlc3RzXG5cdFx0dGhpcy5SRVFfR0VUX1pPTkVTID0gJ2dldFpvbmVzJztcblx0XHR0aGlzLlJFUV9HRVRfVVNFUk5BTUVTID0gJ2dldFVOYW1lcyc7XG5cdFx0dGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTID0gJ2dldElQcyc7XG5cdFx0dGhpcy5SRVFfUkVNT1ZFX1VTRVJOQU1FUyA9ICdyZW1vdmVVTmFtZXMnO1xuXHRcdHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUyA9ICdyZW1vdmVJUHMnO1xuXHRcdHRoaXMuUkVRX0JBTiA9ICdiYW4nO1xuXG5cdFx0Ly8gSW5jb21pbmcgcmVzcG9uc2VzXG5cdFx0dGhpcy5SRVNQX1pPTkVTID0gJ3pvbmVzJztcblx0XHR0aGlzLlJFU1BfVVNFUk5BTUVTID0gJ3VOYW1lcyc7XG5cdFx0dGhpcy5SRVNQX0lQQUREUkVTU0VTID0gJ0lQcyc7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBDT01NT04gTU9EVUxFIElOVEVSRkFDRSBNRVRIT0RTXG5cdC8vIFRoaXMgbWVtYmVycyBhcmUgdXNlZCBieSB0aGUgbWFpbiBjb250cm9sbGVyXG5cdC8vIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1vZHVsZSdzIGNvbnRyb2xsZXIuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0aW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcilcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuaW5pdGlhbGl6ZShpZERhdGEsIHNoZWxsQ29udHJvbGxlcik7XG5cblx0XHQvLyBJbml0aWFsaXplIHNjcm9sbGluZyB0YWJzXG5cdFx0JCgnI2JubS10YWJOYXZpZ2F0b3IgPiAjdGFicycpLnNjcm9sbGluZ1RhYnMoe1xuXHRcdFx0Ym9vdHN0cmFwVmVyc2lvbjogNCxcblx0XHRcdHNjcm9sbFRvVGFiRWRnZTogdHJ1ZSxcblx0XHRcdGVuYWJsZVN3aXBpbmc6IHRydWUsXG5cdFx0XHRkaXNhYmxlU2Nyb2xsQXJyb3dzT25GdWxseVNjcm9sbGVkOiB0cnVlLFxuXHRcdFx0Y3NzQ2xhc3NMZWZ0QXJyb3c6ICdmYSBmYS1jaGV2cm9uLWxlZnQnLFxuXHRcdFx0Y3NzQ2xhc3NSaWdodEFycm93OiAnZmEgZmEtY2hldnJvbi1yaWdodCdcblx0XHR9KTtcblxuXHRcdC8vIEluaXRpYWxpemUgem9uZSBmaWx0ZXIgZHJvcGRvd25cblx0XHR0aGlzLl96b25lc0REID0gJCgnI2JubS16b25lc0REJykua2VuZG9Ecm9wRG93bkxpc3Qoe1xuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uWm9uZUNoYW5nZSwgdGhpcylcblx0XHR9KS5kYXRhKCdrZW5kb0Ryb3BEb3duTGlzdCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW4gYnV0dG9uXG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25TaG93QmFuTW9kYWxDbGljaywgdGhpcykpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBiYW5uZWQgSVBzIGdyaWRcblx0XHR0aGlzLl9pcEdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmtlbmRvR3JpZCh7XG5cdFx0XHRzY3JvbGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc29ydGFibGU6IHRydWUsXG5cdFx0XHQvL3Jlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHNlbGVjdGFibGU6ICdtdWx0aXBsZScsXG5cdFx0XHRhbGxvd0NvcHk6IHRydWUsXG4gICAgICAgICAgICBjb2x1bW5zOlxuICAgICAgICAgICAgW1xuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2lwQWRkcmVzcycsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnSVAgQWRkcmVzcycsXG5cdCAgICAgICAgICAgIH0sXG5cdCAgICAgICAgICAgIHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnYmFuRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdEYXRlJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHQgICAgICAgICAgICB7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2V4cGlyYXRpb25EYXRlJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAxMjAsXG5cdCAgICAgICAgICAgICAgICB0aXRsZTogJ0V4cGlyYXRpb24nLFxuXHRcdFx0XHRcdGZvcm1hdDogJ3swOmRkL01NL3l5eXkgSEg6bW19Jyxcblx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAncmVhc29uJyxcblx0ICAgICAgICAgICAgICAgIHdpZHRoOiAyNTAsXG5cdFx0XHRcdFx0dGl0bGU6ICdSZWFzb24nLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2FkbWluTmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnQmFubmVkIEJ5Jyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdF0sXG5cdFx0XHRub1JlY29yZHM6IHtcblx0XHRcdFx0dGVtcGxhdGU6ICdObyBiYW5uZWQgSVAgYWRkcmVzc2VzLidcblx0XHRcdH0sXG5cdFx0XHRjaGFuZ2U6ICQucHJveHkodGhpcy5fb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UsIHRoaXMpLFxuXHRcdFx0ZGF0YVNvdXJjZTogW11cbiAgICAgICAgfSkuZGF0YSgna2VuZG9HcmlkJyk7XG5cblx0XHQvLyBJbml0aWFsaXplIGJhbm5lZCB1c2VybmFtZXMgZ3JpZFxuXHRcdHRoaXMuX25hbWVzR3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykua2VuZG9HcmlkKHtcblx0XHRcdHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcblx0XHRcdC8vcmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0c2VsZWN0YWJsZTogJ211bHRpcGxlJyxcblx0XHRcdGFsbG93Q29weTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbHVtbnM6XG4gICAgICAgICAgICBbXG5cdFx0XHRcdHtcblx0ICAgICAgICAgICAgICAgIGZpZWxkOiAnbmFtZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnVXNlcm5hbWUnLFxuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ2JhbkRhdGUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDEyMCxcblx0ICAgICAgICAgICAgICAgIHRpdGxlOiAnRGF0ZScsXG5cdFx0XHRcdFx0Zm9ybWF0OiAnezA6ZGQvTU0veXl5eSBISDptbX0nLFxuXHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZSdcblx0ICAgICAgICAgICAgfSxcblx0ICAgICAgICAgICAge1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdleHBpcmF0aW9uRGF0ZScsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMTIwLFxuXHQgICAgICAgICAgICAgICAgdGl0bGU6ICdFeHBpcmF0aW9uJyxcblx0XHRcdFx0XHRmb3JtYXQ6ICd7MDpkZC9NTS95eXl5IEhIOm1tfScsXG5cdFx0XHRcdFx0dHlwZTogJ2RhdGVUaW1lJ1xuXHQgICAgICAgICAgICB9LFxuXHRcdFx0XHR7XG5cdCAgICAgICAgICAgICAgICBmaWVsZDogJ3JlYXNvbicsXG5cdCAgICAgICAgICAgICAgICB3aWR0aDogMjUwLFxuXHRcdFx0XHRcdHRpdGxlOiAnUmVhc29uJyxcblx0ICAgICAgICAgICAgfSxcblx0XHRcdFx0e1xuXHQgICAgICAgICAgICAgICAgZmllbGQ6ICdhZG1pbk5hbWUnLFxuXHQgICAgICAgICAgICAgICAgd2lkdGg6IDE1MCxcblx0XHRcdFx0XHR0aXRsZTogJ0Jhbm5lZCBCeScsXG5cdCAgICAgICAgICAgIH0sXG5cdFx0XHRdLFxuXHRcdFx0bm9SZWNvcmRzOiB7XG5cdFx0XHRcdHRlbXBsYXRlOiAnTm8gYmFubmVkIHVzZXJuYW1lcy4nXG5cdFx0XHR9LFxuXHRcdFx0Y2hhbmdlOiAkLnByb3h5KHRoaXMuX29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlLCB0aGlzKSxcblx0XHRcdGRhdGFTb3VyY2U6IFtdXG4gICAgICAgIH0pLmRhdGEoJ2tlbmRvR3JpZCcpO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSBjb250ZXh0IG1lbnVzXG5cdFx0JChcIiNibm0tbmFtZXNHcmlkQ29udGV4dE1lbnVcIikua2VuZG9Db250ZXh0TWVudSh7XG4gICAgICAgICAgICB0YXJnZXQ6ICcjYm5tLW5hbWVzR3JpZCcsXG4gICAgICAgICAgICBmaWx0ZXI6ICd0ZCcsXG4gICAgICAgICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICB2YXIgcm93ID0gJChjZWxsKS5wYXJlbnQoKVswXTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9ICQoJyNibm0tbmFtZXNHcmlkJykuZGF0YSgna2VuZG9HcmlkJyk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1JZCA9IGUuaXRlbS5pZDtcblxuICAgICAgICAgICAgICAgIHZhciBjZWxsVGV4dCA9IGNlbGwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gJ2JubS1uYW1lc0dyaWRDb3B5VGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBib2FyZCgnI2JubS1uYW1lc0dyaWRDb3B5VGV4dCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICh0cmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGxUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXHRcdCQoXCIjYm5tLWlwR3JpZENvbnRleHRNZW51XCIpLmtlbmRvQ29udGV4dE1lbnUoe1xuICAgICAgICAgICAgdGFyZ2V0OiAnI2JubS1pcEdyaWQnLFxuICAgICAgICAgICAgZmlsdGVyOiAndGQnLFxuICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHZhciBjZWxsID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9ICQoY2VsbCkucGFyZW50KClbMF07XG4gICAgICAgICAgICAgICAgdmFyIGdyaWQgPSAkKCcjYm5tLWlwR3JpZCcpLmRhdGEoJ2tlbmRvR3JpZCcpO1xuICAgICAgICAgICAgICAgIHZhciBpdGVtSWQgPSBlLml0ZW0uaWQ7XG5cbiAgICAgICAgICAgICAgICB2YXIgY2VsbFRleHQgPSBjZWxsLmlubmVyVGV4dDtcblxuICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT09ICdibm0taXBHcmlkQ29weVRleHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwYm9hcmQoJyNibm0taXBHcmlkQ29weVRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZnJlc2ggYW5kIHJlbW92ZSBidXR0b25zXG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZWZyZXNoTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlTmFtZUJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vblJlbW92ZU5hbWVzQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlQWxsTmFtZXNDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVmcmVzaElwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVmcmVzaElwQ2xpY2ssIHRoaXMpKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vbignY2xpY2snLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZlSXBDbGljaywgdGhpcykpO1xuXHRcdCQoJyNibm0tcmVtb3ZlQWxsSXBCdCcpLm9uKCdjbGljaycsICQucHJveHkodGhpcy5fb25SZW1vdmVBbGxJcENsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBDb25maWd1cmUgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKHtcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZSxcblx0XHRcdHNob3c6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIGZvciBiYW4gcGFuZWwgaGlkZVxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5vbignaGlkZGVuLmJzLm1vZGFsJywgJC5wcm94eSh0aGlzLl9vbkJhbk1vZGFsSGlkZGVuLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0aWFsaXplIGtlbmRvIHZhbGlkYXRpb24gb24gZm9sZGVyIG5hbWUgZm9ybVxuXHRcdHRoaXMuX2JhblZhbGlkYXRvciA9ICQoJyNibm0tYmFuRm9ybScpLmtlbmRvVmFsaWRhdG9yKHt9KS5kYXRhKCdrZW5kb1ZhbGlkYXRvcicpO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVyIHRvIEJhbiBidXR0b24gY2xpY2tcblx0XHQkKCcjYm5tLWJhbkJ0Jykub24oJ2NsaWNrJywgJC5wcm94eSh0aGlzLl9vbkJhbkNsaWNrLCB0aGlzKSk7XG5cblx0XHQvLyBJbml0IGJhbiBkZWxheSBudW1lcmljIHN0ZXBwZXJcblx0XHR0aGlzLl9iYW5EZWxheUluID0gJCgnI2JubS1tb2RhbERlbGF5TlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdCAgICBzdGVwOiAxLFxuXHRcdCAgICBmb3JtYXQ6ICcjJ1xuXHRcdH0pLmRhdGEoJ2tlbmRvTnVtZXJpY1RleHRCb3gnKTtcblxuXHRcdC8vIEluaXQgYmFuIGV4cGlyYXRpb24gZGF0ZSBwaWNrZXJcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4gPSAkKCcjYm5tLWV4cGlyYXRpb25EUCcpLmtlbmRvRGF0ZVBpY2tlcih7XG5cdFx0XHR2YWx1ZTogdGhpcy5fdG9tb3Jyb3csXG5cdFx0XHRtaW46IHRoaXMuX3RvbW9ycm93LFxuXHRcdFx0Zm9vdGVyOiBmYWxzZSxcblx0XHRcdGZvcm1hdDogJ2RkL01NL3l5eXknXG5cdFx0fSkuZGF0YSgna2VuZG9EYXRlUGlja2VyJyk7XG5cblx0XHQvLyBEaXNhYmxlIG1hbnVhbCBkYXRlIGlucHV0XG5cdFx0JCgnI2JubS1leHBpcmF0aW9uRFAnKS5hdHRyKCdyZWFkb25seScsJ3JlYWRvbmx5Jyk7XG5cblx0XHQvLyBJbml0IGJhbiBleHBpcmF0aW9uIGhvdXJzL21pbnV0ZXMgaW5wdXRzXG5cdFx0dGhpcy5fYmFuRXhwSG91ckluID0gJCgnI2JubS1tb2RhbEV4cEhvdXJzTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA5OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHR0aGlzLl9iYW5FeHBNaW5JbiA9ICQoJyNibm0tbW9kYWxFeHBNaW5zTlMnKS5rZW5kb051bWVyaWNUZXh0Qm94KHtcblx0XHQgICAgbWluOiAwLFxuXHRcdFx0bWF4OiA1OSxcblx0XHQgICAgc3RlcDogMSxcblx0XHQgICAgZm9ybWF0OiAnIydcblx0XHR9KS5kYXRhKCdrZW5kb051bWVyaWNUZXh0Qm94Jyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdC8vIExvYWQgem9uZXMgbGlzdFxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX1pPTkVTKTtcblxuXHRcdC8vIExvYWQgYmFubmVkIElQIGFkZHJlc3Nlc1xuXHRcdC8vIE5vdGU6IHdlIGRvbid0IGxvYWQgdGhlIGJhbm5lZCB1c2VybmFtZXMgYXV0b21hdGljYWxseSBiZWNhdXNlIGEgem9uZSBtdXN0IGJlIHNlbGVjdGVkXG5cdFx0dGhpcy5fZ2V0QmFubmVkSVBzKCk7XG5cdH1cblxuXHRkZXN0cm95KClcblx0e1xuXHRcdC8vIENhbGwgc3VwZXIgbWV0aG9kXG5cdFx0c3VwZXIuZGVzdHJveSgpO1xuXG5cdFx0Ly8gRGVzdHJveSBzY3JvbGxpbmcgdGFic1xuXHRcdCQoJyNibm0tdGFiTmF2aWdhdG9yICN0YWJzJykuc2Nyb2xsaW5nVGFicygnZGVzdHJveScpO1xuXG5cdFx0Ly8gUmVtb3ZlIGNsaWNrIGxpc3RlbmVyc1xuXHRcdCQoJyNibm0tc2hvd0Jhbk1vZGFsQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoTmFtZXNCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZU5hbWVCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZWZyZXNoSXBCdCcpLm9mZignY2xpY2snKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5vZmYoJ2NsaWNrJyk7XG5cdFx0JCgnI2JubS1yZW1vdmVBbGxJcEJ0Jykub2ZmKCdjbGljaycpO1xuXHRcdCQoJyNibm0tYmFuQnQnKS5vZmYoJ2NsaWNrJyk7XG5cblx0XHQvLyBIaWRlIGJhbiBwYW5lbFxuXHRcdCQoJyNibm0tYmFuTW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuXG5cdFx0Ly8gUmVtb3ZlIHJvb20gY3JlYXRpb24gcGFuZWwgbGlzdGVuZXJcblx0XHQkKCcjYm5tLWJhbk1vZGFsJykub2ZmKCdoaWRkZW4uYnMubW9kYWwnKTtcblx0fVxuXG5cdG9uRXh0ZW5zaW9uQ29tbWFuZChjb21tYW5kLCBkYXRhKVxuXHR7XG5cdFx0Ly8gRGF0YSByZWNlaXZlZFxuXHRcdGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9aT05FUylcblx0XHR7XG5cdFx0XHRsZXQgem9uZXMgPSBkYXRhLmdldFV0ZlN0cmluZ0FycmF5KCd6b25lcycpO1xuXG5cdFx0XHQvLyBJZiB3ZSBoYXZlIDEgem9uZSBvbmx5LCB3ZSB3aWxsIHNlbGVjdCBpdCBpbW1lZGlhdGVseVxuXHRcdFx0Y29uc3Qgc2VsZWN0Rmlyc3Rab25lID0gem9uZXMubGVuZ3RoID09IDE7XG5cblx0XHRcdC8vIFNvcnQgem9uZXMgbGlzdFxuXHRcdFx0em9uZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuXHRcdFx0XHRyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFkZCBcIm5vbmVcIiB6b25lXG5cdFx0XHR6b25lcy51bnNoaWZ0KCdbbm9uZV0nKTtcblxuXHRcdFx0Ly8gU2V0IHpvbmUgZHJvcGRvd24gZGF0YXNvdXJjZVxuXHRcdFx0dGhpcy5fem9uZXNERC5zZXREYXRhU291cmNlKHpvbmVzKTtcblxuXHRcdFx0aWYgKHNlbGVjdEZpcnN0Wm9uZSlcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5fem9uZXNERC5zZWxlY3QoMSk7XG5cdFx0XHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLl96b25lc0RELnNlbGVjdCgwKTtcblx0XHR9XG5cblx0XHRlbHNlIGlmIChjb21tYW5kID09IHRoaXMuUkVTUF9VU0VSTkFNRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmdcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX25hbWVzR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgndU5hbWVzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbE5hbWVzQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29tbWFuZCA9PSB0aGlzLlJFU1BfSVBBRERSRVNTRVMpXG5cdFx0e1xuXHRcdFx0Ly8gU3Vic3RpdHV0ZSBncmlkJ3MgZGF0YSBzb3VyY2UsIHJldGFpbmluZyBjdXJyZW50IHNvcnRpbmcgKEZJWClcblx0XHRcdGxldCBjdXJyU29ydCA9IHRoaXMuX2lwR3JpZC5kYXRhU291cmNlLnNvcnQoKTtcblxuXHRcdFx0bGV0IGRzID0gbmV3IGtlbmRvLmRhdGEuRGF0YVNvdXJjZSh7XG5cdFx0XHRcdHNjaGVtYToge1xuXHRcdFx0XHRcdG1vZGVsOiB7XG5cdFx0XHRcdFx0XHRmaWVsZHM6IHtcblx0XHRcdFx0XHRcdFx0ZXhwaXJhdGlvbkRhdGU6IHtcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnZGF0ZVRpbWUnLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlOiBmdW5jdGlvbiAoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1vbWVudChlLCAnREQvTU0vWVlZWSBISDptbScpLnRvRGF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0YmFuRGF0ZToge1xuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdkYXRlVGltZScsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2U6IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KGUsICdERC9NTS9ZWVlZIEhIOm1tJykudG9EYXRlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzb3J0OiBjdXJyU29ydCwgLy8gRklYTUUgRXhwZWN0ZWQgc29ydGluZyBkb2Vzbid0IHNlZW0gdG8gYmUgYXBwbGllZFxuXHRcdFx0XHRkYXRhOiB0aGlzLl9nZW5lcmF0ZUJhbm5lZEVudHJpZXMoZGF0YS5nZXRTRlNBcnJheSgnSVBzJykpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXNzaWduIGRhdGEgc291cmNlIHRvIGdyaWRcblx0XHRcdHRoaXMuX2lwR3JpZC5zZXREYXRhU291cmNlKGRzKTtcblxuXHRcdFx0Ly8gRW5hYmxlIHJlbW92ZSBhbGwgYnV0dG9uXG5cdFx0XHQkKCcjYm5tLXJlbW92ZUFsbElwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIGRzLnRvdGFsKCkgPT0gMClcblx0XHR9XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVSSBFVkVOVCBMSVNURU5FUlNcblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRfb25TaG93QmFuTW9kYWxDbGljaygpXG5cdHtcblx0XHQvLyBEaXNwbGF5IHpvbmUgbmFtZVxuXHRcdCQoJyNibm0tbW9kYWxab25lTGInKS50ZXh0KHRoaXMuX3pvbmVzREQudmFsdWUoKSlcblxuXHRcdC8vIERpc3BsYXkgYmFuIHBhbmVsXG5cdFx0JCgnI2JubS1iYW5Nb2RhbCcpLm1vZGFsKCdzaG93Jyk7XG5cblx0XHQvLyBGb2N1cyBuYW1lIGZpZWxkXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLmZvY3VzKCk7XG5cdH1cblxuXHRfb25CYW5Nb2RhbEhpZGRlbihlKVxuXHR7XG5cdFx0Ly8gUmVzZXQgdmFsaWRhdG9yXG5cdFx0dGhpcy5fYmFuVmFsaWRhdG9yLmhpZGVNZXNzYWdlcygpO1xuXG5cdFx0Ly8gVGhlIG1ldGhvZCBhYm92ZSBkb2Vzbid0IHJlbW92ZSB0aGUgay1pbnZhbGlkIGNsYXNzZXMgYW5kIGFyaWEtaW52YWxpZD1cInRydWVcIiBhdHRyaWJ1dGVzIGZyb20gaW5wdXRzXG5cdFx0Ly8gTGV0J3MgZG8gaXQgbWFudWFsbHlcblx0XHQkKCcjYm5tLWJhbkZvcm0gLmstaW52YWxpZCcpLnJlbW92ZUNsYXNzKCdrLWludmFsaWQnKTtcblx0XHQkKCcjYm5tLWJhbkZvcm0gW2FyaWEtaW52YWxpZD1cInRydWVcIl0nKS5yZW1vdmVBdHRyKCdhcmlhLWludmFsaWQnKTtcblxuXHRcdC8vIFJlc2V0IGJhbiBmb3JtXG5cdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnZhbCgnJyk7XG5cdFx0JCgnI2JubS1tb2RhbFJlYXNvbkluJykudmFsKCcnKTtcblx0XHQkKCcjYm5tLW1vZGFsTWVzc2FnZUluJykudmFsKCcnKTtcblxuXHRcdHRoaXMuX2JhbkRlbGF5SW4udmFsdWUoNSk7XG5cblx0XHQkKCdpbnB1dFtuYW1lPVwiZXhwaXJhdGlvblwiXScpLnJlbW92ZUF0dHIoJ2NoZWNrZWQnKTtcblx0XHQkKCcjYm5tLWV4cGlyYXRpb25SQjAnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG5cblx0XHR0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoMSk7XG5cdFx0dGhpcy5fYmFuRXhwTWluSW4udmFsdWUoMCk7XG5cblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4ubWluKHRoaXMuX3RvbW9ycm93KTtcblx0XHR0aGlzLl9iYW5FeHBEYXRlSW4udmFsdWUodGhpcy5fdG9tb3Jyb3cpO1xuXHR9XG5cblx0X29uQmFuQ2xpY2soKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhblZhbGlkYXRvci52YWxpZGF0ZSgpKVxuXHRcdHtcblx0XHRcdC8vIFJldHJpZXZlIGJhbiBkZXRhaWxzXG5cdFx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ25hbWUnLCAkKCcjYm5tLW1vZGFsTmFtZUluJykudmFsKCkpO1xuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZygnbXNnJywgJCgnI2JubS1tb2RhbE1lc3NhZ2VJbicpLnZhbCgpKTtcblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2RlbGF5JywgdGhpcy5fYmFuRGVsYXlJbi52YWx1ZSgpICE9IG51bGwgPyB0aGlzLl9iYW5EZWxheUluLnZhbHVlKCkgOiAwKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3JlYXNvbicsICQoJyNibm0tbW9kYWxSZWFzb25JbicpLnZhbCgpKTtcblxuXHRcdFx0Y29uc3QgZXhwID0gJCgnaW5wdXRbbmFtZT1cImV4cGlyYXRpb25cIl06Y2hlY2tlZCcpLnZhbCgpO1xuXHRcdFx0bGV0IGR1cmF0aW9uID0gLTE7XG5cblx0XHRcdGlmIChleHAgPT0gJ2FmdGVyJylcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgaG91cnMgPSB0aGlzLl9iYW5FeHBIb3VySW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwSG91ckluLnZhbHVlKCkgOiAwO1xuXHRcdFx0XHRjb25zdCBtaW51dGVzID0gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSAhPSBudWxsID8gdGhpcy5fYmFuRXhwTWluSW4udmFsdWUoKSA6IDA7XG5cblx0XHRcdFx0ZHVyYXRpb24gPSAoaG91cnMgKiA2MCkgKyBtaW51dGVzO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbiA8PSAwKVxuXHRcdFx0XHRcdGR1cmF0aW9uID0gMTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGV4cCA9PSAnb24nKVxuXHRcdFx0e1xuXHRcdFx0XHRjb25zdCBvbkRhdGUgPSBtb21lbnQodGhpcy5fYmFuRXhwRGF0ZUluLnZhbHVlKCkpO1xuXHRcdFx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdFx0XHRkdXJhdGlvbiA9IG9uRGF0ZS5zdGFydE9mKCdkYXknKS5kaWZmKG5vdy5zdGFydE9mKCdtaW51dGUnKSwgJ21pbnV0ZXMnKTtcblxuXHRcdFx0XHRpZiAoZHVyYXRpb24gPD0gMClcblx0XHRcdFx0XHRkdXJhdGlvbiA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHBhcmFtcy5wdXRJbnQoJ2R1ck1pbnMnLCBkdXJhdGlvbik7XG5cblx0XHRcdC8vIFNlbmQgYmFuIHJlcXVlc3QgdG8gc2VydmVyXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0JBTiwgcGFyYW1zKTtcblxuXHRcdFx0Ly8gUmVmcmVzaCBsaXN0XG5cdFx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblxuXHRcdFx0Ly8gRm9jdXMgdXNlcm5hbWUgZmllbGRcblx0XHRcdCQoJyNibm0tbW9kYWxOYW1lSW4nKS5mb2N1cygpO1xuXHRcdFx0JCgnI2JubS1tb2RhbE5hbWVJbicpLnNlbGVjdCgpO1xuXHRcdH1cblx0fVxuXG5cdF9vblpvbmVDaGFuZ2UoKVxuXHR7XG5cdFx0JCgnI2JubS1uYW1lc0J1dHRvbnMnKS5hdHRyKCdkaXNhYmxlZCcsIHRoaXMuX3pvbmVzREQuc2VsZWN0KCkgPT0gMCk7XG5cdFx0JCgnI2JubS1zaG93QmFuTW9kYWxCdCcpLmF0dHIoJ2Rpc2FibGVkJywgdGhpcy5fem9uZXNERC5zZWxlY3QoKSA9PSAwKTtcblxuXHRcdHRoaXMuX2dldEJhbm5lZFVzZXJuYW1lcygpO1xuXHR9XG5cblx0X29uTmFtZXNHcmlkU2VsZWN0aW9uQ2hhbmdlKClcblx0e1xuXHRcdC8vIEVuYWJsZS9kaXNhYmxlIHJlbW92ZSBidXR0b25cblx0XHRjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9uYW1lc0dyaWQuc2VsZWN0KCk7XG5cdFx0JCgnI2JubS1yZW1vdmVOYW1lQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25JcEdyaWRTZWxlY3Rpb25DaGFuZ2UoKVxuXHR7XG5cdFx0Ly8gRW5hYmxlL2Rpc2FibGUgcmVtb3ZlIGJ1dHRvblxuXHRcdGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuX2lwR3JpZC5zZWxlY3QoKTtcblx0XHQkKCcjYm5tLXJlbW92ZUlwQnQnKS5hdHRyKCdkaXNhYmxlZCcsIHNlbGVjdGVkUm93cy5sZW5ndGggPT0gMCk7XG5cdH1cblxuXHRfb25SZWZyZXNoTmFtZXNDbGljaygpXG5cdHtcblx0XHR0aGlzLl9nZXRCYW5uZWRVc2VybmFtZXMoKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ2xpY2soKVxuXHR7XG5cdFx0dGhpcy5zaGVsbEN0cmwuc2hvd0NvbmZpcm1XYXJuaW5nKGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBiYW5uaW5nIGZvciB0aGUgc2VsZWN0ZWQgdXNlcm5hbWUke3RoaXMuX2lwR3JpZC5zZWxlY3QoKS5sZW5ndGggPiAxID8gJ3MnIDogJyd9P2AsICQucHJveHkodGhpcy5fb25SZW1vdmVOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92ZU5hbWVzQ29uZmlybSgpXG5cdHtcblx0XHRsZXQgc2VsZWN0ZWRSb3dzID0gdGhpcy5fbmFtZXNHcmlkLnNlbGVjdCgpO1xuXHRcdGxldCB1c2VybmFtZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0ZWRSb3dzLmxlbmd0aDsgaSsrKVxuXHRcdHtcblx0XHRcdGxldCBkYXRhSXRlbSA9IHRoaXMuX25hbWVzR3JpZC5kYXRhSXRlbShzZWxlY3RlZFJvd3NbaV0pO1xuXHRcdFx0dXNlcm5hbWVzLnB1c2goZGF0YUl0ZW0ubmFtZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVxdWVzdEJhbm5lZFVzZXJzUmVtb3ZhbCh1c2VybmFtZXMsIHRoaXMuX3pvbmVzREQudmFsdWUoKSk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxOYW1lc0NsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIHVzZXJuYW1lcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxOYW1lc0NvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsTmFtZXNDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRVc2Vyc1JlbW92YWwobnVsbCwgdGhpcy5fem9uZXNERC52YWx1ZSgpKTtcblx0fVxuXG5cdF9vblJlZnJlc2hJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuX2dldEJhbm5lZElQcygpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDbGljaygpXG5cdHtcblx0XHR0aGlzLnNoZWxsQ3RybC5zaG93Q29uZmlybVdhcm5pbmcoYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJhbm5pbmcgZm9yIHRoZSBzZWxlY3RlZCBJUCBhZGRyZXNzJHt0aGlzLl9pcEdyaWQuc2VsZWN0KCkubGVuZ3RoID4gMSA/ICdlcycgOiAnJ30/YCwgJC5wcm94eSh0aGlzLl9vblJlbW92ZUlwQ29uZmlybSwgdGhpcykpO1xuXHR9XG5cblx0X29uUmVtb3ZlSXBDb25maXJtKClcblx0e1xuXHRcdGxldCBzZWxlY3RlZFJvd3MgPSB0aGlzLl9pcEdyaWQuc2VsZWN0KCk7XG5cdFx0bGV0IGlwQWRkcmVzc2VzID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGVkUm93cy5sZW5ndGg7IGkrKylcblx0XHR7XG5cdFx0XHRsZXQgZGF0YUl0ZW0gPSB0aGlzLl9pcEdyaWQuZGF0YUl0ZW0oc2VsZWN0ZWRSb3dzW2ldKTtcblx0XHRcdGlwQWRkcmVzc2VzLnB1c2goZGF0YUl0ZW0uaXBBZGRyZXNzKTtcblx0XHR9XG5cblx0XHR0aGlzLl9yZXF1ZXN0QmFubmVkSVBzUmVtb3ZhbChpcEFkZHJlc3Nlcyk7XG5cdH1cblxuXHRfb25SZW1vdmVBbGxJcENsaWNrKClcblx0e1xuXHRcdHRoaXMuc2hlbGxDdHJsLnNob3dDb25maXJtV2FybmluZyhgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgYmFubmVkIElQIGFkZHJlc3Nlcz9gLCAkLnByb3h5KHRoaXMuX29uUmVtb3ZBbGxJcENvbmZpcm0sIHRoaXMpKTtcblx0fVxuXG5cdF9vblJlbW92QWxsSXBDb25maXJtKClcblx0e1xuXHRcdHRoaXMuX3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKG51bGwpO1xuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gUFJJVkFURSBNRVRIT0RTXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0X2dldEJhbm5lZElQcygpXG5cdHtcblx0XHQvLyBSZW1vdmUgc2VsZWN0aW9uXG5cdFx0dGhpcy5faXBHcmlkLmNsZWFyU2VsZWN0aW9uKCk7XG5cblx0XHQvLyBDbGVhciBiYW5uZWQgSVBzIHRhYmxlXG5cdFx0dGhpcy5faXBHcmlkLnNldERhdGFTb3VyY2UoW10pO1xuXG5cdFx0Ly8gU2VuZCByZXF1ZXN0IHRvIGV4dGVuc2lvblxuXHRcdHRoaXMuc2VuZEV4dGVuc2lvblJlcXVlc3QodGhpcy5SRVFfR0VUX0lQQUREUkVTU0VTKTtcblx0fVxuXG5cdF9nZXRCYW5uZWRVc2VybmFtZXMoKVxuXHR7XG5cdFx0Ly8gUmVtb3ZlIHNlbGVjdGlvblxuXHRcdHRoaXMuX25hbWVzR3JpZC5jbGVhclNlbGVjdGlvbigpO1xuXG5cdFx0Ly8gQ2xlYXIgYmFubmVkIElQcyB0YWJsZVxuXHRcdHRoaXMuX25hbWVzR3JpZC5zZXREYXRhU291cmNlKFtdKTtcblxuXHRcdGlmICh0aGlzLl96b25lc0RELnNlbGVjdCgpID4gMClcblx0XHR7XG5cdFx0XHQvLyBHZXQgem9uZSBJRFxuXHRcdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRcdHBhcmFtcy5wdXRVdGZTdHJpbmcoJ3pvbmUnLCB0aGlzLl96b25lc0RELnZhbHVlKCkpO1xuXG5cdFx0XHQvLyBTZW5kIHJlcXVlc3QgdG8gZXh0ZW5zaW9uXG5cdFx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX0dFVF9VU0VSTkFNRVMsIHBhcmFtcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dlbmVyYXRlQmFubmVkRW50cmllcyhiYW5EYXRhKVxuXHR7XG5cdFx0bGV0IGJhbm5lZEVudHJpZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYmFuRGF0YS5zaXplKCk7IGkrKylcblx0XHR7XG5cdFx0XHRjb25zdCBidSA9IEJhbm5lZFVzZXIuZnJvbVNGU0FycmF5KGJhbkRhdGEuZ2V0U0ZTQXJyYXkoaSkpO1xuXHRcdFx0YmFubmVkRW50cmllcy5wdXNoKGJ1KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYmFubmVkRW50cmllcztcblx0fVxuXG5cdF9yZXF1ZXN0QmFubmVkVXNlcnNSZW1vdmFsKHVzZXJuYW1lcywgem9uZSlcblx0e1xuXHRcdC8vIElmIHRoZSB1c2VybmFtZXMgYXJyYXkgaXMgbnVsbCwgc2VydmVyIHdpbGwgcmVtb3ZlIGFsbCBiYW5uZWQgdXNlcm5hbWVzXG5cdFx0bGV0IHBhcmFtcyA9IG5ldyBTRlMyWC5TRlNPYmplY3QoKTtcblx0XHRwYXJhbXMucHV0VXRmU3RyaW5nKCd6b25lJywgem9uZSk7XG5cblx0XHRpZiAodXNlcm5hbWVzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgndU5hbWVzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCd1TmFtZXMnLCB1c2VybmFtZXMpO1xuXG5cdFx0dGhpcy5zZW5kRXh0ZW5zaW9uUmVxdWVzdCh0aGlzLlJFUV9SRU1PVkVfVVNFUk5BTUVTLCBwYXJhbXMpO1xuXHR9XG5cblx0X3JlcXVlc3RCYW5uZWRJUHNSZW1vdmFsKGlwQWRkcmVzc2VzKVxuXHR7XG5cdFx0Ly8gSWYgdGhlIHVzZXJuYW1lcyBhcnJheSBpcyBudWxsLCBzZXJ2ZXIgd2lsbCByZW1vdmUgYWxsIGJhbm5lZCB1c2VybmFtZXNcblx0XHRsZXQgcGFyYW1zID0gbmV3IFNGUzJYLlNGU09iamVjdCgpO1xuXG5cdFx0aWYgKGlwQWRkcmVzc2VzID09IG51bGwpXG5cdFx0XHRwYXJhbXMucHV0TnVsbCgnSVBzJyk7XG5cdFx0ZWxzZVxuXHRcdFx0cGFyYW1zLnB1dFV0ZlN0cmluZ0FycmF5KCdJUHMnLCBpcEFkZHJlc3Nlcyk7XG5cblx0XHR0aGlzLnNlbmRFeHRlbnNpb25SZXF1ZXN0KHRoaXMuUkVRX1JFTU9WRV9JUEFERFJFU1NFUywgcGFyYW1zKTtcblx0fVxuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFBSSVZBVEUgR0VUVEVSU1xuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdGdldCBfdG9tb3Jyb3coKVxuXHR7XG5cdFx0bGV0IHRvbW9ycm93ID0gbW9tZW50KCkuYWRkKDEsICdkJyk7XG5cdFx0cmV0dXJuIHRvbW9ycm93LnRvRGF0ZSgpO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMxQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9